From 6e8489fe0ca41bf8b87b472549db3d924eddb33f Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Fri, 16 Oct 2026 18:01:48 +0200 Subject: [PATCH 01/59] fix(text): embed each bundled font once EmbeddedInterRegistrar::new(), EmbeddedInterRegistrar::with_size() and TypesetterBridge::register_default_font each wrote their own include_bytes! for Inter, Inter Italic, JetBrains Mono and JetBrains Mono Italic. Every include_bytes! is its own allocation and only LTO merges identical ones, so a build without LTO carried those faces three times: rich-text-editor built with lto = false went from 58.26 MB to 53.00 MB, and Skribisto's debug binary holds two copies today. Release builds with fat LTO are unchanged. Each face is now one static in embedded_fonts.rs that every site names. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 7 ++++ crates/teksilo-text/src/embedded_fonts.rs | 40 +++++++++++++++++++- crates/teksilo-text/src/font_registrar.rs | 16 ++++---- crates/teksilo-text/src/typesetter_bridge.rs | 23 +++++------ 4 files changed, 65 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb6bd8c58..864af9ca4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,13 @@ by crate for clarity, not because crates version independently. ## [Unreleased] +### Fixed + +- **Builds without link-time optimisation embed each bundled font once.** A + debug build, or a release profile without LTO, of an application with text + input carried Inter and JetBrains Mono three times over, 4.8 MB more than + needed. + ## [0.19.0] - 2026-10-16 ### Added diff --git a/crates/teksilo-text/src/embedded_fonts.rs b/crates/teksilo-text/src/embedded_fonts.rs index e8c186b22..d65364137 100644 --- a/crates/teksilo-text/src/embedded_fonts.rs +++ b/crates/teksilo-text/src/embedded_fonts.rs @@ -11,16 +11,52 @@ //! them. //! //! [`TypesetterBridge`]: crate::TypesetterBridge +//! +//! Every bundled face is also held here as one `static`, and every other site in the crate +//! names that `static` instead of writing its own `include_bytes!`. Each `include_bytes!` is a +//! separate allocation, and only link-time optimisation merges identical ones, so a build +//! without LTO (a debug build, or an application with a default release profile) carried each +//! default face once per site. There were three sites, so 4.8 MB of Inter and JetBrains Mono +//! was duplicate. /// The bytes of the bundled Noto Sans Arabic variable font — the RTL face used for Arabic, /// Persian, Urdu and related scripts. #[cfg(feature = "fonts-arabic")] pub fn noto_sans_arabic_bytes() -> &'static [u8] { - include_bytes!("../fonts/NotoSansArabic-VariableFont_wdth,wght.ttf") + NOTO_SANS_ARABIC } /// The bytes of the bundled Noto Sans Hebrew variable font. #[cfg(feature = "fonts-hebrew")] pub fn noto_sans_hebrew_bytes() -> &'static [u8] { - include_bytes!("../fonts/NotoSansHebrew-VariableFont_wdth,wght.ttf") + NOTO_SANS_HEBREW } + +// The default UI and monospace families, always embedded. +pub(crate) static INTER: &[u8] = include_bytes!("../fonts/InterVariable.ttf"); +pub(crate) static INTER_ITALIC: &[u8] = include_bytes!("../fonts/InterVariable-Italic.ttf"); +pub(crate) static JETBRAINS_MONO: &[u8] = include_bytes!("../fonts/JetBrainsMono.ttf"); +pub(crate) static JETBRAINS_MONO_ITALIC: &[u8] = + include_bytes!("../fonts/JetBrainsMono-Italic.ttf"); + +// Script fallbacks. Arabic and Hebrew follow their feature, as the public accessors above do +// (both files are committed); the others follow the cfg `build.rs` sets only when the file +// is present, so a missing face stays a build warning. +#[cfg(feature = "fonts-arabic")] +pub(crate) static NOTO_SANS_ARABIC: &[u8] = + include_bytes!("../fonts/NotoSansArabic-VariableFont_wdth,wght.ttf"); +#[cfg(feature = "fonts-hebrew")] +pub(crate) static NOTO_SANS_HEBREW: &[u8] = + include_bytes!("../fonts/NotoSansHebrew-VariableFont_wdth,wght.ttf"); +#[cfg(font_thai)] +pub(crate) static NOTO_SANS_THAI: &[u8] = + include_bytes!("../fonts/NotoSansThai-VariableFont_wdth,wght.ttf"); +#[cfg(font_devanagari)] +pub(crate) static NOTO_SANS_DEVANAGARI: &[u8] = + include_bytes!("../fonts/NotoSansDevanagari-VariableFont_wdth,wght.ttf"); +#[cfg(font_cjk_sc)] +pub(crate) static NOTO_SANS_SC: &[u8] = include_bytes!("../fonts/NotoSansSC-VariableFont_wght.ttf"); +#[cfg(font_cjk_jp)] +pub(crate) static NOTO_SANS_JP: &[u8] = include_bytes!("../fonts/NotoSansJP-VariableFont_wght.ttf"); +#[cfg(font_cjk_kr)] +pub(crate) static NOTO_SANS_KR: &[u8] = include_bytes!("../fonts/NotoSansKR-VariableFont_wght.ttf"); diff --git a/crates/teksilo-text/src/font_registrar.rs b/crates/teksilo-text/src/font_registrar.rs index f8641d212..f9538d96c 100644 --- a/crates/teksilo-text/src/font_registrar.rs +++ b/crates/teksilo-text/src/font_registrar.rs @@ -90,20 +90,20 @@ pub struct EmbeddedInterRegistrar { impl EmbeddedInterRegistrar { pub const fn new() -> Self { Self { - data: include_bytes!("../fonts/InterVariable.ttf"), - data_italic: include_bytes!("../fonts/InterVariable-Italic.ttf"), - mono_data: include_bytes!("../fonts/JetBrainsMono.ttf"), - mono_data_italic: include_bytes!("../fonts/JetBrainsMono-Italic.ttf"), + data: crate::embedded_fonts::INTER, + data_italic: crate::embedded_fonts::INTER_ITALIC, + mono_data: crate::embedded_fonts::JETBRAINS_MONO, + mono_data_italic: crate::embedded_fonts::JETBRAINS_MONO_ITALIC, default_size_px: 14.0, } } pub const fn with_size(size_px: f32) -> Self { Self { - data: include_bytes!("../fonts/InterVariable.ttf"), - data_italic: include_bytes!("../fonts/InterVariable-Italic.ttf"), - mono_data: include_bytes!("../fonts/JetBrainsMono.ttf"), - mono_data_italic: include_bytes!("../fonts/JetBrainsMono-Italic.ttf"), + data: crate::embedded_fonts::INTER, + data_italic: crate::embedded_fonts::INTER_ITALIC, + mono_data: crate::embedded_fonts::JETBRAINS_MONO, + mono_data_italic: crate::embedded_fonts::JETBRAINS_MONO_ITALIC, default_size_px: size_px, } } diff --git a/crates/teksilo-text/src/typesetter_bridge.rs b/crates/teksilo-text/src/typesetter_bridge.rs index 46e325939..dd55fd6f3 100644 --- a/crates/teksilo-text/src/typesetter_bridge.rs +++ b/crates/teksilo-text/src/typesetter_bridge.rs @@ -10,6 +10,7 @@ use teksilo_canvas::text_backend::{ }; use teksilo_tokens::TextStyle; +use crate::embedded_fonts; use crate::font_registrar::shared_static; use text_typeset::atlas::cache::GlyphCacheKey; use text_typeset::{ @@ -267,11 +268,11 @@ impl TypesetterBridge { // face as the default, then the italic variable face so italic // UI text shapes from real italic outlines instead of falling // back to the upright (an italic request would otherwise miss). - let inter_data = include_bytes!("../fonts/InterVariable.ttf"); + let inter_data = embedded_fonts::INTER; let face_id = self.service.register_font_shared(shared_static(inter_data)); self.service.set_default_font(face_id, 14.0); self.default_font = Some(face_id); - let inter_italic = include_bytes!("../fonts/InterVariable-Italic.ttf"); + let inter_italic = embedded_fonts::INTER_ITALIC; let _ = self .service .register_font_shared(shared_static(inter_italic)); @@ -290,46 +291,46 @@ impl TypesetterBridge { // upright and italic variable faces (both under the family name // "JetBrains Mono"), so the theme's request — upright or italic — // resolves directly. - let mono_data = include_bytes!("../fonts/JetBrainsMono.ttf"); + let mono_data = embedded_fonts::JETBRAINS_MONO; let _ = self.service.register_font_shared(shared_static(mono_data)); - let mono_italic = include_bytes!("../fonts/JetBrainsMono-Italic.ttf"); + let mono_italic = embedded_fonts::JETBRAINS_MONO_ITALIC; let _ = self .service .register_font_shared(shared_static(mono_italic)); #[cfg(font_arabic)] { - let data = include_bytes!("../fonts/NotoSansArabic-VariableFont_wdth,wght.ttf"); + let data = embedded_fonts::NOTO_SANS_ARABIC; let _ = self.service.register_font_shared(shared_static(data)); } #[cfg(font_hebrew)] { - let data = include_bytes!("../fonts/NotoSansHebrew-VariableFont_wdth,wght.ttf"); + let data = embedded_fonts::NOTO_SANS_HEBREW; let _ = self.service.register_font_shared(shared_static(data)); } #[cfg(font_thai)] { - let data = include_bytes!("../fonts/NotoSansThai-VariableFont_wdth,wght.ttf"); + let data = embedded_fonts::NOTO_SANS_THAI; let _ = self.service.register_font_shared(shared_static(data)); } #[cfg(font_devanagari)] { - let data = include_bytes!("../fonts/NotoSansDevanagari-VariableFont_wdth,wght.ttf"); + let data = embedded_fonts::NOTO_SANS_DEVANAGARI; let _ = self.service.register_font_shared(shared_static(data)); } #[cfg(font_cjk_sc)] { - let data = include_bytes!("../fonts/NotoSansSC-VariableFont_wght.ttf"); + let data = embedded_fonts::NOTO_SANS_SC; let _ = self.service.register_font_shared(shared_static(data)); } #[cfg(font_cjk_jp)] { - let data = include_bytes!("../fonts/NotoSansJP-VariableFont_wght.ttf"); + let data = embedded_fonts::NOTO_SANS_JP; let _ = self.service.register_font_shared(shared_static(data)); } #[cfg(font_cjk_kr)] { - let data = include_bytes!("../fonts/NotoSansKR-VariableFont_wght.ttf"); + let data = embedded_fonts::NOTO_SANS_KR; let _ = self.service.register_font_shared(shared_static(data)); } From 9842d0fa6fce7e89baf06a8eee2174cd22b7ef81 Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 01:30:10 +0200 Subject: [PATCH 02/59] docs(engineering): specify the KDE colour model and the Breeze metrics Add a prose specification of the KDE colour-scheme model (KConfig grammar and cascade, the colour sets and roles, the colour maths, state effects, accent application) and of the Breeze 6.8 widget metrics, painting rules, typography and motion, with a ledger tracing every value to a pinned upstream file and line. Add tools/kde_golden: a Docker image of Plasma 6.8.0 / Frameworks 6.31.0 and a driver over the public KF6 and Qt API that regenerates reference vectors for the colour maths, scheme resolution, accent application, control sizes and painted pixels. It does not run in CI. Signed-off-by: Cyril Jacquet --- engineering/docs/kde-breeze-spec.md | 2809 +++ tools/kde_golden/.dockerignore | 4 + tools/kde_golden/Dockerfile | 55 + tools/kde_golden/README.md | 406 + tools/kde_golden/accent_oracle.sh | 219 + tools/kde_golden/driver/CMakeLists.txt | 32 + tools/kde_golden/driver/golden_json.cpp | 158 + tools/kde_golden/driver/golden_json.h | 47 + tools/kde_golden/driver/main.cpp | 60 + tools/kde_golden/driver/math_vectors.cpp | 300 + tools/kde_golden/driver/pixel_vectors.cpp | 644 + tools/kde_golden/driver/resolve_vectors.cpp | 702 + tools/kde_golden/driver/size_vectors.cpp | 1082 + tools/kde_golden/run.sh | 101 + tools/kde_golden/vectors/accent.json | 51 + tools/kde_golden/vectors/fonts.sha256 | 2 + tools/kde_golden/vectors/math.json | 20928 ++++++++++++++++++ tools/kde_golden/vectors/pixels.json | 147 + tools/kde_golden/vectors/resolve.json | 19 + tools/kde_golden/vectors/sizes.json | 838 + tools/kde_golden/vectors/versions.txt | 11 + 21 files changed, 28615 insertions(+) create mode 100644 engineering/docs/kde-breeze-spec.md create mode 100644 tools/kde_golden/.dockerignore create mode 100644 tools/kde_golden/Dockerfile create mode 100644 tools/kde_golden/README.md create mode 100755 tools/kde_golden/accent_oracle.sh create mode 100644 tools/kde_golden/driver/CMakeLists.txt create mode 100644 tools/kde_golden/driver/golden_json.cpp create mode 100644 tools/kde_golden/driver/golden_json.h create mode 100644 tools/kde_golden/driver/main.cpp create mode 100644 tools/kde_golden/driver/math_vectors.cpp create mode 100644 tools/kde_golden/driver/pixel_vectors.cpp create mode 100644 tools/kde_golden/driver/resolve_vectors.cpp create mode 100644 tools/kde_golden/driver/size_vectors.cpp create mode 100755 tools/kde_golden/run.sh create mode 100644 tools/kde_golden/vectors/accent.json create mode 100644 tools/kde_golden/vectors/fonts.sha256 create mode 100644 tools/kde_golden/vectors/math.json create mode 100644 tools/kde_golden/vectors/pixels.json create mode 100644 tools/kde_golden/vectors/resolve.json create mode 100644 tools/kde_golden/vectors/sizes.json create mode 100644 tools/kde_golden/vectors/versions.txt diff --git a/engineering/docs/kde-breeze-spec.md b/engineering/docs/kde-breeze-spec.md new file mode 100644 index 000000000..5c2e7557f --- /dev/null +++ b/engineering/docs/kde-breeze-spec.md @@ -0,0 +1,2809 @@ + + + +# KDE colour model and Breeze metrics: clean-room specification + +This document is the authoritative specification from which Teksilo +re-implements the KDE Plasma colour model (crate `teksilo-kde-scheme`) and +transcribes the Breeze design language (crate `teksilo-theme-kde`). It +overrides the implementation plan and the synthesised design wherever they +disagree. + +It is written in prose and mathematics only. It contains no upstream code, +no pseudo-code that mirrors upstream function structure, and no upstream +internal identifiers. Values are facts; behaviour is described as inputs, +outputs, order of operations and rounding. The closing ledger (section o) +records, for every number, where it was observed upstream. The ledger is a +list of references, never an excerpt. + +Who may read what: + +- **Role A** (the author of this file) read the upstream sources listed in + section a. +- **Role B** (the implementer of `math.rs`, `effects.rs`, `palette.rs` and + `accent.rs`) reads only this file, Qt's public documentation, WCAG 2.x, + Björn Ottosson's OKLab article and the existing Teksilo crates. Role B + never reads upstream KDE sources, research notes, or the ledger's target + files. + +Normative words: **must**, **must not**, **should**, **may** have their RFC +2119 meanings. A statement tagged **[divergence]** is a deliberate, +documented difference between Teksilo and KDE. A statement tagged +**[pin]** is behaviour of the Qt 6 runtime that this document describes as +precisely as it can but that the black-box golden vectors in +`tools/kde_golden` must confirm; where a golden disagrees with a **[pin]** +statement, the golden wins and this document is corrected in the same +commit. Every former **[pin]** has now been checked against the goldens +and is tagged [measured-qt] (or [qt] where Qt documents it); none is open. + +Provenance tags used in tables (the same tags the preset uses at each +assignment): + +| Tag | Meaning | +|---|---| +| [M] | Breeze widget-style metrics header (breeze, kstyle) | +| [S] | Breeze widget-style sizing and drawing code (breeze, kstyle) | +| [Hp] | Breeze widget-style painting helper (breeze, kstyle) | +| [Kc] | Breeze style configuration schema, `breeze.kcfg` | +| [K] | Kirigami (frameworks/kirigami) | +| [Qd] | qqc2-desktop-style (frameworks/qqc2-desktop-style) | +| [CS] | KDE colour-scheme library (frameworks/kcolorscheme) | +| [CU] | KDE colour utilities and HCY space (frameworks/kguiaddons) | +| [KC] | KDE configuration library (frameworks/kconfig) | +| [AP] | Plasma accent application (plasma-workspace, kcms/colors) | +| [PI] | Plasma Qt platform integration (plasma/plasma-integration) | +| [PK] | xdg-desktop-portal-kde | +| [PW] | other plasma-workspace files (startup, fonts KCM) | +| [qt] | Qt's public documentation or documented Qt behaviour | +| [measured-qt] | measured in the C0 golden image (`tools/kde_golden/vectors`, Qt 6.11.1, offscreen) | +| [derived] | a rule stated at the assignment, not an upstream value | +| [wcag] | a WCAG lift (Teksilo's, never upstream) | +| [unpublished] | no upstream source; Teksilo's choice | + +--- + +## a. Scope and pinned versions + +### a.1 What is specified + +1. The KConfig text grammar and the cascade KDE uses to read `kdeglobals` + and colour-scheme files (section b). +2. The KDE colour-scheme model: sets, roles, defaults, effects, contrast + (section c). +3. The colour mathematics: the HCY colour space, luma, contrast, blends, + tint, shade roles, HSV lighter and darker, 8-bit alpha blending, the + OKLab tint (section d). +4. State effects for the Disabled and Inactive colour groups (section e). +5. The computed backgrounds and the QPalette-equivalent roles (section f). +6. Plasma's accent application, every key it writes (section g). +7. The ten accent swatches (section h). +8. The light/dark predicate (section i). +9. Desktop settings: fonts, animation factor, font DPI, widget style, + `breezerc` (section j). +10. Breeze geometry and painting rules for every control the preset styles + (section k). +11. Typography (section l) and motion (section m). +12. The answers to the C0 open items (section n) and the ledger (section o). + +Out of scope, documented elsewhere in the plan: Union, Ocean, the Breeze +window decoration (KWin draws it under server-side decorations), Plasma +shell translucency, Kirigami heading levels as rendered styles. + +### a.2 Pinned upstream versions + +| Repository | Tag | Commit | +|---|---|---| +| plasma/breeze | v6.8.0 | cb1de02b5d4fa81d309e33a3f8cd8795ff975336 | +| frameworks/qqc2-desktop-style | v6.31.0 | 2efe38d55ebcfa97599643daada20c157fa1a8a5 | +| frameworks/kirigami | v6.31.0 | eecf183a956fdbfbf331c0ef61fd6e35220d4275 | +| plasma/xdg-desktop-portal-kde | v6.8.0 | d0b8eb0467369a570f57f7fe9242c1bfbf34faf2 | +| frameworks/kconfig | v6.31.0 | a25acdfb1f51c9d8af3426f03380a9de5c88817a | +| plasma/plasma-integration | v6.8.0 | 354bc2ab5bd52715d5a01358ecabfaeb8366152d | +| plasma/plasma-workspace | v6.8.0 | 9d82cf039a17a300c696c87ad32d3113507ed7f9 | +| frameworks/kguiaddons | v6.31.0 | 92ebbc758fa58bb89e6d73fdd24e50a296259bd3 | +| frameworks/kcolorscheme | v6.31.0 | b01fde3096de99584786aa412e0130661c97f7e8 | +| qt/qtbase (the runtime, d.11, d.15) | v6.11.1 | 59c81a3c2247b821b9b84b4eb8d939b77e07e276 | + +The runtime the behaviour was observed against is Qt 6 (Plasma 6.8 ships on +Qt 6.10 or later). Every statement about Qt numeric behaviour refers to Qt 6, +where colour channels are stored as 16-bit integers and the floating-point +channel accessors are single precision. + +Fonts: Noto Sans v2.015 (notofonts latin-greek-cyrillic release +NotoSans-v2.015) and Hack v3.003 (source-foundry). Hashes are in the ledger. + +Fixtures: the three v6.8.0 Breeze colour files (`BreezeLight.colors`, +`BreezeDark.colors`, `BreezeClassic.colors`) are vendored verbatim under +`crates/teksilo-kde-scheme/tests/fixtures/breeze-v6.8.0/` with their LGPL +headers and excluded from the package. The copies in kcolorscheme v6.31.0 +differ from the breeze v6.8.0 files only in translated `Name[...]` lines and +in SPDX header lines; every colour, effect, `[KDE]` and `[WM]` value is +identical. + +### a.3 Representation conventions (normative for every section) + +These conventions are what makes 8-bit equality with KDE possible. + +- **Stored colour.** A colour value is four 16-bit unsigned channels + (red, green, blue, alpha), each an integer `q` in 0..65535. +- **From 8 bits.** A channel given as an 8-bit integer `v` (0..255) is + stored as `q = 257 v`. Every colour read from a configuration file in the + `r,g,b[,a]` form enters the model this way; `#rrggbb` and the other hex + forms are covered in section b.9. +- **Reading a channel as a real number.** The real value of a stored + channel is `F(q) = q / 65535` computed in single precision (IEEE 754 + binary32, round to nearest), then widened to double precision for all + further arithmetic. Call this a *channel read*. +- **Storing a real value.** When an operation produces a real channel value + `v` in [0, 1], it is stored as `Q16(v)`: first round `v` to single + precision, then form the single-precision product `p = v x 65535` + (rounded to single precision), then `q = floor(p + 1/2)`. Alpha is stored + the same way. +- **Quantisation points.** Every operation in section d that returns a + colour stores its result with `Q16`. The next operation reads the stored + channels with `F`. Intermediate real values inside one operation are never + quantised unless this document says so. +- **To 8 bits.** The 8-bit value of a stored channel `q` is + `E8(q) = floor((q + 128) / 257)`, in integer arithmetic. This is exactly + `round(q / 257)` (no tie can occur), for example `E8(7067) = 27`. + [measured-qt]: the Qt 6.11 runtime's 8-bit channel accessors and its + packed 8-bit colour value both agree with this rule on all 65536 values of + `q`, and every `hex` field of the goldens equals `E8` of its `u16` field. + Every colour written to a configuration file, every value compared "8-bit + equal" in the goldens and every 8-bit read (the dark predicate) uses + `E8`. +- **Arithmetic.** All other real arithmetic is double precision (binary64), + evaluated in the order written. Where this document says *single + precision*, the named product or sum is rounded to binary32 at that step. + `F32(x)` names that rounding explicitly, and `R(x) = floor(x + 1/2)` is + the conversion of a non-negative single-precision value to an integer + used inside Q16. +- **Clamp to the unit interval.** `N(x)` maps x to x if 0 < x < 1, to 0 if + x <= 0, and to 1 if x >= 1 **or if x is NaN**. (A NaN input maps to 1, not + to 0.) +- **Interpolation.** `L(a, b, t) = a + (b - a) t` (exactly this form, not + `(1 - t) a + t b`), unless a step says otherwise. + +Teksilo's own `Color` type holds four `f32` in 0..1. The kde-scheme crate +must keep the 16-bit channel integers internally (or an `f32` that is +exactly `q / 65535` and is converted back by `q = round(65535 c)`), and must +convert to Teksilo's `Color` only at the crate boundary. + +--- + +## b. KConfig text grammar and cascade + +### b.1 Bytes and lines + +1. A file is read as bytes. An empty file contributes nothing. +2. The file is split into lines at byte 0x0A only. Each line is then + trimmed of leading and trailing ASCII whitespace (space, tab, CR, LF, + VT, FF). A CR before the LF is therefore removed; a file that uses lone + CR separators is a single line. +3. A line longer than 1.5 MiB without a newline: KDE warns and parses it + as consecutive 1.5 MiB pieces, each treated as a line. Teksilo skips such + a line and records a diagnostic **[divergence]** (an error case only). +4. A UTF-8 byte order mark is **not** recognised. A BOM at the start of the + file is part of the first line, so if the first line is a group header + it is not recognised as one (it does not start with `[`); it is treated + as an entry line, has no `=`, and is rejected as an error. Entries that + follow it belong to the root group until the next valid header. Teksilo + must reproduce this and should emit a diagnostic naming the BOM. The + plan's grammar list mentions the BOM without saying what happens; this + rule is the decision. +5. Bytes are decoded as UTF-8 only when a value, key or group name is used + as text; invalid sequences decode to U+FFFD. + +### b.2 Comments and blank lines + +A trimmed line that is empty, or whose first byte is `#`, is ignored. A `#` +anywhere else is literal text. A `;` is never a comment. + +### b.3 Group headers + +1. A trimmed line whose first byte is `[` is a group header. +2. The header is a sequence of bracketed segments `[a][b]...`. The first + segment starts after the first `[`; each segment ends at the next `]`. A + further segment follows only if the byte after a `]` is `[`. Anything + after the last `]` that does not start a new segment is ignored. +3. If a segment has no closing `]`, the header is invalid: the line is + skipped **and the current group does not change**, so following entries + go to the previous group. +4. Segments are joined into one hierarchical group name. Nested groups such + as `[Colors:Header][Inactive]` name the group `Inactive` inside + `Colors:Header`. A nested group is a separate group: its entries are not + inherited from, and do not fall back to, the parent group. +5. The segment `[$i]` is an option, not a name, when it is exactly `$i` + and it is the last segment of the line (the line ends right after its + `]`). If it is the only segment on the line, the **file** becomes + immutable from this point (b.6). If it follows a name, the **group** is + immutable. A `[$i]` segment in any other position is part of the name. +6. Escape sequences (b.5) are decoded inside each name segment. +7. Entries that appear before any header belong to the root group. After a + bare `[$i]` line, entries before the next named header belong to a group + whose name is empty. + +### b.4 Entry lines + +1. A non-header line is an entry. The key is the text before the first + `=`, trimmed; the value is the text after it, trimmed. +2. A line with an empty key is ignored (not counted as an error). +3. Trailing bracketed suffixes on the key are processed from the right: + - `[$...]` is an option list: each letter `i` (immutable entry), `e` + (environment expansion allowed), `d` (deleted entry) applies; any other + letter is ignored. + - Any other bracket `[xx]` is a locale tag. A second locale tag on one + key is an error and the line is skipped. + - A `[` without a later `]` is an error and the line is skipped. + - `Key[de][$i]` and `Key[$i][de]` are both valid. +4. A line with no `=` is an error and is skipped, unless its options contain + `d`. +5. `[$d]`: the entry is recorded as deleted, its value (if any) is ignored. + A deleted entry hides the same key from every lower layer; a higher + layer that sets the key again makes it present again. +6. Locale-tagged entries: KDE uses them only when the tag equals the + current locale or its language part. Teksilo must ignore every + locale-tagged entry. None of the keys this specification reads is + localised in practice (only `Name` in colour files is). +7. Errors that are counted: missing `]`, second locale, missing `=`, + invalid escape. After the 100th counted error the rest of the file is + not read; entries read so far are kept. + +### b.5 Escapes + +Escape decoding applies to keys, group-name segments and values, and only +when the text contains a backslash. The text is trimmed again first. Then, +left to right: + +| Sequence | Result | +|---|---| +| `\s` | a space | +| `\t` | a tab | +| `\n` | a line feed | +| `\r` | a carriage return | +| `\\` | one backslash | +| `\xHH` | the byte with hexadecimal value HH (two hex digits, either case) | +| `\;` | the two characters backslash and semicolon (kept) | +| `\,` | the two characters backslash and comma (kept) | +| a backslash at the very end | kept as one backslash | + +- `\x` with fewer than two following characters yields the character `x` + and ends decoding. `\x` followed by two characters of which one is not a + hex digit yields `x` and consumes both characters. +- Any other escape is invalid. KDE then keeps a partially decoded value of + the original length. Teksilo keeps the backslash and the following + character verbatim, continues decoding, and records a diagnostic + **[divergence]** (an error case only; no KDE-written file contains it). + +Values never contain unescaped leading or trailing spaces because writers +escape them as `\s`. + +### b.6 Layers, precedence, immutability + +A *cascade* is an ordered list of layers, lowest priority first. Each layer +is one file. Each layer is either a *default layer* (every system file, and +the user's own `system.kdeglobals`) or the *user layer* (the user's own +`kdeglobals`, the only file a KDE program writes). + +The entries of all layers are merged into one map from (group, key) to +value, applying the layers in order. For each entry of the layer being +applied: + +1. If the map already holds an **immutable** entry for that (group, key), + the new entry is ignored. +2. Else if the map holds no entry for that (group, key) and the **group is + marked immutable** by a lower layer, the new entry is ignored. +3. Else, if the layer is the user layer and the group was already marked + immutable when this layer's header for that group was read, every entry + of that group in this layer is ignored, including keys that lower layers + set without immutability. +4. Otherwise the new entry replaces the old one (or is added). It becomes + immutable if it carries `[$i]`, or if its group header in this layer + carried `[$i]`, or if the file became immutable before its group header. + +Consequences that tests must pin: + +- **Duplicate keys.** Within one file the **last** occurrence wins, and a + higher layer wins over a lower one, except that an occurrence that is + immutable freezes the value: later occurrences in the same file and in + higher layers are ignored. Inside a group whose header carries `[$i]`, + and in every group after a bare `[$i]` line, every occurrence is + immutable, so the **first** occurrence wins. +- **Group immutability** is set after the whole file has been read, so a + file can re-open its own immutable group later and add to it. It applies + to that exact group only, not to nested groups. +- **File immutability.** When a layer contains a bare `[$i]` line, no + higher layer is read at all. + +A group **exists** when it, or any group nested inside it, holds at least +one entry that is not deleted. This is the test used for "the cascade has +`[Colors:View]`" and for "the set has an `[Inactive]` subgroup". + +### b.7 The `kdeglobals` cascade + +Let `CH` be `$XDG_CONFIG_HOME` (default `$HOME/.config`) and `CD1..CDn` the +entries of `$XDG_CONFIG_DIRS` in the order listed (default `/etc/xdg`). +Empty and relative entries are ignored [qt]. Only files that exist count. +The layers, lowest priority first: + +1. `/etc/kde5rc`, if readable, unless the environment variable + `KDE_SKIP_KDERC` is set. +2. `CDn/system.kdeglobals`, ..., `CD1/system.kdeglobals` (last listed + directory first). +3. `CDn/kdeglobals`, ..., `CD1/kdeglobals`. +4. `CH/system.kdeglobals` (a default layer). +5. `CH/kdeglobals` (the user layer). + +All system `system.kdeglobals` files rank below all system `kdeglobals` +files. A file-immutable layer in steps 1 to 3 suppresses steps 4 and 5. + +**kdedefaults.** A Plasma session start prepends `CH/kdedefaults` to +`XDG_CONFIG_DIRS` before any program starts (using `/etc/xdg` as the rest +when the variable was empty). A program started in a Plasma session +therefore sees `CH/kdedefaults/kdeglobals` as the highest-priority system +layer, below the user's `CH/kdeglobals`. Teksilo must honour +`XDG_CONFIG_DIRS` exactly. When the session is KDE (b.10) and +`CH/kdedefaults` is not already one of the entries, Teksilo should prepend +it, reproducing the session start **[derived]**; this is what makes a +program launched outside the session environment agree with one launched +inside it. + +### b.8 Locating a colour-scheme file + +Let `DH` be `$XDG_DATA_HOME` (default `$HOME/.local/share`) and `DD1..DDn` +the entries of `$XDG_DATA_DIRS` (default `/usr/local/share` then +`/usr/share`). A relative data path `P` resolves to the first existing file +among `DH/P`, `DD1/P`, ..., `DDn/P`. + +When the `kdeglobals` cascade has no group `[Colors:View]` (b.6, exists), +KDE's platform integration builds the palette from, in order of preference: + +1. `plasma/look-and-feel//contents/colors`, where `` is + `[KDE] LookAndFeelPackage` (default `org.kde.breeze.desktop`); +2. `color-schemes/.colors`, where `` is `[General] ColorScheme` + (default `BreezeLight`); +3. `color-schemes/BreezeLight.colors`. + +That file is read as a full configuration with the `kdeglobals` cascade +below it, so a key the scheme file lacks (for example `[KDE] contrast`) +falls back to `kdeglobals`. **KDE does not apply `[General] AccentColor` in +this fallback** (see n.13; Teksilo applies it there, by decision). + +**`KDE_COLOR_SCHEME_PATH` is not an environment variable.** It is an +in-process application property that a KDE program sets on itself when it +chooses its own scheme; KDE reads no environment variable of that name. +Teksilo must not read such an environment variable and claim KDE +behaviour. If Teksilo offers a per-application scheme override, it is an +explicit API parameter that replaces the scheme file of step 2. This +corrects the plan (n.14). + +### b.9 Value syntaxes + +All values are trimmed and escape-decoded (b.5) before interpretation. + +**Strings** are used as they are, except when the entry carries `[$e]` +(b.11). + +**Integers and reals** use the C locale. An unparseable value yields the +reader's default. Booleans: a value equal, ignoring ASCII case, to `false`, +`no`, `off` or `0` is false; **every other value is true, including an +empty value** (confirmed: `resolve.json` scheme `SyntheticValueForms` +has `[ColorEffects:Inactive] Enable=` and resolves with its Inactive +effects on). An empty value is present (not absent): it does not +fall back to the reader's default, except for integers and reals, whose +parse fails and so gives the default. + +**Colours** (the same rules for every colour key): + +| Stored text | Result in KDE | Teksilo | +|---|---|---| +| key absent or deleted | the reader's default | the compiled default (c.3) | +| empty, or exactly `invalid` | an *invalid colour* (not the default) | treated as absent **[divergence]** | +| starts with `#` | Qt's hex forms: `#RGB`, `#RRGGBB`, `#AARRGGBB`, `#RRRGGGBBB`, `#RRRRGGGGBBBB` [qt]; anything else is an invalid colour | hex forms parsed as Qt documents [qt]: the 3- and 6-digit forms give 8-bit channels (a single digit d means 17 d, stored as `257 x 17 d`), `#AARRGGBB` adds an 8-bit alpha; a 9-digit form gives 12-bit channels v stored as `q = 16 v + floor(v / 256)`, a 12-digit form gives the 16-bit channels as written [measured-qt]; any other digit count, or a non-hex digit, is treated as absent **[divergence]** | +| contains no comma and no leading `#` | an SVG 1.1 colour keyword (case-insensitive) or `transparent` [qt]; unknown names give an invalid colour (the CSS-only keyword `rebeccapurple` is unknown [measured-qt]) | the SVG 1.1 keyword table [qt]; unknown treated as absent **[divergence]** | +| contains commas | exactly 3 or 4 components, each a base-10 integer (optional sign, optional surrounding ASCII whitespace; both confirmed by `resolve.json`) in 0..255; red, green, blue, then alpha; anything else (wrong count, not an integer, out of range) gives the reader's default | same; a rejected value is treated as absent | + +An invalid colour in KDE behaves like opaque black in arithmetic but is +not a colour a user can intend; the plan's decision to treat it as absent +stands, and it is the only colour divergence. + +When KDE **writes** a colour, it writes `r,g,b` (decimal, no spaces) when +the 8-bit alpha `E8(qa)` is 255, `r,g,b,a` otherwise, and `invalid` for an +invalid colour. Each component is `E8` of the stored channel. + +When KDE writes a real number it writes the shortest decimal text that +reads back to the same double (for example `0.2`, `0.15`). Integers are +plain decimal. When KDE *copies* an entry from a scheme file it copies the +**text** verbatim (so `#3daee9` stays `#3daee9`); when it reads a colour and +writes it back it re-formats it as `r,g,b`. Section g says which keys are +copied and which are re-formatted. + +### b.10 KDE session detection + +A session is KDE when `XDG_CURRENT_DESKTOP`, split at `:`, contains `KDE`, +or when `KDE_FULL_SESSION` equals `true`. (The Plasma session start sets +both, plus `KDE_SESSION_VERSION=6`.) + +### b.11 `[$e]` expansion + +Expansion applies only when the entry carries `[$e]` **and** the value is +read as a plain string. Values read as colours, numbers, booleans or fonts +are never expanded. Expansion scans left to right for `$`: + +1. `$$` becomes a single `$`; scanning resumes after it. +2. `${NAME}` (up to the next `}`, or to the end of the value if there is + none) and `$NAME` (the longest run of letters, digits and `_` following + the `$`; letters and digits in the Unicode sense) are replaced by the + value of environment variable `NAME`. An unset or empty variable is + replaced by nothing, except that `QT_DATA_HOME`, `QT_CONFIG_HOME` and + `QT_CACHE_HOME`, when unset, are replaced by the XDG data, config and + cache home directories. +3. A `$` followed by anything else, including `(`, removes just the `$`. + `$(command)` therefore becomes `(command)`. **No command is ever + executed**, and a test must pin this. An empty `${}` is removed + entirely. +4. A trailing lone `$` is kept. + +The injected environment of `KdeConfigLocations::from_env` is the only +source of variable values. + +--- + +## c. The colour-scheme model + +### c.1 Sets, roles, states + +There are seven colour sets, each stored in its own group: + +| Set | Group | +|---|---| +| View | `[Colors:View]` | +| Window | `[Colors:Window]` | +| Button | `[Colors:Button]` | +| Selection | `[Colors:Selection]` | +| Tooltip | `[Colors:Tooltip]` | +| Complementary | `[Colors:Complementary]` | +| Header | `[Colors:Header]` | + +Each set has twelve stored roles (the keys): `BackgroundNormal`, +`BackgroundAlternate`, `ForegroundNormal`, `ForegroundInactive`, +`ForegroundActive`, `ForegroundLink`, `ForegroundVisited`, +`ForegroundNegative`, `ForegroundNeutral`, `ForegroundPositive`, +`DecorationFocus`, `DecorationHover`. + +There are three states (colour groups): Active, Inactive, Disabled. + +After resolution (sections e and f) each (state, set) has 8 foregrounds +(Normal, Inactive, Active, Link, Visited, Negative, Neutral, Positive), 8 +backgrounds (Normal, Alternate and the six computed ones), 2 decorations +(Focus, Hover) and 5 shade roles (Light, Midlight, Mid, Dark, Shadow). + +### c.2 Reading a set for a state + +For a given (state, set): + +1. Choose the **source group** and the **default table**: + - View, Window, Button, Tooltip, Complementary: their own group and their + own table (c.3). + - Header: group `[Colors:Header]`; the default for each key is the value + of the **same key in `[Colors:Window]`** if present there, else the + Header table value. This is a per-key fallback, not a wholesale one: a + Header group that sets only some keys takes the others from Window, + and a scheme without a Header group gets Window's keys for all twelve. + The two decoration keys follow the same rule against the decoration + defaults. + - Selection, Active state: `[Colors:Selection]` with the Selection + table. + - Selection, Inactive state, when **ChangeSelectionColor** (c.5) is + true: group `[Colors:Window]` with the **Window** table, and a *tint + colour* T equal to `[Colors:Selection] BackgroundNormal` (top-level + group, default 61,174,233). + - Selection, Inactive state, when ChangeSelectionColor is false: + `[Colors:Selection]` with the Selection table. + - Selection, Disabled state: `[Colors:Window]` with the Window table and + no tint colour. +2. **Inactive subgroup.** For the Inactive state only: if the source group + has a nested group `[Inactive]` that exists (b.6), that nested group + becomes the source group. Its missing keys take the defaults chosen in + step 1 (for Header: Window's top-level key, else the Header table); they + do **not** fall back to the parent group's keys. For Selection with + ChangeSelectionColor the nested group looked at is + `[Colors:Window][Inactive]`. +3. Read each of the twelve keys from the source group, falling back to the + default. A colour that is treated as absent (b.9) takes the default. +4. **Selection tint.** If a tint colour T was chosen in step 1, replace + BackgroundNormal by `tint(BackgroundNormal, T, 0.4)` and + BackgroundAlternate by `tint(BackgroundAlternate, T, 0.4)` (d.9). The + foregrounds and decorations stay the Window values. +5. Apply the state effects (section e) for every state other than Active. + **This includes the Inactive state when an `[Inactive]` subgroup + supplied the colours**: the subgroup replaces the source values, and the + Inactive effects still run on top of them (they are no-ops for Breeze, + whose Inactive effects are disabled). +6. Compute the six derived backgrounds (section f.1). + +The Tooltip set used for palettes is always the Active state's (f.2). + +### c.3 Compiled defaults for absent keys + +These are the values used when a key is absent. They equal Breeze Light except for +`DecorationHover`. +`DecorationFocus` default for every set is 61,174,233; `DecorationHover` +default is **147,206,233** (note: not the 61,174,233 the Breeze files +write). + +| Key | View | Window | Button | Selection | Tooltip | Complementary | Header | +|---|---|---|---|---|---|---|---| +| BackgroundNormal | 255,255,255 | 239,240,241 | 252,252,252 | 61,174,233 | 247,247,247 | 42,46,50 | 222,224,226 | +| BackgroundAlternate | 247,247,247 | 227,229,231 | 163,212,250 | 163,212,250 | 239,240,241 | 27,30,32 | 239,240,241 | +| ForegroundNormal | 35,38,41 | 35,38,41 | 35,38,41 | 255,255,255 | 35,38,41 | 252,252,252 | 35,38,41 | +| ForegroundInactive | 112,125,138 | 112,125,138 | 112,125,138 | 112,125,138 | 112,125,138 | 161,169,177 | 112,125,138 | +| ForegroundActive | 61,174,233 | 61,174,233 | 61,174,233 | 255,255,255 | 61,174,233 | 61,174,233 | 61,174,233 | +| ForegroundLink | 41,128,185 | 41,128,185 | 41,128,185 | 253,188,75 | 41,128,185 | 29,153,243 | 41,128,185 | +| ForegroundVisited | 155,89,182 | 155,89,182 | 155,89,182 | 155,89,182 | 155,89,182 | 155,89,182 | 155,89,182 | +| ForegroundNegative | 218,68,83 | 218,68,83 | 218,68,83 | 176,55,69 | 218,68,83 | 218,68,83 | 218,68,83 | +| ForegroundNeutral | 246,116,0 | 246,116,0 | 246,116,0 | 198,92,0 | 246,116,0 | 246,116,0 | 246,116,0 | +| ForegroundPositive | 39,174,96 | 39,174,96 | 39,174,96 | 23,104,57 | 39,174,96 | 39,174,96 | 39,174,96 | + +(The Header column applies only where `[Colors:Window]` lacks the key.) + +### c.4 The stock Breeze schemes (v6.8.0), for the Rust constants + +These are the fixture values; the constants must be tested equal to the +fixture files. + +**Breeze Light** (`ColorScheme=BreezeLight`, `Name=Breeze Light`). Every set +has DecorationFocus 61,174,233 and DecorationHover 61,174,233. + +| Key | View | Window | Button | Selection | Tooltip | Complementary | Header | Header [Inactive] | +|---|---|---|---|---|---|---|---|---| +| BackgroundNormal | 255,255,255 | 239,240,241 | 252,252,252 | 61,174,233 | 247,247,247 | 42,46,50 | 222,224,226 | 239,240,241 | +| BackgroundAlternate | 247,247,247 | 227,229,231 | 163,212,250 | 163,212,250 | 239,240,241 | 27,30,32 | 239,240,241 | 227,229,231 | +| ForegroundNormal | 35,38,41 | 35,38,41 | 35,38,41 | 255,255,255 | 35,38,41 | 252,252,252 | 35,38,41 | 35,38,41 | +| ForegroundInactive | 112,125,138 | 112,125,138 | 112,125,138 | 112,125,138 | 112,125,138 | 161,169,177 | 112,125,138 | 112,125,138 | +| ForegroundActive | 61,174,233 | 61,174,233 | 61,174,233 | 255,255,255 | 61,174,233 | 61,174,233 | 61,174,233 | 61,174,233 | +| ForegroundLink | 41,128,185 | 41,128,185 | 41,128,185 | 253,188,75 | 41,128,185 | 29,153,243 | 41,128,185 | 41,128,185 | +| ForegroundVisited | 155,89,182 | 155,89,182 | 155,89,182 | 155,89,182 | 155,89,182 | 155,89,182 | 155,89,182 | 155,89,182 | +| ForegroundNegative | 218,68,83 | 218,68,83 | 218,68,83 | 176,55,69 | 218,68,83 | 218,68,83 | 218,68,83 | 218,68,83 | +| ForegroundNeutral | 246,116,0 | 246,116,0 | 246,116,0 | 198,92,0 | 246,116,0 | 246,116,0 | 246,116,0 | 246,116,0 | +| ForegroundPositive | 39,174,96 | 39,174,96 | 39,174,96 | 23,104,57 | 39,174,96 | 39,174,96 | 39,174,96 | 39,174,96 | + +`[KDE] contrast=4` (no `frameContrast`). `[WM]`: activeBackground +227,229,231; activeBlend 227,229,231; activeForeground 35,38,41; +inactiveBackground 239,240,241; inactiveBlend 239,240,241; +inactiveForeground 112,125,138. `[General] shadeSortColumn=true`. + +**Breeze Dark** (`ColorScheme=BreezeDark`, `Name=Breeze Dark`). Every set +has DecorationFocus 61,174,233 and DecorationHover 61,174,233. + +| Key | View | Window | Button | Selection | Tooltip | Complementary | Header | Header [Inactive] | +|---|---|---|---|---|---|---|---|---| +| BackgroundNormal | 20,22,24 | 32,35,38 | 41,44,48 | 61,174,233 | 41,44,48 | 32,35,38 | 41,44,48 | 32,35,38 | +| BackgroundAlternate | 29,31,34 | 41,44,48 | 30,87,116 | 30,87,116 | 32,35,38 | 30,87,116 | 32,35,38 | 41,44,48 | +| ForegroundNormal | 252,252,252 | 252,252,252 | 252,252,252 | 252,252,252 | 252,252,252 | 252,252,252 | 252,252,252 | 252,252,252 | +| ForegroundInactive | 161,169,177 | 161,169,177 | 161,169,177 | 161,169,177 | 161,169,177 | 161,169,177 | 161,169,177 | 161,169,177 | +| ForegroundActive | 61,174,233 | 61,174,233 | 61,174,233 | 252,252,252 | 61,174,233 | 61,174,233 | 61,174,233 | 61,174,233 | +| ForegroundLink | 29,153,243 | 29,153,243 | 29,153,243 | 253,188,75 | 29,153,243 | 29,153,243 | 29,153,243 | 29,153,243 | +| ForegroundVisited | 155,89,182 | 155,89,182 | 155,89,182 | 155,89,182 | 155,89,182 | 155,89,182 | 155,89,182 | 155,89,182 | +| ForegroundNegative | 218,68,83 | 218,68,83 | 218,68,83 | 176,55,69 | 218,68,83 | 218,68,83 | 218,68,83 | 218,68,83 | +| ForegroundNeutral | 246,116,0 | 246,116,0 | 246,116,0 | 198,92,0 | 246,116,0 | 246,116,0 | 246,116,0 | 246,116,0 | +| ForegroundPositive | 39,174,96 | 39,174,96 | 39,174,96 | 23,104,57 | 39,174,96 | 39,174,96 | 39,174,96 | 39,174,96 | + +`[KDE] contrast=4`. `[WM]`: activeBackground 39,44,49; activeBlend +252,252,252; activeForeground 252,252,252; inactiveBackground 32,36,40; +inactiveBlend 161,169,177; inactiveForeground 161,169,177. +`[General] shadeSortColumn=true`. + +**Breeze Classic** (`ColorScheme=BreezeClassic`, `Name=Breeze Classic`). No +`[Colors:Header]` group (Header resolves to Window per key). Decorations: +DecorationFocus 61,174,233 and DecorationHover 147,206,233 in View, Window, +Button, Selection, Tooltip; Complementary has DecorationFocus 30,146,255 and +DecorationHover 61,174,230. + +| Key | View | Window | Button | Selection | Tooltip | Complementary | +|---|---|---|---|---|---|---| +| BackgroundNormal | 252,252,252 | 239,240,241 | 239,240,241 | 61,174,233 | 35,38,39 | 49,54,59 | +| BackgroundAlternate | 239,240,241 | 189,195,199 | 189,195,199 | 29,153,243 | 77,77,77 | 59,64,69 | +| ForegroundNormal | 35,38,39 | 35,38,39 | 35,38,39 | 252,252,252 | 252,252,252 | 239,240,241 | +| ForegroundInactive | 127,140,141 | 127,140,141 | 127,140,141 | 239,240,241 | 189,195,199 | 175,176,179 | +| ForegroundActive | 61,174,233 | 61,174,233 | 61,174,233 | 252,252,252 | 61,174,233 | 147,206,233 | +| ForegroundLink | 41,128,185 | 41,128,185 | 41,128,185 | 253,188,75 | 41,128,185 | 61,174,230 | +| ForegroundVisited | 127,140,141 | 127,140,141 | 127,140,141 | 189,195,199 | 127,140,141 | 61,174,230 | +| ForegroundNegative | 218,68,83 | 218,68,83 | 218,68,83 | 176,55,69 | 218,68,83 | 231,76,60 | +| ForegroundNeutral | 246,116,0 | 246,116,0 | 198,92,0 | 246,116,0 | 246,116,0 | 253,188,75 | +| ForegroundPositive | 39,174,96 | 39,174,96 | 39,174,96 | 23,104,57 | 39,174,96 | 46,204,113 | + +`[General]` also has `accentActiveTitlebar=true`, `accentInactiveTitlebar=false`, +`shadeSortColumn=true`. `[KDE] contrast=4`. `[WM]`: activeBackground +71,80,87; activeBlend 252,252,252; activeForeground 252,252,252; +inactiveBackground 239,240,241; inactiveBlend 75,71,67; inactiveForeground +189,195,199. + +**Effects in all three files** (identical): + +`[ColorEffects:Disabled]`: Color 56,56,56; ColorAmount 0; ColorEffect 0; +ContrastAmount 0.65; ContrastEffect 1; IntensityAmount 0.1; +IntensityEffect 2. (No `Enable` key, so enabled by default.) + +`[ColorEffects:Inactive]`: ChangeSelectionColor true; Color 112,111,110; +ColorAmount 0.025; ColorEffect 2; ContrastAmount 0.1; ContrastEffect 2; +**Enable false**; IntensityAmount 0; IntensityEffect 0. + +### c.5 `[ColorEffects:Disabled]` and `[ColorEffects:Inactive]` + +Keys, read from the configuration being resolved (top-level groups): + +| Key | Type | Meaning | +|---|---|---| +| Enable | bool | whether the state's effects run | +| IntensityEffect | int | 0 none, 1 shade, 2 darken, 3 lighten; any other value: none | +| IntensityAmount | real | the intensity amount | +| ColorEffect | int | 0 none, 1 desaturate, 2 fade, 3 tint; any other value: none | +| ColorAmount | real | the colour amount | +| Color | colour | the effect colour, read only when ColorEffect is greater than 0 | +| ContrastEffect | int | 0 none, 1 fade, 2 tint; any other value: none | +| ContrastAmount | real | the contrast amount | +| ChangeSelectionColor | bool | Inactive group only; see c.2 | + +Defaults when a key is absent: + +| Key | Disabled | Inactive | +|---|---|---| +| Enable | **true** | **false** | +| IntensityEffect | 2 (darken) | 0 | +| IntensityAmount | 0.10 | 0.0 | +| ColorEffect | 0 | 1 (desaturate) | +| ColorAmount | 0.0 | -0.9 | +| Color | 56,56,56 | 112,111,110 | +| ContrastEffect | 1 (fade) | 2 (tint) | +| ContrastAmount | 0.65 | 0.25 | + +`ChangeSelectionColor` defaults to the value of `Enable` in +`[ColorEffects:Inactive]` **with a default of true** for that lookup. So a +configuration with no `[ColorEffects:Inactive]` group at all has Inactive +effects off and ChangeSelectionColor on. + +When Enable is false, all three effect kinds are "none" and the amounts are +irrelevant; the effect pass returns its inputs **unchanged and +unquantised** (no colour operation runs). + +### c.6 `[KDE] contrast` and `[KDE] frameContrast` + +- `contrast` is an integer, default 7. The **contrast value** used by the + shade roles is `k = 0.1 x contrast`. It is not clamped when read; the + shade-role computation clamps it (d.10). An unparseable value gives 7. + When KDE has no configuration at all (the system-palette mode used under + a platform high-contrast preference with no scheme) the contrast value is + 0.7. +- `frameContrast` is a real, default 0.2, clamped to [0, 1]. An + unparseable value gives 0.2. It is not used by the colour model itself; + Breeze uses it as the frame intensity bias `fc` (section k). + +### c.7 `[WM]` + +Six colour keys describe title bars: `activeBackground`, +`activeForeground`, `inactiveBackground`, `inactiveForeground`, +`activeBlend`, `inactiveBlend`. The accent application always writes all +six (g.5, g.7). The widget style itself reads only the first four (for its MDI +title bars), defaulting to the Active Highlight, Active HighlightedText, +Disabled Highlight and Disabled HighlightedText of the application palette +when absent. + +### c.8 `[General]` keys + +| Key | Where | Meaning | +|---|---|---| +| ColorScheme | kdeglobals, scheme | the scheme name; default `BreezeLight` | +| Name | scheme | display name (localised variants ignored) | +| AccentColor | kdeglobals | the user's accent; consulted by the accent application (g.1) | +| TintFactor | scheme | presence turns on accent tinting (g.3, g.7); value default 0.15 | +| TitlebarIsAccentColored | scheme | accent-coloured title bar; falls back to `accentActiveTitlebar`, then false | +| accentActiveTitlebar | scheme | legacy name of the previous key | +| accentInactiveTitlebar | scheme | legacy; not read by the accent application | +| ColorSchemeHash | kdeglobals | lower-case hex SHA-1 of the applied scheme file's bytes; written by the accent application | +| shadeSortColumn | scheme | item-view sort-column shading; not used by this specification | + +--- + +## d. Colour mathematics + +All operations here take and return stored colours (a.3) unless they return +a real number. Operation names in this section are this document's own. + +### d.1 Constants + +- Gamma exponent: 2.2 (forward), 1/2.2 (inverse). +- Luma weights (ITU-R BT.709): `wr = 0.2126`, `wg = 0.7152`, + `wb = 0.0722`. + +### d.2 Linearisation + +For a channel read `x` (a.3): `lin(x) = N(x) ^ 2.2` and +`delin(x) = N(x) ^ (1/2.2)`, using the real power function in double +precision. + +### d.3 Luma + +`luma(C) = lin(R) wr + lin(G) wg + lin(B) wb`, evaluated left to right, +where R, G, B are the channel reads of C. Alpha is ignored. Range 0 to 1. + +This is not WCAG relative luminance: it uses a pure 2.2 power instead of +the sRGB transfer curve. + +### d.4 HCY forward conversion + +Input: a stored colour. Output: four reals (h, c, y, a). + +1. `r = lin(R)`, `g = lin(G)`, `b = lin(B)`; `a` is the channel read of + alpha. +2. `y = r wr + g wg + b wb` (as d.3). +3. `p = max(r, g, b)`, `n = min(r, g, b)`, `d = 6 (p - n)`. +4. Hue, tested in this order: + - if `n = p`: `h = 0`; + - else if `r = p`: `h = (g - b) / d`; + - else if `g = p`: `h = (b - r) / d + 1/3`; + - else: `h = (r - g) / d + 2/3`. + + `h` is **not wrapped**: when red is the maximum and blue exceeds green, + `h` lies in (-1/6, 0). It stays negative inside the operations of d.6 + and is wrapped only by the inverse conversion. (Where a hue is reported + to a caller as a number in [0, 1), add 1 when negative.) +5. Chroma: if `r = g = b`: `c = 0`; else + `c = max((y - n) / y, (p - y) / (1 - y))`. + +Equality tests in steps 4 and 5 are exact floating-point comparisons. + +### d.5 HCY inverse conversion + +Input: (h, c, y, a). Output: a stored colour. + +1. `h1 = wrap(h)`, where `wrap(h)` is the remainder of h divided by 1 with + the sign of h (C `fmod`), plus 1 if that remainder is negative; a zero + or NaN remainder gives 0. `c1 = N(c)`, `y1 = N(y)`. +2. `s = 6 h1`. Choose the sector and compute `t` and `m`: + +| Sector | Condition | t | m | +|---|---|---|---| +| 0 | s < 1 | s | wr + wg t | +| 1 | s < 2 | 2 - s | wg + wr t | +| 2 | s < 3 | s - 2 | wg + wb t | +| 3 | s < 4 | 4 - s | wb + wg t | +| 4 | s < 5 | s - 4 | wb + wr t | +| 5 | otherwise | 6 - s | wr + wb t | + +3. Compute the three linear components (top `P`, middle `O`, bottom `B0`): + - if `m >= y1`: + `P = y1 + y1 c1 (1 - m) / m`, + `O = y1 + y1 c1 (t - m) / m`, + `B0 = y1 - y1 c1`; + - else: + `P = y1 + (1 - y1) c1`, + `O = y1 + (1 - y1) c1 (t - m) / (1 - m)`, + `B0 = y1 - (1 - y1) c1 m / (1 - m)`. + + Products and quotients are evaluated left to right as written (for + example `y1 c1 (1 - m) / m` is `((y1 x c1) x (1 - m)) / m`). +4. Assign to (red, green, blue) by sector: + +| Sector | red | green | blue | +|---|---|---|---| +| 0 | P | O | B0 | +| 1 | O | P | B0 | +| 2 | B0 | P | O | +| 3 | B0 | O | P | +| 4 | O | B0 | P | +| 5 | P | B0 | O | + +5. Each channel is `delin` of its component, stored with Q16. Alpha `a` is + stored with Q16. + +Round trip: forward then inverse must reproduce any 8-bit colour exactly +(a proptest over 8-bit inputs). Example: 61,174,233 has +h = 0.58336232, c = 0.88592616, y = 0.37683496 and returns to 61,174,233. + +### d.6 Luma operations + +Each converts the input to HCY (d.4), changes y and c, keeps h and a, and +converts back (d.5). + +- **Luma lighten** with amount `ky` (default 0.5) and chroma factor `kc` + (default 1): `y' = 1 - N((1 - y)(1 - ky))`, `c' = 1 - N((1 - c) kc)`. + Amount 1 gives white, 0.5 halves the distance to white, 0 keeps the + luma. +- **Luma darken** with amount `ky` (default 0.5) and chroma factor `kc` + (default 1): `y' = N(y (1 - ky))`, `c' = N(c kc)`. +- **Luma shade** with luma amount `ky` and chroma amount `kc` (default 0): + `y' = N(y + ky)`, `c' = N(c + kc)`. + +Even with amounts that leave y and c unchanged, the round trip re-quantises +the colour. (The effect pass avoids this by not calling an operation when +the effect is "none", c.5.) + +### d.7 Premultiplied mix + +**Mix**(C1, C2, t): + +1. If `t <= 0`, return C1 unchanged. Else if `t >= 1`, return C2 unchanged. + Else if t is NaN, return C1 unchanged. (Tested in this order.) +2. `a = L(a1, a2, t)` from the alpha channel reads. If `a <= 0`, return + (0, 0, 0, 0). +3. For each colour channel: form the premultiplied values `p1 = x1 a1` and + `p2 = x2 a2` **in single precision** (x the channel reads), then + `x = N'(L(p1, p2, t)) / a`, where `N'` clamps to [0, 1] (no NaN case + arises). +4. Store the three channels and `a` with Q16. + +### d.8 Luma contrast ratio + +`ratio(Y1, Y2) = (Y1 + 0.05) / (Y2 + 0.05)` if `Y1 > Y2`, otherwise +`(Y2 + 0.05) / (Y1 + 0.05)`, for two lumas from d.3. Between colours: +`ratio(luma(C1), luma(C2))`. It has WCAG's shape but uses d.3's luma, so +its values differ from WCAG contrast; Teksilo's WCAG checks must use +Teksilo's own WCAG helpers, never this. + +### d.9 Luma-preserving tint + +**Tint**(base B, colour C, amount t), default t = 0.3: + +1. If `t <= 0` return B unchanged; else if `t >= 1` return C unchanged; + else if t is NaN return B unchanged. +2. `Yb = luma(B)`; `ri = ratio(Yb, luma(C))`; + `rg = 1 + ((ri + 1) x t x t x t)` (left to right). +3. Bisection on `s` in [0, 1] with `l = 0`, `u = 1`, exactly **12** + iterations. In each iteration: + - `s = (l + u) / 2`; + - `M = Mix(B, C, s ^ 0.3)` (a stored colour); + - `Ys = L(Yb, luma(M), s)`; + - if `ratio(Yb, Ys) > rg` then `u = s`, else `l = s`. +4. The result uses the **last midpoint `s` computed in the loop** (the + twelfth midpoint), not the final `l` or `u`: take `M = Mix(B, C, s ^ 0.3)`, + convert M to HCY, replace its y by `L(Yb, y_M, s)`, keep h, c and alpha, + and convert back (d.5). + +The exponent 0.3 and the cube in rg are exact constants. `s ^ 0.3` uses the +real power function. + +### d.10 Shade roles + +**ShadeRole**(colour C, role, contrast value k), with chroma amount 0: + +1. Clamp k: if `k >= 1` or k is NaN, k = 1; else if `k <= -1`, k = -1. +2. `y = luma(C)`, `yi = 1 - y`. +3. If `y < 0.006` (very dark): Light = shade(C, 0.05 + 0.95 k); + Mid = shade(C, 0.01 + 0.20 k); Dark = shade(C, 0.02 + 0.40 k); + Midlight and Shadow = shade(C, 0.03 + 0.60 k). +4. Else if `y > 0.93` (very light): Midlight = shade(C, -0.02 - 0.20 k); + Dark = shade(C, -0.06 - 0.60 k); Shadow = shade(C, -0.10 - 0.90 k); + Light and Mid = shade(C, -0.04 - 0.40 k). +5. Otherwise, with `la = (0.05 + 0.55 y)(0.25 + 0.75 k)` and + `da = (-y)(0.55 + 0.35 k)`: + - Light = shade(C, la); + - Midlight = shade(C, (0.15 + 0.35 yi) la); + - Mid = shade(C, (0.35 + 0.15 y) da); + - Dark = shade(C, da); + - Shadow = darken(shade(C, da), 0.5 + 0.3 y) with chroma factor 1. + +"shade" and "darken" are d.6 (shade with chroma amount 0). Example: Breeze +Light Window background 239,240,241 with k = 0.4 gives Light 255,255,255, +Midlight 246,247,247, Mid 196,200,204, Dark 136,142,147, Shadow 71,74,76 +(computed from this specification; the goldens are authoritative). + +### d.11 HSV lighter and darker (Qt semantics) + +These reproduce Qt's documented `lighter(factor)` and `darker(factor)` +colour functions [qt]. The factor is an integer percentage. + +- factor <= 0: return the colour unchanged. +- lighter with factor < 100 is darker with factor `floor(10000 / factor)`; + darker with factor < 100 is lighter with factor `floor(10000 / factor)`. +- Convert to HSV with 16-bit value and saturation (0..65535) and hue in + hundredths of a degree (0..36000, or "undefined" for an achromatic + colour), as below. +- lighter (factor >= 100): `v' = floor(factor x v / 100)` (integers). If v' + exceeds 65535, the excess is removed from saturation: + `s' = max(0, s - (v' - 65535))` and `v' = 65535`. +- darker (factor >= 100): `v' = floor(v x 100 / factor)` (integers); s + unchanged. +- Convert back to RGB and store. Alpha is kept as stored. + +**RGB to HSV**, on the stored 16-bit integers r, g, b [measured-qt]: + +1. `max` and `min` of the three integers; `v = max`. +2. If `max = min` (exact integer equality): hue undefined, `s = 0`. +3. Otherwise `k = max - min` as a single-precision value; + `s = R(F32(k / v) x 65535)`, where the quotient and the product are each + rounded to single precision and `R(x) = floor(x + 1/2)` turns the + single-precision value into an integer. +4. Hue position `p` (single precision): if `v = r`, `p = (g - b) / k`, plus 6 + when negative; else if `v = g`, `p = 2 + (b - r) / k`; else + `p = 4 + (r - g) / k`. The integer differences are exact; each quotient + and sum is rounded to single precision. The stored hue is + `R(F32(p x 6000))`, which can be 36000. + +**HSV to RGB** [measured-qt]: + +1. If `s = 0` or the hue is undefined, all three channels are `v`. +2. Otherwise, in single precision: `h = 0` when the hue is 36000, else + `h = hue / 6000`; `S = s / 65535`; `V = v / 65535`; `i = trunc(h)`, + `f = h - i`; `p = V (1 - S)`; for odd i, `q = V (1 - S f)`; for even i, + `t = V (1 - S (1 - f))` (each product and difference rounded to single + precision, innermost first). +3. Channels (red, green, blue) by i: 0: (V, t, p); 1: (q, V, p); 2: (p, V, + t); 3: (p, q, V); 4: (t, p, V); 5: (V, p, q). Each is stored as + `R(F32(x x 65535))` (the Q16 of a.3). + +`math.json` member `qt_lighter_darker` pins these rules: 62 colours x 14 +factors (including -10, 0, 1, 50, 99, 100, 102, 110, 120, 150 and 1000), +both directions, all reproduced exactly. + +### d.12 8-bit alpha blend + +**Blend8**(foreground F with alpha, opaque or translucent background G) +operates on 8-bit channel values (E8 of the stored channels) and returns a +colour built from 8-bit integers: + +1. `af` = the alpha channel read of F (single precision value `qa / 65535`). +2. If `af = 0`, return G unchanged. +3. `ai = 1 - af` in double precision (af widened). +4. If G's alpha read is exactly 1: each channel is + `trunc(P + ai x g8)`, where `P` is the **single-precision** product + `af x f8` and the sum is double precision; `trunc` discards the fraction + (all values are non-negative). Alpha is 255. The result is stored from + 8-bit values (`q = 257 v`). +5. Otherwise (translucent background; never the case for Breeze): with + `ab` = G's alpha read, `aib = ab x ai`, each channel is + `trunc(P + aib x g8)` and the **alpha is the integer part of + `af + aib`**, which is 0 unless the sum is exactly 1, and then 1 (out of + 255). The colour channels are not un-premultiplied. KDE writes this + nearly transparent result; Teksilo must reproduce it for byte equality. + +Alpha quantisation that feeds Blend8 (setting an alpha as a fraction +uses Q16): + +| Fraction | Stored alpha q | Effective af | +|---|---|---| +| 0.7 | 45875 | 0.70000761747 (single precision) | +| 0.6 | 39321 | 0.60000002384 (single precision) | +| 1.0 | 65535 | 1.0 | + +Example (why the precision rules matter): white at alpha 0.6 over 255 +gives `trunc(153.0 + 0.39999997616 x 255) = trunc(254.99999392) = 254`, +not 255. + +### d.13 Black-or-white foreground rule + +**OnColour**(background G, active flag): + +1. Start from white. If `ratio(luma(G), luma(white)) < 4.5` (d.8, so + KDE's luma ratio, not WCAG), choose black; otherwise white. + Equivalently, black exactly when `luma(G) > 1.05 / 4.5 - 0.05` + (about 0.183333). +2. Give the chosen colour alpha 1.0 when active, 0.6 when inactive. +3. Return `Blend8(chosen, G)`. + +Active results are pure black or pure white. Inactive results are the +chosen colour at 0.6 over G with the truncation of d.12. + +### d.14 Accent background blend + +**AccentBg**(accent A, background G) = `Blend8(A with alpha 0.7, G)`. +Only the 8-bit values of A are used. Example: 61,174,233 over 255,255,255 +gives 119,198,239; over 20,22,24 gives 48,128,170. + +### d.15 OKLab tint + +**OklabTint**(base B, colour C, factor f) is the accent tint of g.3 and g.7. It +follows Björn Ottosson's OKLab definition ("A perceptual color space for +image processing", 2020, MIT licence), using the matrices **as Ottosson +published them to ten decimal places**: + +- linear sRGB to LMS: l = 0.4122214708 r + 0.5363325363 g + 0.0514459929 b; + m = 0.2119034982 r + 0.6806995451 g + 0.1073969566 b; + s = 0.0883024619 r + 0.2817188376 g + 0.6299787005 b; +- cube roots `l^, m^, s^` (real power 1/3); +- L = 0.2104542553 l^ + 0.7936177850 m^ - 0.0040720468 s^; + a = 1.9779984951 l^ - 2.4285922050 m^ + 0.4505937099 s^; + b = 0.0259040371 l^ + 0.7827717662 m^ - 0.8086757660 s^; +- inverse: l^ = L + 0.3963377774 a + 0.2158037573 b; + m^ = L - 0.1055613458 a - 0.0638541728 b; + s^ = L - 0.0894841775 a - 1.2914855480 b; cube each; + r = 4.0767416621 l - 3.3077115913 m + 0.2309699292 s; + g = -1.2684380046 l + 2.6097574011 m - 0.3413193965 s; + b = -0.0041960863 l - 0.7034186147 m + 1.7076147010 s. + +**sRGB to linear (SL) and linear to sRGB (LS)** are Qt's colour-space +transforms between its named sRGB and linear sRGB spaces, applied to a +stored colour [measured-qt]. Everything below is single precision (each +operation rounded to binary32), and the single-precision power is the +correctly rounded binary32 power (computing it in double precision and +rounding once reproduces every golden). + +- Constants: `A = F32(1 / F32(1.055))`, `B = F32(F32(0.055) / F32(1.055))`, + `K = F32(1 / F32(12.92))`, `D = F32(0.04045)`, `G = F32(2.4)`; for the + inverse curve `D' = F32(K D)`, `K' = F32(1 / K)`, + `A' = F32(F32(1 / A) ^ G)`, `E' = F32(-B / A)`, `G' = F32(1 / G)`. +- Forward curve T(x), x a channel read: with `u = |x|`, `T = K u` when + `u < D`, else `T = (A u + B) ^ G`; the sign of x is restored. +- Inverse curve T'(y): with `u = |y|`, `T' = K' u` when `u < D'`, else + `T' = (A' u) ^ G' + E'`; the sign of y is restored. +- Matrix M (applied in both directions; it is the identity up to + single-precision rounding, because Qt forms it as the inverse of the sRGB + to XYZ matrix times that matrix). With input channels (r, g, b), each + output channel is `(r m1 + g m2) + b m3`, products and sums in single + precision, left to right, with (m1, m2, m3) = + red: (`0x1.fffffep-1` = 0.99999994039535522, `0x1.4p-25` = + 3.7252902984619141e-08, `-0x1p-25` = -2.9802322387695312e-08); + green: (`0x1.928p-26` = 2.3428583517670631e-08, 1, 0); + blue: (0, 0, `0x1.fffffcp-1` = 0.99999988079071045). + The values are binary32 numbers written in hexadecimal floating point. +- SL(X): read X's channels, apply T to each, then M; the linear space's own + curve is the identity. LS(X): read X's channels (identity curve), apply + M, then T' to each. +- **Storing a float colour** (used by SL, LS and step 4): if all three + channels lie in [0, 1], store each with Q16; otherwise the colour is held + in **half precision**: each channel (and the alpha, 1) is rounded to the + nearest binary16 value (ties to even). A channel read of such a colour is + its binary16 value. Converting it to 16-bit channels (step 4, and the 8-bit + write of a.3) clamps each binary16 value to [0, 1] and stores it with Q16. + M can push a channel of an in-gamut colour a few units in the last place + outside [0, 1] (for example the red channel of pure blue becomes + -2.98e-08), and such a colour is then held in half precision. + +Steps: + +1. `Bl = SL(B)`, `Cl = SL(C)` (stored as above). +2. Read the channels of Bl and Cl and convert each to OKLab in double + precision (cube roots by the real power 1/3). +3. Keep B's L. Replace B's a by `Lf(aB, aC, f)` and b by `Lf(bB, bC, f)`, + where `Lf(x, y, f) = x (1 - f) + y f` is evaluated with x, y and f first + rounded to single precision, `(1 - f)` and `x (1 - f)` in double, `y f` + in single, the sum in double, and **the result rounded to single + precision**. +4. Convert back to linear sRGB in double precision, round each channel to + single precision, store the float colour as above (the range test is on + the single-precision values), and convert it to 16-bit channels. +5. The result is `LS` of that colour, stored as above. Alpha is opaque. + +The written value is the E8 projection of step 5 (clamped first when it is +held in half precision). Goldens: `math.json` members `qt_colorspace` (SL +and LS of 573 colours; 6 of the 1146 results are held in half precision) and +`qt_extended` (half-precision storage and its conversion) pin the +conversions exactly; `accent.json` (the `KdeGoldenTintLight` cases, whose +tinted Button background 232,255,255 leaves the gamut) pins the whole +tint. A rule that skips M, the half-precision storage, or the +single-precision curve constants (using `((x + 0.055) / 1.055) ^ 2.4` +instead) still matches those 40 oracle cases but differs from Plasma in +about 1 tint in 1400 over random inputs, so the details above are +normative. + +--- + +## e. State effects (Disabled and Inactive) + +### e.1 When they run + +For every set and for the Disabled and Inactive states (never Active), +after c.2 steps 1 to 4, using the effect parameters of that state (c.5). +The Tooltip set is resolved for the palette in the Active state only (f.2), +but its Inactive and Disabled resolutions follow the same rules when a +caller asks for them. + +### e.2 Order of application within one (state, set) + +Let `BG0` be the set's BackgroundNormal **before** any effect (after the +selection tint of c.2 step 4, if any). + +1. **Foregrounds and decorations first**, each against `BG0`: for each of + the 8 foregrounds and the 2 decorations, apply the foreground chain + (e.3) with background `BG0`. +2. **Then the two stored backgrounds**: BackgroundNormal and + BackgroundAlternate each get the background chain (e.3). +3. Only after both steps are the computed backgrounds derived (f.1), from + the post-effect BackgroundNormal and the post-effect foregrounds. + +### e.3 The chains + +**Background chain** on a colour X: + +1. Intensity: shade gives `shade(X, IntensityAmount)` (chroma amount 0); + darken gives `darken(X, IntensityAmount)` (chroma factor 1); lighten + gives `lighten(X, IntensityAmount)` (chroma factor 1); none leaves X. +2. Colour, on the result: desaturate gives `darken(X, 0, 1 - ColorAmount)` + (luma amount 0, chroma factor `1 - ColorAmount`); fade gives + `Mix(X, Color, ColorAmount)`; tint gives `Tint(X, Color, ColorAmount)`; + none leaves it. + +**Foreground chain** on a colour X against background G: + +1. Contrast: fade gives `Mix(X, G, ContrastAmount)`; tint gives + `Tint(X, G, ContrastAmount)`; none leaves X. +2. Then the background chain (intensity, then colour) on the result. + +Decorations use the foreground chain. + +### e.4 Breeze consequences + +- **Disabled** (all three Breeze files): every foreground and decoration + becomes `darken(Mix(X, BG0, 0.65), 0.1)`; each background becomes + `darken(X, 0.1)`. Example (Breeze Light Window): ForegroundNormal + 35,38,41 becomes 160,161,163; BackgroundNormal 239,240,241 becomes + 227,229,231 (computed from this specification). +- **Inactive**: Enable is false, so foregrounds, backgrounds and + decorations pass through exactly. ChangeSelectionColor is true, so the + Inactive **Selection** set is the Window set (or `[Colors:Window][Inactive]` + if present) with both backgrounds tinted 0.4 toward the Selection + BackgroundNormal, and with the Window set's foregrounds. Example (Breeze + Light): Inactive Selection BackgroundNormal is + `Tint(239,240,241, 61,174,233, 0.4)` = 194,224,245, BackgroundAlternate + `Tint(227,229,231, 61,174,233, 0.4)` = 176,216,243, ForegroundNormal + 35,38,41 (computed from this specification). +- **Disabled Selection** is the Window set with the Disabled effects and no + tint. +- **Header, Inactive**: Breeze has `[Colors:Header][Inactive]`, which + supplies the Inactive Header colours (no effects change them). + +A scheme that enables Inactive effects (Oxygen-style schemes) gets the +full chains; Teksilo must honour them. + +--- + +## f. Computed backgrounds and palette roles + +### f.1 Computed backgrounds + +For each (state, set), from the post-effect values: + +| Background | Value | +|---|---| +| ActiveBackground | Tint(BackgroundNormal, ForegroundActive, 0.3) | +| LinkBackground | Tint(BackgroundNormal, ForegroundLink, 0.3) | +| VisitedBackground | Tint(BackgroundNormal, ForegroundVisited, 0.3) | +| NegativeBackground | Tint(BackgroundNormal, ForegroundNegative, 0.3) | +| NeutralBackground | Tint(BackgroundNormal, ForegroundNeutral, 0.3) | +| PositiveBackground | Tint(BackgroundNormal, ForegroundPositive, 0.3) | + +Examples (Breeze Light View, Active): ActiveBackground 236,246,252; +NegativeBackground 250,236,237; NeutralBackground 254,241,234; +PositiveBackground 221,251,232 (computed from this specification). + +### f.2 Palette roles (the QPalette-equivalent table) + +For each state (Active, Inactive, Disabled): + +| Palette role | Source | +|---|---| +| Window | Window BackgroundNormal | +| WindowText | Window ForegroundNormal | +| Base | View BackgroundNormal | +| Text | View ForegroundNormal | +| AlternateBase | View BackgroundAlternate | +| Link | View ForegroundLink | +| LinkVisited | View ForegroundVisited | +| PlaceholderText | View ForegroundInactive | +| Button | Button BackgroundNormal | +| ButtonText | Button ForegroundNormal | +| Highlight | Selection BackgroundNormal | +| HighlightedText | Selection ForegroundNormal | +| Accent | Selection BackgroundNormal (same as Highlight) | +| ToolTipBase | Tooltip BackgroundNormal **of the Active state**, in every state | +| ToolTipText | Tooltip ForegroundNormal **of the Active state**, in every state | +| Light | ShadeRole(Window BackgroundNormal of this state, Light, k) | +| Midlight | ShadeRole(..., Midlight, k) | +| Mid | ShadeRole(..., Mid, k) | +| Dark | ShadeRole(..., Dark, k) | +| Shadow | ShadeRole(..., Shadow, k) | + +`k` is the contrast value of c.6. The Header and Complementary sets have no +palette role; the preset reads them from the resolved palette directly. +KDE does not set BrightText: it keeps Qt's default, opaque white +255,255,255, in every state (`resolve.json` records it for every +scheme) [measured-qt]. + +Breeze Light with the default k (contrast 4, so k = 0.4) gives the Light to +Shadow values of d.10. + +--- + +## g. Accent application + +This section describes, completely, what Plasma does when an accent colour +is applied to a scheme (the colour settings page, and the command-line tool +with its accent option). Teksilo's `with_accent` must produce, for every key +listed, the same value that KDE writes into `kdeglobals`, compared after +parsing (b.9) and, for copied entries, as text. + +### g.1 Inputs + +- The **scheme file** S (read on its own, with no cascade underneath; its + `[Colors:Header]` presence is S's own). +- The **accent** A. When given explicitly (the command-line accent option, + or Teksilo's `with_accent(a)`), that colour. Otherwise + `[General] AccentColor` read from the output configuration (the + `kdeglobals` cascade). The command-line option accepts SVG colour names + and hex forms [qt]. +- **ACC** (accent present) is false when A is fully transparent black (all four 8-bit + channels 0). Otherwise it is true when A was given explicitly, or when + the output configuration has an `AccentColor` key. (An `AccentColor` + present but unparseable gives an invalid accent with ACC true in + KDE; Teksilo treats an unparseable accent as no accent **[divergence]**.) +- From S's `[General]`: **TB** (accent title bar) = `TitlebarIsAccentColored`, + else `accentActiveTitlebar`, else false; **TINT** (tinting on) = S has a + `TintFactor` key; **factor** = `TintFactor` as a real, default 0.15 (also + used when unparseable). + +### g.2 Bookkeeping keys + +1. `[General] ColorSchemeHash` = lower-case hexadecimal SHA-1 of S's bytes + (written whenever S can be read). Teksilo's `to_kconfig_text` may omit + it; byte comparisons exclude it unless the test supplies the file bytes. +2. The command-line accent option does **not** write `[General] AccentColor` + and does not change `[General] ColorScheme`. (The settings page writes + `AccentColor` itself, outside this procedure.) + +### g.3 The seven colour groups + +The groups are processed in this order: View, Window, Button, Selection, +Tooltip, Complementary, Header. For each group G: + +1. The output group G is deleted, together with its nested groups. +2. If G is Header and S has no `[Colors:Header]` group, nothing is written + for Header (no group, no `[Inactive]`, no header accent); go to the next + group. A scheme without Header colours must stay without them. +3. For each of the twelve keys, in the order BackgroundNormal, + BackgroundAlternate, ForegroundNormal, ForegroundInactive, + ForegroundActive, ForegroundLink, ForegroundVisited, ForegroundNegative, + ForegroundNeutral, ForegroundPositive, DecorationFocus, DecorationHover: + - If ACC and the key is one of **ForegroundActive, + ForegroundLink, DecorationFocus, DecorationHover** (the *accent keys*): + - ForegroundLink gets the **readable accent** (g.4), computed against + S's own `BackgroundNormal` of this group. + - The other three accent keys get A (written `r,g,b`). + - Else if ACC and TINT: the key gets + `OklabTint(S value, A, factor)` (d.15), written `r,g,b`. A key absent + from S is not written by Teksilo **[divergence]** (KDE writes the tint + of an undefined colour). + - Else: the key is **copied as text** from S if S has it; nothing is + written if S lacks it. +4. If G is **Selection** and ACC: let `Bsel = AccentBg(A, S's + [Colors:View] BackgroundNormal)` (d.14). Write BackgroundNormal and + BackgroundAlternate = `Bsel`; ForegroundNormal and ForegroundInactive = + `OnColour(Bsel, active)` (d.13). These overwrite step 3's values. + ForegroundActive, ForegroundLink and the decorations keep step 3's accent + values (so Selection ForegroundActive becomes A, and Selection + ForegroundLink is A made readable against S's Selection background). +5. If G is **Button** and ACC: write BackgroundAlternate = + `AccentBg(A, S's [Colors:Button] BackgroundNormal)`. +6. **Inactive subgroup.** If S's group G has a nested `[Inactive]` group: + for each of the twelve keys, in order: + - if TINT (whether or not ACC): write + `OklabTint(S's [G][Inactive] value, A, factor)` (a key absent from + `[G][Inactive]` is not written, the same **[divergence]** as step 3); + - else if G is Header: **copy as text** the key from S's top-level + `[Colors:Window]` group (not from `[Colors:Header][Inactive]`) into the + output `[Colors:Header][Inactive]`, if Window has it; + - else copy as text from S's `[G][Inactive]` if present. + + Note the accent keys are **not** set to A inside `[Inactive]`. For the + Breeze schemes this means the output `[Colors:Header][Inactive]` equals + S's `[Colors:Window]` text, including Window's own DecorationFocus. +7. **Header accent.** If G is Header and ACC: let `W = S's + [Colors:Window] BackgroundNormal`, `Wa = AccentBg(A, W)` and + `Wt = OklabTint(W, A, factor)` (factor is 0.15 when S has no TintFactor). + If TB: write `[Colors:Header] BackgroundNormal = Wa`, + `[Colors:Header] ForegroundNormal = OnColour(Wa, active)`, + `[Colors:Header][Inactive] BackgroundNormal = Wt`, + `[Colors:Header][Inactive] ForegroundNormal = OnColour(Wt, inactive)`. + Otherwise write nothing in this step. + +### g.4 Readable link accent + +Given the accent A and a background X (S's BackgroundNormal of the current +group; when S lacks it, X is treated as black, luma 0): + +1. If `ratio(luma(X), luma(A)) >= 5.0`, the link is A. +2. Otherwise, if `luma(A) > luma(X)`, the link is `lighten(A)` (luma amount + 0.5, chroma factor 1); else it is `darken(A)` (luma amount 0.5, chroma + factor 1). + +Exactly one step is taken; the result is not re-checked. Example: A = +61,174,233 on 255,255,255 has ratio 2.46, so the link is darken(A) = +45,127,170 (computed from this specification). + +### g.5 `[WM]` + +For each key, in the order activeBackground, activeForeground, +inactiveBackground, inactiveForeground, activeBlend, inactiveBlend, write S's +`[WM]` value if S has it (read as a colour and re-formatted `r,g,b`), +otherwise the default: + +| Key | Default | +|---|---| +| activeBackground | Header BackgroundNormal resolved from S for the Active state (c.2 and e) | +| activeForeground | Header ForegroundNormal, Active | +| inactiveBackground | Header BackgroundNormal, Inactive | +| inactiveForeground | Header ForegroundNormal, Inactive | +| activeBlend | Header BackgroundNormal, Active | +| inactiveBlend | Header BackgroundNormal, Inactive | + +These defaults use S **before** the accent is applied. + +### g.6 `[KDE]` + +- `frameContrast` = S's `[KDE] frameContrast` as a real if present + (written as read, without clamping), otherwise 0.2 (the clamped default of + c.6 applied to S, which has no value). Written as the shortest decimal. +- `contrast` = S's `[KDE] contrast` as an integer, default 7. + +### g.7 Title bar override in `[WM]` + +If ACC and (TINT or TB), with `W` = S's +`[Colors:Window] BackgroundNormal`: + +1. If TINT: `Wt = OklabTint(W, A, factor)`. If not TB: + write `activeBackground = Wt` and `activeForeground = OnColour(Wt, + active)`. In both cases write `inactiveBackground = Wt` and + `inactiveForeground = OnColour(Wt, inactive)`. +2. If TB: `Wa = AccentBg(A, W)`; write `activeBackground = Wa` + and `activeForeground = OnColour(Wa, active)`. + +These overwrite g.5. + +### g.8 Effects + +For `[ColorEffects:Inactive]` then `[ColorEffects:Disabled]`, for each of the +nine keys Enable, ChangeSelectionColor, IntensityEffect, IntensityAmount, +ColorEffect, ColorAmount, Color, ContrastEffect, ContrastAmount: write S's +value as text, **writing an empty value when S lacks the key**. For Breeze, +the output `[ColorEffects:Disabled]` therefore contains `Enable=` and +`ChangeSelectionColor=` with empty values. An empty boolean reads as true +(b.9), so `Enable=` keeps the Disabled effects on, matching the absent-key +default. + +### g.9 Quantisation points (summary) + +- Every written colour is the E8 projection of a stored colour. +- `AccentBg` and `OnColour` work on 8-bit integer channels with the + single/double precision split of d.12. +- `lighten`/`darken` for the link round-trip through HCY with Q16. +- `OklabTint` quantises after each of its conversions (d.15). +- Copied entries are text and are never re-quantised. + +### g.10 Worked examples (Breeze Light, accent 61,174,233) + +Computed from this specification; the accent oracle is authoritative. + +- Selection: BackgroundNormal = BackgroundAlternate = 119,198,239; + ForegroundNormal = ForegroundInactive = 0,0,0; ForegroundActive, + DecorationFocus, DecorationHover = 61,174,233. +- View, Window, Button, Tooltip, Header ForegroundLink = 45,127,170 (their + light backgrounds give a ratio below 5 and the accent is darker, so the + accent is darkened). Selection ForegroundLink is also 45,127,170: it is + checked against S's own Selection background 61,174,233 (ratio 1, equal + lumas, so darkened). Complementary ForegroundLink = 61,174,233 (ratio 5.88 + against 42,46,50). +- Button BackgroundAlternate = AccentBg(A, 252,252,252) = 118,197,238. +- Breeze Dark, same accent: Selection BackgroundNormal 48,128,170 with + ForegroundNormal 0,0,0; View, Window, Button, Tooltip and Header + ForegroundLink = 61,174,233 (ratios 7.84, 6.84, 6.04, 6.04, 6.04); Button + BackgroundAlternate 55,135,177. + +`light_with_accent(61,174,233)` therefore differs from `light()` +(Selection background and text change), which is Plasma's behaviour and is +pinned. + +### g.11 The ten swatches through the selection rule + +AccentBg over the Breeze Light View (255,255,255) and Breeze Dark View +(20,22,24), with OnColour (active), computed from this specification: + +| Swatch | Light selection | Text | Dark selection | Text | +|---|---|---|---|---| +| #e93a9a | 239,117,184 | black | 169,47,115 | white | +| #e93d58 | 239,119,138 | black | 169,49,68 | white | +| #e9643a | 239,146,117 | black | 169,76,47 | white | +| #e8cb2d | 238,218,107 | black | 168,148,38 | black | +| #3dd425 | 119,224,102 | black | 48,155,33 | black | +| #00d3b8 | 76,224,205 | black | 5,154,136 | black | +| #3daee9 | 119,198,239 | black | 48,128,170 | black | +| #b875dc | 205,158,230 | black | 134,88,161 | white | +| #926ee4 | 178,153,236 | black | 108,83,166 | white | +| #686b6f | 149,151,154 | black | 78,81,84 | white | + +--- + +## h. The ten accent swatches + +The colour settings page offers exactly these ten preset swatches, in this +order, with no names, tooltips or translatable labels: + +| Index | Hex | 8-bit | Suggested id **[derived]** | +|---|---|---|---| +| 0 | #e93a9a | 233,58,154 | pink | +| 1 | #e93d58 | 233,61,88 | red | +| 2 | #e9643a | 233,100,58 | orange | +| 3 | #e8cb2d | 232,203,45 | yellow | +| 4 | #3dd425 | 61,212,37 | green | +| 5 | #00d3b8 | 0,211,184 | teal | +| 6 | #3daee9 | 61,174,233 | blue | +| 7 | #b875dc | 184,117,220 | purple | +| 8 | #926ee4 | 146,110,228 | violet | +| 9 | #686b6f | 104,107,111 | gray | + +KDE ships no names; the ids are Teksilo's, chosen by hue, stable, and used +only for persistence (`as_str` / `from_str`). The first swatch is also the +page's fallback custom colour when no custom colour was ever saved. + +--- + +## i. Dark predicate + +**CONFIRMED.** Both xdg-desktop-portal-kde (for +`org.freedesktop.appearance color-scheme`) and the Plasma Qt platform +integration (for the application's colour-scheme hint) use the same rule: + +1. Take the Window palette colour of the **Active** state (f.2, which is + `[Colors:Window] BackgroundNormal` after resolution; effects never apply + to Active) as 8-bit channels (E8). +2. `gray = floor((11 r + 16 g + 5 b) / 32)` (Qt's documented gray value, + integer division) [qt]. +3. Dark when `gray < 192`, light otherwise. + +The portal never answers "no preference": it returns 1 (prefer dark) or 2 +(prefer light). Breeze Light's Window 239,240,241 gives 239 (light); Breeze +Dark's 32,35,38 gives 34 (dark). + +`is_dark()` must implement exactly this. The plan's fallback (luma +comparison) is not needed. + +Other portal facts used by Teksilo's reader: + +- `org.freedesktop.appearance accent-color` is the Active Highlight + (Selection BackgroundNormal) as three doubles in 0..1 (the channel reads, + widened). +- `org.freedesktop.appearance reduced-motion` is 1 when `[KDE] + AnimationDurationFactor` (real, default 1.0, read from `kdeglobals`) + equals 0 exactly, else 0. +- Namespaces served: `org.freedesktop.appearance`, + `org.kde.kdeglobals.` for every top-level `kdeglobals` group + (`General`, `KDE`, `Icons`, `Colors:View`, `Toolbar style`, ...; nested + groups are not exposed), plus `org.kde.VirtualKeyboard` and + `org.kde.TabletMode`. A read is routed to the first namespace whose name + is a prefix of the requested group; anything else fails with "Namespace is + not supported", and an unknown key with "Property doesn't exist". Values + in `org.kde.kdeglobals.*` are the raw strings (expanded when `[$e]`). +- Change signals: the portal emits `SettingChanged` for + `org.kde.kdeglobals.General ColorScheme` on a palette change (any colour + change, not only a scheme switch), `org.kde.kdeglobals.General font` on a + font change, `org.kde.kdeglobals.KDE widgetStyle` on a style change, and + `org.freedesktop.appearance` `color-scheme` and `accent-color` whenever its + own palette changes, and `reduced-motion` when `[KDE] + AnimationDurationFactor` changes. + +--- +## j. Desktop settings + +### j.1 Fonts + +Font keys, read from the `kdeglobals` cascade as **strings** (so `[$e]` +expansion applies, b.11). When the program runs in a sandbox the platform +integration first asks the portal (`org.kde.kdeglobals.`, the key +name) and uses a non-empty answer. + +| Group | Key | Default | +|---|---|---| +| General | font | Noto Sans, 10 pt, normal weight, style name Regular | +| General | fixed | Hack, 10 pt, Regular, monospace hint | +| General | smallestReadableFont | Noto Sans, 8 pt, Regular | +| General | toolBarFont | Noto Sans, 10 pt, Regular | +| General | menuFont | Noto Sans, 10 pt, Regular | +| General | taskbarFont | Noto Sans, 10 pt, Regular | +| WM | activeFont | Noto Sans, 10 pt, Regular (window titles) | + +An absent or empty value gives the default. A value that does not parse +leaves the default in place. + +**Font string layout** [qt]. A comma-separated list (no escaping of commas +inside the family name is done; KDE writes the family as is): + +| Field | Meaning | Qt 5 form | Qt 6 form | +|---|---|---|---| +| 0 | family | yes | yes | +| 1 | point size (real; a value <= 0 means unset) | yes | yes | +| 2 | pixel size (integer; -1 or <= 0 means unset) | yes | yes | +| 3 | style hint (integer) | yes | yes | +| 4 | weight | legacy scale 0..99 | OpenType scale 1..1000 | +| 5 | style: 0 normal, 1 italic, 2 oblique | yes | yes | +| 6 | underline 0 or 1 | yes | yes | +| 7 | strike out 0 or 1 | yes | yes | +| 8 | fixed pitch 0 or 1 | yes | yes | +| 9 | always 0 | yes | yes | +| 10 | capitalisation (integer) | style name, if 11 fields | yes | +| 11 | letter-spacing type (integer) | | yes | +| 12 | letter spacing (real) | | yes | +| 13 | word spacing (real) | | yes | +| 14 | stretch (integer, 0 = any) | | yes | +| 15 | style strategy (integer; 1 is the default) | | yes | +| 16 | style name, if 17 fields | | yes | + +- Accepted field counts: 2 (family and point size), 10 or 11 (Qt 5), 16 or + 17 (Qt 6). Qt 6.11 and later append further fields (font features, + variable axes); KDE cuts the string to its first 17 fields when running on + an older Qt, and Teksilo must do the same (read fields 0 to 16, ignore the + rest). Any other count is invalid and leaves the default. +- The weight field is on the OpenType scale when the string has 16 or more + fields, and on the legacy scale when it has 10 or 11. +- **Legacy weight mapping** [qt]: map a legacy weight w to the OpenType + weight of the **nearest** legacy named weight in this table, ties going to + the lighter one: 0 to 100, 12 to 200, 25 to 300, 50 to 400, 57 to 500, + 63 to 600, 75 to 700, 81 to 800, 87 to 900. (So 50 is 400, 60 is 500, + 70 is 700.) +- A typical Plasma 6 value is + `Noto Sans,10,-1,5,400,0,0,0,0,0,0,0,0,0,0,1` (16 fields, OpenType weight + 400, no style name). A Plasma 5 value is + `Noto Sans,10,-1,5,50,0,0,0,0,0` (legacy weight 50). +- Pixel size: Teksilo converts a point size to logical pixels as + `px = pt x 96 / 72` (the logical DPI at scale 1). A positive pixel-size + field is used as is. +- When KDE writes a font whose weight is normal and whose style name is + Regular, Normal, Book or Roman, it drops the style name. + +### j.2 `AnimationDurationFactor` + +`[KDE] AnimationDurationFactor` in `kdeglobals`, a real. Absent means 1.0. +Three upstream consumers, each with its own rule: + +1. **Breeze widget style** (QStyle animations). Only when the key is + **present**: `d = trunc(factor x 100)`, the product formed in single + precision. If `d > 0`, style animations are on with duration `d` ms; + otherwise they are off. When the key is absent, `breezerc [Style] + AnimationsDuration` (100) and `AnimationsEnabled` (true) apply. The + progress-bar busy animation is **not** scaled (its duration is + `ProgressBarBusyStepDuration`, 800 ms, and it is switched by + `ProgressBarAnimated`). +2. **Kirigami and the desktop QtQuick style** (Kirigami units). Let + `f = max(0, factor)` and `base = plasmarc [Units] longDuration` + (default 200). Then `long = max(1, round(base x f))` (round half up), + `short = floor(long / 2)`, `veryShort = floor(long / 4)`, + `veryLong = 2 long`. The tooltip delay (700 ms) and the "human moment" + (2000 ms) are not scaled. +3. **Reduced motion.** The portal reports reduced motion when the factor + equals 0 exactly; the platform integration (on Qt 6.12 or later) when + its absolute value is at most 1e-5 (Qt's documented single-precision + near-zero test [qt], applied by the platform integration [PI]). + +Teksilo's rule for `from_desktop` **[derived]**, following consumer 2, +which drives the controls whose timing the preset reproduces: +`duration_normal = max(1, round(200 f))`, +`duration_fast = floor(duration_normal / 2)`, +`duration_slow = 2 duration_normal`, +`duration_collapse = duration_normal`, +`duration_indeterminate_sweep = 800` (unscaled, consumer 1), tooltip +delays unscaled. A factor of 0 is reported as reduced motion (and gives +normal 1, fast 0, which the preset treats as "no animation"). This differs +from the plan's "scale every non-zero duration" in two places: the busy +sweep is not scaled, and fast is derived from normal by halving. + +### j.3 `forceFontDPI` + +Plasma 6 removed font DPI forcing. The 6.0 configuration update deletes +`forceFontDPIWayland` from `kcmfonts [General]`, the fonts settings page has +no DPI setting any more (scaling is global, set by the display scale), and +no plasma-workspace 6.8 component reads `forceFontDPI` either: the Plasma 5 +X resource loader that applied it no longer exists in the 6.8 tree. +Teksilo must read neither key on either windowing system (see n.8). + +### j.4 `widgetStyle` + +`[KDE] widgetStyle` in `kdeglobals`, a string. Absent or empty means +Breeze. Style names are matched ignoring ASCII case. `native_theme` returns +a Breeze theme only when the value is absent, empty, or equal to `breeze` +ignoring case; any other value (`fusion`, `oxygen`, `kvantum`, ...) keeps +Teksilo's generic geometry with the KDE colours. + +### j.5 Other `kdeglobals [KDE]` and related keys (informative) + +| Key | Type | Default | Use | +|---|---|---|---| +| [KDE] contrast | int | 7 | c.6 | +| [KDE] frameContrast | real | 0.2 | c.6, k | +| [KDE] AnimationDurationFactor | real | 1.0 | j.2 | +| [KDE] widgetStyle | string | breeze | j.4 | +| [KDE] LookAndFeelPackage | string | org.kde.breeze.desktop | b.8 | +| [KDE] SingleClick | bool | false | item activation | +| [KDE] ShowIconsOnPushButtons | bool | true | button icons | +| [KDE] CursorBlinkRate | int ms | 1000 | 0 means no blink, otherwise bounded to 200..2000 | +| [KDE] DoubleClickInterval | int ms | 400 | | +| [KDE] StartDragDist | int px | 10 | | +| [KDE] StartDragTime | int ms | 500 | | +| [KDE] WheelScrollLines | int | 3 | | +| [Icons] Theme | string | breeze | icon theme | +| [Toolbar style] ToolButtonStyle | string | TextBesideIcon | | + +### j.6 `breezerc` + +Read from the `breezerc` cascade (b.6 rules; system layers are +`CDn/breezerc` ... `CD1/breezerc`, the user layer `CH/breezerc`). + +| Group | Key | Type | Default | Notes | +|---|---|---|---|---| +| Common | ShadowStrength | int | 255 | range 25..255; strength = value / 255 | +| Common | ShadowSize | enum | ShadowLarge | ShadowNone, ShadowSmall, ShadowMedium, ShadowLarge, ShadowVeryLarge (stored as their names or indices) | +| Common | ShadowColor | colour | 0,0,0 | | +| Common | OutlineCloseButton | bool | false | decoration only | +| Style | AnimationsEnabled | bool | true | | +| Style | AnimationSteps | int | 10 | animation progress is quantised to multiples of 1 / steps | +| Style | AnimationsDuration | int ms | 100 | overridden by j.2 rule 1 | +| Style | StackedWidgetTransitionsEnabled | bool | false | | +| Style | ProgressBarAnimated | bool | true | busy animation | +| Style | ProgressBarBusyStepDuration | int ms | 800 | | +| Style | ScrollBarAddLineButtons | int | 0 | 0 none, 1 single, any other value double | +| Style | ScrollBarSubLineButtons | int | 0 | same | +| Style | MnemonicsMode | enum | MN_AUTO | MN_NEVER, MN_AUTO, MN_ALWAYS | +| Style | ToolBarDrawItemSeparator | bool | true | | +| Style | ViewDrawFocusIndicator | bool | true | item-view focus rectangle | +| Style | SliderDrawTickMarks | bool | true | | +| Style | ViewDrawTreeBranchLines | bool | true | | +| Style | ViewInvertSortIndicator | bool | true | | +| Style | TabBarDrawCenteredTabs | bool | false | | +| Style | DockWidgetDrawFrame | bool | false | | +| Style | SidePanelDrawFrame | bool | false | | +| Style | MenuItemDrawStrongFocus | bool | true | k.5.13 | +| Style | WindowDragMode | enum | WD_MINIMAL | WD_NONE, WD_MINIMAL, WD_FULL | +| Style | WindowDragWhiteList | string list | empty | | +| Style | WindowDragBlackList | string list | empty | | +| Style | SplitterProxyEnabled | bool | true | | +| Style | SplitterProxyWidth | int px | 12 | | +| Style | WidgetExplorerEnabled | bool | false | | +| Style | DrawWidgetRects | bool | false | | +| Style | MenuOpacity | int percent | 100 | k.5.13 | + +### j.7 Kirigami units (KF 6.31) + +| Unit | Value | +|---|---| +| gridUnit | 18, a **constant** in KF 6.31 (the desktop units do not derive it from the font) | +| smallSpacing | 4 | +| mediumSpacing | 6 | +| largeSpacing | 8 | +| cornerRadius | 5 | +| veryShortDuration / shortDuration / longDuration / veryLongDuration | 50 / 100 / 200 / 400 at factor 1 (j.2) | +| toolTipDelay | 700 | +| humanMoment | 2000 | +| icon sizes small / smallMedium / medium / large | 16 / 22 / 32 / 48 | + +--- + +## k. Breeze geometry and painting + +### k.1 Metric constants + +All in logical pixels unless stated. [M] + +| Constant | Value | +|---|---| +| ArrowSize | 10 | +| SmallArrowSize | 5 | +| Frame width (frame margin) | 2 | +| Frame radius | 5 | +| Layout top-level margin | 10 | +| Layout child margin | 6 | +| Layout default spacing | 6 | +| Line edit frame width | 6 | +| Menu frame width | 0 | +| Menu item margin width | 4 | +| Menu item highlight gap (menu margin) | 4 | +| Menu item extra left margin | 4 | +| Menu item margin height | 4 | +| Menu item item spacing | 2 | +| Menu item accelerator space | 16 | +| Menu item text left margin | 8 | +| Combo box frame width | 6 | +| Combo box item margin width | 3 | +| Spin box frame width | 6 | +| Spin box arrow button width | 20 | +| Group box title margin | 4 | +| Button minimum width | 80 | +| Button margin width | 6 | +| Button item spacing | 4 | +| Tool button margin width | 6 | +| Tool button item spacing | 4 | +| Tool button inline indicator width | 12 | +| Menu button indicator width | 20 | +| Check box size (indicator) | 20 | +| Check box focus margin width | 2 | +| Check box item spacing | 4 | +| Check box radius | 4 (frame radius minus 1) | +| Menu bar item margin width / height | 10 / 6 | +| Scroll bar extent | 21 | +| Scroll bar slider (handle) width | 8 | +| Scroll bar minimum slider length | 20 | +| Scroll bar button heights: none / single / double | 3 / 21 / 42 | +| Tool bar frame width | 0 | +| Tool bar handle extent / handle width | 10 / 6 | +| Tool bar separator width | 8 | +| Tool bar extension width | 20 | +| Tool bar item margin / item spacing | 6 / 0 | +| Tool bar separator vertical margin | 2 | +| Progress bar busy indicator size | 14 | +| Progress bar thickness | 6 | +| Progress bar item spacing | 4 | +| MDI title bar margin width | 4 | +| Slider tick length | 8 | +| Slider tick margin width | 2 | +| Slider groove thickness | 6 | +| Slider control thickness | 20 | +| Tab margin height / width | 4 / 8 | +| Tab minimum width | 80 | +| Tab minimum height / static-tab minimum height (static: k.5.14) | 30 / 34 | +| Tab item spacing | 8 | +| Tab overlap / tab-bar base overlap | 1 / 2 | +| Tab active-effect (indicator) size | 3 | +| Tab widget margin width | 3 | +| Tool box tab min width / item spacing / margin width | 80 / 4 / 8 | +| Tooltip frame width | 3 | +| Header margin width / item spacing / arrow size | 6 / 4 / 10 | +| Item view arrow size | 10 | +| Item view item margin left / right | 2 / 2 | +| Item view item margin top / bottom | 1 / 1 | +| Item view first item top margin | 2 | +| Item view item padding width / height | 2 / 2 | +| Side panel item margin width | 4 | +| Splitter width | 1 | +| Shadow overlap | 2 | +| Blend value (hover and press washes) | 0.3 | +| Focus lighten factor | 110 (percent, d.11) | +| Pen width for symbols, frames and shadows | 1.001 | + +Pen width 1.001 is an antialiasing workaround; Teksilo uses 1. Where a +radius is computed from a pen width, the pen width is truncated to the +integer 1 first. + +Style hints [S]: submenu popup delay 150 ms; menus scrollable; sloppy +submenus on; dialog buttons have icons; form layout labels right-aligned, +fields grow; tab bar alignment leading (centred when +`TabBarDrawCenteredTabs`); focus frame drawn above the widget. + +### k.2 Painting conventions + +- **Stroked rectangle:** a rectangle inset by half the pen width on every + side (0.5 for the 1 px pen), so a 1 px outline lies inside the bounds. +- **Frame radius for a stroked frame:** 5 - 0.5 = **4.5**. +- **Shadowed rectangle:** the bounds inset by 1 on every side (room for a + 1 px shadow). +- **Composite over:** "X at alpha a over Y" means X with its alpha + multiplied by a, source-over composited on opaque Y. +- **With alpha a** means the alpha is **replaced** by a (absolute); **alpha + times a** means multiplied (applied only for 0 <= a < 1). +- **Current group:** painters use the widget's own colour group (Active in + an active window, Inactive in an inactive window, Disabled when disabled) + unless a rule says "Active Highlight", which ignores window activity. + +### k.3 Shared colours + +With `fc` the frame contrast (c.6, default 0.2) and palette roles from f.2 +of the current group: + +| Name | Value | +|---|---| +| frame outline | Mix(Window, WindowText, fc) | +| separator | Mix(Window, WindowText, fc) | +| frame background | Mix(Window, Base, 0.3) | +| focus | View DecorationFocus of the current group | +| hover | View DecorationHover of the current group | +| focus outline | Mix(focus, WindowText, 0.15) | +| hover outline | Mix(hover, WindowText, 0.15) | +| arrow colour for a text role | Mix(that text role, its background role, 0.15); for example Mix(WindowText, Window, 0.15) | +| button outline | Mix(Button, ButtonText, fc) | +| slider outline | Mix(Button, ButtonText, fc) | +| shadow | black with alpha 0.125 | + +Input-frame outline state: focus wins over hover; focused uses focus, +hovered uses hover, otherwise the frame outline. Transitions between states +are animated (k.8). + +### k.4 Computed sizes + +Let `H` be the font line height in pixels (l.2; 18 for Noto Sans 10 pt) and +`I` the small icon size (16). [S] unless tagged. + +| Control | Size rule | H = 18 | +|---|---|---| +| Push button, text | height `H + 2x6 + 2x2 = H + 16`; width `max(textW [+ icon 16 + 4] [+ menu 20 + 4] + 12, 80) + 4` | 34 high, at least 84 wide | +| Push button, icon only | `I + 16` high, no minimum width; 31 wide with a 16 px icon [measured-qt] | 32 | +| Tool button, auto-raise | contents + 12 (contents = icon) | 28 (16 px icon), 34 (22 px) | +| Tool button, framed | contents + 16 | 32 (16 px), 38 (22 px) | +| Line edit | `max(H, 14) + 2` (Qt's inner height [qt]) `+ 2x6` | 32 | +| Combo box | `max(H, 20) + 2x6`; width `textW + 12 + 20 + 2 + 4` | 32 | +| Spin box | inner edit `max(H, 14) + 2`, `+ 2x6`, at least 20; width `+ 20` | 32 | +| Check box / radio row | `max(H + 2x2, 20)`; width `20 + textW + 4` (`+ 4` with an icon) | 22 | +| Check box / radio indicator | 20 x 20, label at x = 24 | | +| Switch (desktop QtQuick style) | 36 x 18 (k.5.9) [Qd] | | +| Slider | thickness 20; tick marks add 3 per side (Qt's built-in 5 minus Breeze's 2) [measured-qt] | 20 (23 one side, 26 both) | +| Scroll bar | extent 21, minimum handle 20 | | +| Progress bar | groove 6; Qt's hint height `H + 8` [qt] [measured-qt] | 26 | +| Menu item | `max(H, 20, iconW) + 1 + 2x4` | 29 | +| Menu separator | 9 x 5 (`1 + 2x4` by `1 + 4`) | 5 high | +| Menu section (separator with text) | `max(H_bold, 20, iconW [, 20 if checkable]) + 4 + 4` | 28 | +| Menu bar item | `H + 2x6`, width `textW + 2x10` | 30 | +| Tab | `max(H + 2x4, 30)` (34 for static tabs); width at least 80 with text | 30 | +| Header section | `max(H, 10 with a sort arrow, 22 with an icon) + 2x6` | 30 | +| Item view row (list, tree) | text only: `H + 1 + 1 + 2x2`; with an icon: `max(H, icon) + 2 + 1 + 1 + 2x2` (Qt adds 2 when the item has a decoration) [measured-qt]; with a check box: `max(H, 20) + 1 + 1 + 2x2` [measured-qt]; first row `+ 1` (top margin 2), minus 1 when the view has a frame | 24 (first 25); 26 with a 16 px icon or a check box | +| Table row | Qt base height `+ 2 x (1 + 1)`, width `+ 2 x (2 + 2)`; the table view adds 1 for its grid line [measured-qt] | 22 (23 per row with the grid) | +| Tooltip | content inset `3 + 1 = 4` on every side (3 from the style, 1 added by Qt) [measured-qt]; height `H + 8` | 26 for one line | +| Splitter | 1 px visual, 12 px hit proxy when enabled (j.6) | | +| Group box title margin | 4 | | +| Dialog margin | 10 (top-level layout margin); child margin 6; spacing 6 | | + +Menu item width: `textW + 2x4` plus the icon column (`iconW + 2`) when any +item has an icon and icons are shown, the check column (`20 + 2`) when any +item is checkable, the right column (`20 + 2`), and the accelerator gap 16 +when the item has a shortcut (the shortcut's own width is added by Qt). + +**Other font sizes** [measured-qt]. The rules above are exact at the +default 10 pt (`H = 18`). At other sizes Qt's text box, which several +controls measure instead of the font height, can exceed `H` by 1 to 3 px +(the combo box at 11 pt), so the `H`-based rules can be short by that +much. `sizes.json` records the +measured heights; Teksilo keeps the deterministic `H` rules and documents +the difference **[divergence]**: + +| pt | H (l.2) | push | line edit | combo | spin | check | menu item | menu section | tab | header | list row | list row, icon | table row | progress | +|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| +| 8 | 15 | 32 | 29 | 32 | 29 | 20 | 29 | 28 | 30 | 27 | 21 | 24 | 20 | 23 | +| 9 | 17 | 34 | 31 | 32 | 31 | 21 | 29 | 28 | 30 | 29 | 23 | 25 | 22 | 25 | +| 10 | 18 | 34 | 32 | 32 | 32 | 22 | 29 | 28 | 30 | 30 | 24 | 26 | 23 | 26 | +| 11 | 20 | 38 | 34 | 35 | 34 | 25 | 30 | 28 | 30 | 33 | 27 | 29 | 26 | 28 | +| 12 | 22 | 38 | 36 | 36 | 36 | 26 | 31 | 30 | 30 | 34 | 28 | 30 | 27 | 30 | +| 14 | 26 | 42 | 40 | 40 | 40 | 30 | 35 | 34 | 34 | 38 | 32 | 34 | 31 | 34 | + +(Table rows include the 1 px grid line.) + +Teksilo lifts (planned): table row 22 to 24 (D7) and check/radio row 22 to +a 24 node with unchanged paint (D8) [wcag]. + +### k.5 Painting rules per control + +Each rule names the fills and pens; geometry uses k.2. + +**k.5.1 Push button (normal).** Bounds inset by 1 (shadowed rectangle), +then stroked; radius 4.5; 1 px pen. + +In k.5.1 and k.5.2, **Active Highlight** means the Active group's +Highlight for an enabled button and the Disabled group's Highlight for a +disabled one, whatever the window state (an inactive window's muted +Highlight is never used here). + +- Fill: Button. Pen: button outline. +- Hovered, keyboard-focused (focus made visible by keyboard) or pressed, + when enabled: pen becomes Active Highlight. +- Pressed (enabled): fill Mix(Button, Active Highlight, 0.3). +- Checked: fill Mix(Button, ButtonText, 0.125); pen button outline. +- Default button, only in an active window: fill + Mix(Button, Active Highlight, 0.2); pen + Mix(Active Highlight, button outline, 0.5). +- Shadow: only in an active window, only when the button is enabled and + neither flat, pressed nor checked: a 1 px outline of the shadow colour + (black alpha 0.125) around the shadowed rectangle, moved down so that it + shows as a 1 px line below the button (radius 4.5). Equivalent to a + shadow offset (0, 1), blur 0. +- Label: ButtonText (WindowText for flat buttons); icon 16 + 4 spacing; + menu arrow 20 + 4. +- Transitions: the fill animates toward the pressed fill and the pen toward + Highlight over the style animation duration (k.8). + +**k.5.2 Flat button (tool button with auto-raise, flat push button).** + +- Idle (not hovered, pressed, checked or keyboard-focused): nothing is + painted. +- Hovered or keyboard-focused: no fill (transparent), pen Active Highlight. +- Pressed: fill Active Highlight at alpha 0.3. +- Checked: fill ButtonText at alpha 0.125, pen button outline. +- Default (active window): fill Active Highlight at alpha 0.125, pen + Mix(Active Highlight, button outline, 0.5). +- Never a shadow. + +**k.5.3 Line edit.** Fill Base; pen the input-frame outline (k.3); stroked +frame radius 4.5. When the rectangle is shorter than `2x6 + H`, only the +Base fill is painted (no frame). Text inset 6 when there is room. + +**k.5.4 Combo box.** Non-editable: the push-button frame of k.5.1 with +"pressed" also meaning "popup open". Editable: the line-edit frame. Arrow: +a 10 px chevron (k.5.17) centred in a 20 x 20 box at the trailing edge +inside the 2 px frame margin; colour arrow colour of ButtonText +(non-editable) or WindowText (editable), hover colour when its sub-control +is hovered (editable), WindowText when focused and not hovered +(non-editable), Disabled colours when empty or disabled. + +**k.5.5 Spin box.** Line-edit frame. Arrow column 20 wide at the trailing +edge inside the 2 px frame margin; arrow height `min(inner height, 20)` +centred, split into two halves of `floor(h/2)` (10 and 10 at the default +size). Chevrons in arrow colour of Text; hover colour on the hovered half; +Disabled arrow colour at the limit. No button chrome in the arrow column. + +**k.5.6 Check box.** Indicator 20 x 20. + +- Box: the indicator inset by 2 (16 x 16), stroked (15 x 15 at offset 2.5), + radius 4. Pen: separator colour when off; Highlight (current group) when + on or partial. Fill: Button (Button darkened 110 percent, d.11, while + pressed). +- On or partial: the same rounded box filled again with Highlight at alpha + 0.3 over it. +- Check mark (on): a polyline through, in the 16 x 16 box's coordinates + (box at (2,2) inside the indicator, centre (10,10) of the indicator): + (left + 4, centre y), (centre x - 1, bottom - 5), (centre x + 4.5, + top + 5.5), where left = top = 2, bottom = 18 and the centre is (10, 10): + so (6, 10), (9, 13), (14.5, 7.5) in indicator coordinates; pen 2 px, Text + colour (View text), mitre joins. +- Partial: three 2 x 2 squares in Text colour, centred on the box centre and + 4 px to each side. +- Hover (enabled): an extra 1 px ring in the focus colour on the box + outline (same 15 x 15 rounded rectangle, radius 4). +- Toggle animation: the mark is drawn progressively (dash length grows with + the animation progress); partial dots appear at 1/3, 2/3 and 3/3. + +**k.5.7 Radio button.** Indicator 20 x 20. + +- Disc: the indicator inset by 2 and then by 0.5 (15 x 15 circle at 2.5). + Pen: separator colour when off, Highlight when on. Fill Button (darkened + 110 percent while pressed). On: filled again with Highlight at alpha 0.3. +- Dot (on): a filled circle of radius `floor((18 - 12) / 2) = 3` (6 px + diameter) at the centre, Text colour. +- Hover: a 1 px ring in the focus colour on the 15 x 15 circle. +- Animation: the dot radius grows with the animation progress. + +**k.5.8 Focus frame (keyboard focus on buttons, fields, checks, sliders).** +An annulus filled with Highlight alpha times 0.3: inner edge the widget +rectangle inset by 1 with radius 5, outer edge that inner rectangle grown +by 2 with radius 7 (for check boxes and radio buttons, the inner edge is +the indicator box; for radio buttons and dials both edges are circles). So +the ring runs from 1 px inside to 1 px outside the control, 2 px wide. +This is what the preset's focus-ring tokens transcribe (width 2, offset -1). + +**k.5.9 Switch (desktop QtQuick style, as used by Kirigami apps)** [Qd]. +Uses the **Button** colour set. + +- Indicator: height = Kirigami gridUnit (18), width = 2 x height (36). +- Track: the indicator inset vertically by `floor(height / 6) = 3` top and + bottom (36 x 12), radius `round(12 / 2) = 6`. Fill: ButtonText at 10 + percent over Button background (that is, Button background at alpha 0.9 + composited over ButtonText). Border (1 px): Highlight when checked, + otherwise the handle border colour. +- Checked fill: a rectangle from the track's leading edge to the handle's + trailing edge, same radius, Highlight at alpha 0.5. +- Handle: a circle of the full height (18 x 18), radius `floor(18 / 2) = 9`, + fill Button background, 1 px border: the Button set's DecorationHover when + hovered or keyboard-focused, otherwise Mix(Button background, ButtonText, + fc). +- Handle position: `x = clamp(p x 36 - 9, 0, 18)` where p is the visual + position (0 off, 1 on; mirrored in right-to-left layouts). +- Label: spacing 4 (smallSpacing), padding 1; disabled label opacity 0.6. +- Motion in k.8. + +**k.5.10 Slider.** Thickness 20. Handle box 20 x 20, centred across the +groove, positioned along it by the value over `length - 20`. + +- Groove: 6 thick, centred, full length, drawn on the rectangle inset by + 0.5, radius 3. Background part (whole groove): pen WindowText with alpha + fc, fill WindowText at alpha 0.2 x 0.7 = 0.14 over Window. Fill part + (from the start to the handle centre; mirrored in right-to-left; for + vertical sliders from the top unless inverted): pen Highlight with alpha + fc, fill Highlight at alpha 0.7 over Window. Disabled: only the background + part. +- Handle: the box inset by 1 (18), stroked (17 px circle at 1.5); fill + Button; pen slider outline, hover colour when the handle is hovered, focus + colour when focused; a shadow ellipse of the shadow colour (black 0.125), + 1 px, offset toward the bottom right, drawn unless pressed. +- Ticks (when enabled in breezerc and requested): lines 8 long, 2 px away + from the groove, Highlight for ticks at or below the value, separator + colour above it. + +**k.5.11 Scroll bar.** Extent 21 including a 1 px separator line on the +leading edge (top for horizontal bars, left in left-to-right vertical bars, +right in right-to-left), painted in **Text** (View text) with alpha fc. +**No track or groove is painted.** Buttons none by default (j.6). + +- Handle: 8 wide, centred in the remaining 20 px (so 6 px from the + separator side), stroked (painted 7 wide), radius + `0.5 x min(width, height, 8) = 4`, positioned and sized as Qt's + proportional thumb (length `space x page / (range + page)`, at least 20). +- Handle colour C: WindowText with alpha times 0.5 when idle; hover colour + when the handle is hovered; focus colour when the scroll area has focus + (hover wins). With animations on, C's alpha is multiplied by + `0.7 + 0.3 g`, where g goes from 0 to 1 while the pointer is anywhere over + the scroll bar. +- Painted fill: C at alpha times 0.5 over Window. Pen: C **with alpha fc**. + So the idle, not-hovered thumb is WindowText at effective alpha + `0.5 x 0.7 x 0.5 = 0.175` over Window with a WindowText outline at alpha + fc; with the pointer over the bar, 0.25; a hovered handle is the hover + colour at 0.5 over Window. + +**k.5.12 Progress bar.** Groove 6 thick, centred, radius 3, drawn on the +rectangle inset by 0.5 (inset horizontally by the frame width, normally 0). + +- Groove: pen WindowText with alpha fc; fill WindowText at alpha 0.2 x 0.7 = + 0.14 over Window. +- Contents (determinate): from the start, length `floor(position x + grooveLength)`; pen Highlight with alpha fc; fill Highlight at alpha 0.7 + over Window (HighlightedText instead of Highlight when the bar is in a + selected item). A contents shorter than 6 is drawn 6 long and clipped. + Right-to-left and inverted bars fill from the other end. +- Busy (minimum = maximum = 0): the groove rectangle filled with a repeating + stripe pattern of period 28 px: 14 px of Highlight and 14 px of + Mix(Highlight, Window, 0.7), offset by the animation value, radius 3. The + offset runs linearly from 0 to 28 over 800 ms and loops + (ProgressBarBusyStepDuration). +- Text (when visible, horizontal only): Text colour (HighlightedText when + selected), to the trailing side of the groove with 4 px spacing. + +**k.5.13 Menus (popup panel, items, separators, sections).** + +- Panel: fill frame background, pen frame outline. With compositing + (translucent popup windows) the panel is a rounded rectangle, stroked, + radius 4.5; without, a plain rectangle. Menu frame width 0; items sit 4 px + inside the panel (menu margins). When `MenuOpacity` is below 100 the fill + has alpha `MenuOpacity / 100` and the pen is WindowText with alpha 0.25. +- Window shadow: k.6. +- Item highlight with `MenuItemDrawStrongFocus` true (the default): for the + hovered or keyboard-selected item, the item rectangle (inset 4 from the + panel) is filled with the focus colour at alpha 0.3 and outlined with the + focus outline (1 px, stroked, radius 4.5). While pressed: fill the focus + colour (opaque) and outline the focus colour. Item text: WindowText; + HighlightedText while pressed. +- With `MenuItemDrawStrongFocus` false: no fill; a 1 px line under the text + (2 px below the text's bottom) in the hover colour when selected, the + focus colour when pressed. +- Item layout: contents rectangle = item inset 4 horizontally and 4 + vertically, then 8 more on the leading side. Check column: a 20 x 20 + check box or radio indicator (k.5.6, k.5.7) at the contents' leading edge + minus 8, vertically centred; the text then starts 8 after the indicator. + Icon column: `iconW` wide, then 2 + 1 spacing. Without an icon column the + text moves 4 further (extra left margin). Submenu arrow: 20 x 20 at the + trailing edge, arrow colour of WindowText (HighlightedText when pressed), + text ending 3 before it. Shortcut text: right-aligned, at opacity 0.7. +- Separator: a 1 px line in the separator colour (WindowText with alpha fc + when `MenuOpacity` is below 100), vertically centred in the 5 px item, + inset 4 on each side. +- Section (separator with text): the text in bold, WindowText at alpha 0.7, + leading-aligned with 4 px extra top padding; the line fills the remaining + width starting `4 + 4 - 1 = 7` px after the text. + +**k.5.14 Tabs (regular tab bars).** + +- Selected tab: fill frame background (Window in document mode outside + QtQuick); pen Mix(fill, WindowText, fc); the rectangle stroked, with the + two outer corners rounded (radius 4.5). A **3 px Highlight bar** along the + outer edge (top for tabs on the north, bottom for south, the outer side + for west and east), its outer corners rounded with radius 5. +- Unselected tab: fill `Window darkened 120 percent` (d.11), corners on the + outer edge rounded radius 5 only at the ends of the row; hovered: the hover + colour at alpha 0.2 (animated by mixing). +- Tabs overlap by 1; padding 8 horizontal, 4 vertical; spacing 8 between + icon, text and buttons; minimum width 80, minimum height 30. +- Static tab bars (document mode, not closable, not movable, expanding or + vertical): minimum height 34. Selected: Window fill, then (document mode) + Highlight with alpha fc as the background, or frame background otherwise, + pen Mix(background, WindowText, fc), 3 px Highlight bar. Unselected: Base + darkened 102 percent; hover colour with alpha fc on hover. Between + unselected tabs a 1 px separator in Mix(Base darkened 102, WindowText, fc), + inset 8 at both ends. + +**k.5.15 Header section (table and tree headers).** Fill Button; hovered +Mix(Button, hover, 0.2); pressed or sorted-down Mix(Button, focus, 0.2). +A bottom line (horizontal headers) or trailing line (vertical headers) and +separators between sections, all WindowText with alpha fc, 1 px, not +antialiased. Sort indicator: a 10 px chevron, spacing 4. Margins 6. + +**k.5.16 Item-view selection (lists, trees).** The item rectangle minus its +margins (2 left, 2 right, 1 top, 1 bottom; 2 top on the first row; one less +on each framed side; in row-selection views the inner columns drop their +side margins so the pill spans the whole row). Colour group: Active when the +window is active, Inactive when not, Disabled when disabled. + +- Nothing is painted unless the item is hovered, selected, has a custom + background, or is an alternate row. +- Alternate rows: AlternateBase over the full, un-inset item rectangle, + square. +- Fill: Highlight of that colour group. Hovered and not selected: Highlight + with alpha 0.3. Hovered and selected: Highlight lightened 110 percent + (d.11). +- Outline: the fill colour with alpha 1.0 when selected, 0.8 otherwise; 1 px, + on the stroked rectangle with radius 4.5, sides chosen by the item's + position in the row (only the row's two ends are rounded and outlined at + the sides). +- Tables: square cells, no rounding. +- Keyboard focus without selection (when `ViewDrawFocusIndicator`): + an outline only, in Highlight lightened 110 percent, radius 4.5, on the + item rectangle minus the margins. + +**k.5.17 Arrows (chevrons).** A polyline in a square of side +`s = min(width, height, 10)`, centred; apex at the centre line; the two +ends at a quarter and three quarters of s; 1 px pen, square caps, mitre +joins; nudged by -0.25, +0.5 or +0.25 px when `s mod 4` is 1, 2 or 3 so the +apex lands on a pixel. + +**k.5.18 Tooltip.** Fill ToolTipBase; pen Mix(ToolTipBase, ToolTipText, fc); +with compositing a rounded rectangle, stroked, radius 4.5. Text ToolTipText. +Padding 4. Window shadow (k.6). Tooltip colours are the Active state's in +every state (f.2). + +**k.5.19 Group box.** Fill frame background, pen frame outline, stroked +radius 4.5; flat group boxes have no frame. Title margin 4. + +**k.5.20 Generic frames and scroll areas.** Fill Base, pen the input-frame +outline, stroked radius 4.5 (frame width 2) when the frame is shown; side +panels use a single line in the Inactive Highlight (Active Highlight when +focused). + +**k.5.21 Splitter.** A 1 px handle; when `SplitterProxyEnabled`, a 12 px +invisible hit proxy. + +### k.6 Shadows + +**Window shadows** (menus, tooltips, combo-box popups). Each size is two +layers. The *size offset* moves both layers; the layer offset is added to +it. Radii are CSS box-shadow **blur radii** (n.4). Colour `ShadowColor` +(default black) with alpha `opacity x ShadowStrength / 255`. + +| ShadowSize | Size offset | Layer 1: offset, blur, opacity | Layer 2: offset, blur, opacity | Effective layers (offset y, blur, opacity) | +|---|---|---|---|---| +| None | | | | no shadow | +| Small | (0, 3) | (0, 0), 12, 0.26 | (0, -2), 6, 0.16 | (3, 12, 0.26) and (1, 6, 0.16) | +| Medium | (0, 4) | (0, 0), 16, 0.24 | (0, -2), 8, 0.14 | (4, 16, 0.24) and (2, 8, 0.14) | +| Large (default) | (0, 5) | (0, 0), 20, 0.22 | (0, -3), 10, 0.12 | (5, 20, 0.22) and (2, 10, 0.12) | +| Very large | (0, 6) | (0, 0), 24, 0.20 | (0, -3), 12, 0.10 | (6, 24, 0.20) and (3, 12, 0.10) | + +The shadow shape is the window's rounded rectangle (radius 5); the window +itself covers the shadow except where the shadow extends beyond it, with a +2 px overlap. An unknown ShadowSize value means Large. + +**Control shadows.** Push button: k.5.1 (offset (0, 1), blur 0, black +0.125). Slider handle: a 1 px ellipse outline in the same colour, rotated +45 degrees so it shows at the bottom right. + +Mapping to Teksilo shadow tokens: `blur` = the radius in the table, offset +as in the last column, colour black with the layer opacity; `spread` 0. +The preset's `shadow_sm`, `shadow_md`, `shadow_lg` are Small, Medium and +Large, first layer in the tokens; the styles paint both layers. +`shadow_xs` is the button shadow. + +### k.7 Layout tokens + +Layout spacing 6 (`control_gap`), child margin 6, top-level (dialog) margin +10, Kirigami largeSpacing 8 (`section_gap`) [K]. Radii: controls and popups +5 (painted 4.5 when stroked), check box 4, progress and slider grooves 3, +scroll handle 4, focus ring outer radius 7. + +### k.8 Control motion (see m for tokens) + +- Style animations (buttons, frames, check boxes, tabs, headers, scroll + bars, combo and spin arrows): duration 100 ms (j.2), linear progress + quantised down to multiples of 1/10 (AnimationSteps), so a transition is + 10 discrete steps. +- Switch handle position: a smoothed animation (Qt's `SmoothedAnimation`, + documented as an ease-in-out quadratic curve [qt]) with duration + Kirigami shortDuration (100 ms) **and Qt's default velocity of 200 px/s**; + Qt uses whichever gives the shorter duration [qt], so the full 18 px + travel takes 90 ms at the default factor. Not animated while the switch + is being pressed or dragged, nor when shortDuration is 0. +- Switch handle colour: a colour animation with an ease-in cubic curve over + shortDuration [Qd]. +- Busy progress: linear, 800 ms per 28 px, looping. + +--- + +## l. Typography + +### l.1 Roles + +| Teksilo style | Font | Size | Weight | Source | +|---|---|---|---|---| +| body | Noto Sans | 10 pt = 13 px face | 400 | j.1 `font` | +| body_bold | Noto Sans | 13 px face | 600 (DemiBold) | Kirigami primary heading weight [K] | +| small, small_bold | Noto Sans | 8 pt = 11 px face | 400 / 600 | j.1 `smallestReadableFont` | +| tiny | as small | | | **[derived]**: KDE has no smaller role | +| mono | Hack | 10 pt = 13 px face | 400 | j.1 `fixed` | + +Letter spacing (tracking) is 0 everywhere. `from_desktop` uses the +desktop's own families and sizes (j.1). + +Kirigami heading factors (documented, not rendered as separate styles): +level 1 x 1.35, level 2 x 1.20, level 3 x 1.15, level 4 x 1.10, level 5 and +higher x 1, applied to the default point size; weight DemiBold for the +primary type, normal otherwise; the secondary type at opacity 0.75 [K]. + +### l.2 Line height + +**Facts.** Noto Sans v2.015 has units per em 1000, hhea ascender 1069, +descender -293, line gap 0 (the OS/2 typographic metrics are identical and +flagged for use; the Windows metrics 1124 and 395 are not used), so its +natural line height is 1.362 em. Hack v3.003: units per em 2048, hhea +ascender 1901, descender -483, line gap 0 (the OS/2 typographic values +1556, -492, 410 are not flagged for use; the Windows metrics equal hhea); +monospaced with an advance of 1233 units (0.60205 em). + +**How Qt measures it** [measured-qt] (`sizes.json`, Noto Sans at 8, 9, 10, +11, 12 and 14 pt, Hack at 9, 10 and 11 pt, all reproduced by the rule): + +1. The face is resolved at the integer pixel size `P = round(pt x 96 / 72)` + (round half up): 10 pt is a 13 px face (resolved point size 9.75), 8 pt + is 11 px. +2. Ascent and descent are `a = floor(64 P asc / upm) / 64` and + `d = floor(64 P desc / upm) / 64`, with `asc` and `desc` the hhea + ascender and the absolute descender (Noto Sans at 13 px: a = 13.890625, + d = 3.796875). +3. The integer line height is `H = round(a) + round(d)`, each rounded half + up separately (not `round(a + d)`, which is 1 px short at 9 and 14 pt). + +Noto Sans: 8 pt 15, 9 pt 17, 10 pt 18, 11 pt 20, 12 pt 22, 14 pt 26. Hack: +9 pt 14, 10 pt 15, 11 pt 18. + +**Text roles (normative).** `H` is computed by steps 1 to 3 with the +bundled face's metrics (Noto Sans for text roles, Hack for mono): 18 for +body and body_bold (10 pt), 15 for small, small_bold and tiny (8 pt), 15 +for mono (Hack 10 pt). The line-height ratio given to Teksilo's text style +is `H / px` with `px` the role's size from l.1, so the line box is the +integer `H`. `from_desktop` applies the same steps to the desktop's fonts +(no font measurement): exact for Noto Sans and Hack, and, for any other +family, `H = round(P x 1.362)` **[derived]**, a documented +/-1 px +approximation. Without either font feature (l.3) the same Noto Sans and +Hack numbers are used for the fallback families. + +The glyph size is the integer face size `P` from step 1 **[measured-qt]**: +13 px for the 10 pt roles and 11 px for the 8 pt roles. Qt resolves a whole +pixel size and draws that face, so Teksilo uses the same size rather than +the unrounded `pt x 96 / 72` (40/3 px), which would make every label 0.33 px +larger than in a Qt application next to it. The line-height ratio given to +Teksilo's text style is therefore `H / P` (18/13 for body, 15/11 for small). +`from_desktop` applies the same rule to the desktop's fonts. + +This corrects the plan's `round(px x 1.35)` (14 instead of 15 at 8 pt) and +the earlier `round(px x 1.362)` (16 instead of 17 at 9 pt and 25 instead +of 26 at 14 pt). + +**Kirigami gridUnit** is the constant 18 (j.7); it coincides with H at the +default font but does not follow the font. + +### l.3 Families without the font features + +With neither `bundled-fonts` nor `system-fonts`, the preset falls back to +Inter and JetBrains Mono with the same sizes **[unpublished]**. + +--- + +## m. Motion + +| Teksilo token | ms at factor 1 | Upstream source | +|---|---|---| +| duration_fast | 100 | breezerc AnimationsDuration; Kirigami shortDuration | +| duration_normal | 200 | Kirigami longDuration | +| duration_slow | 400 | Kirigami veryLongDuration | +| duration_collapse | 200 | Kirigami longDuration | +| duration_indeterminate_sweep | 800 | breezerc ProgressBarBusyStepDuration (not scaled) | +| tooltip_delay, tooltip_delay_heavy | 700 | Kirigami toolTipDelay (not scaled) | +| submenu popup delay (informative) | 150 | Breeze style hint | + +Easing facts: + +- QStyle (Breeze) animations are linear, quantised to 10 steps over + 100 ms (k.8). At 60 Hz that is about 6 frames, so the quantisation is + invisible and `easing_standard` = Linear. +- The switch handle uses Qt's smoothed animation, documented as an ease-in- + out quadratic; the preset approximates it by + `CubicBezier(0.455, 0.03, 0.515, 0.955)` **[derived]** with a test + bounding the maximum deviation from the quadratic ease-in-out at 0.02. +- The switch handle colour uses an ease-in cubic; approximated by + `CubicBezier(0.55, 0.055, 0.675, 0.19)` **[derived]**. +- An ease-out cubic appears in the QtQuick **Breeze** style (a different + style package) for its switch border colour; the desktop style that + Kirigami desktop apps use does not use it. Teksilo does not use + ease-out cubic for Breeze controls. +- `from_desktop` scaling: j.2. A factor of 0 is reduced motion. + +--- +## n. C0 settles: answers + +Each item of the plan's C0 "Settles" list, then the plan's fallback table, +then further findings. **CONFIRMED** means settled from the pinned upstream +source (cited in the ledger); **FALLBACK** means not settled, with the +plan's fallback in force and the item tagged `[unverified]` until settled. + +**n.1 `expandSize`. CONFIRMED.** Expanding a size by a margin adds twice the +margin on each axis: `(w + 2 mx, h + 2 my)`; the one-argument form uses the +same margin for both axes. Every size in k.4 uses this. + +**n.2 `scrollBarButtonHeight`. CONFIRMED.** No buttons: 3; single: 21 (the +scroll bar extent); double: 42. breezerc `ScrollBarAddLineButtons` and +`ScrollBarSubLineButtons` default to 0 (no buttons); 1 is single and any +other value double. + +**n.3 qqc2-desktop-style SwitchIndicator. CONFIRMED.** 36 x 18 (height = +Kirigami gridUnit, width twice the height), track inset `floor(h / 6) = 3` +top and bottom, track radius 6, handle 18 x 18 with radius 9, colours and +motion in k.5.9 and k.8. The plan's fallback values (from the QtQuick +Breeze style) match the size but not the colours, borders and checked fill, +which k.5.9 now specifies. + +**n.4 Shadow blur mapping. CONFIRMED.** Breeze's shadow "radius" is a CSS +box-shadow blur radius: the renderer turns it into a Gaussian of standard +deviation `radius / 2` (the CSS Backgrounds definition) and approximates +that Gaussian with three successive box blurs whose total extent is +`max(2, floor(sigma x 3 sqrt(2 pi) / 4 x 1.5 + 0.5))` px (the SVG +filter approximation). The Teksilo token `blur` therefore equals the Breeze +radius, the same convention every sibling preset uses for vendor blur +values, which is also the plan's fallback. Offsets are the combined +offsets of k.6 (size offset plus layer offset). Note: Teksilo's renderer +draws a blur `b` as a smoothstep edge with `sigma = b / 2.5`, which is +somewhat sharper than CSS; that is a renderer-wide property, not part of +this mapping. + +**n.5 Portal dark predicate and namespaces. CONFIRMED.** Section i. + +**n.6 Duplicate-key precedence. CONFIRMED.** Last occurrence wins within a +file and higher layers win, except that an immutable occurrence freezes the +value, so inside an immutable group or file the first occurrence wins +(b.6). + +**n.7 Hack metrics. CONFIRMED.** Units per em 2048, hhea 1901 / -483 / 0 +(natural ratio 1.1640625); Qt's integer line height for Hack 10 pt is 15 +(l.2, [measured-qt]). The synthesised design's "about 1.2" was an +estimate. + +**n.8 `forceFontDPI` on Wayland. CONFIRMED: not read.** Plasma 6.0 deletes +`forceFontDPIWayland`. In addition, **on X11 it is not read either**: the +6.8 fonts settings page has no DPI setting and no 6.8 plasma-workspace +component reads `forceFontDPI` (j.3). The plan's "text scale follows +kcmfonts forceFontDPI on X11" must be dropped (plan correction). + +**n.9 `MenuItemDrawStrongFocus`. CONFIRMED.** breezerc `[Style]`, default +true; behaviour in k.5.13. + +**n.10 Progress hint height. CONFIRMED for Breeze, [measured-qt] for Qt's +part.** Breeze makes a horizontal progress bar at least 6 high, and at +least the font height when its text is visible; it adds nothing else. Qt's +progress-bar size hint supplies `font height + 8` as the contents height +[qt], so the hint is `H + 8 = 26`. The C0 harness confirms 26. + +**n.11 `ThemeExtension` bounds. CONFIRMED (Teksilo code).** There is no +`ThemeExtension` trait. `Theme` carries a `ThemeExtensions` registry keyed +by type; `with_extension` and `extension` require `T: Any + Send + Sync` +(which implies `'static`), and the registry already wraps each value in an +`Arc`. The registry's equality compares only which types are registered, +never their contents, so `assert_same_theme` must compare `KdePalette` by +content through `theme.extension::()`, and `KdePalette` must +implement `PartialEq` itself. An inner `Arc` is optional. + +Plan fallback table: + +| Item | Status | Value in force | +|---|---|---| +| Switch geometry | CONFIRMED | n.3 (qqc2-desktop-style) | +| Dark predicate | CONFIRMED | gray < 192 (i), not the luma fallback | +| Shadow blur mapping | CONFIRMED | blur = radius (n.4), equal to the fallback | +| forceFontDPI on Wayland | CONFIRMED | not read; nor on X11 (n.8) | + +Further items the synthesised design listed for C0: + +- **Busy period. CONFIRMED.** 28 px of stripe offset per 800 ms, linear, + looping; not scaled by the animation factor. +- **Flat-button hover. CONFIRMED.** Outline only, in Active Highlight, no + fill (k.5.2). +- **Groove fill. CONFIRMED.** Slider and progress grooves: WindowText at + 0.14 over Window with a WindowText outline at alpha fc; filled parts + Highlight at 0.7 over Window with a Highlight outline at alpha fc. +- **Wallpaper accent written to `AccentColor`. FALLBACK (not settled, + irrelevant).** The settings-page code that writes `AccentColor` was not + read. Teksilo reads the accent-applied `[Colors:*]` groups, so the + question does not affect any value. +- **Window decoration metrics.** Out of scope (a.1). + +Plan corrections and clarifications found while writing this specification +(each overrides the plan): + +**n.12 Accent precedence, reading side.** `QPalette` Accent and Highlight +are both Selection BackgroundNormal (CONFIRMED); the portal's +`accent-color` is the same colour. `OsThemeColors.accent` = Selection +BackgroundNormal and `focus` = View DecorationFocus stand. + +**n.13 `[General] AccentColor` in the no-colours fallback. DECIDED by the +user (2026-10-17): apply it.** KDE's own behaviour, recorded here as a fact: +when `kdeglobals` has no `[Colors:View]`, the platform integration builds the +palette from the look-and-feel package's colour file, else the named scheme, +else Breeze Light, and does **not** apply `AccentColor` (b.8). Teksilo +deliberately differs: it uses the same trigger (no `[Colors:View]` group) and +the same file order (look-and-feel colours, then `[General] ColorScheme`, +then Breeze Light), and then applies `[General] AccentColor`, when it is +present and not transparent, through the accent application of section g. +Reason: the accent the user chose is honoured even on a profile whose colour +groups were never written. This is a documented deviation from Qt +applications in that edge case only; with `[Colors:View]` present, the +colour groups already carry the accent and nothing is re-applied. + +**n.14 `KDE_COLOR_SCHEME_PATH`.** It is an in-process application property, +not an environment variable (b.8). `color_scheme_file(name)` must not +honour an environment variable of that name. + +**n.15 `[Inactive]` subgroups do not stop the Inactive effects.** The +subgroup replaces the set's source values (missing keys take the compiled +defaults, or Window's keys for Header), and the Inactive effects then still +apply (c.2 step 5). For Breeze they are disabled, so nothing changes. + +**n.16 Header falls back to Window per key**, not as a whole set (c.2). + +**n.17 Invalid and empty colours.** KDE yields an invalid colour, not the +default; Teksilo treats them as absent (b.9) **[divergence]**, as the plan +decided. + +**n.18 Byte order mark.** KDE does not strip it (b.1); Teksilo reproduces +that and emits a diagnostic. + +**n.19 Line height.** `H` follows Qt's measurement (l.2: integer pixel +size, ascent and descent rounded separately), not `round(px x 1.35)`: the +small role's line box is 15, not 14, and the rule is exact at every +measured size. + +**n.20 Scroll-bar thumb.** The idle thumb fill is WindowText at effective +alpha 0.175 over Window (0.25 while the pointer is over the bar), with a +1 px WindowText outline at alpha fc; the hovered thumb is the hover colour +at 0.5 over Window. Breeze paints **no** track; the only alpha-fc element is +the separator line, in View Text. The synthesised design's +`scrollbar_thumb = window_text at 0.5 x 0.7` and `scrollbar_track_hover = +window_text at alpha fc` do not match Breeze (k.5.11); the preset's tokens +should be re-derived from k.5.11 before the WCAG lift D9. + +**n.21 Progress contents.** The determinate fill is Highlight at 0.7 over +Window with an outline, not solid Highlight (k.5.12). + +**n.22 Animation factor.** Busy sweep not scaled; fast derived from normal +by halving (j.2). + +**n.23 Default button** blend applies only in an active window; its pen is +Mix(Active Highlight, button outline, 0.5) (k.5.1). + +**n.24 Accent oracle procedure.** The command-line accent option applies +the accent to the scheme currently named in `kdeglobals` and does not check +whether that scheme is already in use; only the scheme-name argument has +that check. It also does not write `AccentColor`. The accent run +therefore only needs `[General] ColorScheme` in the scratch `kdeglobals` +to name the scheme under test; `accent_oracle.sh` gets there by applying +the scheme by name first (from a placeholder name, because the scheme-name +path refuses the scheme already in use), which also records the no-accent +`kdeglobals` as each scheme's `base`. + +**n.25 16-bit storage.** All colour arithmetic stores 16-bit channels and +converts to 8 bits with `E8(q) = floor((q + 128) / 257)`, which is +`round(q / 257)` (a.3, [measured-qt] on all 65536 values). The goldens' +"8-bit equal" comparison uses `E8`; their `hex` fields are `E8` of `u16`. + +**n.26 Breeze `contrast`.** All three Breeze schemes set `[KDE] contrast=4`, +so their shade roles use k = 0.4; the default 7 applies only when the key is +absent. + +**n.27 kdedefaults.** It reaches programs through `XDG_CONFIG_DIRS`, which +the Plasma session start prepends; b.7 gives the rule for programs started +outside the session environment. + +**n.28 Confirmed as planned** (no change): push button 34 high and at least +84 wide, radius 4.5 stroked, 1 px pen, shadow only in an active window, +Highlight outline on hover and keyboard focus; tool buttons 28 / 34 auto-raise +and 32 / 38 framed (contents taken as the icon; `sizes.json` confirms all +four); +line edit, combo and spin 32, combo arrow 20, spin column 20 split 10 + 10; +check and radio indicator 20, box 15 at 2.5, radius 4, check pen 2 with +mitre joins, radio dot 6, label at 24; slider 20 / groove 6 radius 3 / +handle 17 painted, ticks 8 with a 2 px gap, mirrored in right-to-left; +scroll bar 21 with a 1 px separator, handle 8 painted 7 radius 4, minimum +20; progress groove 6 radius 3; menu item 29, separator 5, section 28, +margin 4, text margin 8 (+4 without icons), highlight focus at 0.3 with an +outline, radius 4.5, shortcut opacity 0.7; tab 30 (34 static), minimum +width 80, padding 8, 3 px Highlight bar, unselected Window darkened 120, +hover at 0.2 (of the hover colour); header 30; item row 24 (26 with a +16 px icon or a check box, k.4) with margins 2 / 1 and radius 4.5, hover Highlight at 0.3, outline alpha 1.0 selected and 0.8 +otherwise; tooltip padding 4, radius 5 (4.5 stroked); focus ring 2 px of +Highlight at 0.3 from 1 px inside to 1 px outside; `control_gap` 6, +`section_gap` 8, dialog margin 10; durations 100 / 200 / 400 / 200 / 800 / +700; ChangeSelectionColor makes the Inactive Highlight the Window colour +tinted 0.4 toward the selection colour, with the Window foreground as its +text. + +--- + +## o. Ledger + +References only. Paths are relative to the repository root at the pinned +tag (a.2); URLs have the form +`https://invent.kde.org///-/raw//`. Line numbers +are at that tag. "Qt docs" means Qt 6 public documentation of the named +class or function. + +### o.1 Files read beyond the fetch manifest + +Role A fetched these additional files at the same pinned tags (stored +outside every repository): + +| Repository @ tag | Path | sha256 | +|---|---|---| +| plasma/plasma-workspace @ v6.8.0 | kcms/colors/ui/AccentColorUI.qml | c62b614f1fa6da2a385b2c9bc2b0f6998ddf59bed3e7ef1860ddf1bd080367aa | +| frameworks/kconfig @ v6.31.0 | src/gui/kconfiggroupgui.cpp | 484abe215a1ef648b0bd7967b6f4c13b13dbcca9584a9030d8d2953279af92e7 | +| frameworks/kconfig @ v6.31.0 | src/core/kconfig.cpp | 679a6d335ff4bbeee349d7adf32df89031f4be6470ab18e0f4ac61605c00d825 | +| frameworks/kconfig @ v6.31.0 | src/core/kconfigdata.cpp | 42882ba136c16a8aa6fb76cf1f41407bf059ddd1b8ef2dae6b1c5043c876a15b | +| frameworks/kconfig @ v6.31.0 | src/core/kconfigdata_p.h | 87b8ed5500a825080517a84bcc8f31b615296b416a12e1325f6748e71a61585b | +| plasma/breeze @ v6.8.0 | libbreezecommon/breezeboxshadowrenderer.cpp | b52ea0760c82c3d23dccdef1407283b68049fac605ea3264306d978c619c84cd | +| plasma/breeze @ v6.8.0 | libbreezecommon/breezeboxshadowrenderer.h | 31af761f1f7f8411abddc2deaba8f4bfede466c85cb0f7288ea1a3792ce68801 | +| plasma/breeze @ v6.8.0 | kstyle/breeze.h | 8646f4b6a72eca865bc469017f2dbdc54bb348ce185a8ae0613cb7bbcc4cfd0e | +| plasma/breeze @ v6.8.0 | kstyle/animations/breezeanimations.cpp | 934931079849b8be5a4083b699759a8927cfedd3d2fb879aac77ce7e0b617427 | +| plasma/breeze @ v6.8.0 | kstyle/animations/breezeanimationdata.cpp | 97d0b393a5207abc4321ab0f5b000f9a5db9a1423e43406eec3aa179ed09ab29 | +| plasma/breeze @ v6.8.0 | kstyle/animations/breezeanimationdata.h | f7c40f0e967f1c98ed9153e8d19ee61b1e00a6f79ba99b0ee1f1cf78d44074c7 | +| plasma/breeze @ v6.8.0 | kstyle/animations/breezebusyindicatorengine.cpp | 4b25b1d871831befe8ae4ef626b1685ec2ee5325bd28286fb2a14447c89c706a | +| frameworks/qqc2-desktop-style @ v6.31.0 | kirigami-plasmadesktop-integration/plasmadesktopunits.cpp | aeca22cf2e8c4b37bde99fae4de0edbd1331595150b6d5c0bf0c1df5f43a0d1a | +| frameworks/qqc2-desktop-style @ v6.31.0 | kirigami-plasmadesktop-integration/animationspeedprovider.cpp | c3aaf8c9c221785cca717a854481d47046372bd0f9d0f5e0e9fe4531a660662a | +| qt/qtbase @ v6.11.1 | src/gui/painting/qcolor.cpp | 1f9b37229fab0eac532d4c8ef52da4fcddd3e501a8a45a78ef982da0f2fc9216 | +| qt/qtbase @ v6.11.1 | src/gui/painting/qcolorspace.cpp | 2b4a575b0cf6483106a162df7d5677b7b62faba3ad4e502a556b5bc62d141579 | +| qt/qtbase @ v6.11.1 | src/gui/painting/qcolormatrix_p.h | de9757a4012d27503773f1e8e53534e2510b603f95ace3d3bf18f96d25f823a0 | +| qt/qtbase @ v6.11.1 | src/gui/painting/qcolortransferfunction_p.h | 8cbc4d00fd53e3014a7cd4eb2e42c4eec33a0ea5d55339171e16cae8856cc8d8 | +| qt/qtbase @ v6.11.1 | src/gui/painting/qcolortransform.cpp | 75442b871d3e66a46b5da6dd839bb85b17cc9ee7e08627544a85887fa9ef10ae | +| qt/qtbase @ v6.11.1 | src/gui/painting/qcolortrc_p.h | 9ca6f329514171013d136f74e6c70b6ce1c877caa356ee2249d459fa95a6ab5a | +| qt/qtbase @ v6.11.1 | src/gui/painting/qdrawhelper_p.h | 58539076c7ef0e4d4b0df785ab24af13002f6673e126e1faffbf5b8c2857a5b9 | + +The plasma-workspace v6.8.0 tree listing of `kcms/` (GitLab repository API) +was consulted to establish that no X resource loader exists (n.8). + +The qtbase files come from Qt's GitHub mirror, +`https://raw.githubusercontent.com/qt/qtbase/v6.11.1/`. Qt is +LGPL-3.0 or GPL; like the KDE files, these are described in prose here and +never copied. Each behaviour read from them was also confirmed black-box in +the golden image (o.12). + +### o.2 Grammar and cascade (frameworks/kconfig @ v6.31.0) + +| Value or rule | File | Lines | +|---|---|---| +| line trimming, blank and `#` lines | src/core/kconfigini.cpp | 92-98 | +| header parsing, nested segments, invalid header keeps group | src/core/kconfigini.cpp | 100-150 | +| `[$i]` file and group immutability | src/core/kconfigini.cpp | 116-128, 145-149, 278-283 | +| immutable group skips user-layer entries | src/core/kconfigini.cpp | 140-155 | +| key and value trimming, empty key | src/core/kconfigini.cpp | 157-171 | +| key options i, e, d; locale tags; errors | src/core/kconfigini.cpp | 178-229 | +| locale filtering | src/core/kconfigini.cpp | 231-243 | +| 100-error limit, 1.5 MiB line limit | src/core/kconfigini.cpp | 74, 78, 86, 271-274 | +| escape decoding table, `\x` rules, invalid escape | src/core/kconfigini.cpp | 706-801 | +| escape encoding (leading/trailing space as `\s`) | src/core/kconfigini.cpp | 615-704 | +| immutable entry and immutable group block writes; deletion | src/core/kconfigdata.cpp | 71-140 | +| deleted entries read as absent | src/core/kconfigdata.cpp | 221-234 | +| `$` expansion rules, QT_*_HOME fallbacks, `$$` | src/core/kconfig.cpp | 192-250 | +| group exists: non-deleted entry in group or subgroup | src/core/kconfig.cpp | 140-145, 300-303, 373-378, 1094-1101 | +| global files order: kde5rc, system.kdeglobals, kdeglobals, user files | src/core/kconfig.cpp | 110-130, 735-768, 786-850 | +| system files before user files, immutable stops user files | src/core/kconfig.cpp | 711-731 | +| typed reads: absent gives default; bool negatives | src/core/kconfiggroup.cpp | 229-269, 686-701 | +| plain-string reads expand `[$e]` | src/core/kconfiggroup.cpp | 645-662 | +| colour read: empty and `invalid`, `#` forms, names, comma form bounds | src/gui/kconfiggroupgui.cpp | 25-95 | +| colour write: `r,g,b`, `,a` when alpha not 255, `invalid` | src/gui/kconfiggroupgui.cpp | 131-152 | +| font write drops Regular/Normal/Book/Roman style names | src/gui/kconfiggroupgui.cpp | 153-171 | +| list serialisation with `,` | src/core/kconfiggroup.cpp | 133-158 | + +### o.3 Session and locations (plasma/plasma-workspace @ v6.8.0) + +| Value or rule | File | Lines | +|---|---|---| +| KDE_FULL_SESSION, KDE_SESSION_VERSION, XDG_CURRENT_DESKTOP | startkde/startplasma.cpp | 410-415 | +| kdedefaults prepended to XDG_CONFIG_DIRS, `/etc/xdg` default | startkde/startplasma.cpp | 421-428 | +| default ColorScheme BreezeLight; ColorSchemeHash SHA-1 | startkde/startplasma.cpp | 446-466 | +| forceFontDPIWayland deleted | kcms/fonts/kconf_update/plasma6.0-remove-dpi-settings.cpp | 13-29 | +| font defaults (kdeglobals) | kcms/fonts/fontssettings.kcfg | 7-58 | + +### o.4 Colour model (frameworks/kcolorscheme @ v6.31.0) + +| Value or rule | File | Lines | +|---|---|---| +| effect groups, Enable defaults, effect defaults and Color defaults | src/kcolorscheme.cpp | 22-52 | +| background chain (intensity then colour) | src/kcolorscheme.cpp | 54-80 | +| foreground chain (contrast then the background chain) | src/kcolorscheme.cpp | 82-97 | +| effect enumerations | src/kcolorschemehelpers_p.h | 50-78 | +| compiled default tables, decoration defaults 61,174,233 and 147,206,233 | src/kcolorscheme.cpp | 120-217 | +| twelve keys and their names | src/kcolorscheme.cpp | 251-278 | +| set to group mapping, Selection Inactive and Disabled use Window, tint source | src/kcolorscheme.cpp | 289-342 | +| ChangeSelectionColor defaults to Enable, default true | src/kcolorscheme.cpp | 305-307 | +| Header defaults from Window per key | src/kcolorscheme.cpp | 330-334 | +| `[Inactive]` subgroup selection | src/kcolorscheme.cpp | 344-352 | +| selection tint 0.4 on both backgrounds | src/kcolorscheme.cpp | 374-378 | +| effects for every non-Active state; foregrounds against pre-effect background | src/kcolorscheme.cpp | 380-391 | +| computed backgrounds, tint default 0.3 | src/kcolorscheme.cpp | 393-405 | +| contrast value 0.1 x contrast, default 7; 0.7 without config | src/kcolorscheme.cpp | 519-527 | +| frameContrast default 0.2, clamp 0..1 | src/kcolorscheme.cpp | 529-539 | +| shade-role formulas and thresholds 0.006, 0.93 | src/kcolorscheme.cpp | 566-616 | +| shade chroma amount default 0 | src/kcolorscheme.h | 351 | +| palette roles; Tooltip Active in all states; Accent = Selection background | src/kcolorscheme.cpp | 656-695 | +| app-chosen scheme path is an application property | src/kcolorschemehelpers_p.h (and src/kcolorschememanager.cpp 55-66) | 20-36 | + +### o.5 Colour mathematics (frameworks/kguiaddons @ v6.31.0) + +| Value or rule | File | Lines | +|---|---|---| +| clamp with NaN to 1 | src/colors/kguiaddons_colorhelpers_p.h | 13-16 | +| hue wrap | src/colors/kcolorspaces.cpp | 16-20 | +| Rec.709 weights 0.2126, 0.7152, 0.0722 | src/colors/kcolorspaces.cpp | 25-32 | +| gamma 2.2 and 1/2.2 | src/colors/kcolorspaces.cpp | 34-42 | +| forward HCY: luma, hue order, chroma | src/colors/kcolorspaces.cpp | 57-87 | +| inverse HCY: sectors, top/middle/bottom, assignment | src/colors/kcolorspaces.cpp | 89-148 | +| luma | src/colors/kcolorspaces.cpp | 160-163 | +| contrast ratio with +0.05 | src/colors/kcolorutils.cpp | 59-71 | +| lighten, darken, shade formulas | src/colors/kcolorutils.cpp | 73-95 | +| default amounts (lighten 0.5 / 1.0, darken 0.5 / 1.0, tint 0.3, mix 0.5) | src/colors/kcolorutils.h | 121, 140, 156, 172, 189 | +| tint: exponent 0.3, rg with cube, 12 bisection steps, last midpoint | src/colors/kcolorutils.cpp | 97-142 | +| mix: bounds, NaN, premultiplied, transparent result | src/colors/kcolorutils.cpp | 144-166 | +| interpolation form a + (b - a) t | src/colors/kcolorutils.cpp | 19-22 | + +### o.6 Accent application (plasma/plasma-workspace @ v6.8.0) + +| Value or rule | File | Lines | +|---|---|---| +| OKLab matrices (Ottosson), single-precision lerp | kcms/colors/colorsapplicator.cpp | 23-103 | +| sRGB to linear and back via the colour-space transform | kcms/colors/colorsapplicator.cpp | 105-116 | +| accent source, transparent means none, accent-present rule | kcms/colors/colorsapplicator.cpp | 125-137 | +| ColorSchemeHash | kcms/colors/colorsapplicator.cpp | 139-146 | +| TitlebarIsAccentColored / accentActiveTitlebar; TintFactor presence and value | kcms/colors/colorsapplicator.cpp | 150-155 | +| default tint factor 0.15 | kcms/colors/colorsapplicator.h | 86-88 | +| group order, key order, accent keys | kcms/colors/colorsapplicator.cpp | 157-181 | +| delete group, skip Header without Header | kcms/colors/colorsapplicator.cpp | 183-192 | +| link readability: ratio 5.0, one lighten or darken | kcms/colors/colorsapplicator.cpp | 197-218 | +| tint or copy of other keys | kcms/colors/colorsapplicator.cpp | 219-227 | +| Selection backgrounds and foregrounds | kcms/colors/colorsapplicator.cpp | 230-238 | +| Button BackgroundAlternate | kcms/colors/colorsapplicator.cpp | 240-245 | +| `[Inactive]` handling, Header copies Window | kcms/colors/colorsapplicator.cpp | 247-267 | +| Header title-bar accent | kcms/colors/colorsapplicator.cpp | 269-284 | +| `[WM]` keys and defaults from the Header set | kcms/colors/colorsapplicator.cpp | 287-309 | +| `[KDE]` frameContrast and contrast | kcms/colors/colorsapplicator.cpp | 311-318 | +| `[WM]` title-bar override | kcms/colors/colorsapplicator.cpp | 320-338 | +| effects copied, empty when absent | kcms/colors/colorsapplicator.cpp | 340-359 | +| 8-bit blend with truncation, translucent branch | kcms/colors/colorsapplicator.h | 18-43 | +| accent background alpha 0.7 | kcms/colors/colorsapplicator.h | 45-50 | +| black-or-white threshold 4.5, inactive alpha 0.6 | kcms/colors/colorsapplicator.h | 52-72 | +| accent option: current scheme, no AccentColor write, no "already set" check | kcms/colors/plasma-apply-colorscheme.cpp | 131-155 | +| scheme-name path refuses the scheme in use | kcms/colors/plasma-apply-colorscheme.cpp | 64-80 | +| ten swatches and their order | kcms/colors/ui/AccentColorUI.qml | 119-130 | +| fallback custom colour is the first swatch | kcms/colors/ui/AccentColorUI.qml | 148 | + +### o.7 Platform and portal + +| Value or rule | Repository @ tag | File | Lines | +|---|---|---|---| +| dark when gray of Window < 192, values 1 / 2 | plasma/xdg-desktop-portal-kde @ v6.8.0 | src/settings.cpp | 259-274 | +| accent-color is Highlight as doubles | plasma/xdg-desktop-portal-kde @ v6.8.0 | src/settings.cpp | 276-284 | +| reduced-motion is factor == 0 | plasma/xdg-desktop-portal-kde @ v6.8.0 | src/settings.cpp | 286-292 | +| namespaces and errors | plasma/xdg-desktop-portal-kde @ v6.8.0 | src/settings.cpp | 29-49, 87, 151, 228, 378-392, 502-545 | +| change signals | plasma/xdg-desktop-portal-kde @ v6.8.0 | src/settings.cpp | 294-307, 412-468 | +| palette from kdeglobals iff Colors:View; LnF colors, ColorScheme, BreezeLight fallbacks | plasma/plasma-integration @ v6.8.0 | qt6/src/platformtheme/khintssettings.cpp | 427-473 | +| same gray < 192 rule in the platform theme | plasma/plasma-integration @ v6.8.0 | qt6/src/platformtheme/khintssettings.cpp | 475-490 | +| reduced motion fuzzy zero | plasma/plasma-integration @ v6.8.0 | qt6/src/platformtheme/khintssettings.cpp | 492-497 | +| widgetStyle lookup and default breeze | plasma/plasma-integration @ v6.8.0 | qt6/src/platformtheme/khintssettings.cpp | 97-113, 304-322 | +| [KDE] hint keys and defaults | plasma/plasma-integration @ v6.8.0 | qt6/src/platformtheme/khintssettings.cpp | 72-92, 383-403 | +| font keys and defaults; Qt < 6.11 truncation to 17 fields; portal first in sandbox | plasma/plasma-integration @ v6.8.0 | qt6/src/platformtheme/kfontsettingsdata.cpp | 43-97, 144-168 | + +### o.8 Breeze widget style (plasma/breeze @ v6.8.0) + +| Value or rule | File | Lines | +|---|---|---| +| every metric constant of k.1 | kstyle/breezemetrics.h | 14-179 | +| pen width 1.001 | kstyle/breezemetrics.h | 22-28 | +| breezerc keys and defaults | kstyle/breeze.kcfg | whole file | +| size expansion by margins, rectangle inset and centring helpers | kstyle/breezestyle.h | 397-447 | +| scroll-bar button heights | kstyle/breezestyle.h | 366-376 | +| pixel metrics (menu margins 4, frame widths, layout margins, spacing, indicator sizes) | kstyle/breezestyle.cpp | 645-883 | +| style hints (submenu delay 150 and others) | kstyle/breezestyle.cpp | 885-983 | +| check box size | kstyle/breezestyle.cpp | 3304-3334 | +| line edit, combo, spin sizes | kstyle/breezestyle.cpp | 3337-3405 | +| slider tick length and size | kstyle/breezestyle.cpp | 3408-3489 | +| push-button size, minimum width, frame margin | kstyle/breezestyle.cpp | 3491-3565 | +| tool-button size | kstyle/breezestyle.cpp | 3568-3593 | +| menu-bar item size | kstyle/breezestyle.cpp | 3596-3599 | +| menu item, separator and section sizes | kstyle/breezestyle.cpp | 3602-3711 | +| progress-bar size | kstyle/breezestyle.cpp | 3714-3743 | +| tab size, static tab 34 | kstyle/breezestyle.cpp | 3801-3853 | +| header size | kstyle/breezestyle.cpp | 3856-3899 | +| item-view row size | kstyle/breezestyle.cpp | 3902-3916 | +| frames and line edits, neutral and focus outlines | kstyle/breezestyle.cpp | 3919-4085 | +| focus rectangle in views, Highlight lightened 110 | kstyle/breezestyle.cpp | 4087-4167 | +| menu frame for toolbars | kstyle/breezestyle.cpp | 4169-4192 | +| push and tool button frames, states | kstyle/breezestyle.cpp | 4511-4619 | +| menu panel, MenuOpacity, outline alpha 0.25 | kstyle/breezestyle.cpp | 4695-4727 | +| tooltip panel | kstyle/breezestyle.cpp | 4729-4744 | +| item-view selection, alpha 0.3, lighter 110, outline 1.0 / 0.8 | kstyle/breezestyle.cpp | 4746-4897 | +| check box and radio drawing | kstyle/breezestyle.cpp | 4900-4985 | +| menu item drawing, strong focus, separator, section, shortcut 0.7 | kstyle/breezestyle.cpp | 5951-6188 | +| progress bar, busy colours, groove WindowText 0.2 | kstyle/breezestyle.cpp | 6191-6306 | +| scroll-bar handle, alpha 0.7 + 0.3 | kstyle/breezestyle.cpp | 6339-6407 | +| focus frame annulus, radii 5 and 7, Highlight 0.3 | kstyle/breezestyle.cpp | 6614-6781 | +| header section drawing | kstyle/breezestyle.cpp | 6803-6894 | +| tab shapes | kstyle/breezestyle.cpp | 7175-7378 | +| combo box drawing | kstyle/breezestyle.cpp | 7813-7931 | +| spin box drawing and arrows | kstyle/breezestyle.cpp | 7933-7969, 8363-8409 | +| slider drawing | kstyle/breezestyle.cpp | 7971-8137 | +| scroll-bar separator, View Text at alpha fc | kstyle/breezestyle.cpp | 8213-8233 | +| scroll-bar, combo and spin sub-control rectangles | kstyle/breezestyle.cpp | 2970-3212 | +| slider sub-control rectangles | kstyle/breezestyle.cpp | 3253-3301 | +| progress groove and contents rectangles | kstyle/breezestyle.cpp | 2255-2339 | +| AnimationDurationFactor x 100 for QStyle animations | kstyle/breezestyle.cpp | 2070-2087 | +| scroll-bar button mapping 0 / 1 / other | kstyle/breezestyle.cpp | 2148-2213 | +| arrow shade 0.15, highlight alpha 0.3, sunken darkening 110 | kstyle/breezehelper.cpp | 38-42 | +| frame outline, focus and hover outlines, frame background, arrow colours | kstyle/breezehelper.cpp | 142-246 | +| slider outline, scroll handle colour, check-box mark colour, separator | kstyle/breezehelper.cpp | 248-332 | +| alpha multiply rule | kstyle/breezehelper.cpp | 349-356 | +| focus rectangle (stroked, radius 4.5, sides) | kstyle/breezehelper.cpp | 369-421 | +| frame rendering, menu frame (radius 5 with compositing) | kstyle/breezehelper.cpp | 475-611 | +| button frame: fills, pens, default button, shadow | kstyle/breezehelper.cpp | 647-740 | +| separator line | kstyle/breezehelper.cpp | 814-829 | +| check-box background and mark geometry | kstyle/breezehelper.cpp | 831-980 | +| radio background and dot | kstyle/breezehelper.cpp | 983-1078 | +| slider groove and handle | kstyle/breezehelper.cpp | 1081-1200 | +| progress groove and busy stripes | kstyle/breezehelper.cpp | 1204-1271 | +| scroll-bar handle radius, pen alpha fc, fill alpha 0.5 | kstyle/breezehelper.cpp | 1274-1296 | +| static tab and tab shapes, darker 120, hover alpha 0.2, 3 px bar | kstyle/breezehelper.cpp | 1299-1508 | +| arrow geometry | kstyle/breezehelper.cpp | 1511-1578 | +| button and ellipse shadows | kstyle/breezehelper.cpp | 1646-1690 | +| view item position sides | kstyle/breezehelper.cpp | 1692-1737 | +| stroked rectangle 0.5 inset | kstyle/breezehelper.cpp | 1747-1757 | +| item-view margins, first row, framed views, row selection | kstyle/breezehelper.cpp | 1759-1799 | +| frame radius 5 - pen / 2 with integer pen; shadow colour 0.125; frame bias = frameContrast | kstyle/breezehelper.h | 64-108, 340-363 | +| window shadow parameter table, fallback Large, strength / 255 | kstyle/breezeshadowhelper.cpp | 30-70, 175-237 | +| CSS blur semantics, box-blur extent formula | libbreezecommon/breezeboxshadowrenderer.cpp | 27-44, 57-92, 241-284 | +| animation steps quantisation | kstyle/animations/breezeanimationdata.h | 73-80 | +| engines use AnimationsDuration; busy uses ProgressBarBusyStepDuration | kstyle/animations/breezeanimations.cpp | 48-82 | +| busy offset 0 to 28, looping | kstyle/animations/breezebusyindicatorengine.cpp | 85-104 | +| stock schemes | colors/BreezeLight.colors, colors/BreezeDark.colors, colors/BreezeClassic.colors | whole files | + +### o.9 QtQuick style and Kirigami + +| Value or rule | Repository @ tag | File | Lines | +|---|---|---|---| +| switch indicator size, track inset, radii, colours, motion | frameworks/qqc2-desktop-style @ v6.31.0 | org.kde.desktop/private/SwitchIndicator.qml | 12-94 | +| switch padding 1, spacing smallSpacing, label opacity 0.6 | frameworks/qqc2-desktop-style @ v6.31.0 | org.kde.desktop/Switch.qml | 25-26, 64-83 | +| slider handle size from the style | frameworks/qqc2-desktop-style @ v6.31.0 | org.kde.desktop/private/DefaultSliderHandle.qml | 16-48 | +| desktop durations from longDuration x factor, halving | frameworks/qqc2-desktop-style @ v6.31.0 | kirigami-plasmadesktop-integration/plasmadesktopunits.cpp | 18-55 | +| factor = max(0, AnimationDurationFactor), default 1 | frameworks/qqc2-desktop-style @ v6.31.0 | kirigami-plasmadesktop-integration/animationspeedprovider.cpp | 34-48 | +| gridUnit 18, spacings 4 / 6 / 8, durations, tooltip 700, corner 5 | frameworks/kirigami @ v6.31.0 | src/platform/units.cpp | 33-49 | +| icon sizes 16 / 22 / 32 / 48 | frameworks/kirigami @ v6.31.0 | src/platform/units.cpp | 297-345 | +| heading factors 1.35 / 1.20 / 1.15 / 1.10, DemiBold, 0.75 | frameworks/kirigami @ v6.31.0 | src/controls/Heading.qml | 14-37 | + +### o.10 Fonts (font files) + +| Value | Source | Location | +|---|---|---| +| Noto Sans upem 1000, hhea 1069 / -293 / 0, typo-metrics flag, Windows 1124 / 395 | NotoSans-v2.015, `NotoSans[wdth,wght].ttf` (full and unhinted) | head, hhea, OS/2 tables | +| Hack upem 2048, hhea 1901 / -483 / 0, OS/2 typo 1556 / -492 / 410, advance 1233 | Hack v3.003, `Hack-Regular.ttf`, `Hack-Bold.ttf` | head, hhea, OS/2, hmtx tables | + +Font archive hashes: `Hack-v3.003-ttf.zip` +0c2604631b1f055041c68a0e09ae4801acab6c5072ba2db6a822f53c3f8290ac; +`NotoSans-v2.015.zip` +0c34df072a3fa7efbb7cbf34950e1f971a4447cffe365d3a359e2d4089b958f5; +`Hack-Regular.ttf` +15f55cc0c85a2988d2b4b3a8cdb5d77fdfbaf319e1bb5309d725db9818fb7125; +`NotoSans[wdth,wght].ttf` (full) +ae80a5e79e4afbf493e9f4684ec4988e6a861b3598102ee48950b4b7a754cdff. + +### o.11 Fixture hashes (vendored, LGPL-2.0-or-later) + +| File (breeze @ v6.8.0) | sha256 | +|---|---| +| colors/BreezeLight.colors | c46470b75e7df3e1ebff344748b92347f8d5adfa306aef9c91c4d2edae2cd6df | +| colors/BreezeDark.colors | 11fce1d8ab97b529162e50eb200d1a93fab65c7612f9bebd0230a6a348d0cc21 | +| colors/BreezeClassic.colors | 19dcbd1883c03d2d9e0176a39e3ec9df6c18d6e22f0474e6c886aa20aff76508 | + +### o.12 Qt behaviour relied on + +| Behaviour | Reference | Status | +|---|---|---| +| 16-bit channel storage, single-precision float accessors, Q16 on store | Qt 6 docs, the colour class (channel accessors, float API); qtbase src/gui/painting/qcolor.cpp 1315-1338 | [measured-qt]: every `u16` of `math.json` and `resolve.json` reproduced | +| 8-bit accessors round `q / 257` (a.3) | qtbase src/gui/painting/qdrawhelper_p.h 886-887, qcolor.cpp 1526-1530 | [measured-qt]: all 65536 values, and every `hex` field | +| hex, SVG-name and `transparent` colour parsing; 9- and 12-digit forms | Qt 6 docs, the colour class, parsing a colour from a string | [qt]; widths [measured-qt] (`math.json` `qt_color_text`) | +| lighter / darker via HSV value, factor rules, HSV conversions (d.11) | Qt 6 docs, the colour class, lighter and darker; qtbase src/gui/painting/qcolor.cpp 2040-2110, 2181-2225, 2805-2862 | [measured-qt] (`math.json` `qt_lighter_darker`, 1736 records exact) | +| gray value (11 r + 16 g + 5 b) / 32 | Qt docs, qGray | [qt] | +| font string field layout and weight scales | Qt docs, QFont::toString, QFont::fromString, QFont::Weight | [qt] | +| legacy weight nearest-neighbour mapping, ties to the lighter weight | Qt docs, QFont::Weight (Qt 5 and Qt 6 values) | [qt]; all 100 legacy values [measured-qt] (`sizes.json` `legacy_font_weights`) | +| font line height: integer pixel size, ascent and descent rounded separately (l.2) | `sizes.json` font records | [measured-qt] | +| sRGB curve constants, inverse curve, matrix M, float storage (d.15) | Qt 6 docs, the colour-space class (sRGB and linear sRGB) and its transform; qtbase src/gui/painting/qcolortransferfunction_p.h 54-112, qcolorspace.cpp 40-45, 89-106, 353-365, 483-493, qcolormatrix_p.h 32-76, 232-270, 288-312, qcolortransform.cpp 241-272, 1781-1812, qcolortrc_p.h 67-108 | [measured-qt] (`math.json` `qt_colorspace`, 1146 results exact) | +| out-of-range float colours held in half precision, clamped on conversion | Qt 6 docs, the colour class, extended RGB specification; qcolor.cpp 1315-1332 | [measured-qt] (`math.json` `qt_extended`) | +| smoothed animation curve, default velocity 200, shorter of velocity and duration | Qt docs, SmoothedAnimation | [qt] | +| default animation easing linear | Qt docs, QVariantAnimation | [qt] | +| tooltip label margin = 1 + frame width | Qt widgets tooltip behaviour | [measured-qt] (`sizes.json` `tooltip`: margin 4, hint height 26 for an 18 px line) | +| line edit inner height max(fm height, 14) + 2 | Qt widgets line edit size hint | [measured-qt] (`sizes.json`: framed 32, frameless 20 at 10 pt) | +| progress bar hint height fm height + 8 | Qt widgets progress bar size hint | [measured-qt] (`sizes.json`: 26 at 10 pt, 23 at 8 pt) | +| XDG_*_DIRS defaults, relative entries ignored | Qt docs, QStandardPaths; XDG Base Directory specification | [qt] | diff --git a/tools/kde_golden/.dockerignore b/tools/kde_golden/.dockerignore new file mode 100644 index 000000000..29a54a3b7 --- /dev/null +++ b/tools/kde_golden/.dockerignore @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: MPL-2.0 +# SPDX-FileCopyrightText: 2026 FernTech +vectors +*.md diff --git a/tools/kde_golden/Dockerfile b/tools/kde_golden/Dockerfile new file mode 100644 index 000000000..529dcf560 --- /dev/null +++ b/tools/kde_golden/Dockerfile @@ -0,0 +1,55 @@ +# SPDX-License-Identifier: MPL-2.0 +# SPDX-FileCopyrightText: 2026 FernTech +# +# Reference ("oracle") environment for the KDE Breeze preset: KDE neon User +# Edition on Ubuntu 24.04, upgraded to Plasma 6.8 and Frameworks 6.31 from +# neon's user archive. See README.md for the versions it produced and why the +# upgrade step cannot be pinned more tightly than major.minor. +# +# Nothing here runs in CI. Build and run it through run.sh. + +# invent-registry.kde.org/neon/docker-images/plasma:user, pulled 2026-10-16. +# That tag shipped Plasma 6.7.4 and Frameworks 6.29; the upgrade below brings +# it to 6.8 / 6.31. +FROM invent-registry.kde.org/neon/docker-images/plasma@sha256:f58f9b97f218ee976cf928f6fe00abb929a644aded8c9dfb02f77a9b2a6e1732 + +USER root +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update \ + && apt-get full-upgrade -y \ + && apt-get install -y --no-install-recommends \ + cmake g++ make extra-cmake-modules \ + qt6-base-dev libkf6colorscheme-dev libkf6guiaddons-dev libkf6config-dev \ + kde-style-breeze kde-style-oxygen plasma-workspace \ + fonts-noto-core fonts-hack \ + python3 dbus \ + && rm -rf /var/lib/apt/lists/* + +# Refuse an image that did not reach the versions the vectors are meant to +# describe. neon keeps only the newest build of each package, so a rebuild +# months from now can land on 6.8.N or 6.32: the check pins major.minor and +# versions.txt records exactly what was installed. +RUN set -e; \ + v() { dpkg-query -W -f='${Version}' "$1"; }; \ + case "$(v plasma-workspace)" in 4:6.8.*) ;; *) echo "plasma-workspace $(v plasma-workspace) is not 6.8.x" >&2; exit 1;; esac; \ + case "$(v kde-style-breeze)" in 4:6.8.*) ;; *) echo "kde-style-breeze $(v kde-style-breeze) is not 6.8.x" >&2; exit 1;; esac; \ + case "$(v kf6-kcolorscheme)" in 6.31.*) ;; *) echo "kf6-kcolorscheme $(v kf6-kcolorscheme) is not 6.31.x" >&2; exit 1;; esac; \ + case "$(v kf6-kguiaddons)" in 6.31.*) ;; *) echo "kf6-kguiaddons $(v kf6-kguiaddons) is not 6.31.x" >&2; exit 1;; esac; \ + mkdir -p /opt/kde_golden; \ + dpkg-query -W -f='${Package}\t${Version}\n' \ + plasma-workspace kde-style-breeze breeze kde-style-oxygen \ + kf6-kcolorscheme kf6-kguiaddons kf6-kconfig libkf6colorscheme-dev \ + qt6-base fonts-noto-core fonts-hack \ + | sort > /opt/kde_golden/versions.txt; \ + sha256sum /usr/share/fonts/truetype/noto/NotoSans-Regular.ttf \ + /usr/share/fonts/truetype/hack/Hack-Regular.ttf \ + >> /opt/kde_golden/fonts.sha256; \ + cat /opt/kde_golden/versions.txt + +COPY driver/ /opt/kde_golden/driver/ +RUN cmake -S /opt/kde_golden/driver -B /opt/kde_golden/build -DCMAKE_BUILD_TYPE=Release \ + && cmake --build /opt/kde_golden/build -j"$(nproc)" + +USER neon +WORKDIR /home/neon diff --git a/tools/kde_golden/README.md b/tools/kde_golden/README.md new file mode 100644 index 000000000..f7230c9d4 --- /dev/null +++ b/tools/kde_golden/README.md @@ -0,0 +1,406 @@ + + + +# kde_golden: reference data from a real KDE Plasma + +This directory produces the reference ("oracle") vectors that the KDE Breeze +preset (`teksilo-kde-scheme`, `teksilo-theme-kde`) is tested against. The +vectors come from a real KDE Plasma 6.8 / Frameworks 6.31 installation running +in Docker, driven by a small C++ program that calls only public Qt 6 and KDE +Frameworks 6 API, plus the `plasma-apply-colorscheme` command-line tool. + +- **Nothing here runs in CI.** The vectors are generated on a maintainer + machine with `run.sh` and committed. +- **Nothing here is packaged.** `tools/` sits outside every crate directory, + so no `cargo package` can include it (the planned package-size guard also + asserts that tools and vectors are absent from the `.crate` files). +- **No KDE source and no `.colors` file is in this directory.** The image has + the installed files; the driver and the scripts read them at run time. The + vectors embed the *parsed key/value pairs* of each input scheme so a test + never needs the file. Those values come from files under their own licences: + `BreezeLight.colors` and `BreezeDark.colors` carry + `LGPL-2.0-or-later` headers; `BreezeClassic.colors` (package + `kde-style-breeze`) and the Oxygen files (package `kde-style-oxygen`) carry + no SPDX header, see their Debian copyright files in the image. + +## Files + +| File | What | +|---|---| +| `Dockerfile` | the image: KDE neon pinned by digest, upgraded to Plasma 6.8 / KF 6.31, build deps, the driver built in | +| `driver/` | the MPL-2.0 C++ driver (`kde_golden`), CMake project | +| `run.sh` | on the host: builds the image, runs itself inside it, writes `vectors/` | +| `accent_oracle.sh` | inside the container: `plasma-apply-colorscheme -a` cases into `vectors/accent.json` | +| `vectors/math.json` | `KColorUtils` and static `KColorScheme::shade` over a lattice, plus the Qt colour behaviour they rest on | +| `vectors/resolve.json` | `KColorScheme` and `createApplicationPalette` over 13 schemes | +| `vectors/sizes.json` | Breeze `QStyle` metrics, `sizeFromContents`, sub-rects, widget `sizeHint` at 6 font sizes | +| `vectors/pixels.json` | Breeze-painted controls sampled along fixed lines, Light and Dark | +| `vectors/accent.json` | `kdeglobals` written by `plasma-apply-colorscheme` for 40 scheme x accent cases | +| `vectors/versions.txt` | `dpkg-query` package/version list from the image | +| `vectors/fonts.sha256` | sha256 of the Noto Sans and Hack faces the image measured with | + +## Provenance + +**Base image.** `invent-registry.kde.org/neon/docker-images/plasma:user`, +pulled 2026-10-16, pinned by digest: + +``` +invent-registry.kde.org/neon/docker-images/plasma@sha256:f58f9b97f218ee976cf928f6fe00abb929a644aded8c9dfb02f77a9b2a6e1732 +``` + +That tag (image created 2026-09-10) ships KDE neon User Edition on Ubuntu +24.04 with Plasma 6.7.4, Frameworks 6.29 and Qt 6.11.1. No published neon image +had Plasma 6.8 yet, so the Dockerfile runs `apt-get full-upgrade` against +neon's user archive (`http://archive.neon.kde.org/user`, suite `noble`), which +on 2026-10-16 carried Plasma 6.8.0 and Frameworks 6.31.0. + +**Versions obtained** (also in `vectors/versions.txt` and in every file's +`meta.packages`): + +| Package | Version | +|---|---| +| plasma-workspace | 4:6.8.0-0zneon+24.04+noble+release+build99 | +| kde-style-breeze | 4:6.8.0-0zneon+24.04+noble+release+build80 | +| breeze | 4:6.8.0-0zneon+24.04+noble+release+build80 | +| kde-style-oxygen | 4:6.8.0-0zneon+24.04+noble+release+build59 | +| kf6-kcolorscheme | 6.31.0-0zneon+24.04+noble+release+build47 | +| kf6-kguiaddons | 6.31.0-0zneon+24.04+noble+release+build59 | +| kf6-kconfig | 6.31.0-0zneon+24.04+noble+release+build36 | +| qt6-base | 6.11.1-0zneon+24.04+noble+release+build162 | +| fonts-noto-core | 20201225-2 (Ubuntu) | +| fonts-hack | 3.003-3 (Ubuntu) | + +The driver reports the same at run time: `qt_runtime` 6.11.1, +`kcolorscheme_build` and `kguiaddons_build` 6.31.0. + +**Reproducibility.** Two consecutive `run.sh` runs produce byte-identical +vectors. A rebuild later may not reach the same packages: neon keeps only the +newest build of each package, so the upgrade step cannot be pinned more tightly +than the Dockerfile's check (Plasma 6.8.x, Frameworks 6.31.x; the build fails +otherwise). Compare `vectors/versions.txt` before and after a regeneration. + +**Run environment** (set by `run.sh --inside`): + +- `QT_QPA_PLATFORM=offscreen`; no platform theme (`QT_QPA_PLATFORMTHEME`, + `QT_STYLE_OVERRIDE`, `KDE_FULL_SESSION`, `DISPLAY` unset); `LC_ALL=C.UTF-8`. +- Every step gets fresh scratch `HOME`, `XDG_CONFIG_HOME`, `XDG_DATA_HOME`, + `XDG_CACHE_HOME`, `XDG_RUNTIME_DIR`, and an **empty** `XDG_CONFIG_DIRS`, so + `/etc/xdg` is never read. `XDG_DATA_DIRS=/usr/local/share:/usr/share` (where + the installed schemes live). No `breezerc` exists, so the Breeze style runs on + its defaults. +- The offscreen screen reports logical DPI 96, physical DPI 100, device pixel + ratio 1. +- Fonts: Noto Sans and Hack from the Ubuntu packages above (sha256 in + `vectors/fonts.sha256`). Teksilo's bundled faces may be newer releases. + +## Regenerating + +```bash +tools/kde_golden/run.sh +``` + +It needs docker without sudo and network access to the two registries. It +never touches the host's KDE configuration: everything runs in the container +as the invoking uid, with scratch XDG directories, and writes only +`tools/kde_golden/vectors/`. `accent_oracle.sh` additionally refuses to run +unless `XDG_CONFIG_HOME` and `XDG_DATA_HOME` are set, absolute, and each either +empty or marked with a `.kde_golden_scratch` file, because +`plasma-apply-colorscheme` rewrites `kdeglobals`. Never run either script +outside the container. + +## Encodings shared by every file + +**Input colour** (a string): `"#rrggbbaa"`, 8 bits per channel. The driver +builds it with `QColor::fromRgb(r, g, b, a)`, so its 16-bit value is exactly +`v * 257`. + +**Output colour** (an object): + +```json +{"hex": "#rrggbbaa", "u16": [r, g, b, a]} +``` + +- `u16`: the QColor's own 16-bit channels (`QColor::rgba64()`), 0..65535. This + is exact: QColor stores RGB colours as 16-bit integers, so any floating + result KColorUtils or KColorScheme computes has already been quantised to 16 + bits by QColor before it reaches the file. +- `hex`: Qt's 8-bit accessors (`red()`, `green()`, `blue()`, `alpha()`), which + round the 16-bit value divided by 257 to the nearest integer + (`floor((q + 128) / 257)`; checked on all 65536 values). +- `spec` and `f` (four exact doubles) appear only when the colour is not stored + as `QColor::Rgb`. Only `math.json`'s `qt_colorspace` and `qt_extended` + members contain such colours (`ExtendedRgb`, held in half precision). +- `{"valid": false}` is an invalid QColor (for example an empty value in a + scheme file). + +**Scalars** (luma, contrast ratios, HCY components, amounts) are JSON numbers +written by `QJsonDocument` with the shortest decimal that round-trips the +double, so parsing them as `f64` gives back the exact value. `1.0` may appear +as `1`. + +**Rectangles and sizes**: `[x, y, width, height]` and `[width, height]`, in +logical pixels (device pixel ratio 1). + +**Line layout.** Each file is one JSON object. Arrays that hold records are +written one record per line, so a regeneration diffs line by line. Object keys +inside a record are sorted. + +**Comparing from Rust.** Colours: compare `u16` exactly, or allow 1 unit per +channel where an implementation quantises at a different step, and require +`hex` to be equal. Scalars: within 1e-6. + +Every file starts with `meta`: + +| Field | Meaning | +|---|---| +| `kind` | `math`, `resolve`, `sizes`, `pixels` or `accent` | +| `generator` | what wrote it | +| `image` | base image reference with digest | +| `packages` | package name to version, from `/opt/kde_golden/versions.txt` | +| `qt_runtime`, `qt_build` | Qt version at run time and at build time (driver files only) | +| `kcolorscheme_build`, `kguiaddons_build` | KF versions the driver was built against (driver files only) | +| `readme` | pointer to this file | + +## `math.json` + +Calls `KColorUtils::{luma, hue, chroma, getHcy, hcyColor, contrastRatio, +lighten, darken, shade, tint, mix, overlayColors}` and the static +`KColorScheme::shade(color, role, contrast, chromaAdjust)`. + +| Member | Content | +|---|---| +| `colors` | the 62 input colours (black, white, greys around the ends and around 0x7f/0x80, primaries, secondaries, half and pastel variants, near-grey and near-black/white values, colours from the Breeze schemes, the Plasma accent swatches, 4 translucent colours) | +| `pair_colors` | the 17-colour subset used for two-colour operations | +| `single` | one record per `colors` entry: `in`, `luma`, `hue`, `chroma`, `hcy` = `[h, c, y, a]` from `getHcy`, `roundtrip` = colour from `hcyColor(h, c, y, a)` | +| `contrast_ratio` | `a` (each of `pair_colors`) x `b` (each of `colors`): `out` = `contrastRatio(a, b)` | +| `lighten` | `in` x `amount` in {-0.5, 0, 0.1, 0.25, 0.5, 0.75, 0.9, 1, 1.5} x `gain` in {0, 0.5, 1, 2}: `out` = `lighten(in, amount, gain)` (gain is `chromaInverseGain`) | +| `darken` | same lattice: `out` = `darken(in, amount, gain)` (gain is `chromaGain`) | +| `shade` | `in` x `luma` in {-1.5, -1, -0.5, -0.1, 0, 0.1, 0.5, 1, 1.5} x `chroma` in {-1, 0, 0.5, 1}: `out` = `shade(in, luma, chroma)` | +| `tint` | `base` x `color` (both `pair_colors`) x `amount` in {-0.5, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 1, 1.5}: `out` = `tint(base, color, amount)` | +| `mix` | `c1` x `c2` (both `pair_colors`) x `bias` in {-0.5, 0, 0.1, 0.25, 0.5, 0.75, 0.9, 1, 1.5}: `out` = `mix(c1, c2, bias)` | +| `overlay` | `base` x `paint` (both `pair_colors`) x `mode` in {`SourceOver`, `Multiply`, `Screen`}: `out` = `overlayColors(base, paint, mode)` | +| `hcy_color` | `h` in {-0.25, 0, 0.1, 1/6, 0.5, 0.9, 1, 1.25} x `c` in {-0.5, 0, 0.25, 0.5, 1, 1.5} x `y` in {-0.1, 0, 0.1, 0.5, 0.9, 1, 1.1} x `a` in {1, 0.5}: `out` = `hcyColor(h, c, y, a)` | +| `scheme_shade` | `in` x `role` (`Light`, `Midlight`, `Mid`, `Dark`, `Shadow`) x `contrast` in {-1, 0, 0.4, 0.7, 1, 1.5} x `chroma` in {0, 0.5}: `out` = `KColorScheme::shade(in, role, contrast, chroma)` | +| `qt_lighter_darker` | `in` (each of `colors`) x `factor` in {-10, 0, 1, 50, 99, 100, 101, 102, 110, 120, 150, 200, 300, 1000} x `op` in {`lighter`, `darker`}: `out` = `QColor::lighter(factor)` / `darker(factor)` | +| `qt_colorspace` | `in` = each of `colors`, the 256 greys and the reds `#010000` to `#ff0000`: `to_linear` and `from_linear` = Qt's `QColorTransform` from `QColorSpace::SRgb` to `SRgbLinear` and back, applied to the `QColor` | +| `qt_extended` | `in` = three floats, some outside 0..1: `stored` = `QColor::fromRgbF(in)` (an `ExtendedRgb` colour, with its half-precision values in `f`), `to_rgb` = its `toRgb()` | +| `qt_color_text` | `in` = a colour string: `out` = `QColor::fromString(in)` (hex forms of 3, 6, 8, 9 and 12 digits, invalid lengths, names in several cases, `transparent`, unknown names, an empty string) | + +Out-of-range amounts are deliberate: they pin the clamping behaviour. + +## `resolve.json` + +| Member | Content | +|---|---| +| `missing_installed` | installed schemes the image lacked (empty in this run) | +| `schemes` | one record per scheme, one per line | + +Each scheme record: + +| Field | Meaning | +|---|---| +| `name` | scheme name | +| `origin` | `installed` (read from `/usr/share/color-schemes/`) or `synthetic` (written by the driver) | +| `source` | installed only: the file path in the image | +| `purpose`, `source_text` | synthetic only: what the scheme isolates, and its complete file text (MPL-2.0, original values) | +| `sha256` | sha256 of the scheme file as read; for the Breeze files it identifies the upstream file to vendor as a fixture | +| `input` | the parsed scheme: group name to `{key: value}`. Nested groups are spelled as in the file, `"Colors:Header][Inactive"`. Values are KConfig's parsed strings (surrounding whitespace removed; for a duplicated key or group, what KConfig kept). Localised keys (`Name[de]`) are reduced to the untranslated value | +| `contrastF` | `KColorScheme::contrastF(config)` | +| `frameContrast` | `KColorScheme::frameContrast(config)` | +| `set_supported` | set name to `KColorScheme::isColorSetSupported(config, set)` | +| `sets` | set name (`View`, `Window`, `Button`, `Selection`, `Tooltip`, `Complementary`, `Header`) to state (`Active`, `Inactive`, `Disabled`) to the four role groups below | +| `palette` | state to QPalette role name to colour, from `KColorScheme::createApplicationPalette(config)`; roles are every `QPalette::ColorRole` below `NColorRoles` except `NoRole` (Qt 6.11 includes `Accent`) | + +Role groups inside `sets..`, each from +`KColorScheme(state, set, config)`: + +| Group | Keys | Call | +|---|---|---| +| `background` | `Normal`, `Alternate`, `Active`, `Link`, `Visited`, `Negative`, `Neutral`, `Positive` | `background(role).color()` | +| `foreground` | `Normal`, `Inactive`, `Active`, `Link`, `Visited`, `Negative`, `Neutral`, `Positive` | `foreground(role).color()` | +| `decoration` | `Focus`, `Hover` | `decoration(role).color()` | +| `shade` | `Light`, `Midlight`, `Mid`, `Dark`, `Shadow` | `shade(role)` | + +Config objects are opened with `KSharedConfig::openConfig(path, +KConfig::SimpleConfig)`, so nothing cascades into them. + +Schemes, in file order: `BreezeLight`, `BreezeDark`, `BreezeClassic`, +`Oxygen`, `OxygenCold`, `OxygenDark` (installed), then the synthetic +`SyntheticNoHeader` (no Header group, no effect groups), +`SyntheticInactiveEffects` (dark, Header without an Inactive subgroup, Inactive +effects enabled with the selection change, every effect kind with non-zero +amounts, `contrast=2`, `frameContrast=0.35`), `SyntheticInactiveSubgroups` +(Inactive effects without the selection change, explicit Inactive subgroups for +Header, View and a partial one for Window), `SyntheticAccentKeys` (the +`[General]` accent keys and a `[WM]` group, few sets), `SyntheticEmpty` (an +empty file), `SyntheticMalformed` (hex, alpha, spaces, a named colour, too +few components, out-of-range components, an empty value, `contrast=15`, an +out-of-range effect id, a duplicated key and a duplicated group) and +`SyntheticValueForms` (an empty boolean, `[ColorEffects:Inactive] Enable=`; +a signed component; 3-, 9- and 12-digit hex; names in other cases; +`transparent`; a trailing comma; a hex component; the unknown CSS name +`rebeccapurple`). + +Behaviours these record, for orientation (the data is the authority): +a duplicated key keeps the last value; a duplicated group merges, later values +winning; an empty colour value resolves to an invalid colour; an empty +boolean reads as true; `contrastF` is +not clamped (1.5 for `contrast=15`); the `[General]` accent keys do not reach +KColorScheme; Header falls back to Window when the scheme has no Header group. + +## `sizes.json` + +All values come from the Breeze style (`QStyleFactory::create("Breeze")`, +installed as the application style) under the offscreen platform, with the +default `kdeglobals` set to BreezeLight. Every measured widget except a `QMenu` +is created hidden with a plain `QWidget` parent (Breeze answers some metrics +differently for a top-level window) and polished before it is measured. + +| Member | Content | +|---|---| +| `environment` | `style`, `platform`, `logical_dpi`, `physical_dpi`, `device_pixel_ratio`, the Qt default font before the driver overrides it, and a note on parenting | +| `pixel_metrics` | every `QStyle::PixelMetric` name to `pixelMetric(pm, nullptr, nullptr)` | +| `widget_pixel_metrics` | widget class to the pixel metrics whose value changes when the style is given that widget and an option `initFrom` it (only the differing ones; `{}` means none differ). Key example: `QLineEdit.PM_DefaultFrameWidth` is 6 while the widget-less answer is 0 | +| `style_hints` | every `QStyle::StyleHint` name to `styleHint(sh, nullptr, nullptr, nullptr)` | +| `sub_rects` | sub-control and sub-element rectangles at the 10 pt font, keyed by control; each object has the input `rect` plus one rectangle per sub-control, and extra inputs (`range`, `page_step`, `value`) where relevant. Controls: combo box (normal and editable, 150 x 32), spin box (100 x 32), vertical scroll bar at values 0, 50, 100 (`PM_ScrollBarExtent` x 200, range 0..100, page 20), horizontal slider with ticks 0 (none), 2 (below), 3 (both) at 200 wide and value 30, check box and radio (at their size hint), push button, line edit, progress bar (200 wide), item-view item (200 x 24, check + icon + text), tab (80 x 30) | +| `size_from_contents` | records `{id, option, contents, out}`: `out` = `sizeFromContents(type, option, contents, widget)` for content sizes [0,0], [20,16], [60,18], [100,24], [100,32]. `id` is the contents type plus a variant; `option` lists the option fields set beyond `initFrom(widget)` (enum values are Qt's integers: `type` is `QStyleOptionMenuItem::MenuItemType`, `check_type` is `CheckType`, `shape` is `QTabBar::Shape`, `orientation` is `Qt::Orientation`, `ticks` is `QSlider::TickPosition`) | +| `monospace_fonts` | font records for Hack at 9, 10, 11 pt | +| `fonts` | font records for Noto Sans at 10, 8, 9, 11, 12, 14 pt (the order the driver measured them) | +| `widgets` | widget records, one per widget per font | +| `legacy_font_weights` | `legacy` 0..99 in field 4 of a Qt 5 font string (`Noto Sans,10,-1,5,W,0,0,0,0,0`): `weight` = the OpenType weight of `QFont::fromString` | +| `tooltip` | the label `QToolTip::showText` shows for "Tooltip text" at Noto Sans 10 pt: its class, `margin`, `contents_margins`, `size_hint` and the text's `QFontMetrics::size` | + +A **font record**: `requested_family`, `requested_point_size`, +`resolved_family`, `resolved_style`, `resolved_point_size`, +`resolved_pixel_size`, `exact_match` (from `QFontInfo`), `to_string` +(`QFont::toString`), `metrics` (integer `QFontMetrics`: `height`, `ascent`, +`descent`, `leading`, `line_spacing`, `x_height`, `cap_height`, +`average_char_width`, `max_width`), `metrics_f` (the same from +`QFontMetricsF`), `advance` (string to `[QFontMetrics::horizontalAdvance, +QFontMetricsF::horizontalAdvance]`). At 96 DPI Noto Sans 10 pt resolves to a +13 px face (`resolved_point_size` 9.75, `exact_match` false) whose +`QFontMetrics::height` is 18. + +A **widget record**: + +| Field | Meaning | +|---|---| +| `id` | what was measured; a suffix names the variant (`push_button.default`, `tool_button.auto_raise.22`, ...). Several records can share an `id` when only `config` differs (the three `push_button` texts) | +| `class` | the Qt class | +| `font` | `"Noto Sans "`, the application font at measurement | +| `config` | the properties set on the widget (text, icon, flags; enum values as Qt integers: `style` is `Qt::ToolButtonStyle`, `popup_mode` is `QToolButton::ToolButtonPopupMode` or -1 for no menu, `shape` is `QTabBar::Shape`) | +| `size_hint`, `minimum_size_hint` | `QWidget::sizeHint()` and `minimumSizeHint()`; `[-1, -1]` is Qt's invalid size | +| `rows` | menus only: one entry per action, `{kind, text, icon, geometry}`, `kind` in `item`, `shortcut`, `separator`, `section`, `checkable`, `submenu`, `geometry` = `QMenu::actionGeometry` | +| `tab_rects` | tab bars only: `QTabBar::tabRect(i)` after `resize(sizeHint())`, tabs "Tab", "Second tab", "Third", `expanding` off | +| `section_size_hint`, `default_section_size`, `minimum_section_size` | headers: `QHeaderView` values for sections 0 and 1 of a two-column model ("Name", "Size") | +| `size_hint_for_row` | item views: `QAbstractItemView::sizeHintForRow(0)` for a two-row model, with a 16 px icon (`.icon`) or a check box (`.check`) | +| `indentation`, `header_height` | tree views: `QTreeView::indentation()` and its header's size hint height | + +Icons are a solid 64 x 64 pixmap scaled by Qt to the requested icon size. + +## `pixels.json` + +Controls painted by the Breeze style with a hand-built `QStyleOption` and **no +widget** (so no animation engine runs and window activation is explicit), into +a `QImage::Format_ARGB32` image of the given size that is first filled opaque +with the palette's background colour. No text, icon or label is painted: +these vectors pin chrome, not glyph rasterisation. + +The palette is `KColorScheme::createApplicationPalette` of the process's +`kdeglobals`, which `run.sh` sets to the scheme being sampled; the Breeze style +also reads its hover and focus colours from that `kdeglobals`. The font is +Noto Sans 10 pt. + +| Member | Content | +|---|---| +| `schemes` | `BreezeLight` and `BreezeDark`, each `{environment, records}` | +| `schemes..environment` | `scheme`, `kdeglobals_color_scheme` (what the style saw), `style`, `platform`, `image_format` | +| `schemes..records` | one record per painted control state, one per line | + +A record: + +| Field | Meaning | +|---|---| +| `id` | control and state, `push_button.hover` | +| `control` | the QStyle element painted (`CE_PushButtonBevel`, `CC_ComboBox`, `PE_PanelItemViewItem`, ...) | +| `state` | `name`; `flags`, the extra `QStyle::State` bits as an integer (`State_Enabled` is added unless `group` is `Disabled`, `State_Active` unless `group` is `Inactive`); `group`, the palette colour group (`Active`, `Inactive`, `Disabled`); and per-control inputs (`features` = `QStyleOptionButton::ButtonFeatures`, `editable`, `value`, `handle_rect`, `slider_rect`, `active_sub_control`, `type`, `document_mode`, `line_width`) | +| `size` | `[width, height]` of the image, which is also the option rectangle | +| `background` | the fill colour painted first (`Window`, or `Base` for header and item-view rows, `ToolTipBase` for the tooltip) | +| `rows` | y (as a string) to the run-length-encoded row of pixels at that y | +| `cols` | x (as a string) to the run-length-encoded column at that x | + +Run-length encoding: a list of `[start, length, "#rrggbbaa"]`, covering the +whole line in order. All pixels are opaque. + +Sampled lines per control are chosen to cross the outline, the fill and the +indicator: the outer two or three rows and columns, the centre, and for +sliders and scroll bars the line through the handle (its rectangle is in +`state`). Controls: push button (normal, hover, focus, pressed, default, +disabled, inactive window, flat, flat hover; 84 x 34), auto-raise tool button +(normal, hover, pressed, checked, framed; 28 x 28), line edit panel (normal, +hover, focus, disabled; 150 x 32, frame width from a real `QLineEdit`), check +box indicator (off, on, partial, hover, focus, pressed, disabled), radio +indicator (off, on, hover, focus, disabled), combo box (normal, hover, focus, +editable), spin box (normal, hover), slider (normal, handle hover, focus, +disabled; value 30), vertical scroll bar (normal, hover, slider hover, slider +pressed; value 0, page 20), progress bar at 50 %, menu panel, menu item +(normal, selected, separator), tab shape (selected, unselected, hover, and +document mode), header section (normal, hover, sunken), item-view row +(normal, hover, selected, selected and hovered, selected in an inactive +window, focus), tooltip panel, styled frame, group box frame. + +## `accent.json` + +What `plasma-apply-colorscheme` writes to `kdeglobals`. Per case, in its own +scratch config directory and its own `dbus-run-session`: + +1. `kdeglobals` is seeded with only `[General] ColorScheme=KdeGoldenNone`, a + name no installed scheme has: the tool refuses to apply the scheme that is + already current, and an unset `ColorScheme` reads as `BreezeLight`; +2. `plasma-apply-colorscheme SCHEME` applies the scheme (snapshot `base`); +3. `plasma-apply-colorscheme -a ACCENT` applies the accent. With `-a` the tool + ignores a scheme argument and re-applies the *current* scheme with the + accent. + +Cases: the 10 Plasma swatches (`#e93a9a #e93d58 #e9643a #e8cb2d #3dd425 +#00d3b8 #3daee9 #b875dc #926ee4 #686b6f`) x 4 schemes: `BreezeLight`, +`BreezeDark`, `KdeGoldenTintLight` (BreezeLight plus `[General] +TintFactor=0.25`) and `KdeGoldenTitlebarDark` (BreezeDark plus `[General] +TitlebarIsAccentColored=true`). The two derived schemes are built in the +scratch data directory with `kwriteconfig6`, which also sets their `Name` and +`ColorScheme` to the derived name. + +| Member | Content | +|---|---| +| `meta` | `kind`, `generator`, `image`, `packages`, `procedure`, `readme` | +| `schemes` | scheme name to its record, one per line | +| `cases` | one record per case, one per line | + +A scheme record: + +| Field | Meaning | +|---|---| +| `origin` | `installed` or `derived` | +| `source` | the installed file path, or `derived (scratch data dir)` | +| `derived_from`, `changes` | derived only: the installed scheme and the `[General]` keys `kwriteconfig6` set | +| `sha1` | sha1 of the scheme file; the tool writes it to `[General] ColorSchemeHash` | +| `sha256` | sha256 of the scheme file | +| `input` | the scheme file parsed as group to `{key: raw value}` (localised `Name[xx]` keys dropped, `[$x]` flags kept in the key) | +| `base` | `kdeglobals` after step 2 (no accent), same parsing | +| `base_sha256` | sha256 of that file | +| `base_differs_between_cases` | present (true) only if step 2 ever produced a different file for the same scheme; absent in this run | + +A case record: + +| Field | Meaning | +|---|---| +| `scheme`, `accent` | the inputs; `accent` exactly as passed to `-a` | +| `commands` | the two invocations | +| `stdout` | the tool's message for step 3 | +| `kdeglobals` | `kdeglobals` after step 3, parsed as group to `{key: raw value}`; this is the byte-for-byte target for `with_accent` | +| `kdeglobals_sha256` | sha256 of that file | +| `config_files` | every file the tool left in the config directory (only `kdeglobals` in this run) | + +Behaviours these record, for orientation: the tool writes no `AccentColor` +key; `[General] ColorScheme` is removed when it equals the default +(`BreezeLight`); `[General] ColorSchemeHash` is the sha1 of the scheme file. diff --git a/tools/kde_golden/accent_oracle.sh b/tools/kde_golden/accent_oracle.sh new file mode 100755 index 000000000..450a8ccb7 --- /dev/null +++ b/tools/kde_golden/accent_oracle.sh @@ -0,0 +1,219 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# SPDX-FileCopyrightText: 2026 FernTech +# +# Accent oracle: what plasma-apply-colorscheme writes to kdeglobals when an +# accent colour is applied. Runs INSIDE the kde_golden container (run.sh +# calls it); never on a desktop, because the tool rewrites the user's +# kdeglobals. +# +# accent_oracle.sh OUT.json +# +# Requirements, checked before anything runs: +# - XDG_CONFIG_HOME and XDG_DATA_HOME are set, are directories, and are +# each either empty or marked as scratch by a .kde_golden_scratch file; +# - QT_QPA_PLATFORM=offscreen; +# - dbus-run-session and plasma-apply-colorscheme are installed. +# +# Procedure per case (one scheme, one accent), each in its own config dir +# under XDG_CONFIG_HOME: +# 1. kdeglobals is seeded with only "[General] ColorScheme=KdeGoldenNone", +# a name no installed scheme has, because the tool refuses to apply the +# scheme that is already current; +# 2. "plasma-apply-colorscheme SCHEME" applies the scheme (snapshot "base"); +# 3. "plasma-apply-colorscheme -a ACCENT" applies the accent to the current +# scheme (snapshot "kdeglobals"). With -a the tool ignores any scheme +# name argument and always uses the current scheme. +# Each command runs in its own dbus-run-session. + +set -euo pipefail + +out=${1:?usage: accent_oracle.sh OUT.json} + +die() { + echo "accent_oracle.sh: $*" >&2 + exit 1 +} + +check_scratch() { + local name=$1 dir=${!1:-} + [[ -n $dir ]] || die "$name is not set; refusing to touch a real configuration" + [[ -d $dir ]] || die "$name=$dir is not a directory" + [[ $dir == /* ]] || die "$name=$dir is not absolute" + if [[ -n $(ls -A "$dir") && ! -e $dir/.kde_golden_scratch ]]; then + die "$name=$dir is neither empty nor marked with .kde_golden_scratch; refusing" + fi + touch "$dir/.kde_golden_scratch" +} + +check_scratch XDG_CONFIG_HOME +check_scratch XDG_DATA_HOME +[[ ${QT_QPA_PLATFORM:-} == offscreen ]] || die "QT_QPA_PLATFORM must be offscreen" +command -v dbus-run-session >/dev/null || die "dbus-run-session is not installed" +command -v plasma-apply-colorscheme >/dev/null || die "plasma-apply-colorscheme is not installed" +command -v kwriteconfig6 >/dev/null || die "kwriteconfig6 is not installed" + +accents=(e93a9a e93d58 e9643a e8cb2d 3dd425 00d3b8 3daee9 b875dc 926ee4 686b6f) +work=$XDG_CONFIG_HOME +schemes_dir=$XDG_DATA_HOME/color-schemes +mkdir -p "$schemes_dir" + +# Two derived schemes, built in the scratch data dir from the installed files +# (never copied into the repository): one with a TintFactor, one with the +# title bar accent-coloured. +derive() { + local name=$1 from=$2 key=$3 value=$4 + cp "/usr/share/color-schemes/$from.colors" "$schemes_dir/$name.colors" + kwriteconfig6 --file "$schemes_dir/$name.colors" --group General --key Name "$name" + kwriteconfig6 --file "$schemes_dir/$name.colors" --group General --key ColorScheme "$name" + kwriteconfig6 --file "$schemes_dir/$name.colors" --group General --key "$key" "$value" +} +derive KdeGoldenTintLight BreezeLight TintFactor 0.25 +derive KdeGoldenTitlebarDark BreezeDark TitlebarIsAccentColored true + +schemes=(BreezeLight BreezeDark KdeGoldenTintLight KdeGoldenTitlebarDark) +manifest=$work/manifest.tsv +: >"$manifest" + +n=0 +for scheme in "${schemes[@]}"; do + for accent in "${accents[@]}"; do + n=$((n + 1)) + case_dir=$work/case-$(printf %02d "$n") + mkdir -p "$case_dir/config" + printf '[General]\nColorScheme=KdeGoldenNone\n' >"$case_dir/config/kdeglobals" + XDG_CONFIG_HOME=$case_dir/config dbus-run-session -- \ + plasma-apply-colorscheme "$scheme" >"$case_dir/apply.out" 2>"$case_dir/apply.err" || true + grep -q "Successfully applied the color scheme" "$case_dir/apply.out" || + die "applying $scheme failed: $(cat "$case_dir/apply.out" "$case_dir/apply.err")" + cp "$case_dir/config/kdeglobals" "$case_dir/base.kdeglobals" + XDG_CONFIG_HOME=$case_dir/config dbus-run-session -- \ + plasma-apply-colorscheme -a "#$accent" >"$case_dir/accent.out" 2>"$case_dir/accent.err" || true + grep -q "Successfully applied the accent color" "$case_dir/accent.out" || + die "accent #$accent on $scheme failed: $(cat "$case_dir/accent.out" "$case_dir/accent.err")" + printf '%s\t%s\t%s\n' "$scheme" "#$accent" "$case_dir" >>"$manifest" + done +done + +python3 -I - "$manifest" "$schemes_dir" "$out" <<'PY' +import hashlib, json, os, sys + +manifest, schemes_dir, out = sys.argv[1:4] + + +def parse(path): + """kdeglobals / .colors -> {group: {key: raw value}}, file order kept. + + Group headers like [Colors:Header][Inactive] become "Colors:Header][Inactive". + Keys keep any [$x] flags verbatim. Values are the raw text after the + first '=' (KConfig strips surrounding whitespace, and so does this). + Localised keys (Name[de]) are dropped: they carry translations only. + """ + groups, cur = {}, None + with open(path, encoding="utf-8") as f: + for line in f: + line = line.rstrip("\n") + s = line.strip() + if not s or s.startswith("#"): + continue + if s.startswith("[") and s.endswith("]"): + cur = s[1:-1] + groups.setdefault(cur, {}) + continue + if "=" not in s or cur is None: + continue + k, v = s.split("=", 1) + k, v = k.strip(), v.strip() + if "[" in k and "[$" not in k: + continue + groups[cur][k] = v + return groups + + +def digest(path, algo): + with open(path, "rb") as f: + return hashlib.new(algo, f.read()).hexdigest() + + +def read(path): + with open(path, encoding="utf-8", errors="replace") as f: + return f.read() + + +rows = [l.rstrip("\n").split("\t") for l in open(manifest, encoding="utf-8") if l.strip()] +schemes, cases = {}, [] +for scheme, accent, case_dir in rows: + if scheme not in schemes: + derived = os.path.join(schemes_dir, scheme + ".colors") + if os.path.exists(derived): + src, origin = derived, "derived" + else: + src, origin = "/usr/share/color-schemes/%s.colors" % scheme, "installed" + rec = { + "origin": origin, + "source": src if origin == "installed" else "derived (scratch data dir)", + "sha1": digest(src, "sha1"), + "sha256": digest(src, "sha256"), + "input": parse(src), + "base": parse(os.path.join(case_dir, "base.kdeglobals")), + "base_sha256": digest(os.path.join(case_dir, "base.kdeglobals"), "sha256"), + } + if scheme == "KdeGoldenTintLight": + rec["derived_from"] = "BreezeLight" + rec["changes"] = {"General": {"Name": scheme, "ColorScheme": scheme, "TintFactor": "0.25"}} + if scheme == "KdeGoldenTitlebarDark": + rec["derived_from"] = "BreezeDark" + rec["changes"] = {"General": {"Name": scheme, "ColorScheme": scheme, "TitlebarIsAccentColored": "true"}} + schemes[scheme] = rec + else: + # The no-accent snapshot must not depend on the case. + if parse(os.path.join(case_dir, "base.kdeglobals")) != schemes[scheme]["base"]: + schemes[scheme]["base_differs_between_cases"] = True + kg = os.path.join(case_dir, "config", "kdeglobals") + files = sorted( + os.path.relpath(os.path.join(dp, fn), os.path.join(case_dir, "config")) + for dp, _, fns in os.walk(os.path.join(case_dir, "config")) + for fn in fns + ) + cases.append({ + "scheme": scheme, + "accent": accent, + "commands": [["plasma-apply-colorscheme", scheme], ["plasma-apply-colorscheme", "-a", accent]], + "stdout": read(os.path.join(case_dir, "accent.out")).strip(), + "kdeglobals": parse(kg), + "kdeglobals_sha256": digest(kg, "sha256"), + "config_files": files, + }) + +versions = {} +try: + for l in open("/opt/kde_golden/versions.txt", encoding="utf-8"): + k, _, v = l.rstrip("\n").partition("\t") + if k: + versions[k] = v +except OSError: + pass + +meta = { + "kind": "accent", + "generator": "tools/kde_golden/accent_oracle.sh", + "image": os.environ.get("KDE_GOLDEN_IMAGE", "unknown"), + "packages": versions, + "procedure": "see accent_oracle.sh header and README.md", + "readme": "tools/kde_golden/README.md documents every field", +} + +with open(out, "w", encoding="utf-8") as f: + f.write("{\n") + f.write('"meta": %s,\n' % json.dumps(meta, sort_keys=True, ensure_ascii=False)) + f.write('"schemes": {\n') + names = list(schemes) + for i, name in enumerate(names): + f.write("%s: %s%s\n" % (json.dumps(name), json.dumps(schemes[name], ensure_ascii=False), "," if i + 1 < len(names) else "")) + f.write("},\n") + f.write('"cases": [\n') + for i, c in enumerate(cases): + f.write("%s%s\n" % (json.dumps(c, ensure_ascii=False), "," if i + 1 < len(cases) else "")) + f.write("]\n}\n") +PY +echo "accent_oracle.sh: wrote $out ($n cases)" diff --git a/tools/kde_golden/driver/CMakeLists.txt b/tools/kde_golden/driver/CMakeLists.txt new file mode 100644 index 000000000..af527d05a --- /dev/null +++ b/tools/kde_golden/driver/CMakeLists.txt @@ -0,0 +1,32 @@ +# SPDX-License-Identifier: MPL-2.0 +# SPDX-FileCopyrightText: 2026 FernTech +# +# Reference-data driver for tools/kde_golden. Built inside the Docker image +# (see ../Dockerfile); it links the distribution's KF6 and Qt 6 libraries and +# calls only their public API. + +cmake_minimum_required(VERSION 3.22) +project(kde_golden_driver LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_AUTOMOC OFF) + +find_package(ECM 6.0 REQUIRED NO_MODULE) +find_package(Qt6 6.6 REQUIRED COMPONENTS Core Gui Widgets) +find_package(KF6ColorScheme REQUIRED) +find_package(KF6GuiAddons REQUIRED) +find_package(KF6Config REQUIRED) + +add_executable(kde_golden + main.cpp + golden_json.cpp + math_vectors.cpp + resolve_vectors.cpp + size_vectors.cpp + pixel_vectors.cpp +) +target_link_libraries(kde_golden PRIVATE + Qt6::Core Qt6::Gui Qt6::Widgets + KF6::ColorScheme KF6::GuiAddons KF6::ConfigCore KF6::ConfigGui +) diff --git a/tools/kde_golden/driver/golden_json.cpp b/tools/kde_golden/driver/golden_json.cpp new file mode 100644 index 000000000..90e250e05 --- /dev/null +++ b/tools/kde_golden/driver/golden_json.cpp @@ -0,0 +1,158 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +#include "golden_json.h" + +#include +#include +#include +#include +#include + +#include +#include + +#include + +namespace golden { + +QString hex8(const QColor &c) +{ + return QString::asprintf("#%02x%02x%02x%02x", c.red(), c.green(), c.blue(), c.alpha()); +} + +static QString specName(QColor::Spec s) +{ + switch (s) { + case QColor::Invalid: + return QStringLiteral("Invalid"); + case QColor::Rgb: + return QStringLiteral("Rgb"); + case QColor::Hsv: + return QStringLiteral("Hsv"); + case QColor::Cmyk: + return QStringLiteral("Cmyk"); + case QColor::Hsl: + return QStringLiteral("Hsl"); + case QColor::ExtendedRgb: + return QStringLiteral("ExtendedRgb"); + } + return QStringLiteral("Unknown"); +} + +QJsonObject color(const QColor &c) +{ + QJsonObject o; + if (!c.isValid()) { + o.insert(QStringLiteral("valid"), false); + return o; + } + const QRgba64 w = c.rgba64(); + o.insert(QStringLiteral("hex"), hex8(c)); + o.insert(QStringLiteral("u16"), QJsonArray{int(w.red()), int(w.green()), int(w.blue()), int(w.alpha())}); + if (c.spec() != QColor::Rgb) { + o.insert(QStringLiteral("spec"), specName(c.spec())); + o.insert(QStringLiteral("f"), QJsonArray{c.redF(), c.greenF(), c.blueF(), c.alphaF()}); + } + return o; +} + +QColor parseHex8(const QString &s) +{ + bool ok = true; + const int r = s.mid(1, 2).toInt(&ok, 16); + const int g = s.mid(3, 2).toInt(&ok, 16); + const int b = s.mid(5, 2).toInt(&ok, 16); + const int a = s.size() >= 9 ? s.mid(7, 2).toInt(&ok, 16) : 255; + return QColor::fromRgb(r, g, b, a); +} + +static QString readText(const QString &path) +{ + QFile f(path); + if (!f.open(QIODevice::ReadOnly)) + return QString(); + return QString::fromUtf8(f.readAll()); +} + +QJsonObject meta(const QString &kind) +{ + const auto env = QProcessEnvironment::systemEnvironment(); + QJsonObject m; + m.insert(QStringLiteral("kind"), kind); + m.insert(QStringLiteral("generator"), QStringLiteral("tools/kde_golden/driver (kde_golden)")); + m.insert(QStringLiteral("image"), env.value(QStringLiteral("KDE_GOLDEN_IMAGE"), QStringLiteral("unknown"))); + m.insert(QStringLiteral("qt_runtime"), QString::fromLatin1(qVersion())); + m.insert(QStringLiteral("qt_build"), QStringLiteral(QT_VERSION_STR)); + m.insert(QStringLiteral("kcolorscheme_build"), QStringLiteral(KCOLORSCHEME_VERSION_STRING)); + m.insert(QStringLiteral("kguiaddons_build"), QStringLiteral(KGUIADDONS_VERSION_STRING)); + QJsonObject pkgs; + const QStringList lines = readText(QStringLiteral("/opt/kde_golden/versions.txt")).split(QLatin1Char('\n'), Qt::SkipEmptyParts); + for (const QString &line : lines) { + const QStringList kv = line.split(QLatin1Char('\t')); + if (kv.size() == 2) + pkgs.insert(kv[0], kv[1]); + } + m.insert(QStringLiteral("packages"), pkgs); + m.insert(QStringLiteral("readme"), QStringLiteral("tools/kde_golden/README.md documents every field")); + return m; +} + +static QByteArray compact(const QJsonValue &v) +{ + if (v.isObject()) + return QJsonDocument(v.toObject()).toJson(QJsonDocument::Compact); + if (v.isArray()) + return QJsonDocument(v.toArray()).toJson(QJsonDocument::Compact); + // Scalars: wrap in an array and strip the brackets. + QByteArray a = QJsonDocument(QJsonArray{v}).toJson(QJsonDocument::Compact); + return a.mid(1, a.size() - 2); +} + +static QByteArray quoted(const QString &s) +{ + return compact(QJsonValue(s)); +} + +bool writeFile(const QString &path, const QList &members) +{ + QFile f(path); + if (!f.open(QIODevice::WriteOnly | QIODevice::Truncate)) { + std::fprintf(stderr, "cannot write %s\n", qPrintable(path)); + return false; + } + f.write("{\n"); + for (int i = 0; i < members.size(); ++i) { + const Member &m = members[i]; + f.write("\""); + f.write(m.key.toUtf8()); + f.write("\": "); + if (m.oneElementPerLine && m.value.isArray()) { + const QJsonArray arr = m.value.toArray(); + f.write("[\n"); + for (int j = 0; j < arr.size(); ++j) { + f.write(compact(arr[j])); + f.write(j + 1 < arr.size() ? ",\n" : "\n"); + } + f.write("]"); + } else if (m.oneElementPerLine && m.value.isObject()) { + const QJsonObject obj = m.value.toObject(); + f.write("{\n"); + const QStringList keys = obj.keys(); + for (int j = 0; j < keys.size(); ++j) { + f.write(quoted(keys[j])); + f.write(": "); + f.write(compact(obj.value(keys[j]))); + f.write(j + 1 < keys.size() ? ",\n" : "\n"); + } + f.write("}"); + } else { + f.write(compact(m.value)); + } + f.write(i + 1 < members.size() ? ",\n" : "\n"); + } + f.write("}\n"); + return f.error() == QFile::NoError; +} + +} // namespace golden diff --git a/tools/kde_golden/driver/golden_json.h b/tools/kde_golden/driver/golden_json.h new file mode 100644 index 000000000..e04899d4f --- /dev/null +++ b/tools/kde_golden/driver/golden_json.h @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech +// +// JSON helpers shared by every vector writer. A colour is always written the +// same way (see README.md, "Colour encoding"), and every file is written as +// one object whose arrays hold one record per line, so a regenerated file +// diffs line by line. + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +namespace golden { + +// "#rrggbbaa" from Qt's own 8-bit accessors. +QString hex8(const QColor &c); + +// {"hex": "#rrggbbaa", "u16": [r, g, b, a]}, plus "spec" and "f" (exact +// doubles) when the colour is not stored in QColor::Rgb, and {"valid": false} +// for an invalid colour. +QJsonObject color(const QColor &c); + +// Parses "#rrggbb" or "#rrggbbaa" into an 8-bit QColor (16-bit = 8-bit * 257). +QColor parseHex8(const QString &s); + +// Metadata common to every file: generator, versions, environment. +QJsonObject meta(const QString &kind); + +// One top-level member: either an array (written one element per line) or any +// other value (written compact on one line). +struct Member { + QString key; + QJsonValue value; + bool oneElementPerLine = false; +}; + +// Writes {"k": v, ...} with arrays one element per line. Returns false and +// prints to stderr on failure. +bool writeFile(const QString &path, const QList &members); + +} // namespace golden diff --git a/tools/kde_golden/driver/main.cpp b/tools/kde_golden/driver/main.cpp new file mode 100644 index 000000000..db65d30a9 --- /dev/null +++ b/tools/kde_golden/driver/main.cpp @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech +// +// kde_golden: writes the reference vectors for the KDE Breeze preset from a +// real KDE installation. It calls only public Qt 6 and KDE Frameworks 6 API. +// +// kde_golden math OUT.json +// kde_golden resolve OUT.json +// kde_golden sizes OUT.json +// kde_golden pixels OUT.json SCHEME_LABEL +// +// run.sh drives it inside the container; README.md documents the output. + +#include +#include +#include + +#include + +int writeMath(const QString &path); +int writeResolve(const QString &path); +int writeSizes(const QString &path); +int writePixels(const QString &path, const QString &schemeLabel); + +int main(int argc, char **argv) +{ + if (qEnvironmentVariable("QT_QPA_PLATFORM") != QLatin1String("offscreen")) { + std::fprintf(stderr, "kde_golden: run with QT_QPA_PLATFORM=offscreen\n"); + return 2; + } + QApplication app(argc, argv); + const QStringList args = app.arguments(); + if (args.size() < 3) { + std::fprintf(stderr, "usage: kde_golden math|resolve|sizes|pixels OUT.json [SCHEME_LABEL]\n"); + return 2; + } + const QString mode = args[1]; + const QString out = args[2]; + + if (mode == QLatin1String("sizes") || mode == QLatin1String("pixels")) { + QStyle *breeze = QStyleFactory::create(QStringLiteral("Breeze")); + if (!breeze) { + std::fprintf(stderr, "kde_golden: the Breeze style plugin is not available (have: %s)\n", + qPrintable(QStyleFactory::keys().join(QLatin1String(", ")))); + return 1; + } + QApplication::setStyle(breeze); + } + + if (mode == QLatin1String("math")) + return writeMath(out); + if (mode == QLatin1String("resolve")) + return writeResolve(out); + if (mode == QLatin1String("sizes")) + return writeSizes(out); + if (mode == QLatin1String("pixels")) + return writePixels(out, args.size() > 3 ? args[3] : QString()); + std::fprintf(stderr, "kde_golden: unknown mode %s\n", qPrintable(mode)); + return 2; +} diff --git a/tools/kde_golden/driver/math_vectors.cpp b/tools/kde_golden/driver/math_vectors.cpp new file mode 100644 index 000000000..97247bd0c --- /dev/null +++ b/tools/kde_golden/driver/math_vectors.cpp @@ -0,0 +1,300 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech +// +// math.json: KColorUtils and the static KColorScheme::shade over a fixed +// lattice of colours and amounts, plus the Qt colour behaviour the KDE +// colour model rests on (QColor::lighter / darker, the sRGB colour-space +// transforms, out-of-range float colours, colour text parsing). Every input +// colour is an 8-bit value, so its 16-bit form is exactly value * 257. + +#include "golden_json.h" + +#include +#include + +#include +#include +#include + +namespace { + +// The lattice. Order is part of the format: tests may index by position. +const QStringList kColors = { + // black, white, greys (including the values around 0x7f/0x80 and the ends) + QStringLiteral("#000000ff"), QStringLiteral("#ffffffff"), QStringLiteral("#010101ff"), QStringLiteral("#020202ff"), + QStringLiteral("#040404ff"), QStringLiteral("#080808ff"), QStringLiteral("#101010ff"), QStringLiteral("#202020ff"), + QStringLiteral("#404040ff"), QStringLiteral("#7f7f7fff"), QStringLiteral("#808080ff"), QStringLiteral("#818181ff"), + QStringLiteral("#bfbfbfff"), QStringLiteral("#c0c0c0ff"), QStringLiteral("#fdfdfdff"), QStringLiteral("#fefefeff"), + // saturated primaries and secondaries, half-intensity and pastel variants + QStringLiteral("#ff0000ff"), QStringLiteral("#00ff00ff"), QStringLiteral("#0000ffff"), QStringLiteral("#ffff00ff"), + QStringLiteral("#00ffffff"), QStringLiteral("#ff00ffff"), QStringLiteral("#800000ff"), QStringLiteral("#008000ff"), + QStringLiteral("#000080ff"), QStringLiteral("#ff8080ff"), QStringLiteral("#80ff80ff"), QStringLiteral("#8080ffff"), + // near-threshold: almost grey, almost black, almost white + QStringLiteral("#030201ff"), QStringLiteral("#fffefdff"), QStringLiteral("#7f8081ff"), QStringLiteral("#010000ff"), + QStringLiteral("#000001ff"), QStringLiteral("#fefffeff"), + // colours found in the Breeze schemes + QStringLiteral("#3daee9ff"), QStringLiteral("#232629ff"), QStringLiteral("#eff0f1ff"), QStringLiteral("#fcfcfcff"), + QStringLiteral("#31363bff"), QStringLiteral("#1b1e20ff"), QStringLiteral("#da4453ff"), QStringLiteral("#27ae60ff"), + QStringLiteral("#f67400ff"), QStringLiteral("#2980b9ff"), QStringLiteral("#7f8c8dff"), QStringLiteral("#9b59b6ff"), + QStringLiteral("#1d99f3ff"), QStringLiteral("#dee0e2ff"), QStringLiteral("#292c30ff"), + // the Plasma accent swatches not already listed + QStringLiteral("#e93a9aff"), QStringLiteral("#e93d58ff"), QStringLiteral("#e9643aff"), QStringLiteral("#e8cb2dff"), + QStringLiteral("#3dd425ff"), QStringLiteral("#00d3b8ff"), QStringLiteral("#b875dcff"), QStringLiteral("#926ee4ff"), + QStringLiteral("#686b6fff"), + // translucent + QStringLiteral("#3daee980"), QStringLiteral("#ffffff00"), QStringLiteral("#00000080"), QStringLiteral("#ff000033"), +}; + +// The smaller set used for two-colour operations (tint, mix, overlay). +const QStringList kPairColors = { + QStringLiteral("#000000ff"), QStringLiteral("#ffffffff"), QStringLiteral("#7f7f7fff"), QStringLiteral("#808080ff"), + QStringLiteral("#ff0000ff"), QStringLiteral("#00ff00ff"), QStringLiteral("#0000ffff"), QStringLiteral("#ffff00ff"), + QStringLiteral("#030201ff"), QStringLiteral("#3daee9ff"), QStringLiteral("#232629ff"), QStringLiteral("#eff0f1ff"), + QStringLiteral("#fcfcfcff"), QStringLiteral("#da4453ff"), QStringLiteral("#e8cb2dff"), QStringLiteral("#3daee980"), + QStringLiteral("#ffffff00"), +}; + +const QList kLightenAmounts = {-0.5, 0.0, 0.1, 0.25, 0.5, 0.75, 0.9, 1.0, 1.5}; +const QList kGains = {0.0, 0.5, 1.0, 2.0}; +const QList kShadeLuma = {-1.5, -1.0, -0.5, -0.1, 0.0, 0.1, 0.5, 1.0, 1.5}; +const QList kShadeChroma = {-1.0, 0.0, 0.5, 1.0}; +const QList kTintAmounts = {-0.5, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 1.0, 1.5}; +const QList kMixBias = {-0.5, 0.0, 0.1, 0.25, 0.5, 0.75, 0.9, 1.0, 1.5}; +const QList kHcyHue = {-0.25, 0.0, 0.1, 1.0 / 6.0, 0.5, 0.9, 1.0, 1.25}; +const QList kHcyChroma = {-0.5, 0.0, 0.25, 0.5, 1.0, 1.5}; +const QList kHcyLuma = {-0.1, 0.0, 0.1, 0.5, 0.9, 1.0, 1.1}; +const QList kHcyAlpha = {1.0, 0.5}; +const QList kSchemeContrast = {-1.0, 0.0, 0.4, 0.7, 1.0, 1.5}; +const QList kSchemeChroma = {0.0, 0.5}; +// QColor::lighter / darker factors: the non-positive and below-100 branches, +// the identity, and the factors the Breeze style uses (102, 110, 120). +const QList kQtFactors = {-10, 0, 1, 50, 99, 100, 101, 102, 110, 120, 150, 200, 300, 1000}; + +const QList> kShadeRoles = { + {KColorScheme::LightShade, QStringLiteral("Light")}, + {KColorScheme::MidlightShade, QStringLiteral("Midlight")}, + {KColorScheme::MidShade, QStringLiteral("Mid")}, + {KColorScheme::DarkShade, QStringLiteral("Dark")}, + {KColorScheme::ShadowShade, QStringLiteral("Shadow")}, +}; + +const QList> kOverlayModes = { + {QPainter::CompositionMode_SourceOver, QStringLiteral("SourceOver")}, + {QPainter::CompositionMode_Multiply, QStringLiteral("Multiply")}, + {QPainter::CompositionMode_Screen, QStringLiteral("Screen")}, +}; + +} // namespace + +int writeMath(const QString &path) +{ + using namespace golden; + QJsonArray single; + for (const QString &h : kColors) { + const QColor c = parseHex8(h); + qreal hh = 0, cc = 0, yy = 0, aa = 0; + KColorUtils::getHcy(c, &hh, &cc, &yy, &aa); + QJsonObject o; + o.insert(QStringLiteral("in"), h); + o.insert(QStringLiteral("luma"), KColorUtils::luma(c)); + o.insert(QStringLiteral("hue"), KColorUtils::hue(c)); + o.insert(QStringLiteral("chroma"), KColorUtils::chroma(c)); + o.insert(QStringLiteral("hcy"), QJsonArray{hh, cc, yy, aa}); + o.insert(QStringLiteral("roundtrip"), color(KColorUtils::hcyColor(hh, cc, yy, aa))); + single.append(o); + } + + QJsonArray contrast; + for (const QString &a : kPairColors) + for (const QString &b : kColors) { + QJsonObject o; + o.insert(QStringLiteral("a"), a); + o.insert(QStringLiteral("b"), b); + o.insert(QStringLiteral("out"), KColorUtils::contrastRatio(parseHex8(a), parseHex8(b))); + contrast.append(o); + } + + QJsonArray lighten, darken; + for (const QString &h : kColors) + for (double amt : kLightenAmounts) + for (double g : kGains) { + const QColor c = parseHex8(h); + QJsonObject o; + o.insert(QStringLiteral("in"), h); + o.insert(QStringLiteral("amount"), amt); + o.insert(QStringLiteral("gain"), g); + o.insert(QStringLiteral("out"), color(KColorUtils::lighten(c, amt, g))); + lighten.append(o); + o.insert(QStringLiteral("out"), color(KColorUtils::darken(c, amt, g))); + darken.append(o); + } + + QJsonArray shade; + for (const QString &h : kColors) + for (double l : kShadeLuma) + for (double ch : kShadeChroma) { + QJsonObject o; + o.insert(QStringLiteral("in"), h); + o.insert(QStringLiteral("luma"), l); + o.insert(QStringLiteral("chroma"), ch); + o.insert(QStringLiteral("out"), color(KColorUtils::shade(parseHex8(h), l, ch))); + shade.append(o); + } + + QJsonArray tint, mix; + for (const QString &a : kPairColors) + for (const QString &b : kPairColors) { + for (double amt : kTintAmounts) { + QJsonObject o; + o.insert(QStringLiteral("base"), a); + o.insert(QStringLiteral("color"), b); + o.insert(QStringLiteral("amount"), amt); + o.insert(QStringLiteral("out"), color(KColorUtils::tint(parseHex8(a), parseHex8(b), amt))); + tint.append(o); + } + for (double bias : kMixBias) { + QJsonObject o; + o.insert(QStringLiteral("c1"), a); + o.insert(QStringLiteral("c2"), b); + o.insert(QStringLiteral("bias"), bias); + o.insert(QStringLiteral("out"), color(KColorUtils::mix(parseHex8(a), parseHex8(b), bias))); + mix.append(o); + } + } + + QJsonArray overlay; + for (const QString &a : kPairColors) + for (const QString &b : kPairColors) + for (const auto &mode : kOverlayModes) { + QJsonObject o; + o.insert(QStringLiteral("base"), a); + o.insert(QStringLiteral("paint"), b); + o.insert(QStringLiteral("mode"), mode.second); + o.insert(QStringLiteral("out"), color(KColorUtils::overlayColors(parseHex8(a), parseHex8(b), mode.first))); + overlay.append(o); + } + + QJsonArray hcy; + for (double h : kHcyHue) + for (double c : kHcyChroma) + for (double y : kHcyLuma) + for (double a : kHcyAlpha) { + QJsonObject o; + o.insert(QStringLiteral("h"), h); + o.insert(QStringLiteral("c"), c); + o.insert(QStringLiteral("y"), y); + o.insert(QStringLiteral("a"), a); + o.insert(QStringLiteral("out"), color(KColorUtils::hcyColor(h, c, y, a))); + hcy.append(o); + } + + QJsonArray schemeShade; + for (const QString &h : kColors) + for (const auto &role : kShadeRoles) + for (double k : kSchemeContrast) + for (double ch : kSchemeChroma) { + QJsonObject o; + o.insert(QStringLiteral("in"), h); + o.insert(QStringLiteral("role"), role.second); + o.insert(QStringLiteral("contrast"), k); + o.insert(QStringLiteral("chroma"), ch); + o.insert(QStringLiteral("out"), color(KColorScheme::shade(parseHex8(h), role.first, k, ch))); + schemeShade.append(o); + } + + QJsonArray qtLighterDarker; + for (const QString &h : kColors) + for (int f : kQtFactors) { + const QColor c = parseHex8(h); + QJsonObject o; + o.insert(QStringLiteral("in"), h); + o.insert(QStringLiteral("factor"), f); + o.insert(QStringLiteral("op"), QStringLiteral("lighter")); + o.insert(QStringLiteral("out"), color(c.lighter(f))); + qtLighterDarker.append(o); + o.insert(QStringLiteral("op"), QStringLiteral("darker")); + o.insert(QStringLiteral("out"), color(c.darker(f))); + qtLighterDarker.append(o); + } + + // Qt's own sRGB <-> linear sRGB colour-space transforms (QColorSpace / + // QColorTransform, public API) on QColor values, and the storage of + // out-of-range float colours (QColor::fromRgbF then toRgb). These pin the + // conversions the OKLab accent tint goes through. + const QColorTransform toLinear = QColorSpace(QColorSpace::SRgb).transformationToColorSpace(QColorSpace::SRgbLinear); + const QColorTransform fromLinear = QColorSpace(QColorSpace::SRgbLinear).transformationToColorSpace(QColorSpace::SRgb); + QStringList csInputs = kColors; + for (int v = 0; v < 256; ++v) + csInputs.append(QString::asprintf("#%02x%02x%02xff", v, v, v)); + for (int v = 1; v < 256; ++v) + csInputs.append(QString::asprintf("#%02x0000ff", v)); + QJsonArray qtColorSpace; + for (const QString &h : csInputs) { + const QColor c = parseHex8(h); + QJsonObject o; + o.insert(QStringLiteral("in"), h); + o.insert(QStringLiteral("to_linear"), color(toLinear.map(c))); + o.insert(QStringLiteral("from_linear"), color(fromLinear.map(c))); + qtColorSpace.append(o); + } + const QList> kExtendedInputs = { + {1.05f, 0.123456789f, -0.01f}, {-0.0000001f, 0.5f, 0.75f}, {1.0000001f, 0.333333343f, 0.666666687f}, + {2.0f, -1.0f, 0.0001f}, {0.999f, 1.001f, 0.2f}, {0.1f, 0.2f, 1.5f}, + }; + QJsonArray qtExtended; + for (const auto &v : kExtendedInputs) { + QJsonObject o; + o.insert(QStringLiteral("in"), QJsonArray{double(v[0]), double(v[1]), double(v[2])}); + const QColor e = QColor::fromRgbF(v[0], v[1], v[2]); + o.insert(QStringLiteral("stored"), color(e)); + o.insert(QStringLiteral("to_rgb"), color(e.toRgb())); + qtExtended.append(o); + } + + // QColor's string parsing, which KConfig uses for every colour value that + // starts with '#' or contains no comma. + const QStringList kColorTexts = { + QStringLiteral("#abc"), QStringLiteral("#3daee9"), QStringLiteral("#803daee9"), + QStringLiteral("#123456789"), QStringLiteral("#123456789abc"), QStringLiteral("#12"), + QStringLiteral("#12345"), QStringLiteral("#1234567"), QStringLiteral("#xyzxyz"), + QStringLiteral("red"), QStringLiteral("Red"), QStringLiteral("RED"), + QStringLiteral("transparent"), QStringLiteral("rebeccapurple"), QStringLiteral("grey"), + QStringLiteral("notacolour"), QStringLiteral(" #3daee9"), QStringLiteral(""), + }; + QJsonArray qtColorText; + for (const QString &t : kColorTexts) { + QJsonObject o; + o.insert(QStringLiteral("in"), t); + o.insert(QStringLiteral("out"), color(QColor::fromString(t))); + qtColorText.append(o); + } + + QJsonArray colorsList, pairList; + for (const QString &h : kColors) + colorsList.append(h); + for (const QString &h : kPairColors) + pairList.append(h); + + return writeFile(path, + { + {QStringLiteral("meta"), meta(QStringLiteral("math"))}, + {QStringLiteral("colors"), colorsList}, + {QStringLiteral("pair_colors"), pairList}, + {QStringLiteral("single"), single, true}, + {QStringLiteral("contrast_ratio"), contrast, true}, + {QStringLiteral("lighten"), lighten, true}, + {QStringLiteral("darken"), darken, true}, + {QStringLiteral("shade"), shade, true}, + {QStringLiteral("tint"), tint, true}, + {QStringLiteral("mix"), mix, true}, + {QStringLiteral("overlay"), overlay, true}, + {QStringLiteral("hcy_color"), hcy, true}, + {QStringLiteral("scheme_shade"), schemeShade, true}, + {QStringLiteral("qt_lighter_darker"), qtLighterDarker, true}, + {QStringLiteral("qt_colorspace"), qtColorSpace, true}, + {QStringLiteral("qt_extended"), qtExtended, true}, + {QStringLiteral("qt_color_text"), qtColorText, true}, + }) + ? 0 + : 1; +} diff --git a/tools/kde_golden/driver/pixel_vectors.cpp b/tools/kde_golden/driver/pixel_vectors.cpp new file mode 100644 index 000000000..c44f7b606 --- /dev/null +++ b/tools/kde_golden/driver/pixel_vectors.cpp @@ -0,0 +1,644 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech +// +// pixels-.json: Breeze-painted controls, sampled. Each control is +// painted through QStyle with a hand-built option (no widget, so no animation +// engine and no window-activation guesswork) into an opaque QImage filled +// with the palette's background colour, then sampled along documented lines. +// No text is painted: glyph rasterisation is not what these vectors pin. +// +// The colour scheme is whatever kdeglobals the process sees: run.sh copies +// the scheme into a scratch XDG_CONFIG_HOME first, because the Breeze style +// reads its focus and hover colours from there, not from the palette. + +#include "golden_json.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace { + +QJsonArray rc(const QRect &r) +{ + return QJsonArray{r.x(), r.y(), r.width(), r.height()}; +} + +// Run-length encoding of one line of pixels: [[start, length, "#rrggbbaa"], ...]. +QJsonArray rle(const QImage &img, bool horizontal, int at) +{ + QJsonArray out; + const int n = horizontal ? img.width() : img.height(); + int start = 0; + QRgb prev = 0; + for (int i = 0; i <= n; ++i) { + const bool end = i == n; + const QRgb px = end ? 0 : (horizontal ? img.pixel(i, at) : img.pixel(at, i)); + if (i == 0) { + prev = px; + continue; + } + if (end || px != prev) { + out.append(QJsonArray{start, i - start, golden::hex8(QColor::fromRgba(prev))}); + start = i; + prev = px; + } + } + return out; +} + +struct Shot { + QString id; + QString control; + QJsonObject state; + QSize size; + QPalette::ColorRole background = QPalette::Window; + QPalette::ColorGroup group = QPalette::Active; + std::function draw; + QList rows; // empty: the centre row + QList cols; // empty: the centre column +}; + +QJsonObject runShot(const Shot &s, const QPalette &pal) +{ + QImage img(s.size, QImage::Format_ARGB32); + img.fill(pal.color(s.group, s.background)); + { + QPainter p(&img); + s.draw(p, QRect(QPoint(0, 0), s.size)); + } + QJsonObject o; + o.insert(QStringLiteral("id"), s.id); + o.insert(QStringLiteral("control"), s.control); + o.insert(QStringLiteral("state"), s.state); + o.insert(QStringLiteral("size"), QJsonArray{s.size.width(), s.size.height()}); + o.insert(QStringLiteral("background"), golden::hex8(pal.color(s.group, s.background))); + QJsonObject rows, cols; + const QList ry = s.rows.isEmpty() ? QList{s.size.height() / 2} : s.rows; + const QList cx = s.cols.isEmpty() ? QList{s.size.width() / 2} : s.cols; + for (int y : ry) + rows.insert(QString::number(y), rle(img, true, y)); + for (int x : cx) + cols.insert(QString::number(x), rle(img, false, x)); + o.insert(QStringLiteral("rows"), rows); + o.insert(QStringLiteral("cols"), cols); + return o; +} + +struct Ctx { + QStyle *style; + QPalette pal; + QFont font; + + // Fills the fields QStyleOption::initFrom would, deterministically. + void base(QStyleOption &opt, const QRect &r, QStyle::State extra, QPalette::ColorGroup g) const + { + opt.rect = r; + opt.direction = Qt::LeftToRight; + opt.fontMetrics = QFontMetrics(font); + opt.palette = pal; + opt.palette.setCurrentColorGroup(g); + opt.state = extra; + if (g != QPalette::Disabled) + opt.state |= QStyle::State_Enabled; + if (g != QPalette::Inactive) + opt.state |= QStyle::State_Active; + opt.styleObject = nullptr; + } +}; + +struct Variant { + QString name; + QStyle::State state; + QPalette::ColorGroup group = QPalette::Active; +}; + +QJsonObject stateDesc(const Variant &v) +{ + QJsonObject o; + o.insert(QStringLiteral("name"), v.name); + o.insert(QStringLiteral("flags"), int(v.state)); + o.insert(QStringLiteral("group"), v.group == QPalette::Active ? QStringLiteral("Active") + : v.group == QPalette::Inactive ? QStringLiteral("Inactive") + : QStringLiteral("Disabled")); + return o; +} + +QList shots(const Ctx &c) +{ + QList out; + QStyle *st = c.style; + const QStyle::State hover = QStyle::State_MouseOver; + const QStyle::State focus = QStyle::State_HasFocus | QStyle::State_KeyboardFocusChange; + const QStyle::State sunken = QStyle::State_Sunken; + const QStyle::State on = QStyle::State_On; + + // Push button, at the size Breeze gives an "OK" button. + { + const QSize size(84, 34); + const QList> vs = { + {{QStringLiteral("normal"), QStyle::State_Raised}, QStyleOptionButton::None}, + {{QStringLiteral("hover"), QStyle::State_Raised | hover}, QStyleOptionButton::None}, + {{QStringLiteral("focus"), QStyle::State_Raised | focus}, QStyleOptionButton::None}, + {{QStringLiteral("pressed"), sunken}, QStyleOptionButton::None}, + {{QStringLiteral("default"), QStyle::State_Raised}, QStyleOptionButton::DefaultButton}, + {{QStringLiteral("disabled"), QStyle::State_Raised, QPalette::Disabled}, QStyleOptionButton::None}, + {{QStringLiteral("inactive_window"), QStyle::State_Raised, QPalette::Inactive}, QStyleOptionButton::None}, + {{QStringLiteral("flat"), QStyle::State_None}, QStyleOptionButton::Flat}, + {{QStringLiteral("flat_hover"), hover}, QStyleOptionButton::Flat}, + }; + for (const auto &v : vs) { + Shot s; + s.id = QStringLiteral("push_button.") + v.first.name; + s.control = QStringLiteral("CE_PushButtonBevel"); + s.state = stateDesc(v.first); + s.state.insert(QStringLiteral("features"), int(v.second)); + s.size = size; + s.group = v.first.group; + s.rows = {0, 1, 2, size.height() / 2, size.height() - 2, size.height() - 1}; + s.cols = {0, 1, 2, size.width() / 2}; + const Variant var = v.first; + const auto feat = v.second; + s.draw = [&c, st, var, feat](QPainter &p, const QRect &r) { + QStyleOptionButton opt; + c.base(opt, r, var.state, var.group); + opt.features = feat; + st->drawControl(QStyle::CE_PushButtonBevel, &opt, &p, nullptr); + }; + out.append(s); + } + } + + // Tool button (auto-raise), 28 x 28. + for (const Variant &v : {Variant{QStringLiteral("normal"), QStyle::State_AutoRaise | QStyle::State_Raised}, + Variant{QStringLiteral("hover"), QStyle::State_AutoRaise | QStyle::State_Raised | hover}, + Variant{QStringLiteral("pressed"), QStyle::State_AutoRaise | sunken | hover}, + Variant{QStringLiteral("checked"), QStyle::State_AutoRaise | on}, + Variant{QStringLiteral("framed"), QStyle::State_Raised}}) { + Shot s; + s.id = QStringLiteral("tool_button.") + v.name; + s.control = QStringLiteral("CC_ToolButton"); + s.state = stateDesc(v); + s.size = QSize(28, 28); + s.rows = {0, 1, 14}; + s.cols = {0, 1, 14}; + s.draw = [&c, st, v](QPainter &p, const QRect &r) { + QStyleOptionToolButton opt; + c.base(opt, r, v.state, v.group); + opt.subControls = QStyle::SC_ToolButton; + opt.activeSubControls = (v.state & (QStyle::State_MouseOver | QStyle::State_Sunken)) ? QStyle::SC_ToolButton : QStyle::SC_None; + opt.toolButtonStyle = Qt::ToolButtonIconOnly; + opt.iconSize = QSize(16, 16); + st->drawComplexControl(QStyle::CC_ToolButton, &opt, &p, nullptr); + }; + out.append(s); + } + + // Line edit panel. + for (const Variant &v : {Variant{QStringLiteral("normal"), sunken}, Variant{QStringLiteral("hover"), sunken | hover}, + Variant{QStringLiteral("focus"), sunken | focus}, Variant{QStringLiteral("disabled"), sunken, QPalette::Disabled}}) { + Shot s; + s.id = QStringLiteral("line_edit.") + v.name; + s.control = QStringLiteral("PE_PanelLineEdit"); + s.state = stateDesc(v); + s.size = QSize(150, 32); + s.group = v.group; + s.rows = {0, 1, 2, 16, 30, 31}; + s.cols = {0, 1, 2, 75}; + // QLineEdit::initStyleOption asks the style for the frame width with + // the line edit itself as the widget; with no widget Breeze answers 0 + // and QCommonStyle then paints no frame at all. + QLineEdit probe; + probe.ensurePolished(); + QStyleOptionFrame popt; + c.base(popt, QRect(QPoint(0, 0), s.size), v.state, v.group); + const int lineWidth = st->pixelMetric(QStyle::PM_DefaultFrameWidth, &popt, &probe); + s.state.insert(QStringLiteral("line_width"), lineWidth); + s.draw = [&c, st, v, lineWidth](QPainter &p, const QRect &r) { + QStyleOptionFrame opt; + c.base(opt, r, v.state, v.group); + opt.lineWidth = lineWidth; + opt.midLineWidth = 0; + st->drawPrimitive(QStyle::PE_PanelLineEdit, &opt, &p, nullptr); + }; + out.append(s); + } + + // Check box and radio indicators, at the indicator size the style reports. + const int cbw = st->pixelMetric(QStyle::PM_IndicatorWidth); + const int cbh = st->pixelMetric(QStyle::PM_IndicatorHeight); + for (const Variant &v : {Variant{QStringLiteral("off"), QStyle::State_Off}, Variant{QStringLiteral("on"), on}, + Variant{QStringLiteral("partial"), QStyle::State_NoChange}, Variant{QStringLiteral("hover_off"), QStyle::State_Off | hover}, + Variant{QStringLiteral("focus_on"), on | focus}, Variant{QStringLiteral("pressed_off"), QStyle::State_Off | sunken}, + Variant{QStringLiteral("disabled_on"), on, QPalette::Disabled}}) { + Shot s; + s.id = QStringLiteral("check_box.") + v.name; + s.control = QStringLiteral("PE_IndicatorCheckBox"); + s.state = stateDesc(v); + s.size = QSize(cbw, cbh); + s.group = v.group; + s.rows = {cbh / 2, cbh / 2 - 2, cbh / 2 + 2, 2, 3}; + s.cols = {cbw / 2, cbw / 2 - 2, 2, 3}; + s.draw = [&c, st, v](QPainter &p, const QRect &r) { + QStyleOptionButton opt; + c.base(opt, r, v.state, v.group); + st->drawPrimitive(QStyle::PE_IndicatorCheckBox, &opt, &p, nullptr); + }; + out.append(s); + } + const int rbw = st->pixelMetric(QStyle::PM_ExclusiveIndicatorWidth); + const int rbh = st->pixelMetric(QStyle::PM_ExclusiveIndicatorHeight); + for (const Variant &v : {Variant{QStringLiteral("off"), QStyle::State_Off}, Variant{QStringLiteral("on"), on}, + Variant{QStringLiteral("hover_off"), QStyle::State_Off | hover}, Variant{QStringLiteral("focus_on"), on | focus}, + Variant{QStringLiteral("disabled_on"), on, QPalette::Disabled}}) { + Shot s; + s.id = QStringLiteral("radio_button.") + v.name; + s.control = QStringLiteral("PE_IndicatorRadioButton"); + s.state = stateDesc(v); + s.size = QSize(rbw, rbh); + s.group = v.group; + s.rows = {rbh / 2, 3}; + s.cols = {rbw / 2}; + s.draw = [&c, st, v](QPainter &p, const QRect &r) { + QStyleOptionButton opt; + c.base(opt, r, v.state, v.group); + st->drawPrimitive(QStyle::PE_IndicatorRadioButton, &opt, &p, nullptr); + }; + out.append(s); + } + + // Combo box frame and arrow (no label). + for (const auto &[v, editable] : QList>{{{QStringLiteral("normal"), QStyle::State_None}, false}, + {{QStringLiteral("hover"), hover}, false}, + {{QStringLiteral("focus"), focus}, false}, + {{QStringLiteral("editable"), QStyle::State_None}, true}}) { + Shot s; + s.id = QStringLiteral("combo_box.") + v.name; + s.control = QStringLiteral("CC_ComboBox"); + s.state = stateDesc(v); + s.state.insert(QStringLiteral("editable"), editable); + s.size = QSize(150, 32); + s.rows = {0, 1, 16, 31}; + s.cols = {0, 1, 40, 140}; + const Variant var = v; + const bool ed = editable; + s.draw = [&c, st, var, ed](QPainter &p, const QRect &r) { + QStyleOptionComboBox opt; + c.base(opt, r, var.state, var.group); + opt.editable = ed; + opt.frame = true; + opt.subControls = QStyle::SC_All; + st->drawComplexControl(QStyle::CC_ComboBox, &opt, &p, nullptr); + }; + out.append(s); + } + + // Spin box. + for (const Variant &v : {Variant{QStringLiteral("normal"), QStyle::State_None}, Variant{QStringLiteral("hover"), hover}}) { + Shot s; + s.id = QStringLiteral("spin_box.") + v.name; + s.control = QStringLiteral("CC_SpinBox"); + s.state = stateDesc(v); + s.size = QSize(100, 32); + s.rows = {0, 8, 16, 24, 31}; + s.cols = {0, 40, 90}; + s.draw = [&c, st, v](QPainter &p, const QRect &r) { + QStyleOptionSpinBox opt; + c.base(opt, r, v.state, v.group); + opt.frame = true; + opt.buttonSymbols = QAbstractSpinBox::UpDownArrows; + opt.stepEnabled = QAbstractSpinBox::StepUpEnabled | QAbstractSpinBox::StepDownEnabled; + opt.subControls = QStyle::SC_All; + st->drawComplexControl(QStyle::CC_SpinBox, &opt, &p, nullptr); + }; + out.append(s); + } + + // Slider, value 30 of 0..100. + for (const Variant &v : {Variant{QStringLiteral("normal"), QStyle::State_Horizontal}, Variant{QStringLiteral("handle_hover"), QStyle::State_Horizontal | hover}, + Variant{QStringLiteral("focus"), QStyle::State_Horizontal | focus}, Variant{QStringLiteral("disabled"), QStyle::State_Horizontal, QPalette::Disabled}}) { + QStyleOptionSlider probe; + c.base(probe, QRect(), v.state, v.group); + probe.orientation = Qt::Horizontal; + probe.minimum = 0; + probe.maximum = 100; + probe.sliderPosition = 30; + probe.sliderValue = 30; + const int thick = st->sizeFromContents(QStyle::CT_Slider, &probe, QSize(200, st->pixelMetric(QStyle::PM_SliderThickness, &probe, nullptr)), nullptr).height(); + probe.rect = QRect(0, 0, 200, thick); + probe.subControls = QStyle::SC_All; + const QRect handle = st->subControlRect(QStyle::CC_Slider, &probe, QStyle::SC_SliderHandle, nullptr); + Shot s; + s.id = QStringLiteral("slider.") + v.name; + s.control = QStringLiteral("CC_Slider"); + s.state = stateDesc(v); + s.state.insert(QStringLiteral("value"), 30); + s.state.insert(QStringLiteral("handle_rect"), rc(handle)); + s.size = QSize(200, thick); + s.group = v.group; + s.rows = {thick / 2}; + s.cols = {handle.center().x(), 10, 190}; + s.draw = [&c, st, v](QPainter &p, const QRect &r) { + QStyleOptionSlider opt; + c.base(opt, r, v.state, v.group); + opt.orientation = Qt::Horizontal; + opt.minimum = 0; + opt.maximum = 100; + opt.sliderPosition = 30; + opt.sliderValue = 30; + opt.subControls = QStyle::SC_SliderGroove | QStyle::SC_SliderHandle; + opt.activeSubControls = (v.state & QStyle::State_MouseOver) ? QStyle::SC_SliderHandle : QStyle::SC_None; + st->drawComplexControl(QStyle::CC_Slider, &opt, &p, nullptr); + }; + out.append(s); + } + + // Vertical scroll bar, value 0 of 0..100, page 20. + for (const Variant &v : {Variant{QStringLiteral("normal"), QStyle::State_None}, Variant{QStringLiteral("hover"), hover}, + Variant{QStringLiteral("slider_hover"), hover}, Variant{QStringLiteral("slider_pressed"), hover | sunken}}) { + QStyleOptionSlider probe; + c.base(probe, QRect(), v.state, v.group); + const int ext = st->pixelMetric(QStyle::PM_ScrollBarExtent, &probe, nullptr); + probe.rect = QRect(0, 0, ext, 200); + probe.orientation = Qt::Vertical; + probe.minimum = 0; + probe.maximum = 100; + probe.pageStep = 20; + probe.singleStep = 1; + probe.subControls = QStyle::SC_All; + const QRect slider = st->subControlRect(QStyle::CC_ScrollBar, &probe, QStyle::SC_ScrollBarSlider, nullptr); + const bool sliderActive = v.name.startsWith(QStringLiteral("slider")); + Shot s; + s.id = QStringLiteral("scroll_bar.") + v.name; + s.control = QStringLiteral("CC_ScrollBar"); + s.state = stateDesc(v); + s.state.insert(QStringLiteral("slider_rect"), rc(slider)); + s.state.insert(QStringLiteral("active_sub_control"), sliderActive ? QStringLiteral("SC_ScrollBarSlider") : QStringLiteral("none")); + s.size = QSize(ext, 200); + s.rows = {slider.center().y(), 150}; + s.cols = {0, ext / 2}; + s.draw = [&c, st, v, sliderActive](QPainter &p, const QRect &r) { + QStyleOptionSlider opt; + c.base(opt, r, v.state, v.group); + opt.orientation = Qt::Vertical; + opt.minimum = 0; + opt.maximum = 100; + opt.pageStep = 20; + opt.singleStep = 1; + opt.subControls = QStyle::SC_All; + opt.activeSubControls = sliderActive ? QStyle::SC_ScrollBarSlider : QStyle::SC_None; + st->drawComplexControl(QStyle::CC_ScrollBar, &opt, &p, nullptr); + }; + out.append(s); + } + + // Progress bar at 50 %, no text. + { + QStyleOptionProgressBar probe; + c.base(probe, QRect(), QStyle::State_Horizontal, QPalette::Active); + probe.minimum = 0; + probe.maximum = 100; + probe.progress = 50; + probe.textVisible = false; + const QSize hint = st->sizeFromContents(QStyle::CT_ProgressBar, &probe, QSize(200, probe.fontMetrics.height()), nullptr); + Shot s; + s.id = QStringLiteral("progress_bar.half"); + s.control = QStringLiteral("CE_ProgressBar"); + s.state = stateDesc({QStringLiteral("half"), QStyle::State_Horizontal}); + s.size = QSize(200, hint.height()); + s.rows = {hint.height() / 2}; + s.cols = {50, 150}; + s.draw = [&c, st](QPainter &p, const QRect &r) { + QStyleOptionProgressBar opt; + c.base(opt, r, QStyle::State_Horizontal, QPalette::Active); + opt.minimum = 0; + opt.maximum = 100; + opt.progress = 50; + opt.textVisible = false; + st->drawControl(QStyle::CE_ProgressBar, &opt, &p, nullptr); + }; + out.append(s); + } + + // Menu panel and menu item rows (empty text: the highlight is the subject). + { + Shot s; + s.id = QStringLiteral("menu.panel"); + s.control = QStringLiteral("PE_PanelMenu+PE_FrameMenu"); + s.state = stateDesc({QStringLiteral("normal"), QStyle::State_None}); + s.size = QSize(200, 100); + s.rows = {0, 1, 50}; + s.cols = {0, 1, 100}; + s.draw = [&c, st](QPainter &p, const QRect &r) { + QStyleOption opt; + c.base(opt, r, QStyle::State_None, QPalette::Active); + st->drawPrimitive(QStyle::PE_PanelMenu, &opt, &p, nullptr); + QStyleOptionFrame fr; + c.base(fr, r, QStyle::State_None, QPalette::Active); + fr.lineWidth = st->pixelMetric(QStyle::PM_MenuPanelWidth, &fr, nullptr); + st->drawPrimitive(QStyle::PE_FrameMenu, &fr, &p, nullptr); + }; + out.append(s); + } + for (const auto &[v, type] : QList>{ + {{QStringLiteral("normal"), QStyle::State_None}, QStyleOptionMenuItem::Normal}, + {{QStringLiteral("selected"), QStyle::State_Selected}, QStyleOptionMenuItem::Normal}, + {{QStringLiteral("separator"), QStyle::State_None}, QStyleOptionMenuItem::Separator}}) { + QStyleOptionMenuItem probe; + c.base(probe, QRect(), v.state, v.group); + probe.menuItemType = type; + probe.maxIconWidth = 16; + const QSize hint = st->sizeFromContents(QStyle::CT_MenuItem, &probe, QSize(0, probe.fontMetrics.height()), nullptr); + Shot s; + s.id = QStringLiteral("menu_item.") + v.name; + s.control = QStringLiteral("CE_MenuItem"); + s.state = stateDesc(v); + s.state.insert(QStringLiteral("type"), int(type)); + s.size = QSize(200, hint.height()); + s.background = QPalette::Window; + s.rows = {hint.height() / 2, 0, 1, 2, 3, 4, 5}; + s.cols = {100, 4, 5, 6}; + const Variant var = v; + const auto ty = type; + s.draw = [&c, st, var, ty](QPainter &p, const QRect &r) { + QStyleOptionMenuItem opt; + c.base(opt, r, var.state, var.group); + opt.menuItemType = ty; + opt.maxIconWidth = 16; + opt.menuRect = r; + st->drawControl(QStyle::CE_MenuItem, &opt, &p, nullptr); + }; + out.append(s); + } + + // Tab shapes. + for (const auto &[v, doc] : QList>{{{QStringLiteral("selected"), QStyle::State_Selected}, false}, + {{QStringLiteral("unselected"), QStyle::State_None}, false}, + {{QStringLiteral("hover"), hover}, false}, + {{QStringLiteral("selected.document_mode"), QStyle::State_Selected}, true}, + {{QStringLiteral("unselected.document_mode"), QStyle::State_None}, true}}) { + Shot s; + s.id = QStringLiteral("tab.") + v.name; + s.control = QStringLiteral("CE_TabBarTabShape"); + s.state = stateDesc(v); + s.state.insert(QStringLiteral("document_mode"), doc); + s.size = QSize(80, 30); + s.rows = {0, 1, 2, 3, 15, 27, 28, 29}; + s.cols = {0, 1, 40, 79}; + const Variant var = v; + const bool d = doc; + s.draw = [&c, st, var, d](QPainter &p, const QRect &r) { + QStyleOptionTab opt; + c.base(opt, r, var.state, var.group); + opt.shape = QTabBar::RoundedNorth; + opt.position = QStyleOptionTab::Middle; + opt.selectedPosition = QStyleOptionTab::NotAdjacent; + opt.documentMode = d; + st->drawControl(QStyle::CE_TabBarTabShape, &opt, &p, nullptr); + }; + out.append(s); + } + + // Header section. + for (const Variant &v : {Variant{QStringLiteral("normal"), QStyle::State_Raised}, Variant{QStringLiteral("hover"), QStyle::State_Raised | hover}, + Variant{QStringLiteral("sunken"), sunken}}) { + Shot s; + s.id = QStringLiteral("header.") + v.name; + s.control = QStringLiteral("CE_HeaderSection"); + s.state = stateDesc(v); + s.size = QSize(100, 30); + s.background = QPalette::Base; + s.rows = {0, 15, 28, 29}; + s.cols = {0, 50, 98, 99}; + s.draw = [&c, st, v](QPainter &p, const QRect &r) { + QStyleOptionHeader opt; + c.base(opt, r, v.state | QStyle::State_Horizontal, v.group); + opt.orientation = Qt::Horizontal; + opt.section = 0; + opt.position = QStyleOptionHeader::Middle; + st->drawControl(QStyle::CE_HeaderSection, &opt, &p, nullptr); + }; + out.append(s); + } + + // Item-view row backgrounds. + for (const Variant &v : {Variant{QStringLiteral("normal"), QStyle::State_None}, Variant{QStringLiteral("hover"), hover}, + Variant{QStringLiteral("selected"), QStyle::State_Selected}, Variant{QStringLiteral("selected_hover"), QStyle::State_Selected | hover}, + Variant{QStringLiteral("selected_inactive_window"), QStyle::State_Selected, QPalette::Inactive}, + Variant{QStringLiteral("focus"), focus}}) { + Shot s; + s.id = QStringLiteral("item_view_row.") + v.name; + s.control = QStringLiteral("PE_PanelItemViewItem"); + s.state = stateDesc(v); + s.size = QSize(200, 24); + s.background = QPalette::Base; + s.group = v.group; + s.rows = {0, 1, 2, 12, 22, 23}; + s.cols = {0, 1, 2, 3, 100}; + s.draw = [&c, st, v](QPainter &p, const QRect &r) { + QStyleOptionViewItem opt; + c.base(opt, r, v.state, v.group); + opt.features = QStyleOptionViewItem::HasDisplay; + opt.viewItemPosition = QStyleOptionViewItem::OnlyOne; + opt.showDecorationSelected = true; + st->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, &p, nullptr); + }; + out.append(s); + } + + // Tooltip panel, generic frame, group box frame. + { + Shot s; + s.id = QStringLiteral("tooltip.panel"); + s.control = QStringLiteral("PE_PanelTipLabel"); + s.state = stateDesc({QStringLiteral("normal"), QStyle::State_None}); + s.size = QSize(100, 30); + s.background = QPalette::ToolTipBase; + s.rows = {0, 1, 15}; + s.cols = {0, 1, 50}; + s.draw = [&c, st](QPainter &p, const QRect &r) { + QStyleOptionFrame opt; + c.base(opt, r, QStyle::State_None, QPalette::Active); + st->drawPrimitive(QStyle::PE_PanelTipLabel, &opt, &p, nullptr); + }; + out.append(s); + } + { + Shot s; + s.id = QStringLiteral("frame.styled_panel"); + s.control = QStringLiteral("PE_Frame"); + s.state = stateDesc({QStringLiteral("sunken"), sunken}); + s.size = QSize(100, 50); + s.rows = {0, 1, 25}; + s.cols = {0, 1, 50}; + s.draw = [&c, st](QPainter &p, const QRect &r) { + QStyleOptionFrame opt; + c.base(opt, r, QStyle::State_Sunken, QPalette::Active); + opt.lineWidth = st->pixelMetric(QStyle::PM_DefaultFrameWidth, &opt, nullptr); + opt.frameShape = QFrame::StyledPanel; + st->drawPrimitive(QStyle::PE_Frame, &opt, &p, nullptr); + }; + out.append(s); + } + { + Shot s; + s.id = QStringLiteral("group_box.frame"); + s.control = QStringLiteral("PE_FrameGroupBox"); + s.state = stateDesc({QStringLiteral("normal"), QStyle::State_None}); + s.size = QSize(100, 60); + s.rows = {0, 1, 2, 30}; + s.cols = {0, 1, 2, 50}; + s.draw = [&c, st](QPainter &p, const QRect &r) { + QStyleOptionFrame opt; + c.base(opt, r, QStyle::State_None, QPalette::Active); + opt.lineWidth = 1; + st->drawPrimitive(QStyle::PE_FrameGroupBox, &opt, &p, nullptr); + }; + out.append(s); + } + return out; +} + +} // namespace + +int writePixels(const QString &path, const QString &schemeLabel) +{ + KSharedConfigPtr config = KSharedConfig::openConfig(); + const QPalette pal = KColorScheme::createApplicationPalette(config); + QApplication::setPalette(pal); + QFont font(QStringLiteral("Noto Sans")); + font.setPointSizeF(10); + QApplication::setFont(font); + + Ctx c{QApplication::style(), pal, font}; + QJsonArray records; + const QList all = shots(c); + for (const Shot &s : all) + records.append(runShot(s, pal)); + + QJsonObject env; + env.insert(QStringLiteral("scheme"), schemeLabel); + env.insert(QStringLiteral("kdeglobals_color_scheme"), config->group(QStringLiteral("General")).readEntry("ColorScheme", QString())); + env.insert(QStringLiteral("style"), c.style ? c.style->name() : QStringLiteral("none")); + env.insert(QStringLiteral("platform"), QGuiApplication::platformName()); + env.insert(QStringLiteral("image_format"), QStringLiteral("ARGB32, filled opaque with the palette background, then painted")); + + return golden::writeFile(path, + { + {QStringLiteral("meta"), golden::meta(QStringLiteral("pixels"))}, + {QStringLiteral("environment"), env}, + {QStringLiteral("records"), records, true}, + }) + ? 0 + : 1; +} diff --git a/tools/kde_golden/driver/resolve_vectors.cpp b/tools/kde_golden/driver/resolve_vectors.cpp new file mode 100644 index 000000000..02c953746 --- /dev/null +++ b/tools/kde_golden/driver/resolve_vectors.cpp @@ -0,0 +1,702 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech +// +// resolve.json: what KColorScheme and createApplicationPalette resolve for a +// set of input schemes. The installed schemes are read from the image at run +// time and never copied into the repository; the synthetic schemes are +// written below, in this file, and their full text is embedded in the output. + +#include "golden_json.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +namespace { + +struct Synthetic { + QString name; + QString purpose; + QString text; +}; + +// Hand-written inputs (MPL-2.0, original values). Each one isolates a rule. +const QList kSynthetic = { + {QStringLiteral("SyntheticNoHeader"), + QStringLiteral("no Colors:Header group and no ColorEffects groups: Header falls back, effects take their defaults"), + QStringLiteral("[General]\n" + "ColorScheme=SyntheticNoHeader\n" + "Name=Synthetic No Header\n" + "\n" + "[KDE]\n" + "contrast=7\n" + "\n" + "[Colors:View]\n" + "BackgroundNormal=250,248,240\n" + "BackgroundAlternate=240,236,226\n" + "ForegroundNormal=40,30,20\n" + "ForegroundInactive=120,110,100\n" + "ForegroundActive=200,90,10\n" + "ForegroundLink=10,90,200\n" + "ForegroundVisited=120,40,160\n" + "ForegroundNegative=190,20,40\n" + "ForegroundNeutral=200,140,0\n" + "ForegroundPositive=20,140,60\n" + "DecorationFocus=200,90,10\n" + "DecorationHover=230,130,50\n" + "\n" + "[Colors:Window]\n" + "BackgroundNormal=230,226,216\n" + "BackgroundAlternate=220,214,202\n" + "ForegroundNormal=30,25,20\n" + "ForegroundInactive=110,100,90\n" + "ForegroundActive=200,90,10\n" + "ForegroundLink=10,90,200\n" + "ForegroundVisited=120,40,160\n" + "ForegroundNegative=190,20,40\n" + "ForegroundNeutral=200,140,0\n" + "ForegroundPositive=20,140,60\n" + "DecorationFocus=200,90,10\n" + "DecorationHover=230,130,50\n" + "\n" + "[Colors:Button]\n" + "BackgroundNormal=236,232,224\n" + "BackgroundAlternate=210,204,190\n" + "ForegroundNormal=30,25,20\n" + "ForegroundInactive=110,100,90\n" + "ForegroundActive=200,90,10\n" + "ForegroundLink=10,90,200\n" + "ForegroundVisited=120,40,160\n" + "ForegroundNegative=190,20,40\n" + "ForegroundNeutral=200,140,0\n" + "ForegroundPositive=20,140,60\n" + "DecorationFocus=200,90,10\n" + "DecorationHover=230,130,50\n" + "\n" + "[Colors:Selection]\n" + "BackgroundNormal=200,90,10\n" + "BackgroundAlternate=170,80,20\n" + "ForegroundNormal=255,255,255\n" + "ForegroundInactive=240,220,200\n" + "ForegroundActive=255,240,200\n" + "ForegroundLink=255,230,160\n" + "ForegroundVisited=240,200,240\n" + "ForegroundNegative=255,180,180\n" + "ForegroundNeutral=255,230,120\n" + "ForegroundPositive=180,255,190\n" + "DecorationFocus=200,90,10\n" + "DecorationHover=230,130,50\n" + "\n" + "[Colors:Tooltip]\n" + "BackgroundNormal=255,250,220\n" + "BackgroundAlternate=245,238,200\n" + "ForegroundNormal=20,20,20\n" + "ForegroundInactive=100,100,90\n" + "ForegroundActive=200,90,10\n" + "ForegroundLink=10,90,200\n" + "ForegroundVisited=120,40,160\n" + "ForegroundNegative=190,20,40\n" + "ForegroundNeutral=200,140,0\n" + "ForegroundPositive=20,140,60\n" + "DecorationFocus=200,90,10\n" + "DecorationHover=230,130,50\n" + "\n" + "[Colors:Complementary]\n" + "BackgroundNormal=40,36,30\n" + "BackgroundAlternate=30,27,22\n" + "ForegroundNormal=240,235,225\n" + "ForegroundInactive=160,150,140\n" + "ForegroundActive=255,160,60\n" + "ForegroundLink=100,170,255\n" + "ForegroundVisited=200,140,230\n" + "ForegroundNegative=255,90,100\n" + "ForegroundNeutral=255,200,60\n" + "ForegroundPositive=90,220,130\n" + "DecorationFocus=255,160,60\n" + "DecorationHover=255,190,110\n")}, + + {QStringLiteral("SyntheticInactiveEffects"), + QStringLiteral("dark scheme, Header without an Inactive subgroup, Inactive effects enabled with the selection change; every effect kind with " + "non-zero amounts in both states"), + QStringLiteral("[General]\n" + "ColorScheme=SyntheticInactiveEffects\n" + "Name=Synthetic Inactive Effects\n" + "\n" + "[KDE]\n" + "contrast=2\n" + "frameContrast=0.35\n" + "\n" + "[ColorEffects:Inactive]\n" + "Enable=true\n" + "ChangeSelectionColor=true\n" + "IntensityEffect=1\n" + "IntensityAmount=0.25\n" + "ColorEffect=1\n" + "ColorAmount=0.3\n" + "Color=112,111,110\n" + "ContrastEffect=1\n" + "ContrastAmount=0.4\n" + "\n" + "[ColorEffects:Disabled]\n" + "IntensityEffect=3\n" + "IntensityAmount=0.2\n" + "ColorEffect=3\n" + "ColorAmount=0.5\n" + "Color=56,56,56\n" + "ContrastEffect=2\n" + "ContrastAmount=0.6\n" + "\n" + "[Colors:View]\n" + "BackgroundNormal=24,26,30\n" + "BackgroundAlternate=32,35,40\n" + "ForegroundNormal=220,224,230\n" + "ForegroundInactive=140,146,154\n" + "ForegroundActive=90,200,250\n" + "ForegroundLink=80,160,255\n" + "ForegroundVisited=170,120,230\n" + "ForegroundNegative=240,80,90\n" + "ForegroundNeutral=240,170,40\n" + "ForegroundPositive=60,200,110\n" + "DecorationFocus=90,200,250\n" + "DecorationHover=90,200,250\n" + "\n" + "[Colors:Window]\n" + "BackgroundNormal=36,39,44\n" + "BackgroundAlternate=30,33,38\n" + "ForegroundNormal=220,224,230\n" + "ForegroundInactive=140,146,154\n" + "ForegroundActive=90,200,250\n" + "ForegroundLink=80,160,255\n" + "ForegroundVisited=170,120,230\n" + "ForegroundNegative=240,80,90\n" + "ForegroundNeutral=240,170,40\n" + "ForegroundPositive=60,200,110\n" + "DecorationFocus=90,200,250\n" + "DecorationHover=90,200,250\n" + "\n" + "[Colors:Button]\n" + "BackgroundNormal=44,48,54\n" + "BackgroundAlternate=38,42,48\n" + "ForegroundNormal=220,224,230\n" + "ForegroundInactive=140,146,154\n" + "ForegroundActive=90,200,250\n" + "ForegroundLink=80,160,255\n" + "ForegroundVisited=170,120,230\n" + "ForegroundNegative=240,80,90\n" + "ForegroundNeutral=240,170,40\n" + "ForegroundPositive=60,200,110\n" + "DecorationFocus=90,200,250\n" + "DecorationHover=90,200,250\n" + "\n" + "[Colors:Selection]\n" + "BackgroundNormal=90,200,250\n" + "BackgroundAlternate=60,150,200\n" + "ForegroundNormal=10,10,10\n" + "ForegroundInactive=40,60,70\n" + "ForegroundActive=0,0,0\n" + "ForegroundLink=0,40,120\n" + "ForegroundVisited=70,20,110\n" + "ForegroundNegative=120,0,10\n" + "ForegroundNeutral=110,70,0\n" + "ForegroundPositive=0,90,30\n" + "DecorationFocus=90,200,250\n" + "DecorationHover=90,200,250\n" + "\n" + "[Colors:Tooltip]\n" + "BackgroundNormal=48,52,58\n" + "BackgroundAlternate=40,44,50\n" + "ForegroundNormal=230,232,236\n" + "ForegroundInactive=150,156,164\n" + "ForegroundActive=90,200,250\n" + "ForegroundLink=80,160,255\n" + "ForegroundVisited=170,120,230\n" + "ForegroundNegative=240,80,90\n" + "ForegroundNeutral=240,170,40\n" + "ForegroundPositive=60,200,110\n" + "DecorationFocus=90,200,250\n" + "DecorationHover=90,200,250\n" + "\n" + "[Colors:Complementary]\n" + "BackgroundNormal=16,18,20\n" + "BackgroundAlternate=12,13,15\n" + "ForegroundNormal=235,238,242\n" + "ForegroundInactive=150,156,164\n" + "ForegroundActive=90,200,250\n" + "ForegroundLink=80,160,255\n" + "ForegroundVisited=170,120,230\n" + "ForegroundNegative=240,80,90\n" + "ForegroundNeutral=240,170,40\n" + "ForegroundPositive=60,200,110\n" + "DecorationFocus=90,200,250\n" + "DecorationHover=90,200,250\n" + "\n" + "[Colors:Header]\n" + "BackgroundNormal=52,56,62\n" + "BackgroundAlternate=36,39,44\n" + "ForegroundNormal=225,228,234\n" + "ForegroundInactive=140,146,154\n" + "ForegroundActive=90,200,250\n" + "ForegroundLink=80,160,255\n" + "ForegroundVisited=170,120,230\n" + "ForegroundNegative=240,80,90\n" + "ForegroundNeutral=240,170,40\n" + "ForegroundPositive=60,200,110\n" + "DecorationFocus=90,200,250\n" + "DecorationHover=90,200,250\n")}, + + {QStringLiteral("SyntheticInactiveSubgroups"), + QStringLiteral("Inactive effects enabled without the selection change, plus explicit Inactive subgroups for Header, View and (partial) " + "Window; Disabled uses shade, desaturate and fade"), + QStringLiteral("[General]\n" + "ColorScheme=SyntheticInactiveSubgroups\n" + "Name=Synthetic Inactive Subgroups\n" + "\n" + "[KDE]\n" + "contrast=5\n" + "\n" + "[ColorEffects:Inactive]\n" + "Enable=true\n" + "ChangeSelectionColor=false\n" + "IntensityEffect=2\n" + "IntensityAmount=0.15\n" + "ColorEffect=2\n" + "ColorAmount=0.25\n" + "Color=200,0,0\n" + "ContrastEffect=2\n" + "ContrastAmount=0.3\n" + "\n" + "[ColorEffects:Disabled]\n" + "IntensityEffect=1\n" + "IntensityAmount=-0.5\n" + "ColorEffect=1\n" + "ColorAmount=0.8\n" + "ContrastEffect=1\n" + "ContrastAmount=0.5\n" + "\n" + "[Colors:View]\n" + "BackgroundNormal=255,255,255\n" + "BackgroundAlternate=245,247,250\n" + "ForegroundNormal=20,22,26\n" + "ForegroundInactive=110,116,124\n" + "ForegroundActive=0,120,215\n" + "ForegroundLink=0,100,200\n" + "ForegroundVisited=110,60,180\n" + "ForegroundNegative=200,30,40\n" + "ForegroundNeutral=190,120,0\n" + "ForegroundPositive=20,130,50\n" + "DecorationFocus=0,120,215\n" + "DecorationHover=60,150,230\n" + "\n" + "[Colors:View][Inactive]\n" + "BackgroundNormal=250,250,250\n" + "ForegroundNormal=60,62,66\n" + "\n" + "[Colors:Window]\n" + "BackgroundNormal=240,241,243\n" + "BackgroundAlternate=228,230,233\n" + "ForegroundNormal=20,22,26\n" + "ForegroundInactive=110,116,124\n" + "ForegroundActive=0,120,215\n" + "ForegroundLink=0,100,200\n" + "ForegroundVisited=110,60,180\n" + "ForegroundNegative=200,30,40\n" + "ForegroundNeutral=190,120,0\n" + "ForegroundPositive=20,130,50\n" + "DecorationFocus=0,120,215\n" + "DecorationHover=60,150,230\n" + "\n" + "[Colors:Window][Inactive]\n" + "BackgroundNormal=232,233,235\n" + "\n" + "[Colors:Button]\n" + "BackgroundNormal=248,249,250\n" + "BackgroundAlternate=220,222,226\n" + "ForegroundNormal=20,22,26\n" + "ForegroundInactive=110,116,124\n" + "ForegroundActive=0,120,215\n" + "ForegroundLink=0,100,200\n" + "ForegroundVisited=110,60,180\n" + "ForegroundNegative=200,30,40\n" + "ForegroundNeutral=190,120,0\n" + "ForegroundPositive=20,130,50\n" + "DecorationFocus=0,120,215\n" + "DecorationHover=60,150,230\n" + "\n" + "[Colors:Selection]\n" + "BackgroundNormal=0,120,215\n" + "BackgroundAlternate=0,100,180\n" + "ForegroundNormal=255,255,255\n" + "ForegroundInactive=200,220,240\n" + "ForegroundActive=255,255,255\n" + "ForegroundLink=220,240,255\n" + "ForegroundVisited=230,210,255\n" + "ForegroundNegative=255,200,200\n" + "ForegroundNeutral=255,230,170\n" + "ForegroundPositive=200,255,210\n" + "DecorationFocus=0,120,215\n" + "DecorationHover=60,150,230\n" + "\n" + "[Colors:Tooltip]\n" + "BackgroundNormal=250,250,250\n" + "BackgroundAlternate=240,240,240\n" + "ForegroundNormal=20,22,26\n" + "ForegroundInactive=110,116,124\n" + "ForegroundActive=0,120,215\n" + "ForegroundLink=0,100,200\n" + "ForegroundVisited=110,60,180\n" + "ForegroundNegative=200,30,40\n" + "ForegroundNeutral=190,120,0\n" + "ForegroundPositive=20,130,50\n" + "DecorationFocus=0,120,215\n" + "DecorationHover=60,150,230\n" + "\n" + "[Colors:Complementary]\n" + "BackgroundNormal=30,32,36\n" + "BackgroundAlternate=24,26,30\n" + "ForegroundNormal=240,242,245\n" + "ForegroundInactive=150,156,164\n" + "ForegroundActive=80,170,255\n" + "ForegroundLink=80,170,255\n" + "ForegroundVisited=180,140,240\n" + "ForegroundNegative=255,90,100\n" + "ForegroundNeutral=255,190,60\n" + "ForegroundPositive=80,210,120\n" + "DecorationFocus=80,170,255\n" + "DecorationHover=110,190,255\n" + "\n" + "[Colors:Header]\n" + "BackgroundNormal=226,228,232\n" + "BackgroundAlternate=240,241,243\n" + "ForegroundNormal=20,22,26\n" + "ForegroundInactive=110,116,124\n" + "ForegroundActive=0,120,215\n" + "ForegroundLink=0,100,200\n" + "ForegroundVisited=110,60,180\n" + "ForegroundNegative=200,30,40\n" + "ForegroundNeutral=190,120,0\n" + "ForegroundPositive=20,130,50\n" + "DecorationFocus=0,120,215\n" + "DecorationHover=60,150,230\n" + "\n" + "[Colors:Header][Inactive]\n" + "BackgroundNormal=240,241,243\n" + "BackgroundAlternate=226,228,232\n" + "ForegroundNormal=90,94,100\n" + "ForegroundInactive=130,136,144\n" + "ForegroundActive=0,120,215\n" + "ForegroundLink=0,100,200\n" + "ForegroundVisited=110,60,180\n" + "ForegroundNegative=200,30,40\n" + "ForegroundNeutral=190,120,0\n" + "ForegroundPositive=20,130,50\n" + "DecorationFocus=0,120,215\n" + "DecorationHover=60,150,230\n")}, + + {QStringLiteral("SyntheticAccentKeys"), + QStringLiteral("a light scheme carrying the [General] accent keys (AccentColor, TintFactor, TitlebarIsAccentColored) and a [WM] group; " + "shows which of them KColorScheme itself reads"), + QStringLiteral("[General]\n" + "ColorScheme=SyntheticAccentKeys\n" + "Name=Synthetic Accent Keys\n" + "AccentColor=233,58,154\n" + "TintFactor=0.3\n" + "TitlebarIsAccentColored=true\n" + "\n" + "[KDE]\n" + "contrast=4\n" + "\n" + "[WM]\n" + "activeBackground=200,40,120\n" + "activeForeground=255,255,255\n" + "inactiveBackground=240,230,236\n" + "inactiveForeground=120,100,110\n" + "\n" + "[Colors:View]\n" + "BackgroundNormal=252,252,252\n" + "ForegroundNormal=35,38,41\n" + "DecorationFocus=61,174,233\n" + "\n" + "[Colors:Window]\n" + "BackgroundNormal=239,240,241\n" + "ForegroundNormal=35,38,41\n" + "\n" + "[Colors:Selection]\n" + "BackgroundNormal=61,174,233\n" + "ForegroundNormal=255,255,255\n")}, + + {QStringLiteral("SyntheticEmpty"), + QStringLiteral("an empty file: every value is KColorScheme's built-in default"), + QString()}, + + {QStringLiteral("SyntheticMalformed"), + QStringLiteral("value syntax edge cases (hex, alpha, spaces, named colour, too few components, empty value), an out-of-range " + "contrast and effect id, a duplicated key and a duplicated group"), + QStringLiteral("[General]\n" + "ColorScheme=SyntheticMalformed\n" + "Name=Synthetic Malformed\n" + "\n" + "[KDE]\n" + "contrast=15\n" + "\n" + "[ColorEffects:Disabled]\n" + "IntensityEffect=7\n" + "IntensityAmount=0.4\n" + "ColorEffect=0\n" + "ContrastEffect=1\n" + "ContrastAmount=2.5\n" + "\n" + "[Colors:View]\n" + "BackgroundNormal=#ff8800\n" + "BackgroundAlternate=10,20,30,128\n" + "ForegroundNormal= 12 , 34 , 56 \n" + "ForegroundInactive=300,20\n" + "ForegroundActive=red\n" + "ForegroundLink=\n" + "ForegroundVisited=256,-1,1000\n" + "ForegroundPositive=0,100,0\n" + "ForegroundPositive=0,200,0\n" + "\n" + "[Colors:Window]\n" + "BackgroundNormal=100,100,100\n" + "ForegroundNormal=1,2,3\n" + "\n" + "[Colors:Window]\n" + "BackgroundNormal=200,200,200\n" + "\n" + "[Colors:Selection]\n" + "BackgroundNormal=0,0,0\n")}, + + {QStringLiteral("SyntheticValueForms"), + QStringLiteral("more value forms: an empty boolean (Inactive effects Enable=), a signed component, the 3-, 9- and 12-digit hex " + "forms, colour names in other cases, transparent, a trailing comma, a hex component and an unknown CSS name"), + QStringLiteral("[General]\n" + "ColorScheme=SyntheticValueForms\n" + "Name=Synthetic Value Forms\n" + "\n" + "[ColorEffects:Inactive]\n" + "Enable=\n" + "ChangeSelectionColor=off\n" + "\n" + "[Colors:View]\n" + "BackgroundNormal=+250,240,230\n" + "BackgroundAlternate=#abc\n" + "ForegroundNormal=#123456789\n" + "ForegroundInactive=#123456789abc\n" + "ForegroundActive=Red\n" + "ForegroundLink=grey\n" + "ForegroundVisited=rebeccapurple\n" + "ForegroundNegative=10,20,30,\n" + "ForegroundNeutral=0x10,20,30\n" + "ForegroundPositive=transparent\n" + "DecorationFocus=#803daee9\n" + "\n" + "[Colors:Window]\n" + "BackgroundNormal=200,190,180\n")}, +}; + +const QList> kSets = { + {KColorScheme::View, QStringLiteral("View")}, + {KColorScheme::Window, QStringLiteral("Window")}, + {KColorScheme::Button, QStringLiteral("Button")}, + {KColorScheme::Selection, QStringLiteral("Selection")}, + {KColorScheme::Tooltip, QStringLiteral("Tooltip")}, + {KColorScheme::Complementary, QStringLiteral("Complementary")}, + {KColorScheme::Header, QStringLiteral("Header")}, +}; + +const QList> kStates = { + {QPalette::Active, QStringLiteral("Active")}, + {QPalette::Inactive, QStringLiteral("Inactive")}, + {QPalette::Disabled, QStringLiteral("Disabled")}, +}; + +const QList> kBg = { + {KColorScheme::NormalBackground, QStringLiteral("Normal")}, + {KColorScheme::AlternateBackground, QStringLiteral("Alternate")}, + {KColorScheme::ActiveBackground, QStringLiteral("Active")}, + {KColorScheme::LinkBackground, QStringLiteral("Link")}, + {KColorScheme::VisitedBackground, QStringLiteral("Visited")}, + {KColorScheme::NegativeBackground, QStringLiteral("Negative")}, + {KColorScheme::NeutralBackground, QStringLiteral("Neutral")}, + {KColorScheme::PositiveBackground, QStringLiteral("Positive")}, +}; + +const QList> kFg = { + {KColorScheme::NormalText, QStringLiteral("Normal")}, + {KColorScheme::InactiveText, QStringLiteral("Inactive")}, + {KColorScheme::ActiveText, QStringLiteral("Active")}, + {KColorScheme::LinkText, QStringLiteral("Link")}, + {KColorScheme::VisitedText, QStringLiteral("Visited")}, + {KColorScheme::NegativeText, QStringLiteral("Negative")}, + {KColorScheme::NeutralText, QStringLiteral("Neutral")}, + {KColorScheme::PositiveText, QStringLiteral("Positive")}, +}; + +const QList> kDeco = { + {KColorScheme::FocusColor, QStringLiteral("Focus")}, + {KColorScheme::HoverColor, QStringLiteral("Hover")}, +}; + +const QList> kShade = { + {KColorScheme::LightShade, QStringLiteral("Light")}, + {KColorScheme::MidlightShade, QStringLiteral("Midlight")}, + {KColorScheme::MidShade, QStringLiteral("Mid")}, + {KColorScheme::DarkShade, QStringLiteral("Dark")}, + {KColorScheme::ShadowShade, QStringLiteral("Shadow")}, +}; + +void collectGroup(const KConfigGroup &g, const QString &path, QJsonObject &out) +{ + const QMap map = g.entryMap(); + QJsonObject entries; + for (auto it = map.cbegin(); it != map.cend(); ++it) + entries.insert(it.key(), it.value()); + if (!entries.isEmpty()) + out.insert(path, entries); + const QStringList subs = g.groupList(); + for (const QString &sub : subs) + collectGroup(g.group(sub), path + QStringLiteral("][") + sub, out); +} + +QJsonObject parsedInput(const KSharedConfigPtr &config) +{ + QJsonObject out; + const QStringList tops = config->groupList(); + for (const QString &top : tops) + collectGroup(config->group(top), top, out); + return out; +} + +QJsonObject resolveScheme(const KSharedConfigPtr &config) +{ + QJsonObject sets; + for (const auto &set : kSets) { + QJsonObject states; + for (const auto &state : kStates) { + const KColorScheme cs(state.first, set.first, config); + QJsonObject bg, fg, deco, shade; + for (const auto &r : kBg) + bg.insert(r.second, golden::color(cs.background(r.first).color())); + for (const auto &r : kFg) + fg.insert(r.second, golden::color(cs.foreground(r.first).color())); + for (const auto &r : kDeco) + deco.insert(r.second, golden::color(cs.decoration(r.first).color())); + for (const auto &r : kShade) + shade.insert(r.second, golden::color(cs.shade(r.first))); + QJsonObject st; + st.insert(QStringLiteral("background"), bg); + st.insert(QStringLiteral("foreground"), fg); + st.insert(QStringLiteral("decoration"), deco); + st.insert(QStringLiteral("shade"), shade); + states.insert(state.second, st); + } + sets.insert(set.second, states); + } + return sets; +} + +QJsonObject paletteOf(const KSharedConfigPtr &config) +{ + const QPalette pal = KColorScheme::createApplicationPalette(config); + const QMetaEnum roles = QMetaEnum::fromType(); + QJsonObject out; + for (const auto &state : kStates) { + QJsonObject g; + for (int i = 0; i < roles.keyCount(); ++i) { + const int v = roles.value(i); + if (v < 0 || v >= QPalette::NColorRoles || v == QPalette::NoRole) + continue; + g.insert(QString::fromLatin1(roles.key(i)), golden::color(pal.color(state.first, QPalette::ColorRole(v)))); + } + out.insert(state.second, g); + } + return out; +} + +QJsonObject schemeRecord(const QString &name, const QString &file, const KSharedConfigPtr &config) +{ + QJsonObject o; + o.insert(QStringLiteral("name"), name); + o.insert(QStringLiteral("input"), parsedInput(config)); + o.insert(QStringLiteral("contrastF"), KColorScheme::contrastF(config)); + o.insert(QStringLiteral("frameContrast"), KColorScheme::frameContrast(config)); + QJsonObject supported; + for (const auto &set : kSets) + supported.insert(set.second, KColorScheme::isColorSetSupported(config, set.first)); + o.insert(QStringLiteral("set_supported"), supported); + o.insert(QStringLiteral("sets"), resolveScheme(config)); + o.insert(QStringLiteral("palette"), paletteOf(config)); + QFile f(file); + if (f.open(QIODevice::ReadOnly)) + o.insert(QStringLiteral("sha256"), QString::fromLatin1(QCryptographicHash::hash(f.readAll(), QCryptographicHash::Sha256).toHex())); + return o; +} + +} // namespace + +int writeResolve(const QString &path) +{ + QJsonArray schemes; + + // Installed schemes, in a fixed order; a missing one is reported, not fatal. + const QStringList installed = {QStringLiteral("BreezeLight"), + QStringLiteral("BreezeDark"), + QStringLiteral("BreezeClassic"), + QStringLiteral("Oxygen"), + QStringLiteral("OxygenCold"), + QStringLiteral("OxygenDark")}; + QJsonArray missing; + for (const QString &name : installed) { + const QString file = QStringLiteral("/usr/share/color-schemes/%1.colors").arg(name); + if (!QFile::exists(file)) { + missing.append(name); + continue; + } + KSharedConfigPtr config = KSharedConfig::openConfig(file, KConfig::SimpleConfig); + QJsonObject rec = schemeRecord(name, file, config); + rec.insert(QStringLiteral("origin"), QStringLiteral("installed")); + rec.insert(QStringLiteral("source"), file); + schemes.append(rec); + } + + QTemporaryDir dir; + if (!dir.isValid()) { + std::fprintf(stderr, "no temporary directory\n"); + return 1; + } + for (const Synthetic &s : kSynthetic) { + const QString file = dir.filePath(s.name + QStringLiteral(".colors")); + QFile f(file); + if (!f.open(QIODevice::WriteOnly)) { + std::fprintf(stderr, "cannot write %s\n", qPrintable(file)); + return 1; + } + f.write(s.text.toUtf8()); + f.close(); + KSharedConfigPtr config = KSharedConfig::openConfig(file, KConfig::SimpleConfig); + QJsonObject rec = schemeRecord(s.name, file, config); + rec.insert(QStringLiteral("origin"), QStringLiteral("synthetic")); + rec.insert(QStringLiteral("purpose"), s.purpose); + rec.insert(QStringLiteral("source_text"), s.text); + schemes.append(rec); + } + + return golden::writeFile(path, + { + {QStringLiteral("meta"), golden::meta(QStringLiteral("resolve"))}, + {QStringLiteral("missing_installed"), missing}, + {QStringLiteral("schemes"), schemes, true}, + }) + ? 0 + : 1; +} diff --git a/tools/kde_golden/driver/size_vectors.cpp b/tools/kde_golden/driver/size_vectors.cpp new file mode 100644 index 000000000..db8dec59e --- /dev/null +++ b/tools/kde_golden/driver/size_vectors.cpp @@ -0,0 +1,1082 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech +// +// sizes.json: what the Breeze QStyle reports, through QStyle and through the +// widgets' own sizeHint, under QT_QPA_PLATFORM=offscreen. Every widget is +// created hidden, polished with the Breeze style, measured, then destroyed. + +#include "golden_json.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace { + +// Every measured widget except a QMenu is given this parent, so the style +// sees an ordinary child widget rather than a top-level window (Breeze, for +// one, answers the layout margins differently for a window). +QWidget *gHost = nullptr; + +void adopt(QWidget *w) +{ + if (gHost && !w->parentWidget() && !w->inherits("QMenu")) + w->setParent(gHost); +} + +QJsonArray sz(const QSize &s) +{ + return QJsonArray{s.width(), s.height()}; +} + +QJsonArray rc(const QRect &r) +{ + return QJsonArray{r.x(), r.y(), r.width(), r.height()}; +} + +QIcon testIcon() +{ + QPixmap pm(64, 64); + pm.fill(QColor(61, 174, 233)); + return QIcon(pm); +} + +QJsonObject fontRecord(const QFont &font) +{ + const QFontInfo info(font); + const QFontMetrics fm(font); + const QFontMetricsF fmf(font); + QJsonObject o; + o.insert(QStringLiteral("requested_family"), font.family()); + o.insert(QStringLiteral("requested_point_size"), font.pointSizeF()); + o.insert(QStringLiteral("resolved_family"), info.family()); + o.insert(QStringLiteral("resolved_style"), info.styleName()); + o.insert(QStringLiteral("resolved_point_size"), info.pointSizeF()); + o.insert(QStringLiteral("resolved_pixel_size"), info.pixelSize()); + o.insert(QStringLiteral("exact_match"), info.exactMatch()); + o.insert(QStringLiteral("to_string"), font.toString()); + QJsonObject i; + i.insert(QStringLiteral("height"), fm.height()); + i.insert(QStringLiteral("ascent"), fm.ascent()); + i.insert(QStringLiteral("descent"), fm.descent()); + i.insert(QStringLiteral("leading"), fm.leading()); + i.insert(QStringLiteral("line_spacing"), fm.lineSpacing()); + i.insert(QStringLiteral("x_height"), fm.xHeight()); + i.insert(QStringLiteral("cap_height"), fm.capHeight()); + i.insert(QStringLiteral("average_char_width"), fm.averageCharWidth()); + i.insert(QStringLiteral("max_width"), fm.maxWidth()); + o.insert(QStringLiteral("metrics"), i); + QJsonObject f; + f.insert(QStringLiteral("height"), fmf.height()); + f.insert(QStringLiteral("ascent"), fmf.ascent()); + f.insert(QStringLiteral("descent"), fmf.descent()); + f.insert(QStringLiteral("leading"), fmf.leading()); + f.insert(QStringLiteral("line_spacing"), fmf.lineSpacing()); + f.insert(QStringLiteral("x_height"), fmf.xHeight()); + f.insert(QStringLiteral("cap_height"), fmf.capHeight()); + f.insert(QStringLiteral("average_char_width"), fmf.averageCharWidth()); + f.insert(QStringLiteral("max_width"), fmf.maxWidth()); + o.insert(QStringLiteral("metrics_f"), f); + QJsonObject adv; + for (const QString &s : {QStringLiteral("M"), QStringLiteral("x"), QStringLiteral("0"), QStringLiteral("OK"), + QStringLiteral("Cancel"), QStringLiteral("The quick brown fox")}) { + adv.insert(s, QJsonArray{fm.horizontalAdvance(s), fmf.horizontalAdvance(s)}); + } + o.insert(QStringLiteral("advance"), adv); + return o; +} + +struct Recorder { + QJsonArray out; + + void add(const QString &id, QWidget *w, const QJsonObject &config = {}, const QJsonObject &extra = {}) + { + adopt(w); + w->ensurePolished(); + QJsonObject o; + o.insert(QStringLiteral("id"), id); + o.insert(QStringLiteral("class"), QString::fromLatin1(w->metaObject()->className())); + if (!config.isEmpty()) + o.insert(QStringLiteral("config"), config); + o.insert(QStringLiteral("size_hint"), sz(w->sizeHint())); + o.insert(QStringLiteral("minimum_size_hint"), sz(w->minimumSizeHint())); + for (auto it = extra.begin(); it != extra.end(); ++it) + o.insert(it.key(), it.value()); + out.append(o); + } +}; + +QJsonObject cfg(std::initializer_list> kv) +{ + QJsonObject o; + for (const auto &p : kv) + o.insert(p.first, p.second); + return o; +} + +QStandardItemModel *rowsModel(QObject *parent, bool icon, bool check) +{ + auto *m = new QStandardItemModel(parent); + m->setHorizontalHeaderLabels({QStringLiteral("Name"), QStringLiteral("Size")}); + for (const QString &t : {QStringLiteral("Row one"), QStringLiteral("Row two")}) { + auto *a = new QStandardItem(t); + if (icon) + a->setIcon(testIcon()); + if (check) { + a->setCheckable(true); + a->setCheckState(Qt::Checked); + } + m->appendRow({a, new QStandardItem(QStringLiteral("12 KiB"))}); + } + return m; +} + +QJsonArray widgetsFor() +{ + Recorder r; + const QIcon icon = testIcon(); + + { + QLabel w(QStringLiteral("Label")); + r.add(QStringLiteral("label"), &w, cfg({{QStringLiteral("text"), QStringLiteral("Label")}})); + } + for (const QString &t : {QStringLiteral("OK"), QStringLiteral("Cancel"), QStringLiteral("Apply changes")}) { + QPushButton w(t); + r.add(QStringLiteral("push_button"), &w, cfg({{QStringLiteral("text"), t}})); + } + { + QPushButton w(icon, QStringLiteral("Save")); + r.add(QStringLiteral("push_button.icon"), &w, cfg({{QStringLiteral("text"), QStringLiteral("Save")}, {QStringLiteral("icon"), true}})); + } + { + QPushButton w(QStringLiteral("OK")); + w.setDefault(true); + r.add(QStringLiteral("push_button.default"), &w, cfg({{QStringLiteral("text"), QStringLiteral("OK")}, {QStringLiteral("default"), true}})); + } + { + QPushButton w(QStringLiteral("OK")); + w.setFlat(true); + r.add(QStringLiteral("push_button.flat"), &w, cfg({{QStringLiteral("text"), QStringLiteral("OK")}, {QStringLiteral("flat"), true}})); + } + { + QPushButton w; + w.setIcon(icon); + r.add(QStringLiteral("push_button.icon_only"), &w, cfg({{QStringLiteral("icon"), true}})); + } + + struct Tb { + QString id; + bool autoRaise; + int iconSize; + Qt::ToolButtonStyle style; + QToolButton::ToolButtonPopupMode popup; + bool menu; + }; + const QList tbs = { + {QStringLiteral("tool_button.auto_raise.16"), true, 16, Qt::ToolButtonIconOnly, QToolButton::DelayedPopup, false}, + {QStringLiteral("tool_button.auto_raise.22"), true, 22, Qt::ToolButtonIconOnly, QToolButton::DelayedPopup, false}, + {QStringLiteral("tool_button.framed.16"), false, 16, Qt::ToolButtonIconOnly, QToolButton::DelayedPopup, false}, + {QStringLiteral("tool_button.framed.22"), false, 22, Qt::ToolButtonIconOnly, QToolButton::DelayedPopup, false}, + {QStringLiteral("tool_button.text_beside_icon.16"), true, 16, Qt::ToolButtonTextBesideIcon, QToolButton::DelayedPopup, false}, + {QStringLiteral("tool_button.text_under_icon.22"), true, 22, Qt::ToolButtonTextUnderIcon, QToolButton::DelayedPopup, false}, + {QStringLiteral("tool_button.menu_button_popup.16"), true, 16, Qt::ToolButtonIconOnly, QToolButton::MenuButtonPopup, true}, + {QStringLiteral("tool_button.instant_popup.16"), true, 16, Qt::ToolButtonIconOnly, QToolButton::InstantPopup, true}, + }; + for (const Tb &t : tbs) { + QToolButton w; + QMenu menu; + w.setIcon(icon); + w.setText(QStringLiteral("Tool")); + w.setAutoRaise(t.autoRaise); + w.setIconSize(QSize(t.iconSize, t.iconSize)); + w.setToolButtonStyle(t.style); + if (t.menu) { + menu.addAction(QStringLiteral("Entry")); + w.setMenu(&menu); + w.setPopupMode(t.popup); + } + r.add(t.id, &w, + cfg({{QStringLiteral("auto_raise"), t.autoRaise}, + {QStringLiteral("icon_size"), t.iconSize}, + {QStringLiteral("text"), QStringLiteral("Tool")}, + {QStringLiteral("style"), int(t.style)}, + {QStringLiteral("popup_mode"), t.menu ? int(t.popup) : -1}})); + } + + { + QLineEdit w; + r.add(QStringLiteral("line_edit"), &w); + } + { + QLineEdit w(QStringLiteral("Text")); + w.setClearButtonEnabled(true); + r.add(QStringLiteral("line_edit.clear_button"), &w, cfg({{QStringLiteral("clear_button"), true}})); + } + { + QLineEdit w; + w.setFrame(false); + r.add(QStringLiteral("line_edit.frameless"), &w, cfg({{QStringLiteral("frame"), false}})); + } + { + QComboBox w; + w.addItems({QStringLiteral("Item"), QStringLiteral("Longer item text")}); + r.add(QStringLiteral("combo_box"), &w, cfg({{QStringLiteral("items"), QJsonArray{QStringLiteral("Item"), QStringLiteral("Longer item text")}}})); + } + { + QComboBox w; + w.setEditable(true); + w.addItems({QStringLiteral("Item"), QStringLiteral("Longer item text")}); + r.add(QStringLiteral("combo_box.editable"), &w, cfg({{QStringLiteral("editable"), true}})); + } + { + QComboBox w; + w.addItem(icon, QStringLiteral("Item")); + r.add(QStringLiteral("combo_box.icon"), &w, cfg({{QStringLiteral("icon"), true}})); + } + { + QSpinBox w; + w.setRange(0, 99); + r.add(QStringLiteral("spin_box.0_99"), &w, cfg({{QStringLiteral("range"), QJsonArray{0, 99}}})); + } + { + QSpinBox w; + w.setRange(0, 9999); + r.add(QStringLiteral("spin_box.0_9999"), &w, cfg({{QStringLiteral("range"), QJsonArray{0, 9999}}})); + } + { + QDoubleSpinBox w; + w.setRange(0, 100); + w.setDecimals(2); + r.add(QStringLiteral("double_spin_box"), &w, cfg({{QStringLiteral("range"), QJsonArray{0, 100}}, {QStringLiteral("decimals"), 2}})); + } + { + QSpinBox w; + w.setRange(0, 99); + w.setButtonSymbols(QAbstractSpinBox::NoButtons); + r.add(QStringLiteral("spin_box.no_buttons"), &w, cfg({{QStringLiteral("range"), QJsonArray{0, 99}}, {QStringLiteral("buttons"), false}})); + } + { + QCheckBox w(QStringLiteral("Check")); + r.add(QStringLiteral("check_box"), &w, cfg({{QStringLiteral("text"), QStringLiteral("Check")}})); + } + { + QCheckBox w; + r.add(QStringLiteral("check_box.no_text"), &w); + } + { + QRadioButton w(QStringLiteral("Radio")); + r.add(QStringLiteral("radio_button"), &w, cfg({{QStringLiteral("text"), QStringLiteral("Radio")}})); + } + { + QRadioButton w; + r.add(QStringLiteral("radio_button.no_text"), &w); + } + + struct Sl { + QString id; + Qt::Orientation o; + QSlider::TickPosition t; + }; + for (const Sl &s : {Sl{QStringLiteral("slider.horizontal"), Qt::Horizontal, QSlider::NoTicks}, + Sl{QStringLiteral("slider.horizontal.ticks_below"), Qt::Horizontal, QSlider::TicksBelow}, + Sl{QStringLiteral("slider.horizontal.ticks_both"), Qt::Horizontal, QSlider::TicksBothSides}, + Sl{QStringLiteral("slider.vertical"), Qt::Vertical, QSlider::NoTicks}}) { + QSlider w(s.o); + w.setTickPosition(s.t); + r.add(s.id, &w, cfg({{QStringLiteral("orientation"), int(s.o)}, {QStringLiteral("ticks"), int(s.t)}})); + } + for (Qt::Orientation o : {Qt::Horizontal, Qt::Vertical}) { + QScrollBar w(o); + r.add(o == Qt::Horizontal ? QStringLiteral("scroll_bar.horizontal") : QStringLiteral("scroll_bar.vertical"), &w); + } + { + QProgressBar w; + w.setValue(50); + r.add(QStringLiteral("progress_bar"), &w, cfg({{QStringLiteral("text_visible"), true}})); + } + { + QProgressBar w; + w.setValue(50); + w.setTextVisible(false); + r.add(QStringLiteral("progress_bar.no_text"), &w, cfg({{QStringLiteral("text_visible"), false}})); + } + { + QProgressBar w; + w.setOrientation(Qt::Vertical); + w.setValue(50); + r.add(QStringLiteral("progress_bar.vertical"), &w, cfg({{QStringLiteral("orientation"), int(Qt::Vertical)}})); + } + + // Menus: action rows, read back through actionGeometry. + for (bool icons : {true, false}) { + QMenu menu; + QMenu sub(QStringLiteral("Submenu")); + sub.addAction(QStringLiteral("Inner")); + QAction *a = menu.addAction(QStringLiteral("Open")); + if (icons) + a->setIcon(icon); + QAction *b = menu.addAction(QStringLiteral("Save")); + b->setShortcut(QKeySequence(QStringLiteral("Ctrl+S"))); + menu.addSeparator(); + menu.addSection(QStringLiteral("Section")); + QAction *c = menu.addAction(QStringLiteral("Checkable")); + c->setCheckable(true); + c->setChecked(true); + menu.addMenu(&sub); + adopt(&menu); + menu.ensurePolished(); + QJsonArray rows; + const QList actions = menu.actions(); + for (QAction *act : actions) { + QJsonObject row; + QString kind = QStringLiteral("item"); + if (act->isSeparator()) + kind = act->text().isEmpty() ? QStringLiteral("separator") : QStringLiteral("section"); + else if (act->menu()) + kind = QStringLiteral("submenu"); + else if (act->isCheckable()) + kind = QStringLiteral("checkable"); + else if (!act->shortcut().isEmpty()) + kind = QStringLiteral("shortcut"); + row.insert(QStringLiteral("kind"), kind); + row.insert(QStringLiteral("text"), act->text()); + row.insert(QStringLiteral("icon"), !act->icon().isNull()); + row.insert(QStringLiteral("geometry"), rc(menu.actionGeometry(act))); + rows.append(row); + } + r.add(icons ? QStringLiteral("menu.with_icon") : QStringLiteral("menu.no_icons"), &menu, cfg({{QStringLiteral("icons"), icons}}), + cfg({{QStringLiteral("rows"), rows}})); + } + + // Tab bars. + struct Tab { + QString id; + bool document; + bool closable; + QTabBar::Shape shape; + }; + for (const Tab &t : {Tab{QStringLiteral("tab_bar"), false, false, QTabBar::RoundedNorth}, + Tab{QStringLiteral("tab_bar.document_mode"), true, false, QTabBar::RoundedNorth}, + Tab{QStringLiteral("tab_bar.closable"), false, true, QTabBar::RoundedNorth}, + Tab{QStringLiteral("tab_bar.west"), false, false, QTabBar::RoundedWest}, + Tab{QStringLiteral("tab_bar.south"), false, false, QTabBar::RoundedSouth}}) { + QTabBar w; + w.setDocumentMode(t.document); + w.setTabsClosable(t.closable); + w.setShape(t.shape); + w.setExpanding(false); + for (const QString &s : {QStringLiteral("Tab"), QStringLiteral("Second tab"), QStringLiteral("Third")}) + w.addTab(s); + adopt(&w); + w.ensurePolished(); + w.resize(w.sizeHint()); + QJsonArray tabs; + for (int i = 0; i < w.count(); ++i) + tabs.append(rc(w.tabRect(i))); + r.add(t.id, &w, + cfg({{QStringLiteral("document_mode"), t.document}, {QStringLiteral("closable"), t.closable}, {QStringLiteral("shape"), int(t.shape)}, + {QStringLiteral("tabs"), QJsonArray{QStringLiteral("Tab"), QStringLiteral("Second tab"), QStringLiteral("Third")}}}), + cfg({{QStringLiteral("tab_rects"), tabs}})); + } + + // Header sections and item-view rows. + { + QTableView view; + view.setModel(rowsModel(&view, false, false)); + view.horizontalHeader()->setSortIndicatorShown(false); + adopt(&view); + view.ensurePolished(); + QHeaderView *h = view.horizontalHeader(); + QHeaderView *v = view.verticalHeader(); + r.add(QStringLiteral("header.horizontal"), h, {}, + cfg({{QStringLiteral("section_size_hint"), QJsonArray{h->sectionSizeHint(0), h->sectionSizeHint(1)}}, + {QStringLiteral("default_section_size"), h->defaultSectionSize()}, + {QStringLiteral("minimum_section_size"), h->minimumSectionSize()}})); + r.add(QStringLiteral("header.vertical"), v, {}, + cfg({{QStringLiteral("default_section_size"), v->defaultSectionSize()}, + {QStringLiteral("minimum_section_size"), v->minimumSectionSize()}, + {QStringLiteral("section_size_hint"), QJsonArray{v->sectionSizeHint(0), v->sectionSizeHint(1)}}})); + r.add(QStringLiteral("table_view"), &view, {}, cfg({{QStringLiteral("size_hint_for_row"), static_cast(view).sizeHintForRow(0)}})); + } + { + QTableView view; + view.setModel(rowsModel(&view, false, false)); + view.setSortingEnabled(true); + adopt(&view); + view.ensurePolished(); + QHeaderView *h = view.horizontalHeader(); + r.add(QStringLiteral("header.horizontal.sort_indicator"), h, cfg({{QStringLiteral("sort_indicator"), true}}), + cfg({{QStringLiteral("section_size_hint"), QJsonArray{h->sectionSizeHint(0), h->sectionSizeHint(1)}}})); + } + for (int variant = 0; variant < 3; ++variant) { + const bool icon = variant == 1; + const bool check = variant == 2; + QListView view; + view.setModel(rowsModel(&view, icon, check)); + adopt(&view); + view.ensurePolished(); + const QString id = variant == 0 ? QStringLiteral("list_view") : (icon ? QStringLiteral("list_view.icon") : QStringLiteral("list_view.check")); + r.add(id, &view, cfg({{QStringLiteral("icon"), icon}, {QStringLiteral("check"), check}}), + cfg({{QStringLiteral("size_hint_for_row"), static_cast(view).sizeHintForRow(0)}})); + } + for (int variant = 0; variant < 2; ++variant) { + QTreeView view; + view.setModel(rowsModel(&view, variant == 1, false)); + adopt(&view); + view.ensurePolished(); + r.add(variant == 0 ? QStringLiteral("tree_view") : QStringLiteral("tree_view.icon"), &view, cfg({{QStringLiteral("icon"), variant == 1}}), + cfg({{QStringLiteral("size_hint_for_row"), static_cast(view).sizeHintForRow(0)}, + {QStringLiteral("indentation"), view.indentation()}, + {QStringLiteral("header_height"), view.header()->sizeHint().height()}})); + } + return r.out; +} + +QJsonObject enumValues(const QMetaEnum &e, const std::function &query) +{ + QJsonObject o; + for (int i = 0; i < e.keyCount(); ++i) { + const QByteArray key = e.key(i); + if (key.endsWith("CustomBase") || key.contains("_Last")) + continue; + o.insert(QString::fromLatin1(key), query(e.value(i))); + } + return o; +} + +// sizeFromContents over a small lattice of content sizes. Each option is +// initialised from a real widget (initFrom: font, palette, direction, state) +// and then given the fields listed in "option". +QJsonArray contentsLattice(QStyle *style) +{ + const QList sizes = {QSize(0, 0), QSize(20, 16), QSize(60, 18), QSize(100, 24), QSize(100, 32)}; + QJsonArray out; + auto add = [&](const QString &id, QStyle::ContentsType ct, const QStyleOption &opt, QWidget *w, const QJsonObject &desc) { + for (const QSize &s : sizes) { + QJsonObject o; + o.insert(QStringLiteral("id"), id); + o.insert(QStringLiteral("option"), desc); + o.insert(QStringLiteral("contents"), sz(s)); + o.insert(QStringLiteral("out"), sz(style->sizeFromContents(ct, &opt, s, w))); + out.append(o); + } + }; + + { + QPushButton w(QStringLiteral("OK")); + adopt(&w); + w.ensurePolished(); + QStyleOptionButton opt; + opt.initFrom(&w); + opt.text = QStringLiteral("OK"); + add(QStringLiteral("CT_PushButton"), QStyle::CT_PushButton, opt, &w, cfg({{QStringLiteral("text"), QStringLiteral("OK")}})); + opt.features |= QStyleOptionButton::Flat; + add(QStringLiteral("CT_PushButton.flat"), QStyle::CT_PushButton, opt, &w, cfg({{QStringLiteral("text"), QStringLiteral("OK")}, {QStringLiteral("flat"), true}})); + } + for (bool autoRaise : {true, false}) { + QToolButton w; + w.setAutoRaise(autoRaise); + adopt(&w); + w.ensurePolished(); + QStyleOptionToolButton opt; + opt.initFrom(&w); + opt.subControls = QStyle::SC_ToolButton; + opt.toolButtonStyle = Qt::ToolButtonIconOnly; + opt.iconSize = QSize(16, 16); + opt.icon = testIcon(); + if (autoRaise) + opt.state |= QStyle::State_AutoRaise; + add(autoRaise ? QStringLiteral("CT_ToolButton.auto_raise") : QStringLiteral("CT_ToolButton.framed"), QStyle::CT_ToolButton, opt, &w, + cfg({{QStringLiteral("auto_raise"), autoRaise}, {QStringLiteral("icon_size"), 16}})); + } + { + QLineEdit w; + adopt(&w); + w.ensurePolished(); + QStyleOptionFrame opt; + opt.initFrom(&w); + opt.lineWidth = style->pixelMetric(QStyle::PM_DefaultFrameWidth, &opt, &w); + opt.midLineWidth = 0; + opt.state |= QStyle::State_Sunken; + add(QStringLiteral("CT_LineEdit"), QStyle::CT_LineEdit, opt, &w, cfg({{QStringLiteral("line_width"), opt.lineWidth}})); + } + for (bool editable : {false, true}) { + QComboBox w; + w.setEditable(editable); + adopt(&w); + w.ensurePolished(); + QStyleOptionComboBox opt; + opt.initFrom(&w); + opt.editable = editable; + opt.frame = true; + add(editable ? QStringLiteral("CT_ComboBox.editable") : QStringLiteral("CT_ComboBox"), QStyle::CT_ComboBox, opt, &w, + cfg({{QStringLiteral("editable"), editable}, {QStringLiteral("frame"), true}})); + } + { + QSpinBox w; + adopt(&w); + w.ensurePolished(); + QStyleOptionSpinBox opt; + opt.initFrom(&w); + opt.frame = true; + opt.buttonSymbols = QAbstractSpinBox::UpDownArrows; + opt.subControls = QStyle::SC_SpinBoxFrame | QStyle::SC_SpinBoxEditField | QStyle::SC_SpinBoxUp | QStyle::SC_SpinBoxDown; + add(QStringLiteral("CT_SpinBox"), QStyle::CT_SpinBox, opt, &w, cfg({{QStringLiteral("frame"), true}})); + } + { + QCheckBox w(QStringLiteral("X")); + adopt(&w); + w.ensurePolished(); + QStyleOptionButton opt; + opt.initFrom(&w); + opt.text = QStringLiteral("X"); + add(QStringLiteral("CT_CheckBox"), QStyle::CT_CheckBox, opt, &w, cfg({{QStringLiteral("text"), QStringLiteral("X")}})); + QRadioButton rw(QStringLiteral("X")); + adopt(&rw); + rw.ensurePolished(); + QStyleOptionButton ropt; + ropt.initFrom(&rw); + ropt.text = QStringLiteral("X"); + add(QStringLiteral("CT_RadioButton"), QStyle::CT_RadioButton, ropt, &rw, cfg({{QStringLiteral("text"), QStringLiteral("X")}})); + } + { + QSlider w(Qt::Horizontal); + adopt(&w); + w.ensurePolished(); + QStyleOptionSlider opt; + opt.initFrom(&w); + opt.orientation = Qt::Horizontal; + opt.tickPosition = QSlider::NoTicks; + opt.minimum = 0; + opt.maximum = 100; + add(QStringLiteral("CT_Slider"), QStyle::CT_Slider, opt, &w, cfg({{QStringLiteral("orientation"), int(Qt::Horizontal)}})); + opt.tickPosition = QSlider::TicksBothSides; + add(QStringLiteral("CT_Slider.ticks_both"), QStyle::CT_Slider, opt, &w, cfg({{QStringLiteral("orientation"), int(Qt::Horizontal)}, {QStringLiteral("ticks"), int(QSlider::TicksBothSides)}})); + } + { + QProgressBar w; + adopt(&w); + w.ensurePolished(); + QStyleOptionProgressBar opt; + opt.initFrom(&w); + opt.minimum = 0; + opt.maximum = 100; + opt.progress = 50; + opt.textVisible = true; + opt.text = QStringLiteral("50%"); + opt.state |= QStyle::State_Horizontal; + add(QStringLiteral("CT_ProgressBar"), QStyle::CT_ProgressBar, opt, &w, cfg({{QStringLiteral("text_visible"), true}})); + } + { + QMenu w; + adopt(&w); + w.ensurePolished(); + struct Mi { + QString id; + QStyleOptionMenuItem::MenuItemType type; + QString text; + int maxIconWidth; + QStyleOptionMenuItem::CheckType check; + }; + for (const Mi &m : {Mi{QStringLiteral("CT_MenuItem.normal"), QStyleOptionMenuItem::Normal, QStringLiteral("Item"), 0, QStyleOptionMenuItem::NotCheckable}, + Mi{QStringLiteral("CT_MenuItem.normal.icon_column"), QStyleOptionMenuItem::Normal, QStringLiteral("Item"), 16, QStyleOptionMenuItem::NotCheckable}, + Mi{QStringLiteral("CT_MenuItem.shortcut"), QStyleOptionMenuItem::Normal, QStringLiteral("Save\tCtrl+S"), 16, QStyleOptionMenuItem::NotCheckable}, + Mi{QStringLiteral("CT_MenuItem.checkable"), QStyleOptionMenuItem::Normal, QStringLiteral("Item"), 16, QStyleOptionMenuItem::NonExclusive}, + Mi{QStringLiteral("CT_MenuItem.submenu"), QStyleOptionMenuItem::SubMenu, QStringLiteral("Item"), 16, QStyleOptionMenuItem::NotCheckable}, + Mi{QStringLiteral("CT_MenuItem.separator"), QStyleOptionMenuItem::Separator, QString(), 16, QStyleOptionMenuItem::NotCheckable}, + Mi{QStringLiteral("CT_MenuItem.section"), QStyleOptionMenuItem::Separator, QStringLiteral("Section"), 16, QStyleOptionMenuItem::NotCheckable}}) { + QStyleOptionMenuItem opt; + opt.initFrom(&w); + opt.menuItemType = m.type; + opt.text = m.text; + opt.maxIconWidth = m.maxIconWidth; + opt.checkType = m.check; + opt.menuHasCheckableItems = m.check != QStyleOptionMenuItem::NotCheckable; + opt.reservedShortcutWidth = 0; + add(m.id, QStyle::CT_MenuItem, opt, &w, + cfg({{QStringLiteral("type"), int(m.type)}, {QStringLiteral("text"), m.text}, {QStringLiteral("max_icon_width"), m.maxIconWidth}, + {QStringLiteral("check_type"), int(m.check)}})); + } + } + { + QTabBar w; + adopt(&w); + w.ensurePolished(); + QStyleOptionTab opt; + opt.initFrom(&w); + opt.text = QStringLiteral("Tab"); + opt.shape = QTabBar::RoundedNorth; + opt.position = QStyleOptionTab::Middle; + add(QStringLiteral("CT_TabBarTab"), QStyle::CT_TabBarTab, opt, &w, cfg({{QStringLiteral("text"), QStringLiteral("Tab")}, {QStringLiteral("shape"), 0}})); + opt.documentMode = true; + add(QStringLiteral("CT_TabBarTab.document_mode"), QStyle::CT_TabBarTab, opt, &w, + cfg({{QStringLiteral("text"), QStringLiteral("Tab")}, {QStringLiteral("shape"), 0}, {QStringLiteral("document_mode"), true}})); + } + { + QTableView view; + adopt(&view); + view.ensurePolished(); + QStyleOptionHeader opt; + opt.initFrom(view.horizontalHeader()); + opt.text = QStringLiteral("Name"); + opt.orientation = Qt::Horizontal; + opt.section = 0; + add(QStringLiteral("CT_HeaderSection"), QStyle::CT_HeaderSection, opt, view.horizontalHeader(), cfg({{QStringLiteral("text"), QStringLiteral("Name")}})); + } + { + QListView view; + adopt(&view); + view.ensurePolished(); + QStyleOptionViewItem opt; + opt.initFrom(&view); + opt.features = QStyleOptionViewItem::HasDisplay; + opt.text = QStringLiteral("Row"); + opt.decorationSize = QSize(16, 16); + opt.displayAlignment = Qt::AlignLeft | Qt::AlignVCenter; + add(QStringLiteral("CT_ItemViewItem"), QStyle::CT_ItemViewItem, opt, &view, cfg({{QStringLiteral("text"), QStringLiteral("Row")}})); + } + return out; +} + +QJsonObject subRects(QStyle *style) +{ + QJsonObject out; + + auto ccRects = [&](QStyle::ComplexControl cc, const QStyleOptionComplex &opt, QWidget *w, + const QList> &scs) { + QJsonObject o; + for (const auto &sc : scs) + o.insert(sc.second, rc(style->subControlRect(cc, &opt, sc.first, w))); + return o; + }; + + { + QComboBox w; + adopt(&w); + w.ensurePolished(); + QStyleOptionComboBox opt; + opt.initFrom(&w); + opt.rect = QRect(0, 0, 150, 32); + opt.frame = true; + opt.subControls = QStyle::SC_All; + QJsonObject o = ccRects(QStyle::CC_ComboBox, opt, &w, + {{QStyle::SC_ComboBoxFrame, QStringLiteral("frame")}, + {QStyle::SC_ComboBoxEditField, QStringLiteral("edit_field")}, + {QStyle::SC_ComboBoxArrow, QStringLiteral("arrow")}, + {QStyle::SC_ComboBoxListBoxPopup, QStringLiteral("popup")}}); + o.insert(QStringLiteral("rect"), rc(opt.rect)); + out.insert(QStringLiteral("combo_box"), o); + opt.editable = true; + QJsonObject e = ccRects(QStyle::CC_ComboBox, opt, &w, + {{QStyle::SC_ComboBoxEditField, QStringLiteral("edit_field")}, {QStyle::SC_ComboBoxArrow, QStringLiteral("arrow")}}); + e.insert(QStringLiteral("rect"), rc(opt.rect)); + out.insert(QStringLiteral("combo_box.editable"), e); + } + { + QSpinBox w; + adopt(&w); + w.ensurePolished(); + QStyleOptionSpinBox opt; + opt.initFrom(&w); + opt.rect = QRect(0, 0, 100, 32); + opt.frame = true; + opt.buttonSymbols = QAbstractSpinBox::UpDownArrows; + opt.subControls = QStyle::SC_All; + QJsonObject o = ccRects(QStyle::CC_SpinBox, opt, &w, + {{QStyle::SC_SpinBoxFrame, QStringLiteral("frame")}, + {QStyle::SC_SpinBoxEditField, QStringLiteral("edit_field")}, + {QStyle::SC_SpinBoxUp, QStringLiteral("up")}, + {QStyle::SC_SpinBoxDown, QStringLiteral("down")}}); + o.insert(QStringLiteral("rect"), rc(opt.rect)); + out.insert(QStringLiteral("spin_box"), o); + } + for (int value : {0, 50, 100}) { + QScrollBar w(Qt::Vertical); + adopt(&w); + w.ensurePolished(); + QStyleOptionSlider opt; + opt.initFrom(&w); + opt.orientation = Qt::Vertical; + opt.rect = QRect(0, 0, style->pixelMetric(QStyle::PM_ScrollBarExtent, &opt, &w), 200); + opt.minimum = 0; + opt.maximum = 100; + opt.pageStep = 20; + opt.singleStep = 1; + opt.sliderPosition = value; + opt.sliderValue = value; + opt.subControls = QStyle::SC_All; + QJsonObject o = ccRects(QStyle::CC_ScrollBar, opt, &w, + {{QStyle::SC_ScrollBarGroove, QStringLiteral("groove")}, + {QStyle::SC_ScrollBarSlider, QStringLiteral("slider")}, + {QStyle::SC_ScrollBarAddLine, QStringLiteral("add_line")}, + {QStyle::SC_ScrollBarSubLine, QStringLiteral("sub_line")}, + {QStyle::SC_ScrollBarAddPage, QStringLiteral("add_page")}, + {QStyle::SC_ScrollBarSubPage, QStringLiteral("sub_page")}}); + o.insert(QStringLiteral("rect"), rc(opt.rect)); + o.insert(QStringLiteral("range"), QJsonArray{0, 100}); + o.insert(QStringLiteral("page_step"), 20); + out.insert(QStringLiteral("scroll_bar.vertical.value_%1").arg(value), o); + } + for (QSlider::TickPosition tp : {QSlider::NoTicks, QSlider::TicksBelow, QSlider::TicksBothSides}) { + QSlider w(Qt::Horizontal); + adopt(&w); + w.ensurePolished(); + QStyleOptionSlider opt; + opt.initFrom(&w); + opt.orientation = Qt::Horizontal; + opt.tickPosition = tp; + opt.minimum = 0; + opt.maximum = 100; + opt.sliderPosition = 30; + opt.sliderValue = 30; + opt.tickInterval = 10; + opt.subControls = QStyle::SC_All; + const QSize hint = style->sizeFromContents(QStyle::CT_Slider, &opt, QSize(200, style->pixelMetric(QStyle::PM_SliderThickness, &opt, &w)), &w); + opt.rect = QRect(QPoint(0, 0), QSize(200, hint.height())); + QJsonObject o = ccRects(QStyle::CC_Slider, opt, &w, + {{QStyle::SC_SliderGroove, QStringLiteral("groove")}, {QStyle::SC_SliderHandle, QStringLiteral("handle")}}); + o.insert(QStringLiteral("rect"), rc(opt.rect)); + o.insert(QStringLiteral("value"), 30); + out.insert(QStringLiteral("slider.horizontal.ticks_%1").arg(int(tp)), o); + } + + auto seRects = [&](const QStyleOption &opt, QWidget *w, const QList> &ses) { + QJsonObject o; + for (const auto &se : ses) + o.insert(se.second, rc(style->subElementRect(se.first, &opt, w))); + o.insert(QStringLiteral("rect"), rc(opt.rect)); + return o; + }; + { + QCheckBox w(QStringLiteral("Check")); + adopt(&w); + w.ensurePolished(); + QStyleOptionButton opt; + opt.initFrom(&w); + opt.text = QStringLiteral("Check"); + opt.rect = QRect(QPoint(0, 0), w.sizeHint()); + out.insert(QStringLiteral("check_box"), + seRects(opt, &w, + {{QStyle::SE_CheckBoxIndicator, QStringLiteral("indicator")}, + {QStyle::SE_CheckBoxContents, QStringLiteral("contents")}, + {QStyle::SE_CheckBoxFocusRect, QStringLiteral("focus")}})); + QRadioButton rw(QStringLiteral("Radio")); + adopt(&rw); + rw.ensurePolished(); + QStyleOptionButton ropt; + ropt.initFrom(&rw); + ropt.text = QStringLiteral("Radio"); + ropt.rect = QRect(QPoint(0, 0), rw.sizeHint()); + out.insert(QStringLiteral("radio_button"), + seRects(ropt, &rw, + {{QStyle::SE_RadioButtonIndicator, QStringLiteral("indicator")}, + {QStyle::SE_RadioButtonContents, QStringLiteral("contents")}, + {QStyle::SE_RadioButtonFocusRect, QStringLiteral("focus")}})); + } + { + QPushButton w(QStringLiteral("OK")); + adopt(&w); + w.ensurePolished(); + QStyleOptionButton opt; + opt.initFrom(&w); + opt.text = QStringLiteral("OK"); + opt.rect = QRect(QPoint(0, 0), w.sizeHint()); + out.insert(QStringLiteral("push_button"), + seRects(opt, &w, {{QStyle::SE_PushButtonContents, QStringLiteral("contents")}, {QStyle::SE_PushButtonFocusRect, QStringLiteral("focus")}})); + } + { + QLineEdit w; + adopt(&w); + w.ensurePolished(); + QStyleOptionFrame opt; + opt.initFrom(&w); + opt.rect = QRect(QPoint(0, 0), w.sizeHint()); + opt.lineWidth = style->pixelMetric(QStyle::PM_DefaultFrameWidth, &opt, &w); + out.insert(QStringLiteral("line_edit"), seRects(opt, &w, {{QStyle::SE_LineEditContents, QStringLiteral("contents")}})); + } + { + QProgressBar w; + adopt(&w); + w.ensurePolished(); + QStyleOptionProgressBar opt; + opt.initFrom(&w); + opt.minimum = 0; + opt.maximum = 100; + opt.progress = 50; + opt.textVisible = true; + opt.text = QStringLiteral("50%"); + opt.state |= QStyle::State_Horizontal; + opt.rect = QRect(QPoint(0, 0), QSize(200, w.sizeHint().height())); + out.insert(QStringLiteral("progress_bar"), + seRects(opt, &w, + {{QStyle::SE_ProgressBarGroove, QStringLiteral("groove")}, + {QStyle::SE_ProgressBarContents, QStringLiteral("contents")}, + {QStyle::SE_ProgressBarLabel, QStringLiteral("label")}})); + } + { + QListView view; + adopt(&view); + view.ensurePolished(); + QStyleOptionViewItem opt; + opt.initFrom(&view); + opt.features = QStyleOptionViewItem::HasDisplay | QStyleOptionViewItem::HasDecoration | QStyleOptionViewItem::HasCheckIndicator; + opt.text = QStringLiteral("Row"); + opt.icon = testIcon(); + opt.decorationSize = QSize(16, 16); + opt.displayAlignment = Qt::AlignLeft | Qt::AlignVCenter; + opt.decorationAlignment = Qt::AlignCenter; + opt.decorationPosition = QStyleOptionViewItem::Left; + opt.rect = QRect(0, 0, 200, 24); + out.insert(QStringLiteral("item_view_item"), + seRects(opt, &view, + {{QStyle::SE_ItemViewItemCheckIndicator, QStringLiteral("check")}, + {QStyle::SE_ItemViewItemDecoration, QStringLiteral("decoration")}, + {QStyle::SE_ItemViewItemText, QStringLiteral("text")}, + {QStyle::SE_ItemViewItemFocusRect, QStringLiteral("focus")}})); + } + { + QTabBar w; + adopt(&w); + w.ensurePolished(); + QStyleOptionTab opt; + opt.initFrom(&w); + opt.text = QStringLiteral("Tab"); + opt.shape = QTabBar::RoundedNorth; + opt.rect = QRect(0, 0, 80, 30); + out.insert(QStringLiteral("tab"), seRects(opt, &w, {{QStyle::SE_TabBarTabText, QStringLiteral("text")}})); + } + return out; +} + + +// Pixel metrics that change when the style is told which widget asks. Only +// the values that differ from the widget-less answer are recorded. +QJsonObject widgetPixelMetrics(QStyle *style, const QMetaEnum &pmEnum) +{ + QJsonObject out; + auto probe = [&](const QString &id, QWidget *w) { + adopt(w); + w->ensurePolished(); + QStyleOption opt; + opt.initFrom(w); + QJsonObject o; + for (int i = 0; i < pmEnum.keyCount(); ++i) { + const QByteArray key = pmEnum.key(i); + if (key.endsWith("CustomBase")) + continue; + const auto pm = QStyle::PixelMetric(pmEnum.value(i)); + const int bare = style->pixelMetric(pm, nullptr, nullptr); + const int with = style->pixelMetric(pm, &opt, w); + if (with != bare) + o.insert(QString::fromLatin1(key), with); + } + out.insert(id, o); + }; + QLineEdit le; + probe(QStringLiteral("QLineEdit"), &le); + QComboBox cb; + probe(QStringLiteral("QComboBox"), &cb); + QComboBox cbe; + cbe.setEditable(true); + probe(QStringLiteral("QComboBox.editable"), &cbe); + QSpinBox sb; + probe(QStringLiteral("QSpinBox"), &sb); + QPushButton pb(QStringLiteral("OK")); + probe(QStringLiteral("QPushButton"), &pb); + QToolButton tb; + probe(QStringLiteral("QToolButton"), &tb); + QCheckBox chk; + probe(QStringLiteral("QCheckBox"), &chk); + QRadioButton rb; + probe(QStringLiteral("QRadioButton"), &rb); + QSlider sl(Qt::Horizontal); + probe(QStringLiteral("QSlider"), &sl); + QScrollBar sc(Qt::Vertical); + probe(QStringLiteral("QScrollBar"), &sc); + QProgressBar pr; + probe(QStringLiteral("QProgressBar"), &pr); + QMenu menu; + probe(QStringLiteral("QMenu"), &menu); + QMenuBar mb; + probe(QStringLiteral("QMenuBar"), &mb); + QTabBar tab; + probe(QStringLiteral("QTabBar"), &tab); + QTabWidget tw; + probe(QStringLiteral("QTabWidget"), &tw); + QTableView table; + probe(QStringLiteral("QTableView"), &table); + probe(QStringLiteral("QHeaderView.horizontal"), table.horizontalHeader()); + QListView lv; + probe(QStringLiteral("QListView"), &lv); + QTreeView tv; + probe(QStringLiteral("QTreeView"), &tv); + QFrame fr; + fr.setFrameShape(QFrame::StyledPanel); + probe(QStringLiteral("QFrame.styled_panel"), &fr); + QGroupBox gb(QStringLiteral("Group")); + probe(QStringLiteral("QGroupBox"), &gb); + QToolBar tbar; + probe(QStringLiteral("QToolBar"), &tbar); + QStatusBar stb; + probe(QStringLiteral("QStatusBar"), &stb); + return out; +} + +} // namespace + +int writeSizes(const QString &path) +{ + QStyle *style = QApplication::style(); + QWidget host; + gHost = &host; + QJsonObject env; + env.insert(QStringLiteral("widgets_parented"), QStringLiteral("every measured widget except QMenu has a plain QWidget parent")); + env.insert(QStringLiteral("style"), style ? style->name() : QStringLiteral("none")); + env.insert(QStringLiteral("platform"), QGuiApplication::platformName()); + if (QScreen *s = QGuiApplication::primaryScreen()) { + env.insert(QStringLiteral("logical_dpi"), s->logicalDotsPerInch()); + env.insert(QStringLiteral("physical_dpi"), s->physicalDotsPerInch()); + env.insert(QStringLiteral("device_pixel_ratio"), s->devicePixelRatio()); + } + env.insert(QStringLiteral("default_font_before_override"), QApplication::font().toString()); + + const QMetaEnum pmEnum = QMetaEnum::fromType(); + const QMetaEnum shEnum = QMetaEnum::fromType(); + + QJsonArray fonts, widgets; + struct Req { + QString family; + double pt; + }; + const QList reqs = {{QStringLiteral("Noto Sans"), 10}, {QStringLiteral("Noto Sans"), 8}, {QStringLiteral("Noto Sans"), 9}, + {QStringLiteral("Noto Sans"), 11}, {QStringLiteral("Noto Sans"), 12}, {QStringLiteral("Noto Sans"), 14}}; + QJsonObject pixelMetrics, widgetMetrics, styleHints, lattice, sub; + for (const Req &rq : reqs) { + QFont f(rq.family); + f.setPointSizeF(rq.pt); + QApplication::setFont(f); + // No event loop runs here, so an existing widget does not pick up the + // new application font by itself: give the host the font explicitly. + host.setFont(f); + fonts.append(fontRecord(f)); + const QJsonArray ws = widgetsFor(); + for (const QJsonValue &v : ws) { + QJsonObject o = v.toObject(); + o.insert(QStringLiteral("font"), QStringLiteral("%1 %2").arg(rq.family).arg(rq.pt)); + widgets.append(o); + } + if (rq.pt == 10) { + pixelMetrics = enumValues(pmEnum, [&](int v) { return style->pixelMetric(QStyle::PixelMetric(v), nullptr, nullptr); }); + widgetMetrics = widgetPixelMetrics(style, pmEnum); + styleHints = enumValues(shEnum, [&](int v) { return style->styleHint(QStyle::StyleHint(v), nullptr, nullptr, nullptr); }); + sub = subRects(style); + lattice.insert(QStringLiteral("records"), contentsLattice(style)); + } + } + // Restore the default font for anything after us. + QFont def(QStringLiteral("Noto Sans")); + def.setPointSizeF(10); + QApplication::setFont(def); + + QJsonArray monoFonts; + for (double pt : {9.0, 10.0, 11.0}) { + QFont f(QStringLiteral("Hack")); + f.setPointSizeF(pt); + monoFonts.append(fontRecord(f)); + } + + // QFont::fromString on a Qt 5 style string (10 fields): the legacy weight + // 0..99 in field 4 and the OpenType weight Qt maps it to. + QJsonArray legacyWeights; + for (int w = 0; w <= 99; ++w) { + QFont f; + f.fromString(QStringLiteral("Noto Sans,10,-1,5,%1,0,0,0,0,0").arg(w)); + QJsonObject o; + o.insert(QStringLiteral("legacy"), w); + o.insert(QStringLiteral("weight"), int(f.weight())); + legacyWeights.append(o); + } + + // The tooltip label Qt shows (QToolTip::showText), found among the + // top-level widgets by its class name: its margin and size hint. + QJsonObject tooltip; + { + QFont tipFont(QStringLiteral("Noto Sans")); + tipFont.setPointSizeF(10.0); + QApplication::setFont(tipFont); + QToolTip::showText(QPoint(100, 100), QStringLiteral("Tooltip text")); + QApplication::processEvents(); + for (QWidget *w : QApplication::topLevelWidgets()) { + if (QString::fromLatin1(w->metaObject()->className()) != QLatin1String("QTipLabel")) + continue; + const auto *label = qobject_cast(w); + const QMargins m = w->contentsMargins(); + tooltip.insert(QStringLiteral("class"), QStringLiteral("QTipLabel")); + tooltip.insert(QStringLiteral("text"), QStringLiteral("Tooltip text")); + tooltip.insert(QStringLiteral("font"), QStringLiteral("Noto Sans 10")); + tooltip.insert(QStringLiteral("margin"), label ? label->margin() : -1); + tooltip.insert(QStringLiteral("contents_margins"), QJsonArray{m.left(), m.top(), m.right(), m.bottom()}); + tooltip.insert(QStringLiteral("size_hint"), QJsonArray{w->sizeHint().width(), w->sizeHint().height()}); + const QFontMetrics fm(w->font()); + const QSize text = fm.size(0, QStringLiteral("Tooltip text")); + tooltip.insert(QStringLiteral("text_size"), QJsonArray{text.width(), text.height()}); + } + QToolTip::hideText(); + QApplication::processEvents(); + } + + return golden::writeFile(path, + { + {QStringLiteral("meta"), golden::meta(QStringLiteral("sizes"))}, + {QStringLiteral("environment"), env}, + {QStringLiteral("pixel_metrics"), pixelMetrics, true}, + {QStringLiteral("widget_pixel_metrics"), widgetMetrics, true}, + {QStringLiteral("style_hints"), styleHints, true}, + {QStringLiteral("sub_rects"), sub, true}, + {QStringLiteral("size_from_contents"), lattice.value(QStringLiteral("records")), true}, + {QStringLiteral("monospace_fonts"), monoFonts, true}, + {QStringLiteral("fonts"), fonts, true}, + {QStringLiteral("widgets"), widgets, true}, + {QStringLiteral("legacy_font_weights"), legacyWeights, true}, + {QStringLiteral("tooltip"), tooltip}, + }) + ? 0 + : 1; +} diff --git a/tools/kde_golden/run.sh b/tools/kde_golden/run.sh new file mode 100755 index 000000000..fcc1b248d --- /dev/null +++ b/tools/kde_golden/run.sh @@ -0,0 +1,101 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# SPDX-FileCopyrightText: 2026 FernTech +# +# Builds the kde_golden image and regenerates every vector under vectors/. +# +# tools/kde_golden/run.sh # on the host: build, then run inside +# tools/kde_golden/run.sh --inside # in the container (run.sh does this) +# +# Needs docker (no sudo on the maintainer's machine). Not part of CI and not +# packaged; see README.md. + +set -euo pipefail + +here=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +image_tag=teksilo-kde-golden +base_digest=sha256:f58f9b97f218ee976cf928f6fe00abb929a644aded8c9dfb02f77a9b2a6e1732 + +if [[ ${1:-} != --inside ]]; then + docker build -t "$image_tag" "$here" + mkdir -p "$here/vectors" + docker run --rm \ + --user "$(id -u):$(id -g)" \ + -e KDE_GOLDEN_IMAGE="invent-registry.kde.org/neon/docker-images/plasma@$base_digest" \ + -v "$here:/kde_golden:ro" \ + -v "$here/vectors:/out" \ + "$image_tag" \ + bash /kde_golden/run.sh --inside + exit 0 +fi + +# ---- inside the container ---------------------------------------------------- + +out=/out +driver=/opt/kde_golden/build/kde_golden +[[ -x $driver ]] || { echo "run.sh: $driver missing; is this the kde_golden image?" >&2; exit 1; } + +# A deterministic environment: no session, no platform theme, C locale, and +# every XDG directory a fresh scratch one (only XDG_DATA_DIRS keeps the system +# value, which is where the installed colour schemes live). +unset DISPLAY WAYLAND_DISPLAY KDE_FULL_SESSION KDE_SESSION_VERSION XDG_CURRENT_DESKTOP \ + QT_QPA_PLATFORMTHEME QT_STYLE_OVERRIDE QT_SCALE_FACTOR QT_SCREEN_SCALE_FACTORS \ + QT_FONT_DPI DBUS_SESSION_BUS_ADDRESS SESSION_MANAGER +export QT_QPA_PLATFORM=offscreen +export LC_ALL=C.UTF-8 LANG=C.UTF-8 LANGUAGE= +export XDG_DATA_DIRS=/usr/local/share:/usr/share + +scratch=$(mktemp -d /tmp/kde_golden.XXXXXX) +trap 'rm -rf "$scratch"' EXIT + +fresh_env() { + # $1: name of a fresh scratch root; exports HOME and the XDG dirs into it. + local root=$scratch/$1 + mkdir -p "$root"/{home,config,data,cache,etc-xdg,run} + chmod 700 "$root/run" + export HOME=$root/home XDG_CONFIG_HOME=$root/config XDG_DATA_HOME=$root/data \ + XDG_CACHE_HOME=$root/cache XDG_CONFIG_DIRS=$root/etc-xdg XDG_RUNTIME_DIR=$root/run +} + +fresh_env math +"$driver" math "$out/math.json" + +fresh_env resolve +"$driver" resolve "$out/resolve.json" + +# The Breeze style reads kdeglobals itself, so give it the default scheme. +fresh_env sizes +cp /usr/share/color-schemes/BreezeLight.colors "$XDG_CONFIG_HOME/kdeglobals" +"$driver" sizes "$out/sizes.json" + +for scheme in BreezeLight BreezeDark; do + fresh_env "pixels-$scheme" + cp "/usr/share/color-schemes/$scheme.colors" "$XDG_CONFIG_HOME/kdeglobals" + "$driver" pixels "$scratch/pixels-$scheme.json" "$scheme" +done + +python3 -I - "$out/pixels.json" "$scratch/pixels-BreezeLight.json" "$scratch/pixels-BreezeDark.json" <<'PY' +import json, sys + +out, *parts = sys.argv[1:] +docs = [json.load(open(p, encoding="utf-8")) for p in parts] +with open(out, "w", encoding="utf-8") as f: + f.write("{\n") + f.write('"meta": %s,\n' % json.dumps(docs[0]["meta"], sort_keys=True)) + f.write('"schemes": {\n') + for i, d in enumerate(docs): + name = d["environment"]["scheme"] + f.write('%s: {\n"environment": %s,\n"records": [\n' % (json.dumps(name), json.dumps(d["environment"], sort_keys=True))) + recs = d["records"] + for j, r in enumerate(recs): + f.write(json.dumps(r, sort_keys=True) + ("," if j + 1 < len(recs) else "") + "\n") + f.write("]\n}" + ("," if i + 1 < len(docs) else "") + "\n") + f.write("}\n}\n") +PY + +fresh_env accent +bash /kde_golden/accent_oracle.sh "$out/accent.json" + +cp /opt/kde_golden/versions.txt "$out/versions.txt" +cat /opt/kde_golden/fonts.sha256 >"$out/fonts.sha256" +ls -l "$out" diff --git a/tools/kde_golden/vectors/accent.json b/tools/kde_golden/vectors/accent.json new file mode 100644 index 000000000..eff5e6f88 --- /dev/null +++ b/tools/kde_golden/vectors/accent.json @@ -0,0 +1,51 @@ +{ +"meta": {"generator": "tools/kde_golden/accent_oracle.sh", "image": "invent-registry.kde.org/neon/docker-images/plasma@sha256:f58f9b97f218ee976cf928f6fe00abb929a644aded8c9dfb02f77a9b2a6e1732", "kind": "accent", "packages": {"breeze": "4:6.8.0-0zneon+24.04+noble+release+build80", "fonts-hack": "3.003-3", "fonts-noto-core": "20201225-2", "kde-style-breeze": "4:6.8.0-0zneon+24.04+noble+release+build80", "kde-style-oxygen": "4:6.8.0-0zneon+24.04+noble+release+build59", "kf6-kcolorscheme": "6.31.0-0zneon+24.04+noble+release+build47", "kf6-kconfig": "6.31.0-0zneon+24.04+noble+release+build36", "kf6-kguiaddons": "6.31.0-0zneon+24.04+noble+release+build59", "libkf6colorscheme-dev": "6.31.0-0zneon+24.04+noble+release+build47", "plasma-workspace": "4:6.8.0-0zneon+24.04+noble+release+build99", "qt6-base": "6.11.1-0zneon+24.04+noble+release+build162"}, "procedure": "see accent_oracle.sh header and README.md", "readme": "tools/kde_golden/README.md documents every field"}, +"schemes": { +"BreezeLight": {"origin": "installed", "source": "/usr/share/color-schemes/BreezeLight.colors", "sha1": "9980f09638f2f885144ced7c6086ae56addf7c8c", "sha256": "c46470b75e7df3e1ebff344748b92347f8d5adfa306aef9c91c4d2edae2cd6df", "input": {"ColorEffects:Disabled": {"Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "163,212,250", "BackgroundNormal": "252,252,252", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "27,30,32", "BackgroundNormal": "42,46,50", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "222,224,226", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "163,212,250", "BackgroundNormal": "61,174,233", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "255,255,255", "ForegroundInactive": "112,125,138", "ForegroundLink": "253,188,75", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "247,247,247", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "247,247,247", "BackgroundNormal": "255,255,255", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "BreezeLight", "Name": "Breeze Light", "shadeSortColumn": "true"}, "KDE": {"contrast": "4"}, "WM": {"activeBackground": "227,229,231", "activeBlend": "227,229,231", "activeForeground": "35,38,41", "inactiveBackground": "239,240,241", "inactiveBlend": "239,240,241", "inactiveForeground": "112,125,138"}}, "base": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "163,212,250", "BackgroundNormal": "252,252,252", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "27,30,32", "BackgroundNormal": "42,46,50", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "222,224,226", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "163,212,250", "BackgroundNormal": "61,174,233", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "255,255,255", "ForegroundInactive": "112,125,138", "ForegroundLink": "253,188,75", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "247,247,247", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "247,247,247", "BackgroundNormal": "255,255,255", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorSchemeHash": "9980f09638f2f885144ced7c6086ae56addf7c8c"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "227,229,231", "activeBlend": "227,229,231", "activeForeground": "35,38,41", "inactiveBackground": "239,240,241", "inactiveBlend": "239,240,241", "inactiveForeground": "112,125,138"}}, "base_sha256": "30b0712e60f2efe538b7f3c2ef7a4f042fb236470014c75b33a1e2eddf841d50"}, +"BreezeDark": {"origin": "installed", "source": "/usr/share/color-schemes/BreezeDark.colors", "sha1": "27363f5706202c1c8261fbda7381ddaab8ad48f3", "sha256": "11fce1d8ab97b529162e50eb200d1a93fab65c7612f9bebd0230a6a348d0cc21", "input": {"ColorEffects:Disabled": {"Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "61,174,233", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "252,252,252", "ForegroundInactive": "161,169,177", "ForegroundLink": "253,188,75", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "BreezeDark", "Name": "Breeze Dark", "shadeSortColumn": "true"}, "KDE": {"contrast": "4"}, "WM": {"activeBackground": "39,44,49", "activeBlend": "252,252,252", "activeForeground": "252,252,252", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "base": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "61,174,233", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "252,252,252", "ForegroundInactive": "161,169,177", "ForegroundLink": "253,188,75", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "BreezeDark", "ColorSchemeHash": "27363f5706202c1c8261fbda7381ddaab8ad48f3"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "39,44,49", "activeBlend": "252,252,252", "activeForeground": "252,252,252", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "base_sha256": "c9df398081add7ddee7e0166970649c3e87df4caffc5ebc9018d889532aafb1a"}, +"KdeGoldenTintLight": {"origin": "derived", "source": "derived (scratch data dir)", "sha1": "72fe2b7a58ea4e7eb18af21f2a73b98d2caf3f11", "sha256": "5dd3eddc1361f8f5948ec00702a3cccdff5571a402bc7591755e11fd8fd60168", "input": {"ColorEffects:Disabled": {"Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "163,212,250", "BackgroundNormal": "252,252,252", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "27,30,32", "BackgroundNormal": "42,46,50", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "222,224,226", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "163,212,250", "BackgroundNormal": "61,174,233", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "255,255,255", "ForegroundInactive": "112,125,138", "ForegroundLink": "253,188,75", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "247,247,247", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "247,247,247", "BackgroundNormal": "255,255,255", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "KdeGoldenTintLight", "Name": "KdeGoldenTintLight", "TintFactor": "0.25", "shadeSortColumn": "true"}, "KDE": {"contrast": "4"}, "WM": {"activeBackground": "227,229,231", "activeBlend": "227,229,231", "activeForeground": "35,38,41", "inactiveBackground": "239,240,241", "inactiveBlend": "239,240,241", "inactiveForeground": "112,125,138"}}, "base": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "163,212,250", "BackgroundNormal": "252,252,252", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "27,30,32", "BackgroundNormal": "42,46,50", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "222,224,226", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "227,229,230", "BackgroundNormal": "239,240,241", "DecorationFocus": "97,172,216", "DecorationHover": "97,172,216", "ForegroundActive": "97,172,216", "ForegroundInactive": "115,125,134", "ForegroundLink": "69,127,169", "ForegroundNegative": "199,90,95", "ForegroundNeutral": "227,130,72", "ForegroundNormal": "36,38,40", "ForegroundPositive": "82,168,110", "ForegroundVisited": "147,99,167"}, "Colors:Selection": {"BackgroundAlternate": "163,212,250", "BackgroundNormal": "61,174,233", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "255,255,255", "ForegroundInactive": "112,125,138", "ForegroundLink": "253,188,75", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "247,247,247", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "247,247,247", "BackgroundNormal": "255,255,255", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "KdeGoldenTintLight", "ColorSchemeHash": "72fe2b7a58ea4e7eb18af21f2a73b98d2caf3f11"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "227,229,231", "activeBlend": "227,229,231", "activeForeground": "35,38,41", "inactiveBackground": "239,240,241", "inactiveBlend": "239,240,241", "inactiveForeground": "112,125,138"}}, "base_sha256": "2d87b1cdc6d711366c11aa8ab41f93beb9007a506e33610b9da999027f893bfb", "derived_from": "BreezeLight", "changes": {"General": {"Name": "KdeGoldenTintLight", "ColorScheme": "KdeGoldenTintLight", "TintFactor": "0.25"}}}, +"KdeGoldenTitlebarDark": {"origin": "derived", "source": "derived (scratch data dir)", "sha1": "645f7c749422dc8327f5375893100ceff3876d7a", "sha256": "f351e97b7c2c1caa4675ee40d500b43970cad1803ae8325123c0578a8d4bc487", "input": {"ColorEffects:Disabled": {"Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "61,174,233", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "252,252,252", "ForegroundInactive": "161,169,177", "ForegroundLink": "253,188,75", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "KdeGoldenTitlebarDark", "Name": "KdeGoldenTitlebarDark", "TitlebarIsAccentColored": "true", "shadeSortColumn": "true"}, "KDE": {"contrast": "4"}, "WM": {"activeBackground": "39,44,49", "activeBlend": "252,252,252", "activeForeground": "252,252,252", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "base": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "61,174,233", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "252,252,252", "ForegroundInactive": "161,169,177", "ForegroundLink": "253,188,75", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "KdeGoldenTitlebarDark", "ColorSchemeHash": "645f7c749422dc8327f5375893100ceff3876d7a"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "39,44,49", "activeBlend": "252,252,252", "activeForeground": "252,252,252", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "base_sha256": "7eecc7a48f299ff6d6825053f904129872361de4386e01e401a436865181ebb1", "derived_from": "BreezeDark", "changes": {"General": {"Name": "KdeGoldenTitlebarDark", "ColorScheme": "KdeGoldenTitlebarDark", "TitlebarIsAccentColored": "true"}}} +}, +"cases": [ +{"scheme": "BreezeLight", "accent": "#e93a9a", "commands": [["plasma-apply-colorscheme", "BreezeLight"], ["plasma-apply-colorscheme", "-a", "#e93a9a"]], "stdout": "Successfully applied the accent color #e93a9a", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "238,116,183", "BackgroundNormal": "252,252,252", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "112,125,138", "ForegroundLink": "170,42,112", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "27,30,32", "BackgroundNormal": "42,46,50", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "161,169,177", "ForegroundLink": "247,188,212", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "222,224,226", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "112,125,138", "ForegroundLink": "170,42,112", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "239,117,184", "BackgroundNormal": "239,117,184", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "0,0,0", "ForegroundLink": "170,42,112", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "247,247,247", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "112,125,138", "ForegroundLink": "170,42,112", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "247,247,247", "BackgroundNormal": "255,255,255", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "112,125,138", "ForegroundLink": "170,42,112", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "112,125,138", "ForegroundLink": "170,42,112", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorSchemeHash": "9980f09638f2f885144ced7c6086ae56addf7c8c"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "227,229,231", "activeBlend": "227,229,231", "activeForeground": "35,38,41", "inactiveBackground": "239,240,241", "inactiveBlend": "239,240,241", "inactiveForeground": "112,125,138"}}, "kdeglobals_sha256": "dbe81b0dcf9d9c989a5bcd6de98261bb9d0f506d6b36afa9fab677b7045a6d80", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeLight", "accent": "#e93d58", "commands": [["plasma-apply-colorscheme", "BreezeLight"], ["plasma-apply-colorscheme", "-a", "#e93d58"]], "stdout": "Successfully applied the accent color #e93d58", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "238,118,137", "BackgroundNormal": "252,252,252", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "112,125,138", "ForegroundLink": "170,45,64", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "27,30,32", "BackgroundNormal": "42,46,50", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "161,169,177", "ForegroundLink": "246,189,194", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "222,224,226", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "112,125,138", "ForegroundLink": "170,45,64", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "239,119,138", "BackgroundNormal": "239,119,138", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "0,0,0", "ForegroundLink": "170,45,64", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "247,247,247", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "112,125,138", "ForegroundLink": "170,45,64", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "247,247,247", "BackgroundNormal": "255,255,255", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "112,125,138", "ForegroundLink": "170,45,64", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "112,125,138", "ForegroundLink": "170,45,64", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorSchemeHash": "9980f09638f2f885144ced7c6086ae56addf7c8c"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "227,229,231", "activeBlend": "227,229,231", "activeForeground": "35,38,41", "inactiveBackground": "239,240,241", "inactiveBlend": "239,240,241", "inactiveForeground": "112,125,138"}}, "kdeglobals_sha256": "802a999f5bcd5234e85654ca213b3b9697716178327c7268699a1f855b753a9c", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeLight", "accent": "#e9643a", "commands": [["plasma-apply-colorscheme", "BreezeLight"], ["plasma-apply-colorscheme", "-a", "#e9643a"]], "stdout": "Successfully applied the accent color #e9643a", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "238,145,116", "BackgroundNormal": "252,252,252", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "112,125,138", "ForegroundLink": "170,73,42", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "27,30,32", "BackgroundNormal": "42,46,50", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "161,169,177", "ForegroundLink": "249,195,187", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "222,224,226", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "112,125,138", "ForegroundLink": "170,73,42", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "239,146,117", "BackgroundNormal": "239,146,117", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "0,0,0", "ForegroundLink": "170,73,42", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "247,247,247", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "112,125,138", "ForegroundLink": "170,73,42", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "247,247,247", "BackgroundNormal": "255,255,255", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "112,125,138", "ForegroundLink": "170,73,42", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "112,125,138", "ForegroundLink": "170,73,42", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorSchemeHash": "9980f09638f2f885144ced7c6086ae56addf7c8c"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "227,229,231", "activeBlend": "227,229,231", "activeForeground": "35,38,41", "inactiveBackground": "239,240,241", "inactiveBlend": "239,240,241", "inactiveForeground": "112,125,138"}}, "kdeglobals_sha256": "b787d03851babfaf53fbc5edbcd0bdb27dd3a8f6422626431f3316816b0d535d", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeLight", "accent": "#e8cb2d", "commands": [["plasma-apply-colorscheme", "BreezeLight"], ["plasma-apply-colorscheme", "-a", "#e8cb2d"]], "stdout": "Successfully applied the accent color #e8cb2d", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "237,217,107", "BackgroundNormal": "252,252,252", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "112,125,138", "ForegroundLink": "169,148,33", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "27,30,32", "BackgroundNormal": "42,46,50", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "161,169,177", "ForegroundLink": "232,203,45", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "222,224,226", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "112,125,138", "ForegroundLink": "169,148,33", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "238,218,107", "BackgroundNormal": "238,218,107", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "0,0,0", "ForegroundLink": "254,231,139", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "247,247,247", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "112,125,138", "ForegroundLink": "169,148,33", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "247,247,247", "BackgroundNormal": "255,255,255", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "112,125,138", "ForegroundLink": "169,148,33", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "112,125,138", "ForegroundLink": "169,148,33", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorSchemeHash": "9980f09638f2f885144ced7c6086ae56addf7c8c"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "227,229,231", "activeBlend": "227,229,231", "activeForeground": "35,38,41", "inactiveBackground": "239,240,241", "inactiveBlend": "239,240,241", "inactiveForeground": "112,125,138"}}, "kdeglobals_sha256": "2ed3fe5aad9293b2aa4e8640a495445713177c49147291c42bf15d005eb94195", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeLight", "accent": "#3dd425", "commands": [["plasma-apply-colorscheme", "BreezeLight"], ["plasma-apply-colorscheme", "-a", "#3dd425"]], "stdout": "Successfully applied the accent color #3dd425", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "118,223,101", "BackgroundNormal": "252,252,252", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "112,125,138", "ForegroundLink": "45,155,27", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "27,30,32", "BackgroundNormal": "42,46,50", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,212,37", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "222,224,226", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "112,125,138", "ForegroundLink": "45,155,27", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "119,224,102", "BackgroundNormal": "119,224,102", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "0,0,0", "ForegroundLink": "100,254,84", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "247,247,247", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "112,125,138", "ForegroundLink": "45,155,27", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "247,247,247", "BackgroundNormal": "255,255,255", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "112,125,138", "ForegroundLink": "45,155,27", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "112,125,138", "ForegroundLink": "45,155,27", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorSchemeHash": "9980f09638f2f885144ced7c6086ae56addf7c8c"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "227,229,231", "activeBlend": "227,229,231", "activeForeground": "35,38,41", "inactiveBackground": "239,240,241", "inactiveBlend": "239,240,241", "inactiveForeground": "112,125,138"}}, "kdeglobals_sha256": "6329b725d6a0dace9d1d4cd9dbb6d1e8c1a8c93ec569ae48e619844412834f92", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeLight", "accent": "#00d3b8", "commands": [["plasma-apply-colorscheme", "BreezeLight"], ["plasma-apply-colorscheme", "-a", "#00d3b8"]], "stdout": "Successfully applied the accent color #00d3b8", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "75,223,204", "BackgroundNormal": "252,252,252", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "112,125,138", "ForegroundLink": "0,154,134", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "27,30,32", "BackgroundNormal": "42,46,50", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "161,169,177", "ForegroundLink": "0,211,184", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "222,224,226", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "112,125,138", "ForegroundLink": "0,154,134", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "76,224,205", "BackgroundNormal": "76,224,205", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "0,0,0", "ForegroundLink": "0,253,220", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "247,247,247", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "112,125,138", "ForegroundLink": "0,154,134", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "247,247,247", "BackgroundNormal": "255,255,255", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "112,125,138", "ForegroundLink": "0,154,134", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "112,125,138", "ForegroundLink": "0,154,134", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorSchemeHash": "9980f09638f2f885144ced7c6086ae56addf7c8c"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "227,229,231", "activeBlend": "227,229,231", "activeForeground": "35,38,41", "inactiveBackground": "239,240,241", "inactiveBlend": "239,240,241", "inactiveForeground": "112,125,138"}}, "kdeglobals_sha256": "bd02e7e886455c9934c2bf027167f17469797ca61d07a707392efffd472f0cd2", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeLight", "accent": "#3daee9", "commands": [["plasma-apply-colorscheme", "BreezeLight"], ["plasma-apply-colorscheme", "-a", "#3daee9"]], "stdout": "Successfully applied the accent color #3daee9", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "118,197,238", "BackgroundNormal": "252,252,252", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "45,127,170", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "27,30,32", "BackgroundNormal": "42,46,50", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,174,233", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "222,224,226", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "45,127,170", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "119,198,239", "BackgroundNormal": "119,198,239", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "0,0,0", "ForegroundLink": "45,127,170", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "247,247,247", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "45,127,170", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "247,247,247", "BackgroundNormal": "255,255,255", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "45,127,170", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "45,127,170", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorSchemeHash": "9980f09638f2f885144ced7c6086ae56addf7c8c"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "227,229,231", "activeBlend": "227,229,231", "activeForeground": "35,38,41", "inactiveBackground": "239,240,241", "inactiveBlend": "239,240,241", "inactiveForeground": "112,125,138"}}, "kdeglobals_sha256": "c30f133fa47e8a2bef151d40fcf77f77b7e1f8a3069aa66ce27bdac3f83876b6", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeLight", "accent": "#b875dc", "commands": [["plasma-apply-colorscheme", "BreezeLight"], ["plasma-apply-colorscheme", "-a", "#b875dc"]], "stdout": "Successfully applied the accent color #b875dc", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "204,157,229", "BackgroundNormal": "252,252,252", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "112,125,138", "ForegroundLink": "150,68,187", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "27,30,32", "BackgroundNormal": "42,46,50", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "161,169,177", "ForegroundLink": "223,201,238", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "222,224,226", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "112,125,138", "ForegroundLink": "150,68,187", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "205,158,230", "BackgroundNormal": "205,158,230", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "0,0,0", "ForegroundLink": "150,68,187", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "247,247,247", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "112,125,138", "ForegroundLink": "150,68,187", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "247,247,247", "BackgroundNormal": "255,255,255", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "112,125,138", "ForegroundLink": "150,68,187", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "112,125,138", "ForegroundLink": "150,68,187", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorSchemeHash": "9980f09638f2f885144ced7c6086ae56addf7c8c"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "227,229,231", "activeBlend": "227,229,231", "activeForeground": "35,38,41", "inactiveBackground": "239,240,241", "inactiveBlend": "239,240,241", "inactiveForeground": "112,125,138"}}, "kdeglobals_sha256": "21c08c6640191713f52281670a39fe523151ab67177caa728137f3c328faf134", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeLight", "accent": "#926ee4", "commands": [["plasma-apply-colorscheme", "BreezeLight"], ["plasma-apply-colorscheme", "-a", "#926ee4"]], "stdout": "Successfully applied the accent color #926ee4", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "177,152,235", "BackgroundNormal": "252,252,252", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "112,125,138", "ForegroundLink": "118,54,221", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "27,30,32", "BackgroundNormal": "42,46,50", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "161,169,177", "ForegroundLink": "209,199,242", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "222,224,226", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "112,125,138", "ForegroundLink": "118,54,221", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "178,153,236", "BackgroundNormal": "178,153,236", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "0,0,0", "ForegroundLink": "118,54,221", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "247,247,247", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "112,125,138", "ForegroundLink": "118,54,221", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "247,247,247", "BackgroundNormal": "255,255,255", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "112,125,138", "ForegroundLink": "118,54,221", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "112,125,138", "ForegroundLink": "118,54,221", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorSchemeHash": "9980f09638f2f885144ced7c6086ae56addf7c8c"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "227,229,231", "activeBlend": "227,229,231", "activeForeground": "35,38,41", "inactiveBackground": "239,240,241", "inactiveBlend": "239,240,241", "inactiveForeground": "112,125,138"}}, "kdeglobals_sha256": "3bffc972fd42a7ca08f2c2477680e55daeb2fd28aa924df6be1327d99972195e", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeLight", "accent": "#686b6f", "commands": [["plasma-apply-colorscheme", "BreezeLight"], ["plasma-apply-colorscheme", "-a", "#686b6f"]], "stdout": "Successfully applied the accent color #686b6f", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "148,150,153", "BackgroundNormal": "252,252,252", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "112,125,138", "ForegroundLink": "104,107,111", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "27,30,32", "BackgroundNormal": "42,46,50", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "161,169,177", "ForegroundLink": "196,198,202", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "222,224,226", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "112,125,138", "ForegroundLink": "76,78,81", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "112,125,138", "ForegroundLink": "41,128,185", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "149,151,154", "BackgroundNormal": "149,151,154", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "0,0,0", "ForegroundLink": "76,78,81", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "239,240,241", "BackgroundNormal": "247,247,247", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "112,125,138", "ForegroundLink": "76,78,81", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "247,247,247", "BackgroundNormal": "255,255,255", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "112,125,138", "ForegroundLink": "104,107,111", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "227,229,231", "BackgroundNormal": "239,240,241", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "112,125,138", "ForegroundLink": "76,78,81", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "35,38,41", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorSchemeHash": "9980f09638f2f885144ced7c6086ae56addf7c8c"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "227,229,231", "activeBlend": "227,229,231", "activeForeground": "35,38,41", "inactiveBackground": "239,240,241", "inactiveBlend": "239,240,241", "inactiveForeground": "112,125,138"}}, "kdeglobals_sha256": "929277933b0ef05860e96668404461672015f186a0eb8efd5e84f7bdc47dc9db", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeDark", "accent": "#e93a9a", "commands": [["plasma-apply-colorscheme", "BreezeDark"], ["plasma-apply-colorscheme", "-a", "#e93a9a"]], "stdout": "Successfully applied the accent color #e93a9a", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "175,53,122", "BackgroundNormal": "41,44,48", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "161,169,177", "ForegroundLink": "247,188,212", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "161,169,177", "ForegroundLink": "247,188,212", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "161,169,177", "ForegroundLink": "247,188,212", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "169,47,115", "BackgroundNormal": "169,47,115", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "255,255,255", "ForegroundLink": "170,42,112", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "161,169,177", "ForegroundLink": "247,188,212", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "161,169,177", "ForegroundLink": "233,58,154", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "161,169,177", "ForegroundLink": "247,188,212", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "BreezeDark", "ColorSchemeHash": "27363f5706202c1c8261fbda7381ddaab8ad48f3"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "39,44,49", "activeBlend": "252,252,252", "activeForeground": "252,252,252", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "09fff4ef87c7dacb370e828713f9346a6feefc3cd9efe307cb169673a661adbf", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeDark", "accent": "#e93d58", "commands": [["plasma-apply-colorscheme", "BreezeDark"], ["plasma-apply-colorscheme", "-a", "#e93d58"]], "stdout": "Successfully applied the accent color #e93d58", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "175,55,76", "BackgroundNormal": "41,44,48", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "161,169,177", "ForegroundLink": "246,189,194", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "161,169,177", "ForegroundLink": "246,189,194", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "161,169,177", "ForegroundLink": "246,189,194", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "169,49,68", "BackgroundNormal": "169,49,68", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "255,255,255", "ForegroundLink": "170,45,64", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "161,169,177", "ForegroundLink": "246,189,194", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "161,169,177", "ForegroundLink": "246,189,194", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "161,169,177", "ForegroundLink": "246,189,194", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "BreezeDark", "ColorSchemeHash": "27363f5706202c1c8261fbda7381ddaab8ad48f3"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "39,44,49", "activeBlend": "252,252,252", "activeForeground": "252,252,252", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "2c7e409b9c58e153374f12a7cff0639ef82d118fbf3e854886a82ce4a10e3937", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeDark", "accent": "#e9643a", "commands": [["plasma-apply-colorscheme", "BreezeDark"], ["plasma-apply-colorscheme", "-a", "#e9643a"]], "stdout": "Successfully applied the accent color #e9643a", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "175,83,55", "BackgroundNormal": "41,44,48", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "161,169,177", "ForegroundLink": "249,195,187", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "161,169,177", "ForegroundLink": "233,100,58", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "161,169,177", "ForegroundLink": "249,195,187", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "169,76,47", "BackgroundNormal": "169,76,47", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "255,255,255", "ForegroundLink": "170,73,42", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "161,169,177", "ForegroundLink": "249,195,187", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "161,169,177", "ForegroundLink": "233,100,58", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "161,169,177", "ForegroundLink": "233,100,58", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "BreezeDark", "ColorSchemeHash": "27363f5706202c1c8261fbda7381ddaab8ad48f3"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "39,44,49", "activeBlend": "252,252,252", "activeForeground": "252,252,252", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "cb75183df6a4c796077a2a1557e58ed7e981193f3046a14716a20694bed00395", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeDark", "accent": "#e8cb2d", "commands": [["plasma-apply-colorscheme", "BreezeDark"], ["plasma-apply-colorscheme", "-a", "#e8cb2d"]], "stdout": "Successfully applied the accent color #e8cb2d", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "174,155,45", "BackgroundNormal": "41,44,48", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "161,169,177", "ForegroundLink": "232,203,45", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "161,169,177", "ForegroundLink": "232,203,45", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "161,169,177", "ForegroundLink": "232,203,45", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "168,148,38", "BackgroundNormal": "168,148,38", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "0,0,0", "ForegroundLink": "254,231,139", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "161,169,177", "ForegroundLink": "232,203,45", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "161,169,177", "ForegroundLink": "232,203,45", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "161,169,177", "ForegroundLink": "232,203,45", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "BreezeDark", "ColorSchemeHash": "27363f5706202c1c8261fbda7381ddaab8ad48f3"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "39,44,49", "activeBlend": "252,252,252", "activeForeground": "252,252,252", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "a5a8d1159194f8cac31b4addaf203ebc6c1bcaca4e8cd91bced03fa8f4aefb5c", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeDark", "accent": "#3dd425", "commands": [["plasma-apply-colorscheme", "BreezeDark"], ["plasma-apply-colorscheme", "-a", "#3dd425"]], "stdout": "Successfully applied the accent color #3dd425", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "55,161,40", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,212,37", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,212,37", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,212,37", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "48,155,33", "BackgroundNormal": "48,155,33", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "0,0,0", "ForegroundLink": "100,254,84", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,212,37", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,212,37", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,212,37", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "BreezeDark", "ColorSchemeHash": "27363f5706202c1c8261fbda7381ddaab8ad48f3"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "39,44,49", "activeBlend": "252,252,252", "activeForeground": "252,252,252", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "dfa60b9da62ad94167a58484c00f58162ef34f0dcac9125b3c972f0c48b0fa8f", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeDark", "accent": "#00d3b8", "commands": [["plasma-apply-colorscheme", "BreezeDark"], ["plasma-apply-colorscheme", "-a", "#00d3b8"]], "stdout": "Successfully applied the accent color #00d3b8", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "12,160,143", "BackgroundNormal": "41,44,48", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "161,169,177", "ForegroundLink": "0,211,184", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "161,169,177", "ForegroundLink": "0,211,184", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "161,169,177", "ForegroundLink": "0,211,184", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "5,154,136", "BackgroundNormal": "5,154,136", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "0,0,0", "ForegroundLink": "0,253,220", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "161,169,177", "ForegroundLink": "0,211,184", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "161,169,177", "ForegroundLink": "0,211,184", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "161,169,177", "ForegroundLink": "0,211,184", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "BreezeDark", "ColorSchemeHash": "27363f5706202c1c8261fbda7381ddaab8ad48f3"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "39,44,49", "activeBlend": "252,252,252", "activeForeground": "252,252,252", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "8d6c4fa41bdfdc5eb53fd47cce6be09e4214ddf344a05994befea989a4e96fd7", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeDark", "accent": "#3daee9", "commands": [["plasma-apply-colorscheme", "BreezeDark"], ["plasma-apply-colorscheme", "-a", "#3daee9"]], "stdout": "Successfully applied the accent color #3daee9", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "55,135,177", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,174,233", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,174,233", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,174,233", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "48,128,170", "BackgroundNormal": "48,128,170", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "0,0,0", "ForegroundLink": "45,127,170", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,174,233", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,174,233", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,174,233", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "BreezeDark", "ColorSchemeHash": "27363f5706202c1c8261fbda7381ddaab8ad48f3"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "39,44,49", "activeBlend": "252,252,252", "activeForeground": "252,252,252", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "fa039baeba3437c967562a118f15622dc29480ff256c33a5aad9f642a6b50402", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeDark", "accent": "#b875dc", "commands": [["plasma-apply-colorscheme", "BreezeDark"], ["plasma-apply-colorscheme", "-a", "#b875dc"]], "stdout": "Successfully applied the accent color #b875dc", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "141,95,168", "BackgroundNormal": "41,44,48", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "161,169,177", "ForegroundLink": "223,201,238", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "161,169,177", "ForegroundLink": "184,117,220", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "161,169,177", "ForegroundLink": "223,201,238", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "134,88,161", "BackgroundNormal": "134,88,161", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "255,255,255", "ForegroundLink": "150,68,187", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "161,169,177", "ForegroundLink": "223,201,238", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "161,169,177", "ForegroundLink": "184,117,220", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "161,169,177", "ForegroundLink": "184,117,220", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "BreezeDark", "ColorSchemeHash": "27363f5706202c1c8261fbda7381ddaab8ad48f3"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "39,44,49", "activeBlend": "252,252,252", "activeForeground": "252,252,252", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "e1cb95ca941e9ffb176297880e44e33b737dc847d3b4766950969eaa50956c6f", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeDark", "accent": "#926ee4", "commands": [["plasma-apply-colorscheme", "BreezeDark"], ["plasma-apply-colorscheme", "-a", "#926ee4"]], "stdout": "Successfully applied the accent color #926ee4", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "114,90,174", "BackgroundNormal": "41,44,48", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "161,169,177", "ForegroundLink": "209,199,242", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "161,169,177", "ForegroundLink": "209,199,242", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "161,169,177", "ForegroundLink": "209,199,242", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "108,83,166", "BackgroundNormal": "108,83,166", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "255,255,255", "ForegroundLink": "118,54,221", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "161,169,177", "ForegroundLink": "209,199,242", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "161,169,177", "ForegroundLink": "146,110,228", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "161,169,177", "ForegroundLink": "209,199,242", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "BreezeDark", "ColorSchemeHash": "27363f5706202c1c8261fbda7381ddaab8ad48f3"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "39,44,49", "activeBlend": "252,252,252", "activeForeground": "252,252,252", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "2f00171f1d3393c188f34d0e9c726fdde573a7bdfa7e3c1f16cd309cce327e58", "config_files": ["kdeglobals"]}, +{"scheme": "BreezeDark", "accent": "#686b6f", "commands": [["plasma-apply-colorscheme", "BreezeDark"], ["plasma-apply-colorscheme", "-a", "#686b6f"]], "stdout": "Successfully applied the accent color #686b6f", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "85,88,92", "BackgroundNormal": "41,44,48", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "161,169,177", "ForegroundLink": "196,198,202", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "161,169,177", "ForegroundLink": "196,198,202", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "161,169,177", "ForegroundLink": "196,198,202", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "78,81,84", "BackgroundNormal": "78,81,84", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "255,255,255", "ForegroundLink": "76,78,81", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "161,169,177", "ForegroundLink": "196,198,202", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "161,169,177", "ForegroundLink": "196,198,202", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "161,169,177", "ForegroundLink": "196,198,202", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "BreezeDark", "ColorSchemeHash": "27363f5706202c1c8261fbda7381ddaab8ad48f3"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "39,44,49", "activeBlend": "252,252,252", "activeForeground": "252,252,252", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "4f9f81de17d9dec7cabd2a585353607c8e166b422e785f727d54a9dddf700916", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTintLight", "accent": "#e93a9a", "commands": [["plasma-apply-colorscheme", "KdeGoldenTintLight"], ["plasma-apply-colorscheme", "-a", "#e93a9a"]], "stdout": "Successfully applied the accent color #e93a9a", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "238,116,183", "BackgroundNormal": "255,237,255", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "143,112,138", "ForegroundLink": "170,42,112", "ForegroundNegative": "218,64,100", "ForegroundNeutral": "248,110,79", "ForegroundNormal": "57,26,43", "ForegroundPositive": "127,157,115", "ForegroundVisited": "170,80,170"}, "Colors:Complementary": {"BackgroundAlternate": "47,18,34", "BackgroundNormal": "65,34,52", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "193,155,178", "ForegroundLink": "247,188,212", "ForegroundNegative": "218,64,100", "ForegroundNeutral": "248,110,79", "ForegroundNormal": "255,237,255", "ForegroundPositive": "127,157,115", "ForegroundVisited": "170,80,170"}, "Colors:Header": {"BackgroundAlternate": "255,225,245", "BackgroundNormal": "254,210,229", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "143,112,138", "ForegroundLink": "170,42,112", "ForegroundNegative": "218,64,100", "ForegroundNeutral": "248,110,79", "ForegroundNormal": "57,26,43", "ForegroundPositive": "127,157,115", "ForegroundVisited": "170,80,170"}, "Colors:Header][Inactive": {"BackgroundAlternate": "255,214,234", "BackgroundNormal": "255,225,245", "DecorationFocus": "141,160,219", "DecorationHover": "141,160,219", "ForegroundActive": "141,160,219", "ForegroundInactive": "143,112,138", "ForegroundLink": "110,115,172", "ForegroundNegative": "218,64,100", "ForegroundNeutral": "248,110,79", "ForegroundNormal": "57,26,43", "ForegroundPositive": "127,157,115", "ForegroundVisited": "170,80,170"}, "Colors:Selection": {"BackgroundAlternate": "239,117,184", "BackgroundNormal": "239,117,184", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "0,0,0", "ForegroundLink": "170,42,112", "ForegroundNegative": "179,46,82", "ForegroundNeutral": "203,84,63", "ForegroundNormal": "0,0,0", "ForegroundPositive": "85,90,70", "ForegroundVisited": "170,80,170"}, "Colors:Tooltip": {"BackgroundAlternate": "255,225,245", "BackgroundNormal": "255,232,251", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "143,112,138", "ForegroundLink": "170,42,112", "ForegroundNegative": "218,64,100", "ForegroundNeutral": "248,110,79", "ForegroundNormal": "57,26,43", "ForegroundPositive": "127,157,115", "ForegroundVisited": "170,80,170"}, "Colors:View": {"BackgroundAlternate": "255,232,251", "BackgroundNormal": "255,240,255", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "143,112,138", "ForegroundLink": "170,42,112", "ForegroundNegative": "218,64,100", "ForegroundNeutral": "248,110,79", "ForegroundNormal": "57,26,43", "ForegroundPositive": "127,157,115", "ForegroundVisited": "170,80,170"}, "Colors:Window": {"BackgroundAlternate": "255,214,234", "BackgroundNormal": "255,225,245", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "143,112,138", "ForegroundLink": "170,42,112", "ForegroundNegative": "218,64,100", "ForegroundNeutral": "248,110,79", "ForegroundNormal": "57,26,43", "ForegroundPositive": "127,157,115", "ForegroundVisited": "170,80,170"}, "General": {"ColorScheme": "KdeGoldenTintLight", "ColorSchemeHash": "72fe2b7a58ea4e7eb18af21f2a73b98d2caf3f11"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "255,225,245", "activeBlend": "227,229,231", "activeForeground": "0,0,0", "inactiveBackground": "255,225,245", "inactiveBlend": "239,240,241", "inactiveForeground": "101,89,97"}}, "kdeglobals_sha256": "9810769725b0e9e86950464ae9259127aa0ecb2a14de14f4d27f67bf2020a246", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTintLight", "accent": "#e93d58", "commands": [["plasma-apply-colorscheme", "KdeGoldenTintLight"], ["plasma-apply-colorscheme", "-a", "#e93d58"]], "stdout": "Successfully applied the accent color #e93d58", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "238,118,137", "BackgroundNormal": "255,239,240", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "145,113,124", "ForegroundLink": "170,45,64", "ForegroundNegative": "220,65,83", "ForegroundNeutral": "250,110,52", "ForegroundNormal": "58,27,31", "ForegroundPositive": "130,158,97", "ForegroundVisited": "171,84,157"}, "Colors:Complementary": {"BackgroundAlternate": "49,19,23", "BackgroundNormal": "66,35,40", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "194,157,163", "ForegroundLink": "246,189,194", "ForegroundNegative": "220,65,83", "ForegroundNeutral": "250,110,52", "ForegroundNormal": "255,239,240", "ForegroundPositive": "130,158,97", "ForegroundVisited": "171,84,157"}, "Colors:Header": {"BackgroundAlternate": "255,227,228", "BackgroundNormal": "255,211,213", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "145,113,124", "ForegroundLink": "170,45,64", "ForegroundNegative": "220,65,83", "ForegroundNeutral": "250,110,52", "ForegroundNormal": "58,27,31", "ForegroundPositive": "130,158,97", "ForegroundVisited": "171,84,157"}, "Colors:Header][Inactive": {"BackgroundAlternate": "255,216,218", "BackgroundNormal": "255,227,228", "DecorationFocus": "142,162,205", "DecorationHover": "142,162,205", "ForegroundActive": "142,162,205", "ForegroundInactive": "145,113,124", "ForegroundLink": "111,118,159", "ForegroundNegative": "220,65,83", "ForegroundNeutral": "250,110,52", "ForegroundNormal": "58,27,31", "ForegroundPositive": "130,158,97", "ForegroundVisited": "171,84,157"}, "Colors:Selection": {"BackgroundAlternate": "239,119,138", "BackgroundNormal": "239,119,138", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "0,0,0", "ForegroundLink": "170,45,64", "ForegroundNegative": "181,47,66", "ForegroundNeutral": "204,84,36", "ForegroundNormal": "0,0,0", "ForegroundPositive": "87,91,53", "ForegroundVisited": "171,84,157"}, "Colors:Tooltip": {"BackgroundAlternate": "255,227,228", "BackgroundNormal": "255,234,235", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "145,113,124", "ForegroundLink": "170,45,64", "ForegroundNegative": "220,65,83", "ForegroundNeutral": "250,110,52", "ForegroundNormal": "58,27,31", "ForegroundPositive": "130,158,97", "ForegroundVisited": "171,84,157"}, "Colors:View": {"BackgroundAlternate": "255,234,235", "BackgroundNormal": "255,242,242", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "145,113,124", "ForegroundLink": "170,45,64", "ForegroundNegative": "220,65,83", "ForegroundNeutral": "250,110,52", "ForegroundNormal": "58,27,31", "ForegroundPositive": "130,158,97", "ForegroundVisited": "171,84,157"}, "Colors:Window": {"BackgroundAlternate": "255,216,218", "BackgroundNormal": "255,227,228", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "145,113,124", "ForegroundLink": "170,45,64", "ForegroundNegative": "220,65,83", "ForegroundNeutral": "250,110,52", "ForegroundNormal": "58,27,31", "ForegroundPositive": "130,158,97", "ForegroundVisited": "171,84,157"}, "General": {"ColorScheme": "KdeGoldenTintLight", "ColorSchemeHash": "72fe2b7a58ea4e7eb18af21f2a73b98d2caf3f11"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "255,227,228", "activeBlend": "227,229,231", "activeForeground": "0,0,0", "inactiveBackground": "255,227,228", "inactiveBlend": "239,240,241", "inactiveForeground": "101,90,91"}}, "kdeglobals_sha256": "7ffc34ed871fd5408553e0fd633c91af6a652d67d27bad8252f789c4dac0ea98", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTintLight", "accent": "#e9643a", "commands": [["plasma-apply-colorscheme", "KdeGoldenTintLight"], ["plasma-apply-colorscheme", "-a", "#e9643a"]], "stdout": "Successfully applied the accent color #e9643a", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "238,145,116", "BackgroundNormal": "255,243,231", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "140,117,117", "ForegroundLink": "170,73,42", "ForegroundNegative": "217,72,74", "ForegroundNeutral": "246,115,32", "ForegroundNormal": "54,30,25", "ForegroundPositive": "123,161,87", "ForegroundVisited": "167,90,151"}, "Colors:Complementary": {"BackgroundAlternate": "45,22,16", "BackgroundNormal": "62,38,33", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "189,160,156", "ForegroundLink": "249,195,187", "ForegroundNegative": "217,72,74", "ForegroundNeutral": "246,115,32", "ForegroundNormal": "255,243,231", "ForegroundPositive": "123,161,87", "ForegroundVisited": "167,90,151"}, "Colors:Header": {"BackgroundAlternate": "255,231,220", "BackgroundNormal": "250,215,205", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "140,117,117", "ForegroundLink": "170,73,42", "ForegroundNegative": "217,72,74", "ForegroundNeutral": "246,115,32", "ForegroundNormal": "54,30,25", "ForegroundPositive": "123,161,87", "ForegroundVisited": "167,90,151"}, "Colors:Header][Inactive": {"BackgroundAlternate": "255,220,210", "BackgroundNormal": "255,231,220", "DecorationFocus": "135,166,198", "DecorationHover": "135,166,198", "ForegroundActive": "135,166,198", "ForegroundInactive": "140,117,117", "ForegroundLink": "104,122,153", "ForegroundNegative": "217,72,74", "ForegroundNeutral": "246,115,32", "ForegroundNormal": "54,30,25", "ForegroundPositive": "123,161,87", "ForegroundVisited": "167,90,151"}, "Colors:Selection": {"BackgroundAlternate": "239,146,117", "BackgroundNormal": "239,146,117", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "0,0,0", "ForegroundLink": "170,73,42", "ForegroundNegative": "177,55,58", "ForegroundNeutral": "201,89,13", "ForegroundNormal": "0,0,0", "ForegroundPositive": "82,93,44", "ForegroundVisited": "167,90,151"}, "Colors:Tooltip": {"BackgroundAlternate": "255,231,220", "BackgroundNormal": "255,238,226", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "140,117,117", "ForegroundLink": "170,73,42", "ForegroundNegative": "217,72,74", "ForegroundNeutral": "246,115,32", "ForegroundNormal": "54,30,25", "ForegroundPositive": "123,161,87", "ForegroundVisited": "167,90,151"}, "Colors:View": {"BackgroundAlternate": "255,238,226", "BackgroundNormal": "255,246,234", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "140,117,117", "ForegroundLink": "170,73,42", "ForegroundNegative": "217,72,74", "ForegroundNeutral": "246,115,32", "ForegroundNormal": "54,30,25", "ForegroundPositive": "123,161,87", "ForegroundVisited": "167,90,151"}, "Colors:Window": {"BackgroundAlternate": "255,220,210", "BackgroundNormal": "255,231,220", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "140,117,117", "ForegroundLink": "170,73,42", "ForegroundNegative": "217,72,74", "ForegroundNeutral": "246,115,32", "ForegroundNormal": "54,30,25", "ForegroundPositive": "123,161,87", "ForegroundVisited": "167,90,151"}, "General": {"ColorScheme": "KdeGoldenTintLight", "ColorSchemeHash": "72fe2b7a58ea4e7eb18af21f2a73b98d2caf3f11"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "255,231,220", "activeBlend": "227,229,231", "activeForeground": "0,0,0", "inactiveBackground": "255,231,220", "inactiveBlend": "239,240,241", "inactiveForeground": "101,92,87"}}, "kdeglobals_sha256": "3521b5ebd755f576b4e9a721a3db48c81e1c7416a5260e9a46e5ed4e538a420e", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTintLight", "accent": "#e8cb2d", "commands": [["plasma-apply-colorscheme", "KdeGoldenTintLight"], ["plasma-apply-colorscheme", "-a", "#e8cb2d"]], "stdout": "Successfully applied the accent color #e8cb2d", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "237,217,107", "BackgroundNormal": "255,253,222", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "121,126,109", "ForegroundLink": "169,148,33", "ForegroundNegative": "204,89,62", "ForegroundNeutral": "232,128,0", "ForegroundNormal": "41,38,16", "ForegroundPositive": "95,168,75", "ForegroundVisited": "151,102,144"}, "Colors:Complementary": {"BackgroundAlternate": "33,30,7", "BackgroundNormal": "48,46,25", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "170,170,147", "ForegroundLink": "232,203,45", "ForegroundNegative": "204,89,62", "ForegroundNeutral": "232,128,0", "ForegroundNormal": "255,253,222", "ForegroundPositive": "95,168,75", "ForegroundVisited": "151,102,144"}, "Colors:Header": {"BackgroundAlternate": "246,241,211", "BackgroundNormal": "230,225,196", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "121,126,109", "ForegroundLink": "169,148,33", "ForegroundNegative": "204,89,62", "ForegroundNeutral": "232,128,0", "ForegroundNormal": "41,38,16", "ForegroundPositive": "95,168,75", "ForegroundVisited": "151,102,144"}, "Colors:Header][Inactive": {"BackgroundAlternate": "235,230,201", "BackgroundNormal": "246,241,211", "DecorationFocus": "106,175,191", "DecorationHover": "106,175,191", "ForegroundActive": "106,175,191", "ForegroundInactive": "121,126,109", "ForegroundLink": "78,130,146", "ForegroundNegative": "204,89,62", "ForegroundNeutral": "232,128,0", "ForegroundNormal": "41,38,16", "ForegroundPositive": "95,168,75", "ForegroundVisited": "151,102,144"}, "Colors:Selection": {"BackgroundAlternate": "238,218,107", "BackgroundNormal": "238,218,107", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "0,0,0", "ForegroundLink": "254,231,139", "ForegroundNegative": "165,71,46", "ForegroundNeutral": "188,102,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "59,100,31", "ForegroundVisited": "151,102,144"}, "Colors:Tooltip": {"BackgroundAlternate": "246,241,211", "BackgroundNormal": "254,248,217", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "121,126,109", "ForegroundLink": "169,148,33", "ForegroundNegative": "204,89,62", "ForegroundNeutral": "232,128,0", "ForegroundNormal": "41,38,16", "ForegroundPositive": "95,168,75", "ForegroundVisited": "151,102,144"}, "Colors:View": {"BackgroundAlternate": "254,248,217", "BackgroundNormal": "255,255,225", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "121,126,109", "ForegroundLink": "169,148,33", "ForegroundNegative": "204,89,62", "ForegroundNeutral": "232,128,0", "ForegroundNormal": "41,38,16", "ForegroundPositive": "95,168,75", "ForegroundVisited": "151,102,144"}, "Colors:Window": {"BackgroundAlternate": "235,230,201", "BackgroundNormal": "246,241,211", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "121,126,109", "ForegroundLink": "169,148,33", "ForegroundNegative": "204,89,62", "ForegroundNeutral": "232,128,0", "ForegroundNormal": "41,38,16", "ForegroundPositive": "95,168,75", "ForegroundVisited": "151,102,144"}, "General": {"ColorScheme": "KdeGoldenTintLight", "ColorSchemeHash": "72fe2b7a58ea4e7eb18af21f2a73b98d2caf3f11"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "246,241,211", "activeBlend": "227,229,231", "activeForeground": "0,0,0", "inactiveBackground": "246,241,211", "inactiveBlend": "239,240,241", "inactiveForeground": "98,96,84"}}, "kdeglobals_sha256": "592b1153f5fe7bba60d72884ceea29ec2ea5769c999cc4af654d62996ff88131", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTintLight", "accent": "#3dd425", "commands": [["plasma-apply-colorscheme", "KdeGoldenTintLight"], ["plasma-apply-colorscheme", "-a", "#3dd425"]], "stdout": "Successfully applied the accent color #3dd425", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "118,223,101", "BackgroundNormal": "231,255,226", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "93,134,112", "ForegroundLink": "45,155,27", "ForegroundNegative": "187,104,66", "ForegroundNeutral": "214,142,0", "ForegroundNormal": "15,45,19", "ForegroundPositive": "31,176,79", "ForegroundVisited": "131,113,147"}, "Colors:Complementary": {"BackgroundAlternate": "7,37,10", "BackgroundNormal": "23,53,28", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "142,179,150", "ForegroundLink": "61,212,37", "ForegroundNegative": "187,104,66", "ForegroundNeutral": "214,142,0", "ForegroundNormal": "231,255,226", "ForegroundPositive": "31,176,79", "ForegroundVisited": "131,113,147"}, "Colors:Header": {"BackgroundAlternate": "218,251,214", "BackgroundNormal": "201,235,200", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "93,134,112", "ForegroundLink": "45,155,27", "ForegroundNegative": "187,104,66", "ForegroundNeutral": "214,142,0", "ForegroundNormal": "15,45,19", "ForegroundPositive": "31,176,79", "ForegroundVisited": "131,113,147"}, "Colors:Header][Inactive": {"BackgroundAlternate": "206,240,204", "BackgroundNormal": "218,251,214", "DecorationFocus": "48,182,194", "DecorationHover": "48,182,194", "ForegroundActive": "48,182,194", "ForegroundInactive": "93,134,112", "ForegroundLink": "5,137,149", "ForegroundNegative": "187,104,66", "ForegroundNeutral": "214,142,0", "ForegroundNormal": "15,45,19", "ForegroundPositive": "31,176,79", "ForegroundVisited": "131,113,147"}, "Colors:Selection": {"BackgroundAlternate": "119,224,102", "BackgroundNormal": "119,224,102", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "0,0,0", "ForegroundLink": "100,254,84", "ForegroundNegative": "149,86,50", "ForegroundNeutral": "170,114,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "0,107,35", "ForegroundVisited": "131,113,147"}, "Colors:Tooltip": {"BackgroundAlternate": "218,251,214", "BackgroundNormal": "226,255,221", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "93,134,112", "ForegroundLink": "45,155,27", "ForegroundNegative": "187,104,66", "ForegroundNeutral": "214,142,0", "ForegroundNormal": "15,45,19", "ForegroundPositive": "31,176,79", "ForegroundVisited": "131,113,147"}, "Colors:View": {"BackgroundAlternate": "226,255,221", "BackgroundNormal": "234,255,228", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "93,134,112", "ForegroundLink": "45,155,27", "ForegroundNegative": "187,104,66", "ForegroundNeutral": "214,142,0", "ForegroundNormal": "15,45,19", "ForegroundPositive": "31,176,79", "ForegroundVisited": "131,113,147"}, "Colors:Window": {"BackgroundAlternate": "206,240,204", "BackgroundNormal": "218,251,214", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "93,134,112", "ForegroundLink": "45,155,27", "ForegroundNegative": "187,104,66", "ForegroundNeutral": "214,142,0", "ForegroundNormal": "15,45,19", "ForegroundPositive": "31,176,79", "ForegroundVisited": "131,113,147"}, "General": {"ColorScheme": "KdeGoldenTintLight", "ColorSchemeHash": "72fe2b7a58ea4e7eb18af21f2a73b98d2caf3f11"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "218,251,214", "activeBlend": "227,229,231", "activeForeground": "0,0,0", "inactiveBackground": "218,251,214", "inactiveBlend": "239,240,241", "inactiveForeground": "87,100,85"}}, "kdeglobals_sha256": "d148593d2766a99ae72d872936c3d1a2994cb73d48692d9693ee4069b9a5a065", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTintLight", "accent": "#00d3b8", "commands": [["plasma-apply-colorscheme", "KdeGoldenTintLight"], ["plasma-apply-colorscheme", "-a", "#00d3b8"]], "stdout": "Successfully applied the accent color #00d3b8", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "75,223,204", "BackgroundNormal": "228,255,253", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "91,132,135", "ForegroundLink": "0,154,134", "ForegroundNegative": "185,103,96", "ForegroundNeutral": "211,141,72", "ForegroundNormal": "11,44,41", "ForegroundPositive": "9,174,111", "ForegroundVisited": "130,109,168"}, "Colors:Complementary": {"BackgroundAlternate": "3,35,32", "BackgroundNormal": "19,52,49", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "139,177,175", "ForegroundLink": "0,211,184", "ForegroundNegative": "185,103,96", "ForegroundNeutral": "211,141,72", "ForegroundNormal": "228,255,253", "ForegroundPositive": "9,174,111", "ForegroundVisited": "130,109,168"}, "Colors:Header": {"BackgroundAlternate": "215,248,241", "BackgroundNormal": "198,232,226", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "91,132,135", "ForegroundLink": "0,154,134", "ForegroundNegative": "185,103,96", "ForegroundNeutral": "211,141,72", "ForegroundNormal": "11,44,41", "ForegroundPositive": "9,174,111", "ForegroundVisited": "130,109,168"}, "Colors:Header][Inactive": {"BackgroundAlternate": "203,237,231", "BackgroundNormal": "215,248,241", "DecorationFocus": "44,179,216", "DecorationHover": "44,179,216", "ForegroundActive": "44,179,216", "ForegroundInactive": "91,132,135", "ForegroundLink": "0,134,170", "ForegroundNegative": "185,103,96", "ForegroundNeutral": "211,141,72", "ForegroundNormal": "11,44,41", "ForegroundPositive": "9,174,111", "ForegroundVisited": "130,109,168"}, "Colors:Selection": {"BackgroundAlternate": "76,224,205", "BackgroundNormal": "76,224,205", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "0,0,0", "ForegroundLink": "0,253,220", "ForegroundNegative": "147,84,79", "ForegroundNeutral": "167,114,56", "ForegroundNormal": "0,0,0", "ForegroundPositive": "0,106,66", "ForegroundVisited": "130,109,168"}, "Colors:Tooltip": {"BackgroundAlternate": "215,248,241", "BackgroundNormal": "223,255,248", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "91,132,135", "ForegroundLink": "0,154,134", "ForegroundNegative": "185,103,96", "ForegroundNeutral": "211,141,72", "ForegroundNormal": "11,44,41", "ForegroundPositive": "9,174,111", "ForegroundVisited": "130,109,168"}, "Colors:View": {"BackgroundAlternate": "223,255,248", "BackgroundNormal": "231,255,255", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "91,132,135", "ForegroundLink": "0,154,134", "ForegroundNegative": "185,103,96", "ForegroundNeutral": "211,141,72", "ForegroundNormal": "11,44,41", "ForegroundPositive": "9,174,111", "ForegroundVisited": "130,109,168"}, "Colors:Window": {"BackgroundAlternate": "203,237,231", "BackgroundNormal": "215,248,241", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "91,132,135", "ForegroundLink": "0,154,134", "ForegroundNegative": "185,103,96", "ForegroundNeutral": "211,141,72", "ForegroundNormal": "11,44,41", "ForegroundPositive": "9,174,111", "ForegroundVisited": "130,109,168"}, "General": {"ColorScheme": "KdeGoldenTintLight", "ColorSchemeHash": "72fe2b7a58ea4e7eb18af21f2a73b98d2caf3f11"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "215,248,241", "activeBlend": "227,229,231", "activeForeground": "0,0,0", "inactiveBackground": "215,248,241", "inactiveBlend": "239,240,241", "inactiveForeground": "85,99,96"}}, "kdeglobals_sha256": "f3a2ae86adebbe97f1df33223543f7a3b979deceb72eb3d1cb8401754148f02e", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTintLight", "accent": "#3daee9", "commands": [["plasma-apply-colorscheme", "KdeGoldenTintLight"], ["plasma-apply-colorscheme", "-a", "#3daee9"]], "stdout": "Successfully applied the accent color #3daee9", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "118,197,238", "BackgroundNormal": "232,255,255", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "96,128,151", "ForegroundLink": "45,127,170", "ForegroundNegative": "187,98,115", "ForegroundNeutral": "213,138,99", "ForegroundNormal": "18,40,54", "ForegroundPositive": "33,172,131", "ForegroundVisited": "134,102,183"}, "Colors:Complementary": {"BackgroundAlternate": "10,32,45", "BackgroundNormal": "25,48,63", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "143,172,193", "ForegroundLink": "61,174,233", "ForegroundNegative": "187,98,115", "ForegroundNeutral": "213,138,99", "ForegroundNormal": "232,255,255", "ForegroundPositive": "33,172,131", "ForegroundVisited": "134,102,183"}, "Colors:Header": {"BackgroundAlternate": "219,244,255", "BackgroundNormal": "203,228,245", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "96,128,151", "ForegroundLink": "45,127,170", "ForegroundNegative": "187,98,115", "ForegroundNeutral": "213,138,99", "ForegroundNormal": "18,40,54", "ForegroundPositive": "33,172,131", "ForegroundVisited": "134,102,183"}, "Colors:Header][Inactive": {"BackgroundAlternate": "208,233,250", "BackgroundNormal": "219,244,255", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "96,128,151", "ForegroundLink": "32,129,186", "ForegroundNegative": "187,98,115", "ForegroundNeutral": "213,138,99", "ForegroundNormal": "18,40,54", "ForegroundPositive": "33,172,131", "ForegroundVisited": "134,102,183"}, "Colors:Selection": {"BackgroundAlternate": "119,198,239", "BackgroundNormal": "119,198,239", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "0,0,0", "ForegroundLink": "45,127,170", "ForegroundNegative": "149,80,97", "ForegroundNeutral": "169,111,81", "ForegroundNormal": "0,0,0", "ForegroundPositive": "0,103,83", "ForegroundVisited": "134,102,183"}, "Colors:Tooltip": {"BackgroundAlternate": "219,244,255", "BackgroundNormal": "227,251,255", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "96,128,151", "ForegroundLink": "45,127,170", "ForegroundNegative": "187,98,115", "ForegroundNeutral": "213,138,99", "ForegroundNormal": "18,40,54", "ForegroundPositive": "33,172,131", "ForegroundVisited": "134,102,183"}, "Colors:View": {"BackgroundAlternate": "227,251,255", "BackgroundNormal": "235,255,255", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "96,128,151", "ForegroundLink": "45,127,170", "ForegroundNegative": "187,98,115", "ForegroundNeutral": "213,138,99", "ForegroundNormal": "18,40,54", "ForegroundPositive": "33,172,131", "ForegroundVisited": "134,102,183"}, "Colors:Window": {"BackgroundAlternate": "208,233,250", "BackgroundNormal": "219,244,255", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "96,128,151", "ForegroundLink": "45,127,170", "ForegroundNegative": "187,98,115", "ForegroundNeutral": "213,138,99", "ForegroundNormal": "18,40,54", "ForegroundPositive": "33,172,131", "ForegroundVisited": "134,102,183"}, "General": {"ColorScheme": "KdeGoldenTintLight", "ColorSchemeHash": "72fe2b7a58ea4e7eb18af21f2a73b98d2caf3f11"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "219,244,255", "activeBlend": "227,229,231", "activeForeground": "0,0,0", "inactiveBackground": "219,244,255", "inactiveBlend": "239,240,241", "inactiveForeground": "87,97,101"}}, "kdeglobals_sha256": "ff0c384501365132aabbe35bd3d4751c20864c33457e0d18be070c730e8cf0ab", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTintLight", "accent": "#b875dc", "commands": [["plasma-apply-colorscheme", "KdeGoldenTintLight"], ["plasma-apply-colorscheme", "-a", "#b875dc"]], "stdout": "Successfully applied the accent color #b875dc", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "204,157,229", "BackgroundNormal": "255,245,255", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "124,118,152", "ForegroundLink": "150,68,187", "ForegroundNegative": "204,80,115", "ForegroundNeutral": "232,123,100", "ForegroundNormal": "43,32,54", "ForegroundPositive": "98,163,131", "ForegroundVisited": "155,89,184"}, "Colors:Complementary": {"BackgroundAlternate": "35,24,45", "BackgroundNormal": "50,40,63", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "172,162,193", "ForegroundLink": "223,201,238", "ForegroundNegative": "204,80,115", "ForegroundNeutral": "232,123,100", "ForegroundNormal": "255,245,255", "ForegroundPositive": "98,163,131", "ForegroundVisited": "155,89,184"}, "Colors:Header": {"BackgroundAlternate": "249,233,255", "BackgroundNormal": "232,217,245", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "124,118,152", "ForegroundLink": "150,68,187", "ForegroundNegative": "204,80,115", "ForegroundNeutral": "232,123,100", "ForegroundNormal": "43,32,54", "ForegroundPositive": "98,163,131", "ForegroundVisited": "155,89,184"}, "Colors:Header][Inactive": {"BackgroundAlternate": "237,222,250", "BackgroundNormal": "249,233,255", "DecorationFocus": "114,165,233", "DecorationHover": "114,165,233", "ForegroundActive": "114,165,233", "ForegroundInactive": "124,118,152", "ForegroundLink": "86,120,186", "ForegroundNegative": "204,80,115", "ForegroundNeutral": "232,123,100", "ForegroundNormal": "43,32,54", "ForegroundPositive": "98,163,131", "ForegroundVisited": "155,89,184"}, "Colors:Selection": {"BackgroundAlternate": "205,158,230", "BackgroundNormal": "205,158,230", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "0,0,0", "ForegroundLink": "150,68,187", "ForegroundNegative": "166,63,97", "ForegroundNeutral": "188,97,82", "ForegroundNormal": "0,0,0", "ForegroundPositive": "61,96,84", "ForegroundVisited": "155,89,184"}, "Colors:Tooltip": {"BackgroundAlternate": "249,233,255", "BackgroundNormal": "255,240,255", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "124,118,152", "ForegroundLink": "150,68,187", "ForegroundNegative": "204,80,115", "ForegroundNeutral": "232,123,100", "ForegroundNormal": "43,32,54", "ForegroundPositive": "98,163,131", "ForegroundVisited": "155,89,184"}, "Colors:View": {"BackgroundAlternate": "255,240,255", "BackgroundNormal": "255,248,255", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "124,118,152", "ForegroundLink": "150,68,187", "ForegroundNegative": "204,80,115", "ForegroundNeutral": "232,123,100", "ForegroundNormal": "43,32,54", "ForegroundPositive": "98,163,131", "ForegroundVisited": "155,89,184"}, "Colors:Window": {"BackgroundAlternate": "237,222,250", "BackgroundNormal": "249,233,255", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "124,118,152", "ForegroundLink": "150,68,187", "ForegroundNegative": "204,80,115", "ForegroundNeutral": "232,123,100", "ForegroundNormal": "43,32,54", "ForegroundPositive": "98,163,131", "ForegroundVisited": "155,89,184"}, "General": {"ColorScheme": "KdeGoldenTintLight", "ColorSchemeHash": "72fe2b7a58ea4e7eb18af21f2a73b98d2caf3f11"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "249,233,255", "activeBlend": "227,229,231", "activeForeground": "0,0,0", "inactiveBackground": "249,233,255", "inactiveBlend": "239,240,241", "inactiveForeground": "99,93,101"}}, "kdeglobals_sha256": "25a4403656dd2749d0e16528070c5103063d80c615a14f047995af5afbbfd540", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTintLight", "accent": "#926ee4", "commands": [["plasma-apply-colorscheme", "KdeGoldenTintLight"], ["plasma-apply-colorscheme", "-a", "#926ee4"]], "stdout": "Successfully applied the accent color #926ee4", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "177,152,235", "BackgroundNormal": "254,247,255", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "117,120,157", "ForegroundLink": "118,54,221", "ForegroundNegative": "199,85,122", "ForegroundNeutral": "227,127,108", "ForegroundNormal": "37,33,59", "ForegroundPositive": "85,165,138", "ForegroundVisited": "149,91,189"}, "Colors:Complementary": {"BackgroundAlternate": "29,25,49", "BackgroundNormal": "45,41,68", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "165,164,200", "ForegroundLink": "209,199,242", "ForegroundNegative": "199,85,122", "ForegroundNeutral": "227,127,108", "ForegroundNormal": "254,247,255", "ForegroundPositive": "85,165,138", "ForegroundVisited": "149,91,189"}, "Colors:Header": {"BackgroundAlternate": "241,235,255", "BackgroundNormal": "224,219,252", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "117,120,157", "ForegroundLink": "118,54,221", "ForegroundNegative": "199,85,122", "ForegroundNeutral": "227,127,108", "ForegroundNormal": "37,33,59", "ForegroundPositive": "85,165,138", "ForegroundVisited": "149,91,189"}, "Colors:Header][Inactive": {"BackgroundAlternate": "229,224,255", "BackgroundNormal": "241,235,255", "DecorationFocus": "102,166,239", "DecorationHover": "102,166,239", "ForegroundActive": "102,166,239", "ForegroundInactive": "117,120,157", "ForegroundLink": "75,121,191", "ForegroundNegative": "199,85,122", "ForegroundNeutral": "227,127,108", "ForegroundNormal": "37,33,59", "ForegroundPositive": "85,165,138", "ForegroundVisited": "149,91,189"}, "Colors:Selection": {"BackgroundAlternate": "178,153,236", "BackgroundNormal": "178,153,236", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "0,0,0", "ForegroundLink": "118,54,221", "ForegroundNegative": "161,67,103", "ForegroundNeutral": "182,100,90", "ForegroundNormal": "0,0,0", "ForegroundPositive": "50,97,90", "ForegroundVisited": "149,91,189"}, "Colors:Tooltip": {"BackgroundAlternate": "241,235,255", "BackgroundNormal": "249,242,255", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "117,120,157", "ForegroundLink": "118,54,221", "ForegroundNegative": "199,85,122", "ForegroundNeutral": "227,127,108", "ForegroundNormal": "37,33,59", "ForegroundPositive": "85,165,138", "ForegroundVisited": "149,91,189"}, "Colors:View": {"BackgroundAlternate": "249,242,255", "BackgroundNormal": "255,250,255", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "117,120,157", "ForegroundLink": "118,54,221", "ForegroundNegative": "199,85,122", "ForegroundNeutral": "227,127,108", "ForegroundNormal": "37,33,59", "ForegroundPositive": "85,165,138", "ForegroundVisited": "149,91,189"}, "Colors:Window": {"BackgroundAlternate": "229,224,255", "BackgroundNormal": "241,235,255", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "117,120,157", "ForegroundLink": "118,54,221", "ForegroundNegative": "199,85,122", "ForegroundNeutral": "227,127,108", "ForegroundNormal": "37,33,59", "ForegroundPositive": "85,165,138", "ForegroundVisited": "149,91,189"}, "General": {"ColorScheme": "KdeGoldenTintLight", "ColorSchemeHash": "72fe2b7a58ea4e7eb18af21f2a73b98d2caf3f11"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "241,235,255", "activeBlend": "227,229,231", "activeForeground": "0,0,0", "inactiveBackground": "241,235,255", "inactiveBlend": "239,240,241", "inactiveForeground": "96,93,101"}}, "kdeglobals_sha256": "d262f44a4ee70416c26cbf61c904f91df1f3ea8a51f3f29805f08727f3692623", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTintLight", "accent": "#686b6f", "commands": [["plasma-apply-colorscheme", "KdeGoldenTintLight"], ["plasma-apply-colorscheme", "-a", "#686b6f"]], "stdout": "Successfully applied the accent color #686b6f", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "148,150,153", "BackgroundNormal": "251,252,253", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "114,125,135", "ForegroundLink": "104,107,111", "ForegroundNegative": "198,90,97", "ForegroundNeutral": "226,131,74", "ForegroundNormal": "35,38,41", "ForegroundPositive": "81,168,112", "ForegroundVisited": "147,99,168"}, "Colors:Complementary": {"BackgroundAlternate": "27,30,32", "BackgroundNormal": "42,46,50", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "162,169,176", "ForegroundLink": "196,198,202", "ForegroundNegative": "198,90,97", "ForegroundNeutral": "226,131,74", "ForegroundNormal": "251,252,253", "ForegroundPositive": "81,168,112", "ForegroundVisited": "147,99,168"}, "Colors:Header": {"BackgroundAlternate": "238,240,242", "BackgroundNormal": "222,224,227", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "114,125,135", "ForegroundLink": "76,78,81", "ForegroundNegative": "198,90,97", "ForegroundNeutral": "226,131,74", "ForegroundNormal": "35,38,41", "ForegroundPositive": "81,168,112", "ForegroundVisited": "147,99,168"}, "Colors:Header][Inactive": {"BackgroundAlternate": "227,229,232", "BackgroundNormal": "238,240,242", "DecorationFocus": "96,172,217", "DecorationHover": "96,172,217", "ForegroundActive": "96,172,217", "ForegroundInactive": "114,125,135", "ForegroundLink": "68,127,170", "ForegroundNegative": "198,90,97", "ForegroundNeutral": "226,131,74", "ForegroundNormal": "35,38,41", "ForegroundPositive": "81,168,112", "ForegroundVisited": "147,99,168"}, "Colors:Selection": {"BackgroundAlternate": "149,151,154", "BackgroundNormal": "149,151,154", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "0,0,0", "ForegroundLink": "76,78,81", "ForegroundNegative": "160,73,80", "ForegroundNeutral": "182,104,58", "ForegroundNormal": "0,0,0", "ForegroundPositive": "47,100,67", "ForegroundVisited": "147,99,168"}, "Colors:Tooltip": {"BackgroundAlternate": "238,240,242", "BackgroundNormal": "246,247,248", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "114,125,135", "ForegroundLink": "76,78,81", "ForegroundNegative": "198,90,97", "ForegroundNeutral": "226,131,74", "ForegroundNormal": "35,38,41", "ForegroundPositive": "81,168,112", "ForegroundVisited": "147,99,168"}, "Colors:View": {"BackgroundAlternate": "246,247,248", "BackgroundNormal": "254,255,255", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "114,125,135", "ForegroundLink": "104,107,111", "ForegroundNegative": "198,90,97", "ForegroundNeutral": "226,131,74", "ForegroundNormal": "35,38,41", "ForegroundPositive": "81,168,112", "ForegroundVisited": "147,99,168"}, "Colors:Window": {"BackgroundAlternate": "227,229,232", "BackgroundNormal": "238,240,242", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "114,125,135", "ForegroundLink": "76,78,81", "ForegroundNegative": "198,90,97", "ForegroundNeutral": "226,131,74", "ForegroundNormal": "35,38,41", "ForegroundPositive": "81,168,112", "ForegroundVisited": "147,99,168"}, "General": {"ColorScheme": "KdeGoldenTintLight", "ColorSchemeHash": "72fe2b7a58ea4e7eb18af21f2a73b98d2caf3f11"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "238,240,242", "activeBlend": "227,229,231", "activeForeground": "0,0,0", "inactiveBackground": "238,240,242", "inactiveBlend": "239,240,241", "inactiveForeground": "95,95,96"}}, "kdeglobals_sha256": "b5d75a94a8abdc969a63df299a4bcda8b2213ebdc9651106ac732e8f99c3e475", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTitlebarDark", "accent": "#e93a9a", "commands": [["plasma-apply-colorscheme", "KdeGoldenTitlebarDark"], ["plasma-apply-colorscheme", "-a", "#e93a9a"]], "stdout": "Successfully applied the accent color #e93a9a", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "175,53,122", "BackgroundNormal": "41,44,48", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "161,169,177", "ForegroundLink": "247,188,212", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "161,169,177", "ForegroundLink": "247,188,212", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "172,51,119", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "161,169,177", "ForegroundLink": "247,188,212", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "46,28,39", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "171,164,168", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "169,47,115", "BackgroundNormal": "169,47,115", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "255,255,255", "ForegroundLink": "170,42,112", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "161,169,177", "ForegroundLink": "247,188,212", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "161,169,177", "ForegroundLink": "233,58,154", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "233,58,154", "DecorationHover": "233,58,154", "ForegroundActive": "233,58,154", "ForegroundInactive": "161,169,177", "ForegroundLink": "247,188,212", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "KdeGoldenTitlebarDark", "ColorSchemeHash": "645f7c749422dc8327f5375893100ceff3876d7a"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "172,51,119", "activeBlend": "252,252,252", "activeForeground": "255,255,255", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "2f2f9f03a32c6de80f4b29b02b7580db68b9b72adb1fcc49bff83c1b16cc4be9", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTitlebarDark", "accent": "#e93d58", "commands": [["plasma-apply-colorscheme", "KdeGoldenTitlebarDark"], ["plasma-apply-colorscheme", "-a", "#e93d58"]], "stdout": "Successfully applied the accent color #e93d58", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "175,55,76", "BackgroundNormal": "41,44,48", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "161,169,177", "ForegroundLink": "246,189,194", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "161,169,177", "ForegroundLink": "246,189,194", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "172,53,73", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "161,169,177", "ForegroundLink": "246,189,194", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "46,29,32", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "171,164,165", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "169,49,68", "BackgroundNormal": "169,49,68", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "255,255,255", "ForegroundLink": "170,45,64", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "161,169,177", "ForegroundLink": "246,189,194", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "161,169,177", "ForegroundLink": "246,189,194", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "233,61,88", "DecorationHover": "233,61,88", "ForegroundActive": "233,61,88", "ForegroundInactive": "161,169,177", "ForegroundLink": "246,189,194", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "KdeGoldenTitlebarDark", "ColorSchemeHash": "645f7c749422dc8327f5375893100ceff3876d7a"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "172,53,73", "activeBlend": "252,252,252", "activeForeground": "255,255,255", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "28ec2ae591aa400d4f7fa7bb34f714ccf5dfc0c556428885eee46839c38b574d", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTitlebarDark", "accent": "#e9643a", "commands": [["plasma-apply-colorscheme", "KdeGoldenTitlebarDark"], ["plasma-apply-colorscheme", "-a", "#e9643a"]], "stdout": "Successfully applied the accent color #e9643a", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "175,83,55", "BackgroundNormal": "41,44,48", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "161,169,177", "ForegroundLink": "249,195,187", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "161,169,177", "ForegroundLink": "233,100,58", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "172,80,52", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "161,169,177", "ForegroundLink": "249,195,187", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "44,31,29", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "170,165,164", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "169,76,47", "BackgroundNormal": "169,76,47", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "255,255,255", "ForegroundLink": "170,73,42", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "161,169,177", "ForegroundLink": "249,195,187", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "161,169,177", "ForegroundLink": "233,100,58", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "233,100,58", "DecorationHover": "233,100,58", "ForegroundActive": "233,100,58", "ForegroundInactive": "161,169,177", "ForegroundLink": "233,100,58", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "KdeGoldenTitlebarDark", "ColorSchemeHash": "645f7c749422dc8327f5375893100ceff3876d7a"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "172,80,52", "activeBlend": "252,252,252", "activeForeground": "255,255,255", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "8e7d6032a2ec65f3cf36df6d63906e6eea71512e6d763721bd8ceb06371383c4", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTitlebarDark", "accent": "#e8cb2d", "commands": [["plasma-apply-colorscheme", "KdeGoldenTitlebarDark"], ["plasma-apply-colorscheme", "-a", "#e8cb2d"]], "stdout": "Successfully applied the accent color #e8cb2d", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "174,155,45", "BackgroundNormal": "41,44,48", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "161,169,177", "ForegroundLink": "232,203,45", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "161,169,177", "ForegroundLink": "232,203,45", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "172,152,42", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "161,169,177", "ForegroundLink": "232,203,45", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "36,35,24", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "167,166,162", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "168,148,38", "BackgroundNormal": "168,148,38", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "0,0,0", "ForegroundLink": "254,231,139", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "161,169,177", "ForegroundLink": "232,203,45", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "161,169,177", "ForegroundLink": "232,203,45", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "232,203,45", "DecorationHover": "232,203,45", "ForegroundActive": "232,203,45", "ForegroundInactive": "161,169,177", "ForegroundLink": "232,203,45", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "KdeGoldenTitlebarDark", "ColorSchemeHash": "645f7c749422dc8327f5375893100ceff3876d7a"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "172,152,42", "activeBlend": "252,252,252", "activeForeground": "0,0,0", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "e15f46ccb4e0ff6dbaa2c3c3169cc179910be5b4a7b9f4e768fa3ec631383e49", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTitlebarDark", "accent": "#3dd425", "commands": [["plasma-apply-colorscheme", "KdeGoldenTitlebarDark"], ["plasma-apply-colorscheme", "-a", "#3dd425"]], "stdout": "Successfully applied the accent color #3dd425", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "55,161,40", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,212,37", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,212,37", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "52,158,37", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,212,37", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "22,39,26", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "161,168,163", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "48,155,33", "BackgroundNormal": "48,155,33", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "0,0,0", "ForegroundLink": "100,254,84", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,212,37", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,212,37", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,212,37", "DecorationHover": "61,212,37", "ForegroundActive": "61,212,37", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,212,37", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "KdeGoldenTitlebarDark", "ColorSchemeHash": "645f7c749422dc8327f5375893100ceff3876d7a"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "52,158,37", "activeBlend": "252,252,252", "activeForeground": "0,0,0", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "fb8eebf04c7eed2d7420dd0314d083658d6d5e332d63bc4ce35465de008d1592", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTitlebarDark", "accent": "#00d3b8", "commands": [["plasma-apply-colorscheme", "KdeGoldenTitlebarDark"], ["plasma-apply-colorscheme", "-a", "#00d3b8"]], "stdout": "Successfully applied the accent color #00d3b8", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "12,160,143", "BackgroundNormal": "41,44,48", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "161,169,177", "ForegroundLink": "0,211,184", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "161,169,177", "ForegroundLink": "0,211,184", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "9,158,140", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "161,169,177", "ForegroundLink": "0,211,184", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "20,38,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "160,168,168", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "5,154,136", "BackgroundNormal": "5,154,136", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "0,0,0", "ForegroundLink": "0,253,220", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "161,169,177", "ForegroundLink": "0,211,184", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "161,169,177", "ForegroundLink": "0,211,184", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "0,211,184", "DecorationHover": "0,211,184", "ForegroundActive": "0,211,184", "ForegroundInactive": "161,169,177", "ForegroundLink": "0,211,184", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "KdeGoldenTitlebarDark", "ColorSchemeHash": "645f7c749422dc8327f5375893100ceff3876d7a"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "9,158,140", "activeBlend": "252,252,252", "activeForeground": "0,0,0", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "c44db8f91b4c667fc6478c04735003675f047968242e4fa2d122da9d6561a80d", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTitlebarDark", "accent": "#3daee9", "commands": [["plasma-apply-colorscheme", "KdeGoldenTitlebarDark"], ["plasma-apply-colorscheme", "-a", "#3daee9"]], "stdout": "Successfully applied the accent color #3daee9", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "55,135,177", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,174,233", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,174,233", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "52,132,174", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,174,233", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "23,36,46", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "162,167,171", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "48,128,170", "BackgroundNormal": "48,128,170", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "0,0,0", "ForegroundLink": "45,127,170", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "0,0,0", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,174,233", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,174,233", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "61,174,233", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "KdeGoldenTitlebarDark", "ColorSchemeHash": "645f7c749422dc8327f5375893100ceff3876d7a"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "52,132,174", "activeBlend": "252,252,252", "activeForeground": "0,0,0", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "9440bc25a83f2b557bb1646e97fc98fa7ddd3698b72a20b1da81f6496c1ce1b4", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTitlebarDark", "accent": "#b875dc", "commands": [["plasma-apply-colorscheme", "KdeGoldenTitlebarDark"], ["plasma-apply-colorscheme", "-a", "#b875dc"]], "stdout": "Successfully applied the accent color #b875dc", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "141,95,168", "BackgroundNormal": "41,44,48", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "161,169,177", "ForegroundLink": "223,201,238", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "161,169,177", "ForegroundLink": "184,117,220", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "138,92,165", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "161,169,177", "ForegroundLink": "223,201,238", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "37,32,46", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "167,165,171", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "134,88,161", "BackgroundNormal": "134,88,161", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "255,255,255", "ForegroundLink": "150,68,187", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "161,169,177", "ForegroundLink": "223,201,238", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "161,169,177", "ForegroundLink": "184,117,220", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "184,117,220", "DecorationHover": "184,117,220", "ForegroundActive": "184,117,220", "ForegroundInactive": "161,169,177", "ForegroundLink": "184,117,220", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "KdeGoldenTitlebarDark", "ColorSchemeHash": "645f7c749422dc8327f5375893100ceff3876d7a"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "138,92,165", "activeBlend": "252,252,252", "activeForeground": "255,255,255", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "1df717817fbd41d45c028e8f366a27590a776a81761dba15867ad4741118916d", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTitlebarDark", "accent": "#926ee4", "commands": [["plasma-apply-colorscheme", "KdeGoldenTitlebarDark"], ["plasma-apply-colorscheme", "-a", "#926ee4"]], "stdout": "Successfully applied the accent color #926ee4", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "114,90,174", "BackgroundNormal": "41,44,48", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "161,169,177", "ForegroundLink": "209,199,242", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "161,169,177", "ForegroundLink": "209,199,242", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "111,87,171", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "161,169,177", "ForegroundLink": "209,199,242", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "33,32,49", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "166,165,172", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "108,83,166", "BackgroundNormal": "108,83,166", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "255,255,255", "ForegroundLink": "118,54,221", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "161,169,177", "ForegroundLink": "209,199,242", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "161,169,177", "ForegroundLink": "146,110,228", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "146,110,228", "DecorationHover": "146,110,228", "ForegroundActive": "146,110,228", "ForegroundInactive": "161,169,177", "ForegroundLink": "209,199,242", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "KdeGoldenTitlebarDark", "ColorSchemeHash": "645f7c749422dc8327f5375893100ceff3876d7a"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "111,87,171", "activeBlend": "252,252,252", "activeForeground": "255,255,255", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "6ed2d86a4200158b12633ea5949f4ed3f39d639c232bc1f5b44148efb5648749", "config_files": ["kdeglobals"]}, +{"scheme": "KdeGoldenTitlebarDark", "accent": "#686b6f", "commands": [["plasma-apply-colorscheme", "KdeGoldenTitlebarDark"], ["plasma-apply-colorscheme", "-a", "#686b6f"]], "stdout": "Successfully applied the accent color #686b6f", "kdeglobals": {"ColorEffects:Disabled": {"ChangeSelectionColor": "", "Color": "56,56,56", "ColorAmount": "0", "ColorEffect": "0", "ContrastAmount": "0.65", "ContrastEffect": "1", "Enable": "", "IntensityAmount": "0.1", "IntensityEffect": "2"}, "ColorEffects:Inactive": {"ChangeSelectionColor": "true", "Color": "112,111,110", "ColorAmount": "0.025", "ColorEffect": "2", "ContrastAmount": "0.1", "ContrastEffect": "2", "Enable": "false", "IntensityAmount": "0", "IntensityEffect": "0"}, "Colors:Button": {"BackgroundAlternate": "85,88,92", "BackgroundNormal": "41,44,48", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "161,169,177", "ForegroundLink": "196,198,202", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Complementary": {"BackgroundAlternate": "30,87,116", "BackgroundNormal": "32,35,38", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "161,169,177", "ForegroundLink": "196,198,202", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "82,85,89", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "161,169,177", "ForegroundLink": "196,198,202", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Header][Inactive": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "61,174,233", "DecorationHover": "61,174,233", "ForegroundActive": "61,174,233", "ForegroundInactive": "161,169,177", "ForegroundLink": "29,153,243", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "165,166,168", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Selection": {"BackgroundAlternate": "78,81,84", "BackgroundNormal": "78,81,84", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "255,255,255", "ForegroundLink": "76,78,81", "ForegroundNegative": "176,55,69", "ForegroundNeutral": "198,92,0", "ForegroundNormal": "255,255,255", "ForegroundPositive": "23,104,57", "ForegroundVisited": "155,89,182"}, "Colors:Tooltip": {"BackgroundAlternate": "32,35,38", "BackgroundNormal": "41,44,48", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "161,169,177", "ForegroundLink": "196,198,202", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:View": {"BackgroundAlternate": "29,31,34", "BackgroundNormal": "20,22,24", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "161,169,177", "ForegroundLink": "196,198,202", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "Colors:Window": {"BackgroundAlternate": "41,44,48", "BackgroundNormal": "32,35,38", "DecorationFocus": "104,107,111", "DecorationHover": "104,107,111", "ForegroundActive": "104,107,111", "ForegroundInactive": "161,169,177", "ForegroundLink": "196,198,202", "ForegroundNegative": "218,68,83", "ForegroundNeutral": "246,116,0", "ForegroundNormal": "252,252,252", "ForegroundPositive": "39,174,96", "ForegroundVisited": "155,89,182"}, "General": {"ColorScheme": "KdeGoldenTitlebarDark", "ColorSchemeHash": "645f7c749422dc8327f5375893100ceff3876d7a"}, "KDE": {"contrast": "4", "frameContrast": "0.2"}, "WM": {"activeBackground": "82,85,89", "activeBlend": "252,252,252", "activeForeground": "255,255,255", "inactiveBackground": "32,36,40", "inactiveBlend": "161,169,177", "inactiveForeground": "161,169,177"}}, "kdeglobals_sha256": "26d818582c96f170ae9d01be96c50bfcbf8ba4dd8817398178543537382764aa", "config_files": ["kdeglobals"]} +] +} diff --git a/tools/kde_golden/vectors/fonts.sha256 b/tools/kde_golden/vectors/fonts.sha256 new file mode 100644 index 000000000..62aa2dc3f --- /dev/null +++ b/tools/kde_golden/vectors/fonts.sha256 @@ -0,0 +1,2 @@ +89c3c497f618fdaa0b2d1e98fef93582f28c71debd2c4a8cdf41f190ced2909d /usr/share/fonts/truetype/noto/NotoSans-Regular.ttf +9f67c8a8cd28498525639437d6fac588c452e8572945c790db7641cc7907a69b /usr/share/fonts/truetype/hack/Hack-Regular.ttf diff --git a/tools/kde_golden/vectors/math.json b/tools/kde_golden/vectors/math.json new file mode 100644 index 000000000..5ed582dfa --- /dev/null +++ b/tools/kde_golden/vectors/math.json @@ -0,0 +1,20928 @@ +{ +"meta": {"generator":"tools/kde_golden/driver (kde_golden)","image":"invent-registry.kde.org/neon/docker-images/plasma@sha256:f58f9b97f218ee976cf928f6fe00abb929a644aded8c9dfb02f77a9b2a6e1732","kcolorscheme_build":"6.31.0","kguiaddons_build":"6.31.0","kind":"math","packages":{"breeze":"4:6.8.0-0zneon+24.04+noble+release+build80","fonts-hack":"3.003-3","fonts-noto-core":"20201225-2","kde-style-breeze":"4:6.8.0-0zneon+24.04+noble+release+build80","kde-style-oxygen":"4:6.8.0-0zneon+24.04+noble+release+build59","kf6-kcolorscheme":"6.31.0-0zneon+24.04+noble+release+build47","kf6-kconfig":"6.31.0-0zneon+24.04+noble+release+build36","kf6-kguiaddons":"6.31.0-0zneon+24.04+noble+release+build59","libkf6colorscheme-dev":"6.31.0-0zneon+24.04+noble+release+build47","plasma-workspace":"4:6.8.0-0zneon+24.04+noble+release+build99","qt6-base":"6.11.1-0zneon+24.04+noble+release+build162"},"qt_build":"6.11.1","qt_runtime":"6.11.1","readme":"tools/kde_golden/README.md documents every field"}, +"colors": ["#000000ff","#ffffffff","#010101ff","#020202ff","#040404ff","#080808ff","#101010ff","#202020ff","#404040ff","#7f7f7fff","#808080ff","#818181ff","#bfbfbfff","#c0c0c0ff","#fdfdfdff","#fefefeff","#ff0000ff","#00ff00ff","#0000ffff","#ffff00ff","#00ffffff","#ff00ffff","#800000ff","#008000ff","#000080ff","#ff8080ff","#80ff80ff","#8080ffff","#030201ff","#fffefdff","#7f8081ff","#010000ff","#000001ff","#fefffeff","#3daee9ff","#232629ff","#eff0f1ff","#fcfcfcff","#31363bff","#1b1e20ff","#da4453ff","#27ae60ff","#f67400ff","#2980b9ff","#7f8c8dff","#9b59b6ff","#1d99f3ff","#dee0e2ff","#292c30ff","#e93a9aff","#e93d58ff","#e9643aff","#e8cb2dff","#3dd425ff","#00d3b8ff","#b875dcff","#926ee4ff","#686b6fff","#3daee980","#ffffff00","#00000080","#ff000033"], +"pair_colors": ["#000000ff","#ffffffff","#7f7f7fff","#808080ff","#ff0000ff","#00ff00ff","#0000ffff","#ffff00ff","#030201ff","#3daee9ff","#232629ff","#eff0f1ff","#fcfcfcff","#da4453ff","#e8cb2dff","#3daee980","#ffffff00"], +"single": [ +{"chroma":0,"hcy":[0,0,0,1],"hue":0,"in":"#000000ff","luma":0,"roundtrip":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"hcy":[0,0,1,1],"hue":0,"in":"#ffffffff","luma":1,"roundtrip":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"hcy":[0,0,5.077052561215497e-06,1],"hue":0,"in":"#010101ff","luma":5.077052561215497e-06,"roundtrip":{"hex":"#010101ff","u16":[257,257,257,65535]}}, +{"chroma":0,"hcy":[0,0,2.3328007701206905e-05,1],"hue":0,"in":"#020202ff","luma":2.3328007701206905e-05,"roundtrip":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"chroma":0,"hcy":[0,0,0.00010718737628693813,1],"hue":0,"in":"#040404ff","luma":0.00010718737628693813,"roundtrip":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"chroma":0,"hcy":[0,0,0.0004925038512690163,1],"hue":0,"in":"#080808ff","luma":0.0004925038512690163,"roundtrip":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"chroma":0,"hcy":[0,0,0.0022629534551296933,1],"hue":0,"in":"#101010ff","luma":0.0022629534551296933,"roundtrip":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"chroma":0,"hcy":[0,0,0.010397803645369345,1],"hue":0,"in":"#202020ff","luma":0.010397803645369345,"roundtrip":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"chroma":0,"hcy":[0,0,0.04777575977207176,1],"hue":0,"in":"#404040ff","luma":0.04777575977207176,"roundtrip":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"chroma":0,"hcy":[0,0,0.21576439972078568,1],"hue":0,"in":"#7f7f7fff","luma":0.21576439972078568,"roundtrip":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"chroma":0,"hcy":[0,0,0.21951974663564944,1],"hue":0,"in":"#808080ff","luma":0.21951974663564944,"roundtrip":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"chroma":0,"hcy":[0,0,0.22331043694287703,1],"hue":0,"in":"#818181ff","luma":0.22331043694287703,"roundtrip":{"hex":"#818181ff","u16":[33153,33153,33153,65535]}}, +{"chroma":0,"hcy":[0,0,0.5295232456839567,1],"hue":0,"in":"#bfbfbfff","luma":0.5295232456839567,"roundtrip":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]}}, +{"chroma":0,"hcy":[0,0,0.5356416323624177,1],"hue":0,"in":"#c0c0c0ff","luma":0.5356416323624177,"roundtrip":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]}}, +{"chroma":0,"hcy":[0,0,0.9828262560725913,1],"hue":0,"in":"#fdfdfdff","luma":0.9828262560725913,"roundtrip":{"hex":"#fdfdfdff","u16":[65021,65021,65021,65535]}}, +{"chroma":0,"hcy":[0,0,0.991392844104757,1],"hue":0,"in":"#fefefeff","luma":0.991392844104757,"roundtrip":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]}}, +{"chroma":1,"hcy":[0,1,0.2126,1],"hue":0,"in":"#ff0000ff","luma":0.2126,"roundtrip":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"chroma":1,"hcy":[0.3333333333333333,1,0.7152,1],"hue":0.3333333333333333,"in":"#00ff00ff","luma":0.7152,"roundtrip":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"chroma":1,"hcy":[0.6666666666666666,1,0.0722,1],"hue":0.6666666666666666,"in":"#0000ffff","luma":0.0722,"roundtrip":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"chroma":1,"hcy":[0.16666666666666666,1,0.9278,1],"hue":0.16666666666666666,"in":"#ffff00ff","luma":0.9278,"roundtrip":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"chroma":1,"hcy":[0.5,1,0.7874,1],"hue":0.5,"in":"#00ffffff","luma":0.7874,"roundtrip":{"hex":"#00ffffff","u16":[0,65535,65535,65535]}}, +{"chroma":1,"hcy":[0.8333333333333334,1,0.2848,1],"hue":0.8333333333333334,"in":"#ff00ffff","luma":0.2848,"roundtrip":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]}}, +{"chroma":1,"hcy":[0,1,0.046669898134739075,1],"hue":0,"in":"#800000ff","luma":0.046669898134739075,"roundtrip":{"hex":"#800000ff","u16":[32896,0,0,65535]}}, +{"chroma":1,"hcy":[0.3333333333333333,1,0.1570005227938165,1],"hue":0.3333333333333333,"in":"#008000ff","luma":0.1570005227938165,"roundtrip":{"hex":"#008000ff","u16":[0,32896,0,65535]}}, +{"chroma":1,"hcy":[0.6666666666666666,1,0.01584932570709389,1],"hue":0.6666666666666666,"in":"#000080ff","luma":0.01584932570709389,"roundtrip":{"hex":"#000080ff","u16":[0,0,32896,65535]}}, +{"chroma":1,"hcy":[0,1,0.3854498485009104,1],"hue":0,"in":"#ff8080ff","luma":0.3854498485009104,"roundtrip":{"hex":"#ff8080ff","u16":[65535,32896,32896,65535]}}, +{"chroma":1,"hcy":[0.3333333333333333,1,0.7777192238418329,1],"hue":0.3333333333333333,"in":"#80ff80ff","luma":0.7777192238418329,"roundtrip":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]}}, +{"chroma":1,"hcy":[0.6666666666666666,1,0.27587042092855557,1],"hue":0.6666666666666666,"in":"#8080ffff","luma":0.27587042092855557,"roundtrip":{"hex":"#8080ffff","u16":[32896,32896,65535,65535]}}, +{"chroma":0.8258439748312948,"hcy":[0.05867185925224872,0.8258439748312948,2.915232221393058e-05,1],"hue":0.05867185925224872,"in":"#030201ff","luma":2.915232221393058e-05,"roundtrip":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"chroma":1,"hcy":[0.08313648311414243,1,0.9926042177921633,1],"hue":0.08313648311414243,"in":"#fffefdff","luma":0.9926042177921633,"roundtrip":{"hex":"#fffefdff","u16":[65535,65278,65021,65535]}}, +{"chroma":0.014752150948411593,"hcy":[0.5837236418635325,0.014752150948411593,0.21899504772173126,1],"hue":0.5837236418635325,"in":"#7f8081ff","luma":0.21899504772173126,"roundtrip":{"hex":"#7f8081ff","u16":[32639,32896,33153,65535]}}, +{"chroma":1,"hcy":[0,1,1.0793813745144147e-06,1],"hue":0,"in":"#010000ff","luma":1.0793813745144147e-06,"roundtrip":{"hex":"#010000ff","u16":[257,0,0,65535]}}, +{"chroma":1,"hcy":[0.6666666666666666,1,3.665631949197589e-07,1],"hue":0.6666666666666666,"in":"#000001ff","luma":3.665631949197589e-07,"roundtrip":{"hex":"#000001ff","u16":[0,0,257,65535]}}, +{"chroma":1,"hcy":[0.3333333333333333,1,0.9975486820010347,1],"hue":0.3333333333333333,"in":"#fefffeff","luma":0.9975486820010347,"roundtrip":{"hex":"#fefffeff","u16":[65278,65535,65278,65535]}}, +{"chroma":0.8859261608923455,"hcy":[0.5833623180737052,0.8859261608923455,0.37683495841856884,1],"hue":0.5833623180737052,"in":"#3daee9ff","luma":0.37683495841856884,"roundtrip":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"chroma":0.14668682237720893,"hcy":[0.5872793887563216,0.14668682237720893,0.014840649046253766,1],"hue":0.5872793887563216,"in":"#232629ff","luma":0.014840649046253766,"roundtrip":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"chroma":0.0727300176330628,"hcy":[0.5835416664605718,0.0727300176330628,0.8740169984782439,1],"hue":0.5835416664605718,"in":"#eff0f1ff","luma":0.8740169984782439,"roundtrip":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"chroma":0,"hcy":[0,0,0.9743002039098161,1],"hue":0,"in":"#fcfcfcff","luma":0.9743002039098161,"roundtrip":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"chroma":0.17142281261865266,"hcy":[0.5879608447318521,0.17142281261865266,0.032041292327068156,1],"hue":0.5879608447318521,"in":"#31363bff","luma":0.032041292327068156,"roundtrip":{"hex":"#31363bff","u16":[12593,13878,15163,65535]}}, +{"chroma":0.17984945088614265,"hcy":[0.5707375264074906,0.17984945088614265,0.008724053384721276,1],"hue":0.5707375264074906,"in":"#1b1e20ff","luma":0.008724053384721276,"roundtrip":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]}}, +{"chroma":0.721097446056771,"hcy":[0.992338743786733,0.721097446056771,0.19573963297852393,1],"hue":0.992338743786733,"in":"#da4453ff","luma":0.19573963297852393,"roundtrip":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"chroma":0.9498397358104452,"hcy":[0.373671532865446,0.9498397358104452,0.3203273046425214,1],"hue":0.373671532865446,"in":"#27ae60ff","luma":0.3203273046425214,"roundtrip":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]}}, +{"chroma":1,"hcy":[0.03188593040423337,1,0.3228699804981117,1],"hue":0.03188593040423337,"in":"#f67400ff","luma":0.3228699804981117,"roundtrip":{"hex":"#f67400ff","u16":[63222,29812,0,65535]}}, +{"chroma":0.908698550047228,"hcy":[0.596036761235255,0.908698550047228,0.196452900302308,1],"hue":0.596036761235255,"in":"#2980b9ff","luma":0.196452900302308,"roundtrip":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]}}, +{"chroma":0.15944869388279823,"hcy":[0.5125996687873353,0.15944869388279823,0.25669390809405357,1],"hue":0.5125996687873353,"in":"#7f8c8dff","luma":0.25669390809405357,"roundtrip":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}}, +{"chroma":0.43948326485231587,"hcy":[0.7707620633205988,0.43948326485231587,0.17606825443530055,1],"hue":0.7707620633205988,"in":"#9b59b6ff","luma":0.17606825443530055,"roundtrip":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}}, +{"chroma":0.9720133101225753,"hcy":[0.6074336286605359,0.9720133101225753,0.29918214303553803,1],"hue":0.6074336286605359,"in":"#1d99f3ff","luma":0.29918214303553803,"roundtrip":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]}}, +{"chroma":0.06755635527814857,"hcy":[0.5837797599763813,0.06755635527814857,0.7498440023087394,1],"hue":0.5837797599763813,"in":"#dee0e2ff","luma":0.7498440023087394,"roundtrip":{"hex":"#dee0e2ff","u16":[57054,57568,58082,65535]}}, +{"chroma":0.13053775381326926,"hcy":[0.5990862582111002,0.13053775381326926,0.02062934270429031,1],"hue":0.5990862582111002,"in":"#292c30ff","luma":0.02062934270429031,"roundtrip":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]}}, +{"chroma":0.82949986682183,"hcy":[0.9378844784763815,0.82949986682183,0.22564643266369816,1],"hue":0.9378844784763815,"in":"#e93a9aff","luma":0.22564643266369816,"roundtrip":{"hex":"#e93a9aff","u16":[59881,14906,39578,65535]}}, +{"chroma":0.7972492638033875,"hcy":[0.9885712750532858,0.7972492638033875,0.212019010254512,1],"hue":0.9885712750532858,"in":"#e93d58ff","luma":0.212019010254512,"roundtrip":{"hex":"#e93d58ff","u16":[59881,15677,22616,65535]}}, +{"chroma":0.8566115398359366,"hcy":[0.0189929760683667,0.8566115398359366,0.26831131861182883,1],"hue":0.0189929760683667,"in":"#e9643aff","luma":0.26831131861182883,"roundtrip":{"hex":"#e9643aff","u16":[59881,25700,14906,65535]}}, +{"chroma":0.9637535336934658,"hcy":[0.12305962155795816,0.9637535336934658,0.6073142671594791,1],"hue":0.12305962155795816,"in":"#e8cb2dff","luma":0.6073142671594791,"roundtrip":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"chroma":0.9705895301610493,"hcy":[0.3260007657713445,0.9705895301610493,0.4865791267509881,1],"hue":0.3260007657713445,"in":"#3dd425ff","luma":0.4865791267509881,"roundtrip":{"hex":"#3dd425ff","u16":[15677,54484,9509,65535]}}, +{"chroma":1,"hcy":[0.45665136060931066,1,0.5066936611948379,1],"hue":0.45665136060931066,"in":"#00d3b8ff","luma":0.5066936611948379,"roundtrip":{"hex":"#00d3b8ff","u16":[0,54227,47288,65535]}}, +{"chroma":0.6122838512136782,"hcy":[0.7611689580060336,0.6122838512136782,0.2847150365241454,1],"hue":0.7611689580060336,"in":"#b875dcff","luma":0.2847150365241454,"roundtrip":{"hex":"#b875dcff","u16":[47288,30069,56540,65535]}}, +{"chroma":0.7160920552505384,"hcy":[0.7029468871329987,0.7160920552505384,0.2312673381537172,1],"hue":0.7029468871329987,"in":"#926ee4ff","luma":0.2312673381537172,"roundtrip":{"hex":"#926ee4ff","u16":[37522,28270,58596,65535]}}, +{"chroma":0.05419426225979192,"hcy":[0.5968321943965229,0.05419426225979192,0.14698838493637675,1],"hue":0.5968321943965229,"in":"#686b6fff","luma":0.14698838493637675,"roundtrip":{"hex":"#686b6fff","u16":[26728,27499,28527,65535]}}, +{"chroma":0.8859261608923455,"hcy":[0.5833623180737052,0.8859261608923455,0.37683495841856884,0.501960813999176],"hue":0.5833623180737052,"in":"#3daee980","luma":0.37683495841856884,"roundtrip":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"chroma":0,"hcy":[0,0,1,0],"hue":0,"in":"#ffffff00","luma":1,"roundtrip":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":0,"hcy":[0,0,0,0.501960813999176],"hue":0,"in":"#00000080","luma":0,"roundtrip":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":1,"hcy":[0,1,0.2126,0.20000000298023224],"hue":0,"in":"#ff000033","luma":0.2126,"roundtrip":{"hex":"#ff000033","u16":[65535,0,0,13107]}} +], +"contrast_ratio": [ +{"a":"#000000ff","b":"#000000ff","out":1}, +{"a":"#000000ff","b":"#ffffffff","out":21}, +{"a":"#000000ff","b":"#010101ff","out":1.0001015410512244}, +{"a":"#000000ff","b":"#020202ff","out":1.0004665601540241}, +{"a":"#000000ff","b":"#040404ff","out":1.0021437475257389}, +{"a":"#000000ff","b":"#080808ff","out":1.0098500770253804}, +{"a":"#000000ff","b":"#101010ff","out":1.0452590691025938}, +{"a":"#000000ff","b":"#202020ff","out":1.2079560729073868}, +{"a":"#000000ff","b":"#404040ff","out":1.9555151954414352}, +{"a":"#000000ff","b":"#7f7f7fff","out":5.315287994415714}, +{"a":"#000000ff","b":"#808080ff","out":5.390394932712988}, +{"a":"#000000ff","b":"#818181ff","out":5.46620873885754}, +{"a":"#000000ff","b":"#bfbfbfff","out":11.590464913679135}, +{"a":"#000000ff","b":"#c0c0c0ff","out":11.712832647248353}, +{"a":"#000000ff","b":"#fdfdfdff","out":20.656525121451825}, +{"a":"#000000ff","b":"#fefefeff","out":20.82785688209514}, +{"a":"#000000ff","b":"#ff0000ff","out":5.252}, +{"a":"#000000ff","b":"#00ff00ff","out":15.303999999999998}, +{"a":"#000000ff","b":"#0000ffff","out":2.444}, +{"a":"#000000ff","b":"#ffff00ff","out":19.555999999999997}, +{"a":"#000000ff","b":"#00ffffff","out":16.748}, +{"a":"#000000ff","b":"#ff00ffff","out":6.696}, +{"a":"#000000ff","b":"#800000ff","out":1.9333979626947817}, +{"a":"#000000ff","b":"#008000ff","out":4.140010455876329}, +{"a":"#000000ff","b":"#000080ff","out":1.316986514141878}, +{"a":"#000000ff","b":"#ff8080ff","out":8.708996970018207}, +{"a":"#000000ff","b":"#80ff80ff","out":16.554384476836656}, +{"a":"#000000ff","b":"#8080ffff","out":6.517408418571111}, +{"a":"#000000ff","b":"#030201ff","out":1.0005830464442786}, +{"a":"#000000ff","b":"#fffefdff","out":20.852084355843264}, +{"a":"#000000ff","b":"#7f8081ff","out":5.379900954434625}, +{"a":"#000000ff","b":"#010000ff","out":1.0000215876274903}, +{"a":"#000000ff","b":"#000001ff","out":1.0000073312638984}, +{"a":"#000000ff","b":"#fefffeff","out":20.950973640020692}, +{"a":"#000000ff","b":"#3daee9ff","out":8.536699168371376}, +{"a":"#000000ff","b":"#232629ff","out":1.2968129809250752}, +{"a":"#000000ff","b":"#eff0f1ff","out":18.480339969564877}, +{"a":"#000000ff","b":"#fcfcfcff","out":20.48600407819632}, +{"a":"#000000ff","b":"#31363bff","out":1.6408258465413632}, +{"a":"#000000ff","b":"#1b1e20ff","out":1.1744810676944255}, +{"a":"#000000ff","b":"#da4453ff","out":4.914792659570478}, +{"a":"#000000ff","b":"#27ae60ff","out":7.406546092850427}, +{"a":"#000000ff","b":"#f67400ff","out":7.457399609962234}, +{"a":"#000000ff","b":"#2980b9ff","out":4.9290580060461595}, +{"a":"#000000ff","b":"#7f8c8dff","out":6.1338781618810705}, +{"a":"#000000ff","b":"#9b59b6ff","out":4.521365088706011}, +{"a":"#000000ff","b":"#1d99f3ff","out":6.98364286071076}, +{"a":"#000000ff","b":"#dee0e2ff","out":15.996880046174788}, +{"a":"#000000ff","b":"#292c30ff","out":1.412586854085806}, +{"a":"#000000ff","b":"#e93a9aff","out":5.5129286532739625}, +{"a":"#000000ff","b":"#e93d58ff","out":5.24038020509024}, +{"a":"#000000ff","b":"#e9643aff","out":6.366226372236576}, +{"a":"#000000ff","b":"#e8cb2dff","out":13.146285343189582}, +{"a":"#000000ff","b":"#3dd425ff","out":10.731582535019761}, +{"a":"#000000ff","b":"#00d3b8ff","out":11.133873223896758}, +{"a":"#000000ff","b":"#b875dcff","out":6.694300730482908}, +{"a":"#000000ff","b":"#926ee4ff","out":5.625346763074344}, +{"a":"#000000ff","b":"#686b6fff","out":3.939767698727535}, +{"a":"#000000ff","b":"#3daee980","out":8.536699168371376}, +{"a":"#000000ff","b":"#ffffff00","out":21}, +{"a":"#000000ff","b":"#00000080","out":1}, +{"a":"#000000ff","b":"#ff000033","out":5.252}, +{"a":"#ffffffff","b":"#000000ff","out":21}, +{"a":"#ffffffff","b":"#ffffffff","out":1}, +{"a":"#ffffffff","b":"#010101ff","out":20.99786785442459}, +{"a":"#ffffffff","b":"#020202ff","out":20.99020680587965}, +{"a":"#ffffffff","b":"#040404ff","out":20.95507760423426}, +{"a":"#ffffffff","b":"#080808ff","out":20.795166013016217}, +{"a":"#ffffffff","b":"#101010ff","out":20.090713030626492}, +{"a":"#ffffffff","b":"#202020ff","out":17.38473812996845}, +{"a":"#ffffffff","b":"#404040ff","out":10.738857999648268}, +{"a":"#ffffffff","b":"#7f7f7fff","out":3.950867765220394}, +{"a":"#ffffffff","b":"#808080ff","out":3.895818444128488}, +{"a":"#ffffffff","b":"#818181ff","out":3.8417852305415403}, +{"a":"#ffffffff","b":"#bfbfbfff","out":1.8118341374913856}, +{"a":"#ffffffff","b":"#c0c0c0ff","out":1.7929053229436724}, +{"a":"#ffffffff","b":"#fdfdfdff","out":1.0166279118355426}, +{"a":"#ffffffff","b":"#fefefeff","out":1.0082650422882848}, +{"a":"#ffffffff","b":"#ff0000ff","out":3.9984767707539985}, +{"a":"#ffffffff","b":"#00ff00ff","out":1.3721902770517513}, +{"a":"#ffffffff","b":"#0000ffff","out":8.592471358428805}, +{"a":"#ffffffff","b":"#ffff00ff","out":1.0738392309265699}, +{"a":"#ffffffff","b":"#00ffffff","out":1.2538810604251254}, +{"a":"#ffffffff","b":"#ff00ffff","out":3.1362007168458783}, +{"a":"#ffffffff","b":"#800000ff","out":10.86170586976831}, +{"a":"#ffffffff","b":"#008000ff","out":5.072450957265725}, +{"a":"#ffffffff","b":"#000080ff","out":15.945493575295401}, +{"a":"#ffffffff","b":"#ff8080ff","out":2.411299495486688}, +{"a":"#ffffffff","b":"#80ff80ff","out":1.2685461080950347}, +{"a":"#ffffffff","b":"#8080ffff","out":3.222139637614437}, +{"a":"#ffffffff","b":"#030201ff","out":20.987763159316597}, +{"a":"#ffffffff","b":"#fffefdff","out":1.0070935663616423}, +{"a":"#ffffffff","b":"#7f8081ff","out":3.903417586654603}, +{"a":"#ffffffff","b":"#010000ff","out":20.999546669609032}, +{"a":"#ffffffff","b":"#000001ff","out":20.99984604458682}, +{"a":"#ffffffff","b":"#fefffeff","out":1.0023400516282288}, +{"a":"#ffffffff","b":"#3daee9ff","out":2.459967205803079}, +{"a":"#ffffffff","b":"#232629ff","out":16.193545491054348}, +{"a":"#ffffffff","b":"#eff0f1ff","out":1.136342731496538}, +{"a":"#ffffffff","b":"#fcfcfcff","out":1.0250901015074352}, +{"a":"#ffffffff","b":"#31363bff","out":12.798433206220594}, +{"a":"#ffffffff","b":"#1b1e20ff","out":17.880237134195973}, +{"a":"#ffffffff","b":"#da4453ff","out":4.272815041160916}, +{"a":"#ffffffff","b":"#27ae60ff","out":2.8353296849487504}, +{"a":"#ffffffff","b":"#f67400ff","out":2.8159949980347574}, +{"a":"#ffffffff","b":"#2980b9ff","out":4.260448948712035}, +{"a":"#ffffffff","b":"#7f8c8dff","out":3.423608921759207}, +{"a":"#ffffffff","b":"#9b59b6ff","out":4.6446149753436705}, +{"a":"#ffffffff","b":"#1d99f3ff","out":3.007026621900125}, +{"a":"#ffffffff","b":"#dee0e2ff","out":1.3127559836282932}, +{"a":"#ffffffff","b":"#292c30ff","out":14.866342511442046}, +{"a":"#ffffffff","b":"#e93a9aff","out":3.809227603105063}, +{"a":"#ffffffff","b":"#e93d58ff","out":4.00734282211082}, +{"a":"#ffffffff","b":"#e9643aff","out":3.298657441963111}, +{"a":"#ffffffff","b":"#e8cb2dff","out":1.5974094165603232}, +{"a":"#ffffffff","b":"#3dd425ff","out":1.9568409348268905}, +{"a":"#ffffffff","b":"#00d3b8ff","out":1.8861360802032001}, +{"a":"#ffffffff","b":"#b875dcff","out":3.136996804516895}, +{"a":"#ffffffff","b":"#926ee4ff","out":3.733103199583586}, +{"a":"#ffffffff","b":"#686b6fff","out":5.330263509389798}, +{"a":"#ffffffff","b":"#3daee980","out":2.459967205803079}, +{"a":"#ffffffff","b":"#ffffff00","out":1}, +{"a":"#ffffffff","b":"#00000080","out":21}, +{"a":"#ffffffff","b":"#ff000033","out":3.9984767707539985}, +{"a":"#7f7f7fff","b":"#000000ff","out":5.315287994415714}, +{"a":"#7f7f7fff","b":"#ffffffff","out":3.950867765220394}, +{"a":"#7f7f7fff","b":"#010101ff","out":5.314748329283365}, +{"a":"#7f7f7fff","b":"#020202ff","out":5.3128092493140535}, +{"a":"#7f7f7fff","b":"#040404ff","out":5.30391773389695}, +{"a":"#7f7f7fff","b":"#080808ff","out":5.263442678612704}, +{"a":"#7f7f7fff","b":"#101010ff","out":5.0851393224257295}, +{"a":"#7f7f7fff","b":"#202020ff","out":4.40023285087059}, +{"a":"#7f7f7fff","b":"#404040ff","out":2.718101095203123}, +{"a":"#7f7f7fff","b":"#7f7f7fff","out":1}, +{"a":"#7f7f7fff","b":"#808080ff","out":1.0141303610220525}, +{"a":"#7f7f7fff","b":"#818181ff","out":1.0283937097294418}, +{"a":"#7f7f7fff","b":"#bfbfbfff","out":2.180590200541565}, +{"a":"#7f7f7fff","b":"#c0c0c0ff","out":2.203612045020694}, +{"a":"#7f7f7fff","b":"#fdfdfdff","out":3.8862475830385383}, +{"a":"#7f7f7fff","b":"#fefefeff","out":3.9184813511473062}, +{"a":"#7f7f7fff","b":"#ff0000ff","out":1.0120502655018495}, +{"a":"#7f7f7fff","b":"#00ff00ff","out":2.879241918044424}, +{"a":"#7f7f7fff","b":"#0000ffff","out":2.1748314216103575}, +{"a":"#7f7f7fff","b":"#ffff00ff","out":3.6791985722214293}, +{"a":"#7f7f7fff","b":"#00ffffff","out":3.1509111110433885}, +{"a":"#7f7f7fff","b":"#ff00ffff","out":1.2597624074245597}, +{"a":"#7f7f7fff","b":"#800000ff","out":2.7491949908787707}, +{"a":"#7f7f7fff","b":"#008000ff","out":1.2838827464484288}, +{"a":"#7f7f7fff","b":"#000080ff","out":4.035947169800026}, +{"a":"#7f7f7fff","b":"#ff8080ff","out":1.6384807331546198}, +{"a":"#7f7f7fff","b":"#80ff80ff","out":3.1144849525047062}, +{"a":"#7f7f7fff","b":"#8080ffff","out":1.2261628016051727}, +{"a":"#7f7f7fff","b":"#030201ff","out":5.312190740493139}, +{"a":"#7f7f7fff","b":"#fffefdff","out":3.9230394247217912}, +{"a":"#7f7f7fff","b":"#7f8081ff","out":1.0121560600454378}, +{"a":"#7f7f7fff","b":"#010000ff","out":5.3151732524354935}, +{"a":"#7f7f7fff","b":"#000001ff","out":5.3152490269224115}, +{"a":"#7f7f7fff","b":"#fefffeff","out":3.941644114492378}, +{"a":"#7f7f7fff","b":"#3daee9ff","out":1.6060652174143912}, +{"a":"#7f7f7fff","b":"#232629ff","out":4.098731330267899}, +{"a":"#7f7f7fff","b":"#eff0f1ff","out":3.476827594098472}, +{"a":"#7f7f7fff","b":"#fcfcfcff","out":3.8541663405104467}, +{"a":"#7f7f7fff","b":"#31363bff","out":3.2393980175407493}, +{"a":"#7f7f7fff","b":"#1b1e20ff","out":4.5256480846046605}, +{"a":"#7f7f7fff","b":"#da4453ff","out":1.0814877376495953}, +{"a":"#7f7f7fff","b":"#27ae60ff","out":1.3934421052315147}, +{"a":"#7f7f7fff","b":"#f67400ff","out":1.4030095110174727}, +{"a":"#7f7f7fff","b":"#2980b9ff","out":1.0783577689481014}, +{"a":"#7f7f7fff","b":"#7f8c8dff","out":1.1540067383602497}, +{"a":"#7f7f7fff","b":"#9b59b6ff","out":1.1755936293870308}, +{"a":"#7f7f7fff","b":"#1d99f3ff","out":1.3138785458187465}, +{"a":"#7f7f7fff","b":"#dee0e2ff","out":3.009597986596633}, +{"a":"#7f7f7fff","b":"#292c30ff","out":3.7628043748542788}, +{"a":"#7f7f7fff","b":"#e93a9aff","out":1.037183433722856}, +{"a":"#7f7f7fff","b":"#e93d58ff","out":1.0142943424701727}, +{"a":"#7f7f7fff","b":"#e9643aff","out":1.1977199314364504}, +{"a":"#7f7f7fff","b":"#e8cb2dff","out":2.473296904514145}, +{"a":"#7f7f7fff","b":"#3dd425ff","out":2.0190030241624632}, +{"a":"#7f7f7fff","b":"#00d3b8ff","out":2.0946886105878177}, +{"a":"#7f7f7fff","b":"#b875dcff","out":1.2594427127026788}, +{"a":"#7f7f7fff","b":"#926ee4ff","out":1.058333390210348}, +{"a":"#7f7f7fff","b":"#686b6fff","out":1.3491374113586554}, +{"a":"#7f7f7fff","b":"#3daee980","out":1.6060652174143912}, +{"a":"#7f7f7fff","b":"#ffffff00","out":3.950867765220394}, +{"a":"#7f7f7fff","b":"#00000080","out":5.315287994415714}, +{"a":"#7f7f7fff","b":"#ff000033","out":1.0120502655018495}, +{"a":"#808080ff","b":"#000000ff","out":5.390394932712988}, +{"a":"#808080ff","b":"#ffffffff","out":3.895818444128488}, +{"a":"#808080ff","b":"#010101ff","out":5.3898476419174886}, +{"a":"#808080ff","b":"#020202ff","out":5.38788116204816}, +{"a":"#808080ff","b":"#040404ff","out":5.37886400630818}, +{"a":"#808080ff","b":"#080808ff","out":5.33781702388038}, +{"a":"#808080ff","b":"#101010ff","out":5.15699417689904}, +{"a":"#808080ff","b":"#202020ff","out":4.462409729634486}, +{"a":"#808080ff","b":"#404040ff","out":2.756508844972779}, +{"a":"#808080ff","b":"#7f7f7fff","out":1.0141303610220525}, +{"a":"#808080ff","b":"#808080ff","out":1}, +{"a":"#808080ff","b":"#818181ff","out":1.0140646106808346}, +{"a":"#808080ff","b":"#bfbfbfff","out":2.1502069993683466}, +{"a":"#808080ff","b":"#c0c0c0ff","out":2.1729080695304974}, +{"a":"#808080ff","b":"#fdfdfdff","out":3.832098645702642}, +{"a":"#808080ff","b":"#fefefeff","out":3.8638832853778435}, +{"a":"#808080ff","b":"#ff0000ff","out":1.0263509011258547}, +{"a":"#808080ff","b":"#00ff00ff","out":2.839124069949637}, +{"a":"#808080ff","b":"#0000ffff","out":2.2055625747598153}, +{"a":"#808080ff","b":"#ffff00ff","out":3.627934547303653}, +{"a":"#808080ff","b":"#00ffffff","out":3.1070079667744723}, +{"a":"#808080ff","b":"#ff00ffff","out":1.2422095381849692}, +{"a":"#808080ff","b":"#800000ff","out":2.7880421086199054}, +{"a":"#808080ff","b":"#008000ff","out":1.3020244731657293}, +{"a":"#808080ff","b":"#000080ff","out":4.092976560375231}, +{"a":"#808080ff","b":"#ff8080ff","out":1.6156510012217167}, +{"a":"#808080ff","b":"#80ff80ff","out":3.0710893512406945}, +{"a":"#808080ff","b":"#8080ffff","out":1.2090780916660768}, +{"a":"#808080ff","b":"#030201ff","out":5.387253913474311}, +{"a":"#808080ff","b":"#fffefdff","out":3.8683778491436804}, +{"a":"#808080ff","b":"#7f8081ff","out":1.0019505894936063}, +{"a":"#808080ff","b":"#010000ff","out":5.3902785693871635}, +{"a":"#808080ff","b":"#000001ff","out":5.3903554145949375}, +{"a":"#808080ff","b":"#fefffeff","out":3.8867233109163037}, +{"a":"#808080ff","b":"#3daee9ff","out":1.5836871462913111}, +{"a":"#808080ff","b":"#232629ff","out":4.156647883696982}, +{"a":"#808080ff","b":"#eff0f1ff","out":3.428383300342655}, +{"a":"#808080ff","b":"#fcfcfcff","out":3.8004644063966024}, +{"a":"#808080ff","b":"#31363bff","out":3.2851718810227206}, +{"a":"#808080ff","b":"#1b1e20ff","out":4.589597125898884}, +{"a":"#808080ff","b":"#da4453ff","out":1.0967695498235066}, +{"a":"#808080ff","b":"#27ae60ff","out":1.374026613134023}, +{"a":"#808080ff","b":"#f67400ff","out":1.3834607117013078}, +{"a":"#808080ff","b":"#2980b9ff","out":1.0935953535342728}, +{"a":"#808080ff","b":"#7f8c8dff","out":1.1379274131949153}, +{"a":"#808080ff","b":"#9b59b6ff","out":1.1922051917854943}, +{"a":"#808080ff","b":"#1d99f3ff","out":1.295571650664915}, +{"a":"#808080ff","b":"#dee0e2ff","out":2.9676638253523198}, +{"a":"#808080ff","b":"#292c30ff","out":3.815974159126328}, +{"a":"#808080ff","b":"#e93a9aff","out":1.022731863266149}, +{"a":"#808080ff","b":"#e93d58ff","out":1.0286266877119015}, +{"a":"#808080ff","b":"#e9643aff","out":1.1810315295455451}, +{"a":"#808080ff","b":"#e8cb2dff","out":2.4388352815130467}, +{"a":"#808080ff","b":"#3dd425ff","out":1.9908712940293876}, +{"a":"#808080ff","b":"#00d3b8ff","out":2.0655023171545386}, +{"a":"#808080ff","b":"#b875dcff","out":1.2418942979218155}, +{"a":"#808080ff","b":"#926ee4ff","out":1.0435871273430246}, +{"a":"#808080ff","b":"#686b6fff","out":1.3682012100495102}, +{"a":"#808080ff","b":"#3daee980","out":1.5836871462913111}, +{"a":"#808080ff","b":"#ffffff00","out":3.895818444128488}, +{"a":"#808080ff","b":"#00000080","out":5.390394932712988}, +{"a":"#808080ff","b":"#ff000033","out":1.0263509011258547}, +{"a":"#ff0000ff","b":"#000000ff","out":5.252}, +{"a":"#ff0000ff","b":"#ffffffff","out":3.9984767707539985}, +{"a":"#ff0000ff","b":"#010101ff","out":5.251466760544664}, +{"a":"#ff0000ff","b":"#020202ff","out":5.249550768784759}, +{"a":"#ff0000ff","b":"#040404ff","out":5.240765122735158}, +{"a":"#ff0000ff","b":"#080808ff","out":5.200771995255294}, +{"a":"#ff0000ff","b":"#101010ff","out":5.024591658897634}, +{"a":"#ff0000ff","b":"#202020ff","out":4.347840221837824}, +{"a":"#ff0000ff","b":"#404040ff","out":2.6857372482929858}, +{"a":"#ff0000ff","b":"#7f7f7fff","out":1.0120502655018495}, +{"a":"#ff0000ff","b":"#808080ff","out":1.0263509011258547}, +{"a":"#ff0000ff","b":"#818181ff","out":1.0407861269721137}, +{"a":"#ff0000ff","b":"#bfbfbfff","out":2.2068668914088225}, +{"a":"#ff0000ff","b":"#c0c0c0ff","out":2.230166155226267}, +{"a":"#ff0000ff","b":"#fdfdfdff","out":3.933077898220074}, +{"a":"#ff0000ff","b":"#fefefeff","out":3.9657000917926775}, +{"a":"#ff0000ff","b":"#ff0000ff","out":1}, +{"a":"#ff0000ff","b":"#00ff00ff","out":2.9139375476009137}, +{"a":"#ff0000ff","b":"#0000ffff","out":2.148936170212766}, +{"a":"#ff0000ff","b":"#ffff00ff","out":3.7235338918507237}, +{"a":"#ff0000ff","b":"#00ffffff","out":3.188880426504189}, +{"a":"#ff0000ff","b":"#ff00ffff","out":1.2749428789032748}, +{"a":"#ff0000ff","b":"#800000ff","out":2.7164609156201505}, +{"a":"#ff0000ff","b":"#008000ff","out":1.26859582988379}, +{"a":"#ff0000ff","b":"#000080ff","out":3.9878920122595924}, +{"a":"#ff0000ff","b":"#ff8080ff","out":1.6582248610087982}, +{"a":"#ff0000ff","b":"#80ff80ff","out":3.152015323083903}, +{"a":"#ff0000ff","b":"#8080ffff","out":1.2409383889130068}, +{"a":"#ff0000ff","b":"#030201ff","out":5.24893962441575}, +{"a":"#ff0000ff","b":"#fffefdff","out":3.970313091363912}, +{"a":"#ff0000ff","b":"#7f8081ff","out":1.0243528092982912}, +{"a":"#ff0000ff","b":"#010000ff","out":5.251886624227934}, +{"a":"#ff0000ff","b":"#000001ff","out":5.2519614964842845}, +{"a":"#ff0000ff","b":"#fefffeff","out":3.9891419725858137}, +{"a":"#ff0000ff","b":"#3daee9ff","out":1.6254187296975202}, +{"a":"#ff0000ff","b":"#232629ff","out":4.049928615191306}, +{"a":"#ff0000ff","b":"#eff0f1ff","out":3.5187242897115154}, +{"a":"#ff0000ff","b":"#fcfcfcff","out":3.9006100682018894}, +{"a":"#ff0000ff","b":"#31363bff","out":3.2008271999557407}, +{"a":"#ff0000ff","b":"#1b1e20ff","out":4.4717621632760585}, +{"a":"#ff0000ff","b":"#da4453ff","out":1.0686106950560539}, +{"a":"#ff0000ff","b":"#27ae60ff","out":1.4102334525610107}, +{"a":"#ff0000ff","b":"#f67400ff","out":1.4199161481268534}, +{"a":"#ff0000ff","b":"#2980b9ff","out":1.0655179942207431}, +{"a":"#ff0000ff","b":"#7f8c8dff","out":1.1679128259484142}, +{"a":"#ff0000ff","b":"#9b59b6ff","out":1.1615960881192837}, +{"a":"#ff0000ff","b":"#1d99f3ff","out":1.3297111311330465}, +{"a":"#ff0000ff","b":"#dee0e2ff","out":3.045864441388954}, +{"a":"#ff0000ff","b":"#292c30ff","out":3.718001470004458}, +{"a":"#ff0000ff","b":"#e93a9aff","out":1.0496817694733365}, +{"a":"#ff0000ff","b":"#e93d58ff","out":1.0022173572250488}, +{"a":"#ff0000ff","b":"#e9643aff","out":1.2121527746071166}, +{"a":"#ff0000ff","b":"#e8cb2dff","out":2.503100788878443}, +{"a":"#ff0000ff","b":"#3dd425ff","out":2.043332546652658}, +{"a":"#ff0000ff","b":"#00d3b8ff","out":2.119930164489101}, +{"a":"#ff0000ff","b":"#b875dcff","out":1.2746193317751158}, +{"a":"#ff0000ff","b":"#926ee4ff","out":1.0710865885518552}, +{"a":"#ff0000ff","b":"#686b6fff","out":1.3330735214912008}, +{"a":"#ff0000ff","b":"#3daee980","out":1.6254187296975202}, +{"a":"#ff0000ff","b":"#ffffff00","out":3.9984767707539985}, +{"a":"#ff0000ff","b":"#00000080","out":5.252}, +{"a":"#ff0000ff","b":"#ff000033","out":1}, +{"a":"#00ff00ff","b":"#000000ff","out":15.303999999999998}, +{"a":"#00ff00ff","b":"#ffffffff","out":1.3721902770517513}, +{"a":"#00ff00ff","b":"#010101ff","out":15.302446173529235}, +{"a":"#00ff00ff","b":"#020202ff","out":15.296863093199152}, +{"a":"#00ff00ff","b":"#040404ff","out":15.271262269295288}, +{"a":"#00ff00ff","b":"#080808ff","out":15.154724793485723}, +{"a":"#00ff00ff","b":"#101010ff","out":14.641346296224182}, +{"a":"#00ff00ff","b":"#202020ff","out":12.669334873382722}, +{"a":"#00ff00ff","b":"#404040ff","out":7.826070610791289}, +{"a":"#00ff00ff","b":"#7f7f7fff","out":2.879241918044424}, +{"a":"#00ff00ff","b":"#808080ff","out":2.839124069949637}, +{"a":"#00ff00ff","b":"#818181ff","out":2.7997467222956063}, +{"a":"#00ff00ff","b":"#bfbfbfff","out":1.3203956971508648}, +{"a":"#00ff00ff","b":"#c0c0c0ff","out":1.3066010982061886}, +{"a":"#00ff00ff","b":"#fdfdfdff","out":1.3497468061586402}, +{"a":"#00ff00ff","b":"#fefefeff","out":1.3609420335922073}, +{"a":"#00ff00ff","b":"#ff0000ff","out":2.9139375476009137}, +{"a":"#00ff00ff","b":"#00ff00ff","out":1}, +{"a":"#00ff00ff","b":"#0000ffff","out":6.261865793780687}, +{"a":"#00ff00ff","b":"#ffff00ff","out":1.277835859905907}, +{"a":"#00ff00ff","b":"#00ffffff","out":1.0943544171458444}, +{"a":"#00ff00ff","b":"#ff00ffff","out":2.2855436081242533}, +{"a":"#00ff00ff","b":"#800000ff","out":7.915597458615914}, +{"a":"#00ff00ff","b":"#008000ff","out":3.6966090214283174}, +{"a":"#00ff00ff","b":"#000080ff","out":11.620468270300991}, +{"a":"#00ff00ff","b":"#ff8080ff","out":1.7572632132822987}, +{"a":"#00ff00ff","b":"#80ff80ff","out":1.0817031153186525}, +{"a":"#00ff00ff","b":"#8080ffff","out":2.3481726197167303}, +{"a":"#00ff00ff","b":"#030201ff","out":15.295082256675295}, +{"a":"#00ff00ff","b":"#fffefdff","out":1.3625251147310027}, +{"a":"#00ff00ff","b":"#7f8081ff","out":2.8446620355315257}, +{"a":"#00ff00ff","b":"#010000ff","out":15.30366963008079}, +{"a":"#00ff00ff","b":"#000001ff","out":15.303887803159842}, +{"a":"#00ff00ff","b":"#fefffeff","out":1.368986777314473}, +{"a":"#00ff00ff","b":"#3daee9ff","out":1.792730386552872}, +{"a":"#00ff00ff","b":"#232629ff","out":11.80123905690932}, +{"a":"#00ff00ff","b":"#eff0f1ff","out":1.2075496582308467}, +{"a":"#00ff00ff","b":"#fcfcfcff","out":1.3386045529401676}, +{"a":"#00ff00ff","b":"#31363bff","out":9.327010561333331}, +{"a":"#00ff00ff","b":"#1b1e20ff","out":13.030435671511196}, +{"a":"#00ff00ff","b":"#da4453ff","out":3.1138648280917454}, +{"a":"#00ff00ff","b":"#27ae60ff","out":2.0662802618312224}, +{"a":"#00ff00ff","b":"#f67400ff","out":2.052189878567806}, +{"a":"#00ff00ff","b":"#2980b9ff","out":3.1048528910042372}, +{"a":"#00ff00ff","b":"#7f8c8dff","out":2.4949957589810907}, +{"a":"#00ff00ff","b":"#9b59b6ff","out":3.3848184563171206}, +{"a":"#00ff00ff","b":"#1d99f3ff","out":2.1914064486456906}, +{"a":"#00ff00ff","b":"#dee0e2ff","out":1.0452744410725816}, +{"a":"#00ff00ff","b":"#292c30ff","out":10.834024085481383}, +{"a":"#00ff00ff","b":"#e93a9aff","out":2.7760199637104703}, +{"a":"#00ff00ff","b":"#e93d58ff","out":2.9203987880754276}, +{"a":"#00ff00ff","b":"#e9643aff","out":2.4039358805620687}, +{"a":"#00ff00ff","b":"#e8cb2dff","out":1.1641311290971041}, +{"a":"#00ff00ff","b":"#3dd425ff","out":1.4260711269805109}, +{"a":"#00ff00ff","b":"#00d3b8ff","out":1.374544122449037}, +{"a":"#00ff00ff","b":"#b875dcff","out":2.286123766491741}, +{"a":"#00ff00ff","b":"#926ee4ff","out":2.720543398401295}, +{"a":"#00ff00ff","b":"#686b6fff","out":3.884492987985784}, +{"a":"#00ff00ff","b":"#3daee980","out":1.792730386552872}, +{"a":"#00ff00ff","b":"#ffffff00","out":1.3721902770517513}, +{"a":"#00ff00ff","b":"#00000080","out":15.303999999999998}, +{"a":"#00ff00ff","b":"#ff000033","out":2.9139375476009137}, +{"a":"#0000ffff","b":"#000000ff","out":2.444}, +{"a":"#0000ffff","b":"#ffffffff","out":8.592471358428805}, +{"a":"#0000ffff","b":"#010101ff","out":2.443751858867319}, +{"a":"#0000ffff","b":"#020202ff","out":2.442860258741422}, +{"a":"#0000ffff","b":"#040404ff","out":2.438771888797549}, +{"a":"#0000ffff","b":"#080808ff","out":2.42016122551484}, +{"a":"#0000ffff","b":"#101010ff","out":2.338176316516721}, +{"a":"#0000ffff","b":"#202020ff","out":2.0232523804591853}, +{"a":"#0000ffff","b":"#404040ff","out":1.2497985214828746}, +{"a":"#0000ffff","b":"#7f7f7fff","out":2.1748314216103575}, +{"a":"#0000ffff","b":"#808080ff","out":2.2055625747598153}, +{"a":"#0000ffff","b":"#818181ff","out":2.2365829537060313}, +{"a":"#0000ffff","b":"#bfbfbfff","out":4.742416085793427}, +{"a":"#0000ffff","b":"#c0c0c0ff","out":4.792484716550063}, +{"a":"#0000ffff","b":"#fdfdfdff","out":8.45193335574952}, +{"a":"#0000ffff","b":"#fefefeff","out":8.52203636746937}, +{"a":"#0000ffff","b":"#ff0000ff","out":2.148936170212766}, +{"a":"#0000ffff","b":"#00ff00ff","out":6.261865793780687}, +{"a":"#0000ffff","b":"#0000ffff","out":1}, +{"a":"#0000ffff","b":"#ffff00ff","out":8.00163666121113}, +{"a":"#0000ffff","b":"#00ffffff","out":6.852700490998363}, +{"a":"#0000ffff","b":"#ff00ffff","out":2.7397708674304417}, +{"a":"#0000ffff","b":"#800000ff","out":1.2640956736054165}, +{"a":"#0000ffff","b":"#008000ff","out":1.6939486317006258}, +{"a":"#0000ffff","b":"#000080ff","out":1.8557517284772362}, +{"a":"#0000ffff","b":"#ff8080ff","out":3.563419382167843}, +{"a":"#0000ffff","b":"#80ff80ff","out":6.773479736839876}, +{"a":"#0000ffff","b":"#8080ffff","out":2.6666973889407166}, +{"a":"#0000ffff","b":"#030201ff","out":2.4425758648271314}, +{"a":"#0000ffff","b":"#fffefdff","out":8.531949409101172}, +{"a":"#0000ffff","b":"#7f8081ff","out":2.2012688029601577}, +{"a":"#0000ffff","b":"#010000ff","out":2.4439472409773555}, +{"a":"#0000ffff","b":"#000001ff","out":2.44398208252239}, +{"a":"#0000ffff","b":"#fefffeff","out":8.572411473003557}, +{"a":"#0000ffff","b":"#3daee9ff","out":3.4929210999882883}, +{"a":"#0000ffff","b":"#232629ff","out":1.884620246673182}, +{"a":"#0000ffff","b":"#eff0f1ff","out":7.5615138991672985}, +{"a":"#0000ffff","b":"#fcfcfcff","out":8.382162061455123}, +{"a":"#0000ffff","b":"#31363bff","out":1.4894938455239586}, +{"a":"#0000ffff","b":"#1b1e20ff","out":2.080919026474998}, +{"a":"#0000ffff","b":"#da4453ff","out":2.0109626266654983}, +{"a":"#0000ffff","b":"#27ae60ff","out":3.0305016746523843}, +{"a":"#0000ffff","b":"#f67400ff","out":3.0513091693789827}, +{"a":"#0000ffff","b":"#2980b9ff","out":2.0167995114755155}, +{"a":"#0000ffff","b":"#7f8c8dff","out":2.5097701153359537}, +{"a":"#0000ffff","b":"#9b59b6ff","out":1.8499857155098243}, +{"a":"#0000ffff","b":"#1d99f3ff","out":2.857464345626334}, +{"a":"#0000ffff","b":"#dee0e2ff","out":6.5453682676656255}, +{"a":"#0000ffff","b":"#292c30ff","out":1.7301590999030647}, +{"a":"#0000ffff","b":"#e93a9aff","out":2.255699121634191}, +{"a":"#0000ffff","b":"#e93d58ff","out":2.1441817533102454}, +{"a":"#0000ffff","b":"#e9643aff","out":2.604838941176995}, +{"a":"#0000ffff","b":"#e8cb2dff","out":5.379003822908994}, +{"a":"#0000ffff","b":"#3dd425ff","out":4.390991217274862}, +{"a":"#0000ffff","b":"#00d3b8ff","out":4.555594608795728}, +{"a":"#0000ffff","b":"#b875dcff","out":2.739075585303972}, +{"a":"#0000ffff","b":"#926ee4ff","out":2.3016967115688804}, +{"a":"#0000ffff","b":"#686b6fff","out":1.612016243341872}, +{"a":"#0000ffff","b":"#3daee980","out":3.4929210999882883}, +{"a":"#0000ffff","b":"#ffffff00","out":8.592471358428805}, +{"a":"#0000ffff","b":"#00000080","out":2.444}, +{"a":"#0000ffff","b":"#ff000033","out":2.148936170212766}, +{"a":"#ffff00ff","b":"#000000ff","out":19.555999999999997}, +{"a":"#ffff00ff","b":"#ffffffff","out":1.0738392309265699}, +{"a":"#ffff00ff","b":"#010101ff","out":19.554014464815584}, +{"a":"#ffff00ff","b":"#020202ff","out":19.54688020456107}, +{"a":"#ffff00ff","b":"#040404ff","out":19.514166553733578}, +{"a":"#ffff00ff","b":"#080808ff","out":19.365250788121198}, +{"a":"#ffff00ff","b":"#101010ff","out":18.709237334615793}, +{"a":"#ffff00ff","b":"#202020ff","out":16.189330422364907}, +{"a":"#ffff00ff","b":"#404040ff","out":10.000433668624833}, +{"a":"#ffff00ff","b":"#7f7f7fff","out":3.6791985722214293}, +{"a":"#ffff00ff","b":"#808080ff","out":3.627934547303653}, +{"a":"#ffff00ff","b":"#818181ff","out":3.5776167604033504}, +{"a":"#ffff00ff","b":"#bfbfbfff","out":1.6872489710848348}, +{"a":"#ffff00ff","b":"#c0c0c0ff","out":1.6696217378803075}, +{"a":"#ffff00ff","b":"#fdfdfdff","out":1.0562755738112}, +{"a":"#ffff00ff","b":"#fefefeff","out":1.0650366579103672}, +{"a":"#ffff00ff","b":"#ff0000ff","out":3.7235338918507237}, +{"a":"#ffff00ff","b":"#00ff00ff","out":1.277835859905907}, +{"a":"#ffff00ff","b":"#0000ffff","out":8.00163666121113}, +{"a":"#ffff00ff","b":"#ffff00ff","out":1}, +{"a":"#ffff00ff","b":"#00ffffff","out":1.1676618103654168}, +{"a":"#ffff00ff","b":"#ff00ffff","out":2.9205495818399045}, +{"a":"#ffff00ff","b":"#800000ff","out":10.114834285199478}, +{"a":"#ffff00ff","b":"#008000ff","out":4.723659567632787}, +{"a":"#ffff00ff","b":"#000080ff","out":14.849051064689373}, +{"a":"#ffff00ff","b":"#ff8080ff","out":2.2454939492256036}, +{"a":"#ffff00ff","b":"#80ff80ff","out":1.181318461424119}, +{"a":"#ffff00ff","b":"#8080ffff","out":3.0005791787232345}, +{"a":"#ffff00ff","b":"#030201ff","out":19.544604587790253}, +{"a":"#ffff00ff","b":"#fffefdff","out":1.066275534661652}, +{"a":"#ffff00ff","b":"#7f8081ff","out":3.635011158315115}, +{"a":"#ffff00ff","b":"#010000ff","out":19.5555778414702}, +{"a":"#ffff00ff","b":"#000001ff","out":19.55585663085428}, +{"a":"#ffff00ff","b":"#fefffeff","out":1.0713322581315552}, +{"a":"#ffff00ff","b":"#3daee9ff","out":2.290815175080238}, +{"a":"#ffff00ff","b":"#232629ff","out":15.080046458240895}, +{"a":"#ffff00ff","b":"#eff0f1ff","out":1.0582056408164902}, +{"a":"#ffff00ff","b":"#fcfcfcff","out":1.0475559459089958}, +{"a":"#ffff00ff","b":"#31363bff","out":11.918388560992854}, +{"a":"#ffff00ff","b":"#1b1e20ff","out":16.650757971254112}, +{"a":"#ffff00ff","b":"#da4453ff","out":3.9790081402353747}, +{"a":"#ffff00ff","b":"#27ae60ff","out":2.6403670151837026}, +{"a":"#ffff00ff","b":"#f67400ff","out":2.622361818169891}, +{"a":"#ffff00ff","b":"#2980b9ff","out":3.967492363857741}, +{"a":"#ffff00ff","b":"#7f8c8dff","out":3.1881950511391928}, +{"a":"#ffff00ff","b":"#9b59b6ff","out":4.325242402753372}, +{"a":"#ffff00ff","b":"#1d99f3ff","out":2.800257743708516}, +{"a":"#ffff00ff","b":"#dee0e2ff","out":1.2224883817064238}, +{"a":"#ffff00ff","b":"#292c30ff","out":13.84410448351241}, +{"a":"#ffff00ff","b":"#e93a9aff","out":3.5472978574439336}, +{"a":"#ffff00ff","b":"#e93d58ff","out":3.731790296628533}, +{"a":"#ffff00ff","b":"#e9643aff","out":3.071835473096695}, +{"a":"#ffff00ff","b":"#e8cb2dff","out":1.4875685023930323}, +{"a":"#ffff00ff","b":"#3dd425ff","out":1.822284824832127}, +{"a":"#ffff00ff","b":"#00d3b8ff","out":1.7564417706882753}, +{"a":"#ffff00ff","b":"#b875dcff","out":2.9212909290063047}, +{"a":"#ffff00ff","b":"#926ee4ff","out":3.476407912907457}, +{"a":"#ffff00ff","b":"#686b6fff","out":4.96374443760128}, +{"a":"#ffff00ff","b":"#3daee980","out":2.290815175080238}, +{"a":"#ffff00ff","b":"#ffffff00","out":1.0738392309265699}, +{"a":"#ffff00ff","b":"#00000080","out":19.555999999999997}, +{"a":"#ffff00ff","b":"#ff000033","out":3.7235338918507237}, +{"a":"#030201ff","b":"#000000ff","out":1.0005830464442786}, +{"a":"#030201ff","b":"#ffffffff","out":20.987763159316597}, +{"a":"#030201ff","b":"#010101ff","out":1.0004814565054547}, +{"a":"#030201ff","b":"#020202ff","out":1.0001164319677378}, +{"a":"#030201ff","b":"#040404ff","out":1.0015597916504846}, +{"a":"#030201ff","b":"#080808ff","out":1.0092616306203004}, +{"a":"#030201ff","b":"#101010ff","out":1.0446499896406183}, +{"a":"#030201ff","b":"#202020ff","out":1.2072521888113528}, +{"a":"#030201ff","b":"#404040ff","out":1.9543757036366451}, +{"a":"#030201ff","b":"#7f7f7fff","out":5.312190740493139}, +{"a":"#030201ff","b":"#808080ff","out":5.387253913474311}, +{"a":"#030201ff","b":"#818181ff","out":5.46302354240613}, +{"a":"#030201ff","b":"#bfbfbfff","out":11.58371107212698}, +{"a":"#030201ff","b":"#c0c0c0ff","out":11.706007501198082}, +{"a":"#030201ff","b":"#fdfdfdff","out":20.644488425881164}, +{"a":"#030201ff","b":"#fefefeff","out":20.815720350359765}, +{"a":"#030201ff","b":"#ff0000ff","out":5.24893962441575}, +{"a":"#030201ff","b":"#00ff00ff","out":15.295082256675295}, +{"a":"#030201ff","b":"#0000ffff","out":2.4425758648271314}, +{"a":"#030201ff","b":"#ffff00ff","out":19.544604587790253}, +{"a":"#030201ff","b":"#00ffffff","out":16.738240828201636}, +{"a":"#030201ff","b":"#ff00ffff","out":6.6920981959420915}, +{"a":"#030201ff","b":"#800000ff","out":1.9322713587496811}, +{"a":"#030201ff","b":"#008000ff","out":4.137598044048892}, +{"a":"#030201ff","b":"#000080ff","out":1.3162190972773187}, +{"a":"#030201ff","b":"#ff8080ff","out":8.703922179140381}, +{"a":"#030201ff","b":"#80ff80ff","out":16.544738126100714}, +{"a":"#030201ff","b":"#8080ffff","out":6.513610681024124}, +{"a":"#030201ff","b":"#030201ff","out":1}, +{"a":"#030201ff","b":"#fffefdff","out":20.83993370659663}, +{"a":"#030201ff","b":"#7f8081ff","out":5.376766050107392}, +{"a":"#030201ff","b":"#010000ff","out":1.0005614466964863}, +{"a":"#030201ff","b":"#000001ff","out":1.0005757109596913}, +{"a":"#030201ff","b":"#fefffeff","out":20.938765367325686}, +{"a":"#030201ff","b":"#3daee9ff","out":8.531724776576828}, +{"a":"#030201ff","b":"#232629ff","out":1.2960573193134681}, +{"a":"#030201ff","b":"#eff0f1ff","out":18.46957135166094}, +{"a":"#030201ff","b":"#fcfcfcff","out":20.474066746379922}, +{"a":"#030201ff","b":"#31363bff","out":1.6398697263283473}, +{"a":"#030201ff","b":"#1b1e20ff","out":1.173796689708185}, +{"a":"#030201ff","b":"#da4453ff","out":4.91192877696252}, +{"a":"#030201ff","b":"#27ae60ff","out":7.402230248824119}, +{"a":"#030201ff","b":"#f67400ff","out":7.453054133250825}, +{"a":"#030201ff","b":"#2980b9ff","out":4.926185810925244}, +{"a":"#030201ff","b":"#7f8c8dff","out":6.130303909984007}, +{"a":"#030201ff","b":"#9b59b6ff","out":4.518730458979249}, +{"a":"#030201ff","b":"#1d99f3ff","out":6.979573445230936}, +{"a":"#030201ff","b":"#dee0e2ff","out":15.987558557005428}, +{"a":"#030201ff","b":"#292c30ff","out":1.4117637302627148}, +{"a":"#030201ff","b":"#e93a9aff","out":5.509716232815435}, +{"a":"#030201ff","b":"#e93d58ff","out":5.237326600438329}, +{"a":"#030201ff","b":"#e9643aff","out":6.362516729480789}, +{"a":"#030201ff","b":"#e8cb2dff","out":13.138624914650384}, +{"a":"#030201ff","b":"#3dd425ff","out":10.725329169983484}, +{"a":"#030201ff","b":"#00d3b8ff","out":11.127385441381044}, +{"a":"#030201ff","b":"#b875dcff","out":6.6903999166007315}, +{"a":"#030201ff","b":"#926ee4ff","out":5.622068835830123}, +{"a":"#030201ff","b":"#686b6fff","out":3.937471969696157}, +{"a":"#030201ff","b":"#3daee980","out":8.531724776576828}, +{"a":"#030201ff","b":"#ffffff00","out":20.987763159316597}, +{"a":"#030201ff","b":"#00000080","out":1.0005830464442786}, +{"a":"#030201ff","b":"#ff000033","out":5.24893962441575}, +{"a":"#3daee9ff","b":"#000000ff","out":8.536699168371376}, +{"a":"#3daee9ff","b":"#ffffffff","out":2.459967205803079}, +{"a":"#3daee9ff","b":"#010101ff","out":8.53583243097326}, +{"a":"#3daee9ff","b":"#020202ff","out":8.532718142080762}, +{"a":"#3daee9ff","b":"#040404ff","out":8.51843778843925}, +{"a":"#3daee9ff","b":"#080808ff","out":8.453432209974299}, +{"a":"#3daee9ff","b":"#101010ff","out":8.16706539145415}, +{"a":"#3daee9ff","b":"#202020ff","out":7.067060930307421}, +{"a":"#3daee9ff","b":"#404040ff","out":4.365447626421698}, +{"a":"#3daee9ff","b":"#7f7f7fff","out":1.6060652174143912}, +{"a":"#3daee9ff","b":"#808080ff","out":1.5836871462913111}, +{"a":"#3daee9ff","b":"#818181ff","out":1.5617221325059716}, +{"a":"#3daee9ff","b":"#bfbfbfff","out":1.3577220756029467}, +{"a":"#3daee9ff","b":"#c0c0c0ff","out":1.3720563904424101}, +{"a":"#3daee9ff","b":"#fdfdfdff","out":2.4197321135532834}, +{"a":"#3daee9ff","b":"#fefefeff","out":2.43980213795781}, +{"a":"#3daee9ff","b":"#ff0000ff","out":1.6254187296975202}, +{"a":"#3daee9ff","b":"#00ff00ff","out":1.792730386552872}, +{"a":"#3daee9ff","b":"#0000ffff","out":3.4929210999882883}, +{"a":"#3daee9ff","b":"#ffff00ff","out":2.290815175080238}, +{"a":"#3daee9ff","b":"#00ffffff","out":1.9618824172757126}, +{"a":"#3daee9ff","b":"#ff00ffff","out":1.2748953357782822}, +{"a":"#3daee9ff","b":"#800000ff","out":4.415386450740268}, +{"a":"#3daee9ff","b":"#008000ff","out":2.0619994223092815}, +{"a":"#3daee9ff","b":"#000080ff","out":6.481994368737875}, +{"a":"#3daee9ff","b":"#ff8080ff","out":1.0201831876991985}, +{"a":"#3daee9ff","b":"#80ff80ff","out":1.939202044060654}, +{"a":"#3daee9ff","b":"#8080ffff","out":1.3098303221333147}, +{"a":"#3daee9ff","b":"#030201ff","out":8.531724776576828}, +{"a":"#3daee9ff","b":"#fffefdff","out":2.442640175619707}, +{"a":"#3daee9ff","b":"#7f8081ff","out":1.5867762698000263}, +{"a":"#3daee9ff","b":"#010000ff","out":8.536514885267968}, +{"a":"#3daee9ff","b":"#000001ff","out":8.536636584035774}, +{"a":"#3daee9ff","b":"#fefffeff","out":2.4542241944807457}, +{"a":"#3daee9ff","b":"#3daee9ff","out":1}, +{"a":"#3daee9ff","b":"#232629ff","out":6.582829825069891}, +{"a":"#3daee9ff","b":"#eff0f1ff","out":2.1648109655819745}, +{"a":"#3daee9ff","b":"#fcfcfcff","out":2.399757057633861}, +{"a":"#3daee9ff","b":"#31363bff","out":5.202684481333331}, +{"a":"#3daee9ff","b":"#1b1e20ff","out":7.268485974941607}, +{"a":"#3daee9ff","b":"#da4453ff","out":1.7369398384991952}, +{"a":"#3daee9ff","b":"#27ae60ff","out":1.1525884077886035}, +{"a":"#3daee9ff","b":"#f67400ff","out":1.1447286741838698}, +{"a":"#3daee9ff","b":"#2980b9ff","out":1.7319129046361301}, +{"a":"#3daee9ff","b":"#7f8c8dff","out":1.3917294969147926}, +{"a":"#3daee9ff","b":"#9b59b6ff","out":1.888080037972455}, +{"a":"#3daee9ff","b":"#1d99f3ff","out":1.2223848410688278}, +{"a":"#3daee9ff","b":"#dee0e2ff","out":1.8738952527978865}, +{"a":"#3daee9ff","b":"#292c30ff","out":6.04330922638816}, +{"a":"#3daee9ff","b":"#e93a9aff","out":1.5484871481697278}, +{"a":"#3daee9ff","b":"#e93d58ff","out":1.6290228636615447}, +{"a":"#3daee9ff","b":"#e9643aff","out":1.3409355353118353}, +{"a":"#3daee9ff","b":"#e8cb2dff","out":1.5399728963036212}, +{"a":"#3daee9ff","b":"#3dd425ff","out":1.2571114810722706}, +{"a":"#3daee9ff","b":"#00d3b8ff","out":1.3042363335407154}, +{"a":"#3daee9ff","b":"#b875dcff","out":1.2752189529668116}, +{"a":"#3daee9ff","b":"#926ee4ff","out":1.5175418561585583}, +{"a":"#3daee9ff","b":"#686b6fff","out":2.1668026698956275}, +{"a":"#3daee9ff","b":"#3daee980","out":1}, +{"a":"#3daee9ff","b":"#ffffff00","out":2.459967205803079}, +{"a":"#3daee9ff","b":"#00000080","out":8.536699168371376}, +{"a":"#3daee9ff","b":"#ff000033","out":1.6254187296975202}, +{"a":"#232629ff","b":"#000000ff","out":1.2968129809250752}, +{"a":"#232629ff","b":"#ffffffff","out":16.193545491054348}, +{"a":"#232629ff","b":"#010101ff","out":1.2966813145412937}, +{"a":"#232629ff","b":"#020202ff","out":1.2962082218174569}, +{"a":"#232629ff","b":"#040404ff","out":1.2940388882601577}, +{"a":"#232629ff","b":"#080808ff","out":1.2841638679129226}, +{"a":"#232629ff","b":"#101010ff","out":1.2406617835312854}, +{"a":"#232629ff","b":"#202020ff","out":1.073559717948867}, +{"a":"#232629ff","b":"#404040ff","out":1.507939251229948}, +{"a":"#232629ff","b":"#7f7f7fff","out":4.098731330267899}, +{"a":"#232629ff","b":"#808080ff","out":4.156647883696982}, +{"a":"#232629ff","b":"#818181ff","out":4.215109517918496}, +{"a":"#232629ff","b":"#bfbfbfff","out":8.937653373434875}, +{"a":"#232629ff","b":"#c0c0c0ff","out":9.032013728682035}, +{"a":"#232629ff","b":"#fdfdfdff","out":15.928684725777957}, +{"a":"#232629ff","b":"#fefefeff","out":16.060802281017953}, +{"a":"#232629ff","b":"#ff0000ff","out":4.049928615191306}, +{"a":"#232629ff","b":"#00ff00ff","out":11.80123905690932}, +{"a":"#232629ff","b":"#0000ffff","out":1.884620246673182}, +{"a":"#232629ff","b":"#ffff00ff","out":15.080046458240895}, +{"a":"#232629ff","b":"#00ffffff","out":12.914738089722771}, +{"a":"#232629ff","b":"#ff00ffff","out":5.163427648004757}, +{"a":"#232629ff","b":"#800000ff","out":1.4908841838671305}, +{"a":"#232629ff","b":"#008000ff","out":3.192449888127333}, +{"a":"#232629ff","b":"#000080ff","out":1.0155562394219804}, +{"a":"#232629ff","b":"#ff8080ff","out":6.715692315021158}, +{"a":"#232629ff","b":"#80ff80ff","out":12.765437052478969}, +{"a":"#232629ff","b":"#8080ffff","out":5.025711890948184}, +{"a":"#232629ff","b":"#030201ff","out":1.2960573193134681}, +{"a":"#232629ff","b":"#fffefdff","out":16.079484599983363}, +{"a":"#232629ff","b":"#7f8081ff","out":4.148555754428752}, +{"a":"#232629ff","b":"#010000ff","out":1.2967849864138534}, +{"a":"#232629ff","b":"#000001ff","out":1.296803473716585}, +{"a":"#232629ff","b":"#fefffeff","out":16.15574022483598}, +{"a":"#232629ff","b":"#3daee9ff","out":6.582829825069891}, +{"a":"#232629ff","b":"#232629ff","out":1}, +{"a":"#232629ff","b":"#eff0f1ff","out":14.25058218987137}, +{"a":"#232629ff","b":"#fcfcfcff","out":15.797192331914143}, +{"a":"#232629ff","b":"#31363bff","out":1.2652756185173966}, +{"a":"#232629ff","b":"#1b1e20ff","out":1.1041582675068524}, +{"a":"#232629ff","b":"#da4453ff","out":3.789900881516882}, +{"a":"#232629ff","b":"#27ae60ff","out":5.7113448136268685}, +{"a":"#232629ff","b":"#f67400ff","out":5.750559039471161}, +{"a":"#232629ff","b":"#2980b9ff","out":3.800901192807339}, +{"a":"#232629ff","b":"#7f8c8dff","out":4.729963573857426}, +{"a":"#232629ff","b":"#9b59b6ff","out":3.4865205355059885}, +{"a":"#232629ff","b":"#1d99f3ff","out":5.385235159914124}, +{"a":"#232629ff","b":"#dee0e2ff","out":12.33553355917481}, +{"a":"#232629ff","b":"#292c30ff","out":1.0892756896049451}, +{"a":"#232629ff","b":"#e93a9aff","out":4.25113623503471}, +{"a":"#232629ff","b":"#e93d58ff","out":4.040968344835691}, +{"a":"#232629ff","b":"#e9643aff","out":4.909132207864899}, +{"a":"#232629ff","b":"#e8cb2dff","out":10.137379511586738}, +{"a":"#232629ff","b":"#3dd425ff","out":8.275350951040325}, +{"a":"#232629ff","b":"#00d3b8ff","out":8.585565835371623}, +{"a":"#232629ff","b":"#b875dcff","out":5.162117305232063}, +{"a":"#232629ff","b":"#926ee4ff","out":4.337824224323795}, +{"a":"#232629ff","b":"#686b6fff","out":3.0380384501681355}, +{"a":"#232629ff","b":"#3daee980","out":6.582829825069891}, +{"a":"#232629ff","b":"#ffffff00","out":16.193545491054348}, +{"a":"#232629ff","b":"#00000080","out":1.2968129809250752}, +{"a":"#232629ff","b":"#ff000033","out":4.049928615191306}, +{"a":"#eff0f1ff","b":"#000000ff","out":18.480339969564877}, +{"a":"#eff0f1ff","b":"#ffffffff","out":1.136342731496538}, +{"a":"#eff0f1ff","b":"#010101ff","out":18.478463646941155}, +{"a":"#eff0f1ff","b":"#020202ff","out":18.471721800196686}, +{"a":"#eff0f1ff","b":"#040404ff","out":18.440807534041152}, +{"a":"#eff0f1ff","b":"#080808ff","out":18.300082744956224}, +{"a":"#eff0f1ff","b":"#101010ff","out":17.680152716044983}, +{"a":"#eff0f1ff","b":"#202020ff","out":15.298850996365454}, +{"a":"#eff0f1ff","b":"#404040ff","out":9.450368891351495}, +{"a":"#eff0f1ff","b":"#7f7f7fff","out":3.476827594098472}, +{"a":"#eff0f1ff","b":"#808080ff","out":3.428383300342655}, +{"a":"#eff0f1ff","b":"#818181ff","out":3.380833197640993}, +{"a":"#eff0f1ff","b":"#bfbfbfff","out":1.5944433728240075}, +{"a":"#eff0f1ff","b":"#c0c0c0ff","out":1.5777857095829322}, +{"a":"#eff0f1ff","b":"#fdfdfdff","out":1.1177567704636868}, +{"a":"#eff0f1ff","b":"#fefefeff","out":1.1270277990770932}, +{"a":"#eff0f1ff","b":"#ff0000ff","out":3.5187242897115154}, +{"a":"#eff0f1ff","b":"#00ff00ff","out":1.2075496582308467}, +{"a":"#eff0f1ff","b":"#0000ffff","out":7.5615138991672985}, +{"a":"#eff0f1ff","b":"#ffff00ff","out":1.0582056408164902}, +{"a":"#eff0f1ff","b":"#00ffffff","out":1.1034356322883256}, +{"a":"#eff0f1ff","b":"#ff00ffff","out":2.7599074028621384}, +{"a":"#eff0f1ff","b":"#800000ff","out":9.558477005844606}, +{"a":"#eff0f1ff","b":"#008000ff","out":4.463838960438829}, +{"a":"#eff0f1ff","b":"#000080ff","out":14.03229248828436}, +{"a":"#eff0f1ff","b":"#ff8080ff","out":2.1219825926206792}, +{"a":"#eff0f1ff","b":"#80ff80ff","out":1.116341111650697}, +{"a":"#eff0f1ff","b":"#8080ffff","out":2.83553504440597}, +{"a":"#eff0f1ff","b":"#030201ff","out":18.46957135166094}, +{"a":"#eff0f1ff","b":"#fffefdff","out":1.1283387854435791}, +{"a":"#eff0f1ff","b":"#7f8081ff","out":3.4350706687883585}, +{"a":"#eff0f1ff","b":"#010000ff","out":18.479941031481847}, +{"a":"#eff0f1ff","b":"#000001ff","out":18.480204486308892}, +{"a":"#eff0f1ff","b":"#fefffeff","out":1.13368983874348}, +{"a":"#eff0f1ff","b":"#3daee9ff","out":2.1648109655819745}, +{"a":"#eff0f1ff","b":"#232629ff","out":14.25058218987137}, +{"a":"#eff0f1ff","b":"#eff0f1ff","out":1}, +{"a":"#eff0f1ff","b":"#fcfcfcff","out":1.1085296110317535}, +{"a":"#eff0f1ff","b":"#31363bff","out":11.262828415653562}, +{"a":"#eff0f1ff","b":"#1b1e20ff","out":15.73489814173238}, +{"a":"#eff0f1ff","b":"#da4453ff","out":3.760146408939242}, +{"a":"#eff0f1ff","b":"#27ae60ff","out":2.495136023983437}, +{"a":"#eff0f1ff","b":"#f67400ff","out":2.4781211864893566}, +{"a":"#eff0f1ff","b":"#2980b9ff","out":3.749264047389223}, +{"a":"#eff0f1ff","b":"#7f8c8dff","out":3.012831276045028}, +{"a":"#eff0f1ff","b":"#9b59b6ff","out":4.087336370099201}, +{"a":"#eff0f1ff","b":"#1d99f3ff","out":2.6462321081069775}, +{"a":"#eff0f1ff","b":"#dee0e2ff","out":1.1552465178348288}, +{"a":"#eff0f1ff","b":"#292c30ff","out":13.082622081687807}, +{"a":"#eff0f1ff","b":"#e93a9aff","out":3.3521819584205863}, +{"a":"#eff0f1ff","b":"#e93d58ff","out":3.526526558438262}, +{"a":"#eff0f1ff","b":"#e9643aff","out":2.902871950981596}, +{"a":"#eff0f1ff","b":"#e8cb2dff","out":1.4057461470770978}, +{"a":"#eff0f1ff","b":"#3dd425ff","out":1.7220517019981945}, +{"a":"#eff0f1ff","b":"#00d3b8ff","out":1.6598302852865536}, +{"a":"#eff0f1ff","b":"#b875dcff","out":2.760607972900518}, +{"a":"#eff0f1ff","b":"#926ee4ff","out":3.2851912509416703}, +{"a":"#eff0f1ff","b":"#686b6fff","out":4.690718180042354}, +{"a":"#eff0f1ff","b":"#3daee980","out":2.1648109655819745}, +{"a":"#eff0f1ff","b":"#ffffff00","out":1.136342731496538}, +{"a":"#eff0f1ff","b":"#00000080","out":18.480339969564877}, +{"a":"#eff0f1ff","b":"#ff000033","out":3.5187242897115154}, +{"a":"#fcfcfcff","b":"#000000ff","out":20.48600407819632}, +{"a":"#fcfcfcff","b":"#ffffffff","out":1.0250901015074352}, +{"a":"#fcfcfcff","b":"#010101ff","out":20.483924119008076}, +{"a":"#fcfcfcff","b":"#020202ff","out":20.476450582258796}, +{"a":"#fcfcfcff","b":"#040404ff","out":20.442181202822066}, +{"a":"#fcfcfcff","b":"#080808ff","out":20.286183607115227}, +{"a":"#fcfcfcff","b":"#101010ff","out":19.598972813299348}, +{"a":"#fcfcfcff","b":"#202020ff","out":16.95922934423375}, +{"a":"#fcfcfcff","b":"#404040ff","out":10.476013751236458}, +{"a":"#fcfcfcff","b":"#7f7f7fff","out":3.8541663405104467}, +{"a":"#fcfcfcff","b":"#808080ff","out":3.8004644063966024}, +{"a":"#fcfcfcff","b":"#818181ff","out":3.747753709544209}, +{"a":"#fcfcfcff","b":"#bfbfbfff","out":1.767487691888754}, +{"a":"#fcfcfcff","b":"#c0c0c0ff","out":1.749022178935427}, +{"a":"#fcfcfcff","b":"#fdfdfdff","out":1.0083237825495208}, +{"a":"#fcfcfcff","b":"#fefefeff","out":1.0166871393071066}, +{"a":"#fcfcfcff","b":"#ff0000ff","out":3.9006100682018894}, +{"a":"#fcfcfcff","b":"#00ff00ff","out":1.3386045529401676}, +{"a":"#fcfcfcff","b":"#0000ffff","out":8.382162061455123}, +{"a":"#fcfcfcff","b":"#ffff00ff","out":1.0475559459089958}, +{"a":"#fcfcfcff","b":"#00ffffff","out":1.2231910722591546}, +{"a":"#fcfcfcff","b":"#ff00ffff","out":3.0594390797784237}, +{"a":"#fcfcfcff","b":"#800000ff","out":10.595854797344881}, +{"a":"#fcfcfcff","b":"#008000ff","out":4.948297666523643}, +{"a":"#fcfcfcff","b":"#000080ff","out":15.55521173392166}, +{"a":"#fcfcfcff","b":"#ff8080ff","out":2.3522805380139538}, +{"a":"#fcfcfcff","b":"#80ff80ff","out":1.2374971782769026}, +{"a":"#fcfcfcff","b":"#8080ffff","out":3.143274559842256}, +{"a":"#fcfcfcff","b":"#030201ff","out":20.474066746379922}, +{"a":"#fcfcfcff","b":"#fffefdff","out":1.0178697747129988}, +{"a":"#fcfcfcff","b":"#7f8081ff","out":3.8078775523385446}, +{"a":"#fcfcfcff","b":"#010000ff","out":20.485561843518315}, +{"a":"#fcfcfcff","b":"#000001ff","out":20.485853890995262}, +{"a":"#fcfcfcff","b":"#fefffeff","out":1.0226969378727815}, +{"a":"#fcfcfcff","b":"#3daee9ff","out":2.399757057633861}, +{"a":"#fcfcfcff","b":"#232629ff","out":15.797192331914143}, +{"a":"#fcfcfcff","b":"#eff0f1ff","out":1.1085296110317535}, +{"a":"#fcfcfcff","b":"#fcfcfcff","out":1}, +{"a":"#fcfcfcff","b":"#31363bff","out":12.485178802721824}, +{"a":"#fcfcfcff","b":"#1b1e20ff","out":17.442600516678855}, +{"a":"#fcfcfcff","b":"#da4453ff","out":4.168233636123863}, +{"a":"#fcfcfcff","b":"#27ae60ff","out":2.765932166137676}, +{"a":"#fcfcfcff","b":"#f67400ff","out":2.7470707149485944}, +{"a":"#fcfcfcff","b":"#2980b9ff","out":4.156170216107713}, +{"a":"#fcfcfcff","b":"#7f8c8dff","out":3.3398126825384966}, +{"a":"#fcfcfcff","b":"#9b59b6ff","out":4.530933396502006}, +{"a":"#fcfcfcff","b":"#1d99f3ff","out":2.933426649499565}, +{"a":"#fcfcfcff","b":"#dee0e2ff","out":1.2806249730612305}, +{"a":"#fcfcfcff","b":"#292c30ff","out":14.502473967488815}, +{"a":"#fcfcfcff","b":"#e93a9aff","out":3.7159929624756343}, +{"a":"#fcfcfcff","b":"#e93d58ff","out":3.909259114118715}, +{"a":"#fcfcfcff","b":"#e9643aff","out":3.217919514696616}, +{"a":"#fcfcfcff","b":"#e8cb2dff","out":1.5583112296287613}, +{"a":"#fcfcfcff","b":"#3dd425ff","out":1.9089453033926276}, +{"a":"#fcfcfcff","b":"#00d3b8ff","out":1.8399710205274278}, +{"a":"#fcfcfcff","b":"#b875dcff","out":3.060215682410569}, +{"a":"#fcfcfcff","b":"#926ee4ff","out":3.6417317795712894}, +{"a":"#fcfcfcff","b":"#686b6fff","out":5.199799999581925}, +{"a":"#fcfcfcff","b":"#3daee980","out":2.399757057633861}, +{"a":"#fcfcfcff","b":"#ffffff00","out":1.0250901015074352}, +{"a":"#fcfcfcff","b":"#00000080","out":20.48600407819632}, +{"a":"#fcfcfcff","b":"#ff000033","out":3.9006100682018894}, +{"a":"#da4453ff","b":"#000000ff","out":4.914792659570478}, +{"a":"#da4453ff","b":"#ffffffff","out":4.272815041160916}, +{"a":"#da4453ff","b":"#010101ff","out":4.914293657026518}, +{"a":"#da4453ff","b":"#020202ff","out":4.912500682495409}, +{"a":"#da4453ff","b":"#040404ff","out":4.904279123334297}, +{"a":"#da4453ff","b":"#080808ff","out":4.866853775015314}, +{"a":"#da4453ff","b":"#101010ff","out":4.701985187069526}, +{"a":"#da4453ff","b":"#202020ff","out":4.068684921415426}, +{"a":"#da4453ff","b":"#404040ff","out":2.5132981175638576}, +{"a":"#da4453ff","b":"#7f7f7fff","out":1.0814877376495953}, +{"a":"#da4453ff","b":"#808080ff","out":1.0967695498235066}, +{"a":"#da4453ff","b":"#818181ff","out":1.1121951865483686}, +{"a":"#da4453ff","b":"#bfbfbfff","out":2.3582815627245743}, +{"a":"#da4453ff","b":"#c0c0c0ff","out":2.3831794052268283}, +{"a":"#da4453ff","b":"#fdfdfdff","out":4.202929106526557}, +{"a":"#da4453ff","b":"#fefefeff","out":4.237789531474429}, +{"a":"#da4453ff","b":"#ff0000ff","out":1.0686106950560539}, +{"a":"#da4453ff","b":"#00ff00ff","out":3.1138648280917454}, +{"a":"#da4453ff","b":"#0000ffff","out":2.0109626266654983}, +{"a":"#da4453ff","b":"#ffff00ff","out":3.9790081402353747}, +{"a":"#da4453ff","b":"#00ffffff","out":3.4076717290172867}, +{"a":"#da4453ff","b":"#ff00ffff","out":1.3624175959815947}, +{"a":"#da4453ff","b":"#800000ff","out":2.542049156150041}, +{"a":"#da4453ff","b":"#008000ff","out":1.187144987180992}, +{"a":"#da4453ff","b":"#000080ff","out":3.7318473703376216}, +{"a":"#da4453ff","b":"#ff8080ff","out":1.77199682128184}, +{"a":"#da4453ff","b":"#80ff80ff","out":3.3682772852280216}, +{"a":"#da4453ff","b":"#8080ffff","out":1.3260800342980676}, +{"a":"#da4453ff","b":"#030201ff","out":4.91192877696252}, +{"a":"#da4453ff","b":"#fffefdff","out":4.242719032152539}, +{"a":"#da4453ff","b":"#7f8081ff","out":1.0946343675268684}, +{"a":"#da4453ff","b":"#010000ff","out":4.914686563147721}, +{"a":"#da4453ff","b":"#000001ff","out":4.91475662819264}, +{"a":"#da4453ff","b":"#fefffeff","out":4.262839776002204}, +{"a":"#da4453ff","b":"#3daee9ff","out":1.7369398384991952}, +{"a":"#da4453ff","b":"#232629ff","out":3.789900881516882}, +{"a":"#da4453ff","b":"#eff0f1ff","out":3.760146408939242}, +{"a":"#da4453ff","b":"#fcfcfcff","out":4.168233636123863}, +{"a":"#da4453ff","b":"#31363bff","out":2.995316455996954}, +{"a":"#da4453ff","b":"#1b1e20ff","out":4.184650391358374}, +{"a":"#da4453ff","b":"#da4453ff","out":1}, +{"a":"#da4453ff","b":"#27ae60ff","out":1.50699054993252}, +{"a":"#da4453ff","b":"#f67400ff","out":1.5173375819711514}, +{"a":"#da4453ff","b":"#2980b9ff","out":1.002902532713746}, +{"a":"#da4453ff","b":"#7f8c8dff","out":1.2480441367016148}, +{"a":"#da4453ff","b":"#9b59b6ff","out":1.087015218445247}, +{"a":"#da4453ff","b":"#1d99f3ff","out":1.4209435360638563}, +{"a":"#da4453ff","b":"#dee0e2ff","out":3.25484331775917}, +{"a":"#da4453ff","b":"#292c30ff","out":3.4792852880902814}, +{"a":"#da4453ff","b":"#e93a9aff","out":1.1217011652645705}, +{"a":"#da4453ff","b":"#e93d58ff","out":1.0662464457957859}, +{"a":"#da4453ff","b":"#e9643aff","out":1.295319418987035}, +{"a":"#da4453ff","b":"#e8cb2dff","out":2.6748402737987496}, +{"a":"#da4453ff","b":"#3dd425ff","out":2.1835270129091535}, +{"a":"#da4453ff","b":"#00d3b8ff","out":2.265380046544993}, +{"a":"#da4453ff","b":"#b875dcff","out":1.3620718500600895}, +{"a":"#da4453ff","b":"#926ee4ff","out":1.1445745838576156}, +{"a":"#da4453ff","b":"#686b6fff","out":1.2474828556916835}, +{"a":"#da4453ff","b":"#3daee980","out":1.7369398384991952}, +{"a":"#da4453ff","b":"#ffffff00","out":4.272815041160916}, +{"a":"#da4453ff","b":"#00000080","out":4.914792659570478}, +{"a":"#da4453ff","b":"#ff000033","out":1.0686106950560539}, +{"a":"#e8cb2dff","b":"#000000ff","out":13.146285343189582}, +{"a":"#e8cb2dff","b":"#ffffffff","out":1.5974094165603232}, +{"a":"#e8cb2dff","b":"#010101ff","out":13.144950591088271}, +{"a":"#e8cb2dff","b":"#020202ff","out":13.140154670602566}, +{"a":"#e8cb2dff","b":"#040404ff","out":13.118163313045004}, +{"a":"#e8cb2dff","b":"#080808ff","out":13.018056484100441}, +{"a":"#e8cb2dff","b":"#101010ff","out":12.577059345178714}, +{"a":"#e8cb2dff","b":"#202020ff","out":10.883082289199683}, +{"a":"#e8cb2dff","b":"#404040ff","out":6.722671024922391}, +{"a":"#e8cb2dff","b":"#7f7f7fff","out":2.473296904514145}, +{"a":"#e8cb2dff","b":"#808080ff","out":2.4388352815130467}, +{"a":"#e8cb2dff","b":"#818181ff","out":2.405009755616689}, +{"a":"#e8cb2dff","b":"#bfbfbfff","out":1.1342327888568353}, +{"a":"#e8cb2dff","b":"#c0c0c0ff","out":1.1223830937495707}, +{"a":"#e8cb2dff","b":"#fdfdfdff","out":1.5712822734486678}, +{"a":"#e8cb2dff","b":"#fefefeff","out":1.5843149862014054}, +{"a":"#e8cb2dff","b":"#ff0000ff","out":2.503100788878443}, +{"a":"#e8cb2dff","b":"#00ff00ff","out":1.1641311290971041}, +{"a":"#e8cb2dff","b":"#0000ffff","out":5.379003822908994}, +{"a":"#e8cb2dff","b":"#ffff00ff","out":1.4875685023930323}, +{"a":"#e8cb2dff","b":"#00ffffff","out":1.2739720432643948}, +{"a":"#e8cb2dff","b":"#ff00ffff","out":1.9633042627224588}, +{"a":"#e8cb2dff","b":"#800000ff","out":6.799575460846256}, +{"a":"#e8cb2dff","b":"#008000ff","out":3.175423222550018}, +{"a":"#e8cb2dff","b":"#000080ff","out":9.982095641849028}, +{"a":"#e8cb2dff","b":"#ff8080ff","out":1.5095062483598611}, +{"a":"#e8cb2dff","b":"#80ff80ff","out":1.259244268983758}, +{"a":"#e8cb2dff","b":"#8080ffff","out":2.017103194841946}, +{"a":"#e8cb2dff","b":"#030201ff","out":13.138624914650384}, +{"a":"#e8cb2dff","b":"#fffefdff","out":1.5861579002349635}, +{"a":"#e8cb2dff","b":"#7f8081ff","out":2.443592447989803}, +{"a":"#e8cb2dff","b":"#010000ff","out":13.146001552205087}, +{"a":"#e8cb2dff","b":"#000001ff","out":13.14618896500902}, +{"a":"#e8cb2dff","b":"#fefffeff","out":1.593680122794103}, +{"a":"#e8cb2dff","b":"#3daee9ff","out":1.5399728963036212}, +{"a":"#e8cb2dff","b":"#232629ff","out":10.137379511586738}, +{"a":"#e8cb2dff","b":"#eff0f1ff","out":1.4057461470770978}, +{"a":"#e8cb2dff","b":"#fcfcfcff","out":1.5583112296287613}, +{"a":"#e8cb2dff","b":"#31363bff","out":8.011993089272792}, +{"a":"#e8cb2dff","b":"#1b1e20ff","out":11.193271398573076}, +{"a":"#e8cb2dff","b":"#da4453ff","out":2.6748402737987496}, +{"a":"#e8cb2dff","b":"#27ae60ff","out":1.7749549085881948}, +{"a":"#e8cb2dff","b":"#f67400ff","out":1.7628511318647384}, +{"a":"#e8cb2dff","b":"#2980b9ff","out":2.667098931898119}, +{"a":"#e8cb2dff","b":"#7f8c8dff","out":2.143225704235055}, +{"a":"#e8cb2dff","b":"#9b59b6ff","out":2.9075920845294925}, +{"a":"#e8cb2dff","b":"#1d99f3ff","out":1.8824395240984044}, +{"a":"#e8cb2dff","b":"#dee0e2ff","out":1.2168365153021687}, +{"a":"#e8cb2dff","b":"#292c30ff","out":9.30653241261937}, +{"a":"#e8cb2dff","b":"#e93a9aff","out":2.3846282384558704}, +{"a":"#e8cb2dff","b":"#e93d58ff","out":2.508651057497688}, +{"a":"#e8cb2dff","b":"#e9643aff","out":2.0650043800706137}, +{"a":"#e8cb2dff","b":"#e8cb2dff","out":1}, +{"a":"#e8cb2dff","b":"#3dd425ff","out":1.2250090143080072}, +{"a":"#e8cb2dff","b":"#00d3b8ff","out":1.1807468145922086}, +{"a":"#e8cb2dff","b":"#b875dcff","out":1.9638026244215723}, +{"a":"#e8cb2dff","b":"#926ee4ff","out":2.336973327490468}, +{"a":"#e8cb2dff","b":"#686b6fff","out":3.336817383277589}, +{"a":"#e8cb2dff","b":"#3daee980","out":1.5399728963036212}, +{"a":"#e8cb2dff","b":"#ffffff00","out":1.5974094165603232}, +{"a":"#e8cb2dff","b":"#00000080","out":13.146285343189582}, +{"a":"#e8cb2dff","b":"#ff000033","out":2.503100788878443}, +{"a":"#3daee980","b":"#000000ff","out":8.536699168371376}, +{"a":"#3daee980","b":"#ffffffff","out":2.459967205803079}, +{"a":"#3daee980","b":"#010101ff","out":8.53583243097326}, +{"a":"#3daee980","b":"#020202ff","out":8.532718142080762}, +{"a":"#3daee980","b":"#040404ff","out":8.51843778843925}, +{"a":"#3daee980","b":"#080808ff","out":8.453432209974299}, +{"a":"#3daee980","b":"#101010ff","out":8.16706539145415}, +{"a":"#3daee980","b":"#202020ff","out":7.067060930307421}, +{"a":"#3daee980","b":"#404040ff","out":4.365447626421698}, +{"a":"#3daee980","b":"#7f7f7fff","out":1.6060652174143912}, +{"a":"#3daee980","b":"#808080ff","out":1.5836871462913111}, +{"a":"#3daee980","b":"#818181ff","out":1.5617221325059716}, +{"a":"#3daee980","b":"#bfbfbfff","out":1.3577220756029467}, +{"a":"#3daee980","b":"#c0c0c0ff","out":1.3720563904424101}, +{"a":"#3daee980","b":"#fdfdfdff","out":2.4197321135532834}, +{"a":"#3daee980","b":"#fefefeff","out":2.43980213795781}, +{"a":"#3daee980","b":"#ff0000ff","out":1.6254187296975202}, +{"a":"#3daee980","b":"#00ff00ff","out":1.792730386552872}, +{"a":"#3daee980","b":"#0000ffff","out":3.4929210999882883}, +{"a":"#3daee980","b":"#ffff00ff","out":2.290815175080238}, +{"a":"#3daee980","b":"#00ffffff","out":1.9618824172757126}, +{"a":"#3daee980","b":"#ff00ffff","out":1.2748953357782822}, +{"a":"#3daee980","b":"#800000ff","out":4.415386450740268}, +{"a":"#3daee980","b":"#008000ff","out":2.0619994223092815}, +{"a":"#3daee980","b":"#000080ff","out":6.481994368737875}, +{"a":"#3daee980","b":"#ff8080ff","out":1.0201831876991985}, +{"a":"#3daee980","b":"#80ff80ff","out":1.939202044060654}, +{"a":"#3daee980","b":"#8080ffff","out":1.3098303221333147}, +{"a":"#3daee980","b":"#030201ff","out":8.531724776576828}, +{"a":"#3daee980","b":"#fffefdff","out":2.442640175619707}, +{"a":"#3daee980","b":"#7f8081ff","out":1.5867762698000263}, +{"a":"#3daee980","b":"#010000ff","out":8.536514885267968}, +{"a":"#3daee980","b":"#000001ff","out":8.536636584035774}, +{"a":"#3daee980","b":"#fefffeff","out":2.4542241944807457}, +{"a":"#3daee980","b":"#3daee9ff","out":1}, +{"a":"#3daee980","b":"#232629ff","out":6.582829825069891}, +{"a":"#3daee980","b":"#eff0f1ff","out":2.1648109655819745}, +{"a":"#3daee980","b":"#fcfcfcff","out":2.399757057633861}, +{"a":"#3daee980","b":"#31363bff","out":5.202684481333331}, +{"a":"#3daee980","b":"#1b1e20ff","out":7.268485974941607}, +{"a":"#3daee980","b":"#da4453ff","out":1.7369398384991952}, +{"a":"#3daee980","b":"#27ae60ff","out":1.1525884077886035}, +{"a":"#3daee980","b":"#f67400ff","out":1.1447286741838698}, +{"a":"#3daee980","b":"#2980b9ff","out":1.7319129046361301}, +{"a":"#3daee980","b":"#7f8c8dff","out":1.3917294969147926}, +{"a":"#3daee980","b":"#9b59b6ff","out":1.888080037972455}, +{"a":"#3daee980","b":"#1d99f3ff","out":1.2223848410688278}, +{"a":"#3daee980","b":"#dee0e2ff","out":1.8738952527978865}, +{"a":"#3daee980","b":"#292c30ff","out":6.04330922638816}, +{"a":"#3daee980","b":"#e93a9aff","out":1.5484871481697278}, +{"a":"#3daee980","b":"#e93d58ff","out":1.6290228636615447}, +{"a":"#3daee980","b":"#e9643aff","out":1.3409355353118353}, +{"a":"#3daee980","b":"#e8cb2dff","out":1.5399728963036212}, +{"a":"#3daee980","b":"#3dd425ff","out":1.2571114810722706}, +{"a":"#3daee980","b":"#00d3b8ff","out":1.3042363335407154}, +{"a":"#3daee980","b":"#b875dcff","out":1.2752189529668116}, +{"a":"#3daee980","b":"#926ee4ff","out":1.5175418561585583}, +{"a":"#3daee980","b":"#686b6fff","out":2.1668026698956275}, +{"a":"#3daee980","b":"#3daee980","out":1}, +{"a":"#3daee980","b":"#ffffff00","out":2.459967205803079}, +{"a":"#3daee980","b":"#00000080","out":8.536699168371376}, +{"a":"#3daee980","b":"#ff000033","out":1.6254187296975202}, +{"a":"#ffffff00","b":"#000000ff","out":21}, +{"a":"#ffffff00","b":"#ffffffff","out":1}, +{"a":"#ffffff00","b":"#010101ff","out":20.99786785442459}, +{"a":"#ffffff00","b":"#020202ff","out":20.99020680587965}, +{"a":"#ffffff00","b":"#040404ff","out":20.95507760423426}, +{"a":"#ffffff00","b":"#080808ff","out":20.795166013016217}, +{"a":"#ffffff00","b":"#101010ff","out":20.090713030626492}, +{"a":"#ffffff00","b":"#202020ff","out":17.38473812996845}, +{"a":"#ffffff00","b":"#404040ff","out":10.738857999648268}, +{"a":"#ffffff00","b":"#7f7f7fff","out":3.950867765220394}, +{"a":"#ffffff00","b":"#808080ff","out":3.895818444128488}, +{"a":"#ffffff00","b":"#818181ff","out":3.8417852305415403}, +{"a":"#ffffff00","b":"#bfbfbfff","out":1.8118341374913856}, +{"a":"#ffffff00","b":"#c0c0c0ff","out":1.7929053229436724}, +{"a":"#ffffff00","b":"#fdfdfdff","out":1.0166279118355426}, +{"a":"#ffffff00","b":"#fefefeff","out":1.0082650422882848}, +{"a":"#ffffff00","b":"#ff0000ff","out":3.9984767707539985}, +{"a":"#ffffff00","b":"#00ff00ff","out":1.3721902770517513}, +{"a":"#ffffff00","b":"#0000ffff","out":8.592471358428805}, +{"a":"#ffffff00","b":"#ffff00ff","out":1.0738392309265699}, +{"a":"#ffffff00","b":"#00ffffff","out":1.2538810604251254}, +{"a":"#ffffff00","b":"#ff00ffff","out":3.1362007168458783}, +{"a":"#ffffff00","b":"#800000ff","out":10.86170586976831}, +{"a":"#ffffff00","b":"#008000ff","out":5.072450957265725}, +{"a":"#ffffff00","b":"#000080ff","out":15.945493575295401}, +{"a":"#ffffff00","b":"#ff8080ff","out":2.411299495486688}, +{"a":"#ffffff00","b":"#80ff80ff","out":1.2685461080950347}, +{"a":"#ffffff00","b":"#8080ffff","out":3.222139637614437}, +{"a":"#ffffff00","b":"#030201ff","out":20.987763159316597}, +{"a":"#ffffff00","b":"#fffefdff","out":1.0070935663616423}, +{"a":"#ffffff00","b":"#7f8081ff","out":3.903417586654603}, +{"a":"#ffffff00","b":"#010000ff","out":20.999546669609032}, +{"a":"#ffffff00","b":"#000001ff","out":20.99984604458682}, +{"a":"#ffffff00","b":"#fefffeff","out":1.0023400516282288}, +{"a":"#ffffff00","b":"#3daee9ff","out":2.459967205803079}, +{"a":"#ffffff00","b":"#232629ff","out":16.193545491054348}, +{"a":"#ffffff00","b":"#eff0f1ff","out":1.136342731496538}, +{"a":"#ffffff00","b":"#fcfcfcff","out":1.0250901015074352}, +{"a":"#ffffff00","b":"#31363bff","out":12.798433206220594}, +{"a":"#ffffff00","b":"#1b1e20ff","out":17.880237134195973}, +{"a":"#ffffff00","b":"#da4453ff","out":4.272815041160916}, +{"a":"#ffffff00","b":"#27ae60ff","out":2.8353296849487504}, +{"a":"#ffffff00","b":"#f67400ff","out":2.8159949980347574}, +{"a":"#ffffff00","b":"#2980b9ff","out":4.260448948712035}, +{"a":"#ffffff00","b":"#7f8c8dff","out":3.423608921759207}, +{"a":"#ffffff00","b":"#9b59b6ff","out":4.6446149753436705}, +{"a":"#ffffff00","b":"#1d99f3ff","out":3.007026621900125}, +{"a":"#ffffff00","b":"#dee0e2ff","out":1.3127559836282932}, +{"a":"#ffffff00","b":"#292c30ff","out":14.866342511442046}, +{"a":"#ffffff00","b":"#e93a9aff","out":3.809227603105063}, +{"a":"#ffffff00","b":"#e93d58ff","out":4.00734282211082}, +{"a":"#ffffff00","b":"#e9643aff","out":3.298657441963111}, +{"a":"#ffffff00","b":"#e8cb2dff","out":1.5974094165603232}, +{"a":"#ffffff00","b":"#3dd425ff","out":1.9568409348268905}, +{"a":"#ffffff00","b":"#00d3b8ff","out":1.8861360802032001}, +{"a":"#ffffff00","b":"#b875dcff","out":3.136996804516895}, +{"a":"#ffffff00","b":"#926ee4ff","out":3.733103199583586}, +{"a":"#ffffff00","b":"#686b6fff","out":5.330263509389798}, +{"a":"#ffffff00","b":"#3daee980","out":2.459967205803079}, +{"a":"#ffffff00","b":"#ffffff00","out":1}, +{"a":"#ffffff00","b":"#00000080","out":21}, +{"a":"#ffffff00","b":"#ff000033","out":3.9984767707539985} +], +"lighten": [ +{"amount":-0.5,"gain":0,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":2,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#000000ff","out":{"hex":"#b50000ff","u16":[46514,0,0,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#000000ff","out":{"hex":"#904141ff","u16":[37051,16792,16792,65535]}}, +{"amount":0.1,"gain":1,"in":"#000000ff","out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]}}, +{"amount":0.1,"gain":2,"in":"#000000ff","out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]}}, +{"amount":0.25,"gain":0,"in":"#000000ff","out":{"hex":"#ff4040ff","u16":[65535,16404,16404,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#000000ff","out":{"hex":"#ce6b6bff","u16":[52929,27562,27562,65535]}}, +{"amount":0.25,"gain":1,"in":"#000000ff","out":{"hex":"#888888ff","u16":[34899,34899,34899,65535]}}, +{"amount":0.25,"gain":2,"in":"#000000ff","out":{"hex":"#888888ff","u16":[34899,34899,34899,65535]}}, +{"amount":0.5,"gain":0,"in":"#000000ff","out":{"hex":"#ffa1a1ff","u16":[65535,41449,41449,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#000000ff","out":{"hex":"#e0aeaeff","u16":[57502,44773,44773,65535]}}, +{"amount":0.5,"gain":1,"in":"#000000ff","out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]}}, +{"amount":0.5,"gain":2,"in":"#000000ff","out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]}}, +{"amount":0.75,"gain":0,"in":"#000000ff","out":{"hex":"#ffd6d6ff","u16":[65535,55089,55089,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#000000ff","out":{"hex":"#f0dbdbff","u16":[61676,56311,56311,65535]}}, +{"amount":0.75,"gain":1,"in":"#000000ff","out":{"hex":"#e0e0e0ff","u16":[57502,57502,57502,65535]}}, +{"amount":0.75,"gain":2,"in":"#000000ff","out":{"hex":"#e0e0e0ff","u16":[57502,57502,57502,65535]}}, +{"amount":0.9,"gain":0,"in":"#000000ff","out":{"hex":"#fff0f0ff","u16":[65535,61611,61611,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#000000ff","out":{"hex":"#f9f1f1ff","u16":[64025,62043,62043,65535]}}, +{"amount":0.9,"gain":1,"in":"#000000ff","out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]}}, +{"amount":0.9,"gain":2,"in":"#000000ff","out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]}}, +{"amount":1,"gain":0,"in":"#000000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#000000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#000000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#000000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#000000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#000000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#000000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#000000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":2,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":0,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":0.5,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":2,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"gain":0,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"gain":1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"gain":2,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.25,"gain":0,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.25,"gain":1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.25,"gain":2,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.5,"gain":0,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.5,"gain":1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.5,"gain":2,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.75,"gain":0,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.75,"gain":1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.75,"gain":2,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.9,"gain":0,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.9,"gain":1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.9,"gain":2,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#010101ff","out":{"hex":"#020000ff","u16":[520,0,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#010101ff","out":{"hex":"#020101ff","u16":[414,188,188,65535]}}, +{"amount":0,"gain":1,"in":"#010101ff","out":{"hex":"#010101ff","u16":[257,257,257,65535]}}, +{"amount":0,"gain":2,"in":"#010101ff","out":{"hex":"#010101ff","u16":[257,257,257,65535]}}, +{"amount":0.1,"gain":0,"in":"#010101ff","out":{"hex":"#b50000ff","u16":[46515,0,0,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#010101ff","out":{"hex":"#904141ff","u16":[37052,16792,16792,65535]}}, +{"amount":0.1,"gain":1,"in":"#010101ff","out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]}}, +{"amount":0.1,"gain":2,"in":"#010101ff","out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]}}, +{"amount":0.25,"gain":0,"in":"#010101ff","out":{"hex":"#ff4040ff","u16":[65535,16405,16405,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#010101ff","out":{"hex":"#ce6b6bff","u16":[52929,27563,27563,65535]}}, +{"amount":0.25,"gain":1,"in":"#010101ff","out":{"hex":"#888888ff","u16":[34899,34899,34899,65535]}}, +{"amount":0.25,"gain":2,"in":"#010101ff","out":{"hex":"#888888ff","u16":[34899,34899,34899,65535]}}, +{"amount":0.5,"gain":0,"in":"#010101ff","out":{"hex":"#ffa1a1ff","u16":[65535,41449,41449,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#010101ff","out":{"hex":"#e0aeaeff","u16":[57502,44773,44773,65535]}}, +{"amount":0.5,"gain":1,"in":"#010101ff","out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]}}, +{"amount":0.5,"gain":2,"in":"#010101ff","out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]}}, +{"amount":0.75,"gain":0,"in":"#010101ff","out":{"hex":"#ffd6d6ff","u16":[65535,55089,55089,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#010101ff","out":{"hex":"#f0dbdbff","u16":[61676,56311,56311,65535]}}, +{"amount":0.75,"gain":1,"in":"#010101ff","out":{"hex":"#e0e0e0ff","u16":[57502,57502,57502,65535]}}, +{"amount":0.75,"gain":2,"in":"#010101ff","out":{"hex":"#e0e0e0ff","u16":[57502,57502,57502,65535]}}, +{"amount":0.9,"gain":0,"in":"#010101ff","out":{"hex":"#fff0f0ff","u16":[65535,61611,61611,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#010101ff","out":{"hex":"#f9f1f1ff","u16":[64025,62043,62043,65535]}}, +{"amount":0.9,"gain":1,"in":"#010101ff","out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]}}, +{"amount":0.9,"gain":2,"in":"#010101ff","out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]}}, +{"amount":1,"gain":0,"in":"#010101ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#010101ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#010101ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#010101ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#010101ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#010101ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#010101ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#010101ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#020202ff","out":{"hex":"#040000ff","u16":[1039,0,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#020202ff","out":{"hex":"#030101ff","u16":[828,375,375,65535]}}, +{"amount":0,"gain":1,"in":"#020202ff","out":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"amount":0,"gain":2,"in":"#020202ff","out":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"amount":0.1,"gain":0,"in":"#020202ff","out":{"hex":"#b50000ff","u16":[46518,0,0,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#020202ff","out":{"hex":"#904141ff","u16":[37055,16793,16793,65535]}}, +{"amount":0.1,"gain":1,"in":"#020202ff","out":{"hex":"#5a5a5aff","u16":[23013,23013,23013,65535]}}, +{"amount":0.1,"gain":2,"in":"#020202ff","out":{"hex":"#5a5a5aff","u16":[23013,23013,23013,65535]}}, +{"amount":0.25,"gain":0,"in":"#020202ff","out":{"hex":"#ff4040ff","u16":[65535,16408,16408,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#020202ff","out":{"hex":"#ce6b6bff","u16":[52929,27564,27564,65535]}}, +{"amount":0.25,"gain":1,"in":"#020202ff","out":{"hex":"#888888ff","u16":[34900,34900,34900,65535]}}, +{"amount":0.25,"gain":2,"in":"#020202ff","out":{"hex":"#888888ff","u16":[34900,34900,34900,65535]}}, +{"amount":0.5,"gain":0,"in":"#020202ff","out":{"hex":"#ffa1a1ff","u16":[65535,41450,41450,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#020202ff","out":{"hex":"#e0aeaeff","u16":[57502,44773,44773,65535]}}, +{"amount":0.5,"gain":1,"in":"#020202ff","out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]}}, +{"amount":0.5,"gain":2,"in":"#020202ff","out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]}}, +{"amount":0.75,"gain":0,"in":"#020202ff","out":{"hex":"#ffd6d6ff","u16":[65535,55089,55089,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#020202ff","out":{"hex":"#f0dbdbff","u16":[61676,56311,56311,65535]}}, +{"amount":0.75,"gain":1,"in":"#020202ff","out":{"hex":"#e0e0e0ff","u16":[57502,57502,57502,65535]}}, +{"amount":0.75,"gain":2,"in":"#020202ff","out":{"hex":"#e0e0e0ff","u16":[57502,57502,57502,65535]}}, +{"amount":0.9,"gain":0,"in":"#020202ff","out":{"hex":"#fff0f0ff","u16":[65535,61612,61612,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#020202ff","out":{"hex":"#f9f1f1ff","u16":[64025,62043,62043,65535]}}, +{"amount":0.9,"gain":1,"in":"#020202ff","out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]}}, +{"amount":0.9,"gain":2,"in":"#020202ff","out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]}}, +{"amount":1,"gain":0,"in":"#020202ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#020202ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#020202ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#020202ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#020202ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#020202ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#020202ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#020202ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#040404ff","out":{"hex":"#080000ff","u16":[2078,0,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#040404ff","out":{"hex":"#060303ff","u16":[1655,750,750,65535]}}, +{"amount":0,"gain":1,"in":"#040404ff","out":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"amount":0,"gain":2,"in":"#040404ff","out":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"amount":0.1,"gain":0,"in":"#040404ff","out":{"hex":"#b50000ff","u16":[46534,0,0,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#040404ff","out":{"hex":"#904141ff","u16":[37067,16799,16799,65535]}}, +{"amount":0.1,"gain":1,"in":"#040404ff","out":{"hex":"#5a5a5aff","u16":[23021,23021,23021,65535]}}, +{"amount":0.1,"gain":2,"in":"#040404ff","out":{"hex":"#5a5a5aff","u16":[23021,23021,23021,65535]}}, +{"amount":0.25,"gain":0,"in":"#040404ff","out":{"hex":"#ff4040ff","u16":[65535,16421,16421,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#040404ff","out":{"hex":"#ce6b6bff","u16":[52930,27570,27570,65535]}}, +{"amount":0.25,"gain":1,"in":"#040404ff","out":{"hex":"#888888ff","u16":[34904,34904,34904,65535]}}, +{"amount":0.25,"gain":2,"in":"#040404ff","out":{"hex":"#888888ff","u16":[34904,34904,34904,65535]}}, +{"amount":0.5,"gain":0,"in":"#040404ff","out":{"hex":"#ffa1a1ff","u16":[65535,41453,41453,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#040404ff","out":{"hex":"#e0aeaeff","u16":[57503,44775,44775,65535]}}, +{"amount":0.5,"gain":1,"in":"#040404ff","out":{"hex":"#bababaff","u16":[47826,47826,47826,65535]}}, +{"amount":0.5,"gain":2,"in":"#040404ff","out":{"hex":"#bababaff","u16":[47826,47826,47826,65535]}}, +{"amount":0.75,"gain":0,"in":"#040404ff","out":{"hex":"#ffd6d6ff","u16":[65535,55090,55090,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#040404ff","out":{"hex":"#f0dbdbff","u16":[61676,56312,56312,65535]}}, +{"amount":0.75,"gain":1,"in":"#040404ff","out":{"hex":"#e0e0e0ff","u16":[57503,57503,57503,65535]}}, +{"amount":0.75,"gain":2,"in":"#040404ff","out":{"hex":"#e0e0e0ff","u16":[57503,57503,57503,65535]}}, +{"amount":0.9,"gain":0,"in":"#040404ff","out":{"hex":"#fff0f0ff","u16":[65535,61612,61612,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#040404ff","out":{"hex":"#f9f1f1ff","u16":[64025,62043,62043,65535]}}, +{"amount":0.9,"gain":1,"in":"#040404ff","out":{"hex":"#f3f3f3ff","u16":[62471,62471,62471,65535]}}, +{"amount":0.9,"gain":2,"in":"#040404ff","out":{"hex":"#f3f3f3ff","u16":[62471,62471,62471,65535]}}, +{"amount":1,"gain":0,"in":"#040404ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#040404ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#040404ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#040404ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#040404ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#040404ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#040404ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#040404ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#080808ff","out":{"hex":"#100000ff","u16":[4156,0,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#080808ff","out":{"hex":"#0d0606ff","u16":[3311,1500,1500,65535]}}, +{"amount":0,"gain":1,"in":"#080808ff","out":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"amount":0,"gain":2,"in":"#080808ff","out":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"amount":0.1,"gain":0,"in":"#080808ff","out":{"hex":"#b50000ff","u16":[46607,0,0,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#080808ff","out":{"hex":"#904141ff","u16":[37126,16826,16826,65535]}}, +{"amount":0.1,"gain":1,"in":"#080808ff","out":{"hex":"#5a5a5aff","u16":[23057,23057,23057,65535]}}, +{"amount":0.1,"gain":2,"in":"#080808ff","out":{"hex":"#5a5a5aff","u16":[23057,23057,23057,65535]}}, +{"amount":0.25,"gain":0,"in":"#080808ff","out":{"hex":"#ff4040ff","u16":[65535,16478,16478,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#080808ff","out":{"hex":"#ce6b6bff","u16":[52936,27598,27598,65535]}}, +{"amount":0.25,"gain":1,"in":"#080808ff","out":{"hex":"#888888ff","u16":[34922,34922,34922,65535]}}, +{"amount":0.25,"gain":2,"in":"#080808ff","out":{"hex":"#888888ff","u16":[34922,34922,34922,65535]}}, +{"amount":0.5,"gain":0,"in":"#080808ff","out":{"hex":"#ffa1a1ff","u16":[65535,41465,41465,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#080808ff","out":{"hex":"#e0aeaeff","u16":[57506,44786,44786,65535]}}, +{"amount":0.5,"gain":1,"in":"#080808ff","out":{"hex":"#bababaff","u16":[47834,47834,47834,65535]}}, +{"amount":0.5,"gain":2,"in":"#080808ff","out":{"hex":"#bababaff","u16":[47834,47834,47834,65535]}}, +{"amount":0.75,"gain":0,"in":"#080808ff","out":{"hex":"#ffd6d6ff","u16":[65535,55095,55095,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#080808ff","out":{"hex":"#f0dbdbff","u16":[61678,56316,56316,65535]}}, +{"amount":0.75,"gain":1,"in":"#080808ff","out":{"hex":"#e0e0e0ff","u16":[57506,57506,57506,65535]}}, +{"amount":0.75,"gain":2,"in":"#080808ff","out":{"hex":"#e0e0e0ff","u16":[57506,57506,57506,65535]}}, +{"amount":0.9,"gain":0,"in":"#080808ff","out":{"hex":"#fff0f0ff","u16":[65535,61613,61613,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#080808ff","out":{"hex":"#f9f1f1ff","u16":[64025,62045,62045,65535]}}, +{"amount":0.9,"gain":1,"in":"#080808ff","out":{"hex":"#f3f3f3ff","u16":[62472,62472,62472,65535]}}, +{"amount":0.9,"gain":2,"in":"#080808ff","out":{"hex":"#f3f3f3ff","u16":[62472,62472,62472,65535]}}, +{"amount":1,"gain":0,"in":"#080808ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#080808ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#080808ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#080808ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#080808ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#080808ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#080808ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#080808ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#101010ff","out":{"hex":"#200000ff","u16":[8312,0,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#101010ff","out":{"hex":"#1a0c0cff","u16":[6621,3001,3001,65535]}}, +{"amount":0,"gain":1,"in":"#101010ff","out":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"amount":0,"gain":2,"in":"#101010ff","out":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"amount":0.1,"gain":0,"in":"#101010ff","out":{"hex":"#b70000ff","u16":[46942,0,0,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#101010ff","out":{"hex":"#914242ff","u16":[37392,16946,16946,65535]}}, +{"amount":0.1,"gain":1,"in":"#101010ff","out":{"hex":"#5a5a5aff","u16":[23222,23222,23222,65535]}}, +{"amount":0.1,"gain":2,"in":"#101010ff","out":{"hex":"#5a5a5aff","u16":[23222,23222,23222,65535]}}, +{"amount":0.25,"gain":0,"in":"#101010ff","out":{"hex":"#ff4141ff","u16":[65535,16739,16739,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#101010ff","out":{"hex":"#ce6c6cff","u16":[52961,27724,27724,65535]}}, +{"amount":0.25,"gain":1,"in":"#101010ff","out":{"hex":"#888888ff","u16":[35006,35006,35006,65535]}}, +{"amount":0.25,"gain":2,"in":"#101010ff","out":{"hex":"#888888ff","u16":[35006,35006,35006,65535]}}, +{"amount":0.5,"gain":0,"in":"#101010ff","out":{"hex":"#ffa2a2ff","u16":[65535,41523,41523,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#101010ff","out":{"hex":"#e0aeaeff","u16":[57522,44833,44833,65535]}}, +{"amount":0.5,"gain":1,"in":"#101010ff","out":{"hex":"#bababaff","u16":[47873,47873,47873,65535]}}, +{"amount":0.5,"gain":2,"in":"#101010ff","out":{"hex":"#bababaff","u16":[47873,47873,47873,65535]}}, +{"amount":0.75,"gain":0,"in":"#101010ff","out":{"hex":"#ffd6d6ff","u16":[65535,55115,55115,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#101010ff","out":{"hex":"#f0dbdbff","u16":[61685,56334,56334,65535]}}, +{"amount":0.75,"gain":1,"in":"#101010ff","out":{"hex":"#e0e0e0ff","u16":[57522,57522,57522,65535]}}, +{"amount":0.75,"gain":2,"in":"#101010ff","out":{"hex":"#e0e0e0ff","u16":[57522,57522,57522,65535]}}, +{"amount":0.9,"gain":0,"in":"#101010ff","out":{"hex":"#fff0f0ff","u16":[65535,61621,61621,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#101010ff","out":{"hex":"#f9f1f1ff","u16":[64028,62051,62051,65535]}}, +{"amount":0.9,"gain":1,"in":"#101010ff","out":{"hex":"#f3f3f3ff","u16":[62478,62478,62478,65535]}}, +{"amount":0.9,"gain":2,"in":"#101010ff","out":{"hex":"#f3f3f3ff","u16":[62478,62478,62478,65535]}}, +{"amount":1,"gain":0,"in":"#101010ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#101010ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#101010ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#101010ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#101010ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#101010ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#101010ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#101010ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#202020ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#202020ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#202020ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#202020ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#202020ff","out":{"hex":"#410000ff","u16":[16624,0,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#202020ff","out":{"hex":"#341717ff","u16":[13242,6001,6001,65535]}}, +{"amount":0,"gain":1,"in":"#202020ff","out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"amount":0,"gain":2,"in":"#202020ff","out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"amount":0.1,"gain":0,"in":"#202020ff","out":{"hex":"#bc0000ff","u16":[48444,0,0,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#202020ff","out":{"hex":"#964444ff","u16":[38589,17489,17489,65535]}}, +{"amount":0.1,"gain":1,"in":"#202020ff","out":{"hex":"#5d5d5dff","u16":[23966,23966,23966,65535]}}, +{"amount":0.1,"gain":2,"in":"#202020ff","out":{"hex":"#5d5d5dff","u16":[23966,23966,23966,65535]}}, +{"amount":0.25,"gain":0,"in":"#202020ff","out":{"hex":"#ff4646ff","u16":[65535,17879,17879,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#202020ff","out":{"hex":"#cf6e6eff","u16":[53079,28296,28296,65535]}}, +{"amount":0.25,"gain":1,"in":"#202020ff","out":{"hex":"#8a8a8aff","u16":[35389,35389,35389,65535]}}, +{"amount":0.25,"gain":2,"in":"#202020ff","out":{"hex":"#8a8a8aff","u16":[35389,35389,35389,65535]}}, +{"amount":0.5,"gain":0,"in":"#202020ff","out":{"hex":"#ffa3a3ff","u16":[65535,41788,41788,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#202020ff","out":{"hex":"#e0afafff","u16":[57593,45049,45049,65535]}}, +{"amount":0.5,"gain":1,"in":"#202020ff","out":{"hex":"#bbbbbbff","u16":[48049,48049,48049,65535]}}, +{"amount":0.5,"gain":2,"in":"#202020ff","out":{"hex":"#bbbbbbff","u16":[48049,48049,48049,65535]}}, +{"amount":0.75,"gain":0,"in":"#202020ff","out":{"hex":"#ffd7d7ff","u16":[65535,55210,55210,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#202020ff","out":{"hex":"#f0dcdcff","u16":[61717,56416,56416,65535]}}, +{"amount":0.75,"gain":1,"in":"#202020ff","out":{"hex":"#e0e0e0ff","u16":[57593,57593,57593,65535]}}, +{"amount":0.75,"gain":2,"in":"#202020ff","out":{"hex":"#e0e0e0ff","u16":[57593,57593,57593,65535]}}, +{"amount":0.9,"gain":0,"in":"#202020ff","out":{"hex":"#fff0f0ff","u16":[65535,61654,61654,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#202020ff","out":{"hex":"#f9f2f2ff","u16":[64041,62080,62080,65535]}}, +{"amount":0.9,"gain":1,"in":"#202020ff","out":{"hex":"#f3f3f3ff","u16":[62503,62503,62503,65535]}}, +{"amount":0.9,"gain":2,"in":"#202020ff","out":{"hex":"#f3f3f3ff","u16":[62503,62503,62503,65535]}}, +{"amount":1,"gain":0,"in":"#202020ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#202020ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#202020ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#202020ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#202020ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#202020ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#202020ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#202020ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#404040ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#404040ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#404040ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#404040ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#404040ff","out":{"hex":"#810000ff","u16":[33248,0,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#404040ff","out":{"hex":"#672f2fff","u16":[26484,12003,12003,65535]}}, +{"amount":0,"gain":1,"in":"#404040ff","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"amount":0,"gain":2,"in":"#404040ff","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"amount":0.1,"gain":0,"in":"#404040ff","out":{"hex":"#d50000ff","u16":[54725,0,0,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#404040ff","out":{"hex":"#aa4d4dff","u16":[43592,19756,19756,65535]}}, +{"amount":0.1,"gain":1,"in":"#404040ff","out":{"hex":"#696969ff","u16":[27073,27073,27073,65535]}}, +{"amount":0.1,"gain":2,"in":"#404040ff","out":{"hex":"#696969ff","u16":[27073,27073,27073,65535]}}, +{"amount":0.25,"gain":0,"in":"#404040ff","out":{"hex":"#ff5757ff","u16":[65535,22264,22264,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#404040ff","out":{"hex":"#d17878ff","u16":[53613,30763,30763,65535]}}, +{"amount":0.25,"gain":1,"in":"#404040ff","out":{"hex":"#909090ff","u16":[37089,37089,37089,65535]}}, +{"amount":0.25,"gain":2,"in":"#404040ff","out":{"hex":"#909090ff","u16":[37089,37089,37089,65535]}}, +{"amount":0.5,"gain":0,"in":"#404040ff","out":{"hex":"#ffa7a7ff","u16":[65535,42981,42981,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#404040ff","out":{"hex":"#e1b3b3ff","u16":[57916,46027,46027,65535]}}, +{"amount":0.5,"gain":1,"in":"#404040ff","out":{"hex":"#bebebeff","u16":[48849,48849,48849,65535]}}, +{"amount":0.5,"gain":2,"in":"#404040ff","out":{"hex":"#bebebeff","u16":[48849,48849,48849,65535]}}, +{"amount":0.75,"gain":0,"in":"#404040ff","out":{"hex":"#ffd9d9ff","u16":[65535,55642,55642,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#404040ff","out":{"hex":"#f1ddddff","u16":[61867,56793,56793,65535]}}, +{"amount":0.75,"gain":1,"in":"#404040ff","out":{"hex":"#e1e1e1ff","u16":[57916,57916,57916,65535]}}, +{"amount":0.75,"gain":2,"in":"#404040ff","out":{"hex":"#e1e1e1ff","u16":[57916,57916,57916,65535]}}, +{"amount":0.9,"gain":0,"in":"#404040ff","out":{"hex":"#fff0f0ff","u16":[65535,61806,61806,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#404040ff","out":{"hex":"#f9f2f2ff","u16":[64098,62215,62215,65535]}}, +{"amount":0.9,"gain":1,"in":"#404040ff","out":{"hex":"#f4f4f4ff","u16":[62621,62621,62621,65535]}}, +{"amount":0.9,"gain":2,"in":"#404040ff","out":{"hex":"#f4f4f4ff","u16":[62621,62621,62621,65535]}}, +{"amount":1,"gain":0,"in":"#404040ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#404040ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#404040ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#404040ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#404040ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#404040ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#404040ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#404040ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#7f7f7fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#7f7f7fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#7f7f7fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#7f7f7fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#7f7f7fff","out":{"hex":"#ff1515ff","u16":[65535,5339,5339,65535]}}, +{"amount":0,"gain":0.5,"in":"#7f7f7fff","out":{"hex":"#cb5d5dff","u16":[52265,24019,24019,65535]}}, +{"amount":0,"gain":1,"in":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"gain":2,"in":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"gain":0,"in":"#7f7f7fff","out":{"hex":"#ff5b5bff","u16":[65535,23385,23385,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#7f7f7fff","out":{"hex":"#d17a7aff","u16":[53771,31454,31454,65535]}}, +{"amount":0.1,"gain":1,"in":"#7f7f7fff","out":{"hex":"#929292ff","u16":[37578,37578,37578,65535]}}, +{"amount":0.1,"gain":2,"in":"#7f7f7fff","out":{"hex":"#929292ff","u16":[37578,37578,37578,65535]}}, +{"amount":0.25,"gain":0,"in":"#7f7f7fff","out":{"hex":"#ff8989ff","u16":[65535,35089,35089,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#7f7f7fff","out":{"hex":"#da9b9bff","u16":[55940,39724,39724,65535]}}, +{"amount":0.25,"gain":1,"in":"#7f7f7fff","out":{"hex":"#aaaaaaff","u16":[43787,43787,43787,65535]}}, +{"amount":0.25,"gain":2,"in":"#7f7f7fff","out":{"hex":"#aaaaaaff","u16":[43787,43787,43787,65535]}}, +{"amount":0.5,"gain":0,"in":"#7f7f7fff","out":{"hex":"#ffbabaff","u16":[65535,47911,47911,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#7f7f7fff","out":{"hex":"#e7c3c3ff","u16":[59346,50145,50145,65535]}}, +{"amount":0.5,"gain":1,"in":"#7f7f7fff","out":{"hex":"#cbcbcbff","u16":[52265,52265,52265,65535]}}, +{"amount":0.5,"gain":2,"in":"#7f7f7fff","out":{"hex":"#cbcbcbff","u16":[52265,52265,52265,65535]}}, +{"amount":0.75,"gain":0,"in":"#7f7f7fff","out":{"hex":"#ffe0e0ff","u16":[65535,57537,57537,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#7f7f7fff","out":{"hex":"#f3e3e3ff","u16":[62533,58450,58450,65535]}}, +{"amount":0.75,"gain":1,"in":"#7f7f7fff","out":{"hex":"#e7e7e7ff","u16":[59346,59346,59346,65535]}}, +{"amount":0.75,"gain":2,"in":"#7f7f7fff","out":{"hex":"#e7e7e7ff","u16":[59346,59346,59346,65535]}}, +{"amount":0.9,"gain":0,"in":"#7f7f7fff","out":{"hex":"#fff3f3ff","u16":[65535,62483,62483,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#7f7f7fff","out":{"hex":"#faf4f4ff","u16":[64354,62816,62816,65535]}}, +{"amount":0.9,"gain":1,"in":"#7f7f7fff","out":{"hex":"#f6f6f6ff","u16":[63147,63147,63147,65535]}}, +{"amount":0.9,"gain":2,"in":"#7f7f7fff","out":{"hex":"#f6f6f6ff","u16":[63147,63147,63147,65535]}}, +{"amount":1,"gain":0,"in":"#7f7f7fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#7f7f7fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#7f7f7fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#7f7f7fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#7f7f7fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#7f7f7fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#7f7f7fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#7f7f7fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#808080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#808080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#808080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#808080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#808080ff","out":{"hex":"#ff1e1eff","u16":[65535,7619,7619,65535]}}, +{"amount":0,"gain":0.5,"in":"#808080ff","out":{"hex":"#cc5f5fff","u16":[52338,24438,24438,65535]}}, +{"amount":0,"gain":1,"in":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"gain":2,"in":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"gain":0,"in":"#808080ff","out":{"hex":"#ff5d5dff","u16":[65535,23821,23821,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#808080ff","out":{"hex":"#d17b7bff","u16":[53835,31728,31728,65535]}}, +{"amount":0.1,"gain":1,"in":"#808080ff","out":{"hex":"#939393ff","u16":[37774,37774,37774,65535]}}, +{"amount":0.1,"gain":2,"in":"#808080ff","out":{"hex":"#939393ff","u16":[37774,37774,37774,65535]}}, +{"amount":0.25,"gain":0,"in":"#808080ff","out":{"hex":"#ff8989ff","u16":[65535,35314,35314,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#808080ff","out":{"hex":"#da9b9bff","u16":[55991,39898,39898,65535]}}, +{"amount":0.25,"gain":1,"in":"#808080ff","out":{"hex":"#abababff","u16":[43923,43923,43923,65535]}}, +{"amount":0.25,"gain":2,"in":"#808080ff","out":{"hex":"#abababff","u16":[43923,43923,43923,65535]}}, +{"amount":0.5,"gain":0,"in":"#808080ff","out":{"hex":"#ffbbbbff","u16":[65535,48014,48014,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#808080ff","out":{"hex":"#e7c3c3ff","u16":[59378,50232,50232,65535]}}, +{"amount":0.5,"gain":1,"in":"#808080ff","out":{"hex":"#ccccccff","u16":[52338,52338,52338,65535]}}, +{"amount":0.5,"gain":2,"in":"#808080ff","out":{"hex":"#ccccccff","u16":[52338,52338,52338,65535]}}, +{"amount":0.75,"gain":0,"in":"#808080ff","out":{"hex":"#ffe0e0ff","u16":[65535,57579,57579,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#808080ff","out":{"hex":"#f3e4e4ff","u16":[62547,58486,58486,65535]}}, +{"amount":0.75,"gain":1,"in":"#808080ff","out":{"hex":"#e7e7e7ff","u16":[59378,59378,59378,65535]}}, +{"amount":0.75,"gain":2,"in":"#808080ff","out":{"hex":"#e7e7e7ff","u16":[59378,59378,59378,65535]}}, +{"amount":0.9,"gain":0,"in":"#808080ff","out":{"hex":"#fff3f3ff","u16":[65535,62498,62498,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#808080ff","out":{"hex":"#faf4f4ff","u16":[64360,62829,62829,65535]}}, +{"amount":0.9,"gain":1,"in":"#808080ff","out":{"hex":"#f6f6f6ff","u16":[63158,63158,63158,65535]}}, +{"amount":0.9,"gain":2,"in":"#808080ff","out":{"hex":"#f6f6f6ff","u16":[63158,63158,63158,65535]}}, +{"amount":1,"gain":0,"in":"#808080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#808080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#808080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#808080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#808080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#808080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#808080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#808080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#818181ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#818181ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#818181ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#818181ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#818181ff","out":{"hex":"#ff2424ff","u16":[65535,9292,9292,65535]}}, +{"amount":0,"gain":0.5,"in":"#818181ff","out":{"hex":"#cc6161ff","u16":[52412,24852,24852,65535]}}, +{"amount":0,"gain":1,"in":"#818181ff","out":{"hex":"#818181ff","u16":[33153,33153,33153,65535]}}, +{"amount":0,"gain":2,"in":"#818181ff","out":{"hex":"#818181ff","u16":[33153,33153,33153,65535]}}, +{"amount":0.1,"gain":0,"in":"#818181ff","out":{"hex":"#ff5e5eff","u16":[65535,24251,24251,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#818181ff","out":{"hex":"#d27d7dff","u16":[53899,32002,32002,65535]}}, +{"amount":0.1,"gain":1,"in":"#818181ff","out":{"hex":"#949494ff","u16":[37970,37970,37970,65535]}}, +{"amount":0.1,"gain":2,"in":"#818181ff","out":{"hex":"#949494ff","u16":[37970,37970,37970,65535]}}, +{"amount":0.25,"gain":0,"in":"#818181ff","out":{"hex":"#ff8a8aff","u16":[65535,35539,35539,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#818181ff","out":{"hex":"#da9c9cff","u16":[56042,40072,40072,65535]}}, +{"amount":0.25,"gain":1,"in":"#818181ff","out":{"hex":"#abababff","u16":[44059,44059,44059,65535]}}, +{"amount":0.25,"gain":2,"in":"#818181ff","out":{"hex":"#abababff","u16":[44059,44059,44059,65535]}}, +{"amount":0.5,"gain":0,"in":"#818181ff","out":{"hex":"#ffbbbbff","u16":[65535,48118,48118,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#818181ff","out":{"hex":"#e7c4c4ff","u16":[59410,50320,50320,65535]}}, +{"amount":0.5,"gain":1,"in":"#818181ff","out":{"hex":"#ccccccff","u16":[52412,52412,52412,65535]}}, +{"amount":0.5,"gain":2,"in":"#818181ff","out":{"hex":"#ccccccff","u16":[52412,52412,52412,65535]}}, +{"amount":0.75,"gain":0,"in":"#818181ff","out":{"hex":"#ffe0e0ff","u16":[65535,57620,57620,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#818181ff","out":{"hex":"#f3e4e4ff","u16":[62562,58523,58523,65535]}}, +{"amount":0.75,"gain":1,"in":"#818181ff","out":{"hex":"#e7e7e7ff","u16":[59410,59410,59410,65535]}}, +{"amount":0.75,"gain":2,"in":"#818181ff","out":{"hex":"#e7e7e7ff","u16":[59410,59410,59410,65535]}}, +{"amount":0.9,"gain":0,"in":"#818181ff","out":{"hex":"#fff3f3ff","u16":[65535,62513,62513,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#818181ff","out":{"hex":"#faf5f5ff","u16":[64366,62843,62843,65535]}}, +{"amount":0.9,"gain":1,"in":"#818181ff","out":{"hex":"#f6f6f6ff","u16":[63170,63170,63170,65535]}}, +{"amount":0.9,"gain":2,"in":"#818181ff","out":{"hex":"#f6f6f6ff","u16":[63170,63170,63170,65535]}}, +{"amount":1,"gain":0,"in":"#818181ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#818181ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#818181ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#818181ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#818181ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#818181ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#818181ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#818181ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#bfbfbfff","out":{"hex":"#ff5b5bff","u16":[65535,23398,23398,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#bfbfbfff","out":{"hex":"#d17a7aff","u16":[53773,31462,31462,65535]}}, +{"amount":-0.5,"gain":1,"in":"#bfbfbfff","out":{"hex":"#929292ff","u16":[37584,37584,37584,65535]}}, +{"amount":-0.5,"gain":2,"in":"#bfbfbfff","out":{"hex":"#929292ff","u16":[37584,37584,37584,65535]}}, +{"amount":0,"gain":0,"in":"#bfbfbfff","out":{"hex":"#ffa9a9ff","u16":[65535,43333,43333,65535]}}, +{"amount":0,"gain":0.5,"in":"#bfbfbfff","out":{"hex":"#e2b4b4ff","u16":[58014,46317,46317,65535]}}, +{"amount":0,"gain":1,"in":"#bfbfbfff","out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]}}, +{"amount":0,"gain":2,"in":"#bfbfbfff","out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]}}, +{"amount":0.1,"gain":0,"in":"#bfbfbfff","out":{"hex":"#ffb4b4ff","u16":[65535,46147,46147,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#bfbfbfff","out":{"hex":"#e5bdbdff","u16":[58818,48659,48659,65535]}}, +{"amount":0.1,"gain":1,"in":"#bfbfbfff","out":{"hex":"#c7c7c7ff","u16":[51023,51023,51023,65535]}}, +{"amount":0.1,"gain":2,"in":"#bfbfbfff","out":{"hex":"#c7c7c7ff","u16":[51023,51023,51023,65535]}}, +{"amount":0.25,"gain":0,"in":"#bfbfbfff","out":{"hex":"#ffc3c3ff","u16":[65535,50018,50018,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#bfbfbfff","out":{"hex":"#e9cacaff","u16":[60001,51936,51936,65535]}}, +{"amount":0.25,"gain":1,"in":"#bfbfbfff","out":{"hex":"#d1d1d1ff","u16":[53773,53773,53773,65535]}}, +{"amount":0.25,"gain":2,"in":"#bfbfbfff","out":{"hex":"#d1d1d1ff","u16":[53773,53773,53773,65535]}}, +{"amount":0.5,"gain":0,"in":"#bfbfbfff","out":{"hex":"#ffd9d9ff","u16":[65535,55772,55772,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#bfbfbfff","out":{"hex":"#f1ddddff","u16":[61912,56906,56906,65535]}}, +{"amount":0.5,"gain":1,"in":"#bfbfbfff","out":{"hex":"#e2e2e2ff","u16":[58014,58014,58014,65535]}}, +{"amount":0.5,"gain":2,"in":"#bfbfbfff","out":{"hex":"#e2e2e2ff","u16":[58014,58014,58014,65535]}}, +{"amount":0.75,"gain":0,"in":"#bfbfbfff","out":{"hex":"#ffededff","u16":[65535,60889,60889,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#bfbfbfff","out":{"hex":"#f8efefff","u16":[63754,61403,61403,65535]}}, +{"amount":0.75,"gain":1,"in":"#bfbfbfff","out":{"hex":"#f1f1f1ff","u16":[61912,61912,61912,65535]}}, +{"amount":0.75,"gain":2,"in":"#bfbfbfff","out":{"hex":"#f1f1f1ff","u16":[61912,61912,61912,65535]}}, +{"amount":0.9,"gain":0,"in":"#bfbfbfff","out":{"hex":"#fff8f8ff","u16":[65535,63725,63725,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#bfbfbfff","out":{"hex":"#fcf9f9ff","u16":[64830,63920,63920,65535]}}, +{"amount":0.9,"gain":1,"in":"#bfbfbfff","out":{"hex":"#f9f9f9ff","u16":[64115,64115,64115,65535]}}, +{"amount":0.9,"gain":2,"in":"#bfbfbfff","out":{"hex":"#f9f9f9ff","u16":[64115,64115,64115,65535]}}, +{"amount":1,"gain":0,"in":"#bfbfbfff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#bfbfbfff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#bfbfbfff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#bfbfbfff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#bfbfbfff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#bfbfbfff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#bfbfbfff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#bfbfbfff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#c0c0c0ff","out":{"hex":"#ff6060ff","u16":[65535,24558,24558,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#c0c0c0ff","out":{"hex":"#d27d7dff","u16":[53946,32200,32200,65535]}}, +{"amount":-0.5,"gain":1,"in":"#c0c0c0ff","out":{"hex":"#949494ff","u16":[38112,38112,38112,65535]}}, +{"amount":-0.5,"gain":2,"in":"#c0c0c0ff","out":{"hex":"#949494ff","u16":[38112,38112,38112,65535]}}, +{"amount":0,"gain":0,"in":"#c0c0c0ff","out":{"hex":"#ffaaaaff","u16":[65535,43711,43711,65535]}}, +{"amount":0,"gain":0.5,"in":"#c0c0c0ff","out":{"hex":"#e2b5b5ff","u16":[58119,46630,46630,65535]}}, +{"amount":0,"gain":1,"in":"#c0c0c0ff","out":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]}}, +{"amount":0,"gain":2,"in":"#c0c0c0ff","out":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]}}, +{"amount":0.1,"gain":0,"in":"#c0c0c0ff","out":{"hex":"#ffb5b5ff","u16":[65535,46463,46463,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#c0c0c0ff","out":{"hex":"#e5bebeff","u16":[58911,48924,48924,65535]}}, +{"amount":0.1,"gain":1,"in":"#c0c0c0ff","out":{"hex":"#c7c7c7ff","u16":[51244,51244,51244,65535]}}, +{"amount":0.1,"gain":2,"in":"#c0c0c0ff","out":{"hex":"#c7c7c7ff","u16":[51244,51244,51244,65535]}}, +{"amount":0.25,"gain":0,"in":"#c0c0c0ff","out":{"hex":"#ffc4c4ff","u16":[65535,50257,50257,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#c0c0c0ff","out":{"hex":"#eacbcbff","u16":[60077,52141,52141,65535]}}, +{"amount":0.25,"gain":1,"in":"#c0c0c0ff","out":{"hex":"#d2d2d2ff","u16":[53946,53946,53946,65535]}}, +{"amount":0.25,"gain":2,"in":"#c0c0c0ff","out":{"hex":"#d2d2d2ff","u16":[53946,53946,53946,65535]}}, +{"amount":0.5,"gain":0,"in":"#c0c0c0ff","out":{"hex":"#ffdadaff","u16":[65535,55912,55912,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#c0c0c0ff","out":{"hex":"#f1dedeff","u16":[61960,57028,57028,65535]}}, +{"amount":0.5,"gain":1,"in":"#c0c0c0ff","out":{"hex":"#e2e2e2ff","u16":[58119,58119,58119,65535]}}, +{"amount":0.5,"gain":2,"in":"#c0c0c0ff","out":{"hex":"#e2e2e2ff","u16":[58119,58119,58119,65535]}}, +{"amount":0.75,"gain":0,"in":"#c0c0c0ff","out":{"hex":"#ffededff","u16":[65535,60952,60952,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#c0c0c0ff","out":{"hex":"#f8efefff","u16":[63778,61458,61458,65535]}}, +{"amount":0.75,"gain":1,"in":"#c0c0c0ff","out":{"hex":"#f1f1f1ff","u16":[61960,61960,61960,65535]}}, +{"amount":0.75,"gain":2,"in":"#c0c0c0ff","out":{"hex":"#f1f1f1ff","u16":[61960,61960,61960,65535]}}, +{"amount":0.9,"gain":0,"in":"#c0c0c0ff","out":{"hex":"#fff8f8ff","u16":[65535,63749,63749,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#c0c0c0ff","out":{"hex":"#fcf9f9ff","u16":[64839,63942,63942,65535]}}, +{"amount":0.9,"gain":1,"in":"#c0c0c0ff","out":{"hex":"#fafafaff","u16":[64134,64134,64134,65535]}}, +{"amount":0.9,"gain":2,"in":"#c0c0c0ff","out":{"hex":"#fafafaff","u16":[64134,64134,64134,65535]}}, +{"amount":1,"gain":0,"in":"#c0c0c0ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#c0c0c0ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#c0c0c0ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#c0c0c0ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#c0c0c0ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#c0c0c0ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#c0c0c0ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#c0c0c0ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#fdfdfdff","out":{"hex":"#fffbfbff","u16":[65535,64552,64552,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#fdfdfdff","out":{"hex":"#fefcfcff","u16":[65150,64657,64657,65535]}}, +{"amount":-0.5,"gain":1,"in":"#fdfdfdff","out":{"hex":"#fcfcfcff","u16":[64762,64762,64762,65535]}}, +{"amount":-0.5,"gain":2,"in":"#fdfdfdff","out":{"hex":"#fcfcfcff","u16":[64762,64762,64762,65535]}}, +{"amount":0,"gain":0,"in":"#fdfdfdff","out":{"hex":"#fffcfcff","u16":[65535,64881,64881,65535]}}, +{"amount":0,"gain":0.5,"in":"#fdfdfdff","out":{"hex":"#fefdfdff","u16":[65279,64951,64951,65535]}}, +{"amount":0,"gain":1,"in":"#fdfdfdff","out":{"hex":"#fdfdfdff","u16":[65021,65021,65021,65535]}}, +{"amount":0,"gain":2,"in":"#fdfdfdff","out":{"hex":"#fdfdfdff","u16":[65021,65021,65021,65535]}}, +{"amount":0.1,"gain":0,"in":"#fdfdfdff","out":{"hex":"#fffdfdff","u16":[65535,64947,64947,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#fdfdfdff","out":{"hex":"#fefdfdff","u16":[65304,65010,65010,65535]}}, +{"amount":0.1,"gain":1,"in":"#fdfdfdff","out":{"hex":"#fdfdfdff","u16":[65073,65073,65073,65535]}}, +{"amount":0.1,"gain":2,"in":"#fdfdfdff","out":{"hex":"#fdfdfdff","u16":[65073,65073,65073,65535]}}, +{"amount":0.25,"gain":0,"in":"#fdfdfdff","out":{"hex":"#fffdfdff","u16":[65535,65046,65046,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#fdfdfdff","out":{"hex":"#fefdfdff","u16":[65343,65098,65098,65535]}}, +{"amount":0.25,"gain":1,"in":"#fdfdfdff","out":{"hex":"#fefefeff","u16":[65150,65150,65150,65535]}}, +{"amount":0.25,"gain":2,"in":"#fdfdfdff","out":{"hex":"#fefefeff","u16":[65150,65150,65150,65535]}}, +{"amount":0.5,"gain":0,"in":"#fdfdfdff","out":{"hex":"#fffefeff","u16":[65535,65209,65209,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#fdfdfdff","out":{"hex":"#fffefeff","u16":[65407,65244,65244,65535]}}, +{"amount":0.5,"gain":1,"in":"#fdfdfdff","out":{"hex":"#fefefeff","u16":[65279,65279,65279,65535]}}, +{"amount":0.5,"gain":2,"in":"#fdfdfdff","out":{"hex":"#fefefeff","u16":[65279,65279,65279,65535]}}, +{"amount":0.75,"gain":0,"in":"#fdfdfdff","out":{"hex":"#fffefeff","u16":[65535,65372,65372,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#fdfdfdff","out":{"hex":"#fffefeff","u16":[65471,65390,65390,65535]}}, +{"amount":0.75,"gain":1,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65407,65407,65407,65535]}}, +{"amount":0.75,"gain":2,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65407,65407,65407,65535]}}, +{"amount":0.9,"gain":0,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65470,65470,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65509,65477,65477,65535]}}, +{"amount":0.9,"gain":1,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65484,65484,65484,65535]}}, +{"amount":0.9,"gain":2,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65484,65484,65484,65535]}}, +{"amount":1,"gain":0,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#fefefeff","out":{"hex":"#fffdfdff","u16":[65535,65044,65044,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#fefefeff","out":{"hex":"#fefdfdff","u16":[65342,65097,65097,65535]}}, +{"amount":-0.5,"gain":1,"in":"#fefefeff","out":{"hex":"#fdfdfdff","u16":[65149,65149,65149,65535]}}, +{"amount":-0.5,"gain":2,"in":"#fefefeff","out":{"hex":"#fdfdfdff","u16":[65149,65149,65149,65535]}}, +{"amount":0,"gain":0,"in":"#fefefeff","out":{"hex":"#fffefeff","u16":[65535,65208,65208,65535]}}, +{"amount":0,"gain":0.5,"in":"#fefefeff","out":{"hex":"#fffefeff","u16":[65407,65243,65243,65535]}}, +{"amount":0,"gain":1,"in":"#fefefeff","out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]}}, +{"amount":0,"gain":2,"in":"#fefefeff","out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]}}, +{"amount":0.1,"gain":0,"in":"#fefefeff","out":{"hex":"#fffefeff","u16":[65535,65241,65241,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#fefefeff","out":{"hex":"#fffefeff","u16":[65420,65272,65272,65535]}}, +{"amount":0.1,"gain":1,"in":"#fefefeff","out":{"hex":"#fefefeff","u16":[65304,65304,65304,65535]}}, +{"amount":0.1,"gain":2,"in":"#fefefeff","out":{"hex":"#fefefeff","u16":[65304,65304,65304,65535]}}, +{"amount":0.25,"gain":0,"in":"#fefefeff","out":{"hex":"#fffefeff","u16":[65535,65290,65290,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#fefefeff","out":{"hex":"#fffefeff","u16":[65439,65316,65316,65535]}}, +{"amount":0.25,"gain":1,"in":"#fefefeff","out":{"hex":"#fefefeff","u16":[65342,65342,65342,65535]}}, +{"amount":0.25,"gain":2,"in":"#fefefeff","out":{"hex":"#fefefeff","u16":[65342,65342,65342,65535]}}, +{"amount":0.5,"gain":0,"in":"#fefefeff","out":{"hex":"#fffefeff","u16":[65535,65372,65372,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#fefefeff","out":{"hex":"#fffefeff","u16":[65471,65389,65389,65535]}}, +{"amount":0.5,"gain":1,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65407,65407,65407,65535]}}, +{"amount":0.5,"gain":2,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65407,65407,65407,65535]}}, +{"amount":0.75,"gain":0,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65454,65454,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65503,65462,65462,65535]}}, +{"amount":0.75,"gain":1,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65471,65471,65471,65535]}}, +{"amount":0.75,"gain":2,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65471,65471,65471,65535]}}, +{"amount":0.9,"gain":0,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65502,65502,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65522,65506,65506,65535]}}, +{"amount":0.9,"gain":1,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65509,65509,65509,65535]}}, +{"amount":0.9,"gain":2,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65509,65509,65509,65535]}}, +{"amount":1,"gain":0,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#ff0000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#ff0000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#ff0000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#ff0000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"gain":1,"in":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"gain":2,"in":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#ff0000ff","out":{"hex":"#ff5a5aff","u16":[65535,23011,23011,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#ff0000ff","out":{"hex":"#ff5a5aff","u16":[65535,23011,23011,65535]}}, +{"amount":0.1,"gain":1,"in":"#ff0000ff","out":{"hex":"#ff5a5aff","u16":[65535,23011,23011,65535]}}, +{"amount":0.1,"gain":2,"in":"#ff0000ff","out":{"hex":"#ff5a5aff","u16":[65535,23011,23011,65535]}}, +{"amount":0.25,"gain":0,"in":"#ff0000ff","out":{"hex":"#ff8888ff","u16":[65535,34899,34899,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#ff0000ff","out":{"hex":"#ff8888ff","u16":[65535,34899,34899,65535]}}, +{"amount":0.25,"gain":1,"in":"#ff0000ff","out":{"hex":"#ff8888ff","u16":[65535,34899,34899,65535]}}, +{"amount":0.25,"gain":2,"in":"#ff0000ff","out":{"hex":"#ff8888ff","u16":[65535,34899,34899,65535]}}, +{"amount":0.5,"gain":0,"in":"#ff0000ff","out":{"hex":"#ffbabaff","u16":[65535,47824,47824,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#ff0000ff","out":{"hex":"#ffbabaff","u16":[65535,47824,47824,65535]}}, +{"amount":0.5,"gain":1,"in":"#ff0000ff","out":{"hex":"#ffbabaff","u16":[65535,47824,47824,65535]}}, +{"amount":0.5,"gain":2,"in":"#ff0000ff","out":{"hex":"#ffbabaff","u16":[65535,47824,47824,65535]}}, +{"amount":0.75,"gain":0,"in":"#ff0000ff","out":{"hex":"#ffe0e0ff","u16":[65535,57502,57502,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#ff0000ff","out":{"hex":"#ffe0e0ff","u16":[65535,57502,57502,65535]}}, +{"amount":0.75,"gain":1,"in":"#ff0000ff","out":{"hex":"#ffe0e0ff","u16":[65535,57502,57502,65535]}}, +{"amount":0.75,"gain":2,"in":"#ff0000ff","out":{"hex":"#ffe0e0ff","u16":[65535,57502,57502,65535]}}, +{"amount":0.9,"gain":0,"in":"#ff0000ff","out":{"hex":"#fff3f3ff","u16":[65535,62470,62470,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#ff0000ff","out":{"hex":"#fff3f3ff","u16":[65535,62470,62470,65535]}}, +{"amount":0.9,"gain":1,"in":"#ff0000ff","out":{"hex":"#fff3f3ff","u16":[65535,62470,62470,65535]}}, +{"amount":0.9,"gain":2,"in":"#ff0000ff","out":{"hex":"#fff3f3ff","u16":[65535,62470,62470,65535]}}, +{"amount":1,"gain":0,"in":"#ff0000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#ff0000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#ff0000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#ff0000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#ff0000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#ff0000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#ff0000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#ff0000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#00ff00ff","out":{"hex":"#00e700ff","u16":[0,59244,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#00ff00ff","out":{"hex":"#00e700ff","u16":[0,59244,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#00ff00ff","out":{"hex":"#00e700ff","u16":[0,59244,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#00ff00ff","out":{"hex":"#00e700ff","u16":[0,59244,0,65535]}}, +{"amount":0,"gain":0,"in":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"gain":1,"in":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"gain":2,"in":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#00ff00ff","out":{"hex":"#5aff5aff","u16":[23011,65535,23011,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#00ff00ff","out":{"hex":"#5aff5aff","u16":[23011,65535,23011,65535]}}, +{"amount":0.1,"gain":1,"in":"#00ff00ff","out":{"hex":"#5aff5aff","u16":[23011,65535,23011,65535]}}, +{"amount":0.1,"gain":2,"in":"#00ff00ff","out":{"hex":"#5aff5aff","u16":[23011,65535,23011,65535]}}, +{"amount":0.25,"gain":0,"in":"#00ff00ff","out":{"hex":"#88ff88ff","u16":[34899,65535,34899,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#00ff00ff","out":{"hex":"#88ff88ff","u16":[34899,65535,34899,65535]}}, +{"amount":0.25,"gain":1,"in":"#00ff00ff","out":{"hex":"#88ff88ff","u16":[34899,65535,34899,65535]}}, +{"amount":0.25,"gain":2,"in":"#00ff00ff","out":{"hex":"#88ff88ff","u16":[34899,65535,34899,65535]}}, +{"amount":0.5,"gain":0,"in":"#00ff00ff","out":{"hex":"#baffbaff","u16":[47824,65535,47824,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#00ff00ff","out":{"hex":"#baffbaff","u16":[47824,65535,47824,65535]}}, +{"amount":0.5,"gain":1,"in":"#00ff00ff","out":{"hex":"#baffbaff","u16":[47824,65535,47824,65535]}}, +{"amount":0.5,"gain":2,"in":"#00ff00ff","out":{"hex":"#baffbaff","u16":[47824,65535,47824,65535]}}, +{"amount":0.75,"gain":0,"in":"#00ff00ff","out":{"hex":"#e0ffe0ff","u16":[57502,65535,57502,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#00ff00ff","out":{"hex":"#e0ffe0ff","u16":[57502,65535,57502,65535]}}, +{"amount":0.75,"gain":1,"in":"#00ff00ff","out":{"hex":"#e0ffe0ff","u16":[57502,65535,57502,65535]}}, +{"amount":0.75,"gain":2,"in":"#00ff00ff","out":{"hex":"#e0ffe0ff","u16":[57502,65535,57502,65535]}}, +{"amount":0.9,"gain":0,"in":"#00ff00ff","out":{"hex":"#f3fff3ff","u16":[62470,65535,62470,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#00ff00ff","out":{"hex":"#f3fff3ff","u16":[62470,65535,62470,65535]}}, +{"amount":0.9,"gain":1,"in":"#00ff00ff","out":{"hex":"#f3fff3ff","u16":[62470,65535,62470,65535]}}, +{"amount":0.9,"gain":2,"in":"#00ff00ff","out":{"hex":"#f3fff3ff","u16":[62470,65535,62470,65535]}}, +{"amount":1,"gain":0,"in":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#0000ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#0000ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#0000ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#0000ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"gain":0.5,"in":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"gain":1,"in":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"gain":2,"in":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"gain":0,"in":"#0000ffff","out":{"hex":"#5a5affff","u16":[23011,23011,65535,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#0000ffff","out":{"hex":"#5a5affff","u16":[23011,23011,65535,65535]}}, +{"amount":0.1,"gain":1,"in":"#0000ffff","out":{"hex":"#5a5affff","u16":[23011,23011,65535,65535]}}, +{"amount":0.1,"gain":2,"in":"#0000ffff","out":{"hex":"#5a5affff","u16":[23011,23011,65535,65535]}}, +{"amount":0.25,"gain":0,"in":"#0000ffff","out":{"hex":"#8888ffff","u16":[34899,34899,65535,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#0000ffff","out":{"hex":"#8888ffff","u16":[34899,34899,65535,65535]}}, +{"amount":0.25,"gain":1,"in":"#0000ffff","out":{"hex":"#8888ffff","u16":[34899,34899,65535,65535]}}, +{"amount":0.25,"gain":2,"in":"#0000ffff","out":{"hex":"#8888ffff","u16":[34899,34899,65535,65535]}}, +{"amount":0.5,"gain":0,"in":"#0000ffff","out":{"hex":"#babaffff","u16":[47824,47824,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#0000ffff","out":{"hex":"#babaffff","u16":[47824,47824,65535,65535]}}, +{"amount":0.5,"gain":1,"in":"#0000ffff","out":{"hex":"#babaffff","u16":[47824,47824,65535,65535]}}, +{"amount":0.5,"gain":2,"in":"#0000ffff","out":{"hex":"#babaffff","u16":[47824,47824,65535,65535]}}, +{"amount":0.75,"gain":0,"in":"#0000ffff","out":{"hex":"#e0e0ffff","u16":[57502,57502,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#0000ffff","out":{"hex":"#e0e0ffff","u16":[57502,57502,65535,65535]}}, +{"amount":0.75,"gain":1,"in":"#0000ffff","out":{"hex":"#e0e0ffff","u16":[57502,57502,65535,65535]}}, +{"amount":0.75,"gain":2,"in":"#0000ffff","out":{"hex":"#e0e0ffff","u16":[57502,57502,65535,65535]}}, +{"amount":0.9,"gain":0,"in":"#0000ffff","out":{"hex":"#f3f3ffff","u16":[62470,62470,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#0000ffff","out":{"hex":"#f3f3ffff","u16":[62470,62470,65535,65535]}}, +{"amount":0.9,"gain":1,"in":"#0000ffff","out":{"hex":"#f3f3ffff","u16":[62470,62470,65535,65535]}}, +{"amount":0.9,"gain":2,"in":"#0000ffff","out":{"hex":"#f3f3ffff","u16":[62470,62470,65535,65535]}}, +{"amount":1,"gain":0,"in":"#0000ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#0000ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#0000ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#0000ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#0000ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#0000ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#0000ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#0000ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#ffff00ff","out":{"hex":"#fafa00ff","u16":[64363,64363,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#ffff00ff","out":{"hex":"#fafa00ff","u16":[64363,64363,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#ffff00ff","out":{"hex":"#fafa00ff","u16":[64363,64363,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#ffff00ff","out":{"hex":"#fafa00ff","u16":[64363,64363,0,65535]}}, +{"amount":0,"gain":0,"in":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"gain":1,"in":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"gain":2,"in":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#ffff00ff","out":{"hex":"#ffff5aff","u16":[65535,65535,23011,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#ffff00ff","out":{"hex":"#ffff5aff","u16":[65535,65535,23011,65535]}}, +{"amount":0.1,"gain":1,"in":"#ffff00ff","out":{"hex":"#ffff5aff","u16":[65535,65535,23011,65535]}}, +{"amount":0.1,"gain":2,"in":"#ffff00ff","out":{"hex":"#ffff5aff","u16":[65535,65535,23011,65535]}}, +{"amount":0.25,"gain":0,"in":"#ffff00ff","out":{"hex":"#ffff88ff","u16":[65535,65535,34899,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#ffff00ff","out":{"hex":"#ffff88ff","u16":[65535,65535,34899,65535]}}, +{"amount":0.25,"gain":1,"in":"#ffff00ff","out":{"hex":"#ffff88ff","u16":[65535,65535,34899,65535]}}, +{"amount":0.25,"gain":2,"in":"#ffff00ff","out":{"hex":"#ffff88ff","u16":[65535,65535,34899,65535]}}, +{"amount":0.5,"gain":0,"in":"#ffff00ff","out":{"hex":"#ffffbaff","u16":[65535,65535,47824,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#ffff00ff","out":{"hex":"#ffffbaff","u16":[65535,65535,47824,65535]}}, +{"amount":0.5,"gain":1,"in":"#ffff00ff","out":{"hex":"#ffffbaff","u16":[65535,65535,47824,65535]}}, +{"amount":0.5,"gain":2,"in":"#ffff00ff","out":{"hex":"#ffffbaff","u16":[65535,65535,47824,65535]}}, +{"amount":0.75,"gain":0,"in":"#ffff00ff","out":{"hex":"#ffffe0ff","u16":[65535,65535,57502,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#ffff00ff","out":{"hex":"#ffffe0ff","u16":[65535,65535,57502,65535]}}, +{"amount":0.75,"gain":1,"in":"#ffff00ff","out":{"hex":"#ffffe0ff","u16":[65535,65535,57502,65535]}}, +{"amount":0.75,"gain":2,"in":"#ffff00ff","out":{"hex":"#ffffe0ff","u16":[65535,65535,57502,65535]}}, +{"amount":0.9,"gain":0,"in":"#ffff00ff","out":{"hex":"#fffff3ff","u16":[65535,65535,62470,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#ffff00ff","out":{"hex":"#fffff3ff","u16":[65535,65535,62470,65535]}}, +{"amount":0.9,"gain":1,"in":"#ffff00ff","out":{"hex":"#fffff3ff","u16":[65535,65535,62470,65535]}}, +{"amount":0.9,"gain":2,"in":"#ffff00ff","out":{"hex":"#fffff3ff","u16":[65535,65535,62470,65535]}}, +{"amount":1,"gain":0,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#00ffffff","out":{"hex":"#00efefff","u16":[0,61354,61354,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#00ffffff","out":{"hex":"#00efefff","u16":[0,61354,61354,65535]}}, +{"amount":-0.5,"gain":1,"in":"#00ffffff","out":{"hex":"#00efefff","u16":[0,61354,61354,65535]}}, +{"amount":-0.5,"gain":2,"in":"#00ffffff","out":{"hex":"#00efefff","u16":[0,61354,61354,65535]}}, +{"amount":0,"gain":0,"in":"#00ffffff","out":{"hex":"#00ffffff","u16":[0,65535,65535,65535]}}, +{"amount":0,"gain":0.5,"in":"#00ffffff","out":{"hex":"#00ffffff","u16":[0,65535,65535,65535]}}, +{"amount":0,"gain":1,"in":"#00ffffff","out":{"hex":"#00ffffff","u16":[0,65535,65535,65535]}}, +{"amount":0,"gain":2,"in":"#00ffffff","out":{"hex":"#00ffffff","u16":[0,65535,65535,65535]}}, +{"amount":0.1,"gain":0,"in":"#00ffffff","out":{"hex":"#5affffff","u16":[23011,65535,65535,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#00ffffff","out":{"hex":"#5affffff","u16":[23011,65535,65535,65535]}}, +{"amount":0.1,"gain":1,"in":"#00ffffff","out":{"hex":"#5affffff","u16":[23011,65535,65535,65535]}}, +{"amount":0.1,"gain":2,"in":"#00ffffff","out":{"hex":"#5affffff","u16":[23011,65535,65535,65535]}}, +{"amount":0.25,"gain":0,"in":"#00ffffff","out":{"hex":"#88ffffff","u16":[34899,65535,65535,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#00ffffff","out":{"hex":"#88ffffff","u16":[34899,65535,65535,65535]}}, +{"amount":0.25,"gain":1,"in":"#00ffffff","out":{"hex":"#88ffffff","u16":[34899,65535,65535,65535]}}, +{"amount":0.25,"gain":2,"in":"#00ffffff","out":{"hex":"#88ffffff","u16":[34899,65535,65535,65535]}}, +{"amount":0.5,"gain":0,"in":"#00ffffff","out":{"hex":"#baffffff","u16":[47824,65535,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#00ffffff","out":{"hex":"#baffffff","u16":[47824,65535,65535,65535]}}, +{"amount":0.5,"gain":1,"in":"#00ffffff","out":{"hex":"#baffffff","u16":[47824,65535,65535,65535]}}, +{"amount":0.5,"gain":2,"in":"#00ffffff","out":{"hex":"#baffffff","u16":[47824,65535,65535,65535]}}, +{"amount":0.75,"gain":0,"in":"#00ffffff","out":{"hex":"#e0ffffff","u16":[57502,65535,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#00ffffff","out":{"hex":"#e0ffffff","u16":[57502,65535,65535,65535]}}, +{"amount":0.75,"gain":1,"in":"#00ffffff","out":{"hex":"#e0ffffff","u16":[57502,65535,65535,65535]}}, +{"amount":0.75,"gain":2,"in":"#00ffffff","out":{"hex":"#e0ffffff","u16":[57502,65535,65535,65535]}}, +{"amount":0.9,"gain":0,"in":"#00ffffff","out":{"hex":"#f3ffffff","u16":[62470,65535,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#00ffffff","out":{"hex":"#f3ffffff","u16":[62470,65535,65535,65535]}}, +{"amount":0.9,"gain":1,"in":"#00ffffff","out":{"hex":"#f3ffffff","u16":[62470,65535,65535,65535]}}, +{"amount":0.9,"gain":2,"in":"#00ffffff","out":{"hex":"#f3ffffff","u16":[62470,65535,65535,65535]}}, +{"amount":1,"gain":0,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#ff00ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#ff00ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#ff00ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#ff00ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#ff00ffff","out":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]}}, +{"amount":0,"gain":0.5,"in":"#ff00ffff","out":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]}}, +{"amount":0,"gain":1,"in":"#ff00ffff","out":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]}}, +{"amount":0,"gain":2,"in":"#ff00ffff","out":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]}}, +{"amount":0.1,"gain":0,"in":"#ff00ffff","out":{"hex":"#ff5affff","u16":[65535,23011,65535,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#ff00ffff","out":{"hex":"#ff5affff","u16":[65535,23011,65535,65535]}}, +{"amount":0.1,"gain":1,"in":"#ff00ffff","out":{"hex":"#ff5affff","u16":[65535,23011,65535,65535]}}, +{"amount":0.1,"gain":2,"in":"#ff00ffff","out":{"hex":"#ff5affff","u16":[65535,23011,65535,65535]}}, +{"amount":0.25,"gain":0,"in":"#ff00ffff","out":{"hex":"#ff88ffff","u16":[65535,34899,65535,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#ff00ffff","out":{"hex":"#ff88ffff","u16":[65535,34899,65535,65535]}}, +{"amount":0.25,"gain":1,"in":"#ff00ffff","out":{"hex":"#ff88ffff","u16":[65535,34899,65535,65535]}}, +{"amount":0.25,"gain":2,"in":"#ff00ffff","out":{"hex":"#ff88ffff","u16":[65535,34899,65535,65535]}}, +{"amount":0.5,"gain":0,"in":"#ff00ffff","out":{"hex":"#ffbaffff","u16":[65535,47824,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#ff00ffff","out":{"hex":"#ffbaffff","u16":[65535,47824,65535,65535]}}, +{"amount":0.5,"gain":1,"in":"#ff00ffff","out":{"hex":"#ffbaffff","u16":[65535,47824,65535,65535]}}, +{"amount":0.5,"gain":2,"in":"#ff00ffff","out":{"hex":"#ffbaffff","u16":[65535,47824,65535,65535]}}, +{"amount":0.75,"gain":0,"in":"#ff00ffff","out":{"hex":"#ffe0ffff","u16":[65535,57502,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#ff00ffff","out":{"hex":"#ffe0ffff","u16":[65535,57502,65535,65535]}}, +{"amount":0.75,"gain":1,"in":"#ff00ffff","out":{"hex":"#ffe0ffff","u16":[65535,57502,65535,65535]}}, +{"amount":0.75,"gain":2,"in":"#ff00ffff","out":{"hex":"#ffe0ffff","u16":[65535,57502,65535,65535]}}, +{"amount":0.9,"gain":0,"in":"#ff00ffff","out":{"hex":"#fff3ffff","u16":[65535,62470,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#ff00ffff","out":{"hex":"#fff3ffff","u16":[65535,62470,65535,65535]}}, +{"amount":0.9,"gain":1,"in":"#ff00ffff","out":{"hex":"#fff3ffff","u16":[65535,62470,65535,65535]}}, +{"amount":0.9,"gain":2,"in":"#ff00ffff","out":{"hex":"#fff3ffff","u16":[65535,62470,65535,65535]}}, +{"amount":1,"gain":0,"in":"#ff00ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#ff00ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#ff00ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#ff00ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#ff00ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#ff00ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#ff00ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#ff00ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#800000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#800000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#800000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#800000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#800000ff","out":{"hex":"#800000ff","u16":[32896,0,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#800000ff","out":{"hex":"#800000ff","u16":[32896,0,0,65535]}}, +{"amount":0,"gain":1,"in":"#800000ff","out":{"hex":"#800000ff","u16":[32896,0,0,65535]}}, +{"amount":0,"gain":2,"in":"#800000ff","out":{"hex":"#800000ff","u16":[32896,0,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#800000ff","out":{"hex":"#d40000ff","u16":[54552,0,0,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#800000ff","out":{"hex":"#d40000ff","u16":[54552,0,0,65535]}}, +{"amount":0.1,"gain":1,"in":"#800000ff","out":{"hex":"#d40000ff","u16":[54552,0,0,65535]}}, +{"amount":0.1,"gain":2,"in":"#800000ff","out":{"hex":"#d40000ff","u16":[54552,0,0,65535]}}, +{"amount":0.25,"gain":0,"in":"#800000ff","out":{"hex":"#ff5656ff","u16":[65535,22149,22149,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#800000ff","out":{"hex":"#ff5656ff","u16":[65535,22149,22149,65535]}}, +{"amount":0.25,"gain":1,"in":"#800000ff","out":{"hex":"#ff5656ff","u16":[65535,22149,22149,65535]}}, +{"amount":0.25,"gain":2,"in":"#800000ff","out":{"hex":"#ff5656ff","u16":[65535,22149,22149,65535]}}, +{"amount":0.5,"gain":0,"in":"#800000ff","out":{"hex":"#ffa7a7ff","u16":[65535,42946,42946,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#800000ff","out":{"hex":"#ffa7a7ff","u16":[65535,42946,42946,65535]}}, +{"amount":0.5,"gain":1,"in":"#800000ff","out":{"hex":"#ffa7a7ff","u16":[65535,42946,42946,65535]}}, +{"amount":0.5,"gain":2,"in":"#800000ff","out":{"hex":"#ffa7a7ff","u16":[65535,42946,42946,65535]}}, +{"amount":0.75,"gain":0,"in":"#800000ff","out":{"hex":"#ffd8d8ff","u16":[65535,55630,55630,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#800000ff","out":{"hex":"#ffd8d8ff","u16":[65535,55630,55630,65535]}}, +{"amount":0.75,"gain":1,"in":"#800000ff","out":{"hex":"#ffd8d8ff","u16":[65535,55630,55630,65535]}}, +{"amount":0.75,"gain":2,"in":"#800000ff","out":{"hex":"#ffd8d8ff","u16":[65535,55630,55630,65535]}}, +{"amount":0.9,"gain":0,"in":"#800000ff","out":{"hex":"#fff0f0ff","u16":[65535,61801,61801,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#800000ff","out":{"hex":"#fff0f0ff","u16":[65535,61801,61801,65535]}}, +{"amount":0.9,"gain":1,"in":"#800000ff","out":{"hex":"#fff0f0ff","u16":[65535,61801,61801,65535]}}, +{"amount":0.9,"gain":2,"in":"#800000ff","out":{"hex":"#fff0f0ff","u16":[65535,61801,61801,65535]}}, +{"amount":1,"gain":0,"in":"#800000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#800000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#800000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#800000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#800000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#800000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#800000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#800000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#008000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#008000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#008000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#008000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#008000ff","out":{"hex":"#008000ff","u16":[0,32896,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#008000ff","out":{"hex":"#008000ff","u16":[0,32896,0,65535]}}, +{"amount":0,"gain":1,"in":"#008000ff","out":{"hex":"#008000ff","u16":[0,32896,0,65535]}}, +{"amount":0,"gain":2,"in":"#008000ff","out":{"hex":"#008000ff","u16":[0,32896,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#008000ff","out":{"hex":"#009c00ff","u16":[0,39993,0,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#008000ff","out":{"hex":"#009c00ff","u16":[0,39993,0,65535]}}, +{"amount":0.1,"gain":1,"in":"#008000ff","out":{"hex":"#009c00ff","u16":[0,39993,0,65535]}}, +{"amount":0.1,"gain":2,"in":"#008000ff","out":{"hex":"#009c00ff","u16":[0,39993,0,65535]}}, +{"amount":0.25,"gain":0,"in":"#008000ff","out":{"hex":"#00bc00ff","u16":[0,48436,0,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#008000ff","out":{"hex":"#00bc00ff","u16":[0,48436,0,65535]}}, +{"amount":0.25,"gain":1,"in":"#008000ff","out":{"hex":"#00bc00ff","u16":[0,48436,0,65535]}}, +{"amount":0.25,"gain":2,"in":"#008000ff","out":{"hex":"#00bc00ff","u16":[0,48436,0,65535]}}, +{"amount":0.5,"gain":0,"in":"#008000ff","out":{"hex":"#00e800ff","u16":[0,59511,0,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#008000ff","out":{"hex":"#00e800ff","u16":[0,59511,0,65535]}}, +{"amount":0.5,"gain":1,"in":"#008000ff","out":{"hex":"#00e800ff","u16":[0,59511,0,65535]}}, +{"amount":0.5,"gain":2,"in":"#008000ff","out":{"hex":"#00e800ff","u16":[0,59511,0,65535]}}, +{"amount":0.75,"gain":0,"in":"#008000ff","out":{"hex":"#8aff8aff","u16":[35527,65535,35527,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#008000ff","out":{"hex":"#8aff8aff","u16":[35527,65535,35527,65535]}}, +{"amount":0.75,"gain":1,"in":"#008000ff","out":{"hex":"#8aff8aff","u16":[35527,65535,35527,65535]}}, +{"amount":0.75,"gain":2,"in":"#008000ff","out":{"hex":"#8aff8aff","u16":[35527,65535,35527,65535]}}, +{"amount":0.9,"gain":0,"in":"#008000ff","out":{"hex":"#d9ffd9ff","u16":[55871,65535,55871,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#008000ff","out":{"hex":"#d9ffd9ff","u16":[55871,65535,55871,65535]}}, +{"amount":0.9,"gain":1,"in":"#008000ff","out":{"hex":"#d9ffd9ff","u16":[55871,65535,55871,65535]}}, +{"amount":0.9,"gain":2,"in":"#008000ff","out":{"hex":"#d9ffd9ff","u16":[55871,65535,55871,65535]}}, +{"amount":1,"gain":0,"in":"#008000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#008000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#008000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#008000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#008000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#008000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#008000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#008000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#000080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#000080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#000080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#000080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#000080ff","out":{"hex":"#000080ff","u16":[0,0,32896,65535]}}, +{"amount":0,"gain":0.5,"in":"#000080ff","out":{"hex":"#000080ff","u16":[0,0,32896,65535]}}, +{"amount":0,"gain":1,"in":"#000080ff","out":{"hex":"#000080ff","u16":[0,0,32896,65535]}}, +{"amount":0,"gain":2,"in":"#000080ff","out":{"hex":"#000080ff","u16":[0,0,32896,65535]}}, +{"amount":0.1,"gain":0,"in":"#000080ff","out":{"hex":"#3e3effff","u16":[16061,16061,65535,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#000080ff","out":{"hex":"#3e3effff","u16":[16061,16061,65535,65535]}}, +{"amount":0.1,"gain":1,"in":"#000080ff","out":{"hex":"#3e3effff","u16":[16061,16061,65535,65535]}}, +{"amount":0.1,"gain":2,"in":"#000080ff","out":{"hex":"#3e3effff","u16":[16061,16061,65535,65535]}}, +{"amount":0.25,"gain":0,"in":"#000080ff","out":{"hex":"#7c7cffff","u16":[31849,31849,65535,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#000080ff","out":{"hex":"#7c7cffff","u16":[31849,31849,65535,65535]}}, +{"amount":0.25,"gain":1,"in":"#000080ff","out":{"hex":"#7c7cffff","u16":[31849,31849,65535,65535]}}, +{"amount":0.25,"gain":2,"in":"#000080ff","out":{"hex":"#7c7cffff","u16":[31849,31849,65535,65535]}}, +{"amount":0.5,"gain":0,"in":"#000080ff","out":{"hex":"#b5b5ffff","u16":[46481,46481,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#000080ff","out":{"hex":"#b5b5ffff","u16":[46481,46481,65535,65535]}}, +{"amount":0.5,"gain":1,"in":"#000080ff","out":{"hex":"#b5b5ffff","u16":[46481,46481,65535,65535]}}, +{"amount":0.5,"gain":2,"in":"#000080ff","out":{"hex":"#b5b5ffff","u16":[46481,46481,65535,65535]}}, +{"amount":0.75,"gain":0,"in":"#000080ff","out":{"hex":"#dedeffff","u16":[56970,56970,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#000080ff","out":{"hex":"#dedeffff","u16":[56970,56970,65535,65535]}}, +{"amount":0.75,"gain":1,"in":"#000080ff","out":{"hex":"#dedeffff","u16":[56970,56970,65535,65535]}}, +{"amount":0.75,"gain":2,"in":"#000080ff","out":{"hex":"#dedeffff","u16":[56970,56970,65535,65535]}}, +{"amount":0.9,"gain":0,"in":"#000080ff","out":{"hex":"#f2f2ffff","u16":[62278,62278,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#000080ff","out":{"hex":"#f2f2ffff","u16":[62278,62278,65535,65535]}}, +{"amount":0.9,"gain":1,"in":"#000080ff","out":{"hex":"#f2f2ffff","u16":[62278,62278,65535,65535]}}, +{"amount":0.9,"gain":2,"in":"#000080ff","out":{"hex":"#f2f2ffff","u16":[62278,62278,65535,65535]}}, +{"amount":1,"gain":0,"in":"#000080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#000080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#000080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#000080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#000080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#000080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#000080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#000080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#ff8080ff","out":{"hex":"#a20000ff","u16":[41589,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#ff8080ff","out":{"hex":"#a20000ff","u16":[41589,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#ff8080ff","out":{"hex":"#a20000ff","u16":[41589,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#ff8080ff","out":{"hex":"#a20000ff","u16":[41589,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#ff8080ff","out":{"hex":"#ff8080ff","u16":[65535,32896,32896,65535]}}, +{"amount":0,"gain":0.5,"in":"#ff8080ff","out":{"hex":"#ff8080ff","u16":[65535,32896,32896,65535]}}, +{"amount":0,"gain":1,"in":"#ff8080ff","out":{"hex":"#ff8080ff","u16":[65535,32896,32896,65535]}}, +{"amount":0,"gain":2,"in":"#ff8080ff","out":{"hex":"#ff8080ff","u16":[65535,32896,32896,65535]}}, +{"amount":0.1,"gain":0,"in":"#ff8080ff","out":{"hex":"#ff9393ff","u16":[65535,37774,37774,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#ff8080ff","out":{"hex":"#ff9393ff","u16":[65535,37774,37774,65535]}}, +{"amount":0.1,"gain":1,"in":"#ff8080ff","out":{"hex":"#ff9393ff","u16":[65535,37774,37774,65535]}}, +{"amount":0.1,"gain":2,"in":"#ff8080ff","out":{"hex":"#ff9393ff","u16":[65535,37774,37774,65535]}}, +{"amount":0.25,"gain":0,"in":"#ff8080ff","out":{"hex":"#ffababff","u16":[65535,43923,43923,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#ff8080ff","out":{"hex":"#ffababff","u16":[65535,43923,43923,65535]}}, +{"amount":0.25,"gain":1,"in":"#ff8080ff","out":{"hex":"#ffababff","u16":[65535,43923,43923,65535]}}, +{"amount":0.25,"gain":2,"in":"#ff8080ff","out":{"hex":"#ffababff","u16":[65535,43923,43923,65535]}}, +{"amount":0.5,"gain":0,"in":"#ff8080ff","out":{"hex":"#ffccccff","u16":[65535,52338,52338,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#ff8080ff","out":{"hex":"#ffccccff","u16":[65535,52338,52338,65535]}}, +{"amount":0.5,"gain":1,"in":"#ff8080ff","out":{"hex":"#ffccccff","u16":[65535,52338,52338,65535]}}, +{"amount":0.5,"gain":2,"in":"#ff8080ff","out":{"hex":"#ffccccff","u16":[65535,52338,52338,65535]}}, +{"amount":0.75,"gain":0,"in":"#ff8080ff","out":{"hex":"#ffe7e7ff","u16":[65535,59378,59378,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#ff8080ff","out":{"hex":"#ffe7e7ff","u16":[65535,59378,59378,65535]}}, +{"amount":0.75,"gain":1,"in":"#ff8080ff","out":{"hex":"#ffe7e7ff","u16":[65535,59378,59378,65535]}}, +{"amount":0.75,"gain":2,"in":"#ff8080ff","out":{"hex":"#ffe7e7ff","u16":[65535,59378,59378,65535]}}, +{"amount":0.9,"gain":0,"in":"#ff8080ff","out":{"hex":"#fff6f6ff","u16":[65535,63158,63158,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#ff8080ff","out":{"hex":"#fff6f6ff","u16":[65535,63158,63158,65535]}}, +{"amount":0.9,"gain":1,"in":"#ff8080ff","out":{"hex":"#fff6f6ff","u16":[65535,63158,63158,65535]}}, +{"amount":0.9,"gain":2,"in":"#ff8080ff","out":{"hex":"#fff6f6ff","u16":[65535,63158,63158,65535]}}, +{"amount":1,"gain":0,"in":"#ff8080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#ff8080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#ff8080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#ff8080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#ff8080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#ff8080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#ff8080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#ff8080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#80ff80ff","out":{"hex":"#00f700ff","u16":[0,63471,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#80ff80ff","out":{"hex":"#00f700ff","u16":[0,63471,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#80ff80ff","out":{"hex":"#00f700ff","u16":[0,63471,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#80ff80ff","out":{"hex":"#00f700ff","u16":[0,63471,0,65535]}}, +{"amount":0,"gain":0,"in":"#80ff80ff","out":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]}}, +{"amount":0,"gain":0.5,"in":"#80ff80ff","out":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]}}, +{"amount":0,"gain":1,"in":"#80ff80ff","out":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]}}, +{"amount":0,"gain":2,"in":"#80ff80ff","out":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]}}, +{"amount":0.1,"gain":0,"in":"#80ff80ff","out":{"hex":"#93ff93ff","u16":[37774,65535,37774,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#80ff80ff","out":{"hex":"#93ff93ff","u16":[37774,65535,37774,65535]}}, +{"amount":0.1,"gain":1,"in":"#80ff80ff","out":{"hex":"#93ff93ff","u16":[37774,65535,37774,65535]}}, +{"amount":0.1,"gain":2,"in":"#80ff80ff","out":{"hex":"#93ff93ff","u16":[37774,65535,37774,65535]}}, +{"amount":0.25,"gain":0,"in":"#80ff80ff","out":{"hex":"#abffabff","u16":[43923,65535,43923,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#80ff80ff","out":{"hex":"#abffabff","u16":[43923,65535,43923,65535]}}, +{"amount":0.25,"gain":1,"in":"#80ff80ff","out":{"hex":"#abffabff","u16":[43923,65535,43923,65535]}}, +{"amount":0.25,"gain":2,"in":"#80ff80ff","out":{"hex":"#abffabff","u16":[43923,65535,43923,65535]}}, +{"amount":0.5,"gain":0,"in":"#80ff80ff","out":{"hex":"#ccffccff","u16":[52338,65535,52338,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#80ff80ff","out":{"hex":"#ccffccff","u16":[52338,65535,52338,65535]}}, +{"amount":0.5,"gain":1,"in":"#80ff80ff","out":{"hex":"#ccffccff","u16":[52338,65535,52338,65535]}}, +{"amount":0.5,"gain":2,"in":"#80ff80ff","out":{"hex":"#ccffccff","u16":[52338,65535,52338,65535]}}, +{"amount":0.75,"gain":0,"in":"#80ff80ff","out":{"hex":"#e7ffe7ff","u16":[59378,65535,59378,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#80ff80ff","out":{"hex":"#e7ffe7ff","u16":[59378,65535,59378,65535]}}, +{"amount":0.75,"gain":1,"in":"#80ff80ff","out":{"hex":"#e7ffe7ff","u16":[59378,65535,59378,65535]}}, +{"amount":0.75,"gain":2,"in":"#80ff80ff","out":{"hex":"#e7ffe7ff","u16":[59378,65535,59378,65535]}}, +{"amount":0.9,"gain":0,"in":"#80ff80ff","out":{"hex":"#f6fff6ff","u16":[63158,65535,63158,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#80ff80ff","out":{"hex":"#f6fff6ff","u16":[63158,65535,63158,65535]}}, +{"amount":0.9,"gain":1,"in":"#80ff80ff","out":{"hex":"#f6fff6ff","u16":[63158,65535,63158,65535]}}, +{"amount":0.9,"gain":2,"in":"#80ff80ff","out":{"hex":"#f6fff6ff","u16":[63158,65535,63158,65535]}}, +{"amount":1,"gain":0,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#8080ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#8080ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#8080ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#8080ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#8080ffff","out":{"hex":"#8080ffff","u16":[32896,32896,65535,65535]}}, +{"amount":0,"gain":0.5,"in":"#8080ffff","out":{"hex":"#8080ffff","u16":[32896,32896,65535,65535]}}, +{"amount":0,"gain":1,"in":"#8080ffff","out":{"hex":"#8080ffff","u16":[32896,32896,65535,65535]}}, +{"amount":0,"gain":2,"in":"#8080ffff","out":{"hex":"#8080ffff","u16":[32896,32896,65535,65535]}}, +{"amount":0.1,"gain":0,"in":"#8080ffff","out":{"hex":"#9393ffff","u16":[37774,37774,65535,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#8080ffff","out":{"hex":"#9393ffff","u16":[37774,37774,65535,65535]}}, +{"amount":0.1,"gain":1,"in":"#8080ffff","out":{"hex":"#9393ffff","u16":[37774,37774,65535,65535]}}, +{"amount":0.1,"gain":2,"in":"#8080ffff","out":{"hex":"#9393ffff","u16":[37774,37774,65535,65535]}}, +{"amount":0.25,"gain":0,"in":"#8080ffff","out":{"hex":"#ababffff","u16":[43923,43923,65535,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#8080ffff","out":{"hex":"#ababffff","u16":[43923,43923,65535,65535]}}, +{"amount":0.25,"gain":1,"in":"#8080ffff","out":{"hex":"#ababffff","u16":[43923,43923,65535,65535]}}, +{"amount":0.25,"gain":2,"in":"#8080ffff","out":{"hex":"#ababffff","u16":[43923,43923,65535,65535]}}, +{"amount":0.5,"gain":0,"in":"#8080ffff","out":{"hex":"#ccccffff","u16":[52338,52338,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#8080ffff","out":{"hex":"#ccccffff","u16":[52338,52338,65535,65535]}}, +{"amount":0.5,"gain":1,"in":"#8080ffff","out":{"hex":"#ccccffff","u16":[52338,52338,65535,65535]}}, +{"amount":0.5,"gain":2,"in":"#8080ffff","out":{"hex":"#ccccffff","u16":[52338,52338,65535,65535]}}, +{"amount":0.75,"gain":0,"in":"#8080ffff","out":{"hex":"#e7e7ffff","u16":[59378,59378,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#8080ffff","out":{"hex":"#e7e7ffff","u16":[59378,59378,65535,65535]}}, +{"amount":0.75,"gain":1,"in":"#8080ffff","out":{"hex":"#e7e7ffff","u16":[59378,59378,65535,65535]}}, +{"amount":0.75,"gain":2,"in":"#8080ffff","out":{"hex":"#e7e7ffff","u16":[59378,59378,65535,65535]}}, +{"amount":0.9,"gain":0,"in":"#8080ffff","out":{"hex":"#f6f6ffff","u16":[63158,63158,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#8080ffff","out":{"hex":"#f6f6ffff","u16":[63158,63158,65535,65535]}}, +{"amount":0.9,"gain":1,"in":"#8080ffff","out":{"hex":"#f6f6ffff","u16":[63158,63158,65535,65535]}}, +{"amount":0.9,"gain":2,"in":"#8080ffff","out":{"hex":"#f6f6ffff","u16":[63158,63158,65535,65535]}}, +{"amount":1,"gain":0,"in":"#8080ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#8080ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#8080ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#8080ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#8080ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#8080ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#8080ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#8080ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#030201ff","out":{"hex":"#030200ff","u16":[806,502,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#030201ff","out":{"hex":"#030201ff","u16":[789,508,188,65535]}}, +{"amount":0,"gain":1,"in":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"gain":2,"in":"#030201ff","out":{"hex":"#030201ff","u16":[734,526,352,65535]}}, +{"amount":0.1,"gain":0,"in":"#030201ff","out":{"hex":"#7f4f00ff","u16":[32614,20291,0,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#030201ff","out":{"hex":"#7c501eff","u16":[31914,20545,7588,65535]}}, +{"amount":0.1,"gain":1,"in":"#030201ff","out":{"hex":"#795128ff","u16":[31194,20796,10398,65535]}}, +{"amount":0.1,"gain":2,"in":"#030201ff","out":{"hex":"#745337ff","u16":[29692,21287,14249,65535]}}, +{"amount":0.25,"gain":0,"in":"#030201ff","out":{"hex":"#c07800ff","u16":[49460,30772,0,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#030201ff","out":{"hex":"#bc792dff","u16":[48397,31157,11507,65535]}}, +{"amount":0.25,"gain":1,"in":"#030201ff","out":{"hex":"#b87b3dff","u16":[47306,31538,15769,65535]}}, +{"amount":0.25,"gain":2,"in":"#030201ff","out":{"hex":"#af7e54ff","u16":[45029,32282,21609,65535]}}, +{"amount":0.5,"gain":0,"in":"#030201ff","out":{"hex":"#ffa74aff","u16":[65535,42972,19121,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#030201ff","out":{"hex":"#faa95bff","u16":[64222,43420,23454,65535]}}, +{"amount":0.5,"gain":1,"in":"#030201ff","out":{"hex":"#f5ab69ff","u16":[62877,43863,26990,65535]}}, +{"amount":0.5,"gain":2,"in":"#030201ff","out":{"hex":"#eaae7fff","u16":[60076,44734,32760,65535]}}, +{"amount":0.75,"gain":0,"in":"#030201ff","out":{"hex":"#ffd8c0ff","u16":[65535,55639,49245,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#030201ff","out":{"hex":"#fcd9c3ff","u16":[64883,55804,50029,65535]}}, +{"amount":0.75,"gain":1,"in":"#030201ff","out":{"hex":"#fadac6ff","u16":[64222,55969,50799,65535]}}, +{"amount":0.75,"gain":2,"in":"#030201ff","out":{"hex":"#f5dbcbff","u16":[62877,56296,52299,65535]}}, +{"amount":0.9,"gain":0,"in":"#030201ff","out":{"hex":"#fff0e8ff","u16":[65535,61805,59660,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#030201ff","out":{"hex":"#fef1e9ff","u16":[65275,61863,59911,65535]}}, +{"amount":0.9,"gain":1,"in":"#030201ff","out":{"hex":"#fdf1eaff","u16":[65014,61921,60160,65535]}}, +{"amount":0.9,"gain":2,"in":"#030201ff","out":{"hex":"#fbf1ecff","u16":[64487,62037,60656,65535]}}, +{"amount":1,"gain":0,"in":"#030201ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#030201ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#030201ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#030201ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#030201ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#030201ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#030201ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#030201ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#fffefdff","out":{"hex":"#fffdfcff","u16":[65535,65149,64762,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#fffefdff","out":{"hex":"#fffdfcff","u16":[65535,65149,64762,65535]}}, +{"amount":-0.5,"gain":1,"in":"#fffefdff","out":{"hex":"#fffdfcff","u16":[65535,65149,64762,65535]}}, +{"amount":-0.5,"gain":2,"in":"#fffefdff","out":{"hex":"#fffdfcff","u16":[65535,65149,64762,65535]}}, +{"amount":0,"gain":0,"in":"#fffefdff","out":{"hex":"#fffefdff","u16":[65535,65278,65021,65535]}}, +{"amount":0,"gain":0.5,"in":"#fffefdff","out":{"hex":"#fffefdff","u16":[65535,65278,65021,65535]}}, +{"amount":0,"gain":1,"in":"#fffefdff","out":{"hex":"#fffefdff","u16":[65535,65278,65021,65535]}}, +{"amount":0,"gain":2,"in":"#fffefdff","out":{"hex":"#fffefdff","u16":[65535,65278,65021,65535]}}, +{"amount":0.1,"gain":0,"in":"#fffefdff","out":{"hex":"#fffefdff","u16":[65535,65304,65073,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#fffefdff","out":{"hex":"#fffefdff","u16":[65535,65304,65073,65535]}}, +{"amount":0.1,"gain":1,"in":"#fffefdff","out":{"hex":"#fffefdff","u16":[65535,65304,65073,65535]}}, +{"amount":0.1,"gain":2,"in":"#fffefdff","out":{"hex":"#fffefdff","u16":[65535,65304,65073,65535]}}, +{"amount":0.25,"gain":0,"in":"#fffefdff","out":{"hex":"#fffefeff","u16":[65535,65342,65150,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#fffefdff","out":{"hex":"#fffefeff","u16":[65535,65342,65150,65535]}}, +{"amount":0.25,"gain":1,"in":"#fffefdff","out":{"hex":"#fffefeff","u16":[65535,65342,65150,65535]}}, +{"amount":0.25,"gain":2,"in":"#fffefdff","out":{"hex":"#fffefeff","u16":[65535,65342,65150,65535]}}, +{"amount":0.5,"gain":0,"in":"#fffefdff","out":{"hex":"#fffffeff","u16":[65535,65407,65279,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#fffefdff","out":{"hex":"#fffffeff","u16":[65535,65407,65279,65535]}}, +{"amount":0.5,"gain":1,"in":"#fffefdff","out":{"hex":"#fffffeff","u16":[65535,65407,65279,65535]}}, +{"amount":0.5,"gain":2,"in":"#fffefdff","out":{"hex":"#fffffeff","u16":[65535,65407,65279,65535]}}, +{"amount":0.75,"gain":0,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65471,65407,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65471,65407,65535]}}, +{"amount":0.75,"gain":1,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65471,65407,65535]}}, +{"amount":0.75,"gain":2,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65471,65407,65535]}}, +{"amount":0.9,"gain":0,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65509,65484,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65509,65484,65535]}}, +{"amount":0.9,"gain":1,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65509,65484,65535]}}, +{"amount":0.9,"gain":2,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65509,65484,65535]}}, +{"amount":1,"gain":0,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#7f8081ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#7f8081ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#7f8081ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#7f8081ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#7f8081ff","out":{"hex":"#0089bcff","u16":[0,35187,48321,65535]}}, +{"amount":0,"gain":0.5,"in":"#7f8081ff","out":{"hex":"#5d85a2ff","u16":[23818,34065,41574,65535]}}, +{"amount":0,"gain":1,"in":"#7f8081ff","out":{"hex":"#7f8081ff","u16":[32639,32896,33153,65535]}}, +{"amount":0,"gain":2,"in":"#7f8081ff","out":{"hex":"#808080ff","u16":[32860,32860,32860,65535]}}, +{"amount":0.1,"gain":0,"in":"#7f8081ff","out":{"hex":"#009dd8ff","u16":[0,40419,55507,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#7f8081ff","out":{"hex":"#6a98baff","u16":[27360,39130,47756,65535]}}, +{"amount":0.1,"gain":1,"in":"#7f8081ff","out":{"hex":"#929394ff","u16":[37493,37788,38083,65535]}}, +{"amount":0.1,"gain":2,"in":"#7f8081ff","out":{"hex":"#939393ff","u16":[37747,37747,37747,65535]}}, +{"amount":0.25,"gain":0,"in":"#7f8081ff","out":{"hex":"#00b7fbff","u16":[0,47012,64561,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#7f8081ff","out":{"hex":"#7cb1d8ff","u16":[31822,45513,55545,65535]}}, +{"amount":0.25,"gain":1,"in":"#7f8081ff","out":{"hex":"#aaabacff","u16":[43608,43951,44295,65535]}}, +{"amount":0.25,"gain":2,"in":"#7f8081ff","out":{"hex":"#abababff","u16":[43904,43904,43904,65535]}}, +{"amount":0.5,"gain":0,"in":"#7f8081ff","out":{"hex":"#97d3ffff","u16":[38885,54143,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#7f8081ff","out":{"hex":"#b3cfe7ff","u16":[46098,53258,59470,65535]}}, +{"amount":0.5,"gain":1,"in":"#7f8081ff","out":{"hex":"#cbccccff","u16":[52159,52355,52552,65535]}}, +{"amount":0.5,"gain":2,"in":"#7f8081ff","out":{"hex":"#ccccccff","u16":[52328,52328,52328,65535]}}, +{"amount":0.75,"gain":0,"in":"#7f8081ff","out":{"hex":"#d3eaffff","u16":[54203,60163,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#7f8081ff","out":{"hex":"#dde9f4ff","u16":[56821,59776,62591,65535]}}, +{"amount":0.75,"gain":1,"in":"#7f8081ff","out":{"hex":"#e7e7e7ff","u16":[59301,59385,59470,65535]}}, +{"amount":0.75,"gain":2,"in":"#7f8081ff","out":{"hex":"#e7e7e7ff","u16":[59373,59373,59373,65535]}}, +{"amount":0.9,"gain":0,"in":"#7f8081ff","out":{"hex":"#eff7ffff","u16":[61304,63452,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#7f8081ff","out":{"hex":"#f2f6faff","u16":[62225,63307,64377,65535]}}, +{"amount":0.9,"gain":1,"in":"#7f8081ff","out":{"hex":"#f6f6f6ff","u16":[63130,63161,63193,65535]}}, +{"amount":0.9,"gain":2,"in":"#7f8081ff","out":{"hex":"#f6f6f6ff","u16":[63157,63157,63157,65535]}}, +{"amount":1,"gain":0,"in":"#7f8081ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#7f8081ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#7f8081ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#7f8081ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#7f8081ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#7f8081ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#7f8081ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#7f8081ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#010000ff","out":{"hex":"#010000ff","u16":[257,0,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#010000ff","out":{"hex":"#010000ff","u16":[257,0,0,65535]}}, +{"amount":0,"gain":1,"in":"#010000ff","out":{"hex":"#010000ff","u16":[257,0,0,65535]}}, +{"amount":0,"gain":2,"in":"#010000ff","out":{"hex":"#010000ff","u16":[257,0,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#010000ff","out":{"hex":"#b50000ff","u16":[46514,0,0,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#010000ff","out":{"hex":"#b50000ff","u16":[46514,0,0,65535]}}, +{"amount":0.1,"gain":1,"in":"#010000ff","out":{"hex":"#b50000ff","u16":[46514,0,0,65535]}}, +{"amount":0.1,"gain":2,"in":"#010000ff","out":{"hex":"#b50000ff","u16":[46514,0,0,65535]}}, +{"amount":0.25,"gain":0,"in":"#010000ff","out":{"hex":"#ff4040ff","u16":[65535,16405,16405,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#010000ff","out":{"hex":"#ff4040ff","u16":[65535,16405,16405,65535]}}, +{"amount":0.25,"gain":1,"in":"#010000ff","out":{"hex":"#ff4040ff","u16":[65535,16405,16405,65535]}}, +{"amount":0.25,"gain":2,"in":"#010000ff","out":{"hex":"#ff4040ff","u16":[65535,16405,16405,65535]}}, +{"amount":0.5,"gain":0,"in":"#010000ff","out":{"hex":"#ffa1a1ff","u16":[65535,41449,41449,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#010000ff","out":{"hex":"#ffa1a1ff","u16":[65535,41449,41449,65535]}}, +{"amount":0.5,"gain":1,"in":"#010000ff","out":{"hex":"#ffa1a1ff","u16":[65535,41449,41449,65535]}}, +{"amount":0.5,"gain":2,"in":"#010000ff","out":{"hex":"#ffa1a1ff","u16":[65535,41449,41449,65535]}}, +{"amount":0.75,"gain":0,"in":"#010000ff","out":{"hex":"#ffd6d6ff","u16":[65535,55089,55089,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#010000ff","out":{"hex":"#ffd6d6ff","u16":[65535,55089,55089,65535]}}, +{"amount":0.75,"gain":1,"in":"#010000ff","out":{"hex":"#ffd6d6ff","u16":[65535,55089,55089,65535]}}, +{"amount":0.75,"gain":2,"in":"#010000ff","out":{"hex":"#ffd6d6ff","u16":[65535,55089,55089,65535]}}, +{"amount":0.9,"gain":0,"in":"#010000ff","out":{"hex":"#fff0f0ff","u16":[65535,61611,61611,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#010000ff","out":{"hex":"#fff0f0ff","u16":[65535,61611,61611,65535]}}, +{"amount":0.9,"gain":1,"in":"#010000ff","out":{"hex":"#fff0f0ff","u16":[65535,61611,61611,65535]}}, +{"amount":0.9,"gain":2,"in":"#010000ff","out":{"hex":"#fff0f0ff","u16":[65535,61611,61611,65535]}}, +{"amount":1,"gain":0,"in":"#010000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#010000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#010000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#010000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#010000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#010000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#010000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#010000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#000001ff","out":{"hex":"#000001ff","u16":[0,0,257,65535]}}, +{"amount":0,"gain":0.5,"in":"#000001ff","out":{"hex":"#000001ff","u16":[0,0,257,65535]}}, +{"amount":0,"gain":1,"in":"#000001ff","out":{"hex":"#000001ff","u16":[0,0,257,65535]}}, +{"amount":0,"gain":2,"in":"#000001ff","out":{"hex":"#000001ff","u16":[0,0,257,65535]}}, +{"amount":0.1,"gain":0,"in":"#000001ff","out":{"hex":"#3434ffff","u16":[13305,13305,65535,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#000001ff","out":{"hex":"#3434ffff","u16":[13305,13305,65535,65535]}}, +{"amount":0.1,"gain":1,"in":"#000001ff","out":{"hex":"#3434ffff","u16":[13305,13305,65535,65535]}}, +{"amount":0.1,"gain":2,"in":"#000001ff","out":{"hex":"#3434ffff","u16":[13305,13305,65535,65535]}}, +{"amount":0.25,"gain":0,"in":"#000001ff","out":{"hex":"#7878ffff","u16":[30926,30926,65535,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#000001ff","out":{"hex":"#7878ffff","u16":[30926,30926,65535,65535]}}, +{"amount":0.25,"gain":1,"in":"#000001ff","out":{"hex":"#7878ffff","u16":[30926,30926,65535,65535]}}, +{"amount":0.25,"gain":2,"in":"#000001ff","out":{"hex":"#7878ffff","u16":[30926,30926,65535,65535]}}, +{"amount":0.5,"gain":0,"in":"#000001ff","out":{"hex":"#b3b3ffff","u16":[46094,46094,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#000001ff","out":{"hex":"#b3b3ffff","u16":[46094,46094,65535,65535]}}, +{"amount":0.5,"gain":1,"in":"#000001ff","out":{"hex":"#b3b3ffff","u16":[46094,46094,65535,65535]}}, +{"amount":0.5,"gain":2,"in":"#000001ff","out":{"hex":"#b3b3ffff","u16":[46094,46094,65535,65535]}}, +{"amount":0.75,"gain":0,"in":"#000001ff","out":{"hex":"#ddddffff","u16":[56819,56819,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#000001ff","out":{"hex":"#ddddffff","u16":[56819,56819,65535,65535]}}, +{"amount":0.75,"gain":1,"in":"#000001ff","out":{"hex":"#ddddffff","u16":[56819,56819,65535,65535]}}, +{"amount":0.75,"gain":2,"in":"#000001ff","out":{"hex":"#ddddffff","u16":[56819,56819,65535,65535]}}, +{"amount":0.9,"gain":0,"in":"#000001ff","out":{"hex":"#f2f2ffff","u16":[62224,62224,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#000001ff","out":{"hex":"#f2f2ffff","u16":[62224,62224,65535,65535]}}, +{"amount":0.9,"gain":1,"in":"#000001ff","out":{"hex":"#f2f2ffff","u16":[62224,62224,65535,65535]}}, +{"amount":0.9,"gain":2,"in":"#000001ff","out":{"hex":"#f2f2ffff","u16":[62224,62224,65535,65535]}}, +{"amount":1,"gain":0,"in":"#000001ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#000001ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#000001ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#000001ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#000001ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#000001ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#000001ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#000001ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#fefffeff","out":{"hex":"#fdfffdff","u16":[65149,65535,65149,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#fefffeff","out":{"hex":"#fdfffdff","u16":[65149,65535,65149,65535]}}, +{"amount":-0.5,"gain":1,"in":"#fefffeff","out":{"hex":"#fdfffdff","u16":[65149,65535,65149,65535]}}, +{"amount":-0.5,"gain":2,"in":"#fefffeff","out":{"hex":"#fdfffdff","u16":[65149,65535,65149,65535]}}, +{"amount":0,"gain":0,"in":"#fefffeff","out":{"hex":"#fefffeff","u16":[65278,65535,65278,65535]}}, +{"amount":0,"gain":0.5,"in":"#fefffeff","out":{"hex":"#fefffeff","u16":[65278,65535,65278,65535]}}, +{"amount":0,"gain":1,"in":"#fefffeff","out":{"hex":"#fefffeff","u16":[65278,65535,65278,65535]}}, +{"amount":0,"gain":2,"in":"#fefffeff","out":{"hex":"#fefffeff","u16":[65278,65535,65278,65535]}}, +{"amount":0.1,"gain":0,"in":"#fefffeff","out":{"hex":"#fefffeff","u16":[65304,65535,65304,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#fefffeff","out":{"hex":"#fefffeff","u16":[65304,65535,65304,65535]}}, +{"amount":0.1,"gain":1,"in":"#fefffeff","out":{"hex":"#fefffeff","u16":[65304,65535,65304,65535]}}, +{"amount":0.1,"gain":2,"in":"#fefffeff","out":{"hex":"#fefffeff","u16":[65304,65535,65304,65535]}}, +{"amount":0.25,"gain":0,"in":"#fefffeff","out":{"hex":"#fefffeff","u16":[65342,65535,65342,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#fefffeff","out":{"hex":"#fefffeff","u16":[65342,65535,65342,65535]}}, +{"amount":0.25,"gain":1,"in":"#fefffeff","out":{"hex":"#fefffeff","u16":[65342,65535,65342,65535]}}, +{"amount":0.25,"gain":2,"in":"#fefffeff","out":{"hex":"#fefffeff","u16":[65342,65535,65342,65535]}}, +{"amount":0.5,"gain":0,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65407,65535,65407,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65407,65535,65407,65535]}}, +{"amount":0.5,"gain":1,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65407,65535,65407,65535]}}, +{"amount":0.5,"gain":2,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65407,65535,65407,65535]}}, +{"amount":0.75,"gain":0,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65471,65535,65471,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65471,65535,65471,65535]}}, +{"amount":0.75,"gain":1,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65471,65535,65471,65535]}}, +{"amount":0.75,"gain":2,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65471,65535,65471,65535]}}, +{"amount":0.9,"gain":0,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65509,65535,65509,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65509,65535,65509,65535]}}, +{"amount":0.9,"gain":1,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65509,65535,65509,65535]}}, +{"amount":0.9,"gain":2,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65509,65535,65509,65535]}}, +{"amount":1,"gain":0,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#3daee9ff","out":{"hex":"#004f6cff","u16":[0,20301,27823,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#3daee9ff","out":{"hex":"#144f6bff","u16":[5155,20227,27408,65535]}}, +{"amount":-0.5,"gain":1,"in":"#3daee9ff","out":{"hex":"#1b4e69ff","u16":[7065,20152,26985,65535]}}, +{"amount":-0.5,"gain":2,"in":"#3daee9ff","out":{"hex":"#264e66ff","u16":[9681,20002,26115,65535]}}, +{"amount":0,"gain":0,"in":"#3daee9ff","out":{"hex":"#00aff0ff","u16":[0,45047,61740,65535]}}, +{"amount":0,"gain":0.5,"in":"#3daee9ff","out":{"hex":"#2dafedff","u16":[11440,44883,60819,65535]}}, +{"amount":0,"gain":1,"in":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"gain":2,"in":"#3daee9ff","out":{"hex":"#54ade1ff","u16":[21483,44386,57950,65535]}}, +{"amount":0.1,"gain":0,"in":"#3daee9ff","out":{"hex":"#28bbffff","u16":[10177,48176,65535,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#3daee9ff","out":{"hex":"#3cbbfbff","u16":[15295,48006,64574,65535]}}, +{"amount":0.1,"gain":1,"in":"#3daee9ff","out":{"hex":"#4abaf7ff","u16":[18894,47835,63595,65535]}}, +{"amount":0.1,"gain":2,"in":"#3daee9ff","out":{"hex":"#5fb9f0ff","u16":[24327,47492,61581,65535]}}, +{"amount":0.25,"gain":0,"in":"#3daee9ff","out":{"hex":"#75c9ffff","u16":[30097,51565,65535,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#3daee9ff","out":{"hex":"#7bc8fcff","u16":[31575,51434,64735,65535]}}, +{"amount":0.25,"gain":1,"in":"#3daee9ff","out":{"hex":"#80c8f9ff","u16":[32975,51304,63923,65535]}}, +{"amount":0.25,"gain":2,"in":"#3daee9ff","out":{"hex":"#8ac7f2ff","u16":[35579,51041,62261,65535]}}, +{"amount":0.5,"gain":0,"in":"#3daee9ff","out":{"hex":"#b2ddffff","u16":[45756,56685,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#3daee9ff","out":{"hex":"#b4dcfdff","u16":[46365,56607,65003,65535]}}, +{"amount":0.5,"gain":1,"in":"#3daee9ff","out":{"hex":"#b7dcfbff","u16":[46964,56529,64466,65535]}}, +{"amount":0.5,"gain":2,"in":"#3daee9ff","out":{"hex":"#bbdbf7ff","u16":[48137,56373,63375,65535]}}, +{"amount":0.75,"gain":0,"in":"#3daee9ff","out":{"hex":"#ddefffff","u16":[56688,61302,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#3daee9ff","out":{"hex":"#ddeefeff","u16":[56925,61266,65270,65535]}}, +{"amount":0.75,"gain":1,"in":"#3daee9ff","out":{"hex":"#deeefdff","u16":[57160,61231,65003,65535]}}, +{"amount":0.75,"gain":2,"in":"#3daee9ff","out":{"hex":"#e0eefbff","u16":[57628,61160,64466,65535]}}, +{"amount":0.9,"gain":0,"in":"#3daee9ff","out":{"hex":"#f2f9ffff","u16":[62177,63882,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#3daee9ff","out":{"hex":"#f2f9ffff","u16":[62262,63869,65429,65535]}}, +{"amount":0.9,"gain":1,"in":"#3daee9ff","out":{"hex":"#f3f8feff","u16":[62347,63855,65323,65535]}}, +{"amount":0.9,"gain":2,"in":"#3daee9ff","out":{"hex":"#f3f8fdff","u16":[62516,63828,65110,65535]}}, +{"amount":1,"gain":0,"in":"#3daee9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#3daee9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#3daee9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#3daee9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#3daee9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#3daee9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#3daee9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#3daee9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#232629ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#232629ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#232629ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#232629ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#232629ff","out":{"hex":"#002838ff","u16":[0,10317,14453,65535]}}, +{"amount":0,"gain":0.5,"in":"#232629ff","out":{"hex":"#1a2731ff","u16":[6564,10046,12677,65535]}}, +{"amount":0,"gain":1,"in":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"gain":2,"in":"#232629ff","out":{"hex":"#262626ff","u16":[9668,9668,9668,65535]}}, +{"amount":0.1,"gain":0,"in":"#232629ff","out":{"hex":"#00658eff","u16":[0,25996,36417,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#232629ff","out":{"hex":"#40627cff","u16":[16540,25313,31944,65535]}}, +{"amount":0.1,"gain":1,"in":"#232629ff","out":{"hex":"#586067ff","u16":[22665,24608,26551,65535]}}, +{"amount":0.1,"gain":2,"in":"#232629ff","out":{"hex":"#5f5f5fff","u16":[24360,24360,24360,65535]}}, +{"amount":0.25,"gain":0,"in":"#232629ff","out":{"hex":"#0094cfff","u16":[0,37987,53216,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#232629ff","out":{"hex":"#5e90b6ff","u16":[24169,36990,46679,65535]}}, +{"amount":0.25,"gain":1,"in":"#232629ff","out":{"hex":"#818c97ff","u16":[33120,35959,38798,65535]}}, +{"amount":0.25,"gain":2,"in":"#232629ff","out":{"hex":"#8b8b8bff","u16":[35597,35597,35597,65535]}}, +{"amount":0.5,"gain":0,"in":"#232629ff","out":{"hex":"#6fc4ffff","u16":[28575,50378,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#232629ff","out":{"hex":"#95c0e5ff","u16":[38417,49440,58871,65535]}}, +{"amount":0.5,"gain":1,"in":"#232629ff","out":{"hex":"#b3bdc7ff","u16":[45890,48480,51148,65535]}}, +{"amount":0.5,"gain":2,"in":"#232629ff","out":{"hex":"#bbbbbbff","u16":[48145,48145,48145,65535]}}, +{"amount":0.75,"gain":0,"in":"#232629ff","out":{"hex":"#c7e4ffff","u16":[51182,58548,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#232629ff","out":{"hex":"#d2e2f2ff","u16":[54047,58159,62310,65535]}}, +{"amount":0.75,"gain":1,"in":"#232629ff","out":{"hex":"#dde1e5ff","u16":[56740,57767,58871,65535]}}, +{"amount":0.75,"gain":2,"in":"#232629ff","out":{"hex":"#e0e0e0ff","u16":[57631,57631,57631,65535]}}, +{"amount":0.9,"gain":0,"in":"#232629ff","out":{"hex":"#ebf5ffff","u16":[60286,62852,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#232629ff","out":{"hex":"#eef4faff","u16":[61250,62709,64268,65535]}}, +{"amount":0.9,"gain":1,"in":"#232629ff","out":{"hex":"#f2f3f5ff","u16":[62196,62566,62971,65535]}}, +{"amount":0.9,"gain":2,"in":"#232629ff","out":{"hex":"#f3f3f3ff","u16":[62517,62517,62517,65535]}}, +{"amount":1,"gain":0,"in":"#232629ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#232629ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#232629ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#232629ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#232629ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#232629ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#232629ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#232629ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#eff0f1ff","out":{"hex":"#d4ebffff","u16":[54595,60349,65535,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#eff0f1ff","out":{"hex":"#dee9f5ff","u16":[56973,59996,62860,65535]}}, +{"amount":-0.5,"gain":1,"in":"#eff0f1ff","out":{"hex":"#e6e8eaff","u16":[59238,59640,60040,65535]}}, +{"amount":-0.5,"gain":2,"in":"#eff0f1ff","out":{"hex":"#e8e8e8ff","u16":[59583,59583,59583,65535]}}, +{"amount":0,"gain":0,"in":"#eff0f1ff","out":{"hex":"#e4f2ffff","u16":[58516,62136,65535,65535]}}, +{"amount":0,"gain":0.5,"in":"#eff0f1ff","out":{"hex":"#e9f1f8ff","u16":[59991,61908,63766,65535]}}, +{"amount":0,"gain":1,"in":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"gain":2,"in":"#eff0f1ff","out":{"hex":"#f0f0f0ff","u16":[61644,61644,61644,65535]}}, +{"amount":0.1,"gain":0,"in":"#eff0f1ff","out":{"hex":"#e7f3ffff","u16":[59263,62486,65535,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#eff0f1ff","out":{"hex":"#ecf2f9ff","u16":[60573,62282,63946,65535]}}, +{"amount":0.1,"gain":1,"in":"#eff0f1ff","out":{"hex":"#f1f2f2ff","u16":[61849,62078,62308,65535]}}, +{"amount":0.1,"gain":2,"in":"#eff0f1ff","out":{"hex":"#f1f1f1ff","u16":[62046,62046,62046,65535]}}, +{"amount":0.25,"gain":0,"in":"#eff0f1ff","out":{"hex":"#ebf5ffff","u16":[60363,63006,65535,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#eff0f1ff","out":{"hex":"#eff5faff","u16":[61433,62839,64214,65535]}}, +{"amount":0.25,"gain":1,"in":"#eff0f1ff","out":{"hex":"#f3f4f5ff","u16":[62482,62670,62860,65535]}}, +{"amount":0.25,"gain":2,"in":"#eff0f1ff","out":{"hex":"#f4f4f4ff","u16":[62644,62644,62644,65535]}}, +{"amount":0.5,"gain":0,"in":"#eff0f1ff","out":{"hex":"#f2f8ffff","u16":[62144,63862,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#eff0f1ff","out":{"hex":"#f4f8fcff","u16":[62836,63753,64658,65535]}}, +{"amount":0.5,"gain":1,"in":"#eff0f1ff","out":{"hex":"#f7f8f8ff","u16":[63519,63643,63766,65535]}}, +{"amount":0.5,"gain":2,"in":"#eff0f1ff","out":{"hex":"#f8f8f8ff","u16":[63625,63625,63625,65535]}}, +{"amount":0.75,"gain":0,"in":"#eff0f1ff","out":{"hex":"#f9fcffff","u16":[63867,64705,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#eff0f1ff","out":{"hex":"#fafcfdff","u16":[64203,64651,65098,65535]}}, +{"amount":0.75,"gain":1,"in":"#eff0f1ff","out":{"hex":"#fbfbfcff","u16":[64536,64597,64658,65535]}}, +{"amount":0.75,"gain":2,"in":"#eff0f1ff","out":{"hex":"#fbfbfbff","u16":[64589,64589,64589,65535]}}, +{"amount":0.9,"gain":0,"in":"#eff0f1ff","out":{"hex":"#fcfeffff","u16":[64874,65205,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#eff0f1ff","out":{"hex":"#fdfefeff","u16":[65006,65183,65361,65535]}}, +{"amount":0.9,"gain":1,"in":"#eff0f1ff","out":{"hex":"#fdfefeff","u16":[65138,65162,65186,65535]}}, +{"amount":0.9,"gain":2,"in":"#eff0f1ff","out":{"hex":"#fefefeff","u16":[65158,65158,65158,65535]}}, +{"amount":1,"gain":0,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#fcfcfcff","out":{"hex":"#fff9f9ff","u16":[65535,64057,64057,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#fcfcfcff","out":{"hex":"#fdfafaff","u16":[64958,64216,64216,65535]}}, +{"amount":-0.5,"gain":1,"in":"#fcfcfcff","out":{"hex":"#fafafaff","u16":[64374,64374,64374,65535]}}, +{"amount":-0.5,"gain":2,"in":"#fcfcfcff","out":{"hex":"#fafafaff","u16":[64374,64374,64374,65535]}}, +{"amount":0,"gain":0,"in":"#fcfcfcff","out":{"hex":"#fffbfbff","u16":[65535,64554,64554,65535]}}, +{"amount":0,"gain":0.5,"in":"#fcfcfcff","out":{"hex":"#fefcfcff","u16":[65151,64659,64659,65535]}}, +{"amount":0,"gain":1,"in":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"gain":2,"in":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"gain":0,"in":"#fcfcfcff","out":{"hex":"#fffcfcff","u16":[65535,64653,64653,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#fcfcfcff","out":{"hex":"#fefcfcff","u16":[65189,64747,64747,65535]}}, +{"amount":0.1,"gain":1,"in":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64842,64842,64842,65535]}}, +{"amount":0.1,"gain":2,"in":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64842,64842,64842,65535]}}, +{"amount":0.25,"gain":0,"in":"#fcfcfcff","out":{"hex":"#fffcfcff","u16":[65535,64801,64801,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#fcfcfcff","out":{"hex":"#fefcfcff","u16":[65247,64879,64879,65535]}}, +{"amount":0.25,"gain":1,"in":"#fcfcfcff","out":{"hex":"#fdfdfdff","u16":[64958,64958,64958,65535]}}, +{"amount":0.25,"gain":2,"in":"#fcfcfcff","out":{"hex":"#fdfdfdff","u16":[64958,64958,64958,65535]}}, +{"amount":0.5,"gain":0,"in":"#fcfcfcff","out":{"hex":"#fffdfdff","u16":[65535,65047,65047,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#fcfcfcff","out":{"hex":"#fefdfdff","u16":[65343,65099,65099,65535]}}, +{"amount":0.5,"gain":1,"in":"#fcfcfcff","out":{"hex":"#fefefeff","u16":[65151,65151,65151,65535]}}, +{"amount":0.5,"gain":2,"in":"#fcfcfcff","out":{"hex":"#fefefeff","u16":[65151,65151,65151,65535]}}, +{"amount":0.75,"gain":0,"in":"#fcfcfcff","out":{"hex":"#fffefeff","u16":[65535,65291,65291,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#fcfcfcff","out":{"hex":"#fffefeff","u16":[65439,65317,65317,65535]}}, +{"amount":0.75,"gain":1,"in":"#fcfcfcff","out":{"hex":"#fefefeff","u16":[65343,65343,65343,65535]}}, +{"amount":0.75,"gain":2,"in":"#fcfcfcff","out":{"hex":"#fefefeff","u16":[65343,65343,65343,65535]}}, +{"amount":0.9,"gain":0,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65438,65438,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65497,65448,65448,65535]}}, +{"amount":0.9,"gain":1,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65458,65458,65458,65535]}}, +{"amount":0.9,"gain":2,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65458,65458,65458,65535]}}, +{"amount":1,"gain":0,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#31363bff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#31363bff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#31363bff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#31363bff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#31363bff","out":{"hex":"#003950ff","u16":[0,14628,20572,65535]}}, +{"amount":0,"gain":0.5,"in":"#31363bff","out":{"hex":"#243746ff","u16":[9190,14259,18111,65535]}}, +{"amount":0,"gain":1,"in":"#31363bff","out":{"hex":"#31363bff","u16":[12593,13878,15163,65535]}}, +{"amount":0,"gain":2,"in":"#31363bff","out":{"hex":"#353535ff","u16":[13717,13717,13717,65535]}}, +{"amount":0.1,"gain":0,"in":"#31363bff","out":{"hex":"#006b97ff","u16":[0,27534,38724,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#31363bff","out":{"hex":"#436885ff","u16":[17298,26840,34091,65535]}}, +{"amount":0.1,"gain":1,"in":"#31363bff","out":{"hex":"#5c666fff","u16":[23704,26123,28542,65535]}}, +{"amount":0.1,"gain":2,"in":"#31363bff","out":{"hex":"#646464ff","u16":[25819,25819,25819,65535]}}, +{"amount":0.25,"gain":0,"in":"#31363bff","out":{"hex":"#0097d4ff","u16":[0,38802,54571,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#31363bff","out":{"hex":"#5f93bbff","u16":[24377,37823,48043,65535]}}, +{"amount":0.25,"gain":1,"in":"#31363bff","out":{"hex":"#828f9dff","u16":[33405,36813,40222,65535]}}, +{"amount":0.25,"gain":2,"in":"#31363bff","out":{"hex":"#8e8e8eff","u16":[36385,36385,36385,65535]}}, +{"amount":0.5,"gain":0,"in":"#31363bff","out":{"hex":"#75c5ffff","u16":[30041,50641,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#31363bff","out":{"hex":"#98c2e6ff","u16":[38992,49773,59197,65535]}}, +{"amount":0.5,"gain":1,"in":"#31363bff","out":{"hex":"#b3becaff","u16":[45971,48887,51916,65535]}}, +{"amount":0.5,"gain":2,"in":"#31363bff","out":{"hex":"#bdbdbdff","u16":[48514,48514,48514,65535]}}, +{"amount":0.75,"gain":0,"in":"#31363bff","out":{"hex":"#c9e4ffff","u16":[51556,58658,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#31363bff","out":{"hex":"#d3e3f3ff","u16":[54239,58296,62462,65535]}}, +{"amount":0.75,"gain":1,"in":"#31363bff","out":{"hex":"#dde1e6ff","u16":[56771,57932,59197,65535]}}, +{"amount":0.75,"gain":2,"in":"#31363bff","out":{"hex":"#e1e1e1ff","u16":[57780,57780,57780,65535]}}, +{"amount":0.9,"gain":0,"in":"#31363bff","out":{"hex":"#ebf5ffff","u16":[60409,62892,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#31363bff","out":{"hex":"#eff4faff","u16":[61316,62760,64327,65535]}}, +{"amount":0.9,"gain":1,"in":"#31363bff","out":{"hex":"#f2f4f5ff","u16":[62207,62627,63091,65535]}}, +{"amount":0.9,"gain":2,"in":"#31363bff","out":{"hex":"#f3f3f3ff","u16":[62571,62571,62571,65535]}}, +{"amount":1,"gain":0,"in":"#31363bff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#31363bff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#31363bff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#31363bff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#31363bff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#31363bff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#31363bff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#31363bff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#1b1e20ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#1b1e20ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#1b1e20ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#1b1e20ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#1b1e20ff","out":{"hex":"#002029ff","u16":[0,8217,10562,65535]}}, +{"amount":0,"gain":0.5,"in":"#1b1e20ff","out":{"hex":"#141f25ff","u16":[5064,7968,9480,65535]}}, +{"amount":0,"gain":1,"in":"#1b1e20ff","out":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]}}, +{"amount":0,"gain":2,"in":"#1b1e20ff","out":{"hex":"#1e1e1eff","u16":[7593,7593,7593,65535]}}, +{"amount":0.1,"gain":0,"in":"#1b1e20ff","out":{"hex":"#006481ff","u16":[0,25770,33125,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#1b1e20ff","out":{"hex":"#3e6174ff","u16":[15881,24991,29731,65535]}}, +{"amount":0.1,"gain":1,"in":"#1b1e20ff","out":{"hex":"#555e64ff","u16":[21763,24181,25793,65535]}}, +{"amount":0.1,"gain":2,"in":"#1b1e20ff","out":{"hex":"#5d5d5dff","u16":[23815,23815,23815,65535]}}, +{"amount":0.25,"gain":0,"in":"#1b1e20ff","out":{"hex":"#0095bfff","u16":[0,38210,49116,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#1b1e20ff","out":{"hex":"#5c90acff","u16":[23547,37054,44083,65535]}}, +{"amount":0.25,"gain":1,"in":"#1b1e20ff","out":{"hex":"#7e8c95ff","u16":[32268,35853,38243,65535]}}, +{"amount":0.25,"gain":2,"in":"#1b1e20ff","out":{"hex":"#898989ff","u16":[35311,35311,35311,65535]}}, +{"amount":0.5,"gain":0,"in":"#1b1e20ff","out":{"hex":"#3bc9ffff","u16":[15127,51657,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#1b1e20ff","out":{"hex":"#83c3e6ff","u16":[33619,50201,59104,65535]}}, +{"amount":0.5,"gain":1,"in":"#1b1e20ff","out":{"hex":"#acbdc9ff","u16":[44218,48692,51699,65535]}}, +{"amount":0.5,"gain":2,"in":"#1b1e20ff","out":{"hex":"#bbbbbbff","u16":[48013,48013,48013,65535]}}, +{"amount":0.75,"gain":0,"in":"#1b1e20ff","out":{"hex":"#bde6ffff","u16":[48678,59087,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#1b1e20ff","out":{"hex":"#cce4f3ff","u16":[52547,58474,62419,65535]}}, +{"amount":0.75,"gain":1,"in":"#1b1e20ff","out":{"hex":"#dae1e6ff","u16":[56102,57853,59104,65535]}}, +{"amount":0.75,"gain":2,"in":"#1b1e20ff","out":{"hex":"#e0e0e0ff","u16":[57578,57578,57578,65535]}}, +{"amount":0.9,"gain":0,"in":"#1b1e20ff","out":{"hex":"#e7f5ffff","u16":[59481,63051,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#1b1e20ff","out":{"hex":"#ecf4faff","u16":[60740,62825,64310,65535]}}, +{"amount":0.9,"gain":1,"in":"#1b1e20ff","out":{"hex":"#f1f4f5ff","u16":[61968,62598,63057,65535]}}, +{"amount":0.9,"gain":2,"in":"#1b1e20ff","out":{"hex":"#f3f3f3ff","u16":[62498,62498,62498,65535]}}, +{"amount":1,"gain":0,"in":"#1b1e20ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#1b1e20ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#1b1e20ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#1b1e20ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#1b1e20ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#1b1e20ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#1b1e20ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#1b1e20ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#da4453ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#da4453ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#da4453ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#da4453ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#da4453ff","out":{"hex":"#f4003cff","u16":[62676,0,15457,65535]}}, +{"amount":0,"gain":0.5,"in":"#da4453ff","out":{"hex":"#e73249ff","u16":[59463,12753,18673,65535]}}, +{"amount":0,"gain":1,"in":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"gain":2,"in":"#da4453ff","out":{"hex":"#bc5d64ff","u16":[48258,23948,25707,65535]}}, +{"amount":0.1,"gain":0,"in":"#da4453ff","out":{"hex":"#ff4f61ff","u16":[65535,20413,24930,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#da4453ff","out":{"hex":"#f35b69ff","u16":[62441,23489,26913,65535]}}, +{"amount":0.1,"gain":1,"in":"#da4453ff","out":{"hex":"#e66670ff","u16":[59151,26144,28735,65535]}}, +{"amount":0.1,"gain":2,"in":"#da4453ff","out":{"hex":"#ca777dff","u16":[51807,30660,32015,65535]}}, +{"amount":0.25,"gain":0,"in":"#da4453ff","out":{"hex":"#ff838cff","u16":[65535,33647,35901,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#da4453ff","out":{"hex":"#f58990ff","u16":[62969,35143,36999,65535]}}, +{"amount":0.25,"gain":1,"in":"#da4453ff","out":{"hex":"#eb8e94ff","u16":[60271,36566,38059,65535]}}, +{"amount":0.25,"gain":2,"in":"#da4453ff","out":{"hex":"#d4999cff","u16":[54388,39228,40079,65535]}}, +{"amount":0.5,"gain":0,"in":"#da4453ff","out":{"hex":"#ffb8bcff","u16":[65535,47260,48286,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#da4453ff","out":{"hex":"#f8bbbeff","u16":[63838,47935,48805,65535]}}, +{"amount":0.5,"gain":1,"in":"#da4453ff","out":{"hex":"#f2bdc0ff","u16":[62085,48599,49318,65535]}}, +{"amount":0.5,"gain":2,"in":"#da4453ff","out":{"hex":"#e3c2c4ff","u16":[58389,49896,50324,65535]}}, +{"amount":0.75,"gain":0,"in":"#da4453ff","out":{"hex":"#ffdfe0ff","u16":[65535,57277,57688,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#da4453ff","out":{"hex":"#fce0e1ff","u16":[64693,57547,57899,65535]}}, +{"amount":0.75,"gain":1,"in":"#da4453ff","out":{"hex":"#f8e1e2ff","u16":[63838,57815,58108,65535]}}, +{"amount":0.75,"gain":2,"in":"#da4453ff","out":{"hex":"#f2e3e4ff","u16":[62085,58347,58525,65535]}}, +{"amount":0.9,"gain":0,"in":"#da4453ff","out":{"hex":"#fff3f3ff","u16":[65535,62389,62538,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#da4453ff","out":{"hex":"#fef3f4ff","u16":[65200,62487,62614,65535]}}, +{"amount":0.9,"gain":1,"in":"#da4453ff","out":{"hex":"#fcf4f4ff","u16":[64863,62584,62691,65535]}}, +{"amount":0.9,"gain":2,"in":"#da4453ff","out":{"hex":"#faf4f5ff","u16":[64182,62778,62843,65535]}}, +{"amount":1,"gain":0,"in":"#da4453ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#da4453ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#da4453ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#da4453ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#da4453ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#da4453ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#da4453ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#da4453ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#27ae60ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#27ae60ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#27ae60ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#27ae60ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#27ae60ff","out":{"hex":"#00af5cff","u16":[0,44993,23610,65535]}}, +{"amount":0,"gain":0.5,"in":"#27ae60ff","out":{"hex":"#1caf5eff","u16":[7314,44856,24148,65535]}}, +{"amount":0,"gain":1,"in":"#27ae60ff","out":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]}}, +{"amount":0,"gain":2,"in":"#27ae60ff","out":{"hex":"#35ad64ff","u16":[13735,44441,25682,65535]}}, +{"amount":0.1,"gain":0,"in":"#27ae60ff","out":{"hex":"#00bf64ff","u16":[0,49106,25768,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#27ae60ff","out":{"hex":"#1fbe67ff","u16":[7983,48956,26355,65535]}}, +{"amount":0.1,"gain":1,"in":"#27ae60ff","out":{"hex":"#2bbe69ff","u16":[10939,48805,26927,65535]}}, +{"amount":0.1,"gain":2,"in":"#27ae60ff","out":{"hex":"#3abd6dff","u16":[14990,48503,28030,65535]}}, +{"amount":0.25,"gain":0,"in":"#27ae60ff","out":{"hex":"#00d46fff","u16":[0,54595,28648,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#27ae60ff","out":{"hex":"#23d472ff","u16":[8875,54429,29301,65535]}}, +{"amount":0.25,"gain":1,"in":"#27ae60ff","out":{"hex":"#2fd374ff","u16":[12162,54261,29937,65535]}}, +{"amount":0.25,"gain":2,"in":"#27ae60ff","out":{"hex":"#41d279ff","u16":[16666,53925,31163,65535]}}, +{"amount":0.5,"gain":0,"in":"#27ae60ff","out":{"hex":"#00f380ff","u16":[0,62503,32797,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#27ae60ff","out":{"hex":"#28f283ff","u16":[10161,62312,33545,65535]}}, +{"amount":0.5,"gain":1,"in":"#27ae60ff","out":{"hex":"#36f285ff","u16":[13924,62121,34273,65535]}}, +{"amount":0.5,"gain":2,"in":"#27ae60ff","out":{"hex":"#4af08bff","u16":[19080,61735,35677,65535]}}, +{"amount":0.75,"gain":0,"in":"#27ae60ff","out":{"hex":"#a1ffbdff","u16":[41417,65535,48608,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#27ae60ff","out":{"hex":"#a3ffbeff","u16":[42015,65408,48940,65535]}}, +{"amount":0.75,"gain":1,"in":"#27ae60ff","out":{"hex":"#a6fec0ff","u16":[42603,65281,49269,65535]}}, +{"amount":0.75,"gain":2,"in":"#27ae60ff","out":{"hex":"#aafdc2ff","u16":[43752,65025,49920,65535]}}, +{"amount":0.9,"gain":0,"in":"#27ae60ff","out":{"hex":"#dfffe7ff","u16":[57354,65535,59458,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#27ae60ff","out":{"hex":"#e0ffe8ff","u16":[57517,65484,59563,65535]}}, +{"amount":0.9,"gain":1,"in":"#27ae60ff","out":{"hex":"#e0ffe8ff","u16":[57679,65433,59667,65535]}}, +{"amount":0.9,"gain":2,"in":"#27ae60ff","out":{"hex":"#e2fee9ff","u16":[58003,65332,59876,65535]}}, +{"amount":1,"gain":0,"in":"#27ae60ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#27ae60ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#27ae60ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#27ae60ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#27ae60ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#27ae60ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#27ae60ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#27ae60ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#f67400ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#f67400ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#f67400ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#f67400ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#f67400ff","out":{"hex":"#f67400ff","u16":[63222,29812,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#f67400ff","out":{"hex":"#f67400ff","u16":[63222,29812,0,65535]}}, +{"amount":0,"gain":1,"in":"#f67400ff","out":{"hex":"#f67400ff","u16":[63222,29812,0,65535]}}, +{"amount":0,"gain":2,"in":"#f67400ff","out":{"hex":"#f67400ff","u16":[63222,29812,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#f67400ff","out":{"hex":"#ff8649ff","u16":[65535,34417,18686,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#f67400ff","out":{"hex":"#ff8649ff","u16":[65535,34417,18686,65535]}}, +{"amount":0.1,"gain":1,"in":"#f67400ff","out":{"hex":"#ff8649ff","u16":[65535,34417,18686,65535]}}, +{"amount":0.1,"gain":2,"in":"#f67400ff","out":{"hex":"#ff8649ff","u16":[65535,34417,18686,65535]}}, +{"amount":0.25,"gain":0,"in":"#f67400ff","out":{"hex":"#ffa280ff","u16":[65535,41641,32887,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#f67400ff","out":{"hex":"#ffa280ff","u16":[65535,41641,32887,65535]}}, +{"amount":0.25,"gain":1,"in":"#f67400ff","out":{"hex":"#ffa280ff","u16":[65535,41641,32887,65535]}}, +{"amount":0.25,"gain":2,"in":"#f67400ff","out":{"hex":"#ffa280ff","u16":[65535,41641,32887,65535]}}, +{"amount":0.5,"gain":0,"in":"#f67400ff","out":{"hex":"#ffc7b7ff","u16":[65535,51127,46926,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#f67400ff","out":{"hex":"#ffc7b7ff","u16":[65535,51127,46926,65535]}}, +{"amount":0.5,"gain":1,"in":"#f67400ff","out":{"hex":"#ffc7b7ff","u16":[65535,51127,46926,65535]}}, +{"amount":0.5,"gain":2,"in":"#f67400ff","out":{"hex":"#ffc7b7ff","u16":[65535,51127,46926,65535]}}, +{"amount":0.75,"gain":0,"in":"#f67400ff","out":{"hex":"#ffe5deff","u16":[65535,58862,57145,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#f67400ff","out":{"hex":"#ffe5deff","u16":[65535,58862,57145,65535]}}, +{"amount":0.75,"gain":1,"in":"#f67400ff","out":{"hex":"#ffe5deff","u16":[65535,58862,57145,65535]}}, +{"amount":0.75,"gain":2,"in":"#f67400ff","out":{"hex":"#ffe5deff","u16":[65535,58862,57145,65535]}}, +{"amount":0.9,"gain":0,"in":"#f67400ff","out":{"hex":"#fff5f3ff","u16":[65535,62968,62341,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#f67400ff","out":{"hex":"#fff5f3ff","u16":[65535,62968,62341,65535]}}, +{"amount":0.9,"gain":1,"in":"#f67400ff","out":{"hex":"#fff5f3ff","u16":[65535,62968,62341,65535]}}, +{"amount":0.9,"gain":2,"in":"#f67400ff","out":{"hex":"#fff5f3ff","u16":[65535,62968,62341,65535]}}, +{"amount":1,"gain":0,"in":"#f67400ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#f67400ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#f67400ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#f67400ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#f67400ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#f67400ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#f67400ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#f67400ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#2980b9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#2980b9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#2980b9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#2980b9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#2980b9ff","out":{"hex":"#0081beff","u16":[0,33053,48831,65535]}}, +{"amount":0,"gain":0.5,"in":"#2980b9ff","out":{"hex":"#1e80bcff","u16":[7689,32975,48193,65535]}}, +{"amount":0,"gain":1,"in":"#2980b9ff","out":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]}}, +{"amount":0,"gain":2,"in":"#2980b9ff","out":{"hex":"#387fb4ff","u16":[14439,32738,46216,65535]}}, +{"amount":0.1,"gain":0,"in":"#2980b9ff","out":{"hex":"#0096deff","u16":[0,38628,57068,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#2980b9ff","out":{"hex":"#2396dbff","u16":[8986,38537,56322,65535]}}, +{"amount":0.1,"gain":1,"in":"#2980b9ff","out":{"hex":"#3096d8ff","u16":[12314,38444,55564,65535]}}, +{"amount":0.1,"gain":2,"in":"#2980b9ff","out":{"hex":"#4295d2ff","u16":[16875,38259,54011,65535]}}, +{"amount":0.25,"gain":0,"in":"#2980b9ff","out":{"hex":"#38b0ffff","u16":[14334,45315,65535,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#2980b9ff","out":{"hex":"#42b0fcff","u16":[17068,45216,64709,65535]}}, +{"amount":0.25,"gain":1,"in":"#2980b9ff","out":{"hex":"#4bb0f9ff","u16":[19356,45117,63871,65535]}}, +{"amount":0.25,"gain":2,"in":"#2980b9ff","out":{"hex":"#5aaff2ff","u16":[23157,44917,62152,65535]}}, +{"amount":0.5,"gain":0,"in":"#2980b9ff","out":{"hex":"#a0cfffff","u16":[41027,53098,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#2980b9ff","out":{"hex":"#a2cefdff","u16":[41598,53044,64986,65535]}}, +{"amount":0.5,"gain":1,"in":"#2980b9ff","out":{"hex":"#a4cefbff","u16":[42159,52989,64431,65535]}}, +{"amount":0.5,"gain":2,"in":"#2980b9ff","out":{"hex":"#a8cef6ff","u16":[43257,52879,63304,65535]}}, +{"amount":0.75,"gain":0,"in":"#2980b9ff","out":{"hex":"#d6e8ffff","u16":[54940,59706,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#2980b9ff","out":{"hex":"#d7e8feff","u16":[55142,59682,65261,65535]}}, +{"amount":0.75,"gain":1,"in":"#2980b9ff","out":{"hex":"#d7e8fdff","u16":[55343,59659,64986,65535]}}, +{"amount":0.75,"gain":2,"in":"#2980b9ff","out":{"hex":"#d9e8fbff","u16":[55744,59611,64431,65535]}}, +{"amount":0.9,"gain":0,"in":"#2980b9ff","out":{"hex":"#f0f6ffff","u16":[61559,63281,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#2980b9ff","out":{"hex":"#f0f6ffff","u16":[61630,63272,65426,65535]}}, +{"amount":0.9,"gain":1,"in":"#2980b9ff","out":{"hex":"#f0f6feff","u16":[61701,63263,65316,65535]}}, +{"amount":0.9,"gain":2,"in":"#2980b9ff","out":{"hex":"#f1f6fdff","u16":[61842,63245,65096,65535]}}, +{"amount":1,"gain":0,"in":"#2980b9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#2980b9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#2980b9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#2980b9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#2980b9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#2980b9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#2980b9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#2980b9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#7f8c8dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#7f8c8dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#7f8c8dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#7f8c8dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#7f8c8dff","out":{"hex":"#00999eff","u16":[0,39241,40668,65535]}}, +{"amount":0,"gain":0.5,"in":"#7f8c8dff","out":{"hex":"#5d9396ff","u16":[23818,37653,38529,65535]}}, +{"amount":0,"gain":1,"in":"#7f8c8dff","out":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}}, +{"amount":0,"gain":2,"in":"#7f8c8dff","out":{"hex":"#898989ff","u16":[35320,35320,35320,65535]}}, +{"amount":0.1,"gain":0,"in":"#7f8c8dff","out":{"hex":"#00abb2ff","u16":[0,44049,45651,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#7f8c8dff","out":{"hex":"#68a4a8ff","u16":[26737,42267,43250,65535]}}, +{"amount":0.1,"gain":1,"in":"#7f8c8dff","out":{"hex":"#8f9d9eff","u16":[36639,40389,40678,65535]}}, +{"amount":0.1,"gain":2,"in":"#7f8c8dff","out":{"hex":"#9a9a9aff","u16":[39649,39649,39649,65535]}}, +{"amount":0.25,"gain":0,"in":"#7f8c8dff","out":{"hex":"#00c4cbff","u16":[0,50262,52091,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#7f8c8dff","out":{"hex":"#77bcc0ff","u16":[30508,48228,49351,65535]}}, +{"amount":0.25,"gain":1,"in":"#7f8c8dff","out":{"hex":"#a3b3b5ff","u16":[41807,46086,46415,65535]}}, +{"amount":0.25,"gain":2,"in":"#7f8c8dff","out":{"hex":"#b0b0b0ff","u16":[45241,45241,45241,65535]}}, +{"amount":0.5,"gain":0,"in":"#7f8c8dff","out":{"hex":"#00e5eeff","u16":[0,58946,61090,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#7f8c8dff","out":{"hex":"#8bdce1ff","u16":[35779,56561,57877,65535]}}, +{"amount":0.5,"gain":1,"in":"#7f8c8dff","out":{"hex":"#bfd2d4ff","u16":[49029,54048,54434,65535]}}, +{"amount":0.5,"gain":2,"in":"#7f8c8dff","out":{"hex":"#cececeff","u16":[53057,53057,53057,65535]}}, +{"amount":0.75,"gain":0,"in":"#7f8c8dff","out":{"hex":"#94f9ffff","u16":[38095,63943,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#7f8c8dff","out":{"hex":"#bdf2f6ff","u16":[48595,62197,63157,65535]}}, +{"amount":0.75,"gain":1,"in":"#7f8c8dff","out":{"hex":"#ddebecff","u16":[56895,60391,60666,65535]}}, +{"amount":0.75,"gain":2,"in":"#7f8c8dff","out":{"hex":"#e8e8e8ff","u16":[59688,59688,59688,65535]}}, +{"amount":0.9,"gain":0,"in":"#7f8c8dff","out":{"hex":"#dcfdffff","u16":[56490,64904,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#7f8c8dff","out":{"hex":"#e7fafbff","u16":[59454,64225,64596,65535]}}, +{"amount":0.9,"gain":1,"in":"#7f8c8dff","out":{"hex":"#f2f7f8ff","u16":[62252,63537,63641,65535]}}, +{"amount":0.9,"gain":2,"in":"#7f8c8dff","out":{"hex":"#f6f6f6ff","u16":[63274,63274,63274,65535]}}, +{"amount":1,"gain":0,"in":"#7f8c8dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#7f8c8dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#7f8c8dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#7f8c8dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#7f8c8dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#7f8c8dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#7f8c8dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#7f8c8dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#9b59b6ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#9b59b6ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#9b59b6ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#9b59b6ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#9b59b6ff","out":{"hex":"#c000eeff","u16":[49379,0,61158,65535]}}, +{"amount":0,"gain":0.5,"in":"#9b59b6ff","out":{"hex":"#af41d4ff","u16":[44912,16691,54537,65535]}}, +{"amount":0,"gain":1,"in":"#9b59b6ff","out":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}}, +{"amount":0,"gain":2,"in":"#9b59b6ff","out":{"hex":"#747474ff","u16":[29758,29758,29758,65535]}}, +{"amount":0.1,"gain":0,"in":"#9b59b6ff","out":{"hex":"#d24bffff","u16":[53874,19216,65535,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#9b59b6ff","out":{"hex":"#c162e5ff","u16":[49532,25079,58950,65535]}}, +{"amount":0.1,"gain":1,"in":"#9b59b6ff","out":{"hex":"#ae73c8ff","u16":[44676,29632,51335,65535]}}, +{"amount":0.1,"gain":2,"in":"#9b59b6ff","out":{"hex":"#8a8a8aff","u16":[35431,35431,35431,65535]}}, +{"amount":0.25,"gain":0,"in":"#9b59b6ff","out":{"hex":"#da81ffff","u16":[56022,33113,65535,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#9b59b6ff","out":{"hex":"#cd8ceaff","u16":[52611,35981,60108,65535]}}, +{"amount":0.25,"gain":1,"in":"#9b59b6ff","out":{"hex":"#be96d2ff","u16":[48912,38598,54017,65535]}}, +{"amount":0.25,"gain":2,"in":"#9b59b6ff","out":{"hex":"#a5a5a5ff","u16":[42318,42318,42318,65535]}}, +{"amount":0.5,"gain":0,"in":"#9b59b6ff","out":{"hex":"#e7b7ffff","u16":[59397,47025,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#9b59b6ff","out":{"hex":"#dfbcf1ff","u16":[57311,48324,61980,65535]}}, +{"amount":0.5,"gain":1,"in":"#9b59b6ff","out":{"hex":"#d7c1e2ff","u16":[55129,49582,58163,65535]}}, +{"amount":0.5,"gain":2,"in":"#9b59b6ff","out":{"hex":"#c8c8c8ff","u16":[51482,51482,51482,65535]}}, +{"amount":0.75,"gain":0,"in":"#9b59b6ff","out":{"hex":"#f3dfffff","u16":[62556,57184,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#9b59b6ff","out":{"hex":"#f0e1f8ff","u16":[61588,57703,63787,65535]}}, +{"amount":0.75,"gain":1,"in":"#9b59b6ff","out":{"hex":"#ece3f1ff","u16":[60600,58217,61980,65535]}}, +{"amount":0.75,"gain":2,"in":"#9b59b6ff","out":{"hex":"#e6e6e6ff","u16":[59012,59012,59012,65535]}}, +{"amount":0.9,"gain":0,"in":"#9b59b6ff","out":{"hex":"#faf3ffff","u16":[64363,62356,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#9b59b6ff","out":{"hex":"#f9f3fcff","u16":[63991,62543,64843,65535]}}, +{"amount":0.9,"gain":1,"in":"#9b59b6ff","out":{"hex":"#f8f4faff","u16":[63616,62731,64142,65535]}}, +{"amount":0.9,"gain":2,"in":"#9b59b6ff","out":{"hex":"#f5f5f5ff","u16":[63023,63023,63023,65535]}}, +{"amount":1,"gain":0,"in":"#9b59b6ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#9b59b6ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#9b59b6ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#9b59b6ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#9b59b6ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#9b59b6ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#9b59b6ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#9b59b6ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#1d99f3ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#1d99f3ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#1d99f3ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#1d99f3ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#1d99f3ff","out":{"hex":"#0099f5ff","u16":[0,39362,62994,65535]}}, +{"amount":0,"gain":0.5,"in":"#1d99f3ff","out":{"hex":"#1599f4ff","u16":[5439,39341,62723,65535]}}, +{"amount":0,"gain":1,"in":"#1d99f3ff","out":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]}}, +{"amount":0,"gain":2,"in":"#1d99f3ff","out":{"hex":"#2899f1ff","u16":[10213,39280,61903,65535]}}, +{"amount":0.1,"gain":0,"in":"#1d99f3ff","out":{"hex":"#49a7ffff","u16":[18740,43035,65535,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#1d99f3ff","out":{"hex":"#4ba7feff","u16":[19302,43016,65271,65535]}}, +{"amount":0.1,"gain":1,"in":"#1d99f3ff","out":{"hex":"#4da7fdff","u16":[19846,42998,65007,65535]}}, +{"amount":0.1,"gain":2,"in":"#1d99f3ff","out":{"hex":"#51a7fbff","u16":[20881,42960,64473,65535]}}, +{"amount":0.25,"gain":0,"in":"#1d99f3ff","out":{"hex":"#80baffff","u16":[32909,47694,65535,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#1d99f3ff","out":{"hex":"#81bafeff","u16":[33151,47680,65315,65535]}}, +{"amount":0.25,"gain":1,"in":"#1d99f3ff","out":{"hex":"#82b9fdff","u16":[33390,47666,65095,65535]}}, +{"amount":0.25,"gain":2,"in":"#1d99f3ff","out":{"hex":"#84b9fcff","u16":[33863,47639,64651,65535]}}, +{"amount":0.5,"gain":0,"in":"#1d99f3ff","out":{"hex":"#b7d4ffff","u16":[46936,54431,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#1d99f3ff","out":{"hex":"#b7d4feff","u16":[47041,54423,65389,65535]}}, +{"amount":0.5,"gain":1,"in":"#1d99f3ff","out":{"hex":"#b7d4feff","u16":[47147,54415,65242,65535]}}, +{"amount":0.5,"gain":2,"in":"#1d99f3ff","out":{"hex":"#b8d4fdff","u16":[47356,54399,64948,65535]}}, +{"amount":0.75,"gain":0,"in":"#1d99f3ff","out":{"hex":"#deebffff","u16":[57149,60290,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#1d99f3ff","out":{"hex":"#dfebffff","u16":[57191,60287,65462,65535]}}, +{"amount":0.75,"gain":1,"in":"#1d99f3ff","out":{"hex":"#dfebfeff","u16":[57232,60283,65389,65535]}}, +{"amount":0.75,"gain":2,"in":"#1d99f3ff","out":{"hex":"#dfebfeff","u16":[57315,60276,65242,65535]}}, +{"amount":0.9,"gain":0,"in":"#1d99f3ff","out":{"hex":"#f3f7ffff","u16":[62343,63499,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#1d99f3ff","out":{"hex":"#f3f7ffff","u16":[62358,63498,65506,65535]}}, +{"amount":0.9,"gain":1,"in":"#1d99f3ff","out":{"hex":"#f3f7ffff","u16":[62373,63497,65477,65535]}}, +{"amount":0.9,"gain":2,"in":"#1d99f3ff","out":{"hex":"#f3f7ffff","u16":[62403,63494,65418,65535]}}, +{"amount":1,"gain":0,"in":"#1d99f3ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#1d99f3ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#1d99f3ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#1d99f3ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#1d99f3ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#1d99f3ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#1d99f3ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#1d99f3ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#dee0e2ff","out":{"hex":"#9dd5ffff","u16":[40355,54640,65535,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#dee0e2ff","out":{"hex":"#b6d2eaff","u16":[46720,53846,60050,65535]}}, +{"amount":-0.5,"gain":1,"in":"#dee0e2ff","out":{"hex":"#cbced2ff","u16":[52184,53038,53885,65535]}}, +{"amount":-0.5,"gain":2,"in":"#dee0e2ff","out":{"hex":"#cececeff","u16":[52920,52920,52920,65535]}}, +{"amount":0,"gain":0,"in":"#dee0e2ff","out":{"hex":"#c4e4ffff","u16":[50464,58543,65535,65535]}}, +{"amount":0,"gain":0.5,"in":"#dee0e2ff","out":{"hex":"#d2e2f1ff","u16":[53880,58058,61943,65535]}}, +{"amount":0,"gain":1,"in":"#dee0e2ff","out":{"hex":"#dee0e2ff","u16":[57054,57568,58082,65535]}}, +{"amount":0,"gain":2,"in":"#dee0e2ff","out":{"hex":"#e0e0e0ff","u16":[57497,57497,57497,65535]}}, +{"amount":0.1,"gain":0,"in":"#dee0e2ff","out":{"hex":"#cbe7ffff","u16":[52210,59287,65535,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#dee0e2ff","out":{"hex":"#d7e5f2ff","u16":[55180,58857,62314,65535]}}, +{"amount":0.1,"gain":1,"in":"#dee0e2ff","out":{"hex":"#e2e3e5ff","u16":[57970,58424,58879,65535]}}, +{"amount":0.1,"gain":2,"in":"#dee0e2ff","out":{"hex":"#e3e3e3ff","u16":[58361,58361,58361,65535]}}, +{"amount":0.25,"gain":0,"in":"#dee0e2ff","out":{"hex":"#d5ebffff","u16":[54705,60383,65535,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#dee0e2ff","out":{"hex":"#deeaf5ff","u16":[57064,60033,62864,65535]}}, +{"amount":0.25,"gain":1,"in":"#dee0e2ff","out":{"hex":"#e7e8eaff","u16":[59311,59680,60050,65535]}}, +{"amount":0.25,"gain":2,"in":"#dee0e2ff","out":{"hex":"#e8e8e8ff","u16":[59629,59629,59629,65535]}}, +{"amount":0.5,"gain":0,"in":"#dee0e2ff","out":{"hex":"#e4f2ffff","u16":[58583,62157,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#dee0e2ff","out":{"hex":"#eaf1f8ff","u16":[60048,61932,63769,65535]}}, +{"amount":0.5,"gain":1,"in":"#dee0e2ff","out":{"hex":"#eff0f1ff","u16":[61470,61706,61943,65535]}}, +{"amount":0.5,"gain":2,"in":"#dee0e2ff","out":{"hex":"#f0f0f0ff","u16":[61673,61673,61673,65535]}}, +{"amount":0.75,"gain":0,"in":"#dee0e2ff","out":{"hex":"#f2f9ffff","u16":[62176,63873,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#dee0e2ff","out":{"hex":"#f5f8fcff","u16":[62863,63764,64659,65535]}}, +{"amount":0.75,"gain":1,"in":"#dee0e2ff","out":{"hex":"#f7f8f8ff","u16":[63542,63655,63769,65535]}}, +{"amount":0.75,"gain":2,"in":"#dee0e2ff","out":{"hex":"#f8f8f8ff","u16":[63639,63639,63639,65535]}}, +{"amount":0.9,"gain":0,"in":"#dee0e2ff","out":{"hex":"#fafcffff","u16":[64217,64876,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#dee0e2ff","out":{"hex":"#fbfcfeff","u16":[64482,64834,65186,65535]}}, +{"amount":0.9,"gain":1,"in":"#dee0e2ff","out":{"hex":"#fcfcfcff","u16":[64746,64791,64836,65535]}}, +{"amount":0.9,"gain":2,"in":"#dee0e2ff","out":{"hex":"#fcfcfcff","u16":[64785,64785,64785,65535]}}, +{"amount":1,"gain":0,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#292c30ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#292c30ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#292c30ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#292c30ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#292c30ff","out":{"hex":"#002e45ff","u16":[0,11820,17816,65535]}}, +{"amount":0,"gain":0.5,"in":"#292c30ff","out":{"hex":"#1e2d3cff","u16":[7689,11567,15371,65535]}}, +{"amount":0,"gain":1,"in":"#292c30ff","out":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]}}, +{"amount":0,"gain":2,"in":"#292c30ff","out":{"hex":"#2c2c2cff","u16":[11229,11229,11229,65535]}}, +{"amount":0.1,"gain":0,"in":"#292c30ff","out":{"hex":"#006699ff","u16":[0,26172,39448,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#292c30ff","out":{"hex":"#426484ff","u16":[17026,25612,34035,65535]}}, +{"amount":0.1,"gain":1,"in":"#292c30ff","out":{"hex":"#5b616aff","u16":[23331,25038,27314,65535]}}, +{"amount":0.1,"gain":2,"in":"#292c30ff","out":{"hex":"#616161ff","u16":[24863,24863,24863,65535]}}, +{"amount":0.25,"gain":0,"in":"#292c30ff","out":{"hex":"#0093ddff","u16":[0,37753,56904,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#292c30ff","out":{"hex":"#6090bfff","u16":[24559,36946,49095,65535]}}, +{"amount":0.25,"gain":1,"in":"#292c30ff","out":{"hex":"#838d99ff","u16":[33655,36118,39401,65535]}}, +{"amount":0.25,"gain":2,"in":"#292c30ff","out":{"hex":"#8c8c8cff","u16":[35864,35864,35864,65535]}}, +{"amount":0.5,"gain":0,"in":"#292c30ff","out":{"hex":"#83c1ffff","u16":[33748,49674,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#292c30ff","out":{"hex":"#9fbfe5ff","u16":[40830,49069,58779,65535]}}, +{"amount":0.5,"gain":1,"in":"#292c30ff","out":{"hex":"#b6bdc6ff","u16":[46677,48456,50929,65535]}}, +{"amount":0.5,"gain":2,"in":"#292c30ff","out":{"hex":"#bcbcbcff","u16":[48269,48269,48269,65535]}}, +{"amount":0.75,"gain":0,"in":"#292c30ff","out":{"hex":"#cde3ffff","u16":[52585,58255,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#292c30ff","out":{"hex":"#d6e2f2ff","u16":[54871,58006,62267,65535]}}, +{"amount":0.75,"gain":1,"in":"#292c30ff","out":{"hex":"#dee1e5ff","u16":[57047,57757,58779,65535]}}, +{"amount":0.75,"gain":2,"in":"#292c30ff","out":{"hex":"#e0e0e0ff","u16":[57681,57681,57681,65535]}}, +{"amount":0.9,"gain":0,"in":"#292c30ff","out":{"hex":"#ecf4ffff","u16":[60752,62744,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#292c30ff","out":{"hex":"#eff4faff","u16":[61535,62654,64252,65535]}}, +{"amount":0.9,"gain":1,"in":"#292c30ff","out":{"hex":"#f2f3f5ff","u16":[62306,62563,62937,65535]}}, +{"amount":0.9,"gain":2,"in":"#292c30ff","out":{"hex":"#f3f3f3ff","u16":[62535,62535,62535,65535]}}, +{"amount":1,"gain":0,"in":"#292c30ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#292c30ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#292c30ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#292c30ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#292c30ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#292c30ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#292c30ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#292c30ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#e93a9aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#e93a9aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#e93a9aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#e93a9aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#e93a9aff","out":{"hex":"#f8009eff","u16":[63783,0,40725,65535]}}, +{"amount":0,"gain":0.5,"in":"#e93a9aff","out":{"hex":"#f12a9cff","u16":[61869,10878,40157,65535]}}, +{"amount":0,"gain":1,"in":"#e93a9aff","out":{"hex":"#e93a9aff","u16":[59881,14906,39578,65535]}}, +{"amount":0,"gain":2,"in":"#e93a9aff","out":{"hex":"#d94f95ff","u16":[55647,20426,38389,65535]}}, +{"amount":0.1,"gain":0,"in":"#e93a9aff","out":{"hex":"#ff53adff","u16":[65535,21211,44424,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#e93a9aff","out":{"hex":"#f85aabff","u16":[63736,23250,43927,65535]}}, +{"amount":0.1,"gain":1,"in":"#e93a9aff","out":{"hex":"#f162a9ff","u16":[61873,25095,43422,65535]}}, +{"amount":0.1,"gain":2,"in":"#e93a9aff","out":{"hex":"#e16ea5ff","u16":[57931,28365,42392,65535]}}, +{"amount":0.25,"gain":0,"in":"#e93a9aff","out":{"hex":"#ff84beff","u16":[65535,34018,48724,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#e93a9aff","out":{"hex":"#f988bcff","u16":[64040,35020,48354,65535]}}, +{"amount":0.25,"gain":1,"in":"#e93a9aff","out":{"hex":"#f38cbbff","u16":[62501,35990,47980,65535]}}, +{"amount":0.25,"gain":2,"in":"#e93a9aff","out":{"hex":"#e793b8ff","u16":[59280,37839,47222,65535]}}, +{"amount":0.5,"gain":0,"in":"#e93a9aff","out":{"hex":"#ffb9d6ff","u16":[65535,47425,55020,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#e93a9aff","out":{"hex":"#fbbad5ff","u16":[64543,47879,54807,65535]}}, +{"amount":0.5,"gain":1,"in":"#e93a9aff","out":{"hex":"#f7bcd4ff","u16":[63532,48328,54594,65535]}}, +{"amount":0.5,"gain":2,"in":"#e93a9aff","out":{"hex":"#efbfd3ff","u16":[61450,49211,54163,65535]}}, +{"amount":0.75,"gain":0,"in":"#e93a9aff","out":{"hex":"#ffdfecff","u16":[65535,57343,60552,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#e93a9aff","out":{"hex":"#fde0ebff","u16":[65041,57524,60457,65535]}}, +{"amount":0.75,"gain":1,"in":"#e93a9aff","out":{"hex":"#fbe1ebff","u16":[64543,57705,60362,65535]}}, +{"amount":0.75,"gain":2,"in":"#e93a9aff","out":{"hex":"#f7e2eaff","u16":[63532,58064,60172,65535]}}, +{"amount":0.9,"gain":0,"in":"#e93a9aff","out":{"hex":"#fff3f7ff","u16":[65535,62413,63598,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#e93a9aff","out":{"hex":"#fef3f7ff","u16":[65338,62479,63562,65535]}}, +{"amount":0.9,"gain":1,"in":"#e93a9aff","out":{"hex":"#fdf3f7ff","u16":[65140,62544,63527,65535]}}, +{"amount":0.9,"gain":2,"in":"#e93a9aff","out":{"hex":"#fcf4f7ff","u16":[64743,62675,63455,65535]}}, +{"amount":1,"gain":0,"in":"#e93a9aff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#e93a9aff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#e93a9aff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#e93a9aff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#e93a9aff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#e93a9aff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#e93a9aff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#e93a9aff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#e93d58ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#e93d58ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#e93d58ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#e93d58ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#e93d58ff","out":{"hex":"#fc004bff","u16":[64772,0,19159,65535]}}, +{"amount":0,"gain":0.5,"in":"#e93d58ff","out":{"hex":"#f32d52ff","u16":[62384,11440,20973,65535]}}, +{"amount":0,"gain":1,"in":"#e93d58ff","out":{"hex":"#e93d58ff","u16":[59881,15677,22616,65535]}}, +{"amount":0,"gain":2,"in":"#e93d58ff","out":{"hex":"#d45463ff","u16":[54456,21483,25532,65535]}}, +{"amount":0.1,"gain":0,"in":"#e93d58ff","out":{"hex":"#ff576eff","u16":[65535,22333,28148,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#e93d58ff","out":{"hex":"#f65f72ff","u16":[63350,24386,29246,65535]}}, +{"amount":0.1,"gain":1,"in":"#e93d58ff","out":{"hex":"#ee6676ff","u16":[61070,26250,30297,65535]}}, +{"amount":0.1,"gain":2,"in":"#e93d58ff","out":{"hex":"#db737eff","u16":[56174,29567,32278,65535]}}, +{"amount":0.25,"gain":0,"in":"#e93d58ff","out":{"hex":"#ff8693ff","u16":[65535,34560,37712,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#e93d58ff","out":{"hex":"#f88b95ff","u16":[63720,35611,38365,65535]}}, +{"amount":0.25,"gain":1,"in":"#e93d58ff","out":{"hex":"#f18f98ff","u16":[61841,36625,39004,65535]}}, +{"amount":0.25,"gain":2,"in":"#e93d58ff","out":{"hex":"#e1969dff","u16":[57862,38558,40247,65535]}}, +{"amount":0.5,"gain":0,"in":"#e93d58ff","out":{"hex":"#ffb9bfff","u16":[65535,47670,49149,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#e93d58ff","out":{"hex":"#fabbc0ff","u16":[64332,48151,49468,65535]}}, +{"amount":0.5,"gain":1,"in":"#e93d58ff","out":{"hex":"#f6bdc2ff","u16":[63101,48627,49784,65535]}}, +{"amount":0.5,"gain":2,"in":"#e93d58ff","out":{"hex":"#ecc1c4ff","u16":[60549,49563,50409,65535]}}, +{"amount":0.75,"gain":0,"in":"#e93d58ff","out":{"hex":"#ffe0e2ff","u16":[65535,57440,58039,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#e93d58ff","out":{"hex":"#fde0e2ff","u16":[64937,57634,58170,65535]}}, +{"amount":0.75,"gain":1,"in":"#e93d58ff","out":{"hex":"#fae1e3ff","u16":[64332,57826,58300,65535]}}, +{"amount":0.75,"gain":2,"in":"#e93d58ff","out":{"hex":"#f6e2e4ff","u16":[63101,58209,58560,65535]}}, +{"amount":0.9,"gain":0,"in":"#e93d58ff","out":{"hex":"#fff3f4ff","u16":[65535,62448,62666,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#e93d58ff","out":{"hex":"#fef3f4ff","u16":[65297,62518,62713,65535]}}, +{"amount":0.9,"gain":1,"in":"#e93d58ff","out":{"hex":"#fdf4f4ff","u16":[65057,62588,62761,65535]}}, +{"amount":0.9,"gain":2,"in":"#e93d58ff","out":{"hex":"#fbf4f5ff","u16":[64575,62728,62857,65535]}}, +{"amount":1,"gain":0,"in":"#e93d58ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#e93d58ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#e93d58ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#e93d58ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#e93d58ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#e93d58ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#e93d58ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#e93d58ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#e9643aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#e9643aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#e9643aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#e9643aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#e9643aff","out":{"hex":"#f55b00ff","u16":[62857,23421,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#e9643aff","out":{"hex":"#ef602aff","u16":[61391,24592,10878,65535]}}, +{"amount":0,"gain":1,"in":"#e9643aff","out":{"hex":"#e9643aff","u16":[59881,25700,14906,65535]}}, +{"amount":0,"gain":2,"in":"#e9643aff","out":{"hex":"#dd6c4fff","u16":[56716,27759,20426,65535]}}, +{"amount":0.1,"gain":0,"in":"#e9643aff","out":{"hex":"#ff734bff","u16":[65535,29554,19196,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#e9643aff","out":{"hex":"#f97754ff","u16":[64110,30470,21575,65535]}}, +{"amount":0.1,"gain":1,"in":"#e9643aff","out":{"hex":"#f47a5cff","u16":[62646,31354,23674,65535]}}, +{"amount":0.1,"gain":2,"in":"#e9643aff","out":{"hex":"#e8816aff","u16":[59588,33039,27312,65535]}}, +{"amount":0.25,"gain":0,"in":"#e9643aff","out":{"hex":"#ff9681ff","u16":[65535,38550,33105,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#e9643aff","out":{"hex":"#fa9885ff","u16":[64350,39111,34191,65535]}}, +{"amount":0.25,"gain":1,"in":"#e9643aff","out":{"hex":"#f69a89ff","u16":[63139,39662,35238,65535]}}, +{"amount":0.25,"gain":2,"in":"#e9643aff","out":{"hex":"#ec9f91ff","u16":[60628,40737,37227,65535]}}, +{"amount":0.5,"gain":0,"in":"#e9643aff","out":{"hex":"#ffc1b7ff","u16":[65535,49559,47021,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#e9643aff","out":{"hex":"#fcc2b9ff","u16":[64748,49837,47503,65535]}}, +{"amount":0.5,"gain":1,"in":"#e9643aff","out":{"hex":"#f9c3bbff","u16":[63949,50113,47979,65535]}}, +{"amount":0.5,"gain":2,"in":"#e9643aff","out":{"hex":"#f2c5beff","u16":[62315,50660,48915,65535]}}, +{"amount":0.75,"gain":0,"in":"#e9643aff","out":{"hex":"#ffe2dfff","u16":[65535,58208,57183,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#e9643aff","out":{"hex":"#fde3dfff","u16":[65143,58322,57374,65535]}}, +{"amount":0.75,"gain":1,"in":"#e9643aff","out":{"hex":"#fce3e0ff","u16":[64748,58437,57564,65535]}}, +{"amount":0.75,"gain":2,"in":"#e9643aff","out":{"hex":"#f9e4e1ff","u16":[63949,58665,57943,65535]}}, +{"amount":0.9,"gain":0,"in":"#e9643aff","out":{"hex":"#fff4f3ff","u16":[65535,62727,62355,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#e9643aff","out":{"hex":"#fef4f3ff","u16":[65379,62769,62424,65535]}}, +{"amount":0.9,"gain":1,"in":"#e9643aff","out":{"hex":"#fef4f3ff","u16":[65222,62811,62493,65535]}}, +{"amount":0.9,"gain":2,"in":"#e9643aff","out":{"hex":"#fdf5f4ff","u16":[64906,62895,62631,65535]}}, +{"amount":1,"gain":0,"in":"#e9643aff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#e9643aff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#e9643aff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#e9643aff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#e9643aff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#e9643aff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#e9643aff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#e9643aff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#e8cb2dff","out":{"hex":"#c3aa00ff","u16":[50141,43683,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#e8cb2dff","out":{"hex":"#c3aa1bff","u16":[50034,43684,7067,65535]}}, +{"amount":-0.5,"gain":1,"in":"#e8cb2dff","out":{"hex":"#c2aa26ff","u16":[49926,43686,9684,65535]}}, +{"amount":-0.5,"gain":2,"in":"#e8cb2dff","out":{"hex":"#c1aa34ff","u16":[49710,43688,13270,65535]}}, +{"amount":0,"gain":0,"in":"#e8cb2dff","out":{"hex":"#e9cb00ff","u16":[59881,52168,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#e8cb2dff","out":{"hex":"#e8cb21ff","u16":[59752,52170,8439,65535]}}, +{"amount":0,"gain":1,"in":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"gain":2,"in":"#e8cb2dff","out":{"hex":"#e7cb3eff","u16":[59366,52174,15848,65535]}}, +{"amount":0.1,"gain":0,"in":"#e8cb2dff","out":{"hex":"#f0d100ff","u16":[61610,53675,0,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#e8cb2dff","out":{"hex":"#efd122ff","u16":[61479,53677,8683,65535]}}, +{"amount":0.1,"gain":1,"in":"#e8cb2dff","out":{"hex":"#efd12eff","u16":[61346,53678,11899,65535]}}, +{"amount":0.1,"gain":2,"in":"#e8cb2dff","out":{"hex":"#eed13fff","u16":[61081,53681,16306,65535]}}, +{"amount":0.25,"gain":0,"in":"#e8cb2dff","out":{"hex":"#f9d900ff","u16":[64101,55845,0,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#e8cb2dff","out":{"hex":"#f9d923ff","u16":[63964,55847,9034,65535]}}, +{"amount":0.25,"gain":1,"in":"#e8cb2dff","out":{"hex":"#f8d930ff","u16":[63826,55848,12380,65535]}}, +{"amount":0.25,"gain":2,"in":"#e8cb2dff","out":{"hex":"#f7d942ff","u16":[63550,55851,16965,65535]}}, +{"amount":0.5,"gain":0,"in":"#e8cb2dff","out":{"hex":"#ffe786ff","u16":[65535,59278,34443,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#e8cb2dff","out":{"hex":"#ffe789ff","u16":[65429,59279,35091,65535]}}, +{"amount":0.5,"gain":1,"in":"#e8cb2dff","out":{"hex":"#fee78bff","u16":[65323,59280,35725,65535]}}, +{"amount":0.5,"gain":2,"in":"#e8cb2dff","out":{"hex":"#fde790ff","u16":[65109,59282,36953,65535]}}, +{"amount":0.75,"gain":0,"in":"#e8cb2dff","out":{"hex":"#fff3cdff","u16":[65535,62500,52791,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#e8cb2dff","out":{"hex":"#fff3ceff","u16":[65482,62501,52987,65535]}}, +{"amount":0.75,"gain":1,"in":"#e8cb2dff","out":{"hex":"#fff3cfff","u16":[65429,62501,53182,65535]}}, +{"amount":0.75,"gain":2,"in":"#e8cb2dff","out":{"hex":"#fef3d0ff","u16":[65323,62502,53569,65535]}}, +{"amount":0.9,"gain":0,"in":"#e8cb2dff","out":{"hex":"#fffaedff","u16":[65535,64342,60822,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#e8cb2dff","out":{"hex":"#fffaedff","u16":[65514,64342,60888,65535]}}, +{"amount":0.9,"gain":1,"in":"#e8cb2dff","out":{"hex":"#fffaedff","u16":[65493,64342,60954,65535]}}, +{"amount":0.9,"gain":2,"in":"#e8cb2dff","out":{"hex":"#fffaeeff","u16":[65450,64343,61086,65535]}}, +{"amount":1,"gain":0,"in":"#e8cb2dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#e8cb2dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#e8cb2dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#e8cb2dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#e8cb2dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#e8cb2dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#e8cb2dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#e8cb2dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#3dd425ff","out":{"hex":"#259700ff","u16":[9402,38890,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#3dd425ff","out":{"hex":"#289713ff","u16":[10320,38819,4935,65535]}}, +{"amount":-0.5,"gain":1,"in":"#3dd425ff","out":{"hex":"#2b971aff","u16":[11149,38747,6762,65535]}}, +{"amount":-0.5,"gain":2,"in":"#3dd425ff","out":{"hex":"#319624ff","u16":[12617,38603,9267,65535]}}, +{"amount":0,"gain":0,"in":"#3dd425ff","out":{"hex":"#33d500ff","u16":[13220,54686,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#3dd425ff","out":{"hex":"#38d41bff","u16":[14511,54585,6939,65535]}}, +{"amount":0,"gain":1,"in":"#3dd425ff","out":{"hex":"#3dd425ff","u16":[15677,54484,9509,65535]}}, +{"amount":0,"gain":2,"in":"#3dd425ff","out":{"hex":"#45d333ff","u16":[17741,54281,13031,65535]}}, +{"amount":0.1,"gain":0,"in":"#3dd425ff","out":{"hex":"#36df00ff","u16":[13837,57237,0,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#3dd425ff","out":{"hex":"#3bde1cff","u16":[15188,57132,7263,65535]}}, +{"amount":0.1,"gain":1,"in":"#3dd425ff","out":{"hex":"#40de27ff","u16":[16408,57026,9953,65535]}}, +{"amount":0.1,"gain":2,"in":"#3dd425ff","out":{"hex":"#48dd35ff","u16":[18568,56814,13639,65535]}}, +{"amount":0.25,"gain":0,"in":"#3dd425ff","out":{"hex":"#39ed00ff","u16":[14705,60826,0,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#3dd425ff","out":{"hex":"#3fec1eff","u16":[16141,60714,7718,65535]}}, +{"amount":0.25,"gain":1,"in":"#3dd425ff","out":{"hex":"#44ec29ff","u16":[17437,60602,10577,65535]}}, +{"amount":0.25,"gain":2,"in":"#3dd425ff","out":{"hex":"#4deb38ff","u16":[19733,60376,14494,65535]}}, +{"amount":0.5,"gain":0,"in":"#3dd425ff","out":{"hex":"#5dff4bff","u16":[23932,65535,19313,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#3dd425ff","out":{"hex":"#61ff50ff","u16":[24842,65422,20547,65535]}}, +{"amount":0.5,"gain":1,"in":"#3dd425ff","out":{"hex":"#64fe54ff","u16":[25714,65310,21698,65535]}}, +{"amount":0.5,"gain":2,"in":"#3dd425ff","out":{"hex":"#6afd5dff","u16":[27358,65083,23804,65535]}}, +{"amount":0.75,"gain":0,"in":"#3dd425ff","out":{"hex":"#c3ffc0ff","u16":[50127,65535,49276,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#3dd425ff","out":{"hex":"#c4ffc1ff","u16":[50318,65479,49483,65535]}}, +{"amount":0.75,"gain":1,"in":"#3dd425ff","out":{"hex":"#c5ffc1ff","u16":[50508,65422,49690,65535]}}, +{"amount":0.75,"gain":2,"in":"#3dd425ff","out":{"hex":"#c6fec3ff","u16":[50886,65310,50100,65535]}}, +{"amount":0.9,"gain":0,"in":"#3dd425ff","out":{"hex":"#e9ffe8ff","u16":[59942,65535,59669,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#3dd425ff","out":{"hex":"#e9ffe8ff","u16":[60004,65513,59736,65535]}}, +{"amount":0.9,"gain":1,"in":"#3dd425ff","out":{"hex":"#eaffe9ff","u16":[60066,65490,59802,65535]}}, +{"amount":0.9,"gain":2,"in":"#3dd425ff","out":{"hex":"#eaffe9ff","u16":[60189,65445,59934,65535]}}, +{"amount":1,"gain":0,"in":"#3dd425ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#3dd425ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#3dd425ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#3dd425ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#3dd425ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#3dd425ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#3dd425ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#3dd425ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#00d3b8ff","out":{"hex":"#009c88ff","u16":[0,40043,34919,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#00d3b8ff","out":{"hex":"#009c88ff","u16":[0,40043,34919,65535]}}, +{"amount":-0.5,"gain":1,"in":"#00d3b8ff","out":{"hex":"#009c88ff","u16":[0,40043,34919,65535]}}, +{"amount":-0.5,"gain":2,"in":"#00d3b8ff","out":{"hex":"#009c88ff","u16":[0,40043,34919,65535]}}, +{"amount":0,"gain":0,"in":"#00d3b8ff","out":{"hex":"#00d3b8ff","u16":[0,54227,47288,65535]}}, +{"amount":0,"gain":0.5,"in":"#00d3b8ff","out":{"hex":"#00d3b8ff","u16":[0,54227,47288,65535]}}, +{"amount":0,"gain":1,"in":"#00d3b8ff","out":{"hex":"#00d3b8ff","u16":[0,54227,47288,65535]}}, +{"amount":0,"gain":2,"in":"#00d3b8ff","out":{"hex":"#00d3b8ff","u16":[0,54227,47288,65535]}}, +{"amount":0.1,"gain":0,"in":"#00d3b8ff","out":{"hex":"#00dcc0ff","u16":[0,56566,49328,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#00d3b8ff","out":{"hex":"#00dcc0ff","u16":[0,56566,49328,65535]}}, +{"amount":0.1,"gain":1,"in":"#00d3b8ff","out":{"hex":"#00dcc0ff","u16":[0,56566,49328,65535]}}, +{"amount":0.1,"gain":2,"in":"#00d3b8ff","out":{"hex":"#00dcc0ff","u16":[0,56566,49328,65535]}}, +{"amount":0.25,"gain":0,"in":"#00d3b8ff","out":{"hex":"#00e9cbff","u16":[0,59871,52210,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#00d3b8ff","out":{"hex":"#00e9cbff","u16":[0,59871,52210,65535]}}, +{"amount":0.25,"gain":1,"in":"#00d3b8ff","out":{"hex":"#00e9cbff","u16":[0,59871,52210,65535]}}, +{"amount":0.25,"gain":2,"in":"#00d3b8ff","out":{"hex":"#00e9cbff","u16":[0,59871,52210,65535]}}, +{"amount":0.5,"gain":0,"in":"#00d3b8ff","out":{"hex":"#00fddcff","u16":[0,64940,56630,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#00d3b8ff","out":{"hex":"#00fddcff","u16":[0,64940,56630,65535]}}, +{"amount":0.5,"gain":1,"in":"#00d3b8ff","out":{"hex":"#00fddcff","u16":[0,64940,56630,65535]}}, +{"amount":0.5,"gain":2,"in":"#00d3b8ff","out":{"hex":"#00fddcff","u16":[0,64940,56630,65535]}}, +{"amount":0.75,"gain":0,"in":"#00d3b8ff","out":{"hex":"#b4ffeeff","u16":[46362,65535,61237,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#00d3b8ff","out":{"hex":"#b4ffeeff","u16":[46362,65535,61237,65535]}}, +{"amount":0.75,"gain":1,"in":"#00d3b8ff","out":{"hex":"#b4ffeeff","u16":[46362,65535,61237,65535]}}, +{"amount":0.75,"gain":2,"in":"#00d3b8ff","out":{"hex":"#b4ffeeff","u16":[46362,65535,61237,65535]}}, +{"amount":0.9,"gain":0,"in":"#00d3b8ff","out":{"hex":"#e5fff8ff","u16":[58768,65535,63857,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#00d3b8ff","out":{"hex":"#e5fff8ff","u16":[58768,65535,63857,65535]}}, +{"amount":0.9,"gain":1,"in":"#00d3b8ff","out":{"hex":"#e5fff8ff","u16":[58768,65535,63857,65535]}}, +{"amount":0.9,"gain":2,"in":"#00d3b8ff","out":{"hex":"#e5fff8ff","u16":[58768,65535,63857,65535]}}, +{"amount":1,"gain":0,"in":"#00d3b8ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#00d3b8ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#00d3b8ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#00d3b8ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#00d3b8ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#00d3b8ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#00d3b8ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#00d3b8ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#b875dcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#b875dcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#b875dcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#b875dcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#b875dcff","out":{"hex":"#cd5fffff","u16":[52594,24416,65535,65535]}}, +{"amount":0,"gain":0.5,"in":"#b875dcff","out":{"hex":"#c36beeff","u16":[50026,27418,61236,65535]}}, +{"amount":0,"gain":1,"in":"#b875dcff","out":{"hex":"#b875dcff","u16":[47288,30069,56540,65535]}}, +{"amount":0,"gain":2,"in":"#b875dcff","out":{"hex":"#a087b1ff","u16":[41148,34667,45372,65535]}}, +{"amount":0.1,"gain":0,"in":"#b875dcff","out":{"hex":"#d27bffff","u16":[54058,31714,65535,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#b875dcff","out":{"hex":"#ca83f0ff","u16":[51831,33755,61682,65535]}}, +{"amount":0.1,"gain":1,"in":"#b875dcff","out":{"hex":"#c18be0ff","u16":[49484,35658,57516,65535]}}, +{"amount":0.1,"gain":2,"in":"#b875dcff","out":{"hex":"#ad98baff","u16":[44336,39138,47859,65535]}}, +{"amount":0.25,"gain":0,"in":"#b875dcff","out":{"hex":"#db9bffff","u16":[56168,39888,65535,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#b875dcff","out":{"hex":"#d4a0f3ff","u16":[54407,41204,62344,65535]}}, +{"amount":0.25,"gain":1,"in":"#b875dcff","out":{"hex":"#cda5e5ff","u16":[52574,42472,58944,65535]}}, +{"amount":0.25,"gain":2,"in":"#b875dcff","out":{"hex":"#bdafc8ff","u16":[48658,44879,51322,65535]}}, +{"amount":0.5,"gain":0,"in":"#b875dcff","out":{"hex":"#e7c3ffff","u16":[59488,50227,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#b875dcff","out":{"hex":"#e3c6f7ff","u16":[58401,50900,63429,65535]}}, +{"amount":0.5,"gain":1,"in":"#b875dcff","out":{"hex":"#dfc9eeff","u16":[57288,51563,61236,65535]}}, +{"amount":0.5,"gain":2,"in":"#b875dcff","out":{"hex":"#d6cedcff","u16":[54982,52859,56540,65535]}}, +{"amount":0.75,"gain":0,"in":"#b875dcff","out":{"hex":"#f4e4ffff","u16":[62599,58485,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#b875dcff","out":{"hex":"#f2e5fbff","u16":[62091,58766,64492,65535]}}, +{"amount":0.75,"gain":1,"in":"#b875dcff","out":{"hex":"#f0e6f7ff","u16":[61578,59047,63429,65535]}}, +{"amount":0.75,"gain":2,"in":"#b875dcff","out":{"hex":"#ece8eeff","u16":[60535,59602,61236,65535]}}, +{"amount":0.9,"gain":0,"in":"#b875dcff","out":{"hex":"#fbf4ffff","u16":[64380,62829,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#b875dcff","out":{"hex":"#faf5fdff","u16":[64184,62932,65120,65535]}}, +{"amount":0.9,"gain":1,"in":"#b875dcff","out":{"hex":"#f9f5fcff","u16":[63987,63036,64703,65535]}}, +{"amount":0.9,"gain":2,"in":"#b875dcff","out":{"hex":"#f7f6f8ff","u16":[63592,63242,63857,65535]}}, +{"amount":1,"gain":0,"in":"#b875dcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#b875dcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#b875dcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#b875dcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#b875dcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#b875dcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#b875dcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#b875dcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#926ee4ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#926ee4ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#926ee4ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#926ee4ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#926ee4ff","out":{"hex":"#9764ffff","u16":[38919,25738,65535,65535]}}, +{"amount":0,"gain":0.5,"in":"#926ee4ff","out":{"hex":"#9569f2ff","u16":[38228,27040,62182,65535]}}, +{"amount":0,"gain":1,"in":"#926ee4ff","out":{"hex":"#926ee4ff","u16":[37522,28270,58596,65535]}}, +{"amount":0,"gain":2,"in":"#926ee4ff","out":{"hex":"#8c77c4ff","u16":[36059,30555,50494,65535]}}, +{"amount":0.1,"gain":0,"in":"#926ee4ff","out":{"hex":"#a57fffff","u16":[42517,32597,65535,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#926ee4ff","out":{"hex":"#a382f3ff","u16":[41959,33491,62527,65535]}}, +{"amount":0.1,"gain":1,"in":"#926ee4ff","out":{"hex":"#a186e7ff","u16":[41392,34358,59334,65535]}}, +{"amount":0.1,"gain":2,"in":"#926ee4ff","out":{"hex":"#9d8ccbff","u16":[40230,36016,52236,65535]}}, +{"amount":0.25,"gain":0,"in":"#926ee4ff","out":{"hex":"#b89dffff","u16":[47313,40452,65535,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#926ee4ff","out":{"hex":"#b7a0f5ff","u16":[46905,41032,63040,65535]}}, +{"amount":0.25,"gain":1,"in":"#926ee4ff","out":{"hex":"#b5a2ebff","u16":[46493,41602,60421,65535]}}, +{"amount":0.25,"gain":2,"in":"#926ee4ff","out":{"hex":"#b2a6d5ff","u16":[45656,42714,54725,65535]}}, +{"amount":0.5,"gain":0,"in":"#926ee4ff","out":{"hex":"#d3c5ffff","u16":[54214,50514,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#926ee4ff","out":{"hex":"#d2c6f9ff","u16":[53984,50811,63885,65535]}}, +{"amount":0.5,"gain":1,"in":"#926ee4ff","out":{"hex":"#d1c7f2ff","u16":[53753,51107,62182,65535]}}, +{"amount":0.5,"gain":2,"in":"#926ee4ff","out":{"hex":"#cfc9e4ff","u16":[53286,51691,58596,65535]}}, +{"amount":0.75,"gain":0,"in":"#926ee4ff","out":{"hex":"#eae4ffff","u16":[60195,58604,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#926ee4ff","out":{"hex":"#eae5fcff","u16":[60093,58729,64716,65535]}}, +{"amount":0.75,"gain":1,"in":"#926ee4ff","out":{"hex":"#e9e5f9ff","u16":[59992,58853,63885,65535]}}, +{"amount":0.75,"gain":2,"in":"#926ee4ff","out":{"hex":"#e9e6f2ff","u16":[59788,59101,62182,65535]}}, +{"amount":0.9,"gain":0,"in":"#926ee4ff","out":{"hex":"#f7f5ffff","u16":[63464,62873,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#926ee4ff","out":{"hex":"#f7f5feff","u16":[63426,62918,65209,65535]}}, +{"amount":0.9,"gain":1,"in":"#926ee4ff","out":{"hex":"#f7f5fcff","u16":[63387,62964,64881,65535]}}, +{"amount":0.9,"gain":2,"in":"#926ee4ff","out":{"hex":"#f6f5faff","u16":[63311,63056,64219,65535]}}, +{"amount":1,"gain":0,"in":"#926ee4ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#926ee4ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#926ee4ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#926ee4ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#926ee4ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#926ee4ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#926ee4ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#926ee4ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#686b6fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#686b6fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#686b6fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#686b6fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#686b6fff","out":{"hex":"#0071a7ff","u16":[0,28942,42977,65535]}}, +{"amount":0,"gain":0.5,"in":"#686b6fff","out":{"hex":"#4c6e8eff","u16":[19504,28231,36615,65535]}}, +{"amount":0,"gain":1,"in":"#686b6fff","out":{"hex":"#686b6fff","u16":[26728,27499,28527,65535]}}, +{"amount":0,"gain":2,"in":"#686b6fff","out":{"hex":"#6b6b6bff","u16":[27414,27414,27414,65535]}}, +{"amount":0.1,"gain":0,"in":"#686b6fff","out":{"hex":"#008bceff","u16":[0,35634,52915,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#686b6fff","out":{"hex":"#5d87afff","u16":[24015,34759,45082,65535]}}, +{"amount":0.1,"gain":1,"in":"#686b6fff","out":{"hex":"#808489ff","u16":[32908,33858,35123,65535]}}, +{"amount":0.1,"gain":2,"in":"#686b6fff","out":{"hex":"#838383ff","u16":[33752,33752,33752,65535]}}, +{"amount":0.25,"gain":0,"in":"#686b6fff","out":{"hex":"#00a9fbff","u16":[0,43499,64595,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#686b6fff","out":{"hex":"#72a5d6ff","u16":[29315,42432,55033,65535]}}, +{"amount":0.25,"gain":1,"in":"#686b6fff","out":{"hex":"#9ca1a7ff","u16":[40172,41331,42876,65535]}}, +{"amount":0.25,"gain":2,"in":"#686b6fff","out":{"hex":"#a0a0a0ff","u16":[41203,41203,41203,65535]}}, +{"amount":0.5,"gain":0,"in":"#686b6fff","out":{"hex":"#98cbffff","u16":[39098,52172,65535,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#686b6fff","out":{"hex":"#b0c9e6ff","u16":[45142,51575,59157,65535]}}, +{"amount":0.5,"gain":1,"in":"#686b6fff","out":{"hex":"#c4c6caff","u16":[50344,50969,51822,65535]}}, +{"amount":0.5,"gain":2,"in":"#686b6fff","out":{"hex":"#c6c6c6ff","u16":[50900,50900,50900,65535]}}, +{"amount":0.75,"gain":0,"in":"#686b6fff","out":{"hex":"#d3e7ffff","u16":[54274,59306,65535,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#686b6fff","out":{"hex":"#dce6f3ff","u16":[56452,59051,62444,65535]}}, +{"amount":0.75,"gain":1,"in":"#686b6fff","out":{"hex":"#e4e5e6ff","u16":[58533,58795,59157,65535]}}, +{"amount":0.75,"gain":2,"in":"#686b6fff","out":{"hex":"#e5e5e5ff","u16":[58766,58766,58766,65535]}}, +{"amount":0.9,"gain":0,"in":"#686b6fff","out":{"hex":"#eff6ffff","u16":[61328,63132,65535,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#686b6fff","out":{"hex":"#f2f5faff","u16":[62093,63038,64320,65535]}}, +{"amount":0.9,"gain":1,"in":"#686b6fff","out":{"hex":"#f5f5f5ff","u16":[62846,62943,63077,65535]}}, +{"amount":0.9,"gain":2,"in":"#686b6fff","out":{"hex":"#f5f5f5ff","u16":[62932,62932,62932,65535]}}, +{"amount":1,"gain":0,"in":"#686b6fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":0.5,"in":"#686b6fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":1,"in":"#686b6fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"gain":2,"in":"#686b6fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0,"in":"#686b6fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#686b6fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":1,"in":"#686b6fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"gain":2,"in":"#686b6fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0,"in":"#3daee980","out":{"hex":"#004f6c80","u16":[0,20301,27823,32896]}}, +{"amount":-0.5,"gain":0.5,"in":"#3daee980","out":{"hex":"#144f6b80","u16":[5155,20227,27408,32896]}}, +{"amount":-0.5,"gain":1,"in":"#3daee980","out":{"hex":"#1b4e6980","u16":[7065,20152,26985,32896]}}, +{"amount":-0.5,"gain":2,"in":"#3daee980","out":{"hex":"#264e6680","u16":[9681,20002,26115,32896]}}, +{"amount":0,"gain":0,"in":"#3daee980","out":{"hex":"#00aff080","u16":[0,45047,61740,32896]}}, +{"amount":0,"gain":0.5,"in":"#3daee980","out":{"hex":"#2dafed80","u16":[11440,44883,60819,32896]}}, +{"amount":0,"gain":1,"in":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"gain":2,"in":"#3daee980","out":{"hex":"#54ade180","u16":[21483,44386,57950,32896]}}, +{"amount":0.1,"gain":0,"in":"#3daee980","out":{"hex":"#28bbff80","u16":[10177,48176,65535,32896]}}, +{"amount":0.1,"gain":0.5,"in":"#3daee980","out":{"hex":"#3cbbfb80","u16":[15295,48006,64574,32896]}}, +{"amount":0.1,"gain":1,"in":"#3daee980","out":{"hex":"#4abaf780","u16":[18894,47835,63595,32896]}}, +{"amount":0.1,"gain":2,"in":"#3daee980","out":{"hex":"#5fb9f080","u16":[24327,47492,61581,32896]}}, +{"amount":0.25,"gain":0,"in":"#3daee980","out":{"hex":"#75c9ff80","u16":[30097,51565,65535,32896]}}, +{"amount":0.25,"gain":0.5,"in":"#3daee980","out":{"hex":"#7bc8fc80","u16":[31575,51434,64735,32896]}}, +{"amount":0.25,"gain":1,"in":"#3daee980","out":{"hex":"#80c8f980","u16":[32975,51304,63923,32896]}}, +{"amount":0.25,"gain":2,"in":"#3daee980","out":{"hex":"#8ac7f280","u16":[35579,51041,62261,32896]}}, +{"amount":0.5,"gain":0,"in":"#3daee980","out":{"hex":"#b2ddff80","u16":[45756,56685,65535,32896]}}, +{"amount":0.5,"gain":0.5,"in":"#3daee980","out":{"hex":"#b4dcfd80","u16":[46365,56607,65003,32896]}}, +{"amount":0.5,"gain":1,"in":"#3daee980","out":{"hex":"#b7dcfb80","u16":[46964,56529,64466,32896]}}, +{"amount":0.5,"gain":2,"in":"#3daee980","out":{"hex":"#bbdbf780","u16":[48137,56373,63375,32896]}}, +{"amount":0.75,"gain":0,"in":"#3daee980","out":{"hex":"#ddefff80","u16":[56688,61302,65535,32896]}}, +{"amount":0.75,"gain":0.5,"in":"#3daee980","out":{"hex":"#ddeefe80","u16":[56925,61266,65270,32896]}}, +{"amount":0.75,"gain":1,"in":"#3daee980","out":{"hex":"#deeefd80","u16":[57160,61231,65003,32896]}}, +{"amount":0.75,"gain":2,"in":"#3daee980","out":{"hex":"#e0eefb80","u16":[57628,61160,64466,32896]}}, +{"amount":0.9,"gain":0,"in":"#3daee980","out":{"hex":"#f2f9ff80","u16":[62177,63882,65535,32896]}}, +{"amount":0.9,"gain":0.5,"in":"#3daee980","out":{"hex":"#f2f9ff80","u16":[62262,63869,65429,32896]}}, +{"amount":0.9,"gain":1,"in":"#3daee980","out":{"hex":"#f3f8fe80","u16":[62347,63855,65323,32896]}}, +{"amount":0.9,"gain":2,"in":"#3daee980","out":{"hex":"#f3f8fd80","u16":[62516,63828,65110,32896]}}, +{"amount":1,"gain":0,"in":"#3daee980","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"amount":1,"gain":0.5,"in":"#3daee980","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"amount":1,"gain":1,"in":"#3daee980","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"amount":1,"gain":2,"in":"#3daee980","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"amount":1.5,"gain":0,"in":"#3daee980","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"amount":1.5,"gain":0.5,"in":"#3daee980","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"amount":1.5,"gain":1,"in":"#3daee980","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"amount":1.5,"gain":2,"in":"#3daee980","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"amount":-0.5,"gain":0,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"gain":0.5,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"gain":1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"gain":2,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"gain":0,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"gain":0.5,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"gain":1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"gain":2,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"gain":0,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"gain":0.5,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"gain":1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"gain":2,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.25,"gain":0,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.25,"gain":0.5,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.25,"gain":1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.25,"gain":2,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.5,"gain":0,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.5,"gain":0.5,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.5,"gain":1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.5,"gain":2,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.75,"gain":0,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.75,"gain":0.5,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.75,"gain":1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.75,"gain":2,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.9,"gain":0,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.9,"gain":0.5,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.9,"gain":1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.9,"gain":2,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1,"gain":0,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1,"gain":0.5,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1,"gain":1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1,"gain":2,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"gain":0,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"gain":0.5,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"gain":1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"gain":2,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"gain":0,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":-0.5,"gain":0.5,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":-0.5,"gain":1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":-0.5,"gain":2,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0,"gain":0,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0,"gain":0.5,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0,"gain":1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0,"gain":2,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.1,"gain":0,"in":"#00000080","out":{"hex":"#b5000080","u16":[46514,0,0,32896]}}, +{"amount":0.1,"gain":0.5,"in":"#00000080","out":{"hex":"#90414180","u16":[37051,16792,16792,32896]}}, +{"amount":0.1,"gain":1,"in":"#00000080","out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32896]}}, +{"amount":0.1,"gain":2,"in":"#00000080","out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32896]}}, +{"amount":0.25,"gain":0,"in":"#00000080","out":{"hex":"#ff404080","u16":[65535,16404,16404,32896]}}, +{"amount":0.25,"gain":0.5,"in":"#00000080","out":{"hex":"#ce6b6b80","u16":[52929,27562,27562,32896]}}, +{"amount":0.25,"gain":1,"in":"#00000080","out":{"hex":"#88888880","u16":[34899,34899,34899,32896]}}, +{"amount":0.25,"gain":2,"in":"#00000080","out":{"hex":"#88888880","u16":[34899,34899,34899,32896]}}, +{"amount":0.5,"gain":0,"in":"#00000080","out":{"hex":"#ffa1a180","u16":[65535,41449,41449,32896]}}, +{"amount":0.5,"gain":0.5,"in":"#00000080","out":{"hex":"#e0aeae80","u16":[57502,44773,44773,32896]}}, +{"amount":0.5,"gain":1,"in":"#00000080","out":{"hex":"#bababa80","u16":[47824,47824,47824,32896]}}, +{"amount":0.5,"gain":2,"in":"#00000080","out":{"hex":"#bababa80","u16":[47824,47824,47824,32896]}}, +{"amount":0.75,"gain":0,"in":"#00000080","out":{"hex":"#ffd6d680","u16":[65535,55089,55089,32896]}}, +{"amount":0.75,"gain":0.5,"in":"#00000080","out":{"hex":"#f0dbdb80","u16":[61676,56311,56311,32896]}}, +{"amount":0.75,"gain":1,"in":"#00000080","out":{"hex":"#e0e0e080","u16":[57502,57502,57502,32896]}}, +{"amount":0.75,"gain":2,"in":"#00000080","out":{"hex":"#e0e0e080","u16":[57502,57502,57502,32896]}}, +{"amount":0.9,"gain":0,"in":"#00000080","out":{"hex":"#fff0f080","u16":[65535,61611,61611,32896]}}, +{"amount":0.9,"gain":0.5,"in":"#00000080","out":{"hex":"#f9f1f180","u16":[64025,62043,62043,32896]}}, +{"amount":0.9,"gain":1,"in":"#00000080","out":{"hex":"#f3f3f380","u16":[62470,62470,62470,32896]}}, +{"amount":0.9,"gain":2,"in":"#00000080","out":{"hex":"#f3f3f380","u16":[62470,62470,62470,32896]}}, +{"amount":1,"gain":0,"in":"#00000080","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"amount":1,"gain":0.5,"in":"#00000080","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"amount":1,"gain":1,"in":"#00000080","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"amount":1,"gain":2,"in":"#00000080","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"amount":1.5,"gain":0,"in":"#00000080","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"amount":1.5,"gain":0.5,"in":"#00000080","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"amount":1.5,"gain":1,"in":"#00000080","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"amount":1.5,"gain":2,"in":"#00000080","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"amount":-0.5,"gain":0,"in":"#ff000033","out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"amount":-0.5,"gain":0.5,"in":"#ff000033","out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"amount":-0.5,"gain":1,"in":"#ff000033","out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"amount":-0.5,"gain":2,"in":"#ff000033","out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"amount":0,"gain":0,"in":"#ff000033","out":{"hex":"#ff000033","u16":[65535,0,0,13107]}}, +{"amount":0,"gain":0.5,"in":"#ff000033","out":{"hex":"#ff000033","u16":[65535,0,0,13107]}}, +{"amount":0,"gain":1,"in":"#ff000033","out":{"hex":"#ff000033","u16":[65535,0,0,13107]}}, +{"amount":0,"gain":2,"in":"#ff000033","out":{"hex":"#ff000033","u16":[65535,0,0,13107]}}, +{"amount":0.1,"gain":0,"in":"#ff000033","out":{"hex":"#ff5a5a33","u16":[65535,23011,23011,13107]}}, +{"amount":0.1,"gain":0.5,"in":"#ff000033","out":{"hex":"#ff5a5a33","u16":[65535,23011,23011,13107]}}, +{"amount":0.1,"gain":1,"in":"#ff000033","out":{"hex":"#ff5a5a33","u16":[65535,23011,23011,13107]}}, +{"amount":0.1,"gain":2,"in":"#ff000033","out":{"hex":"#ff5a5a33","u16":[65535,23011,23011,13107]}}, +{"amount":0.25,"gain":0,"in":"#ff000033","out":{"hex":"#ff888833","u16":[65535,34899,34899,13107]}}, +{"amount":0.25,"gain":0.5,"in":"#ff000033","out":{"hex":"#ff888833","u16":[65535,34899,34899,13107]}}, +{"amount":0.25,"gain":1,"in":"#ff000033","out":{"hex":"#ff888833","u16":[65535,34899,34899,13107]}}, +{"amount":0.25,"gain":2,"in":"#ff000033","out":{"hex":"#ff888833","u16":[65535,34899,34899,13107]}}, +{"amount":0.5,"gain":0,"in":"#ff000033","out":{"hex":"#ffbaba33","u16":[65535,47824,47824,13107]}}, +{"amount":0.5,"gain":0.5,"in":"#ff000033","out":{"hex":"#ffbaba33","u16":[65535,47824,47824,13107]}}, +{"amount":0.5,"gain":1,"in":"#ff000033","out":{"hex":"#ffbaba33","u16":[65535,47824,47824,13107]}}, +{"amount":0.5,"gain":2,"in":"#ff000033","out":{"hex":"#ffbaba33","u16":[65535,47824,47824,13107]}}, +{"amount":0.75,"gain":0,"in":"#ff000033","out":{"hex":"#ffe0e033","u16":[65535,57502,57502,13107]}}, +{"amount":0.75,"gain":0.5,"in":"#ff000033","out":{"hex":"#ffe0e033","u16":[65535,57502,57502,13107]}}, +{"amount":0.75,"gain":1,"in":"#ff000033","out":{"hex":"#ffe0e033","u16":[65535,57502,57502,13107]}}, +{"amount":0.75,"gain":2,"in":"#ff000033","out":{"hex":"#ffe0e033","u16":[65535,57502,57502,13107]}}, +{"amount":0.9,"gain":0,"in":"#ff000033","out":{"hex":"#fff3f333","u16":[65535,62470,62470,13107]}}, +{"amount":0.9,"gain":0.5,"in":"#ff000033","out":{"hex":"#fff3f333","u16":[65535,62470,62470,13107]}}, +{"amount":0.9,"gain":1,"in":"#ff000033","out":{"hex":"#fff3f333","u16":[65535,62470,62470,13107]}}, +{"amount":0.9,"gain":2,"in":"#ff000033","out":{"hex":"#fff3f333","u16":[65535,62470,62470,13107]}}, +{"amount":1,"gain":0,"in":"#ff000033","out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"amount":1,"gain":0.5,"in":"#ff000033","out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"amount":1,"gain":1,"in":"#ff000033","out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"amount":1,"gain":2,"in":"#ff000033","out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"amount":1.5,"gain":0,"in":"#ff000033","out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"amount":1.5,"gain":0.5,"in":"#ff000033","out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"amount":1.5,"gain":1,"in":"#ff000033","out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"amount":1.5,"gain":2,"in":"#ff000033","out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}} +], +"darken": [ +{"amount":-0.5,"gain":0,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":0.5,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"gain":2,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"gain":1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"gain":2,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.25,"gain":0,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.25,"gain":1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.25,"gain":2,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.5,"gain":0,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.5,"gain":1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.5,"gain":2,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.75,"gain":0,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.75,"gain":1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.75,"gain":2,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.9,"gain":0,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.9,"gain":1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.9,"gain":2,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":2,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":0,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":0.5,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":2,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"gain":0,"in":"#ffffffff","out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#ffffffff","out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]}}, +{"amount":0.1,"gain":1,"in":"#ffffffff","out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]}}, +{"amount":0.1,"gain":2,"in":"#ffffffff","out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]}}, +{"amount":0.25,"gain":0,"in":"#ffffffff","out":{"hex":"#e0e0e0ff","u16":[57502,57502,57502,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#ffffffff","out":{"hex":"#e0e0e0ff","u16":[57502,57502,57502,65535]}}, +{"amount":0.25,"gain":1,"in":"#ffffffff","out":{"hex":"#e0e0e0ff","u16":[57502,57502,57502,65535]}}, +{"amount":0.25,"gain":2,"in":"#ffffffff","out":{"hex":"#e0e0e0ff","u16":[57502,57502,57502,65535]}}, +{"amount":0.5,"gain":0,"in":"#ffffffff","out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#ffffffff","out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]}}, +{"amount":0.5,"gain":1,"in":"#ffffffff","out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]}}, +{"amount":0.5,"gain":2,"in":"#ffffffff","out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]}}, +{"amount":0.75,"gain":0,"in":"#ffffffff","out":{"hex":"#888888ff","u16":[34899,34899,34899,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#ffffffff","out":{"hex":"#888888ff","u16":[34899,34899,34899,65535]}}, +{"amount":0.75,"gain":1,"in":"#ffffffff","out":{"hex":"#888888ff","u16":[34899,34899,34899,65535]}}, +{"amount":0.75,"gain":2,"in":"#ffffffff","out":{"hex":"#888888ff","u16":[34899,34899,34899,65535]}}, +{"amount":0.9,"gain":0,"in":"#ffffffff","out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#ffffffff","out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]}}, +{"amount":0.9,"gain":1,"in":"#ffffffff","out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]}}, +{"amount":0.9,"gain":2,"in":"#ffffffff","out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]}}, +{"amount":1,"gain":0,"in":"#ffffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#ffffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#ffffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#ffffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#ffffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#ffffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#ffffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#ffffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#010101ff","out":{"hex":"#010101ff","u16":[309,309,309,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#010101ff","out":{"hex":"#010101ff","u16":[309,309,309,65535]}}, +{"amount":-0.5,"gain":1,"in":"#010101ff","out":{"hex":"#010101ff","u16":[309,309,309,65535]}}, +{"amount":-0.5,"gain":2,"in":"#010101ff","out":{"hex":"#010101ff","u16":[309,309,309,65535]}}, +{"amount":0,"gain":0,"in":"#010101ff","out":{"hex":"#010101ff","u16":[257,257,257,65535]}}, +{"amount":0,"gain":0.5,"in":"#010101ff","out":{"hex":"#010101ff","u16":[257,257,257,65535]}}, +{"amount":0,"gain":1,"in":"#010101ff","out":{"hex":"#010101ff","u16":[257,257,257,65535]}}, +{"amount":0,"gain":2,"in":"#010101ff","out":{"hex":"#010101ff","u16":[257,257,257,65535]}}, +{"amount":0.1,"gain":0,"in":"#010101ff","out":{"hex":"#010101ff","u16":[245,245,245,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#010101ff","out":{"hex":"#010101ff","u16":[245,245,245,65535]}}, +{"amount":0.1,"gain":1,"in":"#010101ff","out":{"hex":"#010101ff","u16":[245,245,245,65535]}}, +{"amount":0.1,"gain":2,"in":"#010101ff","out":{"hex":"#010101ff","u16":[245,245,245,65535]}}, +{"amount":0.25,"gain":0,"in":"#010101ff","out":{"hex":"#010101ff","u16":[225,225,225,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#010101ff","out":{"hex":"#010101ff","u16":[225,225,225,65535]}}, +{"amount":0.25,"gain":1,"in":"#010101ff","out":{"hex":"#010101ff","u16":[225,225,225,65535]}}, +{"amount":0.25,"gain":2,"in":"#010101ff","out":{"hex":"#010101ff","u16":[225,225,225,65535]}}, +{"amount":0.5,"gain":0,"in":"#010101ff","out":{"hex":"#010101ff","u16":[188,188,188,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#010101ff","out":{"hex":"#010101ff","u16":[188,188,188,65535]}}, +{"amount":0.5,"gain":1,"in":"#010101ff","out":{"hex":"#010101ff","u16":[188,188,188,65535]}}, +{"amount":0.5,"gain":2,"in":"#010101ff","out":{"hex":"#010101ff","u16":[188,188,188,65535]}}, +{"amount":0.75,"gain":0,"in":"#010101ff","out":{"hex":"#010101ff","u16":[137,137,137,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#010101ff","out":{"hex":"#010101ff","u16":[137,137,137,65535]}}, +{"amount":0.75,"gain":1,"in":"#010101ff","out":{"hex":"#010101ff","u16":[137,137,137,65535]}}, +{"amount":0.75,"gain":2,"in":"#010101ff","out":{"hex":"#010101ff","u16":[137,137,137,65535]}}, +{"amount":0.9,"gain":0,"in":"#010101ff","out":{"hex":"#000000ff","u16":[90,90,90,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#010101ff","out":{"hex":"#000000ff","u16":[90,90,90,65535]}}, +{"amount":0.9,"gain":1,"in":"#010101ff","out":{"hex":"#000000ff","u16":[90,90,90,65535]}}, +{"amount":0.9,"gain":2,"in":"#010101ff","out":{"hex":"#000000ff","u16":[90,90,90,65535]}}, +{"amount":1,"gain":0,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#020202ff","out":{"hex":"#020202ff","u16":[618,618,618,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#020202ff","out":{"hex":"#020202ff","u16":[618,618,618,65535]}}, +{"amount":-0.5,"gain":1,"in":"#020202ff","out":{"hex":"#020202ff","u16":[618,618,618,65535]}}, +{"amount":-0.5,"gain":2,"in":"#020202ff","out":{"hex":"#020202ff","u16":[618,618,618,65535]}}, +{"amount":0,"gain":0,"in":"#020202ff","out":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"amount":0,"gain":0.5,"in":"#020202ff","out":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"amount":0,"gain":1,"in":"#020202ff","out":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"amount":0,"gain":2,"in":"#020202ff","out":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"amount":0.1,"gain":0,"in":"#020202ff","out":{"hex":"#020202ff","u16":[490,490,490,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#020202ff","out":{"hex":"#020202ff","u16":[490,490,490,65535]}}, +{"amount":0.1,"gain":1,"in":"#020202ff","out":{"hex":"#020202ff","u16":[490,490,490,65535]}}, +{"amount":0.1,"gain":2,"in":"#020202ff","out":{"hex":"#020202ff","u16":[490,490,490,65535]}}, +{"amount":0.25,"gain":0,"in":"#020202ff","out":{"hex":"#020202ff","u16":[451,451,451,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#020202ff","out":{"hex":"#020202ff","u16":[451,451,451,65535]}}, +{"amount":0.25,"gain":1,"in":"#020202ff","out":{"hex":"#020202ff","u16":[451,451,451,65535]}}, +{"amount":0.25,"gain":2,"in":"#020202ff","out":{"hex":"#020202ff","u16":[451,451,451,65535]}}, +{"amount":0.5,"gain":0,"in":"#020202ff","out":{"hex":"#010101ff","u16":[375,375,375,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#020202ff","out":{"hex":"#010101ff","u16":[375,375,375,65535]}}, +{"amount":0.5,"gain":1,"in":"#020202ff","out":{"hex":"#010101ff","u16":[375,375,375,65535]}}, +{"amount":0.5,"gain":2,"in":"#020202ff","out":{"hex":"#010101ff","u16":[375,375,375,65535]}}, +{"amount":0.75,"gain":0,"in":"#020202ff","out":{"hex":"#010101ff","u16":[274,274,274,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#020202ff","out":{"hex":"#010101ff","u16":[274,274,274,65535]}}, +{"amount":0.75,"gain":1,"in":"#020202ff","out":{"hex":"#010101ff","u16":[274,274,274,65535]}}, +{"amount":0.75,"gain":2,"in":"#020202ff","out":{"hex":"#010101ff","u16":[274,274,274,65535]}}, +{"amount":0.9,"gain":0,"in":"#020202ff","out":{"hex":"#010101ff","u16":[180,180,180,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#020202ff","out":{"hex":"#010101ff","u16":[180,180,180,65535]}}, +{"amount":0.9,"gain":1,"in":"#020202ff","out":{"hex":"#010101ff","u16":[180,180,180,65535]}}, +{"amount":0.9,"gain":2,"in":"#020202ff","out":{"hex":"#010101ff","u16":[180,180,180,65535]}}, +{"amount":1,"gain":0,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#040404ff","out":{"hex":"#050505ff","u16":[1236,1236,1236,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#040404ff","out":{"hex":"#050505ff","u16":[1236,1236,1236,65535]}}, +{"amount":-0.5,"gain":1,"in":"#040404ff","out":{"hex":"#050505ff","u16":[1236,1236,1236,65535]}}, +{"amount":-0.5,"gain":2,"in":"#040404ff","out":{"hex":"#050505ff","u16":[1236,1236,1236,65535]}}, +{"amount":0,"gain":0,"in":"#040404ff","out":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"amount":0,"gain":0.5,"in":"#040404ff","out":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"amount":0,"gain":1,"in":"#040404ff","out":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"amount":0,"gain":2,"in":"#040404ff","out":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"amount":0.1,"gain":0,"in":"#040404ff","out":{"hex":"#040404ff","u16":[980,980,980,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#040404ff","out":{"hex":"#040404ff","u16":[980,980,980,65535]}}, +{"amount":0.1,"gain":1,"in":"#040404ff","out":{"hex":"#040404ff","u16":[980,980,980,65535]}}, +{"amount":0.1,"gain":2,"in":"#040404ff","out":{"hex":"#040404ff","u16":[980,980,980,65535]}}, +{"amount":0.25,"gain":0,"in":"#040404ff","out":{"hex":"#040404ff","u16":[902,902,902,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#040404ff","out":{"hex":"#040404ff","u16":[902,902,902,65535]}}, +{"amount":0.25,"gain":1,"in":"#040404ff","out":{"hex":"#040404ff","u16":[902,902,902,65535]}}, +{"amount":0.25,"gain":2,"in":"#040404ff","out":{"hex":"#040404ff","u16":[902,902,902,65535]}}, +{"amount":0.5,"gain":0,"in":"#040404ff","out":{"hex":"#030303ff","u16":[750,750,750,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#040404ff","out":{"hex":"#030303ff","u16":[750,750,750,65535]}}, +{"amount":0.5,"gain":1,"in":"#040404ff","out":{"hex":"#030303ff","u16":[750,750,750,65535]}}, +{"amount":0.5,"gain":2,"in":"#040404ff","out":{"hex":"#030303ff","u16":[750,750,750,65535]}}, +{"amount":0.75,"gain":0,"in":"#040404ff","out":{"hex":"#020202ff","u16":[547,547,547,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#040404ff","out":{"hex":"#020202ff","u16":[547,547,547,65535]}}, +{"amount":0.75,"gain":1,"in":"#040404ff","out":{"hex":"#020202ff","u16":[547,547,547,65535]}}, +{"amount":0.75,"gain":2,"in":"#040404ff","out":{"hex":"#020202ff","u16":[547,547,547,65535]}}, +{"amount":0.9,"gain":0,"in":"#040404ff","out":{"hex":"#010101ff","u16":[361,361,361,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#040404ff","out":{"hex":"#010101ff","u16":[361,361,361,65535]}}, +{"amount":0.9,"gain":1,"in":"#040404ff","out":{"hex":"#010101ff","u16":[361,361,361,65535]}}, +{"amount":0.9,"gain":2,"in":"#040404ff","out":{"hex":"#010101ff","u16":[361,361,361,65535]}}, +{"amount":1,"gain":0,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#080808ff","out":{"hex":"#0a0a0aff","u16":[2472,2472,2472,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#080808ff","out":{"hex":"#0a0a0aff","u16":[2472,2472,2472,65535]}}, +{"amount":-0.5,"gain":1,"in":"#080808ff","out":{"hex":"#0a0a0aff","u16":[2472,2472,2472,65535]}}, +{"amount":-0.5,"gain":2,"in":"#080808ff","out":{"hex":"#0a0a0aff","u16":[2472,2472,2472,65535]}}, +{"amount":0,"gain":0,"in":"#080808ff","out":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"amount":0,"gain":0.5,"in":"#080808ff","out":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"amount":0,"gain":1,"in":"#080808ff","out":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"amount":0,"gain":2,"in":"#080808ff","out":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"amount":0.1,"gain":0,"in":"#080808ff","out":{"hex":"#080808ff","u16":[1960,1960,1960,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#080808ff","out":{"hex":"#080808ff","u16":[1960,1960,1960,65535]}}, +{"amount":0.1,"gain":1,"in":"#080808ff","out":{"hex":"#080808ff","u16":[1960,1960,1960,65535]}}, +{"amount":0.1,"gain":2,"in":"#080808ff","out":{"hex":"#080808ff","u16":[1960,1960,1960,65535]}}, +{"amount":0.25,"gain":0,"in":"#080808ff","out":{"hex":"#070707ff","u16":[1804,1804,1804,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#080808ff","out":{"hex":"#070707ff","u16":[1804,1804,1804,65535]}}, +{"amount":0.25,"gain":1,"in":"#080808ff","out":{"hex":"#070707ff","u16":[1804,1804,1804,65535]}}, +{"amount":0.25,"gain":2,"in":"#080808ff","out":{"hex":"#070707ff","u16":[1804,1804,1804,65535]}}, +{"amount":0.5,"gain":0,"in":"#080808ff","out":{"hex":"#060606ff","u16":[1500,1500,1500,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#080808ff","out":{"hex":"#060606ff","u16":[1500,1500,1500,65535]}}, +{"amount":0.5,"gain":1,"in":"#080808ff","out":{"hex":"#060606ff","u16":[1500,1500,1500,65535]}}, +{"amount":0.5,"gain":2,"in":"#080808ff","out":{"hex":"#060606ff","u16":[1500,1500,1500,65535]}}, +{"amount":0.75,"gain":0,"in":"#080808ff","out":{"hex":"#040404ff","u16":[1095,1095,1095,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#080808ff","out":{"hex":"#040404ff","u16":[1095,1095,1095,65535]}}, +{"amount":0.75,"gain":1,"in":"#080808ff","out":{"hex":"#040404ff","u16":[1095,1095,1095,65535]}}, +{"amount":0.75,"gain":2,"in":"#080808ff","out":{"hex":"#040404ff","u16":[1095,1095,1095,65535]}}, +{"amount":0.9,"gain":0,"in":"#080808ff","out":{"hex":"#030303ff","u16":[722,722,722,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#080808ff","out":{"hex":"#030303ff","u16":[722,722,722,65535]}}, +{"amount":0.9,"gain":1,"in":"#080808ff","out":{"hex":"#030303ff","u16":[722,722,722,65535]}}, +{"amount":0.9,"gain":2,"in":"#080808ff","out":{"hex":"#030303ff","u16":[722,722,722,65535]}}, +{"amount":1,"gain":0,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#101010ff","out":{"hex":"#131313ff","u16":[4944,4944,4944,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#101010ff","out":{"hex":"#131313ff","u16":[4944,4944,4944,65535]}}, +{"amount":-0.5,"gain":1,"in":"#101010ff","out":{"hex":"#131313ff","u16":[4944,4944,4944,65535]}}, +{"amount":-0.5,"gain":2,"in":"#101010ff","out":{"hex":"#131313ff","u16":[4944,4944,4944,65535]}}, +{"amount":0,"gain":0,"in":"#101010ff","out":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"amount":0,"gain":0.5,"in":"#101010ff","out":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"amount":0,"gain":1,"in":"#101010ff","out":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"amount":0,"gain":2,"in":"#101010ff","out":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"amount":0.1,"gain":0,"in":"#101010ff","out":{"hex":"#0f0f0fff","u16":[3920,3920,3920,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#101010ff","out":{"hex":"#0f0f0fff","u16":[3920,3920,3920,65535]}}, +{"amount":0.1,"gain":1,"in":"#101010ff","out":{"hex":"#0f0f0fff","u16":[3920,3920,3920,65535]}}, +{"amount":0.1,"gain":2,"in":"#101010ff","out":{"hex":"#0f0f0fff","u16":[3920,3920,3920,65535]}}, +{"amount":0.25,"gain":0,"in":"#101010ff","out":{"hex":"#0e0e0eff","u16":[3608,3608,3608,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#101010ff","out":{"hex":"#0e0e0eff","u16":[3608,3608,3608,65535]}}, +{"amount":0.25,"gain":1,"in":"#101010ff","out":{"hex":"#0e0e0eff","u16":[3608,3608,3608,65535]}}, +{"amount":0.25,"gain":2,"in":"#101010ff","out":{"hex":"#0e0e0eff","u16":[3608,3608,3608,65535]}}, +{"amount":0.5,"gain":0,"in":"#101010ff","out":{"hex":"#0c0c0cff","u16":[3001,3001,3001,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#101010ff","out":{"hex":"#0c0c0cff","u16":[3001,3001,3001,65535]}}, +{"amount":0.5,"gain":1,"in":"#101010ff","out":{"hex":"#0c0c0cff","u16":[3001,3001,3001,65535]}}, +{"amount":0.5,"gain":2,"in":"#101010ff","out":{"hex":"#0c0c0cff","u16":[3001,3001,3001,65535]}}, +{"amount":0.75,"gain":0,"in":"#101010ff","out":{"hex":"#090909ff","u16":[2190,2190,2190,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#101010ff","out":{"hex":"#090909ff","u16":[2190,2190,2190,65535]}}, +{"amount":0.75,"gain":1,"in":"#101010ff","out":{"hex":"#090909ff","u16":[2190,2190,2190,65535]}}, +{"amount":0.75,"gain":2,"in":"#101010ff","out":{"hex":"#090909ff","u16":[2190,2190,2190,65535]}}, +{"amount":0.9,"gain":0,"in":"#101010ff","out":{"hex":"#060606ff","u16":[1444,1444,1444,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#101010ff","out":{"hex":"#060606ff","u16":[1444,1444,1444,65535]}}, +{"amount":0.9,"gain":1,"in":"#101010ff","out":{"hex":"#060606ff","u16":[1444,1444,1444,65535]}}, +{"amount":0.9,"gain":2,"in":"#101010ff","out":{"hex":"#060606ff","u16":[1444,1444,1444,65535]}}, +{"amount":1,"gain":0,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#202020ff","out":{"hex":"#262626ff","u16":[9888,9888,9888,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#202020ff","out":{"hex":"#262626ff","u16":[9888,9888,9888,65535]}}, +{"amount":-0.5,"gain":1,"in":"#202020ff","out":{"hex":"#262626ff","u16":[9888,9888,9888,65535]}}, +{"amount":-0.5,"gain":2,"in":"#202020ff","out":{"hex":"#262626ff","u16":[9888,9888,9888,65535]}}, +{"amount":0,"gain":0,"in":"#202020ff","out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"amount":0,"gain":0.5,"in":"#202020ff","out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"amount":0,"gain":1,"in":"#202020ff","out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"amount":0,"gain":2,"in":"#202020ff","out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"amount":0.1,"gain":0,"in":"#202020ff","out":{"hex":"#1f1f1fff","u16":[7839,7839,7839,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#202020ff","out":{"hex":"#1f1f1fff","u16":[7839,7839,7839,65535]}}, +{"amount":0.1,"gain":1,"in":"#202020ff","out":{"hex":"#1f1f1fff","u16":[7839,7839,7839,65535]}}, +{"amount":0.1,"gain":2,"in":"#202020ff","out":{"hex":"#1f1f1fff","u16":[7839,7839,7839,65535]}}, +{"amount":0.25,"gain":0,"in":"#202020ff","out":{"hex":"#1c1c1cff","u16":[7216,7216,7216,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#202020ff","out":{"hex":"#1c1c1cff","u16":[7216,7216,7216,65535]}}, +{"amount":0.25,"gain":1,"in":"#202020ff","out":{"hex":"#1c1c1cff","u16":[7216,7216,7216,65535]}}, +{"amount":0.25,"gain":2,"in":"#202020ff","out":{"hex":"#1c1c1cff","u16":[7216,7216,7216,65535]}}, +{"amount":0.5,"gain":0,"in":"#202020ff","out":{"hex":"#171717ff","u16":[6001,6001,6001,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#202020ff","out":{"hex":"#171717ff","u16":[6001,6001,6001,65535]}}, +{"amount":0.5,"gain":1,"in":"#202020ff","out":{"hex":"#171717ff","u16":[6001,6001,6001,65535]}}, +{"amount":0.5,"gain":2,"in":"#202020ff","out":{"hex":"#171717ff","u16":[6001,6001,6001,65535]}}, +{"amount":0.75,"gain":0,"in":"#202020ff","out":{"hex":"#111111ff","u16":[4379,4379,4379,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#202020ff","out":{"hex":"#111111ff","u16":[4379,4379,4379,65535]}}, +{"amount":0.75,"gain":1,"in":"#202020ff","out":{"hex":"#111111ff","u16":[4379,4379,4379,65535]}}, +{"amount":0.75,"gain":2,"in":"#202020ff","out":{"hex":"#111111ff","u16":[4379,4379,4379,65535]}}, +{"amount":0.9,"gain":0,"in":"#202020ff","out":{"hex":"#0b0b0bff","u16":[2888,2888,2888,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#202020ff","out":{"hex":"#0b0b0bff","u16":[2888,2888,2888,65535]}}, +{"amount":0.9,"gain":1,"in":"#202020ff","out":{"hex":"#0b0b0bff","u16":[2888,2888,2888,65535]}}, +{"amount":0.9,"gain":2,"in":"#202020ff","out":{"hex":"#0b0b0bff","u16":[2888,2888,2888,65535]}}, +{"amount":1,"gain":0,"in":"#202020ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#202020ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#202020ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#202020ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#202020ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#202020ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#202020ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#202020ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#404040ff","out":{"hex":"#4d4d4dff","u16":[19777,19777,19777,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#404040ff","out":{"hex":"#4d4d4dff","u16":[19777,19777,19777,65535]}}, +{"amount":-0.5,"gain":1,"in":"#404040ff","out":{"hex":"#4d4d4dff","u16":[19777,19777,19777,65535]}}, +{"amount":-0.5,"gain":2,"in":"#404040ff","out":{"hex":"#4d4d4dff","u16":[19777,19777,19777,65535]}}, +{"amount":0,"gain":0,"in":"#404040ff","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"amount":0,"gain":0.5,"in":"#404040ff","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"amount":0,"gain":1,"in":"#404040ff","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"amount":0,"gain":2,"in":"#404040ff","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"amount":0.1,"gain":0,"in":"#404040ff","out":{"hex":"#3d3d3dff","u16":[15679,15679,15679,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#404040ff","out":{"hex":"#3d3d3dff","u16":[15679,15679,15679,65535]}}, +{"amount":0.1,"gain":1,"in":"#404040ff","out":{"hex":"#3d3d3dff","u16":[15679,15679,15679,65535]}}, +{"amount":0.1,"gain":2,"in":"#404040ff","out":{"hex":"#3d3d3dff","u16":[15679,15679,15679,65535]}}, +{"amount":0.25,"gain":0,"in":"#404040ff","out":{"hex":"#383838ff","u16":[14432,14432,14432,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#404040ff","out":{"hex":"#383838ff","u16":[14432,14432,14432,65535]}}, +{"amount":0.25,"gain":1,"in":"#404040ff","out":{"hex":"#383838ff","u16":[14432,14432,14432,65535]}}, +{"amount":0.25,"gain":2,"in":"#404040ff","out":{"hex":"#383838ff","u16":[14432,14432,14432,65535]}}, +{"amount":0.5,"gain":0,"in":"#404040ff","out":{"hex":"#2f2f2fff","u16":[12003,12003,12003,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#404040ff","out":{"hex":"#2f2f2fff","u16":[12003,12003,12003,65535]}}, +{"amount":0.5,"gain":1,"in":"#404040ff","out":{"hex":"#2f2f2fff","u16":[12003,12003,12003,65535]}}, +{"amount":0.5,"gain":2,"in":"#404040ff","out":{"hex":"#2f2f2fff","u16":[12003,12003,12003,65535]}}, +{"amount":0.75,"gain":0,"in":"#404040ff","out":{"hex":"#222222ff","u16":[8759,8759,8759,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#404040ff","out":{"hex":"#222222ff","u16":[8759,8759,8759,65535]}}, +{"amount":0.75,"gain":1,"in":"#404040ff","out":{"hex":"#222222ff","u16":[8759,8759,8759,65535]}}, +{"amount":0.75,"gain":2,"in":"#404040ff","out":{"hex":"#222222ff","u16":[8759,8759,8759,65535]}}, +{"amount":0.9,"gain":0,"in":"#404040ff","out":{"hex":"#161616ff","u16":[5775,5775,5775,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#404040ff","out":{"hex":"#161616ff","u16":[5775,5775,5775,65535]}}, +{"amount":0.9,"gain":1,"in":"#404040ff","out":{"hex":"#161616ff","u16":[5775,5775,5775,65535]}}, +{"amount":0.9,"gain":2,"in":"#404040ff","out":{"hex":"#161616ff","u16":[5775,5775,5775,65535]}}, +{"amount":1,"gain":0,"in":"#404040ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#404040ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#404040ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#404040ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#404040ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#404040ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#404040ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#404040ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#7f7f7fff","out":{"hex":"#999999ff","u16":[39244,39244,39244,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#7f7f7fff","out":{"hex":"#999999ff","u16":[39244,39244,39244,65535]}}, +{"amount":-0.5,"gain":1,"in":"#7f7f7fff","out":{"hex":"#999999ff","u16":[39244,39244,39244,65535]}}, +{"amount":-0.5,"gain":2,"in":"#7f7f7fff","out":{"hex":"#999999ff","u16":[39244,39244,39244,65535]}}, +{"amount":0,"gain":0,"in":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"gain":0.5,"in":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"gain":1,"in":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"gain":2,"in":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"gain":0,"in":"#7f7f7fff","out":{"hex":"#797979ff","u16":[31113,31113,31113,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#7f7f7fff","out":{"hex":"#797979ff","u16":[31113,31113,31113,65535]}}, +{"amount":0.1,"gain":1,"in":"#7f7f7fff","out":{"hex":"#797979ff","u16":[31113,31113,31113,65535]}}, +{"amount":0.1,"gain":2,"in":"#7f7f7fff","out":{"hex":"#797979ff","u16":[31113,31113,31113,65535]}}, +{"amount":0.25,"gain":0,"in":"#7f7f7fff","out":{"hex":"#6f6f6fff","u16":[28638,28638,28638,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#7f7f7fff","out":{"hex":"#6f6f6fff","u16":[28638,28638,28638,65535]}}, +{"amount":0.25,"gain":1,"in":"#7f7f7fff","out":{"hex":"#6f6f6fff","u16":[28638,28638,28638,65535]}}, +{"amount":0.25,"gain":2,"in":"#7f7f7fff","out":{"hex":"#6f6f6fff","u16":[28638,28638,28638,65535]}}, +{"amount":0.5,"gain":0,"in":"#7f7f7fff","out":{"hex":"#5d5d5dff","u16":[23818,23818,23818,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#7f7f7fff","out":{"hex":"#5d5d5dff","u16":[23818,23818,23818,65535]}}, +{"amount":0.5,"gain":1,"in":"#7f7f7fff","out":{"hex":"#5d5d5dff","u16":[23818,23818,23818,65535]}}, +{"amount":0.5,"gain":2,"in":"#7f7f7fff","out":{"hex":"#5d5d5dff","u16":[23818,23818,23818,65535]}}, +{"amount":0.75,"gain":0,"in":"#7f7f7fff","out":{"hex":"#444444ff","u16":[17381,17381,17381,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#7f7f7fff","out":{"hex":"#444444ff","u16":[17381,17381,17381,65535]}}, +{"amount":0.75,"gain":1,"in":"#7f7f7fff","out":{"hex":"#444444ff","u16":[17381,17381,17381,65535]}}, +{"amount":0.75,"gain":2,"in":"#7f7f7fff","out":{"hex":"#444444ff","u16":[17381,17381,17381,65535]}}, +{"amount":0.9,"gain":0,"in":"#7f7f7fff","out":{"hex":"#2d2d2dff","u16":[11460,11460,11460,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#7f7f7fff","out":{"hex":"#2d2d2dff","u16":[11460,11460,11460,65535]}}, +{"amount":0.9,"gain":1,"in":"#7f7f7fff","out":{"hex":"#2d2d2dff","u16":[11460,11460,11460,65535]}}, +{"amount":0.9,"gain":2,"in":"#7f7f7fff","out":{"hex":"#2d2d2dff","u16":[11460,11460,11460,65535]}}, +{"amount":1,"gain":0,"in":"#7f7f7fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#7f7f7fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#7f7f7fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#7f7f7fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#7f7f7fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#7f7f7fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#7f7f7fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#7f7f7fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#808080ff","out":{"hex":"#9a9a9aff","u16":[39553,39553,39553,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#808080ff","out":{"hex":"#9a9a9aff","u16":[39553,39553,39553,65535]}}, +{"amount":-0.5,"gain":1,"in":"#808080ff","out":{"hex":"#9a9a9aff","u16":[39553,39553,39553,65535]}}, +{"amount":-0.5,"gain":2,"in":"#808080ff","out":{"hex":"#9a9a9aff","u16":[39553,39553,39553,65535]}}, +{"amount":0,"gain":0,"in":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"gain":0.5,"in":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"gain":1,"in":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"gain":2,"in":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"gain":0,"in":"#808080ff","out":{"hex":"#7a7a7aff","u16":[31358,31358,31358,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#808080ff","out":{"hex":"#7a7a7aff","u16":[31358,31358,31358,65535]}}, +{"amount":0.1,"gain":1,"in":"#808080ff","out":{"hex":"#7a7a7aff","u16":[31358,31358,31358,65535]}}, +{"amount":0.1,"gain":2,"in":"#808080ff","out":{"hex":"#7a7a7aff","u16":[31358,31358,31358,65535]}}, +{"amount":0.25,"gain":0,"in":"#808080ff","out":{"hex":"#707070ff","u16":[28864,28864,28864,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#808080ff","out":{"hex":"#707070ff","u16":[28864,28864,28864,65535]}}, +{"amount":0.25,"gain":1,"in":"#808080ff","out":{"hex":"#707070ff","u16":[28864,28864,28864,65535]}}, +{"amount":0.25,"gain":2,"in":"#808080ff","out":{"hex":"#707070ff","u16":[28864,28864,28864,65535]}}, +{"amount":0.5,"gain":0,"in":"#808080ff","out":{"hex":"#5d5d5dff","u16":[24006,24006,24006,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#808080ff","out":{"hex":"#5d5d5dff","u16":[24006,24006,24006,65535]}}, +{"amount":0.5,"gain":1,"in":"#808080ff","out":{"hex":"#5d5d5dff","u16":[24006,24006,24006,65535]}}, +{"amount":0.5,"gain":2,"in":"#808080ff","out":{"hex":"#5d5d5dff","u16":[24006,24006,24006,65535]}}, +{"amount":0.75,"gain":0,"in":"#808080ff","out":{"hex":"#444444ff","u16":[17518,17518,17518,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#808080ff","out":{"hex":"#444444ff","u16":[17518,17518,17518,65535]}}, +{"amount":0.75,"gain":1,"in":"#808080ff","out":{"hex":"#444444ff","u16":[17518,17518,17518,65535]}}, +{"amount":0.75,"gain":2,"in":"#808080ff","out":{"hex":"#444444ff","u16":[17518,17518,17518,65535]}}, +{"amount":0.9,"gain":0,"in":"#808080ff","out":{"hex":"#2d2d2dff","u16":[11550,11550,11550,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#808080ff","out":{"hex":"#2d2d2dff","u16":[11550,11550,11550,65535]}}, +{"amount":0.9,"gain":1,"in":"#808080ff","out":{"hex":"#2d2d2dff","u16":[11550,11550,11550,65535]}}, +{"amount":0.9,"gain":2,"in":"#808080ff","out":{"hex":"#2d2d2dff","u16":[11550,11550,11550,65535]}}, +{"amount":1,"gain":0,"in":"#808080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#808080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#808080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#808080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#808080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#808080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#808080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#808080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#818181ff","out":{"hex":"#9b9b9bff","u16":[39862,39862,39862,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#818181ff","out":{"hex":"#9b9b9bff","u16":[39862,39862,39862,65535]}}, +{"amount":-0.5,"gain":1,"in":"#818181ff","out":{"hex":"#9b9b9bff","u16":[39862,39862,39862,65535]}}, +{"amount":-0.5,"gain":2,"in":"#818181ff","out":{"hex":"#9b9b9bff","u16":[39862,39862,39862,65535]}}, +{"amount":0,"gain":0,"in":"#818181ff","out":{"hex":"#818181ff","u16":[33153,33153,33153,65535]}}, +{"amount":0,"gain":0.5,"in":"#818181ff","out":{"hex":"#818181ff","u16":[33153,33153,33153,65535]}}, +{"amount":0,"gain":1,"in":"#818181ff","out":{"hex":"#818181ff","u16":[33153,33153,33153,65535]}}, +{"amount":0,"gain":2,"in":"#818181ff","out":{"hex":"#818181ff","u16":[33153,33153,33153,65535]}}, +{"amount":0.1,"gain":0,"in":"#818181ff","out":{"hex":"#7b7b7bff","u16":[31603,31603,31603,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#818181ff","out":{"hex":"#7b7b7bff","u16":[31603,31603,31603,65535]}}, +{"amount":0.1,"gain":1,"in":"#818181ff","out":{"hex":"#7b7b7bff","u16":[31603,31603,31603,65535]}}, +{"amount":0.1,"gain":2,"in":"#818181ff","out":{"hex":"#7b7b7bff","u16":[31603,31603,31603,65535]}}, +{"amount":0.25,"gain":0,"in":"#818181ff","out":{"hex":"#717171ff","u16":[29089,29089,29089,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#818181ff","out":{"hex":"#717171ff","u16":[29089,29089,29089,65535]}}, +{"amount":0.25,"gain":1,"in":"#818181ff","out":{"hex":"#717171ff","u16":[29089,29089,29089,65535]}}, +{"amount":0.25,"gain":2,"in":"#818181ff","out":{"hex":"#717171ff","u16":[29089,29089,29089,65535]}}, +{"amount":0.5,"gain":0,"in":"#818181ff","out":{"hex":"#5e5e5eff","u16":[24193,24193,24193,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#818181ff","out":{"hex":"#5e5e5eff","u16":[24193,24193,24193,65535]}}, +{"amount":0.5,"gain":1,"in":"#818181ff","out":{"hex":"#5e5e5eff","u16":[24193,24193,24193,65535]}}, +{"amount":0.5,"gain":2,"in":"#818181ff","out":{"hex":"#5e5e5eff","u16":[24193,24193,24193,65535]}}, +{"amount":0.75,"gain":0,"in":"#818181ff","out":{"hex":"#454545ff","u16":[17655,17655,17655,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#818181ff","out":{"hex":"#454545ff","u16":[17655,17655,17655,65535]}}, +{"amount":0.75,"gain":1,"in":"#818181ff","out":{"hex":"#454545ff","u16":[17655,17655,17655,65535]}}, +{"amount":0.75,"gain":2,"in":"#818181ff","out":{"hex":"#454545ff","u16":[17655,17655,17655,65535]}}, +{"amount":0.9,"gain":0,"in":"#818181ff","out":{"hex":"#2d2d2dff","u16":[11641,11641,11641,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#818181ff","out":{"hex":"#2d2d2dff","u16":[11641,11641,11641,65535]}}, +{"amount":0.9,"gain":1,"in":"#818181ff","out":{"hex":"#2d2d2dff","u16":[11641,11641,11641,65535]}}, +{"amount":0.9,"gain":2,"in":"#818181ff","out":{"hex":"#2d2d2dff","u16":[11641,11641,11641,65535]}}, +{"amount":1,"gain":0,"in":"#818181ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#818181ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#818181ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#818181ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#818181ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#818181ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#818181ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#818181ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#bfbfbfff","out":{"hex":"#e6e6e6ff","u16":[59021,59021,59021,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#bfbfbfff","out":{"hex":"#e6e6e6ff","u16":[59021,59021,59021,65535]}}, +{"amount":-0.5,"gain":1,"in":"#bfbfbfff","out":{"hex":"#e6e6e6ff","u16":[59021,59021,59021,65535]}}, +{"amount":-0.5,"gain":2,"in":"#bfbfbfff","out":{"hex":"#e6e6e6ff","u16":[59021,59021,59021,65535]}}, +{"amount":0,"gain":0,"in":"#bfbfbfff","out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]}}, +{"amount":0,"gain":0.5,"in":"#bfbfbfff","out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]}}, +{"amount":0,"gain":1,"in":"#bfbfbfff","out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]}}, +{"amount":0,"gain":2,"in":"#bfbfbfff","out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]}}, +{"amount":0.1,"gain":0,"in":"#bfbfbfff","out":{"hex":"#b6b6b6ff","u16":[46792,46792,46792,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#bfbfbfff","out":{"hex":"#b6b6b6ff","u16":[46792,46792,46792,65535]}}, +{"amount":0.1,"gain":1,"in":"#bfbfbfff","out":{"hex":"#b6b6b6ff","u16":[46792,46792,46792,65535]}}, +{"amount":0.1,"gain":2,"in":"#bfbfbfff","out":{"hex":"#b6b6b6ff","u16":[46792,46792,46792,65535]}}, +{"amount":0.25,"gain":0,"in":"#bfbfbfff","out":{"hex":"#a8a8a8ff","u16":[43070,43070,43070,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#bfbfbfff","out":{"hex":"#a8a8a8ff","u16":[43070,43070,43070,65535]}}, +{"amount":0.25,"gain":1,"in":"#bfbfbfff","out":{"hex":"#a8a8a8ff","u16":[43070,43070,43070,65535]}}, +{"amount":0.25,"gain":2,"in":"#bfbfbfff","out":{"hex":"#a8a8a8ff","u16":[43070,43070,43070,65535]}}, +{"amount":0.5,"gain":0,"in":"#bfbfbfff","out":{"hex":"#8b8b8bff","u16":[35821,35821,35821,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#bfbfbfff","out":{"hex":"#8b8b8bff","u16":[35821,35821,35821,65535]}}, +{"amount":0.5,"gain":1,"in":"#bfbfbfff","out":{"hex":"#8b8b8bff","u16":[35821,35821,35821,65535]}}, +{"amount":0.5,"gain":2,"in":"#bfbfbfff","out":{"hex":"#8b8b8bff","u16":[35821,35821,35821,65535]}}, +{"amount":0.75,"gain":0,"in":"#bfbfbfff","out":{"hex":"#666666ff","u16":[26140,26140,26140,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#bfbfbfff","out":{"hex":"#666666ff","u16":[26140,26140,26140,65535]}}, +{"amount":0.75,"gain":1,"in":"#bfbfbfff","out":{"hex":"#666666ff","u16":[26140,26140,26140,65535]}}, +{"amount":0.75,"gain":2,"in":"#bfbfbfff","out":{"hex":"#666666ff","u16":[26140,26140,26140,65535]}}, +{"amount":0.9,"gain":0,"in":"#bfbfbfff","out":{"hex":"#434343ff","u16":[17235,17235,17235,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#bfbfbfff","out":{"hex":"#434343ff","u16":[17235,17235,17235,65535]}}, +{"amount":0.9,"gain":1,"in":"#bfbfbfff","out":{"hex":"#434343ff","u16":[17235,17235,17235,65535]}}, +{"amount":0.9,"gain":2,"in":"#bfbfbfff","out":{"hex":"#434343ff","u16":[17235,17235,17235,65535]}}, +{"amount":1,"gain":0,"in":"#bfbfbfff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#bfbfbfff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#bfbfbfff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#bfbfbfff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#bfbfbfff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#bfbfbfff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#bfbfbfff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#bfbfbfff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#c0c0c0ff","out":{"hex":"#e7e7e7ff","u16":[59330,59330,59330,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#c0c0c0ff","out":{"hex":"#e7e7e7ff","u16":[59330,59330,59330,65535]}}, +{"amount":-0.5,"gain":1,"in":"#c0c0c0ff","out":{"hex":"#e7e7e7ff","u16":[59330,59330,59330,65535]}}, +{"amount":-0.5,"gain":2,"in":"#c0c0c0ff","out":{"hex":"#e7e7e7ff","u16":[59330,59330,59330,65535]}}, +{"amount":0,"gain":0,"in":"#c0c0c0ff","out":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]}}, +{"amount":0,"gain":0.5,"in":"#c0c0c0ff","out":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]}}, +{"amount":0,"gain":1,"in":"#c0c0c0ff","out":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]}}, +{"amount":0,"gain":2,"in":"#c0c0c0ff","out":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]}}, +{"amount":0.1,"gain":0,"in":"#c0c0c0ff","out":{"hex":"#b7b7b7ff","u16":[47037,47037,47037,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#c0c0c0ff","out":{"hex":"#b7b7b7ff","u16":[47037,47037,47037,65535]}}, +{"amount":0.1,"gain":1,"in":"#c0c0c0ff","out":{"hex":"#b7b7b7ff","u16":[47037,47037,47037,65535]}}, +{"amount":0.1,"gain":2,"in":"#c0c0c0ff","out":{"hex":"#b7b7b7ff","u16":[47037,47037,47037,65535]}}, +{"amount":0.25,"gain":0,"in":"#c0c0c0ff","out":{"hex":"#a8a8a8ff","u16":[43296,43296,43296,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#c0c0c0ff","out":{"hex":"#a8a8a8ff","u16":[43296,43296,43296,65535]}}, +{"amount":0.25,"gain":1,"in":"#c0c0c0ff","out":{"hex":"#a8a8a8ff","u16":[43296,43296,43296,65535]}}, +{"amount":0.25,"gain":2,"in":"#c0c0c0ff","out":{"hex":"#a8a8a8ff","u16":[43296,43296,43296,65535]}}, +{"amount":0.5,"gain":0,"in":"#c0c0c0ff","out":{"hex":"#8c8c8cff","u16":[36008,36008,36008,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#c0c0c0ff","out":{"hex":"#8c8c8cff","u16":[36008,36008,36008,65535]}}, +{"amount":0.5,"gain":1,"in":"#c0c0c0ff","out":{"hex":"#8c8c8cff","u16":[36008,36008,36008,65535]}}, +{"amount":0.5,"gain":2,"in":"#c0c0c0ff","out":{"hex":"#8c8c8cff","u16":[36008,36008,36008,65535]}}, +{"amount":0.75,"gain":0,"in":"#c0c0c0ff","out":{"hex":"#666666ff","u16":[26277,26277,26277,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#c0c0c0ff","out":{"hex":"#666666ff","u16":[26277,26277,26277,65535]}}, +{"amount":0.75,"gain":1,"in":"#c0c0c0ff","out":{"hex":"#666666ff","u16":[26277,26277,26277,65535]}}, +{"amount":0.75,"gain":2,"in":"#c0c0c0ff","out":{"hex":"#666666ff","u16":[26277,26277,26277,65535]}}, +{"amount":0.9,"gain":0,"in":"#c0c0c0ff","out":{"hex":"#434343ff","u16":[17326,17326,17326,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#c0c0c0ff","out":{"hex":"#434343ff","u16":[17326,17326,17326,65535]}}, +{"amount":0.9,"gain":1,"in":"#c0c0c0ff","out":{"hex":"#434343ff","u16":[17326,17326,17326,65535]}}, +{"amount":0.9,"gain":2,"in":"#c0c0c0ff","out":{"hex":"#434343ff","u16":[17326,17326,17326,65535]}}, +{"amount":1,"gain":0,"in":"#c0c0c0ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#c0c0c0ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#c0c0c0ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#c0c0c0ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#c0c0c0ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#c0c0c0ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#c0c0c0ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#c0c0c0ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":1,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":2,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":0,"in":"#fdfdfdff","out":{"hex":"#fdfdfdff","u16":[65021,65021,65021,65535]}}, +{"amount":0,"gain":0.5,"in":"#fdfdfdff","out":{"hex":"#fdfdfdff","u16":[65021,65021,65021,65535]}}, +{"amount":0,"gain":1,"in":"#fdfdfdff","out":{"hex":"#fdfdfdff","u16":[65021,65021,65021,65535]}}, +{"amount":0,"gain":2,"in":"#fdfdfdff","out":{"hex":"#fdfdfdff","u16":[65021,65021,65021,65535]}}, +{"amount":0.1,"gain":0,"in":"#fdfdfdff","out":{"hex":"#f1f1f1ff","u16":[61980,61980,61980,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#fdfdfdff","out":{"hex":"#f1f1f1ff","u16":[61980,61980,61980,65535]}}, +{"amount":0.1,"gain":1,"in":"#fdfdfdff","out":{"hex":"#f1f1f1ff","u16":[61980,61980,61980,65535]}}, +{"amount":0.1,"gain":2,"in":"#fdfdfdff","out":{"hex":"#f1f1f1ff","u16":[61980,61980,61980,65535]}}, +{"amount":0.25,"gain":0,"in":"#fdfdfdff","out":{"hex":"#dededeff","u16":[57051,57051,57051,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#fdfdfdff","out":{"hex":"#dededeff","u16":[57051,57051,57051,65535]}}, +{"amount":0.25,"gain":1,"in":"#fdfdfdff","out":{"hex":"#dededeff","u16":[57051,57051,57051,65535]}}, +{"amount":0.25,"gain":2,"in":"#fdfdfdff","out":{"hex":"#dededeff","u16":[57051,57051,57051,65535]}}, +{"amount":0.5,"gain":0,"in":"#fdfdfdff","out":{"hex":"#b9b9b9ff","u16":[47448,47448,47448,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#fdfdfdff","out":{"hex":"#b9b9b9ff","u16":[47448,47448,47448,65535]}}, +{"amount":0.5,"gain":1,"in":"#fdfdfdff","out":{"hex":"#b9b9b9ff","u16":[47448,47448,47448,65535]}}, +{"amount":0.5,"gain":2,"in":"#fdfdfdff","out":{"hex":"#b9b9b9ff","u16":[47448,47448,47448,65535]}}, +{"amount":0.75,"gain":0,"in":"#fdfdfdff","out":{"hex":"#878787ff","u16":[34625,34625,34625,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#fdfdfdff","out":{"hex":"#878787ff","u16":[34625,34625,34625,65535]}}, +{"amount":0.75,"gain":1,"in":"#fdfdfdff","out":{"hex":"#878787ff","u16":[34625,34625,34625,65535]}}, +{"amount":0.75,"gain":2,"in":"#fdfdfdff","out":{"hex":"#878787ff","u16":[34625,34625,34625,65535]}}, +{"amount":0.9,"gain":0,"in":"#fdfdfdff","out":{"hex":"#595959ff","u16":[22830,22830,22830,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#fdfdfdff","out":{"hex":"#595959ff","u16":[22830,22830,22830,65535]}}, +{"amount":0.9,"gain":1,"in":"#fdfdfdff","out":{"hex":"#595959ff","u16":[22830,22830,22830,65535]}}, +{"amount":0.9,"gain":2,"in":"#fdfdfdff","out":{"hex":"#595959ff","u16":[22830,22830,22830,65535]}}, +{"amount":1,"gain":0,"in":"#fdfdfdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#fdfdfdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#fdfdfdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#fdfdfdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#fdfdfdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#fdfdfdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#fdfdfdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#fdfdfdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":1,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":2,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":0,"in":"#fefefeff","out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]}}, +{"amount":0,"gain":0.5,"in":"#fefefeff","out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]}}, +{"amount":0,"gain":1,"in":"#fefefeff","out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]}}, +{"amount":0,"gain":2,"in":"#fefefeff","out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]}}, +{"amount":0.1,"gain":0,"in":"#fefefeff","out":{"hex":"#f2f2f2ff","u16":[62225,62225,62225,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#fefefeff","out":{"hex":"#f2f2f2ff","u16":[62225,62225,62225,65535]}}, +{"amount":0.1,"gain":1,"in":"#fefefeff","out":{"hex":"#f2f2f2ff","u16":[62225,62225,62225,65535]}}, +{"amount":0.1,"gain":2,"in":"#fefefeff","out":{"hex":"#f2f2f2ff","u16":[62225,62225,62225,65535]}}, +{"amount":0.25,"gain":0,"in":"#fefefeff","out":{"hex":"#dfdfdfff","u16":[57277,57277,57277,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#fefefeff","out":{"hex":"#dfdfdfff","u16":[57277,57277,57277,65535]}}, +{"amount":0.25,"gain":1,"in":"#fefefeff","out":{"hex":"#dfdfdfff","u16":[57277,57277,57277,65535]}}, +{"amount":0.25,"gain":2,"in":"#fefefeff","out":{"hex":"#dfdfdfff","u16":[57277,57277,57277,65535]}}, +{"amount":0.5,"gain":0,"in":"#fefefeff","out":{"hex":"#b9b9b9ff","u16":[47636,47636,47636,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#fefefeff","out":{"hex":"#b9b9b9ff","u16":[47636,47636,47636,65535]}}, +{"amount":0.5,"gain":1,"in":"#fefefeff","out":{"hex":"#b9b9b9ff","u16":[47636,47636,47636,65535]}}, +{"amount":0.5,"gain":2,"in":"#fefefeff","out":{"hex":"#b9b9b9ff","u16":[47636,47636,47636,65535]}}, +{"amount":0.75,"gain":0,"in":"#fefefeff","out":{"hex":"#878787ff","u16":[34762,34762,34762,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#fefefeff","out":{"hex":"#878787ff","u16":[34762,34762,34762,65535]}}, +{"amount":0.75,"gain":1,"in":"#fefefeff","out":{"hex":"#878787ff","u16":[34762,34762,34762,65535]}}, +{"amount":0.75,"gain":2,"in":"#fefefeff","out":{"hex":"#878787ff","u16":[34762,34762,34762,65535]}}, +{"amount":0.9,"gain":0,"in":"#fefefeff","out":{"hex":"#595959ff","u16":[22920,22920,22920,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#fefefeff","out":{"hex":"#595959ff","u16":[22920,22920,22920,65535]}}, +{"amount":0.9,"gain":1,"in":"#fefefeff","out":{"hex":"#595959ff","u16":[22920,22920,22920,65535]}}, +{"amount":0.9,"gain":2,"in":"#fefefeff","out":{"hex":"#595959ff","u16":[22920,22920,22920,65535]}}, +{"amount":1,"gain":0,"in":"#fefefeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#fefefeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#fefefeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#fefefeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#fefefeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#fefefeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#fefefeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#fefefeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#ff0000ff","out":{"hex":"#989898ff","u16":[38982,38982,38982,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#ff0000ff","out":{"hex":"#d38282ff","u16":[54235,33398,33398,65535]}}, +{"amount":-0.5,"gain":1,"in":"#ff0000ff","out":{"hex":"#ff6767ff","u16":[65535,26374,26374,65535]}}, +{"amount":-0.5,"gain":2,"in":"#ff0000ff","out":{"hex":"#ff6767ff","u16":[65535,26374,26374,65535]}}, +{"amount":0,"gain":0,"in":"#ff0000ff","out":{"hex":"#7e7e7eff","u16":[32421,32421,32421,65535]}}, +{"amount":0,"gain":0.5,"in":"#ff0000ff","out":{"hex":"#cb5c5cff","u16":[52203,23659,23659,65535]}}, +{"amount":0,"gain":1,"in":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"gain":2,"in":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#ff0000ff","out":{"hex":"#787878ff","u16":[30904,30904,30904,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#ff0000ff","out":{"hex":"#c25858ff","u16":[49762,22552,22552,65535]}}, +{"amount":0.1,"gain":1,"in":"#ff0000ff","out":{"hex":"#f30000ff","u16":[62470,0,0,65535]}}, +{"amount":0.1,"gain":2,"in":"#ff0000ff","out":{"hex":"#f30000ff","u16":[62470,0,0,65535]}}, +{"amount":0.25,"gain":0,"in":"#ff0000ff","out":{"hex":"#6f6f6fff","u16":[28447,28447,28447,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#ff0000ff","out":{"hex":"#b25151ff","u16":[45804,20759,20759,65535]}}, +{"amount":0.25,"gain":1,"in":"#ff0000ff","out":{"hex":"#e00000ff","u16":[57502,0,0,65535]}}, +{"amount":0.25,"gain":2,"in":"#ff0000ff","out":{"hex":"#e00000ff","u16":[57502,0,0,65535]}}, +{"amount":0.5,"gain":0,"in":"#ff0000ff","out":{"hex":"#5c5c5cff","u16":[23659,23659,23659,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#ff0000ff","out":{"hex":"#944343ff","u16":[38095,17265,17265,65535]}}, +{"amount":0.5,"gain":1,"in":"#ff0000ff","out":{"hex":"#ba0000ff","u16":[47824,0,0,65535]}}, +{"amount":0.5,"gain":2,"in":"#ff0000ff","out":{"hex":"#ba0000ff","u16":[47824,0,0,65535]}}, +{"amount":0.75,"gain":0,"in":"#ff0000ff","out":{"hex":"#434343ff","u16":[17265,17265,17265,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#ff0000ff","out":{"hex":"#6c3131ff","u16":[27799,12599,12599,65535]}}, +{"amount":0.75,"gain":1,"in":"#ff0000ff","out":{"hex":"#880000ff","u16":[34899,0,0,65535]}}, +{"amount":0.75,"gain":2,"in":"#ff0000ff","out":{"hex":"#880000ff","u16":[34899,0,0,65535]}}, +{"amount":0.9,"gain":0,"in":"#ff0000ff","out":{"hex":"#2c2c2cff","u16":[11383,11383,11383,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#ff0000ff","out":{"hex":"#472020ff","u16":[18329,8307,8307,65535]}}, +{"amount":0.9,"gain":1,"in":"#ff0000ff","out":{"hex":"#5a0000ff","u16":[23011,0,0,65535]}}, +{"amount":0.9,"gain":2,"in":"#ff0000ff","out":{"hex":"#5a0000ff","u16":[23011,0,0,65535]}}, +{"amount":1,"gain":0,"in":"#ff0000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#ff0000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#ff0000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#ff0000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#ff0000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#ff0000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#ff0000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#ff0000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":1,"in":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":2,"in":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":0,"in":"#00ff00ff","out":{"hex":"#dbdbdbff","u16":[56274,56274,56274,65535]}}, +{"amount":0,"gain":0.5,"in":"#00ff00ff","out":{"hex":"#a0eea0ff","u16":[41065,61115,41065,65535]}}, +{"amount":0,"gain":1,"in":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"gain":2,"in":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#00ff00ff","out":{"hex":"#d1d1d1ff","u16":[53642,53642,53642,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#00ff00ff","out":{"hex":"#98e398ff","u16":[39145,58257,39145,65535]}}, +{"amount":0.1,"gain":1,"in":"#00ff00ff","out":{"hex":"#00f300ff","u16":[0,62470,0,65535]}}, +{"amount":0.1,"gain":2,"in":"#00ff00ff","out":{"hex":"#00f300ff","u16":[0,62470,0,65535]}}, +{"amount":0.25,"gain":0,"in":"#00ff00ff","out":{"hex":"#c0c0c0ff","u16":[49376,49376,49376,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#00ff00ff","out":{"hex":"#8cd18cff","u16":[36031,53624,36031,65535]}}, +{"amount":0.25,"gain":1,"in":"#00ff00ff","out":{"hex":"#00e000ff","u16":[0,57502,0,65535]}}, +{"amount":0.25,"gain":2,"in":"#00ff00ff","out":{"hex":"#00e000ff","u16":[0,57502,0,65535]}}, +{"amount":0.5,"gain":0,"in":"#00ff00ff","out":{"hex":"#a0a0a0ff","u16":[41065,41065,41065,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#00ff00ff","out":{"hex":"#75ae75ff","u16":[29967,44598,29967,65535]}}, +{"amount":0.5,"gain":1,"in":"#00ff00ff","out":{"hex":"#00ba00ff","u16":[0,47824,0,65535]}}, +{"amount":0.5,"gain":2,"in":"#00ff00ff","out":{"hex":"#00ba00ff","u16":[0,47824,0,65535]}}, +{"amount":0.75,"gain":0,"in":"#00ff00ff","out":{"hex":"#757575ff","u16":[29967,29967,29967,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#00ff00ff","out":{"hex":"#557f55ff","u16":[21868,32545,21868,65535]}}, +{"amount":0.75,"gain":1,"in":"#00ff00ff","out":{"hex":"#008800ff","u16":[0,34899,0,65535]}}, +{"amount":0.75,"gain":2,"in":"#00ff00ff","out":{"hex":"#008800ff","u16":[0,34899,0,65535]}}, +{"amount":0.9,"gain":0,"in":"#00ff00ff","out":{"hex":"#4d4d4dff","u16":[19759,19759,19759,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#00ff00ff","out":{"hex":"#385338ff","u16":[14419,21459,14419,65535]}}, +{"amount":0.9,"gain":1,"in":"#00ff00ff","out":{"hex":"#005a00ff","u16":[0,23011,0,65535]}}, +{"amount":0.9,"gain":2,"in":"#00ff00ff","out":{"hex":"#005a00ff","u16":[0,23011,0,65535]}}, +{"amount":1,"gain":0,"in":"#00ff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#00ff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#00ff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#00ff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#00ff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#00ff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#00ff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#00ff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#0000ffff","out":{"hex":"#5d5d5dff","u16":[23860,23860,23860,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#0000ffff","out":{"hex":"#4e4ec3ff","u16":[20018,20018,50112,65535]}}, +{"amount":-0.5,"gain":1,"in":"#0000ffff","out":{"hex":"#3a3affff","u16":[14983,14983,65535,65535]}}, +{"amount":-0.5,"gain":2,"in":"#0000ffff","out":{"hex":"#3a3affff","u16":[14983,14983,65535,65535]}}, +{"amount":0,"gain":0,"in":"#0000ffff","out":{"hex":"#4d4d4dff","u16":[19844,19844,19844,65535]}}, +{"amount":0,"gain":0.5,"in":"#0000ffff","out":{"hex":"#3838c0ff","u16":[14481,14481,49363,65535]}}, +{"amount":0,"gain":1,"in":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"gain":2,"in":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"gain":0,"in":"#0000ffff","out":{"hex":"#4a4a4aff","u16":[18916,18916,18916,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#0000ffff","out":{"hex":"#3636b7ff","u16":[13804,13804,47055,65535]}}, +{"amount":0.1,"gain":1,"in":"#0000ffff","out":{"hex":"#0000f3ff","u16":[0,0,62470,65535]}}, +{"amount":0.1,"gain":2,"in":"#0000ffff","out":{"hex":"#0000f3ff","u16":[0,0,62470,65535]}}, +{"amount":0.25,"gain":0,"in":"#0000ffff","out":{"hex":"#444444ff","u16":[17412,17412,17412,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#0000ffff","out":{"hex":"#3131a9ff","u16":[12706,12706,43312,65535]}}, +{"amount":0.25,"gain":1,"in":"#0000ffff","out":{"hex":"#0000e0ff","u16":[0,0,57502,65535]}}, +{"amount":0.25,"gain":2,"in":"#0000ffff","out":{"hex":"#0000e0ff","u16":[0,0,57502,65535]}}, +{"amount":0.5,"gain":0,"in":"#0000ffff","out":{"hex":"#383838ff","u16":[14481,14481,14481,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#0000ffff","out":{"hex":"#29298cff","u16":[10567,10567,36022,65535]}}, +{"amount":0.5,"gain":1,"in":"#0000ffff","out":{"hex":"#0000baff","u16":[0,0,47824,65535]}}, +{"amount":0.5,"gain":2,"in":"#0000ffff","out":{"hex":"#0000baff","u16":[0,0,47824,65535]}}, +{"amount":0.75,"gain":0,"in":"#0000ffff","out":{"hex":"#292929ff","u16":[10567,10567,10567,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#0000ffff","out":{"hex":"#1e1e66ff","u16":[7711,7711,26287,65535]}}, +{"amount":0.75,"gain":1,"in":"#0000ffff","out":{"hex":"#000088ff","u16":[0,0,34899,65535]}}, +{"amount":0.75,"gain":2,"in":"#0000ffff","out":{"hex":"#000088ff","u16":[0,0,34899,65535]}}, +{"amount":0.9,"gain":0,"in":"#0000ffff","out":{"hex":"#1b1b1bff","u16":[6968,6968,6968,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#0000ffff","out":{"hex":"#141443ff","u16":[5085,5085,17332,65535]}}, +{"amount":0.9,"gain":1,"in":"#0000ffff","out":{"hex":"#00005aff","u16":[0,0,23011,65535]}}, +{"amount":0.9,"gain":2,"in":"#0000ffff","out":{"hex":"#00005aff","u16":[0,0,23011,65535]}}, +{"amount":1,"gain":0,"in":"#0000ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#0000ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#0000ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#0000ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#0000ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#0000ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#0000ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#0000ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":1,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":2,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":0,"in":"#ffff00ff","out":{"hex":"#f6f6f6ff","u16":[63340,63340,63340,65535]}}, +{"amount":0,"gain":0.5,"in":"#ffff00ff","out":{"hex":"#fbfbb4ff","u16":[64449,64449,46222,65535]}}, +{"amount":0,"gain":1,"in":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"gain":2,"in":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#ffff00ff","out":{"hex":"#ebebebff","u16":[60378,60378,60378,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#ffff00ff","out":{"hex":"#efefabff","u16":[61435,61435,44060,65535]}}, +{"amount":0.1,"gain":1,"in":"#ffff00ff","out":{"hex":"#f3f300ff","u16":[62470,62470,0,65535]}}, +{"amount":0.1,"gain":2,"in":"#ffff00ff","out":{"hex":"#f3f300ff","u16":[62470,62470,0,65535]}}, +{"amount":0.25,"gain":0,"in":"#ffff00ff","out":{"hex":"#d8d8d8ff","u16":[55576,55576,55576,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#ffff00ff","out":{"hex":"#dcdc9eff","u16":[56549,56549,40556,65535]}}, +{"amount":0.25,"gain":1,"in":"#ffff00ff","out":{"hex":"#e0e000ff","u16":[57502,57502,0,65535]}}, +{"amount":0.25,"gain":2,"in":"#ffff00ff","out":{"hex":"#e0e000ff","u16":[57502,57502,0,65535]}}, +{"amount":0.5,"gain":0,"in":"#ffff00ff","out":{"hex":"#b4b4b4ff","u16":[46222,46222,46222,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#ffff00ff","out":{"hex":"#b7b783ff","u16":[47031,47031,33730,65535]}}, +{"amount":0.5,"gain":1,"in":"#ffff00ff","out":{"hex":"#baba00ff","u16":[47824,47824,0,65535]}}, +{"amount":0.5,"gain":2,"in":"#ffff00ff","out":{"hex":"#baba00ff","u16":[47824,47824,0,65535]}}, +{"amount":0.75,"gain":0,"in":"#ffff00ff","out":{"hex":"#838383ff","u16":[33730,33730,33730,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#ffff00ff","out":{"hex":"#868660ff","u16":[34320,34320,24614,65535]}}, +{"amount":0.75,"gain":1,"in":"#ffff00ff","out":{"hex":"#888800ff","u16":[34899,34899,0,65535]}}, +{"amount":0.75,"gain":2,"in":"#ffff00ff","out":{"hex":"#888800ff","u16":[34899,34899,0,65535]}}, +{"amount":0.9,"gain":0,"in":"#ffff00ff","out":{"hex":"#575757ff","u16":[22240,22240,22240,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#ffff00ff","out":{"hex":"#58583fff","u16":[22629,22629,16229,65535]}}, +{"amount":0.9,"gain":1,"in":"#ffff00ff","out":{"hex":"#5a5a00ff","u16":[23011,23011,0,65535]}}, +{"amount":0.9,"gain":2,"in":"#ffff00ff","out":{"hex":"#5a5a00ff","u16":[23011,23011,0,65535]}}, +{"amount":1,"gain":0,"in":"#ffff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#ffff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#ffff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#ffff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#ffff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#ffff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#ffff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#ffff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":1,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":2,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":0,"in":"#00ffffff","out":{"hex":"#e5e5e5ff","u16":[58788,58788,58788,65535]}}, +{"amount":0,"gain":0.5,"in":"#00ffffff","out":{"hex":"#a7f2f2ff","u16":[42900,62271,62271,65535]}}, +{"amount":0,"gain":1,"in":"#00ffffff","out":{"hex":"#00ffffff","u16":[0,65535,65535,65535]}}, +{"amount":0,"gain":2,"in":"#00ffffff","out":{"hex":"#00ffffff","u16":[0,65535,65535,65535]}}, +{"amount":0.1,"gain":0,"in":"#00ffffff","out":{"hex":"#dadadaff","u16":[56039,56039,56039,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#00ffffff","out":{"hex":"#9fe7e7ff","u16":[40894,59359,59359,65535]}}, +{"amount":0.1,"gain":1,"in":"#00ffffff","out":{"hex":"#00f3f3ff","u16":[0,62470,62470,65535]}}, +{"amount":0.1,"gain":2,"in":"#00ffffff","out":{"hex":"#00f3f3ff","u16":[0,62470,62470,65535]}}, +{"amount":0.25,"gain":0,"in":"#00ffffff","out":{"hex":"#c9c9c9ff","u16":[51582,51582,51582,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#00ffffff","out":{"hex":"#92d5d5ff","u16":[37642,54638,54638,65535]}}, +{"amount":0.25,"gain":1,"in":"#00ffffff","out":{"hex":"#00e0e0ff","u16":[0,57502,57502,65535]}}, +{"amount":0.25,"gain":2,"in":"#00ffffff","out":{"hex":"#00e0e0ff","u16":[0,57502,57502,65535]}}, +{"amount":0.5,"gain":0,"in":"#00ffffff","out":{"hex":"#a7a7a7ff","u16":[42900,42900,42900,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#00ffffff","out":{"hex":"#7ab1b1ff","u16":[31306,45442,45442,65535]}}, +{"amount":0.5,"gain":1,"in":"#00ffffff","out":{"hex":"#00babaff","u16":[0,47824,47824,65535]}}, +{"amount":0.5,"gain":2,"in":"#00ffffff","out":{"hex":"#00babaff","u16":[0,47824,47824,65535]}}, +{"amount":0.75,"gain":0,"in":"#00ffffff","out":{"hex":"#7a7a7aff","u16":[31306,31306,31306,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#00ffffff","out":{"hex":"#598181ff","u16":[22845,33161,33161,65535]}}, +{"amount":0.75,"gain":1,"in":"#00ffffff","out":{"hex":"#008888ff","u16":[0,34899,34899,65535]}}, +{"amount":0.75,"gain":2,"in":"#00ffffff","out":{"hex":"#008888ff","u16":[0,34899,34899,65535]}}, +{"amount":0.9,"gain":0,"in":"#00ffffff","out":{"hex":"#505050ff","u16":[20642,20642,20642,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#00ffffff","out":{"hex":"#3b5555ff","u16":[15063,21865,21865,65535]}}, +{"amount":0.9,"gain":1,"in":"#00ffffff","out":{"hex":"#005a5aff","u16":[0,23011,23011,65535]}}, +{"amount":0.9,"gain":2,"in":"#00ffffff","out":{"hex":"#005a5aff","u16":[0,23011,23011,65535]}}, +{"amount":1,"gain":0,"in":"#00ffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#00ffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#00ffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#00ffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#00ffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#00ffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#00ffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#00ffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#ff00ffff","out":{"hex":"#adadadff","u16":[44522,44522,44522,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#ff00ffff","out":{"hex":"#db96dbff","u16":[56216,38661,56216,65535]}}, +{"amount":-0.5,"gain":1,"in":"#ff00ffff","out":{"hex":"#ff7affff","u16":[65535,31468,65535,65535]}}, +{"amount":-0.5,"gain":2,"in":"#ff00ffff","out":{"hex":"#ff7affff","u16":[65535,31468,65535,65535]}}, +{"amount":0,"gain":0,"in":"#ff00ffff","out":{"hex":"#909090ff","u16":[37029,37029,37029,65535]}}, +{"amount":0,"gain":0.5,"in":"#ff00ffff","out":{"hex":"#d169d1ff","u16":[53594,27021,53594,65535]}}, +{"amount":0,"gain":1,"in":"#ff00ffff","out":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]}}, +{"amount":0,"gain":2,"in":"#ff00ffff","out":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]}}, +{"amount":0.1,"gain":0,"in":"#ff00ffff","out":{"hex":"#898989ff","u16":[35297,35297,35297,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#ff00ffff","out":{"hex":"#c764c7ff","u16":[51087,25758,51087,65535]}}, +{"amount":0.1,"gain":1,"in":"#ff00ffff","out":{"hex":"#f300f3ff","u16":[62470,0,62470,65535]}}, +{"amount":0.1,"gain":2,"in":"#ff00ffff","out":{"hex":"#f300f3ff","u16":[62470,0,62470,65535]}}, +{"amount":0.25,"gain":0,"in":"#ff00ffff","out":{"hex":"#7e7e7eff","u16":[32490,32490,32490,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#ff00ffff","out":{"hex":"#b75cb7ff","u16":[47024,23709,47024,65535]}}, +{"amount":0.25,"gain":1,"in":"#ff00ffff","out":{"hex":"#e000e0ff","u16":[57502,0,57502,65535]}}, +{"amount":0.25,"gain":2,"in":"#ff00ffff","out":{"hex":"#e000e0ff","u16":[57502,0,57502,65535]}}, +{"amount":0.5,"gain":0,"in":"#ff00ffff","out":{"hex":"#696969ff","u16":[27021,27021,27021,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#ff00ffff","out":{"hex":"#984d98ff","u16":[39109,19718,39109,65535]}}, +{"amount":0.5,"gain":1,"in":"#ff00ffff","out":{"hex":"#ba00baff","u16":[47824,0,47824,65535]}}, +{"amount":0.5,"gain":2,"in":"#ff00ffff","out":{"hex":"#ba00baff","u16":[47824,0,47824,65535]}}, +{"amount":0.75,"gain":0,"in":"#ff00ffff","out":{"hex":"#4d4d4dff","u16":[19718,19718,19718,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#ff00ffff","out":{"hex":"#6f386fff","u16":[28540,14389,28540,65535]}}, +{"amount":0.75,"gain":1,"in":"#ff00ffff","out":{"hex":"#880088ff","u16":[34899,0,34899,65535]}}, +{"amount":0.75,"gain":2,"in":"#ff00ffff","out":{"hex":"#880088ff","u16":[34899,0,34899,65535]}}, +{"amount":0.9,"gain":0,"in":"#ff00ffff","out":{"hex":"#333333ff","u16":[13001,13001,13001,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#ff00ffff","out":{"hex":"#492549ff","u16":[18818,9488,18818,65535]}}, +{"amount":0.9,"gain":1,"in":"#ff00ffff","out":{"hex":"#5a005aff","u16":[23011,0,23011,65535]}}, +{"amount":0.9,"gain":2,"in":"#ff00ffff","out":{"hex":"#5a005aff","u16":[23011,0,23011,65535]}}, +{"amount":1,"gain":0,"in":"#ff00ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#ff00ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#ff00ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#ff00ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#ff00ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#ff00ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#ff00ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#ff00ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#800000ff","out":{"hex":"#4c4c4cff","u16":[19567,19567,19567,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#800000ff","out":{"hex":"#7b3838ff","u16":[31507,14279,14279,65535]}}, +{"amount":-0.5,"gain":1,"in":"#800000ff","out":{"hex":"#9a0000ff","u16":[39553,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#800000ff","out":{"hex":"#9a0000ff","u16":[39553,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#800000ff","out":{"hex":"#3f3f3fff","u16":[16274,16274,16274,65535]}}, +{"amount":0,"gain":0.5,"in":"#800000ff","out":{"hex":"#662e2eff","u16":[26204,11876,11876,65535]}}, +{"amount":0,"gain":1,"in":"#800000ff","out":{"hex":"#800000ff","u16":[32896,0,0,65535]}}, +{"amount":0,"gain":2,"in":"#800000ff","out":{"hex":"#800000ff","u16":[32896,0,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#800000ff","out":{"hex":"#3c3c3cff","u16":[15513,15513,15513,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#800000ff","out":{"hex":"#612c2cff","u16":[24978,11320,11320,65535]}}, +{"amount":0.1,"gain":1,"in":"#800000ff","out":{"hex":"#7a0000ff","u16":[31358,0,0,65535]}}, +{"amount":0.1,"gain":2,"in":"#800000ff","out":{"hex":"#7a0000ff","u16":[31358,0,0,65535]}}, +{"amount":0.25,"gain":0,"in":"#800000ff","out":{"hex":"#383838ff","u16":[14279,14279,14279,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#800000ff","out":{"hex":"#592929ff","u16":[22992,10420,10420,65535]}}, +{"amount":0.25,"gain":1,"in":"#800000ff","out":{"hex":"#700000ff","u16":[28864,0,0,65535]}}, +{"amount":0.25,"gain":2,"in":"#800000ff","out":{"hex":"#700000ff","u16":[28864,0,0,65535]}}, +{"amount":0.5,"gain":0,"in":"#800000ff","out":{"hex":"#2e2e2eff","u16":[11876,11876,11876,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#800000ff","out":{"hex":"#4a2222ff","u16":[19122,8666,8666,65535]}}, +{"amount":0.5,"gain":1,"in":"#800000ff","out":{"hex":"#5d0000ff","u16":[24006,0,0,65535]}}, +{"amount":0.5,"gain":2,"in":"#800000ff","out":{"hex":"#5d0000ff","u16":[24006,0,0,65535]}}, +{"amount":0.75,"gain":0,"in":"#800000ff","out":{"hex":"#222222ff","u16":[8666,8666,8666,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#800000ff","out":{"hex":"#361919ff","u16":[13954,6324,6324,65535]}}, +{"amount":0.75,"gain":1,"in":"#800000ff","out":{"hex":"#440000ff","u16":[17518,0,0,65535]}}, +{"amount":0.75,"gain":2,"in":"#800000ff","out":{"hex":"#440000ff","u16":[17518,0,0,65535]}}, +{"amount":0.9,"gain":0,"in":"#800000ff","out":{"hex":"#161616ff","u16":[5714,5714,5714,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#800000ff","out":{"hex":"#241010ff","u16":[9201,4170,4170,65535]}}, +{"amount":0.9,"gain":1,"in":"#800000ff","out":{"hex":"#2d0000ff","u16":[11550,0,0,65535]}}, +{"amount":0.9,"gain":2,"in":"#800000ff","out":{"hex":"#2d0000ff","u16":[11550,0,0,65535]}}, +{"amount":1,"gain":0,"in":"#800000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#800000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#800000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#800000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#800000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#800000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#800000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#800000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#008000ff","out":{"hex":"#848484ff","u16":[33964,33964,33964,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#008000ff","out":{"hex":"#609060ff","u16":[24785,36886,24785,65535]}}, +{"amount":-0.5,"gain":1,"in":"#008000ff","out":{"hex":"#009a00ff","u16":[0,39553,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#008000ff","out":{"hex":"#009a00ff","u16":[0,39553,0,65535]}}, +{"amount":0,"gain":0,"in":"#008000ff","out":{"hex":"#6e6e6eff","u16":[28247,28247,28247,65535]}}, +{"amount":0,"gain":0.5,"in":"#008000ff","out":{"hex":"#507750ff","u16":[20613,30677,20613,65535]}}, +{"amount":0,"gain":1,"in":"#008000ff","out":{"hex":"#008000ff","u16":[0,32896,0,65535]}}, +{"amount":0,"gain":2,"in":"#008000ff","out":{"hex":"#008000ff","u16":[0,32896,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#008000ff","out":{"hex":"#696969ff","u16":[26926,26926,26926,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#008000ff","out":{"hex":"#4c724cff","u16":[19649,29243,19649,65535]}}, +{"amount":0.1,"gain":1,"in":"#008000ff","out":{"hex":"#007a00ff","u16":[0,31358,0,65535]}}, +{"amount":0.1,"gain":2,"in":"#008000ff","out":{"hex":"#007a00ff","u16":[0,31358,0,65535]}}, +{"amount":0.25,"gain":0,"in":"#008000ff","out":{"hex":"#606060ff","u16":[24785,24785,24785,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#008000ff","out":{"hex":"#466946ff","u16":[18086,26917,18086,65535]}}, +{"amount":0.25,"gain":1,"in":"#008000ff","out":{"hex":"#007000ff","u16":[0,28864,0,65535]}}, +{"amount":0.25,"gain":2,"in":"#008000ff","out":{"hex":"#007000ff","u16":[0,28864,0,65535]}}, +{"amount":0.5,"gain":0,"in":"#008000ff","out":{"hex":"#505050ff","u16":[20613,20613,20613,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#008000ff","out":{"hex":"#3b573bff","u16":[15042,22387,15042,65535]}}, +{"amount":0.5,"gain":1,"in":"#008000ff","out":{"hex":"#005d00ff","u16":[0,24006,0,65535]}}, +{"amount":0.5,"gain":2,"in":"#008000ff","out":{"hex":"#005d00ff","u16":[0,24006,0,65535]}}, +{"amount":0.75,"gain":0,"in":"#008000ff","out":{"hex":"#3b3b3bff","u16":[15042,15042,15042,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#008000ff","out":{"hex":"#2b402bff","u16":[10977,16336,10977,65535]}}, +{"amount":0.75,"gain":1,"in":"#008000ff","out":{"hex":"#004400ff","u16":[0,17518,0,65535]}}, +{"amount":0.75,"gain":2,"in":"#008000ff","out":{"hex":"#004400ff","u16":[0,17518,0,65535]}}, +{"amount":0.9,"gain":0,"in":"#008000ff","out":{"hex":"#272727ff","u16":[9918,9918,9918,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#008000ff","out":{"hex":"#1c2a1cff","u16":[7238,10771,7238,65535]}}, +{"amount":0.9,"gain":1,"in":"#008000ff","out":{"hex":"#002d00ff","u16":[0,11550,0,65535]}}, +{"amount":0.9,"gain":2,"in":"#008000ff","out":{"hex":"#002d00ff","u16":[0,11550,0,65535]}}, +{"amount":1,"gain":0,"in":"#008000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#008000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#008000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#008000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#008000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#008000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#008000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#008000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#000080ff","out":{"hex":"#2f2f2fff","u16":[11977,11977,11977,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#000080ff","out":{"hex":"#222274ff","u16":[8740,8740,29793,65535]}}, +{"amount":-0.5,"gain":1,"in":"#000080ff","out":{"hex":"#00009aff","u16":[0,0,39553,65535]}}, +{"amount":-0.5,"gain":2,"in":"#000080ff","out":{"hex":"#00009aff","u16":[0,0,39553,65535]}}, +{"amount":0,"gain":0,"in":"#000080ff","out":{"hex":"#272727ff","u16":[9961,9961,9961,65535]}}, +{"amount":0,"gain":0.5,"in":"#000080ff","out":{"hex":"#1c1c60ff","u16":[7269,7269,24778,65535]}}, +{"amount":0,"gain":1,"in":"#000080ff","out":{"hex":"#000080ff","u16":[0,0,32896,65535]}}, +{"amount":0,"gain":2,"in":"#000080ff","out":{"hex":"#000080ff","u16":[0,0,32896,65535]}}, +{"amount":0.1,"gain":0,"in":"#000080ff","out":{"hex":"#252525ff","u16":[9495,9495,9495,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#000080ff","out":{"hex":"#1b1b5cff","u16":[6929,6929,23620,65535]}}, +{"amount":0.1,"gain":1,"in":"#000080ff","out":{"hex":"#00007aff","u16":[0,0,31358,65535]}}, +{"amount":0.1,"gain":2,"in":"#000080ff","out":{"hex":"#00007aff","u16":[0,0,31358,65535]}}, +{"amount":0.25,"gain":0,"in":"#000080ff","out":{"hex":"#222222ff","u16":[8740,8740,8740,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#000080ff","out":{"hex":"#191955ff","u16":[6378,6378,21741,65535]}}, +{"amount":0.25,"gain":1,"in":"#000080ff","out":{"hex":"#000070ff","u16":[0,0,28864,65535]}}, +{"amount":0.25,"gain":2,"in":"#000080ff","out":{"hex":"#000070ff","u16":[0,0,28864,65535]}}, +{"amount":0.5,"gain":0,"in":"#000080ff","out":{"hex":"#1c1c1cff","u16":[7269,7269,7269,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#000080ff","out":{"hex":"#151546ff","u16":[5304,5304,18082,65535]}}, +{"amount":0.5,"gain":1,"in":"#000080ff","out":{"hex":"#00005dff","u16":[0,0,24006,65535]}}, +{"amount":0.5,"gain":2,"in":"#000080ff","out":{"hex":"#00005dff","u16":[0,0,24006,65535]}}, +{"amount":0.75,"gain":0,"in":"#000080ff","out":{"hex":"#151515ff","u16":[5304,5304,5304,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#000080ff","out":{"hex":"#0f0f33ff","u16":[3871,3871,13195,65535]}}, +{"amount":0.75,"gain":1,"in":"#000080ff","out":{"hex":"#000044ff","u16":[0,0,17518,65535]}}, +{"amount":0.75,"gain":2,"in":"#000080ff","out":{"hex":"#000044ff","u16":[0,0,17518,65535]}}, +{"amount":0.9,"gain":0,"in":"#000080ff","out":{"hex":"#0e0e0eff","u16":[3497,3497,3497,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#000080ff","out":{"hex":"#0a0a22ff","u16":[2552,2552,8700,65535]}}, +{"amount":0.9,"gain":1,"in":"#000080ff","out":{"hex":"#00002dff","u16":[0,0,11550,65535]}}, +{"amount":0.9,"gain":2,"in":"#000080ff","out":{"hex":"#00002dff","u16":[0,0,11550,65535]}}, +{"amount":1,"gain":0,"in":"#000080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#000080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#000080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#000080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#000080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#000080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#000080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#000080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#ff8080ff","out":{"hex":"#c7c7c7ff","u16":[51088,51088,51088,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#ff8080ff","out":{"hex":"#e5bebeff","u16":[58845,48736,48736,65535]}}, +{"amount":-0.5,"gain":1,"in":"#ff8080ff","out":{"hex":"#ffb4b4ff","u16":[65535,46239,46239,65535]}}, +{"amount":-0.5,"gain":2,"in":"#ff8080ff","out":{"hex":"#ffb4b4ff","u16":[65535,46239,46239,65535]}}, +{"amount":0,"gain":0,"in":"#ff8080ff","out":{"hex":"#a5a5a5ff","u16":[42489,42489,42489,65535]}}, +{"amount":0,"gain":0.5,"in":"#ff8080ff","out":{"hex":"#d89494ff","u16":[55463,38057,38057,65535]}}, +{"amount":0,"gain":1,"in":"#ff8080ff","out":{"hex":"#ff8080ff","u16":[65535,32896,32896,65535]}}, +{"amount":0,"gain":2,"in":"#ff8080ff","out":{"hex":"#ff8080ff","u16":[65535,32896,32896,65535]}}, +{"amount":0.1,"gain":0,"in":"#ff8080ff","out":{"hex":"#9e9e9eff","u16":[40502,40502,40502,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#ff8080ff","out":{"hex":"#d58a8aff","u16":[54756,35448,35448,65535]}}, +{"amount":0.1,"gain":1,"in":"#ff8080ff","out":{"hex":"#ff7272ff","u16":[65535,29332,29332,65535]}}, +{"amount":0.1,"gain":2,"in":"#ff8080ff","out":{"hex":"#ff7272ff","u16":[65535,29332,29332,65535]}}, +{"amount":0.25,"gain":0,"in":"#ff8080ff","out":{"hex":"#919191ff","u16":[37281,37281,37281,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#ff8080ff","out":{"hex":"#d17979ff","u16":[53675,31034,31034,65535]}}, +{"amount":0.25,"gain":1,"in":"#ff8080ff","out":{"hex":"#ff5858ff","u16":[65535,22709,22709,65535]}}, +{"amount":0.25,"gain":2,"in":"#ff8080ff","out":{"hex":"#ff5858ff","u16":[65535,22709,22709,65535]}}, +{"amount":0.5,"gain":0,"in":"#ff8080ff","out":{"hex":"#797979ff","u16":[31006,31006,31006,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#ff8080ff","out":{"hex":"#c25858ff","u16":[49925,22626,22626,65535]}}, +{"amount":0.5,"gain":1,"in":"#ff8080ff","out":{"hex":"#f40000ff","u16":[62676,0,0,65535]}}, +{"amount":0.5,"gain":2,"in":"#ff8080ff","out":{"hex":"#f40000ff","u16":[62676,0,0,65535]}}, +{"amount":0.75,"gain":0,"in":"#ff8080ff","out":{"hex":"#585858ff","u16":[22626,22626,22626,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#ff8080ff","out":{"hex":"#8e4040ff","u16":[36432,16511,16511,65535]}}, +{"amount":0.75,"gain":1,"in":"#ff8080ff","out":{"hex":"#b20000ff","u16":[45737,0,0,65535]}}, +{"amount":0.75,"gain":2,"in":"#ff8080ff","out":{"hex":"#b20000ff","u16":[45737,0,0,65535]}}, +{"amount":0.9,"gain":0,"in":"#ff8080ff","out":{"hex":"#3a3a3aff","u16":[14919,14919,14919,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#ff8080ff","out":{"hex":"#5d2a2aff","u16":[24022,10887,10887,65535]}}, +{"amount":0.9,"gain":1,"in":"#ff8080ff","out":{"hex":"#750000ff","u16":[30157,0,0,65535]}}, +{"amount":0.9,"gain":2,"in":"#ff8080ff","out":{"hex":"#750000ff","u16":[30157,0,0,65535]}}, +{"amount":1,"gain":0,"in":"#ff8080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#ff8080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#ff8080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#ff8080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#ff8080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#ff8080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#ff8080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#ff8080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":1,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":2,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":0,"in":"#80ff80ff","out":{"hex":"#e3e3e3ff","u16":[58458,58458,58458,65535]}}, +{"amount":0,"gain":0.5,"in":"#80ff80ff","out":{"hex":"#baf2baff","u16":[47763,62118,47763,65535]}}, +{"amount":0,"gain":1,"in":"#80ff80ff","out":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]}}, +{"amount":0,"gain":2,"in":"#80ff80ff","out":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]}}, +{"amount":0.1,"gain":0,"in":"#80ff80ff","out":{"hex":"#d9d9d9ff","u16":[55725,55725,55725,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#80ff80ff","out":{"hex":"#9eeb9eff","u16":[40665,60519,40665,65535]}}, +{"amount":0.1,"gain":1,"in":"#80ff80ff","out":{"hex":"#00fd00ff","u16":[0,64896,0,65535]}}, +{"amount":0.1,"gain":2,"in":"#80ff80ff","out":{"hex":"#00fd00ff","u16":[0,64896,0,65535]}}, +{"amount":0.25,"gain":0,"in":"#80ff80ff","out":{"hex":"#c8c8c8ff","u16":[51293,51293,51293,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#80ff80ff","out":{"hex":"#92d992ff","u16":[37430,55706,37430,65535]}}, +{"amount":0.25,"gain":1,"in":"#80ff80ff","out":{"hex":"#00e800ff","u16":[0,59735,0,65535]}}, +{"amount":0.25,"gain":2,"in":"#80ff80ff","out":{"hex":"#00e800ff","u16":[0,59735,0,65535]}}, +{"amount":0.5,"gain":0,"in":"#80ff80ff","out":{"hex":"#a6a6a6ff","u16":[42659,42659,42659,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#80ff80ff","out":{"hex":"#79b479ff","u16":[31130,46330,31130,65535]}}, +{"amount":0.5,"gain":1,"in":"#80ff80ff","out":{"hex":"#00c100ff","u16":[0,49680,0,65535]}}, +{"amount":0.5,"gain":2,"in":"#80ff80ff","out":{"hex":"#00c100ff","u16":[0,49680,0,65535]}}, +{"amount":0.75,"gain":0,"in":"#80ff80ff","out":{"hex":"#797979ff","u16":[31130,31130,31130,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#80ff80ff","out":{"hex":"#588458ff","u16":[22717,33809,22717,65535]}}, +{"amount":0.75,"gain":1,"in":"#80ff80ff","out":{"hex":"#008d00ff","u16":[0,36254,0,65535]}}, +{"amount":0.75,"gain":2,"in":"#80ff80ff","out":{"hex":"#008d00ff","u16":[0,36254,0,65535]}}, +{"amount":0.9,"gain":0,"in":"#80ff80ff","out":{"hex":"#505050ff","u16":[20526,20526,20526,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#80ff80ff","out":{"hex":"#3a573aff","u16":[14979,22292,14979,65535]}}, +{"amount":0.9,"gain":1,"in":"#80ff80ff","out":{"hex":"#005d00ff","u16":[0,23904,0,65535]}}, +{"amount":0.9,"gain":2,"in":"#80ff80ff","out":{"hex":"#005d00ff","u16":[0,23904,0,65535]}}, +{"amount":1,"gain":0,"in":"#80ff80ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#80ff80ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#80ff80ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#80ff80ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#80ff80ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#80ff80ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#80ff80ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#80ff80ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#8080ffff","out":{"hex":"#abababff","u16":[43882,43882,43882,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#8080ffff","out":{"hex":"#a6a6daff","u16":[42766,42766,55976,65535]}}, +{"amount":-0.5,"gain":1,"in":"#8080ffff","out":{"hex":"#a2a2ffff","u16":[41613,41613,65535,65535]}}, +{"amount":-0.5,"gain":2,"in":"#8080ffff","out":{"hex":"#a2a2ffff","u16":[41613,41613,65535,65535]}}, +{"amount":0,"gain":0,"in":"#8080ffff","out":{"hex":"#8e8e8eff","u16":[36496,36496,36496,65535]}}, +{"amount":0,"gain":0.5,"in":"#8080ffff","out":{"hex":"#8787d0ff","u16":[34752,34752,53424,65535]}}, +{"amount":0,"gain":1,"in":"#8080ffff","out":{"hex":"#8080ffff","u16":[32896,32896,65535,65535]}}, +{"amount":0,"gain":2,"in":"#8080ffff","out":{"hex":"#8080ffff","u16":[32896,32896,65535,65535]}}, +{"amount":0.1,"gain":0,"in":"#8080ffff","out":{"hex":"#878787ff","u16":[34790,34790,34790,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#8080ffff","out":{"hex":"#8080ceff","u16":[32863,32863,52896,65535]}}, +{"amount":0.1,"gain":1,"in":"#8080ffff","out":{"hex":"#7878ffff","u16":[30790,30790,65535,65535]}}, +{"amount":0.1,"gain":2,"in":"#8080ffff","out":{"hex":"#7878ffff","u16":[30790,30790,65535,65535]}}, +{"amount":0.25,"gain":0,"in":"#8080ffff","out":{"hex":"#7d7d7dff","u16":[32023,32023,32023,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#8080ffff","out":{"hex":"#7474cbff","u16":[29756,29756,52091,65535]}}, +{"amount":0.25,"gain":1,"in":"#8080ffff","out":{"hex":"#6a6affff","u16":[27260,27260,65535,65535]}}, +{"amount":0.25,"gain":2,"in":"#8080ffff","out":{"hex":"#6a6affff","u16":[27260,27260,65535,65535]}}, +{"amount":0.5,"gain":0,"in":"#8080ffff","out":{"hex":"#686868ff","u16":[26633,26633,26633,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#8080ffff","out":{"hex":"#5b5bc5ff","u16":[23465,23465,50717,65535]}}, +{"amount":0.5,"gain":1,"in":"#8080ffff","out":{"hex":"#4d4dffff","u16":[19674,19674,65535,65535]}}, +{"amount":0.5,"gain":2,"in":"#8080ffff","out":{"hex":"#4d4dffff","u16":[19674,19674,65535,65535]}}, +{"amount":0.75,"gain":0,"in":"#8080ffff","out":{"hex":"#4c4c4cff","u16":[19435,19435,19435,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#8080ffff","out":{"hex":"#3737bcff","u16":[14183,14183,48346,65535]}}, +{"amount":0.75,"gain":1,"in":"#8080ffff","out":{"hex":"#0000faff","u16":[0,0,64185,65535]}}, +{"amount":0.75,"gain":2,"in":"#8080ffff","out":{"hex":"#0000faff","u16":[0,0,64185,65535]}}, +{"amount":0.9,"gain":0,"in":"#8080ffff","out":{"hex":"#323232ff","u16":[12815,12815,12815,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#8080ffff","out":{"hex":"#24247cff","u16":[9351,9351,31877,65535]}}, +{"amount":0.9,"gain":1,"in":"#8080ffff","out":{"hex":"#0000a5ff","u16":[0,0,42320,65535]}}, +{"amount":0.9,"gain":2,"in":"#8080ffff","out":{"hex":"#0000a5ff","u16":[0,0,42320,65535]}}, +{"amount":1,"gain":0,"in":"#8080ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#8080ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#8080ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#8080ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#8080ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#8080ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#8080ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#8080ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#030201ff","out":{"hex":"#030303ff","u16":[684,684,684,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#030201ff","out":{"hex":"#030302ff","u16":[816,652,537,65535]}}, +{"amount":-0.5,"gain":1,"in":"#030201ff","out":{"hex":"#040201ff","u16":[927,618,309,65535]}}, +{"amount":-0.5,"gain":2,"in":"#030201ff","out":{"hex":"#040200ff","u16":[969,603,0,65535]}}, +{"amount":0,"gain":0,"in":"#030201ff","out":{"hex":"#020202ff","u16":[569,569,569,65535]}}, +{"amount":0,"gain":0.5,"in":"#030201ff","out":{"hex":"#030202ff","u16":[679,542,447,65535]}}, +{"amount":0,"gain":1,"in":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"gain":2,"in":"#030201ff","out":{"hex":"#030200ff","u16":[806,502,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#030201ff","out":{"hex":"#020202ff","u16":[542,542,542,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#030201ff","out":{"hex":"#030202ff","u16":[647,517,426,65535]}}, +{"amount":0.1,"gain":1,"in":"#030201ff","out":{"hex":"#030201ff","u16":[735,490,245,65535]}}, +{"amount":0.1,"gain":2,"in":"#030201ff","out":{"hex":"#030200ff","u16":[768,478,0,65535]}}, +{"amount":0.25,"gain":0,"in":"#030201ff","out":{"hex":"#020202ff","u16":[499,499,499,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#030201ff","out":{"hex":"#020202ff","u16":[596,476,392,65535]}}, +{"amount":0.25,"gain":1,"in":"#030201ff","out":{"hex":"#030201ff","u16":[676,451,225,65535]}}, +{"amount":0.25,"gain":2,"in":"#030201ff","out":{"hex":"#030200ff","u16":[707,440,0,65535]}}, +{"amount":0.5,"gain":0,"in":"#030201ff","out":{"hex":"#020202ff","u16":[415,415,415,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#030201ff","out":{"hex":"#020201ff","u16":[495,396,326,65535]}}, +{"amount":0.5,"gain":1,"in":"#030201ff","out":{"hex":"#020101ff","u16":[563,375,188,65535]}}, +{"amount":0.5,"gain":2,"in":"#030201ff","out":{"hex":"#020100ff","u16":[588,366,0,65535]}}, +{"amount":0.75,"gain":0,"in":"#030201ff","out":{"hex":"#010101ff","u16":[303,303,303,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#030201ff","out":{"hex":"#010101ff","u16":[362,289,238,65535]}}, +{"amount":0.75,"gain":1,"in":"#030201ff","out":{"hex":"#020101ff","u16":[411,274,137,65535]}}, +{"amount":0.75,"gain":2,"in":"#030201ff","out":{"hex":"#020100ff","u16":[429,267,0,65535]}}, +{"amount":0.9,"gain":0,"in":"#030201ff","out":{"hex":"#010101ff","u16":[200,200,200,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#030201ff","out":{"hex":"#010101ff","u16":[238,190,157,65535]}}, +{"amount":0.9,"gain":1,"in":"#030201ff","out":{"hex":"#010100ff","u16":[271,180,90,65535]}}, +{"amount":0.9,"gain":2,"in":"#030201ff","out":{"hex":"#010100ff","u16":[283,176,0,65535]}}, +{"amount":1,"gain":0,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":1,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":2,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":0,"in":"#fffefdff","out":{"hex":"#fefefeff","u16":[65314,65314,65314,65535]}}, +{"amount":0,"gain":0.5,"in":"#fffefdff","out":{"hex":"#fffefeff","u16":[65425,65296,65168,65535]}}, +{"amount":0,"gain":1,"in":"#fffefdff","out":{"hex":"#fffefdff","u16":[65535,65278,65021,65535]}}, +{"amount":0,"gain":2,"in":"#fffefdff","out":{"hex":"#fffefdff","u16":[65535,65278,65021,65535]}}, +{"amount":0.1,"gain":0,"in":"#fffefdff","out":{"hex":"#f2f2f2ff","u16":[62260,62260,62260,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#fffefdff","out":{"hex":"#f9f1e9ff","u16":[63923,61983,59976,65535]}}, +{"amount":0.1,"gain":1,"in":"#fffefdff","out":{"hex":"#fff0e0ff","u16":[65535,61704,57583,65535]}}, +{"amount":0.1,"gain":2,"in":"#fffefdff","out":{"hex":"#fff0e0ff","u16":[65535,61704,57583,65535]}}, +{"amount":0.25,"gain":0,"in":"#fffefdff","out":{"hex":"#dfdfdfff","u16":[57308,57308,57308,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#fffefdff","out":{"hex":"#f0dcc6ff","u16":[61587,56570,50981,65535]}}, +{"amount":0.25,"gain":1,"in":"#fffefdff","out":{"hex":"#ffd9a9ff","u16":[65535,55821,43533,65535]}}, +{"amount":0.25,"gain":2,"in":"#fffefdff","out":{"hex":"#ffd9a9ff","u16":[65535,55821,43533,65535]}}, +{"amount":0.5,"gain":0,"in":"#fffefdff","out":{"hex":"#b9b9b9ff","u16":[47662,47662,47662,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#fffefdff","out":{"hex":"#d7b487ff","u16":[55144,46297,34781,65535]}}, +{"amount":0.5,"gain":1,"in":"#fffefdff","out":{"hex":"#f0af00ff","u16":[61569,44881,0,65535]}}, +{"amount":0.5,"gain":2,"in":"#fffefdff","out":{"hex":"#f0af00ff","u16":[61569,44881,0,65535]}}, +{"amount":0.75,"gain":0,"in":"#fffefdff","out":{"hex":"#878787ff","u16":[34781,34781,34781,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#fffefdff","out":{"hex":"#9d8363ff","u16":[40241,33785,25381,65535]}}, +{"amount":0.75,"gain":1,"in":"#fffefdff","out":{"hex":"#af7f00ff","u16":[44930,32752,0,65535]}}, +{"amount":0.75,"gain":2,"in":"#fffefdff","out":{"hex":"#af7f00ff","u16":[44930,32752,0,65535]}}, +{"amount":0.9,"gain":0,"in":"#fffefdff","out":{"hex":"#595959ff","u16":[22933,22933,22933,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#fffefdff","out":{"hex":"#675741ff","u16":[26533,22276,16735,65535]}}, +{"amount":0.9,"gain":1,"in":"#fffefdff","out":{"hex":"#735400ff","u16":[29625,21595,0,65535]}}, +{"amount":0.9,"gain":2,"in":"#fffefdff","out":{"hex":"#735400ff","u16":[29625,21595,0,65535]}}, +{"amount":1,"gain":0,"in":"#fffefdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#fffefdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#fffefdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#fffefdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#fffefdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#fffefdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#fffefdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#fffefdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#7f8081ff","out":{"hex":"#9a9a9aff","u16":[39510,39510,39510,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#7f8081ff","out":{"hex":"#999a9aff","u16":[39378,39532,39687,65535]}}, +{"amount":-0.5,"gain":1,"in":"#7f8081ff","out":{"hex":"#999a9bff","u16":[39244,39553,39862,65535]}}, +{"amount":-0.5,"gain":2,"in":"#7f8081ff","out":{"hex":"#989a9cff","u16":[38976,39596,40211,65535]}}, +{"amount":0,"gain":0,"in":"#7f8081ff","out":{"hex":"#808080ff","u16":[32860,32860,32860,65535]}}, +{"amount":0,"gain":0.5,"in":"#7f8081ff","out":{"hex":"#7f8080ff","u16":[32750,32878,33007,65535]}}, +{"amount":0,"gain":1,"in":"#7f8081ff","out":{"hex":"#7f8081ff","u16":[32639,32896,33153,65535]}}, +{"amount":0,"gain":2,"in":"#7f8081ff","out":{"hex":"#7e8082ff","u16":[32416,32932,33443,65535]}}, +{"amount":0.1,"gain":0,"in":"#7f8081ff","out":{"hex":"#7a7a7aff","u16":[31324,31324,31324,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#7f8081ff","out":{"hex":"#797a7aff","u16":[31218,31341,31464,65535]}}, +{"amount":0.1,"gain":1,"in":"#7f8081ff","out":{"hex":"#797a7bff","u16":[31113,31358,31603,65535]}}, +{"amount":0.1,"gain":2,"in":"#7f8081ff","out":{"hex":"#787a7cff","u16":[30900,31392,31879,65535]}}, +{"amount":0.25,"gain":0,"in":"#7f8081ff","out":{"hex":"#707070ff","u16":[28832,28832,28832,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#7f8081ff","out":{"hex":"#707071ff","u16":[28736,28848,28961,65535]}}, +{"amount":0.25,"gain":1,"in":"#7f8081ff","out":{"hex":"#6f7071ff","u16":[28638,28864,29089,65535]}}, +{"amount":0.25,"gain":2,"in":"#7f8081ff","out":{"hex":"#6f7072ff","u16":[28443,28895,29343,65535]}}, +{"amount":0.5,"gain":0,"in":"#7f8081ff","out":{"hex":"#5d5d5dff","u16":[23979,23979,23979,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#7f8081ff","out":{"hex":"#5d5d5eff","u16":[23899,23992,24087,65535]}}, +{"amount":0.5,"gain":1,"in":"#7f8081ff","out":{"hex":"#5d5d5eff","u16":[23818,24006,24193,65535]}}, +{"amount":0.5,"gain":2,"in":"#7f8081ff","out":{"hex":"#5c5e5fff","u16":[23655,24032,24404,65535]}}, +{"amount":0.75,"gain":0,"in":"#7f8081ff","out":{"hex":"#444444ff","u16":[17499,17499,17499,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#7f8081ff","out":{"hex":"#444444ff","u16":[17440,17508,17577,65535]}}, +{"amount":0.75,"gain":1,"in":"#7f8081ff","out":{"hex":"#444445ff","u16":[17381,17518,17655,65535]}}, +{"amount":0.75,"gain":2,"in":"#7f8081ff","out":{"hex":"#434445ff","u16":[17262,17537,17809,65535]}}, +{"amount":0.9,"gain":0,"in":"#7f8081ff","out":{"hex":"#2d2d2dff","u16":[11538,11538,11538,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#7f8081ff","out":{"hex":"#2d2d2dff","u16":[11499,11544,11589,65535]}}, +{"amount":0.9,"gain":1,"in":"#7f8081ff","out":{"hex":"#2d2d2dff","u16":[11460,11550,11641,65535]}}, +{"amount":0.9,"gain":2,"in":"#7f8081ff","out":{"hex":"#2c2d2eff","u16":[11382,11563,11742,65535]}}, +{"amount":1,"gain":0,"in":"#7f8081ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#7f8081ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#7f8081ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#7f8081ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#7f8081ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#7f8081ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#7f8081ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#7f8081ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#010000ff","out":{"hex":"#010101ff","u16":[153,153,153,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#010000ff","out":{"hex":"#010000ff","u16":[246,112,112,65535]}}, +{"amount":-0.5,"gain":1,"in":"#010000ff","out":{"hex":"#010000ff","u16":[309,0,0,65535]}}, +{"amount":-0.5,"gain":2,"in":"#010000ff","out":{"hex":"#010000ff","u16":[309,0,0,65535]}}, +{"amount":0,"gain":0,"in":"#010000ff","out":{"hex":"#000000ff","u16":[127,127,127,65535]}}, +{"amount":0,"gain":0.5,"in":"#010000ff","out":{"hex":"#010000ff","u16":[205,93,93,65535]}}, +{"amount":0,"gain":1,"in":"#010000ff","out":{"hex":"#010000ff","u16":[257,0,0,65535]}}, +{"amount":0,"gain":2,"in":"#010000ff","out":{"hex":"#010000ff","u16":[257,0,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#010000ff","out":{"hex":"#000000ff","u16":[121,121,121,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#010000ff","out":{"hex":"#010000ff","u16":[195,88,88,65535]}}, +{"amount":0.1,"gain":1,"in":"#010000ff","out":{"hex":"#010000ff","u16":[245,0,0,65535]}}, +{"amount":0.1,"gain":2,"in":"#010000ff","out":{"hex":"#010000ff","u16":[245,0,0,65535]}}, +{"amount":0.25,"gain":0,"in":"#010000ff","out":{"hex":"#000000ff","u16":[112,112,112,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#010000ff","out":{"hex":"#010000ff","u16":[180,81,81,65535]}}, +{"amount":0.25,"gain":1,"in":"#010000ff","out":{"hex":"#010000ff","u16":[225,0,0,65535]}}, +{"amount":0.25,"gain":2,"in":"#010000ff","out":{"hex":"#010000ff","u16":[225,0,0,65535]}}, +{"amount":0.5,"gain":0,"in":"#010000ff","out":{"hex":"#000000ff","u16":[93,93,93,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#010000ff","out":{"hex":"#010000ff","u16":[149,68,68,65535]}}, +{"amount":0.5,"gain":1,"in":"#010000ff","out":{"hex":"#010000ff","u16":[188,0,0,65535]}}, +{"amount":0.5,"gain":2,"in":"#010000ff","out":{"hex":"#010000ff","u16":[188,0,0,65535]}}, +{"amount":0.75,"gain":0,"in":"#010000ff","out":{"hex":"#000000ff","u16":[68,68,68,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#010000ff","out":{"hex":"#000000ff","u16":[109,49,49,65535]}}, +{"amount":0.75,"gain":1,"in":"#010000ff","out":{"hex":"#010000ff","u16":[137,0,0,65535]}}, +{"amount":0.75,"gain":2,"in":"#010000ff","out":{"hex":"#010000ff","u16":[137,0,0,65535]}}, +{"amount":0.9,"gain":0,"in":"#010000ff","out":{"hex":"#000000ff","u16":[45,45,45,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#010000ff","out":{"hex":"#000000ff","u16":[72,33,33,65535]}}, +{"amount":0.9,"gain":1,"in":"#010000ff","out":{"hex":"#000000ff","u16":[90,0,0,65535]}}, +{"amount":0.9,"gain":2,"in":"#010000ff","out":{"hex":"#000000ff","u16":[90,0,0,65535]}}, +{"amount":1,"gain":0,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#000001ff","out":{"hex":"#000000ff","u16":[94,94,94,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#000001ff","out":{"hex":"#000001ff","u16":[68,68,233,65535]}}, +{"amount":-0.5,"gain":1,"in":"#000001ff","out":{"hex":"#000001ff","u16":[0,0,309,65535]}}, +{"amount":-0.5,"gain":2,"in":"#000001ff","out":{"hex":"#000001ff","u16":[0,0,309,65535]}}, +{"amount":0,"gain":0,"in":"#000001ff","out":{"hex":"#000000ff","u16":[78,78,78,65535]}}, +{"amount":0,"gain":0.5,"in":"#000001ff","out":{"hex":"#000001ff","u16":[57,57,194,65535]}}, +{"amount":0,"gain":1,"in":"#000001ff","out":{"hex":"#000001ff","u16":[0,0,257,65535]}}, +{"amount":0,"gain":2,"in":"#000001ff","out":{"hex":"#000001ff","u16":[0,0,257,65535]}}, +{"amount":0.1,"gain":0,"in":"#000001ff","out":{"hex":"#000000ff","u16":[74,74,74,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#000001ff","out":{"hex":"#000001ff","u16":[54,54,185,65535]}}, +{"amount":0.1,"gain":1,"in":"#000001ff","out":{"hex":"#000001ff","u16":[0,0,245,65535]}}, +{"amount":0.1,"gain":2,"in":"#000001ff","out":{"hex":"#000001ff","u16":[0,0,245,65535]}}, +{"amount":0.25,"gain":0,"in":"#000001ff","out":{"hex":"#000000ff","u16":[68,68,68,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#000001ff","out":{"hex":"#000001ff","u16":[50,50,170,65535]}}, +{"amount":0.25,"gain":1,"in":"#000001ff","out":{"hex":"#000001ff","u16":[0,0,225,65535]}}, +{"amount":0.25,"gain":2,"in":"#000001ff","out":{"hex":"#000001ff","u16":[0,0,225,65535]}}, +{"amount":0.5,"gain":0,"in":"#000001ff","out":{"hex":"#000000ff","u16":[57,57,57,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#000001ff","out":{"hex":"#000001ff","u16":[41,41,141,65535]}}, +{"amount":0.5,"gain":1,"in":"#000001ff","out":{"hex":"#000001ff","u16":[0,0,188,65535]}}, +{"amount":0.5,"gain":2,"in":"#000001ff","out":{"hex":"#000001ff","u16":[0,0,188,65535]}}, +{"amount":0.75,"gain":0,"in":"#000001ff","out":{"hex":"#000000ff","u16":[41,41,41,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#000001ff","out":{"hex":"#000000ff","u16":[30,30,103,65535]}}, +{"amount":0.75,"gain":1,"in":"#000001ff","out":{"hex":"#000001ff","u16":[0,0,137,65535]}}, +{"amount":0.75,"gain":2,"in":"#000001ff","out":{"hex":"#000001ff","u16":[0,0,137,65535]}}, +{"amount":0.9,"gain":0,"in":"#000001ff","out":{"hex":"#000000ff","u16":[27,27,27,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#000001ff","out":{"hex":"#000000ff","u16":[20,20,68,65535]}}, +{"amount":0.9,"gain":1,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,90,65535]}}, +{"amount":0.9,"gain":2,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,90,65535]}}, +{"amount":1,"gain":0,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":1,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":2,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":0,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65462,65462,65462,65535]}}, +{"amount":0,"gain":0.5,"in":"#fefffeff","out":{"hex":"#fefffeff","u16":[65370,65498,65370,65535]}}, +{"amount":0,"gain":1,"in":"#fefffeff","out":{"hex":"#fefffeff","u16":[65278,65535,65278,65535]}}, +{"amount":0,"gain":2,"in":"#fefffeff","out":{"hex":"#fefffeff","u16":[65278,65535,65278,65535]}}, +{"amount":0.1,"gain":0,"in":"#fefffeff","out":{"hex":"#f3f3f3ff","u16":[62401,62401,62401,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#fefffeff","out":{"hex":"#e2f9e2ff","u16":[58176,63991,58176,65535]}}, +{"amount":0.1,"gain":1,"in":"#fefffeff","out":{"hex":"#d0ffd0ff","u16":[53545,65535,53545,65535]}}, +{"amount":0.1,"gain":2,"in":"#fefffeff","out":{"hex":"#d0ffd0ff","u16":[53545,65535,53545,65535]}}, +{"amount":0.25,"gain":0,"in":"#fefffeff","out":{"hex":"#dfdfdfff","u16":[57438,57438,57438,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#fefffeff","out":{"hex":"#aef0aeff","u16":[44747,61646,44747,65535]}}, +{"amount":0.25,"gain":1,"in":"#fefffeff","out":{"hex":"#60ff60ff","u16":[24591,65535,24591,65535]}}, +{"amount":0.25,"gain":2,"in":"#fefffeff","out":{"hex":"#60ff60ff","u16":[24591,65535,24591,65535]}}, +{"amount":0.5,"gain":0,"in":"#fefffeff","out":{"hex":"#bababaff","u16":[47770,47770,47770,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#fefffeff","out":{"hex":"#88ca88ff","u16":[34860,51880,34860,65535]}}, +{"amount":0.5,"gain":1,"in":"#fefffeff","out":{"hex":"#00d800ff","u16":[0,55632,0,65535]}}, +{"amount":0.5,"gain":2,"in":"#fefffeff","out":{"hex":"#00d800ff","u16":[0,55632,0,65535]}}, +{"amount":0.75,"gain":0,"in":"#fefffeff","out":{"hex":"#888888ff","u16":[34860,34860,34860,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#fefffeff","out":{"hex":"#639363ff","u16":[25439,37859,25439,65535]}}, +{"amount":0.75,"gain":1,"in":"#fefffeff","out":{"hex":"#009e00ff","u16":[0,40597,0,65535]}}, +{"amount":0.75,"gain":2,"in":"#fefffeff","out":{"hex":"#009e00ff","u16":[0,40597,0,65535]}}, +{"amount":0.9,"gain":0,"in":"#fefffeff","out":{"hex":"#595959ff","u16":[22985,22985,22985,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#fefffeff","out":{"hex":"#416141ff","u16":[16773,24962,16773,65535]}}, +{"amount":0.9,"gain":1,"in":"#fefffeff","out":{"hex":"#006800ff","u16":[0,26768,0,65535]}}, +{"amount":0.9,"gain":2,"in":"#fefffeff","out":{"hex":"#006800ff","u16":[0,26768,0,65535]}}, +{"amount":1,"gain":0,"in":"#fefffeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#fefffeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#fefffeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#fefffeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#fefffeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#fefffeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#fefffeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#fefffeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#3daee9ff","out":{"hex":"#c5c5c5ff","u16":[50566,50566,50566,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#3daee9ff","out":{"hex":"#acc8e1ff","u16":[44188,51518,57774,65535]}}, +{"amount":-0.5,"gain":1,"in":"#3daee9ff","out":{"hex":"#8eccf9ff","u16":[36449,52450,64037,65535]}}, +{"amount":-0.5,"gain":2,"in":"#3daee9ff","out":{"hex":"#85cdffff","u16":[34109,52687,65535,65535]}}, +{"amount":0,"gain":0,"in":"#3daee9ff","out":{"hex":"#a4a4a4ff","u16":[42055,42055,42055,65535]}}, +{"amount":0,"gain":0.5,"in":"#3daee9ff","out":{"hex":"#7da9caff","u16":[32234,43411,51893,65535]}}, +{"amount":0,"gain":1,"in":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"gain":2,"in":"#3daee9ff","out":{"hex":"#00aff0ff","u16":[0,45047,61740,65535]}}, +{"amount":0.1,"gain":0,"in":"#3daee9ff","out":{"hex":"#9c9c9cff","u16":[40088,40088,40088,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#3daee9ff","out":{"hex":"#78a1c0ff","u16":[30726,41381,49466,65535]}}, +{"amount":0.1,"gain":1,"in":"#3daee9ff","out":{"hex":"#3aa6deff","u16":[14944,42627,57081,65535]}}, +{"amount":0.1,"gain":2,"in":"#3daee9ff","out":{"hex":"#00a7e5ff","u16":[0,42941,58853,65535]}}, +{"amount":0.25,"gain":0,"in":"#3daee9ff","out":{"hex":"#909090ff","u16":[36900,36900,36900,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#3daee9ff","out":{"hex":"#6e94b1ff","u16":[28282,38090,45532,65535]}}, +{"amount":0.25,"gain":1,"in":"#3daee9ff","out":{"hex":"#3699ccff","u16":[13755,39237,52541,65535]}}, +{"amount":0.25,"gain":2,"in":"#3daee9ff","out":{"hex":"#009ad3ff","u16":[0,39526,54172,65535]}}, +{"amount":0.5,"gain":0,"in":"#3daee9ff","out":{"hex":"#777777ff","u16":[30689,30689,30689,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#3daee9ff","out":{"hex":"#5c7b93ff","u16":[23522,31679,37868,65535]}}, +{"amount":0.5,"gain":1,"in":"#3daee9ff","out":{"hex":"#2d7faaff","u16":[11440,32633,43698,65535]}}, +{"amount":0.5,"gain":2,"in":"#3daee9ff","out":{"hex":"#0080afff","u16":[0,32873,45054,65535]}}, +{"amount":0.75,"gain":0,"in":"#3daee9ff","out":{"hex":"#575757ff","u16":[22395,22395,22395,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#3daee9ff","out":{"hex":"#435a6cff","u16":[17165,23117,27634,65535]}}, +{"amount":0.75,"gain":1,"in":"#3daee9ff","out":{"hex":"#205d7cff","u16":[8348,23813,31888,65535]}}, +{"amount":0.75,"gain":2,"in":"#3daee9ff","out":{"hex":"#005d80ff","u16":[0,23989,32878,65535]}}, +{"amount":0.9,"gain":0,"in":"#3daee9ff","out":{"hex":"#393939ff","u16":[14766,14766,14766,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#3daee9ff","out":{"hex":"#2c3b47ff","u16":[11318,15242,18220,65535]}}, +{"amount":0.9,"gain":1,"in":"#3daee9ff","out":{"hex":"#153d52ff","u16":[5504,15701,21025,65535]}}, +{"amount":0.9,"gain":2,"in":"#3daee9ff","out":{"hex":"#003e54ff","u16":[0,15817,21678,65535]}}, +{"amount":1,"gain":0,"in":"#3daee9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#3daee9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#3daee9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#3daee9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#3daee9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#3daee9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#3daee9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#3daee9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#232629ff","out":{"hex":"#2d2d2dff","u16":[11624,11624,11624,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#232629ff","out":{"hex":"#2c2d2fff","u16":[11228,11683,12160,65535]}}, +{"amount":-0.5,"gain":1,"in":"#232629ff","out":{"hex":"#2a2e31ff","u16":[10815,11742,12669,65535]}}, +{"amount":-0.5,"gain":2,"in":"#232629ff","out":{"hex":"#272e35ff","u16":[9927,11859,13620,65535]}}, +{"amount":0,"gain":0,"in":"#232629ff","out":{"hex":"#262626ff","u16":[9668,9668,9668,65535]}}, +{"amount":0,"gain":0.5,"in":"#232629ff","out":{"hex":"#242627ff","u16":[9339,9717,10113,65535]}}, +{"amount":0,"gain":1,"in":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"gain":2,"in":"#232629ff","out":{"hex":"#20262cff","u16":[8256,9863,11328,65535]}}, +{"amount":0.1,"gain":0,"in":"#232629ff","out":{"hex":"#242424ff","u16":[9215,9215,9215,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#232629ff","out":{"hex":"#232426ff","u16":[8902,9263,9641,65535]}}, +{"amount":0.1,"gain":1,"in":"#232629ff","out":{"hex":"#212427ff","u16":[8574,9309,10044,65535]}}, +{"amount":0.1,"gain":2,"in":"#232629ff","out":{"hex":"#1f252aff","u16":[7870,9402,10798,65535]}}, +{"amount":0.25,"gain":0,"in":"#232629ff","out":{"hex":"#212121ff","u16":[8483,8483,8483,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#232629ff","out":{"hex":"#202123ff","u16":[8194,8526,8874,65535]}}, +{"amount":0.25,"gain":1,"in":"#232629ff","out":{"hex":"#1f2124ff","u16":[7892,8569,9245,65535]}}, +{"amount":0.25,"gain":2,"in":"#232629ff","out":{"hex":"#1c2227ff","u16":[7244,8654,9939,65535]}}, +{"amount":0.5,"gain":0,"in":"#232629ff","out":{"hex":"#1b1b1bff","u16":[7055,7055,7055,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#232629ff","out":{"hex":"#1b1c1dff","u16":[6815,7091,7380,65535]}}, +{"amount":0.5,"gain":1,"in":"#232629ff","out":{"hex":"#1a1c1eff","u16":[6564,7127,7689,65535]}}, +{"amount":0.5,"gain":2,"in":"#232629ff","out":{"hex":"#171c20ff","u16":[6025,7198,8266,65535]}}, +{"amount":0.75,"gain":0,"in":"#232629ff","out":{"hex":"#141414ff","u16":[5148,5148,5148,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#232629ff","out":{"hex":"#131415ff","u16":[4973,5174,5386,65535]}}, +{"amount":0.75,"gain":1,"in":"#232629ff","out":{"hex":"#131416ff","u16":[4790,5201,5611,65535]}}, +{"amount":0.75,"gain":2,"in":"#232629ff","out":{"hex":"#111417ff","u16":[4396,5252,6032,65535]}}, +{"amount":0.9,"gain":0,"in":"#232629ff","out":{"hex":"#0d0d0dff","u16":[3394,3394,3394,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#232629ff","out":{"hex":"#0d0d0eff","u16":[3279,3412,3551,65535]}}, +{"amount":0.9,"gain":1,"in":"#232629ff","out":{"hex":"#0c0d0eff","u16":[3158,3429,3700,65535]}}, +{"amount":0.9,"gain":2,"in":"#232629ff","out":{"hex":"#0b0d0fff","u16":[2899,3463,3977,65535]}}, +{"amount":1,"gain":0,"in":"#232629ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#232629ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#232629ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#232629ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#232629ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#232629ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#232629ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#232629ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":1,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":2,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":0,"in":"#eff0f1ff","out":{"hex":"#f0f0f0ff","u16":[61644,61644,61644,65535]}}, +{"amount":0,"gain":0.5,"in":"#eff0f1ff","out":{"hex":"#eff0f0ff","u16":[61534,61662,61791,65535]}}, +{"amount":0,"gain":1,"in":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"gain":2,"in":"#eff0f1ff","out":{"hex":"#eef0f2ff","u16":[61201,61716,62228,65535]}}, +{"amount":0.1,"gain":0,"in":"#eff0f1ff","out":{"hex":"#e5e5e5ff","u16":[58761,58761,58761,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#eff0f1ff","out":{"hex":"#e4e5e6ff","u16":[58563,58794,59024,65535]}}, +{"amount":0.1,"gain":1,"in":"#eff0f1ff","out":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]}}, +{"amount":0.1,"gain":2,"in":"#eff0f1ff","out":{"hex":"#e2e5e9ff","u16":[57963,58890,59804,65535]}}, +{"amount":0.25,"gain":0,"in":"#eff0f1ff","out":{"hex":"#d2d2d2ff","u16":[54088,54088,54088,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#eff0f1ff","out":{"hex":"#d1d3d4ff","u16":[53734,54145,54555,65535]}}, +{"amount":0.25,"gain":1,"in":"#eff0f1ff","out":{"hex":"#d0d3d6ff","u16":[53377,54203,55018,65535]}}, +{"amount":0.25,"gain":2,"in":"#eff0f1ff","out":{"hex":"#cdd3daff","u16":[52654,54317,55930,65535]}}, +{"amount":0.5,"gain":0,"in":"#eff0f1ff","out":{"hex":"#afafafff","u16":[44984,44984,44984,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#eff0f1ff","out":{"hex":"#acafb3ff","u16":[44258,45101,45930,65535]}}, +{"amount":0.5,"gain":1,"in":"#eff0f1ff","out":{"hex":"#a9b0b6ff","u16":[43517,45218,46853,65535]}}, +{"amount":0.5,"gain":2,"in":"#eff0f1ff","out":{"hex":"#a3b1bdff","u16":[41987,45450,48637,65535]}}, +{"amount":0.75,"gain":0,"in":"#eff0f1ff","out":{"hex":"#808080ff","u16":[32827,32827,32827,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#eff0f1ff","out":{"hex":"#7e8083ff","u16":[32279,32915,33540,65535]}}, +{"amount":0.75,"gain":1,"in":"#eff0f1ff","out":{"hex":"#7b8085ff","u16":[31719,33003,34235,65535]}}, +{"amount":0.75,"gain":2,"in":"#eff0f1ff","out":{"hex":"#77818aff","u16":[30563,33178,35578,65535]}}, +{"amount":0.9,"gain":0,"in":"#eff0f1ff","out":{"hex":"#545454ff","u16":[21644,21644,21644,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#eff0f1ff","out":{"hex":"#535456ff","u16":[21283,21703,22115,65535]}}, +{"amount":0.9,"gain":1,"in":"#eff0f1ff","out":{"hex":"#515558ff","u16":[20914,21761,22573,65535]}}, +{"amount":0.9,"gain":2,"in":"#eff0f1ff","out":{"hex":"#4e555bff","u16":[20152,21876,23458,65535]}}, +{"amount":1,"gain":0,"in":"#eff0f1ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#eff0f1ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#eff0f1ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#eff0f1ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#eff0f1ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#eff0f1ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#eff0f1ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#eff0f1ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":1,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":2,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":0,"in":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"gain":0.5,"in":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"gain":1,"in":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"gain":2,"in":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"gain":0,"in":"#fcfcfcff","out":{"hex":"#f0f0f0ff","u16":[61735,61735,61735,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#fcfcfcff","out":{"hex":"#f0f0f0ff","u16":[61735,61735,61735,65535]}}, +{"amount":0.1,"gain":1,"in":"#fcfcfcff","out":{"hex":"#f0f0f0ff","u16":[61735,61735,61735,65535]}}, +{"amount":0.1,"gain":2,"in":"#fcfcfcff","out":{"hex":"#f0f0f0ff","u16":[61735,61735,61735,65535]}}, +{"amount":0.25,"gain":0,"in":"#fcfcfcff","out":{"hex":"#ddddddff","u16":[56826,56826,56826,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#fcfcfcff","out":{"hex":"#ddddddff","u16":[56826,56826,56826,65535]}}, +{"amount":0.25,"gain":1,"in":"#fcfcfcff","out":{"hex":"#ddddddff","u16":[56826,56826,56826,65535]}}, +{"amount":0.25,"gain":2,"in":"#fcfcfcff","out":{"hex":"#ddddddff","u16":[56826,56826,56826,65535]}}, +{"amount":0.5,"gain":0,"in":"#fcfcfcff","out":{"hex":"#b8b8b8ff","u16":[47261,47261,47261,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#fcfcfcff","out":{"hex":"#b8b8b8ff","u16":[47261,47261,47261,65535]}}, +{"amount":0.5,"gain":1,"in":"#fcfcfcff","out":{"hex":"#b8b8b8ff","u16":[47261,47261,47261,65535]}}, +{"amount":0.5,"gain":2,"in":"#fcfcfcff","out":{"hex":"#b8b8b8ff","u16":[47261,47261,47261,65535]}}, +{"amount":0.75,"gain":0,"in":"#fcfcfcff","out":{"hex":"#868686ff","u16":[34488,34488,34488,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#fcfcfcff","out":{"hex":"#868686ff","u16":[34488,34488,34488,65535]}}, +{"amount":0.75,"gain":1,"in":"#fcfcfcff","out":{"hex":"#868686ff","u16":[34488,34488,34488,65535]}}, +{"amount":0.75,"gain":2,"in":"#fcfcfcff","out":{"hex":"#868686ff","u16":[34488,34488,34488,65535]}}, +{"amount":0.9,"gain":0,"in":"#fcfcfcff","out":{"hex":"#585858ff","u16":[22740,22740,22740,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#fcfcfcff","out":{"hex":"#585858ff","u16":[22740,22740,22740,65535]}}, +{"amount":0.9,"gain":1,"in":"#fcfcfcff","out":{"hex":"#585858ff","u16":[22740,22740,22740,65535]}}, +{"amount":0.9,"gain":2,"in":"#fcfcfcff","out":{"hex":"#585858ff","u16":[22740,22740,22740,65535]}}, +{"amount":1,"gain":0,"in":"#fcfcfcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#fcfcfcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#fcfcfcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#fcfcfcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#fcfcfcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#fcfcfcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#fcfcfcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#fcfcfcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#31363bff","out":{"hex":"#404040ff","u16":[16493,16493,16493,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#31363bff","out":{"hex":"#3e4144ff","u16":[15834,16590,17388,65535]}}, +{"amount":-0.5,"gain":1,"in":"#31363bff","out":{"hex":"#3b4147ff","u16":[15142,16687,18232,65535]}}, +{"amount":-0.5,"gain":2,"in":"#31363bff","out":{"hex":"#35424dff","u16":[13627,16878,19791,65535]}}, +{"amount":0,"gain":0,"in":"#31363bff","out":{"hex":"#353535ff","u16":[13717,13717,13717,65535]}}, +{"amount":0,"gain":0.5,"in":"#31363bff","out":{"hex":"#333638ff","u16":[13169,13798,14462,65535]}}, +{"amount":0,"gain":1,"in":"#31363bff","out":{"hex":"#31363bff","u16":[12593,13878,15163,65535]}}, +{"amount":0,"gain":2,"in":"#31363bff","out":{"hex":"#2c3740ff","u16":[11334,14037,16460,65535]}}, +{"amount":0.1,"gain":0,"in":"#31363bff","out":{"hex":"#333333ff","u16":[13075,13075,13075,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#31363bff","out":{"hex":"#313336ff","u16":[12553,13152,13785,65535]}}, +{"amount":0.1,"gain":1,"in":"#31363bff","out":{"hex":"#2f3338ff","u16":[12004,13229,14454,65535]}}, +{"amount":0.1,"gain":2,"in":"#31363bff","out":{"hex":"#2a343dff","u16":[10804,13381,15690,65535]}}, +{"amount":0.25,"gain":0,"in":"#31363bff","out":{"hex":"#2f2f2fff","u16":[12035,12035,12035,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#31363bff","out":{"hex":"#2d2f31ff","u16":[11555,12106,12689,65535]}}, +{"amount":0.25,"gain":1,"in":"#31363bff","out":{"hex":"#2b2f34ff","u16":[11049,12177,13304,65535]}}, +{"amount":0.25,"gain":2,"in":"#31363bff","out":{"hex":"#273038ff","u16":[9944,12316,14442,65535]}}, +{"amount":0.5,"gain":0,"in":"#31363bff","out":{"hex":"#272727ff","u16":[10010,10010,10010,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#31363bff","out":{"hex":"#252729ff","u16":[9610,10069,10553,65535]}}, +{"amount":0.5,"gain":1,"in":"#31363bff","out":{"hex":"#24272bff","u16":[9190,10127,11065,65535]}}, +{"amount":0.5,"gain":2,"in":"#31363bff","out":{"hex":"#20282fff","u16":[8271,10243,12012,65535]}}, +{"amount":0.75,"gain":0,"in":"#31363bff","out":{"hex":"#1c1c1cff","u16":[7304,7304,7304,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#31363bff","out":{"hex":"#1b1d1eff","u16":[7013,7348,7701,65535]}}, +{"amount":0.75,"gain":1,"in":"#31363bff","out":{"hex":"#1a1d1fff","u16":[6706,7390,8075,65535]}}, +{"amount":0.75,"gain":2,"in":"#31363bff","out":{"hex":"#171d22ff","u16":[6035,7475,8765,65535]}}, +{"amount":0.9,"gain":0,"in":"#31363bff","out":{"hex":"#131313ff","u16":[4816,4816,4816,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#31363bff","out":{"hex":"#121314ff","u16":[4624,4845,5078,65535]}}, +{"amount":0.9,"gain":1,"in":"#31363bff","out":{"hex":"#111315ff","u16":[4422,4873,5324,65535]}}, +{"amount":0.9,"gain":2,"in":"#31363bff","out":{"hex":"#0f1316ff","u16":[3979,4929,5779,65535]}}, +{"amount":1,"gain":0,"in":"#31363bff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#31363bff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#31363bff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#31363bff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#31363bff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#31363bff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#31363bff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#31363bff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#1b1e20ff","out":{"hex":"#242424ff","u16":[9130,9130,9130,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#1b1e20ff","out":{"hex":"#222425ff","u16":[8747,9201,9518,65535]}}, +{"amount":-0.5,"gain":1,"in":"#1b1e20ff","out":{"hex":"#202426ff","u16":[8343,9270,9888,65535]}}, +{"amount":-0.5,"gain":2,"in":"#1b1e20ff","out":{"hex":"#1d2529ff","u16":[7455,9408,10583,65535]}}, +{"amount":0,"gain":0,"in":"#1b1e20ff","out":{"hex":"#1e1e1eff","u16":[7593,7593,7593,65535]}}, +{"amount":0,"gain":0.5,"in":"#1b1e20ff","out":{"hex":"#1c1e1fff","u16":[7275,7652,7916,65535]}}, +{"amount":0,"gain":1,"in":"#1b1e20ff","out":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]}}, +{"amount":0,"gain":2,"in":"#1b1e20ff","out":{"hex":"#181e22ff","u16":[6201,7825,8801,65535]}}, +{"amount":0.1,"gain":0,"in":"#1b1e20ff","out":{"hex":"#1c1c1cff","u16":[7238,7238,7238,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#1b1e20ff","out":{"hex":"#1b1c1dff","u16":[6935,7294,7546,65535]}}, +{"amount":0.1,"gain":1,"in":"#1b1e20ff","out":{"hex":"#1a1d1fff","u16":[6615,7349,7839,65535]}}, +{"amount":0.1,"gain":2,"in":"#1b1e20ff","out":{"hex":"#171d21ff","u16":[5911,7459,8390,65535]}}, +{"amount":0.25,"gain":0,"in":"#1b1e20ff","out":{"hex":"#1a1a1aff","u16":[6663,6663,6663,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#1b1e20ff","out":{"hex":"#191a1bff","u16":[6383,6714,6946,65535]}}, +{"amount":0.25,"gain":1,"in":"#1b1e20ff","out":{"hex":"#181a1cff","u16":[6088,6765,7216,65535]}}, +{"amount":0.25,"gain":2,"in":"#1b1e20ff","out":{"hex":"#151b1eff","u16":[5440,6865,7722,65535]}}, +{"amount":0.5,"gain":0,"in":"#1b1e20ff","out":{"hex":"#161616ff","u16":[5541,5541,5541,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#1b1e20ff","out":{"hex":"#151616ff","u16":[5309,5584,5777,65535]}}, +{"amount":0.5,"gain":1,"in":"#1b1e20ff","out":{"hex":"#141617ff","u16":[5064,5626,6001,65535]}}, +{"amount":0.5,"gain":2,"in":"#1b1e20ff","out":{"hex":"#121619ff","u16":[4525,5710,6423,65535]}}, +{"amount":0.75,"gain":0,"in":"#1b1e20ff","out":{"hex":"#101010ff","u16":[4044,4044,4044,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#1b1e20ff","out":{"hex":"#0f1010ff","u16":[3874,4075,4216,65535]}}, +{"amount":0.75,"gain":1,"in":"#1b1e20ff","out":{"hex":"#0e1011ff","u16":[3695,4106,4379,65535]}}, +{"amount":0.75,"gain":2,"in":"#1b1e20ff","out":{"hex":"#0d1012ff","u16":[3302,4167,4687,65535]}}, +{"amount":0.9,"gain":0,"in":"#1b1e20ff","out":{"hex":"#0a0a0aff","u16":[2666,2666,2666,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#1b1e20ff","out":{"hex":"#0a0a0bff","u16":[2554,2687,2780,65535]}}, +{"amount":0.9,"gain":1,"in":"#1b1e20ff","out":{"hex":"#090b0bff","u16":[2436,2707,2888,65535]}}, +{"amount":0.9,"gain":2,"in":"#1b1e20ff","out":{"hex":"#080b0cff","u16":[2177,2747,3090,65535]}}, +{"amount":1,"gain":0,"in":"#1b1e20ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#1b1e20ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#1b1e20ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#1b1e20ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#1b1e20ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#1b1e20ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#1b1e20ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#1b1e20ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#da4453ff","out":{"hex":"#929292ff","u16":[37545,37545,37545,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#da4453ff","out":{"hex":"#c28185ff","u16":[49871,33164,34153,65535]}}, +{"amount":-0.5,"gain":1,"in":"#da4453ff","out":{"hex":"#e76d76ff","u16":[59314,27946,30300,65535]}}, +{"amount":-0.5,"gain":2,"in":"#da4453ff","out":{"hex":"#ff5969ff","u16":[65535,22915,26857,65535]}}, +{"amount":0,"gain":0,"in":"#da4453ff","out":{"hex":"#797979ff","u16":[31225,31225,31225,65535]}}, +{"amount":0,"gain":0.5,"in":"#da4453ff","out":{"hex":"#b26368ff","u16":[45680,25482,26830,65535]}}, +{"amount":0,"gain":1,"in":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"gain":2,"in":"#da4453ff","out":{"hex":"#f4003cff","u16":[62676,0,15457,65535]}}, +{"amount":0.1,"gain":0,"in":"#da4453ff","out":{"hex":"#747474ff","u16":[29765,29765,29765,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#da4453ff","out":{"hex":"#a95f64ff","u16":[43544,24291,25575,65535]}}, +{"amount":0.1,"gain":1,"in":"#da4453ff","out":{"hex":"#d0414fff","u16":[53406,16659,20334,65535]}}, +{"amount":0.1,"gain":2,"in":"#da4453ff","out":{"hex":"#e80039ff","u16":[59746,0,14734,65535]}}, +{"amount":0.25,"gain":0,"in":"#da4453ff","out":{"hex":"#6b6b6bff","u16":[27398,27398,27398,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#da4453ff","out":{"hex":"#9c575cff","u16":[40081,22359,23541,65535]}}, +{"amount":0.25,"gain":1,"in":"#da4453ff","out":{"hex":"#bf3c49ff","u16":[49159,15334,18716,65535]}}, +{"amount":0.25,"gain":2,"in":"#da4453ff","out":{"hex":"#d60035ff","u16":[54994,0,13562,65535]}}, +{"amount":0.5,"gain":0,"in":"#da4453ff","out":{"hex":"#595959ff","u16":[22786,22786,22786,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#da4453ff","out":{"hex":"#82484cff","u16":[33335,18596,19579,65535]}}, +{"amount":0.5,"gain":1,"in":"#da4453ff","out":{"hex":"#9f323dff","u16":[40884,12753,15566,65535]}}, +{"amount":0.5,"gain":2,"in":"#da4453ff","out":{"hex":"#b2002cff","u16":[45738,0,11280,65535]}}, +{"amount":0.75,"gain":0,"in":"#da4453ff","out":{"hex":"#414141ff","u16":[16628,16628,16628,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#da4453ff","out":{"hex":"#5f3538ff","u16":[24326,13570,14287,65535]}}, +{"amount":0.75,"gain":1,"in":"#da4453ff","out":{"hex":"#74242cff","u16":[29835,9306,11359,65535]}}, +{"amount":0.75,"gain":2,"in":"#da4453ff","out":{"hex":"#820020ff","u16":[33376,0,8231,65535]}}, +{"amount":0.9,"gain":0,"in":"#da4453ff","out":{"hex":"#2b2b2bff","u16":[10964,10964,10964,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#da4453ff","out":{"hex":"#3e2325ff","u16":[16039,8947,9420,65535]}}, +{"amount":0.9,"gain":1,"in":"#da4453ff","out":{"hex":"#4d181dff","u16":[19672,6136,7490,65535]}}, +{"amount":0.9,"gain":2,"in":"#da4453ff","out":{"hex":"#560015ff","u16":[22007,0,5427,65535]}}, +{"amount":1,"gain":0,"in":"#da4453ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#da4453ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#da4453ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#da4453ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#da4453ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#da4453ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#da4453ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#da4453ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#27ae60ff","out":{"hex":"#b7b7b7ff","u16":[46966,46966,46966,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#27ae60ff","out":{"hex":"#88c59aff","u16":[35044,50505,39466,65535]}}, +{"amount":-0.5,"gain":1,"in":"#27ae60ff","out":{"hex":"#2fd173ff","u16":[12051,53768,29665,65535]}}, +{"amount":-0.5,"gain":2,"in":"#27ae60ff","out":{"hex":"#00d36eff","u16":[0,54099,28388,65535]}}, +{"amount":0,"gain":0,"in":"#27ae60ff","out":{"hex":"#989898ff","u16":[39061,39061,39061,65535]}}, +{"amount":0,"gain":0.5,"in":"#27ae60ff","out":{"hex":"#71a380ff","u16":[29146,42004,32823,65535]}}, +{"amount":0,"gain":1,"in":"#27ae60ff","out":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]}}, +{"amount":0,"gain":2,"in":"#27ae60ff","out":{"hex":"#00af5cff","u16":[0,44993,23610,65535]}}, +{"amount":0.1,"gain":0,"in":"#27ae60ff","out":{"hex":"#919191ff","u16":[37234,37234,37234,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#27ae60ff","out":{"hex":"#6c9c7aff","u16":[27783,40040,31288,65535]}}, +{"amount":0.1,"gain":1,"in":"#27ae60ff","out":{"hex":"#25a65cff","u16":[9554,42627,23518,65535]}}, +{"amount":0.1,"gain":2,"in":"#27ae60ff","out":{"hex":"#00a758ff","u16":[0,42889,22505,65535]}}, +{"amount":0.25,"gain":0,"in":"#27ae60ff","out":{"hex":"#858585ff","u16":[34273,34273,34273,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#27ae60ff","out":{"hex":"#648f70ff","u16":[25573,36855,28800,65535]}}, +{"amount":0.25,"gain":1,"in":"#27ae60ff","out":{"hex":"#229954ff","u16":[8794,39237,21648,65535]}}, +{"amount":0.25,"gain":2,"in":"#27ae60ff","out":{"hex":"#009a51ff","u16":[0,39478,20716,65535]}}, +{"amount":0.5,"gain":0,"in":"#27ae60ff","out":{"hex":"#6f6f6fff","u16":[28504,28504,28504,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#27ae60ff","out":{"hex":"#53775dff","u16":[21269,30652,23952,65535]}}, +{"amount":0.5,"gain":1,"in":"#27ae60ff","out":{"hex":"#1c7f46ff","u16":[7314,32633,18004,65535]}}, +{"amount":0.5,"gain":2,"in":"#27ae60ff","out":{"hex":"#008043ff","u16":[0,32833,17229,65535]}}, +{"amount":0.75,"gain":0,"in":"#27ae60ff","out":{"hex":"#515151ff","u16":[20801,20801,20801,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#27ae60ff","out":{"hex":"#3c5744ff","u16":[15521,22368,17479,65535]}}, +{"amount":0.75,"gain":1,"in":"#27ae60ff","out":{"hex":"#155d33ff","u16":[5337,23813,13138,65535]}}, +{"amount":0.75,"gain":2,"in":"#27ae60ff","out":{"hex":"#005d31ff","u16":[0,23960,12573,65535]}}, +{"amount":0.9,"gain":0,"in":"#27ae60ff","out":{"hex":"#353535ff","u16":[13715,13715,13715,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#27ae60ff","out":{"hex":"#28392dff","u16":[10234,14748,11525,65535]}}, +{"amount":0.9,"gain":1,"in":"#27ae60ff","out":{"hex":"#0e3d22ff","u16":[3519,15701,8663,65535]}}, +{"amount":0.9,"gain":2,"in":"#27ae60ff","out":{"hex":"#003d20ff","u16":[0,15798,8290,65535]}}, +{"amount":1,"gain":0,"in":"#27ae60ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#27ae60ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#27ae60ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#27ae60ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#27ae60ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#27ae60ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#27ae60ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#27ae60ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#f67400ff","out":{"hex":"#b7b7b7ff","u16":[47135,47135,47135,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#f67400ff","out":{"hex":"#dfac9dff","u16":[57228,44258,40444,65535]}}, +{"amount":-0.5,"gain":1,"in":"#f67400ff","out":{"hex":"#ffa07dff","u16":[65535,41137,32052,65535]}}, +{"amount":-0.5,"gain":2,"in":"#f67400ff","out":{"hex":"#ffa07dff","u16":[65535,41137,32052,65535]}}, +{"amount":0,"gain":0,"in":"#f67400ff","out":{"hex":"#999999ff","u16":[39202,39202,39202,65535]}}, +{"amount":0,"gain":0.5,"in":"#f67400ff","out":{"hex":"#ce886fff","u16":[52868,34887,28607,65535]}}, +{"amount":0,"gain":1,"in":"#f67400ff","out":{"hex":"#f67400ff","u16":[63222,29812,0,65535]}}, +{"amount":0,"gain":2,"in":"#f67400ff","out":{"hex":"#f67400ff","u16":[63222,29812,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#f67400ff","out":{"hex":"#919191ff","u16":[37368,37368,37368,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#f67400ff","out":{"hex":"#c4816aff","u16":[50396,33256,27269,65535]}}, +{"amount":0.1,"gain":1,"in":"#f67400ff","out":{"hex":"#ea6f00ff","u16":[60266,28418,0,65535]}}, +{"amount":0.1,"gain":2,"in":"#f67400ff","out":{"hex":"#ea6f00ff","u16":[60266,28418,0,65535]}}, +{"amount":0.25,"gain":0,"in":"#f67400ff","out":{"hex":"#868686ff","u16":[34396,34396,34396,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#f67400ff","out":{"hex":"#b47762ff","u16":[46388,30611,25100,65535]}}, +{"amount":0.25,"gain":1,"in":"#f67400ff","out":{"hex":"#d86600ff","u16":[55473,26158,0,65535]}}, +{"amount":0.25,"gain":2,"in":"#f67400ff","out":{"hex":"#d86600ff","u16":[55473,26158,0,65535]}}, +{"amount":0.5,"gain":0,"in":"#f67400ff","out":{"hex":"#6f6f6fff","u16":[28607,28607,28607,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#f67400ff","out":{"hex":"#966351ff","u16":[38580,25459,20876,65535]}}, +{"amount":0.5,"gain":1,"in":"#f67400ff","out":{"hex":"#b45500ff","u16":[46136,21755,0,65535]}}, +{"amount":0.5,"gain":2,"in":"#f67400ff","out":{"hex":"#b45500ff","u16":[46136,21755,0,65535]}}, +{"amount":0.75,"gain":0,"in":"#f67400ff","out":{"hex":"#515151ff","u16":[20876,20876,20876,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#f67400ff","out":{"hex":"#6e483bff","u16":[28153,18578,15234,65535]}}, +{"amount":0.75,"gain":1,"in":"#f67400ff","out":{"hex":"#833e00ff","u16":[33667,15876,0,65535]}}, +{"amount":0.75,"gain":2,"in":"#f67400ff","out":{"hex":"#833e00ff","u16":[33667,15876,0,65535]}}, +{"amount":0.9,"gain":0,"in":"#f67400ff","out":{"hex":"#363636ff","u16":[13764,13764,13764,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#f67400ff","out":{"hex":"#483027ff","u16":[18563,12250,10044,65535]}}, +{"amount":0.9,"gain":1,"in":"#f67400ff","out":{"hex":"#562900ff","u16":[22198,10468,0,65535]}}, +{"amount":0.9,"gain":2,"in":"#f67400ff","out":{"hex":"#562900ff","u16":[22198,10468,0,65535]}}, +{"amount":1,"gain":0,"in":"#f67400ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#f67400ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#f67400ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#f67400ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#f67400ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#f67400ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#f67400ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#f67400ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#2980b9ff","out":{"hex":"#929292ff","u16":[37607,37607,37607,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#2980b9ff","out":{"hex":"#6f96bdff","u16":[28555,38595,48579,65535]}}, +{"amount":-0.5,"gain":1,"in":"#2980b9ff","out":{"hex":"#319adeff","u16":[12669,39553,57167,65535]}}, +{"amount":-0.5,"gain":2,"in":"#2980b9ff","out":{"hex":"#009be4ff","u16":[0,39743,58714,65535]}}, +{"amount":0,"gain":0,"in":"#2980b9ff","out":{"hex":"#7a7a7aff","u16":[31277,31277,31277,65535]}}, +{"amount":0,"gain":0.5,"in":"#2980b9ff","out":{"hex":"#5c7d9dff","u16":[23749,32099,40403,65535]}}, +{"amount":0,"gain":1,"in":"#2980b9ff","out":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]}}, +{"amount":0,"gain":2,"in":"#2980b9ff","out":{"hex":"#0081beff","u16":[0,33053,48831,65535]}}, +{"amount":0.1,"gain":0,"in":"#2980b9ff","out":{"hex":"#747474ff","u16":[29815,29815,29815,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#2980b9ff","out":{"hex":"#587796ff","u16":[22638,30598,38513,65535]}}, +{"amount":0.1,"gain":1,"in":"#2980b9ff","out":{"hex":"#277ab0ff","u16":[10044,31358,45322,65535]}}, +{"amount":0.1,"gain":2,"in":"#2980b9ff","out":{"hex":"#007bb5ff","u16":[0,31508,46548,65535]}}, +{"amount":0.25,"gain":0,"in":"#2980b9ff","out":{"hex":"#6b6b6bff","u16":[27443,27443,27443,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#2980b9ff","out":{"hex":"#516e8aff","u16":[20838,28164,35450,65535]}}, +{"amount":0.25,"gain":1,"in":"#2980b9ff","out":{"hex":"#2470a2ff","u16":[9245,28864,41717,65535]}}, +{"amount":0.25,"gain":2,"in":"#2980b9ff","out":{"hex":"#0071a7ff","u16":[0,29002,42846,65535]}}, +{"amount":0.5,"gain":0,"in":"#2980b9ff","out":{"hex":"#595959ff","u16":[22824,22824,22824,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#2980b9ff","out":{"hex":"#435b73ff","u16":[17331,23424,29484,65535]}}, +{"amount":0.5,"gain":1,"in":"#2980b9ff","out":{"hex":"#1e5d87ff","u16":[7689,24006,34695,65535]}}, +{"amount":0.5,"gain":2,"in":"#2980b9ff","out":{"hex":"#005e8bff","u16":[0,24120,35634,65535]}}, +{"amount":0.75,"gain":0,"in":"#2980b9ff","out":{"hex":"#414141ff","u16":[16656,16656,16656,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#2980b9ff","out":{"hex":"#314354ff","u16":[12647,17093,21515,65535]}}, +{"amount":0.75,"gain":1,"in":"#2980b9ff","out":{"hex":"#164463ff","u16":[5611,17518,25319,65535]}}, +{"amount":0.75,"gain":2,"in":"#2980b9ff","out":{"hex":"#004465ff","u16":[0,17602,26004,65535]}}, +{"amount":0.9,"gain":0,"in":"#2980b9ff","out":{"hex":"#2b2b2bff","u16":[10982,10982,10982,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#2980b9ff","out":{"hex":"#202c37ff","u16":[8339,11271,14186,65535]}}, +{"amount":0.9,"gain":1,"in":"#2980b9ff","out":{"hex":"#0e2d41ff","u16":[3700,11550,16694,65535]}}, +{"amount":0.9,"gain":2,"in":"#2980b9ff","out":{"hex":"#002d43ff","u16":[0,11606,17146,65535]}}, +{"amount":1,"gain":0,"in":"#2980b9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#2980b9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#2980b9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#2980b9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#2980b9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#2980b9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#2980b9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#2980b9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#7f8c8dff","out":{"hex":"#a5a5a5ff","u16":[42469,42469,42469,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#7f8c8dff","out":{"hex":"#9fa7a7ff","u16":[40895,42867,43024,65535]}}, +{"amount":-0.5,"gain":1,"in":"#7f8c8dff","out":{"hex":"#99a8aaff","u16":[39244,43262,43571,65535]}}, +{"amount":-0.5,"gain":2,"in":"#7f8c8dff","out":{"hex":"#8babaeff","u16":[35666,44038,44640,65535]}}, +{"amount":0,"gain":0,"in":"#7f8c8dff","out":{"hex":"#898989ff","u16":[35320,35320,35320,65535]}}, +{"amount":0,"gain":0.5,"in":"#7f8c8dff","out":{"hex":"#848b8bff","u16":[34011,35652,35782,65535]}}, +{"amount":0,"gain":1,"in":"#7f8c8dff","out":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}}, +{"amount":0,"gain":2,"in":"#7f8c8dff","out":{"hex":"#738f90ff","u16":[29663,36625,37127,65535]}}, +{"amount":0.1,"gain":0,"in":"#7f8c8dff","out":{"hex":"#838383ff","u16":[33669,33669,33669,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#7f8c8dff","out":{"hex":"#7e8485ff","u16":[32421,33985,34109,65535]}}, +{"amount":0.1,"gain":1,"in":"#7f8c8dff","out":{"hex":"#798586ff","u16":[31113,34297,34542,65535]}}, +{"amount":0.1,"gain":2,"in":"#7f8c8dff","out":{"hex":"#6e888aff","u16":[28276,34913,35390,65535]}}, +{"amount":0.25,"gain":0,"in":"#7f8c8dff","out":{"hex":"#797979ff","u16":[30991,30991,30991,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#7f8c8dff","out":{"hex":"#747a7aff","u16":[29842,31282,31396,65535]}}, +{"amount":0.25,"gain":1,"in":"#7f8c8dff","out":{"hex":"#6f7b7cff","u16":[28638,31570,31795,65535]}}, +{"amount":0.25,"gain":2,"in":"#7f8c8dff","out":{"hex":"#657d7fff","u16":[26027,32136,32576,65535]}}, +{"amount":0.5,"gain":0,"in":"#7f8c8dff","out":{"hex":"#646464ff","u16":[25775,25775,25775,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#7f8c8dff","out":{"hex":"#616566ff","u16":[24820,26017,26112,65535]}}, +{"amount":0.5,"gain":1,"in":"#7f8c8dff","out":{"hex":"#5d6667ff","u16":[23818,26256,26444,65535]}}, +{"amount":0.5,"gain":2,"in":"#7f8c8dff","out":{"hex":"#546869ff","u16":[21646,26727,27093,65535]}}, +{"amount":0.75,"gain":0,"in":"#7f8c8dff","out":{"hex":"#494949ff","u16":[18809,18809,18809,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#7f8c8dff","out":{"hex":"#464a4aff","u16":[18112,18985,19055,65535]}}, +{"amount":0.75,"gain":1,"in":"#7f8c8dff","out":{"hex":"#444b4bff","u16":[17381,19160,19297,65535]}}, +{"amount":0.75,"gain":2,"in":"#7f8c8dff","out":{"hex":"#3d4c4dff","u16":[15796,19504,19771,65535]}}, +{"amount":0.9,"gain":0,"in":"#7f8c8dff","out":{"hex":"#303030ff","u16":[12402,12402,12402,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#7f8c8dff","out":{"hex":"#2e3131ff","u16":[11942,12518,12564,65535]}}, +{"amount":0.9,"gain":1,"in":"#7f8c8dff","out":{"hex":"#2d3132ff","u16":[11460,12633,12724,65535]}}, +{"amount":0.9,"gain":2,"in":"#7f8c8dff","out":{"hex":"#293233ff","u16":[10415,12860,13036,65535]}}, +{"amount":1,"gain":0,"in":"#7f8c8dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#7f8c8dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#7f8c8dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#7f8c8dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#7f8c8dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#7f8c8dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#7f8c8dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#7f8c8dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#9b59b6ff","out":{"hex":"#8b8b8bff","u16":[35780,35780,35780,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#9b59b6ff","out":{"hex":"#9e81adff","u16":[40637,33092,44456,65535]}}, +{"amount":-0.5,"gain":1,"in":"#9b59b6ff","out":{"hex":"#af75c8ff","u16":[44880,30112,51462,65535]}}, +{"amount":-0.5,"gain":2,"in":"#9b59b6ff","out":{"hex":"#cb58f4ff","u16":[52171,22729,62814,65535]}}, +{"amount":0,"gain":0,"in":"#9b59b6ff","out":{"hex":"#747474ff","u16":[29758,29758,29758,65535]}}, +{"amount":0,"gain":0.5,"in":"#9b59b6ff","out":{"hex":"#896799ff","u16":[35231,26584,39381,65535]}}, +{"amount":0,"gain":1,"in":"#9b59b6ff","out":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}}, +{"amount":0,"gain":2,"in":"#9b59b6ff","out":{"hex":"#b92ce3ff","u16":[47511,11396,58409,65535]}}, +{"amount":0.1,"gain":0,"in":"#9b59b6ff","out":{"hex":"#6e6e6eff","u16":[28366,28366,28366,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#9b59b6ff","out":{"hex":"#836392ff","u16":[33583,25341,37539,65535]}}, +{"amount":0.1,"gain":1,"in":"#9b59b6ff","out":{"hex":"#9455adff","u16":[37972,21803,44587,65535]}}, +{"amount":0.1,"gain":2,"in":"#9b59b6ff","out":{"hex":"#b02ad9ff","u16":[45290,10863,55678,65535]}}, +{"amount":0.25,"gain":0,"in":"#9b59b6ff","out":{"hex":"#666666ff","u16":[26110,26110,26110,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#9b59b6ff","out":{"hex":"#785b86ff","u16":[30912,23325,34554,65535]}}, +{"amount":0.25,"gain":1,"in":"#9b59b6ff","out":{"hex":"#884ea0ff","u16":[34952,20069,41041,65535]}}, +{"amount":0.25,"gain":2,"in":"#9b59b6ff","out":{"hex":"#a227c7ff","u16":[41688,9999,51250,65535]}}, +{"amount":0.5,"gain":0,"in":"#9b59b6ff","out":{"hex":"#545454ff","u16":[21715,21715,21715,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#9b59b6ff","out":{"hex":"#644b70ff","u16":[25709,19399,28738,65535]}}, +{"amount":0.5,"gain":1,"in":"#9b59b6ff","out":{"hex":"#714185ff","u16":[29069,16691,34133,65535]}}, +{"amount":0.5,"gain":2,"in":"#9b59b6ff","out":{"hex":"#8720a6ff","u16":[34671,8316,42624,65535]}}, +{"amount":0.75,"gain":0,"in":"#9b59b6ff","out":{"hex":"#3e3e3eff","u16":[15847,15847,15847,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#9b59b6ff","out":{"hex":"#493752ff","u16":[18761,14156,20971,65535]}}, +{"amount":0.75,"gain":1,"in":"#9b59b6ff","out":{"hex":"#532f61ff","u16":[21213,12180,24908,65535]}}, +{"amount":0.75,"gain":2,"in":"#9b59b6ff","out":{"hex":"#621879ff","u16":[25301,6068,31104,65535]}}, +{"amount":0.9,"gain":0,"in":"#9b59b6ff","out":{"hex":"#292929ff","u16":[10449,10449,10449,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#9b59b6ff","out":{"hex":"#302436ff","u16":[12370,9334,13827,65535]}}, +{"amount":0.9,"gain":1,"in":"#9b59b6ff","out":{"hex":"#361f40ff","u16":[13987,8031,16423,65535]}}, +{"amount":0.9,"gain":2,"in":"#9b59b6ff","out":{"hex":"#411050ff","u16":[16682,4001,20509,65535]}}, +{"amount":1,"gain":0,"in":"#9b59b6ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#9b59b6ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#9b59b6ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#9b59b6ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#9b59b6ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#9b59b6ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#9b59b6ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#9b59b6ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#1d99f3ff","out":{"hex":"#b1b1b1ff","u16":[45531,45531,45531,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#1d99f3ff","out":{"hex":"#98b3dbff","u16":[38986,46059,56326,65535]}}, +{"amount":-0.5,"gain":1,"in":"#1d99f3ff","out":{"hex":"#78b5fdff","u16":[30745,46580,65074,65535]}}, +{"amount":-0.5,"gain":2,"in":"#1d99f3ff","out":{"hex":"#75b5ffff","u16":[30186,46610,65535,65535]}}, +{"amount":0,"gain":0,"in":"#1d99f3ff","out":{"hex":"#939393ff","u16":[37867,37867,37867,65535]}}, +{"amount":0,"gain":0.5,"in":"#1d99f3ff","out":{"hex":"#6d96caff","u16":[27982,38602,51927,65535]}}, +{"amount":0,"gain":1,"in":"#1d99f3ff","out":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]}}, +{"amount":0,"gain":2,"in":"#1d99f3ff","out":{"hex":"#0099f5ff","u16":[0,39362,62994,65535]}}, +{"amount":0.1,"gain":0,"in":"#1d99f3ff","out":{"hex":"#8c8c8cff","u16":[36096,36096,36096,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#1d99f3ff","out":{"hex":"#688fc1ff","u16":[26674,36797,49499,65535]}}, +{"amount":0.1,"gain":1,"in":"#1d99f3ff","out":{"hex":"#1c92e8ff","u16":[7104,37482,59531,65535]}}, +{"amount":0.1,"gain":2,"in":"#1d99f3ff","out":{"hex":"#0092eaff","u16":[0,37521,60048,65535]}}, +{"amount":0.25,"gain":0,"in":"#1d99f3ff","out":{"hex":"#818181ff","u16":[33226,33226,33226,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#1d99f3ff","out":{"hex":"#6084b1ff","u16":[24552,33871,45562,65535]}}, +{"amount":0.25,"gain":1,"in":"#1d99f3ff","out":{"hex":"#1986d5ff","u16":[6539,34501,54796,65535]}}, +{"amount":0.25,"gain":2,"in":"#1d99f3ff","out":{"hex":"#0086d7ff","u16":[0,34537,55272,65535]}}, +{"amount":0.5,"gain":0,"in":"#1d99f3ff","out":{"hex":"#6c6c6cff","u16":[27633,27633,27633,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#1d99f3ff","out":{"hex":"#4f6e93ff","u16":[20420,28170,37894,65535]}}, +{"amount":0.5,"gain":1,"in":"#1d99f3ff","out":{"hex":"#1570b1ff","u16":[5439,28694,45573,65535]}}, +{"amount":0.5,"gain":2,"in":"#1d99f3ff","out":{"hex":"#0070b3ff","u16":[0,28724,45969,65535]}}, +{"amount":0.75,"gain":0,"in":"#1d99f3ff","out":{"hex":"#4e4e4eff","u16":[20165,20165,20165,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#1d99f3ff","out":{"hex":"#3a506cff","u16":[14901,20557,27652,65535]}}, +{"amount":0.75,"gain":1,"in":"#1d99f3ff","out":{"hex":"#0f5181ff","u16":[3969,20939,33256,65535]}}, +{"amount":0.75,"gain":2,"in":"#1d99f3ff","out":{"hex":"#005283ff","u16":[0,20961,33545,65535]}}, +{"amount":0.9,"gain":0,"in":"#1d99f3ff","out":{"hex":"#343434ff","u16":[13296,13296,13296,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#1d99f3ff","out":{"hex":"#263547ff","u16":[9825,13554,18233,65535]}}, +{"amount":0.9,"gain":1,"in":"#1d99f3ff","out":{"hex":"#0a3655ff","u16":[2617,13806,21928,65535]}}, +{"amount":0.9,"gain":2,"in":"#1d99f3ff","out":{"hex":"#003656ff","u16":[0,13821,22118,65535]}}, +{"amount":1,"gain":0,"in":"#1d99f3ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#1d99f3ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#1d99f3ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#1d99f3ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#1d99f3ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#1d99f3ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#1d99f3ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#1d99f3ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":1,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"gain":2,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"gain":0,"in":"#dee0e2ff","out":{"hex":"#e0e0e0ff","u16":[57497,57497,57497,65535]}}, +{"amount":0,"gain":0.5,"in":"#dee0e2ff","out":{"hex":"#dfe0e1ff","u16":[57276,57532,57790,65535]}}, +{"amount":0,"gain":1,"in":"#dee0e2ff","out":{"hex":"#dee0e2ff","u16":[57054,57568,58082,65535]}}, +{"amount":0,"gain":2,"in":"#dee0e2ff","out":{"hex":"#dce0e4ff","u16":[56607,57639,58660,65535]}}, +{"amount":0.1,"gain":0,"in":"#dee0e2ff","out":{"hex":"#d5d5d5ff","u16":[54808,54808,54808,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#dee0e2ff","out":{"hex":"#d4d5d7ff","u16":[54504,54857,55212,65535]}}, +{"amount":0.1,"gain":1,"in":"#dee0e2ff","out":{"hex":"#d3d6d8ff","u16":[54197,54906,55612,65535]}}, +{"amount":0.1,"gain":2,"in":"#dee0e2ff","out":{"hex":"#d0d6dbff","u16":[53578,55004,56402,65535]}}, +{"amount":0.25,"gain":0,"in":"#dee0e2ff","out":{"hex":"#c4c4c4ff","u16":[50449,50449,50449,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#dee0e2ff","out":{"hex":"#c3c5c7ff","u16":[49996,50522,51047,65535]}}, +{"amount":0.25,"gain":1,"in":"#dee0e2ff","out":{"hex":"#c1c5c9ff","u16":[49537,50595,51638,65535]}}, +{"amount":0.25,"gain":2,"in":"#dee0e2ff","out":{"hex":"#bdc5cdff","u16":[48605,50740,52794,65535]}}, +{"amount":0.5,"gain":0,"in":"#dee0e2ff","out":{"hex":"#a3a3a3ff","u16":[41958,41958,41958,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#dee0e2ff","out":{"hex":"#a1a4a7ff","u16":[41307,42062,42809,65535]}}, +{"amount":0.5,"gain":1,"in":"#dee0e2ff","out":{"hex":"#9ea4aaff","u16":[40645,42166,43640,65535]}}, +{"amount":0.5,"gain":2,"in":"#dee0e2ff","out":{"hex":"#99a5b0ff","u16":[39279,42373,45247,65535]}}, +{"amount":0.75,"gain":0,"in":"#dee0e2ff","out":{"hex":"#777777ff","u16":[30618,30618,30618,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#dee0e2ff","out":{"hex":"#75777aff","u16":[30144,30694,31239,65535]}}, +{"amount":0.75,"gain":1,"in":"#dee0e2ff","out":{"hex":"#73787cff","u16":[29660,30770,31846,65535]}}, +{"amount":0.75,"gain":2,"in":"#dee0e2ff","out":{"hex":"#707880ff","u16":[28663,30921,33019,65535]}}, +{"amount":0.9,"gain":0,"in":"#dee0e2ff","out":{"hex":"#4f4f4fff","u16":[20188,20188,20188,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#dee0e2ff","out":{"hex":"#4d4f50ff","u16":[19875,20238,20598,65535]}}, +{"amount":0.9,"gain":1,"in":"#dee0e2ff","out":{"hex":"#4c4f52ff","u16":[19556,20288,20998,65535]}}, +{"amount":0.9,"gain":2,"in":"#dee0e2ff","out":{"hex":"#4a4f55ff","u16":[18899,20388,21771,65535]}}, +{"amount":1,"gain":0,"in":"#dee0e2ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#dee0e2ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#dee0e2ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#dee0e2ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#dee0e2ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#dee0e2ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#dee0e2ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#dee0e2ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#292c30ff","out":{"hex":"#353535ff","u16":[13501,13501,13501,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#292c30ff","out":{"hex":"#333537ff","u16":[13093,13549,14186,65535]}}, +{"amount":-0.5,"gain":1,"in":"#292c30ff","out":{"hex":"#31353aff","u16":[12669,13597,14833,65535]}}, +{"amount":-0.5,"gain":2,"in":"#292c30ff","out":{"hex":"#2e353eff","u16":[11766,13691,16034,65535]}}, +{"amount":0,"gain":0,"in":"#292c30ff","out":{"hex":"#2c2c2cff","u16":[11229,11229,11229,65535]}}, +{"amount":0,"gain":0.5,"in":"#292c30ff","out":{"hex":"#2a2c2eff","u16":[10889,11268,11798,65535]}}, +{"amount":0,"gain":1,"in":"#292c30ff","out":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]}}, +{"amount":0,"gain":2,"in":"#292c30ff","out":{"hex":"#262c34ff","u16":[9786,11387,13335,65535]}}, +{"amount":0.1,"gain":0,"in":"#292c30ff","out":{"hex":"#2a2a2aff","u16":[10704,10704,10704,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#292c30ff","out":{"hex":"#282a2cff","u16":[10380,10742,11246,65535]}}, +{"amount":0.1,"gain":1,"in":"#292c30ff","out":{"hex":"#272a2eff","u16":[10044,10779,11759,65535]}}, +{"amount":0.1,"gain":2,"in":"#292c30ff","out":{"hex":"#242a31ff","u16":[9328,10854,12712,65535]}}, +{"amount":0.25,"gain":0,"in":"#292c30ff","out":{"hex":"#262626ff","u16":[9852,9852,9852,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#292c30ff","out":{"hex":"#252628ff","u16":[9555,9887,10352,65535]}}, +{"amount":0.25,"gain":1,"in":"#292c30ff","out":{"hex":"#24272aff","u16":[9245,9922,10824,65535]}}, +{"amount":0.25,"gain":2,"in":"#292c30ff","out":{"hex":"#21272eff","u16":[8586,9991,11701,65535]}}, +{"amount":0.5,"gain":0,"in":"#292c30ff","out":{"hex":"#202020ff","u16":[8194,8194,8194,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#292c30ff","out":{"hex":"#1f2021ff","u16":[7946,8223,8609,65535]}}, +{"amount":0.5,"gain":1,"in":"#292c30ff","out":{"hex":"#1e2023ff","u16":[7689,8252,9002,65535]}}, +{"amount":0.5,"gain":2,"in":"#292c30ff","out":{"hex":"#1c2026ff","u16":[7141,8309,9731,65535]}}, +{"amount":0.75,"gain":0,"in":"#292c30ff","out":{"hex":"#171717ff","u16":[5980,5980,5980,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#292c30ff","out":{"hex":"#171718ff","u16":[5799,6001,6283,65535]}}, +{"amount":0.75,"gain":1,"in":"#292c30ff","out":{"hex":"#16171aff","u16":[5611,6022,6569,65535]}}, +{"amount":0.75,"gain":2,"in":"#292c30ff","out":{"hex":"#14181cff","u16":[5211,6064,7101,65535]}}, +{"amount":0.9,"gain":0,"in":"#292c30ff","out":{"hex":"#0f0f0fff","u16":[3943,3943,3943,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#292c30ff","out":{"hex":"#0f0f10ff","u16":[3823,3957,4142,65535]}}, +{"amount":0.9,"gain":1,"in":"#292c30ff","out":{"hex":"#0e0f11ff","u16":[3700,3970,4331,65535]}}, +{"amount":0.9,"gain":2,"in":"#292c30ff","out":{"hex":"#0d1012ff","u16":[3436,3998,4682,65535]}}, +{"amount":1,"gain":0,"in":"#292c30ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#292c30ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#292c30ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#292c30ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#292c30ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#292c30ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#292c30ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#292c30ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#e93a9aff","out":{"hex":"#9c9c9cff","u16":[40051,40051,40051,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#e93a9aff","out":{"hex":"#cc88a6ff","u16":[52458,35029,42543,65535]}}, +{"amount":-0.5,"gain":1,"in":"#e93a9aff","out":{"hex":"#f171afff","u16":[62065,28944,44870,65535]}}, +{"amount":-0.5,"gain":2,"in":"#e93a9aff","out":{"hex":"#ff65b2ff","u16":[65535,25937,45786,65535]}}, +{"amount":0,"gain":0,"in":"#e93a9aff","out":{"hex":"#828282ff","u16":[33310,33310,33310,65535]}}, +{"amount":0,"gain":0.5,"in":"#e93a9aff","out":{"hex":"#be668eff","u16":[48803,26111,36605,65535]}}, +{"amount":0,"gain":1,"in":"#e93a9aff","out":{"hex":"#e93a9aff","u16":[59881,14906,39578,65535]}}, +{"amount":0,"gain":2,"in":"#e93a9aff","out":{"hex":"#f8009eff","u16":[63783,0,40725,65535]}}, +{"amount":0.1,"gain":0,"in":"#e93a9aff","out":{"hex":"#7c7c7cff","u16":[31753,31753,31753,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#e93a9aff","out":{"hex":"#b56188ff","u16":[46521,24890,34894,65535]}}, +{"amount":0.1,"gain":1,"in":"#e93a9aff","out":{"hex":"#de3793ff","u16":[57081,14209,37727,65535]}}, +{"amount":0.1,"gain":2,"in":"#e93a9aff","out":{"hex":"#ed0097ff","u16":[60800,0,38821,65535]}}, +{"amount":0.25,"gain":0,"in":"#e93a9aff","out":{"hex":"#727272ff","u16":[29227,29227,29227,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#e93a9aff","out":{"hex":"#a7597dff","u16":[42821,22910,32118,65535]}}, +{"amount":0.25,"gain":1,"in":"#e93a9aff","out":{"hex":"#cc3387ff","u16":[52541,13079,34727,65535]}}, +{"amount":0.25,"gain":2,"in":"#e93a9aff","out":{"hex":"#da008bff","u16":[55965,0,35733,65535]}}, +{"amount":0.5,"gain":0,"in":"#e93a9aff","out":{"hex":"#5f5f5fff","u16":[24308,24308,24308,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#e93a9aff","out":{"hex":"#8b4a68ff","u16":[35613,19054,26712,65535]}}, +{"amount":0.5,"gain":1,"in":"#e93a9aff","out":{"hex":"#aa2a70ff","u16":[43698,10878,28882,65535]}}, +{"amount":0.5,"gain":2,"in":"#e93a9aff","out":{"hex":"#b50074ff","u16":[46545,0,29719,65535]}}, +{"amount":0.75,"gain":0,"in":"#e93a9aff","out":{"hex":"#454545ff","u16":[17738,17738,17738,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#e93a9aff","out":{"hex":"#65364cff","u16":[25989,13905,19493,65535]}}, +{"amount":0.75,"gain":1,"in":"#e93a9aff","out":{"hex":"#7c1f52ff","u16":[31888,7938,21076,65535]}}, +{"amount":0.75,"gain":2,"in":"#e93a9aff","out":{"hex":"#840054ff","u16":[33966,0,21687,65535]}}, +{"amount":0.9,"gain":0,"in":"#e93a9aff","out":{"hex":"#2e2e2eff","u16":[11696,11696,11696,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#e93a9aff","out":{"hex":"#432432ff","u16":[17136,9168,12853,65535]}}, +{"amount":0.9,"gain":1,"in":"#e93a9aff","out":{"hex":"#521436ff","u16":[21025,5234,13897,65535]}}, +{"amount":0.9,"gain":2,"in":"#e93a9aff","out":{"hex":"#570038ff","u16":[22395,0,14299,65535]}}, +{"amount":1,"gain":0,"in":"#e93a9aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#e93a9aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#e93a9aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#e93a9aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#e93a9aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#e93a9aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#e93a9aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#e93a9aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#e93d58ff","out":{"hex":"#979797ff","u16":[38933,38933,38933,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#e93d58ff","out":{"hex":"#c9868cff","u16":[51555,34415,35913,65535]}}, +{"amount":-0.5,"gain":1,"in":"#e93d58ff","out":{"hex":"#ee717fff","u16":[61249,29040,32552,65535]}}, +{"amount":-0.5,"gain":2,"in":"#e93d58ff","out":{"hex":"#ff6477ff","u16":[65535,25781,30671,65535]}}, +{"amount":0,"gain":0,"in":"#e93d58ff","out":{"hex":"#7e7e7eff","u16":[32380,32380,32380,65535]}}, +{"amount":0,"gain":0.5,"in":"#e93d58ff","out":{"hex":"#bd646dff","u16":[48513,25698,28012,65535]}}, +{"amount":0,"gain":1,"in":"#e93d58ff","out":{"hex":"#e93d58ff","u16":[59881,15677,22616,65535]}}, +{"amount":0,"gain":2,"in":"#e93d58ff","out":{"hex":"#fc004bff","u16":[64772,0,19159,65535]}}, +{"amount":0.1,"gain":0,"in":"#e93d58ff","out":{"hex":"#787878ff","u16":[30866,30866,30866,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#e93d58ff","out":{"hex":"#b45f68ff","u16":[46244,24496,26702,65535]}}, +{"amount":0.1,"gain":1,"in":"#e93d58ff","out":{"hex":"#de3a54ff","u16":[57081,14944,21558,65535]}}, +{"amount":0.1,"gain":2,"in":"#e93d58ff","out":{"hex":"#f00047ff","u16":[61743,0,18263,65535]}}, +{"amount":0.25,"gain":0,"in":"#e93d58ff","out":{"hex":"#6f6f6fff","u16":[28411,28411,28411,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#e93d58ff","out":{"hex":"#a65860ff","u16":[42566,22548,24579,65535]}}, +{"amount":0.25,"gain":1,"in":"#e93d58ff","out":{"hex":"#cc364dff","u16":[52541,13755,19844,65535]}}, +{"amount":0.25,"gain":2,"in":"#e93d58ff","out":{"hex":"#dd0041ff","u16":[56833,0,16810,65535]}}, +{"amount":0.5,"gain":0,"in":"#e93d58ff","out":{"hex":"#5c5c5cff","u16":[23629,23629,23629,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#e93d58ff","out":{"hex":"#8a4950ff","u16":[35402,18753,20442,65535]}}, +{"amount":0.5,"gain":1,"in":"#e93d58ff","out":{"hex":"#aa2d40ff","u16":[43698,11440,16504,65535]}}, +{"amount":0.5,"gain":2,"in":"#e93d58ff","out":{"hex":"#b80036ff","u16":[47267,0,13981,65535]}}, +{"amount":0.75,"gain":0,"in":"#e93d58ff","out":{"hex":"#434343ff","u16":[17243,17243,17243,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#e93d58ff","out":{"hex":"#65353aff","u16":[25834,13684,14917,65535]}}, +{"amount":0.75,"gain":1,"in":"#e93d58ff","out":{"hex":"#7c202fff","u16":[31888,8348,12043,65535]}}, +{"amount":0.75,"gain":2,"in":"#e93d58ff","out":{"hex":"#860028ff","u16":[34493,0,10202,65535]}}, +{"amount":0.9,"gain":0,"in":"#e93d58ff","out":{"hex":"#2c2c2cff","u16":[11369,11369,11369,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#e93d58ff","out":{"hex":"#422326ff","u16":[17034,9023,9836,65535]}}, +{"amount":0.9,"gain":1,"in":"#e93d58ff","out":{"hex":"#52151fff","u16":[21025,5504,7941,65535]}}, +{"amount":0.9,"gain":2,"in":"#e93d58ff","out":{"hex":"#58001aff","u16":[22743,0,6727,65535]}}, +{"amount":1,"gain":0,"in":"#e93d58ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#e93d58ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#e93d58ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#e93d58ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#e93d58ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#e93d58ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#e93d58ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#e93d58ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#e9643aff","out":{"hex":"#a9a9a9ff","u16":[43332,43332,43332,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#e9643aff","out":{"hex":"#d39c93ff","u16":[54196,39981,37674,65535]}}, +{"amount":-0.5,"gain":1,"in":"#e9643aff","out":{"hex":"#f58d78ff","u16":[62920,36253,30748,65535]}}, +{"amount":-0.5,"gain":2,"in":"#e9643aff","out":{"hex":"#ff886dff","u16":[65535,34897,27960,65535]}}, +{"amount":0,"gain":0,"in":"#e9643aff","out":{"hex":"#8c8c8cff","u16":[36038,36038,36038,65535]}}, +{"amount":0,"gain":0.5,"in":"#e9643aff","out":{"hex":"#c17a6dff","u16":[49698,31383,27950,65535]}}, +{"amount":0,"gain":1,"in":"#e9643aff","out":{"hex":"#e9643aff","u16":[59881,25700,14906,65535]}}, +{"amount":0,"gain":2,"in":"#e9643aff","out":{"hex":"#f55b00ff","u16":[62857,23421,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#e9643aff","out":{"hex":"#868686ff","u16":[34353,34353,34353,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#e9643aff","out":{"hex":"#b87468ff","u16":[47374,29916,26643,65535]}}, +{"amount":0.1,"gain":1,"in":"#e9643aff","out":{"hex":"#de5f37ff","u16":[57081,24498,14209,65535]}}, +{"amount":0.1,"gain":2,"in":"#e9643aff","out":{"hex":"#e95700ff","u16":[59918,22326,0,65535]}}, +{"amount":0.25,"gain":0,"in":"#e9643aff","out":{"hex":"#7b7b7bff","u16":[31621,31621,31621,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#e9643aff","out":{"hex":"#aa6b5fff","u16":[43606,27536,24524,65535]}}, +{"amount":0.25,"gain":1,"in":"#e9643aff","out":{"hex":"#cc5833ff","u16":[52541,22550,13079,65535]}}, +{"amount":0.25,"gain":2,"in":"#e9643aff","out":{"hex":"#d75000ff","u16":[55152,20550,0,65535]}}, +{"amount":0.5,"gain":0,"in":"#e9643aff","out":{"hex":"#666666ff","u16":[26299,26299,26299,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#e9643aff","out":{"hex":"#8d594fff","u16":[36267,22902,20396,65535]}}, +{"amount":0.5,"gain":1,"in":"#e9643aff","out":{"hex":"#aa492aff","u16":[43698,18754,10878,65535]}}, +{"amount":0.5,"gain":2,"in":"#e9643aff","out":{"hex":"#b24300ff","u16":[45869,17091,0,65535]}}, +{"amount":0.75,"gain":0,"in":"#e9643aff","out":{"hex":"#4b4b4bff","u16":[19191,19191,19191,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#e9643aff","out":{"hex":"#67413aff","u16":[26465,16712,14884,65535]}}, +{"amount":0.75,"gain":1,"in":"#e9643aff","out":{"hex":"#7c351fff","u16":[31888,13686,7938,65535]}}, +{"amount":0.75,"gain":2,"in":"#e9643aff","out":{"hex":"#823100ff","u16":[33473,12472,0,65535]}}, +{"amount":0.9,"gain":0,"in":"#e9643aff","out":{"hex":"#313131ff","u16":[12654,12654,12654,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#e9643aff","out":{"hex":"#442b26ff","u16":[17450,11019,9814,65535]}}, +{"amount":0.9,"gain":1,"in":"#e9643aff","out":{"hex":"#522314ff","u16":[21025,9024,5234,65535]}}, +{"amount":0.9,"gain":2,"in":"#e9643aff","out":{"hex":"#562000ff","u16":[22070,8224,0,65535]}}, +{"amount":1,"gain":0,"in":"#e9643aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#e9643aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#e9643aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#e9643aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#e9643aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#e9643aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#e9643aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#e9643aff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#e8cb2dff","out":{"hex":"#f4f4f4ff","u16":[62815,62815,62815,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#e8cb2dff","out":{"hex":"#faf4e5ff","u16":[64143,62803,58823,65535]}}, +{"amount":-0.5,"gain":1,"in":"#e8cb2dff","out":{"hex":"#fff4d4ff","u16":[65439,62791,54476,65535]}}, +{"amount":-0.5,"gain":2,"in":"#e8cb2dff","out":{"hex":"#fff4d3ff","u16":[65535,62791,54132,65535]}}, +{"amount":0,"gain":0,"in":"#e8cb2dff","out":{"hex":"#cbcbcbff","u16":[52243,52243,52243,65535]}}, +{"amount":0,"gain":0.5,"in":"#e8cb2dff","out":{"hex":"#dacb97ff","u16":[56079,52207,38746,65535]}}, +{"amount":0,"gain":1,"in":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"gain":2,"in":"#e8cb2dff","out":{"hex":"#e9cb00ff","u16":[59881,52168,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#e8cb2dff","out":{"hex":"#c2c2c2ff","u16":[49800,49800,49800,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#e8cb2dff","out":{"hex":"#d0c290ff","u16":[53457,49766,36934,65535]}}, +{"amount":0.1,"gain":1,"in":"#e8cb2dff","out":{"hex":"#ddc22bff","u16":[56836,49731,11024,65535]}}, +{"amount":0.1,"gain":2,"in":"#e8cb2dff","out":{"hex":"#dec100ff","u16":[57080,49729,0,65535]}}, +{"amount":0.25,"gain":0,"in":"#e8cb2dff","out":{"hex":"#b2b2b2ff","u16":[45839,45839,45839,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#e8cb2dff","out":{"hex":"#bfb284ff","u16":[49205,45808,33996,65535]}}, +{"amount":0.25,"gain":1,"in":"#e8cb2dff","out":{"hex":"#ccb227ff","u16":[52316,45776,10147,65535]}}, +{"amount":0.25,"gain":2,"in":"#e8cb2dff","out":{"hex":"#ccb200ff","u16":[52541,45774,0,65535]}}, +{"amount":0.5,"gain":0,"in":"#e8cb2dff","out":{"hex":"#949494ff","u16":[38124,38124,38124,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#e8cb2dff","out":{"hex":"#9f946eff","u16":[40923,38097,28274,65535]}}, +{"amount":0.5,"gain":1,"in":"#e8cb2dff","out":{"hex":"#a99421ff","u16":[43510,38071,8439,65535]}}, +{"amount":0.5,"gain":2,"in":"#e8cb2dff","out":{"hex":"#aa9400ff","u16":[43697,38069,0,65535]}}, +{"amount":0.75,"gain":0,"in":"#e8cb2dff","out":{"hex":"#6c6c6cff","u16":[27820,27820,27820,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#e8cb2dff","out":{"hex":"#746c50ff","u16":[29863,27801,20633,65535]}}, +{"amount":0.75,"gain":1,"in":"#e8cb2dff","out":{"hex":"#7c6c18ff","u16":[31751,27782,6159,65535]}}, +{"amount":0.75,"gain":2,"in":"#e8cb2dff","out":{"hex":"#7c6c00ff","u16":[31888,27781,0,65535]}}, +{"amount":0.9,"gain":0,"in":"#e8cb2dff","out":{"hex":"#474747ff","u16":[18343,18343,18343,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#e8cb2dff","out":{"hex":"#4d4735ff","u16":[19690,18331,13604,65535]}}, +{"amount":0.9,"gain":1,"in":"#e8cb2dff","out":{"hex":"#514710ff","u16":[20935,18318,4061,65535]}}, +{"amount":0.9,"gain":2,"in":"#e8cb2dff","out":{"hex":"#524700ff","u16":[21025,18317,0,65535]}}, +{"amount":1,"gain":0,"in":"#e8cb2dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#e8cb2dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#e8cb2dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#e8cb2dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#e8cb2dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#e8cb2dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#e8cb2dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#e8cb2dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#3dd425ff","out":{"hex":"#ddddddff","u16":[56795,56795,56795,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#3dd425ff","out":{"hex":"#a9eea5ff","u16":[43503,61224,42468,65535]}}, +{"amount":-0.5,"gain":1,"in":"#3dd425ff","out":{"hex":"#52fe3bff","u16":[21034,65298,15206,65535]}}, +{"amount":-0.5,"gain":2,"in":"#3dd425ff","out":{"hex":"#48ff2aff","u16":[18577,65535,10893,65535]}}, +{"amount":0,"gain":0,"in":"#3dd425ff","out":{"hex":"#b8b8b8ff","u16":[47236,47236,47236,65535]}}, +{"amount":0,"gain":0.5,"in":"#3dd425ff","out":{"hex":"#8bc788ff","u16":[35822,51015,34927,65535]}}, +{"amount":0,"gain":1,"in":"#3dd425ff","out":{"hex":"#3dd425ff","u16":[15677,54484,9509,65535]}}, +{"amount":0,"gain":2,"in":"#3dd425ff","out":{"hex":"#33d500ff","u16":[13220,54686,0,65535]}}, +{"amount":0.1,"gain":0,"in":"#3dd425ff","out":{"hex":"#afafafff","u16":[45027,45027,45027,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#3dd425ff","out":{"hex":"#85bd82ff","u16":[34147,48629,33294,65535]}}, +{"amount":0.1,"gain":1,"in":"#3dd425ff","out":{"hex":"#3aca23ff","u16":[14944,51936,9064,65535]}}, +{"amount":0.1,"gain":2,"in":"#3dd425ff","out":{"hex":"#31cb00ff","u16":[12602,52129,0,65535]}}, +{"amount":0.25,"gain":0,"in":"#3dd425ff","out":{"hex":"#a1a1a1ff","u16":[41446,41446,41446,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#3dd425ff","out":{"hex":"#7aae77ff","u16":[31431,44761,30646,65535]}}, +{"amount":0.25,"gain":1,"in":"#3dd425ff","out":{"hex":"#36ba20ff","u16":[13755,47806,8343,65535]}}, +{"amount":0.25,"gain":2,"in":"#3dd425ff","out":{"hex":"#2dbb00ff","u16":[11600,47983,0,65535]}}, +{"amount":0.5,"gain":0,"in":"#3dd425ff","out":{"hex":"#868686ff","u16":[34470,34470,34470,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#3dd425ff","out":{"hex":"#669163ff","u16":[26141,37227,25488,65535]}}, +{"amount":0.5,"gain":1,"in":"#3dd425ff","out":{"hex":"#2d9b1bff","u16":[11440,39759,6939,65535]}}, +{"amount":0.5,"gain":2,"in":"#3dd425ff","out":{"hex":"#269b00ff","u16":[9647,39906,0,65535]}}, +{"amount":0.75,"gain":0,"in":"#3dd425ff","out":{"hex":"#626262ff","u16":[25154,25154,25154,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#3dd425ff","out":{"hex":"#4a6a48ff","u16":[19076,27166,18599,65535]}}, +{"amount":0.75,"gain":1,"in":"#3dd425ff","out":{"hex":"#207114ff","u16":[8348,29014,5064,65535]}}, +{"amount":0.75,"gain":2,"in":"#3dd425ff","out":{"hex":"#1b7100ff","u16":[7040,29121,0,65535]}}, +{"amount":0.9,"gain":0,"in":"#3dd425ff","out":{"hex":"#414141ff","u16":[16585,16585,16585,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#3dd425ff","out":{"hex":"#314630ff","u16":[12578,17912,12264,65535]}}, +{"amount":0.9,"gain":1,"in":"#3dd425ff","out":{"hex":"#154a0dff","u16":[5504,19130,3339,65535]}}, +{"amount":0.9,"gain":2,"in":"#3dd425ff","out":{"hex":"#124b00ff","u16":[4642,19201,0,65535]}}, +{"amount":1,"gain":0,"in":"#3dd425ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#3dd425ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#3dd425ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#3dd425ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#3dd425ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#3dd425ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#3dd425ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#3dd425ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#00d3b8ff","out":{"hex":"#e1e1e1ff","u16":[57851,57851,57851,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#00d3b8ff","out":{"hex":"#a4f0dfff","u16":[42216,61658,57357,65535]}}, +{"amount":-0.5,"gain":1,"in":"#00d3b8ff","out":{"hex":"#00feddff","u16":[0,65201,56858,65535]}}, +{"amount":-0.5,"gain":2,"in":"#00d3b8ff","out":{"hex":"#00feddff","u16":[0,65201,56858,65535]}}, +{"amount":0,"gain":0,"in":"#00d3b8ff","out":{"hex":"#bbbbbbff","u16":[48113,48113,48113,65535]}}, +{"amount":0,"gain":0.5,"in":"#00d3b8ff","out":{"hex":"#89c8baff","u16":[35110,51280,47703,65535]}}, +{"amount":0,"gain":1,"in":"#00d3b8ff","out":{"hex":"#00d3b8ff","u16":[0,54227,47288,65535]}}, +{"amount":0,"gain":2,"in":"#00d3b8ff","out":{"hex":"#00d3b8ff","u16":[0,54227,47288,65535]}}, +{"amount":0.1,"gain":0,"in":"#00d3b8ff","out":{"hex":"#b2b2b2ff","u16":[45864,45864,45864,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#00d3b8ff","out":{"hex":"#82beb1ff","u16":[33468,48882,45472,65535]}}, +{"amount":0.1,"gain":1,"in":"#00d3b8ff","out":{"hex":"#00c9afff","u16":[0,51691,45077,65535]}}, +{"amount":0.1,"gain":2,"in":"#00d3b8ff","out":{"hex":"#00c9afff","u16":[0,51691,45077,65535]}}, +{"amount":0.25,"gain":0,"in":"#00d3b8ff","out":{"hex":"#a4a4a4ff","u16":[42216,42216,42216,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#00d3b8ff","out":{"hex":"#78afa3ff","u16":[30807,44994,41856,65535]}}, +{"amount":0.25,"gain":1,"in":"#00d3b8ff","out":{"hex":"#00b9a1ff","u16":[0,47580,41492,65535]}}, +{"amount":0.25,"gain":2,"in":"#00d3b8ff","out":{"hex":"#00b9a1ff","u16":[0,47580,41492,65535]}}, +{"amount":0.5,"gain":0,"in":"#00d3b8ff","out":{"hex":"#898989ff","u16":[35110,35110,35110,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#00d3b8ff","out":{"hex":"#649287ff","u16":[25621,37421,34811,65535]}}, +{"amount":0.5,"gain":1,"in":"#00d3b8ff","out":{"hex":"#009a86ff","u16":[0,39572,34508,65535]}}, +{"amount":0.5,"gain":2,"in":"#00d3b8ff","out":{"hex":"#009a86ff","u16":[0,39572,34508,65535]}}, +{"amount":0.75,"gain":0,"in":"#00d3b8ff","out":{"hex":"#646464ff","u16":[25621,25621,25621,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#00d3b8ff","out":{"hex":"#496a63ff","u16":[18697,27307,25403,65535]}}, +{"amount":0.75,"gain":1,"in":"#00d3b8ff","out":{"hex":"#007062ff","u16":[0,28877,25182,65535]}}, +{"amount":0.75,"gain":2,"in":"#00d3b8ff","out":{"hex":"#007062ff","u16":[0,28877,25182,65535]}}, +{"amount":0.9,"gain":0,"in":"#00d3b8ff","out":{"hex":"#424242ff","u16":[16894,16894,16894,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#00d3b8ff","out":{"hex":"#304641ff","u16":[12328,18005,16749,65535]}}, +{"amount":0.9,"gain":1,"in":"#00d3b8ff","out":{"hex":"#004a41ff","u16":[0,19040,16604,65535]}}, +{"amount":0.9,"gain":2,"in":"#00d3b8ff","out":{"hex":"#004a41ff","u16":[0,19040,16604,65535]}}, +{"amount":1,"gain":0,"in":"#00d3b8ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#00d3b8ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#00d3b8ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#00d3b8ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#00d3b8ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#00d3b8ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#00d3b8ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#00d3b8ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#b875dcff","out":{"hex":"#adadadff","u16":[44516,44516,44516,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#b875dcff","out":{"hex":"#bba5cbff","u16":[48187,42476,52053,65535]}}, +{"amount":-0.5,"gain":1,"in":"#b875dcff","out":{"hex":"#c99de3ff","u16":[51549,40311,58463,65535]}}, +{"amount":-0.5,"gain":2,"in":"#b875dcff","out":{"hex":"#d891ffff","u16":[55462,37350,65535,65535]}}, +{"amount":0,"gain":0,"in":"#b875dcff","out":{"hex":"#909090ff","u16":[37024,37024,37024,65535]}}, +{"amount":0,"gain":0.5,"in":"#b875dcff","out":{"hex":"#a583bbff","u16":[42529,33762,47984,65535]}}, +{"amount":0,"gain":1,"in":"#b875dcff","out":{"hex":"#b875dcff","u16":[47288,30069,56540,65535]}}, +{"amount":0,"gain":2,"in":"#b875dcff","out":{"hex":"#cd5fffff","u16":[52594,24416,65535,65535]}}, +{"amount":0.1,"gain":0,"in":"#b875dcff","out":{"hex":"#898989ff","u16":[35292,35292,35292,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#b875dcff","out":{"hex":"#a17bb7ff","u16":[41284,31667,47119,65535]}}, +{"amount":0.1,"gain":1,"in":"#b875dcff","out":{"hex":"#b46bdaff","u16":[46379,27458,56146,65535]}}, +{"amount":0.1,"gain":2,"in":"#b875dcff","out":{"hex":"#ca50ffff","u16":[51998,20632,65535,65535]}}, +{"amount":0.25,"gain":0,"in":"#b875dcff","out":{"hex":"#7e7e7eff","u16":[32485,32485,32485,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#b875dcff","out":{"hex":"#996eb2ff","u16":[39328,28169,45785,65535]}}, +{"amount":0.25,"gain":1,"in":"#b875dcff","out":{"hex":"#af59d8ff","u16":[44974,22859,55548,65535]}}, +{"amount":0.25,"gain":2,"in":"#b875dcff","out":{"hex":"#c730ffff","u16":[51088,12420,65535,65535]}}, +{"amount":0.5,"gain":0,"in":"#b875dcff","out":{"hex":"#696969ff","u16":[27018,27018,27018,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#b875dcff","out":{"hex":"#825999ff","u16":[33400,22882,39313,65535]}}, +{"amount":0.5,"gain":1,"in":"#b875dcff","out":{"hex":"#9644bbff","u16":[38574,17563,48144,65535]}}, +{"amount":0.5,"gain":2,"in":"#b875dcff","out":{"hex":"#ac00deff","u16":[44121,0,57102,65535]}}, +{"amount":0.75,"gain":0,"in":"#b875dcff","out":{"hex":"#4d4d4dff","u16":[19716,19716,19716,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#b875dcff","out":{"hex":"#5f4170ff","u16":[24373,16698,28688,65535]}}, +{"amount":0.75,"gain":1,"in":"#b875dcff","out":{"hex":"#6e3289ff","u16":[28149,12817,35133,65535]}}, +{"amount":0.75,"gain":2,"in":"#b875dcff","out":{"hex":"#7d00a2ff","u16":[32197,0,41670,65535]}}, +{"amount":0.9,"gain":0,"in":"#b875dcff","out":{"hex":"#333333ff","u16":[13000,13000,13000,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#b875dcff","out":{"hex":"#3f2b4aff","u16":[16070,11010,18915,65535]}}, +{"amount":0.9,"gain":1,"in":"#b875dcff","out":{"hex":"#48215aff","u16":[18560,8451,23165,65535]}}, +{"amount":0.9,"gain":2,"in":"#b875dcff","out":{"hex":"#53006bff","u16":[21229,0,27475,65535]}}, +{"amount":1,"gain":0,"in":"#b875dcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#b875dcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#b875dcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#b875dcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#b875dcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#b875dcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#b875dcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#b875dcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#926ee4ff","out":{"hex":"#9e9e9eff","u16":[40502,40502,40502,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#926ee4ff","out":{"hex":"#a397c7ff","u16":[41871,38791,51191,65535]}}, +{"amount":-0.5,"gain":1,"in":"#926ee4ff","out":{"hex":"#a890e8ff","u16":[43188,36984,59702,65535]}}, +{"amount":-0.5,"gain":2,"in":"#926ee4ff","out":{"hex":"#ac8affff","u16":[44199,35472,65535,65535]}}, +{"amount":0,"gain":0,"in":"#926ee4ff","out":{"hex":"#838383ff","u16":[33685,33685,33685,65535]}}, +{"amount":0,"gain":0.5,"in":"#926ee4ff","out":{"hex":"#8b79bbff","u16":[35665,31119,48106,65535]}}, +{"amount":0,"gain":1,"in":"#926ee4ff","out":{"hex":"#926ee4ff","u16":[37522,28270,58596,65535]}}, +{"amount":0,"gain":2,"in":"#926ee4ff","out":{"hex":"#9764ffff","u16":[38919,25738,65535,65535]}}, +{"amount":0.1,"gain":0,"in":"#926ee4ff","out":{"hex":"#7d7d7dff","u16":[32110,32110,32110,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#926ee4ff","out":{"hex":"#8572b9ff","u16":[34260,29290,47459,65535]}}, +{"amount":0.1,"gain":1,"in":"#926ee4ff","out":{"hex":"#8d66e3ff","u16":[36260,26099,58372,65535]}}, +{"amount":0.1,"gain":2,"in":"#926ee4ff","out":{"hex":"#935affff","u16":[37756,23189,65535,65535]}}, +{"amount":0.25,"gain":0,"in":"#926ee4ff","out":{"hex":"#737373ff","u16":[29556,29556,29556,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#926ee4ff","out":{"hex":"#7d66b5ff","u16":[32012,26256,46470,65535]}}, +{"amount":0.25,"gain":1,"in":"#926ee4ff","out":{"hex":"#8557e2ff","u16":[34261,22362,58034,65535]}}, +{"amount":0.25,"gain":2,"in":"#926ee4ff","out":{"hex":"#8c48ffff","u16":[35925,18565,65535,65535]}}, +{"amount":0.5,"gain":0,"in":"#926ee4ff","out":{"hex":"#606060ff","u16":[24581,24581,24581,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#926ee4ff","out":{"hex":"#6c4eadff","u16":[27693,20096,44355,65535]}}, +{"amount":0.5,"gain":1,"in":"#926ee4ff","out":{"hex":"#7636ddff","u16":[30432,13869,56861,65535]}}, +{"amount":0.5,"gain":2,"in":"#926ee4ff","out":{"hex":"#7e00fcff","u16":[32410,0,64815,65535]}}, +{"amount":0.75,"gain":0,"in":"#926ee4ff","out":{"hex":"#464646ff","u16":[17938,17938,17938,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#926ee4ff","out":{"hex":"#4f397eff","u16":[20208,14665,32368,65535]}}, +{"amount":0.75,"gain":1,"in":"#926ee4ff","out":{"hex":"#5627a1ff","u16":[22208,10121,41494,65535]}}, +{"amount":0.75,"gain":2,"in":"#926ee4ff","out":{"hex":"#5c00b8ff","u16":[23651,0,47298,65535]}}, +{"amount":0.9,"gain":0,"in":"#926ee4ff","out":{"hex":"#2e2e2eff","u16":[11827,11827,11827,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#926ee4ff","out":{"hex":"#342653ff","u16":[13324,9669,21342,65535]}}, +{"amount":0.9,"gain":1,"in":"#926ee4ff","out":{"hex":"#391a6aff","u16":[14643,6673,27359,65535]}}, +{"amount":0.9,"gain":2,"in":"#926ee4ff","out":{"hex":"#3d0079ff","u16":[15594,0,31186,65535]}}, +{"amount":1,"gain":0,"in":"#926ee4ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#926ee4ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#926ee4ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#926ee4ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#926ee4ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#926ee4ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#926ee4ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#926ee4ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#686b6fff","out":{"hex":"#808080ff","u16":[32962,32962,32962,65535]}}, +{"amount":-0.5,"gain":0.5,"in":"#686b6fff","out":{"hex":"#7f8083ff","u16":[32552,33013,33639,65535]}}, +{"amount":-0.5,"gain":1,"in":"#686b6fff","out":{"hex":"#7d8185ff","u16":[32137,33064,34300,65535]}}, +{"amount":-0.5,"gain":2,"in":"#686b6fff","out":{"hex":"#7a818aff","u16":[31287,33167,35579,65535]}}, +{"amount":0,"gain":0,"in":"#686b6fff","out":{"hex":"#6b6b6bff","u16":[27414,27414,27414,65535]}}, +{"amount":0,"gain":0.5,"in":"#686b6fff","out":{"hex":"#696b6dff","u16":[27073,27456,27977,65535]}}, +{"amount":0,"gain":1,"in":"#686b6fff","out":{"hex":"#686b6fff","u16":[26728,27499,28527,65535]}}, +{"amount":0,"gain":2,"in":"#686b6fff","out":{"hex":"#656b73ff","u16":[26021,27584,29591,65535]}}, +{"amount":0.1,"gain":0,"in":"#686b6fff","out":{"hex":"#666666ff","u16":[26132,26132,26132,65535]}}, +{"amount":0.1,"gain":0.5,"in":"#686b6fff","out":{"hex":"#646668ff","u16":[25807,26172,26669,65535]}}, +{"amount":0.1,"gain":1,"in":"#686b6fff","out":{"hex":"#63666aff","u16":[25478,26213,27193,65535]}}, +{"amount":0.1,"gain":2,"in":"#686b6fff","out":{"hex":"#61666eff","u16":[24804,26294,28207,65535]}}, +{"amount":0.25,"gain":0,"in":"#686b6fff","out":{"hex":"#5e5e5eff","u16":[24053,24053,24053,65535]}}, +{"amount":0.25,"gain":0.5,"in":"#686b6fff","out":{"hex":"#5c5e60ff","u16":[23755,24091,24548,65535]}}, +{"amount":0.25,"gain":1,"in":"#686b6fff","out":{"hex":"#5b5e61ff","u16":[23452,24128,25030,65535]}}, +{"amount":0.25,"gain":2,"in":"#686b6fff","out":{"hex":"#595e65ff","u16":[22831,24203,25963,65535]}}, +{"amount":0.5,"gain":0,"in":"#686b6fff","out":{"hex":"#4e4e4eff","u16":[20005,20005,20005,65535]}}, +{"amount":0.5,"gain":0.5,"in":"#686b6fff","out":{"hex":"#4d4e4fff","u16":[19757,20036,20416,65535]}}, +{"amount":0.5,"gain":1,"in":"#686b6fff","out":{"hex":"#4c4e51ff","u16":[19504,20067,20817,65535]}}, +{"amount":0.5,"gain":2,"in":"#686b6fff","out":{"hex":"#4a4e54ff","u16":[18988,20129,21593,65535]}}, +{"amount":0.75,"gain":0,"in":"#686b6fff","out":{"hex":"#393939ff","u16":[14598,14598,14598,65535]}}, +{"amount":0.75,"gain":0.5,"in":"#686b6fff","out":{"hex":"#38393aff","u16":[14417,14621,14898,65535]}}, +{"amount":0.75,"gain":1,"in":"#686b6fff","out":{"hex":"#37393bff","u16":[14233,14644,15191,65535]}}, +{"amount":0.75,"gain":2,"in":"#686b6fff","out":{"hex":"#36393dff","u16":[13857,14689,15758,65535]}}, +{"amount":0.9,"gain":0,"in":"#686b6fff","out":{"hex":"#252525ff","u16":[9625,9625,9625,65535]}}, +{"amount":0.9,"gain":0.5,"in":"#686b6fff","out":{"hex":"#252626ff","u16":[9506,9640,9823,65535]}}, +{"amount":0.9,"gain":1,"in":"#686b6fff","out":{"hex":"#252627ff","u16":[9385,9655,10016,65535]}}, +{"amount":0.9,"gain":2,"in":"#686b6fff","out":{"hex":"#242628ff","u16":[9136,9685,10390,65535]}}, +{"amount":1,"gain":0,"in":"#686b6fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":0.5,"in":"#686b6fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":1,"in":"#686b6fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"gain":2,"in":"#686b6fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0,"in":"#686b6fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":0.5,"in":"#686b6fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":1,"in":"#686b6fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"gain":2,"in":"#686b6fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"gain":0,"in":"#3daee980","out":{"hex":"#c5c5c580","u16":[50566,50566,50566,32896]}}, +{"amount":-0.5,"gain":0.5,"in":"#3daee980","out":{"hex":"#acc8e180","u16":[44188,51518,57774,32896]}}, +{"amount":-0.5,"gain":1,"in":"#3daee980","out":{"hex":"#8eccf980","u16":[36449,52450,64037,32896]}}, +{"amount":-0.5,"gain":2,"in":"#3daee980","out":{"hex":"#85cdff80","u16":[34109,52687,65535,32896]}}, +{"amount":0,"gain":0,"in":"#3daee980","out":{"hex":"#a4a4a480","u16":[42055,42055,42055,32896]}}, +{"amount":0,"gain":0.5,"in":"#3daee980","out":{"hex":"#7da9ca80","u16":[32234,43411,51893,32896]}}, +{"amount":0,"gain":1,"in":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"gain":2,"in":"#3daee980","out":{"hex":"#00aff080","u16":[0,45047,61740,32896]}}, +{"amount":0.1,"gain":0,"in":"#3daee980","out":{"hex":"#9c9c9c80","u16":[40088,40088,40088,32896]}}, +{"amount":0.1,"gain":0.5,"in":"#3daee980","out":{"hex":"#78a1c080","u16":[30726,41381,49466,32896]}}, +{"amount":0.1,"gain":1,"in":"#3daee980","out":{"hex":"#3aa6de80","u16":[14944,42627,57081,32896]}}, +{"amount":0.1,"gain":2,"in":"#3daee980","out":{"hex":"#00a7e580","u16":[0,42941,58853,32896]}}, +{"amount":0.25,"gain":0,"in":"#3daee980","out":{"hex":"#90909080","u16":[36900,36900,36900,32896]}}, +{"amount":0.25,"gain":0.5,"in":"#3daee980","out":{"hex":"#6e94b180","u16":[28282,38090,45532,32896]}}, +{"amount":0.25,"gain":1,"in":"#3daee980","out":{"hex":"#3699cc80","u16":[13755,39237,52541,32896]}}, +{"amount":0.25,"gain":2,"in":"#3daee980","out":{"hex":"#009ad380","u16":[0,39526,54172,32896]}}, +{"amount":0.5,"gain":0,"in":"#3daee980","out":{"hex":"#77777780","u16":[30689,30689,30689,32896]}}, +{"amount":0.5,"gain":0.5,"in":"#3daee980","out":{"hex":"#5c7b9380","u16":[23522,31679,37868,32896]}}, +{"amount":0.5,"gain":1,"in":"#3daee980","out":{"hex":"#2d7faa80","u16":[11440,32633,43698,32896]}}, +{"amount":0.5,"gain":2,"in":"#3daee980","out":{"hex":"#0080af80","u16":[0,32873,45054,32896]}}, +{"amount":0.75,"gain":0,"in":"#3daee980","out":{"hex":"#57575780","u16":[22395,22395,22395,32896]}}, +{"amount":0.75,"gain":0.5,"in":"#3daee980","out":{"hex":"#435a6c80","u16":[17165,23117,27634,32896]}}, +{"amount":0.75,"gain":1,"in":"#3daee980","out":{"hex":"#205d7c80","u16":[8348,23813,31888,32896]}}, +{"amount":0.75,"gain":2,"in":"#3daee980","out":{"hex":"#005d8080","u16":[0,23989,32878,32896]}}, +{"amount":0.9,"gain":0,"in":"#3daee980","out":{"hex":"#39393980","u16":[14766,14766,14766,32896]}}, +{"amount":0.9,"gain":0.5,"in":"#3daee980","out":{"hex":"#2c3b4780","u16":[11318,15242,18220,32896]}}, +{"amount":0.9,"gain":1,"in":"#3daee980","out":{"hex":"#153d5280","u16":[5504,15701,21025,32896]}}, +{"amount":0.9,"gain":2,"in":"#3daee980","out":{"hex":"#003e5480","u16":[0,15817,21678,32896]}}, +{"amount":1,"gain":0,"in":"#3daee980","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":1,"gain":0.5,"in":"#3daee980","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":1,"gain":1,"in":"#3daee980","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":1,"gain":2,"in":"#3daee980","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":1.5,"gain":0,"in":"#3daee980","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":1.5,"gain":0.5,"in":"#3daee980","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":1.5,"gain":1,"in":"#3daee980","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":1.5,"gain":2,"in":"#3daee980","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":-0.5,"gain":0,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"gain":0.5,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"gain":1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"gain":2,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"gain":0,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"gain":0.5,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"gain":1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"gain":2,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"gain":0,"in":"#ffffff00","out":{"hex":"#f3f3f300","u16":[62470,62470,62470,0]}}, +{"amount":0.1,"gain":0.5,"in":"#ffffff00","out":{"hex":"#f3f3f300","u16":[62470,62470,62470,0]}}, +{"amount":0.1,"gain":1,"in":"#ffffff00","out":{"hex":"#f3f3f300","u16":[62470,62470,62470,0]}}, +{"amount":0.1,"gain":2,"in":"#ffffff00","out":{"hex":"#f3f3f300","u16":[62470,62470,62470,0]}}, +{"amount":0.25,"gain":0,"in":"#ffffff00","out":{"hex":"#e0e0e000","u16":[57502,57502,57502,0]}}, +{"amount":0.25,"gain":0.5,"in":"#ffffff00","out":{"hex":"#e0e0e000","u16":[57502,57502,57502,0]}}, +{"amount":0.25,"gain":1,"in":"#ffffff00","out":{"hex":"#e0e0e000","u16":[57502,57502,57502,0]}}, +{"amount":0.25,"gain":2,"in":"#ffffff00","out":{"hex":"#e0e0e000","u16":[57502,57502,57502,0]}}, +{"amount":0.5,"gain":0,"in":"#ffffff00","out":{"hex":"#bababa00","u16":[47824,47824,47824,0]}}, +{"amount":0.5,"gain":0.5,"in":"#ffffff00","out":{"hex":"#bababa00","u16":[47824,47824,47824,0]}}, +{"amount":0.5,"gain":1,"in":"#ffffff00","out":{"hex":"#bababa00","u16":[47824,47824,47824,0]}}, +{"amount":0.5,"gain":2,"in":"#ffffff00","out":{"hex":"#bababa00","u16":[47824,47824,47824,0]}}, +{"amount":0.75,"gain":0,"in":"#ffffff00","out":{"hex":"#88888800","u16":[34899,34899,34899,0]}}, +{"amount":0.75,"gain":0.5,"in":"#ffffff00","out":{"hex":"#88888800","u16":[34899,34899,34899,0]}}, +{"amount":0.75,"gain":1,"in":"#ffffff00","out":{"hex":"#88888800","u16":[34899,34899,34899,0]}}, +{"amount":0.75,"gain":2,"in":"#ffffff00","out":{"hex":"#88888800","u16":[34899,34899,34899,0]}}, +{"amount":0.9,"gain":0,"in":"#ffffff00","out":{"hex":"#5a5a5a00","u16":[23011,23011,23011,0]}}, +{"amount":0.9,"gain":0.5,"in":"#ffffff00","out":{"hex":"#5a5a5a00","u16":[23011,23011,23011,0]}}, +{"amount":0.9,"gain":1,"in":"#ffffff00","out":{"hex":"#5a5a5a00","u16":[23011,23011,23011,0]}}, +{"amount":0.9,"gain":2,"in":"#ffffff00","out":{"hex":"#5a5a5a00","u16":[23011,23011,23011,0]}}, +{"amount":1,"gain":0,"in":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"amount":1,"gain":0.5,"in":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"amount":1,"gain":1,"in":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"amount":1,"gain":2,"in":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"amount":1.5,"gain":0,"in":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"amount":1.5,"gain":0.5,"in":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"amount":1.5,"gain":1,"in":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"amount":1.5,"gain":2,"in":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"amount":-0.5,"gain":0,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":-0.5,"gain":0.5,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":-0.5,"gain":1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":-0.5,"gain":2,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0,"gain":0,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0,"gain":0.5,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0,"gain":1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0,"gain":2,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.1,"gain":0,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.1,"gain":0.5,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.1,"gain":1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.1,"gain":2,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.25,"gain":0,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.25,"gain":0.5,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.25,"gain":1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.25,"gain":2,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.5,"gain":0,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.5,"gain":0.5,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.5,"gain":1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.5,"gain":2,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.75,"gain":0,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.75,"gain":0.5,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.75,"gain":1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.75,"gain":2,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.9,"gain":0,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.9,"gain":0.5,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.9,"gain":1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":0.9,"gain":2,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":1,"gain":0,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":1,"gain":0.5,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":1,"gain":1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":1,"gain":2,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":1.5,"gain":0,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":1.5,"gain":0.5,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":1.5,"gain":1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":1.5,"gain":2,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"amount":-0.5,"gain":0,"in":"#ff000033","out":{"hex":"#98989833","u16":[38982,38982,38982,13107]}}, +{"amount":-0.5,"gain":0.5,"in":"#ff000033","out":{"hex":"#d3828233","u16":[54235,33398,33398,13107]}}, +{"amount":-0.5,"gain":1,"in":"#ff000033","out":{"hex":"#ff676733","u16":[65535,26374,26374,13107]}}, +{"amount":-0.5,"gain":2,"in":"#ff000033","out":{"hex":"#ff676733","u16":[65535,26374,26374,13107]}}, +{"amount":0,"gain":0,"in":"#ff000033","out":{"hex":"#7e7e7e33","u16":[32421,32421,32421,13107]}}, +{"amount":0,"gain":0.5,"in":"#ff000033","out":{"hex":"#cb5c5c33","u16":[52203,23659,23659,13107]}}, +{"amount":0,"gain":1,"in":"#ff000033","out":{"hex":"#ff000033","u16":[65535,0,0,13107]}}, +{"amount":0,"gain":2,"in":"#ff000033","out":{"hex":"#ff000033","u16":[65535,0,0,13107]}}, +{"amount":0.1,"gain":0,"in":"#ff000033","out":{"hex":"#78787833","u16":[30904,30904,30904,13107]}}, +{"amount":0.1,"gain":0.5,"in":"#ff000033","out":{"hex":"#c2585833","u16":[49762,22552,22552,13107]}}, +{"amount":0.1,"gain":1,"in":"#ff000033","out":{"hex":"#f3000033","u16":[62470,0,0,13107]}}, +{"amount":0.1,"gain":2,"in":"#ff000033","out":{"hex":"#f3000033","u16":[62470,0,0,13107]}}, +{"amount":0.25,"gain":0,"in":"#ff000033","out":{"hex":"#6f6f6f33","u16":[28447,28447,28447,13107]}}, +{"amount":0.25,"gain":0.5,"in":"#ff000033","out":{"hex":"#b2515133","u16":[45804,20759,20759,13107]}}, +{"amount":0.25,"gain":1,"in":"#ff000033","out":{"hex":"#e0000033","u16":[57502,0,0,13107]}}, +{"amount":0.25,"gain":2,"in":"#ff000033","out":{"hex":"#e0000033","u16":[57502,0,0,13107]}}, +{"amount":0.5,"gain":0,"in":"#ff000033","out":{"hex":"#5c5c5c33","u16":[23659,23659,23659,13107]}}, +{"amount":0.5,"gain":0.5,"in":"#ff000033","out":{"hex":"#94434333","u16":[38095,17265,17265,13107]}}, +{"amount":0.5,"gain":1,"in":"#ff000033","out":{"hex":"#ba000033","u16":[47824,0,0,13107]}}, +{"amount":0.5,"gain":2,"in":"#ff000033","out":{"hex":"#ba000033","u16":[47824,0,0,13107]}}, +{"amount":0.75,"gain":0,"in":"#ff000033","out":{"hex":"#43434333","u16":[17265,17265,17265,13107]}}, +{"amount":0.75,"gain":0.5,"in":"#ff000033","out":{"hex":"#6c313133","u16":[27799,12599,12599,13107]}}, +{"amount":0.75,"gain":1,"in":"#ff000033","out":{"hex":"#88000033","u16":[34899,0,0,13107]}}, +{"amount":0.75,"gain":2,"in":"#ff000033","out":{"hex":"#88000033","u16":[34899,0,0,13107]}}, +{"amount":0.9,"gain":0,"in":"#ff000033","out":{"hex":"#2c2c2c33","u16":[11383,11383,11383,13107]}}, +{"amount":0.9,"gain":0.5,"in":"#ff000033","out":{"hex":"#47202033","u16":[18329,8307,8307,13107]}}, +{"amount":0.9,"gain":1,"in":"#ff000033","out":{"hex":"#5a000033","u16":[23011,0,0,13107]}}, +{"amount":0.9,"gain":2,"in":"#ff000033","out":{"hex":"#5a000033","u16":[23011,0,0,13107]}}, +{"amount":1,"gain":0,"in":"#ff000033","out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"amount":1,"gain":0.5,"in":"#ff000033","out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"amount":1,"gain":1,"in":"#ff000033","out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"amount":1,"gain":2,"in":"#ff000033","out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"amount":1.5,"gain":0,"in":"#ff000033","out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"amount":1.5,"gain":0.5,"in":"#ff000033","out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"amount":1.5,"gain":1,"in":"#ff000033","out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"amount":1.5,"gain":2,"in":"#ff000033","out":{"hex":"#00000033","u16":[0,0,0,13107]}} +], +"shade": [ +{"chroma":-1,"in":"#000000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#000000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#000000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#000000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#000000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#000000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#000000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#000000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#000000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#000000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#000000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#000000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#000000ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#000000ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#000000ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#000000ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#000000ff","luma":0,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#000000ff","luma":0,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#000000ff","luma":0,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#000000ff","luma":0,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#000000ff","luma":0.1,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]}}, +{"chroma":0,"in":"#000000ff","luma":0.1,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]}}, +{"chroma":0.5,"in":"#000000ff","luma":0.1,"out":{"hex":"#904141ff","u16":[37051,16792,16792,65535]}}, +{"chroma":1,"in":"#000000ff","luma":0.1,"out":{"hex":"#b50000ff","u16":[46514,0,0,65535]}}, +{"chroma":-1,"in":"#000000ff","luma":0.5,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]}}, +{"chroma":0,"in":"#000000ff","luma":0.5,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]}}, +{"chroma":0.5,"in":"#000000ff","luma":0.5,"out":{"hex":"#e0aeaeff","u16":[57502,44773,44773,65535]}}, +{"chroma":1,"in":"#000000ff","luma":0.5,"out":{"hex":"#ffa1a1ff","u16":[65535,41449,41449,65535]}}, +{"chroma":-1,"in":"#000000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#000000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#000000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#000000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#000000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#000000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#000000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#000000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#ffffffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#ffffffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#ffffffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#ffffffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#ffffffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#ffffffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#ffffffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#ffffffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#ffffffff","luma":-0.5,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]}}, +{"chroma":0,"in":"#ffffffff","luma":-0.5,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]}}, +{"chroma":0.5,"in":"#ffffffff","luma":-0.5,"out":{"hex":"#e0aeaeff","u16":[57502,44773,44773,65535]}}, +{"chroma":1,"in":"#ffffffff","luma":-0.5,"out":{"hex":"#ffa1a1ff","u16":[65535,41449,41449,65535]}}, +{"chroma":-1,"in":"#ffffffff","luma":-0.1,"out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]}}, +{"chroma":0,"in":"#ffffffff","luma":-0.1,"out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]}}, +{"chroma":0.5,"in":"#ffffffff","luma":-0.1,"out":{"hex":"#f9f1f1ff","u16":[64025,62043,62043,65535]}}, +{"chroma":1,"in":"#ffffffff","luma":-0.1,"out":{"hex":"#fff0f0ff","u16":[65535,61611,61611,65535]}}, +{"chroma":-1,"in":"#ffffffff","luma":0,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#ffffffff","luma":0,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#ffffffff","luma":0,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#ffffffff","luma":0,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#ffffffff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#ffffffff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#ffffffff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#ffffffff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#ffffffff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#ffffffff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#ffffffff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#ffffffff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#ffffffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#ffffffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#ffffffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#ffffffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#ffffffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#ffffffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#ffffffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#ffffffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#010101ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#010101ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#010101ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#010101ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#010101ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#010101ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#010101ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#010101ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#010101ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#010101ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#010101ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#010101ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#010101ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#010101ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#010101ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#010101ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#010101ff","luma":0,"out":{"hex":"#010101ff","u16":[257,257,257,65535]}}, +{"chroma":0,"in":"#010101ff","luma":0,"out":{"hex":"#010101ff","u16":[257,257,257,65535]}}, +{"chroma":0.5,"in":"#010101ff","luma":0,"out":{"hex":"#020101ff","u16":[414,188,188,65535]}}, +{"chroma":1,"in":"#010101ff","luma":0,"out":{"hex":"#020000ff","u16":[520,0,0,65535]}}, +{"chroma":-1,"in":"#010101ff","luma":0.1,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]}}, +{"chroma":0,"in":"#010101ff","luma":0.1,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]}}, +{"chroma":0.5,"in":"#010101ff","luma":0.1,"out":{"hex":"#904141ff","u16":[37052,16792,16792,65535]}}, +{"chroma":1,"in":"#010101ff","luma":0.1,"out":{"hex":"#b50000ff","u16":[46515,0,0,65535]}}, +{"chroma":-1,"in":"#010101ff","luma":0.5,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]}}, +{"chroma":0,"in":"#010101ff","luma":0.5,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]}}, +{"chroma":0.5,"in":"#010101ff","luma":0.5,"out":{"hex":"#e0aeaeff","u16":[57502,44773,44773,65535]}}, +{"chroma":1,"in":"#010101ff","luma":0.5,"out":{"hex":"#ffa1a1ff","u16":[65535,41449,41449,65535]}}, +{"chroma":-1,"in":"#010101ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#010101ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#010101ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#010101ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#010101ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#010101ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#010101ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#010101ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#020202ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#020202ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#020202ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#020202ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#020202ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#020202ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#020202ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#020202ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#020202ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#020202ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#020202ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#020202ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#020202ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#020202ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#020202ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#020202ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#020202ff","luma":0,"out":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"chroma":0,"in":"#020202ff","luma":0,"out":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"chroma":0.5,"in":"#020202ff","luma":0,"out":{"hex":"#030101ff","u16":[828,375,375,65535]}}, +{"chroma":1,"in":"#020202ff","luma":0,"out":{"hex":"#040000ff","u16":[1039,0,0,65535]}}, +{"chroma":-1,"in":"#020202ff","luma":0.1,"out":{"hex":"#5a5a5aff","u16":[23013,23013,23013,65535]}}, +{"chroma":0,"in":"#020202ff","luma":0.1,"out":{"hex":"#5a5a5aff","u16":[23013,23013,23013,65535]}}, +{"chroma":0.5,"in":"#020202ff","luma":0.1,"out":{"hex":"#904141ff","u16":[37055,16794,16794,65535]}}, +{"chroma":1,"in":"#020202ff","luma":0.1,"out":{"hex":"#b50000ff","u16":[46519,0,0,65535]}}, +{"chroma":-1,"in":"#020202ff","luma":0.5,"out":{"hex":"#bababaff","u16":[47825,47825,47825,65535]}}, +{"chroma":0,"in":"#020202ff","luma":0.5,"out":{"hex":"#bababaff","u16":[47825,47825,47825,65535]}}, +{"chroma":0.5,"in":"#020202ff","luma":0.5,"out":{"hex":"#e0aeaeff","u16":[57502,44774,44774,65535]}}, +{"chroma":1,"in":"#020202ff","luma":0.5,"out":{"hex":"#ffa1a1ff","u16":[65535,41451,41451,65535]}}, +{"chroma":-1,"in":"#020202ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#020202ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#020202ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#020202ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#020202ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#020202ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#020202ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#020202ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#040404ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#040404ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#040404ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#040404ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#040404ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#040404ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#040404ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#040404ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#040404ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#040404ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#040404ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#040404ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#040404ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#040404ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#040404ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#040404ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#040404ff","luma":0,"out":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"chroma":0,"in":"#040404ff","luma":0,"out":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"chroma":0.5,"in":"#040404ff","luma":0,"out":{"hex":"#060303ff","u16":[1655,750,750,65535]}}, +{"chroma":1,"in":"#040404ff","luma":0,"out":{"hex":"#080000ff","u16":[2078,0,0,65535]}}, +{"chroma":-1,"in":"#040404ff","luma":0.1,"out":{"hex":"#5a5a5aff","u16":[23022,23022,23022,65535]}}, +{"chroma":0,"in":"#040404ff","luma":0.1,"out":{"hex":"#5a5a5aff","u16":[23022,23022,23022,65535]}}, +{"chroma":0.5,"in":"#040404ff","luma":0.1,"out":{"hex":"#904141ff","u16":[37069,16800,16800,65535]}}, +{"chroma":1,"in":"#040404ff","luma":0.1,"out":{"hex":"#b50000ff","u16":[46536,0,0,65535]}}, +{"chroma":-1,"in":"#040404ff","luma":0.5,"out":{"hex":"#bababaff","u16":[47828,47828,47828,65535]}}, +{"chroma":0,"in":"#040404ff","luma":0.5,"out":{"hex":"#bababaff","u16":[47828,47828,47828,65535]}}, +{"chroma":0.5,"in":"#040404ff","luma":0.5,"out":{"hex":"#e0aeaeff","u16":[57504,44778,44778,65535]}}, +{"chroma":1,"in":"#040404ff","luma":0.5,"out":{"hex":"#ffa1a1ff","u16":[65535,41456,41456,65535]}}, +{"chroma":-1,"in":"#040404ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#040404ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#040404ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#040404ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#040404ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#040404ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#040404ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#040404ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#080808ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#080808ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#080808ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#080808ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#080808ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#080808ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#080808ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#080808ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#080808ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#080808ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#080808ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#080808ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#080808ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#080808ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#080808ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#080808ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#080808ff","luma":0,"out":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"chroma":0,"in":"#080808ff","luma":0,"out":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"chroma":0.5,"in":"#080808ff","luma":0,"out":{"hex":"#0d0606ff","u16":[3311,1500,1500,65535]}}, +{"chroma":1,"in":"#080808ff","luma":0,"out":{"hex":"#100000ff","u16":[4156,0,0,65535]}}, +{"chroma":-1,"in":"#080808ff","luma":0.1,"out":{"hex":"#5a5a5aff","u16":[23062,23062,23062,65535]}}, +{"chroma":0,"in":"#080808ff","luma":0.1,"out":{"hex":"#5a5a5aff","u16":[23062,23062,23062,65535]}}, +{"chroma":0.5,"in":"#080808ff","luma":0.1,"out":{"hex":"#904141ff","u16":[37134,16829,16829,65535]}}, +{"chroma":1,"in":"#080808ff","luma":0.1,"out":{"hex":"#b50000ff","u16":[46618,0,0,65535]}}, +{"chroma":-1,"in":"#080808ff","luma":0.5,"out":{"hex":"#bababaff","u16":[47845,47845,47845,65535]}}, +{"chroma":0,"in":"#080808ff","luma":0.5,"out":{"hex":"#bababaff","u16":[47845,47845,47845,65535]}}, +{"chroma":0.5,"in":"#080808ff","luma":0.5,"out":{"hex":"#e0aeaeff","u16":[57511,44799,44799,65535]}}, +{"chroma":1,"in":"#080808ff","luma":0.5,"out":{"hex":"#ffa1a1ff","u16":[65535,41481,41481,65535]}}, +{"chroma":-1,"in":"#080808ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#080808ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#080808ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#080808ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#080808ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#080808ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#080808ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#080808ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#101010ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#101010ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#101010ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#101010ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#101010ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#101010ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#101010ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#101010ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#101010ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#101010ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#101010ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#101010ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#101010ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#101010ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#101010ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#101010ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#101010ff","luma":0,"out":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"chroma":0,"in":"#101010ff","luma":0,"out":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"chroma":0.5,"in":"#101010ff","luma":0,"out":{"hex":"#1a0c0cff","u16":[6621,3001,3001,65535]}}, +{"chroma":1,"in":"#101010ff","luma":0,"out":{"hex":"#200000ff","u16":[8312,0,0,65535]}}, +{"chroma":-1,"in":"#101010ff","luma":0.1,"out":{"hex":"#5a5a5aff","u16":[23246,23246,23246,65535]}}, +{"chroma":0,"in":"#101010ff","luma":0.1,"out":{"hex":"#5a5a5aff","u16":[23246,23246,23246,65535]}}, +{"chroma":0.5,"in":"#101010ff","luma":0.1,"out":{"hex":"#924242ff","u16":[37430,16963,16963,65535]}}, +{"chroma":1,"in":"#101010ff","luma":0.1,"out":{"hex":"#b70000ff","u16":[46989,0,0,65535]}}, +{"chroma":-1,"in":"#101010ff","luma":0.5,"out":{"hex":"#bababaff","u16":[47922,47922,47922,65535]}}, +{"chroma":0,"in":"#101010ff","luma":0.5,"out":{"hex":"#bababaff","u16":[47922,47922,47922,65535]}}, +{"chroma":0.5,"in":"#101010ff","luma":0.5,"out":{"hex":"#e0afafff","u16":[57541,44893,44893,65535]}}, +{"chroma":1,"in":"#101010ff","luma":0.5,"out":{"hex":"#ffa2a2ff","u16":[65535,41597,41597,65535]}}, +{"chroma":-1,"in":"#101010ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#101010ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#101010ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#101010ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#101010ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#101010ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#101010ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#101010ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#202020ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#202020ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#202020ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#202020ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#202020ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#202020ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#202020ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#202020ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#202020ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#202020ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#202020ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#202020ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#202020ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#202020ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#202020ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#202020ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#202020ff","luma":0,"out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"chroma":0,"in":"#202020ff","luma":0,"out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"chroma":0.5,"in":"#202020ff","luma":0,"out":{"hex":"#341717ff","u16":[13242,6001,6001,65535]}}, +{"chroma":1,"in":"#202020ff","luma":0,"out":{"hex":"#410000ff","u16":[16624,0,0,65535]}}, +{"chroma":-1,"in":"#202020ff","luma":0.1,"out":{"hex":"#5e5e5eff","u16":[24069,24069,24069,65535]}}, +{"chroma":0,"in":"#202020ff","luma":0.1,"out":{"hex":"#5e5e5eff","u16":[24069,24069,24069,65535]}}, +{"chroma":0.5,"in":"#202020ff","luma":0.1,"out":{"hex":"#974444ff","u16":[38755,17564,17564,65535]}}, +{"chroma":1,"in":"#202020ff","luma":0.1,"out":{"hex":"#bd0000ff","u16":[48653,0,0,65535]}}, +{"chroma":-1,"in":"#202020ff","luma":0.5,"out":{"hex":"#bcbcbcff","u16":[48273,48273,48273,65535]}}, +{"chroma":0,"in":"#202020ff","luma":0.5,"out":{"hex":"#bcbcbcff","u16":[48273,48273,48273,65535]}}, +{"chroma":0.5,"in":"#202020ff","luma":0.5,"out":{"hex":"#e0b0b0ff","u16":[57683,45324,45324,65535]}}, +{"chroma":1,"in":"#202020ff","luma":0.5,"out":{"hex":"#ffa4a4ff","u16":[65535,42124,42124,65535]}}, +{"chroma":-1,"in":"#202020ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#202020ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#202020ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#202020ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#202020ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#202020ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#202020ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#202020ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#404040ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#404040ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#404040ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#404040ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#404040ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#404040ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#404040ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#404040ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#404040ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#404040ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#404040ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#404040ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#404040ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#404040ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#404040ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#404040ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#404040ff","luma":0,"out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"chroma":0,"in":"#404040ff","luma":0,"out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"chroma":0.5,"in":"#404040ff","luma":0,"out":{"hex":"#672f2fff","u16":[26484,12003,12003,65535]}}, +{"chroma":1,"in":"#404040ff","luma":0,"out":{"hex":"#810000ff","u16":[33248,0,0,65535]}}, +{"chroma":-1,"in":"#404040ff","luma":0.1,"out":{"hex":"#6b6b6bff","u16":[27480,27480,27480,65535]}}, +{"chroma":0,"in":"#404040ff","luma":0.1,"out":{"hex":"#6b6b6bff","u16":[27480,27480,27480,65535]}}, +{"chroma":0.5,"in":"#404040ff","luma":0.1,"out":{"hex":"#ac4e4eff","u16":[44248,20053,20053,65535]}}, +{"chroma":1,"in":"#404040ff","luma":0.1,"out":{"hex":"#d80000ff","u16":[55549,0,0,65535]}}, +{"chroma":-1,"in":"#404040ff","luma":0.5,"out":{"hex":"#c2c2c2ff","u16":[49849,49849,49849,65535]}}, +{"chroma":0,"in":"#404040ff","luma":0.5,"out":{"hex":"#c2c2c2ff","u16":[49849,49849,49849,65535]}}, +{"chroma":0.5,"in":"#404040ff","luma":0.5,"out":{"hex":"#e3b8b8ff","u16":[58327,47242,47242,65535]}}, +{"chroma":1,"in":"#404040ff","luma":0.5,"out":{"hex":"#ffadadff","u16":[65535,44450,44450,65535]}}, +{"chroma":-1,"in":"#404040ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#404040ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#404040ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#404040ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#404040ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#404040ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#404040ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#404040ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#7f7f7fff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#7f7f7fff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#7f7f7fff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#7f7f7fff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#7f7f7fff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#7f7f7fff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#7f7f7fff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#7f7f7fff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#7f7f7fff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#7f7f7fff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#7f7f7fff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#7f7f7fff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#7f7f7fff","luma":-0.1,"out":{"hex":"#606060ff","u16":[24594,24594,24594,65535]}}, +{"chroma":0,"in":"#7f7f7fff","luma":-0.1,"out":{"hex":"#606060ff","u16":[24594,24594,24594,65535]}}, +{"chroma":0.5,"in":"#7f7f7fff","luma":-0.1,"out":{"hex":"#9a4646ff","u16":[39600,17947,17947,65535]}}, +{"chroma":1,"in":"#7f7f7fff","luma":-0.1,"out":{"hex":"#c10000ff","u16":[49714,0,0,65535]}}, +{"chroma":-1,"in":"#7f7f7fff","luma":0,"out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"chroma":0,"in":"#7f7f7fff","luma":0,"out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"chroma":0.5,"in":"#7f7f7fff","luma":0,"out":{"hex":"#cb5d5dff","u16":[52265,24019,24019,65535]}}, +{"chroma":1,"in":"#7f7f7fff","luma":0,"out":{"hex":"#ff1515ff","u16":[65535,5339,5339,65535]}}, +{"chroma":-1,"in":"#7f7f7fff","luma":0.1,"out":{"hex":"#979797ff","u16":[38807,38807,38807,65535]}}, +{"chroma":0,"in":"#7f7f7fff","luma":0.1,"out":{"hex":"#979797ff","u16":[38807,38807,38807,65535]}}, +{"chroma":0.5,"in":"#7f7f7fff","luma":0.1,"out":{"hex":"#d38181ff","u16":[54177,33158,33158,65535]}}, +{"chroma":1,"in":"#7f7f7fff","luma":0.1,"out":{"hex":"#ff6565ff","u16":[65535,26017,26017,65535]}}, +{"chroma":-1,"in":"#7f7f7fff","luma":0.5,"out":{"hex":"#dbdbdbff","u16":[56294,56294,56294,65535]}}, +{"chroma":0,"in":"#7f7f7fff","luma":0.5,"out":{"hex":"#dbdbdbff","u16":[56294,56294,56294,65535]}}, +{"chroma":0.5,"in":"#7f7f7fff","luma":0.5,"out":{"hex":"#eed6d6ff","u16":[61124,54901,54901,65535]}}, +{"chroma":1,"in":"#7f7f7fff","luma":0.5,"out":{"hex":"#ffd0d0ff","u16":[65535,53465,53465,65535]}}, +{"chroma":-1,"in":"#7f7f7fff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#7f7f7fff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#7f7f7fff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#7f7f7fff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#7f7f7fff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#7f7f7fff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#7f7f7fff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#7f7f7fff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#808080ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#808080ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#808080ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#808080ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#808080ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#808080ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#808080ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#808080ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#808080ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#808080ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#808080ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#808080ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#808080ff","luma":-0.1,"out":{"hex":"#616161ff","u16":[24953,24953,24953,65535]}}, +{"chroma":0,"in":"#808080ff","luma":-0.1,"out":{"hex":"#616161ff","u16":[24953,24953,24953,65535]}}, +{"chroma":0.5,"in":"#808080ff","luma":-0.1,"out":{"hex":"#9c4747ff","u16":[40179,18209,18209,65535]}}, +{"chroma":1,"in":"#808080ff","luma":-0.1,"out":{"hex":"#c40000ff","u16":[50441,0,0,65535]}}, +{"chroma":-1,"in":"#808080ff","luma":0,"out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"chroma":0,"in":"#808080ff","luma":0,"out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"chroma":0.5,"in":"#808080ff","luma":0,"out":{"hex":"#cc5f5fff","u16":[52338,24438,24438,65535]}}, +{"chroma":1,"in":"#808080ff","luma":0,"out":{"hex":"#ff1e1eff","u16":[65535,7619,7619,65535]}}, +{"chroma":-1,"in":"#808080ff","luma":0.1,"out":{"hex":"#989898ff","u16":[39016,39016,39016,65535]}}, +{"chroma":0,"in":"#808080ff","luma":0.1,"out":{"hex":"#989898ff","u16":[39016,39016,39016,65535]}}, +{"chroma":0.5,"in":"#808080ff","luma":0.1,"out":{"hex":"#d38282ff","u16":[54247,33445,33445,65535]}}, +{"chroma":1,"in":"#808080ff","luma":0.1,"out":{"hex":"#ff6767ff","u16":[65535,26444,26444,65535]}}, +{"chroma":-1,"in":"#808080ff","luma":0.5,"out":{"hex":"#dcdcdcff","u16":[56428,56428,56428,65535]}}, +{"chroma":0,"in":"#808080ff","luma":0.5,"out":{"hex":"#dcdcdcff","u16":[56428,56428,56428,65535]}}, +{"chroma":0.5,"in":"#808080ff","luma":0.5,"out":{"hex":"#eed6d6ff","u16":[61185,55058,55058,65535]}}, +{"chroma":1,"in":"#808080ff","luma":0.5,"out":{"hex":"#ffd1d1ff","u16":[65535,53646,53646,65535]}}, +{"chroma":-1,"in":"#808080ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#808080ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#808080ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#808080ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#808080ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#808080ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#808080ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#808080ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#818181ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#818181ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#818181ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#818181ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#818181ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#818181ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#818181ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#818181ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#818181ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#818181ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#818181ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#818181ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#818181ff","luma":-0.1,"out":{"hex":"#626262ff","u16":[25310,25310,25310,65535]}}, +{"chroma":0,"in":"#818181ff","luma":-0.1,"out":{"hex":"#626262ff","u16":[25310,25310,25310,65535]}}, +{"chroma":0.5,"in":"#818181ff","luma":-0.1,"out":{"hex":"#9f4848ff","u16":[40754,18470,18470,65535]}}, +{"chroma":1,"in":"#818181ff","luma":-0.1,"out":{"hex":"#c70000ff","u16":[51162,0,0,65535]}}, +{"chroma":-1,"in":"#818181ff","luma":0,"out":{"hex":"#818181ff","u16":[33153,33153,33153,65535]}}, +{"chroma":0,"in":"#818181ff","luma":0,"out":{"hex":"#818181ff","u16":[33153,33153,33153,65535]}}, +{"chroma":0.5,"in":"#818181ff","luma":0,"out":{"hex":"#cc6161ff","u16":[52412,24852,24852,65535]}}, +{"chroma":1,"in":"#818181ff","luma":0,"out":{"hex":"#ff2424ff","u16":[65535,9292,9292,65535]}}, +{"chroma":-1,"in":"#818181ff","luma":0.1,"out":{"hex":"#999999ff","u16":[39226,39226,39226,65535]}}, +{"chroma":0,"in":"#818181ff","luma":0.1,"out":{"hex":"#999999ff","u16":[39226,39226,39226,65535]}}, +{"chroma":0.5,"in":"#818181ff","luma":0.1,"out":{"hex":"#d38383ff","u16":[54318,33730,33730,65535]}}, +{"chroma":1,"in":"#818181ff","luma":0.1,"out":{"hex":"#ff6969ff","u16":[65535,26866,26866,65535]}}, +{"chroma":-1,"in":"#818181ff","luma":0.5,"out":{"hex":"#dcdcdcff","u16":[56563,56563,56563,65535]}}, +{"chroma":0,"in":"#818181ff","luma":0.5,"out":{"hex":"#dcdcdcff","u16":[56563,56563,56563,65535]}}, +{"chroma":0.5,"in":"#818181ff","luma":0.5,"out":{"hex":"#eed7d7ff","u16":[61246,55216,55216,65535]}}, +{"chroma":1,"in":"#818181ff","luma":0.5,"out":{"hex":"#ffd1d1ff","u16":[65535,53828,53828,65535]}}, +{"chroma":-1,"in":"#818181ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#818181ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#818181ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#818181ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#818181ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#818181ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#818181ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#818181ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#bfbfbfff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#bfbfbfff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#bfbfbfff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#bfbfbfff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#bfbfbfff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#bfbfbfff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#bfbfbfff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#bfbfbfff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#bfbfbfff","luma":-0.5,"out":{"hex":"#333333ff","u16":[13216,13216,13216,65535]}}, +{"chroma":0,"in":"#bfbfbfff","luma":-0.5,"out":{"hex":"#333333ff","u16":[13216,13216,13216,65535]}}, +{"chroma":0.5,"in":"#bfbfbfff","luma":-0.5,"out":{"hex":"#532626ff","u16":[21280,9644,9644,65535]}}, +{"chroma":1,"in":"#bfbfbfff","luma":-0.5,"out":{"hex":"#680000ff","u16":[26714,0,0,65535]}}, +{"chroma":-1,"in":"#bfbfbfff","luma":-0.1,"out":{"hex":"#aeaeaeff","u16":[44632,44632,44632,65535]}}, +{"chroma":0,"in":"#bfbfbfff","luma":-0.1,"out":{"hex":"#aeaeaeff","u16":[44632,44632,44632,65535]}}, +{"chroma":0.5,"in":"#bfbfbfff","luma":-0.1,"out":{"hex":"#db9f9fff","u16":[56258,40798,40798,65535]}}, +{"chroma":1,"in":"#bfbfbfff","luma":-0.1,"out":{"hex":"#ff8e8eff","u16":[65535,36474,36474,65535]}}, +{"chroma":-1,"in":"#bfbfbfff","luma":0,"out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]}}, +{"chroma":0,"in":"#bfbfbfff","luma":0,"out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]}}, +{"chroma":0.5,"in":"#bfbfbfff","luma":0,"out":{"hex":"#e2b4b4ff","u16":[58014,46317,46317,65535]}}, +{"chroma":1,"in":"#bfbfbfff","luma":0,"out":{"hex":"#ffa9a9ff","u16":[65535,43333,43333,65535]}}, +{"chroma":-1,"in":"#bfbfbfff","luma":0.1,"out":{"hex":"#cfcfcfff","u16":[53103,53103,53103,65535]}}, +{"chroma":0,"in":"#bfbfbfff","luma":0.1,"out":{"hex":"#cfcfcfff","u16":[53103,53103,53103,65535]}}, +{"chroma":0.5,"in":"#bfbfbfff","luma":0.1,"out":{"hex":"#e8c7c7ff","u16":[59708,51141,51141,65535]}}, +{"chroma":1,"in":"#bfbfbfff","luma":0.1,"out":{"hex":"#ffbfbfff","u16":[65535,49086,49086,65535]}}, +{"chroma":-1,"in":"#bfbfbfff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#bfbfbfff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#bfbfbfff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#bfbfbfff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#bfbfbfff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#bfbfbfff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#bfbfbfff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#bfbfbfff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#bfbfbfff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#bfbfbfff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#bfbfbfff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#bfbfbfff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#c0c0c0ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#c0c0c0ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#c0c0c0ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#c0c0c0ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#c0c0c0ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#c0c0c0ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#c0c0c0ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#c0c0c0ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#c0c0c0ff","luma":-0.5,"out":{"hex":"#383838ff","u16":[14397,14397,14397,65535]}}, +{"chroma":0,"in":"#c0c0c0ff","luma":-0.5,"out":{"hex":"#383838ff","u16":[14397,14397,14397,65535]}}, +{"chroma":0.5,"in":"#c0c0c0ff","luma":-0.5,"out":{"hex":"#5a2929ff","u16":[23182,10506,10506,65535]}}, +{"chroma":1,"in":"#c0c0c0ff","luma":-0.5,"out":{"hex":"#710000ff","u16":[29102,0,0,65535]}}, +{"chroma":-1,"in":"#c0c0c0ff","luma":-0.1,"out":{"hex":"#afafafff","u16":[44920,44920,44920,65535]}}, +{"chroma":0,"in":"#c0c0c0ff","luma":-0.1,"out":{"hex":"#afafafff","u16":[44920,44920,44920,65535]}}, +{"chroma":0.5,"in":"#c0c0c0ff","luma":-0.1,"out":{"hex":"#dba0a0ff","u16":[56367,41162,41162,65535]}}, +{"chroma":1,"in":"#c0c0c0ff","luma":-0.1,"out":{"hex":"#ff9090ff","u16":[65535,36938,36938,65535]}}, +{"chroma":-1,"in":"#c0c0c0ff","luma":0,"out":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]}}, +{"chroma":0,"in":"#c0c0c0ff","luma":0,"out":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]}}, +{"chroma":0.5,"in":"#c0c0c0ff","luma":0,"out":{"hex":"#e2b5b5ff","u16":[58119,46630,46630,65535]}}, +{"chroma":1,"in":"#c0c0c0ff","luma":0,"out":{"hex":"#ffaaaaff","u16":[65535,43711,43711,65535]}}, +{"chroma":-1,"in":"#c0c0c0ff","luma":0.1,"out":{"hex":"#d0d0d0ff","u16":[53336,53336,53336,65535]}}, +{"chroma":0,"in":"#c0c0c0ff","luma":0.1,"out":{"hex":"#d0d0d0ff","u16":[53336,53336,53336,65535]}}, +{"chroma":0.5,"in":"#c0c0c0ff","luma":0.1,"out":{"hex":"#e9c8c8ff","u16":[59810,51419,51419,65535]}}, +{"chroma":1,"in":"#c0c0c0ff","luma":0.1,"out":{"hex":"#ffc0c0ff","u16":[65535,49412,49412,65535]}}, +{"chroma":-1,"in":"#c0c0c0ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#c0c0c0ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#c0c0c0ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#c0c0c0ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#c0c0c0ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#c0c0c0ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#c0c0c0ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#c0c0c0ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#c0c0c0ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#c0c0c0ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#c0c0c0ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#c0c0c0ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fdfdfdff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#fdfdfdff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#fdfdfdff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#fdfdfdff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#fdfdfdff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#fdfdfdff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#fdfdfdff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#fdfdfdff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#fdfdfdff","luma":-0.5,"out":{"hex":"#b7b7b7ff","u16":[47070,47070,47070,65535]}}, +{"chroma":0,"in":"#fdfdfdff","luma":-0.5,"out":{"hex":"#b7b7b7ff","u16":[47070,47070,47070,65535]}}, +{"chroma":0.5,"in":"#fdfdfdff","luma":-0.5,"out":{"hex":"#dfababff","u16":[57202,43844,43844,65535]}}, +{"chroma":1,"in":"#fdfdfdff","luma":-0.5,"out":{"hex":"#ff9d9dff","u16":[65535,40304,40304,65535]}}, +{"chroma":-1,"in":"#fdfdfdff","luma":-0.1,"out":{"hex":"#f1f1f1ff","u16":[61926,61926,61926,65535]}}, +{"chroma":0,"in":"#fdfdfdff","luma":-0.1,"out":{"hex":"#f1f1f1ff","u16":[61926,61926,61926,65535]}}, +{"chroma":0.5,"in":"#fdfdfdff","luma":-0.1,"out":{"hex":"#f8efefff","u16":[63761,61419,61419,65535]}}, +{"chroma":1,"in":"#fdfdfdff","luma":-0.1,"out":{"hex":"#ffededff","u16":[65535,60907,60907,65535]}}, +{"chroma":-1,"in":"#fdfdfdff","luma":0,"out":{"hex":"#fdfdfdff","u16":[65021,65021,65021,65535]}}, +{"chroma":0,"in":"#fdfdfdff","luma":0,"out":{"hex":"#fdfdfdff","u16":[65021,65021,65021,65535]}}, +{"chroma":0.5,"in":"#fdfdfdff","luma":0,"out":{"hex":"#fefdfdff","u16":[65279,64951,64951,65535]}}, +{"chroma":1,"in":"#fdfdfdff","luma":0,"out":{"hex":"#fffcfcff","u16":[65535,64881,64881,65535]}}, +{"chroma":-1,"in":"#fdfdfdff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fdfdfdff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fdfdfdff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fdfdfdff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fdfdfdff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fdfdfdff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fdfdfdff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fdfdfdff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fdfdfdff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fdfdfdff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fdfdfdff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fdfdfdff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fdfdfdff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fdfdfdff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fdfdfdff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fdfdfdff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fefefeff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#fefefeff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#fefefeff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#fefefeff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#fefefeff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#fefefeff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#fefefeff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#fefefeff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#fefefeff","luma":-0.5,"out":{"hex":"#b9b9b9ff","u16":[47448,47448,47448,65535]}}, +{"chroma":0,"in":"#fefefeff","luma":-0.5,"out":{"hex":"#b9b9b9ff","u16":[47448,47448,47448,65535]}}, +{"chroma":0.5,"in":"#fefefeff","luma":-0.5,"out":{"hex":"#dfacacff","u16":[57352,44310,44310,65535]}}, +{"chroma":1,"in":"#fefefeff","luma":-0.5,"out":{"hex":"#ff9f9fff","u16":[65535,40880,40880,65535]}}, +{"chroma":-1,"in":"#fefefeff","luma":-0.1,"out":{"hex":"#f2f2f2ff","u16":[62198,62198,62198,65535]}}, +{"chroma":0,"in":"#fefefeff","luma":-0.1,"out":{"hex":"#f2f2f2ff","u16":[62198,62198,62198,65535]}}, +{"chroma":0.5,"in":"#fefefeff","luma":-0.1,"out":{"hex":"#f9f0f0ff","u16":[63893,61731,61731,65535]}}, +{"chroma":1,"in":"#fefefeff","luma":-0.1,"out":{"hex":"#ffeeeeff","u16":[65535,61260,61260,65535]}}, +{"chroma":-1,"in":"#fefefeff","luma":0,"out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]}}, +{"chroma":0,"in":"#fefefeff","luma":0,"out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]}}, +{"chroma":0.5,"in":"#fefefeff","luma":0,"out":{"hex":"#fffefeff","u16":[65407,65243,65243,65535]}}, +{"chroma":1,"in":"#fefefeff","luma":0,"out":{"hex":"#fffefeff","u16":[65535,65208,65208,65535]}}, +{"chroma":-1,"in":"#fefefeff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fefefeff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fefefeff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fefefeff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fefefeff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fefefeff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fefefeff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fefefeff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fefefeff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fefefeff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fefefeff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fefefeff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fefefeff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fefefeff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fefefeff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fefefeff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#ff0000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#ff0000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#ff0000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#ff0000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#ff0000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#ff0000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#ff0000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#ff0000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#ff0000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#ff0000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#ff0000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#ff0000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#ff0000ff","luma":-0.1,"out":{"hex":"#5e5e5eff","u16":[24286,24286,24286,65535]}}, +{"chroma":0,"in":"#ff0000ff","luma":-0.1,"out":{"hex":"#bf0000ff","u16":[49092,0,0,65535]}}, +{"chroma":0.5,"in":"#ff0000ff","luma":-0.1,"out":{"hex":"#bf0000ff","u16":[49092,0,0,65535]}}, +{"chroma":1,"in":"#ff0000ff","luma":-0.1,"out":{"hex":"#bf0000ff","u16":[49092,0,0,65535]}}, +{"chroma":-1,"in":"#ff0000ff","luma":0,"out":{"hex":"#7e7e7eff","u16":[32421,32421,32421,65535]}}, +{"chroma":0,"in":"#ff0000ff","luma":0,"out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"chroma":0.5,"in":"#ff0000ff","luma":0,"out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"chroma":1,"in":"#ff0000ff","luma":0,"out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"chroma":-1,"in":"#ff0000ff","luma":0.1,"out":{"hex":"#969696ff","u16":[38630,38630,38630,65535]}}, +{"chroma":0,"in":"#ff0000ff","luma":0.1,"out":{"hex":"#ff6464ff","u16":[65535,25651,25651,65535]}}, +{"chroma":0.5,"in":"#ff0000ff","luma":0.1,"out":{"hex":"#ff6464ff","u16":[65535,25651,25651,65535]}}, +{"chroma":1,"in":"#ff0000ff","luma":0.1,"out":{"hex":"#ff6464ff","u16":[65535,25651,25651,65535]}}, +{"chroma":-1,"in":"#ff0000ff","luma":0.5,"out":{"hex":"#dbdbdbff","u16":[56180,56180,56180,65535]}}, +{"chroma":0,"in":"#ff0000ff","luma":0.5,"out":{"hex":"#ffcfcfff","u16":[65535,53312,53312,65535]}}, +{"chroma":0.5,"in":"#ff0000ff","luma":0.5,"out":{"hex":"#ffcfcfff","u16":[65535,53312,53312,65535]}}, +{"chroma":1,"in":"#ff0000ff","luma":0.5,"out":{"hex":"#ffcfcfff","u16":[65535,53312,53312,65535]}}, +{"chroma":-1,"in":"#ff0000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#ff0000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#ff0000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#ff0000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#ff0000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#ff0000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#ff0000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#ff0000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#00ff00ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#00ff00ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#00ff00ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#00ff00ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#00ff00ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#00ff00ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#00ff00ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#00ff00ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#00ff00ff","luma":-0.5,"out":{"hex":"#7f7f7fff","u16":[32600,32600,32600,65535]}}, +{"chroma":0,"in":"#00ff00ff","luma":-0.5,"out":{"hex":"#009400ff","u16":[0,37966,0,65535]}}, +{"chroma":0.5,"in":"#00ff00ff","luma":-0.5,"out":{"hex":"#009400ff","u16":[0,37966,0,65535]}}, +{"chroma":1,"in":"#00ff00ff","luma":-0.5,"out":{"hex":"#009400ff","u16":[0,37966,0,65535]}}, +{"chroma":-1,"in":"#00ff00ff","luma":-0.1,"out":{"hex":"#ccccccff","u16":[52550,52550,52550,65535]}}, +{"chroma":0,"in":"#00ff00ff","luma":-0.1,"out":{"hex":"#00ee00ff","u16":[0,61199,0,65535]}}, +{"chroma":0.5,"in":"#00ff00ff","luma":-0.1,"out":{"hex":"#00ee00ff","u16":[0,61199,0,65535]}}, +{"chroma":1,"in":"#00ff00ff","luma":-0.1,"out":{"hex":"#00ee00ff","u16":[0,61199,0,65535]}}, +{"chroma":-1,"in":"#00ff00ff","luma":0,"out":{"hex":"#dbdbdbff","u16":[56274,56274,56274,65535]}}, +{"chroma":0,"in":"#00ff00ff","luma":0,"out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"chroma":0.5,"in":"#00ff00ff","luma":0,"out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"chroma":1,"in":"#00ff00ff","luma":0,"out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"chroma":-1,"in":"#00ff00ff","luma":0.1,"out":{"hex":"#e8e8e8ff","u16":[59723,59723,59723,65535]}}, +{"chroma":0,"in":"#00ff00ff","luma":0.1,"out":{"hex":"#9eff9eff","u16":[40725,65535,40725,65535]}}, +{"chroma":0.5,"in":"#00ff00ff","luma":0.1,"out":{"hex":"#9eff9eff","u16":[40725,65535,40725,65535]}}, +{"chroma":1,"in":"#00ff00ff","luma":0.1,"out":{"hex":"#9eff9eff","u16":[40725,65535,40725,65535]}}, +{"chroma":-1,"in":"#00ff00ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#00ff00ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#00ff00ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#00ff00ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#00ff00ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#00ff00ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#00ff00ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#00ff00ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#00ff00ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#00ff00ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#00ff00ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#00ff00ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#0000ffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#0000ffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#0000ffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#0000ffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#0000ffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#0000ffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#0000ffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#0000ffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#0000ffff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#0000ffff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#0000ffff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#0000ffff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#0000ffff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#0000ffff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#0000ffff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#0000ffff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#0000ffff","luma":0,"out":{"hex":"#4d4d4dff","u16":[19844,19844,19844,65535]}}, +{"chroma":0,"in":"#0000ffff","luma":0,"out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"chroma":0.5,"in":"#0000ffff","luma":0,"out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"chroma":1,"in":"#0000ffff","luma":0,"out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"chroma":-1,"in":"#0000ffff","luma":0.1,"out":{"hex":"#737373ff","u16":[29459,29459,29459,65535]}}, +{"chroma":0,"in":"#0000ffff","luma":0.1,"out":{"hex":"#5d5dffff","u16":[23808,23808,65535,65535]}}, +{"chroma":0.5,"in":"#0000ffff","luma":0.1,"out":{"hex":"#5d5dffff","u16":[23808,23808,65535,65535]}}, +{"chroma":1,"in":"#0000ffff","luma":0.1,"out":{"hex":"#5d5dffff","u16":[23808,23808,65535,65535]}}, +{"chroma":-1,"in":"#0000ffff","luma":0.5,"out":{"hex":"#c6c6c6ff","u16":[50847,50847,50847,65535]}}, +{"chroma":0,"in":"#0000ffff","luma":0.5,"out":{"hex":"#c1c1ffff","u16":[49481,49481,65535,65535]}}, +{"chroma":0.5,"in":"#0000ffff","luma":0.5,"out":{"hex":"#c1c1ffff","u16":[49481,49481,65535,65535]}}, +{"chroma":1,"in":"#0000ffff","luma":0.5,"out":{"hex":"#c1c1ffff","u16":[49481,49481,65535,65535]}}, +{"chroma":-1,"in":"#0000ffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#0000ffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#0000ffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#0000ffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#0000ffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#0000ffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#0000ffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#0000ffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#ffff00ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#ffff00ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#ffff00ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#ffff00ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#ffff00ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#ffff00ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#ffff00ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#ffff00ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#ffff00ff","luma":-0.5,"out":{"hex":"#adadadff","u16":[44551,44551,44551,65535]}}, +{"chroma":0,"in":"#ffff00ff","luma":-0.5,"out":{"hex":"#b3b300ff","u16":[46094,46094,0,65535]}}, +{"chroma":0.5,"in":"#ffff00ff","luma":-0.5,"out":{"hex":"#b3b300ff","u16":[46094,46094,0,65535]}}, +{"chroma":1,"in":"#ffff00ff","luma":-0.5,"out":{"hex":"#b3b300ff","u16":[46094,46094,0,65535]}}, +{"chroma":-1,"in":"#ffff00ff","luma":-0.1,"out":{"hex":"#eaeaeaff","u16":[60140,60140,60140,65535]}}, +{"chroma":0,"in":"#ffff00ff","luma":-0.1,"out":{"hex":"#f2f200ff","u16":[62224,62224,0,65535]}}, +{"chroma":0.5,"in":"#ffff00ff","luma":-0.1,"out":{"hex":"#f2f200ff","u16":[62224,62224,0,65535]}}, +{"chroma":1,"in":"#ffff00ff","luma":-0.1,"out":{"hex":"#f2f200ff","u16":[62224,62224,0,65535]}}, +{"chroma":-1,"in":"#ffff00ff","luma":0,"out":{"hex":"#f6f6f6ff","u16":[63340,63340,63340,65535]}}, +{"chroma":0,"in":"#ffff00ff","luma":0,"out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"chroma":0.5,"in":"#ffff00ff","luma":0,"out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"chroma":1,"in":"#ffff00ff","luma":0,"out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"chroma":-1,"in":"#ffff00ff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#ffff00ff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#ffff00ff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#ffff00ff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#ffff00ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#ffff00ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#ffff00ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#ffff00ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#ffff00ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#ffff00ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#ffff00ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#ffff00ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#ffff00ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#ffff00ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#ffff00ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#ffff00ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#00ffffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#00ffffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#00ffffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#00ffffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#00ffffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#00ffffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#00ffffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#00ffffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#00ffffff","luma":-0.5,"out":{"hex":"#919191ff","u16":[37182,37182,37182,65535]}}, +{"chroma":0,"in":"#00ffffff","luma":-0.5,"out":{"hex":"#00a1a1ff","u16":[0,41449,41449,65535]}}, +{"chroma":0.5,"in":"#00ffffff","luma":-0.5,"out":{"hex":"#00a1a1ff","u16":[0,41449,41449,65535]}}, +{"chroma":1,"in":"#00ffffff","luma":-0.5,"out":{"hex":"#00a1a1ff","u16":[0,41449,41449,65535]}}, +{"chroma":-1,"in":"#00ffffff","luma":-0.1,"out":{"hex":"#d7d7d7ff","u16":[55268,55268,55268,65535]}}, +{"chroma":0,"in":"#00ffffff","luma":-0.1,"out":{"hex":"#00f0f0ff","u16":[0,61611,61611,65535]}}, +{"chroma":0.5,"in":"#00ffffff","luma":-0.1,"out":{"hex":"#00f0f0ff","u16":[0,61611,61611,65535]}}, +{"chroma":1,"in":"#00ffffff","luma":-0.1,"out":{"hex":"#00f0f0ff","u16":[0,61611,61611,65535]}}, +{"chroma":-1,"in":"#00ffffff","luma":0,"out":{"hex":"#e5e5e5ff","u16":[58788,58788,58788,65535]}}, +{"chroma":0,"in":"#00ffffff","luma":0,"out":{"hex":"#00ffffff","u16":[0,65535,65535,65535]}}, +{"chroma":0.5,"in":"#00ffffff","luma":0,"out":{"hex":"#00ffffff","u16":[0,65535,65535,65535]}}, +{"chroma":1,"in":"#00ffffff","luma":0,"out":{"hex":"#00ffffff","u16":[0,65535,65535,65535]}}, +{"chroma":-1,"in":"#00ffffff","luma":0.1,"out":{"hex":"#f2f2f2ff","u16":[62071,62071,62071,65535]}}, +{"chroma":0,"in":"#00ffffff","luma":0.1,"out":{"hex":"#b5ffffff","u16":[46514,65535,65535,65535]}}, +{"chroma":0.5,"in":"#00ffffff","luma":0.1,"out":{"hex":"#b5ffffff","u16":[46514,65535,65535,65535]}}, +{"chroma":1,"in":"#00ffffff","luma":0.1,"out":{"hex":"#b5ffffff","u16":[46514,65535,65535,65535]}}, +{"chroma":-1,"in":"#00ffffff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#00ffffff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#00ffffff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#00ffffff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#00ffffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#00ffffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#00ffffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#00ffffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#00ffffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#00ffffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#00ffffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#00ffffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#ff00ffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#ff00ffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#ff00ffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#ff00ffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#ff00ffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#ff00ffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#ff00ffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#ff00ffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#ff00ffff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#ff00ffff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#ff00ffff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#ff00ffff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#ff00ffff","luma":-0.1,"out":{"hex":"#767676ff","u16":[30420,30420,30420,65535]}}, +{"chroma":0,"in":"#ff00ffff","luma":-0.1,"out":{"hex":"#d100d1ff","u16":[53838,0,53838,65535]}}, +{"chroma":0.5,"in":"#ff00ffff","luma":-0.1,"out":{"hex":"#d100d1ff","u16":[53838,0,53838,65535]}}, +{"chroma":1,"in":"#ff00ffff","luma":-0.1,"out":{"hex":"#d100d1ff","u16":[53838,0,53838,65535]}}, +{"chroma":-1,"in":"#ff00ffff","luma":0,"out":{"hex":"#909090ff","u16":[37029,37029,37029,65535]}}, +{"chroma":0,"in":"#ff00ffff","luma":0,"out":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]}}, +{"chroma":0.5,"in":"#ff00ffff","luma":0,"out":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]}}, +{"chroma":1,"in":"#ff00ffff","luma":0,"out":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]}}, +{"chroma":-1,"in":"#ff00ffff","luma":0.1,"out":{"hex":"#a5a5a5ff","u16":[42456,42456,42456,65535]}}, +{"chroma":0,"in":"#ff00ffff","luma":0.1,"out":{"hex":"#ff68ffff","u16":[65535,26798,65535,65535]}}, +{"chroma":0.5,"in":"#ff00ffff","luma":0.1,"out":{"hex":"#ff68ffff","u16":[65535,26798,65535,65535]}}, +{"chroma":1,"in":"#ff00ffff","luma":0.1,"out":{"hex":"#ff68ffff","u16":[65535,26798,65535,65535]}}, +{"chroma":-1,"in":"#ff00ffff","luma":0.5,"out":{"hex":"#e4e4e4ff","u16":[58700,58700,58700,65535]}}, +{"chroma":0,"in":"#ff00ffff","luma":0.5,"out":{"hex":"#ffd9ffff","u16":[65535,55694,65535,65535]}}, +{"chroma":0.5,"in":"#ff00ffff","luma":0.5,"out":{"hex":"#ffd9ffff","u16":[65535,55694,65535,65535]}}, +{"chroma":1,"in":"#ff00ffff","luma":0.5,"out":{"hex":"#ffd9ffff","u16":[65535,55694,65535,65535]}}, +{"chroma":-1,"in":"#ff00ffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#ff00ffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#ff00ffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#ff00ffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#ff00ffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#ff00ffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#ff00ffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#ff00ffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#800000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#800000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#800000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#800000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#800000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#800000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#800000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#800000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#800000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#800000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#800000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#800000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#800000ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#800000ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#800000ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#800000ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#800000ff","luma":0,"out":{"hex":"#3f3f3fff","u16":[16274,16274,16274,65535]}}, +{"chroma":0,"in":"#800000ff","luma":0,"out":{"hex":"#800000ff","u16":[32896,0,0,65535]}}, +{"chroma":0.5,"in":"#800000ff","luma":0,"out":{"hex":"#800000ff","u16":[32896,0,0,65535]}}, +{"chroma":1,"in":"#800000ff","luma":0,"out":{"hex":"#800000ff","u16":[32896,0,0,65535]}}, +{"chroma":-1,"in":"#800000ff","luma":0.1,"out":{"hex":"#6b6b6bff","u16":[27387,27387,27387,65535]}}, +{"chroma":0,"in":"#800000ff","luma":0.1,"out":{"hex":"#d70000ff","u16":[55359,0,0,65535]}}, +{"chroma":0.5,"in":"#800000ff","luma":0.1,"out":{"hex":"#d70000ff","u16":[55359,0,0,65535]}}, +{"chroma":1,"in":"#800000ff","luma":0.1,"out":{"hex":"#d70000ff","u16":[55359,0,0,65535]}}, +{"chroma":-1,"in":"#800000ff","luma":0.5,"out":{"hex":"#c2c2c2ff","u16":[49803,49803,49803,65535]}}, +{"chroma":0,"in":"#800000ff","luma":0.5,"out":{"hex":"#ffadadff","u16":[65535,44383,44383,65535]}}, +{"chroma":0.5,"in":"#800000ff","luma":0.5,"out":{"hex":"#ffadadff","u16":[65535,44383,44383,65535]}}, +{"chroma":1,"in":"#800000ff","luma":0.5,"out":{"hex":"#ffadadff","u16":[65535,44383,44383,65535]}}, +{"chroma":-1,"in":"#800000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#800000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#800000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#800000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#800000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#800000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#800000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#800000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#008000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#008000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#008000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#008000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#008000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#008000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#008000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#008000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#008000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#008000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#008000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#008000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#008000ff","luma":-0.1,"out":{"hex":"#454545ff","u16":[17822,17822,17822,65535]}}, +{"chroma":0,"in":"#008000ff","luma":-0.1,"out":{"hex":"#005100ff","u16":[0,20755,0,65535]}}, +{"chroma":0.5,"in":"#008000ff","luma":-0.1,"out":{"hex":"#005100ff","u16":[0,20755,0,65535]}}, +{"chroma":1,"in":"#008000ff","luma":-0.1,"out":{"hex":"#005100ff","u16":[0,20755,0,65535]}}, +{"chroma":-1,"in":"#008000ff","luma":0,"out":{"hex":"#6e6e6eff","u16":[28247,28247,28247,65535]}}, +{"chroma":0,"in":"#008000ff","luma":0,"out":{"hex":"#008000ff","u16":[0,32896,0,65535]}}, +{"chroma":0.5,"in":"#008000ff","luma":0,"out":{"hex":"#008000ff","u16":[0,32896,0,65535]}}, +{"chroma":1,"in":"#008000ff","luma":0,"out":{"hex":"#008000ff","u16":[0,32896,0,65535]}}, +{"chroma":-1,"in":"#008000ff","luma":0.1,"out":{"hex":"#8a8a8aff","u16":[35340,35340,35340,65535]}}, +{"chroma":0,"in":"#008000ff","luma":0.1,"out":{"hex":"#00a000ff","u16":[0,41156,0,65535]}}, +{"chroma":0.5,"in":"#008000ff","luma":0.1,"out":{"hex":"#00a000ff","u16":[0,41156,0,65535]}}, +{"chroma":1,"in":"#008000ff","luma":0.1,"out":{"hex":"#00a000ff","u16":[0,41156,0,65535]}}, +{"chroma":-1,"in":"#008000ff","luma":0.5,"out":{"hex":"#d3d3d3ff","u16":[54144,54144,54144,65535]}}, +{"chroma":0,"in":"#008000ff","luma":0.5,"out":{"hex":"#00f500ff","u16":[0,63055,0,65535]}}, +{"chroma":0.5,"in":"#008000ff","luma":0.5,"out":{"hex":"#00f500ff","u16":[0,63055,0,65535]}}, +{"chroma":1,"in":"#008000ff","luma":0.5,"out":{"hex":"#00f500ff","u16":[0,63055,0,65535]}}, +{"chroma":-1,"in":"#008000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#008000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#008000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#008000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#008000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#008000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#008000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#008000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#000080ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#000080ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#000080ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#000080ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#000080ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#000080ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#000080ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#000080ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#000080ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#000080ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#000080ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#000080ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#000080ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#000080ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#000080ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#000080ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#000080ff","luma":0,"out":{"hex":"#272727ff","u16":[9961,9961,9961,65535]}}, +{"chroma":0,"in":"#000080ff","luma":0,"out":{"hex":"#000080ff","u16":[0,0,32896,65535]}}, +{"chroma":0.5,"in":"#000080ff","luma":0,"out":{"hex":"#000080ff","u16":[0,0,32896,65535]}}, +{"chroma":1,"in":"#000080ff","luma":0,"out":{"hex":"#000080ff","u16":[0,0,32896,65535]}}, +{"chroma":-1,"in":"#000080ff","luma":0.1,"out":{"hex":"#606060ff","u16":[24602,24602,24602,65535]}}, +{"chroma":0,"in":"#000080ff","luma":0.1,"out":{"hex":"#4040ffff","u16":[16333,16333,65535,65535]}}, +{"chroma":0.5,"in":"#000080ff","luma":0.1,"out":{"hex":"#4040ffff","u16":[16333,16333,65535,65535]}}, +{"chroma":1,"in":"#000080ff","luma":0.1,"out":{"hex":"#4040ffff","u16":[16333,16333,65535,65535]}}, +{"chroma":-1,"in":"#000080ff","luma":0.5,"out":{"hex":"#bdbdbdff","u16":[48507,48507,48507,65535]}}, +{"chroma":0,"in":"#000080ff","luma":0.5,"out":{"hex":"#b6b6ffff","u16":[46863,46863,65535,65535]}}, +{"chroma":0.5,"in":"#000080ff","luma":0.5,"out":{"hex":"#b6b6ffff","u16":[46863,46863,65535,65535]}}, +{"chroma":1,"in":"#000080ff","luma":0.5,"out":{"hex":"#b6b6ffff","u16":[46863,46863,65535,65535]}}, +{"chroma":-1,"in":"#000080ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#000080ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#000080ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#000080ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#000080ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#000080ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#000080ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#000080ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#ff8080ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#ff8080ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#ff8080ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#ff8080ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#ff8080ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#ff8080ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#ff8080ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#ff8080ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#ff8080ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#ff8080ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#ff8080ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#ff8080ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#ff8080ff","luma":-0.1,"out":{"hex":"#909090ff","u16":[37067,37067,37067,65535]}}, +{"chroma":0,"in":"#ff8080ff","luma":-0.1,"out":{"hex":"#ff5656ff","u16":[65535,22212,22212,65535]}}, +{"chroma":0.5,"in":"#ff8080ff","luma":-0.1,"out":{"hex":"#ff5656ff","u16":[65535,22212,22212,65535]}}, +{"chroma":1,"in":"#ff8080ff","luma":-0.1,"out":{"hex":"#ff5656ff","u16":[65535,22212,22212,65535]}}, +{"chroma":-1,"in":"#ff8080ff","luma":0,"out":{"hex":"#a5a5a5ff","u16":[42489,42489,42489,65535]}}, +{"chroma":0,"in":"#ff8080ff","luma":0,"out":{"hex":"#ff8080ff","u16":[65535,32896,32896,65535]}}, +{"chroma":0.5,"in":"#ff8080ff","luma":0,"out":{"hex":"#ff8080ff","u16":[65535,32896,32896,65535]}}, +{"chroma":1,"in":"#ff8080ff","luma":0,"out":{"hex":"#ff8080ff","u16":[65535,32896,32896,65535]}}, +{"chroma":-1,"in":"#ff8080ff","luma":0.1,"out":{"hex":"#b8b8b8ff","u16":[47186,47186,47186,65535]}}, +{"chroma":0,"in":"#ff8080ff","luma":0.1,"out":{"hex":"#ff9e9eff","u16":[65535,40482,40482,65535]}}, +{"chroma":0.5,"in":"#ff8080ff","luma":0.1,"out":{"hex":"#ff9e9eff","u16":[65535,40482,40482,65535]}}, +{"chroma":1,"in":"#ff8080ff","luma":0.1,"out":{"hex":"#ff9e9eff","u16":[65535,40482,40482,65535]}}, +{"chroma":-1,"in":"#ff8080ff","luma":0.5,"out":{"hex":"#f1f1f1ff","u16":[62009,62009,62009,65535]}}, +{"chroma":0,"in":"#ff8080ff","luma":0.5,"out":{"hex":"#ffededff","u16":[65535,61015,61015,65535]}}, +{"chroma":0.5,"in":"#ff8080ff","luma":0.5,"out":{"hex":"#ffededff","u16":[65535,61015,61015,65535]}}, +{"chroma":1,"in":"#ff8080ff","luma":0.5,"out":{"hex":"#ffededff","u16":[65535,61015,61015,65535]}}, +{"chroma":-1,"in":"#ff8080ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#ff8080ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#ff8080ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#ff8080ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#ff8080ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#ff8080ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#ff8080ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#ff8080ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#80ff80ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#80ff80ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#80ff80ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#80ff80ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#80ff80ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#80ff80ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#80ff80ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#80ff80ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#80ff80ff","luma":-0.5,"out":{"hex":"#8e8e8eff","u16":[36607,36607,36607,65535]}}, +{"chroma":0,"in":"#80ff80ff","luma":-0.5,"out":{"hex":"#00a600ff","u16":[0,42632,0,65535]}}, +{"chroma":0.5,"in":"#80ff80ff","luma":-0.5,"out":{"hex":"#00a600ff","u16":[0,42632,0,65535]}}, +{"chroma":1,"in":"#80ff80ff","luma":-0.5,"out":{"hex":"#00a600ff","u16":[0,42632,0,65535]}}, +{"chroma":-1,"in":"#80ff80ff","luma":-0.1,"out":{"hex":"#d6d6d6ff","u16":[54913,54913,54913,65535]}}, +{"chroma":0,"in":"#80ff80ff","luma":-0.1,"out":{"hex":"#00f900ff","u16":[0,63951,0,65535]}}, +{"chroma":0.5,"in":"#80ff80ff","luma":-0.1,"out":{"hex":"#00f900ff","u16":[0,63951,0,65535]}}, +{"chroma":1,"in":"#80ff80ff","luma":-0.1,"out":{"hex":"#00f900ff","u16":[0,63951,0,65535]}}, +{"chroma":-1,"in":"#80ff80ff","luma":0,"out":{"hex":"#e3e3e3ff","u16":[58458,58458,58458,65535]}}, +{"chroma":0,"in":"#80ff80ff","luma":0,"out":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]}}, +{"chroma":0.5,"in":"#80ff80ff","luma":0,"out":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]}}, +{"chroma":1,"in":"#80ff80ff","luma":0,"out":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]}}, +{"chroma":-1,"in":"#80ff80ff","luma":0.1,"out":{"hex":"#f0f0f0ff","u16":[61763,61763,61763,65535]}}, +{"chroma":0,"in":"#80ff80ff","luma":0.1,"out":{"hex":"#c6ffc6ff","u16":[50784,65535,50784,65535]}}, +{"chroma":0.5,"in":"#80ff80ff","luma":0.1,"out":{"hex":"#c6ffc6ff","u16":[50784,65535,50784,65535]}}, +{"chroma":1,"in":"#80ff80ff","luma":0.1,"out":{"hex":"#c6ffc6ff","u16":[50784,65535,50784,65535]}}, +{"chroma":-1,"in":"#80ff80ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#80ff80ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#80ff80ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#80ff80ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#80ff80ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#80ff80ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#80ff80ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#80ff80ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#80ff80ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#80ff80ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#80ff80ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#80ff80ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#8080ffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#8080ffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#8080ffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#8080ffff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#8080ffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#8080ffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#8080ffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#8080ffff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#8080ffff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#8080ffff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#8080ffff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#8080ffff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#8080ffff","luma":-0.1,"out":{"hex":"#747474ff","u16":[29743,29743,29743,65535]}}, +{"chroma":0,"in":"#8080ffff","luma":-0.1,"out":{"hex":"#5e5effff","u16":[24201,24201,65535,65535]}}, +{"chroma":0.5,"in":"#8080ffff","luma":-0.1,"out":{"hex":"#5e5effff","u16":[24201,24201,65535,65535]}}, +{"chroma":1,"in":"#8080ffff","luma":-0.1,"out":{"hex":"#5e5effff","u16":[24201,24201,65535,65535]}}, +{"chroma":-1,"in":"#8080ffff","luma":0,"out":{"hex":"#8e8e8eff","u16":[36496,36496,36496,65535]}}, +{"chroma":0,"in":"#8080ffff","luma":0,"out":{"hex":"#8080ffff","u16":[32896,32896,65535,65535]}}, +{"chroma":0.5,"in":"#8080ffff","luma":0,"out":{"hex":"#8080ffff","u16":[32896,32896,65535,65535]}}, +{"chroma":1,"in":"#8080ffff","luma":0,"out":{"hex":"#8080ffff","u16":[32896,32896,65535,65535]}}, +{"chroma":-1,"in":"#8080ffff","luma":0.1,"out":{"hex":"#a3a3a3ff","u16":[42006,42006,42006,65535]}}, +{"chroma":0,"in":"#8080ffff","luma":0.1,"out":{"hex":"#9999ffff","u16":[39445,39445,65535,65535]}}, +{"chroma":0.5,"in":"#8080ffff","luma":0.1,"out":{"hex":"#9999ffff","u16":[39445,39445,65535,65535]}}, +{"chroma":1,"in":"#8080ffff","luma":0.1,"out":{"hex":"#9999ffff","u16":[39445,39445,65535,65535]}}, +{"chroma":-1,"in":"#8080ffff","luma":0.5,"out":{"hex":"#e3e3e3ff","u16":[58395,58395,58395,65535]}}, +{"chroma":0,"in":"#8080ffff","luma":0.5,"out":{"hex":"#e1e1ffff","u16":[57795,57795,65535,65535]}}, +{"chroma":0.5,"in":"#8080ffff","luma":0.5,"out":{"hex":"#e1e1ffff","u16":[57795,57795,65535,65535]}}, +{"chroma":1,"in":"#8080ffff","luma":0.5,"out":{"hex":"#e1e1ffff","u16":[57795,57795,65535,65535]}}, +{"chroma":-1,"in":"#8080ffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#8080ffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#8080ffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#8080ffff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#8080ffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#8080ffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#8080ffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#8080ffff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#030201ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#030201ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#030201ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#030201ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#030201ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#030201ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#030201ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#030201ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#030201ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#030201ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#030201ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#030201ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#030201ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#030201ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#030201ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#030201ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#030201ff","luma":0,"out":{"hex":"#020202ff","u16":[569,569,569,65535]}}, +{"chroma":0,"in":"#030201ff","luma":0,"out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"chroma":0.5,"in":"#030201ff","luma":0,"out":{"hex":"#030200ff","u16":[806,502,0,65535]}}, +{"chroma":1,"in":"#030201ff","luma":0,"out":{"hex":"#030200ff","u16":[806,502,0,65535]}}, +{"chroma":-1,"in":"#030201ff","luma":0.1,"out":{"hex":"#5a5a5aff","u16":[23014,23014,23014,65535]}}, +{"chroma":0,"in":"#030201ff","luma":0.1,"out":{"hex":"#795128ff","u16":[31195,20796,10398,65535]}}, +{"chroma":0.5,"in":"#030201ff","luma":0.1,"out":{"hex":"#7f4f00ff","u16":[32614,20291,0,65535]}}, +{"chroma":1,"in":"#030201ff","luma":0.1,"out":{"hex":"#7f4f00ff","u16":[32614,20291,0,65535]}}, +{"chroma":-1,"in":"#030201ff","luma":0.5,"out":{"hex":"#bababaff","u16":[47825,47825,47825,65535]}}, +{"chroma":0,"in":"#030201ff","luma":0.5,"out":{"hex":"#f5ab69ff","u16":[62877,43864,26992,65535]}}, +{"chroma":0.5,"in":"#030201ff","luma":0.5,"out":{"hex":"#ffa74aff","u16":[65535,42973,19125,65535]}}, +{"chroma":1,"in":"#030201ff","luma":0.5,"out":{"hex":"#ffa74aff","u16":[65535,42973,19125,65535]}}, +{"chroma":-1,"in":"#030201ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#030201ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#030201ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#030201ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#030201ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#030201ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#030201ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#030201ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fffefdff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#fffefdff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#fffefdff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#fffefdff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#fffefdff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#fffefdff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#fffefdff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#fffefdff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#fffefdff","luma":-0.5,"out":{"hex":"#b9b9b9ff","u16":[47501,47501,47501,65535]}}, +{"chroma":0,"in":"#fffefdff","luma":-0.5,"out":{"hex":"#efae00ff","u16":[61361,44729,0,65535]}}, +{"chroma":0.5,"in":"#fffefdff","luma":-0.5,"out":{"hex":"#efae00ff","u16":[61361,44729,0,65535]}}, +{"chroma":1,"in":"#fffefdff","luma":-0.5,"out":{"hex":"#efae00ff","u16":[61361,44729,0,65535]}}, +{"chroma":-1,"in":"#fffefdff","luma":-0.1,"out":{"hex":"#f2f2f2ff","u16":[62237,62237,62237,65535]}}, +{"chroma":0,"in":"#fffefdff","luma":-0.1,"out":{"hex":"#fff0e0ff","u16":[65535,61676,57523,65535]}}, +{"chroma":0.5,"in":"#fffefdff","luma":-0.1,"out":{"hex":"#fff0e0ff","u16":[65535,61676,57523,65535]}}, +{"chroma":1,"in":"#fffefdff","luma":-0.1,"out":{"hex":"#fff0e0ff","u16":[65535,61676,57523,65535]}}, +{"chroma":-1,"in":"#fffefdff","luma":0,"out":{"hex":"#fefefeff","u16":[65314,65314,65314,65535]}}, +{"chroma":0,"in":"#fffefdff","luma":0,"out":{"hex":"#fffefdff","u16":[65535,65278,65021,65535]}}, +{"chroma":0.5,"in":"#fffefdff","luma":0,"out":{"hex":"#fffefdff","u16":[65535,65278,65021,65535]}}, +{"chroma":1,"in":"#fffefdff","luma":0,"out":{"hex":"#fffefdff","u16":[65535,65278,65021,65535]}}, +{"chroma":-1,"in":"#fffefdff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fffefdff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fffefdff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fffefdff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fffefdff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fffefdff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fffefdff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fffefdff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fffefdff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fffefdff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fffefdff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fffefdff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fffefdff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fffefdff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fffefdff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fffefdff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#7f8081ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#7f8081ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#7f8081ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#7f8081ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#7f8081ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#7f8081ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#7f8081ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#7f8081ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#7f8081ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#7f8081ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#7f8081ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#7f8081ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#7f8081ff","luma":-0.1,"out":{"hex":"#616161ff","u16":[24903,24903,24903,65535]}}, +{"chroma":0,"in":"#7f8081ff","luma":-0.1,"out":{"hex":"#606162ff","u16":[24736,24931,25125,65535]}}, +{"chroma":0.5,"in":"#7f8081ff","luma":-0.1,"out":{"hex":"#46657bff","u16":[17927,25829,31591,65535]}}, +{"chroma":1,"in":"#7f8081ff","luma":-0.1,"out":{"hex":"#00688eff","u16":[0,26667,36621,65535]}}, +{"chroma":-1,"in":"#7f8081ff","luma":0,"out":{"hex":"#808080ff","u16":[32860,32860,32860,65535]}}, +{"chroma":0,"in":"#7f8081ff","luma":0,"out":{"hex":"#7f8081ff","u16":[32639,32896,33153,65535]}}, +{"chroma":0.5,"in":"#7f8081ff","luma":0,"out":{"hex":"#5c85a2ff","u16":[23655,34082,41684,65535]}}, +{"chroma":1,"in":"#7f8081ff","luma":0,"out":{"hex":"#0089bcff","u16":[0,35187,48321,65535]}}, +{"chroma":-1,"in":"#7f8081ff","luma":0.1,"out":{"hex":"#989898ff","u16":[38987,38987,38987,65535]}}, +{"chroma":0,"in":"#7f8081ff","luma":0.1,"out":{"hex":"#979899ff","u16":[38725,39030,39334,65535]}}, +{"chroma":0.5,"in":"#7f8081ff","luma":0.1,"out":{"hex":"#6d9dc0ff","u16":[28066,40436,49457,65535]}}, +{"chroma":1,"in":"#7f8081ff","luma":0.1,"out":{"hex":"#00a2dfff","u16":[0,41747,57331,65535]}}, +{"chroma":-1,"in":"#7f8081ff","luma":0.5,"out":{"hex":"#dbdbdbff","u16":[56409,56409,56409,65535]}}, +{"chroma":0,"in":"#7f8081ff","luma":0.5,"out":{"hex":"#dbdcdcff","u16":[56298,56427,56557,65535]}}, +{"chroma":0.5,"in":"#7f8081ff","luma":0.5,"out":{"hex":"#ccdeefff","u16":[52375,57032,61310,65535]}}, +{"chroma":1,"in":"#7f8081ff","luma":0.5,"out":{"hex":"#bce0ffff","u16":[48197,57612,65535,65535]}}, +{"chroma":-1,"in":"#7f8081ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#7f8081ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#7f8081ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#7f8081ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#7f8081ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#7f8081ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#7f8081ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#7f8081ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#010000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#010000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#010000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#010000ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#010000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#010000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#010000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#010000ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#010000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#010000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#010000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#010000ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#010000ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#010000ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#010000ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#010000ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#010000ff","luma":0,"out":{"hex":"#000000ff","u16":[127,127,127,65535]}}, +{"chroma":0,"in":"#010000ff","luma":0,"out":{"hex":"#010000ff","u16":[257,0,0,65535]}}, +{"chroma":0.5,"in":"#010000ff","luma":0,"out":{"hex":"#010000ff","u16":[257,0,0,65535]}}, +{"chroma":1,"in":"#010000ff","luma":0,"out":{"hex":"#010000ff","u16":[257,0,0,65535]}}, +{"chroma":-1,"in":"#010000ff","luma":0.1,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]}}, +{"chroma":0,"in":"#010000ff","luma":0.1,"out":{"hex":"#b50000ff","u16":[46514,0,0,65535]}}, +{"chroma":0.5,"in":"#010000ff","luma":0.1,"out":{"hex":"#b50000ff","u16":[46514,0,0,65535]}}, +{"chroma":1,"in":"#010000ff","luma":0.1,"out":{"hex":"#b50000ff","u16":[46514,0,0,65535]}}, +{"chroma":-1,"in":"#010000ff","luma":0.5,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]}}, +{"chroma":0,"in":"#010000ff","luma":0.5,"out":{"hex":"#ffa1a1ff","u16":[65535,41449,41449,65535]}}, +{"chroma":0.5,"in":"#010000ff","luma":0.5,"out":{"hex":"#ffa1a1ff","u16":[65535,41449,41449,65535]}}, +{"chroma":1,"in":"#010000ff","luma":0.5,"out":{"hex":"#ffa1a1ff","u16":[65535,41449,41449,65535]}}, +{"chroma":-1,"in":"#010000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#010000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#010000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#010000ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#010000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#010000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#010000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#010000ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#000001ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#000001ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#000001ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#000001ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#000001ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#000001ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#000001ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#000001ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#000001ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#000001ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#000001ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#000001ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#000001ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#000001ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#000001ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#000001ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#000001ff","luma":0,"out":{"hex":"#000000ff","u16":[78,78,78,65535]}}, +{"chroma":0,"in":"#000001ff","luma":0,"out":{"hex":"#000001ff","u16":[0,0,257,65535]}}, +{"chroma":0.5,"in":"#000001ff","luma":0,"out":{"hex":"#000001ff","u16":[0,0,257,65535]}}, +{"chroma":1,"in":"#000001ff","luma":0,"out":{"hex":"#000001ff","u16":[0,0,257,65535]}}, +{"chroma":-1,"in":"#000001ff","luma":0.1,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]}}, +{"chroma":0,"in":"#000001ff","luma":0.1,"out":{"hex":"#3434ffff","u16":[13305,13305,65535,65535]}}, +{"chroma":0.5,"in":"#000001ff","luma":0.1,"out":{"hex":"#3434ffff","u16":[13305,13305,65535,65535]}}, +{"chroma":1,"in":"#000001ff","luma":0.1,"out":{"hex":"#3434ffff","u16":[13305,13305,65535,65535]}}, +{"chroma":-1,"in":"#000001ff","luma":0.5,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]}}, +{"chroma":0,"in":"#000001ff","luma":0.5,"out":{"hex":"#b3b3ffff","u16":[46095,46095,65535,65535]}}, +{"chroma":0.5,"in":"#000001ff","luma":0.5,"out":{"hex":"#b3b3ffff","u16":[46095,46095,65535,65535]}}, +{"chroma":1,"in":"#000001ff","luma":0.5,"out":{"hex":"#b3b3ffff","u16":[46095,46095,65535,65535]}}, +{"chroma":-1,"in":"#000001ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#000001ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#000001ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#000001ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#000001ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#000001ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#000001ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#000001ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fefffeff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#fefffeff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#fefffeff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#fefffeff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#fefffeff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#fefffeff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#fefffeff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#fefffeff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#fefffeff","luma":-0.5,"out":{"hex":"#bababaff","u16":[47717,47717,47717,65535]}}, +{"chroma":0,"in":"#fefffeff","luma":-0.5,"out":{"hex":"#00d800ff","u16":[0,55570,0,65535]}}, +{"chroma":0.5,"in":"#fefffeff","luma":-0.5,"out":{"hex":"#00d800ff","u16":[0,55570,0,65535]}}, +{"chroma":1,"in":"#fefffeff","luma":-0.5,"out":{"hex":"#00d800ff","u16":[0,55570,0,65535]}}, +{"chroma":-1,"in":"#fefffeff","luma":-0.1,"out":{"hex":"#f3f3f3ff","u16":[62393,62393,62393,65535]}}, +{"chroma":0,"in":"#fefffeff","luma":-0.1,"out":{"hex":"#d0ffd0ff","u16":[53513,65535,53513,65535]}}, +{"chroma":0.5,"in":"#fefffeff","luma":-0.1,"out":{"hex":"#d0ffd0ff","u16":[53513,65535,53513,65535]}}, +{"chroma":1,"in":"#fefffeff","luma":-0.1,"out":{"hex":"#d0ffd0ff","u16":[53513,65535,53513,65535]}}, +{"chroma":-1,"in":"#fefffeff","luma":0,"out":{"hex":"#ffffffff","u16":[65462,65462,65462,65535]}}, +{"chroma":0,"in":"#fefffeff","luma":0,"out":{"hex":"#fefffeff","u16":[65278,65535,65278,65535]}}, +{"chroma":0.5,"in":"#fefffeff","luma":0,"out":{"hex":"#fefffeff","u16":[65278,65535,65278,65535]}}, +{"chroma":1,"in":"#fefffeff","luma":0,"out":{"hex":"#fefffeff","u16":[65278,65535,65278,65535]}}, +{"chroma":-1,"in":"#fefffeff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fefffeff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fefffeff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fefffeff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fefffeff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fefffeff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fefffeff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fefffeff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fefffeff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fefffeff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fefffeff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fefffeff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fefffeff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fefffeff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fefffeff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fefffeff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#3daee9ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#3daee9ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#3daee9ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#3daee9ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#3daee9ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#3daee9ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#3daee9ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#3daee9ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#3daee9ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#3daee9ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#3daee9ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#3daee9ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#3daee9ff","luma":-0.1,"out":{"hex":"#8e8e8eff","u16":[36554,36554,36554,65535]}}, +{"chroma":0,"in":"#3daee9ff","luma":-0.1,"out":{"hex":"#3597cbff","u16":[13627,38869,52049,65535]}}, +{"chroma":0.5,"in":"#3daee9ff","luma":-0.1,"out":{"hex":"#0098d1ff","u16":[0,39155,53665,65535]}}, +{"chroma":1,"in":"#3daee9ff","luma":-0.1,"out":{"hex":"#0098d1ff","u16":[0,39155,53665,65535]}}, +{"chroma":-1,"in":"#3daee9ff","luma":0,"out":{"hex":"#a4a4a4ff","u16":[42055,42055,42055,65535]}}, +{"chroma":0,"in":"#3daee9ff","luma":0,"out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"chroma":0.5,"in":"#3daee9ff","luma":0,"out":{"hex":"#00aff0ff","u16":[0,45047,61740,65535]}}, +{"chroma":1,"in":"#3daee9ff","luma":0,"out":{"hex":"#00aff0ff","u16":[0,45047,61740,65535]}}, +{"chroma":-1,"in":"#3daee9ff","luma":0.1,"out":{"hex":"#b6b6b6ff","u16":[46803,46803,46803,65535]}}, +{"chroma":0,"in":"#3daee9ff","luma":0.1,"out":{"hex":"#64c0f8ff","u16":[25711,49269,63727,65535]}}, +{"chroma":0.5,"in":"#3daee9ff","luma":0.1,"out":{"hex":"#52c1ffff","u16":[21106,49575,65535,65535]}}, +{"chroma":1,"in":"#3daee9ff","luma":0.1,"out":{"hex":"#52c1ffff","u16":[21106,49575,65535,65535]}}, +{"chroma":-1,"in":"#3daee9ff","luma":0.5,"out":{"hex":"#f0f0f0ff","u16":[61734,61734,61734,65535]}}, +{"chroma":0,"in":"#3daee9ff","luma":0.5,"out":{"hex":"#e6f2fdff","u16":[59033,62162,65115,65535]}}, +{"chroma":0.5,"in":"#3daee9ff","luma":0.5,"out":{"hex":"#e4f2ffff","u16":[58674,62217,65535,65535]}}, +{"chroma":1,"in":"#3daee9ff","luma":0.5,"out":{"hex":"#e4f2ffff","u16":[58674,62217,65535,65535]}}, +{"chroma":-1,"in":"#3daee9ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#3daee9ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#3daee9ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#3daee9ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#3daee9ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#3daee9ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#3daee9ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#3daee9ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#232629ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#232629ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#232629ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#232629ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#232629ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#232629ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#232629ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#232629ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#232629ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#232629ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#232629ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#232629ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#232629ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#232629ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#232629ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#232629ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#232629ff","luma":0,"out":{"hex":"#262626ff","u16":[9668,9668,9668,65535]}}, +{"chroma":0,"in":"#232629ff","luma":0,"out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"chroma":0.5,"in":"#232629ff","luma":0,"out":{"hex":"#172733ff","u16":[6025,10093,13003,65535]}}, +{"chroma":1,"in":"#232629ff","luma":0,"out":{"hex":"#002838ff","u16":[0,10317,14453,65535]}}, +{"chroma":-1,"in":"#232629ff","luma":0.1,"out":{"hex":"#5f5f5fff","u16":[24504,24504,24504,65535]}}, +{"chroma":0,"in":"#232629ff","luma":0.1,"out":{"hex":"#596068ff","u16":[22800,24754,26708,65535]}}, +{"chroma":0.5,"in":"#232629ff","luma":0.1,"out":{"hex":"#3b6480ff","u16":[15271,25583,32960,65535]}}, +{"chroma":1,"in":"#232629ff","luma":0.1,"out":{"hex":"#00668fff","u16":[0,26150,36633,65535]}}, +{"chroma":-1,"in":"#232629ff","luma":0.5,"out":{"hex":"#bdbdbdff","u16":[48464,48464,48464,65535]}}, +{"chroma":0,"in":"#232629ff","luma":0.5,"out":{"hex":"#b4bec8ff","u16":[46263,48791,51401,65535]}}, +{"chroma":0.5,"in":"#232629ff","luma":0.5,"out":{"hex":"#92c2eaff","u16":[37580,49889,60166,65535]}}, +{"chroma":1,"in":"#232629ff","luma":0.5,"out":{"hex":"#73c5ffff","u16":[29574,50648,65535,65535]}}, +{"chroma":-1,"in":"#232629ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#232629ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#232629ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#232629ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#232629ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#232629ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#232629ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#232629ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#eff0f1ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#eff0f1ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#eff0f1ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#eff0f1ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#eff0f1ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#eff0f1ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#eff0f1ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#eff0f1ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#eff0f1ff","luma":-0.5,"out":{"hex":"#a3a3a3ff","u16":[41911,41911,41911,65535]}}, +{"chroma":0,"in":"#eff0f1ff","luma":-0.5,"out":{"hex":"#9ea4aaff","u16":[40497,42136,43710,65535]}}, +{"chroma":0.5,"in":"#eff0f1ff","luma":-0.5,"out":{"hex":"#6faad3ff","u16":[28475,43645,54228,65535]}}, +{"chroma":1,"in":"#eff0f1ff","luma":-0.5,"out":{"hex":"#00aff0ff","u16":[0,44886,61580,65535]}}, +{"chroma":-1,"in":"#eff0f1ff","luma":-0.1,"out":{"hex":"#e3e3e3ff","u16":[58332,58332,58332,65535]}}, +{"chroma":0,"in":"#eff0f1ff","luma":-0.1,"out":{"hex":"#e1e3e5ff","u16":[57907,58401,58892,65535]}}, +{"chroma":0.5,"in":"#eff0f1ff","luma":-0.1,"out":{"hex":"#d6e5f3ff","u16":[54880,58871,62579,65535]}}, +{"chroma":1,"in":"#eff0f1ff","luma":-0.1,"out":{"hex":"#cbe7ffff","u16":[52125,59269,65535,65535]}}, +{"chroma":-1,"in":"#eff0f1ff","luma":0,"out":{"hex":"#f0f0f0ff","u16":[61644,61644,61644,65535]}}, +{"chroma":0,"in":"#eff0f1ff","luma":0,"out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"chroma":0.5,"in":"#eff0f1ff","luma":0,"out":{"hex":"#e9f1f9ff","u16":[59876,61926,63907,65535]}}, +{"chroma":1,"in":"#eff0f1ff","luma":0,"out":{"hex":"#e4f2ffff","u16":[58516,62136,65535,65535]}}, +{"chroma":-1,"in":"#eff0f1ff","luma":0.1,"out":{"hex":"#fcfcfcff","u16":[64755,64755,64755,65535]}}, +{"chroma":0,"in":"#eff0f1ff","luma":0.1,"out":{"hex":"#fcfcfcff","u16":[64713,64762,64813,65535]}}, +{"chroma":0.5,"in":"#eff0f1ff","luma":0.1,"out":{"hex":"#fbfcfeff","u16":[64417,64810,65203,65535]}}, +{"chroma":1,"in":"#eff0f1ff","luma":0.1,"out":{"hex":"#fafcffff","u16":[64162,64851,65535,65535]}}, +{"chroma":-1,"in":"#eff0f1ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#eff0f1ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#eff0f1ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#eff0f1ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#eff0f1ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#eff0f1ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#eff0f1ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#eff0f1ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#eff0f1ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#eff0f1ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#eff0f1ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#eff0f1ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fcfcfcff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#fcfcfcff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#fcfcfcff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#fcfcfcff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#fcfcfcff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#fcfcfcff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#fcfcfcff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#fcfcfcff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#fcfcfcff","luma":-0.5,"out":{"hex":"#b6b6b6ff","u16":[46690,46690,46690,65535]}}, +{"chroma":0,"in":"#fcfcfcff","luma":-0.5,"out":{"hex":"#b6b6b6ff","u16":[46690,46690,46690,65535]}}, +{"chroma":0.5,"in":"#fcfcfcff","luma":-0.5,"out":{"hex":"#dea9a9ff","u16":[57052,43374,43374,65535]}}, +{"chroma":1,"in":"#fcfcfcff","luma":-0.5,"out":{"hex":"#ff9b9bff","u16":[65535,39721,39721,65535]}}, +{"chroma":-1,"in":"#fcfcfcff","luma":-0.1,"out":{"hex":"#f0f0f0ff","u16":[61653,61653,61653,65535]}}, +{"chroma":0,"in":"#fcfcfcff","luma":-0.1,"out":{"hex":"#f0f0f0ff","u16":[61653,61653,61653,65535]}}, +{"chroma":0.5,"in":"#fcfcfcff","luma":-0.1,"out":{"hex":"#f8eeeeff","u16":[63630,61106,61106,65535]}}, +{"chroma":1,"in":"#fcfcfcff","luma":-0.1,"out":{"hex":"#ffececff","u16":[65535,60554,60554,65535]}}, +{"chroma":-1,"in":"#fcfcfcff","luma":0,"out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"chroma":0,"in":"#fcfcfcff","luma":0,"out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"chroma":0.5,"in":"#fcfcfcff","luma":0,"out":{"hex":"#fefcfcff","u16":[65151,64659,64659,65535]}}, +{"chroma":1,"in":"#fcfcfcff","luma":0,"out":{"hex":"#fffbfbff","u16":[65535,64554,64554,65535]}}, +{"chroma":-1,"in":"#fcfcfcff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fcfcfcff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fcfcfcff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fcfcfcff","luma":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fcfcfcff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fcfcfcff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fcfcfcff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fcfcfcff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fcfcfcff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fcfcfcff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fcfcfcff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fcfcfcff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#fcfcfcff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#fcfcfcff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#fcfcfcff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#fcfcfcff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#31363bff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#31363bff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#31363bff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#31363bff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#31363bff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#31363bff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#31363bff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#31363bff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#31363bff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#31363bff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#31363bff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#31363bff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#31363bff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#31363bff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#31363bff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#31363bff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#31363bff","luma":0,"out":{"hex":"#353535ff","u16":[13717,13717,13717,65535]}}, +{"chroma":0,"in":"#31363bff","luma":0,"out":{"hex":"#31363bff","u16":[12593,13878,15163,65535]}}, +{"chroma":0.5,"in":"#31363bff","luma":0,"out":{"hex":"#203849ff","u16":[8271,14336,18653,65535]}}, +{"chroma":1,"in":"#31363bff","luma":0,"out":{"hex":"#003950ff","u16":[0,14628,20572,65535]}}, +{"chroma":-1,"in":"#31363bff","luma":0.1,"out":{"hex":"#666666ff","u16":[26109,26109,26109,65535]}}, +{"chroma":0,"in":"#31363bff","luma":0.1,"out":{"hex":"#5d6770ff","u16":[23970,26416,28862,65535]}}, +{"chroma":0.5,"in":"#31363bff","luma":0.1,"out":{"hex":"#3d6a8aff","u16":[15743,27288,35505,65535]}}, +{"chroma":1,"in":"#31363bff","luma":0.1,"out":{"hex":"#006c98ff","u16":[0,27843,39159,65535]}}, +{"chroma":-1,"in":"#31363bff","luma":0.5,"out":{"hex":"#bfbfbfff","u16":[49193,49193,49193,65535]}}, +{"chroma":0,"in":"#31363bff","luma":0.5,"out":{"hex":"#b6c1ccff","u16":[46780,49547,52436,65535]}}, +{"chroma":0.5,"in":"#31363bff","luma":0.5,"out":{"hex":"#97c5ecff","u16":[38694,50564,60746,65535]}}, +{"chroma":1,"in":"#31363bff","luma":0.5,"out":{"hex":"#7dc7ffff","u16":[32024,51219,65535,65535]}}, +{"chroma":-1,"in":"#31363bff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#31363bff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#31363bff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#31363bff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#31363bff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#31363bff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#31363bff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#31363bff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#1b1e20ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#1b1e20ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#1b1e20ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#1b1e20ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#1b1e20ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#1b1e20ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#1b1e20ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#1b1e20ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#1b1e20ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#1b1e20ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#1b1e20ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#1b1e20ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#1b1e20ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#1b1e20ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#1b1e20ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#1b1e20ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#1b1e20ff","luma":0,"out":{"hex":"#1e1e1eff","u16":[7593,7593,7593,65535]}}, +{"chroma":0,"in":"#1b1e20ff","luma":0,"out":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]}}, +{"chroma":0.5,"in":"#1b1e20ff","luma":0,"out":{"hex":"#121f26ff","u16":[4525,8024,9730,65535]}}, +{"chroma":1,"in":"#1b1e20ff","luma":0,"out":{"hex":"#002029ff","u16":[0,8217,10562,65535]}}, +{"chroma":-1,"in":"#1b1e20ff","luma":0.1,"out":{"hex":"#5d5d5dff","u16":[23902,23902,23902,65535]}}, +{"chroma":0,"in":"#1b1e20ff","luma":0.1,"out":{"hex":"#555e65ff","u16":[21842,24269,25887,65535]}}, +{"chroma":0.5,"in":"#1b1e20ff","luma":0.1,"out":{"hex":"#376277ff","u16":[14243,25256,30626,65535]}}, +{"chroma":1,"in":"#1b1e20ff","luma":0.1,"out":{"hex":"#006581ff","u16":[0,25865,33247,65535]}}, +{"chroma":-1,"in":"#1b1e20ff","luma":0.5,"out":{"hex":"#bcbcbcff","u16":[48201,48201,48201,65535]}}, +{"chroma":0,"in":"#1b1e20ff","luma":0.5,"out":{"hex":"#adbecaff","u16":[44461,48872,51841,65535]}}, +{"chroma":0.5,"in":"#1b1e20ff","luma":0.5,"out":{"hex":"#79c5ecff","u16":[31218,50680,60631,65535]}}, +{"chroma":1,"in":"#1b1e20ff","luma":0.5,"out":{"hex":"#40caffff","u16":[16513,51799,65535,65535]}}, +{"chroma":-1,"in":"#1b1e20ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#1b1e20ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#1b1e20ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#1b1e20ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#1b1e20ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#1b1e20ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#1b1e20ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#1b1e20ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#da4453ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#da4453ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#da4453ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#da4453ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#da4453ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#da4453ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#da4453ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#da4453ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#da4453ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#da4453ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#da4453ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#da4453ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#da4453ff","luma":-0.1,"out":{"hex":"#585858ff","u16":[22560,22560,22560,65535]}}, +{"chroma":0,"in":"#da4453ff","luma":-0.1,"out":{"hex":"#9e313cff","u16":[40478,12626,15411,65535]}}, +{"chroma":0.5,"in":"#da4453ff","luma":-0.1,"out":{"hex":"#b0002bff","u16":[45282,0,11167,65535]}}, +{"chroma":1,"in":"#da4453ff","luma":-0.1,"out":{"hex":"#b0002bff","u16":[45282,0,11167,65535]}}, +{"chroma":-1,"in":"#da4453ff","luma":0,"out":{"hex":"#797979ff","u16":[31225,31225,31225,65535]}}, +{"chroma":0,"in":"#da4453ff","luma":0,"out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"chroma":0.5,"in":"#da4453ff","luma":0,"out":{"hex":"#f4003cff","u16":[62676,0,15457,65535]}}, +{"chroma":1,"in":"#da4453ff","luma":0,"out":{"hex":"#f4003cff","u16":[62676,0,15457,65535]}}, +{"chroma":-1,"in":"#da4453ff","luma":0.1,"out":{"hex":"#939393ff","u16":[37668,37668,37668,65535]}}, +{"chroma":0,"in":"#da4453ff","luma":0.1,"out":{"hex":"#e76e77ff","u16":[59334,28156,30484,65535]}}, +{"chroma":0.5,"in":"#da4453ff","luma":0.1,"out":{"hex":"#ff5a69ff","u16":[65535,23198,27081,65535]}}, +{"chroma":1,"in":"#da4453ff","luma":0.1,"out":{"hex":"#ff5a69ff","u16":[65535,23198,27081,65535]}}, +{"chroma":-1,"in":"#da4453ff","luma":0.5,"out":{"hex":"#d8d8d8ff","u16":[55572,55572,55572,65535]}}, +{"chroma":0,"in":"#da4453ff","luma":0.5,"out":{"hex":"#f5cfd1ff","u16":[62946,53324,53812,65535]}}, +{"chroma":0.5,"in":"#da4453ff","luma":0.5,"out":{"hex":"#ffcccfff","u16":[65535,52424,53113,65535]}}, +{"chroma":1,"in":"#da4453ff","luma":0.5,"out":{"hex":"#ffcccfff","u16":[65535,52424,53113,65535]}}, +{"chroma":-1,"in":"#da4453ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#da4453ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#da4453ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#da4453ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#da4453ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#da4453ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#da4453ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#da4453ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#27ae60ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#27ae60ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#27ae60ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#27ae60ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#27ae60ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#27ae60ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#27ae60ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#27ae60ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#27ae60ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#27ae60ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#27ae60ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#27ae60ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#27ae60ff","luma":-0.1,"out":{"hex":"#808080ff","u16":[32951,32951,32951,65535]}}, +{"chroma":0,"in":"#27ae60ff","luma":-0.1,"out":{"hex":"#219351ff","u16":[8455,37723,20813,65535]}}, +{"chroma":0.5,"in":"#27ae60ff","luma":-0.1,"out":{"hex":"#00944dff","u16":[0,37955,19916,65535]}}, +{"chroma":1,"in":"#27ae60ff","luma":-0.1,"out":{"hex":"#00944dff","u16":[0,37955,19916,65535]}}, +{"chroma":-1,"in":"#27ae60ff","luma":0,"out":{"hex":"#989898ff","u16":[39061,39061,39061,65535]}}, +{"chroma":0,"in":"#27ae60ff","luma":0,"out":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]}}, +{"chroma":0.5,"in":"#27ae60ff","luma":0,"out":{"hex":"#00af5cff","u16":[0,44993,23610,65535]}}, +{"chroma":1,"in":"#27ae60ff","luma":0,"out":{"hex":"#00af5cff","u16":[0,44993,23610,65535]}}, +{"chroma":-1,"in":"#27ae60ff","luma":0.1,"out":{"hex":"#acacacff","u16":[44195,44195,44195,65535]}}, +{"chroma":0,"in":"#27ae60ff","luma":0.1,"out":{"hex":"#2cc56dff","u16":[11340,50596,27915,65535]}}, +{"chroma":0.5,"in":"#27ae60ff","luma":0.1,"out":{"hex":"#00c668ff","u16":[0,50907,26713,65535]}}, +{"chroma":1,"in":"#27ae60ff","luma":0.1,"out":{"hex":"#00c668ff","u16":[0,50907,26713,65535]}}, +{"chroma":-1,"in":"#27ae60ff","luma":0.5,"out":{"hex":"#e9e9e9ff","u16":[59893,59893,59893,65535]}}, +{"chroma":0,"in":"#27ae60ff","luma":0.5,"out":{"hex":"#9ffebbff","u16":[40802,65266,48131,65535]}}, +{"chroma":0.5,"in":"#27ae60ff","luma":0.5,"out":{"hex":"#9affb8ff","u16":[39477,65535,47411,65535]}}, +{"chroma":1,"in":"#27ae60ff","luma":0.5,"out":{"hex":"#9affb8ff","u16":[39477,65535,47411,65535]}}, +{"chroma":-1,"in":"#27ae60ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#27ae60ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#27ae60ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#27ae60ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#27ae60ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#27ae60ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#27ae60ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#27ae60ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#f67400ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#f67400ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#f67400ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#f67400ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#f67400ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#f67400ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#f67400ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#f67400ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#f67400ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#f67400ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#f67400ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#f67400ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#f67400ff","luma":-0.1,"out":{"hex":"#818181ff","u16":[33123,33123,33123,65535]}}, +{"chroma":0,"in":"#f67400ff","luma":-0.1,"out":{"hex":"#d06200ff","u16":[53419,25190,0,65535]}}, +{"chroma":0.5,"in":"#f67400ff","luma":-0.1,"out":{"hex":"#d06200ff","u16":[53419,25190,0,65535]}}, +{"chroma":1,"in":"#f67400ff","luma":-0.1,"out":{"hex":"#d06200ff","u16":[53419,25190,0,65535]}}, +{"chroma":-1,"in":"#f67400ff","luma":0,"out":{"hex":"#999999ff","u16":[39202,39202,39202,65535]}}, +{"chroma":0,"in":"#f67400ff","luma":0,"out":{"hex":"#f67400ff","u16":[63222,29812,0,65535]}}, +{"chroma":0.5,"in":"#f67400ff","luma":0,"out":{"hex":"#f67400ff","u16":[63222,29812,0,65535]}}, +{"chroma":1,"in":"#f67400ff","luma":0,"out":{"hex":"#f67400ff","u16":[63222,29812,0,65535]}}, +{"chroma":-1,"in":"#f67400ff","luma":0.1,"out":{"hex":"#acacacff","u16":[44317,44317,44317,65535]}}, +{"chroma":0,"in":"#f67400ff","luma":0.1,"out":{"hex":"#ff905fff","u16":[65535,36899,24314,65535]}}, +{"chroma":0.5,"in":"#f67400ff","luma":0.1,"out":{"hex":"#ff905fff","u16":[65535,36899,24314,65535]}}, +{"chroma":1,"in":"#f67400ff","luma":0.1,"out":{"hex":"#ff905fff","u16":[65535,36899,24314,65535]}}, +{"chroma":-1,"in":"#f67400ff","luma":0.5,"out":{"hex":"#e9e9e9ff","u16":[59977,59977,59977,65535]}}, +{"chroma":0,"in":"#f67400ff","luma":0.5,"out":{"hex":"#ffe4ddff","u16":[65535,58530,56720,65535]}}, +{"chroma":0.5,"in":"#f67400ff","luma":0.5,"out":{"hex":"#ffe4ddff","u16":[65535,58530,56720,65535]}}, +{"chroma":1,"in":"#f67400ff","luma":0.5,"out":{"hex":"#ffe4ddff","u16":[65535,58530,56720,65535]}}, +{"chroma":-1,"in":"#f67400ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#f67400ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#f67400ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#f67400ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#f67400ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#f67400ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#f67400ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#f67400ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#2980b9ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#2980b9ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#2980b9ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#2980b9ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#2980b9ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#2980b9ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#2980b9ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#2980b9ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#2980b9ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#2980b9ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#2980b9ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#2980b9ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#2980b9ff","luma":-0.1,"out":{"hex":"#585858ff","u16":[22636,22636,22636,65535]}}, +{"chroma":0,"in":"#2980b9ff","luma":-0.1,"out":{"hex":"#1e5d86ff","u16":[7626,23808,34409,65535]}}, +{"chroma":0.5,"in":"#2980b9ff","luma":-0.1,"out":{"hex":"#005d8aff","u16":[0,23921,35340,65535]}}, +{"chroma":1,"in":"#2980b9ff","luma":-0.1,"out":{"hex":"#005d8aff","u16":[0,23921,35340,65535]}}, +{"chroma":-1,"in":"#2980b9ff","luma":0,"out":{"hex":"#7a7a7aff","u16":[31277,31277,31277,65535]}}, +{"chroma":0,"in":"#2980b9ff","luma":0,"out":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]}}, +{"chroma":0.5,"in":"#2980b9ff","luma":0,"out":{"hex":"#0081beff","u16":[0,33053,48831,65535]}}, +{"chroma":1,"in":"#2980b9ff","luma":0,"out":{"hex":"#0081beff","u16":[0,33053,48831,65535]}}, +{"chroma":-1,"in":"#2980b9ff","luma":0.1,"out":{"hex":"#939393ff","u16":[37710,37710,37710,65535]}}, +{"chroma":0,"in":"#2980b9ff","luma":0.1,"out":{"hex":"#319adfff","u16":[12704,39662,57323,65535]}}, +{"chroma":0.5,"in":"#2980b9ff","luma":0.1,"out":{"hex":"#009be5ff","u16":[0,39851,58874,65535]}}, +{"chroma":1,"in":"#2980b9ff","luma":0.1,"out":{"hex":"#009be5ff","u16":[0,39851,58874,65535]}}, +{"chroma":-1,"in":"#2980b9ff","luma":0.5,"out":{"hex":"#d8d8d8ff","u16":[55598,55598,55598,65535]}}, +{"chroma":0,"in":"#2980b9ff","luma":0.5,"out":{"hex":"#bfdbfcff","u16":[49139,56369,64703,65535]}}, +{"chroma":0.5,"in":"#2980b9ff","luma":0.5,"out":{"hex":"#bcdcffff","u16":[48432,56445,65535,65535]}}, +{"chroma":1,"in":"#2980b9ff","luma":0.5,"out":{"hex":"#bcdcffff","u16":[48432,56445,65535,65535]}}, +{"chroma":-1,"in":"#2980b9ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#2980b9ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#2980b9ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#2980b9ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#2980b9ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#2980b9ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#2980b9ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#2980b9ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#7f8c8dff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#7f8c8dff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#7f8c8dff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#7f8c8dff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#7f8c8dff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#7f8c8dff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#7f8c8dff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#7f8c8dff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#7f8c8dff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#7f8c8dff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#7f8c8dff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#7f8c8dff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#7f8c8dff","luma":-0.1,"out":{"hex":"#6e6e6eff","u16":[28222,28222,28222,65535]}}, +{"chroma":0,"in":"#7f8c8dff","luma":-0.1,"out":{"hex":"#657071ff","u16":[26079,28749,28954,65535]}}, +{"chroma":0.5,"in":"#7f8c8dff","luma":-0.1,"out":{"hex":"#437679ff","u16":[17296,30331,31119,65535]}}, +{"chroma":1,"in":"#7f8c8dff","luma":-0.1,"out":{"hex":"#007a7eff","u16":[0,31354,32495,65535]}}, +{"chroma":-1,"in":"#7f8c8dff","luma":0,"out":{"hex":"#898989ff","u16":[35320,35320,35320,65535]}}, +{"chroma":0,"in":"#7f8c8dff","luma":0,"out":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}}, +{"chroma":0.5,"in":"#7f8c8dff","luma":0,"out":{"hex":"#549498ff","u16":[21646,37960,38946,65535]}}, +{"chroma":1,"in":"#7f8c8dff","luma":0,"out":{"hex":"#00999eff","u16":[0,39241,40668,65535]}}, +{"chroma":-1,"in":"#7f8c8dff","luma":0.1,"out":{"hex":"#a0a0a0ff","u16":[41018,41018,41018,65535]}}, +{"chroma":0,"in":"#7f8c8dff","luma":0.1,"out":{"hex":"#93a3a4ff","u16":[37904,41784,42082,65535]}}, +{"chroma":0.5,"in":"#7f8c8dff","luma":0.1,"out":{"hex":"#62acb0ff","u16":[25138,44083,45228,65535]}}, +{"chroma":1,"in":"#7f8c8dff","luma":0.1,"out":{"hex":"#00b1b8ff","u16":[0,45570,47228,65535]}}, +{"chroma":-1,"in":"#7f8c8dff","luma":0.5,"out":{"hex":"#e1e1e1ff","u16":[57735,57735,57735,65535]}}, +{"chroma":0,"in":"#7f8c8dff","luma":0.5,"out":{"hex":"#d2e4e6ff","u16":[53881,58689,59062,65535]}}, +{"chroma":0.5,"in":"#7f8c8dff","luma":0.5,"out":{"hex":"#97f0f5ff","u16":[38790,61568,63008,65535]}}, +{"chroma":1,"in":"#7f8c8dff","luma":0.5,"out":{"hex":"#54f7ffff","u16":[21667,63440,65535,65535]}}, +{"chroma":-1,"in":"#7f8c8dff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#7f8c8dff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#7f8c8dff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#7f8c8dff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#7f8c8dff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#7f8c8dff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#7f8c8dff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#7f8c8dff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#9b59b6ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#9b59b6ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#9b59b6ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#9b59b6ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#9b59b6ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#9b59b6ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#9b59b6ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#9b59b6ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#9b59b6ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#9b59b6ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#9b59b6ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#9b59b6ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#9b59b6ff","luma":-0.1,"out":{"hex":"#4f4f4fff","u16":[20320,20320,20320,65535]}}, +{"chroma":0,"in":"#9b59b6ff","luma":-0.1,"out":{"hex":"#6a3d7cff","u16":[27202,15619,31940,65535]}}, +{"chroma":0.5,"in":"#9b59b6ff","luma":-0.1,"out":{"hex":"#81169fff","u16":[33088,5679,40837,65535]}}, +{"chroma":1,"in":"#9b59b6ff","luma":-0.1,"out":{"hex":"#8300a2ff","u16":[33718,0,41762,65535]}}, +{"chroma":-1,"in":"#9b59b6ff","luma":0,"out":{"hex":"#747474ff","u16":[29758,29758,29758,65535]}}, +{"chroma":0,"in":"#9b59b6ff","luma":0,"out":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}}, +{"chroma":0.5,"in":"#9b59b6ff","luma":0,"out":{"hex":"#bd20e9ff","u16":[48456,8316,59803,65535]}}, +{"chroma":1,"in":"#9b59b6ff","luma":0,"out":{"hex":"#c000eeff","u16":[49379,0,61158,65535]}}, +{"chroma":-1,"in":"#9b59b6ff","luma":0.1,"out":{"hex":"#8e8e8eff","u16":[36508,36508,36508,65535]}}, +{"chroma":0,"in":"#9b59b6ff","luma":0.1,"out":{"hex":"#b079c9ff","u16":[45309,31102,51728,65535]}}, +{"chroma":0.5,"in":"#9b59b6ff","luma":0.1,"out":{"hex":"#cf5afaff","u16":[53313,23085,64214,65535]}}, +{"chroma":1,"in":"#9b59b6ff","luma":0.1,"out":{"hex":"#d355ffff","u16":[54186,21869,65535,65535]}}, +{"chroma":-1,"in":"#9b59b6ff","luma":0.5,"out":{"hex":"#d5d5d5ff","u16":[54852,54852,54852,65535]}}, +{"chroma":0,"in":"#9b59b6ff","luma":0.5,"out":{"hex":"#e0d0e9ff","u16":[57544,53478,59830,65535]}}, +{"chroma":0.5,"in":"#9b59b6ff","luma":0.5,"out":{"hex":"#ebcafdff","u16":[60433,51861,64948,65535]}}, +{"chroma":1,"in":"#9b59b6ff","luma":0.5,"out":{"hex":"#ecc9ffff","u16":[60772,51661,65535,65535]}}, +{"chroma":-1,"in":"#9b59b6ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#9b59b6ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#9b59b6ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#9b59b6ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#9b59b6ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#9b59b6ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#9b59b6ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#9b59b6ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#1d99f3ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#1d99f3ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#1d99f3ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#1d99f3ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#1d99f3ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#1d99f3ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#1d99f3ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#1d99f3ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#1d99f3ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#1d99f3ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#1d99f3ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#1d99f3ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#1d99f3ff","luma":-0.1,"out":{"hex":"#7a7a7aff","u16":[31474,31474,31474,65535]}}, +{"chroma":0,"in":"#1d99f3ff","luma":-0.1,"out":{"hex":"#187fcaff","u16":[6195,32682,51907,65535]}}, +{"chroma":0.5,"in":"#1d99f3ff","luma":-0.1,"out":{"hex":"#007fccff","u16":[0,32716,52358,65535]}}, +{"chroma":1,"in":"#1d99f3ff","luma":-0.1,"out":{"hex":"#007fccff","u16":[0,32716,52358,65535]}}, +{"chroma":-1,"in":"#1d99f3ff","luma":0,"out":{"hex":"#939393ff","u16":[37867,37867,37867,65535]}}, +{"chroma":0,"in":"#1d99f3ff","luma":0,"out":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]}}, +{"chroma":0.5,"in":"#1d99f3ff","luma":0,"out":{"hex":"#0099f5ff","u16":[0,39362,62994,65535]}}, +{"chroma":1,"in":"#1d99f3ff","luma":0,"out":{"hex":"#0099f5ff","u16":[0,39362,62994,65535]}}, +{"chroma":-1,"in":"#1d99f3ff","luma":0.1,"out":{"hex":"#a8a8a8ff","u16":[43171,43171,43171,65535]}}, +{"chroma":0,"in":"#1d99f3ff","luma":0.1,"out":{"hex":"#60adfdff","u16":[24638,44387,65032,65535]}}, +{"chroma":0.5,"in":"#1d99f3ff","luma":0.1,"out":{"hex":"#5dadffff","u16":[23837,44421,65535,65535]}}, +{"chroma":1,"in":"#1d99f3ff","luma":0.1,"out":{"hex":"#5dadffff","u16":[23837,44421,65535,65535]}}, +{"chroma":-1,"in":"#1d99f3ff","luma":0.5,"out":{"hex":"#e6e6e6ff","u16":[59186,59186,59186,65535]}}, +{"chroma":0,"in":"#1d99f3ff","luma":0.5,"out":{"hex":"#d9e7feff","u16":[55893,59469,65367,65535]}}, +{"chroma":0.5,"in":"#1d99f3ff","luma":0.5,"out":{"hex":"#d9e7ffff","u16":[55795,59477,65535,65535]}}, +{"chroma":1,"in":"#1d99f3ff","luma":0.5,"out":{"hex":"#d9e7ffff","u16":[55795,59477,65535,65535]}}, +{"chroma":-1,"in":"#1d99f3ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#1d99f3ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#1d99f3ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#1d99f3ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#1d99f3ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#1d99f3ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#1d99f3ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#1d99f3ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#dee0e2ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#dee0e2ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#dee0e2ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#dee0e2ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#dee0e2ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#dee0e2ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#dee0e2ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#dee0e2ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#dee0e2ff","luma":-0.5,"out":{"hex":"#888888ff","u16":[34889,34889,34889,65535]}}, +{"chroma":0,"in":"#dee0e2ff","luma":-0.5,"out":{"hex":"#84888dff","u16":[33797,35062,36288,65535]}}, +{"chroma":0.5,"in":"#dee0e2ff","luma":-0.5,"out":{"hex":"#5d8dafff","u16":[23834,36314,45098,65535]}}, +{"chroma":1,"in":"#dee0e2ff","luma":-0.5,"out":{"hex":"#0091c8ff","u16":[0,37357,51317,65535]}}, +{"chroma":-1,"in":"#dee0e2ff","luma":-0.1,"out":{"hex":"#d2d2d2ff","u16":[53875,53875,53875,65535]}}, +{"chroma":0,"in":"#dee0e2ff","luma":-0.1,"out":{"hex":"#cfd2d5ff","u16":[53203,53983,54758,65535]}}, +{"chroma":0.5,"in":"#dee0e2ff","luma":-0.1,"out":{"hex":"#bad5edff","u16":[47876,54775,60822,65535]}}, +{"chroma":1,"in":"#dee0e2ff","luma":-0.1,"out":{"hex":"#a6d8ffff","u16":[42615,55449,65535,65535]}}, +{"chroma":-1,"in":"#dee0e2ff","luma":0,"out":{"hex":"#e0e0e0ff","u16":[57497,57497,57497,65535]}}, +{"chroma":0,"in":"#dee0e2ff","luma":0,"out":{"hex":"#dee0e2ff","u16":[57054,57568,58082,65535]}}, +{"chroma":0.5,"in":"#dee0e2ff","luma":0,"out":{"hex":"#d1e2f2ff","u16":[53641,58093,62212,65535]}}, +{"chroma":1,"in":"#dee0e2ff","luma":0,"out":{"hex":"#c4e4ffff","u16":[50464,58543,65535,65535]}}, +{"chroma":-1,"in":"#dee0e2ff","luma":0.1,"out":{"hex":"#edededff","u16":[60863,60863,60863,65535]}}, +{"chroma":0,"in":"#dee0e2ff","luma":0.1,"out":{"hex":"#ecedeeff","u16":[60616,60903,61192,65535]}}, +{"chroma":0.5,"in":"#dee0e2ff","luma":0.1,"out":{"hex":"#e5eef7ff","u16":[58744,61199,63565,65535]}}, +{"chroma":1,"in":"#dee0e2ff","luma":0.1,"out":{"hex":"#deefffff","u16":[57066,61453,65535,65535]}}, +{"chroma":-1,"in":"#dee0e2ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#dee0e2ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#dee0e2ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#dee0e2ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#dee0e2ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#dee0e2ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#dee0e2ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#dee0e2ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#dee0e2ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#dee0e2ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#dee0e2ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#dee0e2ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#292c30ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#292c30ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#292c30ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#292c30ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#292c30ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#292c30ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#292c30ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#292c30ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#292c30ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#292c30ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#292c30ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#292c30ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#292c30ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#292c30ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#292c30ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#292c30ff","luma":-0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#292c30ff","luma":0,"out":{"hex":"#2c2c2cff","u16":[11229,11229,11229,65535]}}, +{"chroma":0,"in":"#292c30ff","luma":0,"out":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]}}, +{"chroma":0.5,"in":"#292c30ff","luma":0,"out":{"hex":"#1c2d3dff","u16":[7141,11606,15767,65535]}}, +{"chroma":1,"in":"#292c30ff","luma":0,"out":{"hex":"#002e45ff","u16":[0,11820,17816,65535]}}, +{"chroma":-1,"in":"#292c30ff","luma":0.1,"out":{"hex":"#626262ff","u16":[25058,25058,25058,65535]}}, +{"chroma":0,"in":"#292c30ff","luma":0.1,"out":{"hex":"#5b626bff","u16":[23515,25235,27529,65535]}}, +{"chroma":0.5,"in":"#292c30ff","luma":0.1,"out":{"hex":"#3e6589ff","u16":[15936,25900,35187,65535]}}, +{"chroma":1,"in":"#292c30ff","luma":0.1,"out":{"hex":"#00679bff","u16":[0,26378,39758,65535]}}, +{"chroma":-1,"in":"#292c30ff","luma":0.5,"out":{"hex":"#bebebeff","u16":[48711,48711,48711,65535]}}, +{"chroma":0,"in":"#292c30ff","luma":0.5,"out":{"hex":"#b8bec8ff","u16":[47170,48891,51290,65535]}}, +{"chroma":0.5,"in":"#292c30ff","luma":0.5,"out":{"hex":"#9ec1e9ff","u16":[40612,49574,59978,65535]}}, +{"chroma":1,"in":"#292c30ff","luma":0.5,"out":{"hex":"#87c3ffff","u16":[34797,50071,65535,65535]}}, +{"chroma":-1,"in":"#292c30ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#292c30ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#292c30ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#292c30ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#292c30ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#292c30ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#292c30ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#292c30ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#e93a9aff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#e93a9aff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#e93a9aff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#e93a9aff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#e93a9aff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#e93a9aff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#e93a9aff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#e93a9aff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#e93a9aff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#e93a9aff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#e93a9aff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#e93a9aff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#e93a9aff","luma":-0.1,"out":{"hex":"#636363ff","u16":[25527,25527,25527,65535]}}, +{"chroma":0,"in":"#e93a9aff","luma":-0.1,"out":{"hex":"#b32c76ff","u16":[45889,11423,30330,65535]}}, +{"chroma":0.5,"in":"#e93a9aff","luma":-0.1,"out":{"hex":"#be0079ff","u16":[48879,0,31209,65535]}}, +{"chroma":1,"in":"#e93a9aff","luma":-0.1,"out":{"hex":"#be0079ff","u16":[48879,0,31209,65535]}}, +{"chroma":-1,"in":"#e93a9aff","luma":0,"out":{"hex":"#828282ff","u16":[33310,33310,33310,65535]}}, +{"chroma":0,"in":"#e93a9aff","luma":0,"out":{"hex":"#e93a9aff","u16":[59881,14906,39578,65535]}}, +{"chroma":0.5,"in":"#e93a9aff","luma":0,"out":{"hex":"#f8009eff","u16":[63783,0,40725,65535]}}, +{"chroma":1,"in":"#e93a9aff","luma":0,"out":{"hex":"#f8009eff","u16":[63783,0,40725,65535]}}, +{"chroma":-1,"in":"#e93a9aff","luma":0.1,"out":{"hex":"#999999ff","u16":[39354,39354,39354,65535]}}, +{"chroma":0,"in":"#e93a9aff","luma":0.1,"out":{"hex":"#f16badff","u16":[61996,27624,44352,65535]}}, +{"chroma":0.5,"in":"#e93a9aff","luma":0.1,"out":{"hex":"#ff5fb0ff","u16":[65535,24351,45298,65535]}}, +{"chroma":1,"in":"#e93a9aff","luma":0.1,"out":{"hex":"#ff5fb0ff","u16":[65535,24351,45298,65535]}}, +{"chroma":-1,"in":"#e93a9aff","luma":0.5,"out":{"hex":"#dcdcdcff","u16":[56646,56646,56646,65535]}}, +{"chroma":0,"in":"#e93a9aff","luma":0.5,"out":{"hex":"#fad2e2ff","u16":[64123,54030,58039,65535]}}, +{"chroma":0.5,"in":"#e93a9aff","luma":0.5,"out":{"hex":"#ffd0e3ff","u16":[65535,53474,58321,65535]}}, +{"chroma":1,"in":"#e93a9aff","luma":0.5,"out":{"hex":"#ffd0e3ff","u16":[65535,53474,58321,65535]}}, +{"chroma":-1,"in":"#e93a9aff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#e93a9aff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#e93a9aff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#e93a9aff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#e93a9aff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#e93a9aff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#e93a9aff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#e93a9aff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#e93d58ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#e93d58ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#e93d58ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#e93d58ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#e93d58ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#e93d58ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#e93d58ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#e93d58ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#e93d58ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#e93d58ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#e93d58ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#e93d58ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#e93d58ff","luma":-0.1,"out":{"hex":"#5e5e5eff","u16":[24229,24229,24229,65535]}}, +{"chroma":0,"in":"#e93d58ff","luma":-0.1,"out":{"hex":"#ae2e42ff","u16":[44807,11730,16923,65535]}}, +{"chroma":0.5,"in":"#e93d58ff","luma":-0.1,"out":{"hex":"#bd0038ff","u16":[48467,0,14336,65535]}}, +{"chroma":1,"in":"#e93d58ff","luma":-0.1,"out":{"hex":"#bd0038ff","u16":[48467,0,14336,65535]}}, +{"chroma":-1,"in":"#e93d58ff","luma":0,"out":{"hex":"#7e7e7eff","u16":[32380,32380,32380,65535]}}, +{"chroma":0,"in":"#e93d58ff","luma":0,"out":{"hex":"#e93d58ff","u16":[59881,15677,22616,65535]}}, +{"chroma":0.5,"in":"#e93d58ff","luma":0,"out":{"hex":"#fc004bff","u16":[64772,0,19159,65535]}}, +{"chroma":1,"in":"#e93d58ff","luma":0,"out":{"hex":"#fc004bff","u16":[64772,0,19159,65535]}}, +{"chroma":-1,"in":"#e93d58ff","luma":0.1,"out":{"hex":"#969696ff","u16":[38597,38597,38597,65535]}}, +{"chroma":0,"in":"#e93d58ff","luma":0.1,"out":{"hex":"#ee6f7dff","u16":[61209,28452,32071,65535]}}, +{"chroma":0.5,"in":"#e93d58ff","luma":0.1,"out":{"hex":"#ff6275ff","u16":[65535,25068,30136,65535]}}, +{"chroma":1,"in":"#e93d58ff","luma":0.1,"out":{"hex":"#ff6275ff","u16":[65535,25068,30136,65535]}}, +{"chroma":-1,"in":"#e93d58ff","luma":0.5,"out":{"hex":"#dbdbdbff","u16":[56160,56160,56160,65535]}}, +{"chroma":0,"in":"#e93d58ff","luma":0.5,"out":{"hex":"#f8d1d4ff","u16":[63767,53812,54565,65535]}}, +{"chroma":0.5,"in":"#e93d58ff","luma":0.5,"out":{"hex":"#ffcfd3ff","u16":[65535,53195,54151,65535]}}, +{"chroma":1,"in":"#e93d58ff","luma":0.5,"out":{"hex":"#ffcfd3ff","u16":[65535,53195,54151,65535]}}, +{"chroma":-1,"in":"#e93d58ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#e93d58ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#e93d58ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#e93d58ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#e93d58ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#e93d58ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#e93d58ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#e93d58ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#e9643aff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#e9643aff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#e9643aff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#e9643aff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#e9643aff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#e9643aff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#e9643aff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#e9643aff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#e9643aff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#e9643aff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#e9643aff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#e9643aff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#e9643aff","luma":-0.1,"out":{"hex":"#717171ff","u16":[29155,29155,29155,65535]}}, +{"chroma":0,"in":"#e9643aff","luma":-0.1,"out":{"hex":"#bc512fff","u16":[48443,20791,12059,65535]}}, +{"chroma":0.5,"in":"#e9643aff","luma":-0.1,"out":{"hex":"#c64a00ff","u16":[50851,18947,0,65535]}}, +{"chroma":1,"in":"#e9643aff","luma":-0.1,"out":{"hex":"#c64a00ff","u16":[50851,18947,0,65535]}}, +{"chroma":-1,"in":"#e9643aff","luma":0,"out":{"hex":"#8c8c8cff","u16":[36038,36038,36038,65535]}}, +{"chroma":0,"in":"#e9643aff","luma":0,"out":{"hex":"#e9643aff","u16":[59881,25700,14906,65535]}}, +{"chroma":0.5,"in":"#e9643aff","luma":0,"out":{"hex":"#f55b00ff","u16":[62857,23421,0,65535]}}, +{"chroma":1,"in":"#e9643aff","luma":0,"out":{"hex":"#f55b00ff","u16":[62857,23421,0,65535]}}, +{"chroma":-1,"in":"#e9643aff","luma":0.1,"out":{"hex":"#a2a2a2ff","u16":[41620,41620,41620,65535]}}, +{"chroma":0,"in":"#e9643aff","luma":0.1,"out":{"hex":"#f48369ff","u16":[62767,33615,27061,65535]}}, +{"chroma":0.5,"in":"#e9643aff","luma":0.1,"out":{"hex":"#ff7d5cff","u16":[65535,32037,23540,65535]}}, +{"chroma":1,"in":"#e9643aff","luma":0.1,"out":{"hex":"#ff7d5cff","u16":[65535,32037,23540,65535]}}, +{"chroma":-1,"in":"#e9643aff","luma":0.5,"out":{"hex":"#e2e2e2ff","u16":[58136,58136,58136,65535]}}, +{"chroma":0,"in":"#e9643aff","luma":0.5,"out":{"hex":"#fbdbd7ff","u16":[64536,56361,55203,65535]}}, +{"chroma":0.5,"in":"#e9643aff","luma":0.5,"out":{"hex":"#ffdad5ff","u16":[65535,56058,54694,65535]}}, +{"chroma":1,"in":"#e9643aff","luma":0.5,"out":{"hex":"#ffdad5ff","u16":[65535,56058,54694,65535]}}, +{"chroma":-1,"in":"#e9643aff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#e9643aff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#e9643aff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#e9643aff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#e9643aff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#e9643aff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#e9643aff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#e9643aff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#e8cb2dff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#e8cb2dff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#e8cb2dff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#e8cb2dff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#e8cb2dff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#e8cb2dff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#e8cb2dff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#e8cb2dff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#e8cb2dff","luma":-0.5,"out":{"hex":"#5c5c5cff","u16":[23761,23761,23761,65535]}}, +{"chroma":0,"in":"#e8cb2dff","luma":-0.5,"out":{"hex":"#6a5c14ff","u16":[27118,23728,5260,65535]}}, +{"chroma":0.5,"in":"#e8cb2dff","luma":-0.5,"out":{"hex":"#6a5c00ff","u16":[27235,23727,0,65535]}}, +{"chroma":1,"in":"#e8cb2dff","luma":-0.5,"out":{"hex":"#6a5c00ff","u16":[27235,23727,0,65535]}}, +{"chroma":-1,"in":"#e8cb2dff","luma":-0.1,"out":{"hex":"#bbbbbbff","u16":[48140,48140,48140,65535]}}, +{"chroma":0,"in":"#e8cb2dff","luma":-0.1,"out":{"hex":"#d6bb29ff","u16":[54942,48074,10657,65535]}}, +{"chroma":0.5,"in":"#e8cb2dff","luma":-0.1,"out":{"hex":"#d7bb00ff","u16":[55178,48072,0,65535]}}, +{"chroma":1,"in":"#e8cb2dff","luma":-0.1,"out":{"hex":"#d7bb00ff","u16":[55178,48072,0,65535]}}, +{"chroma":-1,"in":"#e8cb2dff","luma":0,"out":{"hex":"#cbcbcbff","u16":[52243,52243,52243,65535]}}, +{"chroma":0,"in":"#e8cb2dff","luma":0,"out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"chroma":0.5,"in":"#e8cb2dff","luma":0,"out":{"hex":"#e9cb00ff","u16":[59881,52168,0,65535]}}, +{"chroma":1,"in":"#e8cb2dff","luma":0,"out":{"hex":"#e9cb00ff","u16":[59881,52168,0,65535]}}, +{"chroma":-1,"in":"#e8cb2dff","luma":0.1,"out":{"hex":"#dadadaff","u16":[55991,55991,55991,65535]}}, +{"chroma":0,"in":"#e8cb2dff","luma":0.1,"out":{"hex":"#f9da30ff","u16":[63902,55914,12395,65535]}}, +{"chroma":0.5,"in":"#e8cb2dff","luma":0.1,"out":{"hex":"#fada00ff","u16":[64176,55911,0,65535]}}, +{"chroma":1,"in":"#e8cb2dff","luma":0.1,"out":{"hex":"#fada00ff","u16":[64176,55911,0,65535]}}, +{"chroma":-1,"in":"#e8cb2dff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#e8cb2dff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#e8cb2dff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#e8cb2dff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#e8cb2dff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#e8cb2dff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#e8cb2dff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#e8cb2dff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#e8cb2dff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#e8cb2dff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#e8cb2dff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#e8cb2dff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#3dd425ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#3dd425ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#3dd425ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#3dd425ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#3dd425ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#3dd425ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#3dd425ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#3dd425ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#3dd425ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#3dd425ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#3dd425ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#3dd425ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#3dd425ff","luma":-0.1,"out":{"hex":"#a6a6a6ff","u16":[42546,42546,42546,65535]}}, +{"chroma":0,"in":"#3dd425ff","luma":-0.1,"out":{"hex":"#37bf21ff","u16":[14120,49074,8565,65535]}}, +{"chroma":0.5,"in":"#3dd425ff","luma":-0.1,"out":{"hex":"#2ec000ff","u16":[11908,49256,0,65535]}}, +{"chroma":1,"in":"#3dd425ff","luma":-0.1,"out":{"hex":"#2ec000ff","u16":[11908,49256,0,65535]}}, +{"chroma":-1,"in":"#3dd425ff","luma":0,"out":{"hex":"#b8b8b8ff","u16":[47236,47236,47236,65535]}}, +{"chroma":0,"in":"#3dd425ff","luma":0,"out":{"hex":"#3dd425ff","u16":[15677,54484,9509,65535]}}, +{"chroma":0.5,"in":"#3dd425ff","luma":0,"out":{"hex":"#33d500ff","u16":[13220,54686,0,65535]}}, +{"chroma":1,"in":"#3dd425ff","luma":0,"out":{"hex":"#33d500ff","u16":[13220,54686,0,65535]}}, +{"chroma":-1,"in":"#3dd425ff","luma":0.1,"out":{"hex":"#c8c8c8ff","u16":[51424,51424,51424,65535]}}, +{"chroma":0,"in":"#3dd425ff","luma":0.1,"out":{"hex":"#42e728ff","u16":[17067,59315,10352,65535]}}, +{"chroma":0.5,"in":"#3dd425ff","luma":0.1,"out":{"hex":"#38e800ff","u16":[14393,59535,0,65535]}}, +{"chroma":1,"in":"#3dd425ff","luma":0.1,"out":{"hex":"#38e800ff","u16":[14393,59535,0,65535]}}, +{"chroma":-1,"in":"#3dd425ff","luma":0.5,"out":{"hex":"#fdfdfdff","u16":[65134,65134,65134,65535]}}, +{"chroma":0,"in":"#3dd425ff","luma":0.5,"out":{"hex":"#fafff9ff","u16":[64159,65523,64096,65535]}}, +{"chroma":0.5,"in":"#3dd425ff","luma":0.5,"out":{"hex":"#fafff9ff","u16":[64129,65535,64064,65535]}}, +{"chroma":1,"in":"#3dd425ff","luma":0.5,"out":{"hex":"#fafff9ff","u16":[64129,65535,64064,65535]}}, +{"chroma":-1,"in":"#3dd425ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#3dd425ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#3dd425ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#3dd425ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#3dd425ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#3dd425ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#3dd425ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#3dd425ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#00d3b8ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#00d3b8ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#00d3b8ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#00d3b8ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#00d3b8ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#00d3b8ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#00d3b8ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#00d3b8ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#00d3b8ff","luma":-0.5,"out":{"hex":"#1a1a1aff","u16":[6732,6732,6732,65535]}}, +{"chroma":0,"in":"#00d3b8ff","luma":-0.5,"out":{"hex":"#001e1aff","u16":[0,7587,6616,65535]}}, +{"chroma":0.5,"in":"#00d3b8ff","luma":-0.5,"out":{"hex":"#001e1aff","u16":[0,7587,6616,65535]}}, +{"chroma":1,"in":"#00d3b8ff","luma":-0.5,"out":{"hex":"#001e1aff","u16":[0,7587,6616,65535]}}, +{"chroma":-1,"in":"#00d3b8ff","luma":-0.1,"out":{"hex":"#a9a9a9ff","u16":[43538,43538,43538,65535]}}, +{"chroma":0,"in":"#00d3b8ff","luma":-0.1,"out":{"hex":"#00bfa7ff","u16":[0,49070,42791,65535]}}, +{"chroma":0.5,"in":"#00d3b8ff","luma":-0.1,"out":{"hex":"#00bfa7ff","u16":[0,49070,42791,65535]}}, +{"chroma":1,"in":"#00d3b8ff","luma":-0.1,"out":{"hex":"#00bfa7ff","u16":[0,49070,42791,65535]}}, +{"chroma":-1,"in":"#00d3b8ff","luma":0,"out":{"hex":"#bbbbbbff","u16":[48113,48113,48113,65535]}}, +{"chroma":0,"in":"#00d3b8ff","luma":0,"out":{"hex":"#00d3b8ff","u16":[0,54227,47288,65535]}}, +{"chroma":0.5,"in":"#00d3b8ff","luma":0,"out":{"hex":"#00d3b8ff","u16":[0,54227,47288,65535]}}, +{"chroma":1,"in":"#00d3b8ff","luma":0,"out":{"hex":"#00d3b8ff","u16":[0,54227,47288,65535]}}, +{"chroma":-1,"in":"#00d3b8ff","luma":0.1,"out":{"hex":"#cbcbcbff","u16":[52218,52218,52218,65535]}}, +{"chroma":0,"in":"#00d3b8ff","luma":0.1,"out":{"hex":"#00e5c8ff","u16":[0,58853,51322,65535]}}, +{"chroma":0.5,"in":"#00d3b8ff","luma":0.1,"out":{"hex":"#00e5c8ff","u16":[0,58853,51322,65535]}}, +{"chroma":1,"in":"#00d3b8ff","luma":0.1,"out":{"hex":"#00e5c8ff","u16":[0,58853,51322,65535]}}, +{"chroma":-1,"in":"#00d3b8ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#00d3b8ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#00d3b8ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#00d3b8ff","luma":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#00d3b8ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#00d3b8ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#00d3b8ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#00d3b8ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#00d3b8ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#00d3b8ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#00d3b8ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#00d3b8ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#b875dcff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#b875dcff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#b875dcff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#b875dcff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#b875dcff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#b875dcff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#b875dcff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#b875dcff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#b875dcff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#b875dcff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#b875dcff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#b875dcff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#b875dcff","luma":-0.1,"out":{"hex":"#767676ff","u16":[30413,30413,30413,65535]}}, +{"chroma":0,"in":"#b875dcff","luma":-0.1,"out":{"hex":"#a94dd3ff","u16":[43422,19771,54196,65535]}}, +{"chroma":0.5,"in":"#b875dcff","luma":-0.1,"out":{"hex":"#c100faff","u16":[49667,0,64279,65535]}}, +{"chroma":1,"in":"#b875dcff","luma":-0.1,"out":{"hex":"#c100faff","u16":[49667,0,64279,65535]}}, +{"chroma":-1,"in":"#b875dcff","luma":0,"out":{"hex":"#909090ff","u16":[37024,37024,37024,65535]}}, +{"chroma":0,"in":"#b875dcff","luma":0,"out":{"hex":"#b875dcff","u16":[47288,30069,56540,65535]}}, +{"chroma":0.5,"in":"#b875dcff","luma":0,"out":{"hex":"#cd5fffff","u16":[52594,24416,65535,65535]}}, +{"chroma":1,"in":"#b875dcff","luma":0,"out":{"hex":"#cd5fffff","u16":[52594,24416,65535,65535]}}, +{"chroma":-1,"in":"#b875dcff","luma":0.1,"out":{"hex":"#a5a5a5ff","u16":[42452,42452,42452,65535]}}, +{"chroma":0,"in":"#b875dcff","luma":0.1,"out":{"hex":"#c492e1ff","u16":[50326,37612,57899,65535]}}, +{"chroma":0.5,"in":"#b875dcff","luma":0.1,"out":{"hex":"#d585ffff","u16":[54627,34114,65535,65535]}}, +{"chroma":1,"in":"#b875dcff","luma":0.1,"out":{"hex":"#d585ffff","u16":[54627,34114,65535,65535]}}, +{"chroma":-1,"in":"#b875dcff","luma":0.5,"out":{"hex":"#e4e4e4ff","u16":[58697,58697,58697,65535]}}, +{"chroma":0,"in":"#b875dcff","luma":0.5,"out":{"hex":"#ece0f5ff","u16":[60732,57615,62989,65535]}}, +{"chroma":0.5,"in":"#b875dcff","luma":0.5,"out":{"hex":"#f1ddffff","u16":[61980,56917,65535,65535]}}, +{"chroma":1,"in":"#b875dcff","luma":0.5,"out":{"hex":"#f1ddffff","u16":[61980,56917,65535,65535]}}, +{"chroma":-1,"in":"#b875dcff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#b875dcff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#b875dcff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#b875dcff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#b875dcff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#b875dcff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#b875dcff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#b875dcff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#926ee4ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#926ee4ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#926ee4ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#926ee4ff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#926ee4ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#926ee4ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#926ee4ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#926ee4ff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#926ee4ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#926ee4ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#926ee4ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#926ee4ff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#926ee4ff","luma":-0.1,"out":{"hex":"#656565ff","u16":[26040,26040,26040,65535]}}, +{"chroma":0,"in":"#926ee4ff","luma":-0.1,"out":{"hex":"#7b40e0ff","u16":[31624,16429,57619,65535]}}, +{"chroma":0.5,"in":"#926ee4ff","luma":-0.1,"out":{"hex":"#8225ffff","u16":[33536,9568,65535,65535]}}, +{"chroma":1,"in":"#926ee4ff","luma":-0.1,"out":{"hex":"#8225ffff","u16":[33536,9568,65535,65535]}}, +{"chroma":-1,"in":"#926ee4ff","luma":0,"out":{"hex":"#838383ff","u16":[33685,33685,33685,65535]}}, +{"chroma":0,"in":"#926ee4ff","luma":0,"out":{"hex":"#926ee4ff","u16":[37522,28270,58596,65535]}}, +{"chroma":0.5,"in":"#926ee4ff","luma":0,"out":{"hex":"#9764ffff","u16":[38919,25738,65535,65535]}}, +{"chroma":1,"in":"#926ee4ff","luma":0,"out":{"hex":"#9764ffff","u16":[38919,25738,65535,65535]}}, +{"chroma":-1,"in":"#926ee4ff","luma":0.1,"out":{"hex":"#9a9a9aff","u16":[39662,39662,39662,65535]}}, +{"chroma":0,"in":"#926ee4ff","luma":0.1,"out":{"hex":"#a58ce8ff","u16":[42474,35952,59554,65535]}}, +{"chroma":0.5,"in":"#926ee4ff","luma":0.1,"out":{"hex":"#a986ffff","u16":[43530,34347,65535,65535]}}, +{"chroma":1,"in":"#926ee4ff","luma":0.1,"out":{"hex":"#a986ffff","u16":[43530,34347,65535,65535]}}, +{"chroma":-1,"in":"#926ee4ff","luma":0.5,"out":{"hex":"#ddddddff","u16":[56845,56845,56845,65535]}}, +{"chroma":0,"in":"#926ee4ff","luma":0.5,"out":{"hex":"#e0daf6ff","u16":[57604,55922,63213,65535]}}, +{"chroma":0.5,"in":"#926ee4ff","luma":0.5,"out":{"hex":"#e1d8ffff","u16":[57901,55551,65535,65535]}}, +{"chroma":1,"in":"#926ee4ff","luma":0.5,"out":{"hex":"#e1d8ffff","u16":[57901,55551,65535,65535]}}, +{"chroma":-1,"in":"#926ee4ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#926ee4ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#926ee4ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#926ee4ff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#926ee4ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#926ee4ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#926ee4ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#926ee4ff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#686b6fff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#686b6fff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#686b6fff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#686b6fff","luma":-1.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#686b6fff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#686b6fff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#686b6fff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#686b6fff","luma":-1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#686b6fff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0,"in":"#686b6fff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":0.5,"in":"#686b6fff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":1,"in":"#686b6fff","luma":-0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"chroma":-1,"in":"#686b6fff","luma":-0.1,"out":{"hex":"#404040ff","u16":[16324,16324,16324,65535]}}, +{"chroma":0,"in":"#686b6fff","luma":-0.1,"out":{"hex":"#3e4042ff","u16":[15916,16375,16987,65535]}}, +{"chroma":0.5,"in":"#686b6fff","luma":-0.1,"out":{"hex":"#2c4256ff","u16":[11307,16836,22042,65535]}}, +{"chroma":1,"in":"#686b6fff","luma":-0.1,"out":{"hex":"#004364ff","u16":[0,17234,25592,65535]}}, +{"chroma":-1,"in":"#686b6fff","luma":0,"out":{"hex":"#6b6b6bff","u16":[27414,27414,27414,65535]}}, +{"chroma":0,"in":"#686b6fff","luma":0,"out":{"hex":"#686b6fff","u16":[26728,27499,28527,65535]}}, +{"chroma":0.5,"in":"#686b6fff","luma":0,"out":{"hex":"#4a6e90ff","u16":[18988,28273,37016,65535]}}, +{"chroma":1,"in":"#686b6fff","luma":0,"out":{"hex":"#0071a7ff","u16":[0,28942,42977,65535]}}, +{"chroma":-1,"in":"#686b6fff","luma":0.1,"out":{"hex":"#878787ff","u16":[34707,34707,34707,65535]}}, +{"chroma":0,"in":"#686b6fff","luma":0.1,"out":{"hex":"#84878dff","u16":[33839,34815,36117,65535]}}, +{"chroma":0.5,"in":"#686b6fff","luma":0.1,"out":{"hex":"#5e8bb6ff","u16":[24040,35795,46864,65535]}}, +{"chroma":1,"in":"#686b6fff","luma":0.1,"out":{"hex":"#008fd4ff","u16":[0,36642,54412,65535]}}, +{"chroma":-1,"in":"#686b6fff","luma":0.5,"out":{"hex":"#d1d1d1ff","u16":[53767,53767,53767,65535]}}, +{"chroma":0,"in":"#686b6fff","luma":0.5,"out":{"hex":"#d0d1d4ff","u16":[53337,53821,54484,65535]}}, +{"chroma":0.5,"in":"#686b6fff","luma":0.5,"out":{"hex":"#bfd3ecff","u16":[49156,54318,60628,65535]}}, +{"chroma":1,"in":"#686b6fff","luma":0.5,"out":{"hex":"#afd5ffff","u16":[45030,54757,65535,65535]}}, +{"chroma":-1,"in":"#686b6fff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#686b6fff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#686b6fff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#686b6fff","luma":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#686b6fff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0,"in":"#686b6fff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":0.5,"in":"#686b6fff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":1,"in":"#686b6fff","luma":1.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"chroma":-1,"in":"#3daee980","luma":-1.5,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":0,"in":"#3daee980","luma":-1.5,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":0.5,"in":"#3daee980","luma":-1.5,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":1,"in":"#3daee980","luma":-1.5,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":-1,"in":"#3daee980","luma":-1,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":0,"in":"#3daee980","luma":-1,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":0.5,"in":"#3daee980","luma":-1,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":1,"in":"#3daee980","luma":-1,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":-1,"in":"#3daee980","luma":-0.5,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":0,"in":"#3daee980","luma":-0.5,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":0.5,"in":"#3daee980","luma":-0.5,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":1,"in":"#3daee980","luma":-0.5,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":-1,"in":"#3daee980","luma":-0.1,"out":{"hex":"#8e8e8e80","u16":[36554,36554,36554,32896]}}, +{"chroma":0,"in":"#3daee980","luma":-0.1,"out":{"hex":"#3597cb80","u16":[13627,38869,52049,32896]}}, +{"chroma":0.5,"in":"#3daee980","luma":-0.1,"out":{"hex":"#0098d180","u16":[0,39155,53665,32896]}}, +{"chroma":1,"in":"#3daee980","luma":-0.1,"out":{"hex":"#0098d180","u16":[0,39155,53665,32896]}}, +{"chroma":-1,"in":"#3daee980","luma":0,"out":{"hex":"#a4a4a480","u16":[42055,42055,42055,32896]}}, +{"chroma":0,"in":"#3daee980","luma":0,"out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"chroma":0.5,"in":"#3daee980","luma":0,"out":{"hex":"#00aff080","u16":[0,45047,61740,32896]}}, +{"chroma":1,"in":"#3daee980","luma":0,"out":{"hex":"#00aff080","u16":[0,45047,61740,32896]}}, +{"chroma":-1,"in":"#3daee980","luma":0.1,"out":{"hex":"#b6b6b680","u16":[46803,46803,46803,32896]}}, +{"chroma":0,"in":"#3daee980","luma":0.1,"out":{"hex":"#64c0f880","u16":[25711,49269,63727,32896]}}, +{"chroma":0.5,"in":"#3daee980","luma":0.1,"out":{"hex":"#52c1ff80","u16":[21106,49575,65535,32896]}}, +{"chroma":1,"in":"#3daee980","luma":0.1,"out":{"hex":"#52c1ff80","u16":[21106,49575,65535,32896]}}, +{"chroma":-1,"in":"#3daee980","luma":0.5,"out":{"hex":"#f0f0f080","u16":[61734,61734,61734,32896]}}, +{"chroma":0,"in":"#3daee980","luma":0.5,"out":{"hex":"#e6f2fd80","u16":[59033,62162,65115,32896]}}, +{"chroma":0.5,"in":"#3daee980","luma":0.5,"out":{"hex":"#e4f2ff80","u16":[58674,62217,65535,32896]}}, +{"chroma":1,"in":"#3daee980","luma":0.5,"out":{"hex":"#e4f2ff80","u16":[58674,62217,65535,32896]}}, +{"chroma":-1,"in":"#3daee980","luma":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"chroma":0,"in":"#3daee980","luma":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"chroma":0.5,"in":"#3daee980","luma":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"chroma":1,"in":"#3daee980","luma":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"chroma":-1,"in":"#3daee980","luma":1.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"chroma":0,"in":"#3daee980","luma":1.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"chroma":0.5,"in":"#3daee980","luma":1.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"chroma":1,"in":"#3daee980","luma":1.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"chroma":-1,"in":"#ffffff00","luma":-1.5,"out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"chroma":0,"in":"#ffffff00","luma":-1.5,"out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"chroma":0.5,"in":"#ffffff00","luma":-1.5,"out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"chroma":1,"in":"#ffffff00","luma":-1.5,"out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"chroma":-1,"in":"#ffffff00","luma":-1,"out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"chroma":0,"in":"#ffffff00","luma":-1,"out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"chroma":0.5,"in":"#ffffff00","luma":-1,"out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"chroma":1,"in":"#ffffff00","luma":-1,"out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"chroma":-1,"in":"#ffffff00","luma":-0.5,"out":{"hex":"#bababa00","u16":[47824,47824,47824,0]}}, +{"chroma":0,"in":"#ffffff00","luma":-0.5,"out":{"hex":"#bababa00","u16":[47824,47824,47824,0]}}, +{"chroma":0.5,"in":"#ffffff00","luma":-0.5,"out":{"hex":"#e0aeae00","u16":[57502,44773,44773,0]}}, +{"chroma":1,"in":"#ffffff00","luma":-0.5,"out":{"hex":"#ffa1a100","u16":[65535,41449,41449,0]}}, +{"chroma":-1,"in":"#ffffff00","luma":-0.1,"out":{"hex":"#f3f3f300","u16":[62470,62470,62470,0]}}, +{"chroma":0,"in":"#ffffff00","luma":-0.1,"out":{"hex":"#f3f3f300","u16":[62470,62470,62470,0]}}, +{"chroma":0.5,"in":"#ffffff00","luma":-0.1,"out":{"hex":"#f9f1f100","u16":[64025,62043,62043,0]}}, +{"chroma":1,"in":"#ffffff00","luma":-0.1,"out":{"hex":"#fff0f000","u16":[65535,61611,61611,0]}}, +{"chroma":-1,"in":"#ffffff00","luma":0,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":0,"in":"#ffffff00","luma":0,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":0.5,"in":"#ffffff00","luma":0,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":1,"in":"#ffffff00","luma":0,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":-1,"in":"#ffffff00","luma":0.1,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":0,"in":"#ffffff00","luma":0.1,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":0.5,"in":"#ffffff00","luma":0.1,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":1,"in":"#ffffff00","luma":0.1,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":-1,"in":"#ffffff00","luma":0.5,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":0,"in":"#ffffff00","luma":0.5,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":0.5,"in":"#ffffff00","luma":0.5,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":1,"in":"#ffffff00","luma":0.5,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":-1,"in":"#ffffff00","luma":1,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":0,"in":"#ffffff00","luma":1,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":0.5,"in":"#ffffff00","luma":1,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":1,"in":"#ffffff00","luma":1,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":-1,"in":"#ffffff00","luma":1.5,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":0,"in":"#ffffff00","luma":1.5,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":0.5,"in":"#ffffff00","luma":1.5,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":1,"in":"#ffffff00","luma":1.5,"out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"chroma":-1,"in":"#00000080","luma":-1.5,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":0,"in":"#00000080","luma":-1.5,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":0.5,"in":"#00000080","luma":-1.5,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":1,"in":"#00000080","luma":-1.5,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":-1,"in":"#00000080","luma":-1,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":0,"in":"#00000080","luma":-1,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":0.5,"in":"#00000080","luma":-1,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":1,"in":"#00000080","luma":-1,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":-1,"in":"#00000080","luma":-0.5,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":0,"in":"#00000080","luma":-0.5,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":0.5,"in":"#00000080","luma":-0.5,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":1,"in":"#00000080","luma":-0.5,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":-1,"in":"#00000080","luma":-0.1,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":0,"in":"#00000080","luma":-0.1,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":0.5,"in":"#00000080","luma":-0.1,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":1,"in":"#00000080","luma":-0.1,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":-1,"in":"#00000080","luma":0,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":0,"in":"#00000080","luma":0,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":0.5,"in":"#00000080","luma":0,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":1,"in":"#00000080","luma":0,"out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"chroma":-1,"in":"#00000080","luma":0.1,"out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32896]}}, +{"chroma":0,"in":"#00000080","luma":0.1,"out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32896]}}, +{"chroma":0.5,"in":"#00000080","luma":0.1,"out":{"hex":"#90414180","u16":[37051,16792,16792,32896]}}, +{"chroma":1,"in":"#00000080","luma":0.1,"out":{"hex":"#b5000080","u16":[46514,0,0,32896]}}, +{"chroma":-1,"in":"#00000080","luma":0.5,"out":{"hex":"#bababa80","u16":[47824,47824,47824,32896]}}, +{"chroma":0,"in":"#00000080","luma":0.5,"out":{"hex":"#bababa80","u16":[47824,47824,47824,32896]}}, +{"chroma":0.5,"in":"#00000080","luma":0.5,"out":{"hex":"#e0aeae80","u16":[57502,44773,44773,32896]}}, +{"chroma":1,"in":"#00000080","luma":0.5,"out":{"hex":"#ffa1a180","u16":[65535,41449,41449,32896]}}, +{"chroma":-1,"in":"#00000080","luma":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"chroma":0,"in":"#00000080","luma":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"chroma":0.5,"in":"#00000080","luma":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"chroma":1,"in":"#00000080","luma":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"chroma":-1,"in":"#00000080","luma":1.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"chroma":0,"in":"#00000080","luma":1.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"chroma":0.5,"in":"#00000080","luma":1.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"chroma":1,"in":"#00000080","luma":1.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"chroma":-1,"in":"#ff000033","luma":-1.5,"out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"chroma":0,"in":"#ff000033","luma":-1.5,"out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"chroma":0.5,"in":"#ff000033","luma":-1.5,"out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"chroma":1,"in":"#ff000033","luma":-1.5,"out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"chroma":-1,"in":"#ff000033","luma":-1,"out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"chroma":0,"in":"#ff000033","luma":-1,"out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"chroma":0.5,"in":"#ff000033","luma":-1,"out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"chroma":1,"in":"#ff000033","luma":-1,"out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"chroma":-1,"in":"#ff000033","luma":-0.5,"out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"chroma":0,"in":"#ff000033","luma":-0.5,"out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"chroma":0.5,"in":"#ff000033","luma":-0.5,"out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"chroma":1,"in":"#ff000033","luma":-0.5,"out":{"hex":"#00000033","u16":[0,0,0,13107]}}, +{"chroma":-1,"in":"#ff000033","luma":-0.1,"out":{"hex":"#5e5e5e33","u16":[24286,24286,24286,13107]}}, +{"chroma":0,"in":"#ff000033","luma":-0.1,"out":{"hex":"#bf000033","u16":[49092,0,0,13107]}}, +{"chroma":0.5,"in":"#ff000033","luma":-0.1,"out":{"hex":"#bf000033","u16":[49092,0,0,13107]}}, +{"chroma":1,"in":"#ff000033","luma":-0.1,"out":{"hex":"#bf000033","u16":[49092,0,0,13107]}}, +{"chroma":-1,"in":"#ff000033","luma":0,"out":{"hex":"#7e7e7e33","u16":[32421,32421,32421,13107]}}, +{"chroma":0,"in":"#ff000033","luma":0,"out":{"hex":"#ff000033","u16":[65535,0,0,13107]}}, +{"chroma":0.5,"in":"#ff000033","luma":0,"out":{"hex":"#ff000033","u16":[65535,0,0,13107]}}, +{"chroma":1,"in":"#ff000033","luma":0,"out":{"hex":"#ff000033","u16":[65535,0,0,13107]}}, +{"chroma":-1,"in":"#ff000033","luma":0.1,"out":{"hex":"#96969633","u16":[38630,38630,38630,13107]}}, +{"chroma":0,"in":"#ff000033","luma":0.1,"out":{"hex":"#ff646433","u16":[65535,25651,25651,13107]}}, +{"chroma":0.5,"in":"#ff000033","luma":0.1,"out":{"hex":"#ff646433","u16":[65535,25651,25651,13107]}}, +{"chroma":1,"in":"#ff000033","luma":0.1,"out":{"hex":"#ff646433","u16":[65535,25651,25651,13107]}}, +{"chroma":-1,"in":"#ff000033","luma":0.5,"out":{"hex":"#dbdbdb33","u16":[56180,56180,56180,13107]}}, +{"chroma":0,"in":"#ff000033","luma":0.5,"out":{"hex":"#ffcfcf33","u16":[65535,53312,53312,13107]}}, +{"chroma":0.5,"in":"#ff000033","luma":0.5,"out":{"hex":"#ffcfcf33","u16":[65535,53312,53312,13107]}}, +{"chroma":1,"in":"#ff000033","luma":0.5,"out":{"hex":"#ffcfcf33","u16":[65535,53312,53312,13107]}}, +{"chroma":-1,"in":"#ff000033","luma":1,"out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"chroma":0,"in":"#ff000033","luma":1,"out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"chroma":0.5,"in":"#ff000033","luma":1,"out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"chroma":1,"in":"#ff000033","luma":1,"out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"chroma":-1,"in":"#ff000033","luma":1.5,"out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"chroma":0,"in":"#ff000033","luma":1.5,"out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"chroma":0.5,"in":"#ff000033","luma":1.5,"out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"chroma":1,"in":"#ff000033","luma":1.5,"out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}} +], +"tint": [ +{"amount":-0.5,"base":"#000000ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"base":"#000000ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"base":"#000000ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.2,"base":"#000000ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.3,"base":"#000000ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.4,"base":"#000000ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.5,"base":"#000000ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.7,"base":"#000000ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1,"base":"#000000ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"base":"#000000ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"base":"#000000ff","color":"#ffffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"base":"#000000ff","color":"#ffffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"base":"#000000ff","color":"#ffffffff","out":{"hex":"#0b0b0bff","u16":[2942,2942,2942,65535]}}, +{"amount":0.2,"base":"#000000ff","color":"#ffffffff","out":{"hex":"#1e1e1eff","u16":[7632,7632,7632,65535]}}, +{"amount":0.3,"base":"#000000ff","color":"#ffffffff","out":{"hex":"#343434ff","u16":[13263,13263,13263,65535]}}, +{"amount":0.4,"base":"#000000ff","color":"#ffffffff","out":{"hex":"#4c4c4cff","u16":[19632,19632,19632,65535]}}, +{"amount":0.5,"base":"#000000ff","color":"#ffffffff","out":{"hex":"#676767ff","u16":[26586,26586,26586,65535]}}, +{"amount":0.7,"base":"#000000ff","color":"#ffffffff","out":{"hex":"#a4a4a4ff","u16":[42079,42079,42079,65535]}}, +{"amount":1,"base":"#000000ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"base":"#000000ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"base":"#000000ff","color":"#7f7f7fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"base":"#000000ff","color":"#7f7f7fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"base":"#000000ff","color":"#7f7f7fff","out":{"hex":"#070707ff","u16":[1691,1691,1691,65535]}}, +{"amount":0.2,"base":"#000000ff","color":"#7f7f7fff","out":{"hex":"#111111ff","u16":[4322,4322,4322,65535]}}, +{"amount":0.3,"base":"#000000ff","color":"#7f7f7fff","out":{"hex":"#1d1d1dff","u16":[7516,7516,7516,65535]}}, +{"amount":0.4,"base":"#000000ff","color":"#7f7f7fff","out":{"hex":"#2b2b2bff","u16":[11119,11119,11119,65535]}}, +{"amount":0.5,"base":"#000000ff","color":"#7f7f7fff","out":{"hex":"#3b3b3bff","u16":[15087,15087,15087,65535]}}, +{"amount":0.7,"base":"#000000ff","color":"#7f7f7fff","out":{"hex":"#5d5d5dff","u16":[23866,23866,23866,65535]}}, +{"amount":1,"base":"#000000ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1.5,"base":"#000000ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":-0.5,"base":"#000000ff","color":"#808080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"base":"#000000ff","color":"#808080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"base":"#000000ff","color":"#808080ff","out":{"hex":"#070707ff","u16":[1704,1704,1704,65535]}}, +{"amount":0.2,"base":"#000000ff","color":"#808080ff","out":{"hex":"#111111ff","u16":[4356,4356,4356,65535]}}, +{"amount":0.3,"base":"#000000ff","color":"#808080ff","out":{"hex":"#1d1d1dff","u16":[7556,7556,7556,65535]}}, +{"amount":0.4,"base":"#000000ff","color":"#808080ff","out":{"hex":"#2c2c2cff","u16":[11189,11189,11189,65535]}}, +{"amount":0.5,"base":"#000000ff","color":"#808080ff","out":{"hex":"#3b3b3bff","u16":[15159,15159,15159,65535]}}, +{"amount":0.7,"base":"#000000ff","color":"#808080ff","out":{"hex":"#5d5d5dff","u16":[23987,23987,23987,65535]}}, +{"amount":1,"base":"#000000ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1.5,"base":"#000000ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":-0.5,"base":"#000000ff","color":"#ff0000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"base":"#000000ff","color":"#ff0000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"base":"#000000ff","color":"#ff0000ff","out":{"hex":"#0d0000ff","u16":[3395,0,0,65535]}}, +{"amount":0.2,"base":"#000000ff","color":"#ff0000ff","out":{"hex":"#220000ff","u16":[8678,0,0,65535]}}, +{"amount":0.3,"base":"#000000ff","color":"#ff0000ff","out":{"hex":"#3b0000ff","u16":[15130,0,0,65535]}}, +{"amount":0.4,"base":"#000000ff","color":"#ff0000ff","out":{"hex":"#570000ff","u16":[22394,0,0,65535]}}, +{"amount":0.5,"base":"#000000ff","color":"#ff0000ff","out":{"hex":"#760000ff","u16":[30355,0,0,65535]}}, +{"amount":0.7,"base":"#000000ff","color":"#ff0000ff","out":{"hex":"#bb0000ff","u16":[47999,0,0,65535]}}, +{"amount":1,"base":"#000000ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":1.5,"base":"#000000ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":-0.5,"base":"#000000ff","color":"#00ff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"base":"#000000ff","color":"#00ff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"base":"#000000ff","color":"#00ff00ff","out":{"hex":"#000c00ff","u16":[0,3008,0,65535]}}, +{"amount":0.2,"base":"#000000ff","color":"#00ff00ff","out":{"hex":"#001e00ff","u16":[0,7729,0,65535]}}, +{"amount":0.3,"base":"#000000ff","color":"#00ff00ff","out":{"hex":"#003400ff","u16":[0,13466,0,65535]}}, +{"amount":0.4,"base":"#000000ff","color":"#00ff00ff","out":{"hex":"#004e00ff","u16":[0,19953,0,65535]}}, +{"amount":0.5,"base":"#000000ff","color":"#00ff00ff","out":{"hex":"#006900ff","u16":[0,27038,0,65535]}}, +{"amount":0.7,"base":"#000000ff","color":"#00ff00ff","out":{"hex":"#00a600ff","u16":[0,42774,0,65535]}}, +{"amount":1,"base":"#000000ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":1.5,"base":"#000000ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":-0.5,"base":"#000000ff","color":"#0000ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"base":"#000000ff","color":"#0000ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"base":"#000000ff","color":"#0000ffff","out":{"hex":"#000010ff","u16":[0,0,4188,65535]}}, +{"amount":0.2,"base":"#000000ff","color":"#0000ffff","out":{"hex":"#00002aff","u16":[0,0,10833,65535]}}, +{"amount":0.3,"base":"#000000ff","color":"#0000ffff","out":{"hex":"#000049ff","u16":[0,0,18840,65535]}}, +{"amount":0.4,"base":"#000000ff","color":"#0000ffff","out":{"hex":"#00006dff","u16":[0,0,27903,65535]}}, +{"amount":0.5,"base":"#000000ff","color":"#0000ffff","out":{"hex":"#000093ff","u16":[0,0,37795,65535]}}, +{"amount":0.7,"base":"#000000ff","color":"#0000ffff","out":{"hex":"#0000e9ff","u16":[0,0,59815,65535]}}, +{"amount":1,"base":"#000000ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":1.5,"base":"#000000ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":-0.5,"base":"#000000ff","color":"#ffff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"base":"#000000ff","color":"#ffff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"base":"#000000ff","color":"#ffff00ff","out":{"hex":"#0b0b00ff","u16":[2942,2942,0,65535]}}, +{"amount":0.2,"base":"#000000ff","color":"#ffff00ff","out":{"hex":"#1e1e00ff","u16":[7632,7632,0,65535]}}, +{"amount":0.3,"base":"#000000ff","color":"#ffff00ff","out":{"hex":"#343400ff","u16":[13304,13304,0,65535]}}, +{"amount":0.4,"base":"#000000ff","color":"#ffff00ff","out":{"hex":"#4d4d00ff","u16":[19668,19668,0,65535]}}, +{"amount":0.5,"base":"#000000ff","color":"#ffff00ff","out":{"hex":"#686800ff","u16":[26683,26683,0,65535]}}, +{"amount":0.7,"base":"#000000ff","color":"#ffff00ff","out":{"hex":"#a4a400ff","u16":[42218,42218,0,65535]}}, +{"amount":1,"base":"#000000ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1.5,"base":"#000000ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":-0.5,"base":"#000000ff","color":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"base":"#000000ff","color":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"base":"#000000ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.2,"base":"#000000ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.3,"base":"#000000ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.4,"base":"#000000ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.5,"base":"#000000ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.7,"base":"#000000ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1,"base":"#000000ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1.5,"base":"#000000ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":-0.5,"base":"#000000ff","color":"#3daee9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"base":"#000000ff","color":"#3daee9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"base":"#000000ff","color":"#3daee9ff","out":{"hex":"#03080bff","u16":[751,2142,2868,65535]}}, +{"amount":0.2,"base":"#000000ff","color":"#3daee9ff","out":{"hex":"#08161dff","u16":[1941,5536,7413,65535]}}, +{"amount":0.3,"base":"#000000ff","color":"#3daee9ff","out":{"hex":"#0d2532ff","u16":[3375,9626,12890,65535]}}, +{"amount":0.4,"base":"#000000ff","color":"#3daee9ff","out":{"hex":"#13384aff","u16":[5001,14265,19102,65535]}}, +{"amount":0.5,"base":"#000000ff","color":"#3daee9ff","out":{"hex":"#1a4b65ff","u16":[6781,19343,25902,65535]}}, +{"amount":0.7,"base":"#000000ff","color":"#3daee9ff","out":{"hex":"#2a779fff","u16":[10726,30596,40970,65535]}}, +{"amount":1,"base":"#000000ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":1.5,"base":"#000000ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":-0.5,"base":"#000000ff","color":"#232629ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"base":"#000000ff","color":"#232629ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"base":"#000000ff","color":"#232629ff","out":{"hex":"#040404ff","u16":[987,1071,1156,65535]}}, +{"amount":0.2,"base":"#000000ff","color":"#232629ff","out":{"hex":"#0a0b0cff","u16":[2541,2759,2977,65535]}}, +{"amount":0.3,"base":"#000000ff","color":"#232629ff","out":{"hex":"#111314ff","u16":[4415,4793,5172,65535]}}, +{"amount":0.4,"base":"#000000ff","color":"#232629ff","out":{"hex":"#191c1eff","u16":[6537,7097,7657,65535]}}, +{"amount":0.5,"base":"#000000ff","color":"#232629ff","out":{"hex":"#222528ff","u16":[8860,9620,10379,65535]}}, +{"amount":0.7,"base":"#000000ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8993,9764,10535,65535]}}, +{"amount":1,"base":"#000000ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":1.5,"base":"#000000ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":-0.5,"base":"#000000ff","color":"#eff0f1ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"base":"#000000ff","color":"#eff0f1ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"base":"#000000ff","color":"#eff0f1ff","out":{"hex":"#0b0b0bff","u16":[2819,2831,2843,65535]}}, +{"amount":0.2,"base":"#000000ff","color":"#eff0f1ff","out":{"hex":"#1c1c1cff","u16":[7199,7229,7259,65535]}}, +{"amount":0.3,"base":"#000000ff","color":"#eff0f1ff","out":{"hex":"#313131ff","u16":[12507,12560,12612,65535]}}, +{"amount":0.4,"base":"#000000ff","color":"#eff0f1ff","out":{"hex":"#484849ff","u16":[18501,18578,18656,65535]}}, +{"amount":0.5,"base":"#000000ff","color":"#eff0f1ff","out":{"hex":"#626262ff","u16":[25069,25174,25279,65535]}}, +{"amount":0.7,"base":"#000000ff","color":"#eff0f1ff","out":{"hex":"#9a9b9cff","u16":[39535,39862,40188,65535]}}, +{"amount":1,"base":"#000000ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":1.5,"base":"#000000ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":-0.5,"base":"#000000ff","color":"#fcfcfcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"base":"#000000ff","color":"#fcfcfcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"base":"#000000ff","color":"#fcfcfcff","out":{"hex":"#0b0b0bff","u16":[2907,2907,2907,65535]}}, +{"amount":0.2,"base":"#000000ff","color":"#fcfcfcff","out":{"hex":"#1d1d1dff","u16":[7542,7542,7542,65535]}}, +{"amount":0.3,"base":"#000000ff","color":"#fcfcfcff","out":{"hex":"#333333ff","u16":[13108,13108,13108,65535]}}, +{"amount":0.4,"base":"#000000ff","color":"#fcfcfcff","out":{"hex":"#4b4b4bff","u16":[19401,19401,19401,65535]}}, +{"amount":0.5,"base":"#000000ff","color":"#fcfcfcff","out":{"hex":"#666666ff","u16":[26305,26305,26305,65535]}}, +{"amount":0.7,"base":"#000000ff","color":"#fcfcfcff","out":{"hex":"#a2a2a2ff","u16":[41639,41639,41639,65535]}}, +{"amount":1,"base":"#000000ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1.5,"base":"#000000ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":-0.5,"base":"#000000ff","color":"#da4453ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"base":"#000000ff","color":"#da4453ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"base":"#000000ff","color":"#da4453ff","out":{"hex":"#0b0404ff","u16":[2902,905,1105,65535]}}, +{"amount":0.2,"base":"#000000ff","color":"#da4453ff","out":{"hex":"#1d090bff","u16":[7538,2351,2870,65535]}}, +{"amount":0.3,"base":"#000000ff","color":"#da4453ff","out":{"hex":"#331013ff","u16":[13101,4087,4988,65535]}}, +{"amount":0.4,"base":"#000000ff","color":"#da4453ff","out":{"hex":"#4b181dff","u16":[19378,6044,7378,65535]}}, +{"amount":0.5,"base":"#000000ff","color":"#da4453ff","out":{"hex":"#662027ff","u16":[26268,8193,10001,65535]}}, +{"amount":0.7,"base":"#000000ff","color":"#da4453ff","out":{"hex":"#a2323eff","u16":[41559,12963,15823,65535]}}, +{"amount":1,"base":"#000000ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":1.5,"base":"#000000ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":-0.5,"base":"#000000ff","color":"#e8cb2dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"base":"#000000ff","color":"#e8cb2dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"base":"#000000ff","color":"#e8cb2dff","out":{"hex":"#0b0902ff","u16":[2737,2395,531,65535]}}, +{"amount":0.2,"base":"#000000ff","color":"#e8cb2dff","out":{"hex":"#1c1805ff","u16":[7120,6230,1381,65535]}}, +{"amount":0.3,"base":"#000000ff","color":"#e8cb2dff","out":{"hex":"#302a09ff","u16":[12361,10817,2398,65535]}}, +{"amount":0.4,"base":"#000000ff","color":"#e8cb2dff","out":{"hex":"#473e0eff","u16":[18315,16025,3552,65535]}}, +{"amount":0.5,"base":"#000000ff","color":"#e8cb2dff","out":{"hex":"#615513ff","u16":[24833,21729,4817,65535]}}, +{"amount":0.7,"base":"#000000ff","color":"#e8cb2dff","out":{"hex":"#99861eff","u16":[39294,34383,7622,65535]}}, +{"amount":1,"base":"#000000ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":1.5,"base":"#000000ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":-0.5,"base":"#000000ff","color":"#3daee980","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"base":"#000000ff","color":"#3daee980","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"base":"#000000ff","color":"#3daee980","out":{"hex":"#03080bd1","u16":[756,2158,2889,53656]}}, +{"amount":0.2,"base":"#000000ff","color":"#3daee980","out":{"hex":"#08161dbe","u16":[1943,5542,7421,48879]}}, +{"amount":0.3,"base":"#000000ff","color":"#3daee980","out":{"hex":"#0d2632b1","u16":[3379,9639,12908,45382]}}, +{"amount":0.4,"base":"#000000ff","color":"#3daee980","out":{"hex":"#13384aa6","u16":[5004,14274,19114,42570]}}, +{"amount":0.5,"base":"#000000ff","color":"#3daee980","out":{"hex":"#1a4b659c","u16":[6779,19335,25891,40207]}}, +{"amount":0.7,"base":"#000000ff","color":"#3daee980","out":{"hex":"#2a779f8d","u16":[10730,30607,40986,36332]}}, +{"amount":1,"base":"#000000ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":1.5,"base":"#000000ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":-0.5,"base":"#000000ff","color":"#ffffff00","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0,"base":"#000000ff","color":"#ffffff00","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":0.1,"base":"#000000ff","color":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,5]}}, +{"amount":0.2,"base":"#000000ff","color":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,5]}}, +{"amount":0.3,"base":"#000000ff","color":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,5]}}, +{"amount":0.4,"base":"#000000ff","color":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,5]}}, +{"amount":0.5,"base":"#000000ff","color":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,5]}}, +{"amount":0.7,"base":"#000000ff","color":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,5]}}, +{"amount":1,"base":"#000000ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"base":"#000000ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"base":"#ffffffff","color":"#000000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"base":"#ffffffff","color":"#000000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"base":"#ffffffff","color":"#000000ff","out":{"hex":"#fcfcfcff","u16":[64862,64862,64862,65535]}}, +{"amount":0.2,"base":"#ffffffff","color":"#000000ff","out":{"hex":"#ecececff","u16":[60636,60636,60636,65535]}}, +{"amount":0.3,"base":"#ffffffff","color":"#000000ff","out":{"hex":"#cbcbcbff","u16":[52290,52290,52290,65535]}}, +{"amount":0.4,"base":"#ffffffff","color":"#000000ff","out":{"hex":"#a5a5a5ff","u16":[42517,42517,42517,65535]}}, +{"amount":0.5,"base":"#ffffffff","color":"#000000ff","out":{"hex":"#838383ff","u16":[33590,33590,33590,65535]}}, +{"amount":0.7,"base":"#ffffffff","color":"#000000ff","out":{"hex":"#4d4d4dff","u16":[19909,19909,19909,65535]}}, +{"amount":1,"base":"#ffffffff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"base":"#ffffffff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"base":"#ffffffff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"base":"#ffffffff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"base":"#ffffffff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.2,"base":"#ffffffff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.3,"base":"#ffffffff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.4,"base":"#ffffffff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.5,"base":"#ffffffff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.7,"base":"#ffffffff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"base":"#ffffffff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"base":"#ffffffff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"base":"#ffffffff","color":"#7f7f7fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"base":"#ffffffff","color":"#7f7f7fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"base":"#ffffffff","color":"#7f7f7fff","out":{"hex":"#fefefeff","u16":[65381,65381,65381,65535]}}, +{"amount":0.2,"base":"#ffffffff","color":"#7f7f7fff","out":{"hex":"#fafafaff","u16":[64331,64331,64331,65535]}}, +{"amount":0.3,"base":"#ffffffff","color":"#7f7f7fff","out":{"hex":"#f0f0f0ff","u16":[61717,61717,61717,65535]}}, +{"amount":0.4,"base":"#ffffffff","color":"#7f7f7fff","out":{"hex":"#dfdfdfff","u16":[57414,57414,57414,65535]}}, +{"amount":0.5,"base":"#ffffffff","color":"#7f7f7fff","out":{"hex":"#cacacaff","u16":[51894,51894,51894,65535]}}, +{"amount":0.7,"base":"#ffffffff","color":"#7f7f7fff","out":{"hex":"#9c9c9cff","u16":[40095,40095,40095,65535]}}, +{"amount":1,"base":"#ffffffff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1.5,"base":"#ffffffff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":-0.5,"base":"#ffffffff","color":"#808080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"base":"#ffffffff","color":"#808080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"base":"#ffffffff","color":"#808080ff","out":{"hex":"#fefefeff","u16":[65382,65382,65382,65535]}}, +{"amount":0.2,"base":"#ffffffff","color":"#808080ff","out":{"hex":"#fafafaff","u16":[64347,64347,64347,65535]}}, +{"amount":0.3,"base":"#ffffffff","color":"#808080ff","out":{"hex":"#f0f0f0ff","u16":[61752,61752,61752,65535]}}, +{"amount":0.4,"base":"#ffffffff","color":"#808080ff","out":{"hex":"#e0e0e0ff","u16":[57491,57491,57491,65535]}}, +{"amount":0.5,"base":"#ffffffff","color":"#808080ff","out":{"hex":"#cacacaff","u16":[52011,52011,52011,65535]}}, +{"amount":0.7,"base":"#ffffffff","color":"#808080ff","out":{"hex":"#9d9d9dff","u16":[40246,40246,40246,65535]}}, +{"amount":1,"base":"#ffffffff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1.5,"base":"#ffffffff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":-0.5,"base":"#ffffffff","color":"#ff0000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"base":"#ffffffff","color":"#ff0000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"base":"#ffffffff","color":"#ff0000ff","out":{"hex":"#fffefeff","u16":[65535,65341,65341,65535]}}, +{"amount":0.2,"base":"#ffffffff","color":"#ff0000ff","out":{"hex":"#fff9f9ff","u16":[65535,63985,63985,65535]}}, +{"amount":0.3,"base":"#ffffffff","color":"#ff0000ff","out":{"hex":"#ffececff","u16":[65535,60588,60588,65535]}}, +{"amount":0.4,"base":"#ffffffff","color":"#ff0000ff","out":{"hex":"#ffd6d6ff","u16":[65535,54885,54885,65535]}}, +{"amount":0.5,"base":"#ffffffff","color":"#ff0000ff","out":{"hex":"#ffb8b8ff","u16":[65535,47269,47269,65535]}}, +{"amount":0.7,"base":"#ffffffff","color":"#ff0000ff","out":{"hex":"#ff6e6eff","u16":[65535,28299,28299,65535]}}, +{"amount":1,"base":"#ffffffff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":1.5,"base":"#ffffffff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":-0.5,"base":"#ffffffff","color":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"base":"#ffffffff","color":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"base":"#ffffffff","color":"#00ff00ff","out":{"hex":"#fefffeff","u16":[65276,65535,65276,65535]}}, +{"amount":0.2,"base":"#ffffffff","color":"#00ff00ff","out":{"hex":"#f7fff7ff","u16":[63446,65535,63446,65535]}}, +{"amount":0.3,"base":"#ffffffff","color":"#00ff00ff","out":{"hex":"#e4ffe4ff","u16":[58471,65535,58471,65535]}}, +{"amount":0.4,"base":"#ffffffff","color":"#00ff00ff","out":{"hex":"#bcffbcff","u16":[48423,65535,48423,65535]}}, +{"amount":0.5,"base":"#ffffffff","color":"#00ff00ff","out":{"hex":"#6eff6eff","u16":[28218,65535,28218,65535]}}, +{"amount":0.7,"base":"#ffffffff","color":"#00ff00ff","out":{"hex":"#06ff06ff","u16":[1494,65535,1494,65535]}}, +{"amount":1,"base":"#ffffffff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":1.5,"base":"#ffffffff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":-0.5,"base":"#ffffffff","color":"#0000ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"base":"#ffffffff","color":"#0000ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"base":"#ffffffff","color":"#0000ffff","out":{"hex":"#fefeffff","u16":[65217,65217,65535,65535]}}, +{"amount":0.2,"base":"#ffffffff","color":"#0000ffff","out":{"hex":"#f5f5ffff","u16":[63083,63083,65535,65535]}}, +{"amount":0.3,"base":"#ffffffff","color":"#0000ffff","out":{"hex":"#e2e2ffff","u16":[58093,58093,65535,65535]}}, +{"amount":0.4,"base":"#ffffffff","color":"#0000ffff","out":{"hex":"#c5c5ffff","u16":[50744,50744,65535,65535]}}, +{"amount":0.5,"base":"#ffffffff","color":"#0000ffff","out":{"hex":"#a5a5ffff","u16":[42364,42364,65535,65535]}}, +{"amount":0.7,"base":"#ffffffff","color":"#0000ffff","out":{"hex":"#6666ffff","u16":[26095,26095,65535,65535]}}, +{"amount":1,"base":"#ffffffff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":1.5,"base":"#ffffffff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":-0.5,"base":"#ffffffff","color":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"base":"#ffffffff","color":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"base":"#ffffffff","color":"#ffff00ff","out":{"hex":"#fffffbff","u16":[65535,65535,64628,65535]}}, +{"amount":0.2,"base":"#ffffffff","color":"#ffff00ff","out":{"hex":"#ffffe1ff","u16":[65535,65535,57937,65535]}}, +{"amount":0.3,"base":"#ffffffff","color":"#ffff00ff","out":{"hex":"#ffff82ff","u16":[65535,65535,33524,65535]}}, +{"amount":0.4,"base":"#ffffffff","color":"#ffff00ff","out":{"hex":"#ffff06ff","u16":[65535,65535,1494,65535]}}, +{"amount":0.5,"base":"#ffffffff","color":"#ffff00ff","out":{"hex":"#ffff06ff","u16":[65535,65535,1494,65535]}}, +{"amount":0.7,"base":"#ffffffff","color":"#ffff00ff","out":{"hex":"#ffff06ff","u16":[65535,65535,1494,65535]}}, +{"amount":1,"base":"#ffffffff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1.5,"base":"#ffffffff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":-0.5,"base":"#ffffffff","color":"#030201ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"base":"#ffffffff","color":"#030201ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"base":"#ffffffff","color":"#030201ff","out":{"hex":"#fcfcfcff","u16":[64859,64854,64850,65535]}}, +{"amount":0.2,"base":"#ffffffff","color":"#030201ff","out":{"hex":"#ecececff","u16":[60716,60630,60544,65535]}}, +{"amount":0.3,"base":"#ffffffff","color":"#030201ff","out":{"hex":"#cdcbc9ff","u16":[52780,52233,51684,65535]}}, +{"amount":0.4,"base":"#ffffffff","color":"#030201ff","out":{"hex":"#a9a5a1ff","u16":[43421,42388,41355,65535]}}, +{"amount":0.5,"base":"#ffffffff","color":"#030201ff","out":{"hex":"#88827cff","u16":[34866,33379,31892,65535]}}, +{"amount":0.7,"base":"#ffffffff","color":"#030201ff","out":{"hex":"#564c42ff","u16":[22031,19536,17042,65535]}}, +{"amount":1,"base":"#ffffffff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1.5,"base":"#ffffffff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":-0.5,"base":"#ffffffff","color":"#3daee9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"base":"#ffffffff","color":"#3daee9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"base":"#ffffffff","color":"#3daee9ff","out":{"hex":"#feffffff","u16":[65336,65445,65509,65535]}}, +{"amount":0.2,"base":"#ffffffff","color":"#3daee9ff","out":{"hex":"#f9fcfeff","u16":[64027,64815,65327,65535]}}, +{"amount":0.3,"base":"#ffffffff","color":"#3daee9ff","out":{"hex":"#ecf6fcff","u16":[60771,63172,64842,65535]}}, +{"amount":0.4,"base":"#ffffffff","color":"#3daee9ff","out":{"hex":"#d7ebf9ff","u16":[55189,60293,63998,65535]}}, +{"amount":0.5,"base":"#ffffffff","color":"#3daee9ff","out":{"hex":"#b7dcf6ff","u16":[46919,56413,63270,65535]}}, +{"amount":0.7,"base":"#ffffffff","color":"#3daee9ff","out":{"hex":"#45b9f5ff","u16":[17645,47484,63063,65535]}}, +{"amount":1,"base":"#ffffffff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":1.5,"base":"#ffffffff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":-0.5,"base":"#ffffffff","color":"#232629ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"base":"#ffffffff","color":"#232629ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"base":"#ffffffff","color":"#232629ff","out":{"hex":"#fdfdfdff","u16":[64995,65000,65006,65535]}}, +{"amount":0.2,"base":"#ffffffff","color":"#232629ff","out":{"hex":"#eff0f0ff","u16":[61534,61624,61715,65535]}}, +{"amount":0.3,"base":"#ffffffff","color":"#232629ff","out":{"hex":"#d3d4d6ff","u16":[54105,54583,55070,65535]}}, +{"amount":0.4,"base":"#ffffffff","color":"#232629ff","out":{"hex":"#acb2b8ff","u16":[44289,45776,47267,65535]}}, +{"amount":0.5,"base":"#ffffffff","color":"#232629ff","out":{"hex":"#8a9198ff","u16":[35364,37173,38978,65535]}}, +{"amount":0.7,"base":"#ffffffff","color":"#232629ff","out":{"hex":"#555b61ff","u16":[21874,23445,25015,65535]}}, +{"amount":1,"base":"#ffffffff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":1.5,"base":"#ffffffff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":-0.5,"base":"#ffffffff","color":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"base":"#ffffffff","color":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"base":"#ffffffff","color":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65465,65469,65473,65535]}}, +{"amount":0.2,"base":"#ffffffff","color":"#eff0f1ff","out":{"hex":"#fdfdfdff","u16":[64978,65012,65047,65535]}}, +{"amount":0.3,"base":"#ffffffff","color":"#eff0f1ff","out":{"hex":"#f8f8f9ff","u16":[63705,63817,63930,65535]}}, +{"amount":0.4,"base":"#ffffffff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61424,61681,61938,65535]}}, +{"amount":0.5,"base":"#ffffffff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61424,61681,61938,65535]}}, +{"amount":0.7,"base":"#ffffffff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61424,61681,61938,65535]}}, +{"amount":1,"base":"#ffffffff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":1.5,"base":"#ffffffff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":-0.5,"base":"#ffffffff","color":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"base":"#ffffffff","color":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"base":"#ffffffff","color":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65472,65472,65472,65535]}}, +{"amount":0.2,"base":"#ffffffff","color":"#fcfcfcff","out":{"hex":"#fdfdfdff","u16":[65034,65034,65034,65535]}}, +{"amount":0.3,"base":"#ffffffff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.4,"base":"#ffffffff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.5,"base":"#ffffffff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.7,"base":"#ffffffff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1,"base":"#ffffffff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1.5,"base":"#ffffffff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":-0.5,"base":"#ffffffff","color":"#da4453ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"base":"#ffffffff","color":"#da4453ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"base":"#ffffffff","color":"#da4453ff","out":{"hex":"#fffefeff","u16":[65491,65335,65349,65535]}}, +{"amount":0.2,"base":"#ffffffff","color":"#da4453ff","out":{"hex":"#fef9f9ff","u16":[65171,63991,64087,65535]}}, +{"amount":0.3,"base":"#ffffffff","color":"#da4453ff","out":{"hex":"#faecedff","u16":[64334,60663,60940,65535]}}, +{"amount":0.4,"base":"#ffffffff","color":"#da4453ff","out":{"hex":"#f5d7d9ff","u16":[62936,55180,55727,65535]}}, +{"amount":0.5,"base":"#ffffffff","color":"#da4453ff","out":{"hex":"#eebbbfff","u16":[61197,48097,48987,65535]}}, +{"amount":0.7,"base":"#ffffffff","color":"#da4453ff","out":{"hex":"#e37b82ff","u16":[58322,31508,33488,65535]}}, +{"amount":1,"base":"#ffffffff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":1.5,"base":"#ffffffff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":-0.5,"base":"#ffffffff","color":"#e8cb2dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"base":"#ffffffff","color":"#e8cb2dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"base":"#ffffffff","color":"#e8cb2dff","out":{"hex":"#fffffeff","u16":[65501,65459,65263,65535]}}, +{"amount":0.2,"base":"#ffffffff","color":"#e8cb2dff","out":{"hex":"#fefdf7ff","u16":[65278,64925,63420,65535]}}, +{"amount":0.3,"base":"#ffffffff","color":"#e8cb2dff","out":{"hex":"#fdf7e0ff","u16":[65019,63536,57529,65535]}}, +{"amount":0.4,"base":"#ffffffff","color":"#e8cb2dff","out":{"hex":"#fcedaeff","u16":[64880,61011,44815,65535]}}, +{"amount":0.5,"base":"#ffffffff","color":"#e8cb2dff","out":{"hex":"#fbdf46ff","u16":[64535,57326,18053,65535]}}, +{"amount":0.7,"base":"#ffffffff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59628,52176,11570,65535]}}, +{"amount":1,"base":"#ffffffff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":1.5,"base":"#ffffffff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":-0.5,"base":"#ffffffff","color":"#3daee980","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"base":"#ffffffff","color":"#3daee980","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"base":"#ffffffff","color":"#3daee980","out":{"hex":"#feffffd6","u16":[65336,65448,65511,55050]}}, +{"amount":0.2,"base":"#ffffffff","color":"#3daee980","out":{"hex":"#f9fcfebe","u16":[63984,64825,65333,48902]}}, +{"amount":0.3,"base":"#ffffffff","color":"#3daee980","out":{"hex":"#ecf6fcac","u16":[60619,63212,64868,44109]}}, +{"amount":0.4,"base":"#ffffffff","color":"#3daee980","out":{"hex":"#d5ebf99d","u16":[54869,60383,64051,40302]}}, +{"amount":0.5,"base":"#ffffffff","color":"#3daee980","out":{"hex":"#b6dcf591","u16":[46857,56456,62938,37346]}}, +{"amount":0.7,"base":"#ffffffff","color":"#3daee980","out":{"hex":"#47b9f482","u16":[18310,47464,62686,33524]}}, +{"amount":1,"base":"#ffffffff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":1.5,"base":"#ffffffff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":-0.5,"base":"#ffffffff","color":"#ffffff00","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0,"base":"#ffffffff","color":"#ffffff00","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.1,"base":"#ffffffff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,5]}}, +{"amount":0.2,"base":"#ffffffff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,5]}}, +{"amount":0.3,"base":"#ffffffff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,5]}}, +{"amount":0.4,"base":"#ffffffff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,5]}}, +{"amount":0.5,"base":"#ffffffff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,5]}}, +{"amount":0.7,"base":"#ffffffff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,5]}}, +{"amount":1,"base":"#ffffffff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"base":"#ffffffff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"base":"#7f7f7fff","color":"#000000ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"base":"#7f7f7fff","color":"#000000ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"base":"#7f7f7fff","color":"#000000ff","out":{"hex":"#7f7f7fff","u16":[32524,32524,32524,65535]}}, +{"amount":0.2,"base":"#7f7f7fff","color":"#000000ff","out":{"hex":"#7c7c7cff","u16":[31748,31748,31748,65535]}}, +{"amount":0.3,"base":"#7f7f7fff","color":"#000000ff","out":{"hex":"#747474ff","u16":[29837,29837,29837,65535]}}, +{"amount":0.4,"base":"#7f7f7fff","color":"#000000ff","out":{"hex":"#686868ff","u16":[26747,26747,26747,65535]}}, +{"amount":0.5,"base":"#7f7f7fff","color":"#000000ff","out":{"hex":"#595959ff","u16":[22857,22857,22857,65535]}}, +{"amount":0.7,"base":"#7f7f7fff","color":"#000000ff","out":{"hex":"#373737ff","u16":[14074,14074,14074,65535]}}, +{"amount":1,"base":"#7f7f7fff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"base":"#7f7f7fff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"base":"#7f7f7fff","color":"#ffffffff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"base":"#7f7f7fff","color":"#ffffffff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"base":"#7f7f7fff","color":"#ffffffff","out":{"hex":"#7f7f7fff","u16":[32728,32728,32728,65535]}}, +{"amount":0.2,"base":"#7f7f7fff","color":"#ffffffff","out":{"hex":"#828282ff","u16":[33349,33349,33349,65535]}}, +{"amount":0.3,"base":"#7f7f7fff","color":"#ffffffff","out":{"hex":"#888888ff","u16":[34978,34978,34978,65535]}}, +{"amount":0.4,"base":"#7f7f7fff","color":"#ffffffff","out":{"hex":"#939393ff","u16":[37906,37906,37906,65535]}}, +{"amount":0.5,"base":"#7f7f7fff","color":"#ffffffff","out":{"hex":"#a4a4a4ff","u16":[42234,42234,42234,65535]}}, +{"amount":0.7,"base":"#7f7f7fff","color":"#ffffffff","out":{"hex":"#d4d4d4ff","u16":[54512,54512,54512,65535]}}, +{"amount":1,"base":"#7f7f7fff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"base":"#7f7f7fff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"base":"#7f7f7fff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"base":"#7f7f7fff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"base":"#7f7f7fff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.2,"base":"#7f7f7fff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.3,"base":"#7f7f7fff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.4,"base":"#7f7f7fff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.5,"base":"#7f7f7fff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.7,"base":"#7f7f7fff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1,"base":"#7f7f7fff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1.5,"base":"#7f7f7fff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":-0.5,"base":"#7f7f7fff","color":"#808080ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"base":"#7f7f7fff","color":"#808080ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"base":"#7f7f7fff","color":"#808080ff","out":{"hex":"#7f7f7fff","u16":[32676,32676,32676,65535]}}, +{"amount":0.2,"base":"#7f7f7fff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.3,"base":"#7f7f7fff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.4,"base":"#7f7f7fff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.5,"base":"#7f7f7fff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.7,"base":"#7f7f7fff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1,"base":"#7f7f7fff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1.5,"base":"#7f7f7fff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":-0.5,"base":"#7f7f7fff","color":"#ff0000ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"base":"#7f7f7fff","color":"#ff0000ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"base":"#7f7f7fff","color":"#ff0000ff","out":{"hex":"#b46b6bff","u16":[46141,27547,27547,65535]}}, +{"amount":0.2,"base":"#7f7f7fff","color":"#ff0000ff","out":{"hex":"#d65353ff","u16":[54982,21394,21394,65535]}}, +{"amount":0.3,"base":"#7f7f7fff","color":"#ff0000ff","out":{"hex":"#ec3434ff","u16":[60547,13272,13272,65535]}}, +{"amount":0.4,"base":"#7f7f7fff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65533,2,2,65535]}}, +{"amount":0.5,"base":"#7f7f7fff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65533,2,2,65535]}}, +{"amount":0.7,"base":"#7f7f7fff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65533,2,2,65535]}}, +{"amount":1,"base":"#7f7f7fff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":1.5,"base":"#7f7f7fff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":-0.5,"base":"#7f7f7fff","color":"#00ff00ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"base":"#7f7f7fff","color":"#00ff00ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"base":"#7f7f7fff","color":"#00ff00ff","out":{"hex":"#508d50ff","u16":[20609,36257,20609,65535]}}, +{"amount":0.2,"base":"#7f7f7fff","color":"#00ff00ff","out":{"hex":"#3b933bff","u16":[15149,37760,15149,65535]}}, +{"amount":0.3,"base":"#7f7f7fff","color":"#00ff00ff","out":{"hex":"#2d9a2dff","u16":[11450,39706,11450,65535]}}, +{"amount":0.4,"base":"#7f7f7fff","color":"#00ff00ff","out":{"hex":"#22a622ff","u16":[8716,42680,8716,65535]}}, +{"amount":0.5,"base":"#7f7f7fff","color":"#00ff00ff","out":{"hex":"#19b719ff","u16":[6443,46916,6443,65535]}}, +{"amount":0.7,"base":"#7f7f7fff","color":"#00ff00ff","out":{"hex":"#08e608ff","u16":[2071,59069,2071,65535]}}, +{"amount":1,"base":"#7f7f7fff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":1.5,"base":"#7f7f7fff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":-0.5,"base":"#7f7f7fff","color":"#0000ffff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"base":"#7f7f7fff","color":"#0000ffff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"base":"#7f7f7fff","color":"#0000ffff","out":{"hex":"#7a7aabff","u16":[31478,31478,44013,65535]}}, +{"amount":0.2,"base":"#7f7f7fff","color":"#0000ffff","out":{"hex":"#7676c0ff","u16":[30348,30348,49304,65535]}}, +{"amount":0.3,"base":"#7f7f7fff","color":"#0000ffff","out":{"hex":"#6f6fcfff","u16":[28531,28531,53326,65535]}}, +{"amount":0.4,"base":"#7f7f7fff","color":"#0000ffff","out":{"hex":"#6262e6ff","u16":[25203,25203,59119,65535]}}, +{"amount":0.5,"base":"#7f7f7fff","color":"#0000ffff","out":{"hex":"#5151f6ff","u16":[20713,20713,63204,65535]}}, +{"amount":0.7,"base":"#7f7f7fff","color":"#0000ffff","out":{"hex":"#1818ffff","u16":[6130,6130,65529,65535]}}, +{"amount":1,"base":"#7f7f7fff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":1.5,"base":"#7f7f7fff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":-0.5,"base":"#7f7f7fff","color":"#ffff00ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"base":"#7f7f7fff","color":"#ffff00ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"base":"#7f7f7fff","color":"#ffff00ff","out":{"hex":"#82824eff","u16":[33478,33478,20001,65535]}}, +{"amount":0.2,"base":"#7f7f7fff","color":"#ffff00ff","out":{"hex":"#858539ff","u16":[34282,34282,14662,65535]}}, +{"amount":0.3,"base":"#7f7f7fff","color":"#ffff00ff","out":{"hex":"#8c8c2cff","u16":[35963,35963,11286,65535]}}, +{"amount":0.4,"base":"#7f7f7fff","color":"#ffff00ff","out":{"hex":"#979722ff","u16":[38894,38894,8859,65535]}}, +{"amount":0.5,"base":"#7f7f7fff","color":"#ffff00ff","out":{"hex":"#a8a81bff","u16":[43183,43183,6867,65535]}}, +{"amount":0.7,"base":"#7f7f7fff","color":"#ffff00ff","out":{"hex":"#d8d80cff","u16":[55447,55447,2970,65535]}}, +{"amount":1,"base":"#7f7f7fff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1.5,"base":"#7f7f7fff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":-0.5,"base":"#7f7f7fff","color":"#030201ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"base":"#7f7f7fff","color":"#030201ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"base":"#7f7f7fff","color":"#030201ff","out":{"hex":"#7f7f7eff","u16":[32612,32511,32412,65535]}}, +{"amount":0.2,"base":"#7f7f7fff","color":"#030201ff","out":{"hex":"#7c7b7bff","u16":[31932,31714,31497,65535]}}, +{"amount":0.3,"base":"#7f7f7fff","color":"#030201ff","out":{"hex":"#757472ff","u16":[30160,29784,29410,65535]}}, +{"amount":0.4,"base":"#7f7f7fff","color":"#030201ff","out":{"hex":"#6a6865ff","u16":[27251,26663,26077,65535]}}, +{"amount":0.5,"base":"#7f7f7fff","color":"#030201ff","out":{"hex":"#5c5855ff","u16":[23592,22731,21875,65535]}}, +{"amount":0.7,"base":"#7f7f7fff","color":"#030201ff","out":{"hex":"#3c3630ff","u16":[15450,13837,12231,65535]}}, +{"amount":1,"base":"#7f7f7fff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1.5,"base":"#7f7f7fff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":-0.5,"base":"#7f7f7fff","color":"#3daee9ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"base":"#7f7f7fff","color":"#3daee9ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"base":"#7f7f7fff","color":"#3daee9ff","out":{"hex":"#648495ff","u16":[25650,33875,38169,65535]}}, +{"amount":0.2,"base":"#7f7f7fff","color":"#3daee9ff","out":{"hex":"#5687a0ff","u16":[22023,34644,41234,65535]}}, +{"amount":0.3,"base":"#7f7f7fff","color":"#3daee9ff","out":{"hex":"#4c8bacff","u16":[19540,35800,44290,65535]}}, +{"amount":0.4,"base":"#7f7f7fff","color":"#3daee9ff","out":{"hex":"#4593bbff","u16":[17816,37668,48034,65535]}}, +{"amount":0.5,"base":"#7f7f7fff","color":"#3daee9ff","out":{"hex":"#419dceff","u16":[16628,40420,52842,65535]}}, +{"amount":0.7,"base":"#7f7f7fff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44715,59876,65535]}}, +{"amount":1,"base":"#7f7f7fff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":1.5,"base":"#7f7f7fff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":-0.5,"base":"#7f7f7fff","color":"#232629ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"base":"#7f7f7fff","color":"#232629ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"base":"#7f7f7fff","color":"#232629ff","out":{"hex":"#7e7f80ff","u16":[32306,32585,32863,65535]}}, +{"amount":0.2,"base":"#7f7f7fff","color":"#232629ff","out":{"hex":"#7a7c7fff","u16":[31457,31988,32521,65535]}}, +{"amount":0.3,"base":"#7f7f7fff","color":"#232629ff","out":{"hex":"#73767aff","u16":[29641,30436,31233,65535]}}, +{"amount":0.4,"base":"#7f7f7fff","color":"#232629ff","out":{"hex":"#686c70ff","u16":[26809,27837,28864,65535]}}, +{"amount":0.5,"base":"#7f7f7fff","color":"#232629ff","out":{"hex":"#5a5f64ff","u16":[23243,24418,25593,65535]}}, +{"amount":0.7,"base":"#7f7f7fff","color":"#232629ff","out":{"hex":"#3c4044ff","u16":[15309,16428,17550,65535]}}, +{"amount":1,"base":"#7f7f7fff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":1.5,"base":"#7f7f7fff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":-0.5,"base":"#7f7f7fff","color":"#eff0f1ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"base":"#7f7f7fff","color":"#eff0f1ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"base":"#7f7f7fff","color":"#eff0f1ff","out":{"hex":"#7f7f80ff","u16":[32676,32729,32782,65535]}}, +{"amount":0.2,"base":"#7f7f7fff","color":"#eff0f1ff","out":{"hex":"#818282ff","u16":[33221,33298,33376,65535]}}, +{"amount":0.3,"base":"#7f7f7fff","color":"#eff0f1ff","out":{"hex":"#878788ff","u16":[34650,34778,34905,65535]}}, +{"amount":0.4,"base":"#7f7f7fff","color":"#eff0f1ff","out":{"hex":"#919293ff","u16":[37264,37476,37686,65535]}}, +{"amount":0.5,"base":"#7f7f7fff","color":"#eff0f1ff","out":{"hex":"#a0a1a3ff","u16":[41114,41464,41813,65535]}}, +{"amount":0.7,"base":"#7f7f7fff","color":"#eff0f1ff","out":{"hex":"#ccced0ff","u16":[52480,52950,53418,65535]}}, +{"amount":1,"base":"#7f7f7fff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":1.5,"base":"#7f7f7fff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":-0.5,"base":"#7f7f7fff","color":"#fcfcfcff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"base":"#7f7f7fff","color":"#fcfcfcff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"base":"#7f7f7fff","color":"#fcfcfcff","out":{"hex":"#7f7f7fff","u16":[32726,32726,32726,65535]}}, +{"amount":0.2,"base":"#7f7f7fff","color":"#fcfcfcff","out":{"hex":"#828282ff","u16":[33340,33340,33340,65535]}}, +{"amount":0.3,"base":"#7f7f7fff","color":"#fcfcfcff","out":{"hex":"#888888ff","u16":[34939,34939,34939,65535]}}, +{"amount":0.4,"base":"#7f7f7fff","color":"#fcfcfcff","out":{"hex":"#939393ff","u16":[37823,37823,37823,65535]}}, +{"amount":0.5,"base":"#7f7f7fff","color":"#fcfcfcff","out":{"hex":"#a4a4a4ff","u16":[42061,42061,42061,65535]}}, +{"amount":0.7,"base":"#7f7f7fff","color":"#fcfcfcff","out":{"hex":"#d3d3d3ff","u16":[54188,54188,54188,65535]}}, +{"amount":1,"base":"#7f7f7fff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1.5,"base":"#7f7f7fff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":-0.5,"base":"#7f7f7fff","color":"#da4453ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"base":"#7f7f7fff","color":"#da4453ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"base":"#7f7f7fff","color":"#da4453ff","out":{"hex":"#a57177ff","u16":[42358,29159,30479,65535]}}, +{"amount":0.2,"base":"#7f7f7fff","color":"#da4453ff","out":{"hex":"#bd646dff","u16":[48513,25630,27918,65535]}}, +{"amount":0.3,"base":"#7f7f7fff","color":"#da4453ff","out":{"hex":"#d0515eff","u16":[53402,20932,24179,65535]}}, +{"amount":0.4,"base":"#7f7f7fff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56025,17477,21332,65535]}}, +{"amount":0.5,"base":"#7f7f7fff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56025,17477,21332,65535]}}, +{"amount":0.7,"base":"#7f7f7fff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56025,17477,21332,65535]}}, +{"amount":1,"base":"#7f7f7fff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":1.5,"base":"#7f7f7fff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":-0.5,"base":"#7f7f7fff","color":"#e8cb2dff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"base":"#7f7f7fff","color":"#e8cb2dff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"base":"#7f7f7fff","color":"#e8cb2dff","out":{"hex":"#87805cff","u16":[34609,32890,23529,65535]}}, +{"amount":0.2,"base":"#7f7f7fff","color":"#e8cb2dff","out":{"hex":"#8c824cff","u16":[35889,33335,19419,65535]}}, +{"amount":0.3,"base":"#7f7f7fff","color":"#e8cb2dff","out":{"hex":"#938641ff","u16":[37726,34471,16735,65535]}}, +{"amount":0.4,"base":"#7f7f7fff","color":"#e8cb2dff","out":{"hex":"#9e8e3aff","u16":[40537,36568,14946,65535]}}, +{"amount":0.5,"base":"#7f7f7fff","color":"#e8cb2dff","out":{"hex":"#ad9b35ff","u16":[44517,39741,13720,65535]}}, +{"amount":0.7,"base":"#7f7f7fff","color":"#e8cb2dff","out":{"hex":"#dabf2fff","u16":[56003,49176,11985,65535]}}, +{"amount":1,"base":"#7f7f7fff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":1.5,"base":"#7f7f7fff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":-0.5,"base":"#7f7f7fff","color":"#3daee980","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"base":"#7f7f7fff","color":"#3daee980","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"base":"#7f7f7fff","color":"#3daee980","out":{"hex":"#6c838ed3","u16":[27763,33579,36616,54245]}}, +{"amount":0.2,"base":"#7f7f7fff","color":"#3daee980","out":{"hex":"#60869abb","u16":[24550,34385,39521,48116]}}, +{"amount":0.3,"base":"#7f7f7fff","color":"#3daee980","out":{"hex":"#558ba6a9","u16":[21923,35624,42779,43385]}}, +{"amount":0.4,"base":"#7f7f7fff","color":"#3daee980","out":{"hex":"#4d92b69a","u16":[19728,37573,46890,39480]}}, +{"amount":0.5,"base":"#7f7f7fff","color":"#3daee980","out":{"hex":"#459dcb8d","u16":[17806,40386,52175,36160]}}, +{"amount":0.7,"base":"#7f7f7fff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15678,44714,59874,32898]}}, +{"amount":1,"base":"#7f7f7fff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":1.5,"base":"#7f7f7fff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":-0.5,"base":"#7f7f7fff","color":"#ffffff00","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0,"base":"#7f7f7fff","color":"#ffffff00","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.1,"base":"#7f7f7fff","color":"#ffffff00","out":{"hex":"#7f7f7f00","u16":[32639,32639,32639,5]}}, +{"amount":0.2,"base":"#7f7f7fff","color":"#ffffff00","out":{"hex":"#7f7f7f00","u16":[32639,32639,32639,5]}}, +{"amount":0.3,"base":"#7f7f7fff","color":"#ffffff00","out":{"hex":"#7f7f7f00","u16":[32639,32639,32639,5]}}, +{"amount":0.4,"base":"#7f7f7fff","color":"#ffffff00","out":{"hex":"#7f7f7f00","u16":[32639,32639,32639,5]}}, +{"amount":0.5,"base":"#7f7f7fff","color":"#ffffff00","out":{"hex":"#7f7f7f00","u16":[32639,32639,32639,5]}}, +{"amount":0.7,"base":"#7f7f7fff","color":"#ffffff00","out":{"hex":"#7f7f7f00","u16":[32639,32639,32639,5]}}, +{"amount":1,"base":"#7f7f7fff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"base":"#7f7f7fff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"base":"#808080ff","color":"#000000ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"base":"#808080ff","color":"#000000ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"base":"#808080ff","color":"#000000ff","out":{"hex":"#808080ff","u16":[32780,32780,32780,65535]}}, +{"amount":0.2,"base":"#808080ff","color":"#000000ff","out":{"hex":"#7c7c7cff","u16":[31991,31991,31991,65535]}}, +{"amount":0.3,"base":"#808080ff","color":"#000000ff","out":{"hex":"#757575ff","u16":[30047,30047,30047,65535]}}, +{"amount":0.4,"base":"#808080ff","color":"#000000ff","out":{"hex":"#696969ff","u16":[26928,26928,26928,65535]}}, +{"amount":0.5,"base":"#808080ff","color":"#000000ff","out":{"hex":"#595959ff","u16":[22991,22991,22991,65535]}}, +{"amount":0.7,"base":"#808080ff","color":"#000000ff","out":{"hex":"#373737ff","u16":[14165,14165,14165,65535]}}, +{"amount":1,"base":"#808080ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"base":"#808080ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"base":"#808080ff","color":"#ffffffff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"base":"#808080ff","color":"#ffffffff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"base":"#808080ff","color":"#ffffffff","out":{"hex":"#808080ff","u16":[32984,32984,32984,65535]}}, +{"amount":0.2,"base":"#808080ff","color":"#ffffffff","out":{"hex":"#838383ff","u16":[33609,33609,33609,65535]}}, +{"amount":0.3,"base":"#808080ff","color":"#ffffffff","out":{"hex":"#898989ff","u16":[35223,35223,35223,65535]}}, +{"amount":0.4,"base":"#808080ff","color":"#ffffffff","out":{"hex":"#949494ff","u16":[38138,38138,38138,65535]}}, +{"amount":0.5,"base":"#808080ff","color":"#ffffffff","out":{"hex":"#a5a5a5ff","u16":[42445,42445,42445,65535]}}, +{"amount":0.7,"base":"#808080ff","color":"#ffffffff","out":{"hex":"#d5d5d5ff","u16":[54715,54715,54715,65535]}}, +{"amount":1,"base":"#808080ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"base":"#808080ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"base":"#808080ff","color":"#7f7f7fff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"base":"#808080ff","color":"#7f7f7fff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"base":"#808080ff","color":"#7f7f7fff","out":{"hex":"#808080ff","u16":[32859,32859,32859,65535]}}, +{"amount":0.2,"base":"#808080ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.3,"base":"#808080ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.4,"base":"#808080ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.5,"base":"#808080ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":0.7,"base":"#808080ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1,"base":"#808080ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1.5,"base":"#808080ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":-0.5,"base":"#808080ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"base":"#808080ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"base":"#808080ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.2,"base":"#808080ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.3,"base":"#808080ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.4,"base":"#808080ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.5,"base":"#808080ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.7,"base":"#808080ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1,"base":"#808080ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1.5,"base":"#808080ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":-0.5,"base":"#808080ff","color":"#ff0000ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"base":"#808080ff","color":"#ff0000ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"base":"#808080ff","color":"#ff0000ff","out":{"hex":"#b46d6dff","u16":[46179,27926,27926,65535]}}, +{"amount":0.2,"base":"#808080ff","color":"#ff0000ff","out":{"hex":"#d65555ff","u16":[55017,21887,21887,65535]}}, +{"amount":0.3,"base":"#808080ff","color":"#ff0000ff","out":{"hex":"#ed3535ff","u16":[60818,13700,13700,65535]}}, +{"amount":0.4,"base":"#808080ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65533,2,2,65535]}}, +{"amount":0.5,"base":"#808080ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65533,2,2,65535]}}, +{"amount":0.7,"base":"#808080ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65533,2,2,65535]}}, +{"amount":1,"base":"#808080ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":1.5,"base":"#808080ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":-0.5,"base":"#808080ff","color":"#00ff00ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"base":"#808080ff","color":"#00ff00ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"base":"#808080ff","color":"#00ff00ff","out":{"hex":"#518e51ff","u16":[20833,36528,20833,65535]}}, +{"amount":0.2,"base":"#808080ff","color":"#00ff00ff","out":{"hex":"#3c943cff","u16":[15295,38045,15295,65535]}}, +{"amount":0.3,"base":"#808080ff","color":"#00ff00ff","out":{"hex":"#2d9c2dff","u16":[11557,39986,11557,65535]}}, +{"amount":0.4,"base":"#808080ff","color":"#00ff00ff","out":{"hex":"#22a722ff","u16":[8779,42954,8779,65535]}}, +{"amount":0.5,"base":"#808080ff","color":"#00ff00ff","out":{"hex":"#19b819ff","u16":[6471,47174,6471,65535]}}, +{"amount":0.7,"base":"#808080ff","color":"#00ff00ff","out":{"hex":"#08e708ff","u16":[2024,59317,2024,65535]}}, +{"amount":1,"base":"#808080ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":1.5,"base":"#808080ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":-0.5,"base":"#808080ff","color":"#0000ffff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"base":"#808080ff","color":"#0000ffff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"base":"#808080ff","color":"#0000ffff","out":{"hex":"#7b7bacff","u16":[31739,31739,44238,65535]}}, +{"amount":0.2,"base":"#808080ff","color":"#0000ffff","out":{"hex":"#7777c1ff","u16":[30614,30614,49487,65535]}}, +{"amount":0.3,"base":"#808080ff","color":"#0000ffff","out":{"hex":"#7070d0ff","u16":[28786,28786,53478,65535]}}, +{"amount":0.4,"base":"#808080ff","color":"#0000ffff","out":{"hex":"#6363e6ff","u16":[25492,25492,59067,65535]}}, +{"amount":0.5,"base":"#808080ff","color":"#0000ffff","out":{"hex":"#5252f6ff","u16":[20998,20998,63163,65535]}}, +{"amount":0.7,"base":"#808080ff","color":"#0000ffff","out":{"hex":"#1a1affff","u16":[6731,6731,65527,65535]}}, +{"amount":1,"base":"#808080ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":1.5,"base":"#808080ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":-0.5,"base":"#808080ff","color":"#ffff00ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"base":"#808080ff","color":"#ffff00ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"base":"#808080ff","color":"#ffff00ff","out":{"hex":"#83834fff","u16":[33737,33737,20219,65535]}}, +{"amount":0.2,"base":"#808080ff","color":"#ffff00ff","out":{"hex":"#86863aff","u16":[34537,34537,14838,65535]}}, +{"amount":0.3,"base":"#808080ff","color":"#ffff00ff","out":{"hex":"#8d8d2cff","u16":[36213,36213,11404,65535]}}, +{"amount":0.4,"base":"#808080ff","color":"#ffff00ff","out":{"hex":"#989823ff","u16":[39130,39130,8941,65535]}}, +{"amount":0.5,"base":"#808080ff","color":"#ffff00ff","out":{"hex":"#a9a91bff","u16":[43412,43412,6913,65535]}}, +{"amount":0.7,"base":"#808080ff","color":"#ffff00ff","out":{"hex":"#d9d90cff","u16":[55644,55644,2957,65535]}}, +{"amount":1,"base":"#808080ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1.5,"base":"#808080ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":-0.5,"base":"#808080ff","color":"#030201ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"base":"#808080ff","color":"#030201ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"base":"#808080ff","color":"#030201ff","out":{"hex":"#807f7fff","u16":[32864,32763,32660,65535]}}, +{"amount":0.2,"base":"#808080ff","color":"#030201ff","out":{"hex":"#7d7c7cff","u16":[32175,31957,31740,65535]}}, +{"amount":0.3,"base":"#808080ff","color":"#030201ff","out":{"hex":"#767573ff","u16":[30373,29993,29616,65535]}}, +{"amount":0.4,"base":"#808080ff","color":"#030201ff","out":{"hex":"#6b6866ff","u16":[27431,26844,26254,65535]}}, +{"amount":0.5,"base":"#808080ff","color":"#030201ff","out":{"hex":"#5c5956ff","u16":[23735,22877,22014,65535]}}, +{"amount":0.7,"base":"#808080ff","color":"#030201ff","out":{"hex":"#3c3630ff","u16":[15540,13929,12312,65535]}}, +{"amount":1,"base":"#808080ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1.5,"base":"#808080ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":-0.5,"base":"#808080ff","color":"#3daee9ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"base":"#808080ff","color":"#3daee9ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"base":"#808080ff","color":"#3daee9ff","out":{"hex":"#658596ff","u16":[25837,34143,38482,65535]}}, +{"amount":0.2,"base":"#808080ff","color":"#3daee9ff","out":{"hex":"#5688a2ff","u16":[22168,34914,41571,65535]}}, +{"amount":0.3,"base":"#808080ff","color":"#3daee9ff","out":{"hex":"#4c8caeff","u16":[19636,36072,44653,65535]}}, +{"amount":0.4,"base":"#808080ff","color":"#3daee9ff","out":{"hex":"#4694bcff","u16":[17869,37935,48413,65535]}}, +{"amount":0.5,"base":"#808080ff","color":"#3daee9ff","out":{"hex":"#419ecfff","u16":[16638,40674,53223,65535]}}, +{"amount":0.7,"base":"#808080ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44715,59876,65535]}}, +{"amount":1,"base":"#808080ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":1.5,"base":"#808080ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":-0.5,"base":"#808080ff","color":"#232629ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"base":"#808080ff","color":"#232629ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"base":"#808080ff","color":"#232629ff","out":{"hex":"#7f8081ff","u16":[32562,32841,33119,65535]}}, +{"amount":0.2,"base":"#808080ff","color":"#232629ff","out":{"hex":"#7b7d7fff","u16":[31697,32233,32767,65535]}}, +{"amount":0.3,"base":"#808080ff","color":"#232629ff","out":{"hex":"#74777aff","u16":[29864,30663,31462,65535]}}, +{"amount":0.4,"base":"#808080ff","color":"#232629ff","out":{"hex":"#696d71ff","u16":[26995,28028,29059,65535]}}, +{"amount":0.5,"base":"#808080ff","color":"#232629ff","out":{"hex":"#5b6064ff","u16":[23392,24571,25751,65535]}}, +{"amount":0.7,"base":"#808080ff","color":"#232629ff","out":{"hex":"#3c4045ff","u16":[15395,16520,17645,65535]}}, +{"amount":1,"base":"#808080ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":1.5,"base":"#808080ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":-0.5,"base":"#808080ff","color":"#eff0f1ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"base":"#808080ff","color":"#eff0f1ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"base":"#808080ff","color":"#eff0f1ff","out":{"hex":"#808081ff","u16":[32933,32985,33039,65535]}}, +{"amount":0.2,"base":"#808080ff","color":"#eff0f1ff","out":{"hex":"#828383ff","u16":[33471,33548,33625,65535]}}, +{"amount":0.3,"base":"#808080ff","color":"#eff0f1ff","out":{"hex":"#888889ff","u16":[34891,35022,35153,65535]}}, +{"amount":0.4,"base":"#808080ff","color":"#eff0f1ff","out":{"hex":"#929394ff","u16":[37489,37705,37921,65535]}}, +{"amount":0.5,"base":"#808080ff","color":"#eff0f1ff","out":{"hex":"#a1a2a4ff","u16":[41328,41685,42038,65535]}}, +{"amount":0.7,"base":"#808080ff","color":"#eff0f1ff","out":{"hex":"#cdcfd1ff","u16":[52679,53147,53614,65535]}}, +{"amount":1,"base":"#808080ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":1.5,"base":"#808080ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":-0.5,"base":"#808080ff","color":"#fcfcfcff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"base":"#808080ff","color":"#fcfcfcff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"base":"#808080ff","color":"#fcfcfcff","out":{"hex":"#808080ff","u16":[32982,32982,32982,65535]}}, +{"amount":0.2,"base":"#808080ff","color":"#fcfcfcff","out":{"hex":"#838383ff","u16":[33589,33589,33589,65535]}}, +{"amount":0.3,"base":"#808080ff","color":"#fcfcfcff","out":{"hex":"#898989ff","u16":[35184,35184,35184,65535]}}, +{"amount":0.4,"base":"#808080ff","color":"#fcfcfcff","out":{"hex":"#949494ff","u16":[38054,38054,38054,65535]}}, +{"amount":0.5,"base":"#808080ff","color":"#fcfcfcff","out":{"hex":"#a4a4a4ff","u16":[42271,42271,42271,65535]}}, +{"amount":0.7,"base":"#808080ff","color":"#fcfcfcff","out":{"hex":"#d4d4d4ff","u16":[54371,54371,54371,65535]}}, +{"amount":1,"base":"#808080ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1.5,"base":"#808080ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":-0.5,"base":"#808080ff","color":"#da4453ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"base":"#808080ff","color":"#da4453ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"base":"#808080ff","color":"#da4453ff","out":{"hex":"#a57378ff","u16":[42495,29474,30776,65535]}}, +{"amount":0.2,"base":"#808080ff","color":"#da4453ff","out":{"hex":"#bd656eff","u16":[48628,25986,28250,65535]}}, +{"amount":0.3,"base":"#808080ff","color":"#da4453ff","out":{"hex":"#cf5460ff","u16":[53252,21557,24726,65535]}}, +{"amount":0.4,"base":"#808080ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56025,17477,21332,65535]}}, +{"amount":0.5,"base":"#808080ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56025,17477,21332,65535]}}, +{"amount":0.7,"base":"#808080ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56025,17477,21332,65535]}}, +{"amount":1,"base":"#808080ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":1.5,"base":"#808080ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":-0.5,"base":"#808080ff","color":"#e8cb2dff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"base":"#808080ff","color":"#e8cb2dff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"base":"#808080ff","color":"#e8cb2dff","out":{"hex":"#88815cff","u16":[34871,33147,23760,65535]}}, +{"amount":0.2,"base":"#808080ff","color":"#e8cb2dff","out":{"hex":"#8d834cff","u16":[36160,33591,19589,65535]}}, +{"amount":0.3,"base":"#808080ff","color":"#e8cb2dff","out":{"hex":"#948742ff","u16":[38004,34725,16862,65535]}}, +{"amount":0.4,"base":"#808080ff","color":"#e8cb2dff","out":{"hex":"#9f8f3bff","u16":[40808,36811,15042,65535]}}, +{"amount":0.5,"base":"#808080ff","color":"#e8cb2dff","out":{"hex":"#ae9c36ff","u16":[44778,39971,13781,65535]}}, +{"amount":0.7,"base":"#808080ff","color":"#e8cb2dff","out":{"hex":"#dbc02fff","u16":[56251,49385,11976,65535]}}, +{"amount":1,"base":"#808080ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":1.5,"base":"#808080ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":-0.5,"base":"#808080ff","color":"#3daee980","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"base":"#808080ff","color":"#3daee980","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"base":"#808080ff","color":"#3daee980","out":{"hex":"#6d8490d3","u16":[27982,33843,36903,54188]}}, +{"amount":0.2,"base":"#808080ff","color":"#3daee980","out":{"hex":"#60879bbb","u16":[24715,34653,39842,48014]}}, +{"amount":0.3,"base":"#808080ff","color":"#3daee980","out":{"hex":"#568ca8a8","u16":[22024,35898,43142,43244]}}, +{"amount":0.4,"base":"#808080ff","color":"#3daee980","out":{"hex":"#4d93b899","u16":[19774,37840,47274,39335]}}, +{"amount":0.5,"base":"#808080ff","color":"#3daee980","out":{"hex":"#459ecd8c","u16":[17781,40647,52585,36008]}}, +{"amount":0.7,"base":"#808080ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15679,44714,59874,32898]}}, +{"amount":1,"base":"#808080ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":1.5,"base":"#808080ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":-0.5,"base":"#808080ff","color":"#ffffff00","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0,"base":"#808080ff","color":"#ffffff00","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":0.1,"base":"#808080ff","color":"#ffffff00","out":{"hex":"#80808000","u16":[32896,32896,32896,5]}}, +{"amount":0.2,"base":"#808080ff","color":"#ffffff00","out":{"hex":"#80808000","u16":[32896,32896,32896,5]}}, +{"amount":0.3,"base":"#808080ff","color":"#ffffff00","out":{"hex":"#80808000","u16":[32896,32896,32896,5]}}, +{"amount":0.4,"base":"#808080ff","color":"#ffffff00","out":{"hex":"#80808000","u16":[32896,32896,32896,5]}}, +{"amount":0.5,"base":"#808080ff","color":"#ffffff00","out":{"hex":"#80808000","u16":[32896,32896,32896,5]}}, +{"amount":0.7,"base":"#808080ff","color":"#ffffff00","out":{"hex":"#80808000","u16":[32896,32896,32896,5]}}, +{"amount":1,"base":"#808080ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"base":"#808080ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"base":"#ff0000ff","color":"#000000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"base":"#ff0000ff","color":"#000000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"base":"#ff0000ff","color":"#000000ff","out":{"hex":"#fe0000ff","u16":[65304,0,0,65535]}}, +{"amount":0.2,"base":"#ff0000ff","color":"#000000ff","out":{"hex":"#f80000ff","u16":[63759,0,0,65535]}}, +{"amount":0.3,"base":"#ff0000ff","color":"#000000ff","out":{"hex":"#e90000ff","u16":[59942,0,0,65535]}}, +{"amount":0.4,"base":"#ff0000ff","color":"#000000ff","out":{"hex":"#d10000ff","u16":[53762,0,0,65535]}}, +{"amount":0.5,"base":"#ff0000ff","color":"#000000ff","out":{"hex":"#b30000ff","u16":[45965,0,0,65535]}}, +{"amount":0.7,"base":"#ff0000ff","color":"#000000ff","out":{"hex":"#6e0000ff","u16":[28299,0,0,65535]}}, +{"amount":1,"base":"#ff0000ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"base":"#ff0000ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"base":"#ff0000ff","color":"#ffffffff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"base":"#ff0000ff","color":"#ffffffff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"base":"#ff0000ff","color":"#ffffffff","out":{"hex":"#ff0e0eff","u16":[65535,3583,3583,65535]}}, +{"amount":0.2,"base":"#ff0000ff","color":"#ffffffff","out":{"hex":"#ff2424ff","u16":[65535,9186,9186,65535]}}, +{"amount":0.3,"base":"#ff0000ff","color":"#ffffffff","out":{"hex":"#ff3e3eff","u16":[65535,16017,16017,65535]}}, +{"amount":0.4,"base":"#ff0000ff","color":"#ffffffff","out":{"hex":"#ff5c5cff","u16":[65535,23683,23683,65535]}}, +{"amount":0.5,"base":"#ff0000ff","color":"#ffffffff","out":{"hex":"#ff7d7dff","u16":[65535,32137,32137,65535]}}, +{"amount":0.7,"base":"#ff0000ff","color":"#ffffffff","out":{"hex":"#ffc6c6ff","u16":[65535,50831,50831,65535]}}, +{"amount":1,"base":"#ff0000ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"base":"#ff0000ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"base":"#ff0000ff","color":"#7f7f7fff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"base":"#ff0000ff","color":"#7f7f7fff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"base":"#ff0000ff","color":"#7f7f7fff","out":{"hex":"#f92525ff","u16":[63881,9445,9445,65535]}}, +{"amount":0.2,"base":"#ff0000ff","color":"#7f7f7fff","out":{"hex":"#e64141ff","u16":[59022,16829,16829,65535]}}, +{"amount":0.3,"base":"#ff0000ff","color":"#7f7f7fff","out":{"hex":"#c15c5cff","u16":[49616,23672,23672,65535]}}, +{"amount":0.4,"base":"#ff0000ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32641,32637,32637,65535]}}, +{"amount":0.5,"base":"#ff0000ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32641,32637,32637,65535]}}, +{"amount":0.7,"base":"#ff0000ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32641,32637,32637,65535]}}, +{"amount":1,"base":"#ff0000ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1.5,"base":"#ff0000ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":-0.5,"base":"#ff0000ff","color":"#808080ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"base":"#ff0000ff","color":"#808080ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"base":"#ff0000ff","color":"#808080ff","out":{"hex":"#f82626ff","u16":[63804,9640,9640,65535]}}, +{"amount":0.2,"base":"#ff0000ff","color":"#808080ff","out":{"hex":"#e54242ff","u16":[58861,17020,17020,65535]}}, +{"amount":0.3,"base":"#ff0000ff","color":"#808080ff","out":{"hex":"#bf5e5eff","u16":[49006,24055,24055,65535]}}, +{"amount":0.4,"base":"#ff0000ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32898,32894,32894,65535]}}, +{"amount":0.5,"base":"#ff0000ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32898,32894,32894,65535]}}, +{"amount":0.7,"base":"#ff0000ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32898,32894,32894,65535]}}, +{"amount":1,"base":"#ff0000ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1.5,"base":"#ff0000ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":-0.5,"base":"#ff0000ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"base":"#ff0000ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"base":"#ff0000ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.2,"base":"#ff0000ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.3,"base":"#ff0000ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.4,"base":"#ff0000ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.5,"base":"#ff0000ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.7,"base":"#ff0000ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":1,"base":"#ff0000ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":1.5,"base":"#ff0000ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":-0.5,"base":"#ff0000ff","color":"#00ff00ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"base":"#ff0000ff","color":"#00ff00ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"base":"#ff0000ff","color":"#00ff00ff","out":{"hex":"#758700ff","u16":[29945,34620,0,65535]}}, +{"amount":0.2,"base":"#ff0000ff","color":"#00ff00ff","out":{"hex":"#608e00ff","u16":[24595,36404,0,65535]}}, +{"amount":0.3,"base":"#ff0000ff","color":"#00ff00ff","out":{"hex":"#4a9700ff","u16":[18933,38863,0,65535]}}, +{"amount":0.4,"base":"#ff0000ff","color":"#00ff00ff","out":{"hex":"#38a400ff","u16":[14282,42162,0,65535]}}, +{"amount":0.5,"base":"#ff0000ff","color":"#00ff00ff","out":{"hex":"#28b500ff","u16":[10394,46580,0,65535]}}, +{"amount":0.7,"base":"#ff0000ff","color":"#00ff00ff","out":{"hex":"#0de500ff","u16":[3279,58877,0,65535]}}, +{"amount":1,"base":"#ff0000ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":1.5,"base":"#ff0000ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":-0.5,"base":"#ff0000ff","color":"#0000ffff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"base":"#ff0000ff","color":"#0000ffff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"base":"#ff0000ff","color":"#0000ffff","out":{"hex":"#fb0051ff","u16":[64597,0,20808,65535]}}, +{"amount":0.2,"base":"#ff0000ff","color":"#0000ffff","out":{"hex":"#ed009fff","u16":[60831,0,40958,65535]}}, +{"amount":0.3,"base":"#ff0000ff","color":"#0000ffff","out":{"hex":"#ca00f2ff","u16":[51968,0,62203,65535]}}, +{"amount":0.4,"base":"#ff0000ff","color":"#0000ffff","out":{"hex":"#8847ffff","u16":[34933,18273,65535,65535]}}, +{"amount":0.5,"base":"#ff0000ff","color":"#0000ffff","out":{"hex":"#5e47ffff","u16":[24094,18200,65535,65535]}}, +{"amount":0.7,"base":"#ff0000ff","color":"#0000ffff","out":{"hex":"#1616ffff","u16":[5575,5533,65535,65535]}}, +{"amount":1,"base":"#ff0000ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":1.5,"base":"#ff0000ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":-0.5,"base":"#ff0000ff","color":"#ffff00ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"base":"#ff0000ff","color":"#ffff00ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"base":"#ff0000ff","color":"#ffff00ff","out":{"hex":"#e54900ff","u16":[58971,18696,0,65535]}}, +{"amount":0.2,"base":"#ff0000ff","color":"#ffff00ff","out":{"hex":"#d16100ff","u16":[53827,24838,0,65535]}}, +{"amount":0.3,"base":"#ff0000ff","color":"#ffff00ff","out":{"hex":"#c77200ff","u16":[51161,29411,0,65535]}}, +{"amount":0.4,"base":"#ff0000ff","color":"#ffff00ff","out":{"hex":"#c68500ff","u16":[50812,34149,0,65535]}}, +{"amount":0.5,"base":"#ff0000ff","color":"#ffff00ff","out":{"hex":"#cc9b00ff","u16":[52375,39733,0,65535]}}, +{"amount":0.7,"base":"#ff0000ff","color":"#ffff00ff","out":{"hex":"#e7d200ff","u16":[59320,54002,0,65535]}}, +{"amount":1,"base":"#ff0000ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1.5,"base":"#ff0000ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":-0.5,"base":"#ff0000ff","color":"#030201ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"base":"#ff0000ff","color":"#030201ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"base":"#ff0000ff","color":"#030201ff","out":{"hex":"#fe0100ff","u16":[65306,201,101,65535]}}, +{"amount":0.2,"base":"#ff0000ff","color":"#030201ff","out":{"hex":"#f80201ff","u16":[63758,433,217,65535]}}, +{"amount":0.3,"base":"#ff0000ff","color":"#030201ff","out":{"hex":"#e90301ff","u16":[59937,754,376,65535]}}, +{"amount":0.4,"base":"#ff0000ff","color":"#030201ff","out":{"hex":"#d10502ff","u16":[53759,1183,591,65535]}}, +{"amount":0.5,"base":"#ff0000ff","color":"#030201ff","out":{"hex":"#b30703ff","u16":[45906,1747,873,65535]}}, +{"amount":0.7,"base":"#ff0000ff","color":"#030201ff","out":{"hex":"#6d0d07ff","u16":[27889,3423,1708,65535]}}, +{"amount":1,"base":"#ff0000ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1.5,"base":"#ff0000ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":-0.5,"base":"#ff0000ff","color":"#3daee9ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"base":"#ff0000ff","color":"#3daee9ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"base":"#ff0000ff","color":"#3daee9ff","out":{"hex":"#f03546ff","u16":[61592,13516,18099,65535]}}, +{"amount":0.2,"base":"#ff0000ff","color":"#3daee9ff","out":{"hex":"#6c80abff","u16":[27760,32804,43928,65535]}}, +{"amount":0.3,"base":"#ff0000ff","color":"#3daee9ff","out":{"hex":"#6086b3ff","u16":[24695,34392,46054,65535]}}, +{"amount":0.4,"base":"#ff0000ff","color":"#3daee9ff","out":{"hex":"#548fbfff","u16":[21533,36723,49175,65535]}}, +{"amount":0.5,"base":"#ff0000ff","color":"#3daee9ff","out":{"hex":"#499bd0ff","u16":[18704,39850,53362,65535]}}, +{"amount":0.7,"base":"#ff0000ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15680,44713,59874,65535]}}, +{"amount":1,"base":"#ff0000ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":1.5,"base":"#ff0000ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":-0.5,"base":"#ff0000ff","color":"#232629ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"base":"#ff0000ff","color":"#232629ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"base":"#ff0000ff","color":"#232629ff","out":{"hex":"#fe0e0fff","u16":[65165,3541,3821,65535]}}, +{"amount":0.2,"base":"#ff0000ff","color":"#232629ff","out":{"hex":"#f61c1eff","u16":[63218,7083,7642,65535]}}, +{"amount":0.3,"base":"#ff0000ff","color":"#232629ff","out":{"hex":"#e32b2eff","u16":[58419,11071,11944,65535]}}, +{"amount":0.4,"base":"#ff0000ff","color":"#232629ff","out":{"hex":"#c33a3eff","u16":[50181,14783,15949,65535]}}, +{"amount":0.5,"base":"#ff0000ff","color":"#232629ff","out":{"hex":"#9a4247ff","u16":[39485,17019,18363,65535]}}, +{"amount":0.7,"base":"#ff0000ff","color":"#232629ff","out":{"hex":"#4b3b40ff","u16":[19198,15144,16339,65535]}}, +{"amount":1,"base":"#ff0000ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":1.5,"base":"#ff0000ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":-0.5,"base":"#ff0000ff","color":"#eff0f1ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"base":"#ff0000ff","color":"#eff0f1ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"base":"#ff0000ff","color":"#eff0f1ff","out":{"hex":"#f92526ff","u16":[64099,9505,9723,65535]}}, +{"amount":0.2,"base":"#ff0000ff","color":"#eff0f1ff","out":{"hex":"#f63537ff","u16":[63284,13687,14028,65535]}}, +{"amount":0.3,"base":"#ff0000ff","color":"#eff0f1ff","out":{"hex":"#f34b4cff","u16":[62468,19226,19627,65535]}}, +{"amount":0.4,"base":"#ff0000ff","color":"#eff0f1ff","out":{"hex":"#f06567ff","u16":[61612,25941,26370,65535]}}, +{"amount":0.5,"base":"#ff0000ff","color":"#eff0f1ff","out":{"hex":"#ec8384ff","u16":[60739,33553,33996,65535]}}, +{"amount":0.7,"base":"#ff0000ff","color":"#eff0f1ff","out":{"hex":"#e8c5c7ff","u16":[59524,50664,51083,65535]}}, +{"amount":1,"base":"#ff0000ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":1.5,"base":"#ff0000ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":-0.5,"base":"#ff0000ff","color":"#fcfcfcff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"base":"#ff0000ff","color":"#fcfcfcff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"base":"#ff0000ff","color":"#fcfcfcff","out":{"hex":"#fe1515ff","u16":[65271,5343,5343,65535]}}, +{"amount":0.2,"base":"#ff0000ff","color":"#fcfcfcff","out":{"hex":"#fd2828ff","u16":[65111,10267,10267,65535]}}, +{"amount":0.3,"base":"#ff0000ff","color":"#fcfcfcff","out":{"hex":"#fd4141ff","u16":[64945,16718,16718,65535]}}, +{"amount":0.4,"base":"#ff0000ff","color":"#fcfcfcff","out":{"hex":"#fc5e5eff","u16":[64765,24174,24174,65535]}}, +{"amount":0.5,"base":"#ff0000ff","color":"#fcfcfcff","out":{"hex":"#fb7e7eff","u16":[64564,32464,32464,65535]}}, +{"amount":0.7,"base":"#ff0000ff","color":"#fcfcfcff","out":{"hex":"#fac6c6ff","u16":[64141,50892,50892,65535]}}, +{"amount":1,"base":"#ff0000ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1.5,"base":"#ff0000ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":-0.5,"base":"#ff0000ff","color":"#da4453ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"base":"#ff0000ff","color":"#da4453ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"base":"#ff0000ff","color":"#da4453ff","out":{"hex":"#fc191eff","u16":[64777,6324,7719,65535]}}, +{"amount":0.2,"base":"#ff0000ff","color":"#da4453ff","out":{"hex":"#f42a34ff","u16":[62614,10910,13316,65535]}}, +{"amount":0.3,"base":"#ff0000ff","color":"#da4453ff","out":{"hex":"#e23d4bff","u16":[58090,15695,19158,65535]}}, +{"amount":0.4,"base":"#ff0000ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56028,17475,21329,65535]}}, +{"amount":0.5,"base":"#ff0000ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56028,17475,21329,65535]}}, +{"amount":0.7,"base":"#ff0000ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56028,17475,21329,65535]}}, +{"amount":1,"base":"#ff0000ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":1.5,"base":"#ff0000ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":-0.5,"base":"#ff0000ff","color":"#e8cb2dff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"base":"#ff0000ff","color":"#e8cb2dff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"base":"#ff0000ff","color":"#e8cb2dff","out":{"hex":"#e9440fff","u16":[59949,17387,3854,65535]}}, +{"amount":0.2,"base":"#ff0000ff","color":"#e8cb2dff","out":{"hex":"#d85a14ff","u16":[55473,23135,5128,65535]}}, +{"amount":0.3,"base":"#ff0000ff","color":"#e8cb2dff","out":{"hex":"#cd6b18ff","u16":[52766,27402,6074,65535]}}, +{"amount":0.4,"base":"#ff0000ff","color":"#e8cb2dff","out":{"hex":"#ca7b1bff","u16":[51879,31611,7007,65535]}}, +{"amount":0.5,"base":"#ff0000ff","color":"#e8cb2dff","out":{"hex":"#cd8d1fff","u16":[52627,36362,8061,65535]}}, +{"amount":0.7,"base":"#ff0000ff","color":"#e8cb2dff","out":{"hex":"#e1bc2aff","u16":[57698,48346,10717,65535]}}, +{"amount":1,"base":"#ff0000ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":1.5,"base":"#ff0000ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":-0.5,"base":"#ff0000ff","color":"#3daee980","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"base":"#ff0000ff","color":"#3daee980","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"base":"#ff0000ff","color":"#3daee980","out":{"hex":"#fa202bdb","u16":[64197,8179,10952,56388]}}, +{"amount":0.2,"base":"#ff0000ff","color":"#3daee980","out":{"hex":"#6f7faa93","u16":[28614,32625,43688,37882]}}, +{"amount":0.3,"base":"#ff0000ff","color":"#3daee980","out":{"hex":"#6685b290","u16":[26174,34137,45713,36968]}}, +{"amount":0.4,"base":"#ff0000ff","color":"#3daee980","out":{"hex":"#5a8ebe8b","u16":[23065,36514,48895,35763]}}, +{"amount":0.5,"base":"#ff0000ff","color":"#3daee980","out":{"hex":"#4d9bcf86","u16":[19757,39741,53216,34456]}}, +{"amount":0.7,"base":"#ff0000ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15683,44709,59869,32898]}}, +{"amount":1,"base":"#ff0000ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":1.5,"base":"#ff0000ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":-0.5,"base":"#ff0000ff","color":"#ffffff00","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0,"base":"#ff0000ff","color":"#ffffff00","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":0.1,"base":"#ff0000ff","color":"#ffffff00","out":{"hex":"#ff000000","u16":[65535,0,0,5]}}, +{"amount":0.2,"base":"#ff0000ff","color":"#ffffff00","out":{"hex":"#ff000000","u16":[65535,0,0,5]}}, +{"amount":0.3,"base":"#ff0000ff","color":"#ffffff00","out":{"hex":"#ff000000","u16":[65535,0,0,5]}}, +{"amount":0.4,"base":"#ff0000ff","color":"#ffffff00","out":{"hex":"#ff000000","u16":[65535,0,0,5]}}, +{"amount":0.5,"base":"#ff0000ff","color":"#ffffff00","out":{"hex":"#ff000000","u16":[65535,0,0,5]}}, +{"amount":0.7,"base":"#ff0000ff","color":"#ffffff00","out":{"hex":"#ff000000","u16":[65535,0,0,5]}}, +{"amount":1,"base":"#ff0000ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"base":"#ff0000ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"base":"#00ff00ff","color":"#000000ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"base":"#00ff00ff","color":"#000000ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"base":"#00ff00ff","color":"#000000ff","out":{"hex":"#00fd00ff","u16":[0,65018,0,65535]}}, +{"amount":0.2,"base":"#00ff00ff","color":"#000000ff","out":{"hex":"#00f000ff","u16":[0,61728,0,65535]}}, +{"amount":0.3,"base":"#00ff00ff","color":"#000000ff","out":{"hex":"#00d500ff","u16":[0,54735,0,65535]}}, +{"amount":0.4,"base":"#00ff00ff","color":"#000000ff","out":{"hex":"#00b200ff","u16":[0,45755,0,65535]}}, +{"amount":0.5,"base":"#00ff00ff","color":"#000000ff","out":{"hex":"#009000ff","u16":[0,36891,0,65535]}}, +{"amount":0.7,"base":"#00ff00ff","color":"#000000ff","out":{"hex":"#005600ff","u16":[0,22199,0,65535]}}, +{"amount":1,"base":"#00ff00ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"base":"#00ff00ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"base":"#00ff00ff","color":"#ffffffff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"base":"#00ff00ff","color":"#ffffffff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"base":"#00ff00ff","color":"#ffffffff","out":{"hex":"#1aff1aff","u16":[6587,65535,6587,65535]}}, +{"amount":0.2,"base":"#00ff00ff","color":"#ffffffff","out":{"hex":"#42ff42ff","u16":[16925,65535,16925,65535]}}, +{"amount":0.3,"base":"#00ff00ff","color":"#ffffffff","out":{"hex":"#73ff73ff","u16":[29451,65535,29451,65535]}}, +{"amount":0.4,"base":"#00ff00ff","color":"#ffffffff","out":{"hex":"#aaffaaff","u16":[43604,65535,43604,65535]}}, +{"amount":0.5,"base":"#00ff00ff","color":"#ffffffff","out":{"hex":"#e6ffe6ff","u16":[59091,65535,59091,65535]}}, +{"amount":0.7,"base":"#00ff00ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65523,65535,65523,65535]}}, +{"amount":1,"base":"#00ff00ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"base":"#00ff00ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"base":"#00ff00ff","color":"#7f7f7fff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"base":"#00ff00ff","color":"#7f7f7fff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"base":"#00ff00ff","color":"#7f7f7fff","out":{"hex":"#2afe2aff","u16":[10712,65189,10712,65535]}}, +{"amount":0.2,"base":"#00ff00ff","color":"#7f7f7fff","out":{"hex":"#4af84aff","u16":[19071,63762,19071,65535]}}, +{"amount":0.3,"base":"#00ff00ff","color":"#7f7f7fff","out":{"hex":"#68ec68ff","u16":[26628,60660,26628,65535]}}, +{"amount":0.4,"base":"#00ff00ff","color":"#7f7f7fff","out":{"hex":"#7ed97eff","u16":[32396,55825,32396,65535]}}, +{"amount":0.5,"base":"#00ff00ff","color":"#7f7f7fff","out":{"hex":"#8bc28bff","u16":[35600,49799,35600,65535]}}, +{"amount":0.7,"base":"#00ff00ff","color":"#7f7f7fff","out":{"hex":"#879187ff","u16":[34810,37335,34810,65535]}}, +{"amount":1,"base":"#00ff00ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1.5,"base":"#00ff00ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":-0.5,"base":"#00ff00ff","color":"#808080ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"base":"#00ff00ff","color":"#808080ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"base":"#00ff00ff","color":"#808080ff","out":{"hex":"#2afe2aff","u16":[10783,65186,10783,65535]}}, +{"amount":0.2,"base":"#00ff00ff","color":"#808080ff","out":{"hex":"#4bf84bff","u16":[19176,63760,19176,65535]}}, +{"amount":0.3,"base":"#00ff00ff","color":"#808080ff","out":{"hex":"#68ec68ff","u16":[26725,60680,26725,65535]}}, +{"amount":0.4,"base":"#00ff00ff","color":"#808080ff","out":{"hex":"#7fd97fff","u16":[32521,55856,32521,65535]}}, +{"amount":0.5,"base":"#00ff00ff","color":"#808080ff","out":{"hex":"#8bc28bff","u16":[35731,49872,35731,65535]}}, +{"amount":0.7,"base":"#00ff00ff","color":"#808080ff","out":{"hex":"#889288ff","u16":[34981,37451,34981,65535]}}, +{"amount":1,"base":"#00ff00ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1.5,"base":"#00ff00ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":-0.5,"base":"#00ff00ff","color":"#ff0000ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"base":"#00ff00ff","color":"#ff0000ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"base":"#00ff00ff","color":"#ff0000ff","out":{"hex":"#53fc00ff","u16":[21267,64655,0,65535]}}, +{"amount":0.2,"base":"#00ff00ff","color":"#ff0000ff","out":{"hex":"#a4ed00ff","u16":[42131,61031,0,65535]}}, +{"amount":0.3,"base":"#00ff00ff","color":"#ff0000ff","out":{"hex":"#facc00ff","u16":[64302,52443,0,65535]}}, +{"amount":0.4,"base":"#00ff00ff","color":"#ff0000ff","out":{"hex":"#ffb298ff","u16":[65535,45855,39121,65535]}}, +{"amount":0.5,"base":"#00ff00ff","color":"#ff0000ff","out":{"hex":"#ff998fff","u16":[65535,39201,36778,65535]}}, +{"amount":0.7,"base":"#00ff00ff","color":"#ff0000ff","out":{"hex":"#ff5251ff","u16":[65535,20966,20778,65535]}}, +{"amount":1,"base":"#00ff00ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":1.5,"base":"#00ff00ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":-0.5,"base":"#00ff00ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"base":"#00ff00ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"base":"#00ff00ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.2,"base":"#00ff00ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.3,"base":"#00ff00ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.4,"base":"#00ff00ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.5,"base":"#00ff00ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.7,"base":"#00ff00ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":1,"base":"#00ff00ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":1.5,"base":"#00ff00ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":-0.5,"base":"#00ff00ff","color":"#0000ffff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"base":"#00ff00ff","color":"#0000ffff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"base":"#00ff00ff","color":"#0000ffff","out":{"hex":"#00fd64ff","u16":[0,64923,25634,65535]}}, +{"amount":0.2,"base":"#00ff00ff","color":"#0000ffff","out":{"hex":"#00f0d4ff","u16":[0,61638,54508,65535]}}, +{"amount":0.3,"base":"#00ff00ff","color":"#0000ffff","out":{"hex":"#a9cbffff","u16":[43545,52068,65535,65535]}}, +{"amount":0.4,"base":"#00ff00ff","color":"#0000ffff","out":{"hex":"#a6b0ffff","u16":[42595,45317,65535,65535]}}, +{"amount":0.5,"base":"#00ff00ff","color":"#0000ffff","out":{"hex":"#9095ffff","u16":[37103,38195,65535,65535]}}, +{"amount":0.7,"base":"#00ff00ff","color":"#0000ffff","out":{"hex":"#5b5cffff","u16":[23377,23524,65535,65535]}}, +{"amount":1,"base":"#00ff00ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":1.5,"base":"#00ff00ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":-0.5,"base":"#00ff00ff","color":"#ffff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"base":"#00ff00ff","color":"#ffff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"base":"#00ff00ff","color":"#ffff00ff","out":{"hex":"#69fa00ff","u16":[27011,64335,0,65535]}}, +{"amount":0.2,"base":"#00ff00ff","color":"#ffff00ff","out":{"hex":"#96f600ff","u16":[38676,63294,0,65535]}}, +{"amount":0.3,"base":"#00ff00ff","color":"#ffff00ff","out":{"hex":"#bbf500ff","u16":[47954,62981,0,65535]}}, +{"amount":0.4,"base":"#00ff00ff","color":"#ffff00ff","out":{"hex":"#ddf800ff","u16":[56700,63711,0,65535]}}, +{"amount":0.5,"base":"#00ff00ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65528,65533,0,65535]}}, +{"amount":0.7,"base":"#00ff00ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65528,65533,0,65535]}}, +{"amount":1,"base":"#00ff00ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1.5,"base":"#00ff00ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":-0.5,"base":"#00ff00ff","color":"#030201ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"base":"#00ff00ff","color":"#030201ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"base":"#00ff00ff","color":"#030201ff","out":{"hex":"#02fd01ff","u16":[399,65021,133,65535]}}, +{"amount":0.2,"base":"#00ff00ff","color":"#030201ff","out":{"hex":"#04f001ff","u16":[927,61729,310,65535]}}, +{"amount":0.3,"base":"#00ff00ff","color":"#030201ff","out":{"hex":"#07d502ff","u16":[1689,54746,563,65535]}}, +{"amount":0.4,"base":"#00ff00ff","color":"#030201ff","out":{"hex":"#0ab204ff","u16":[2697,45738,900,65535]}}, +{"amount":0.5,"base":"#00ff00ff","color":"#030201ff","out":{"hex":"#0f8f05ff","u16":[3927,36835,1309,65535]}}, +{"amount":0.7,"base":"#00ff00ff","color":"#030201ff","out":{"hex":"#1b5609ff","u16":[6948,21986,2319,65535]}}, +{"amount":1,"base":"#00ff00ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1.5,"base":"#00ff00ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":-0.5,"base":"#00ff00ff","color":"#3daee9ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"base":"#00ff00ff","color":"#3daee9ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"base":"#00ff00ff","color":"#3daee9ff","out":{"hex":"#13fe4aff","u16":[4955,65221,18928,65535]}}, +{"amount":0.2,"base":"#00ff00ff","color":"#3daee9ff","out":{"hex":"#21f97fff","u16":[8543,64069,32630,65535]}}, +{"amount":0.3,"base":"#00ff00ff","color":"#3daee9ff","out":{"hex":"#2df0acff","u16":[11590,61701,44271,65535]}}, +{"amount":0.4,"base":"#00ff00ff","color":"#3daee9ff","out":{"hex":"#36e2cfff","u16":[13920,57993,53168,65535]}}, +{"amount":0.5,"base":"#00ff00ff","color":"#3daee9ff","out":{"hex":"#3ccfe4ff","u16":[15322,53208,58526,65535]}}, +{"amount":0.7,"base":"#00ff00ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15678,44724,59883,65535]}}, +{"amount":1,"base":"#00ff00ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":1.5,"base":"#00ff00ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":-0.5,"base":"#00ff00ff","color":"#232629ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"base":"#00ff00ff","color":"#232629ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"base":"#00ff00ff","color":"#232629ff","out":{"hex":"#10fd13ff","u16":[4188,65096,4905,65535]}}, +{"amount":0.2,"base":"#00ff00ff","color":"#232629ff","out":{"hex":"#22f328ff","u16":[8725,62331,10221,65535]}}, +{"amount":0.3,"base":"#00ff00ff","color":"#232629ff","out":{"hex":"#35da3fff","u16":[13747,56126,16105,65535]}}, +{"amount":0.4,"base":"#00ff00ff","color":"#232629ff","out":{"hex":"#45b951ff","u16":[17856,47512,20917,65535]}}, +{"amount":0.5,"base":"#00ff00ff","color":"#232629ff","out":{"hex":"#4d965aff","u16":[19828,38489,23227,65535]}}, +{"amount":0.7,"base":"#00ff00ff","color":"#232629ff","out":{"hex":"#455b50ff","u16":[17622,23443,20643,65535]}}, +{"amount":1,"base":"#00ff00ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":1.5,"base":"#00ff00ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":-0.5,"base":"#00ff00ff","color":"#eff0f1ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"base":"#00ff00ff","color":"#eff0f1ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"base":"#00ff00ff","color":"#eff0f1ff","out":{"hex":"#76f777ff","u16":[30241,63387,30555,65535]}}, +{"amount":0.2,"base":"#00ff00ff","color":"#eff0f1ff","out":{"hex":"#92f394ff","u16":[37583,62499,38046,65535]}}, +{"amount":0.3,"base":"#00ff00ff","color":"#eff0f1ff","out":{"hex":"#b5f0b7ff","u16":[46568,61666,47130,65535]}}, +{"amount":0.4,"base":"#00ff00ff","color":"#eff0f1ff","out":{"hex":"#dbefdeff","u16":[56399,61301,56976,65535]}}, +{"amount":0.5,"base":"#00ff00ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61418,61679,61931,65535]}}, +{"amount":0.7,"base":"#00ff00ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61418,61679,61931,65535]}}, +{"amount":1,"base":"#00ff00ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":1.5,"base":"#00ff00ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":-0.5,"base":"#00ff00ff","color":"#fcfcfcff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"base":"#00ff00ff","color":"#fcfcfcff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"base":"#00ff00ff","color":"#fcfcfcff","out":{"hex":"#39fe39ff","u16":[14591,65173,14591,65535]}}, +{"amount":0.2,"base":"#00ff00ff","color":"#fcfcfcff","out":{"hex":"#5afd5aff","u16":[23135,64927,23135,65535]}}, +{"amount":0.3,"base":"#00ff00ff","color":"#fcfcfcff","out":{"hex":"#86fc86ff","u16":[34454,64656,34454,65535]}}, +{"amount":0.4,"base":"#00ff00ff","color":"#fcfcfcff","out":{"hex":"#bafbbaff","u16":[47739,64383,47739,65535]}}, +{"amount":0.5,"base":"#00ff00ff","color":"#fcfcfcff","out":{"hex":"#f1fbf1ff","u16":[61836,64405,61836,65535]}}, +{"amount":0.7,"base":"#00ff00ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64757,64762,64757,65535]}}, +{"amount":1,"base":"#00ff00ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1.5,"base":"#00ff00ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":-0.5,"base":"#00ff00ff","color":"#da4453ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"base":"#00ff00ff","color":"#da4453ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"base":"#00ff00ff","color":"#da4453ff","out":{"hex":"#47fc1bff","u16":[18240,64847,6945,65535]}}, +{"amount":0.2,"base":"#00ff00ff","color":"#da4453ff","out":{"hex":"#85f233ff","u16":[34185,62222,13015,65535]}}, +{"amount":0.3,"base":"#00ff00ff","color":"#da4453ff","out":{"hex":"#c1dc49ff","u16":[49523,56663,18854,65535]}}, +{"amount":0.4,"base":"#00ff00ff","color":"#da4453ff","out":{"hex":"#eebc5bff","u16":[61159,48317,23285,65535]}}, +{"amount":0.5,"base":"#00ff00ff","color":"#da4453ff","out":{"hex":"#eda083ff","u16":[60913,41201,33655,65535]}}, +{"amount":0.7,"base":"#00ff00ff","color":"#da4453ff","out":{"hex":"#dd696bff","u16":[56800,26969,27467,65535]}}, +{"amount":1,"base":"#00ff00ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":1.5,"base":"#00ff00ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":-0.5,"base":"#00ff00ff","color":"#e8cb2dff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"base":"#00ff00ff","color":"#e8cb2dff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"base":"#00ff00ff","color":"#e8cb2dff","out":{"hex":"#4cfc0fff","u16":[19551,64836,3793,65535]}}, +{"amount":0.2,"base":"#00ff00ff","color":"#e8cb2dff","out":{"hex":"#82f519ff","u16":[33294,62917,6458,65535]}}, +{"amount":0.3,"base":"#00ff00ff","color":"#e8cb2dff","out":{"hex":"#b2e722ff","u16":[45619,59405,8848,65535]}}, +{"amount":0.4,"base":"#00ff00ff","color":"#e8cb2dff","out":{"hex":"#ddd22bff","u16":[56819,53906,11021,65535]}}, +{"amount":0.5,"base":"#00ff00ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59621,52173,11564,65535]}}, +{"amount":0.7,"base":"#00ff00ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59621,52173,11564,65535]}}, +{"amount":1,"base":"#00ff00ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":1.5,"base":"#00ff00ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":-0.5,"base":"#00ff00ff","color":"#3daee980","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"base":"#00ff00ff","color":"#3daee980","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"base":"#00ff00ff","color":"#3daee980","out":{"hex":"#0dfe30d6","u16":[3222,65359,12308,54983]}}, +{"amount":0.2,"base":"#00ff00ff","color":"#3daee980","out":{"hex":"#17fb59be","u16":[5996,64483,22901,48788]}}, +{"amount":0.3,"base":"#00ff00ff","color":"#3daee980","out":{"hex":"#22f383ab","u16":[8817,62410,33681,43882]}}, +{"amount":0.4,"base":"#00ff00ff","color":"#3daee980","out":{"hex":"#2de5ab9b","u16":[11508,58855,43960,39866]}}, +{"amount":0.5,"base":"#00ff00ff","color":"#3daee980","out":{"hex":"#35d2cc8f","u16":[13730,53947,52442,36633]}}, +{"amount":0.7,"base":"#00ff00ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44725,59878,32898]}}, +{"amount":1,"base":"#00ff00ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":1.5,"base":"#00ff00ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":-0.5,"base":"#00ff00ff","color":"#ffffff00","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0,"base":"#00ff00ff","color":"#ffffff00","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":0.1,"base":"#00ff00ff","color":"#ffffff00","out":{"hex":"#00ff0000","u16":[0,65535,0,5]}}, +{"amount":0.2,"base":"#00ff00ff","color":"#ffffff00","out":{"hex":"#00ff0000","u16":[0,65535,0,5]}}, +{"amount":0.3,"base":"#00ff00ff","color":"#ffffff00","out":{"hex":"#00ff0000","u16":[0,65535,0,5]}}, +{"amount":0.4,"base":"#00ff00ff","color":"#ffffff00","out":{"hex":"#00ff0000","u16":[0,65535,0,5]}}, +{"amount":0.5,"base":"#00ff00ff","color":"#ffffff00","out":{"hex":"#00ff0000","u16":[0,65535,0,5]}}, +{"amount":0.7,"base":"#00ff00ff","color":"#ffffff00","out":{"hex":"#00ff0000","u16":[0,65535,0,5]}}, +{"amount":1,"base":"#00ff00ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"base":"#00ff00ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"base":"#0000ffff","color":"#000000ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"base":"#0000ffff","color":"#000000ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"base":"#0000ffff","color":"#000000ff","out":{"hex":"#0000feff","u16":[0,0,65359,65535]}}, +{"amount":0.2,"base":"#0000ffff","color":"#000000ff","out":{"hex":"#0000faff","u16":[0,0,64167,65535]}}, +{"amount":0.3,"base":"#0000ffff","color":"#000000ff","out":{"hex":"#0000eeff","u16":[0,0,61063,65535]}}, +{"amount":0.4,"base":"#0000ffff","color":"#000000ff","out":{"hex":"#0000d8ff","u16":[0,0,55518,65535]}}, +{"amount":0.5,"base":"#0000ffff","color":"#000000ff","out":{"hex":"#0000b9ff","u16":[0,0,47426,65535]}}, +{"amount":0.7,"base":"#0000ffff","color":"#000000ff","out":{"hex":"#000053ff","u16":[0,0,21205,65535]}}, +{"amount":1,"base":"#0000ffff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"base":"#0000ffff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"base":"#0000ffff","color":"#ffffffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"base":"#0000ffff","color":"#ffffffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"base":"#0000ffff","color":"#ffffffff","out":{"hex":"#0c0cffff","u16":[3139,3139,65535,65535]}}, +{"amount":0.2,"base":"#0000ffff","color":"#ffffffff","out":{"hex":"#2020ffff","u16":[8113,8113,65535,65535]}}, +{"amount":0.3,"base":"#0000ffff","color":"#ffffffff","out":{"hex":"#3737ffff","u16":[14107,14107,65535,65535]}}, +{"amount":0.4,"base":"#0000ffff","color":"#ffffffff","out":{"hex":"#5151ffff","u16":[20906,20906,65535,65535]}}, +{"amount":0.5,"base":"#0000ffff","color":"#ffffffff","out":{"hex":"#6e6effff","u16":[28316,28316,65535,65535]}}, +{"amount":0.7,"base":"#0000ffff","color":"#ffffffff","out":{"hex":"#aeaeffff","u16":[44812,44812,65535,65535]}}, +{"amount":1,"base":"#0000ffff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"base":"#0000ffff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"base":"#0000ffff","color":"#7f7f7fff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"base":"#0000ffff","color":"#7f7f7fff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"base":"#0000ffff","color":"#7f7f7fff","out":{"hex":"#3838c3ff","u16":[14278,14278,50176,65535]}}, +{"amount":0.2,"base":"#0000ffff","color":"#7f7f7fff","out":{"hex":"#3e3eb4ff","u16":[15978,15978,46359,65535]}}, +{"amount":0.3,"base":"#0000ffff","color":"#7f7f7fff","out":{"hex":"#4646a6ff","u16":[18109,18109,42541,65535]}}, +{"amount":0.4,"base":"#0000ffff","color":"#7f7f7fff","out":{"hex":"#515198ff","u16":[20759,20759,39027,65535]}}, +{"amount":0.5,"base":"#0000ffff","color":"#7f7f7fff","out":{"hex":"#5d5d8cff","u16":[23958,23958,35992,65535]}}, +{"amount":0.7,"base":"#0000ffff","color":"#7f7f7fff","out":{"hex":"#7c7c7fff","u16":[31846,31846,32666,65535]}}, +{"amount":1,"base":"#0000ffff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1.5,"base":"#0000ffff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":-0.5,"base":"#0000ffff","color":"#808080ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"base":"#0000ffff","color":"#808080ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"base":"#0000ffff","color":"#808080ff","out":{"hex":"#3737c4ff","u16":[14175,14175,50468,65535]}}, +{"amount":0.2,"base":"#0000ffff","color":"#808080ff","out":{"hex":"#3e3eb5ff","u16":[15916,15916,46603,65535]}}, +{"amount":0.3,"base":"#0000ffff","color":"#808080ff","out":{"hex":"#4646a7ff","u16":[18069,18069,42797,65535]}}, +{"amount":0.4,"base":"#0000ffff","color":"#808080ff","out":{"hex":"#515199ff","u16":[20737,20737,39300,65535]}}, +{"amount":0.5,"base":"#0000ffff","color":"#808080ff","out":{"hex":"#5d5d8dff","u16":[23968,23968,36265,65535]}}, +{"amount":0.7,"base":"#0000ffff","color":"#808080ff","out":{"hex":"#7c7c80ff","u16":[31927,31927,32925,65535]}}, +{"amount":1,"base":"#0000ffff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1.5,"base":"#0000ffff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":-0.5,"base":"#0000ffff","color":"#ff0000ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"base":"#0000ffff","color":"#ff0000ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"base":"#0000ffff","color":"#ff0000ff","out":{"hex":"#5800daff","u16":[22720,0,56027,65535]}}, +{"amount":0.2,"base":"#0000ffff","color":"#ff0000ff","out":{"hex":"#980057ff","u16":[39148,0,22471,65535]}}, +{"amount":0.3,"base":"#0000ffff","color":"#ff0000ff","out":{"hex":"#a20042ff","u16":[41753,0,17065,65535]}}, +{"amount":0.4,"base":"#0000ffff","color":"#ff0000ff","out":{"hex":"#b10030ff","u16":[45431,0,12432,65535]}}, +{"amount":0.5,"base":"#0000ffff","color":"#ff0000ff","out":{"hex":"#c40021ff","u16":[50445,0,8387,65535]}}, +{"amount":0.7,"base":"#0000ffff","color":"#ff0000ff","out":{"hex":"#fa0002ff","u16":[64336,0,601,65535]}}, +{"amount":1,"base":"#0000ffff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":1.5,"base":"#0000ffff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":-0.5,"base":"#0000ffff","color":"#00ff00ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"base":"#0000ffff","color":"#00ff00ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"base":"#0000ffff","color":"#00ff00ff","out":{"hex":"#004e8eff","u16":[0,20089,36599,65535]}}, +{"amount":0.2,"base":"#0000ffff","color":"#00ff00ff","out":{"hex":"#005962ff","u16":[0,22850,25234,65535]}}, +{"amount":0.3,"base":"#0000ffff","color":"#00ff00ff","out":{"hex":"#00644aff","u16":[0,25739,18953,65535]}}, +{"amount":0.4,"base":"#0000ffff","color":"#00ff00ff","out":{"hex":"#00743bff","u16":[0,29771,15157,65535]}}, +{"amount":0.5,"base":"#0000ffff","color":"#00ff00ff","out":{"hex":"#008930ff","u16":[0,35110,12282,65535]}}, +{"amount":0.7,"base":"#0000ffff","color":"#00ff00ff","out":{"hex":"#00be1aff","u16":[0,48927,6721,65535]}}, +{"amount":1,"base":"#0000ffff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":1.5,"base":"#0000ffff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":-0.5,"base":"#0000ffff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"base":"#0000ffff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"base":"#0000ffff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.2,"base":"#0000ffff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.3,"base":"#0000ffff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.4,"base":"#0000ffff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.5,"base":"#0000ffff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.7,"base":"#0000ffff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":1,"base":"#0000ffff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":1.5,"base":"#0000ffff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":-0.5,"base":"#0000ffff","color":"#ffff00ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"base":"#0000ffff","color":"#ffff00ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"base":"#0000ffff","color":"#ffff00ff","out":{"hex":"#4141a4ff","u16":[16734,16734,42098,65535]}}, +{"amount":0.2,"base":"#0000ffff","color":"#ffff00ff","out":{"hex":"#4f4f6eff","u16":[20183,20183,28370,65535]}}, +{"amount":0.3,"base":"#0000ffff","color":"#ffff00ff","out":{"hex":"#5c5c47ff","u16":[23537,23537,18281,65535]}}, +{"amount":0.4,"base":"#0000ffff","color":"#ffff00ff","out":{"hex":"#6c6c3aff","u16":[27728,27728,14896,65535]}}, +{"amount":0.5,"base":"#0000ffff","color":"#ffff00ff","out":{"hex":"#818130ff","u16":[33198,33198,12352,65535]}}, +{"amount":0.7,"base":"#0000ffff","color":"#ffff00ff","out":{"hex":"#b7b71cff","u16":[47115,47115,7217,65535]}}, +{"amount":1,"base":"#0000ffff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1.5,"base":"#0000ffff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":-0.5,"base":"#0000ffff","color":"#030201ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"base":"#0000ffff","color":"#030201ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"base":"#0000ffff","color":"#030201ff","out":{"hex":"#0101feff","u16":[276,184,65359,65535]}}, +{"amount":0.2,"base":"#0000ffff","color":"#030201ff","out":{"hex":"#0202faff","u16":[584,390,64164,65535]}}, +{"amount":0.3,"base":"#0000ffff","color":"#030201ff","out":{"hex":"#0403eeff","u16":[1011,673,61049,65535]}}, +{"amount":0.4,"base":"#0000ffff","color":"#030201ff","out":{"hex":"#0604d8ff","u16":[1620,1082,55444,65535]}}, +{"amount":0.5,"base":"#0000ffff","color":"#030201ff","out":{"hex":"#0a07b8ff","u16":[2525,1685,47191,65535]}}, +{"amount":0.7,"base":"#0000ffff","color":"#030201ff","out":{"hex":"#18103eff","u16":[6198,4135,15905,65535]}}, +{"amount":1,"base":"#0000ffff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1.5,"base":"#0000ffff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":-0.5,"base":"#0000ffff","color":"#3daee9ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"base":"#0000ffff","color":"#3daee9ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"base":"#0000ffff","color":"#3daee9ff","out":{"hex":"#1232dbff","u16":[4546,12965,56408,65535]}}, +{"amount":0.2,"base":"#0000ffff","color":"#3daee9ff","out":{"hex":"#1741c3ff","u16":[5872,16747,50087,65535]}}, +{"amount":0.3,"base":"#0000ffff","color":"#3daee9ff","out":{"hex":"#1b4db7ff","u16":[6903,19691,46987,65535]}}, +{"amount":0.4,"base":"#0000ffff","color":"#3daee9ff","out":{"hex":"#1f59b5ff","u16":[8049,22959,46573,65535]}}, +{"amount":0.5,"base":"#0000ffff","color":"#3daee9ff","out":{"hex":"#2569bbff","u16":[9449,26953,48134,65535]}}, +{"amount":0.7,"base":"#0000ffff","color":"#3daee9ff","out":{"hex":"#3391d5ff","u16":[13045,37210,54725,65535]}}, +{"amount":1,"base":"#0000ffff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":1.5,"base":"#0000ffff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":-0.5,"base":"#0000ffff","color":"#232629ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"base":"#0000ffff","color":"#232629ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"base":"#0000ffff","color":"#232629ff","out":{"hex":"#0c0dfcff","u16":[3035,3296,64871,65535]}}, +{"amount":0.2,"base":"#0000ffff","color":"#232629ff","out":{"hex":"#1719f2ff","u16":[5878,6382,62099,65535]}}, +{"amount":0.3,"base":"#0000ffff","color":"#232629ff","out":{"hex":"#2225d8ff","u16":[8855,9614,55605,65535]}}, +{"amount":0.4,"base":"#0000ffff","color":"#232629ff","out":{"hex":"#2c2faeff","u16":[11241,12205,44656,65535]}}, +{"amount":0.5,"base":"#0000ffff","color":"#232629ff","out":{"hex":"#2f3379ff","u16":[12081,13116,30995,65535]}}, +{"amount":0.7,"base":"#0000ffff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8998,9769,10546,65535]}}, +{"amount":1,"base":"#0000ffff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":1.5,"base":"#0000ffff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":-0.5,"base":"#0000ffff","color":"#eff0f1ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"base":"#0000ffff","color":"#eff0f1ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"base":"#0000ffff","color":"#eff0f1ff","out":{"hex":"#1415faff","u16":[5120,5495,64373,65535]}}, +{"amount":0.2,"base":"#0000ffff","color":"#eff0f1ff","out":{"hex":"#2325f8ff","u16":[8950,9430,63709,65535]}}, +{"amount":0.3,"base":"#0000ffff","color":"#eff0f1ff","out":{"hex":"#3739f5ff","u16":[14217,14705,63054,65535]}}, +{"amount":0.4,"base":"#0000ffff","color":"#eff0f1ff","out":{"hex":"#5051f3ff","u16":[20453,20938,62367,65535]}}, +{"amount":0.5,"base":"#0000ffff","color":"#eff0f1ff","out":{"hex":"#6a6cf0ff","u16":[27368,27851,61650,65535]}}, +{"amount":0.7,"base":"#0000ffff","color":"#eff0f1ff","out":{"hex":"#a7a9ebff","u16":[42839,43310,60315,65535]}}, +{"amount":1,"base":"#0000ffff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":1.5,"base":"#0000ffff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":-0.5,"base":"#0000ffff","color":"#fcfcfcff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"base":"#0000ffff","color":"#fcfcfcff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"base":"#0000ffff","color":"#fcfcfcff","out":{"hex":"#0f0ffeff","u16":[3807,3807,65286,65535]}}, +{"amount":0.2,"base":"#0000ffff","color":"#fcfcfcff","out":{"hex":"#2121fdff","u16":[8414,8414,65139,65535]}}, +{"amount":0.3,"base":"#0000ffff","color":"#fcfcfcff","out":{"hex":"#3737fdff","u16":[14220,14220,64992,65535]}}, +{"amount":0.4,"base":"#0000ffff","color":"#fcfcfcff","out":{"hex":"#5151fcff","u16":[20911,20911,64830,65535]}}, +{"amount":0.5,"base":"#0000ffff","color":"#fcfcfcff","out":{"hex":"#6e6efcff","u16":[28225,28225,64654,65535]}}, +{"amount":0.7,"base":"#0000ffff","color":"#fcfcfcff","out":{"hex":"#adadfaff","u16":[44526,44526,64258,65535]}}, +{"amount":1,"base":"#0000ffff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1.5,"base":"#0000ffff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":-0.5,"base":"#0000ffff","color":"#da4453ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"base":"#0000ffff","color":"#da4453ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"base":"#0000ffff","color":"#da4453ff","out":{"hex":"#7324a0ff","u16":[29609,9236,41156,65535]}}, +{"amount":0.2,"base":"#0000ffff","color":"#da4453ff","out":{"hex":"#7d278cff","u16":[32172,10035,35880,65535]}}, +{"amount":0.3,"base":"#0000ffff","color":"#da4453ff","out":{"hex":"#892b78ff","u16":[35220,10986,30931,65535]}}, +{"amount":0.4,"base":"#0000ffff","color":"#da4453ff","out":{"hex":"#982f6aff","u16":[38954,12151,27318,65535]}}, +{"amount":0.5,"base":"#0000ffff","color":"#da4453ff","out":{"hex":"#aa3560ff","u16":[43687,13627,24784,65535]}}, +{"amount":0.7,"base":"#0000ffff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56018,17474,21333,65535]}}, +{"amount":1,"base":"#0000ffff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":1.5,"base":"#0000ffff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":-0.5,"base":"#0000ffff","color":"#e8cb2dff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"base":"#0000ffff","color":"#e8cb2dff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"base":"#0000ffff","color":"#e8cb2dff","out":{"hex":"#483da8ff","u16":[18566,15728,43135,65535]}}, +{"amount":0.2,"base":"#0000ffff","color":"#e8cb2dff","out":{"hex":"#56487eff","u16":[22019,18434,32329,65535]}}, +{"amount":0.3,"base":"#0000ffff","color":"#e8cb2dff","out":{"hex":"#5f535eff","u16":[24455,21398,24114,65535]}}, +{"amount":0.4,"base":"#0000ffff","color":"#e8cb2dff","out":{"hex":"#6e6051ff","u16":[28163,24643,20773,65535]}}, +{"amount":0.5,"base":"#0000ffff","color":"#e8cb2dff","out":{"hex":"#817048ff","u16":[33029,28900,18628,65535]}}, +{"amount":0.7,"base":"#0000ffff","color":"#e8cb2dff","out":{"hex":"#b29b3bff","u16":[45655,39948,15208,65535]}}, +{"amount":1,"base":"#0000ffff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":1.5,"base":"#0000ffff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":-0.5,"base":"#0000ffff","color":"#3daee980","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"base":"#0000ffff","color":"#3daee980","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"base":"#0000ffff","color":"#3daee980","out":{"hex":"#0e29eacc","u16":[3683,10503,60081,52482]}}, +{"amount":0.2,"base":"#0000ffff","color":"#3daee980","out":{"hex":"#1439d6b9","u16":[5152,14696,55009,47635]}}, +{"amount":0.3,"base":"#0000ffff","color":"#3daee980","out":{"hex":"#1947caab","u16":[6366,18160,51920,44071]}}, +{"amount":0.4,"base":"#0000ffff","color":"#3daee980","out":{"hex":"#1e55c7a0","u16":[7660,21849,51031,41202]}}, +{"amount":0.5,"base":"#0000ffff","color":"#3daee980","out":{"hex":"#2466ca97","u16":[9169,26154,51875,38797]}}, +{"amount":0.7,"base":"#0000ffff","color":"#3daee980","out":{"hex":"#3290dc88","u16":[12952,36947,56419,34870]}}, +{"amount":1,"base":"#0000ffff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":1.5,"base":"#0000ffff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":-0.5,"base":"#0000ffff","color":"#ffffff00","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0,"base":"#0000ffff","color":"#ffffff00","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":0.1,"base":"#0000ffff","color":"#ffffff00","out":{"hex":"#0000ff00","u16":[0,0,65535,5]}}, +{"amount":0.2,"base":"#0000ffff","color":"#ffffff00","out":{"hex":"#0000ff00","u16":[0,0,65535,5]}}, +{"amount":0.3,"base":"#0000ffff","color":"#ffffff00","out":{"hex":"#0000ff00","u16":[0,0,65535,5]}}, +{"amount":0.4,"base":"#0000ffff","color":"#ffffff00","out":{"hex":"#0000ff00","u16":[0,0,65535,5]}}, +{"amount":0.5,"base":"#0000ffff","color":"#ffffff00","out":{"hex":"#0000ff00","u16":[0,0,65535,5]}}, +{"amount":0.7,"base":"#0000ffff","color":"#ffffff00","out":{"hex":"#0000ff00","u16":[0,0,65535,5]}}, +{"amount":1,"base":"#0000ffff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"base":"#0000ffff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"base":"#ffff00ff","color":"#000000ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"base":"#ffff00ff","color":"#000000ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"base":"#ffff00ff","color":"#000000ff","out":{"hex":"#fdfd00ff","u16":[64896,64896,0,65535]}}, +{"amount":0.2,"base":"#ffff00ff","color":"#000000ff","out":{"hex":"#eded00ff","u16":[60905,60905,0,65535]}}, +{"amount":0.3,"base":"#ffff00ff","color":"#000000ff","out":{"hex":"#cece00ff","u16":[52885,52885,0,65535]}}, +{"amount":0.4,"base":"#ffff00ff","color":"#000000ff","out":{"hex":"#a8a800ff","u16":[43271,43271,0,65535]}}, +{"amount":0.5,"base":"#ffff00ff","color":"#000000ff","out":{"hex":"#868600ff","u16":[34344,34344,0,65535]}}, +{"amount":0.7,"base":"#ffff00ff","color":"#000000ff","out":{"hex":"#505000ff","u16":[20451,20451,0,65535]}}, +{"amount":1,"base":"#ffff00ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"base":"#ffff00ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"base":"#ffff00ff","color":"#ffffffff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"base":"#ffff00ff","color":"#ffffffff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"base":"#ffff00ff","color":"#ffffffff","out":{"hex":"#ffff32ff","u16":[65535,65535,12937,65535]}}, +{"amount":0.2,"base":"#ffff00ff","color":"#ffffffff","out":{"hex":"#ffff81ff","u16":[65535,65535,33257,65535]}}, +{"amount":0.3,"base":"#ffff00ff","color":"#ffffffff","out":{"hex":"#ffffe1ff","u16":[65535,65535,57788,65535]}}, +{"amount":0.4,"base":"#ffff00ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65523,65535]}}, +{"amount":0.5,"base":"#ffff00ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65523,65535]}}, +{"amount":0.7,"base":"#ffff00ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65523,65535]}}, +{"amount":1,"base":"#ffff00ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"base":"#ffff00ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"base":"#ffff00ff","color":"#7f7f7fff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"base":"#ffff00ff","color":"#7f7f7fff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"base":"#ffff00ff","color":"#7f7f7fff","out":{"hex":"#fefe2cff","u16":[65339,65339,11211,65535]}}, +{"amount":0.2,"base":"#ffff00ff","color":"#7f7f7fff","out":{"hex":"#fafa4eff","u16":[64215,64215,20050,65535]}}, +{"amount":0.3,"base":"#ffff00ff","color":"#7f7f7fff","out":{"hex":"#efef6dff","u16":[61503,61503,28067,65535]}}, +{"amount":0.4,"base":"#ffff00ff","color":"#7f7f7fff","out":{"hex":"#dede85ff","u16":[57099,57099,34132,65535]}}, +{"amount":0.5,"base":"#ffff00ff","color":"#7f7f7fff","out":{"hex":"#c8c892ff","u16":[51499,51499,37406,65535]}}, +{"amount":0.7,"base":"#ffff00ff","color":"#7f7f7fff","out":{"hex":"#9a9a8eff","u16":[39563,39563,36379,65535]}}, +{"amount":1,"base":"#ffff00ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1.5,"base":"#ffff00ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":-0.5,"base":"#ffff00ff","color":"#808080ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"base":"#ffff00ff","color":"#808080ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"base":"#ffff00ff","color":"#808080ff","out":{"hex":"#fefe2cff","u16":[65339,65339,11285,65535]}}, +{"amount":0.2,"base":"#ffff00ff","color":"#808080ff","out":{"hex":"#fafa4eff","u16":[64230,64230,20118,65535]}}, +{"amount":0.3,"base":"#ffff00ff","color":"#808080ff","out":{"hex":"#efef6eff","u16":[61546,61546,28150,65535]}}, +{"amount":0.4,"base":"#ffff00ff","color":"#808080ff","out":{"hex":"#dede85ff","u16":[57173,57173,34242,65535]}}, +{"amount":0.5,"base":"#ffff00ff","color":"#808080ff","out":{"hex":"#c9c992ff","u16":[51597,51597,37541,65535]}}, +{"amount":0.7,"base":"#ffff00ff","color":"#808080ff","out":{"hex":"#9a9a8eff","u16":[39695,39695,36547,65535]}}, +{"amount":1,"base":"#ffff00ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1.5,"base":"#ffff00ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":-0.5,"base":"#ffff00ff","color":"#ff0000ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"base":"#ffff00ff","color":"#ff0000ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"base":"#ffff00ff","color":"#ff0000ff","out":{"hex":"#fff4e9ff","u16":[65535,62802,59939,65535]}}, +{"amount":0.2,"base":"#ffff00ff","color":"#ff0000ff","out":{"hex":"#ffefe9ff","u16":[65535,61444,59829,65535]}}, +{"amount":0.3,"base":"#ffff00ff","color":"#ff0000ff","out":{"hex":"#ffe3deff","u16":[65535,58231,56983,65535]}}, +{"amount":0.4,"base":"#ffff00ff","color":"#ff0000ff","out":{"hex":"#ffcecaff","u16":[65535,52820,51882,65535]}}, +{"amount":0.5,"base":"#ffff00ff","color":"#ff0000ff","out":{"hex":"#ffb1afff","u16":[65535,45516,44923,65535]}}, +{"amount":0.7,"base":"#ffff00ff","color":"#ff0000ff","out":{"hex":"#ff6968ff","u16":[65535,26864,26767,65535]}}, +{"amount":1,"base":"#ffff00ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":1.5,"base":"#ffff00ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":-0.5,"base":"#ffff00ff","color":"#00ff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"base":"#ffff00ff","color":"#00ff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"base":"#ffff00ff","color":"#00ff00ff","out":{"hex":"#e4ffcbff","u16":[58667,65535,52197,65535]}}, +{"amount":0.2,"base":"#ffff00ff","color":"#00ff00ff","out":{"hex":"#daffceff","u16":[55907,65535,52980,65535]}}, +{"amount":0.3,"base":"#ffff00ff","color":"#00ff00ff","out":{"hex":"#c3ffbdff","u16":[50218,65535,48682,65535]}}, +{"amount":0.4,"base":"#ffff00ff","color":"#00ff00ff","out":{"hex":"#96ff94ff","u16":[38612,65535,38048,65535]}}, +{"amount":0.5,"base":"#ffff00ff","color":"#00ff00ff","out":{"hex":"#05ff05ff","u16":[1309,65535,1309,65535]}}, +{"amount":0.7,"base":"#ffff00ff","color":"#00ff00ff","out":{"hex":"#05ff05ff","u16":[1309,65535,1309,65535]}}, +{"amount":1,"base":"#ffff00ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":1.5,"base":"#ffff00ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":-0.5,"base":"#ffff00ff","color":"#0000ffff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"base":"#ffff00ff","color":"#0000ffff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"base":"#ffff00ff","color":"#0000ffff","out":{"hex":"#fdfd6cff","u16":[64899,64899,27648,65535]}}, +{"amount":0.2,"base":"#ffff00ff","color":"#0000ffff","out":{"hex":"#efefe7ff","u16":[61411,61411,59283,65535]}}, +{"amount":0.3,"base":"#ffff00ff","color":"#0000ffff","out":{"hex":"#dddde9ff","u16":[56807,56807,59756,65535]}}, +{"amount":0.4,"base":"#ffff00ff","color":"#0000ffff","out":{"hex":"#c3c3e6ff","u16":[50051,50051,59117,65535]}}, +{"amount":0.5,"base":"#ffff00ff","color":"#0000ffff","out":{"hex":"#a3a3f0ff","u16":[41916,41916,61644,65535]}}, +{"amount":0.7,"base":"#ffff00ff","color":"#0000ffff","out":{"hex":"#6464fdff","u16":[25674,25674,65133,65535]}}, +{"amount":1,"base":"#ffff00ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":1.5,"base":"#ffff00ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":-0.5,"base":"#ffff00ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"base":"#ffff00ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"base":"#ffff00ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.2,"base":"#ffff00ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.3,"base":"#ffff00ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.4,"base":"#ffff00ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.5,"base":"#ffff00ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.7,"base":"#ffff00ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1,"base":"#ffff00ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1.5,"base":"#ffff00ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":-0.5,"base":"#ffff00ff","color":"#030201ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"base":"#ffff00ff","color":"#030201ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"base":"#ffff00ff","color":"#030201ff","out":{"hex":"#fdfc01ff","u16":[65011,64867,144,65535]}}, +{"amount":0.2,"base":"#ffff00ff","color":"#030201ff","out":{"hex":"#eeed01ff","u16":[61175,60833,341,65535]}}, +{"amount":0.3,"base":"#ffff00ff","color":"#030201ff","out":{"hex":"#d0cd02ff","u16":[53369,52743,626,65535]}}, +{"amount":0.4,"base":"#ffff00ff","color":"#030201ff","out":{"hex":"#aba704ff","u16":[44035,43038,997,65535]}}, +{"amount":0.5,"base":"#ffff00ff","color":"#030201ff","out":{"hex":"#8a8406ff","u16":[35457,34019,1438,65535]}}, +{"amount":0.7,"base":"#ffff00ff","color":"#030201ff","out":{"hex":"#574d09ff","u16":[22258,19826,2432,65535]}}, +{"amount":1,"base":"#ffff00ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1.5,"base":"#ffff00ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":-0.5,"base":"#ffff00ff","color":"#3daee9ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"base":"#ffff00ff","color":"#3daee9ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"base":"#ffff00ff","color":"#3daee9ff","out":{"hex":"#ecfeb6ff","u16":[60571,65373,46821,65535]}}, +{"amount":0.2,"base":"#ffff00ff","color":"#3daee9ff","out":{"hex":"#e1fccaff","u16":[57852,64805,51970,65535]}}, +{"amount":0.3,"base":"#ffff00ff","color":"#3daee9ff","out":{"hex":"#d1f6d4ff","u16":[53770,63289,54517,65535]}}, +{"amount":0.4,"base":"#ffff00ff","color":"#3daee9ff","out":{"hex":"#8cf4d8ff","u16":[35924,62801,55420,65535]}}, +{"amount":0.5,"base":"#ffff00ff","color":"#3daee9ff","out":{"hex":"#6fe2edff","u16":[28436,58022,61005,65535]}}, +{"amount":0.7,"base":"#ffff00ff","color":"#3daee9ff","out":{"hex":"#42b5edff","u16":[17017,46548,60890,65535]}}, +{"amount":1,"base":"#ffff00ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":1.5,"base":"#ffff00ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":-0.5,"base":"#ffff00ff","color":"#232629ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"base":"#ffff00ff","color":"#232629ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"base":"#ffff00ff","color":"#232629ff","out":{"hex":"#fcfd14ff","u16":[64735,65117,5241,65535]}}, +{"amount":0.2,"base":"#ffff00ff","color":"#232629ff","out":{"hex":"#eef12bff","u16":[61146,61961,11131,65535]}}, +{"amount":0.3,"base":"#ffff00ff","color":"#232629ff","out":{"hex":"#d2d744ff","u16":[53888,55166,17475,65535]}}, +{"amount":0.4,"base":"#ffff00ff","color":"#232629ff","out":{"hex":"#aeb457ff","u16":[44687,46323,22368,65535]}}, +{"amount":0.5,"base":"#ffff00ff","color":"#232629ff","out":{"hex":"#8b925fff","u16":[35780,37568,24427,65535]}}, +{"amount":0.7,"base":"#ffff00ff","color":"#232629ff","out":{"hex":"#555b53ff","u16":[21921,23479,21318,65535]}}, +{"amount":1,"base":"#ffff00ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":1.5,"base":"#ffff00ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":-0.5,"base":"#ffff00ff","color":"#eff0f1ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"base":"#ffff00ff","color":"#eff0f1ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"base":"#ffff00ff","color":"#eff0f1ff","out":{"hex":"#fdfe64ff","u16":[65092,65198,25707,65535]}}, +{"amount":0.2,"base":"#ffff00ff","color":"#eff0f1ff","out":{"hex":"#f9f9aaff","u16":[63915,64096,43726,65535]}}, +{"amount":0.3,"base":"#ffff00ff","color":"#eff0f1ff","out":{"hex":"#f0f1eeff","u16":[61574,61822,61101,65535]}}, +{"amount":0.4,"base":"#ffff00ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61932,65535]}}, +{"amount":0.5,"base":"#ffff00ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61932,65535]}}, +{"amount":0.7,"base":"#ffff00ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61932,65535]}}, +{"amount":1,"base":"#ffff00ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":1.5,"base":"#ffff00ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":-0.5,"base":"#ffff00ff","color":"#fcfcfcff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"base":"#ffff00ff","color":"#fcfcfcff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"base":"#ffff00ff","color":"#fcfcfcff","out":{"hex":"#fdfd8aff","u16":[64996,64996,35479,65535]}}, +{"amount":0.2,"base":"#ffff00ff","color":"#fcfcfcff","out":{"hex":"#fcfcc7ff","u16":[64703,64703,51091,65535]}}, +{"amount":0.3,"base":"#ffff00ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64759,65535]}}, +{"amount":0.4,"base":"#ffff00ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64759,65535]}}, +{"amount":0.5,"base":"#ffff00ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64759,65535]}}, +{"amount":0.7,"base":"#ffff00ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64759,65535]}}, +{"amount":1,"base":"#ffff00ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1.5,"base":"#ffff00ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":-0.5,"base":"#ffff00ff","color":"#da4453ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"base":"#ffff00ff","color":"#da4453ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"base":"#ffff00ff","color":"#da4453ff","out":{"hex":"#fff5e1ff","u16":[65515,62983,57946,65535]}}, +{"amount":0.2,"base":"#ffff00ff","color":"#da4453ff","out":{"hex":"#fff0e2ff","u16":[65422,61556,58153,65535]}}, +{"amount":0.3,"base":"#ffff00ff","color":"#da4453ff","out":{"hex":"#fde3d7ff","u16":[65074,58317,55157,65535]}}, +{"amount":0.4,"base":"#ffff00ff","color":"#da4453ff","out":{"hex":"#facec3ff","u16":[64139,53013,50166,65535]}}, +{"amount":0.5,"base":"#ffff00ff","color":"#da4453ff","out":{"hex":"#f3b4acff","u16":[62409,46206,44103,65535]}}, +{"amount":0.7,"base":"#ffff00ff","color":"#da4453ff","out":{"hex":"#e27779ff","u16":[58113,30602,30997,65535]}}, +{"amount":1,"base":"#ffff00ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":1.5,"base":"#ffff00ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":-0.5,"base":"#ffff00ff","color":"#e8cb2dff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"base":"#ffff00ff","color":"#e8cb2dff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"base":"#ffff00ff","color":"#e8cb2dff","out":{"hex":"#fffaadff","u16":[65530,64142,44398,65535]}}, +{"amount":0.2,"base":"#ffff00ff","color":"#e8cb2dff","out":{"hex":"#fff6b2ff","u16":[65517,63344,45688,65535]}}, +{"amount":0.3,"base":"#ffff00ff","color":"#e8cb2dff","out":{"hex":"#fff199ff","u16":[65482,61886,39344,65535]}}, +{"amount":0.4,"base":"#ffff00ff","color":"#e8cb2dff","out":{"hex":"#fee754ff","u16":[65405,59373,21592,65535]}}, +{"amount":0.5,"base":"#ffff00ff","color":"#e8cb2dff","out":{"hex":"#f5d92cff","u16":[62921,55690,11220,65535]}}, +{"amount":0.7,"base":"#ffff00ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59627,52175,11565,65535]}}, +{"amount":1,"base":"#ffff00ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":1.5,"base":"#ffff00ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":-0.5,"base":"#ffff00ff","color":"#3daee980","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"base":"#ffff00ff","color":"#3daee980","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"base":"#ffff00ff","color":"#3daee980","out":{"hex":"#f0ff9dd7","u16":[61668,65475,40370,55258]}}, +{"amount":0.2,"base":"#ffff00ff","color":"#3daee980","out":{"hex":"#e4feaabf","u16":[58493,65218,43664,49208]}}, +{"amount":0.3,"base":"#ffff00ff","color":"#3daee980","out":{"hex":"#cefaabad","u16":[52927,64265,43957,44408]}}, +{"amount":0.4,"base":"#ffff00ff","color":"#3daee980","out":{"hex":"#adf1b69e","u16":[44430,61982,46889,40540]}}, +{"amount":0.5,"base":"#ffff00ff","color":"#3daee980","out":{"hex":"#7fe3cd92","u16":[32646,58259,52813,37481]}}, +{"amount":0.7,"base":"#ffff00ff","color":"#3daee980","out":{"hex":"#44b5e982","u16":[17573,46636,59924,33360]}}, +{"amount":1,"base":"#ffff00ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":1.5,"base":"#ffff00ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":-0.5,"base":"#ffff00ff","color":"#ffffff00","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0,"base":"#ffff00ff","color":"#ffffff00","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.1,"base":"#ffff00ff","color":"#ffffff00","out":{"hex":"#ffff0000","u16":[65535,65535,0,5]}}, +{"amount":0.2,"base":"#ffff00ff","color":"#ffffff00","out":{"hex":"#ffff0000","u16":[65535,65535,0,5]}}, +{"amount":0.3,"base":"#ffff00ff","color":"#ffffff00","out":{"hex":"#ffff0000","u16":[65535,65535,0,5]}}, +{"amount":0.4,"base":"#ffff00ff","color":"#ffffff00","out":{"hex":"#ffff0000","u16":[65535,65535,0,5]}}, +{"amount":0.5,"base":"#ffff00ff","color":"#ffffff00","out":{"hex":"#ffff0000","u16":[65535,65535,0,5]}}, +{"amount":0.7,"base":"#ffff00ff","color":"#ffffff00","out":{"hex":"#ffff0000","u16":[65535,65535,0,5]}}, +{"amount":1,"base":"#ffff00ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"base":"#ffff00ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"base":"#030201ff","color":"#000000ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"base":"#030201ff","color":"#000000ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.1,"base":"#030201ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[13,13,13,65535]}}, +{"amount":0.2,"base":"#030201ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[13,13,13,65535]}}, +{"amount":0.3,"base":"#030201ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[13,13,13,65535]}}, +{"amount":0.4,"base":"#030201ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[13,13,13,65535]}}, +{"amount":0.5,"base":"#030201ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[13,13,13,65535]}}, +{"amount":0.7,"base":"#030201ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[13,13,13,65535]}}, +{"amount":1,"base":"#030201ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"base":"#030201ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"base":"#030201ff","color":"#ffffffff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"base":"#030201ff","color":"#ffffffff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.1,"base":"#030201ff","color":"#ffffffff","out":{"hex":"#0c0c0bff","u16":[2994,2966,2938,65535]}}, +{"amount":0.2,"base":"#030201ff","color":"#ffffffff","out":{"hex":"#1e1e1eff","u16":[7666,7626,7586,65535]}}, +{"amount":0.3,"base":"#030201ff","color":"#ffffffff","out":{"hex":"#343433ff","u16":[13285,13239,13193,65535]}}, +{"amount":0.4,"base":"#030201ff","color":"#ffffffff","out":{"hex":"#4d4c4cff","u16":[19670,19622,19575,65535]}}, +{"amount":0.5,"base":"#030201ff","color":"#ffffffff","out":{"hex":"#686767ff","u16":[26625,26580,26535,65535]}}, +{"amount":0.7,"base":"#030201ff","color":"#ffffffff","out":{"hex":"#a4a4a4ff","u16":[42136,42085,42033,65535]}}, +{"amount":1,"base":"#030201ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"base":"#030201ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"base":"#030201ff","color":"#7f7f7fff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"base":"#030201ff","color":"#7f7f7fff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.1,"base":"#030201ff","color":"#7f7f7fff","out":{"hex":"#070707ff","u16":[1784,1753,1723,65535]}}, +{"amount":0.2,"base":"#030201ff","color":"#7f7f7fff","out":{"hex":"#111111ff","u16":[4376,4334,4292,65535]}}, +{"amount":0.3,"base":"#030201ff","color":"#7f7f7fff","out":{"hex":"#1d1d1dff","u16":[7570,7523,7476,65535]}}, +{"amount":0.4,"base":"#030201ff","color":"#7f7f7fff","out":{"hex":"#2b2b2bff","u16":[11179,11133,11086,65535]}}, +{"amount":0.5,"base":"#030201ff","color":"#7f7f7fff","out":{"hex":"#3b3b3bff","u16":[15126,15083,15040,65535]}}, +{"amount":0.7,"base":"#030201ff","color":"#7f7f7fff","out":{"hex":"#5d5d5dff","u16":[23888,23863,23839,65535]}}, +{"amount":1,"base":"#030201ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1.5,"base":"#030201ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":-0.5,"base":"#030201ff","color":"#808080ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"base":"#030201ff","color":"#808080ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.1,"base":"#030201ff","color":"#808080ff","out":{"hex":"#070707ff","u16":[1796,1765,1735,65535]}}, +{"amount":0.2,"base":"#030201ff","color":"#808080ff","out":{"hex":"#111111ff","u16":[4409,4367,4325,65535]}}, +{"amount":0.3,"base":"#030201ff","color":"#808080ff","out":{"hex":"#1e1d1dff","u16":[7608,7561,7515,65535]}}, +{"amount":0.4,"base":"#030201ff","color":"#808080ff","out":{"hex":"#2c2c2bff","u16":[11232,11185,11138,65535]}}, +{"amount":0.5,"base":"#030201ff","color":"#808080ff","out":{"hex":"#3b3b3bff","u16":[15197,15154,15111,65535]}}, +{"amount":0.7,"base":"#030201ff","color":"#808080ff","out":{"hex":"#5d5d5dff","u16":[24009,23984,23959,65535]}}, +{"amount":1,"base":"#030201ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1.5,"base":"#030201ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":-0.5,"base":"#030201ff","color":"#ff0000ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"base":"#030201ff","color":"#ff0000ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.1,"base":"#030201ff","color":"#ff0000ff","out":{"hex":"#0e0000ff","u16":[3494,61,31,65535]}}, +{"amount":0.2,"base":"#030201ff","color":"#ff0000ff","out":{"hex":"#220000ff","u16":[8754,84,42,65535]}}, +{"amount":0.3,"base":"#030201ff","color":"#ff0000ff","out":{"hex":"#3b0000ff","u16":[15136,94,47,65535]}}, +{"amount":0.4,"base":"#030201ff","color":"#ff0000ff","out":{"hex":"#570000ff","u16":[22409,93,47,65535]}}, +{"amount":0.5,"base":"#030201ff","color":"#ff0000ff","out":{"hex":"#760000ff","u16":[30365,85,43,65535]}}, +{"amount":0.7,"base":"#030201ff","color":"#ff0000ff","out":{"hex":"#bb0000ff","u16":[48023,50,25,65535]}}, +{"amount":1,"base":"#030201ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":1.5,"base":"#030201ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":-0.5,"base":"#030201ff","color":"#00ff00ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"base":"#030201ff","color":"#00ff00ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.1,"base":"#030201ff","color":"#00ff00ff","out":{"hex":"#000c00ff","u16":[86,3046,29,65535]}}, +{"amount":0.2,"base":"#030201ff","color":"#00ff00ff","out":{"hex":"#001e00ff","u16":[122,7776,40,65535]}}, +{"amount":0.3,"base":"#030201ff","color":"#00ff00ff","out":{"hex":"#013400ff","u16":[139,13485,46,65535]}}, +{"amount":0.4,"base":"#030201ff","color":"#00ff00ff","out":{"hex":"#014e00ff","u16":[142,19945,47,65535]}}, +{"amount":0.5,"base":"#030201ff","color":"#00ff00ff","out":{"hex":"#016900ff","u16":[135,27033,45,65535]}}, +{"amount":0.7,"base":"#030201ff","color":"#00ff00ff","out":{"hex":"#00a600ff","u16":[93,42754,31,65535]}}, +{"amount":1,"base":"#030201ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":1.5,"base":"#030201ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":-0.5,"base":"#030201ff","color":"#0000ffff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"base":"#030201ff","color":"#0000ffff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.1,"base":"#030201ff","color":"#0000ffff","out":{"hex":"#000012ff","u16":[105,70,4522,65535]}}, +{"amount":0.2,"base":"#030201ff","color":"#0000ffff","out":{"hex":"#01002bff","u16":[134,89,10928,65535]}}, +{"amount":0.3,"base":"#030201ff","color":"#0000ffff","out":{"hex":"#01004aff","u16":[143,95,18895,65535]}}, +{"amount":0.4,"base":"#030201ff","color":"#0000ffff","out":{"hex":"#01006dff","u16":[133,88,27938,65535]}}, +{"amount":0.5,"base":"#030201ff","color":"#0000ffff","out":{"hex":"#000093ff","u16":[109,73,37844,65535]}}, +{"amount":0.7,"base":"#030201ff","color":"#0000ffff","out":{"hex":"#0000e9ff","u16":[26,17,59825,65535]}}, +{"amount":1,"base":"#030201ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":1.5,"base":"#030201ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":-0.5,"base":"#030201ff","color":"#ffff00ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"base":"#030201ff","color":"#ffff00ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.1,"base":"#030201ff","color":"#ffff00ff","out":{"hex":"#0c0c00ff","u16":[3063,3035,28,65535]}}, +{"amount":0.2,"base":"#030201ff","color":"#ffff00ff","out":{"hex":"#1e1e00ff","u16":[7667,7627,40,65535]}}, +{"amount":0.3,"base":"#030201ff","color":"#ffff00ff","out":{"hex":"#343400ff","u16":[13326,13280,46,65535]}}, +{"amount":0.4,"base":"#030201ff","color":"#ffff00ff","out":{"hex":"#4d4c00ff","u16":[19706,19658,47,65535]}}, +{"amount":0.5,"base":"#030201ff","color":"#ffff00ff","out":{"hex":"#686800ff","u16":[26723,26677,45,65535]}}, +{"amount":0.7,"base":"#030201ff","color":"#ffff00ff","out":{"hex":"#a4a400ff","u16":[42231,42199,31,65535]}}, +{"amount":1,"base":"#030201ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1.5,"base":"#030201ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":-0.5,"base":"#030201ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"base":"#030201ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.1,"base":"#030201ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.2,"base":"#030201ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.3,"base":"#030201ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.4,"base":"#030201ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.5,"base":"#030201ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.7,"base":"#030201ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1,"base":"#030201ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1.5,"base":"#030201ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":-0.5,"base":"#030201ff","color":"#3daee9ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"base":"#030201ff","color":"#3daee9ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.1,"base":"#030201ff","color":"#3daee9ff","out":{"hex":"#03090bff","u16":[843,2212,2913,65535]}}, +{"amount":0.2,"base":"#030201ff","color":"#3daee9ff","out":{"hex":"#08161dff","u16":[2048,5571,7391,65535]}}, +{"amount":0.3,"base":"#030201ff","color":"#3daee9ff","out":{"hex":"#0e2632ff","u16":[3489,9647,12839,65535]}}, +{"amount":0.4,"base":"#030201ff","color":"#3daee9ff","out":{"hex":"#14384aff","u16":[5111,14268,19027,65535]}}, +{"amount":0.5,"base":"#030201ff","color":"#3daee9ff","out":{"hex":"#1b4b65ff","u16":[6884,19347,25834,65535]}}, +{"amount":0.7,"base":"#030201ff","color":"#3daee9ff","out":{"hex":"#2a779fff","u16":[10793,30598,40926,65535]}}, +{"amount":1,"base":"#030201ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":1.5,"base":"#030201ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":-0.5,"base":"#030201ff","color":"#232629ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"base":"#030201ff","color":"#232629ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.1,"base":"#030201ff","color":"#232629ff","out":{"hex":"#040505ff","u16":[1140,1184,1228,65535]}}, +{"amount":0.2,"base":"#030201ff","color":"#232629ff","out":{"hex":"#0a0b0cff","u16":[2628,2793,2958,65535]}}, +{"amount":0.3,"base":"#030201ff","color":"#232629ff","out":{"hex":"#111314ff","u16":[4476,4807,5139,65535]}}, +{"amount":0.4,"base":"#030201ff","color":"#232629ff","out":{"hex":"#1a1c1eff","u16":[6574,7105,7636,65535]}}, +{"amount":0.5,"base":"#030201ff","color":"#232629ff","out":{"hex":"#232528ff","u16":[8871,9630,10389,65535]}}, +{"amount":0.7,"base":"#030201ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8993,9764,10535,65535]}}, +{"amount":1,"base":"#030201ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":1.5,"base":"#030201ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":-0.5,"base":"#030201ff","color":"#eff0f1ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"base":"#030201ff","color":"#eff0f1ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.1,"base":"#030201ff","color":"#eff0f1ff","out":{"hex":"#0b0b0bff","u16":[2879,2862,2845,65535]}}, +{"amount":0.2,"base":"#030201ff","color":"#eff0f1ff","out":{"hex":"#1c1c1cff","u16":[7240,7230,7219,65535]}}, +{"amount":0.3,"base":"#030201ff","color":"#eff0f1ff","out":{"hex":"#313131ff","u16":[12537,12543,12549,65535]}}, +{"amount":0.4,"base":"#030201ff","color":"#eff0f1ff","out":{"hex":"#484848ff","u16":[18545,18575,18605,65535]}}, +{"amount":0.5,"base":"#030201ff","color":"#eff0f1ff","out":{"hex":"#626262ff","u16":[25115,25174,25234,65535]}}, +{"amount":0.7,"base":"#030201ff","color":"#eff0f1ff","out":{"hex":"#9a9b9cff","u16":[39578,39843,40109,65535]}}, +{"amount":1,"base":"#030201ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":1.5,"base":"#030201ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":-0.5,"base":"#030201ff","color":"#fcfcfcff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"base":"#030201ff","color":"#fcfcfcff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.1,"base":"#030201ff","color":"#fcfcfcff","out":{"hex":"#0c0b0bff","u16":[2961,2933,2905,65535]}}, +{"amount":0.2,"base":"#030201ff","color":"#fcfcfcff","out":{"hex":"#1d1d1dff","u16":[7578,7538,7497,65535]}}, +{"amount":0.3,"base":"#030201ff","color":"#fcfcfcff","out":{"hex":"#333333ff","u16":[13171,13125,13078,65535]}}, +{"amount":0.4,"base":"#030201ff","color":"#fcfcfcff","out":{"hex":"#4c4b4bff","u16":[19440,19393,19345,65535]}}, +{"amount":0.5,"base":"#030201ff","color":"#fcfcfcff","out":{"hex":"#676666ff","u16":[26346,26301,26255,65535]}}, +{"amount":0.7,"base":"#030201ff","color":"#fcfcfcff","out":{"hex":"#a2a2a2ff","u16":[41667,41618,41571,65535]}}, +{"amount":1,"base":"#030201ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1.5,"base":"#030201ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":-0.5,"base":"#030201ff","color":"#da4453ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"base":"#030201ff","color":"#da4453ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.1,"base":"#030201ff","color":"#da4453ff","out":{"hex":"#0c0404ff","u16":[3007,971,1141,65535]}}, +{"amount":0.2,"base":"#030201ff","color":"#da4453ff","out":{"hex":"#1d090bff","u16":[7544,2398,2866,65535]}}, +{"amount":0.3,"base":"#030201ff","color":"#da4453ff","out":{"hex":"#331013ff","u16":[13094,4134,4979,65535]}}, +{"amount":0.4,"base":"#030201ff","color":"#da4453ff","out":{"hex":"#4b181dff","u16":[19354,6087,7362,65535]}}, +{"amount":0.5,"base":"#030201ff","color":"#da4453ff","out":{"hex":"#662027ff","u16":[26243,8231,9985,65535]}}, +{"amount":0.7,"base":"#030201ff","color":"#da4453ff","out":{"hex":"#a2333eff","u16":[41542,12983,15813,65535]}}, +{"amount":1,"base":"#030201ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":1.5,"base":"#030201ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":-0.5,"base":"#030201ff","color":"#e8cb2dff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"base":"#030201ff","color":"#e8cb2dff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.1,"base":"#030201ff","color":"#e8cb2dff","out":{"hex":"#0b0a02ff","u16":[2812,2443,557,65535]}}, +{"amount":0.2,"base":"#030201ff","color":"#e8cb2dff","out":{"hex":"#1c1805ff","u16":[7169,6248,1408,65535]}}, +{"amount":0.3,"base":"#030201ff","color":"#e8cb2dff","out":{"hex":"#302a09ff","u16":[12398,10819,2424,65535]}}, +{"amount":0.4,"base":"#030201ff","color":"#e8cb2dff","out":{"hex":"#473e0eff","u16":[18332,16011,3576,65535]}}, +{"amount":0.5,"base":"#030201ff","color":"#e8cb2dff","out":{"hex":"#615513ff","u16":[24853,21718,4839,65535]}}, +{"amount":0.7,"base":"#030201ff","color":"#e8cb2dff","out":{"hex":"#99861eff","u16":[39312,34379,7638,65535]}}, +{"amount":1,"base":"#030201ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":1.5,"base":"#030201ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":-0.5,"base":"#030201ff","color":"#3daee980","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"base":"#030201ff","color":"#3daee980","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.1,"base":"#030201ff","color":"#3daee980","out":{"hex":"#03090bd1","u16":[880,2224,2905,53810]}}, +{"amount":0.2,"base":"#030201ff","color":"#3daee980","out":{"hex":"#08161dbf","u16":[2093,5571,7358,48995]}}, +{"amount":0.3,"base":"#030201ff","color":"#3daee980","out":{"hex":"#0e2632b1","u16":[3543,9659,12819,45471]}}, +{"amount":0.4,"base":"#030201ff","color":"#3daee980","out":{"hex":"#14384aa6","u16":[5162,14272,18995,42646]}}, +{"amount":0.5,"base":"#030201ff","color":"#3daee980","out":{"hex":"#1b4b649d","u16":[6927,19341,25792,40259]}}, +{"amount":0.7,"base":"#030201ff","color":"#3daee980","out":{"hex":"#2a779f8d","u16":[10825,30605,40913,36357]}}, +{"amount":1,"base":"#030201ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":1.5,"base":"#030201ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":-0.5,"base":"#030201ff","color":"#ffffff00","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0,"base":"#030201ff","color":"#ffffff00","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":0.1,"base":"#030201ff","color":"#ffffff00","out":{"hex":"#03020100","u16":[771,514,257,5]}}, +{"amount":0.2,"base":"#030201ff","color":"#ffffff00","out":{"hex":"#03020100","u16":[771,514,257,5]}}, +{"amount":0.3,"base":"#030201ff","color":"#ffffff00","out":{"hex":"#03020100","u16":[771,514,257,5]}}, +{"amount":0.4,"base":"#030201ff","color":"#ffffff00","out":{"hex":"#03020100","u16":[771,514,257,5]}}, +{"amount":0.5,"base":"#030201ff","color":"#ffffff00","out":{"hex":"#03020100","u16":[771,514,257,5]}}, +{"amount":0.7,"base":"#030201ff","color":"#ffffff00","out":{"hex":"#03020100","u16":[771,514,257,5]}}, +{"amount":1,"base":"#030201ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"base":"#030201ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"base":"#3daee9ff","color":"#000000ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"base":"#3daee9ff","color":"#000000ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.1,"base":"#3daee9ff","color":"#000000ff","out":{"hex":"#3dade8ff","u16":[15600,44501,59589,65535]}}, +{"amount":0.2,"base":"#3daee9ff","color":"#000000ff","out":{"hex":"#3ba7e0ff","u16":[15090,43045,57639,65535]}}, +{"amount":0.3,"base":"#3daee9ff","color":"#000000ff","out":{"hex":"#369acfff","u16":[13905,39663,53112,65535]}}, +{"amount":0.4,"base":"#3daee9ff","color":"#000000ff","out":{"hex":"#2f87b5ff","u16":[12147,34654,46403,65535]}}, +{"amount":0.5,"base":"#3daee9ff","color":"#000000ff","out":{"hex":"#277197ff","u16":[10147,28942,38756,65535]}}, +{"amount":0.7,"base":"#3daee9ff","color":"#000000ff","out":{"hex":"#18455dff","u16":[6256,17836,23890,65535]}}, +{"amount":1,"base":"#3daee9ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"base":"#3daee9ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"base":"#3daee9ff","color":"#ffffffff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"base":"#3daee9ff","color":"#ffffffff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.1,"base":"#3daee9ff","color":"#ffffffff","out":{"hex":"#5aaed7ff","u16":[23080,44637,55287,65535]}}, +{"amount":0.2,"base":"#3daee9ff","color":"#ffffffff","out":{"hex":"#59b0d7ff","u16":[22886,45340,55275,65535]}}, +{"amount":0.3,"base":"#3daee9ff","color":"#ffffffff","out":{"hex":"#5ab7dcff","u16":[23235,46907,56572,65535]}}, +{"amount":0.4,"base":"#3daee9ff","color":"#ffffffff","out":{"hex":"#5ec1e7ff","u16":[24228,49700,59454,65535]}}, +{"amount":0.5,"base":"#3daee9ff","color":"#ffffffff","out":{"hex":"#77d0f3ff","u16":[30668,53446,62427,65535]}}, +{"amount":0.7,"base":"#3daee9ff","color":"#ffffffff","out":{"hex":"#e3f4fcff","u16":[58439,62656,64762,65535]}}, +{"amount":1,"base":"#3daee9ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"base":"#3daee9ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"base":"#3daee9ff","color":"#7f7f7fff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"base":"#3daee9ff","color":"#7f7f7fff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.1,"base":"#3daee9ff","color":"#7f7f7fff","out":{"hex":"#58addaff","u16":[22494,44458,55926,65535]}}, +{"amount":0.2,"base":"#3daee9ff","color":"#7f7f7fff","out":{"hex":"#69aaccff","u16":[27044,43722,52430,65535]}}, +{"amount":0.3,"base":"#3daee9ff","color":"#7f7f7fff","out":{"hex":"#77a4bcff","u16":[30584,42236,48320,65535]}}, +{"amount":0.4,"base":"#3daee9ff","color":"#7f7f7fff","out":{"hex":"#809baaff","u16":[32833,39889,43573,65535]}}, +{"amount":0.5,"base":"#3daee9ff","color":"#7f7f7fff","out":{"hex":"#838f96ff","u16":[33572,36786,38463,65535]}}, +{"amount":0.7,"base":"#3daee9ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32641,32643,32644,65535]}}, +{"amount":1,"base":"#3daee9ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1.5,"base":"#3daee9ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":-0.5,"base":"#3daee9ff","color":"#808080ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"base":"#3daee9ff","color":"#808080ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.1,"base":"#3daee9ff","color":"#808080ff","out":{"hex":"#58addaff","u16":[22535,44457,55902,65535]}}, +{"amount":0.2,"base":"#3daee9ff","color":"#808080ff","out":{"hex":"#6aaaccff","u16":[27138,43719,52375,65535]}}, +{"amount":0.3,"base":"#3daee9ff","color":"#808080ff","out":{"hex":"#77a4bcff","u16":[30705,42234,48254,65535]}}, +{"amount":0.4,"base":"#3daee9ff","color":"#808080ff","out":{"hex":"#809ba9ff","u16":[32973,39896,43512,65535]}}, +{"amount":0.5,"base":"#3daee9ff","color":"#808080ff","out":{"hex":"#838f95ff","u16":[33727,36807,38415,65535]}}, +{"amount":0.7,"base":"#3daee9ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32898,32900,32901,65535]}}, +{"amount":1,"base":"#3daee9ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1.5,"base":"#3daee9ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":-0.5,"base":"#3daee9ff","color":"#ff0000ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"base":"#3daee9ff","color":"#ff0000ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.1,"base":"#3daee9ff","color":"#ff0000ff","out":{"hex":"#8fa4ccff","u16":[36861,42213,52324,65535]}}, +{"amount":0.2,"base":"#3daee9ff","color":"#ff0000ff","out":{"hex":"#b49ab8ff","u16":[46177,39479,47198,65535]}}, +{"amount":0.3,"base":"#3daee9ff","color":"#ff0000ff","out":{"hex":"#d28a9fff","u16":[53935,35417,40769,65535]}}, +{"amount":0.4,"base":"#3daee9ff","color":"#ff0000ff","out":{"hex":"#e97380ff","u16":[59983,29624,32838,65535]}}, +{"amount":0.5,"base":"#3daee9ff","color":"#ff0000ff","out":{"hex":"#f9545aff","u16":[63898,21713,23143,65535]}}, +{"amount":0.7,"base":"#3daee9ff","color":"#ff0000ff","out":{"hex":"#ff0202ff","u16":[65535,416,416,65535]}}, +{"amount":1,"base":"#3daee9ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":1.5,"base":"#3daee9ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":-0.5,"base":"#3daee9ff","color":"#00ff00ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"base":"#3daee9ff","color":"#00ff00ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.1,"base":"#3daee9ff","color":"#00ff00ff","out":{"hex":"#28b998ff","u16":[10196,47452,38946,65535]}}, +{"amount":0.2,"base":"#3daee9ff","color":"#00ff00ff","out":{"hex":"#1dbe6eff","u16":[7416,48760,28329,65535]}}, +{"amount":0.3,"base":"#3daee9ff","color":"#00ff00ff","out":{"hex":"#15c450ff","u16":[5365,50468,20493,65535]}}, +{"amount":0.4,"base":"#3daee9ff","color":"#00ff00ff","out":{"hex":"#0ecf37ff","u16":[3714,53100,14186,65535]}}, +{"amount":0.5,"base":"#3daee9ff","color":"#00ff00ff","out":{"hex":"#09de21ff","u16":[2252,56936,8603,65535]}}, +{"amount":0.7,"base":"#3daee9ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[1,65530,4,65535]}}, +{"amount":1,"base":"#3daee9ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":1.5,"base":"#3daee9ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":-0.5,"base":"#3daee9ff","color":"#0000ffff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"base":"#3daee9ff","color":"#0000ffff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.1,"base":"#3daee9ff","color":"#0000ffff","out":{"hex":"#7aa2f8ff","u16":[31465,41718,63693,65535]}}, +{"amount":0.2,"base":"#3daee9ff","color":"#0000ffff","out":{"hex":"#889bf9ff","u16":[34955,39898,64035,65535]}}, +{"amount":0.3,"base":"#3daee9ff","color":"#0000ffff","out":{"hex":"#8892fbff","u16":[34828,37399,64447,65535]}}, +{"amount":0.4,"base":"#3daee9ff","color":"#0000ffff","out":{"hex":"#7e83fcff","u16":[32390,33715,64883,65535]}}, +{"amount":0.5,"base":"#3daee9ff","color":"#0000ffff","out":{"hex":"#6e71feff","u16":[28293,28927,65232,65535]}}, +{"amount":0.7,"base":"#3daee9ff","color":"#0000ffff","out":{"hex":"#4141ffff","u16":[16650,16722,65515,65535]}}, +{"amount":1,"base":"#3daee9ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":1.5,"base":"#3daee9ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":-0.5,"base":"#3daee9ff","color":"#ffff00ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"base":"#3daee9ff","color":"#ffff00ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.1,"base":"#3daee9ff","color":"#ffff00ff","out":{"hex":"#69b297ff","u16":[26962,45806,38855,65535]}}, +{"amount":0.2,"base":"#3daee9ff","color":"#ffff00ff","out":{"hex":"#7eb46fff","u16":[32370,46203,28523,65535]}}, +{"amount":0.3,"base":"#3daee9ff","color":"#ffff00ff","out":{"hex":"#90b853ff","u16":[36937,47261,21287,65535]}}, +{"amount":0.4,"base":"#3daee9ff","color":"#ffff00ff","out":{"hex":"#a3c03dff","u16":[41823,49420,15664,65535]}}, +{"amount":0.5,"base":"#3daee9ff","color":"#ffff00ff","out":{"hex":"#b9ce2aff","u16":[47598,52862,10854,65535]}}, +{"amount":0.7,"base":"#3daee9ff","color":"#ffff00ff","out":{"hex":"#f4f706ff","u16":[62669,63438,1587,65535]}}, +{"amount":1,"base":"#3daee9ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1.5,"base":"#3daee9ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":-0.5,"base":"#3daee9ff","color":"#030201ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"base":"#3daee9ff","color":"#030201ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.1,"base":"#3daee9ff","color":"#030201ff","out":{"hex":"#3eade7ff","u16":[15860,44507,59410,65535]}}, +{"amount":0.2,"base":"#3daee9ff","color":"#030201ff","out":{"hex":"#3da8dfff","u16":[15669,43055,57235,65535]}}, +{"amount":0.3,"base":"#3daee9ff","color":"#030201ff","out":{"hex":"#3a9accff","u16":[14926,39680,52394,65535]}}, +{"amount":0.4,"base":"#3daee9ff","color":"#030201ff","out":{"hex":"#3687b0ff","u16":[13759,34680,45270,65535]}}, +{"amount":0.5,"base":"#3daee9ff","color":"#030201ff","out":{"hex":"#317190ff","u16":[12496,28961,37068,65535]}}, +{"amount":0.7,"base":"#3daee9ff","color":"#030201ff","out":{"hex":"#294550ff","u16":[10521,17755,20631,65535]}}, +{"amount":1,"base":"#3daee9ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1.5,"base":"#3daee9ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":-0.5,"base":"#3daee9ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"base":"#3daee9ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.1,"base":"#3daee9ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.2,"base":"#3daee9ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.3,"base":"#3daee9ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.4,"base":"#3daee9ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.5,"base":"#3daee9ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.7,"base":"#3daee9ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":1,"base":"#3daee9ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":1.5,"base":"#3daee9ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":-0.5,"base":"#3daee9ff","color":"#232629ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"base":"#3daee9ff","color":"#232629ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.1,"base":"#3daee9ff","color":"#232629ff","out":{"hex":"#45ade4ff","u16":[17807,44498,58580,65535]}}, +{"amount":0.2,"base":"#3daee9ff","color":"#232629ff","out":{"hex":"#4ca8daff","u16":[19557,43254,55916,65535]}}, +{"amount":0.3,"base":"#3daee9ff","color":"#232629ff","out":{"hex":"#519dc6ff","u16":[20870,40325,50930,65535]}}, +{"amount":0.4,"base":"#3daee9ff","color":"#232629ff","out":{"hex":"#538babff","u16":[21318,35828,43984,65535]}}, +{"amount":0.5,"base":"#3daee9ff","color":"#232629ff","out":{"hex":"#50778dff","u16":[20655,30484,36276,65535]}}, +{"amount":0.7,"base":"#3daee9ff","color":"#232629ff","out":{"hex":"#404d57ff","u16":[16350,19851,22301,65535]}}, +{"amount":1,"base":"#3daee9ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":1.5,"base":"#3daee9ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":-0.5,"base":"#3daee9ff","color":"#eff0f1ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"base":"#3daee9ff","color":"#eff0f1ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.1,"base":"#3daee9ff","color":"#eff0f1ff","out":{"hex":"#60add5ff","u16":[24800,44469,54637,65535]}}, +{"amount":0.2,"base":"#3daee9ff","color":"#eff0f1ff","out":{"hex":"#65afd2ff","u16":[26036,44981,54033,65535]}}, +{"amount":0.3,"base":"#3daee9ff","color":"#eff0f1ff","out":{"hex":"#6db4d4ff","u16":[28075,46244,54545,65535]}}, +{"amount":0.4,"base":"#3daee9ff","color":"#eff0f1ff","out":{"hex":"#7abddbff","u16":[31342,48553,56265,65535]}}, +{"amount":0.5,"base":"#3daee9ff","color":"#eff0f1ff","out":{"hex":"#94cae3ff","u16":[37916,51797,58255,65535]}}, +{"amount":0.7,"base":"#3daee9ff","color":"#eff0f1ff","out":{"hex":"#e9eceeff","u16":[59865,60680,61250,65535]}}, +{"amount":1,"base":"#3daee9ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":1.5,"base":"#3daee9ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":-0.5,"base":"#3daee9ff","color":"#fcfcfcff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"base":"#3daee9ff","color":"#fcfcfcff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.1,"base":"#3daee9ff","color":"#fcfcfcff","out":{"hex":"#5baed7ff","u16":[23477,44599,55138,65535]}}, +{"amount":0.2,"base":"#3daee9ff","color":"#fcfcfcff","out":{"hex":"#5cb0d6ff","u16":[23661,45261,54979,65535]}}, +{"amount":0.3,"base":"#3daee9ff","color":"#fcfcfcff","out":{"hex":"#5fb6daff","u16":[24519,46759,56078,65535]}}, +{"amount":0.4,"base":"#3daee9ff","color":"#fcfcfcff","out":{"hex":"#66c0e4ff","u16":[26312,49429,58640,65535]}}, +{"amount":0.5,"base":"#3daee9ff","color":"#fcfcfcff","out":{"hex":"#80ceefff","u16":[32868,53043,61321,65535]}}, +{"amount":0.7,"base":"#3daee9ff","color":"#fcfcfcff","out":{"hex":"#e8f2f7ff","u16":[59549,62101,63406,65535]}}, +{"amount":1,"base":"#3daee9ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1.5,"base":"#3daee9ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":-0.5,"base":"#3daee9ff","color":"#da4453ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"base":"#3daee9ff","color":"#da4453ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.1,"base":"#3daee9ff","color":"#da4453ff","out":{"hex":"#7ca7d8ff","u16":[31827,42929,55586,65535]}}, +{"amount":0.2,"base":"#3daee9ff","color":"#da4453ff","out":{"hex":"#a19fbbff","u16":[41281,40975,47941,65535]}}, +{"amount":0.3,"base":"#3daee9ff","color":"#da4453ff","out":{"hex":"#b893b0ff","u16":[47280,37710,45132,65535]}}, +{"amount":0.4,"base":"#3daee9ff","color":"#da4453ff","out":{"hex":"#c78499ff","u16":[51017,33849,39346,65535]}}, +{"amount":0.5,"base":"#3daee9ff","color":"#da4453ff","out":{"hex":"#d46d80ff","u16":[54432,28095,32769,65535]}}, +{"amount":0.7,"base":"#3daee9ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56029,17480,21336,65535]}}, +{"amount":1,"base":"#3daee9ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":1.5,"base":"#3daee9ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":-0.5,"base":"#3daee9ff","color":"#e8cb2dff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"base":"#3daee9ff","color":"#e8cb2dff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.1,"base":"#3daee9ff","color":"#e8cb2dff","out":{"hex":"#72b0a2ff","u16":[29223,45170,41604,65535]}}, +{"amount":0.2,"base":"#3daee9ff","color":"#e8cb2dff","out":{"hex":"#8baf7eff","u16":[35710,45100,32328,65535]}}, +{"amount":0.3,"base":"#3daee9ff","color":"#e8cb2dff","out":{"hex":"#a0b163ff","u16":[41097,45525,25510,65535]}}, +{"amount":0.4,"base":"#3daee9ff","color":"#e8cb2dff","out":{"hex":"#b5b64eff","u16":[46540,46785,20144,65535]}}, +{"amount":0.5,"base":"#3daee9ff","color":"#e8cb2dff","out":{"hex":"#cdbf3dff","u16":[52671,49032,15615,65535]}}, +{"amount":0.7,"base":"#3daee9ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59618,52168,11569,65535]}}, +{"amount":1,"base":"#3daee9ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":1.5,"base":"#3daee9ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":-0.5,"base":"#3daee9ff","color":"#3daee980","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"base":"#3daee9ff","color":"#3daee980","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.1,"base":"#3daee9ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32898]}}, +{"amount":0.2,"base":"#3daee9ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32898]}}, +{"amount":0.3,"base":"#3daee9ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32898]}}, +{"amount":0.4,"base":"#3daee9ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32898]}}, +{"amount":0.5,"base":"#3daee9ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32898]}}, +{"amount":0.7,"base":"#3daee9ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32898]}}, +{"amount":1,"base":"#3daee9ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":1.5,"base":"#3daee9ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":-0.5,"base":"#3daee9ff","color":"#ffffff00","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0,"base":"#3daee9ff","color":"#ffffff00","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":0.1,"base":"#3daee9ff","color":"#ffffff00","out":{"hex":"#3daee900","u16":[15677,44718,59881,5]}}, +{"amount":0.2,"base":"#3daee9ff","color":"#ffffff00","out":{"hex":"#3daee900","u16":[15677,44718,59881,5]}}, +{"amount":0.3,"base":"#3daee9ff","color":"#ffffff00","out":{"hex":"#3daee900","u16":[15677,44718,59881,5]}}, +{"amount":0.4,"base":"#3daee9ff","color":"#ffffff00","out":{"hex":"#3daee900","u16":[15677,44718,59881,5]}}, +{"amount":0.5,"base":"#3daee9ff","color":"#ffffff00","out":{"hex":"#3daee900","u16":[15677,44718,59881,5]}}, +{"amount":0.7,"base":"#3daee9ff","color":"#ffffff00","out":{"hex":"#3daee900","u16":[15677,44718,59881,5]}}, +{"amount":1,"base":"#3daee9ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"base":"#3daee9ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"base":"#232629ff","color":"#000000ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"base":"#232629ff","color":"#000000ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.1,"base":"#232629ff","color":"#000000ff","out":{"hex":"#232629ff","u16":[8954,9722,10489,65535]}}, +{"amount":0.2,"base":"#232629ff","color":"#000000ff","out":{"hex":"#222528ff","u16":[8666,9409,10153,65535]}}, +{"amount":0.3,"base":"#232629ff","color":"#000000ff","out":{"hex":"#1f2124ff","u16":[7868,8542,9217,65535]}}, +{"amount":0.4,"base":"#232629ff","color":"#000000ff","out":{"hex":"#181a1cff","u16":[6195,6723,7255,65535]}}, +{"amount":0.5,"base":"#232629ff","color":"#000000ff","out":{"hex":"#070708ff","u16":[1702,1848,1994,65535]}}, +{"amount":0.7,"base":"#232629ff","color":"#000000ff","out":{"hex":"#010101ff","u16":[220,220,220,65535]}}, +{"amount":1,"base":"#232629ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"base":"#232629ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"base":"#232629ff","color":"#ffffffff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"base":"#232629ff","color":"#ffffffff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.1,"base":"#232629ff","color":"#ffffffff","out":{"hex":"#262728ff","u16":[9791,10025,10259,65535]}}, +{"amount":0.2,"base":"#232629ff","color":"#ffffffff","out":{"hex":"#2e2f2fff","u16":[11819,11993,12166,65535]}}, +{"amount":0.3,"base":"#232629ff","color":"#ffffffff","out":{"hex":"#3e3e3fff","u16":[15863,16023,16183,65535]}}, +{"amount":0.4,"base":"#232629ff","color":"#ffffffff","out":{"hex":"#535454ff","u16":[21375,21528,21680,65535]}}, +{"amount":0.5,"base":"#232629ff","color":"#ffffffff","out":{"hex":"#6c6d6eff","u16":[27853,28044,28235,65535]}}, +{"amount":0.7,"base":"#232629ff","color":"#ffffffff","out":{"hex":"#a6a8a9ff","u16":[42789,43117,43442,65535]}}, +{"amount":1,"base":"#232629ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"base":"#232629ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"base":"#232629ff","color":"#7f7f7fff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"base":"#232629ff","color":"#7f7f7fff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.1,"base":"#232629ff","color":"#7f7f7fff","out":{"hex":"#252628ff","u16":[9456,9810,10165,65535]}}, +{"amount":0.2,"base":"#232629ff","color":"#7f7f7fff","out":{"hex":"#28292aff","u16":[10205,10452,10700,65535]}}, +{"amount":0.3,"base":"#232629ff","color":"#7f7f7fff","out":{"hex":"#2e2f2fff","u16":[11807,12005,12204,65535]}}, +{"amount":0.4,"base":"#232629ff","color":"#7f7f7fff","out":{"hex":"#383839ff","u16":[14315,14483,14652,65535]}}, +{"amount":0.5,"base":"#232629ff","color":"#7f7f7fff","out":{"hex":"#444546ff","u16":[17578,17720,17862,65535]}}, +{"amount":0.7,"base":"#232629ff","color":"#7f7f7fff","out":{"hex":"#646465ff","u16":[25704,25775,25847,65535]}}, +{"amount":1,"base":"#232629ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1.5,"base":"#232629ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":-0.5,"base":"#232629ff","color":"#808080ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"base":"#232629ff","color":"#808080ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.1,"base":"#232629ff","color":"#808080ff","out":{"hex":"#252628ff","u16":[9459,9811,10164,65535]}}, +{"amount":0.2,"base":"#232629ff","color":"#808080ff","out":{"hex":"#28292aff","u16":[10206,10454,10701,65535]}}, +{"amount":0.3,"base":"#232629ff","color":"#808080ff","out":{"hex":"#2e2f30ff","u16":[11828,12027,12225,65535]}}, +{"amount":0.4,"base":"#232629ff","color":"#808080ff","out":{"hex":"#383939ff","u16":[14355,14524,14693,65535]}}, +{"amount":0.5,"base":"#232629ff","color":"#808080ff","out":{"hex":"#454546ff","u16":[17644,17786,17928,65535]}}, +{"amount":0.7,"base":"#232629ff","color":"#808080ff","out":{"hex":"#646565ff","u16":[25825,25897,25969,65535]}}, +{"amount":1,"base":"#232629ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1.5,"base":"#232629ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":-0.5,"base":"#232629ff","color":"#ff0000ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"base":"#232629ff","color":"#ff0000ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.1,"base":"#232629ff","color":"#ff0000ff","out":{"hex":"#471314ff","u16":[18152,4803,5181,65535]}}, +{"amount":0.2,"base":"#232629ff","color":"#ff0000ff","out":{"hex":"#500d0eff","u16":[20444,3247,3504,65535]}}, +{"amount":0.3,"base":"#232629ff","color":"#ff0000ff","out":{"hex":"#5d0a0bff","u16":[23886,2529,2729,65535]}}, +{"amount":0.4,"base":"#232629ff","color":"#ff0000ff","out":{"hex":"#710809ff","u16":[29005,2100,2266,65535]}}, +{"amount":0.5,"base":"#232629ff","color":"#ff0000ff","out":{"hex":"#8b0707ff","u16":[35598,1730,1866,65535]}}, +{"amount":0.7,"base":"#232629ff","color":"#ff0000ff","out":{"hex":"#ca0304ff","u16":[51869,846,913,65535]}}, +{"amount":1,"base":"#232629ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":1.5,"base":"#232629ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":-0.5,"base":"#232629ff","color":"#00ff00ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"base":"#232629ff","color":"#00ff00ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.1,"base":"#232629ff","color":"#00ff00ff","out":{"hex":"#0c2c0eff","u16":[3074,11415,3601,65535]}}, +{"amount":0.2,"base":"#232629ff","color":"#00ff00ff","out":{"hex":"#09340aff","u16":[2206,13272,2584,65535]}}, +{"amount":0.3,"base":"#232629ff","color":"#00ff00ff","out":{"hex":"#084309ff","u16":[1945,17092,2279,65535]}}, +{"amount":0.4,"base":"#232629ff","color":"#00ff00ff","out":{"hex":"#075708ff","u16":[1812,22470,2123,65535]}}, +{"amount":0.5,"base":"#232629ff","color":"#00ff00ff","out":{"hex":"#067108ff","u16":[1653,28945,1936,65535]}}, +{"amount":0.7,"base":"#232629ff","color":"#00ff00ff","out":{"hex":"#04ac05ff","u16":[1107,44123,1297,65535]}}, +{"amount":1,"base":"#232629ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":1.5,"base":"#232629ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":-0.5,"base":"#232629ff","color":"#0000ffff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"base":"#232629ff","color":"#0000ffff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.1,"base":"#232629ff","color":"#0000ffff","out":{"hex":"#13156eff","u16":[4932,5355,28336,65535]}}, +{"amount":0.2,"base":"#232629ff","color":"#0000ffff","out":{"hex":"#0d0e7cff","u16":[3333,3619,31903,65535]}}, +{"amount":0.3,"base":"#232629ff","color":"#0000ffff","out":{"hex":"#090a8cff","u16":[2380,2584,35862,65535]}}, +{"amount":0.4,"base":"#232629ff","color":"#0000ffff","out":{"hex":"#0707a2ff","u16":[1708,1854,41530,65535]}}, +{"amount":0.5,"base":"#232629ff","color":"#0000ffff","out":{"hex":"#0405bfff","u16":[1117,1212,49007,65535]}}, +{"amount":0.7,"base":"#232629ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[1,1,65525,65535]}}, +{"amount":1,"base":"#232629ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":1.5,"base":"#232629ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":-0.5,"base":"#232629ff","color":"#ffff00ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"base":"#232629ff","color":"#ffff00ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.1,"base":"#232629ff","color":"#ffff00ff","out":{"hex":"#27280dff","u16":[10096,10337,3300,65535]}}, +{"amount":0.2,"base":"#232629ff","color":"#ffff00ff","out":{"hex":"#2f3009ff","u16":[12099,12275,2420,65535]}}, +{"amount":0.3,"base":"#232629ff","color":"#ffff00ff","out":{"hex":"#3f3f09ff","u16":[16098,16259,2200,65535]}}, +{"amount":0.4,"base":"#232629ff","color":"#ffff00ff","out":{"hex":"#545508ff","u16":[21580,21733,2091,65535]}}, +{"amount":0.5,"base":"#232629ff","color":"#ffff00ff","out":{"hex":"#6d6e08ff","u16":[28086,28228,1932,65535]}}, +{"amount":0.7,"base":"#232629ff","color":"#ffff00ff","out":{"hex":"#a8a805ff","u16":[43197,43294,1330,65535]}}, +{"amount":1,"base":"#232629ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1.5,"base":"#232629ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":-0.5,"base":"#232629ff","color":"#030201ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"base":"#232629ff","color":"#030201ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.1,"base":"#232629ff","color":"#030201ff","out":{"hex":"#232628ff","u16":[9068,9707,10347,65535]}}, +{"amount":0.2,"base":"#232629ff","color":"#030201ff","out":{"hex":"#232426ff","u16":[8912,9374,9836,65535]}}, +{"amount":0.3,"base":"#232629ff","color":"#030201ff","out":{"hex":"#202122ff","u16":[8315,8478,8644,65535]}}, +{"amount":0.4,"base":"#232629ff","color":"#030201ff","out":{"hex":"#1b1a18ff","u16":[6954,6607,6264,65535]}}, +{"amount":0.5,"base":"#232629ff","color":"#030201ff","out":{"hex":"#090704ff","u16":[2404,1679,954,65535]}}, +{"amount":0.7,"base":"#232629ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[814,543,272,65535]}}, +{"amount":1,"base":"#232629ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1.5,"base":"#232629ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":-0.5,"base":"#232629ff","color":"#3daee9ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"base":"#232629ff","color":"#3daee9ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.1,"base":"#232629ff","color":"#3daee9ff","out":{"hex":"#172832ff","u16":[5870,10334,12814,65535]}}, +{"amount":0.2,"base":"#232629ff","color":"#3daee9ff","out":{"hex":"#162c39ff","u16":[5576,11384,14522,65535]}}, +{"amount":0.3,"base":"#232629ff","color":"#3daee9ff","out":{"hex":"#183545ff","u16":[6128,13710,17756,65535]}}, +{"amount":0.4,"base":"#232629ff","color":"#3daee9ff","out":{"hex":"#1c4358ff","u16":[7211,17219,22521,65535]}}, +{"amount":0.5,"base":"#232629ff","color":"#3daee9ff","out":{"hex":"#22546fff","u16":[8613,21622,28482,65535]}}, +{"amount":0.7,"base":"#232629ff","color":"#3daee9ff","out":{"hex":"#2e7da7ff","u16":[11924,32224,42865,65535]}}, +{"amount":1,"base":"#232629ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":1.5,"base":"#232629ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":-0.5,"base":"#232629ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"base":"#232629ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.1,"base":"#232629ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.2,"base":"#232629ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.3,"base":"#232629ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.4,"base":"#232629ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.5,"base":"#232629ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.7,"base":"#232629ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":1,"base":"#232629ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":1.5,"base":"#232629ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":-0.5,"base":"#232629ff","color":"#eff0f1ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"base":"#232629ff","color":"#eff0f1ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.1,"base":"#232629ff","color":"#eff0f1ff","out":{"hex":"#262728ff","u16":[9724,9997,10269,65535]}}, +{"amount":0.2,"base":"#232629ff","color":"#eff0f1ff","out":{"hex":"#2d2e2fff","u16":[11549,11768,11987,65535]}}, +{"amount":0.3,"base":"#232629ff","color":"#eff0f1ff","out":{"hex":"#3b3c3dff","u16":[15233,15451,15669,65535]}}, +{"amount":0.4,"base":"#232629ff","color":"#eff0f1ff","out":{"hex":"#4f5051ff","u16":[20373,20604,20836,65535]}}, +{"amount":0.5,"base":"#232629ff","color":"#eff0f1ff","out":{"hex":"#676869ff","u16":[26456,26720,26985,65535]}}, +{"amount":0.7,"base":"#232629ff","color":"#eff0f1ff","out":{"hex":"#9d9fa2ff","u16":[40360,40959,41551,65535]}}, +{"amount":1,"base":"#232629ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":1.5,"base":"#232629ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":-0.5,"base":"#232629ff","color":"#fcfcfcff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"base":"#232629ff","color":"#fcfcfcff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.1,"base":"#232629ff","color":"#fcfcfcff","out":{"hex":"#262728ff","u16":[9783,10019,10255,65535]}}, +{"amount":0.2,"base":"#232629ff","color":"#fcfcfcff","out":{"hex":"#2e2e2fff","u16":[11772,11946,12121,65535]}}, +{"amount":0.3,"base":"#232629ff","color":"#fcfcfcff","out":{"hex":"#3d3e3fff","u16":[15747,15907,16067,65535]}}, +{"amount":0.4,"base":"#232629ff","color":"#fcfcfcff","out":{"hex":"#525354ff","u16":[21177,21330,21482,65535]}}, +{"amount":0.5,"base":"#232629ff","color":"#fcfcfcff","out":{"hex":"#6b6c6dff","u16":[27604,27786,27967,65535]}}, +{"amount":0.7,"base":"#232629ff","color":"#fcfcfcff","out":{"hex":"#a5a6a7ff","u16":[42382,42681,42977,65535]}}, +{"amount":1,"base":"#232629ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1.5,"base":"#232629ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":-0.5,"base":"#232629ff","color":"#da4453ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"base":"#232629ff","color":"#da4453ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.1,"base":"#232629ff","color":"#da4453ff","out":{"hex":"#381e23ff","u16":[14418,7822,8887,65535]}}, +{"amount":0.2,"base":"#232629ff","color":"#da4453ff","out":{"hex":"#411d22ff","u16":[16628,7498,8692,65535]}}, +{"amount":0.3,"base":"#232629ff","color":"#da4453ff","out":{"hex":"#4d1f25ff","u16":[19784,7994,9395,65535]}}, +{"amount":0.4,"base":"#232629ff","color":"#da4453ff","out":{"hex":"#5f232aff","u16":[24334,9112,10820,65535]}}, +{"amount":0.5,"base":"#232629ff","color":"#da4453ff","out":{"hex":"#752932ff","u16":[30159,10663,12765,65535]}}, +{"amount":0.7,"base":"#232629ff","color":"#da4453ff","out":{"hex":"#ae3945ff","u16":[44654,14525,17610,65535]}}, +{"amount":1,"base":"#232629ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":1.5,"base":"#232629ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":-0.5,"base":"#232629ff","color":"#e8cb2dff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"base":"#232629ff","color":"#e8cb2dff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.1,"base":"#232629ff","color":"#e8cb2dff","out":{"hex":"#292714ff","u16":[10648,9987,5172,65535]}}, +{"amount":0.2,"base":"#232629ff","color":"#e8cb2dff","out":{"hex":"#302c12ff","u16":[12363,11298,4629,65535]}}, +{"amount":0.3,"base":"#232629ff","color":"#e8cb2dff","out":{"hex":"#3d3713ff","u16":[15782,14228,5002,65535]}}, +{"amount":0.4,"base":"#232629ff","color":"#e8cb2dff","out":{"hex":"#504817ff","u16":[20628,18436,5793,65535]}}, +{"amount":0.5,"base":"#232629ff","color":"#e8cb2dff","out":{"hex":"#675c1aff","u16":[26563,23592,6776,65535]}}, +{"amount":0.7,"base":"#232629ff","color":"#e8cb2dff","out":{"hex":"#9e8b23ff","u16":[40525,35691,8930,65535]}}, +{"amount":1,"base":"#232629ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":1.5,"base":"#232629ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":-0.5,"base":"#232629ff","color":"#3daee980","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"base":"#232629ff","color":"#3daee980","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.1,"base":"#232629ff","color":"#3daee980","out":{"hex":"#192830d8","u16":[6531,10275,12424,55627]}}, +{"amount":0.2,"base":"#232629ff","color":"#3daee980","out":{"hex":"#182c37c5","u16":[6166,11352,14205,50503]}}, +{"amount":0.3,"base":"#232629ff","color":"#3daee980","out":{"hex":"#1a3544b6","u16":[6673,13679,17461,46651]}}, +{"amount":0.4,"base":"#232629ff","color":"#3daee980","out":{"hex":"#1e4357a9","u16":[7726,17199,22257,43492]}}, +{"amount":0.5,"base":"#232629ff","color":"#3daee980","out":{"hex":"#23546e9f","u16":[9080,21597,28232,40820]}}, +{"amount":0.7,"base":"#232629ff","color":"#3daee980","out":{"hex":"#307da68e","u16":[12221,32222,42726,36438]}}, +{"amount":1,"base":"#232629ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":1.5,"base":"#232629ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":-0.5,"base":"#232629ff","color":"#ffffff00","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0,"base":"#232629ff","color":"#ffffff00","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":0.1,"base":"#232629ff","color":"#ffffff00","out":{"hex":"#23262900","u16":[8995,9766,10537,5]}}, +{"amount":0.2,"base":"#232629ff","color":"#ffffff00","out":{"hex":"#23262900","u16":[8995,9766,10537,5]}}, +{"amount":0.3,"base":"#232629ff","color":"#ffffff00","out":{"hex":"#23262900","u16":[8995,9766,10537,5]}}, +{"amount":0.4,"base":"#232629ff","color":"#ffffff00","out":{"hex":"#23262900","u16":[8995,9766,10537,5]}}, +{"amount":0.5,"base":"#232629ff","color":"#ffffff00","out":{"hex":"#23262900","u16":[8995,9766,10537,5]}}, +{"amount":0.7,"base":"#232629ff","color":"#ffffff00","out":{"hex":"#23262900","u16":[8995,9766,10537,5]}}, +{"amount":1,"base":"#232629ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"base":"#232629ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"base":"#eff0f1ff","color":"#000000ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"base":"#eff0f1ff","color":"#000000ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.1,"base":"#eff0f1ff","color":"#000000ff","out":{"hex":"#eeeeeeff","u16":[61047,61079,61111,65535]}}, +{"amount":0.2,"base":"#eff0f1ff","color":"#000000ff","out":{"hex":"#dfe0e0ff","u16":[57430,57490,57550,65535]}}, +{"amount":0.3,"base":"#eff0f1ff","color":"#000000ff","out":{"hex":"#c3c3c4ff","u16":[50063,50186,50312,65535]}}, +{"amount":0.4,"base":"#eff0f1ff","color":"#000000ff","out":{"hex":"#a0a1a1ff","u16":[41112,41284,41456,65535]}}, +{"amount":0.5,"base":"#eff0f1ff","color":"#000000ff","out":{"hex":"#7f8080ff","u16":[32730,32867,33004,65535]}}, +{"amount":0.7,"base":"#eff0f1ff","color":"#000000ff","out":{"hex":"#4c4c4dff","u16":[19556,19633,19710,65535]}}, +{"amount":1,"base":"#eff0f1ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"base":"#eff0f1ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"base":"#eff0f1ff","color":"#ffffffff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"base":"#eff0f1ff","color":"#ffffffff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.1,"base":"#eff0f1ff","color":"#ffffffff","out":{"hex":"#eff0f1ff","u16":[61487,61744,62000,65535]}}, +{"amount":0.2,"base":"#eff0f1ff","color":"#ffffffff","out":{"hex":"#f1f2f3ff","u16":[61951,62181,62408,65535]}}, +{"amount":0.3,"base":"#eff0f1ff","color":"#ffffffff","out":{"hex":"#f6f6f7ff","u16":[63196,63345,63493,65535]}}, +{"amount":0.4,"base":"#eff0f1ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65534,65534,65534,65535]}}, +{"amount":0.5,"base":"#eff0f1ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65534,65534,65534,65535]}}, +{"amount":0.7,"base":"#eff0f1ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65534,65534,65534,65535]}}, +{"amount":1,"base":"#eff0f1ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"base":"#eff0f1ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"base":"#eff0f1ff","color":"#7f7f7fff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"base":"#eff0f1ff","color":"#7f7f7fff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.1,"base":"#eff0f1ff","color":"#7f7f7fff","out":{"hex":"#efeff0ff","u16":[61466,61520,61573,65535]}}, +{"amount":0.2,"base":"#eff0f1ff","color":"#7f7f7fff","out":{"hex":"#ecececff","u16":[60582,60614,60646,65535]}}, +{"amount":0.3,"base":"#eff0f1ff","color":"#7f7f7fff","out":{"hex":"#e3e3e3ff","u16":[58320,58349,58377,65535]}}, +{"amount":0.4,"base":"#eff0f1ff","color":"#7f7f7fff","out":{"hex":"#d4d4d4ff","u16":[54528,54562,54595,65535]}}, +{"amount":0.5,"base":"#eff0f1ff","color":"#7f7f7fff","out":{"hex":"#c1c1c1ff","u16":[49592,49628,49662,65535]}}, +{"amount":0.7,"base":"#eff0f1ff","color":"#7f7f7fff","out":{"hex":"#979797ff","u16":[38728,38739,38752,65535]}}, +{"amount":1,"base":"#eff0f1ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1.5,"base":"#eff0f1ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":-0.5,"base":"#eff0f1ff","color":"#808080ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"base":"#eff0f1ff","color":"#808080ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.1,"base":"#eff0f1ff","color":"#808080ff","out":{"hex":"#efeff0ff","u16":[61467,61521,61575,65535]}}, +{"amount":0.2,"base":"#eff0f1ff","color":"#808080ff","out":{"hex":"#ecececff","u16":[60590,60622,60654,65535]}}, +{"amount":0.3,"base":"#eff0f1ff","color":"#808080ff","out":{"hex":"#e3e3e3ff","u16":[58354,58382,58410,65535]}}, +{"amount":0.4,"base":"#eff0f1ff","color":"#808080ff","out":{"hex":"#d4d5d5ff","u16":[54603,54636,54669,65535]}}, +{"amount":0.5,"base":"#eff0f1ff","color":"#808080ff","out":{"hex":"#c1c1c2ff","u16":[49694,49729,49763,65535]}}, +{"amount":0.7,"base":"#eff0f1ff","color":"#808080ff","out":{"hex":"#979797ff","u16":[38849,38860,38872,65535]}}, +{"amount":1,"base":"#eff0f1ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1.5,"base":"#eff0f1ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":-0.5,"base":"#eff0f1ff","color":"#ff0000ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"base":"#eff0f1ff","color":"#ff0000ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.1,"base":"#eff0f1ff","color":"#ff0000ff","out":{"hex":"#fcececff","u16":[64703,60610,60647,65535]}}, +{"amount":0.2,"base":"#eff0f1ff","color":"#ff0000ff","out":{"hex":"#fde7e7ff","u16":[64953,59358,59377,65535]}}, +{"amount":0.3,"base":"#eff0f1ff","color":"#ff0000ff","out":{"hex":"#fddbdbff","u16":[65000,56345,56358,65535]}}, +{"amount":0.4,"base":"#eff0f1ff","color":"#ff0000ff","out":{"hex":"#fdc7c7ff","u16":[65024,51210,51219,65535]}}, +{"amount":0.5,"base":"#eff0f1ff","color":"#ff0000ff","out":{"hex":"#fdacacff","u16":[65095,44188,44193,65535]}}, +{"amount":0.7,"base":"#eff0f1ff","color":"#ff0000ff","out":{"hex":"#ff6464ff","u16":[65428,25719,25720,65535]}}, +{"amount":1,"base":"#eff0f1ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":1.5,"base":"#eff0f1ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":-0.5,"base":"#eff0f1ff","color":"#00ff00ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"base":"#eff0f1ff","color":"#00ff00ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.1,"base":"#eff0f1ff","color":"#00ff00ff","out":{"hex":"#d4f9d5ff","u16":[54604,64093,54749,65535]}}, +{"amount":0.2,"base":"#eff0f1ff","color":"#00ff00ff","out":{"hex":"#c7fbc7ff","u16":[51201,64577,51270,65535]}}, +{"amount":0.3,"base":"#eff0f1ff","color":"#00ff00ff","out":{"hex":"#abfdabff","u16":[43853,65080,43887,65535]}}, +{"amount":0.4,"base":"#eff0f1ff","color":"#00ff00ff","out":{"hex":"#6fff6fff","u16":[28614,65470,28622,65535]}}, +{"amount":0.5,"base":"#eff0f1ff","color":"#00ff00ff","out":{"hex":"#04ff04ff","u16":[1146,65535,1146,65535]}}, +{"amount":0.7,"base":"#eff0f1ff","color":"#00ff00ff","out":{"hex":"#04ff04ff","u16":[1146,65535,1146,65535]}}, +{"amount":1,"base":"#eff0f1ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":1.5,"base":"#eff0f1ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":-0.5,"base":"#eff0f1ff","color":"#0000ffff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"base":"#eff0f1ff","color":"#0000ffff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.1,"base":"#eff0f1ff","color":"#0000ffff","out":{"hex":"#eeeefdff","u16":[61085,61114,64946,65535]}}, +{"amount":0.2,"base":"#eff0f1ff","color":"#0000ffff","out":{"hex":"#e7e7fdff","u16":[59250,59265,65091,65535]}}, +{"amount":0.3,"base":"#eff0f1ff","color":"#0000ffff","out":{"hex":"#d6d6fdff","u16":[54923,54933,65096,65535]}}, +{"amount":0.4,"base":"#eff0f1ff","color":"#0000ffff","out":{"hex":"#bcbcfdff","u16":[48378,48384,65124,65535]}}, +{"amount":0.5,"base":"#eff0f1ff","color":"#0000ffff","out":{"hex":"#9e9efeff","u16":[40685,40689,65202,65535]}}, +{"amount":0.7,"base":"#eff0f1ff","color":"#0000ffff","out":{"hex":"#6262feff","u16":[25158,25158,65395,65535]}}, +{"amount":1,"base":"#eff0f1ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":1.5,"base":"#eff0f1ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":-0.5,"base":"#eff0f1ff","color":"#ffff00ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"base":"#eff0f1ff","color":"#ffff00ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.1,"base":"#eff0f1ff","color":"#ffff00ff","out":{"hex":"#f7f767ff","u16":[63434,63544,26390,65535]}}, +{"amount":0.2,"base":"#eff0f1ff","color":"#ffff00ff","out":{"hex":"#fafa2fff","u16":[64185,64236,12132,65535]}}, +{"amount":0.3,"base":"#eff0f1ff","color":"#ffff00ff","out":{"hex":"#ffff02ff","u16":[65455,65457,508,65535]}}, +{"amount":0.4,"base":"#eff0f1ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.5,"base":"#eff0f1ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":0.7,"base":"#eff0f1ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1,"base":"#eff0f1ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1.5,"base":"#eff0f1ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":-0.5,"base":"#eff0f1ff","color":"#030201ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"base":"#eff0f1ff","color":"#030201ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.1,"base":"#eff0f1ff","color":"#030201ff","out":{"hex":"#eeeeeeff","u16":[61066,61081,61095,65535]}}, +{"amount":0.2,"base":"#eff0f1ff","color":"#030201ff","out":{"hex":"#e0e0dfff","u16":[57524,57481,57437,65535]}}, +{"amount":0.3,"base":"#eff0f1ff","color":"#030201ff","out":{"hex":"#c5c3c1ff","u16":[50520,50114,49705,65535]}}, +{"amount":0.4,"base":"#eff0f1ff","color":"#030201ff","out":{"hex":"#a3a09dff","u16":[41952,41144,40335,65535]}}, +{"amount":0.5,"base":"#eff0f1ff","color":"#030201ff","out":{"hex":"#847f7aff","u16":[33951,32674,31396,65535]}}, +{"amount":0.7,"base":"#eff0f1ff","color":"#030201ff","out":{"hex":"#544b42ff","u16":[21547,19227,16897,65535]}}, +{"amount":1,"base":"#eff0f1ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1.5,"base":"#eff0f1ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":-0.5,"base":"#eff0f1ff","color":"#3daee9ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"base":"#eff0f1ff","color":"#3daee9ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.1,"base":"#eff0f1ff","color":"#3daee9ff","out":{"hex":"#e6f1f8ff","u16":[59023,62048,63819,65535]}}, +{"amount":0.2,"base":"#eff0f1ff","color":"#3daee9ff","out":{"hex":"#e1eff9ff","u16":[57724,61512,63907,65535]}}, +{"amount":0.3,"base":"#eff0f1ff","color":"#3daee9ff","out":{"hex":"#d5eaf7ff","u16":[54852,60051,63563,65535]}}, +{"amount":0.4,"base":"#eff0f1ff","color":"#3daee9ff","out":{"hex":"#c2e0f5ff","u16":[49797,57489,62894,65535]}}, +{"amount":0.5,"base":"#eff0f1ff","color":"#3daee9ff","out":{"hex":"#a0d3f5ff","u16":[41247,54108,62918,65535]}}, +{"amount":0.7,"base":"#eff0f1ff","color":"#3daee9ff","out":{"hex":"#3fb1edff","u16":[16319,45586,60867,65535]}}, +{"amount":1,"base":"#eff0f1ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":1.5,"base":"#eff0f1ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":-0.5,"base":"#eff0f1ff","color":"#232629ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"base":"#eff0f1ff","color":"#232629ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.1,"base":"#eff0f1ff","color":"#232629ff","out":{"hex":"#eeeeeeff","u16":[61136,61211,61285,65535]}}, +{"amount":0.2,"base":"#eff0f1ff","color":"#232629ff","out":{"hex":"#e2e3e4ff","u16":[58129,58343,58562,65535]}}, +{"amount":0.3,"base":"#eff0f1ff","color":"#232629ff","out":{"hex":"#c9cbceff","u16":[51549,52217,52896,65535]}}, +{"amount":0.4,"base":"#eff0f1ff","color":"#232629ff","out":{"hex":"#a6acb3ff","u16":[42605,44294,45983,65535]}}, +{"amount":0.5,"base":"#eff0f1ff","color":"#232629ff","out":{"hex":"#868d94ff","u16":[34448,36249,38048,65535]}}, +{"amount":0.7,"base":"#eff0f1ff","color":"#232629ff","out":{"hex":"#545a60ff","u16":[21498,23048,24598,65535]}}, +{"amount":1,"base":"#eff0f1ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":1.5,"base":"#eff0f1ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":-0.5,"base":"#eff0f1ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"base":"#eff0f1ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.1,"base":"#eff0f1ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.2,"base":"#eff0f1ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.3,"base":"#eff0f1ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.4,"base":"#eff0f1ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.5,"base":"#eff0f1ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.7,"base":"#eff0f1ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":1,"base":"#eff0f1ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":1.5,"base":"#eff0f1ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":-0.5,"base":"#eff0f1ff","color":"#fcfcfcff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"base":"#eff0f1ff","color":"#fcfcfcff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.1,"base":"#eff0f1ff","color":"#fcfcfcff","out":{"hex":"#eff0f1ff","u16":[61513,61738,61964,65535]}}, +{"amount":0.2,"base":"#eff0f1ff","color":"#fcfcfcff","out":{"hex":"#f1f2f3ff","u16":[62000,62165,62332,65535]}}, +{"amount":0.3,"base":"#eff0f1ff","color":"#fcfcfcff","out":{"hex":"#f6f6f7ff","u16":[63245,63313,63379,65535]}}, +{"amount":0.4,"base":"#eff0f1ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64763,64763,64763,65535]}}, +{"amount":0.5,"base":"#eff0f1ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64763,64763,64763,65535]}}, +{"amount":0.7,"base":"#eff0f1ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64763,64763,64763,65535]}}, +{"amount":1,"base":"#eff0f1ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1.5,"base":"#eff0f1ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":-0.5,"base":"#eff0f1ff","color":"#da4453ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"base":"#eff0f1ff","color":"#da4453ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.1,"base":"#eff0f1ff","color":"#da4453ff","out":{"hex":"#f8edeeff","u16":[63791,60841,61162,65535]}}, +{"amount":0.2,"base":"#eff0f1ff","color":"#da4453ff","out":{"hex":"#f8e8e9ff","u16":[63688,59634,60003,65535]}}, +{"amount":0.3,"base":"#eff0f1ff","color":"#da4453ff","out":{"hex":"#f5dddfff","u16":[62983,56715,57221,65535]}}, +{"amount":0.4,"base":"#eff0f1ff","color":"#da4453ff","out":{"hex":"#f0cacdff","u16":[61780,51842,52578,65535]}}, +{"amount":0.5,"base":"#eff0f1ff","color":"#da4453ff","out":{"hex":"#ebb1b5ff","u16":[60292,45382,46434,65535]}}, +{"amount":0.7,"base":"#eff0f1ff","color":"#da4453ff","out":{"hex":"#e2727bff","u16":[58169,29426,31641,65535]}}, +{"amount":1,"base":"#eff0f1ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":1.5,"base":"#eff0f1ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":-0.5,"base":"#eff0f1ff","color":"#e8cb2dff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"base":"#eff0f1ff","color":"#e8cb2dff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.1,"base":"#eff0f1ff","color":"#e8cb2dff","out":{"hex":"#f6f0d2ff","u16":[63236,61785,53919,65535]}}, +{"amount":0.2,"base":"#eff0f1ff","color":"#e8cb2dff","out":{"hex":"#f9efbcff","u16":[63938,61330,48429,65535]}}, +{"amount":0.3,"base":"#eff0f1ff","color":"#e8cb2dff","out":{"hex":"#faea99ff","u16":[64345,60053,39216,65535]}}, +{"amount":0.4,"base":"#eff0f1ff","color":"#e8cb2dff","out":{"hex":"#fae154ff","u16":[64287,57709,21665,65535]}}, +{"amount":0.5,"base":"#eff0f1ff","color":"#e8cb2dff","out":{"hex":"#efd339ff","u16":[61544,54282,14657,65535]}}, +{"amount":0.7,"base":"#eff0f1ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59627,52175,11570,65535]}}, +{"amount":1,"base":"#eff0f1ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":1.5,"base":"#eff0f1ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":-0.5,"base":"#eff0f1ff","color":"#3daee980","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"base":"#eff0f1ff","color":"#3daee980","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.1,"base":"#eff0f1ff","color":"#3daee980","out":{"hex":"#e7f1f7d6","u16":[59311,61997,63523,54983]}}, +{"amount":0.2,"base":"#eff0f1ff","color":"#3daee980","out":{"hex":"#e1eff8be","u16":[57824,61503,63688,48833]}}, +{"amount":0.3,"base":"#eff0f1ff","color":"#3daee980","out":{"hex":"#d5eaf7ab","u16":[54795,60086,63388,44008]}}, +{"amount":0.4,"base":"#eff0f1ff","color":"#3daee980","out":{"hex":"#c1e0f49c","u16":[49586,57567,62741,40138]}}, +{"amount":0.5,"base":"#eff0f1ff","color":"#3daee980","out":{"hex":"#a3d2f290","u16":[41803,54089,62099,37112]}}, +{"amount":0.7,"base":"#eff0f1ff","color":"#3daee980","out":{"hex":"#40b1ec81","u16":[16550,45578,60736,33130]}}, +{"amount":1,"base":"#eff0f1ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":1.5,"base":"#eff0f1ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":-0.5,"base":"#eff0f1ff","color":"#ffffff00","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0,"base":"#eff0f1ff","color":"#ffffff00","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":0.1,"base":"#eff0f1ff","color":"#ffffff00","out":{"hex":"#eff0f100","u16":[61423,61680,61937,5]}}, +{"amount":0.2,"base":"#eff0f1ff","color":"#ffffff00","out":{"hex":"#eff0f100","u16":[61423,61680,61937,5]}}, +{"amount":0.3,"base":"#eff0f1ff","color":"#ffffff00","out":{"hex":"#eff0f100","u16":[61423,61680,61937,5]}}, +{"amount":0.4,"base":"#eff0f1ff","color":"#ffffff00","out":{"hex":"#eff0f100","u16":[61423,61680,61937,5]}}, +{"amount":0.5,"base":"#eff0f1ff","color":"#ffffff00","out":{"hex":"#eff0f100","u16":[61423,61680,61937,5]}}, +{"amount":0.7,"base":"#eff0f1ff","color":"#ffffff00","out":{"hex":"#eff0f100","u16":[61423,61680,61937,5]}}, +{"amount":1,"base":"#eff0f1ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"base":"#eff0f1ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"base":"#fcfcfcff","color":"#000000ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"base":"#fcfcfcff","color":"#000000ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"base":"#fcfcfcff","color":"#000000ff","out":{"hex":"#f9f9f9ff","u16":[64110,64110,64110,65535]}}, +{"amount":0.2,"base":"#fcfcfcff","color":"#000000ff","out":{"hex":"#eaeaeaff","u16":[60017,60017,60017,65535]}}, +{"amount":0.3,"base":"#fcfcfcff","color":"#000000ff","out":{"hex":"#cacacaff","u16":[51891,51891,51891,65535]}}, +{"amount":0.4,"base":"#fcfcfcff","color":"#000000ff","out":{"hex":"#a4a4a4ff","u16":[42267,42267,42267,65535]}}, +{"amount":0.5,"base":"#fcfcfcff","color":"#000000ff","out":{"hex":"#828282ff","u16":[33456,33456,33456,65535]}}, +{"amount":0.7,"base":"#fcfcfcff","color":"#000000ff","out":{"hex":"#4d4d4dff","u16":[19856,19856,19856,65535]}}, +{"amount":1,"base":"#fcfcfcff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"base":"#fcfcfcff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"base":"#fcfcfcff","color":"#ffffffff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"base":"#fcfcfcff","color":"#ffffffff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"base":"#fcfcfcff","color":"#ffffffff","out":{"hex":"#fcfcfcff","u16":[64826,64826,64826,65535]}}, +{"amount":0.2,"base":"#fcfcfcff","color":"#ffffffff","out":{"hex":"#fefefeff","u16":[65263,65263,65263,65535]}}, +{"amount":0.3,"base":"#fcfcfcff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.4,"base":"#fcfcfcff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.5,"base":"#fcfcfcff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":0.7,"base":"#fcfcfcff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1,"base":"#fcfcfcff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"base":"#fcfcfcff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"base":"#fcfcfcff","color":"#7f7f7fff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"base":"#fcfcfcff","color":"#7f7f7fff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"base":"#fcfcfcff","color":"#7f7f7fff","out":{"hex":"#fbfbfbff","u16":[64613,64613,64613,65535]}}, +{"amount":0.2,"base":"#fcfcfcff","color":"#7f7f7fff","out":{"hex":"#f7f7f7ff","u16":[63594,63594,63594,65535]}}, +{"amount":0.3,"base":"#fcfcfcff","color":"#7f7f7fff","out":{"hex":"#eeeeeeff","u16":[61049,61049,61049,65535]}}, +{"amount":0.4,"base":"#fcfcfcff","color":"#7f7f7fff","out":{"hex":"#ddddddff","u16":[56853,56853,56853,65535]}}, +{"amount":0.5,"base":"#fcfcfcff","color":"#7f7f7fff","out":{"hex":"#c8c8c8ff","u16":[51458,51458,51458,65535]}}, +{"amount":0.7,"base":"#fcfcfcff","color":"#7f7f7fff","out":{"hex":"#9b9b9bff","u16":[39839,39839,39839,65535]}}, +{"amount":1,"base":"#fcfcfcff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1.5,"base":"#fcfcfcff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":-0.5,"base":"#fcfcfcff","color":"#808080ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"base":"#fcfcfcff","color":"#808080ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"base":"#fcfcfcff","color":"#808080ff","out":{"hex":"#fbfbfbff","u16":[64614,64614,64614,65535]}}, +{"amount":0.2,"base":"#fcfcfcff","color":"#808080ff","out":{"hex":"#f8f8f8ff","u16":[63610,63610,63610,65535]}}, +{"amount":0.3,"base":"#fcfcfcff","color":"#808080ff","out":{"hex":"#eeeeeeff","u16":[61083,61083,61083,65535]}}, +{"amount":0.4,"base":"#fcfcfcff","color":"#808080ff","out":{"hex":"#dededeff","u16":[56929,56929,56929,65535]}}, +{"amount":0.5,"base":"#fcfcfcff","color":"#808080ff","out":{"hex":"#c9c9c9ff","u16":[51559,51559,51559,65535]}}, +{"amount":0.7,"base":"#fcfcfcff","color":"#808080ff","out":{"hex":"#9c9c9cff","u16":[39969,39969,39969,65535]}}, +{"amount":1,"base":"#fcfcfcff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1.5,"base":"#fcfcfcff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":-0.5,"base":"#fcfcfcff","color":"#ff0000ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"base":"#fcfcfcff","color":"#ff0000ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"base":"#fcfcfcff","color":"#ff0000ff","out":{"hex":"#fffafaff","u16":[65493,64374,64374,65535]}}, +{"amount":0.2,"base":"#fcfcfcff","color":"#ff0000ff","out":{"hex":"#fff5f5ff","u16":[65488,63062,63062,65535]}}, +{"amount":0.3,"base":"#fcfcfcff","color":"#ff0000ff","out":{"hex":"#ffe8e8ff","u16":[65470,59752,59752,65535]}}, +{"amount":0.4,"base":"#fcfcfcff","color":"#ff0000ff","out":{"hex":"#ffd3d3ff","u16":[65458,54163,54163,65535]}}, +{"amount":0.5,"base":"#fcfcfcff","color":"#ff0000ff","out":{"hex":"#ffb6b6ff","u16":[65461,46676,46676,65535]}}, +{"amount":0.7,"base":"#fcfcfcff","color":"#ff0000ff","out":{"hex":"#ff6c6cff","u16":[65503,27837,27837,65535]}}, +{"amount":1,"base":"#fcfcfcff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":1.5,"base":"#fcfcfcff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":-0.5,"base":"#fcfcfcff","color":"#00ff00ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"base":"#fcfcfcff","color":"#00ff00ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"base":"#fcfcfcff","color":"#00ff00ff","out":{"hex":"#f4fff4ff","u16":[62751,65445,62751,65535]}}, +{"amount":0.2,"base":"#fcfcfcff","color":"#00ff00ff","out":{"hex":"#edffedff","u16":[60877,65459,60877,65535]}}, +{"amount":0.3,"base":"#fcfcfcff","color":"#00ff00ff","out":{"hex":"#d9ffd9ff","u16":[55842,65450,55842,65535]}}, +{"amount":0.4,"base":"#fcfcfcff","color":"#00ff00ff","out":{"hex":"#b1ffb1ff","u16":[45488,65458,45488,65535]}}, +{"amount":0.5,"base":"#fcfcfcff","color":"#00ff00ff","out":{"hex":"#58ff58ff","u16":[22645,65529,22645,65535]}}, +{"amount":0.7,"base":"#fcfcfcff","color":"#00ff00ff","out":{"hex":"#06ff06ff","u16":[1432,65535,1432,65535]}}, +{"amount":1,"base":"#fcfcfcff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":1.5,"base":"#fcfcfcff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":-0.5,"base":"#fcfcfcff","color":"#0000ffff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"base":"#fcfcfcff","color":"#0000ffff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"base":"#fcfcfcff","color":"#0000ffff","out":{"hex":"#fbfbffff","u16":[64392,64392,65499,65535]}}, +{"amount":0.2,"base":"#fcfcfcff","color":"#0000ffff","out":{"hex":"#f3f3ffff","u16":[62327,62327,65484,65535]}}, +{"amount":0.3,"base":"#fcfcfcff","color":"#0000ffff","out":{"hex":"#e0e0ffff","u16":[57477,57477,65463,65535]}}, +{"amount":0.4,"base":"#fcfcfcff","color":"#0000ffff","out":{"hex":"#c4c4ffff","u16":[50285,50285,65458,65535]}}, +{"amount":0.5,"base":"#fcfcfcff","color":"#0000ffff","out":{"hex":"#a4a4ffff","u16":[42054,42054,65470,65535]}}, +{"amount":0.7,"base":"#fcfcfcff","color":"#0000ffff","out":{"hex":"#6565ffff","u16":[25940,25940,65507,65535]}}, +{"amount":1,"base":"#fcfcfcff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":1.5,"base":"#fcfcfcff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":-0.5,"base":"#fcfcfcff","color":"#ffff00ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"base":"#fcfcfcff","color":"#ffff00ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"base":"#fcfcfcff","color":"#ffff00ff","out":{"hex":"#fefed9ff","u16":[65342,65342,55657,65535]}}, +{"amount":0.2,"base":"#fcfcfcff","color":"#ffff00ff","out":{"hex":"#ffffb1ff","u16":[65456,65456,45571,65535]}}, +{"amount":0.3,"base":"#fcfcfcff","color":"#ffff00ff","out":{"hex":"#ffff05ff","u16":[65535,65535,1224,65535]}}, +{"amount":0.4,"base":"#fcfcfcff","color":"#ffff00ff","out":{"hex":"#ffff05ff","u16":[65535,65535,1224,65535]}}, +{"amount":0.5,"base":"#fcfcfcff","color":"#ffff00ff","out":{"hex":"#ffff05ff","u16":[65535,65535,1224,65535]}}, +{"amount":0.7,"base":"#fcfcfcff","color":"#ffff00ff","out":{"hex":"#ffff05ff","u16":[65535,65535,1224,65535]}}, +{"amount":1,"base":"#fcfcfcff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1.5,"base":"#fcfcfcff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":-0.5,"base":"#fcfcfcff","color":"#030201ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"base":"#fcfcfcff","color":"#030201ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"base":"#fcfcfcff","color":"#030201ff","out":{"hex":"#faf9f9ff","u16":[64122,64113,64103,65535]}}, +{"amount":0.2,"base":"#fcfcfcff","color":"#030201ff","out":{"hex":"#eae9e9ff","u16":[60107,60009,59912,65535]}}, +{"amount":0.3,"base":"#fcfcfcff","color":"#030201ff","out":{"hex":"#cccac7ff","u16":[52378,51812,51247,65535]}}, +{"amount":0.4,"base":"#fcfcfcff","color":"#030201ff","out":{"hex":"#a8a4a0ff","u16":[43164,42140,41121,65535]}}, +{"amount":0.5,"base":"#fcfcfcff","color":"#030201ff","out":{"hex":"#87817cff","u16":[34716,33250,31778,65535]}}, +{"amount":0.7,"base":"#fcfcfcff","color":"#030201ff","out":{"hex":"#554c42ff","u16":[21967,19484,17012,65535]}}, +{"amount":1,"base":"#fcfcfcff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1.5,"base":"#fcfcfcff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":-0.5,"base":"#fcfcfcff","color":"#3daee9ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"base":"#fcfcfcff","color":"#3daee9ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"base":"#fcfcfcff","color":"#3daee9ff","out":{"hex":"#f9fcfeff","u16":[63976,64797,65280,65535]}}, +{"amount":0.2,"base":"#fcfcfcff","color":"#3daee9ff","out":{"hex":"#f4fafdff","u16":[62736,64174,65100,65535]}}, +{"amount":0.3,"base":"#fcfcfcff","color":"#3daee9ff","out":{"hex":"#e8f3fbff","u16":[59585,62560,64614,65535]}}, +{"amount":0.4,"base":"#fcfcfcff","color":"#3daee9ff","out":{"hex":"#d3e8f8ff","u16":[54143,59747,63786,65535]}}, +{"amount":0.5,"base":"#fcfcfcff","color":"#3daee9ff","out":{"hex":"#b2daf6ff","u16":[45839,55956,63190,65535]}}, +{"amount":0.7,"base":"#fcfcfcff","color":"#3daee9ff","out":{"hex":"#44b7f4ff","u16":[17398,47117,62635,65535]}}, +{"amount":1,"base":"#fcfcfcff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":1.5,"base":"#fcfcfcff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":-0.5,"base":"#fcfcfcff","color":"#232629ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"base":"#fcfcfcff","color":"#232629ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"base":"#fcfcfcff","color":"#232629ff","out":{"hex":"#fafafaff","u16":[64234,64248,64261,65535]}}, +{"amount":0.2,"base":"#fcfcfcff","color":"#232629ff","out":{"hex":"#ededeeff","u16":[60872,60977,61084,65535]}}, +{"amount":0.3,"base":"#fcfcfcff","color":"#232629ff","out":{"hex":"#d1d3d5ff","u16":[53619,54120,54630,65535]}}, +{"amount":0.4,"base":"#fcfcfcff","color":"#232629ff","out":{"hex":"#abb1b7ff","u16":[43982,45492,47006,65535]}}, +{"amount":0.5,"base":"#fcfcfcff","color":"#232629ff","out":{"hex":"#899097ff","u16":[35206,36999,38795,65535]}}, +{"amount":0.7,"base":"#fcfcfcff","color":"#232629ff","out":{"hex":"#555b61ff","u16":[21803,23368,24933,65535]}}, +{"amount":1,"base":"#fcfcfcff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":1.5,"base":"#fcfcfcff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":-0.5,"base":"#fcfcfcff","color":"#eff0f1ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"base":"#fcfcfcff","color":"#eff0f1ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"base":"#fcfcfcff","color":"#eff0f1ff","out":{"hex":"#fcfcfcff","u16":[64662,64705,64747,65535]}}, +{"amount":0.2,"base":"#fcfcfcff","color":"#eff0f1ff","out":{"hex":"#fafafaff","u16":[64183,64259,64335,65535]}}, +{"amount":0.3,"base":"#fcfcfcff","color":"#eff0f1ff","out":{"hex":"#f5f5f6ff","u16":[62936,63093,63249,65535]}}, +{"amount":0.4,"base":"#fcfcfcff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61424,61681,61938,65535]}}, +{"amount":0.5,"base":"#fcfcfcff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61424,61681,61938,65535]}}, +{"amount":0.7,"base":"#fcfcfcff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61424,61681,61938,65535]}}, +{"amount":1,"base":"#fcfcfcff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":1.5,"base":"#fcfcfcff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":-0.5,"base":"#fcfcfcff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"base":"#fcfcfcff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"base":"#fcfcfcff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.2,"base":"#fcfcfcff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.3,"base":"#fcfcfcff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.4,"base":"#fcfcfcff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.5,"base":"#fcfcfcff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.7,"base":"#fcfcfcff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1,"base":"#fcfcfcff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1.5,"base":"#fcfcfcff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":-0.5,"base":"#fcfcfcff","color":"#da4453ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"base":"#fcfcfcff","color":"#da4453ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"base":"#fcfcfcff","color":"#da4453ff","out":{"hex":"#fefbfbff","u16":[65254,64424,64499,65535]}}, +{"amount":0.2,"base":"#fcfcfcff","color":"#da4453ff","out":{"hex":"#fdf6f6ff","u16":[64930,63122,63271,65535]}}, +{"amount":0.3,"base":"#fcfcfcff","color":"#da4453ff","out":{"hex":"#f9e9eaff","u16":[64094,59877,60196,65535]}}, +{"amount":0.4,"base":"#fcfcfcff","color":"#da4453ff","out":{"hex":"#f4d4d6ff","u16":[62726,54533,55114,65535]}}, +{"amount":0.5,"base":"#fcfcfcff","color":"#da4453ff","out":{"hex":"#edb9bdff","u16":[61028,47569,48488,65535]}}, +{"amount":0.7,"base":"#fcfcfcff","color":"#da4453ff","out":{"hex":"#e37981ff","u16":[58290,31115,33136,65535]}}, +{"amount":1,"base":"#fcfcfcff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":1.5,"base":"#fcfcfcff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":-0.5,"base":"#fcfcfcff","color":"#e8cb2dff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"base":"#fcfcfcff","color":"#e8cb2dff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"base":"#fcfcfcff","color":"#e8cb2dff","out":{"hex":"#fdfcf5ff","u16":[65122,64733,62877,65535]}}, +{"amount":0.2,"base":"#fcfcfcff","color":"#e8cb2dff","out":{"hex":"#fdfaedff","u16":[64987,64210,60834,65535]}}, +{"amount":0.3,"base":"#fcfcfcff","color":"#e8cb2dff","out":{"hex":"#fcf5d4ff","u16":[64862,62846,54475,65535]}}, +{"amount":0.4,"base":"#fcfcfcff","color":"#e8cb2dff","out":{"hex":"#fceba0ff","u16":[64818,60365,40992,65535]}}, +{"amount":0.5,"base":"#fcfcfcff","color":"#e8cb2dff","out":{"hex":"#f9dd44ff","u16":[63945,56736,17454,65535]}}, +{"amount":0.7,"base":"#fcfcfcff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59628,52176,11570,65535]}}, +{"amount":1,"base":"#fcfcfcff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":1.5,"base":"#fcfcfcff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":-0.5,"base":"#fcfcfcff","color":"#3daee980","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"base":"#fcfcfcff","color":"#3daee980","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"base":"#fcfcfcff","color":"#3daee980","out":{"hex":"#f9fcfed6","u16":[63980,64797,65256,54983]}}, +{"amount":0.2,"base":"#fcfcfcff","color":"#3daee980","out":{"hex":"#f4fafdbe","u16":[62688,64187,65086,48902]}}, +{"amount":0.3,"base":"#fcfcfcff","color":"#3daee980","out":{"hex":"#e7f4fbac","u16":[59435,62603,64612,44096]}}, +{"amount":0.4,"base":"#fcfcfcff","color":"#3daee980","out":{"hex":"#d1e9f89d","u16":[53818,59830,63804,40276]}}, +{"amount":0.5,"base":"#fcfcfcff","color":"#3daee980","out":{"hex":"#b3daf491","u16":[45949,55989,62727,37312]}}, +{"amount":0.7,"base":"#fcfcfcff","color":"#3daee980","out":{"hex":"#46b7f282","u16":[17989,47102,62303,33459]}}, +{"amount":1,"base":"#fcfcfcff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":1.5,"base":"#fcfcfcff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":-0.5,"base":"#fcfcfcff","color":"#ffffff00","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0,"base":"#fcfcfcff","color":"#ffffff00","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":0.1,"base":"#fcfcfcff","color":"#ffffff00","out":{"hex":"#fcfcfc00","u16":[64764,64764,64764,5]}}, +{"amount":0.2,"base":"#fcfcfcff","color":"#ffffff00","out":{"hex":"#fcfcfc00","u16":[64764,64764,64764,5]}}, +{"amount":0.3,"base":"#fcfcfcff","color":"#ffffff00","out":{"hex":"#fcfcfc00","u16":[64764,64764,64764,5]}}, +{"amount":0.4,"base":"#fcfcfcff","color":"#ffffff00","out":{"hex":"#fcfcfc00","u16":[64764,64764,64764,5]}}, +{"amount":0.5,"base":"#fcfcfcff","color":"#ffffff00","out":{"hex":"#fcfcfc00","u16":[64764,64764,64764,5]}}, +{"amount":0.7,"base":"#fcfcfcff","color":"#ffffff00","out":{"hex":"#fcfcfc00","u16":[64764,64764,64764,5]}}, +{"amount":1,"base":"#fcfcfcff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"base":"#fcfcfcff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"base":"#da4453ff","color":"#000000ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"base":"#da4453ff","color":"#000000ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.1,"base":"#da4453ff","color":"#000000ff","out":{"hex":"#d94453ff","u16":[55837,17416,21259,65535]}}, +{"amount":0.2,"base":"#da4453ff","color":"#000000ff","out":{"hex":"#d44251ff","u16":[54554,17017,20771,65535]}}, +{"amount":0.3,"base":"#da4453ff","color":"#000000ff","out":{"hex":"#c83e4cff","u16":[51398,16032,19569,65535]}}, +{"amount":0.4,"base":"#da4453ff","color":"#000000ff","out":{"hex":"#b43844ff","u16":[46225,14418,17601,65535]}}, +{"amount":0.5,"base":"#da4453ff","color":"#000000ff","out":{"hex":"#9a303bff","u16":[39612,12356,15081,65535]}}, +{"amount":0.7,"base":"#da4453ff","color":"#000000ff","out":{"hex":"#5f1e24ff","u16":[24293,7583,9248,65535]}}, +{"amount":1,"base":"#da4453ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"base":"#da4453ff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"base":"#da4453ff","color":"#ffffffff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"base":"#da4453ff","color":"#ffffffff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.1,"base":"#da4453ff","color":"#ffffffff","out":{"hex":"#d6495bff","u16":[54982,18656,23404,65535]}}, +{"amount":0.2,"base":"#da4453ff","color":"#ffffffff","out":{"hex":"#dc485eff","u16":[56564,18495,24169,65535]}}, +{"amount":0.3,"base":"#da4453ff","color":"#ffffffff","out":{"hex":"#e45066ff","u16":[58545,20451,26308,65535]}}, +{"amount":0.4,"base":"#da4453ff","color":"#ffffffff","out":{"hex":"#e76678ff","u16":[59287,26105,30782,65535]}}, +{"amount":0.5,"base":"#da4453ff","color":"#ffffffff","out":{"hex":"#ea818fff","u16":[60209,33271,36714,65535]}}, +{"amount":0.7,"base":"#da4453ff","color":"#ffffffff","out":{"hex":"#f4c5caff","u16":[62792,50522,51857,65535]}}, +{"amount":1,"base":"#da4453ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"base":"#da4453ff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"base":"#da4453ff","color":"#7f7f7fff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"base":"#da4453ff","color":"#7f7f7fff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.1,"base":"#da4453ff","color":"#7f7f7fff","out":{"hex":"#ba5e67ff","u16":[47677,24181,26531,65535]}}, +{"amount":0.2,"base":"#da4453ff","color":"#7f7f7fff","out":{"hex":"#8c7578ff","u16":[35939,30139,30719,65535]}}, +{"amount":0.3,"base":"#da4453ff","color":"#7f7f7fff","out":{"hex":"#827c7dff","u16":[33485,31838,32003,65535]}}, +{"amount":0.4,"base":"#da4453ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32641,32638,32638,65535]}}, +{"amount":0.5,"base":"#da4453ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32641,32638,32638,65535]}}, +{"amount":0.7,"base":"#da4453ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32641,32638,32638,65535]}}, +{"amount":1,"base":"#da4453ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1.5,"base":"#da4453ff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":-0.5,"base":"#da4453ff","color":"#808080ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"base":"#da4453ff","color":"#808080ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.1,"base":"#da4453ff","color":"#808080ff","out":{"hex":"#996f73ff","u16":[39228,28548,29616,65535]}}, +{"amount":0.2,"base":"#da4453ff","color":"#808080ff","out":{"hex":"#8f7477ff","u16":[36735,29861,30549,65535]}}, +{"amount":0.3,"base":"#da4453ff","color":"#808080ff","out":{"hex":"#857b7cff","u16":[34153,31644,31894,65535]}}, +{"amount":0.4,"base":"#da4453ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32898,32895,32895,65535]}}, +{"amount":0.5,"base":"#da4453ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32898,32895,32895,65535]}}, +{"amount":0.7,"base":"#da4453ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32898,32895,32895,65535]}}, +{"amount":1,"base":"#da4453ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1.5,"base":"#da4453ff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":-0.5,"base":"#da4453ff","color":"#ff0000ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"base":"#da4453ff","color":"#ff0000ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.1,"base":"#da4453ff","color":"#ff0000ff","out":{"hex":"#f41216ff","u16":[62821,4724,5765,65535]}}, +{"amount":0.2,"base":"#da4453ff","color":"#ff0000ff","out":{"hex":"#f70b0dff","u16":[63603,2711,3310,65535]}}, +{"amount":0.3,"base":"#da4453ff","color":"#ff0000ff","out":{"hex":"#fd0202ff","u16":[65091,473,577,65535]}}, +{"amount":0.4,"base":"#da4453ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65533,1,2,65535]}}, +{"amount":0.5,"base":"#da4453ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65533,1,2,65535]}}, +{"amount":0.7,"base":"#da4453ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65533,1,2,65535]}}, +{"amount":1,"base":"#da4453ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":1.5,"base":"#da4453ff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":-0.5,"base":"#da4453ff","color":"#00ff00ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"base":"#da4453ff","color":"#00ff00ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.1,"base":"#da4453ff","color":"#00ff00ff","out":{"hex":"#857b33ff","u16":[34163,31626,13007,65535]}}, +{"amount":0.2,"base":"#da4453ff","color":"#00ff00ff","out":{"hex":"#618725ff","u16":[24808,34800,9446,65535]}}, +{"amount":0.3,"base":"#da4453ff","color":"#00ff00ff","out":{"hex":"#48921bff","u16":[18509,37492,7047,65535]}}, +{"amount":0.4,"base":"#da4453ff","color":"#00ff00ff","out":{"hex":"#369f15ff","u16":[13977,40869,5322,65535]}}, +{"amount":0.5,"base":"#da4453ff","color":"#00ff00ff","out":{"hex":"#28b00fff","u16":[10334,45359,3934,65535]}}, +{"amount":0.7,"base":"#da4453ff","color":"#00ff00ff","out":{"hex":"#0ee105ff","u16":[3640,57788,1386,65535]}}, +{"amount":1,"base":"#da4453ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":1.5,"base":"#da4453ff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":-0.5,"base":"#da4453ff","color":"#0000ffff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"base":"#da4453ff","color":"#0000ffff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.1,"base":"#da4453ff","color":"#0000ffff","out":{"hex":"#cf419fff","u16":[53252,16610,40764,65535]}}, +{"amount":0.2,"base":"#da4453ff","color":"#0000ffff","out":{"hex":"#bb3ae0ff","u16":[48116,15009,57553,65535]}}, +{"amount":0.3,"base":"#da4453ff","color":"#0000ffff","out":{"hex":"#8e4ff1ff","u16":[36446,20426,61949,65535]}}, +{"amount":0.4,"base":"#da4453ff","color":"#0000ffff","out":{"hex":"#6c50f8ff","u16":[27819,20592,63663,65535]}}, +{"amount":0.5,"base":"#da4453ff","color":"#0000ffff","out":{"hex":"#5146fcff","u16":[20728,17877,64875,65535]}}, +{"amount":0.7,"base":"#da4453ff","color":"#0000ffff","out":{"hex":"#0202ffff","u16":[527,527,65535,65535]}}, +{"amount":1,"base":"#da4453ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":1.5,"base":"#da4453ff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":-0.5,"base":"#da4453ff","color":"#ffff00ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"base":"#da4453ff","color":"#ffff00ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.1,"base":"#da4453ff","color":"#ffff00ff","out":{"hex":"#bc6132ff","u16":[48414,24986,12964,65535]}}, +{"amount":0.2,"base":"#da4453ff","color":"#ffff00ff","out":{"hex":"#b06d25ff","u16":[45153,28076,9449,65535]}}, +{"amount":0.3,"base":"#da4453ff","color":"#ffff00ff","out":{"hex":"#ac791cff","u16":[44171,31118,7223,65535]}}, +{"amount":0.4,"base":"#da4453ff","color":"#ffff00ff","out":{"hex":"#b08816ff","u16":[45215,34987,5660,65535]}}, +{"amount":0.5,"base":"#da4453ff","color":"#ffff00ff","out":{"hex":"#bb9c11ff","u16":[47969,40013,4402,65535]}}, +{"amount":0.7,"base":"#da4453ff","color":"#ffff00ff","out":{"hex":"#ded008ff","u16":[57126,53521,1995,65535]}}, +{"amount":1,"base":"#da4453ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1.5,"base":"#da4453ff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":-0.5,"base":"#da4453ff","color":"#030201ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"base":"#da4453ff","color":"#030201ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.1,"base":"#da4453ff","color":"#030201ff","out":{"hex":"#d94453ff","u16":[55773,17502,21221,65535]}}, +{"amount":0.2,"base":"#da4453ff","color":"#030201ff","out":{"hex":"#d44350ff","u16":[54416,17200,20687,65535]}}, +{"amount":0.3,"base":"#da4453ff","color":"#030201ff","out":{"hex":"#c7404cff","u16":[51148,16347,19421,65535]}}, +{"amount":0.4,"base":"#da4453ff","color":"#030201ff","out":{"hex":"#b23a44ff","u16":[45848,14913,17376,65535]}}, +{"amount":0.5,"base":"#da4453ff","color":"#030201ff","out":{"hex":"#983339ff","u16":[39030,13070,14739,65535]}}, +{"amount":0.7,"base":"#da4453ff","color":"#030201ff","out":{"hex":"#5a2321ff","u16":[23108,8909,8569,65535]}}, +{"amount":1,"base":"#da4453ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1.5,"base":"#da4453ff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":-0.5,"base":"#da4453ff","color":"#3daee9ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"base":"#da4453ff","color":"#3daee9ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.1,"base":"#da4453ff","color":"#3daee9ff","out":{"hex":"#946e8eff","u16":[38061,28217,36616,65535]}}, +{"amount":0.2,"base":"#da4453ff","color":"#3daee9ff","out":{"hex":"#7977a2ff","u16":[31159,30498,41744,65535]}}, +{"amount":0.3,"base":"#da4453ff","color":"#3daee9ff","out":{"hex":"#6680a9ff","u16":[26095,32867,43406,65535]}}, +{"amount":0.4,"base":"#da4453ff","color":"#3daee9ff","out":{"hex":"#578ab7ff","u16":[22248,35387,46977,65535]}}, +{"amount":0.5,"base":"#da4453ff","color":"#3daee9ff","out":{"hex":"#4b96c8ff","u16":[19260,38587,51433,65535]}}, +{"amount":0.7,"base":"#da4453ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15679,44714,59875,65535]}}, +{"amount":1,"base":"#da4453ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":1.5,"base":"#da4453ff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":-0.5,"base":"#da4453ff","color":"#232629ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"base":"#da4453ff","color":"#232629ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.1,"base":"#da4453ff","color":"#232629ff","out":{"hex":"#d24b5aff","u16":[53954,19319,23086,65535]}}, +{"amount":0.2,"base":"#da4453ff","color":"#232629ff","out":{"hex":"#c6505eff","u16":[50918,20678,24286,65535]}}, +{"amount":0.3,"base":"#da4453ff","color":"#232629ff","out":{"hex":"#b35461ff","u16":[45897,21547,24864,65535]}}, +{"amount":0.4,"base":"#da4453ff","color":"#232629ff","out":{"hex":"#98545fff","u16":[39005,21551,24441,65535]}}, +{"amount":0.5,"base":"#da4453ff","color":"#232629ff","out":{"hex":"#795059ff","u16":[31153,20455,22833,65535]}}, +{"amount":0.7,"base":"#da4453ff","color":"#232629ff","out":{"hex":"#413b41ff","u16":[16765,15240,16611,65535]}}, +{"amount":1,"base":"#da4453ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":1.5,"base":"#da4453ff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":-0.5,"base":"#da4453ff","color":"#eff0f1ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"base":"#da4453ff","color":"#eff0f1ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.1,"base":"#da4453ff","color":"#eff0f1ff","out":{"hex":"#d24c5dff","u16":[53993,19590,23979,65535]}}, +{"amount":0.2,"base":"#da4453ff","color":"#eff0f1ff","out":{"hex":"#d54e62ff","u16":[54693,20168,25161,65535]}}, +{"amount":0.3,"base":"#da4453ff","color":"#eff0f1ff","out":{"hex":"#da576bff","u16":[55904,22322,27443,65535]}}, +{"amount":0.4,"base":"#da4453ff","color":"#eff0f1ff","out":{"hex":"#d96b7cff","u16":[55775,27619,31760,65535]}}, +{"amount":0.5,"base":"#da4453ff","color":"#eff0f1ff","out":{"hex":"#d98591ff","u16":[55811,34261,37356,65535]}}, +{"amount":0.7,"base":"#da4453ff","color":"#eff0f1ff","out":{"hex":"#dfc3c8ff","u16":[57206,50160,51400,65535]}}, +{"amount":1,"base":"#da4453ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":1.5,"base":"#da4453ff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":-0.5,"base":"#da4453ff","color":"#fcfcfcff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"base":"#da4453ff","color":"#fcfcfcff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.1,"base":"#da4453ff","color":"#fcfcfcff","out":{"hex":"#d5495bff","u16":[54796,18838,23489,65535]}}, +{"amount":0.2,"base":"#da4453ff","color":"#fcfcfcff","out":{"hex":"#db495fff","u16":[56216,18831,24320,65535]}}, +{"amount":0.3,"base":"#da4453ff","color":"#fcfcfcff","out":{"hex":"#e25167ff","u16":[58036,20844,26465,65535]}}, +{"amount":0.4,"base":"#da4453ff","color":"#fcfcfcff","out":{"hex":"#e46778ff","u16":[58595,26446,30908,65535]}}, +{"amount":0.5,"base":"#da4453ff","color":"#fcfcfcff","out":{"hex":"#e7828fff","u16":[59314,33513,36765,65535]}}, +{"amount":0.7,"base":"#da4453ff","color":"#fcfcfcff","out":{"hex":"#efc5c9ff","u16":[61472,50531,51705,65535]}}, +{"amount":1,"base":"#da4453ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1.5,"base":"#da4453ff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":-0.5,"base":"#da4453ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"base":"#da4453ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.1,"base":"#da4453ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.2,"base":"#da4453ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.3,"base":"#da4453ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.4,"base":"#da4453ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.5,"base":"#da4453ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.7,"base":"#da4453ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":1,"base":"#da4453ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":1.5,"base":"#da4453ff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":-0.5,"base":"#da4453ff","color":"#e8cb2dff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"base":"#da4453ff","color":"#e8cb2dff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.1,"base":"#da4453ff","color":"#e8cb2dff","out":{"hex":"#c25c40ff","u16":[49982,23668,16351,65535]}}, +{"amount":0.2,"base":"#da4453ff","color":"#e8cb2dff","out":{"hex":"#b76737ff","u16":[47103,26521,14010,65535]}}, +{"amount":0.3,"base":"#da4453ff","color":"#e8cb2dff","out":{"hex":"#b37231ff","u16":[46002,29178,12596,65535]}}, +{"amount":0.4,"base":"#da4453ff","color":"#e8cb2dff","out":{"hex":"#b57e2eff","u16":[46555,32379,11802,65535]}}, +{"amount":0.5,"base":"#da4453ff","color":"#e8cb2dff","out":{"hex":"#bd8e2dff","u16":[48610,36461,11444,65535]}}, +{"amount":0.7,"base":"#da4453ff","color":"#e8cb2dff","out":{"hex":"#dbb92dff","u16":[56201,47497,11457,65535]}}, +{"amount":1,"base":"#da4453ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":1.5,"base":"#da4453ff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":-0.5,"base":"#da4453ff","color":"#3daee980","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"base":"#da4453ff","color":"#3daee980","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.1,"base":"#da4453ff","color":"#3daee980","out":{"hex":"#9f6a89bb","u16":[40747,27203,35132,48014]}}, +{"amount":0.2,"base":"#da4453ff","color":"#3daee980","out":{"hex":"#8a7299ac","u16":[35439,29407,39315,44199]}}, +{"amount":0.3,"base":"#da4453ff","color":"#3daee980","out":{"hex":"#727daa9f","u16":[29337,32034,43665,40930]}}, +{"amount":0.4,"base":"#da4453ff","color":"#3daee980","out":{"hex":"#6288b495","u16":[25302,34923,46222,38189]}}, +{"amount":0.5,"base":"#da4453ff","color":"#3daee980","out":{"hex":"#5395c78b","u16":[21267,38367,51051,35828]}}, +{"amount":0.7,"base":"#da4453ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15682,44712,59872,32898]}}, +{"amount":1,"base":"#da4453ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":1.5,"base":"#da4453ff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":-0.5,"base":"#da4453ff","color":"#ffffff00","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0,"base":"#da4453ff","color":"#ffffff00","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":0.1,"base":"#da4453ff","color":"#ffffff00","out":{"hex":"#da445300","u16":[56026,17476,21331,5]}}, +{"amount":0.2,"base":"#da4453ff","color":"#ffffff00","out":{"hex":"#da445300","u16":[56026,17476,21331,5]}}, +{"amount":0.3,"base":"#da4453ff","color":"#ffffff00","out":{"hex":"#da445300","u16":[56026,17476,21331,5]}}, +{"amount":0.4,"base":"#da4453ff","color":"#ffffff00","out":{"hex":"#da445300","u16":[56026,17476,21331,5]}}, +{"amount":0.5,"base":"#da4453ff","color":"#ffffff00","out":{"hex":"#da445300","u16":[56026,17476,21331,5]}}, +{"amount":0.7,"base":"#da4453ff","color":"#ffffff00","out":{"hex":"#da445300","u16":[56026,17476,21331,5]}}, +{"amount":1,"base":"#da4453ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"base":"#da4453ff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"base":"#e8cb2dff","color":"#000000ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"base":"#e8cb2dff","color":"#000000ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.1,"base":"#e8cb2dff","color":"#000000ff","out":{"hex":"#e6ca2dff","u16":[59212,51811,11485,65535]}}, +{"amount":0.2,"base":"#e8cb2dff","color":"#000000ff","out":{"hex":"#dcc12bff","u16":[56545,49477,10967,65535]}}, +{"amount":0.3,"base":"#e8cb2dff","color":"#000000ff","out":{"hex":"#c5ad26ff","u16":[50728,44388,9840,65535]}}, +{"amount":0.4,"base":"#e8cb2dff","color":"#000000ff","out":{"hex":"#a79220ff","u16":[42941,37577,8328,65535]}}, +{"amount":0.5,"base":"#e8cb2dff","color":"#000000ff","out":{"hex":"#88771aff","u16":[34940,30576,6776,65535]}}, +{"amount":0.7,"base":"#e8cb2dff","color":"#000000ff","out":{"hex":"#524810ff","u16":[21192,18547,4107,65535]}}, +{"amount":1,"base":"#e8cb2dff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"base":"#e8cb2dff","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"base":"#e8cb2dff","color":"#ffffffff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"base":"#e8cb2dff","color":"#ffffffff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.1,"base":"#e8cb2dff","color":"#ffffffff","out":{"hex":"#e0cd65ff","u16":[57467,52574,25918,65535]}}, +{"amount":0.2,"base":"#e8cb2dff","color":"#ffffffff","out":{"hex":"#dccf83ff","u16":[56631,53090,33792,65535]}}, +{"amount":0.3,"base":"#e8cb2dff","color":"#ffffffff","out":{"hex":"#dfd48fff","u16":[57433,54369,36712,65535]}}, +{"amount":0.4,"base":"#e8cb2dff","color":"#ffffffff","out":{"hex":"#e9dd93ff","u16":[59792,56756,37899,65535]}}, +{"amount":0.5,"base":"#e8cb2dff","color":"#ffffffff","out":{"hex":"#f6eba1ff","u16":[63300,60385,41475,65535]}}, +{"amount":0.7,"base":"#e8cb2dff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65531,65520,65535]}}, +{"amount":1,"base":"#e8cb2dff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"base":"#e8cb2dff","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"base":"#e8cb2dff","color":"#7f7f7fff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"base":"#e8cb2dff","color":"#7f7f7fff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.1,"base":"#e8cb2dff","color":"#7f7f7fff","out":{"hex":"#e3cc4eff","u16":[58259,52314,19921,65535]}}, +{"amount":0.2,"base":"#e8cb2dff","color":"#7f7f7fff","out":{"hex":"#dcca65ff","u16":[56555,51808,25942,65535]}}, +{"amount":0.3,"base":"#e8cb2dff","color":"#7f7f7fff","out":{"hex":"#d1c479ff","u16":[53814,50277,31011,65535]}}, +{"amount":0.4,"base":"#e8cb2dff","color":"#7f7f7fff","out":{"hex":"#c2b986ff","u16":[49942,47553,34540,65535]}}, +{"amount":0.5,"base":"#e8cb2dff","color":"#7f7f7fff","out":{"hex":"#b0aa8dff","u16":[45224,43812,36113,65535]}}, +{"amount":0.7,"base":"#e8cb2dff","color":"#7f7f7fff","out":{"hex":"#898884ff","u16":[35101,34924,33960,65535]}}, +{"amount":1,"base":"#e8cb2dff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1.5,"base":"#e8cb2dff","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":-0.5,"base":"#e8cb2dff","color":"#808080ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"base":"#e8cb2dff","color":"#808080ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.1,"base":"#e8cb2dff","color":"#808080ff","out":{"hex":"#e3cc4eff","u16":[58252,52316,19973,65535]}}, +{"amount":0.2,"base":"#e8cb2dff","color":"#808080ff","out":{"hex":"#dcca65ff","u16":[56551,51817,26019,65535]}}, +{"amount":0.3,"base":"#e8cb2dff","color":"#808080ff","out":{"hex":"#d1c479ff","u16":[53827,50302,31103,65535]}}, +{"amount":0.4,"base":"#e8cb2dff","color":"#808080ff","out":{"hex":"#c2b987ff","u16":[49975,47599,34652,65535]}}, +{"amount":0.5,"base":"#e8cb2dff","color":"#808080ff","out":{"hex":"#b0ab8dff","u16":[45279,43877,36244,65535]}}, +{"amount":0.7,"base":"#e8cb2dff","color":"#808080ff","out":{"hex":"#898885ff","u16":[35194,35028,34120,65535]}}, +{"amount":1,"base":"#e8cb2dff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1.5,"base":"#e8cb2dff","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":-0.5,"base":"#e8cb2dff","color":"#ff0000ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"base":"#e8cb2dff","color":"#ff0000ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.1,"base":"#e8cb2dff","color":"#ff0000ff","out":{"hex":"#febe8dff","u16":[65206,48877,36218,65535]}}, +{"amount":0.2,"base":"#e8cb2dff","color":"#ff0000ff","out":{"hex":"#feb9a3ff","u16":[65288,47450,41934,65535]}}, +{"amount":0.3,"base":"#e8cb2dff","color":"#ff0000ff","out":{"hex":"#feafa4ff","u16":[65367,44937,42110,65535]}}, +{"amount":0.4,"base":"#e8cb2dff","color":"#ff0000ff","out":{"hex":"#ff9f99ff","u16":[65438,40754,39276,65535]}}, +{"amount":0.5,"base":"#e8cb2dff","color":"#ff0000ff","out":{"hex":"#ff8785ff","u16":[65492,34805,34099,65535]}}, +{"amount":0.7,"base":"#e8cb2dff","color":"#ff0000ff","out":{"hex":"#ff3f3fff","u16":[65534,16119,16082,65535]}}, +{"amount":1,"base":"#e8cb2dff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":1.5,"base":"#e8cb2dff","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":-0.5,"base":"#e8cb2dff","color":"#00ff00ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"base":"#e8cb2dff","color":"#00ff00ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.1,"base":"#e8cb2dff","color":"#00ff00ff","out":{"hex":"#5ee912ff","u16":[24068,59817,4668,65535]}}, +{"amount":0.2,"base":"#e8cb2dff","color":"#00ff00ff","out":{"hex":"#3eed0cff","u16":[16062,60917,3116,65535]}}, +{"amount":0.3,"base":"#e8cb2dff","color":"#00ff00ff","out":{"hex":"#21f306ff","u16":[8483,62455,1646,65535]}}, +{"amount":0.4,"base":"#e8cb2dff","color":"#00ff00ff","out":{"hex":"#06fc01ff","u16":[1563,64826,303,65535]}}, +{"amount":0.5,"base":"#e8cb2dff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[4,65533,1,65535]}}, +{"amount":0.7,"base":"#e8cb2dff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[4,65533,1,65535]}}, +{"amount":1,"base":"#e8cb2dff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":1.5,"base":"#e8cb2dff","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":-0.5,"base":"#e8cb2dff","color":"#0000ffff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"base":"#e8cb2dff","color":"#0000ffff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.1,"base":"#e8cb2dff","color":"#0000ffff","out":{"hex":"#e4c88cff","u16":[58627,51299,36104,65535]}}, +{"amount":0.2,"base":"#e8cb2dff","color":"#0000ffff","out":{"hex":"#c9c5ceff","u16":[51682,50569,52910,65535]}}, +{"amount":0.3,"base":"#e8cb2dff","color":"#0000ffff","out":{"hex":"#bbb9d7ff","u16":[48170,47551,55222,65535]}}, +{"amount":0.4,"base":"#e8cb2dff","color":"#0000ffff","out":{"hex":"#a8a6dfff","u16":[43057,42699,57312,65535]}}, +{"amount":0.5,"base":"#e8cb2dff","color":"#0000ffff","out":{"hex":"#8e8defff","u16":[36468,36253,61469,65535]}}, +{"amount":0.7,"base":"#e8cb2dff","color":"#0000ffff","out":{"hex":"#5656feff","u16":[22108,22073,65177,65535]}}, +{"amount":1,"base":"#e8cb2dff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":1.5,"base":"#e8cb2dff","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":-0.5,"base":"#e8cb2dff","color":"#ffff00ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"base":"#e8cb2dff","color":"#ffff00ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.1,"base":"#e8cb2dff","color":"#ffff00ff","out":{"hex":"#e1ce1dff","u16":[57814,52928,7581,65535]}}, +{"amount":0.2,"base":"#e8cb2dff","color":"#ffff00ff","out":{"hex":"#dfd115ff","u16":[57249,53738,5448,65535]}}, +{"amount":0.3,"base":"#e8cb2dff","color":"#ffff00ff","out":{"hex":"#e0d70fff","u16":[57668,55227,3787,65535]}}, +{"amount":0.4,"base":"#e8cb2dff","color":"#ffff00ff","out":{"hex":"#e7e109ff","u16":[59273,57744,2374,65535]}}, +{"amount":0.5,"base":"#e8cb2dff","color":"#ffff00ff","out":{"hex":"#f2ef04ff","u16":[62199,61514,1062,65535]}}, +{"amount":0.7,"base":"#e8cb2dff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65532,65531,0,65535]}}, +{"amount":1,"base":"#e8cb2dff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1.5,"base":"#e8cb2dff","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":-0.5,"base":"#e8cb2dff","color":"#030201ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"base":"#e8cb2dff","color":"#030201ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.1,"base":"#e8cb2dff","color":"#030201ff","out":{"hex":"#e7ca2dff","u16":[59280,51790,11552,65535]}}, +{"amount":0.2,"base":"#e8cb2dff","color":"#030201ff","out":{"hex":"#ddc02bff","u16":[56697,49428,11119,65535]}}, +{"amount":0.3,"base":"#e8cb2dff","color":"#030201ff","out":{"hex":"#c6ac27ff","u16":[51001,44297,10111,65535]}}, +{"amount":0.4,"base":"#e8cb2dff","color":"#030201ff","out":{"hex":"#a99222ff","u16":[43371,37432,8760,65535]}}, +{"amount":0.5,"base":"#e8cb2dff","color":"#030201ff","out":{"hex":"#8a761dff","u16":[35549,30350,7396,65535]}}, +{"amount":0.7,"base":"#e8cb2dff","color":"#030201ff","out":{"hex":"#574714ff","u16":[22233,18135,5185,65535]}}, +{"amount":1,"base":"#e8cb2dff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1.5,"base":"#e8cb2dff","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":-0.5,"base":"#e8cb2dff","color":"#3daee9ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"base":"#e8cb2dff","color":"#3daee9ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.1,"base":"#e8cb2dff","color":"#3daee9ff","out":{"hex":"#c6d36cff","u16":[50859,54304,27838,65535]}}, +{"amount":0.2,"base":"#e8cb2dff","color":"#3daee9ff","out":{"hex":"#aad698ff","u16":[43587,54892,39170,65535]}}, +{"amount":0.3,"base":"#e8cb2dff","color":"#3daee9ff","out":{"hex":"#8cd3bdff","u16":[35996,54193,48597,65535]}}, +{"amount":0.4,"base":"#e8cb2dff","color":"#3daee9ff","out":{"hex":"#6fcbd8ff","u16":[28401,52092,55458,65535]}}, +{"amount":0.5,"base":"#e8cb2dff","color":"#3daee9ff","out":{"hex":"#53bee6ff","u16":[21401,48752,59204,65535]}}, +{"amount":0.7,"base":"#e8cb2dff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15681,44722,59881,65535]}}, +{"amount":1,"base":"#e8cb2dff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":1.5,"base":"#e8cb2dff","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":-0.5,"base":"#e8cb2dff","color":"#232629ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"base":"#e8cb2dff","color":"#232629ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.1,"base":"#e8cb2dff","color":"#232629ff","out":{"hex":"#e4cb3bff","u16":[58544,52070,15270,65535]}}, +{"amount":0.2,"base":"#e8cb2dff","color":"#232629ff","out":{"hex":"#d8c449ff","u16":[55596,50371,18784,65535]}}, +{"amount":0.3,"base":"#e8cb2dff","color":"#232629ff","out":{"hex":"#c2b456ff","u16":[49817,46269,22097,65535]}}, +{"amount":0.4,"base":"#e8cb2dff","color":"#232629ff","out":{"hex":"#a49d5eff","u16":[42080,40293,24276,65535]}}, +{"amount":0.5,"base":"#e8cb2dff","color":"#232629ff","out":{"hex":"#858360ff","u16":[34097,33720,24640,65535]}}, +{"amount":0.7,"base":"#e8cb2dff","color":"#232629ff","out":{"hex":"#515550ff","u16":[20867,21800,20474,65535]}}, +{"amount":1,"base":"#e8cb2dff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":1.5,"base":"#e8cb2dff","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":-0.5,"base":"#e8cb2dff","color":"#eff0f1ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"base":"#e8cb2dff","color":"#eff0f1ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.1,"base":"#e8cb2dff","color":"#eff0f1ff","out":{"hex":"#dfcd66ff","u16":[57343,52587,26331,65535]}}, +{"amount":0.2,"base":"#e8cb2dff","color":"#eff0f1ff","out":{"hex":"#dbcf87ff","u16":[56345,53071,34687,65535]}}, +{"amount":0.3,"base":"#e8cb2dff","color":"#eff0f1ff","out":{"hex":"#dbd3a3ff","u16":[56312,54187,41906,65535]}}, +{"amount":0.4,"base":"#e8cb2dff","color":"#eff0f1ff","out":{"hex":"#dfdbbfff","u16":[57403,56262,49179,65535]}}, +{"amount":0.5,"base":"#e8cb2dff","color":"#eff0f1ff","out":{"hex":"#e8e7dfff","u16":[59715,59491,57226,65535]}}, +{"amount":0.7,"base":"#e8cb2dff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61421,61677,61931,65535]}}, +{"amount":1,"base":"#e8cb2dff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":1.5,"base":"#e8cb2dff","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":-0.5,"base":"#e8cb2dff","color":"#fcfcfcff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"base":"#e8cb2dff","color":"#fcfcfcff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.1,"base":"#e8cb2dff","color":"#fcfcfcff","out":{"hex":"#e0cd65ff","u16":[57464,52572,25915,65535]}}, +{"amount":0.2,"base":"#e8cb2dff","color":"#fcfcfcff","out":{"hex":"#dccf84ff","u16":[56602,53082,33901,65535]}}, +{"amount":0.3,"base":"#e8cb2dff","color":"#fcfcfcff","out":{"hex":"#ded396ff","u16":[57107,54314,38612,65535]}}, +{"amount":0.4,"base":"#e8cb2dff","color":"#fcfcfcff","out":{"hex":"#e6dca1ff","u16":[59210,56630,41298,65535]}}, +{"amount":0.5,"base":"#e8cb2dff","color":"#fcfcfcff","out":{"hex":"#f2eab8ff","u16":[62264,60146,47352,65535]}}, +{"amount":0.7,"base":"#e8cb2dff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64761,64760,64757,65535]}}, +{"amount":1,"base":"#e8cb2dff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1.5,"base":"#e8cb2dff","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":-0.5,"base":"#e8cb2dff","color":"#da4453ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"base":"#e8cb2dff","color":"#da4453ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.1,"base":"#e8cb2dff","color":"#da4453ff","out":{"hex":"#fbc172ff","u16":[64589,49559,29187,65535]}}, +{"amount":0.2,"base":"#e8cb2dff","color":"#da4453ff","out":{"hex":"#f9bc96ff","u16":[63966,48253,38448,65535]}}, +{"amount":0.3,"base":"#e8cb2dff","color":"#da4453ff","out":{"hex":"#f5b39dff","u16":[63013,45980,40413,65535]}}, +{"amount":0.4,"base":"#e8cb2dff","color":"#da4453ff","out":{"hex":"#f0a598ff","u16":[61603,42324,39111,65535]}}, +{"amount":0.5,"base":"#e8cb2dff","color":"#da4453ff","out":{"hex":"#e8918cff","u16":[59733,37370,35852,65535]}}, +{"amount":0.7,"base":"#e8cb2dff","color":"#da4453ff","out":{"hex":"#e25860ff","u16":[58067,22702,24785,65535]}}, +{"amount":1,"base":"#e8cb2dff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":1.5,"base":"#e8cb2dff","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":-0.5,"base":"#e8cb2dff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"base":"#e8cb2dff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.1,"base":"#e8cb2dff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.2,"base":"#e8cb2dff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.3,"base":"#e8cb2dff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.4,"base":"#e8cb2dff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.5,"base":"#e8cb2dff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.7,"base":"#e8cb2dff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":1,"base":"#e8cb2dff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":1.5,"base":"#e8cb2dff","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":-0.5,"base":"#e8cb2dff","color":"#3daee980","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"base":"#e8cb2dff","color":"#3daee980","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.1,"base":"#e8cb2dff","color":"#3daee980","out":{"hex":"#d2d156d6","u16":[54038,53622,22103,54983]}}, +{"amount":0.2,"base":"#e8cb2dff","color":"#3daee980","out":{"hex":"#bcd379bd","u16":[48441,54198,31051,48697]}}, +{"amount":0.3,"base":"#e8cb2dff","color":"#3daee980","out":{"hex":"#a2d19caa","u16":[41509,53771,40048,43612]}}, +{"amount":0.4,"base":"#e8cb2dff","color":"#3daee980","out":{"hex":"#81cabd99","u16":[33268,52026,48470,39359]}}, +{"amount":0.5,"base":"#e8cb2dff","color":"#3daee980","out":{"hex":"#5ebed88b","u16":[24267,48873,55385,35786]}}, +{"amount":0.7,"base":"#e8cb2dff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15684,44722,59878,32898]}}, +{"amount":1,"base":"#e8cb2dff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":1.5,"base":"#e8cb2dff","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":-0.5,"base":"#e8cb2dff","color":"#ffffff00","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0,"base":"#e8cb2dff","color":"#ffffff00","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":0.1,"base":"#e8cb2dff","color":"#ffffff00","out":{"hex":"#e8cb2d00","u16":[59624,52171,11565,5]}}, +{"amount":0.2,"base":"#e8cb2dff","color":"#ffffff00","out":{"hex":"#e8cb2d00","u16":[59624,52171,11565,5]}}, +{"amount":0.3,"base":"#e8cb2dff","color":"#ffffff00","out":{"hex":"#e8cb2d00","u16":[59624,52171,11565,5]}}, +{"amount":0.4,"base":"#e8cb2dff","color":"#ffffff00","out":{"hex":"#e8cb2d00","u16":[59624,52171,11565,5]}}, +{"amount":0.5,"base":"#e8cb2dff","color":"#ffffff00","out":{"hex":"#e8cb2d00","u16":[59624,52171,11565,5]}}, +{"amount":0.7,"base":"#e8cb2dff","color":"#ffffff00","out":{"hex":"#e8cb2d00","u16":[59624,52171,11565,5]}}, +{"amount":1,"base":"#e8cb2dff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"base":"#e8cb2dff","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"base":"#3daee980","color":"#000000ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"base":"#3daee980","color":"#000000ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.1,"base":"#3daee980","color":"#000000ff","out":{"hex":"#3dade8a4","u16":[15600,44499,59588,42135]}}, +{"amount":0.2,"base":"#3daee980","color":"#000000ff","out":{"hex":"#3ba7e0bd","u16":[15092,43047,57645,48698]}}, +{"amount":0.3,"base":"#3daee980","color":"#000000ff","out":{"hex":"#369acfd3","u16":[13904,39659,53110,54167]}}, +{"amount":0.4,"base":"#3daee980","color":"#000000ff","out":{"hex":"#2f87b5e3","u16":[12146,34654,46397,58302]}}, +{"amount":0.5,"base":"#3daee980","color":"#000000ff","out":{"hex":"#277197ee","u16":[10146,28943,38757,61146]}}, +{"amount":0.7,"base":"#3daee980","color":"#000000ff","out":{"hex":"#18455dfa","u16":[6270,17858,23922,64172]}}, +{"amount":1,"base":"#3daee980","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"base":"#3daee980","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"base":"#3daee980","color":"#ffffffff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"base":"#3daee980","color":"#ffffffff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.1,"base":"#3daee980","color":"#ffffffff","out":{"hex":"#58aed59e","u16":[22737,44746,54775,40580]}}, +{"amount":0.2,"base":"#3daee980","color":"#ffffffff","out":{"hex":"#58b1d5b1","u16":[22510,45446,54808,45439]}}, +{"amount":0.3,"base":"#3daee980","color":"#ffffffff","out":{"hex":"#59b7dbc1","u16":[22887,47005,56196,49644]}}, +{"amount":0.4,"base":"#3daee980","color":"#ffffffff","out":{"hex":"#5dc2e6d0","u16":[23930,49771,59151,53480]}}, +{"amount":0.5,"base":"#3daee980","color":"#ffffffff","out":{"hex":"#74d0f3de","u16":[29763,53563,62490,57105]}}, +{"amount":0.7,"base":"#3daee980","color":"#ffffffff","out":{"hex":"#e3f4fcf9","u16":[58417,62662,64769,63905]}}, +{"amount":1,"base":"#3daee980","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"base":"#3daee980","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"base":"#3daee980","color":"#7f7f7fff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"base":"#3daee980","color":"#7f7f7fff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.1,"base":"#3daee980","color":"#7f7f7fff","out":{"hex":"#64acd2a3","u16":[25712,44256,53938,41852]}}, +{"amount":0.2,"base":"#3daee980","color":"#7f7f7fff","out":{"hex":"#78a9c2ba","u16":[30791,43351,49910,47928]}}, +{"amount":0.3,"base":"#3daee980","color":"#7f7f7fff","out":{"hex":"#84a3b3cf","u16":[33872,41802,45943,53295]}}, +{"amount":0.4,"base":"#3daee980","color":"#7f7f7fff","out":{"hex":"#899aa3e2","u16":[35117,39521,41822,57980]}}, +{"amount":0.5,"base":"#3daee980","color":"#7f7f7fff","out":{"hex":"#878e92f1","u16":[34707,36576,37551,61930]}}, +{"amount":0.7,"base":"#3daee980","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32641,32642,32643,65533]}}, +{"amount":1,"base":"#3daee980","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1.5,"base":"#3daee980","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":-0.5,"base":"#3daee980","color":"#808080ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"base":"#3daee980","color":"#808080ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.1,"base":"#3daee980","color":"#808080ff","out":{"hex":"#64acd2a3","u16":[25763,44254,53909,41852]}}, +{"amount":0.2,"base":"#3daee980","color":"#808080ff","out":{"hex":"#78a9c2bb","u16":[30890,43344,49847,47986]}}, +{"amount":0.3,"base":"#3daee980","color":"#808080ff","out":{"hex":"#84a3b3d0","u16":[33977,41799,45883,53381]}}, +{"amount":0.4,"base":"#3daee980","color":"#808080ff","out":{"hex":"#899aa3e2","u16":[35222,39534,41785,58085]}}, +{"amount":0.5,"base":"#3daee980","color":"#808080ff","out":{"hex":"#878e92f2","u16":[34818,36601,37531,62068]}}, +{"amount":0.7,"base":"#3daee980","color":"#808080ff","out":{"hex":"#808080ff","u16":[32898,32899,32900,65533]}}, +{"amount":1,"base":"#3daee980","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1.5,"base":"#3daee980","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":-0.5,"base":"#3daee980","color":"#ff0000ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"base":"#3daee980","color":"#ff0000ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.1,"base":"#3daee980","color":"#ff0000ff","out":{"hex":"#a9a0b59c","u16":[43471,41047,46546,39966]}}, +{"amount":0.2,"base":"#3daee980","color":"#ff0000ff","out":{"hex":"#d58ea1b0","u16":[54849,36566,41364,45165]}}, +{"amount":0.3,"base":"#3daee980","color":"#ff0000ff","out":{"hex":"#ee7d86c4","u16":[61118,32091,34472,50273]}}, +{"amount":0.4,"base":"#3daee980","color":"#ff0000ff","out":{"hex":"#fa696dd7","u16":[64150,26981,27931,55279]}}, +{"amount":0.5,"base":"#3daee980","color":"#ff0000ff","out":{"hex":"#fe4f50ea","u16":[65272,20415,20671,60104]}}, +{"amount":0.7,"base":"#3daee980","color":"#ff0000ff","out":{"hex":"#ff0202ff","u16":[65535,600,600,65533]}}, +{"amount":1,"base":"#3daee980","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":1.5,"base":"#3daee980","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":-0.5,"base":"#3daee980","color":"#00ff00ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"base":"#3daee980","color":"#00ff00ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.1,"base":"#3daee980","color":"#00ff00ff","out":{"hex":"#20bb7aa2","u16":[8207,48064,31350,41547]}}, +{"amount":0.2,"base":"#3daee980","color":"#00ff00ff","out":{"hex":"#15bf51b6","u16":[5419,49148,20698,46848]}}, +{"amount":0.3,"base":"#3daee980","color":"#00ff00ff","out":{"hex":"#0ec537c8","u16":[3668,50677,14007,51447]}}, +{"amount":0.4,"base":"#3daee980","color":"#00ff00ff","out":{"hex":"#09cf24d9","u16":[2412,53200,9212,55664]}}, +{"amount":0.5,"base":"#3daee980","color":"#00ff00ff","out":{"hex":"#05de15e8","u16":[1406,56965,5369,59626]}}, +{"amount":0.7,"base":"#3daee980","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[1,65531,2,65533]}}, +{"amount":1,"base":"#3daee980","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":1.5,"base":"#3daee980","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":-0.5,"base":"#3daee980","color":"#0000ffff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"base":"#3daee980","color":"#0000ffff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.1,"base":"#3daee980","color":"#0000ffff","out":{"hex":"#889ff99f","u16":[34911,40892,63938,40848]}}, +{"amount":0.2,"base":"#3daee980","color":"#0000ffff","out":{"hex":"#9099fbb5","u16":[36982,39276,64499,46636]}}, +{"amount":0.3,"base":"#3daee980","color":"#0000ffff","out":{"hex":"#8c90fdc9","u16":[35982,36969,64976,51694]}}, +{"amount":0.4,"base":"#3daee980","color":"#0000ffff","out":{"hex":"#8082feda","u16":[33023,33451,65287,56023]}}, +{"amount":0.5,"base":"#3daee980","color":"#0000ffff","out":{"hex":"#6f70ffe7","u16":[28606,28782,65444,59488]}}, +{"amount":0.7,"base":"#3daee980","color":"#0000ffff","out":{"hex":"#4141fff9","u16":[16688,16705,65530,63970]}}, +{"amount":1,"base":"#3daee980","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":1.5,"base":"#3daee980","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":-0.5,"base":"#3daee980","color":"#ffff00ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"base":"#3daee980","color":"#ffff00ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.1,"base":"#3daee980","color":"#ffff00ff","out":{"hex":"#77b27a9f","u16":[30590,45744,31247,40975]}}, +{"amount":0.2,"base":"#3daee980","color":"#ffff00ff","out":{"hex":"#8bb251b3","u16":[35757,45869,20852,45949]}}, +{"amount":0.3,"base":"#3daee980","color":"#ffff00ff","out":{"hex":"#9bb639c3","u16":[39741,46830,14617,50190]}}, +{"amount":0.4,"base":"#3daee980","color":"#ffff00ff","out":{"hex":"#abbf28d2","u16":[43997,48985,10286,54050]}}, +{"amount":0.5,"base":"#3daee980","color":"#ffff00ff","out":{"hex":"#bfcc1be0","u16":[49156,52491,6879,57684]}}, +{"amount":0.7,"base":"#3daee980","color":"#ffff00ff","out":{"hex":"#f5f704fb","u16":[62914,63375,951,64490]}}, +{"amount":1,"base":"#3daee980","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1.5,"base":"#3daee980","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":-0.5,"base":"#3daee980","color":"#030201ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"base":"#3daee980","color":"#030201ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.1,"base":"#3daee980","color":"#030201ff","out":{"hex":"#3eade7a4","u16":[16061,44508,59265,42135]}}, +{"amount":0.2,"base":"#3daee980","color":"#030201ff","out":{"hex":"#3fa8ddbe","u16":[16139,43059,56900,48724]}}, +{"amount":0.3,"base":"#3daee980","color":"#030201ff","out":{"hex":"#3d9ac9d3","u16":[15787,39683,51768,54180]}}, +{"amount":0.4,"base":"#3daee980","color":"#030201ff","out":{"hex":"#3b87ace3","u16":[15124,34674,44259,58311]}}, +{"amount":0.5,"base":"#3daee980","color":"#030201ff","out":{"hex":"#38718bee","u16":[14419,28925,35612,61153]}}, +{"amount":0.7,"base":"#3daee980","color":"#030201ff","out":{"hex":"#334448fa","u16":[13111,17542,18408,64177]}}, +{"amount":1,"base":"#3daee980","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1.5,"base":"#3daee980","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":-0.5,"base":"#3daee980","color":"#3daee9ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"base":"#3daee980","color":"#3daee9ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.1,"base":"#3daee980","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65533]}}, +{"amount":0.2,"base":"#3daee980","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65533]}}, +{"amount":0.3,"base":"#3daee980","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65533]}}, +{"amount":0.4,"base":"#3daee980","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65533]}}, +{"amount":0.5,"base":"#3daee980","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65533]}}, +{"amount":0.7,"base":"#3daee980","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65533]}}, +{"amount":1,"base":"#3daee980","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":1.5,"base":"#3daee980","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":-0.5,"base":"#3daee980","color":"#232629ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"base":"#3daee980","color":"#232629ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.1,"base":"#3daee980","color":"#232629ff","out":{"hex":"#4bade1a4","u16":[19255,44445,57841,42043]}}, +{"amount":0.2,"base":"#3daee980","color":"#232629ff","out":{"hex":"#56a8d4bc","u16":[22038,43125,54593,48352]}}, +{"amount":0.3,"base":"#3daee980","color":"#232629ff","out":{"hex":"#5d9cbfd1","u16":[23942,40101,49192,53660]}}, +{"amount":0.4,"base":"#3daee980","color":"#232629ff","out":{"hex":"#5e8aa4e1","u16":[24280,35535,42196,57793]}}, +{"amount":0.5,"base":"#3daee980","color":"#232629ff","out":{"hex":"#597587ec","u16":[22935,30195,34801,60751]}}, +{"amount":0.7,"base":"#3daee980","color":"#232629ff","out":{"hex":"#424d55f9","u16":[17082,19743,21804,64066]}}, +{"amount":1,"base":"#3daee980","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":1.5,"base":"#3daee980","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":-0.5,"base":"#3daee980","color":"#eff0f1ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"base":"#3daee980","color":"#eff0f1ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.1,"base":"#3daee980","color":"#eff0f1ff","out":{"hex":"#63add19f","u16":[25436,44486,53768,40848]}}, +{"amount":0.2,"base":"#3daee980","color":"#eff0f1ff","out":{"hex":"#6aafceb2","u16":[27236,44919,53005,45825]}}, +{"amount":0.3,"base":"#3daee980","color":"#eff0f1ff","out":{"hex":"#74b3d0c3","u16":[29831,46090,53373,50168]}}, +{"amount":0.4,"base":"#3daee980","color":"#eff0f1ff","out":{"hex":"#83bcd6d3","u16":[33618,48292,54919,54154]}}, +{"amount":0.5,"base":"#3daee980","color":"#eff0f1ff","out":{"hex":"#9cc8dde1","u16":[40127,51485,56911,57918]}}, +{"amount":0.7,"base":"#3daee980","color":"#eff0f1ff","out":{"hex":"#eaeceefd","u16":[60012,60641,61121,64967]}}, +{"amount":1,"base":"#3daee980","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":1.5,"base":"#3daee980","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":-0.5,"base":"#3daee980","color":"#fcfcfcff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"base":"#3daee980","color":"#fcfcfcff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.1,"base":"#3daee980","color":"#fcfcfcff","out":{"hex":"#5baed49e","u16":[23383,44685,54545,40580]}}, +{"amount":0.2,"base":"#3daee980","color":"#fcfcfcff","out":{"hex":"#5cb0d4b1","u16":[23770,45328,54360,45527]}}, +{"amount":0.3,"base":"#3daee980","color":"#fcfcfcff","out":{"hex":"#61b6d8c2","u16":[24950,46779,55449,49734]}}, +{"amount":0.4,"base":"#3daee980","color":"#fcfcfcff","out":{"hex":"#6ac0e1d1","u16":[27213,49390,57952,53605]}}, +{"amount":0.5,"base":"#3daee980","color":"#fcfcfcff","out":{"hex":"#83ceecdf","u16":[33614,52986,60771,57248]}}, +{"amount":0.7,"base":"#3daee980","color":"#fcfcfcff","out":{"hex":"#eaf1f5f9","u16":[60033,62001,63008,64092]}}, +{"amount":1,"base":"#3daee980","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1.5,"base":"#3daee980","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":-0.5,"base":"#3daee980","color":"#da4453ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"base":"#3daee980","color":"#da4453ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.1,"base":"#3daee980","color":"#da4453ff","out":{"hex":"#9ba3c09e","u16":[39899,41783,49333,40717]}}, +{"amount":0.2,"base":"#3daee980","color":"#da4453ff","out":{"hex":"#ba98b3b5","u16":[47887,38965,46025,46490]}}, +{"amount":0.3,"base":"#3daee980","color":"#da4453ff","out":{"hex":"#ca8da0c9","u16":[51967,36222,41061,51711]}}, +{"amount":0.4,"base":"#3daee980","color":"#da4453ff","out":{"hex":"#d57d8ddc","u16":[54849,32214,36192,56502]}}, +{"amount":0.5,"base":"#3daee980","color":"#da4453ff","out":{"hex":"#dd6877ec","u16":[56748,26765,30496,60689]}}, +{"amount":0.7,"base":"#3daee980","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56031,17479,21334,65533]}}, +{"amount":1,"base":"#3daee980","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":1.5,"base":"#3daee980","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":-0.5,"base":"#3daee980","color":"#e8cb2dff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"base":"#3daee980","color":"#e8cb2dff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.1,"base":"#3daee980","color":"#e8cb2dff","out":{"hex":"#82af89a6","u16":[33337,44905,35316,42566]}}, +{"amount":0.2,"base":"#3daee980","color":"#e8cb2dff","out":{"hex":"#99ad66bc","u16":[39394,44587,26190,48213]}}, +{"amount":0.3,"base":"#3daee980","color":"#e8cb2dff","out":{"hex":"#abaf50cf","u16":[43918,44970,20513,53078]}}, +{"amount":0.4,"base":"#3daee980","color":"#e8cb2dff","out":{"hex":"#bcb441e0","u16":[48431,46323,16628,57519]}}, +{"amount":0.5,"base":"#3daee980","color":"#e8cb2dff","out":{"hex":"#d1be36f0","u16":[53625,48762,13775,61683]}}, +{"amount":0.7,"base":"#3daee980","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59619,52169,11567,65533]}}, +{"amount":1,"base":"#3daee980","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":1.5,"base":"#3daee980","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":-0.5,"base":"#3daee980","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"base":"#3daee980","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.1,"base":"#3daee980","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.2,"base":"#3daee980","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.3,"base":"#3daee980","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.4,"base":"#3daee980","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.5,"base":"#3daee980","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.7,"base":"#3daee980","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":1,"base":"#3daee980","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":1.5,"base":"#3daee980","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":-0.5,"base":"#3daee980","color":"#ffffff00","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0,"base":"#3daee980","color":"#ffffff00","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":0.1,"base":"#3daee980","color":"#ffffff00","out":{"hex":"#3daee900","u16":[15677,44718,59881,2]}}, +{"amount":0.2,"base":"#3daee980","color":"#ffffff00","out":{"hex":"#3daee900","u16":[15677,44718,59881,2]}}, +{"amount":0.3,"base":"#3daee980","color":"#ffffff00","out":{"hex":"#3daee900","u16":[15677,44718,59881,2]}}, +{"amount":0.4,"base":"#3daee980","color":"#ffffff00","out":{"hex":"#3daee900","u16":[15677,44718,59881,2]}}, +{"amount":0.5,"base":"#3daee980","color":"#ffffff00","out":{"hex":"#3daee900","u16":[15677,44718,59881,2]}}, +{"amount":0.7,"base":"#3daee980","color":"#ffffff00","out":{"hex":"#3daee900","u16":[15677,44718,59881,2]}}, +{"amount":1,"base":"#3daee980","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"base":"#3daee980","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":-0.5,"base":"#ffffff00","color":"#000000ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"base":"#ffffff00","color":"#000000ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"base":"#ffffff00","color":"#000000ff","out":{"hex":"#fcfcfc52","u16":[64854,64854,64854,21053]}}, +{"amount":0.2,"base":"#ffffff00","color":"#000000ff","out":{"hex":"#ececec92","u16":[60640,60640,60640,37604]}}, +{"amount":0.3,"base":"#ffffff00","color":"#000000ff","out":{"hex":"#cbcbcbc0","u16":[52295,52295,52295,49459]}}, +{"amount":0.4,"base":"#ffffff00","color":"#000000ff","out":{"hex":"#a5a5a5dc","u16":[42516,42516,42516,56614]}}, +{"amount":0.5,"base":"#ffffff00","color":"#000000ff","out":{"hex":"#838383ec","u16":[33616,33616,33616,60587]}}, +{"amount":0.7,"base":"#ffffff00","color":"#000000ff","out":{"hex":"#4e4e4ef9","u16":[19943,19943,19943,64062]}}, +{"amount":1,"base":"#ffffff00","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":1.5,"base":"#ffffff00","color":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"amount":-0.5,"base":"#ffffff00","color":"#ffffffff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"base":"#ffffff00","color":"#ffffffff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"base":"#ffffff00","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65530]}}, +{"amount":0.2,"base":"#ffffff00","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65530]}}, +{"amount":0.3,"base":"#ffffff00","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65530]}}, +{"amount":0.4,"base":"#ffffff00","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65530]}}, +{"amount":0.5,"base":"#ffffff00","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65530]}}, +{"amount":0.7,"base":"#ffffff00","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65530]}}, +{"amount":1,"base":"#ffffff00","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":1.5,"base":"#ffffff00","color":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"amount":-0.5,"base":"#ffffff00","color":"#7f7f7fff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"base":"#ffffff00","color":"#7f7f7fff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"base":"#ffffff00","color":"#7f7f7fff","out":{"hex":"#fefefe39","u16":[65381,65381,65381,14527]}}, +{"amount":0.2,"base":"#ffffff00","color":"#7f7f7fff","out":{"hex":"#fafafa68","u16":[64330,64330,64330,26842]}}, +{"amount":0.3,"base":"#ffffff00","color":"#7f7f7fff","out":{"hex":"#f0f0f093","u16":[61712,61712,61712,37674]}}, +{"amount":0.4,"base":"#ffffff00","color":"#7f7f7fff","out":{"hex":"#dfdfdfb6","u16":[57413,57413,57413,46649]}}, +{"amount":0.5,"base":"#ffffff00","color":"#7f7f7fff","out":{"hex":"#cacacad1","u16":[51897,51897,51897,53610]}}, +{"amount":0.7,"base":"#ffffff00","color":"#7f7f7fff","out":{"hex":"#9c9c9cf2","u16":[40094,40094,40094,62251]}}, +{"amount":1,"base":"#ffffff00","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":1.5,"base":"#ffffff00","color":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"amount":-0.5,"base":"#ffffff00","color":"#808080ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"base":"#ffffff00","color":"#808080ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"base":"#ffffff00","color":"#808080ff","out":{"hex":"#fefefe39","u16":[65382,65382,65382,14527]}}, +{"amount":0.2,"base":"#ffffff00","color":"#808080ff","out":{"hex":"#fafafa68","u16":[64347,64347,64347,26764]}}, +{"amount":0.3,"base":"#ffffff00","color":"#808080ff","out":{"hex":"#f0f0f092","u16":[61755,61755,61755,37604]}}, +{"amount":0.4,"base":"#ffffff00","color":"#808080ff","out":{"hex":"#e0e0e0b5","u16":[57482,57482,57482,46606]}}, +{"amount":0.5,"base":"#ffffff00","color":"#808080ff","out":{"hex":"#cacacad0","u16":[52002,52002,52002,53579]}}, +{"amount":0.7,"base":"#ffffff00","color":"#808080ff","out":{"hex":"#9d9d9df2","u16":[40243,40243,40243,62262]}}, +{"amount":1,"base":"#ffffff00","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":1.5,"base":"#ffffff00","color":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"amount":-0.5,"base":"#ffffff00","color":"#ff0000ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"base":"#ffffff00","color":"#ff0000ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"base":"#ffffff00","color":"#ff0000ff","out":{"hex":"#fffefe39","u16":[65535,65338,65338,14527]}}, +{"amount":0.2,"base":"#ffffff00","color":"#ff0000ff","out":{"hex":"#fff9f969","u16":[65535,63978,63978,26918]}}, +{"amount":0.3,"base":"#ffffff00","color":"#ff0000ff","out":{"hex":"#ffecec93","u16":[65535,60593,60593,37708]}}, +{"amount":0.4,"base":"#ffffff00","color":"#ff0000ff","out":{"hex":"#ffd6d6b6","u16":[65535,54887,54887,46691]}}, +{"amount":0.5,"base":"#ffffff00","color":"#ff0000ff","out":{"hex":"#ffb8b8d1","u16":[65535,47257,47257,53641]}}, +{"amount":0.7,"base":"#ffffff00","color":"#ff0000ff","out":{"hex":"#ff6e6ef2","u16":[65535,28325,28325,62241]}}, +{"amount":1,"base":"#ffffff00","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":1.5,"base":"#ffffff00","color":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"amount":-0.5,"base":"#ffffff00","color":"#00ff00ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"base":"#ffffff00","color":"#00ff00ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"base":"#ffffff00","color":"#00ff00ff","out":{"hex":"#fefffe3d","u16":[65280,65535,65280,15703]}}, +{"amount":0.2,"base":"#ffffff00","color":"#00ff00ff","out":{"hex":"#f7fff772","u16":[63452,65535,63452,29334]}}, +{"amount":0.3,"base":"#ffffff00","color":"#00ff00ff","out":{"hex":"#e4ffe4a2","u16":[58471,65535,58471,41719]}}, +{"amount":0.4,"base":"#ffffff00","color":"#00ff00ff","out":{"hex":"#bcffbccd","u16":[48424,65535,48424,52782]}}, +{"amount":0.5,"base":"#ffffff00","color":"#00ff00ff","out":{"hex":"#6eff6ef2","u16":[28246,65535,28246,62262]}}, +{"amount":0.7,"base":"#ffffff00","color":"#00ff00ff","out":{"hex":"#06ff06ff","u16":[1494,65535,1494,65530]}}, +{"amount":1,"base":"#ffffff00","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":1.5,"base":"#ffffff00","color":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"amount":-0.5,"base":"#ffffff00","color":"#0000ffff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"base":"#ffffff00","color":"#0000ffff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"base":"#ffffff00","color":"#0000ffff","out":{"hex":"#fefeff42","u16":[65207,65207,65535,16933]}}, +{"amount":0.2,"base":"#ffffff00","color":"#0000ffff","out":{"hex":"#f5f5ff78","u16":[63072,63072,65535,30812]}}, +{"amount":0.3,"base":"#ffffff00","color":"#0000ffff","out":{"hex":"#e2e2ffa5","u16":[58102,58102,65535,42315]}}, +{"amount":0.4,"base":"#ffffff00","color":"#0000ffff","out":{"hex":"#c5c5ffc6","u16":[50741,50741,65535,50891]}}, +{"amount":0.5,"base":"#ffffff00","color":"#0000ffff","out":{"hex":"#a5a5ffdd","u16":[42369,42369,65535,56695]}}, +{"amount":0.7,"base":"#ffffff00","color":"#0000ffff","out":{"hex":"#6666fff4","u16":[26113,26113,65535,62808]}}, +{"amount":1,"base":"#ffffff00","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":1.5,"base":"#ffffff00","color":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"amount":-0.5,"base":"#ffffff00","color":"#ffff00ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"base":"#ffffff00","color":"#ffff00ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"base":"#ffffff00","color":"#ffff00ff","out":{"hex":"#fffffb59","u16":[65535,65535,64633,22895]}}, +{"amount":0.2,"base":"#ffffff00","color":"#ffff00ff","out":{"hex":"#ffffe1a6","u16":[65535,65535,57934,42579]}}, +{"amount":0.3,"base":"#ffffff00","color":"#ffff00ff","out":{"hex":"#ffff82ec","u16":[65535,65535,33518,60622]}}, +{"amount":0.4,"base":"#ffffff00","color":"#ffff00ff","out":{"hex":"#ffff06ff","u16":[65535,65535,1494,65530]}}, +{"amount":0.5,"base":"#ffffff00","color":"#ffff00ff","out":{"hex":"#ffff06ff","u16":[65535,65535,1494,65530]}}, +{"amount":0.7,"base":"#ffffff00","color":"#ffff00ff","out":{"hex":"#ffff06ff","u16":[65535,65535,1494,65530]}}, +{"amount":1,"base":"#ffffff00","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":1.5,"base":"#ffffff00","color":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"amount":-0.5,"base":"#ffffff00","color":"#030201ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"base":"#ffffff00","color":"#030201ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"base":"#ffffff00","color":"#030201ff","out":{"hex":"#fffcfa52","u16":[65417,64736,64362,21053]}}, +{"amount":0.2,"base":"#ffffff00","color":"#030201ff","out":{"hex":"#fce8dd92","u16":[64714,59744,56822,37604]}}, +{"amount":0.3,"base":"#ffffff00","color":"#030201ff","out":{"hex":"#f7c19ac0","u16":[63466,49562,39509,49459]}}, +{"amount":0.4,"base":"#ffffff00","color":"#030201ff","out":{"hex":"#e0954bdc","u16":[57631,38420,19210,56614]}}, +{"amount":0.5,"base":"#ffffff00","color":"#030201ff","out":{"hex":"#b1763bec","u16":[45567,30378,15189,60587]}}, +{"amount":0.7,"base":"#ffffff00","color":"#030201ff","out":{"hex":"#694623f9","u16":[27037,18025,9012,64062]}}, +{"amount":1,"base":"#ffffff00","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":1.5,"base":"#ffffff00","color":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"amount":-0.5,"base":"#ffffff00","color":"#3daee9ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"base":"#ffffff00","color":"#3daee9ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"base":"#ffffff00","color":"#3daee9ff","out":{"hex":"#feffff36","u16":[65361,65442,65523,13845]}}, +{"amount":0.2,"base":"#ffffff00","color":"#3daee9ff","out":{"hex":"#f9fcff65","u16":[64119,64783,65439,25877]}}, +{"amount":0.3,"base":"#ffffff00","color":"#3daee9ff","out":{"hex":"#edf6fe8f","u16":[60887,63102,65230,36627]}}, +{"amount":0.4,"base":"#ffffff00","color":"#3daee9ff","out":{"hex":"#d6eafcb3","u16":[55094,60227,64884,45914]}}, +{"amount":0.5,"base":"#ffffff00","color":"#3daee9ff","out":{"hex":"#b5dbfbd0","u16":[46568,56360,64447,53502]}}, +{"amount":0.7,"base":"#ffffff00","color":"#3daee9ff","out":{"hex":"#41b9f7f8","u16":[16784,47488,63563,63797]}}, +{"amount":1,"base":"#ffffff00","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":1.5,"base":"#ffffff00","color":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"amount":-0.5,"base":"#ffffff00","color":"#232629ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"base":"#ffffff00","color":"#232629ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"base":"#ffffff00","color":"#232629ff","out":{"hex":"#fdfdfd4c","u16":[64955,65018,65087,19578]}}, +{"amount":0.2,"base":"#ffffff00","color":"#232629ff","out":{"hex":"#eef0f28a","u16":[61198,61684,62212,35425]}}, +{"amount":0.3,"base":"#ffffff00","color":"#232629ff","out":{"hex":"#cfd5dbb8","u16":[53217,54708,56293,47337]}}, +{"amount":0.4,"base":"#ffffff00","color":"#232629ff","out":{"hex":"#a7b3bfd6","u16":[42875,45984,49133,55023]}}, +{"amount":0.5,"base":"#ffffff00","color":"#232629ff","out":{"hex":"#86919de8","u16":[34381,37328,40275,59564]}}, +{"amount":0.7,"base":"#ffffff00","color":"#232629ff","out":{"hex":"#545b63f8","u16":[21618,23471,25324,63736]}}, +{"amount":1,"base":"#ffffff00","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":1.5,"base":"#ffffff00","color":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"amount":-0.5,"base":"#ffffff00","color":"#eff0f1ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"base":"#ffffff00","color":"#eff0f1ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"base":"#ffffff00","color":"#eff0f1ff","out":{"hex":"#ffffff4c","u16":[65464,65469,65473,19578]}}, +{"amount":0.2,"base":"#ffffff00","color":"#eff0f1ff","out":{"hex":"#fdfdfd8d","u16":[64978,65012,65046,36326]}}, +{"amount":0.3,"base":"#ffffff00","color":"#eff0f1ff","out":{"hex":"#f8f8f9c9","u16":[63706,63818,63930,51724]}}, +{"amount":0.4,"base":"#ffffff00","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61424,61681,61938,65530]}}, +{"amount":0.5,"base":"#ffffff00","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61424,61681,61938,65530]}}, +{"amount":0.7,"base":"#ffffff00","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61424,61681,61938,65530]}}, +{"amount":1,"base":"#ffffff00","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":1.5,"base":"#ffffff00","color":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"amount":-0.5,"base":"#ffffff00","color":"#fcfcfcff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"base":"#ffffff00","color":"#fcfcfcff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"base":"#ffffff00","color":"#fcfcfcff","out":{"hex":"#ffffff79","u16":[65472,65472,65472,31033]}}, +{"amount":0.2,"base":"#ffffff00","color":"#fcfcfcff","out":{"hex":"#fdfdfde0","u16":[65034,65034,65034,57620]}}, +{"amount":0.3,"base":"#ffffff00","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65530]}}, +{"amount":0.4,"base":"#ffffff00","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65530]}}, +{"amount":0.5,"base":"#ffffff00","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65530]}}, +{"amount":0.7,"base":"#ffffff00","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65530]}}, +{"amount":1,"base":"#ffffff00","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":1.5,"base":"#ffffff00","color":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"amount":-0.5,"base":"#ffffff00","color":"#da4453ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"base":"#ffffff00","color":"#da4453ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"base":"#ffffff00","color":"#da4453ff","out":{"hex":"#fffefe3a","u16":[65488,65331,65339,14842]}}, +{"amount":0.2,"base":"#ffffff00","color":"#da4453ff","out":{"hex":"#fef9f96a","u16":[65180,63992,64047,27146]}}, +{"amount":0.3,"base":"#ffffff00","color":"#da4453ff","out":{"hex":"#fbeced94","u16":[64436,60641,60821,38019]}}, +{"amount":0.4,"base":"#ffffff00","color":"#da4453ff","out":{"hex":"#f6d6d8b7","u16":[63288,55090,55499,46964]}}, +{"amount":0.5,"base":"#ffffff00","color":"#da4453ff","out":{"hex":"#f1babdd1","u16":[61951,47819,48579,53824]}}, +{"amount":0.7,"base":"#ffffff00","color":"#da4453ff","out":{"hex":"#e87880f2","u16":[59598,30785,32812,62208]}}, +{"amount":1,"base":"#ffffff00","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":1.5,"base":"#ffffff00","color":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"amount":-0.5,"base":"#ffffff00","color":"#e8cb2dff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"base":"#ffffff00","color":"#e8cb2dff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"base":"#ffffff00","color":"#e8cb2dff","out":{"hex":"#fffffe3a","u16":[65532,65451,65223,14842]}}, +{"amount":0.2,"base":"#ffffff00","color":"#e8cb2dff","out":{"hex":"#fffcf56a","u16":[65512,64889,63091,27369]}}, +{"amount":0.3,"base":"#ffffff00","color":"#e8cb2dff","out":{"hex":"#fff7df97","u16":[65461,63429,57224,38853]}}, +{"amount":0.4,"base":"#ffffff00","color":"#e8cb2dff","out":{"hex":"#feedafbf","u16":[65373,60838,45050,49067]}}, +{"amount":0.5,"base":"#ffffff00","color":"#e8cb2dff","out":{"hex":"#fede37e1","u16":[65256,57165,14097,57736]}}, +{"amount":0.7,"base":"#ffffff00","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59628,52175,11566,65530]}}, +{"amount":1,"base":"#ffffff00","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":1.5,"base":"#ffffff00","color":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"amount":-0.5,"base":"#ffffff00","color":"#3daee980","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"base":"#ffffff00","color":"#3daee980","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"base":"#ffffff00","color":"#3daee980","out":{"hex":"#feffff1b","u16":[65361,65442,65523,6949]}}, +{"amount":0.2,"base":"#ffffff00","color":"#3daee980","out":{"hex":"#f9fcff33","u16":[64119,64783,65439,12989]}}, +{"amount":0.3,"base":"#ffffff00","color":"#3daee980","out":{"hex":"#edf6fe48","u16":[60887,63102,65230,18385]}}, +{"amount":0.4,"base":"#ffffff00","color":"#3daee980","out":{"hex":"#d6eafc5a","u16":[55094,60227,64884,23047]}}, +{"amount":0.5,"base":"#ffffff00","color":"#3daee980","out":{"hex":"#b5dbfb68","u16":[46568,56360,64447,26856]}}, +{"amount":0.7,"base":"#ffffff00","color":"#3daee980","out":{"hex":"#41b9f77d","u16":[16784,47488,63563,32024]}}, +{"amount":1,"base":"#ffffff00","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":1.5,"base":"#ffffff00","color":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"amount":-0.5,"base":"#ffffff00","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0,"base":"#ffffff00","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":0.1,"base":"#ffffff00","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65470,65470,65470,0]}}, +{"amount":0.2,"base":"#ffffff00","color":"#ffffff00","out":{"hex":"#fdfdfd00","u16":[65046,65046,65046,0]}}, +{"amount":0.3,"base":"#ffffff00","color":"#ffffff00","out":{"hex":"#f9f9f900","u16":[63903,63903,63903,0]}}, +{"amount":0.4,"base":"#ffffff00","color":"#ffffff00","out":{"hex":"#f1f1f100","u16":[61855,61855,61855,0]}}, +{"amount":0.5,"base":"#ffffff00","color":"#ffffff00","out":{"hex":"#e5e5e500","u16":[58869,58869,58869,0]}}, +{"amount":0.7,"base":"#ffffff00","color":"#ffffff00","out":{"hex":"#c6c6c600","u16":[50880,50880,50880,0]}}, +{"amount":1,"base":"#ffffff00","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"amount":1.5,"base":"#ffffff00","color":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}} +], +"mix": [ +{"bias":-0.5,"c1":"#000000ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0,"c1":"#000000ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.1,"c1":"#000000ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.25,"c1":"#000000ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.5,"c1":"#000000ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.75,"c1":"#000000ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.9,"c1":"#000000ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":1,"c1":"#000000ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":1.5,"c1":"#000000ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":-0.5,"c1":"#000000ff","c2":"#ffffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0,"c1":"#000000ff","c2":"#ffffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.1,"c1":"#000000ff","c2":"#ffffffff","out":{"hex":"#1a1a1aff","u16":[6554,6554,6554,65535]}}, +{"bias":0.25,"c1":"#000000ff","c2":"#ffffffff","out":{"hex":"#404040ff","u16":[16384,16384,16384,65535]}}, +{"bias":0.5,"c1":"#000000ff","c2":"#ffffffff","out":{"hex":"#808080ff","u16":[32768,32768,32768,65535]}}, +{"bias":0.75,"c1":"#000000ff","c2":"#ffffffff","out":{"hex":"#bfbfbfff","u16":[49151,49151,49151,65535]}}, +{"bias":0.9,"c1":"#000000ff","c2":"#ffffffff","out":{"hex":"#e6e6e6ff","u16":[58982,58982,58982,65535]}}, +{"bias":1,"c1":"#000000ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":1.5,"c1":"#000000ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":-0.5,"c1":"#000000ff","c2":"#7f7f7fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0,"c1":"#000000ff","c2":"#7f7f7fff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.1,"c1":"#000000ff","c2":"#7f7f7fff","out":{"hex":"#0d0d0dff","u16":[3264,3264,3264,65535]}}, +{"bias":0.25,"c1":"#000000ff","c2":"#7f7f7fff","out":{"hex":"#202020ff","u16":[8160,8160,8160,65535]}}, +{"bias":0.5,"c1":"#000000ff","c2":"#7f7f7fff","out":{"hex":"#404040ff","u16":[16320,16320,16320,65535]}}, +{"bias":0.75,"c1":"#000000ff","c2":"#7f7f7fff","out":{"hex":"#5f5f5fff","u16":[24479,24479,24479,65535]}}, +{"bias":0.9,"c1":"#000000ff","c2":"#7f7f7fff","out":{"hex":"#727272ff","u16":[29375,29375,29375,65535]}}, +{"bias":1,"c1":"#000000ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":1.5,"c1":"#000000ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":-0.5,"c1":"#000000ff","c2":"#808080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0,"c1":"#000000ff","c2":"#808080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.1,"c1":"#000000ff","c2":"#808080ff","out":{"hex":"#0d0d0dff","u16":[3290,3290,3290,65535]}}, +{"bias":0.25,"c1":"#000000ff","c2":"#808080ff","out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"bias":0.5,"c1":"#000000ff","c2":"#808080ff","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"bias":0.75,"c1":"#000000ff","c2":"#808080ff","out":{"hex":"#606060ff","u16":[24672,24672,24672,65535]}}, +{"bias":0.9,"c1":"#000000ff","c2":"#808080ff","out":{"hex":"#737373ff","u16":[29606,29606,29606,65535]}}, +{"bias":1,"c1":"#000000ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":1.5,"c1":"#000000ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":-0.5,"c1":"#000000ff","c2":"#ff0000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0,"c1":"#000000ff","c2":"#ff0000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.1,"c1":"#000000ff","c2":"#ff0000ff","out":{"hex":"#1a0000ff","u16":[6554,0,0,65535]}}, +{"bias":0.25,"c1":"#000000ff","c2":"#ff0000ff","out":{"hex":"#400000ff","u16":[16384,0,0,65535]}}, +{"bias":0.5,"c1":"#000000ff","c2":"#ff0000ff","out":{"hex":"#800000ff","u16":[32768,0,0,65535]}}, +{"bias":0.75,"c1":"#000000ff","c2":"#ff0000ff","out":{"hex":"#bf0000ff","u16":[49151,0,0,65535]}}, +{"bias":0.9,"c1":"#000000ff","c2":"#ff0000ff","out":{"hex":"#e60000ff","u16":[58982,0,0,65535]}}, +{"bias":1,"c1":"#000000ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":1.5,"c1":"#000000ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":-0.5,"c1":"#000000ff","c2":"#00ff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0,"c1":"#000000ff","c2":"#00ff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.1,"c1":"#000000ff","c2":"#00ff00ff","out":{"hex":"#001a00ff","u16":[0,6554,0,65535]}}, +{"bias":0.25,"c1":"#000000ff","c2":"#00ff00ff","out":{"hex":"#004000ff","u16":[0,16384,0,65535]}}, +{"bias":0.5,"c1":"#000000ff","c2":"#00ff00ff","out":{"hex":"#008000ff","u16":[0,32768,0,65535]}}, +{"bias":0.75,"c1":"#000000ff","c2":"#00ff00ff","out":{"hex":"#00bf00ff","u16":[0,49151,0,65535]}}, +{"bias":0.9,"c1":"#000000ff","c2":"#00ff00ff","out":{"hex":"#00e600ff","u16":[0,58982,0,65535]}}, +{"bias":1,"c1":"#000000ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":1.5,"c1":"#000000ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":-0.5,"c1":"#000000ff","c2":"#0000ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0,"c1":"#000000ff","c2":"#0000ffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.1,"c1":"#000000ff","c2":"#0000ffff","out":{"hex":"#00001aff","u16":[0,0,6554,65535]}}, +{"bias":0.25,"c1":"#000000ff","c2":"#0000ffff","out":{"hex":"#000040ff","u16":[0,0,16384,65535]}}, +{"bias":0.5,"c1":"#000000ff","c2":"#0000ffff","out":{"hex":"#000080ff","u16":[0,0,32768,65535]}}, +{"bias":0.75,"c1":"#000000ff","c2":"#0000ffff","out":{"hex":"#0000bfff","u16":[0,0,49151,65535]}}, +{"bias":0.9,"c1":"#000000ff","c2":"#0000ffff","out":{"hex":"#0000e6ff","u16":[0,0,58982,65535]}}, +{"bias":1,"c1":"#000000ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":1.5,"c1":"#000000ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":-0.5,"c1":"#000000ff","c2":"#ffff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0,"c1":"#000000ff","c2":"#ffff00ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.1,"c1":"#000000ff","c2":"#ffff00ff","out":{"hex":"#1a1a00ff","u16":[6554,6554,0,65535]}}, +{"bias":0.25,"c1":"#000000ff","c2":"#ffff00ff","out":{"hex":"#404000ff","u16":[16384,16384,0,65535]}}, +{"bias":0.5,"c1":"#000000ff","c2":"#ffff00ff","out":{"hex":"#808000ff","u16":[32768,32768,0,65535]}}, +{"bias":0.75,"c1":"#000000ff","c2":"#ffff00ff","out":{"hex":"#bfbf00ff","u16":[49151,49151,0,65535]}}, +{"bias":0.9,"c1":"#000000ff","c2":"#ffff00ff","out":{"hex":"#e6e600ff","u16":[58982,58982,0,65535]}}, +{"bias":1,"c1":"#000000ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":1.5,"c1":"#000000ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":-0.5,"c1":"#000000ff","c2":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0,"c1":"#000000ff","c2":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.1,"c1":"#000000ff","c2":"#030201ff","out":{"hex":"#000000ff","u16":[77,51,26,65535]}}, +{"bias":0.25,"c1":"#000000ff","c2":"#030201ff","out":{"hex":"#010100ff","u16":[193,129,64,65535]}}, +{"bias":0.5,"c1":"#000000ff","c2":"#030201ff","out":{"hex":"#020101ff","u16":[386,257,129,65535]}}, +{"bias":0.75,"c1":"#000000ff","c2":"#030201ff","out":{"hex":"#020201ff","u16":[578,386,193,65535]}}, +{"bias":0.9,"c1":"#000000ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[694,463,231,65535]}}, +{"bias":1,"c1":"#000000ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":1.5,"c1":"#000000ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":-0.5,"c1":"#000000ff","c2":"#3daee9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0,"c1":"#000000ff","c2":"#3daee9ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.1,"c1":"#000000ff","c2":"#3daee9ff","out":{"hex":"#061117ff","u16":[1568,4472,5988,65535]}}, +{"bias":0.25,"c1":"#000000ff","c2":"#3daee9ff","out":{"hex":"#0f2c3aff","u16":[3919,11180,14970,65535]}}, +{"bias":0.5,"c1":"#000000ff","c2":"#3daee9ff","out":{"hex":"#1f5775ff","u16":[7839,22359,29941,65535]}}, +{"bias":0.75,"c1":"#000000ff","c2":"#3daee9ff","out":{"hex":"#2e83afff","u16":[11758,33539,44911,65535]}}, +{"bias":0.9,"c1":"#000000ff","c2":"#3daee9ff","out":{"hex":"#379dd2ff","u16":[14109,40246,53893,65535]}}, +{"bias":1,"c1":"#000000ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":1.5,"c1":"#000000ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":-0.5,"c1":"#000000ff","c2":"#232629ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0,"c1":"#000000ff","c2":"#232629ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.1,"c1":"#000000ff","c2":"#232629ff","out":{"hex":"#040404ff","u16":[900,977,1054,65535]}}, +{"bias":0.25,"c1":"#000000ff","c2":"#232629ff","out":{"hex":"#090a0aff","u16":[2249,2442,2634,65535]}}, +{"bias":0.5,"c1":"#000000ff","c2":"#232629ff","out":{"hex":"#121315ff","u16":[4498,4883,5269,65535]}}, +{"bias":0.75,"c1":"#000000ff","c2":"#232629ff","out":{"hex":"#1a1d1fff","u16":[6746,7325,7903,65535]}}, +{"bias":0.9,"c1":"#000000ff","c2":"#232629ff","out":{"hex":"#202225ff","u16":[8096,8789,9483,65535]}}, +{"bias":1,"c1":"#000000ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":1.5,"c1":"#000000ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":-0.5,"c1":"#000000ff","c2":"#eff0f1ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0,"c1":"#000000ff","c2":"#eff0f1ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.1,"c1":"#000000ff","c2":"#eff0f1ff","out":{"hex":"#181818ff","u16":[6142,6168,6194,65535]}}, +{"bias":0.25,"c1":"#000000ff","c2":"#eff0f1ff","out":{"hex":"#3c3c3cff","u16":[15356,15420,15484,65535]}}, +{"bias":0.5,"c1":"#000000ff","c2":"#eff0f1ff","out":{"hex":"#787879ff","u16":[30712,30840,30969,65535]}}, +{"bias":0.75,"c1":"#000000ff","c2":"#eff0f1ff","out":{"hex":"#b3b4b5ff","u16":[46067,46260,46453,65535]}}, +{"bias":0.9,"c1":"#000000ff","c2":"#eff0f1ff","out":{"hex":"#d7d8d9ff","u16":[55281,55512,55743,65535]}}, +{"bias":1,"c1":"#000000ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":1.5,"c1":"#000000ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":-0.5,"c1":"#000000ff","c2":"#fcfcfcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0,"c1":"#000000ff","c2":"#fcfcfcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.1,"c1":"#000000ff","c2":"#fcfcfcff","out":{"hex":"#191919ff","u16":[6476,6476,6476,65535]}}, +{"bias":0.25,"c1":"#000000ff","c2":"#fcfcfcff","out":{"hex":"#3f3f3fff","u16":[16191,16191,16191,65535]}}, +{"bias":0.5,"c1":"#000000ff","c2":"#fcfcfcff","out":{"hex":"#7e7e7eff","u16":[32382,32382,32382,65535]}}, +{"bias":0.75,"c1":"#000000ff","c2":"#fcfcfcff","out":{"hex":"#bdbdbdff","u16":[48573,48573,48573,65535]}}, +{"bias":0.9,"c1":"#000000ff","c2":"#fcfcfcff","out":{"hex":"#e3e3e3ff","u16":[58288,58288,58288,65535]}}, +{"bias":1,"c1":"#000000ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":1.5,"c1":"#000000ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":-0.5,"c1":"#000000ff","c2":"#da4453ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0,"c1":"#000000ff","c2":"#da4453ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.1,"c1":"#000000ff","c2":"#da4453ff","out":{"hex":"#160708ff","u16":[5603,1748,2133,65535]}}, +{"bias":0.25,"c1":"#000000ff","c2":"#da4453ff","out":{"hex":"#371115ff","u16":[14007,4369,5333,65535]}}, +{"bias":0.5,"c1":"#000000ff","c2":"#da4453ff","out":{"hex":"#6d222aff","u16":[28013,8738,10666,65535]}}, +{"bias":0.75,"c1":"#000000ff","c2":"#da4453ff","out":{"hex":"#a4333eff","u16":[42020,13107,15998,65535]}}, +{"bias":0.9,"c1":"#000000ff","c2":"#da4453ff","out":{"hex":"#c43d4bff","u16":[50423,15728,19198,65535]}}, +{"bias":1,"c1":"#000000ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":1.5,"c1":"#000000ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":-0.5,"c1":"#000000ff","c2":"#e8cb2dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0,"c1":"#000000ff","c2":"#e8cb2dff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.1,"c1":"#000000ff","c2":"#e8cb2dff","out":{"hex":"#171405ff","u16":[5962,5217,1157,65535]}}, +{"bias":0.25,"c1":"#000000ff","c2":"#e8cb2dff","out":{"hex":"#3a330bff","u16":[14906,13043,2891,65535]}}, +{"bias":0.5,"c1":"#000000ff","c2":"#e8cb2dff","out":{"hex":"#746617ff","u16":[29812,26086,5783,65535]}}, +{"bias":0.75,"c1":"#000000ff","c2":"#e8cb2dff","out":{"hex":"#ae9822ff","u16":[44718,39128,8674,65535]}}, +{"bias":0.9,"c1":"#000000ff","c2":"#e8cb2dff","out":{"hex":"#d1b729ff","u16":[53662,46954,10409,65535]}}, +{"bias":1,"c1":"#000000ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":1.5,"c1":"#000000ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":-0.5,"c1":"#000000ff","c2":"#3daee980","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0,"c1":"#000000ff","c2":"#3daee980","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.1,"c1":"#000000ff","c2":"#3daee980","out":{"hex":"#03090cf2","u16":[828,2362,3163,62271]}}, +{"bias":0.25,"c1":"#000000ff","c2":"#3daee980","out":{"hex":"#091921df","u16":[2247,6410,8583,57375]}}, +{"bias":0.5,"c1":"#000000ff","c2":"#3daee980","out":{"hex":"#143a4ec0","u16":[5239,14945,20012,49216]}}, +{"bias":0.75,"c1":"#000000ff","c2":"#3daee980","out":{"hex":"#25698ca0","u16":[9421,26873,35985,41056]}}, +{"bias":0.9,"c1":"#000000ff","c2":"#3daee980","out":{"hex":"#328ebf8d","u16":[12836,36613,49028,36160]}}, +{"bias":1,"c1":"#000000ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":1.5,"c1":"#000000ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":-0.5,"c1":"#000000ff","c2":"#ffffff00","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0,"c1":"#000000ff","c2":"#ffffff00","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":0.1,"c1":"#000000ff","c2":"#ffffff00","out":{"hex":"#000000e6","u16":[0,0,0,58982]}}, +{"bias":0.25,"c1":"#000000ff","c2":"#ffffff00","out":{"hex":"#000000bf","u16":[0,0,0,49151]}}, +{"bias":0.5,"c1":"#000000ff","c2":"#ffffff00","out":{"hex":"#00000080","u16":[0,0,0,32768]}}, +{"bias":0.75,"c1":"#000000ff","c2":"#ffffff00","out":{"hex":"#00000040","u16":[0,0,0,16384]}}, +{"bias":0.9,"c1":"#000000ff","c2":"#ffffff00","out":{"hex":"#0000001a","u16":[0,0,0,6554]}}, +{"bias":1,"c1":"#000000ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":1.5,"c1":"#000000ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":-0.5,"c1":"#ffffffff","c2":"#000000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0,"c1":"#ffffffff","c2":"#000000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.1,"c1":"#ffffffff","c2":"#000000ff","out":{"hex":"#e6e6e6ff","u16":[58982,58982,58982,65535]}}, +{"bias":0.25,"c1":"#ffffffff","c2":"#000000ff","out":{"hex":"#bfbfbfff","u16":[49151,49151,49151,65535]}}, +{"bias":0.5,"c1":"#ffffffff","c2":"#000000ff","out":{"hex":"#808080ff","u16":[32768,32768,32768,65535]}}, +{"bias":0.75,"c1":"#ffffffff","c2":"#000000ff","out":{"hex":"#404040ff","u16":[16384,16384,16384,65535]}}, +{"bias":0.9,"c1":"#ffffffff","c2":"#000000ff","out":{"hex":"#1a1a1aff","u16":[6554,6554,6554,65535]}}, +{"bias":1,"c1":"#ffffffff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":1.5,"c1":"#ffffffff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":-0.5,"c1":"#ffffffff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0,"c1":"#ffffffff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.1,"c1":"#ffffffff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.25,"c1":"#ffffffff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.5,"c1":"#ffffffff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.75,"c1":"#ffffffff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.9,"c1":"#ffffffff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":1,"c1":"#ffffffff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":1.5,"c1":"#ffffffff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":-0.5,"c1":"#ffffffff","c2":"#7f7f7fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0,"c1":"#ffffffff","c2":"#7f7f7fff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.1,"c1":"#ffffffff","c2":"#7f7f7fff","out":{"hex":"#f2f2f2ff","u16":[62245,62245,62245,65535]}}, +{"bias":0.25,"c1":"#ffffffff","c2":"#7f7f7fff","out":{"hex":"#dfdfdfff","u16":[57311,57311,57311,65535]}}, +{"bias":0.5,"c1":"#ffffffff","c2":"#7f7f7fff","out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]}}, +{"bias":0.75,"c1":"#ffffffff","c2":"#7f7f7fff","out":{"hex":"#9f9f9fff","u16":[40863,40863,40863,65535]}}, +{"bias":0.9,"c1":"#ffffffff","c2":"#7f7f7fff","out":{"hex":"#8c8c8cff","u16":[35929,35929,35929,65535]}}, +{"bias":1,"c1":"#ffffffff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":1.5,"c1":"#ffffffff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":-0.5,"c1":"#ffffffff","c2":"#808080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0,"c1":"#ffffffff","c2":"#808080ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.1,"c1":"#ffffffff","c2":"#808080ff","out":{"hex":"#f2f2f2ff","u16":[62271,62271,62271,65535]}}, +{"bias":0.25,"c1":"#ffffffff","c2":"#808080ff","out":{"hex":"#dfdfdfff","u16":[57375,57375,57375,65535]}}, +{"bias":0.5,"c1":"#ffffffff","c2":"#808080ff","out":{"hex":"#c0c0c0ff","u16":[49216,49216,49216,65535]}}, +{"bias":0.75,"c1":"#ffffffff","c2":"#808080ff","out":{"hex":"#a0a0a0ff","u16":[41056,41056,41056,65535]}}, +{"bias":0.9,"c1":"#ffffffff","c2":"#808080ff","out":{"hex":"#8d8d8dff","u16":[36160,36160,36160,65535]}}, +{"bias":1,"c1":"#ffffffff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":1.5,"c1":"#ffffffff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":-0.5,"c1":"#ffffffff","c2":"#ff0000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0,"c1":"#ffffffff","c2":"#ff0000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.1,"c1":"#ffffffff","c2":"#ff0000ff","out":{"hex":"#ffe6e6ff","u16":[65535,58982,58982,65535]}}, +{"bias":0.25,"c1":"#ffffffff","c2":"#ff0000ff","out":{"hex":"#ffbfbfff","u16":[65535,49151,49151,65535]}}, +{"bias":0.5,"c1":"#ffffffff","c2":"#ff0000ff","out":{"hex":"#ff8080ff","u16":[65535,32768,32768,65535]}}, +{"bias":0.75,"c1":"#ffffffff","c2":"#ff0000ff","out":{"hex":"#ff4040ff","u16":[65535,16384,16384,65535]}}, +{"bias":0.9,"c1":"#ffffffff","c2":"#ff0000ff","out":{"hex":"#ff1a1aff","u16":[65535,6554,6554,65535]}}, +{"bias":1,"c1":"#ffffffff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":1.5,"c1":"#ffffffff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":-0.5,"c1":"#ffffffff","c2":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0,"c1":"#ffffffff","c2":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.1,"c1":"#ffffffff","c2":"#00ff00ff","out":{"hex":"#e6ffe6ff","u16":[58982,65535,58982,65535]}}, +{"bias":0.25,"c1":"#ffffffff","c2":"#00ff00ff","out":{"hex":"#bfffbfff","u16":[49151,65535,49151,65535]}}, +{"bias":0.5,"c1":"#ffffffff","c2":"#00ff00ff","out":{"hex":"#80ff80ff","u16":[32768,65535,32768,65535]}}, +{"bias":0.75,"c1":"#ffffffff","c2":"#00ff00ff","out":{"hex":"#40ff40ff","u16":[16384,65535,16384,65535]}}, +{"bias":0.9,"c1":"#ffffffff","c2":"#00ff00ff","out":{"hex":"#1aff1aff","u16":[6554,65535,6554,65535]}}, +{"bias":1,"c1":"#ffffffff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":1.5,"c1":"#ffffffff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":-0.5,"c1":"#ffffffff","c2":"#0000ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0,"c1":"#ffffffff","c2":"#0000ffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.1,"c1":"#ffffffff","c2":"#0000ffff","out":{"hex":"#e6e6ffff","u16":[58982,58982,65535,65535]}}, +{"bias":0.25,"c1":"#ffffffff","c2":"#0000ffff","out":{"hex":"#bfbfffff","u16":[49151,49151,65535,65535]}}, +{"bias":0.5,"c1":"#ffffffff","c2":"#0000ffff","out":{"hex":"#8080ffff","u16":[32768,32768,65535,65535]}}, +{"bias":0.75,"c1":"#ffffffff","c2":"#0000ffff","out":{"hex":"#4040ffff","u16":[16384,16384,65535,65535]}}, +{"bias":0.9,"c1":"#ffffffff","c2":"#0000ffff","out":{"hex":"#1a1affff","u16":[6554,6554,65535,65535]}}, +{"bias":1,"c1":"#ffffffff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":1.5,"c1":"#ffffffff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":-0.5,"c1":"#ffffffff","c2":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0,"c1":"#ffffffff","c2":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.1,"c1":"#ffffffff","c2":"#ffff00ff","out":{"hex":"#ffffe6ff","u16":[65535,65535,58982,65535]}}, +{"bias":0.25,"c1":"#ffffffff","c2":"#ffff00ff","out":{"hex":"#ffffbfff","u16":[65535,65535,49151,65535]}}, +{"bias":0.5,"c1":"#ffffffff","c2":"#ffff00ff","out":{"hex":"#ffff80ff","u16":[65535,65535,32768,65535]}}, +{"bias":0.75,"c1":"#ffffffff","c2":"#ffff00ff","out":{"hex":"#ffff40ff","u16":[65535,65535,16384,65535]}}, +{"bias":0.9,"c1":"#ffffffff","c2":"#ffff00ff","out":{"hex":"#ffff1aff","u16":[65535,65535,6554,65535]}}, +{"bias":1,"c1":"#ffffffff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":1.5,"c1":"#ffffffff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":-0.5,"c1":"#ffffffff","c2":"#030201ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0,"c1":"#ffffffff","c2":"#030201ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.1,"c1":"#ffffffff","c2":"#030201ff","out":{"hex":"#e6e6e6ff","u16":[59059,59033,59007,65535]}}, +{"bias":0.25,"c1":"#ffffffff","c2":"#030201ff","out":{"hex":"#c0c0c0ff","u16":[49344,49280,49216,65535]}}, +{"bias":0.5,"c1":"#ffffffff","c2":"#030201ff","out":{"hex":"#818180ff","u16":[33153,33025,32896,65535]}}, +{"bias":0.75,"c1":"#ffffffff","c2":"#030201ff","out":{"hex":"#424141ff","u16":[16962,16769,16577,65535]}}, +{"bias":0.9,"c1":"#ffffffff","c2":"#030201ff","out":{"hex":"#1c1b1aff","u16":[7247,7016,6785,65535]}}, +{"bias":1,"c1":"#ffffffff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":1.5,"c1":"#ffffffff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":-0.5,"c1":"#ffffffff","c2":"#3daee9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0,"c1":"#ffffffff","c2":"#3daee9ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.1,"c1":"#ffffffff","c2":"#3daee9ff","out":{"hex":"#ecf7fdff","u16":[60549,63453,64970,65535]}}, +{"bias":0.25,"c1":"#ffffffff","c2":"#3daee9ff","out":{"hex":"#cfebfaff","u16":[53071,60331,64122,65535]}}, +{"bias":0.5,"c1":"#ffffffff","c2":"#3daee9ff","out":{"hex":"#9ed7f4ff","u16":[40606,55127,62708,65535]}}, +{"bias":0.75,"c1":"#ffffffff","c2":"#3daee9ff","out":{"hex":"#6ec2efff","u16":[28142,49922,61295,65535]}}, +{"bias":0.9,"c1":"#ffffffff","c2":"#3daee9ff","out":{"hex":"#50b6ebff","u16":[20663,46800,60446,65535]}}, +{"bias":1,"c1":"#ffffffff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":1.5,"c1":"#ffffffff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":-0.5,"c1":"#ffffffff","c2":"#232629ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0,"c1":"#ffffffff","c2":"#232629ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.1,"c1":"#ffffffff","c2":"#232629ff","out":{"hex":"#e9e9eaff","u16":[59881,59958,60035,65535]}}, +{"bias":0.25,"c1":"#ffffffff","c2":"#232629ff","out":{"hex":"#c8c9caff","u16":[51400,51593,51786,65535]}}, +{"bias":0.5,"c1":"#ffffffff","c2":"#232629ff","out":{"hex":"#919394ff","u16":[37265,37651,38036,65535]}}, +{"bias":0.75,"c1":"#ffffffff","c2":"#232629ff","out":{"hex":"#5a5c5fff","u16":[23130,23708,24287,65535]}}, +{"bias":0.9,"c1":"#ffffffff","c2":"#232629ff","out":{"hex":"#393c3eff","u16":[14649,15343,16037,65535]}}, +{"bias":1,"c1":"#ffffffff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":1.5,"c1":"#ffffffff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":-0.5,"c1":"#ffffffff","c2":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0,"c1":"#ffffffff","c2":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.1,"c1":"#ffffffff","c2":"#eff0f1ff","out":{"hex":"#fdfefeff","u16":[65124,65150,65175,65535]}}, +{"bias":0.25,"c1":"#ffffffff","c2":"#eff0f1ff","out":{"hex":"#fbfbfcff","u16":[64507,64571,64636,65535]}}, +{"bias":0.5,"c1":"#ffffffff","c2":"#eff0f1ff","out":{"hex":"#f7f8f8ff","u16":[63479,63608,63736,65535]}}, +{"bias":0.75,"c1":"#ffffffff","c2":"#eff0f1ff","out":{"hex":"#f3f4f5ff","u16":[62451,62644,62837,65535]}}, +{"bias":0.9,"c1":"#ffffffff","c2":"#eff0f1ff","out":{"hex":"#f1f2f2ff","u16":[61834,62066,62297,65535]}}, +{"bias":1,"c1":"#ffffffff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":1.5,"c1":"#ffffffff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":-0.5,"c1":"#ffffffff","c2":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0,"c1":"#ffffffff","c2":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.1,"c1":"#ffffffff","c2":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65458,65458,65458,65535]}}, +{"bias":0.25,"c1":"#ffffffff","c2":"#fcfcfcff","out":{"hex":"#fefefeff","u16":[65342,65342,65342,65535]}}, +{"bias":0.5,"c1":"#ffffffff","c2":"#fcfcfcff","out":{"hex":"#fefefeff","u16":[65150,65150,65150,65535]}}, +{"bias":0.75,"c1":"#ffffffff","c2":"#fcfcfcff","out":{"hex":"#fdfdfdff","u16":[64957,64957,64957,65535]}}, +{"bias":0.9,"c1":"#ffffffff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64841,64841,64841,65535]}}, +{"bias":1,"c1":"#ffffffff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":1.5,"c1":"#ffffffff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":-0.5,"c1":"#ffffffff","c2":"#da4453ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0,"c1":"#ffffffff","c2":"#da4453ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.1,"c1":"#ffffffff","c2":"#da4453ff","out":{"hex":"#fbeceeff","u16":[64584,60729,61115,65535]}}, +{"bias":0.25,"c1":"#ffffffff","c2":"#da4453ff","out":{"hex":"#f6d0d4ff","u16":[63158,53520,54484,65535]}}, +{"bias":0.5,"c1":"#ffffffff","c2":"#da4453ff","out":{"hex":"#eda2a9ff","u16":[60781,41506,43433,65535]}}, +{"bias":0.75,"c1":"#ffffffff","c2":"#da4453ff","out":{"hex":"#e3737eff","u16":[58403,29491,32382,65535]}}, +{"bias":0.9,"c1":"#ffffffff","c2":"#da4453ff","out":{"hex":"#de5764ff","u16":[56977,22282,25751,65535]}}, +{"bias":1,"c1":"#ffffffff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":1.5,"c1":"#ffffffff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":-0.5,"c1":"#ffffffff","c2":"#e8cb2dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0,"c1":"#ffffffff","c2":"#e8cb2dff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.1,"c1":"#ffffffff","c2":"#e8cb2dff","out":{"hex":"#fdfaeaff","u16":[64944,64199,60138,65535]}}, +{"bias":0.25,"c1":"#ffffffff","c2":"#e8cb2dff","out":{"hex":"#f9f2cbff","u16":[64057,62194,52043,65535]}}, +{"bias":0.5,"c1":"#ffffffff","c2":"#e8cb2dff","out":{"hex":"#f4e596ff","u16":[62580,58853,38550,65535]}}, +{"bias":0.75,"c1":"#ffffffff","c2":"#e8cb2dff","out":{"hex":"#eed862ff","u16":[61102,55512,25058,65535]}}, +{"bias":0.9,"c1":"#ffffffff","c2":"#e8cb2dff","out":{"hex":"#ead042ff","u16":[60215,53507,16962,65535]}}, +{"bias":1,"c1":"#ffffffff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":1.5,"c1":"#ffffffff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":-0.5,"c1":"#ffffffff","c2":"#3daee980","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0,"c1":"#ffffffff","c2":"#3daee980","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.1,"c1":"#ffffffff","c2":"#3daee980","out":{"hex":"#f5fbfef2","u16":[62901,64435,65236,62271]}}, +{"bias":0.25,"c1":"#ffffffff","c2":"#3daee980","out":{"hex":"#e3f3fcdf","u16":[58389,62551,64725,57375]}}, +{"bias":0.5,"c1":"#ffffffff","c2":"#3daee980","out":{"hex":"#bee4f8c0","u16":[48872,58578,63645,49216]}}, +{"bias":0.75,"c1":"#ffffffff","c2":"#3daee980","out":{"hex":"#8acef2a0","u16":[35573,53025,62137,41056]}}, +{"bias":0.9,"c1":"#ffffffff","c2":"#3daee980","out":{"hex":"#60bded8d","u16":[24713,48491,60906,36160]}}, +{"bias":1,"c1":"#ffffffff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":1.5,"c1":"#ffffffff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":-0.5,"c1":"#ffffffff","c2":"#ffffff00","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0,"c1":"#ffffffff","c2":"#ffffff00","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":0.1,"c1":"#ffffffff","c2":"#ffffff00","out":{"hex":"#ffffffe6","u16":[65535,65535,65535,58982]}}, +{"bias":0.25,"c1":"#ffffffff","c2":"#ffffff00","out":{"hex":"#ffffffbf","u16":[65535,65535,65535,49151]}}, +{"bias":0.5,"c1":"#ffffffff","c2":"#ffffff00","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]}}, +{"bias":0.75,"c1":"#ffffffff","c2":"#ffffff00","out":{"hex":"#ffffff40","u16":[65535,65535,65535,16384]}}, +{"bias":0.9,"c1":"#ffffffff","c2":"#ffffff00","out":{"hex":"#ffffff1a","u16":[65535,65535,65535,6554]}}, +{"bias":1,"c1":"#ffffffff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":1.5,"c1":"#ffffffff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":-0.5,"c1":"#7f7f7fff","c2":"#000000ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0,"c1":"#7f7f7fff","c2":"#000000ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.1,"c1":"#7f7f7fff","c2":"#000000ff","out":{"hex":"#727272ff","u16":[29375,29375,29375,65535]}}, +{"bias":0.25,"c1":"#7f7f7fff","c2":"#000000ff","out":{"hex":"#5f5f5fff","u16":[24479,24479,24479,65535]}}, +{"bias":0.5,"c1":"#7f7f7fff","c2":"#000000ff","out":{"hex":"#404040ff","u16":[16320,16320,16320,65535]}}, +{"bias":0.75,"c1":"#7f7f7fff","c2":"#000000ff","out":{"hex":"#202020ff","u16":[8160,8160,8160,65535]}}, +{"bias":0.9,"c1":"#7f7f7fff","c2":"#000000ff","out":{"hex":"#0d0d0dff","u16":[3264,3264,3264,65535]}}, +{"bias":1,"c1":"#7f7f7fff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":1.5,"c1":"#7f7f7fff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":-0.5,"c1":"#7f7f7fff","c2":"#ffffffff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0,"c1":"#7f7f7fff","c2":"#ffffffff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.1,"c1":"#7f7f7fff","c2":"#ffffffff","out":{"hex":"#8c8c8cff","u16":[35929,35929,35929,65535]}}, +{"bias":0.25,"c1":"#7f7f7fff","c2":"#ffffffff","out":{"hex":"#9f9f9fff","u16":[40863,40863,40863,65535]}}, +{"bias":0.5,"c1":"#7f7f7fff","c2":"#ffffffff","out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]}}, +{"bias":0.75,"c1":"#7f7f7fff","c2":"#ffffffff","out":{"hex":"#dfdfdfff","u16":[57311,57311,57311,65535]}}, +{"bias":0.9,"c1":"#7f7f7fff","c2":"#ffffffff","out":{"hex":"#f2f2f2ff","u16":[62245,62245,62245,65535]}}, +{"bias":1,"c1":"#7f7f7fff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":1.5,"c1":"#7f7f7fff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":-0.5,"c1":"#7f7f7fff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0,"c1":"#7f7f7fff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.1,"c1":"#7f7f7fff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.25,"c1":"#7f7f7fff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.5,"c1":"#7f7f7fff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.75,"c1":"#7f7f7fff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.9,"c1":"#7f7f7fff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":1,"c1":"#7f7f7fff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":1.5,"c1":"#7f7f7fff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":-0.5,"c1":"#7f7f7fff","c2":"#808080ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0,"c1":"#7f7f7fff","c2":"#808080ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.1,"c1":"#7f7f7fff","c2":"#808080ff","out":{"hex":"#7f7f7fff","u16":[32665,32665,32665,65535]}}, +{"bias":0.25,"c1":"#7f7f7fff","c2":"#808080ff","out":{"hex":"#7f7f7fff","u16":[32703,32703,32703,65535]}}, +{"bias":0.5,"c1":"#7f7f7fff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32768,32768,32768,65535]}}, +{"bias":0.75,"c1":"#7f7f7fff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32832,32832,32832,65535]}}, +{"bias":0.9,"c1":"#7f7f7fff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32870,32870,32870,65535]}}, +{"bias":1,"c1":"#7f7f7fff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":1.5,"c1":"#7f7f7fff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":-0.5,"c1":"#7f7f7fff","c2":"#ff0000ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0,"c1":"#7f7f7fff","c2":"#ff0000ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.1,"c1":"#7f7f7fff","c2":"#ff0000ff","out":{"hex":"#8c7272ff","u16":[35929,29375,29375,65535]}}, +{"bias":0.25,"c1":"#7f7f7fff","c2":"#ff0000ff","out":{"hex":"#9f5f5fff","u16":[40863,24479,24479,65535]}}, +{"bias":0.5,"c1":"#7f7f7fff","c2":"#ff0000ff","out":{"hex":"#bf4040ff","u16":[49087,16320,16320,65535]}}, +{"bias":0.75,"c1":"#7f7f7fff","c2":"#ff0000ff","out":{"hex":"#df2020ff","u16":[57311,8160,8160,65535]}}, +{"bias":0.9,"c1":"#7f7f7fff","c2":"#ff0000ff","out":{"hex":"#f20d0dff","u16":[62245,3264,3264,65535]}}, +{"bias":1,"c1":"#7f7f7fff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":1.5,"c1":"#7f7f7fff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":-0.5,"c1":"#7f7f7fff","c2":"#00ff00ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0,"c1":"#7f7f7fff","c2":"#00ff00ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.1,"c1":"#7f7f7fff","c2":"#00ff00ff","out":{"hex":"#728c72ff","u16":[29375,35929,29375,65535]}}, +{"bias":0.25,"c1":"#7f7f7fff","c2":"#00ff00ff","out":{"hex":"#5f9f5fff","u16":[24479,40863,24479,65535]}}, +{"bias":0.5,"c1":"#7f7f7fff","c2":"#00ff00ff","out":{"hex":"#40bf40ff","u16":[16320,49087,16320,65535]}}, +{"bias":0.75,"c1":"#7f7f7fff","c2":"#00ff00ff","out":{"hex":"#20df20ff","u16":[8160,57311,8160,65535]}}, +{"bias":0.9,"c1":"#7f7f7fff","c2":"#00ff00ff","out":{"hex":"#0df20dff","u16":[3264,62245,3264,65535]}}, +{"bias":1,"c1":"#7f7f7fff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":1.5,"c1":"#7f7f7fff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":-0.5,"c1":"#7f7f7fff","c2":"#0000ffff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0,"c1":"#7f7f7fff","c2":"#0000ffff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.1,"c1":"#7f7f7fff","c2":"#0000ffff","out":{"hex":"#72728cff","u16":[29375,29375,35929,65535]}}, +{"bias":0.25,"c1":"#7f7f7fff","c2":"#0000ffff","out":{"hex":"#5f5f9fff","u16":[24479,24479,40863,65535]}}, +{"bias":0.5,"c1":"#7f7f7fff","c2":"#0000ffff","out":{"hex":"#4040bfff","u16":[16320,16320,49087,65535]}}, +{"bias":0.75,"c1":"#7f7f7fff","c2":"#0000ffff","out":{"hex":"#2020dfff","u16":[8160,8160,57311,65535]}}, +{"bias":0.9,"c1":"#7f7f7fff","c2":"#0000ffff","out":{"hex":"#0d0df2ff","u16":[3264,3264,62245,65535]}}, +{"bias":1,"c1":"#7f7f7fff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":1.5,"c1":"#7f7f7fff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":-0.5,"c1":"#7f7f7fff","c2":"#ffff00ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0,"c1":"#7f7f7fff","c2":"#ffff00ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.1,"c1":"#7f7f7fff","c2":"#ffff00ff","out":{"hex":"#8c8c72ff","u16":[35929,35929,29375,65535]}}, +{"bias":0.25,"c1":"#7f7f7fff","c2":"#ffff00ff","out":{"hex":"#9f9f5fff","u16":[40863,40863,24479,65535]}}, +{"bias":0.5,"c1":"#7f7f7fff","c2":"#ffff00ff","out":{"hex":"#bfbf40ff","u16":[49087,49087,16320,65535]}}, +{"bias":0.75,"c1":"#7f7f7fff","c2":"#ffff00ff","out":{"hex":"#dfdf20ff","u16":[57311,57311,8160,65535]}}, +{"bias":0.9,"c1":"#7f7f7fff","c2":"#ffff00ff","out":{"hex":"#f2f20dff","u16":[62245,62245,3264,65535]}}, +{"bias":1,"c1":"#7f7f7fff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":1.5,"c1":"#7f7f7fff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":-0.5,"c1":"#7f7f7fff","c2":"#030201ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0,"c1":"#7f7f7fff","c2":"#030201ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.1,"c1":"#7f7f7fff","c2":"#030201ff","out":{"hex":"#737372ff","u16":[29452,29427,29401,65535]}}, +{"bias":0.25,"c1":"#7f7f7fff","c2":"#030201ff","out":{"hex":"#606060ff","u16":[24672,24608,24544,65535]}}, +{"bias":0.5,"c1":"#7f7f7fff","c2":"#030201ff","out":{"hex":"#414140ff","u16":[16705,16577,16448,65535]}}, +{"bias":0.75,"c1":"#7f7f7fff","c2":"#030201ff","out":{"hex":"#222121ff","u16":[8738,8545,8353,65535]}}, +{"bias":0.9,"c1":"#7f7f7fff","c2":"#030201ff","out":{"hex":"#0f0f0eff","u16":[3958,3727,3495,65535]}}, +{"bias":1,"c1":"#7f7f7fff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":1.5,"c1":"#7f7f7fff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":-0.5,"c1":"#7f7f7fff","c2":"#3daee9ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0,"c1":"#7f7f7fff","c2":"#3daee9ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.1,"c1":"#7f7f7fff","c2":"#3daee9ff","out":{"hex":"#78848aff","u16":[30943,33847,35363,65535]}}, +{"bias":0.25,"c1":"#7f7f7fff","c2":"#3daee9ff","out":{"hex":"#6f8b9aff","u16":[28399,35659,39450,65535]}}, +{"bias":0.5,"c1":"#7f7f7fff","c2":"#3daee9ff","out":{"hex":"#5e97b4ff","u16":[24158,38679,46260,65535]}}, +{"bias":0.75,"c1":"#7f7f7fff","c2":"#3daee9ff","out":{"hex":"#4ea2cfff","u16":[19918,41698,53071,65535]}}, +{"bias":0.9,"c1":"#7f7f7fff","c2":"#3daee9ff","out":{"hex":"#44a9deff","u16":[17373,43510,57157,65535]}}, +{"bias":1,"c1":"#7f7f7fff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":1.5,"c1":"#7f7f7fff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":-0.5,"c1":"#7f7f7fff","c2":"#232629ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0,"c1":"#7f7f7fff","c2":"#232629ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.1,"c1":"#7f7f7fff","c2":"#232629ff","out":{"hex":"#767676ff","u16":[30275,30352,30429,65535]}}, +{"bias":0.25,"c1":"#7f7f7fff","c2":"#232629ff","out":{"hex":"#68696aff","u16":[26728,26921,27114,65535]}}, +{"bias":0.5,"c1":"#7f7f7fff","c2":"#232629ff","out":{"hex":"#515354ff","u16":[20817,21203,21588,65535]}}, +{"bias":0.75,"c1":"#7f7f7fff","c2":"#232629ff","out":{"hex":"#3a3c3fff","u16":[14906,15484,16063,65535]}}, +{"bias":0.9,"c1":"#7f7f7fff","c2":"#232629ff","out":{"hex":"#2c2f32ff","u16":[11359,12053,12747,65535]}}, +{"bias":1,"c1":"#7f7f7fff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":1.5,"c1":"#7f7f7fff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":-0.5,"c1":"#7f7f7fff","c2":"#eff0f1ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0,"c1":"#7f7f7fff","c2":"#eff0f1ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.1,"c1":"#7f7f7fff","c2":"#eff0f1ff","out":{"hex":"#8a8a8aff","u16":[35517,35543,35569,65535]}}, +{"bias":0.25,"c1":"#7f7f7fff","c2":"#eff0f1ff","out":{"hex":"#9b9b9cff","u16":[39835,39899,39964,65535]}}, +{"bias":0.5,"c1":"#7f7f7fff","c2":"#eff0f1ff","out":{"hex":"#b7b8b8ff","u16":[47031,47160,47288,65535]}}, +{"bias":0.75,"c1":"#7f7f7fff","c2":"#eff0f1ff","out":{"hex":"#d3d4d5ff","u16":[54227,54420,54613,65535]}}, +{"bias":0.9,"c1":"#7f7f7fff","c2":"#eff0f1ff","out":{"hex":"#e4e5e6ff","u16":[58545,58776,59007,65535]}}, +{"bias":1,"c1":"#7f7f7fff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":1.5,"c1":"#7f7f7fff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":-0.5,"c1":"#7f7f7fff","c2":"#fcfcfcff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0,"c1":"#7f7f7fff","c2":"#fcfcfcff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.1,"c1":"#7f7f7fff","c2":"#fcfcfcff","out":{"hex":"#8c8c8cff","u16":[35852,35852,35852,65535]}}, +{"bias":0.25,"c1":"#7f7f7fff","c2":"#fcfcfcff","out":{"hex":"#9e9e9eff","u16":[40670,40670,40670,65535]}}, +{"bias":0.5,"c1":"#7f7f7fff","c2":"#fcfcfcff","out":{"hex":"#bebebeff","u16":[48702,48702,48702,65535]}}, +{"bias":0.75,"c1":"#7f7f7fff","c2":"#fcfcfcff","out":{"hex":"#ddddddff","u16":[56733,56733,56733,65535]}}, +{"bias":0.9,"c1":"#7f7f7fff","c2":"#fcfcfcff","out":{"hex":"#f0f0f0ff","u16":[61552,61552,61552,65535]}}, +{"bias":1,"c1":"#7f7f7fff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":1.5,"c1":"#7f7f7fff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":-0.5,"c1":"#7f7f7fff","c2":"#da4453ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0,"c1":"#7f7f7fff","c2":"#da4453ff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.1,"c1":"#7f7f7fff","c2":"#da4453ff","out":{"hex":"#88797bff","u16":[34978,31123,31508,65535]}}, +{"bias":0.25,"c1":"#7f7f7fff","c2":"#da4453ff","out":{"hex":"#967074ff","u16":[38486,28848,29812,65535]}}, +{"bias":0.5,"c1":"#7f7f7fff","c2":"#da4453ff","out":{"hex":"#ad6269ff","u16":[44333,25058,26985,65535]}}, +{"bias":0.75,"c1":"#7f7f7fff","c2":"#da4453ff","out":{"hex":"#c3535eff","u16":[50179,21267,24158,65535]}}, +{"bias":0.9,"c1":"#7f7f7fff","c2":"#da4453ff","out":{"hex":"#d14a57ff","u16":[53687,18992,22462,65535]}}, +{"bias":1,"c1":"#7f7f7fff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":1.5,"c1":"#7f7f7fff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":-0.5,"c1":"#7f7f7fff","c2":"#e8cb2dff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0,"c1":"#7f7f7fff","c2":"#e8cb2dff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.1,"c1":"#7f7f7fff","c2":"#e8cb2dff","out":{"hex":"#8a8777ff","u16":[35338,34592,30532,65535]}}, +{"bias":0.25,"c1":"#7f7f7fff","c2":"#e8cb2dff","out":{"hex":"#99926bff","u16":[39385,37522,27371,65535]}}, +{"bias":0.5,"c1":"#7f7f7fff","c2":"#e8cb2dff","out":{"hex":"#b4a556ff","u16":[46132,42405,22102,65535]}}, +{"bias":0.75,"c1":"#7f7f7fff","c2":"#e8cb2dff","out":{"hex":"#ceb842ff","u16":[52878,47288,16834,65535]}}, +{"bias":0.9,"c1":"#7f7f7fff","c2":"#e8cb2dff","out":{"hex":"#dec335ff","u16":[56926,50218,13672,65535]}}, +{"bias":1,"c1":"#7f7f7fff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":1.5,"c1":"#7f7f7fff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":-0.5,"c1":"#7f7f7fff","c2":"#3daee980","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0,"c1":"#7f7f7fff","c2":"#3daee980","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.1,"c1":"#7f7f7fff","c2":"#3daee980","out":{"hex":"#7c8185f2","u16":[31743,33277,34078,62271]}}, +{"bias":0.25,"c1":"#7f7f7fff","c2":"#3daee980","out":{"hex":"#76868edf","u16":[30208,34370,36544,57375]}}, +{"bias":0.5,"c1":"#7f7f7fff","c2":"#3daee980","out":{"hex":"#698fa2c0","u16":[26970,36676,41743,49216]}}, +{"bias":0.75,"c1":"#7f7f7fff","c2":"#3daee980","out":{"hex":"#579bbfa0","u16":[22446,39898,49010,41056]}}, +{"bias":0.9,"c1":"#7f7f7fff","c2":"#3daee980","out":{"hex":"#49a5d68d","u16":[18751,42529,54944,36160]}}, +{"bias":1,"c1":"#7f7f7fff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":1.5,"c1":"#7f7f7fff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":-0.5,"c1":"#7f7f7fff","c2":"#ffffff00","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0,"c1":"#7f7f7fff","c2":"#ffffff00","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":0.1,"c1":"#7f7f7fff","c2":"#ffffff00","out":{"hex":"#7f7f7fe6","u16":[32639,32639,32639,58982]}}, +{"bias":0.25,"c1":"#7f7f7fff","c2":"#ffffff00","out":{"hex":"#7f7f7fbf","u16":[32639,32639,32639,49151]}}, +{"bias":0.5,"c1":"#7f7f7fff","c2":"#ffffff00","out":{"hex":"#7f7f7f80","u16":[32639,32639,32639,32768]}}, +{"bias":0.75,"c1":"#7f7f7fff","c2":"#ffffff00","out":{"hex":"#7f7f7f40","u16":[32639,32639,32639,16384]}}, +{"bias":0.9,"c1":"#7f7f7fff","c2":"#ffffff00","out":{"hex":"#7f7f7f1a","u16":[32639,32639,32639,6554]}}, +{"bias":1,"c1":"#7f7f7fff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":1.5,"c1":"#7f7f7fff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":-0.5,"c1":"#808080ff","c2":"#000000ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0,"c1":"#808080ff","c2":"#000000ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.1,"c1":"#808080ff","c2":"#000000ff","out":{"hex":"#737373ff","u16":[29606,29606,29606,65535]}}, +{"bias":0.25,"c1":"#808080ff","c2":"#000000ff","out":{"hex":"#606060ff","u16":[24672,24672,24672,65535]}}, +{"bias":0.5,"c1":"#808080ff","c2":"#000000ff","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"bias":0.75,"c1":"#808080ff","c2":"#000000ff","out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"bias":0.9,"c1":"#808080ff","c2":"#000000ff","out":{"hex":"#0d0d0dff","u16":[3290,3290,3290,65535]}}, +{"bias":1,"c1":"#808080ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":1.5,"c1":"#808080ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":-0.5,"c1":"#808080ff","c2":"#ffffffff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0,"c1":"#808080ff","c2":"#ffffffff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.1,"c1":"#808080ff","c2":"#ffffffff","out":{"hex":"#8d8d8dff","u16":[36160,36160,36160,65535]}}, +{"bias":0.25,"c1":"#808080ff","c2":"#ffffffff","out":{"hex":"#a0a0a0ff","u16":[41056,41056,41056,65535]}}, +{"bias":0.5,"c1":"#808080ff","c2":"#ffffffff","out":{"hex":"#c0c0c0ff","u16":[49216,49216,49216,65535]}}, +{"bias":0.75,"c1":"#808080ff","c2":"#ffffffff","out":{"hex":"#dfdfdfff","u16":[57375,57375,57375,65535]}}, +{"bias":0.9,"c1":"#808080ff","c2":"#ffffffff","out":{"hex":"#f2f2f2ff","u16":[62271,62271,62271,65535]}}, +{"bias":1,"c1":"#808080ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":1.5,"c1":"#808080ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":-0.5,"c1":"#808080ff","c2":"#7f7f7fff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0,"c1":"#808080ff","c2":"#7f7f7fff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.1,"c1":"#808080ff","c2":"#7f7f7fff","out":{"hex":"#808080ff","u16":[32870,32870,32870,65535]}}, +{"bias":0.25,"c1":"#808080ff","c2":"#7f7f7fff","out":{"hex":"#808080ff","u16":[32832,32832,32832,65535]}}, +{"bias":0.5,"c1":"#808080ff","c2":"#7f7f7fff","out":{"hex":"#808080ff","u16":[32768,32768,32768,65535]}}, +{"bias":0.75,"c1":"#808080ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32703,32703,32703,65535]}}, +{"bias":0.9,"c1":"#808080ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32665,32665,32665,65535]}}, +{"bias":1,"c1":"#808080ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":1.5,"c1":"#808080ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":-0.5,"c1":"#808080ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0,"c1":"#808080ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.1,"c1":"#808080ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.25,"c1":"#808080ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.5,"c1":"#808080ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.75,"c1":"#808080ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.9,"c1":"#808080ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":1,"c1":"#808080ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":1.5,"c1":"#808080ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":-0.5,"c1":"#808080ff","c2":"#ff0000ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0,"c1":"#808080ff","c2":"#ff0000ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.1,"c1":"#808080ff","c2":"#ff0000ff","out":{"hex":"#8d7373ff","u16":[36160,29606,29606,65535]}}, +{"bias":0.25,"c1":"#808080ff","c2":"#ff0000ff","out":{"hex":"#a06060ff","u16":[41056,24672,24672,65535]}}, +{"bias":0.5,"c1":"#808080ff","c2":"#ff0000ff","out":{"hex":"#c04040ff","u16":[49216,16448,16448,65535]}}, +{"bias":0.75,"c1":"#808080ff","c2":"#ff0000ff","out":{"hex":"#df2020ff","u16":[57375,8224,8224,65535]}}, +{"bias":0.9,"c1":"#808080ff","c2":"#ff0000ff","out":{"hex":"#f20d0dff","u16":[62271,3290,3290,65535]}}, +{"bias":1,"c1":"#808080ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":1.5,"c1":"#808080ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":-0.5,"c1":"#808080ff","c2":"#00ff00ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0,"c1":"#808080ff","c2":"#00ff00ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.1,"c1":"#808080ff","c2":"#00ff00ff","out":{"hex":"#738d73ff","u16":[29606,36160,29606,65535]}}, +{"bias":0.25,"c1":"#808080ff","c2":"#00ff00ff","out":{"hex":"#60a060ff","u16":[24672,41056,24672,65535]}}, +{"bias":0.5,"c1":"#808080ff","c2":"#00ff00ff","out":{"hex":"#40c040ff","u16":[16448,49216,16448,65535]}}, +{"bias":0.75,"c1":"#808080ff","c2":"#00ff00ff","out":{"hex":"#20df20ff","u16":[8224,57375,8224,65535]}}, +{"bias":0.9,"c1":"#808080ff","c2":"#00ff00ff","out":{"hex":"#0df20dff","u16":[3290,62271,3290,65535]}}, +{"bias":1,"c1":"#808080ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":1.5,"c1":"#808080ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":-0.5,"c1":"#808080ff","c2":"#0000ffff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0,"c1":"#808080ff","c2":"#0000ffff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.1,"c1":"#808080ff","c2":"#0000ffff","out":{"hex":"#73738dff","u16":[29606,29606,36160,65535]}}, +{"bias":0.25,"c1":"#808080ff","c2":"#0000ffff","out":{"hex":"#6060a0ff","u16":[24672,24672,41056,65535]}}, +{"bias":0.5,"c1":"#808080ff","c2":"#0000ffff","out":{"hex":"#4040c0ff","u16":[16448,16448,49216,65535]}}, +{"bias":0.75,"c1":"#808080ff","c2":"#0000ffff","out":{"hex":"#2020dfff","u16":[8224,8224,57375,65535]}}, +{"bias":0.9,"c1":"#808080ff","c2":"#0000ffff","out":{"hex":"#0d0df2ff","u16":[3290,3290,62271,65535]}}, +{"bias":1,"c1":"#808080ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":1.5,"c1":"#808080ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":-0.5,"c1":"#808080ff","c2":"#ffff00ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0,"c1":"#808080ff","c2":"#ffff00ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.1,"c1":"#808080ff","c2":"#ffff00ff","out":{"hex":"#8d8d73ff","u16":[36160,36160,29606,65535]}}, +{"bias":0.25,"c1":"#808080ff","c2":"#ffff00ff","out":{"hex":"#a0a060ff","u16":[41056,41056,24672,65535]}}, +{"bias":0.5,"c1":"#808080ff","c2":"#ffff00ff","out":{"hex":"#c0c040ff","u16":[49216,49216,16448,65535]}}, +{"bias":0.75,"c1":"#808080ff","c2":"#ffff00ff","out":{"hex":"#dfdf20ff","u16":[57375,57375,8224,65535]}}, +{"bias":0.9,"c1":"#808080ff","c2":"#ffff00ff","out":{"hex":"#f2f20dff","u16":[62271,62271,3290,65535]}}, +{"bias":1,"c1":"#808080ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":1.5,"c1":"#808080ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":-0.5,"c1":"#808080ff","c2":"#030201ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0,"c1":"#808080ff","c2":"#030201ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.1,"c1":"#808080ff","c2":"#030201ff","out":{"hex":"#747373ff","u16":[29684,29658,29632,65535]}}, +{"bias":0.25,"c1":"#808080ff","c2":"#030201ff","out":{"hex":"#616160ff","u16":[24865,24801,24736,65535]}}, +{"bias":0.5,"c1":"#808080ff","c2":"#030201ff","out":{"hex":"#424141ff","u16":[16834,16705,16577,65535]}}, +{"bias":0.75,"c1":"#808080ff","c2":"#030201ff","out":{"hex":"#222221ff","u16":[8802,8610,8417,65535]}}, +{"bias":0.9,"c1":"#808080ff","c2":"#030201ff","out":{"hex":"#100f0eff","u16":[3984,3752,3521,65535]}}, +{"bias":1,"c1":"#808080ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":1.5,"c1":"#808080ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":-0.5,"c1":"#808080ff","c2":"#3daee9ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0,"c1":"#808080ff","c2":"#3daee9ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.1,"c1":"#808080ff","c2":"#3daee9ff","out":{"hex":"#79858bff","u16":[31174,34078,35595,65535]}}, +{"bias":0.25,"c1":"#808080ff","c2":"#3daee9ff","out":{"hex":"#6f8c9aff","u16":[28591,35852,39642,65535]}}, +{"bias":0.5,"c1":"#808080ff","c2":"#3daee9ff","out":{"hex":"#5f97b5ff","u16":[24287,38807,46389,65535]}}, +{"bias":0.75,"c1":"#808080ff","c2":"#3daee9ff","out":{"hex":"#4ea3cfff","u16":[19982,41763,53135,65535]}}, +{"bias":0.9,"c1":"#808080ff","c2":"#3daee9ff","out":{"hex":"#44a9dfff","u16":[17399,43536,57183,65535]}}, +{"bias":1,"c1":"#808080ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":1.5,"c1":"#808080ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":-0.5,"c1":"#808080ff","c2":"#232629ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0,"c1":"#808080ff","c2":"#232629ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.1,"c1":"#808080ff","c2":"#232629ff","out":{"hex":"#777777ff","u16":[30506,30583,30660,65535]}}, +{"bias":0.25,"c1":"#808080ff","c2":"#232629ff","out":{"hex":"#696a6aff","u16":[26921,27114,27306,65535]}}, +{"bias":0.5,"c1":"#808080ff","c2":"#232629ff","out":{"hex":"#525355ff","u16":[20946,21331,21717,65535]}}, +{"bias":0.75,"c1":"#808080ff","c2":"#232629ff","out":{"hex":"#3a3d3fff","u16":[14970,15549,16127,65535]}}, +{"bias":0.9,"c1":"#808080ff","c2":"#232629ff","out":{"hex":"#2c2f32ff","u16":[11385,12079,12773,65535]}}, +{"bias":1,"c1":"#808080ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":1.5,"c1":"#808080ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":-0.5,"c1":"#808080ff","c2":"#eff0f1ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0,"c1":"#808080ff","c2":"#eff0f1ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.1,"c1":"#808080ff","c2":"#eff0f1ff","out":{"hex":"#8b8b8bff","u16":[35749,35774,35800,65535]}}, +{"bias":0.25,"c1":"#808080ff","c2":"#eff0f1ff","out":{"hex":"#9c9c9cff","u16":[40028,40092,40156,65535]}}, +{"bias":0.5,"c1":"#808080ff","c2":"#eff0f1ff","out":{"hex":"#b8b8b9ff","u16":[47160,47288,47417,65535]}}, +{"bias":0.75,"c1":"#808080ff","c2":"#eff0f1ff","out":{"hex":"#d3d4d5ff","u16":[54291,54484,54677,65535]}}, +{"bias":0.9,"c1":"#808080ff","c2":"#eff0f1ff","out":{"hex":"#e4e5e6ff","u16":[58570,58802,59033,65535]}}, +{"bias":1,"c1":"#808080ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":1.5,"c1":"#808080ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":-0.5,"c1":"#808080ff","c2":"#fcfcfcff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0,"c1":"#808080ff","c2":"#fcfcfcff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.1,"c1":"#808080ff","c2":"#fcfcfcff","out":{"hex":"#8c8c8cff","u16":[36083,36083,36083,65535]}}, +{"bias":0.25,"c1":"#808080ff","c2":"#fcfcfcff","out":{"hex":"#9f9f9fff","u16":[40863,40863,40863,65535]}}, +{"bias":0.5,"c1":"#808080ff","c2":"#fcfcfcff","out":{"hex":"#bebebeff","u16":[48830,48830,48830,65535]}}, +{"bias":0.75,"c1":"#808080ff","c2":"#fcfcfcff","out":{"hex":"#ddddddff","u16":[56797,56797,56797,65535]}}, +{"bias":0.9,"c1":"#808080ff","c2":"#fcfcfcff","out":{"hex":"#f0f0f0ff","u16":[61577,61577,61577,65535]}}, +{"bias":1,"c1":"#808080ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":1.5,"c1":"#808080ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":-0.5,"c1":"#808080ff","c2":"#da4453ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0,"c1":"#808080ff","c2":"#da4453ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.1,"c1":"#808080ff","c2":"#da4453ff","out":{"hex":"#897a7cff","u16":[35209,31354,31740,65535]}}, +{"bias":0.25,"c1":"#808080ff","c2":"#da4453ff","out":{"hex":"#977175ff","u16":[38679,29041,30005,65535]}}, +{"bias":0.5,"c1":"#808080ff","c2":"#da4453ff","out":{"hex":"#ad626aff","u16":[44461,25186,27114,65535]}}, +{"bias":0.75,"c1":"#808080ff","c2":"#da4453ff","out":{"hex":"#c4535eff","u16":[50244,21331,24222,65535]}}, +{"bias":0.9,"c1":"#808080ff","c2":"#da4453ff","out":{"hex":"#d14a58ff","u16":[53713,19018,22488,65535]}}, +{"bias":1,"c1":"#808080ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":1.5,"c1":"#808080ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":-0.5,"c1":"#808080ff","c2":"#e8cb2dff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0,"c1":"#808080ff","c2":"#e8cb2dff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.1,"c1":"#808080ff","c2":"#e8cb2dff","out":{"hex":"#8a8878ff","u16":[35569,34824,30763,65535]}}, +{"bias":0.25,"c1":"#808080ff","c2":"#e8cb2dff","out":{"hex":"#9a936bff","u16":[39578,37715,27563,65535]}}, +{"bias":0.5,"c1":"#808080ff","c2":"#e8cb2dff","out":{"hex":"#b4a657ff","u16":[46260,42534,22231,65535]}}, +{"bias":0.75,"c1":"#808080ff","c2":"#e8cb2dff","out":{"hex":"#ceb842ff","u16":[52942,47352,16898,65535]}}, +{"bias":0.9,"c1":"#808080ff","c2":"#e8cb2dff","out":{"hex":"#dec435ff","u16":[56951,50244,13698,65535]}}, +{"bias":1,"c1":"#808080ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":1.5,"c1":"#808080ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":-0.5,"c1":"#808080ff","c2":"#3daee980","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0,"c1":"#808080ff","c2":"#3daee980","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.1,"c1":"#808080ff","c2":"#3daee980","out":{"hex":"#7c8286f2","u16":[31986,33521,34322,62271]}}, +{"bias":0.25,"c1":"#808080ff","c2":"#3daee980","out":{"hex":"#76878fdf","u16":[30428,34591,36764,57375]}}, +{"bias":0.5,"c1":"#808080ff","c2":"#3daee980","out":{"hex":"#6a8fa3c0","u16":[27141,36847,41914,49216]}}, +{"bias":0.75,"c1":"#808080ff","c2":"#3daee980","out":{"hex":"#589cbfa0","u16":[22548,40000,49112,41056]}}, +{"bias":0.9,"c1":"#808080ff","c2":"#3daee980","out":{"hex":"#49a6d68d","u16":[18798,42575,54990,36160]}}, +{"bias":1,"c1":"#808080ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":1.5,"c1":"#808080ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":-0.5,"c1":"#808080ff","c2":"#ffffff00","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0,"c1":"#808080ff","c2":"#ffffff00","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":0.1,"c1":"#808080ff","c2":"#ffffff00","out":{"hex":"#808080e6","u16":[32896,32896,32896,58982]}}, +{"bias":0.25,"c1":"#808080ff","c2":"#ffffff00","out":{"hex":"#808080bf","u16":[32896,32896,32896,49151]}}, +{"bias":0.5,"c1":"#808080ff","c2":"#ffffff00","out":{"hex":"#80808080","u16":[32896,32896,32896,32768]}}, +{"bias":0.75,"c1":"#808080ff","c2":"#ffffff00","out":{"hex":"#80808040","u16":[32896,32896,32896,16384]}}, +{"bias":0.9,"c1":"#808080ff","c2":"#ffffff00","out":{"hex":"#8080801a","u16":[32896,32896,32896,6554]}}, +{"bias":1,"c1":"#808080ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":1.5,"c1":"#808080ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":-0.5,"c1":"#ff0000ff","c2":"#000000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0,"c1":"#ff0000ff","c2":"#000000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.1,"c1":"#ff0000ff","c2":"#000000ff","out":{"hex":"#e60000ff","u16":[58982,0,0,65535]}}, +{"bias":0.25,"c1":"#ff0000ff","c2":"#000000ff","out":{"hex":"#bf0000ff","u16":[49151,0,0,65535]}}, +{"bias":0.5,"c1":"#ff0000ff","c2":"#000000ff","out":{"hex":"#800000ff","u16":[32768,0,0,65535]}}, +{"bias":0.75,"c1":"#ff0000ff","c2":"#000000ff","out":{"hex":"#400000ff","u16":[16384,0,0,65535]}}, +{"bias":0.9,"c1":"#ff0000ff","c2":"#000000ff","out":{"hex":"#1a0000ff","u16":[6554,0,0,65535]}}, +{"bias":1,"c1":"#ff0000ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":1.5,"c1":"#ff0000ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":-0.5,"c1":"#ff0000ff","c2":"#ffffffff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0,"c1":"#ff0000ff","c2":"#ffffffff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.1,"c1":"#ff0000ff","c2":"#ffffffff","out":{"hex":"#ff1a1aff","u16":[65535,6554,6554,65535]}}, +{"bias":0.25,"c1":"#ff0000ff","c2":"#ffffffff","out":{"hex":"#ff4040ff","u16":[65535,16384,16384,65535]}}, +{"bias":0.5,"c1":"#ff0000ff","c2":"#ffffffff","out":{"hex":"#ff8080ff","u16":[65535,32768,32768,65535]}}, +{"bias":0.75,"c1":"#ff0000ff","c2":"#ffffffff","out":{"hex":"#ffbfbfff","u16":[65535,49151,49151,65535]}}, +{"bias":0.9,"c1":"#ff0000ff","c2":"#ffffffff","out":{"hex":"#ffe6e6ff","u16":[65535,58982,58982,65535]}}, +{"bias":1,"c1":"#ff0000ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":1.5,"c1":"#ff0000ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":-0.5,"c1":"#ff0000ff","c2":"#7f7f7fff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0,"c1":"#ff0000ff","c2":"#7f7f7fff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.1,"c1":"#ff0000ff","c2":"#7f7f7fff","out":{"hex":"#f20d0dff","u16":[62245,3264,3264,65535]}}, +{"bias":0.25,"c1":"#ff0000ff","c2":"#7f7f7fff","out":{"hex":"#df2020ff","u16":[57311,8160,8160,65535]}}, +{"bias":0.5,"c1":"#ff0000ff","c2":"#7f7f7fff","out":{"hex":"#bf4040ff","u16":[49087,16320,16320,65535]}}, +{"bias":0.75,"c1":"#ff0000ff","c2":"#7f7f7fff","out":{"hex":"#9f5f5fff","u16":[40863,24479,24479,65535]}}, +{"bias":0.9,"c1":"#ff0000ff","c2":"#7f7f7fff","out":{"hex":"#8c7272ff","u16":[35929,29375,29375,65535]}}, +{"bias":1,"c1":"#ff0000ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":1.5,"c1":"#ff0000ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":-0.5,"c1":"#ff0000ff","c2":"#808080ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0,"c1":"#ff0000ff","c2":"#808080ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.1,"c1":"#ff0000ff","c2":"#808080ff","out":{"hex":"#f20d0dff","u16":[62271,3290,3290,65535]}}, +{"bias":0.25,"c1":"#ff0000ff","c2":"#808080ff","out":{"hex":"#df2020ff","u16":[57375,8224,8224,65535]}}, +{"bias":0.5,"c1":"#ff0000ff","c2":"#808080ff","out":{"hex":"#c04040ff","u16":[49216,16448,16448,65535]}}, +{"bias":0.75,"c1":"#ff0000ff","c2":"#808080ff","out":{"hex":"#a06060ff","u16":[41056,24672,24672,65535]}}, +{"bias":0.9,"c1":"#ff0000ff","c2":"#808080ff","out":{"hex":"#8d7373ff","u16":[36160,29606,29606,65535]}}, +{"bias":1,"c1":"#ff0000ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":1.5,"c1":"#ff0000ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":-0.5,"c1":"#ff0000ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0,"c1":"#ff0000ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.1,"c1":"#ff0000ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.25,"c1":"#ff0000ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.5,"c1":"#ff0000ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.75,"c1":"#ff0000ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.9,"c1":"#ff0000ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":1,"c1":"#ff0000ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":1.5,"c1":"#ff0000ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":-0.5,"c1":"#ff0000ff","c2":"#00ff00ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0,"c1":"#ff0000ff","c2":"#00ff00ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.1,"c1":"#ff0000ff","c2":"#00ff00ff","out":{"hex":"#e61a00ff","u16":[58982,6554,0,65535]}}, +{"bias":0.25,"c1":"#ff0000ff","c2":"#00ff00ff","out":{"hex":"#bf4000ff","u16":[49151,16384,0,65535]}}, +{"bias":0.5,"c1":"#ff0000ff","c2":"#00ff00ff","out":{"hex":"#808000ff","u16":[32768,32768,0,65535]}}, +{"bias":0.75,"c1":"#ff0000ff","c2":"#00ff00ff","out":{"hex":"#40bf00ff","u16":[16384,49151,0,65535]}}, +{"bias":0.9,"c1":"#ff0000ff","c2":"#00ff00ff","out":{"hex":"#1ae600ff","u16":[6554,58982,0,65535]}}, +{"bias":1,"c1":"#ff0000ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":1.5,"c1":"#ff0000ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":-0.5,"c1":"#ff0000ff","c2":"#0000ffff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0,"c1":"#ff0000ff","c2":"#0000ffff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.1,"c1":"#ff0000ff","c2":"#0000ffff","out":{"hex":"#e6001aff","u16":[58982,0,6554,65535]}}, +{"bias":0.25,"c1":"#ff0000ff","c2":"#0000ffff","out":{"hex":"#bf0040ff","u16":[49151,0,16384,65535]}}, +{"bias":0.5,"c1":"#ff0000ff","c2":"#0000ffff","out":{"hex":"#800080ff","u16":[32768,0,32768,65535]}}, +{"bias":0.75,"c1":"#ff0000ff","c2":"#0000ffff","out":{"hex":"#4000bfff","u16":[16384,0,49151,65535]}}, +{"bias":0.9,"c1":"#ff0000ff","c2":"#0000ffff","out":{"hex":"#1a00e6ff","u16":[6554,0,58982,65535]}}, +{"bias":1,"c1":"#ff0000ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":1.5,"c1":"#ff0000ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":-0.5,"c1":"#ff0000ff","c2":"#ffff00ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0,"c1":"#ff0000ff","c2":"#ffff00ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.1,"c1":"#ff0000ff","c2":"#ffff00ff","out":{"hex":"#ff1a00ff","u16":[65535,6554,0,65535]}}, +{"bias":0.25,"c1":"#ff0000ff","c2":"#ffff00ff","out":{"hex":"#ff4000ff","u16":[65535,16384,0,65535]}}, +{"bias":0.5,"c1":"#ff0000ff","c2":"#ffff00ff","out":{"hex":"#ff8000ff","u16":[65535,32768,0,65535]}}, +{"bias":0.75,"c1":"#ff0000ff","c2":"#ffff00ff","out":{"hex":"#ffbf00ff","u16":[65535,49151,0,65535]}}, +{"bias":0.9,"c1":"#ff0000ff","c2":"#ffff00ff","out":{"hex":"#ffe600ff","u16":[65535,58982,0,65535]}}, +{"bias":1,"c1":"#ff0000ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":1.5,"c1":"#ff0000ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":-0.5,"c1":"#ff0000ff","c2":"#030201ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0,"c1":"#ff0000ff","c2":"#030201ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.1,"c1":"#ff0000ff","c2":"#030201ff","out":{"hex":"#e60000ff","u16":[59059,51,26,65535]}}, +{"bias":0.25,"c1":"#ff0000ff","c2":"#030201ff","out":{"hex":"#c00100ff","u16":[49344,129,64,65535]}}, +{"bias":0.5,"c1":"#ff0000ff","c2":"#030201ff","out":{"hex":"#810101ff","u16":[33153,257,129,65535]}}, +{"bias":0.75,"c1":"#ff0000ff","c2":"#030201ff","out":{"hex":"#420201ff","u16":[16962,386,193,65535]}}, +{"bias":0.9,"c1":"#ff0000ff","c2":"#030201ff","out":{"hex":"#1c0201ff","u16":[7247,463,231,65535]}}, +{"bias":1,"c1":"#ff0000ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":1.5,"c1":"#ff0000ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":-0.5,"c1":"#ff0000ff","c2":"#3daee9ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0,"c1":"#ff0000ff","c2":"#3daee9ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.1,"c1":"#ff0000ff","c2":"#3daee9ff","out":{"hex":"#ec1117ff","u16":[60549,4472,5988,65535]}}, +{"bias":0.25,"c1":"#ff0000ff","c2":"#3daee9ff","out":{"hex":"#cf2c3aff","u16":[53071,11180,14970,65535]}}, +{"bias":0.5,"c1":"#ff0000ff","c2":"#3daee9ff","out":{"hex":"#9e5775ff","u16":[40606,22359,29941,65535]}}, +{"bias":0.75,"c1":"#ff0000ff","c2":"#3daee9ff","out":{"hex":"#6e83afff","u16":[28142,33539,44911,65535]}}, +{"bias":0.9,"c1":"#ff0000ff","c2":"#3daee9ff","out":{"hex":"#509dd2ff","u16":[20663,40246,53893,65535]}}, +{"bias":1,"c1":"#ff0000ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":1.5,"c1":"#ff0000ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":-0.5,"c1":"#ff0000ff","c2":"#232629ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0,"c1":"#ff0000ff","c2":"#232629ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.1,"c1":"#ff0000ff","c2":"#232629ff","out":{"hex":"#e90404ff","u16":[59881,977,1054,65535]}}, +{"bias":0.25,"c1":"#ff0000ff","c2":"#232629ff","out":{"hex":"#c80a0aff","u16":[51400,2442,2634,65535]}}, +{"bias":0.5,"c1":"#ff0000ff","c2":"#232629ff","out":{"hex":"#911315ff","u16":[37265,4883,5269,65535]}}, +{"bias":0.75,"c1":"#ff0000ff","c2":"#232629ff","out":{"hex":"#5a1d1fff","u16":[23130,7325,7903,65535]}}, +{"bias":0.9,"c1":"#ff0000ff","c2":"#232629ff","out":{"hex":"#392225ff","u16":[14649,8789,9483,65535]}}, +{"bias":1,"c1":"#ff0000ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":1.5,"c1":"#ff0000ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":-0.5,"c1":"#ff0000ff","c2":"#eff0f1ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0,"c1":"#ff0000ff","c2":"#eff0f1ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.1,"c1":"#ff0000ff","c2":"#eff0f1ff","out":{"hex":"#fd1818ff","u16":[65124,6168,6194,65535]}}, +{"bias":0.25,"c1":"#ff0000ff","c2":"#eff0f1ff","out":{"hex":"#fb3c3cff","u16":[64507,15420,15484,65535]}}, +{"bias":0.5,"c1":"#ff0000ff","c2":"#eff0f1ff","out":{"hex":"#f77879ff","u16":[63479,30840,30969,65535]}}, +{"bias":0.75,"c1":"#ff0000ff","c2":"#eff0f1ff","out":{"hex":"#f3b4b5ff","u16":[62451,46260,46453,65535]}}, +{"bias":0.9,"c1":"#ff0000ff","c2":"#eff0f1ff","out":{"hex":"#f1d8d9ff","u16":[61834,55512,55743,65535]}}, +{"bias":1,"c1":"#ff0000ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":1.5,"c1":"#ff0000ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":-0.5,"c1":"#ff0000ff","c2":"#fcfcfcff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0,"c1":"#ff0000ff","c2":"#fcfcfcff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.1,"c1":"#ff0000ff","c2":"#fcfcfcff","out":{"hex":"#ff1919ff","u16":[65458,6476,6476,65535]}}, +{"bias":0.25,"c1":"#ff0000ff","c2":"#fcfcfcff","out":{"hex":"#fe3f3fff","u16":[65342,16191,16191,65535]}}, +{"bias":0.5,"c1":"#ff0000ff","c2":"#fcfcfcff","out":{"hex":"#fe7e7eff","u16":[65150,32382,32382,65535]}}, +{"bias":0.75,"c1":"#ff0000ff","c2":"#fcfcfcff","out":{"hex":"#fdbdbdff","u16":[64957,48573,48573,65535]}}, +{"bias":0.9,"c1":"#ff0000ff","c2":"#fcfcfcff","out":{"hex":"#fce3e3ff","u16":[64841,58288,58288,65535]}}, +{"bias":1,"c1":"#ff0000ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":1.5,"c1":"#ff0000ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":-0.5,"c1":"#ff0000ff","c2":"#da4453ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0,"c1":"#ff0000ff","c2":"#da4453ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.1,"c1":"#ff0000ff","c2":"#da4453ff","out":{"hex":"#fb0708ff","u16":[64584,1748,2133,65535]}}, +{"bias":0.25,"c1":"#ff0000ff","c2":"#da4453ff","out":{"hex":"#f61115ff","u16":[63158,4369,5333,65535]}}, +{"bias":0.5,"c1":"#ff0000ff","c2":"#da4453ff","out":{"hex":"#ed222aff","u16":[60781,8738,10666,65535]}}, +{"bias":0.75,"c1":"#ff0000ff","c2":"#da4453ff","out":{"hex":"#e3333eff","u16":[58403,13107,15998,65535]}}, +{"bias":0.9,"c1":"#ff0000ff","c2":"#da4453ff","out":{"hex":"#de3d4bff","u16":[56977,15728,19198,65535]}}, +{"bias":1,"c1":"#ff0000ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":1.5,"c1":"#ff0000ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":-0.5,"c1":"#ff0000ff","c2":"#e8cb2dff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0,"c1":"#ff0000ff","c2":"#e8cb2dff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.1,"c1":"#ff0000ff","c2":"#e8cb2dff","out":{"hex":"#fd1405ff","u16":[64944,5217,1157,65535]}}, +{"bias":0.25,"c1":"#ff0000ff","c2":"#e8cb2dff","out":{"hex":"#f9330bff","u16":[64057,13043,2891,65535]}}, +{"bias":0.5,"c1":"#ff0000ff","c2":"#e8cb2dff","out":{"hex":"#f46617ff","u16":[62580,26086,5783,65535]}}, +{"bias":0.75,"c1":"#ff0000ff","c2":"#e8cb2dff","out":{"hex":"#ee9822ff","u16":[61102,39128,8674,65535]}}, +{"bias":0.9,"c1":"#ff0000ff","c2":"#e8cb2dff","out":{"hex":"#eab729ff","u16":[60215,46954,10409,65535]}}, +{"bias":1,"c1":"#ff0000ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":1.5,"c1":"#ff0000ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":-0.5,"c1":"#ff0000ff","c2":"#3daee980","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0,"c1":"#ff0000ff","c2":"#3daee980","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.1,"c1":"#ff0000ff","c2":"#3daee980","out":{"hex":"#f5090cf2","u16":[62901,2362,3163,62271]}}, +{"bias":0.25,"c1":"#ff0000ff","c2":"#3daee980","out":{"hex":"#e31921df","u16":[58389,6410,8583,57375]}}, +{"bias":0.5,"c1":"#ff0000ff","c2":"#3daee980","out":{"hex":"#be3a4ec0","u16":[48872,14945,20012,49216]}}, +{"bias":0.75,"c1":"#ff0000ff","c2":"#3daee980","out":{"hex":"#8a698ca0","u16":[35573,26873,35985,41056]}}, +{"bias":0.9,"c1":"#ff0000ff","c2":"#3daee980","out":{"hex":"#608ebf8d","u16":[24713,36613,49028,36160]}}, +{"bias":1,"c1":"#ff0000ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":1.5,"c1":"#ff0000ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":-0.5,"c1":"#ff0000ff","c2":"#ffffff00","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0,"c1":"#ff0000ff","c2":"#ffffff00","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":0.1,"c1":"#ff0000ff","c2":"#ffffff00","out":{"hex":"#ff0000e6","u16":[65535,0,0,58982]}}, +{"bias":0.25,"c1":"#ff0000ff","c2":"#ffffff00","out":{"hex":"#ff0000bf","u16":[65535,0,0,49151]}}, +{"bias":0.5,"c1":"#ff0000ff","c2":"#ffffff00","out":{"hex":"#ff000080","u16":[65535,0,0,32768]}}, +{"bias":0.75,"c1":"#ff0000ff","c2":"#ffffff00","out":{"hex":"#ff000040","u16":[65535,0,0,16384]}}, +{"bias":0.9,"c1":"#ff0000ff","c2":"#ffffff00","out":{"hex":"#ff00001a","u16":[65535,0,0,6554]}}, +{"bias":1,"c1":"#ff0000ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":1.5,"c1":"#ff0000ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":-0.5,"c1":"#00ff00ff","c2":"#000000ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0,"c1":"#00ff00ff","c2":"#000000ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.1,"c1":"#00ff00ff","c2":"#000000ff","out":{"hex":"#00e600ff","u16":[0,58982,0,65535]}}, +{"bias":0.25,"c1":"#00ff00ff","c2":"#000000ff","out":{"hex":"#00bf00ff","u16":[0,49151,0,65535]}}, +{"bias":0.5,"c1":"#00ff00ff","c2":"#000000ff","out":{"hex":"#008000ff","u16":[0,32768,0,65535]}}, +{"bias":0.75,"c1":"#00ff00ff","c2":"#000000ff","out":{"hex":"#004000ff","u16":[0,16384,0,65535]}}, +{"bias":0.9,"c1":"#00ff00ff","c2":"#000000ff","out":{"hex":"#001a00ff","u16":[0,6554,0,65535]}}, +{"bias":1,"c1":"#00ff00ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":1.5,"c1":"#00ff00ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":-0.5,"c1":"#00ff00ff","c2":"#ffffffff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0,"c1":"#00ff00ff","c2":"#ffffffff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.1,"c1":"#00ff00ff","c2":"#ffffffff","out":{"hex":"#1aff1aff","u16":[6554,65535,6554,65535]}}, +{"bias":0.25,"c1":"#00ff00ff","c2":"#ffffffff","out":{"hex":"#40ff40ff","u16":[16384,65535,16384,65535]}}, +{"bias":0.5,"c1":"#00ff00ff","c2":"#ffffffff","out":{"hex":"#80ff80ff","u16":[32768,65535,32768,65535]}}, +{"bias":0.75,"c1":"#00ff00ff","c2":"#ffffffff","out":{"hex":"#bfffbfff","u16":[49151,65535,49151,65535]}}, +{"bias":0.9,"c1":"#00ff00ff","c2":"#ffffffff","out":{"hex":"#e6ffe6ff","u16":[58982,65535,58982,65535]}}, +{"bias":1,"c1":"#00ff00ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":1.5,"c1":"#00ff00ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":-0.5,"c1":"#00ff00ff","c2":"#7f7f7fff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0,"c1":"#00ff00ff","c2":"#7f7f7fff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.1,"c1":"#00ff00ff","c2":"#7f7f7fff","out":{"hex":"#0df20dff","u16":[3264,62245,3264,65535]}}, +{"bias":0.25,"c1":"#00ff00ff","c2":"#7f7f7fff","out":{"hex":"#20df20ff","u16":[8160,57311,8160,65535]}}, +{"bias":0.5,"c1":"#00ff00ff","c2":"#7f7f7fff","out":{"hex":"#40bf40ff","u16":[16320,49087,16320,65535]}}, +{"bias":0.75,"c1":"#00ff00ff","c2":"#7f7f7fff","out":{"hex":"#5f9f5fff","u16":[24479,40863,24479,65535]}}, +{"bias":0.9,"c1":"#00ff00ff","c2":"#7f7f7fff","out":{"hex":"#728c72ff","u16":[29375,35929,29375,65535]}}, +{"bias":1,"c1":"#00ff00ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":1.5,"c1":"#00ff00ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":-0.5,"c1":"#00ff00ff","c2":"#808080ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0,"c1":"#00ff00ff","c2":"#808080ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.1,"c1":"#00ff00ff","c2":"#808080ff","out":{"hex":"#0df20dff","u16":[3290,62271,3290,65535]}}, +{"bias":0.25,"c1":"#00ff00ff","c2":"#808080ff","out":{"hex":"#20df20ff","u16":[8224,57375,8224,65535]}}, +{"bias":0.5,"c1":"#00ff00ff","c2":"#808080ff","out":{"hex":"#40c040ff","u16":[16448,49216,16448,65535]}}, +{"bias":0.75,"c1":"#00ff00ff","c2":"#808080ff","out":{"hex":"#60a060ff","u16":[24672,41056,24672,65535]}}, +{"bias":0.9,"c1":"#00ff00ff","c2":"#808080ff","out":{"hex":"#738d73ff","u16":[29606,36160,29606,65535]}}, +{"bias":1,"c1":"#00ff00ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":1.5,"c1":"#00ff00ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":-0.5,"c1":"#00ff00ff","c2":"#ff0000ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0,"c1":"#00ff00ff","c2":"#ff0000ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.1,"c1":"#00ff00ff","c2":"#ff0000ff","out":{"hex":"#1ae600ff","u16":[6554,58982,0,65535]}}, +{"bias":0.25,"c1":"#00ff00ff","c2":"#ff0000ff","out":{"hex":"#40bf00ff","u16":[16384,49151,0,65535]}}, +{"bias":0.5,"c1":"#00ff00ff","c2":"#ff0000ff","out":{"hex":"#808000ff","u16":[32768,32768,0,65535]}}, +{"bias":0.75,"c1":"#00ff00ff","c2":"#ff0000ff","out":{"hex":"#bf4000ff","u16":[49151,16384,0,65535]}}, +{"bias":0.9,"c1":"#00ff00ff","c2":"#ff0000ff","out":{"hex":"#e61a00ff","u16":[58982,6554,0,65535]}}, +{"bias":1,"c1":"#00ff00ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":1.5,"c1":"#00ff00ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":-0.5,"c1":"#00ff00ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0,"c1":"#00ff00ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.1,"c1":"#00ff00ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.25,"c1":"#00ff00ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.5,"c1":"#00ff00ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.75,"c1":"#00ff00ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.9,"c1":"#00ff00ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":1,"c1":"#00ff00ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":1.5,"c1":"#00ff00ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":-0.5,"c1":"#00ff00ff","c2":"#0000ffff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0,"c1":"#00ff00ff","c2":"#0000ffff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.1,"c1":"#00ff00ff","c2":"#0000ffff","out":{"hex":"#00e61aff","u16":[0,58982,6554,65535]}}, +{"bias":0.25,"c1":"#00ff00ff","c2":"#0000ffff","out":{"hex":"#00bf40ff","u16":[0,49151,16384,65535]}}, +{"bias":0.5,"c1":"#00ff00ff","c2":"#0000ffff","out":{"hex":"#008080ff","u16":[0,32768,32768,65535]}}, +{"bias":0.75,"c1":"#00ff00ff","c2":"#0000ffff","out":{"hex":"#0040bfff","u16":[0,16384,49151,65535]}}, +{"bias":0.9,"c1":"#00ff00ff","c2":"#0000ffff","out":{"hex":"#001ae6ff","u16":[0,6554,58982,65535]}}, +{"bias":1,"c1":"#00ff00ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":1.5,"c1":"#00ff00ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":-0.5,"c1":"#00ff00ff","c2":"#ffff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0,"c1":"#00ff00ff","c2":"#ffff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.1,"c1":"#00ff00ff","c2":"#ffff00ff","out":{"hex":"#1aff00ff","u16":[6554,65535,0,65535]}}, +{"bias":0.25,"c1":"#00ff00ff","c2":"#ffff00ff","out":{"hex":"#40ff00ff","u16":[16384,65535,0,65535]}}, +{"bias":0.5,"c1":"#00ff00ff","c2":"#ffff00ff","out":{"hex":"#80ff00ff","u16":[32768,65535,0,65535]}}, +{"bias":0.75,"c1":"#00ff00ff","c2":"#ffff00ff","out":{"hex":"#bfff00ff","u16":[49151,65535,0,65535]}}, +{"bias":0.9,"c1":"#00ff00ff","c2":"#ffff00ff","out":{"hex":"#e6ff00ff","u16":[58982,65535,0,65535]}}, +{"bias":1,"c1":"#00ff00ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":1.5,"c1":"#00ff00ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":-0.5,"c1":"#00ff00ff","c2":"#030201ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0,"c1":"#00ff00ff","c2":"#030201ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.1,"c1":"#00ff00ff","c2":"#030201ff","out":{"hex":"#00e600ff","u16":[77,59033,26,65535]}}, +{"bias":0.25,"c1":"#00ff00ff","c2":"#030201ff","out":{"hex":"#01c000ff","u16":[193,49280,64,65535]}}, +{"bias":0.5,"c1":"#00ff00ff","c2":"#030201ff","out":{"hex":"#028101ff","u16":[386,33025,129,65535]}}, +{"bias":0.75,"c1":"#00ff00ff","c2":"#030201ff","out":{"hex":"#024101ff","u16":[578,16769,193,65535]}}, +{"bias":0.9,"c1":"#00ff00ff","c2":"#030201ff","out":{"hex":"#031b01ff","u16":[694,7016,231,65535]}}, +{"bias":1,"c1":"#00ff00ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":1.5,"c1":"#00ff00ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":-0.5,"c1":"#00ff00ff","c2":"#3daee9ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0,"c1":"#00ff00ff","c2":"#3daee9ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.1,"c1":"#00ff00ff","c2":"#3daee9ff","out":{"hex":"#06f717ff","u16":[1568,63453,5988,65535]}}, +{"bias":0.25,"c1":"#00ff00ff","c2":"#3daee9ff","out":{"hex":"#0feb3aff","u16":[3919,60331,14970,65535]}}, +{"bias":0.5,"c1":"#00ff00ff","c2":"#3daee9ff","out":{"hex":"#1fd775ff","u16":[7839,55127,29941,65535]}}, +{"bias":0.75,"c1":"#00ff00ff","c2":"#3daee9ff","out":{"hex":"#2ec2afff","u16":[11758,49922,44911,65535]}}, +{"bias":0.9,"c1":"#00ff00ff","c2":"#3daee9ff","out":{"hex":"#37b6d2ff","u16":[14109,46800,53893,65535]}}, +{"bias":1,"c1":"#00ff00ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":1.5,"c1":"#00ff00ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":-0.5,"c1":"#00ff00ff","c2":"#232629ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0,"c1":"#00ff00ff","c2":"#232629ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.1,"c1":"#00ff00ff","c2":"#232629ff","out":{"hex":"#04e904ff","u16":[900,59958,1054,65535]}}, +{"bias":0.25,"c1":"#00ff00ff","c2":"#232629ff","out":{"hex":"#09c90aff","u16":[2249,51593,2634,65535]}}, +{"bias":0.5,"c1":"#00ff00ff","c2":"#232629ff","out":{"hex":"#129315ff","u16":[4498,37651,5269,65535]}}, +{"bias":0.75,"c1":"#00ff00ff","c2":"#232629ff","out":{"hex":"#1a5c1fff","u16":[6746,23708,7903,65535]}}, +{"bias":0.9,"c1":"#00ff00ff","c2":"#232629ff","out":{"hex":"#203c25ff","u16":[8096,15343,9483,65535]}}, +{"bias":1,"c1":"#00ff00ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":1.5,"c1":"#00ff00ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":-0.5,"c1":"#00ff00ff","c2":"#eff0f1ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0,"c1":"#00ff00ff","c2":"#eff0f1ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.1,"c1":"#00ff00ff","c2":"#eff0f1ff","out":{"hex":"#18fe18ff","u16":[6142,65150,6194,65535]}}, +{"bias":0.25,"c1":"#00ff00ff","c2":"#eff0f1ff","out":{"hex":"#3cfb3cff","u16":[15356,64571,15484,65535]}}, +{"bias":0.5,"c1":"#00ff00ff","c2":"#eff0f1ff","out":{"hex":"#78f879ff","u16":[30712,63608,30969,65535]}}, +{"bias":0.75,"c1":"#00ff00ff","c2":"#eff0f1ff","out":{"hex":"#b3f4b5ff","u16":[46067,62644,46453,65535]}}, +{"bias":0.9,"c1":"#00ff00ff","c2":"#eff0f1ff","out":{"hex":"#d7f2d9ff","u16":[55281,62066,55743,65535]}}, +{"bias":1,"c1":"#00ff00ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":1.5,"c1":"#00ff00ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":-0.5,"c1":"#00ff00ff","c2":"#fcfcfcff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0,"c1":"#00ff00ff","c2":"#fcfcfcff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.1,"c1":"#00ff00ff","c2":"#fcfcfcff","out":{"hex":"#19ff19ff","u16":[6476,65458,6476,65535]}}, +{"bias":0.25,"c1":"#00ff00ff","c2":"#fcfcfcff","out":{"hex":"#3ffe3fff","u16":[16191,65342,16191,65535]}}, +{"bias":0.5,"c1":"#00ff00ff","c2":"#fcfcfcff","out":{"hex":"#7efe7eff","u16":[32382,65150,32382,65535]}}, +{"bias":0.75,"c1":"#00ff00ff","c2":"#fcfcfcff","out":{"hex":"#bdfdbdff","u16":[48573,64957,48573,65535]}}, +{"bias":0.9,"c1":"#00ff00ff","c2":"#fcfcfcff","out":{"hex":"#e3fce3ff","u16":[58288,64841,58288,65535]}}, +{"bias":1,"c1":"#00ff00ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":1.5,"c1":"#00ff00ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":-0.5,"c1":"#00ff00ff","c2":"#da4453ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0,"c1":"#00ff00ff","c2":"#da4453ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.1,"c1":"#00ff00ff","c2":"#da4453ff","out":{"hex":"#16ec08ff","u16":[5603,60729,2133,65535]}}, +{"bias":0.25,"c1":"#00ff00ff","c2":"#da4453ff","out":{"hex":"#37d015ff","u16":[14007,53520,5333,65535]}}, +{"bias":0.5,"c1":"#00ff00ff","c2":"#da4453ff","out":{"hex":"#6da22aff","u16":[28013,41506,10666,65535]}}, +{"bias":0.75,"c1":"#00ff00ff","c2":"#da4453ff","out":{"hex":"#a4733eff","u16":[42020,29491,15998,65535]}}, +{"bias":0.9,"c1":"#00ff00ff","c2":"#da4453ff","out":{"hex":"#c4574bff","u16":[50423,22282,19198,65535]}}, +{"bias":1,"c1":"#00ff00ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":1.5,"c1":"#00ff00ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":-0.5,"c1":"#00ff00ff","c2":"#e8cb2dff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0,"c1":"#00ff00ff","c2":"#e8cb2dff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.1,"c1":"#00ff00ff","c2":"#e8cb2dff","out":{"hex":"#17fa05ff","u16":[5962,64199,1157,65535]}}, +{"bias":0.25,"c1":"#00ff00ff","c2":"#e8cb2dff","out":{"hex":"#3af20bff","u16":[14906,62194,2891,65535]}}, +{"bias":0.5,"c1":"#00ff00ff","c2":"#e8cb2dff","out":{"hex":"#74e517ff","u16":[29812,58853,5783,65535]}}, +{"bias":0.75,"c1":"#00ff00ff","c2":"#e8cb2dff","out":{"hex":"#aed822ff","u16":[44718,55512,8674,65535]}}, +{"bias":0.9,"c1":"#00ff00ff","c2":"#e8cb2dff","out":{"hex":"#d1d029ff","u16":[53662,53507,10409,65535]}}, +{"bias":1,"c1":"#00ff00ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":1.5,"c1":"#00ff00ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":-0.5,"c1":"#00ff00ff","c2":"#3daee980","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0,"c1":"#00ff00ff","c2":"#3daee980","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.1,"c1":"#00ff00ff","c2":"#3daee980","out":{"hex":"#03fb0cf2","u16":[828,64435,3163,62271]}}, +{"bias":0.25,"c1":"#00ff00ff","c2":"#3daee980","out":{"hex":"#09f321df","u16":[2247,62551,8583,57375]}}, +{"bias":0.5,"c1":"#00ff00ff","c2":"#3daee980","out":{"hex":"#14e44ec0","u16":[5239,58578,20012,49216]}}, +{"bias":0.75,"c1":"#00ff00ff","c2":"#3daee980","out":{"hex":"#25ce8ca0","u16":[9421,53025,35985,41056]}}, +{"bias":0.9,"c1":"#00ff00ff","c2":"#3daee980","out":{"hex":"#32bdbf8d","u16":[12836,48491,49028,36160]}}, +{"bias":1,"c1":"#00ff00ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":1.5,"c1":"#00ff00ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":-0.5,"c1":"#00ff00ff","c2":"#ffffff00","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0,"c1":"#00ff00ff","c2":"#ffffff00","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":0.1,"c1":"#00ff00ff","c2":"#ffffff00","out":{"hex":"#00ff00e6","u16":[0,65535,0,58982]}}, +{"bias":0.25,"c1":"#00ff00ff","c2":"#ffffff00","out":{"hex":"#00ff00bf","u16":[0,65535,0,49151]}}, +{"bias":0.5,"c1":"#00ff00ff","c2":"#ffffff00","out":{"hex":"#00ff0080","u16":[0,65535,0,32768]}}, +{"bias":0.75,"c1":"#00ff00ff","c2":"#ffffff00","out":{"hex":"#00ff0040","u16":[0,65535,0,16384]}}, +{"bias":0.9,"c1":"#00ff00ff","c2":"#ffffff00","out":{"hex":"#00ff001a","u16":[0,65535,0,6554]}}, +{"bias":1,"c1":"#00ff00ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":1.5,"c1":"#00ff00ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":-0.5,"c1":"#0000ffff","c2":"#000000ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0,"c1":"#0000ffff","c2":"#000000ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.1,"c1":"#0000ffff","c2":"#000000ff","out":{"hex":"#0000e6ff","u16":[0,0,58982,65535]}}, +{"bias":0.25,"c1":"#0000ffff","c2":"#000000ff","out":{"hex":"#0000bfff","u16":[0,0,49151,65535]}}, +{"bias":0.5,"c1":"#0000ffff","c2":"#000000ff","out":{"hex":"#000080ff","u16":[0,0,32768,65535]}}, +{"bias":0.75,"c1":"#0000ffff","c2":"#000000ff","out":{"hex":"#000040ff","u16":[0,0,16384,65535]}}, +{"bias":0.9,"c1":"#0000ffff","c2":"#000000ff","out":{"hex":"#00001aff","u16":[0,0,6554,65535]}}, +{"bias":1,"c1":"#0000ffff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":1.5,"c1":"#0000ffff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":-0.5,"c1":"#0000ffff","c2":"#ffffffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0,"c1":"#0000ffff","c2":"#ffffffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.1,"c1":"#0000ffff","c2":"#ffffffff","out":{"hex":"#1a1affff","u16":[6554,6554,65535,65535]}}, +{"bias":0.25,"c1":"#0000ffff","c2":"#ffffffff","out":{"hex":"#4040ffff","u16":[16384,16384,65535,65535]}}, +{"bias":0.5,"c1":"#0000ffff","c2":"#ffffffff","out":{"hex":"#8080ffff","u16":[32768,32768,65535,65535]}}, +{"bias":0.75,"c1":"#0000ffff","c2":"#ffffffff","out":{"hex":"#bfbfffff","u16":[49151,49151,65535,65535]}}, +{"bias":0.9,"c1":"#0000ffff","c2":"#ffffffff","out":{"hex":"#e6e6ffff","u16":[58982,58982,65535,65535]}}, +{"bias":1,"c1":"#0000ffff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":1.5,"c1":"#0000ffff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":-0.5,"c1":"#0000ffff","c2":"#7f7f7fff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0,"c1":"#0000ffff","c2":"#7f7f7fff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.1,"c1":"#0000ffff","c2":"#7f7f7fff","out":{"hex":"#0d0df2ff","u16":[3264,3264,62245,65535]}}, +{"bias":0.25,"c1":"#0000ffff","c2":"#7f7f7fff","out":{"hex":"#2020dfff","u16":[8160,8160,57311,65535]}}, +{"bias":0.5,"c1":"#0000ffff","c2":"#7f7f7fff","out":{"hex":"#4040bfff","u16":[16320,16320,49087,65535]}}, +{"bias":0.75,"c1":"#0000ffff","c2":"#7f7f7fff","out":{"hex":"#5f5f9fff","u16":[24479,24479,40863,65535]}}, +{"bias":0.9,"c1":"#0000ffff","c2":"#7f7f7fff","out":{"hex":"#72728cff","u16":[29375,29375,35929,65535]}}, +{"bias":1,"c1":"#0000ffff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":1.5,"c1":"#0000ffff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":-0.5,"c1":"#0000ffff","c2":"#808080ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0,"c1":"#0000ffff","c2":"#808080ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.1,"c1":"#0000ffff","c2":"#808080ff","out":{"hex":"#0d0df2ff","u16":[3290,3290,62271,65535]}}, +{"bias":0.25,"c1":"#0000ffff","c2":"#808080ff","out":{"hex":"#2020dfff","u16":[8224,8224,57375,65535]}}, +{"bias":0.5,"c1":"#0000ffff","c2":"#808080ff","out":{"hex":"#4040c0ff","u16":[16448,16448,49216,65535]}}, +{"bias":0.75,"c1":"#0000ffff","c2":"#808080ff","out":{"hex":"#6060a0ff","u16":[24672,24672,41056,65535]}}, +{"bias":0.9,"c1":"#0000ffff","c2":"#808080ff","out":{"hex":"#73738dff","u16":[29606,29606,36160,65535]}}, +{"bias":1,"c1":"#0000ffff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":1.5,"c1":"#0000ffff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":-0.5,"c1":"#0000ffff","c2":"#ff0000ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0,"c1":"#0000ffff","c2":"#ff0000ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.1,"c1":"#0000ffff","c2":"#ff0000ff","out":{"hex":"#1a00e6ff","u16":[6554,0,58982,65535]}}, +{"bias":0.25,"c1":"#0000ffff","c2":"#ff0000ff","out":{"hex":"#4000bfff","u16":[16384,0,49151,65535]}}, +{"bias":0.5,"c1":"#0000ffff","c2":"#ff0000ff","out":{"hex":"#800080ff","u16":[32768,0,32768,65535]}}, +{"bias":0.75,"c1":"#0000ffff","c2":"#ff0000ff","out":{"hex":"#bf0040ff","u16":[49151,0,16384,65535]}}, +{"bias":0.9,"c1":"#0000ffff","c2":"#ff0000ff","out":{"hex":"#e6001aff","u16":[58982,0,6554,65535]}}, +{"bias":1,"c1":"#0000ffff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":1.5,"c1":"#0000ffff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":-0.5,"c1":"#0000ffff","c2":"#00ff00ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0,"c1":"#0000ffff","c2":"#00ff00ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.1,"c1":"#0000ffff","c2":"#00ff00ff","out":{"hex":"#001ae6ff","u16":[0,6554,58982,65535]}}, +{"bias":0.25,"c1":"#0000ffff","c2":"#00ff00ff","out":{"hex":"#0040bfff","u16":[0,16384,49151,65535]}}, +{"bias":0.5,"c1":"#0000ffff","c2":"#00ff00ff","out":{"hex":"#008080ff","u16":[0,32768,32768,65535]}}, +{"bias":0.75,"c1":"#0000ffff","c2":"#00ff00ff","out":{"hex":"#00bf40ff","u16":[0,49151,16384,65535]}}, +{"bias":0.9,"c1":"#0000ffff","c2":"#00ff00ff","out":{"hex":"#00e61aff","u16":[0,58982,6554,65535]}}, +{"bias":1,"c1":"#0000ffff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":1.5,"c1":"#0000ffff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":-0.5,"c1":"#0000ffff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0,"c1":"#0000ffff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.1,"c1":"#0000ffff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.25,"c1":"#0000ffff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.5,"c1":"#0000ffff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.75,"c1":"#0000ffff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.9,"c1":"#0000ffff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":1,"c1":"#0000ffff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":1.5,"c1":"#0000ffff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":-0.5,"c1":"#0000ffff","c2":"#ffff00ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0,"c1":"#0000ffff","c2":"#ffff00ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.1,"c1":"#0000ffff","c2":"#ffff00ff","out":{"hex":"#1a1ae6ff","u16":[6554,6554,58982,65535]}}, +{"bias":0.25,"c1":"#0000ffff","c2":"#ffff00ff","out":{"hex":"#4040bfff","u16":[16384,16384,49151,65535]}}, +{"bias":0.5,"c1":"#0000ffff","c2":"#ffff00ff","out":{"hex":"#808080ff","u16":[32768,32768,32768,65535]}}, +{"bias":0.75,"c1":"#0000ffff","c2":"#ffff00ff","out":{"hex":"#bfbf40ff","u16":[49151,49151,16384,65535]}}, +{"bias":0.9,"c1":"#0000ffff","c2":"#ffff00ff","out":{"hex":"#e6e61aff","u16":[58982,58982,6554,65535]}}, +{"bias":1,"c1":"#0000ffff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":1.5,"c1":"#0000ffff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":-0.5,"c1":"#0000ffff","c2":"#030201ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0,"c1":"#0000ffff","c2":"#030201ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.1,"c1":"#0000ffff","c2":"#030201ff","out":{"hex":"#0000e6ff","u16":[77,51,59007,65535]}}, +{"bias":0.25,"c1":"#0000ffff","c2":"#030201ff","out":{"hex":"#0101c0ff","u16":[193,129,49216,65535]}}, +{"bias":0.5,"c1":"#0000ffff","c2":"#030201ff","out":{"hex":"#020180ff","u16":[386,257,32896,65535]}}, +{"bias":0.75,"c1":"#0000ffff","c2":"#030201ff","out":{"hex":"#020241ff","u16":[578,386,16577,65535]}}, +{"bias":0.9,"c1":"#0000ffff","c2":"#030201ff","out":{"hex":"#03021aff","u16":[694,463,6785,65535]}}, +{"bias":1,"c1":"#0000ffff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":1.5,"c1":"#0000ffff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":-0.5,"c1":"#0000ffff","c2":"#3daee9ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0,"c1":"#0000ffff","c2":"#3daee9ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.1,"c1":"#0000ffff","c2":"#3daee9ff","out":{"hex":"#0611fdff","u16":[1568,4472,64970,65535]}}, +{"bias":0.25,"c1":"#0000ffff","c2":"#3daee9ff","out":{"hex":"#0f2cfaff","u16":[3919,11180,64122,65535]}}, +{"bias":0.5,"c1":"#0000ffff","c2":"#3daee9ff","out":{"hex":"#1f57f4ff","u16":[7839,22359,62708,65535]}}, +{"bias":0.75,"c1":"#0000ffff","c2":"#3daee9ff","out":{"hex":"#2e83efff","u16":[11758,33539,61295,65535]}}, +{"bias":0.9,"c1":"#0000ffff","c2":"#3daee9ff","out":{"hex":"#379debff","u16":[14109,40246,60446,65535]}}, +{"bias":1,"c1":"#0000ffff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":1.5,"c1":"#0000ffff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":-0.5,"c1":"#0000ffff","c2":"#232629ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0,"c1":"#0000ffff","c2":"#232629ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.1,"c1":"#0000ffff","c2":"#232629ff","out":{"hex":"#0404eaff","u16":[900,977,60035,65535]}}, +{"bias":0.25,"c1":"#0000ffff","c2":"#232629ff","out":{"hex":"#090acaff","u16":[2249,2442,51786,65535]}}, +{"bias":0.5,"c1":"#0000ffff","c2":"#232629ff","out":{"hex":"#121394ff","u16":[4498,4883,38036,65535]}}, +{"bias":0.75,"c1":"#0000ffff","c2":"#232629ff","out":{"hex":"#1a1d5fff","u16":[6746,7325,24287,65535]}}, +{"bias":0.9,"c1":"#0000ffff","c2":"#232629ff","out":{"hex":"#20223eff","u16":[8096,8789,16037,65535]}}, +{"bias":1,"c1":"#0000ffff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":1.5,"c1":"#0000ffff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":-0.5,"c1":"#0000ffff","c2":"#eff0f1ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0,"c1":"#0000ffff","c2":"#eff0f1ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.1,"c1":"#0000ffff","c2":"#eff0f1ff","out":{"hex":"#1818feff","u16":[6142,6168,65175,65535]}}, +{"bias":0.25,"c1":"#0000ffff","c2":"#eff0f1ff","out":{"hex":"#3c3cfcff","u16":[15356,15420,64636,65535]}}, +{"bias":0.5,"c1":"#0000ffff","c2":"#eff0f1ff","out":{"hex":"#7878f8ff","u16":[30712,30840,63736,65535]}}, +{"bias":0.75,"c1":"#0000ffff","c2":"#eff0f1ff","out":{"hex":"#b3b4f5ff","u16":[46067,46260,62837,65535]}}, +{"bias":0.9,"c1":"#0000ffff","c2":"#eff0f1ff","out":{"hex":"#d7d8f2ff","u16":[55281,55512,62297,65535]}}, +{"bias":1,"c1":"#0000ffff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":1.5,"c1":"#0000ffff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":-0.5,"c1":"#0000ffff","c2":"#fcfcfcff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0,"c1":"#0000ffff","c2":"#fcfcfcff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.1,"c1":"#0000ffff","c2":"#fcfcfcff","out":{"hex":"#1919ffff","u16":[6476,6476,65458,65535]}}, +{"bias":0.25,"c1":"#0000ffff","c2":"#fcfcfcff","out":{"hex":"#3f3ffeff","u16":[16191,16191,65342,65535]}}, +{"bias":0.5,"c1":"#0000ffff","c2":"#fcfcfcff","out":{"hex":"#7e7efeff","u16":[32382,32382,65150,65535]}}, +{"bias":0.75,"c1":"#0000ffff","c2":"#fcfcfcff","out":{"hex":"#bdbdfdff","u16":[48573,48573,64957,65535]}}, +{"bias":0.9,"c1":"#0000ffff","c2":"#fcfcfcff","out":{"hex":"#e3e3fcff","u16":[58288,58288,64841,65535]}}, +{"bias":1,"c1":"#0000ffff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":1.5,"c1":"#0000ffff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":-0.5,"c1":"#0000ffff","c2":"#da4453ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0,"c1":"#0000ffff","c2":"#da4453ff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.1,"c1":"#0000ffff","c2":"#da4453ff","out":{"hex":"#1607eeff","u16":[5603,1748,61115,65535]}}, +{"bias":0.25,"c1":"#0000ffff","c2":"#da4453ff","out":{"hex":"#3711d4ff","u16":[14007,4369,54484,65535]}}, +{"bias":0.5,"c1":"#0000ffff","c2":"#da4453ff","out":{"hex":"#6d22a9ff","u16":[28013,8738,43433,65535]}}, +{"bias":0.75,"c1":"#0000ffff","c2":"#da4453ff","out":{"hex":"#a4337eff","u16":[42020,13107,32382,65535]}}, +{"bias":0.9,"c1":"#0000ffff","c2":"#da4453ff","out":{"hex":"#c43d64ff","u16":[50423,15728,25751,65535]}}, +{"bias":1,"c1":"#0000ffff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":1.5,"c1":"#0000ffff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":-0.5,"c1":"#0000ffff","c2":"#e8cb2dff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0,"c1":"#0000ffff","c2":"#e8cb2dff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.1,"c1":"#0000ffff","c2":"#e8cb2dff","out":{"hex":"#1714eaff","u16":[5962,5217,60138,65535]}}, +{"bias":0.25,"c1":"#0000ffff","c2":"#e8cb2dff","out":{"hex":"#3a33cbff","u16":[14906,13043,52043,65535]}}, +{"bias":0.5,"c1":"#0000ffff","c2":"#e8cb2dff","out":{"hex":"#746696ff","u16":[29812,26086,38550,65535]}}, +{"bias":0.75,"c1":"#0000ffff","c2":"#e8cb2dff","out":{"hex":"#ae9862ff","u16":[44718,39128,25058,65535]}}, +{"bias":0.9,"c1":"#0000ffff","c2":"#e8cb2dff","out":{"hex":"#d1b742ff","u16":[53662,46954,16962,65535]}}, +{"bias":1,"c1":"#0000ffff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":1.5,"c1":"#0000ffff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":-0.5,"c1":"#0000ffff","c2":"#3daee980","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0,"c1":"#0000ffff","c2":"#3daee980","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.1,"c1":"#0000ffff","c2":"#3daee980","out":{"hex":"#0309fef2","u16":[828,2362,65236,62271]}}, +{"bias":0.25,"c1":"#0000ffff","c2":"#3daee980","out":{"hex":"#0919fcdf","u16":[2247,6410,64725,57375]}}, +{"bias":0.5,"c1":"#0000ffff","c2":"#3daee980","out":{"hex":"#143af8c0","u16":[5239,14945,63645,49216]}}, +{"bias":0.75,"c1":"#0000ffff","c2":"#3daee980","out":{"hex":"#2569f2a0","u16":[9421,26873,62137,41056]}}, +{"bias":0.9,"c1":"#0000ffff","c2":"#3daee980","out":{"hex":"#328eed8d","u16":[12836,36613,60906,36160]}}, +{"bias":1,"c1":"#0000ffff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":1.5,"c1":"#0000ffff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":-0.5,"c1":"#0000ffff","c2":"#ffffff00","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0,"c1":"#0000ffff","c2":"#ffffff00","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":0.1,"c1":"#0000ffff","c2":"#ffffff00","out":{"hex":"#0000ffe6","u16":[0,0,65535,58982]}}, +{"bias":0.25,"c1":"#0000ffff","c2":"#ffffff00","out":{"hex":"#0000ffbf","u16":[0,0,65535,49151]}}, +{"bias":0.5,"c1":"#0000ffff","c2":"#ffffff00","out":{"hex":"#0000ff80","u16":[0,0,65535,32768]}}, +{"bias":0.75,"c1":"#0000ffff","c2":"#ffffff00","out":{"hex":"#0000ff40","u16":[0,0,65535,16384]}}, +{"bias":0.9,"c1":"#0000ffff","c2":"#ffffff00","out":{"hex":"#0000ff1a","u16":[0,0,65535,6554]}}, +{"bias":1,"c1":"#0000ffff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":1.5,"c1":"#0000ffff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":-0.5,"c1":"#ffff00ff","c2":"#000000ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0,"c1":"#ffff00ff","c2":"#000000ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.1,"c1":"#ffff00ff","c2":"#000000ff","out":{"hex":"#e6e600ff","u16":[58982,58982,0,65535]}}, +{"bias":0.25,"c1":"#ffff00ff","c2":"#000000ff","out":{"hex":"#bfbf00ff","u16":[49151,49151,0,65535]}}, +{"bias":0.5,"c1":"#ffff00ff","c2":"#000000ff","out":{"hex":"#808000ff","u16":[32768,32768,0,65535]}}, +{"bias":0.75,"c1":"#ffff00ff","c2":"#000000ff","out":{"hex":"#404000ff","u16":[16384,16384,0,65535]}}, +{"bias":0.9,"c1":"#ffff00ff","c2":"#000000ff","out":{"hex":"#1a1a00ff","u16":[6554,6554,0,65535]}}, +{"bias":1,"c1":"#ffff00ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":1.5,"c1":"#ffff00ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":-0.5,"c1":"#ffff00ff","c2":"#ffffffff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0,"c1":"#ffff00ff","c2":"#ffffffff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.1,"c1":"#ffff00ff","c2":"#ffffffff","out":{"hex":"#ffff1aff","u16":[65535,65535,6554,65535]}}, +{"bias":0.25,"c1":"#ffff00ff","c2":"#ffffffff","out":{"hex":"#ffff40ff","u16":[65535,65535,16384,65535]}}, +{"bias":0.5,"c1":"#ffff00ff","c2":"#ffffffff","out":{"hex":"#ffff80ff","u16":[65535,65535,32768,65535]}}, +{"bias":0.75,"c1":"#ffff00ff","c2":"#ffffffff","out":{"hex":"#ffffbfff","u16":[65535,65535,49151,65535]}}, +{"bias":0.9,"c1":"#ffff00ff","c2":"#ffffffff","out":{"hex":"#ffffe6ff","u16":[65535,65535,58982,65535]}}, +{"bias":1,"c1":"#ffff00ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":1.5,"c1":"#ffff00ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":-0.5,"c1":"#ffff00ff","c2":"#7f7f7fff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0,"c1":"#ffff00ff","c2":"#7f7f7fff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.1,"c1":"#ffff00ff","c2":"#7f7f7fff","out":{"hex":"#f2f20dff","u16":[62245,62245,3264,65535]}}, +{"bias":0.25,"c1":"#ffff00ff","c2":"#7f7f7fff","out":{"hex":"#dfdf20ff","u16":[57311,57311,8160,65535]}}, +{"bias":0.5,"c1":"#ffff00ff","c2":"#7f7f7fff","out":{"hex":"#bfbf40ff","u16":[49087,49087,16320,65535]}}, +{"bias":0.75,"c1":"#ffff00ff","c2":"#7f7f7fff","out":{"hex":"#9f9f5fff","u16":[40863,40863,24479,65535]}}, +{"bias":0.9,"c1":"#ffff00ff","c2":"#7f7f7fff","out":{"hex":"#8c8c72ff","u16":[35929,35929,29375,65535]}}, +{"bias":1,"c1":"#ffff00ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":1.5,"c1":"#ffff00ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":-0.5,"c1":"#ffff00ff","c2":"#808080ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0,"c1":"#ffff00ff","c2":"#808080ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.1,"c1":"#ffff00ff","c2":"#808080ff","out":{"hex":"#f2f20dff","u16":[62271,62271,3290,65535]}}, +{"bias":0.25,"c1":"#ffff00ff","c2":"#808080ff","out":{"hex":"#dfdf20ff","u16":[57375,57375,8224,65535]}}, +{"bias":0.5,"c1":"#ffff00ff","c2":"#808080ff","out":{"hex":"#c0c040ff","u16":[49216,49216,16448,65535]}}, +{"bias":0.75,"c1":"#ffff00ff","c2":"#808080ff","out":{"hex":"#a0a060ff","u16":[41056,41056,24672,65535]}}, +{"bias":0.9,"c1":"#ffff00ff","c2":"#808080ff","out":{"hex":"#8d8d73ff","u16":[36160,36160,29606,65535]}}, +{"bias":1,"c1":"#ffff00ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":1.5,"c1":"#ffff00ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":-0.5,"c1":"#ffff00ff","c2":"#ff0000ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0,"c1":"#ffff00ff","c2":"#ff0000ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.1,"c1":"#ffff00ff","c2":"#ff0000ff","out":{"hex":"#ffe600ff","u16":[65535,58982,0,65535]}}, +{"bias":0.25,"c1":"#ffff00ff","c2":"#ff0000ff","out":{"hex":"#ffbf00ff","u16":[65535,49151,0,65535]}}, +{"bias":0.5,"c1":"#ffff00ff","c2":"#ff0000ff","out":{"hex":"#ff8000ff","u16":[65535,32768,0,65535]}}, +{"bias":0.75,"c1":"#ffff00ff","c2":"#ff0000ff","out":{"hex":"#ff4000ff","u16":[65535,16384,0,65535]}}, +{"bias":0.9,"c1":"#ffff00ff","c2":"#ff0000ff","out":{"hex":"#ff1a00ff","u16":[65535,6554,0,65535]}}, +{"bias":1,"c1":"#ffff00ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":1.5,"c1":"#ffff00ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":-0.5,"c1":"#ffff00ff","c2":"#00ff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0,"c1":"#ffff00ff","c2":"#00ff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.1,"c1":"#ffff00ff","c2":"#00ff00ff","out":{"hex":"#e6ff00ff","u16":[58982,65535,0,65535]}}, +{"bias":0.25,"c1":"#ffff00ff","c2":"#00ff00ff","out":{"hex":"#bfff00ff","u16":[49151,65535,0,65535]}}, +{"bias":0.5,"c1":"#ffff00ff","c2":"#00ff00ff","out":{"hex":"#80ff00ff","u16":[32768,65535,0,65535]}}, +{"bias":0.75,"c1":"#ffff00ff","c2":"#00ff00ff","out":{"hex":"#40ff00ff","u16":[16384,65535,0,65535]}}, +{"bias":0.9,"c1":"#ffff00ff","c2":"#00ff00ff","out":{"hex":"#1aff00ff","u16":[6554,65535,0,65535]}}, +{"bias":1,"c1":"#ffff00ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":1.5,"c1":"#ffff00ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":-0.5,"c1":"#ffff00ff","c2":"#0000ffff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0,"c1":"#ffff00ff","c2":"#0000ffff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.1,"c1":"#ffff00ff","c2":"#0000ffff","out":{"hex":"#e6e61aff","u16":[58982,58982,6554,65535]}}, +{"bias":0.25,"c1":"#ffff00ff","c2":"#0000ffff","out":{"hex":"#bfbf40ff","u16":[49151,49151,16384,65535]}}, +{"bias":0.5,"c1":"#ffff00ff","c2":"#0000ffff","out":{"hex":"#808080ff","u16":[32768,32768,32768,65535]}}, +{"bias":0.75,"c1":"#ffff00ff","c2":"#0000ffff","out":{"hex":"#4040bfff","u16":[16384,16384,49151,65535]}}, +{"bias":0.9,"c1":"#ffff00ff","c2":"#0000ffff","out":{"hex":"#1a1ae6ff","u16":[6554,6554,58982,65535]}}, +{"bias":1,"c1":"#ffff00ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":1.5,"c1":"#ffff00ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":-0.5,"c1":"#ffff00ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0,"c1":"#ffff00ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.1,"c1":"#ffff00ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.25,"c1":"#ffff00ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.5,"c1":"#ffff00ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.75,"c1":"#ffff00ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.9,"c1":"#ffff00ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":1,"c1":"#ffff00ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":1.5,"c1":"#ffff00ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":-0.5,"c1":"#ffff00ff","c2":"#030201ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0,"c1":"#ffff00ff","c2":"#030201ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.1,"c1":"#ffff00ff","c2":"#030201ff","out":{"hex":"#e6e600ff","u16":[59059,59033,26,65535]}}, +{"bias":0.25,"c1":"#ffff00ff","c2":"#030201ff","out":{"hex":"#c0c000ff","u16":[49344,49280,64,65535]}}, +{"bias":0.5,"c1":"#ffff00ff","c2":"#030201ff","out":{"hex":"#818101ff","u16":[33153,33025,129,65535]}}, +{"bias":0.75,"c1":"#ffff00ff","c2":"#030201ff","out":{"hex":"#424101ff","u16":[16962,16769,193,65535]}}, +{"bias":0.9,"c1":"#ffff00ff","c2":"#030201ff","out":{"hex":"#1c1b01ff","u16":[7247,7016,231,65535]}}, +{"bias":1,"c1":"#ffff00ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":1.5,"c1":"#ffff00ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":-0.5,"c1":"#ffff00ff","c2":"#3daee9ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0,"c1":"#ffff00ff","c2":"#3daee9ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.1,"c1":"#ffff00ff","c2":"#3daee9ff","out":{"hex":"#ecf717ff","u16":[60549,63453,5988,65535]}}, +{"bias":0.25,"c1":"#ffff00ff","c2":"#3daee9ff","out":{"hex":"#cfeb3aff","u16":[53071,60331,14970,65535]}}, +{"bias":0.5,"c1":"#ffff00ff","c2":"#3daee9ff","out":{"hex":"#9ed775ff","u16":[40606,55127,29941,65535]}}, +{"bias":0.75,"c1":"#ffff00ff","c2":"#3daee9ff","out":{"hex":"#6ec2afff","u16":[28142,49922,44911,65535]}}, +{"bias":0.9,"c1":"#ffff00ff","c2":"#3daee9ff","out":{"hex":"#50b6d2ff","u16":[20663,46800,53893,65535]}}, +{"bias":1,"c1":"#ffff00ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":1.5,"c1":"#ffff00ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":-0.5,"c1":"#ffff00ff","c2":"#232629ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0,"c1":"#ffff00ff","c2":"#232629ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.1,"c1":"#ffff00ff","c2":"#232629ff","out":{"hex":"#e9e904ff","u16":[59881,59958,1054,65535]}}, +{"bias":0.25,"c1":"#ffff00ff","c2":"#232629ff","out":{"hex":"#c8c90aff","u16":[51400,51593,2634,65535]}}, +{"bias":0.5,"c1":"#ffff00ff","c2":"#232629ff","out":{"hex":"#919315ff","u16":[37265,37651,5269,65535]}}, +{"bias":0.75,"c1":"#ffff00ff","c2":"#232629ff","out":{"hex":"#5a5c1fff","u16":[23130,23708,7903,65535]}}, +{"bias":0.9,"c1":"#ffff00ff","c2":"#232629ff","out":{"hex":"#393c25ff","u16":[14649,15343,9483,65535]}}, +{"bias":1,"c1":"#ffff00ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":1.5,"c1":"#ffff00ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":-0.5,"c1":"#ffff00ff","c2":"#eff0f1ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0,"c1":"#ffff00ff","c2":"#eff0f1ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.1,"c1":"#ffff00ff","c2":"#eff0f1ff","out":{"hex":"#fdfe18ff","u16":[65124,65150,6194,65535]}}, +{"bias":0.25,"c1":"#ffff00ff","c2":"#eff0f1ff","out":{"hex":"#fbfb3cff","u16":[64507,64571,15484,65535]}}, +{"bias":0.5,"c1":"#ffff00ff","c2":"#eff0f1ff","out":{"hex":"#f7f879ff","u16":[63479,63608,30969,65535]}}, +{"bias":0.75,"c1":"#ffff00ff","c2":"#eff0f1ff","out":{"hex":"#f3f4b5ff","u16":[62451,62644,46453,65535]}}, +{"bias":0.9,"c1":"#ffff00ff","c2":"#eff0f1ff","out":{"hex":"#f1f2d9ff","u16":[61834,62066,55743,65535]}}, +{"bias":1,"c1":"#ffff00ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":1.5,"c1":"#ffff00ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":-0.5,"c1":"#ffff00ff","c2":"#fcfcfcff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0,"c1":"#ffff00ff","c2":"#fcfcfcff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.1,"c1":"#ffff00ff","c2":"#fcfcfcff","out":{"hex":"#ffff19ff","u16":[65458,65458,6476,65535]}}, +{"bias":0.25,"c1":"#ffff00ff","c2":"#fcfcfcff","out":{"hex":"#fefe3fff","u16":[65342,65342,16191,65535]}}, +{"bias":0.5,"c1":"#ffff00ff","c2":"#fcfcfcff","out":{"hex":"#fefe7eff","u16":[65150,65150,32382,65535]}}, +{"bias":0.75,"c1":"#ffff00ff","c2":"#fcfcfcff","out":{"hex":"#fdfdbdff","u16":[64957,64957,48573,65535]}}, +{"bias":0.9,"c1":"#ffff00ff","c2":"#fcfcfcff","out":{"hex":"#fcfce3ff","u16":[64841,64841,58288,65535]}}, +{"bias":1,"c1":"#ffff00ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":1.5,"c1":"#ffff00ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":-0.5,"c1":"#ffff00ff","c2":"#da4453ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0,"c1":"#ffff00ff","c2":"#da4453ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.1,"c1":"#ffff00ff","c2":"#da4453ff","out":{"hex":"#fbec08ff","u16":[64584,60729,2133,65535]}}, +{"bias":0.25,"c1":"#ffff00ff","c2":"#da4453ff","out":{"hex":"#f6d015ff","u16":[63158,53520,5333,65535]}}, +{"bias":0.5,"c1":"#ffff00ff","c2":"#da4453ff","out":{"hex":"#eda22aff","u16":[60781,41506,10666,65535]}}, +{"bias":0.75,"c1":"#ffff00ff","c2":"#da4453ff","out":{"hex":"#e3733eff","u16":[58403,29491,15998,65535]}}, +{"bias":0.9,"c1":"#ffff00ff","c2":"#da4453ff","out":{"hex":"#de574bff","u16":[56977,22282,19198,65535]}}, +{"bias":1,"c1":"#ffff00ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":1.5,"c1":"#ffff00ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":-0.5,"c1":"#ffff00ff","c2":"#e8cb2dff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0,"c1":"#ffff00ff","c2":"#e8cb2dff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.1,"c1":"#ffff00ff","c2":"#e8cb2dff","out":{"hex":"#fdfa05ff","u16":[64944,64199,1157,65535]}}, +{"bias":0.25,"c1":"#ffff00ff","c2":"#e8cb2dff","out":{"hex":"#f9f20bff","u16":[64057,62194,2891,65535]}}, +{"bias":0.5,"c1":"#ffff00ff","c2":"#e8cb2dff","out":{"hex":"#f4e517ff","u16":[62580,58853,5783,65535]}}, +{"bias":0.75,"c1":"#ffff00ff","c2":"#e8cb2dff","out":{"hex":"#eed822ff","u16":[61102,55512,8674,65535]}}, +{"bias":0.9,"c1":"#ffff00ff","c2":"#e8cb2dff","out":{"hex":"#ead029ff","u16":[60215,53507,10409,65535]}}, +{"bias":1,"c1":"#ffff00ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":1.5,"c1":"#ffff00ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":-0.5,"c1":"#ffff00ff","c2":"#3daee980","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0,"c1":"#ffff00ff","c2":"#3daee980","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.1,"c1":"#ffff00ff","c2":"#3daee980","out":{"hex":"#f5fb0cf2","u16":[62901,64435,3163,62271]}}, +{"bias":0.25,"c1":"#ffff00ff","c2":"#3daee980","out":{"hex":"#e3f321df","u16":[58389,62551,8583,57375]}}, +{"bias":0.5,"c1":"#ffff00ff","c2":"#3daee980","out":{"hex":"#bee44ec0","u16":[48872,58578,20012,49216]}}, +{"bias":0.75,"c1":"#ffff00ff","c2":"#3daee980","out":{"hex":"#8ace8ca0","u16":[35573,53025,35985,41056]}}, +{"bias":0.9,"c1":"#ffff00ff","c2":"#3daee980","out":{"hex":"#60bdbf8d","u16":[24713,48491,49028,36160]}}, +{"bias":1,"c1":"#ffff00ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":1.5,"c1":"#ffff00ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":-0.5,"c1":"#ffff00ff","c2":"#ffffff00","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0,"c1":"#ffff00ff","c2":"#ffffff00","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":0.1,"c1":"#ffff00ff","c2":"#ffffff00","out":{"hex":"#ffff00e6","u16":[65535,65535,0,58982]}}, +{"bias":0.25,"c1":"#ffff00ff","c2":"#ffffff00","out":{"hex":"#ffff00bf","u16":[65535,65535,0,49151]}}, +{"bias":0.5,"c1":"#ffff00ff","c2":"#ffffff00","out":{"hex":"#ffff0080","u16":[65535,65535,0,32768]}}, +{"bias":0.75,"c1":"#ffff00ff","c2":"#ffffff00","out":{"hex":"#ffff0040","u16":[65535,65535,0,16384]}}, +{"bias":0.9,"c1":"#ffff00ff","c2":"#ffffff00","out":{"hex":"#ffff001a","u16":[65535,65535,0,6554]}}, +{"bias":1,"c1":"#ffff00ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":1.5,"c1":"#ffff00ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":-0.5,"c1":"#030201ff","c2":"#000000ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0,"c1":"#030201ff","c2":"#000000ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.1,"c1":"#030201ff","c2":"#000000ff","out":{"hex":"#030201ff","u16":[694,463,231,65535]}}, +{"bias":0.25,"c1":"#030201ff","c2":"#000000ff","out":{"hex":"#020201ff","u16":[578,386,193,65535]}}, +{"bias":0.5,"c1":"#030201ff","c2":"#000000ff","out":{"hex":"#020101ff","u16":[386,257,129,65535]}}, +{"bias":0.75,"c1":"#030201ff","c2":"#000000ff","out":{"hex":"#010100ff","u16":[193,129,64,65535]}}, +{"bias":0.9,"c1":"#030201ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[77,51,26,65535]}}, +{"bias":1,"c1":"#030201ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":1.5,"c1":"#030201ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":-0.5,"c1":"#030201ff","c2":"#ffffffff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0,"c1":"#030201ff","c2":"#ffffffff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.1,"c1":"#030201ff","c2":"#ffffffff","out":{"hex":"#1c1b1aff","u16":[7247,7016,6785,65535]}}, +{"bias":0.25,"c1":"#030201ff","c2":"#ffffffff","out":{"hex":"#424141ff","u16":[16962,16769,16577,65535]}}, +{"bias":0.5,"c1":"#030201ff","c2":"#ffffffff","out":{"hex":"#818180ff","u16":[33153,33025,32896,65535]}}, +{"bias":0.75,"c1":"#030201ff","c2":"#ffffffff","out":{"hex":"#c0c0c0ff","u16":[49344,49280,49216,65535]}}, +{"bias":0.9,"c1":"#030201ff","c2":"#ffffffff","out":{"hex":"#e6e6e6ff","u16":[59059,59033,59007,65535]}}, +{"bias":1,"c1":"#030201ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":1.5,"c1":"#030201ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":-0.5,"c1":"#030201ff","c2":"#7f7f7fff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0,"c1":"#030201ff","c2":"#7f7f7fff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.1,"c1":"#030201ff","c2":"#7f7f7fff","out":{"hex":"#0f0f0eff","u16":[3958,3727,3495,65535]}}, +{"bias":0.25,"c1":"#030201ff","c2":"#7f7f7fff","out":{"hex":"#222121ff","u16":[8738,8545,8353,65535]}}, +{"bias":0.5,"c1":"#030201ff","c2":"#7f7f7fff","out":{"hex":"#414140ff","u16":[16705,16577,16448,65535]}}, +{"bias":0.75,"c1":"#030201ff","c2":"#7f7f7fff","out":{"hex":"#606060ff","u16":[24672,24608,24544,65535]}}, +{"bias":0.9,"c1":"#030201ff","c2":"#7f7f7fff","out":{"hex":"#737372ff","u16":[29452,29427,29401,65535]}}, +{"bias":1,"c1":"#030201ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":1.5,"c1":"#030201ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":-0.5,"c1":"#030201ff","c2":"#808080ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0,"c1":"#030201ff","c2":"#808080ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.1,"c1":"#030201ff","c2":"#808080ff","out":{"hex":"#100f0eff","u16":[3984,3752,3521,65535]}}, +{"bias":0.25,"c1":"#030201ff","c2":"#808080ff","out":{"hex":"#222221ff","u16":[8802,8610,8417,65535]}}, +{"bias":0.5,"c1":"#030201ff","c2":"#808080ff","out":{"hex":"#424141ff","u16":[16834,16705,16577,65535]}}, +{"bias":0.75,"c1":"#030201ff","c2":"#808080ff","out":{"hex":"#616160ff","u16":[24865,24801,24736,65535]}}, +{"bias":0.9,"c1":"#030201ff","c2":"#808080ff","out":{"hex":"#747373ff","u16":[29684,29658,29632,65535]}}, +{"bias":1,"c1":"#030201ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":1.5,"c1":"#030201ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":-0.5,"c1":"#030201ff","c2":"#ff0000ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0,"c1":"#030201ff","c2":"#ff0000ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.1,"c1":"#030201ff","c2":"#ff0000ff","out":{"hex":"#1c0201ff","u16":[7247,463,231,65535]}}, +{"bias":0.25,"c1":"#030201ff","c2":"#ff0000ff","out":{"hex":"#420201ff","u16":[16962,386,193,65535]}}, +{"bias":0.5,"c1":"#030201ff","c2":"#ff0000ff","out":{"hex":"#810101ff","u16":[33153,257,129,65535]}}, +{"bias":0.75,"c1":"#030201ff","c2":"#ff0000ff","out":{"hex":"#c00100ff","u16":[49344,129,64,65535]}}, +{"bias":0.9,"c1":"#030201ff","c2":"#ff0000ff","out":{"hex":"#e60000ff","u16":[59059,51,26,65535]}}, +{"bias":1,"c1":"#030201ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":1.5,"c1":"#030201ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":-0.5,"c1":"#030201ff","c2":"#00ff00ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0,"c1":"#030201ff","c2":"#00ff00ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.1,"c1":"#030201ff","c2":"#00ff00ff","out":{"hex":"#031b01ff","u16":[694,7016,231,65535]}}, +{"bias":0.25,"c1":"#030201ff","c2":"#00ff00ff","out":{"hex":"#024101ff","u16":[578,16769,193,65535]}}, +{"bias":0.5,"c1":"#030201ff","c2":"#00ff00ff","out":{"hex":"#028101ff","u16":[386,33025,129,65535]}}, +{"bias":0.75,"c1":"#030201ff","c2":"#00ff00ff","out":{"hex":"#01c000ff","u16":[193,49280,64,65535]}}, +{"bias":0.9,"c1":"#030201ff","c2":"#00ff00ff","out":{"hex":"#00e600ff","u16":[77,59033,26,65535]}}, +{"bias":1,"c1":"#030201ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":1.5,"c1":"#030201ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":-0.5,"c1":"#030201ff","c2":"#0000ffff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0,"c1":"#030201ff","c2":"#0000ffff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.1,"c1":"#030201ff","c2":"#0000ffff","out":{"hex":"#03021aff","u16":[694,463,6785,65535]}}, +{"bias":0.25,"c1":"#030201ff","c2":"#0000ffff","out":{"hex":"#020241ff","u16":[578,386,16577,65535]}}, +{"bias":0.5,"c1":"#030201ff","c2":"#0000ffff","out":{"hex":"#020180ff","u16":[386,257,32896,65535]}}, +{"bias":0.75,"c1":"#030201ff","c2":"#0000ffff","out":{"hex":"#0101c0ff","u16":[193,129,49216,65535]}}, +{"bias":0.9,"c1":"#030201ff","c2":"#0000ffff","out":{"hex":"#0000e6ff","u16":[77,51,59007,65535]}}, +{"bias":1,"c1":"#030201ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":1.5,"c1":"#030201ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":-0.5,"c1":"#030201ff","c2":"#ffff00ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0,"c1":"#030201ff","c2":"#ffff00ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.1,"c1":"#030201ff","c2":"#ffff00ff","out":{"hex":"#1c1b01ff","u16":[7247,7016,231,65535]}}, +{"bias":0.25,"c1":"#030201ff","c2":"#ffff00ff","out":{"hex":"#424101ff","u16":[16962,16769,193,65535]}}, +{"bias":0.5,"c1":"#030201ff","c2":"#ffff00ff","out":{"hex":"#818101ff","u16":[33153,33025,129,65535]}}, +{"bias":0.75,"c1":"#030201ff","c2":"#ffff00ff","out":{"hex":"#c0c000ff","u16":[49344,49280,64,65535]}}, +{"bias":0.9,"c1":"#030201ff","c2":"#ffff00ff","out":{"hex":"#e6e600ff","u16":[59059,59033,26,65535]}}, +{"bias":1,"c1":"#030201ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":1.5,"c1":"#030201ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":-0.5,"c1":"#030201ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0,"c1":"#030201ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.1,"c1":"#030201ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.25,"c1":"#030201ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.5,"c1":"#030201ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.75,"c1":"#030201ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.9,"c1":"#030201ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":1,"c1":"#030201ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":1.5,"c1":"#030201ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":-0.5,"c1":"#030201ff","c2":"#3daee9ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0,"c1":"#030201ff","c2":"#3daee9ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.1,"c1":"#030201ff","c2":"#3daee9ff","out":{"hex":"#091318ff","u16":[2262,4934,6219,65535]}}, +{"bias":0.25,"c1":"#030201ff","c2":"#3daee9ff","out":{"hex":"#122d3bff","u16":[4498,11565,15163,65535]}}, +{"bias":0.5,"c1":"#030201ff","c2":"#3daee9ff","out":{"hex":"#205875ff","u16":[8224,22616,30069,65535]}}, +{"bias":0.75,"c1":"#030201ff","c2":"#3daee9ff","out":{"hex":"#2f83afff","u16":[11951,33667,44975,65535]}}, +{"bias":0.9,"c1":"#030201ff","c2":"#3daee9ff","out":{"hex":"#379dd2ff","u16":[14186,40298,53919,65535]}}, +{"bias":1,"c1":"#030201ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":1.5,"c1":"#030201ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":-0.5,"c1":"#030201ff","c2":"#232629ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0,"c1":"#030201ff","c2":"#232629ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.1,"c1":"#030201ff","c2":"#232629ff","out":{"hex":"#060605ff","u16":[1593,1439,1285,65535]}}, +{"bias":0.25,"c1":"#030201ff","c2":"#232629ff","out":{"hex":"#0b0b0bff","u16":[2827,2827,2827,65535]}}, +{"bias":0.5,"c1":"#030201ff","c2":"#232629ff","out":{"hex":"#131415ff","u16":[4883,5140,5397,65535]}}, +{"bias":0.75,"c1":"#030201ff","c2":"#232629ff","out":{"hex":"#1b1d1fff","u16":[6939,7453,7967,65535]}}, +{"bias":0.9,"c1":"#030201ff","c2":"#232629ff","out":{"hex":"#202225ff","u16":[8173,8841,9509,65535]}}, +{"bias":1,"c1":"#030201ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":1.5,"c1":"#030201ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":-0.5,"c1":"#030201ff","c2":"#eff0f1ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0,"c1":"#030201ff","c2":"#eff0f1ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.1,"c1":"#030201ff","c2":"#eff0f1ff","out":{"hex":"#1b1a19ff","u16":[6836,6631,6425,65535]}}, +{"bias":0.25,"c1":"#030201ff","c2":"#eff0f1ff","out":{"hex":"#3e3e3dff","u16":[15934,15806,15677,65535]}}, +{"bias":0.5,"c1":"#030201ff","c2":"#eff0f1ff","out":{"hex":"#797979ff","u16":[31097,31097,31097,65535]}}, +{"bias":0.75,"c1":"#030201ff","c2":"#eff0f1ff","out":{"hex":"#b4b5b5ff","u16":[46260,46389,46517,65535]}}, +{"bias":0.9,"c1":"#030201ff","c2":"#eff0f1ff","out":{"hex":"#d7d8d9ff","u16":[55358,55563,55769,65535]}}, +{"bias":1,"c1":"#030201ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":1.5,"c1":"#030201ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":-0.5,"c1":"#030201ff","c2":"#fcfcfcff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0,"c1":"#030201ff","c2":"#fcfcfcff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.1,"c1":"#030201ff","c2":"#fcfcfcff","out":{"hex":"#1c1b1aff","u16":[7170,6939,6708,65535]}}, +{"bias":0.25,"c1":"#030201ff","c2":"#fcfcfcff","out":{"hex":"#414140ff","u16":[16769,16577,16384,65535]}}, +{"bias":0.5,"c1":"#030201ff","c2":"#fcfcfcff","out":{"hex":"#807f7fff","u16":[32768,32639,32511,65535]}}, +{"bias":0.75,"c1":"#030201ff","c2":"#fcfcfcff","out":{"hex":"#bebebdff","u16":[48766,48702,48637,65535]}}, +{"bias":0.9,"c1":"#030201ff","c2":"#fcfcfcff","out":{"hex":"#e3e3e3ff","u16":[58365,58339,58313,65535]}}, +{"bias":1,"c1":"#030201ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":1.5,"c1":"#030201ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":-0.5,"c1":"#030201ff","c2":"#da4453ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0,"c1":"#030201ff","c2":"#da4453ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.1,"c1":"#030201ff","c2":"#da4453ff","out":{"hex":"#190909ff","u16":[6297,2210,2364,65535]}}, +{"bias":0.25,"c1":"#030201ff","c2":"#da4453ff","out":{"hex":"#391316ff","u16":[14585,4755,5526,65535]}}, +{"bias":0.5,"c1":"#030201ff","c2":"#da4453ff","out":{"hex":"#6f232aff","u16":[28399,8995,10794,65535]}}, +{"bias":0.75,"c1":"#030201ff","c2":"#da4453ff","out":{"hex":"#a4343fff","u16":[42212,13236,16063,65535]}}, +{"bias":0.9,"c1":"#030201ff","c2":"#da4453ff","out":{"hex":"#c53d4bff","u16":[50501,15780,19224,65535]}}, +{"bias":1,"c1":"#030201ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":1.5,"c1":"#030201ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":-0.5,"c1":"#030201ff","c2":"#e8cb2dff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0,"c1":"#030201ff","c2":"#e8cb2dff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.1,"c1":"#030201ff","c2":"#e8cb2dff","out":{"hex":"#1a1605ff","u16":[6656,5680,1388,65535]}}, +{"bias":0.25,"c1":"#030201ff","c2":"#e8cb2dff","out":{"hex":"#3c340cff","u16":[15484,13428,3084,65535]}}, +{"bias":0.5,"c1":"#030201ff","c2":"#e8cb2dff","out":{"hex":"#766717ff","u16":[30198,26343,5911,65535]}}, +{"bias":0.75,"c1":"#030201ff","c2":"#e8cb2dff","out":{"hex":"#af9922ff","u16":[44911,39257,8738,65535]}}, +{"bias":0.9,"c1":"#030201ff","c2":"#e8cb2dff","out":{"hex":"#d1b729ff","u16":[53739,47005,10434,65535]}}, +{"bias":1,"c1":"#030201ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":1.5,"c1":"#030201ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":-0.5,"c1":"#030201ff","c2":"#3daee980","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0,"c1":"#030201ff","c2":"#3daee980","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.1,"c1":"#030201ff","c2":"#3daee980","out":{"hex":"#060b0df2","u16":[1558,2849,3407,62271]}}, +{"bias":0.25,"c1":"#030201ff","c2":"#3daee980","out":{"hex":"#0b1b22df","u16":[2908,6850,8803,57375]}}, +{"bias":0.5,"c1":"#030201ff","c2":"#3daee980","out":{"hex":"#163b4fc0","u16":[5753,15287,20184,49216]}}, +{"bias":0.75,"c1":"#030201ff","c2":"#3daee980","out":{"hex":"#26698ca0","u16":[9729,27078,36087,41056]}}, +{"bias":0.9,"c1":"#030201ff","c2":"#3daee980","out":{"hex":"#328fbf8d","u16":[12975,36707,49075,36160]}}, +{"bias":1,"c1":"#030201ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":1.5,"c1":"#030201ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":-0.5,"c1":"#030201ff","c2":"#ffffff00","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0,"c1":"#030201ff","c2":"#ffffff00","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":0.1,"c1":"#030201ff","c2":"#ffffff00","out":{"hex":"#030201e6","u16":[771,514,257,58982]}}, +{"bias":0.25,"c1":"#030201ff","c2":"#ffffff00","out":{"hex":"#030201bf","u16":[771,514,257,49151]}}, +{"bias":0.5,"c1":"#030201ff","c2":"#ffffff00","out":{"hex":"#03020180","u16":[771,514,257,32768]}}, +{"bias":0.75,"c1":"#030201ff","c2":"#ffffff00","out":{"hex":"#03020140","u16":[771,514,257,16384]}}, +{"bias":0.9,"c1":"#030201ff","c2":"#ffffff00","out":{"hex":"#0302011a","u16":[771,514,257,6554]}}, +{"bias":1,"c1":"#030201ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":1.5,"c1":"#030201ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":-0.5,"c1":"#3daee9ff","c2":"#000000ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0,"c1":"#3daee9ff","c2":"#000000ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.1,"c1":"#3daee9ff","c2":"#000000ff","out":{"hex":"#379dd2ff","u16":[14109,40246,53893,65535]}}, +{"bias":0.25,"c1":"#3daee9ff","c2":"#000000ff","out":{"hex":"#2e83afff","u16":[11758,33539,44911,65535]}}, +{"bias":0.5,"c1":"#3daee9ff","c2":"#000000ff","out":{"hex":"#1f5775ff","u16":[7839,22359,29941,65535]}}, +{"bias":0.75,"c1":"#3daee9ff","c2":"#000000ff","out":{"hex":"#0f2c3aff","u16":[3919,11180,14970,65535]}}, +{"bias":0.9,"c1":"#3daee9ff","c2":"#000000ff","out":{"hex":"#061117ff","u16":[1568,4472,5988,65535]}}, +{"bias":1,"c1":"#3daee9ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":1.5,"c1":"#3daee9ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":-0.5,"c1":"#3daee9ff","c2":"#ffffffff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0,"c1":"#3daee9ff","c2":"#ffffffff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.1,"c1":"#3daee9ff","c2":"#ffffffff","out":{"hex":"#50b6ebff","u16":[20663,46800,60446,65535]}}, +{"bias":0.25,"c1":"#3daee9ff","c2":"#ffffffff","out":{"hex":"#6ec2efff","u16":[28142,49922,61295,65535]}}, +{"bias":0.5,"c1":"#3daee9ff","c2":"#ffffffff","out":{"hex":"#9ed7f4ff","u16":[40606,55127,62708,65535]}}, +{"bias":0.75,"c1":"#3daee9ff","c2":"#ffffffff","out":{"hex":"#cfebfaff","u16":[53071,60331,64122,65535]}}, +{"bias":0.9,"c1":"#3daee9ff","c2":"#ffffffff","out":{"hex":"#ecf7fdff","u16":[60549,63453,64970,65535]}}, +{"bias":1,"c1":"#3daee9ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":1.5,"c1":"#3daee9ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":-0.5,"c1":"#3daee9ff","c2":"#7f7f7fff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0,"c1":"#3daee9ff","c2":"#7f7f7fff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.1,"c1":"#3daee9ff","c2":"#7f7f7fff","out":{"hex":"#44a9deff","u16":[17373,43510,57157,65535]}}, +{"bias":0.25,"c1":"#3daee9ff","c2":"#7f7f7fff","out":{"hex":"#4ea2cfff","u16":[19918,41698,53071,65535]}}, +{"bias":0.5,"c1":"#3daee9ff","c2":"#7f7f7fff","out":{"hex":"#5e97b4ff","u16":[24158,38679,46260,65535]}}, +{"bias":0.75,"c1":"#3daee9ff","c2":"#7f7f7fff","out":{"hex":"#6f8b9aff","u16":[28399,35659,39450,65535]}}, +{"bias":0.9,"c1":"#3daee9ff","c2":"#7f7f7fff","out":{"hex":"#78848aff","u16":[30943,33847,35363,65535]}}, +{"bias":1,"c1":"#3daee9ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":1.5,"c1":"#3daee9ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":-0.5,"c1":"#3daee9ff","c2":"#808080ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0,"c1":"#3daee9ff","c2":"#808080ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.1,"c1":"#3daee9ff","c2":"#808080ff","out":{"hex":"#44a9dfff","u16":[17399,43536,57183,65535]}}, +{"bias":0.25,"c1":"#3daee9ff","c2":"#808080ff","out":{"hex":"#4ea3cfff","u16":[19982,41763,53135,65535]}}, +{"bias":0.5,"c1":"#3daee9ff","c2":"#808080ff","out":{"hex":"#5f97b5ff","u16":[24287,38807,46389,65535]}}, +{"bias":0.75,"c1":"#3daee9ff","c2":"#808080ff","out":{"hex":"#6f8c9aff","u16":[28591,35852,39642,65535]}}, +{"bias":0.9,"c1":"#3daee9ff","c2":"#808080ff","out":{"hex":"#79858bff","u16":[31174,34078,35595,65535]}}, +{"bias":1,"c1":"#3daee9ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":1.5,"c1":"#3daee9ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":-0.5,"c1":"#3daee9ff","c2":"#ff0000ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0,"c1":"#3daee9ff","c2":"#ff0000ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.1,"c1":"#3daee9ff","c2":"#ff0000ff","out":{"hex":"#509dd2ff","u16":[20663,40246,53893,65535]}}, +{"bias":0.25,"c1":"#3daee9ff","c2":"#ff0000ff","out":{"hex":"#6e83afff","u16":[28142,33539,44911,65535]}}, +{"bias":0.5,"c1":"#3daee9ff","c2":"#ff0000ff","out":{"hex":"#9e5775ff","u16":[40606,22359,29941,65535]}}, +{"bias":0.75,"c1":"#3daee9ff","c2":"#ff0000ff","out":{"hex":"#cf2c3aff","u16":[53071,11180,14970,65535]}}, +{"bias":0.9,"c1":"#3daee9ff","c2":"#ff0000ff","out":{"hex":"#ec1117ff","u16":[60549,4472,5988,65535]}}, +{"bias":1,"c1":"#3daee9ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":1.5,"c1":"#3daee9ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":-0.5,"c1":"#3daee9ff","c2":"#00ff00ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0,"c1":"#3daee9ff","c2":"#00ff00ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.1,"c1":"#3daee9ff","c2":"#00ff00ff","out":{"hex":"#37b6d2ff","u16":[14109,46800,53893,65535]}}, +{"bias":0.25,"c1":"#3daee9ff","c2":"#00ff00ff","out":{"hex":"#2ec2afff","u16":[11758,49922,44911,65535]}}, +{"bias":0.5,"c1":"#3daee9ff","c2":"#00ff00ff","out":{"hex":"#1fd775ff","u16":[7839,55127,29941,65535]}}, +{"bias":0.75,"c1":"#3daee9ff","c2":"#00ff00ff","out":{"hex":"#0feb3aff","u16":[3919,60331,14970,65535]}}, +{"bias":0.9,"c1":"#3daee9ff","c2":"#00ff00ff","out":{"hex":"#06f717ff","u16":[1568,63453,5988,65535]}}, +{"bias":1,"c1":"#3daee9ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":1.5,"c1":"#3daee9ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":-0.5,"c1":"#3daee9ff","c2":"#0000ffff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0,"c1":"#3daee9ff","c2":"#0000ffff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.1,"c1":"#3daee9ff","c2":"#0000ffff","out":{"hex":"#379debff","u16":[14109,40246,60446,65535]}}, +{"bias":0.25,"c1":"#3daee9ff","c2":"#0000ffff","out":{"hex":"#2e83efff","u16":[11758,33539,61295,65535]}}, +{"bias":0.5,"c1":"#3daee9ff","c2":"#0000ffff","out":{"hex":"#1f57f4ff","u16":[7839,22359,62708,65535]}}, +{"bias":0.75,"c1":"#3daee9ff","c2":"#0000ffff","out":{"hex":"#0f2cfaff","u16":[3919,11180,64122,65535]}}, +{"bias":0.9,"c1":"#3daee9ff","c2":"#0000ffff","out":{"hex":"#0611fdff","u16":[1568,4472,64970,65535]}}, +{"bias":1,"c1":"#3daee9ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":1.5,"c1":"#3daee9ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":-0.5,"c1":"#3daee9ff","c2":"#ffff00ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0,"c1":"#3daee9ff","c2":"#ffff00ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.1,"c1":"#3daee9ff","c2":"#ffff00ff","out":{"hex":"#50b6d2ff","u16":[20663,46800,53893,65535]}}, +{"bias":0.25,"c1":"#3daee9ff","c2":"#ffff00ff","out":{"hex":"#6ec2afff","u16":[28142,49922,44911,65535]}}, +{"bias":0.5,"c1":"#3daee9ff","c2":"#ffff00ff","out":{"hex":"#9ed775ff","u16":[40606,55127,29941,65535]}}, +{"bias":0.75,"c1":"#3daee9ff","c2":"#ffff00ff","out":{"hex":"#cfeb3aff","u16":[53071,60331,14970,65535]}}, +{"bias":0.9,"c1":"#3daee9ff","c2":"#ffff00ff","out":{"hex":"#ecf717ff","u16":[60549,63453,5988,65535]}}, +{"bias":1,"c1":"#3daee9ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":1.5,"c1":"#3daee9ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":-0.5,"c1":"#3daee9ff","c2":"#030201ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0,"c1":"#3daee9ff","c2":"#030201ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.1,"c1":"#3daee9ff","c2":"#030201ff","out":{"hex":"#379dd2ff","u16":[14186,40298,53919,65535]}}, +{"bias":0.25,"c1":"#3daee9ff","c2":"#030201ff","out":{"hex":"#2f83afff","u16":[11951,33667,44975,65535]}}, +{"bias":0.5,"c1":"#3daee9ff","c2":"#030201ff","out":{"hex":"#205875ff","u16":[8224,22616,30069,65535]}}, +{"bias":0.75,"c1":"#3daee9ff","c2":"#030201ff","out":{"hex":"#122d3bff","u16":[4498,11565,15163,65535]}}, +{"bias":0.9,"c1":"#3daee9ff","c2":"#030201ff","out":{"hex":"#091318ff","u16":[2262,4934,6219,65535]}}, +{"bias":1,"c1":"#3daee9ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":1.5,"c1":"#3daee9ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":-0.5,"c1":"#3daee9ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0,"c1":"#3daee9ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.1,"c1":"#3daee9ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.25,"c1":"#3daee9ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.5,"c1":"#3daee9ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.75,"c1":"#3daee9ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.9,"c1":"#3daee9ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":1,"c1":"#3daee9ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":1.5,"c1":"#3daee9ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":-0.5,"c1":"#3daee9ff","c2":"#232629ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0,"c1":"#3daee9ff","c2":"#232629ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.1,"c1":"#3daee9ff","c2":"#232629ff","out":{"hex":"#3aa0d6ff","u16":[15009,41223,54947,65535]}}, +{"bias":0.25,"c1":"#3daee9ff","c2":"#232629ff","out":{"hex":"#378cb9ff","u16":[14007,35980,47545,65535]}}, +{"bias":0.5,"c1":"#3daee9ff","c2":"#232629ff","out":{"hex":"#306a89ff","u16":[12336,27242,35209,65535]}}, +{"bias":0.75,"c1":"#3daee9ff","c2":"#232629ff","out":{"hex":"#2a4859ff","u16":[10666,18504,22873,65535]}}, +{"bias":0.9,"c1":"#3daee9ff","c2":"#232629ff","out":{"hex":"#26343cff","u16":[9663,13261,15471,65535]}}, +{"bias":1,"c1":"#3daee9ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":1.5,"c1":"#3daee9ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":-0.5,"c1":"#3daee9ff","c2":"#eff0f1ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0,"c1":"#3daee9ff","c2":"#eff0f1ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.1,"c1":"#3daee9ff","c2":"#eff0f1ff","out":{"hex":"#4fb5eaff","u16":[20252,46414,60087,65535]}}, +{"bias":0.25,"c1":"#3daee9ff","c2":"#eff0f1ff","out":{"hex":"#6abfebff","u16":[27114,48959,60395,65535]}}, +{"bias":0.5,"c1":"#3daee9ff","c2":"#eff0f1ff","out":{"hex":"#96cfedff","u16":[38550,53199,60909,65535]}}, +{"bias":0.75,"c1":"#3daee9ff","c2":"#eff0f1ff","out":{"hex":"#c3e0efff","u16":[49987,57440,61423,65535]}}, +{"bias":0.9,"c1":"#3daee9ff","c2":"#eff0f1ff","out":{"hex":"#dde9f0ff","u16":[56848,59984,61731,65535]}}, +{"bias":1,"c1":"#3daee9ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":1.5,"c1":"#3daee9ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":-0.5,"c1":"#3daee9ff","c2":"#fcfcfcff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0,"c1":"#3daee9ff","c2":"#fcfcfcff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.1,"c1":"#3daee9ff","c2":"#fcfcfcff","out":{"hex":"#50b6ebff","u16":[20586,46723,60369,65535]}}, +{"bias":0.25,"c1":"#3daee9ff","c2":"#fcfcfcff","out":{"hex":"#6dc2eeff","u16":[27949,49730,61102,65535]}}, +{"bias":0.5,"c1":"#3daee9ff","c2":"#fcfcfcff","out":{"hex":"#9dd5f3ff","u16":[40221,54741,62323,65535]}}, +{"bias":0.75,"c1":"#3daee9ff","c2":"#fcfcfcff","out":{"hex":"#cce9f7ff","u16":[52492,59753,63543,65535]}}, +{"bias":0.9,"c1":"#3daee9ff","c2":"#fcfcfcff","out":{"hex":"#e9f4faff","u16":[59855,62759,64276,65535]}}, +{"bias":1,"c1":"#3daee9ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":1.5,"c1":"#3daee9ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":-0.5,"c1":"#3daee9ff","c2":"#da4453ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0,"c1":"#3daee9ff","c2":"#da4453ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.1,"c1":"#3daee9ff","c2":"#da4453ff","out":{"hex":"#4da3daff","u16":[19712,41994,56026,65535]}}, +{"bias":0.25,"c1":"#3daee9ff","c2":"#da4453ff","out":{"hex":"#6494c4ff","u16":[25764,37908,50244,65535]}}, +{"bias":0.5,"c1":"#3daee9ff","c2":"#da4453ff","out":{"hex":"#8c799eff","u16":[35852,31097,40606,65535]}}, +{"bias":0.75,"c1":"#3daee9ff","c2":"#da4453ff","out":{"hex":"#b35f79ff","u16":[45939,24287,30969,65535]}}, +{"bias":0.9,"c1":"#3daee9ff","c2":"#da4453ff","out":{"hex":"#ca4f62ff","u16":[51991,20200,25186,65535]}}, +{"bias":1,"c1":"#3daee9ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":1.5,"c1":"#3daee9ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":-0.5,"c1":"#3daee9ff","c2":"#e8cb2dff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0,"c1":"#3daee9ff","c2":"#e8cb2dff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.1,"c1":"#3daee9ff","c2":"#e8cb2dff","out":{"hex":"#4eb1d6ff","u16":[20072,45463,55049,65535]}}, +{"bias":0.25,"c1":"#3daee9ff","c2":"#e8cb2dff","out":{"hex":"#68b5baff","u16":[26664,46581,47802,65535]}}, +{"bias":0.5,"c1":"#3daee9ff","c2":"#e8cb2dff","out":{"hex":"#93bd8bff","u16":[37651,48445,35723,65535]}}, +{"bias":0.75,"c1":"#3daee9ff","c2":"#e8cb2dff","out":{"hex":"#bdc45cff","u16":[48637,50308,23644,65535]}}, +{"bias":0.9,"c1":"#3daee9ff","c2":"#e8cb2dff","out":{"hex":"#d7c840ff","u16":[55229,51426,16397,65535]}}, +{"bias":1,"c1":"#3daee9ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":1.5,"c1":"#3daee9ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":-0.5,"c1":"#3daee9ff","c2":"#3daee980","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0,"c1":"#3daee9ff","c2":"#3daee980","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.1,"c1":"#3daee9ff","c2":"#3daee980","out":{"hex":"#3daee9f2","u16":[15677,44718,59881,62271]}}, +{"bias":0.25,"c1":"#3daee9ff","c2":"#3daee980","out":{"hex":"#3daee9df","u16":[15677,44718,59881,57375]}}, +{"bias":0.5,"c1":"#3daee9ff","c2":"#3daee980","out":{"hex":"#3daee9c0","u16":[15677,44718,59881,49216]}}, +{"bias":0.75,"c1":"#3daee9ff","c2":"#3daee980","out":{"hex":"#3daee9a0","u16":[15677,44718,59881,41056]}}, +{"bias":0.9,"c1":"#3daee9ff","c2":"#3daee980","out":{"hex":"#3daee98d","u16":[15677,44718,59881,36160]}}, +{"bias":1,"c1":"#3daee9ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":1.5,"c1":"#3daee9ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":-0.5,"c1":"#3daee9ff","c2":"#ffffff00","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0,"c1":"#3daee9ff","c2":"#ffffff00","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":0.1,"c1":"#3daee9ff","c2":"#ffffff00","out":{"hex":"#3daee9e6","u16":[15677,44718,59881,58982]}}, +{"bias":0.25,"c1":"#3daee9ff","c2":"#ffffff00","out":{"hex":"#3daee9bf","u16":[15677,44718,59881,49151]}}, +{"bias":0.5,"c1":"#3daee9ff","c2":"#ffffff00","out":{"hex":"#3daee980","u16":[15677,44718,59881,32768]}}, +{"bias":0.75,"c1":"#3daee9ff","c2":"#ffffff00","out":{"hex":"#3daee940","u16":[15677,44718,59881,16384]}}, +{"bias":0.9,"c1":"#3daee9ff","c2":"#ffffff00","out":{"hex":"#3daee91a","u16":[15677,44718,59881,6554]}}, +{"bias":1,"c1":"#3daee9ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":1.5,"c1":"#3daee9ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":-0.5,"c1":"#232629ff","c2":"#000000ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0,"c1":"#232629ff","c2":"#000000ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.1,"c1":"#232629ff","c2":"#000000ff","out":{"hex":"#202225ff","u16":[8096,8789,9483,65535]}}, +{"bias":0.25,"c1":"#232629ff","c2":"#000000ff","out":{"hex":"#1a1d1fff","u16":[6746,7325,7903,65535]}}, +{"bias":0.5,"c1":"#232629ff","c2":"#000000ff","out":{"hex":"#121315ff","u16":[4498,4883,5269,65535]}}, +{"bias":0.75,"c1":"#232629ff","c2":"#000000ff","out":{"hex":"#090a0aff","u16":[2249,2442,2634,65535]}}, +{"bias":0.9,"c1":"#232629ff","c2":"#000000ff","out":{"hex":"#040404ff","u16":[900,977,1054,65535]}}, +{"bias":1,"c1":"#232629ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":1.5,"c1":"#232629ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":-0.5,"c1":"#232629ff","c2":"#ffffffff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0,"c1":"#232629ff","c2":"#ffffffff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.1,"c1":"#232629ff","c2":"#ffffffff","out":{"hex":"#393c3eff","u16":[14649,15343,16037,65535]}}, +{"bias":0.25,"c1":"#232629ff","c2":"#ffffffff","out":{"hex":"#5a5c5fff","u16":[23130,23708,24287,65535]}}, +{"bias":0.5,"c1":"#232629ff","c2":"#ffffffff","out":{"hex":"#919394ff","u16":[37265,37651,38036,65535]}}, +{"bias":0.75,"c1":"#232629ff","c2":"#ffffffff","out":{"hex":"#c8c9caff","u16":[51400,51593,51786,65535]}}, +{"bias":0.9,"c1":"#232629ff","c2":"#ffffffff","out":{"hex":"#e9e9eaff","u16":[59881,59958,60035,65535]}}, +{"bias":1,"c1":"#232629ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":1.5,"c1":"#232629ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":-0.5,"c1":"#232629ff","c2":"#7f7f7fff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0,"c1":"#232629ff","c2":"#7f7f7fff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.1,"c1":"#232629ff","c2":"#7f7f7fff","out":{"hex":"#2c2f32ff","u16":[11359,12053,12747,65535]}}, +{"bias":0.25,"c1":"#232629ff","c2":"#7f7f7fff","out":{"hex":"#3a3c3fff","u16":[14906,15484,16063,65535]}}, +{"bias":0.5,"c1":"#232629ff","c2":"#7f7f7fff","out":{"hex":"#515354ff","u16":[20817,21203,21588,65535]}}, +{"bias":0.75,"c1":"#232629ff","c2":"#7f7f7fff","out":{"hex":"#68696aff","u16":[26728,26921,27114,65535]}}, +{"bias":0.9,"c1":"#232629ff","c2":"#7f7f7fff","out":{"hex":"#767676ff","u16":[30275,30352,30429,65535]}}, +{"bias":1,"c1":"#232629ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":1.5,"c1":"#232629ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":-0.5,"c1":"#232629ff","c2":"#808080ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0,"c1":"#232629ff","c2":"#808080ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.1,"c1":"#232629ff","c2":"#808080ff","out":{"hex":"#2c2f32ff","u16":[11385,12079,12773,65535]}}, +{"bias":0.25,"c1":"#232629ff","c2":"#808080ff","out":{"hex":"#3a3d3fff","u16":[14970,15549,16127,65535]}}, +{"bias":0.5,"c1":"#232629ff","c2":"#808080ff","out":{"hex":"#525355ff","u16":[20946,21331,21717,65535]}}, +{"bias":0.75,"c1":"#232629ff","c2":"#808080ff","out":{"hex":"#696a6aff","u16":[26921,27114,27306,65535]}}, +{"bias":0.9,"c1":"#232629ff","c2":"#808080ff","out":{"hex":"#777777ff","u16":[30506,30583,30660,65535]}}, +{"bias":1,"c1":"#232629ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":1.5,"c1":"#232629ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":-0.5,"c1":"#232629ff","c2":"#ff0000ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0,"c1":"#232629ff","c2":"#ff0000ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.1,"c1":"#232629ff","c2":"#ff0000ff","out":{"hex":"#392225ff","u16":[14649,8789,9483,65535]}}, +{"bias":0.25,"c1":"#232629ff","c2":"#ff0000ff","out":{"hex":"#5a1d1fff","u16":[23130,7325,7903,65535]}}, +{"bias":0.5,"c1":"#232629ff","c2":"#ff0000ff","out":{"hex":"#911315ff","u16":[37265,4883,5269,65535]}}, +{"bias":0.75,"c1":"#232629ff","c2":"#ff0000ff","out":{"hex":"#c80a0aff","u16":[51400,2442,2634,65535]}}, +{"bias":0.9,"c1":"#232629ff","c2":"#ff0000ff","out":{"hex":"#e90404ff","u16":[59881,977,1054,65535]}}, +{"bias":1,"c1":"#232629ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":1.5,"c1":"#232629ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":-0.5,"c1":"#232629ff","c2":"#00ff00ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0,"c1":"#232629ff","c2":"#00ff00ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.1,"c1":"#232629ff","c2":"#00ff00ff","out":{"hex":"#203c25ff","u16":[8096,15343,9483,65535]}}, +{"bias":0.25,"c1":"#232629ff","c2":"#00ff00ff","out":{"hex":"#1a5c1fff","u16":[6746,23708,7903,65535]}}, +{"bias":0.5,"c1":"#232629ff","c2":"#00ff00ff","out":{"hex":"#129315ff","u16":[4498,37651,5269,65535]}}, +{"bias":0.75,"c1":"#232629ff","c2":"#00ff00ff","out":{"hex":"#09c90aff","u16":[2249,51593,2634,65535]}}, +{"bias":0.9,"c1":"#232629ff","c2":"#00ff00ff","out":{"hex":"#04e904ff","u16":[900,59958,1054,65535]}}, +{"bias":1,"c1":"#232629ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":1.5,"c1":"#232629ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":-0.5,"c1":"#232629ff","c2":"#0000ffff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0,"c1":"#232629ff","c2":"#0000ffff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.1,"c1":"#232629ff","c2":"#0000ffff","out":{"hex":"#20223eff","u16":[8096,8789,16037,65535]}}, +{"bias":0.25,"c1":"#232629ff","c2":"#0000ffff","out":{"hex":"#1a1d5fff","u16":[6746,7325,24287,65535]}}, +{"bias":0.5,"c1":"#232629ff","c2":"#0000ffff","out":{"hex":"#121394ff","u16":[4498,4883,38036,65535]}}, +{"bias":0.75,"c1":"#232629ff","c2":"#0000ffff","out":{"hex":"#090acaff","u16":[2249,2442,51786,65535]}}, +{"bias":0.9,"c1":"#232629ff","c2":"#0000ffff","out":{"hex":"#0404eaff","u16":[900,977,60035,65535]}}, +{"bias":1,"c1":"#232629ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":1.5,"c1":"#232629ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":-0.5,"c1":"#232629ff","c2":"#ffff00ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0,"c1":"#232629ff","c2":"#ffff00ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.1,"c1":"#232629ff","c2":"#ffff00ff","out":{"hex":"#393c25ff","u16":[14649,15343,9483,65535]}}, +{"bias":0.25,"c1":"#232629ff","c2":"#ffff00ff","out":{"hex":"#5a5c1fff","u16":[23130,23708,7903,65535]}}, +{"bias":0.5,"c1":"#232629ff","c2":"#ffff00ff","out":{"hex":"#919315ff","u16":[37265,37651,5269,65535]}}, +{"bias":0.75,"c1":"#232629ff","c2":"#ffff00ff","out":{"hex":"#c8c90aff","u16":[51400,51593,2634,65535]}}, +{"bias":0.9,"c1":"#232629ff","c2":"#ffff00ff","out":{"hex":"#e9e904ff","u16":[59881,59958,1054,65535]}}, +{"bias":1,"c1":"#232629ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":1.5,"c1":"#232629ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":-0.5,"c1":"#232629ff","c2":"#030201ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0,"c1":"#232629ff","c2":"#030201ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.1,"c1":"#232629ff","c2":"#030201ff","out":{"hex":"#202225ff","u16":[8173,8841,9509,65535]}}, +{"bias":0.25,"c1":"#232629ff","c2":"#030201ff","out":{"hex":"#1b1d1fff","u16":[6939,7453,7967,65535]}}, +{"bias":0.5,"c1":"#232629ff","c2":"#030201ff","out":{"hex":"#131415ff","u16":[4883,5140,5397,65535]}}, +{"bias":0.75,"c1":"#232629ff","c2":"#030201ff","out":{"hex":"#0b0b0bff","u16":[2827,2827,2827,65535]}}, +{"bias":0.9,"c1":"#232629ff","c2":"#030201ff","out":{"hex":"#060605ff","u16":[1593,1439,1285,65535]}}, +{"bias":1,"c1":"#232629ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":1.5,"c1":"#232629ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":-0.5,"c1":"#232629ff","c2":"#3daee9ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0,"c1":"#232629ff","c2":"#3daee9ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.1,"c1":"#232629ff","c2":"#3daee9ff","out":{"hex":"#26343cff","u16":[9663,13261,15471,65535]}}, +{"bias":0.25,"c1":"#232629ff","c2":"#3daee9ff","out":{"hex":"#2a4859ff","u16":[10666,18504,22873,65535]}}, +{"bias":0.5,"c1":"#232629ff","c2":"#3daee9ff","out":{"hex":"#306a89ff","u16":[12336,27242,35209,65535]}}, +{"bias":0.75,"c1":"#232629ff","c2":"#3daee9ff","out":{"hex":"#378cb9ff","u16":[14007,35980,47545,65535]}}, +{"bias":0.9,"c1":"#232629ff","c2":"#3daee9ff","out":{"hex":"#3aa0d6ff","u16":[15009,41223,54947,65535]}}, +{"bias":1,"c1":"#232629ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":1.5,"c1":"#232629ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":-0.5,"c1":"#232629ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0,"c1":"#232629ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.1,"c1":"#232629ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.25,"c1":"#232629ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.5,"c1":"#232629ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.75,"c1":"#232629ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.9,"c1":"#232629ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":1,"c1":"#232629ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":1.5,"c1":"#232629ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":-0.5,"c1":"#232629ff","c2":"#eff0f1ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0,"c1":"#232629ff","c2":"#eff0f1ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.1,"c1":"#232629ff","c2":"#eff0f1ff","out":{"hex":"#373a3dff","u16":[14238,14957,15677,65535]}}, +{"bias":0.25,"c1":"#232629ff","c2":"#eff0f1ff","out":{"hex":"#56595bff","u16":[22102,22745,23387,65535]}}, +{"bias":0.5,"c1":"#232629ff","c2":"#eff0f1ff","out":{"hex":"#898b8dff","u16":[35209,35723,36237,65535]}}, +{"bias":0.75,"c1":"#232629ff","c2":"#eff0f1ff","out":{"hex":"#bcbebfff","u16":[48316,48702,49087,65535]}}, +{"bias":0.9,"c1":"#232629ff","c2":"#eff0f1ff","out":{"hex":"#dbdcddff","u16":[56180,56489,56797,65535]}}, +{"bias":1,"c1":"#232629ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":1.5,"c1":"#232629ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":-0.5,"c1":"#232629ff","c2":"#fcfcfcff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0,"c1":"#232629ff","c2":"#fcfcfcff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.1,"c1":"#232629ff","c2":"#fcfcfcff","out":{"hex":"#393b3eff","u16":[14572,15266,15960,65535]}}, +{"bias":0.25,"c1":"#232629ff","c2":"#fcfcfcff","out":{"hex":"#595c5eff","u16":[22937,23516,24094,65535]}}, +{"bias":0.5,"c1":"#232629ff","c2":"#fcfcfcff","out":{"hex":"#909193ff","u16":[36880,37265,37651,65535]}}, +{"bias":0.75,"c1":"#232629ff","c2":"#fcfcfcff","out":{"hex":"#c6c7c7ff","u16":[50822,51015,51207,65535]}}, +{"bias":0.9,"c1":"#232629ff","c2":"#fcfcfcff","out":{"hex":"#e6e7e7ff","u16":[59187,59264,59341,65535]}}, +{"bias":1,"c1":"#232629ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":1.5,"c1":"#232629ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":-0.5,"c1":"#232629ff","c2":"#da4453ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0,"c1":"#232629ff","c2":"#da4453ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.1,"c1":"#232629ff","c2":"#da4453ff","out":{"hex":"#35292dff","u16":[13698,10537,11616,65535]}}, +{"bias":0.25,"c1":"#232629ff","c2":"#da4453ff","out":{"hex":"#512e34ff","u16":[20753,11694,13236,65535]}}, +{"bias":0.5,"c1":"#232629ff","c2":"#da4453ff","out":{"hex":"#7f353eff","u16":[32511,13621,15934,65535]}}, +{"bias":0.75,"c1":"#232629ff","c2":"#da4453ff","out":{"hex":"#ac3d49ff","u16":[44268,15549,18633,65535]}}, +{"bias":0.9,"c1":"#232629ff","c2":"#da4453ff","out":{"hex":"#c8414fff","u16":[51323,16705,20252,65535]}}, +{"bias":1,"c1":"#232629ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":1.5,"c1":"#232629ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":-0.5,"c1":"#232629ff","c2":"#e8cb2dff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0,"c1":"#232629ff","c2":"#e8cb2dff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.1,"c1":"#232629ff","c2":"#e8cb2dff","out":{"hex":"#373729ff","u16":[14058,14007,10640,65535]}}, +{"bias":0.25,"c1":"#232629ff","c2":"#e8cb2dff","out":{"hex":"#544f2aff","u16":[21652,20367,10794,65535]}}, +{"bias":0.5,"c1":"#232629ff","c2":"#e8cb2dff","out":{"hex":"#86792bff","u16":[34310,30969,11051,65535]}}, +{"bias":0.75,"c1":"#232629ff","c2":"#e8cb2dff","out":{"hex":"#b7a22cff","u16":[46967,41570,11308,65535]}}, +{"bias":0.9,"c1":"#232629ff","c2":"#e8cb2dff","out":{"hex":"#d4bb2dff","u16":[54561,47931,11462,65535]}}, +{"bias":1,"c1":"#232629ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":1.5,"c1":"#232629ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":-0.5,"c1":"#232629ff","c2":"#3daee980","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0,"c1":"#232629ff","c2":"#3daee980","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.1,"c1":"#232629ff","c2":"#3daee980","out":{"hex":"#242d33f2","u16":[9348,11612,13144,62271]}}, +{"bias":0.25,"c1":"#232629ff","c2":"#3daee980","out":{"hex":"#273945df","u16":[9953,14776,17610,57375]}}, +{"bias":0.5,"c1":"#232629ff","c2":"#3daee980","out":{"hex":"#2c5369c0","u16":[11228,21447,27028,49216]}}, +{"bias":0.75,"c1":"#232629ff","c2":"#3daee980","out":{"hex":"#33789ca0","u16":[13010,30770,40190,41056]}}, +{"bias":0.9,"c1":"#232629ff","c2":"#3daee980","out":{"hex":"#3895c68d","u16":[14466,38383,50938,36160]}}, +{"bias":1,"c1":"#232629ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":1.5,"c1":"#232629ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":-0.5,"c1":"#232629ff","c2":"#ffffff00","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0,"c1":"#232629ff","c2":"#ffffff00","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":0.1,"c1":"#232629ff","c2":"#ffffff00","out":{"hex":"#232629e6","u16":[8995,9766,10537,58982]}}, +{"bias":0.25,"c1":"#232629ff","c2":"#ffffff00","out":{"hex":"#232629bf","u16":[8995,9766,10537,49151]}}, +{"bias":0.5,"c1":"#232629ff","c2":"#ffffff00","out":{"hex":"#23262980","u16":[8995,9766,10537,32768]}}, +{"bias":0.75,"c1":"#232629ff","c2":"#ffffff00","out":{"hex":"#23262940","u16":[8995,9766,10537,16384]}}, +{"bias":0.9,"c1":"#232629ff","c2":"#ffffff00","out":{"hex":"#2326291a","u16":[8995,9766,10537,6554]}}, +{"bias":1,"c1":"#232629ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":1.5,"c1":"#232629ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":-0.5,"c1":"#eff0f1ff","c2":"#000000ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0,"c1":"#eff0f1ff","c2":"#000000ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.1,"c1":"#eff0f1ff","c2":"#000000ff","out":{"hex":"#d7d8d9ff","u16":[55281,55512,55743,65535]}}, +{"bias":0.25,"c1":"#eff0f1ff","c2":"#000000ff","out":{"hex":"#b3b4b5ff","u16":[46067,46260,46453,65535]}}, +{"bias":0.5,"c1":"#eff0f1ff","c2":"#000000ff","out":{"hex":"#787879ff","u16":[30712,30840,30969,65535]}}, +{"bias":0.75,"c1":"#eff0f1ff","c2":"#000000ff","out":{"hex":"#3c3c3cff","u16":[15356,15420,15484,65535]}}, +{"bias":0.9,"c1":"#eff0f1ff","c2":"#000000ff","out":{"hex":"#181818ff","u16":[6142,6168,6194,65535]}}, +{"bias":1,"c1":"#eff0f1ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":1.5,"c1":"#eff0f1ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":-0.5,"c1":"#eff0f1ff","c2":"#ffffffff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0,"c1":"#eff0f1ff","c2":"#ffffffff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.1,"c1":"#eff0f1ff","c2":"#ffffffff","out":{"hex":"#f1f2f2ff","u16":[61834,62066,62297,65535]}}, +{"bias":0.25,"c1":"#eff0f1ff","c2":"#ffffffff","out":{"hex":"#f3f4f5ff","u16":[62451,62644,62837,65535]}}, +{"bias":0.5,"c1":"#eff0f1ff","c2":"#ffffffff","out":{"hex":"#f7f8f8ff","u16":[63479,63608,63736,65535]}}, +{"bias":0.75,"c1":"#eff0f1ff","c2":"#ffffffff","out":{"hex":"#fbfbfcff","u16":[64507,64571,64636,65535]}}, +{"bias":0.9,"c1":"#eff0f1ff","c2":"#ffffffff","out":{"hex":"#fdfefeff","u16":[65124,65150,65175,65535]}}, +{"bias":1,"c1":"#eff0f1ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":1.5,"c1":"#eff0f1ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":-0.5,"c1":"#eff0f1ff","c2":"#7f7f7fff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0,"c1":"#eff0f1ff","c2":"#7f7f7fff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.1,"c1":"#eff0f1ff","c2":"#7f7f7fff","out":{"hex":"#e4e5e6ff","u16":[58545,58776,59007,65535]}}, +{"bias":0.25,"c1":"#eff0f1ff","c2":"#7f7f7fff","out":{"hex":"#d3d4d5ff","u16":[54227,54420,54613,65535]}}, +{"bias":0.5,"c1":"#eff0f1ff","c2":"#7f7f7fff","out":{"hex":"#b7b8b8ff","u16":[47031,47160,47288,65535]}}, +{"bias":0.75,"c1":"#eff0f1ff","c2":"#7f7f7fff","out":{"hex":"#9b9b9cff","u16":[39835,39899,39964,65535]}}, +{"bias":0.9,"c1":"#eff0f1ff","c2":"#7f7f7fff","out":{"hex":"#8a8a8aff","u16":[35517,35543,35569,65535]}}, +{"bias":1,"c1":"#eff0f1ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":1.5,"c1":"#eff0f1ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":-0.5,"c1":"#eff0f1ff","c2":"#808080ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0,"c1":"#eff0f1ff","c2":"#808080ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.1,"c1":"#eff0f1ff","c2":"#808080ff","out":{"hex":"#e4e5e6ff","u16":[58570,58802,59033,65535]}}, +{"bias":0.25,"c1":"#eff0f1ff","c2":"#808080ff","out":{"hex":"#d3d4d5ff","u16":[54291,54484,54677,65535]}}, +{"bias":0.5,"c1":"#eff0f1ff","c2":"#808080ff","out":{"hex":"#b8b8b9ff","u16":[47160,47288,47417,65535]}}, +{"bias":0.75,"c1":"#eff0f1ff","c2":"#808080ff","out":{"hex":"#9c9c9cff","u16":[40028,40092,40156,65535]}}, +{"bias":0.9,"c1":"#eff0f1ff","c2":"#808080ff","out":{"hex":"#8b8b8bff","u16":[35749,35774,35800,65535]}}, +{"bias":1,"c1":"#eff0f1ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":1.5,"c1":"#eff0f1ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":-0.5,"c1":"#eff0f1ff","c2":"#ff0000ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0,"c1":"#eff0f1ff","c2":"#ff0000ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.1,"c1":"#eff0f1ff","c2":"#ff0000ff","out":{"hex":"#f1d8d9ff","u16":[61834,55512,55743,65535]}}, +{"bias":0.25,"c1":"#eff0f1ff","c2":"#ff0000ff","out":{"hex":"#f3b4b5ff","u16":[62451,46260,46453,65535]}}, +{"bias":0.5,"c1":"#eff0f1ff","c2":"#ff0000ff","out":{"hex":"#f77879ff","u16":[63479,30840,30969,65535]}}, +{"bias":0.75,"c1":"#eff0f1ff","c2":"#ff0000ff","out":{"hex":"#fb3c3cff","u16":[64507,15420,15484,65535]}}, +{"bias":0.9,"c1":"#eff0f1ff","c2":"#ff0000ff","out":{"hex":"#fd1818ff","u16":[65124,6168,6194,65535]}}, +{"bias":1,"c1":"#eff0f1ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":1.5,"c1":"#eff0f1ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":-0.5,"c1":"#eff0f1ff","c2":"#00ff00ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0,"c1":"#eff0f1ff","c2":"#00ff00ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.1,"c1":"#eff0f1ff","c2":"#00ff00ff","out":{"hex":"#d7f2d9ff","u16":[55281,62066,55743,65535]}}, +{"bias":0.25,"c1":"#eff0f1ff","c2":"#00ff00ff","out":{"hex":"#b3f4b5ff","u16":[46067,62644,46453,65535]}}, +{"bias":0.5,"c1":"#eff0f1ff","c2":"#00ff00ff","out":{"hex":"#78f879ff","u16":[30712,63608,30969,65535]}}, +{"bias":0.75,"c1":"#eff0f1ff","c2":"#00ff00ff","out":{"hex":"#3cfb3cff","u16":[15356,64571,15484,65535]}}, +{"bias":0.9,"c1":"#eff0f1ff","c2":"#00ff00ff","out":{"hex":"#18fe18ff","u16":[6142,65150,6194,65535]}}, +{"bias":1,"c1":"#eff0f1ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":1.5,"c1":"#eff0f1ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":-0.5,"c1":"#eff0f1ff","c2":"#0000ffff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0,"c1":"#eff0f1ff","c2":"#0000ffff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.1,"c1":"#eff0f1ff","c2":"#0000ffff","out":{"hex":"#d7d8f2ff","u16":[55281,55512,62297,65535]}}, +{"bias":0.25,"c1":"#eff0f1ff","c2":"#0000ffff","out":{"hex":"#b3b4f5ff","u16":[46067,46260,62837,65535]}}, +{"bias":0.5,"c1":"#eff0f1ff","c2":"#0000ffff","out":{"hex":"#7878f8ff","u16":[30712,30840,63736,65535]}}, +{"bias":0.75,"c1":"#eff0f1ff","c2":"#0000ffff","out":{"hex":"#3c3cfcff","u16":[15356,15420,64636,65535]}}, +{"bias":0.9,"c1":"#eff0f1ff","c2":"#0000ffff","out":{"hex":"#1818feff","u16":[6142,6168,65175,65535]}}, +{"bias":1,"c1":"#eff0f1ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":1.5,"c1":"#eff0f1ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":-0.5,"c1":"#eff0f1ff","c2":"#ffff00ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0,"c1":"#eff0f1ff","c2":"#ffff00ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.1,"c1":"#eff0f1ff","c2":"#ffff00ff","out":{"hex":"#f1f2d9ff","u16":[61834,62066,55743,65535]}}, +{"bias":0.25,"c1":"#eff0f1ff","c2":"#ffff00ff","out":{"hex":"#f3f4b5ff","u16":[62451,62644,46453,65535]}}, +{"bias":0.5,"c1":"#eff0f1ff","c2":"#ffff00ff","out":{"hex":"#f7f879ff","u16":[63479,63608,30969,65535]}}, +{"bias":0.75,"c1":"#eff0f1ff","c2":"#ffff00ff","out":{"hex":"#fbfb3cff","u16":[64507,64571,15484,65535]}}, +{"bias":0.9,"c1":"#eff0f1ff","c2":"#ffff00ff","out":{"hex":"#fdfe18ff","u16":[65124,65150,6194,65535]}}, +{"bias":1,"c1":"#eff0f1ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":1.5,"c1":"#eff0f1ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":-0.5,"c1":"#eff0f1ff","c2":"#030201ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0,"c1":"#eff0f1ff","c2":"#030201ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.1,"c1":"#eff0f1ff","c2":"#030201ff","out":{"hex":"#d7d8d9ff","u16":[55358,55563,55769,65535]}}, +{"bias":0.25,"c1":"#eff0f1ff","c2":"#030201ff","out":{"hex":"#b4b5b5ff","u16":[46260,46389,46517,65535]}}, +{"bias":0.5,"c1":"#eff0f1ff","c2":"#030201ff","out":{"hex":"#797979ff","u16":[31097,31097,31097,65535]}}, +{"bias":0.75,"c1":"#eff0f1ff","c2":"#030201ff","out":{"hex":"#3e3e3dff","u16":[15934,15806,15677,65535]}}, +{"bias":0.9,"c1":"#eff0f1ff","c2":"#030201ff","out":{"hex":"#1b1a19ff","u16":[6836,6631,6425,65535]}}, +{"bias":1,"c1":"#eff0f1ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":1.5,"c1":"#eff0f1ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":-0.5,"c1":"#eff0f1ff","c2":"#3daee9ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0,"c1":"#eff0f1ff","c2":"#3daee9ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.1,"c1":"#eff0f1ff","c2":"#3daee9ff","out":{"hex":"#dde9f0ff","u16":[56848,59984,61731,65535]}}, +{"bias":0.25,"c1":"#eff0f1ff","c2":"#3daee9ff","out":{"hex":"#c3e0efff","u16":[49987,57440,61423,65535]}}, +{"bias":0.5,"c1":"#eff0f1ff","c2":"#3daee9ff","out":{"hex":"#96cfedff","u16":[38550,53199,60909,65535]}}, +{"bias":0.75,"c1":"#eff0f1ff","c2":"#3daee9ff","out":{"hex":"#6abfebff","u16":[27114,48959,60395,65535]}}, +{"bias":0.9,"c1":"#eff0f1ff","c2":"#3daee9ff","out":{"hex":"#4fb5eaff","u16":[20252,46414,60087,65535]}}, +{"bias":1,"c1":"#eff0f1ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":1.5,"c1":"#eff0f1ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":-0.5,"c1":"#eff0f1ff","c2":"#232629ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0,"c1":"#eff0f1ff","c2":"#232629ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.1,"c1":"#eff0f1ff","c2":"#232629ff","out":{"hex":"#dbdcddff","u16":[56180,56489,56797,65535]}}, +{"bias":0.25,"c1":"#eff0f1ff","c2":"#232629ff","out":{"hex":"#bcbebfff","u16":[48316,48702,49087,65535]}}, +{"bias":0.5,"c1":"#eff0f1ff","c2":"#232629ff","out":{"hex":"#898b8dff","u16":[35209,35723,36237,65535]}}, +{"bias":0.75,"c1":"#eff0f1ff","c2":"#232629ff","out":{"hex":"#56595bff","u16":[22102,22745,23387,65535]}}, +{"bias":0.9,"c1":"#eff0f1ff","c2":"#232629ff","out":{"hex":"#373a3dff","u16":[14238,14957,15677,65535]}}, +{"bias":1,"c1":"#eff0f1ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":1.5,"c1":"#eff0f1ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":-0.5,"c1":"#eff0f1ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0,"c1":"#eff0f1ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.1,"c1":"#eff0f1ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.25,"c1":"#eff0f1ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.5,"c1":"#eff0f1ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.75,"c1":"#eff0f1ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.9,"c1":"#eff0f1ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":1,"c1":"#eff0f1ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":1.5,"c1":"#eff0f1ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":-0.5,"c1":"#eff0f1ff","c2":"#fcfcfcff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0,"c1":"#eff0f1ff","c2":"#fcfcfcff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.1,"c1":"#eff0f1ff","c2":"#fcfcfcff","out":{"hex":"#f0f1f2ff","u16":[61757,61988,62220,65535]}}, +{"bias":0.25,"c1":"#eff0f1ff","c2":"#fcfcfcff","out":{"hex":"#f2f3f4ff","u16":[62258,62451,62644,65535]}}, +{"bias":0.5,"c1":"#eff0f1ff","c2":"#fcfcfcff","out":{"hex":"#f6f6f7ff","u16":[63094,63222,63351,65535]}}, +{"bias":0.75,"c1":"#eff0f1ff","c2":"#fcfcfcff","out":{"hex":"#f9f9f9ff","u16":[63929,63993,64057,65535]}}, +{"bias":0.9,"c1":"#eff0f1ff","c2":"#fcfcfcff","out":{"hex":"#fbfbfbff","u16":[64430,64456,64481,65535]}}, +{"bias":1,"c1":"#eff0f1ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":1.5,"c1":"#eff0f1ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":-0.5,"c1":"#eff0f1ff","c2":"#da4453ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0,"c1":"#eff0f1ff","c2":"#da4453ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.1,"c1":"#eff0f1ff","c2":"#da4453ff","out":{"hex":"#eddfe1ff","u16":[60883,57260,57876,65535]}}, +{"bias":0.25,"c1":"#eff0f1ff","c2":"#da4453ff","out":{"hex":"#eac5caff","u16":[60074,50629,51786,65535]}}, +{"bias":0.5,"c1":"#eff0f1ff","c2":"#da4453ff","out":{"hex":"#e59aa2ff","u16":[58725,39578,41634,65535]}}, +{"bias":0.75,"c1":"#eff0f1ff","c2":"#da4453ff","out":{"hex":"#df6f7bff","u16":[57375,28527,31483,65535]}}, +{"bias":0.9,"c1":"#eff0f1ff","c2":"#da4453ff","out":{"hex":"#dc5563ff","u16":[56566,21896,25392,65535]}}, +{"bias":1,"c1":"#eff0f1ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":1.5,"c1":"#eff0f1ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":-0.5,"c1":"#eff0f1ff","c2":"#e8cb2dff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0,"c1":"#eff0f1ff","c2":"#e8cb2dff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.1,"c1":"#eff0f1ff","c2":"#e8cb2dff","out":{"hex":"#eeecddff","u16":[61243,60729,56900,65535]}}, +{"bias":0.25,"c1":"#eff0f1ff","c2":"#e8cb2dff","out":{"hex":"#ede7c0ff","u16":[60973,59303,49344,65535]}}, +{"bias":0.5,"c1":"#eff0f1ff","c2":"#e8cb2dff","out":{"hex":"#ecde8fff","u16":[60524,56926,36751,65535]}}, +{"bias":0.75,"c1":"#eff0f1ff","c2":"#e8cb2dff","out":{"hex":"#ead45eff","u16":[60074,54548,24158,65535]}}, +{"bias":0.9,"c1":"#eff0f1ff","c2":"#e8cb2dff","out":{"hex":"#e9cf41ff","u16":[59804,53122,16602,65535]}}, +{"bias":1,"c1":"#eff0f1ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":1.5,"c1":"#eff0f1ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":-0.5,"c1":"#eff0f1ff","c2":"#3daee980","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0,"c1":"#eff0f1ff","c2":"#3daee980","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.1,"c1":"#eff0f1ff","c2":"#3daee980","out":{"hex":"#e6edf1f2","u16":[59006,60784,61828,62271]}}, +{"bias":0.25,"c1":"#eff0f1ff","c2":"#3daee980","out":{"hex":"#d5e7f0df","u16":[54866,59249,61642,57375]}}, +{"bias":0.5,"c1":"#eff0f1ff","c2":"#3daee980","out":{"hex":"#b4daeec0","u16":[46135,56011,61250,49216]}}, +{"bias":0.75,"c1":"#eff0f1ff","c2":"#3daee980","out":{"hex":"#84c8eca0","u16":[33932,51487,60701,41056]}}, +{"bias":0.9,"c1":"#eff0f1ff","c2":"#3daee980","out":{"hex":"#5dbaea8d","u16":[23968,47792,60254,36160]}}, +{"bias":1,"c1":"#eff0f1ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":1.5,"c1":"#eff0f1ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":-0.5,"c1":"#eff0f1ff","c2":"#ffffff00","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0,"c1":"#eff0f1ff","c2":"#ffffff00","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":0.1,"c1":"#eff0f1ff","c2":"#ffffff00","out":{"hex":"#eff0f1e6","u16":[61423,61680,61937,58982]}}, +{"bias":0.25,"c1":"#eff0f1ff","c2":"#ffffff00","out":{"hex":"#eff0f1bf","u16":[61423,61680,61937,49151]}}, +{"bias":0.5,"c1":"#eff0f1ff","c2":"#ffffff00","out":{"hex":"#eff0f180","u16":[61423,61680,61937,32768]}}, +{"bias":0.75,"c1":"#eff0f1ff","c2":"#ffffff00","out":{"hex":"#eff0f140","u16":[61423,61680,61937,16384]}}, +{"bias":0.9,"c1":"#eff0f1ff","c2":"#ffffff00","out":{"hex":"#eff0f11a","u16":[61423,61680,61937,6554]}}, +{"bias":1,"c1":"#eff0f1ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":1.5,"c1":"#eff0f1ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":-0.5,"c1":"#fcfcfcff","c2":"#000000ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0,"c1":"#fcfcfcff","c2":"#000000ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.1,"c1":"#fcfcfcff","c2":"#000000ff","out":{"hex":"#e3e3e3ff","u16":[58288,58288,58288,65535]}}, +{"bias":0.25,"c1":"#fcfcfcff","c2":"#000000ff","out":{"hex":"#bdbdbdff","u16":[48573,48573,48573,65535]}}, +{"bias":0.5,"c1":"#fcfcfcff","c2":"#000000ff","out":{"hex":"#7e7e7eff","u16":[32382,32382,32382,65535]}}, +{"bias":0.75,"c1":"#fcfcfcff","c2":"#000000ff","out":{"hex":"#3f3f3fff","u16":[16191,16191,16191,65535]}}, +{"bias":0.9,"c1":"#fcfcfcff","c2":"#000000ff","out":{"hex":"#191919ff","u16":[6476,6476,6476,65535]}}, +{"bias":1,"c1":"#fcfcfcff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":1.5,"c1":"#fcfcfcff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":-0.5,"c1":"#fcfcfcff","c2":"#ffffffff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0,"c1":"#fcfcfcff","c2":"#ffffffff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.1,"c1":"#fcfcfcff","c2":"#ffffffff","out":{"hex":"#fcfcfcff","u16":[64841,64841,64841,65535]}}, +{"bias":0.25,"c1":"#fcfcfcff","c2":"#ffffffff","out":{"hex":"#fdfdfdff","u16":[64957,64957,64957,65535]}}, +{"bias":0.5,"c1":"#fcfcfcff","c2":"#ffffffff","out":{"hex":"#fefefeff","u16":[65150,65150,65150,65535]}}, +{"bias":0.75,"c1":"#fcfcfcff","c2":"#ffffffff","out":{"hex":"#fefefeff","u16":[65342,65342,65342,65535]}}, +{"bias":0.9,"c1":"#fcfcfcff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65458,65458,65458,65535]}}, +{"bias":1,"c1":"#fcfcfcff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":1.5,"c1":"#fcfcfcff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":-0.5,"c1":"#fcfcfcff","c2":"#7f7f7fff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0,"c1":"#fcfcfcff","c2":"#7f7f7fff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.1,"c1":"#fcfcfcff","c2":"#7f7f7fff","out":{"hex":"#f0f0f0ff","u16":[61552,61552,61552,65535]}}, +{"bias":0.25,"c1":"#fcfcfcff","c2":"#7f7f7fff","out":{"hex":"#ddddddff","u16":[56733,56733,56733,65535]}}, +{"bias":0.5,"c1":"#fcfcfcff","c2":"#7f7f7fff","out":{"hex":"#bebebeff","u16":[48702,48702,48702,65535]}}, +{"bias":0.75,"c1":"#fcfcfcff","c2":"#7f7f7fff","out":{"hex":"#9e9e9eff","u16":[40670,40670,40670,65535]}}, +{"bias":0.9,"c1":"#fcfcfcff","c2":"#7f7f7fff","out":{"hex":"#8c8c8cff","u16":[35852,35852,35852,65535]}}, +{"bias":1,"c1":"#fcfcfcff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":1.5,"c1":"#fcfcfcff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":-0.5,"c1":"#fcfcfcff","c2":"#808080ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0,"c1":"#fcfcfcff","c2":"#808080ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.1,"c1":"#fcfcfcff","c2":"#808080ff","out":{"hex":"#f0f0f0ff","u16":[61577,61577,61577,65535]}}, +{"bias":0.25,"c1":"#fcfcfcff","c2":"#808080ff","out":{"hex":"#ddddddff","u16":[56797,56797,56797,65535]}}, +{"bias":0.5,"c1":"#fcfcfcff","c2":"#808080ff","out":{"hex":"#bebebeff","u16":[48830,48830,48830,65535]}}, +{"bias":0.75,"c1":"#fcfcfcff","c2":"#808080ff","out":{"hex":"#9f9f9fff","u16":[40863,40863,40863,65535]}}, +{"bias":0.9,"c1":"#fcfcfcff","c2":"#808080ff","out":{"hex":"#8c8c8cff","u16":[36083,36083,36083,65535]}}, +{"bias":1,"c1":"#fcfcfcff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":1.5,"c1":"#fcfcfcff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":-0.5,"c1":"#fcfcfcff","c2":"#ff0000ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0,"c1":"#fcfcfcff","c2":"#ff0000ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.1,"c1":"#fcfcfcff","c2":"#ff0000ff","out":{"hex":"#fce3e3ff","u16":[64841,58288,58288,65535]}}, +{"bias":0.25,"c1":"#fcfcfcff","c2":"#ff0000ff","out":{"hex":"#fdbdbdff","u16":[64957,48573,48573,65535]}}, +{"bias":0.5,"c1":"#fcfcfcff","c2":"#ff0000ff","out":{"hex":"#fe7e7eff","u16":[65150,32382,32382,65535]}}, +{"bias":0.75,"c1":"#fcfcfcff","c2":"#ff0000ff","out":{"hex":"#fe3f3fff","u16":[65342,16191,16191,65535]}}, +{"bias":0.9,"c1":"#fcfcfcff","c2":"#ff0000ff","out":{"hex":"#ff1919ff","u16":[65458,6476,6476,65535]}}, +{"bias":1,"c1":"#fcfcfcff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":1.5,"c1":"#fcfcfcff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":-0.5,"c1":"#fcfcfcff","c2":"#00ff00ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0,"c1":"#fcfcfcff","c2":"#00ff00ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.1,"c1":"#fcfcfcff","c2":"#00ff00ff","out":{"hex":"#e3fce3ff","u16":[58288,64841,58288,65535]}}, +{"bias":0.25,"c1":"#fcfcfcff","c2":"#00ff00ff","out":{"hex":"#bdfdbdff","u16":[48573,64957,48573,65535]}}, +{"bias":0.5,"c1":"#fcfcfcff","c2":"#00ff00ff","out":{"hex":"#7efe7eff","u16":[32382,65150,32382,65535]}}, +{"bias":0.75,"c1":"#fcfcfcff","c2":"#00ff00ff","out":{"hex":"#3ffe3fff","u16":[16191,65342,16191,65535]}}, +{"bias":0.9,"c1":"#fcfcfcff","c2":"#00ff00ff","out":{"hex":"#19ff19ff","u16":[6476,65458,6476,65535]}}, +{"bias":1,"c1":"#fcfcfcff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":1.5,"c1":"#fcfcfcff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":-0.5,"c1":"#fcfcfcff","c2":"#0000ffff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0,"c1":"#fcfcfcff","c2":"#0000ffff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.1,"c1":"#fcfcfcff","c2":"#0000ffff","out":{"hex":"#e3e3fcff","u16":[58288,58288,64841,65535]}}, +{"bias":0.25,"c1":"#fcfcfcff","c2":"#0000ffff","out":{"hex":"#bdbdfdff","u16":[48573,48573,64957,65535]}}, +{"bias":0.5,"c1":"#fcfcfcff","c2":"#0000ffff","out":{"hex":"#7e7efeff","u16":[32382,32382,65150,65535]}}, +{"bias":0.75,"c1":"#fcfcfcff","c2":"#0000ffff","out":{"hex":"#3f3ffeff","u16":[16191,16191,65342,65535]}}, +{"bias":0.9,"c1":"#fcfcfcff","c2":"#0000ffff","out":{"hex":"#1919ffff","u16":[6476,6476,65458,65535]}}, +{"bias":1,"c1":"#fcfcfcff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":1.5,"c1":"#fcfcfcff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":-0.5,"c1":"#fcfcfcff","c2":"#ffff00ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0,"c1":"#fcfcfcff","c2":"#ffff00ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.1,"c1":"#fcfcfcff","c2":"#ffff00ff","out":{"hex":"#fcfce3ff","u16":[64841,64841,58288,65535]}}, +{"bias":0.25,"c1":"#fcfcfcff","c2":"#ffff00ff","out":{"hex":"#fdfdbdff","u16":[64957,64957,48573,65535]}}, +{"bias":0.5,"c1":"#fcfcfcff","c2":"#ffff00ff","out":{"hex":"#fefe7eff","u16":[65150,65150,32382,65535]}}, +{"bias":0.75,"c1":"#fcfcfcff","c2":"#ffff00ff","out":{"hex":"#fefe3fff","u16":[65342,65342,16191,65535]}}, +{"bias":0.9,"c1":"#fcfcfcff","c2":"#ffff00ff","out":{"hex":"#ffff19ff","u16":[65458,65458,6476,65535]}}, +{"bias":1,"c1":"#fcfcfcff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":1.5,"c1":"#fcfcfcff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":-0.5,"c1":"#fcfcfcff","c2":"#030201ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0,"c1":"#fcfcfcff","c2":"#030201ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.1,"c1":"#fcfcfcff","c2":"#030201ff","out":{"hex":"#e3e3e3ff","u16":[58365,58339,58313,65535]}}, +{"bias":0.25,"c1":"#fcfcfcff","c2":"#030201ff","out":{"hex":"#bebebdff","u16":[48766,48702,48637,65535]}}, +{"bias":0.5,"c1":"#fcfcfcff","c2":"#030201ff","out":{"hex":"#807f7fff","u16":[32768,32639,32511,65535]}}, +{"bias":0.75,"c1":"#fcfcfcff","c2":"#030201ff","out":{"hex":"#414140ff","u16":[16769,16577,16384,65535]}}, +{"bias":0.9,"c1":"#fcfcfcff","c2":"#030201ff","out":{"hex":"#1c1b1aff","u16":[7170,6939,6708,65535]}}, +{"bias":1,"c1":"#fcfcfcff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":1.5,"c1":"#fcfcfcff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":-0.5,"c1":"#fcfcfcff","c2":"#3daee9ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0,"c1":"#fcfcfcff","c2":"#3daee9ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.1,"c1":"#fcfcfcff","c2":"#3daee9ff","out":{"hex":"#e9f4faff","u16":[59855,62759,64276,65535]}}, +{"bias":0.25,"c1":"#fcfcfcff","c2":"#3daee9ff","out":{"hex":"#cce9f7ff","u16":[52492,59753,63543,65535]}}, +{"bias":0.5,"c1":"#fcfcfcff","c2":"#3daee9ff","out":{"hex":"#9dd5f3ff","u16":[40221,54741,62323,65535]}}, +{"bias":0.75,"c1":"#fcfcfcff","c2":"#3daee9ff","out":{"hex":"#6dc2eeff","u16":[27949,49730,61102,65535]}}, +{"bias":0.9,"c1":"#fcfcfcff","c2":"#3daee9ff","out":{"hex":"#50b6ebff","u16":[20586,46723,60369,65535]}}, +{"bias":1,"c1":"#fcfcfcff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":1.5,"c1":"#fcfcfcff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":-0.5,"c1":"#fcfcfcff","c2":"#232629ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0,"c1":"#fcfcfcff","c2":"#232629ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.1,"c1":"#fcfcfcff","c2":"#232629ff","out":{"hex":"#e6e7e7ff","u16":[59187,59264,59341,65535]}}, +{"bias":0.25,"c1":"#fcfcfcff","c2":"#232629ff","out":{"hex":"#c6c7c7ff","u16":[50822,51015,51207,65535]}}, +{"bias":0.5,"c1":"#fcfcfcff","c2":"#232629ff","out":{"hex":"#909193ff","u16":[36880,37265,37651,65535]}}, +{"bias":0.75,"c1":"#fcfcfcff","c2":"#232629ff","out":{"hex":"#595c5eff","u16":[22937,23516,24094,65535]}}, +{"bias":0.9,"c1":"#fcfcfcff","c2":"#232629ff","out":{"hex":"#393b3eff","u16":[14572,15266,15960,65535]}}, +{"bias":1,"c1":"#fcfcfcff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":1.5,"c1":"#fcfcfcff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":-0.5,"c1":"#fcfcfcff","c2":"#eff0f1ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0,"c1":"#fcfcfcff","c2":"#eff0f1ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.1,"c1":"#fcfcfcff","c2":"#eff0f1ff","out":{"hex":"#fbfbfbff","u16":[64430,64456,64481,65535]}}, +{"bias":0.25,"c1":"#fcfcfcff","c2":"#eff0f1ff","out":{"hex":"#f9f9f9ff","u16":[63929,63993,64057,65535]}}, +{"bias":0.5,"c1":"#fcfcfcff","c2":"#eff0f1ff","out":{"hex":"#f6f6f7ff","u16":[63094,63222,63351,65535]}}, +{"bias":0.75,"c1":"#fcfcfcff","c2":"#eff0f1ff","out":{"hex":"#f2f3f4ff","u16":[62258,62451,62644,65535]}}, +{"bias":0.9,"c1":"#fcfcfcff","c2":"#eff0f1ff","out":{"hex":"#f0f1f2ff","u16":[61757,61988,62220,65535]}}, +{"bias":1,"c1":"#fcfcfcff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":1.5,"c1":"#fcfcfcff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":-0.5,"c1":"#fcfcfcff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0,"c1":"#fcfcfcff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.1,"c1":"#fcfcfcff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.25,"c1":"#fcfcfcff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.5,"c1":"#fcfcfcff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.75,"c1":"#fcfcfcff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.9,"c1":"#fcfcfcff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":1,"c1":"#fcfcfcff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":1.5,"c1":"#fcfcfcff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":-0.5,"c1":"#fcfcfcff","c2":"#da4453ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0,"c1":"#fcfcfcff","c2":"#da4453ff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.1,"c1":"#fcfcfcff","c2":"#da4453ff","out":{"hex":"#f9eaebff","u16":[63890,60035,60421,65535]}}, +{"bias":0.25,"c1":"#fcfcfcff","c2":"#da4453ff","out":{"hex":"#f4ced2ff","u16":[62580,52942,53906,65535]}}, +{"bias":0.5,"c1":"#fcfcfcff","c2":"#da4453ff","out":{"hex":"#eba0a8ff","u16":[60395,41120,43048,65535]}}, +{"bias":0.75,"c1":"#fcfcfcff","c2":"#da4453ff","out":{"hex":"#e3727dff","u16":[58211,29298,32189,65535]}}, +{"bias":0.9,"c1":"#fcfcfcff","c2":"#da4453ff","out":{"hex":"#dd5664ff","u16":[56900,22205,25674,65535]}}, +{"bias":1,"c1":"#fcfcfcff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":1.5,"c1":"#fcfcfcff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":-0.5,"c1":"#fcfcfcff","c2":"#e8cb2dff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0,"c1":"#fcfcfcff","c2":"#e8cb2dff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.1,"c1":"#fcfcfcff","c2":"#e8cb2dff","out":{"hex":"#faf7e7ff","u16":[64250,63505,59444,65535]}}, +{"bias":0.25,"c1":"#fcfcfcff","c2":"#e8cb2dff","out":{"hex":"#f7f0c8ff","u16":[63479,61616,51464,65535]}}, +{"bias":0.5,"c1":"#fcfcfcff","c2":"#e8cb2dff","out":{"hex":"#f2e495ff","u16":[62194,58468,38165,65535]}}, +{"bias":0.75,"c1":"#fcfcfcff","c2":"#e8cb2dff","out":{"hex":"#edd761ff","u16":[60909,55319,24865,65535]}}, +{"bias":0.9,"c1":"#fcfcfcff","c2":"#e8cb2dff","out":{"hex":"#ead042ff","u16":[60138,53430,16885,65535]}}, +{"bias":1,"c1":"#fcfcfcff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":1.5,"c1":"#fcfcfcff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":-0.5,"c1":"#fcfcfcff","c2":"#3daee980","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0,"c1":"#fcfcfcff","c2":"#3daee980","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.1,"c1":"#fcfcfcff","c2":"#3daee980","out":{"hex":"#f2f8fbf2","u16":[62171,63705,64506,62271]}}, +{"bias":0.25,"c1":"#fcfcfcff","c2":"#3daee980","out":{"hex":"#e1f1f9df","u16":[57728,61891,64064,57375]}}, +{"bias":0.5,"c1":"#fcfcfcff","c2":"#3daee980","out":{"hex":"#bce2f6c0","u16":[48359,58065,63132,49216]}}, +{"bias":0.75,"c1":"#fcfcfcff","c2":"#3daee980","out":{"hex":"#89cdf1a0","u16":[35266,52718,61830,41056]}}, +{"bias":0.9,"c1":"#fcfcfcff","c2":"#3daee980","out":{"hex":"#60bcec8d","u16":[24573,48351,60766,36160]}}, +{"bias":1,"c1":"#fcfcfcff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":1.5,"c1":"#fcfcfcff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":-0.5,"c1":"#fcfcfcff","c2":"#ffffff00","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0,"c1":"#fcfcfcff","c2":"#ffffff00","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":0.1,"c1":"#fcfcfcff","c2":"#ffffff00","out":{"hex":"#fcfcfce6","u16":[64764,64764,64764,58982]}}, +{"bias":0.25,"c1":"#fcfcfcff","c2":"#ffffff00","out":{"hex":"#fcfcfcbf","u16":[64764,64764,64764,49151]}}, +{"bias":0.5,"c1":"#fcfcfcff","c2":"#ffffff00","out":{"hex":"#fcfcfc80","u16":[64764,64764,64764,32768]}}, +{"bias":0.75,"c1":"#fcfcfcff","c2":"#ffffff00","out":{"hex":"#fcfcfc40","u16":[64764,64764,64764,16384]}}, +{"bias":0.9,"c1":"#fcfcfcff","c2":"#ffffff00","out":{"hex":"#fcfcfc1a","u16":[64764,64764,64764,6554]}}, +{"bias":1,"c1":"#fcfcfcff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":1.5,"c1":"#fcfcfcff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":-0.5,"c1":"#da4453ff","c2":"#000000ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0,"c1":"#da4453ff","c2":"#000000ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.1,"c1":"#da4453ff","c2":"#000000ff","out":{"hex":"#c43d4bff","u16":[50423,15728,19198,65535]}}, +{"bias":0.25,"c1":"#da4453ff","c2":"#000000ff","out":{"hex":"#a4333eff","u16":[42020,13107,15998,65535]}}, +{"bias":0.5,"c1":"#da4453ff","c2":"#000000ff","out":{"hex":"#6d222aff","u16":[28013,8738,10666,65535]}}, +{"bias":0.75,"c1":"#da4453ff","c2":"#000000ff","out":{"hex":"#371115ff","u16":[14007,4369,5333,65535]}}, +{"bias":0.9,"c1":"#da4453ff","c2":"#000000ff","out":{"hex":"#160708ff","u16":[5603,1748,2133,65535]}}, +{"bias":1,"c1":"#da4453ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":1.5,"c1":"#da4453ff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":-0.5,"c1":"#da4453ff","c2":"#ffffffff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0,"c1":"#da4453ff","c2":"#ffffffff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.1,"c1":"#da4453ff","c2":"#ffffffff","out":{"hex":"#de5764ff","u16":[56977,22282,25751,65535]}}, +{"bias":0.25,"c1":"#da4453ff","c2":"#ffffffff","out":{"hex":"#e3737eff","u16":[58403,29491,32382,65535]}}, +{"bias":0.5,"c1":"#da4453ff","c2":"#ffffffff","out":{"hex":"#eda2a9ff","u16":[60781,41506,43433,65535]}}, +{"bias":0.75,"c1":"#da4453ff","c2":"#ffffffff","out":{"hex":"#f6d0d4ff","u16":[63158,53520,54484,65535]}}, +{"bias":0.9,"c1":"#da4453ff","c2":"#ffffffff","out":{"hex":"#fbeceeff","u16":[64584,60729,61115,65535]}}, +{"bias":1,"c1":"#da4453ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":1.5,"c1":"#da4453ff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":-0.5,"c1":"#da4453ff","c2":"#7f7f7fff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0,"c1":"#da4453ff","c2":"#7f7f7fff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.1,"c1":"#da4453ff","c2":"#7f7f7fff","out":{"hex":"#d14a57ff","u16":[53687,18992,22462,65535]}}, +{"bias":0.25,"c1":"#da4453ff","c2":"#7f7f7fff","out":{"hex":"#c3535eff","u16":[50179,21267,24158,65535]}}, +{"bias":0.5,"c1":"#da4453ff","c2":"#7f7f7fff","out":{"hex":"#ad6269ff","u16":[44333,25058,26985,65535]}}, +{"bias":0.75,"c1":"#da4453ff","c2":"#7f7f7fff","out":{"hex":"#967074ff","u16":[38486,28848,29812,65535]}}, +{"bias":0.9,"c1":"#da4453ff","c2":"#7f7f7fff","out":{"hex":"#88797bff","u16":[34978,31123,31508,65535]}}, +{"bias":1,"c1":"#da4453ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":1.5,"c1":"#da4453ff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":-0.5,"c1":"#da4453ff","c2":"#808080ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0,"c1":"#da4453ff","c2":"#808080ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.1,"c1":"#da4453ff","c2":"#808080ff","out":{"hex":"#d14a58ff","u16":[53713,19018,22488,65535]}}, +{"bias":0.25,"c1":"#da4453ff","c2":"#808080ff","out":{"hex":"#c4535eff","u16":[50244,21331,24222,65535]}}, +{"bias":0.5,"c1":"#da4453ff","c2":"#808080ff","out":{"hex":"#ad626aff","u16":[44461,25186,27114,65535]}}, +{"bias":0.75,"c1":"#da4453ff","c2":"#808080ff","out":{"hex":"#977175ff","u16":[38679,29041,30005,65535]}}, +{"bias":0.9,"c1":"#da4453ff","c2":"#808080ff","out":{"hex":"#897a7cff","u16":[35209,31354,31740,65535]}}, +{"bias":1,"c1":"#da4453ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":1.5,"c1":"#da4453ff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":-0.5,"c1":"#da4453ff","c2":"#ff0000ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0,"c1":"#da4453ff","c2":"#ff0000ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.1,"c1":"#da4453ff","c2":"#ff0000ff","out":{"hex":"#de3d4bff","u16":[56977,15728,19198,65535]}}, +{"bias":0.25,"c1":"#da4453ff","c2":"#ff0000ff","out":{"hex":"#e3333eff","u16":[58403,13107,15998,65535]}}, +{"bias":0.5,"c1":"#da4453ff","c2":"#ff0000ff","out":{"hex":"#ed222aff","u16":[60781,8738,10666,65535]}}, +{"bias":0.75,"c1":"#da4453ff","c2":"#ff0000ff","out":{"hex":"#f61115ff","u16":[63158,4369,5333,65535]}}, +{"bias":0.9,"c1":"#da4453ff","c2":"#ff0000ff","out":{"hex":"#fb0708ff","u16":[64584,1748,2133,65535]}}, +{"bias":1,"c1":"#da4453ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":1.5,"c1":"#da4453ff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":-0.5,"c1":"#da4453ff","c2":"#00ff00ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0,"c1":"#da4453ff","c2":"#00ff00ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.1,"c1":"#da4453ff","c2":"#00ff00ff","out":{"hex":"#c4574bff","u16":[50423,22282,19198,65535]}}, +{"bias":0.25,"c1":"#da4453ff","c2":"#00ff00ff","out":{"hex":"#a4733eff","u16":[42020,29491,15998,65535]}}, +{"bias":0.5,"c1":"#da4453ff","c2":"#00ff00ff","out":{"hex":"#6da22aff","u16":[28013,41506,10666,65535]}}, +{"bias":0.75,"c1":"#da4453ff","c2":"#00ff00ff","out":{"hex":"#37d015ff","u16":[14007,53520,5333,65535]}}, +{"bias":0.9,"c1":"#da4453ff","c2":"#00ff00ff","out":{"hex":"#16ec08ff","u16":[5603,60729,2133,65535]}}, +{"bias":1,"c1":"#da4453ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":1.5,"c1":"#da4453ff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":-0.5,"c1":"#da4453ff","c2":"#0000ffff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0,"c1":"#da4453ff","c2":"#0000ffff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.1,"c1":"#da4453ff","c2":"#0000ffff","out":{"hex":"#c43d64ff","u16":[50423,15728,25751,65535]}}, +{"bias":0.25,"c1":"#da4453ff","c2":"#0000ffff","out":{"hex":"#a4337eff","u16":[42020,13107,32382,65535]}}, +{"bias":0.5,"c1":"#da4453ff","c2":"#0000ffff","out":{"hex":"#6d22a9ff","u16":[28013,8738,43433,65535]}}, +{"bias":0.75,"c1":"#da4453ff","c2":"#0000ffff","out":{"hex":"#3711d4ff","u16":[14007,4369,54484,65535]}}, +{"bias":0.9,"c1":"#da4453ff","c2":"#0000ffff","out":{"hex":"#1607eeff","u16":[5603,1748,61115,65535]}}, +{"bias":1,"c1":"#da4453ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":1.5,"c1":"#da4453ff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":-0.5,"c1":"#da4453ff","c2":"#ffff00ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0,"c1":"#da4453ff","c2":"#ffff00ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.1,"c1":"#da4453ff","c2":"#ffff00ff","out":{"hex":"#de574bff","u16":[56977,22282,19198,65535]}}, +{"bias":0.25,"c1":"#da4453ff","c2":"#ffff00ff","out":{"hex":"#e3733eff","u16":[58403,29491,15998,65535]}}, +{"bias":0.5,"c1":"#da4453ff","c2":"#ffff00ff","out":{"hex":"#eda22aff","u16":[60781,41506,10666,65535]}}, +{"bias":0.75,"c1":"#da4453ff","c2":"#ffff00ff","out":{"hex":"#f6d015ff","u16":[63158,53520,5333,65535]}}, +{"bias":0.9,"c1":"#da4453ff","c2":"#ffff00ff","out":{"hex":"#fbec08ff","u16":[64584,60729,2133,65535]}}, +{"bias":1,"c1":"#da4453ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":1.5,"c1":"#da4453ff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":-0.5,"c1":"#da4453ff","c2":"#030201ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0,"c1":"#da4453ff","c2":"#030201ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.1,"c1":"#da4453ff","c2":"#030201ff","out":{"hex":"#c53d4bff","u16":[50501,15780,19224,65535]}}, +{"bias":0.25,"c1":"#da4453ff","c2":"#030201ff","out":{"hex":"#a4343fff","u16":[42212,13236,16063,65535]}}, +{"bias":0.5,"c1":"#da4453ff","c2":"#030201ff","out":{"hex":"#6f232aff","u16":[28399,8995,10794,65535]}}, +{"bias":0.75,"c1":"#da4453ff","c2":"#030201ff","out":{"hex":"#391316ff","u16":[14585,4755,5526,65535]}}, +{"bias":0.9,"c1":"#da4453ff","c2":"#030201ff","out":{"hex":"#190909ff","u16":[6297,2210,2364,65535]}}, +{"bias":1,"c1":"#da4453ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":1.5,"c1":"#da4453ff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":-0.5,"c1":"#da4453ff","c2":"#3daee9ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0,"c1":"#da4453ff","c2":"#3daee9ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.1,"c1":"#da4453ff","c2":"#3daee9ff","out":{"hex":"#ca4f62ff","u16":[51991,20200,25186,65535]}}, +{"bias":0.25,"c1":"#da4453ff","c2":"#3daee9ff","out":{"hex":"#b35f79ff","u16":[45939,24287,30969,65535]}}, +{"bias":0.5,"c1":"#da4453ff","c2":"#3daee9ff","out":{"hex":"#8c799eff","u16":[35852,31097,40606,65535]}}, +{"bias":0.75,"c1":"#da4453ff","c2":"#3daee9ff","out":{"hex":"#6494c4ff","u16":[25764,37908,50244,65535]}}, +{"bias":0.9,"c1":"#da4453ff","c2":"#3daee9ff","out":{"hex":"#4da3daff","u16":[19712,41994,56026,65535]}}, +{"bias":1,"c1":"#da4453ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":1.5,"c1":"#da4453ff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":-0.5,"c1":"#da4453ff","c2":"#232629ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0,"c1":"#da4453ff","c2":"#232629ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.1,"c1":"#da4453ff","c2":"#232629ff","out":{"hex":"#c8414fff","u16":[51323,16705,20252,65535]}}, +{"bias":0.25,"c1":"#da4453ff","c2":"#232629ff","out":{"hex":"#ac3d49ff","u16":[44268,15549,18633,65535]}}, +{"bias":0.5,"c1":"#da4453ff","c2":"#232629ff","out":{"hex":"#7f353eff","u16":[32511,13621,15934,65535]}}, +{"bias":0.75,"c1":"#da4453ff","c2":"#232629ff","out":{"hex":"#512e34ff","u16":[20753,11694,13236,65535]}}, +{"bias":0.9,"c1":"#da4453ff","c2":"#232629ff","out":{"hex":"#35292dff","u16":[13698,10537,11616,65535]}}, +{"bias":1,"c1":"#da4453ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":1.5,"c1":"#da4453ff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":-0.5,"c1":"#da4453ff","c2":"#eff0f1ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0,"c1":"#da4453ff","c2":"#eff0f1ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.1,"c1":"#da4453ff","c2":"#eff0f1ff","out":{"hex":"#dc5563ff","u16":[56566,21896,25392,65535]}}, +{"bias":0.25,"c1":"#da4453ff","c2":"#eff0f1ff","out":{"hex":"#df6f7bff","u16":[57375,28527,31483,65535]}}, +{"bias":0.5,"c1":"#da4453ff","c2":"#eff0f1ff","out":{"hex":"#e59aa2ff","u16":[58725,39578,41634,65535]}}, +{"bias":0.75,"c1":"#da4453ff","c2":"#eff0f1ff","out":{"hex":"#eac5caff","u16":[60074,50629,51786,65535]}}, +{"bias":0.9,"c1":"#da4453ff","c2":"#eff0f1ff","out":{"hex":"#eddfe1ff","u16":[60883,57260,57876,65535]}}, +{"bias":1,"c1":"#da4453ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":1.5,"c1":"#da4453ff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":-0.5,"c1":"#da4453ff","c2":"#fcfcfcff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0,"c1":"#da4453ff","c2":"#fcfcfcff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.1,"c1":"#da4453ff","c2":"#fcfcfcff","out":{"hex":"#dd5664ff","u16":[56900,22205,25674,65535]}}, +{"bias":0.25,"c1":"#da4453ff","c2":"#fcfcfcff","out":{"hex":"#e3727dff","u16":[58211,29298,32189,65535]}}, +{"bias":0.5,"c1":"#da4453ff","c2":"#fcfcfcff","out":{"hex":"#eba0a8ff","u16":[60395,41120,43048,65535]}}, +{"bias":0.75,"c1":"#da4453ff","c2":"#fcfcfcff","out":{"hex":"#f4ced2ff","u16":[62580,52942,53906,65535]}}, +{"bias":0.9,"c1":"#da4453ff","c2":"#fcfcfcff","out":{"hex":"#f9eaebff","u16":[63890,60035,60421,65535]}}, +{"bias":1,"c1":"#da4453ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":1.5,"c1":"#da4453ff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":-0.5,"c1":"#da4453ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0,"c1":"#da4453ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.1,"c1":"#da4453ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.25,"c1":"#da4453ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.5,"c1":"#da4453ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.75,"c1":"#da4453ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.9,"c1":"#da4453ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":1,"c1":"#da4453ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":1.5,"c1":"#da4453ff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":-0.5,"c1":"#da4453ff","c2":"#e8cb2dff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0,"c1":"#da4453ff","c2":"#e8cb2dff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.1,"c1":"#da4453ff","c2":"#e8cb2dff","out":{"hex":"#db524fff","u16":[56386,20946,20354,65535]}}, +{"bias":0.25,"c1":"#da4453ff","c2":"#e8cb2dff","out":{"hex":"#de664aff","u16":[56926,26150,18890,65535]}}, +{"bias":0.5,"c1":"#da4453ff","c2":"#e8cb2dff","out":{"hex":"#e18840ff","u16":[57825,34824,16448,65535]}}, +{"bias":0.75,"c1":"#da4453ff","c2":"#e8cb2dff","out":{"hex":"#e5a937ff","u16":[58725,43497,14007,65535]}}, +{"bias":0.9,"c1":"#da4453ff","c2":"#e8cb2dff","out":{"hex":"#e7be31ff","u16":[59264,48702,12542,65535]}}, +{"bias":1,"c1":"#da4453ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":1.5,"c1":"#da4453ff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":-0.5,"c1":"#da4453ff","c2":"#3daee980","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0,"c1":"#da4453ff","c2":"#3daee980","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.1,"c1":"#da4453ff","c2":"#3daee980","out":{"hex":"#d24a5bf2","u16":[53894,18915,23367,62271]}}, +{"bias":0.25,"c1":"#da4453ff","c2":"#3daee980","out":{"hex":"#c35369df","u16":[50242,21381,26857,57375]}}, +{"bias":0.5,"c1":"#da4453ff","c2":"#3daee980","out":{"hex":"#a66785c0","u16":[42541,26580,34215,49216]}}, +{"bias":0.75,"c1":"#da4453ff","c2":"#3daee980","out":{"hex":"#7c84ada0","u16":[31779,33847,44497,41056]}}, +{"bias":0.9,"c1":"#da4453ff","c2":"#3daee980","out":{"hex":"#599bce8d","u16":[22990,39781,52894,36160]}}, +{"bias":1,"c1":"#da4453ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":1.5,"c1":"#da4453ff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":-0.5,"c1":"#da4453ff","c2":"#ffffff00","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0,"c1":"#da4453ff","c2":"#ffffff00","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":0.1,"c1":"#da4453ff","c2":"#ffffff00","out":{"hex":"#da4453e6","u16":[56026,17476,21331,58982]}}, +{"bias":0.25,"c1":"#da4453ff","c2":"#ffffff00","out":{"hex":"#da4453bf","u16":[56026,17476,21331,49151]}}, +{"bias":0.5,"c1":"#da4453ff","c2":"#ffffff00","out":{"hex":"#da445380","u16":[56026,17476,21331,32768]}}, +{"bias":0.75,"c1":"#da4453ff","c2":"#ffffff00","out":{"hex":"#da445340","u16":[56026,17476,21331,16384]}}, +{"bias":0.9,"c1":"#da4453ff","c2":"#ffffff00","out":{"hex":"#da44531a","u16":[56026,17476,21331,6554]}}, +{"bias":1,"c1":"#da4453ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":1.5,"c1":"#da4453ff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":-0.5,"c1":"#e8cb2dff","c2":"#000000ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0,"c1":"#e8cb2dff","c2":"#000000ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.1,"c1":"#e8cb2dff","c2":"#000000ff","out":{"hex":"#d1b729ff","u16":[53662,46954,10409,65535]}}, +{"bias":0.25,"c1":"#e8cb2dff","c2":"#000000ff","out":{"hex":"#ae9822ff","u16":[44718,39128,8674,65535]}}, +{"bias":0.5,"c1":"#e8cb2dff","c2":"#000000ff","out":{"hex":"#746617ff","u16":[29812,26086,5783,65535]}}, +{"bias":0.75,"c1":"#e8cb2dff","c2":"#000000ff","out":{"hex":"#3a330bff","u16":[14906,13043,2891,65535]}}, +{"bias":0.9,"c1":"#e8cb2dff","c2":"#000000ff","out":{"hex":"#171405ff","u16":[5962,5217,1157,65535]}}, +{"bias":1,"c1":"#e8cb2dff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":1.5,"c1":"#e8cb2dff","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":-0.5,"c1":"#e8cb2dff","c2":"#ffffffff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0,"c1":"#e8cb2dff","c2":"#ffffffff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.1,"c1":"#e8cb2dff","c2":"#ffffffff","out":{"hex":"#ead042ff","u16":[60215,53507,16962,65535]}}, +{"bias":0.25,"c1":"#e8cb2dff","c2":"#ffffffff","out":{"hex":"#eed862ff","u16":[61102,55512,25058,65535]}}, +{"bias":0.5,"c1":"#e8cb2dff","c2":"#ffffffff","out":{"hex":"#f4e596ff","u16":[62580,58853,38550,65535]}}, +{"bias":0.75,"c1":"#e8cb2dff","c2":"#ffffffff","out":{"hex":"#f9f2cbff","u16":[64057,62194,52043,65535]}}, +{"bias":0.9,"c1":"#e8cb2dff","c2":"#ffffffff","out":{"hex":"#fdfaeaff","u16":[64944,64199,60138,65535]}}, +{"bias":1,"c1":"#e8cb2dff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":1.5,"c1":"#e8cb2dff","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":-0.5,"c1":"#e8cb2dff","c2":"#7f7f7fff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0,"c1":"#e8cb2dff","c2":"#7f7f7fff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.1,"c1":"#e8cb2dff","c2":"#7f7f7fff","out":{"hex":"#dec335ff","u16":[56926,50218,13672,65535]}}, +{"bias":0.25,"c1":"#e8cb2dff","c2":"#7f7f7fff","out":{"hex":"#ceb842ff","u16":[52878,47288,16834,65535]}}, +{"bias":0.5,"c1":"#e8cb2dff","c2":"#7f7f7fff","out":{"hex":"#b4a556ff","u16":[46132,42405,22102,65535]}}, +{"bias":0.75,"c1":"#e8cb2dff","c2":"#7f7f7fff","out":{"hex":"#99926bff","u16":[39385,37522,27371,65535]}}, +{"bias":0.9,"c1":"#e8cb2dff","c2":"#7f7f7fff","out":{"hex":"#8a8777ff","u16":[35338,34592,30532,65535]}}, +{"bias":1,"c1":"#e8cb2dff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":1.5,"c1":"#e8cb2dff","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":-0.5,"c1":"#e8cb2dff","c2":"#808080ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0,"c1":"#e8cb2dff","c2":"#808080ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.1,"c1":"#e8cb2dff","c2":"#808080ff","out":{"hex":"#dec435ff","u16":[56951,50244,13698,65535]}}, +{"bias":0.25,"c1":"#e8cb2dff","c2":"#808080ff","out":{"hex":"#ceb842ff","u16":[52942,47352,16898,65535]}}, +{"bias":0.5,"c1":"#e8cb2dff","c2":"#808080ff","out":{"hex":"#b4a657ff","u16":[46260,42534,22231,65535]}}, +{"bias":0.75,"c1":"#e8cb2dff","c2":"#808080ff","out":{"hex":"#9a936bff","u16":[39578,37715,27563,65535]}}, +{"bias":0.9,"c1":"#e8cb2dff","c2":"#808080ff","out":{"hex":"#8a8878ff","u16":[35569,34824,30763,65535]}}, +{"bias":1,"c1":"#e8cb2dff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":1.5,"c1":"#e8cb2dff","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":-0.5,"c1":"#e8cb2dff","c2":"#ff0000ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0,"c1":"#e8cb2dff","c2":"#ff0000ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.1,"c1":"#e8cb2dff","c2":"#ff0000ff","out":{"hex":"#eab729ff","u16":[60215,46954,10409,65535]}}, +{"bias":0.25,"c1":"#e8cb2dff","c2":"#ff0000ff","out":{"hex":"#ee9822ff","u16":[61102,39128,8674,65535]}}, +{"bias":0.5,"c1":"#e8cb2dff","c2":"#ff0000ff","out":{"hex":"#f46617ff","u16":[62580,26086,5783,65535]}}, +{"bias":0.75,"c1":"#e8cb2dff","c2":"#ff0000ff","out":{"hex":"#f9330bff","u16":[64057,13043,2891,65535]}}, +{"bias":0.9,"c1":"#e8cb2dff","c2":"#ff0000ff","out":{"hex":"#fd1405ff","u16":[64944,5217,1157,65535]}}, +{"bias":1,"c1":"#e8cb2dff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":1.5,"c1":"#e8cb2dff","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":-0.5,"c1":"#e8cb2dff","c2":"#00ff00ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0,"c1":"#e8cb2dff","c2":"#00ff00ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.1,"c1":"#e8cb2dff","c2":"#00ff00ff","out":{"hex":"#d1d029ff","u16":[53662,53507,10409,65535]}}, +{"bias":0.25,"c1":"#e8cb2dff","c2":"#00ff00ff","out":{"hex":"#aed822ff","u16":[44718,55512,8674,65535]}}, +{"bias":0.5,"c1":"#e8cb2dff","c2":"#00ff00ff","out":{"hex":"#74e517ff","u16":[29812,58853,5783,65535]}}, +{"bias":0.75,"c1":"#e8cb2dff","c2":"#00ff00ff","out":{"hex":"#3af20bff","u16":[14906,62194,2891,65535]}}, +{"bias":0.9,"c1":"#e8cb2dff","c2":"#00ff00ff","out":{"hex":"#17fa05ff","u16":[5962,64199,1157,65535]}}, +{"bias":1,"c1":"#e8cb2dff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":1.5,"c1":"#e8cb2dff","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":-0.5,"c1":"#e8cb2dff","c2":"#0000ffff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0,"c1":"#e8cb2dff","c2":"#0000ffff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.1,"c1":"#e8cb2dff","c2":"#0000ffff","out":{"hex":"#d1b742ff","u16":[53662,46954,16962,65535]}}, +{"bias":0.25,"c1":"#e8cb2dff","c2":"#0000ffff","out":{"hex":"#ae9862ff","u16":[44718,39128,25058,65535]}}, +{"bias":0.5,"c1":"#e8cb2dff","c2":"#0000ffff","out":{"hex":"#746696ff","u16":[29812,26086,38550,65535]}}, +{"bias":0.75,"c1":"#e8cb2dff","c2":"#0000ffff","out":{"hex":"#3a33cbff","u16":[14906,13043,52043,65535]}}, +{"bias":0.9,"c1":"#e8cb2dff","c2":"#0000ffff","out":{"hex":"#1714eaff","u16":[5962,5217,60138,65535]}}, +{"bias":1,"c1":"#e8cb2dff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":1.5,"c1":"#e8cb2dff","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":-0.5,"c1":"#e8cb2dff","c2":"#ffff00ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0,"c1":"#e8cb2dff","c2":"#ffff00ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.1,"c1":"#e8cb2dff","c2":"#ffff00ff","out":{"hex":"#ead029ff","u16":[60215,53507,10409,65535]}}, +{"bias":0.25,"c1":"#e8cb2dff","c2":"#ffff00ff","out":{"hex":"#eed822ff","u16":[61102,55512,8674,65535]}}, +{"bias":0.5,"c1":"#e8cb2dff","c2":"#ffff00ff","out":{"hex":"#f4e517ff","u16":[62580,58853,5783,65535]}}, +{"bias":0.75,"c1":"#e8cb2dff","c2":"#ffff00ff","out":{"hex":"#f9f20bff","u16":[64057,62194,2891,65535]}}, +{"bias":0.9,"c1":"#e8cb2dff","c2":"#ffff00ff","out":{"hex":"#fdfa05ff","u16":[64944,64199,1157,65535]}}, +{"bias":1,"c1":"#e8cb2dff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":1.5,"c1":"#e8cb2dff","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":-0.5,"c1":"#e8cb2dff","c2":"#030201ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0,"c1":"#e8cb2dff","c2":"#030201ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.1,"c1":"#e8cb2dff","c2":"#030201ff","out":{"hex":"#d1b729ff","u16":[53739,47005,10434,65535]}}, +{"bias":0.25,"c1":"#e8cb2dff","c2":"#030201ff","out":{"hex":"#af9922ff","u16":[44911,39257,8738,65535]}}, +{"bias":0.5,"c1":"#e8cb2dff","c2":"#030201ff","out":{"hex":"#766717ff","u16":[30198,26343,5911,65535]}}, +{"bias":0.75,"c1":"#e8cb2dff","c2":"#030201ff","out":{"hex":"#3c340cff","u16":[15484,13428,3084,65535]}}, +{"bias":0.9,"c1":"#e8cb2dff","c2":"#030201ff","out":{"hex":"#1a1605ff","u16":[6656,5680,1388,65535]}}, +{"bias":1,"c1":"#e8cb2dff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":1.5,"c1":"#e8cb2dff","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":-0.5,"c1":"#e8cb2dff","c2":"#3daee9ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0,"c1":"#e8cb2dff","c2":"#3daee9ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.1,"c1":"#e8cb2dff","c2":"#3daee9ff","out":{"hex":"#d7c840ff","u16":[55229,51426,16397,65535]}}, +{"bias":0.25,"c1":"#e8cb2dff","c2":"#3daee9ff","out":{"hex":"#bdc45cff","u16":[48637,50308,23644,65535]}}, +{"bias":0.5,"c1":"#e8cb2dff","c2":"#3daee9ff","out":{"hex":"#93bd8bff","u16":[37651,48445,35723,65535]}}, +{"bias":0.75,"c1":"#e8cb2dff","c2":"#3daee9ff","out":{"hex":"#68b5baff","u16":[26664,46581,47802,65535]}}, +{"bias":0.9,"c1":"#e8cb2dff","c2":"#3daee9ff","out":{"hex":"#4eb1d6ff","u16":[20072,45463,55049,65535]}}, +{"bias":1,"c1":"#e8cb2dff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":1.5,"c1":"#e8cb2dff","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":-0.5,"c1":"#e8cb2dff","c2":"#232629ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0,"c1":"#e8cb2dff","c2":"#232629ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.1,"c1":"#e8cb2dff","c2":"#232629ff","out":{"hex":"#d4bb2dff","u16":[54561,47931,11462,65535]}}, +{"bias":0.25,"c1":"#e8cb2dff","c2":"#232629ff","out":{"hex":"#b7a22cff","u16":[46967,41570,11308,65535]}}, +{"bias":0.5,"c1":"#e8cb2dff","c2":"#232629ff","out":{"hex":"#86792bff","u16":[34310,30969,11051,65535]}}, +{"bias":0.75,"c1":"#e8cb2dff","c2":"#232629ff","out":{"hex":"#544f2aff","u16":[21652,20367,10794,65535]}}, +{"bias":0.9,"c1":"#e8cb2dff","c2":"#232629ff","out":{"hex":"#373729ff","u16":[14058,14007,10640,65535]}}, +{"bias":1,"c1":"#e8cb2dff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":1.5,"c1":"#e8cb2dff","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":-0.5,"c1":"#e8cb2dff","c2":"#eff0f1ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0,"c1":"#e8cb2dff","c2":"#eff0f1ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.1,"c1":"#e8cb2dff","c2":"#eff0f1ff","out":{"hex":"#e9cf41ff","u16":[59804,53122,16602,65535]}}, +{"bias":0.25,"c1":"#e8cb2dff","c2":"#eff0f1ff","out":{"hex":"#ead45eff","u16":[60074,54548,24158,65535]}}, +{"bias":0.5,"c1":"#e8cb2dff","c2":"#eff0f1ff","out":{"hex":"#ecde8fff","u16":[60524,56926,36751,65535]}}, +{"bias":0.75,"c1":"#e8cb2dff","c2":"#eff0f1ff","out":{"hex":"#ede7c0ff","u16":[60973,59303,49344,65535]}}, +{"bias":0.9,"c1":"#e8cb2dff","c2":"#eff0f1ff","out":{"hex":"#eeecddff","u16":[61243,60729,56900,65535]}}, +{"bias":1,"c1":"#e8cb2dff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":1.5,"c1":"#e8cb2dff","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":-0.5,"c1":"#e8cb2dff","c2":"#fcfcfcff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0,"c1":"#e8cb2dff","c2":"#fcfcfcff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.1,"c1":"#e8cb2dff","c2":"#fcfcfcff","out":{"hex":"#ead042ff","u16":[60138,53430,16885,65535]}}, +{"bias":0.25,"c1":"#e8cb2dff","c2":"#fcfcfcff","out":{"hex":"#edd761ff","u16":[60909,55319,24865,65535]}}, +{"bias":0.5,"c1":"#e8cb2dff","c2":"#fcfcfcff","out":{"hex":"#f2e495ff","u16":[62194,58468,38165,65535]}}, +{"bias":0.75,"c1":"#e8cb2dff","c2":"#fcfcfcff","out":{"hex":"#f7f0c8ff","u16":[63479,61616,51464,65535]}}, +{"bias":0.9,"c1":"#e8cb2dff","c2":"#fcfcfcff","out":{"hex":"#faf7e7ff","u16":[64250,63505,59444,65535]}}, +{"bias":1,"c1":"#e8cb2dff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":1.5,"c1":"#e8cb2dff","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":-0.5,"c1":"#e8cb2dff","c2":"#da4453ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0,"c1":"#e8cb2dff","c2":"#da4453ff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.1,"c1":"#e8cb2dff","c2":"#da4453ff","out":{"hex":"#e7be31ff","u16":[59264,48702,12542,65535]}}, +{"bias":0.25,"c1":"#e8cb2dff","c2":"#da4453ff","out":{"hex":"#e5a937ff","u16":[58725,43497,14007,65535]}}, +{"bias":0.5,"c1":"#e8cb2dff","c2":"#da4453ff","out":{"hex":"#e18840ff","u16":[57825,34824,16448,65535]}}, +{"bias":0.75,"c1":"#e8cb2dff","c2":"#da4453ff","out":{"hex":"#de664aff","u16":[56926,26150,18890,65535]}}, +{"bias":0.9,"c1":"#e8cb2dff","c2":"#da4453ff","out":{"hex":"#db524fff","u16":[56386,20946,20354,65535]}}, +{"bias":1,"c1":"#e8cb2dff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":1.5,"c1":"#e8cb2dff","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":-0.5,"c1":"#e8cb2dff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0,"c1":"#e8cb2dff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.1,"c1":"#e8cb2dff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.25,"c1":"#e8cb2dff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.5,"c1":"#e8cb2dff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.75,"c1":"#e8cb2dff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.9,"c1":"#e8cb2dff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":1,"c1":"#e8cb2dff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":1.5,"c1":"#e8cb2dff","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":-0.5,"c1":"#e8cb2dff","c2":"#3daee980","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0,"c1":"#e8cb2dff","c2":"#3daee980","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.1,"c1":"#e8cb2dff","c2":"#3daee980","out":{"hex":"#dfc937f2","u16":[57302,51777,14117,62271]}}, +{"bias":0.25,"c1":"#e8cb2dff","c2":"#3daee980","out":{"hex":"#cfc748df","u16":[53325,51103,18490,57375]}}, +{"bias":0.5,"c1":"#e8cb2dff","c2":"#3daee980","out":{"hex":"#afc16cc0","u16":[44937,49680,27712,49216]}}, +{"bias":0.75,"c1":"#e8cb2dff","c2":"#3daee980","out":{"hex":"#81ba9ea0","u16":[33215,47692,40600,41056]}}, +{"bias":0.9,"c1":"#e8cb2dff","c2":"#3daee980","out":{"hex":"#5cb3c78d","u16":[23642,46069,51124,36160]}}, +{"bias":1,"c1":"#e8cb2dff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":1.5,"c1":"#e8cb2dff","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":-0.5,"c1":"#e8cb2dff","c2":"#ffffff00","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0,"c1":"#e8cb2dff","c2":"#ffffff00","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":0.1,"c1":"#e8cb2dff","c2":"#ffffff00","out":{"hex":"#e8cb2de6","u16":[59624,52171,11565,58982]}}, +{"bias":0.25,"c1":"#e8cb2dff","c2":"#ffffff00","out":{"hex":"#e8cb2dbf","u16":[59624,52171,11565,49151]}}, +{"bias":0.5,"c1":"#e8cb2dff","c2":"#ffffff00","out":{"hex":"#e8cb2d80","u16":[59624,52171,11565,32768]}}, +{"bias":0.75,"c1":"#e8cb2dff","c2":"#ffffff00","out":{"hex":"#e8cb2d40","u16":[59624,52171,11565,16384]}}, +{"bias":0.9,"c1":"#e8cb2dff","c2":"#ffffff00","out":{"hex":"#e8cb2d1a","u16":[59624,52171,11565,6554]}}, +{"bias":1,"c1":"#e8cb2dff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":1.5,"c1":"#e8cb2dff","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":-0.5,"c1":"#3daee980","c2":"#000000ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0,"c1":"#3daee980","c2":"#000000ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.1,"c1":"#3daee980","c2":"#000000ff","out":{"hex":"#328ebf8d","u16":[12836,36613,49028,36160]}}, +{"bias":0.25,"c1":"#3daee980","c2":"#000000ff","out":{"hex":"#25698ca0","u16":[9421,26873,35985,41056]}}, +{"bias":0.5,"c1":"#3daee980","c2":"#000000ff","out":{"hex":"#143a4ec0","u16":[5239,14945,20012,49216]}}, +{"bias":0.75,"c1":"#3daee980","c2":"#000000ff","out":{"hex":"#091921df","u16":[2247,6410,8583,57375]}}, +{"bias":0.9,"c1":"#3daee980","c2":"#000000ff","out":{"hex":"#03090cf2","u16":[828,2362,3163,62271]}}, +{"bias":1,"c1":"#3daee980","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":1.5,"c1":"#3daee980","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":-0.5,"c1":"#3daee980","c2":"#ffffffff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0,"c1":"#3daee980","c2":"#ffffffff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.1,"c1":"#3daee980","c2":"#ffffffff","out":{"hex":"#60bded8d","u16":[24713,48491,60906,36160]}}, +{"bias":0.25,"c1":"#3daee980","c2":"#ffffffff","out":{"hex":"#8acef2a0","u16":[35573,53025,62137,41056]}}, +{"bias":0.5,"c1":"#3daee980","c2":"#ffffffff","out":{"hex":"#bee4f8c0","u16":[48872,58578,63645,49216]}}, +{"bias":0.75,"c1":"#3daee980","c2":"#ffffffff","out":{"hex":"#e3f3fcdf","u16":[58389,62551,64725,57375]}}, +{"bias":0.9,"c1":"#3daee980","c2":"#ffffffff","out":{"hex":"#f5fbfef2","u16":[62901,64435,65236,62271]}}, +{"bias":1,"c1":"#3daee980","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":1.5,"c1":"#3daee980","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":-0.5,"c1":"#3daee980","c2":"#7f7f7fff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0,"c1":"#3daee980","c2":"#7f7f7fff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.1,"c1":"#3daee980","c2":"#7f7f7fff","out":{"hex":"#49a5d68d","u16":[18751,42529,54944,36160]}}, +{"bias":0.25,"c1":"#3daee980","c2":"#7f7f7fff","out":{"hex":"#579bbfa0","u16":[22446,39898,49010,41056]}}, +{"bias":0.5,"c1":"#3daee980","c2":"#7f7f7fff","out":{"hex":"#698fa2c0","u16":[26970,36676,41743,49216]}}, +{"bias":0.75,"c1":"#3daee980","c2":"#7f7f7fff","out":{"hex":"#76868edf","u16":[30208,34370,36544,57375]}}, +{"bias":0.9,"c1":"#3daee980","c2":"#7f7f7fff","out":{"hex":"#7c8185f2","u16":[31743,33277,34078,62271]}}, +{"bias":1,"c1":"#3daee980","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":1.5,"c1":"#3daee980","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":-0.5,"c1":"#3daee980","c2":"#808080ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0,"c1":"#3daee980","c2":"#808080ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.1,"c1":"#3daee980","c2":"#808080ff","out":{"hex":"#49a6d68d","u16":[18798,42575,54990,36160]}}, +{"bias":0.25,"c1":"#3daee980","c2":"#808080ff","out":{"hex":"#589cbfa0","u16":[22548,40000,49112,41056]}}, +{"bias":0.5,"c1":"#3daee980","c2":"#808080ff","out":{"hex":"#6a8fa3c0","u16":[27141,36847,41914,49216]}}, +{"bias":0.75,"c1":"#3daee980","c2":"#808080ff","out":{"hex":"#76878fdf","u16":[30428,34591,36764,57375]}}, +{"bias":0.9,"c1":"#3daee980","c2":"#808080ff","out":{"hex":"#7c8286f2","u16":[31986,33521,34322,62271]}}, +{"bias":1,"c1":"#3daee980","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":1.5,"c1":"#3daee980","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":-0.5,"c1":"#3daee980","c2":"#ff0000ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0,"c1":"#3daee980","c2":"#ff0000ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.1,"c1":"#3daee980","c2":"#ff0000ff","out":{"hex":"#608ebf8d","u16":[24713,36613,49028,36160]}}, +{"bias":0.25,"c1":"#3daee980","c2":"#ff0000ff","out":{"hex":"#8a698ca0","u16":[35573,26873,35985,41056]}}, +{"bias":0.5,"c1":"#3daee980","c2":"#ff0000ff","out":{"hex":"#be3a4ec0","u16":[48872,14945,20012,49216]}}, +{"bias":0.75,"c1":"#3daee980","c2":"#ff0000ff","out":{"hex":"#e31921df","u16":[58389,6410,8583,57375]}}, +{"bias":0.9,"c1":"#3daee980","c2":"#ff0000ff","out":{"hex":"#f5090cf2","u16":[62901,2362,3163,62271]}}, +{"bias":1,"c1":"#3daee980","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":1.5,"c1":"#3daee980","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":-0.5,"c1":"#3daee980","c2":"#00ff00ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0,"c1":"#3daee980","c2":"#00ff00ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.1,"c1":"#3daee980","c2":"#00ff00ff","out":{"hex":"#32bdbf8d","u16":[12836,48491,49028,36160]}}, +{"bias":0.25,"c1":"#3daee980","c2":"#00ff00ff","out":{"hex":"#25ce8ca0","u16":[9421,53025,35985,41056]}}, +{"bias":0.5,"c1":"#3daee980","c2":"#00ff00ff","out":{"hex":"#14e44ec0","u16":[5239,58578,20012,49216]}}, +{"bias":0.75,"c1":"#3daee980","c2":"#00ff00ff","out":{"hex":"#09f321df","u16":[2247,62551,8583,57375]}}, +{"bias":0.9,"c1":"#3daee980","c2":"#00ff00ff","out":{"hex":"#03fb0cf2","u16":[828,64435,3163,62271]}}, +{"bias":1,"c1":"#3daee980","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":1.5,"c1":"#3daee980","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":-0.5,"c1":"#3daee980","c2":"#0000ffff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0,"c1":"#3daee980","c2":"#0000ffff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.1,"c1":"#3daee980","c2":"#0000ffff","out":{"hex":"#328eed8d","u16":[12836,36613,60906,36160]}}, +{"bias":0.25,"c1":"#3daee980","c2":"#0000ffff","out":{"hex":"#2569f2a0","u16":[9421,26873,62137,41056]}}, +{"bias":0.5,"c1":"#3daee980","c2":"#0000ffff","out":{"hex":"#143af8c0","u16":[5239,14945,63645,49216]}}, +{"bias":0.75,"c1":"#3daee980","c2":"#0000ffff","out":{"hex":"#0919fcdf","u16":[2247,6410,64725,57375]}}, +{"bias":0.9,"c1":"#3daee980","c2":"#0000ffff","out":{"hex":"#0309fef2","u16":[828,2362,65236,62271]}}, +{"bias":1,"c1":"#3daee980","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":1.5,"c1":"#3daee980","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":-0.5,"c1":"#3daee980","c2":"#ffff00ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0,"c1":"#3daee980","c2":"#ffff00ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.1,"c1":"#3daee980","c2":"#ffff00ff","out":{"hex":"#60bdbf8d","u16":[24713,48491,49028,36160]}}, +{"bias":0.25,"c1":"#3daee980","c2":"#ffff00ff","out":{"hex":"#8ace8ca0","u16":[35573,53025,35985,41056]}}, +{"bias":0.5,"c1":"#3daee980","c2":"#ffff00ff","out":{"hex":"#bee44ec0","u16":[48872,58578,20012,49216]}}, +{"bias":0.75,"c1":"#3daee980","c2":"#ffff00ff","out":{"hex":"#e3f321df","u16":[58389,62551,8583,57375]}}, +{"bias":0.9,"c1":"#3daee980","c2":"#ffff00ff","out":{"hex":"#f5fb0cf2","u16":[62901,64435,3163,62271]}}, +{"bias":1,"c1":"#3daee980","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":1.5,"c1":"#3daee980","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":-0.5,"c1":"#3daee980","c2":"#030201ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0,"c1":"#3daee980","c2":"#030201ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.1,"c1":"#3daee980","c2":"#030201ff","out":{"hex":"#328fbf8d","u16":[12975,36707,49075,36160]}}, +{"bias":0.25,"c1":"#3daee980","c2":"#030201ff","out":{"hex":"#26698ca0","u16":[9729,27078,36087,41056]}}, +{"bias":0.5,"c1":"#3daee980","c2":"#030201ff","out":{"hex":"#163b4fc0","u16":[5753,15287,20184,49216]}}, +{"bias":0.75,"c1":"#3daee980","c2":"#030201ff","out":{"hex":"#0b1b22df","u16":[2908,6850,8803,57375]}}, +{"bias":0.9,"c1":"#3daee980","c2":"#030201ff","out":{"hex":"#060b0df2","u16":[1558,2849,3407,62271]}}, +{"bias":1,"c1":"#3daee980","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":1.5,"c1":"#3daee980","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":-0.5,"c1":"#3daee980","c2":"#3daee9ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0,"c1":"#3daee980","c2":"#3daee9ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.1,"c1":"#3daee980","c2":"#3daee9ff","out":{"hex":"#3daee98d","u16":[15677,44718,59881,36160]}}, +{"bias":0.25,"c1":"#3daee980","c2":"#3daee9ff","out":{"hex":"#3daee9a0","u16":[15677,44718,59881,41056]}}, +{"bias":0.5,"c1":"#3daee980","c2":"#3daee9ff","out":{"hex":"#3daee9c0","u16":[15677,44718,59881,49216]}}, +{"bias":0.75,"c1":"#3daee980","c2":"#3daee9ff","out":{"hex":"#3daee9df","u16":[15677,44718,59881,57375]}}, +{"bias":0.9,"c1":"#3daee980","c2":"#3daee9ff","out":{"hex":"#3daee9f2","u16":[15677,44718,59881,62271]}}, +{"bias":1,"c1":"#3daee980","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":1.5,"c1":"#3daee980","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":-0.5,"c1":"#3daee980","c2":"#232629ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0,"c1":"#3daee980","c2":"#232629ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.1,"c1":"#3daee980","c2":"#232629ff","out":{"hex":"#3895c68d","u16":[14466,38383,50938,36160]}}, +{"bias":0.25,"c1":"#3daee980","c2":"#232629ff","out":{"hex":"#33789ca0","u16":[13010,30770,40190,41056]}}, +{"bias":0.5,"c1":"#3daee980","c2":"#232629ff","out":{"hex":"#2c5369c0","u16":[11228,21447,27028,49216]}}, +{"bias":0.75,"c1":"#3daee980","c2":"#232629ff","out":{"hex":"#273945df","u16":[9953,14776,17610,57375]}}, +{"bias":0.9,"c1":"#3daee980","c2":"#232629ff","out":{"hex":"#242d33f2","u16":[9348,11612,13144,62271]}}, +{"bias":1,"c1":"#3daee980","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":1.5,"c1":"#3daee980","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":-0.5,"c1":"#3daee980","c2":"#eff0f1ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0,"c1":"#3daee980","c2":"#eff0f1ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.1,"c1":"#3daee980","c2":"#eff0f1ff","out":{"hex":"#5dbaea8d","u16":[23968,47792,60254,36160]}}, +{"bias":0.25,"c1":"#3daee980","c2":"#eff0f1ff","out":{"hex":"#84c8eca0","u16":[33932,51487,60701,41056]}}, +{"bias":0.5,"c1":"#3daee980","c2":"#eff0f1ff","out":{"hex":"#b4daeec0","u16":[46135,56011,61250,49216]}}, +{"bias":0.75,"c1":"#3daee980","c2":"#eff0f1ff","out":{"hex":"#d5e7f0df","u16":[54866,59249,61642,57375]}}, +{"bias":0.9,"c1":"#3daee980","c2":"#eff0f1ff","out":{"hex":"#e6edf1f2","u16":[59006,60784,61828,62271]}}, +{"bias":1,"c1":"#3daee980","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":1.5,"c1":"#3daee980","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":-0.5,"c1":"#3daee980","c2":"#fcfcfcff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0,"c1":"#3daee980","c2":"#fcfcfcff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.1,"c1":"#3daee980","c2":"#fcfcfcff","out":{"hex":"#60bcec8d","u16":[24573,48351,60766,36160]}}, +{"bias":0.25,"c1":"#3daee980","c2":"#fcfcfcff","out":{"hex":"#89cdf1a0","u16":[35266,52718,61830,41056]}}, +{"bias":0.5,"c1":"#3daee980","c2":"#fcfcfcff","out":{"hex":"#bce2f6c0","u16":[48359,58065,63132,49216]}}, +{"bias":0.75,"c1":"#3daee980","c2":"#fcfcfcff","out":{"hex":"#e1f1f9df","u16":[57728,61891,64064,57375]}}, +{"bias":0.9,"c1":"#3daee980","c2":"#fcfcfcff","out":{"hex":"#f2f8fbf2","u16":[62171,63705,64506,62271]}}, +{"bias":1,"c1":"#3daee980","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":1.5,"c1":"#3daee980","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":-0.5,"c1":"#3daee980","c2":"#da4453ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0,"c1":"#3daee980","c2":"#da4453ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.1,"c1":"#3daee980","c2":"#da4453ff","out":{"hex":"#599bce8d","u16":[22990,39781,52894,36160]}}, +{"bias":0.25,"c1":"#3daee980","c2":"#da4453ff","out":{"hex":"#7c84ada0","u16":[31779,33847,44497,41056]}}, +{"bias":0.5,"c1":"#3daee980","c2":"#da4453ff","out":{"hex":"#a66785c0","u16":[42541,26580,34215,49216]}}, +{"bias":0.75,"c1":"#3daee980","c2":"#da4453ff","out":{"hex":"#c35369df","u16":[50242,21381,26857,57375]}}, +{"bias":0.9,"c1":"#3daee980","c2":"#da4453ff","out":{"hex":"#d24a5bf2","u16":[53894,18915,23367,62271]}}, +{"bias":1,"c1":"#3daee980","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":1.5,"c1":"#3daee980","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":-0.5,"c1":"#3daee980","c2":"#e8cb2dff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0,"c1":"#3daee980","c2":"#e8cb2dff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.1,"c1":"#3daee980","c2":"#e8cb2dff","out":{"hex":"#5cb3c78d","u16":[23642,46069,51124,36160]}}, +{"bias":0.25,"c1":"#3daee980","c2":"#e8cb2dff","out":{"hex":"#81ba9ea0","u16":[33215,47692,40600,41056]}}, +{"bias":0.5,"c1":"#3daee980","c2":"#e8cb2dff","out":{"hex":"#afc16cc0","u16":[44937,49680,27712,49216]}}, +{"bias":0.75,"c1":"#3daee980","c2":"#e8cb2dff","out":{"hex":"#cfc748df","u16":[53325,51103,18490,57375]}}, +{"bias":0.9,"c1":"#3daee980","c2":"#e8cb2dff","out":{"hex":"#dfc937f2","u16":[57302,51777,14117,62271]}}, +{"bias":1,"c1":"#3daee980","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":1.5,"c1":"#3daee980","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":-0.5,"c1":"#3daee980","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0,"c1":"#3daee980","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.1,"c1":"#3daee980","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.25,"c1":"#3daee980","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.5,"c1":"#3daee980","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.75,"c1":"#3daee980","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.9,"c1":"#3daee980","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":1,"c1":"#3daee980","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":1.5,"c1":"#3daee980","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":-0.5,"c1":"#3daee980","c2":"#ffffff00","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0,"c1":"#3daee980","c2":"#ffffff00","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":0.1,"c1":"#3daee980","c2":"#ffffff00","out":{"hex":"#3daee973","u16":[15677,44718,59881,29606]}}, +{"bias":0.25,"c1":"#3daee980","c2":"#ffffff00","out":{"hex":"#3daee960","u16":[15677,44718,59881,24672]}}, +{"bias":0.5,"c1":"#3daee980","c2":"#ffffff00","out":{"hex":"#3daee940","u16":[15677,44718,59881,16448]}}, +{"bias":0.75,"c1":"#3daee980","c2":"#ffffff00","out":{"hex":"#3daee920","u16":[15677,44718,59881,8224]}}, +{"bias":0.9,"c1":"#3daee980","c2":"#ffffff00","out":{"hex":"#3daee90d","u16":[15677,44718,59881,3290]}}, +{"bias":1,"c1":"#3daee980","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":1.5,"c1":"#3daee980","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":-0.5,"c1":"#ffffff00","c2":"#000000ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0,"c1":"#ffffff00","c2":"#000000ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0.1,"c1":"#ffffff00","c2":"#000000ff","out":{"hex":"#0000001a","u16":[0,0,0,6554]}}, +{"bias":0.25,"c1":"#ffffff00","c2":"#000000ff","out":{"hex":"#00000040","u16":[0,0,0,16384]}}, +{"bias":0.5,"c1":"#ffffff00","c2":"#000000ff","out":{"hex":"#00000080","u16":[0,0,0,32768]}}, +{"bias":0.75,"c1":"#ffffff00","c2":"#000000ff","out":{"hex":"#000000bf","u16":[0,0,0,49151]}}, +{"bias":0.9,"c1":"#ffffff00","c2":"#000000ff","out":{"hex":"#000000e6","u16":[0,0,0,58982]}}, +{"bias":1,"c1":"#ffffff00","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":1.5,"c1":"#ffffff00","c2":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"bias":-0.5,"c1":"#ffffff00","c2":"#ffffffff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0,"c1":"#ffffff00","c2":"#ffffffff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0.1,"c1":"#ffffff00","c2":"#ffffffff","out":{"hex":"#ffffff1a","u16":[65535,65535,65535,6554]}}, +{"bias":0.25,"c1":"#ffffff00","c2":"#ffffffff","out":{"hex":"#ffffff40","u16":[65535,65535,65535,16384]}}, +{"bias":0.5,"c1":"#ffffff00","c2":"#ffffffff","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]}}, +{"bias":0.75,"c1":"#ffffff00","c2":"#ffffffff","out":{"hex":"#ffffffbf","u16":[65535,65535,65535,49151]}}, +{"bias":0.9,"c1":"#ffffff00","c2":"#ffffffff","out":{"hex":"#ffffffe6","u16":[65535,65535,65535,58982]}}, +{"bias":1,"c1":"#ffffff00","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":1.5,"c1":"#ffffff00","c2":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"bias":-0.5,"c1":"#ffffff00","c2":"#7f7f7fff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0,"c1":"#ffffff00","c2":"#7f7f7fff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0.1,"c1":"#ffffff00","c2":"#7f7f7fff","out":{"hex":"#7f7f7f1a","u16":[32639,32639,32639,6554]}}, +{"bias":0.25,"c1":"#ffffff00","c2":"#7f7f7fff","out":{"hex":"#7f7f7f40","u16":[32639,32639,32639,16384]}}, +{"bias":0.5,"c1":"#ffffff00","c2":"#7f7f7fff","out":{"hex":"#7f7f7f80","u16":[32639,32639,32639,32768]}}, +{"bias":0.75,"c1":"#ffffff00","c2":"#7f7f7fff","out":{"hex":"#7f7f7fbf","u16":[32639,32639,32639,49151]}}, +{"bias":0.9,"c1":"#ffffff00","c2":"#7f7f7fff","out":{"hex":"#7f7f7fe6","u16":[32639,32639,32639,58982]}}, +{"bias":1,"c1":"#ffffff00","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":1.5,"c1":"#ffffff00","c2":"#7f7f7fff","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"bias":-0.5,"c1":"#ffffff00","c2":"#808080ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0,"c1":"#ffffff00","c2":"#808080ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0.1,"c1":"#ffffff00","c2":"#808080ff","out":{"hex":"#8080801a","u16":[32896,32896,32896,6554]}}, +{"bias":0.25,"c1":"#ffffff00","c2":"#808080ff","out":{"hex":"#80808040","u16":[32896,32896,32896,16384]}}, +{"bias":0.5,"c1":"#ffffff00","c2":"#808080ff","out":{"hex":"#80808080","u16":[32896,32896,32896,32768]}}, +{"bias":0.75,"c1":"#ffffff00","c2":"#808080ff","out":{"hex":"#808080bf","u16":[32896,32896,32896,49151]}}, +{"bias":0.9,"c1":"#ffffff00","c2":"#808080ff","out":{"hex":"#808080e6","u16":[32896,32896,32896,58982]}}, +{"bias":1,"c1":"#ffffff00","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":1.5,"c1":"#ffffff00","c2":"#808080ff","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"bias":-0.5,"c1":"#ffffff00","c2":"#ff0000ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0,"c1":"#ffffff00","c2":"#ff0000ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0.1,"c1":"#ffffff00","c2":"#ff0000ff","out":{"hex":"#ff00001a","u16":[65535,0,0,6554]}}, +{"bias":0.25,"c1":"#ffffff00","c2":"#ff0000ff","out":{"hex":"#ff000040","u16":[65535,0,0,16384]}}, +{"bias":0.5,"c1":"#ffffff00","c2":"#ff0000ff","out":{"hex":"#ff000080","u16":[65535,0,0,32768]}}, +{"bias":0.75,"c1":"#ffffff00","c2":"#ff0000ff","out":{"hex":"#ff0000bf","u16":[65535,0,0,49151]}}, +{"bias":0.9,"c1":"#ffffff00","c2":"#ff0000ff","out":{"hex":"#ff0000e6","u16":[65535,0,0,58982]}}, +{"bias":1,"c1":"#ffffff00","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":1.5,"c1":"#ffffff00","c2":"#ff0000ff","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"bias":-0.5,"c1":"#ffffff00","c2":"#00ff00ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0,"c1":"#ffffff00","c2":"#00ff00ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0.1,"c1":"#ffffff00","c2":"#00ff00ff","out":{"hex":"#00ff001a","u16":[0,65535,0,6554]}}, +{"bias":0.25,"c1":"#ffffff00","c2":"#00ff00ff","out":{"hex":"#00ff0040","u16":[0,65535,0,16384]}}, +{"bias":0.5,"c1":"#ffffff00","c2":"#00ff00ff","out":{"hex":"#00ff0080","u16":[0,65535,0,32768]}}, +{"bias":0.75,"c1":"#ffffff00","c2":"#00ff00ff","out":{"hex":"#00ff00bf","u16":[0,65535,0,49151]}}, +{"bias":0.9,"c1":"#ffffff00","c2":"#00ff00ff","out":{"hex":"#00ff00e6","u16":[0,65535,0,58982]}}, +{"bias":1,"c1":"#ffffff00","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":1.5,"c1":"#ffffff00","c2":"#00ff00ff","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"bias":-0.5,"c1":"#ffffff00","c2":"#0000ffff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0,"c1":"#ffffff00","c2":"#0000ffff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0.1,"c1":"#ffffff00","c2":"#0000ffff","out":{"hex":"#0000ff1a","u16":[0,0,65535,6554]}}, +{"bias":0.25,"c1":"#ffffff00","c2":"#0000ffff","out":{"hex":"#0000ff40","u16":[0,0,65535,16384]}}, +{"bias":0.5,"c1":"#ffffff00","c2":"#0000ffff","out":{"hex":"#0000ff80","u16":[0,0,65535,32768]}}, +{"bias":0.75,"c1":"#ffffff00","c2":"#0000ffff","out":{"hex":"#0000ffbf","u16":[0,0,65535,49151]}}, +{"bias":0.9,"c1":"#ffffff00","c2":"#0000ffff","out":{"hex":"#0000ffe6","u16":[0,0,65535,58982]}}, +{"bias":1,"c1":"#ffffff00","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":1.5,"c1":"#ffffff00","c2":"#0000ffff","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"bias":-0.5,"c1":"#ffffff00","c2":"#ffff00ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0,"c1":"#ffffff00","c2":"#ffff00ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0.1,"c1":"#ffffff00","c2":"#ffff00ff","out":{"hex":"#ffff001a","u16":[65535,65535,0,6554]}}, +{"bias":0.25,"c1":"#ffffff00","c2":"#ffff00ff","out":{"hex":"#ffff0040","u16":[65535,65535,0,16384]}}, +{"bias":0.5,"c1":"#ffffff00","c2":"#ffff00ff","out":{"hex":"#ffff0080","u16":[65535,65535,0,32768]}}, +{"bias":0.75,"c1":"#ffffff00","c2":"#ffff00ff","out":{"hex":"#ffff00bf","u16":[65535,65535,0,49151]}}, +{"bias":0.9,"c1":"#ffffff00","c2":"#ffff00ff","out":{"hex":"#ffff00e6","u16":[65535,65535,0,58982]}}, +{"bias":1,"c1":"#ffffff00","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":1.5,"c1":"#ffffff00","c2":"#ffff00ff","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"bias":-0.5,"c1":"#ffffff00","c2":"#030201ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0,"c1":"#ffffff00","c2":"#030201ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0.1,"c1":"#ffffff00","c2":"#030201ff","out":{"hex":"#0302011a","u16":[771,514,257,6554]}}, +{"bias":0.25,"c1":"#ffffff00","c2":"#030201ff","out":{"hex":"#03020140","u16":[771,514,257,16384]}}, +{"bias":0.5,"c1":"#ffffff00","c2":"#030201ff","out":{"hex":"#03020180","u16":[771,514,257,32768]}}, +{"bias":0.75,"c1":"#ffffff00","c2":"#030201ff","out":{"hex":"#030201bf","u16":[771,514,257,49151]}}, +{"bias":0.9,"c1":"#ffffff00","c2":"#030201ff","out":{"hex":"#030201e6","u16":[771,514,257,58982]}}, +{"bias":1,"c1":"#ffffff00","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":1.5,"c1":"#ffffff00","c2":"#030201ff","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"bias":-0.5,"c1":"#ffffff00","c2":"#3daee9ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0,"c1":"#ffffff00","c2":"#3daee9ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0.1,"c1":"#ffffff00","c2":"#3daee9ff","out":{"hex":"#3daee91a","u16":[15677,44718,59881,6554]}}, +{"bias":0.25,"c1":"#ffffff00","c2":"#3daee9ff","out":{"hex":"#3daee940","u16":[15677,44718,59881,16384]}}, +{"bias":0.5,"c1":"#ffffff00","c2":"#3daee9ff","out":{"hex":"#3daee980","u16":[15677,44718,59881,32768]}}, +{"bias":0.75,"c1":"#ffffff00","c2":"#3daee9ff","out":{"hex":"#3daee9bf","u16":[15677,44718,59881,49151]}}, +{"bias":0.9,"c1":"#ffffff00","c2":"#3daee9ff","out":{"hex":"#3daee9e6","u16":[15677,44718,59881,58982]}}, +{"bias":1,"c1":"#ffffff00","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":1.5,"c1":"#ffffff00","c2":"#3daee9ff","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"bias":-0.5,"c1":"#ffffff00","c2":"#232629ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0,"c1":"#ffffff00","c2":"#232629ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0.1,"c1":"#ffffff00","c2":"#232629ff","out":{"hex":"#2326291a","u16":[8995,9766,10537,6554]}}, +{"bias":0.25,"c1":"#ffffff00","c2":"#232629ff","out":{"hex":"#23262940","u16":[8995,9766,10537,16384]}}, +{"bias":0.5,"c1":"#ffffff00","c2":"#232629ff","out":{"hex":"#23262980","u16":[8995,9766,10537,32768]}}, +{"bias":0.75,"c1":"#ffffff00","c2":"#232629ff","out":{"hex":"#232629bf","u16":[8995,9766,10537,49151]}}, +{"bias":0.9,"c1":"#ffffff00","c2":"#232629ff","out":{"hex":"#232629e6","u16":[8995,9766,10537,58982]}}, +{"bias":1,"c1":"#ffffff00","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":1.5,"c1":"#ffffff00","c2":"#232629ff","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"bias":-0.5,"c1":"#ffffff00","c2":"#eff0f1ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0,"c1":"#ffffff00","c2":"#eff0f1ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0.1,"c1":"#ffffff00","c2":"#eff0f1ff","out":{"hex":"#eff0f11a","u16":[61423,61680,61937,6554]}}, +{"bias":0.25,"c1":"#ffffff00","c2":"#eff0f1ff","out":{"hex":"#eff0f140","u16":[61423,61680,61937,16384]}}, +{"bias":0.5,"c1":"#ffffff00","c2":"#eff0f1ff","out":{"hex":"#eff0f180","u16":[61423,61680,61937,32768]}}, +{"bias":0.75,"c1":"#ffffff00","c2":"#eff0f1ff","out":{"hex":"#eff0f1bf","u16":[61423,61680,61937,49151]}}, +{"bias":0.9,"c1":"#ffffff00","c2":"#eff0f1ff","out":{"hex":"#eff0f1e6","u16":[61423,61680,61937,58982]}}, +{"bias":1,"c1":"#ffffff00","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":1.5,"c1":"#ffffff00","c2":"#eff0f1ff","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"bias":-0.5,"c1":"#ffffff00","c2":"#fcfcfcff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0,"c1":"#ffffff00","c2":"#fcfcfcff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0.1,"c1":"#ffffff00","c2":"#fcfcfcff","out":{"hex":"#fcfcfc1a","u16":[64764,64764,64764,6554]}}, +{"bias":0.25,"c1":"#ffffff00","c2":"#fcfcfcff","out":{"hex":"#fcfcfc40","u16":[64764,64764,64764,16384]}}, +{"bias":0.5,"c1":"#ffffff00","c2":"#fcfcfcff","out":{"hex":"#fcfcfc80","u16":[64764,64764,64764,32768]}}, +{"bias":0.75,"c1":"#ffffff00","c2":"#fcfcfcff","out":{"hex":"#fcfcfcbf","u16":[64764,64764,64764,49151]}}, +{"bias":0.9,"c1":"#ffffff00","c2":"#fcfcfcff","out":{"hex":"#fcfcfce6","u16":[64764,64764,64764,58982]}}, +{"bias":1,"c1":"#ffffff00","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":1.5,"c1":"#ffffff00","c2":"#fcfcfcff","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"bias":-0.5,"c1":"#ffffff00","c2":"#da4453ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0,"c1":"#ffffff00","c2":"#da4453ff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0.1,"c1":"#ffffff00","c2":"#da4453ff","out":{"hex":"#da44531a","u16":[56026,17476,21331,6554]}}, +{"bias":0.25,"c1":"#ffffff00","c2":"#da4453ff","out":{"hex":"#da445340","u16":[56026,17476,21331,16384]}}, +{"bias":0.5,"c1":"#ffffff00","c2":"#da4453ff","out":{"hex":"#da445380","u16":[56026,17476,21331,32768]}}, +{"bias":0.75,"c1":"#ffffff00","c2":"#da4453ff","out":{"hex":"#da4453bf","u16":[56026,17476,21331,49151]}}, +{"bias":0.9,"c1":"#ffffff00","c2":"#da4453ff","out":{"hex":"#da4453e6","u16":[56026,17476,21331,58982]}}, +{"bias":1,"c1":"#ffffff00","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":1.5,"c1":"#ffffff00","c2":"#da4453ff","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"bias":-0.5,"c1":"#ffffff00","c2":"#e8cb2dff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0,"c1":"#ffffff00","c2":"#e8cb2dff","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0.1,"c1":"#ffffff00","c2":"#e8cb2dff","out":{"hex":"#e8cb2d1a","u16":[59624,52171,11565,6554]}}, +{"bias":0.25,"c1":"#ffffff00","c2":"#e8cb2dff","out":{"hex":"#e8cb2d40","u16":[59624,52171,11565,16384]}}, +{"bias":0.5,"c1":"#ffffff00","c2":"#e8cb2dff","out":{"hex":"#e8cb2d80","u16":[59624,52171,11565,32768]}}, +{"bias":0.75,"c1":"#ffffff00","c2":"#e8cb2dff","out":{"hex":"#e8cb2dbf","u16":[59624,52171,11565,49151]}}, +{"bias":0.9,"c1":"#ffffff00","c2":"#e8cb2dff","out":{"hex":"#e8cb2de6","u16":[59624,52171,11565,58982]}}, +{"bias":1,"c1":"#ffffff00","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":1.5,"c1":"#ffffff00","c2":"#e8cb2dff","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"bias":-0.5,"c1":"#ffffff00","c2":"#3daee980","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0,"c1":"#ffffff00","c2":"#3daee980","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0.1,"c1":"#ffffff00","c2":"#3daee980","out":{"hex":"#3daee90d","u16":[15677,44718,59881,3290]}}, +{"bias":0.25,"c1":"#ffffff00","c2":"#3daee980","out":{"hex":"#3daee920","u16":[15677,44718,59881,8224]}}, +{"bias":0.5,"c1":"#ffffff00","c2":"#3daee980","out":{"hex":"#3daee940","u16":[15677,44718,59881,16448]}}, +{"bias":0.75,"c1":"#ffffff00","c2":"#3daee980","out":{"hex":"#3daee960","u16":[15677,44718,59881,24672]}}, +{"bias":0.9,"c1":"#ffffff00","c2":"#3daee980","out":{"hex":"#3daee973","u16":[15677,44718,59881,29606]}}, +{"bias":1,"c1":"#ffffff00","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":1.5,"c1":"#ffffff00","c2":"#3daee980","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"bias":-0.5,"c1":"#ffffff00","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0,"c1":"#ffffff00","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":0.1,"c1":"#ffffff00","c2":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"bias":0.25,"c1":"#ffffff00","c2":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"bias":0.5,"c1":"#ffffff00","c2":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"bias":0.75,"c1":"#ffffff00","c2":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"bias":0.9,"c1":"#ffffff00","c2":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"bias":1,"c1":"#ffffff00","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"bias":1.5,"c1":"#ffffff00","c2":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}} +], +"overlay": [ +{"base":"#000000ff","mode":"SourceOver","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#000000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#000000ff","mode":"Screen","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#000000ff","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#000000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#ffffffff"}, +{"base":"#000000ff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#000000ff","mode":"SourceOver","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#000000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#7f7f7fff"}, +{"base":"#000000ff","mode":"Screen","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#000000ff","mode":"SourceOver","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#000000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#808080ff"}, +{"base":"#000000ff","mode":"Screen","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#000000ff","mode":"SourceOver","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#000000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#000000ff","mode":"Screen","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#000000ff","mode":"SourceOver","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#000000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#00ff00ff"}, +{"base":"#000000ff","mode":"Screen","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#000000ff","mode":"SourceOver","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#000000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#0000ffff"}, +{"base":"#000000ff","mode":"Screen","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#000000ff","mode":"SourceOver","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#000000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#ffff00ff"}, +{"base":"#000000ff","mode":"Screen","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#000000ff","mode":"SourceOver","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#000000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#030201ff"}, +{"base":"#000000ff","mode":"Screen","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#000000ff","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#000000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#3daee9ff"}, +{"base":"#000000ff","mode":"Screen","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#000000ff","mode":"SourceOver","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#000000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#232629ff"}, +{"base":"#000000ff","mode":"Screen","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#000000ff","mode":"SourceOver","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#000000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#eff0f1ff"}, +{"base":"#000000ff","mode":"Screen","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#000000ff","mode":"SourceOver","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#000000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#fcfcfcff"}, +{"base":"#000000ff","mode":"Screen","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#000000ff","mode":"SourceOver","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#000000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#da4453ff"}, +{"base":"#000000ff","mode":"Screen","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#000000ff","mode":"SourceOver","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#000000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#e8cb2dff"}, +{"base":"#000000ff","mode":"Screen","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#000000ff","mode":"SourceOver","out":{"hex":"#1f5775ff","u16":[7967,22359,30069,65535]},"paint":"#3daee980"}, +{"base":"#000000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#3daee980"}, +{"base":"#000000ff","mode":"Screen","out":{"hex":"#1f5775ff","u16":[7967,22359,30069,65535]},"paint":"#3daee980"}, +{"base":"#000000ff","mode":"SourceOver","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#ffffff00"}, +{"base":"#000000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#ffffff00"}, +{"base":"#000000ff","mode":"Screen","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#ffffff00"}, +{"base":"#ffffffff","mode":"SourceOver","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#ffffffff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#ffffffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#000000ff"}, +{"base":"#ffffffff","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#ffffffff","mode":"Multiply","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#ffffffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#ffffffff","mode":"SourceOver","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#ffffffff","mode":"Multiply","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#ffffffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#7f7f7fff"}, +{"base":"#ffffffff","mode":"SourceOver","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#ffffffff","mode":"Multiply","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#ffffffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#808080ff"}, +{"base":"#ffffffff","mode":"SourceOver","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#ffffffff","mode":"Multiply","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#ffffffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ff0000ff"}, +{"base":"#ffffffff","mode":"SourceOver","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#ffffffff","mode":"Multiply","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#ffffffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#00ff00ff"}, +{"base":"#ffffffff","mode":"SourceOver","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#ffffffff","mode":"Multiply","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#ffffffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#0000ffff"}, +{"base":"#ffffffff","mode":"SourceOver","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#ffffffff","mode":"Multiply","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#ffffffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffff00ff"}, +{"base":"#ffffffff","mode":"SourceOver","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#ffffffff","mode":"Multiply","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#ffffffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#030201ff"}, +{"base":"#ffffffff","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#ffffffff","mode":"Multiply","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#ffffffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#3daee9ff"}, +{"base":"#ffffffff","mode":"SourceOver","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#ffffffff","mode":"Multiply","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#ffffffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#232629ff"}, +{"base":"#ffffffff","mode":"SourceOver","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#ffffffff","mode":"Multiply","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#ffffffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#eff0f1ff"}, +{"base":"#ffffffff","mode":"SourceOver","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#ffffffff","mode":"Multiply","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#ffffffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#fcfcfcff"}, +{"base":"#ffffffff","mode":"SourceOver","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#ffffffff","mode":"Multiply","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#ffffffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#da4453ff"}, +{"base":"#ffffffff","mode":"SourceOver","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#ffffffff","mode":"Multiply","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#ffffffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#e8cb2dff"}, +{"base":"#ffffffff","mode":"SourceOver","out":{"hex":"#9ed6f4ff","u16":[40606,54998,62708,65535]},"paint":"#3daee980"}, +{"base":"#ffffffff","mode":"Multiply","out":{"hex":"#9ed6f4ff","u16":[40606,54998,62708,65535]},"paint":"#3daee980"}, +{"base":"#ffffffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#3daee980"}, +{"base":"#ffffffff","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffff00"}, +{"base":"#ffffffff","mode":"Multiply","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffff00"}, +{"base":"#ffffffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffff00"}, +{"base":"#7f7f7fff","mode":"SourceOver","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#7f7f7fff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#7f7f7fff","mode":"Screen","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#000000ff"}, +{"base":"#7f7f7fff","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#7f7f7fff","mode":"Multiply","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#ffffffff"}, +{"base":"#7f7f7fff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#7f7f7fff","mode":"SourceOver","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#7f7f7fff","mode":"Multiply","out":{"hex":"#3f3f3fff","u16":[16191,16191,16191,65535]},"paint":"#7f7f7fff"}, +{"base":"#7f7f7fff","mode":"Screen","out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]},"paint":"#7f7f7fff"}, +{"base":"#7f7f7fff","mode":"SourceOver","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#7f7f7fff","mode":"Multiply","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]},"paint":"#808080ff"}, +{"base":"#7f7f7fff","mode":"Screen","out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]},"paint":"#808080ff"}, +{"base":"#7f7f7fff","mode":"SourceOver","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#7f7f7fff","mode":"Multiply","out":{"hex":"#7f0000ff","u16":[32639,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#7f7f7fff","mode":"Screen","out":{"hex":"#ff7f7fff","u16":[65535,32639,32639,65535]},"paint":"#ff0000ff"}, +{"base":"#7f7f7fff","mode":"SourceOver","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#7f7f7fff","mode":"Multiply","out":{"hex":"#007f00ff","u16":[0,32639,0,65535]},"paint":"#00ff00ff"}, +{"base":"#7f7f7fff","mode":"Screen","out":{"hex":"#7fff7fff","u16":[32639,65535,32639,65535]},"paint":"#00ff00ff"}, +{"base":"#7f7f7fff","mode":"SourceOver","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#7f7f7fff","mode":"Multiply","out":{"hex":"#00007fff","u16":[0,0,32639,65535]},"paint":"#0000ffff"}, +{"base":"#7f7f7fff","mode":"Screen","out":{"hex":"#7f7fffff","u16":[32639,32639,65535,65535]},"paint":"#0000ffff"}, +{"base":"#7f7f7fff","mode":"SourceOver","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#7f7f7fff","mode":"Multiply","out":{"hex":"#7f7f00ff","u16":[32639,32639,0,65535]},"paint":"#ffff00ff"}, +{"base":"#7f7f7fff","mode":"Screen","out":{"hex":"#ffff7fff","u16":[65535,65535,32639,65535]},"paint":"#ffff00ff"}, +{"base":"#7f7f7fff","mode":"SourceOver","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#7f7f7fff","mode":"Multiply","out":{"hex":"#010100ff","u16":[257,257,0,65535]},"paint":"#030201ff"}, +{"base":"#7f7f7fff","mode":"Screen","out":{"hex":"#818080ff","u16":[33153,32896,32896,65535]},"paint":"#030201ff"}, +{"base":"#7f7f7fff","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#7f7f7fff","mode":"Multiply","out":{"hex":"#1e5774ff","u16":[7710,22359,29812,65535]},"paint":"#3daee9ff"}, +{"base":"#7f7f7fff","mode":"Screen","out":{"hex":"#9ed6f4ff","u16":[40606,54998,62708,65535]},"paint":"#3daee9ff"}, +{"base":"#7f7f7fff","mode":"SourceOver","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#7f7f7fff","mode":"Multiply","out":{"hex":"#111314ff","u16":[4369,4883,5140,65535]},"paint":"#232629ff"}, +{"base":"#7f7f7fff","mode":"Screen","out":{"hex":"#919294ff","u16":[37265,37522,38036,65535]},"paint":"#232629ff"}, +{"base":"#7f7f7fff","mode":"SourceOver","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#7f7f7fff","mode":"Multiply","out":{"hex":"#777878ff","u16":[30583,30840,30840,65535]},"paint":"#eff0f1ff"}, +{"base":"#7f7f7fff","mode":"Screen","out":{"hex":"#f7f7f8ff","u16":[63479,63479,63736,65535]},"paint":"#eff0f1ff"}, +{"base":"#7f7f7fff","mode":"SourceOver","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#7f7f7fff","mode":"Multiply","out":{"hex":"#7e7e7eff","u16":[32382,32382,32382,65535]},"paint":"#fcfcfcff"}, +{"base":"#7f7f7fff","mode":"Screen","out":{"hex":"#fdfdfdff","u16":[65021,65021,65021,65535]},"paint":"#fcfcfcff"}, +{"base":"#7f7f7fff","mode":"SourceOver","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#7f7f7fff","mode":"Multiply","out":{"hex":"#6d2229ff","u16":[28013,8738,10537,65535]},"paint":"#da4453ff"}, +{"base":"#7f7f7fff","mode":"Screen","out":{"hex":"#eca1a9ff","u16":[60652,41377,43433,65535]},"paint":"#da4453ff"}, +{"base":"#7f7f7fff","mode":"SourceOver","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#7f7f7fff","mode":"Multiply","out":{"hex":"#746516ff","u16":[29812,25957,5654,65535]},"paint":"#e8cb2dff"}, +{"base":"#7f7f7fff","mode":"Screen","out":{"hex":"#f3e596ff","u16":[62451,58853,38550,65535]},"paint":"#e8cb2dff"}, +{"base":"#7f7f7fff","mode":"SourceOver","out":{"hex":"#5e96b4ff","u16":[24158,38550,46260,65535]},"paint":"#3daee980"}, +{"base":"#7f7f7fff","mode":"Multiply","out":{"hex":"#4f6b7aff","u16":[20303,27499,31354,65535]},"paint":"#3daee980"}, +{"base":"#7f7f7fff","mode":"Screen","out":{"hex":"#8fabbaff","u16":[36751,43947,47802,65535]},"paint":"#3daee980"}, +{"base":"#7f7f7fff","mode":"SourceOver","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#ffffff00"}, +{"base":"#7f7f7fff","mode":"Multiply","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#ffffff00"}, +{"base":"#7f7f7fff","mode":"Screen","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#ffffff00"}, +{"base":"#808080ff","mode":"SourceOver","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#808080ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#808080ff","mode":"Screen","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#000000ff"}, +{"base":"#808080ff","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#808080ff","mode":"Multiply","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#ffffffff"}, +{"base":"#808080ff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#808080ff","mode":"SourceOver","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#808080ff","mode":"Multiply","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]},"paint":"#7f7f7fff"}, +{"base":"#808080ff","mode":"Screen","out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]},"paint":"#7f7f7fff"}, +{"base":"#808080ff","mode":"SourceOver","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#808080ff","mode":"Multiply","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]},"paint":"#808080ff"}, +{"base":"#808080ff","mode":"Screen","out":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]},"paint":"#808080ff"}, +{"base":"#808080ff","mode":"SourceOver","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#808080ff","mode":"Multiply","out":{"hex":"#800000ff","u16":[32896,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#808080ff","mode":"Screen","out":{"hex":"#ff8080ff","u16":[65535,32896,32896,65535]},"paint":"#ff0000ff"}, +{"base":"#808080ff","mode":"SourceOver","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#808080ff","mode":"Multiply","out":{"hex":"#008000ff","u16":[0,32896,0,65535]},"paint":"#00ff00ff"}, +{"base":"#808080ff","mode":"Screen","out":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]},"paint":"#00ff00ff"}, +{"base":"#808080ff","mode":"SourceOver","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#808080ff","mode":"Multiply","out":{"hex":"#000080ff","u16":[0,0,32896,65535]},"paint":"#0000ffff"}, +{"base":"#808080ff","mode":"Screen","out":{"hex":"#8080ffff","u16":[32896,32896,65535,65535]},"paint":"#0000ffff"}, +{"base":"#808080ff","mode":"SourceOver","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#808080ff","mode":"Multiply","out":{"hex":"#808000ff","u16":[32896,32896,0,65535]},"paint":"#ffff00ff"}, +{"base":"#808080ff","mode":"Screen","out":{"hex":"#ffff80ff","u16":[65535,65535,32896,65535]},"paint":"#ffff00ff"}, +{"base":"#808080ff","mode":"SourceOver","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#808080ff","mode":"Multiply","out":{"hex":"#020101ff","u16":[514,257,257,65535]},"paint":"#030201ff"}, +{"base":"#808080ff","mode":"Screen","out":{"hex":"#818180ff","u16":[33153,33153,32896,65535]},"paint":"#030201ff"}, +{"base":"#808080ff","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#808080ff","mode":"Multiply","out":{"hex":"#1f5775ff","u16":[7967,22359,30069,65535]},"paint":"#3daee9ff"}, +{"base":"#808080ff","mode":"Screen","out":{"hex":"#9ed7f4ff","u16":[40606,55255,62708,65535]},"paint":"#3daee9ff"}, +{"base":"#808080ff","mode":"SourceOver","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#808080ff","mode":"Multiply","out":{"hex":"#121315ff","u16":[4626,4883,5397,65535]},"paint":"#232629ff"}, +{"base":"#808080ff","mode":"Screen","out":{"hex":"#919394ff","u16":[37265,37779,38036,65535]},"paint":"#232629ff"}, +{"base":"#808080ff","mode":"SourceOver","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#808080ff","mode":"Multiply","out":{"hex":"#787879ff","u16":[30840,30840,31097,65535]},"paint":"#eff0f1ff"}, +{"base":"#808080ff","mode":"Screen","out":{"hex":"#f7f8f8ff","u16":[63479,63736,63736,65535]},"paint":"#eff0f1ff"}, +{"base":"#808080ff","mode":"SourceOver","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#808080ff","mode":"Multiply","out":{"hex":"#7e7e7eff","u16":[32382,32382,32382,65535]},"paint":"#fcfcfcff"}, +{"base":"#808080ff","mode":"Screen","out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]},"paint":"#fcfcfcff"}, +{"base":"#808080ff","mode":"SourceOver","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#808080ff","mode":"Multiply","out":{"hex":"#6d222aff","u16":[28013,8738,10794,65535]},"paint":"#da4453ff"}, +{"base":"#808080ff","mode":"Screen","out":{"hex":"#eda2a9ff","u16":[60909,41634,43433,65535]},"paint":"#da4453ff"}, +{"base":"#808080ff","mode":"SourceOver","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#808080ff","mode":"Multiply","out":{"hex":"#746617ff","u16":[29812,26214,5911,65535]},"paint":"#e8cb2dff"}, +{"base":"#808080ff","mode":"Screen","out":{"hex":"#f4e596ff","u16":[62708,58853,38550,65535]},"paint":"#e8cb2dff"}, +{"base":"#808080ff","mode":"SourceOver","out":{"hex":"#5f97b5ff","u16":[24415,38807,46517,65535]},"paint":"#3daee980"}, +{"base":"#808080ff","mode":"Multiply","out":{"hex":"#4f6b7aff","u16":[20303,27499,31354,65535]},"paint":"#3daee980"}, +{"base":"#808080ff","mode":"Screen","out":{"hex":"#8fabbaff","u16":[36751,43947,47802,65535]},"paint":"#3daee980"}, +{"base":"#808080ff","mode":"SourceOver","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#ffffff00"}, +{"base":"#808080ff","mode":"Multiply","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#ffffff00"}, +{"base":"#808080ff","mode":"Screen","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#ffffff00"}, +{"base":"#ff0000ff","mode":"SourceOver","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#ff0000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#ff0000ff","mode":"Screen","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#000000ff"}, +{"base":"#ff0000ff","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#ff0000ff","mode":"Multiply","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ffffffff"}, +{"base":"#ff0000ff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#ff0000ff","mode":"SourceOver","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#ff0000ff","mode":"Multiply","out":{"hex":"#7f0000ff","u16":[32639,0,0,65535]},"paint":"#7f7f7fff"}, +{"base":"#ff0000ff","mode":"Screen","out":{"hex":"#ff7f7fff","u16":[65535,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#ff0000ff","mode":"SourceOver","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#ff0000ff","mode":"Multiply","out":{"hex":"#800000ff","u16":[32896,0,0,65535]},"paint":"#808080ff"}, +{"base":"#ff0000ff","mode":"Screen","out":{"hex":"#ff8080ff","u16":[65535,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#ff0000ff","mode":"SourceOver","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#ff0000ff","mode":"Multiply","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#ff0000ff","mode":"Screen","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#ff0000ff","mode":"SourceOver","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#ff0000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#00ff00ff"}, +{"base":"#ff0000ff","mode":"Screen","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#ff0000ff","mode":"SourceOver","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#ff0000ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#0000ffff"}, +{"base":"#ff0000ff","mode":"Screen","out":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#ff0000ff","mode":"SourceOver","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#ff0000ff","mode":"Multiply","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ffff00ff"}, +{"base":"#ff0000ff","mode":"Screen","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#ff0000ff","mode":"SourceOver","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#ff0000ff","mode":"Multiply","out":{"hex":"#030000ff","u16":[771,0,0,65535]},"paint":"#030201ff"}, +{"base":"#ff0000ff","mode":"Screen","out":{"hex":"#ff0201ff","u16":[65535,514,257,65535]},"paint":"#030201ff"}, +{"base":"#ff0000ff","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#ff0000ff","mode":"Multiply","out":{"hex":"#3d0000ff","u16":[15677,0,0,65535]},"paint":"#3daee9ff"}, +{"base":"#ff0000ff","mode":"Screen","out":{"hex":"#ffaee9ff","u16":[65535,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#ff0000ff","mode":"SourceOver","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#ff0000ff","mode":"Multiply","out":{"hex":"#230000ff","u16":[8995,0,0,65535]},"paint":"#232629ff"}, +{"base":"#ff0000ff","mode":"Screen","out":{"hex":"#ff2629ff","u16":[65535,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#ff0000ff","mode":"SourceOver","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#ff0000ff","mode":"Multiply","out":{"hex":"#ef0000ff","u16":[61423,0,0,65535]},"paint":"#eff0f1ff"}, +{"base":"#ff0000ff","mode":"Screen","out":{"hex":"#fff0f1ff","u16":[65535,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#ff0000ff","mode":"SourceOver","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#ff0000ff","mode":"Multiply","out":{"hex":"#fc0000ff","u16":[64764,0,0,65535]},"paint":"#fcfcfcff"}, +{"base":"#ff0000ff","mode":"Screen","out":{"hex":"#fffcfcff","u16":[65535,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#ff0000ff","mode":"SourceOver","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#ff0000ff","mode":"Multiply","out":{"hex":"#da0000ff","u16":[56026,0,0,65535]},"paint":"#da4453ff"}, +{"base":"#ff0000ff","mode":"Screen","out":{"hex":"#ff4453ff","u16":[65535,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#ff0000ff","mode":"SourceOver","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#ff0000ff","mode":"Multiply","out":{"hex":"#e80000ff","u16":[59624,0,0,65535]},"paint":"#e8cb2dff"}, +{"base":"#ff0000ff","mode":"Screen","out":{"hex":"#ffcb2dff","u16":[65535,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#ff0000ff","mode":"SourceOver","out":{"hex":"#9e5775ff","u16":[40606,22359,30069,65535]},"paint":"#3daee980"}, +{"base":"#ff0000ff","mode":"Multiply","out":{"hex":"#9e0000ff","u16":[40606,0,0,65535]},"paint":"#3daee980"}, +{"base":"#ff0000ff","mode":"Screen","out":{"hex":"#ff5775ff","u16":[65535,22359,30069,65535]},"paint":"#3daee980"}, +{"base":"#ff0000ff","mode":"SourceOver","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ffffff00"}, +{"base":"#ff0000ff","mode":"Multiply","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ffffff00"}, +{"base":"#ff0000ff","mode":"Screen","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ffffff00"}, +{"base":"#00ff00ff","mode":"SourceOver","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#00ff00ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#00ff00ff","mode":"Screen","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#000000ff"}, +{"base":"#00ff00ff","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#00ff00ff","mode":"Multiply","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#ffffffff"}, +{"base":"#00ff00ff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#00ff00ff","mode":"SourceOver","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#00ff00ff","mode":"Multiply","out":{"hex":"#007f00ff","u16":[0,32639,0,65535]},"paint":"#7f7f7fff"}, +{"base":"#00ff00ff","mode":"Screen","out":{"hex":"#7fff7fff","u16":[32639,65535,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#00ff00ff","mode":"SourceOver","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#00ff00ff","mode":"Multiply","out":{"hex":"#008000ff","u16":[0,32896,0,65535]},"paint":"#808080ff"}, +{"base":"#00ff00ff","mode":"Screen","out":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]},"paint":"#808080ff"}, +{"base":"#00ff00ff","mode":"SourceOver","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#00ff00ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#00ff00ff","mode":"Screen","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ff0000ff"}, +{"base":"#00ff00ff","mode":"SourceOver","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#00ff00ff","mode":"Multiply","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#00ff00ff","mode":"Screen","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#00ff00ff","mode":"SourceOver","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#00ff00ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#0000ffff"}, +{"base":"#00ff00ff","mode":"Screen","out":{"hex":"#00ffffff","u16":[0,65535,65535,65535]},"paint":"#0000ffff"}, +{"base":"#00ff00ff","mode":"SourceOver","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#00ff00ff","mode":"Multiply","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#00ff00ff","mode":"Screen","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#00ff00ff","mode":"SourceOver","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#00ff00ff","mode":"Multiply","out":{"hex":"#000200ff","u16":[0,514,0,65535]},"paint":"#030201ff"}, +{"base":"#00ff00ff","mode":"Screen","out":{"hex":"#03ff01ff","u16":[771,65535,257,65535]},"paint":"#030201ff"}, +{"base":"#00ff00ff","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#00ff00ff","mode":"Multiply","out":{"hex":"#00ae00ff","u16":[0,44718,0,65535]},"paint":"#3daee9ff"}, +{"base":"#00ff00ff","mode":"Screen","out":{"hex":"#3dffe9ff","u16":[15677,65535,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#00ff00ff","mode":"SourceOver","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#00ff00ff","mode":"Multiply","out":{"hex":"#002600ff","u16":[0,9766,0,65535]},"paint":"#232629ff"}, +{"base":"#00ff00ff","mode":"Screen","out":{"hex":"#23ff29ff","u16":[8995,65535,10537,65535]},"paint":"#232629ff"}, +{"base":"#00ff00ff","mode":"SourceOver","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#00ff00ff","mode":"Multiply","out":{"hex":"#00f000ff","u16":[0,61680,0,65535]},"paint":"#eff0f1ff"}, +{"base":"#00ff00ff","mode":"Screen","out":{"hex":"#effff1ff","u16":[61423,65535,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#00ff00ff","mode":"SourceOver","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#00ff00ff","mode":"Multiply","out":{"hex":"#00fc00ff","u16":[0,64764,0,65535]},"paint":"#fcfcfcff"}, +{"base":"#00ff00ff","mode":"Screen","out":{"hex":"#fcfffcff","u16":[64764,65535,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#00ff00ff","mode":"SourceOver","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#00ff00ff","mode":"Multiply","out":{"hex":"#004400ff","u16":[0,17476,0,65535]},"paint":"#da4453ff"}, +{"base":"#00ff00ff","mode":"Screen","out":{"hex":"#daff53ff","u16":[56026,65535,21331,65535]},"paint":"#da4453ff"}, +{"base":"#00ff00ff","mode":"SourceOver","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#00ff00ff","mode":"Multiply","out":{"hex":"#00cb00ff","u16":[0,52171,0,65535]},"paint":"#e8cb2dff"}, +{"base":"#00ff00ff","mode":"Screen","out":{"hex":"#e8ff2dff","u16":[59624,65535,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#00ff00ff","mode":"SourceOver","out":{"hex":"#1fd675ff","u16":[7967,54998,30069,65535]},"paint":"#3daee980"}, +{"base":"#00ff00ff","mode":"Multiply","out":{"hex":"#00d600ff","u16":[0,54998,0,65535]},"paint":"#3daee980"}, +{"base":"#00ff00ff","mode":"Screen","out":{"hex":"#1fff75ff","u16":[7967,65535,30069,65535]},"paint":"#3daee980"}, +{"base":"#00ff00ff","mode":"SourceOver","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#ffffff00"}, +{"base":"#00ff00ff","mode":"Multiply","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#ffffff00"}, +{"base":"#00ff00ff","mode":"Screen","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#ffffff00"}, +{"base":"#0000ffff","mode":"SourceOver","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#0000ffff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#0000ffff","mode":"Screen","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#000000ff"}, +{"base":"#0000ffff","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#0000ffff","mode":"Multiply","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#ffffffff"}, +{"base":"#0000ffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#0000ffff","mode":"SourceOver","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#0000ffff","mode":"Multiply","out":{"hex":"#00007fff","u16":[0,0,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#0000ffff","mode":"Screen","out":{"hex":"#7f7fffff","u16":[32639,32639,65535,65535]},"paint":"#7f7f7fff"}, +{"base":"#0000ffff","mode":"SourceOver","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#0000ffff","mode":"Multiply","out":{"hex":"#000080ff","u16":[0,0,32896,65535]},"paint":"#808080ff"}, +{"base":"#0000ffff","mode":"Screen","out":{"hex":"#8080ffff","u16":[32896,32896,65535,65535]},"paint":"#808080ff"}, +{"base":"#0000ffff","mode":"SourceOver","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#0000ffff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#0000ffff","mode":"Screen","out":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]},"paint":"#ff0000ff"}, +{"base":"#0000ffff","mode":"SourceOver","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#0000ffff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#00ff00ff"}, +{"base":"#0000ffff","mode":"Screen","out":{"hex":"#00ffffff","u16":[0,65535,65535,65535]},"paint":"#00ff00ff"}, +{"base":"#0000ffff","mode":"SourceOver","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#0000ffff","mode":"Multiply","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#0000ffff","mode":"Screen","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#0000ffff","mode":"SourceOver","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#0000ffff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#ffff00ff"}, +{"base":"#0000ffff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffff00ff"}, +{"base":"#0000ffff","mode":"SourceOver","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#0000ffff","mode":"Multiply","out":{"hex":"#000001ff","u16":[0,0,257,65535]},"paint":"#030201ff"}, +{"base":"#0000ffff","mode":"Screen","out":{"hex":"#0302ffff","u16":[771,514,65535,65535]},"paint":"#030201ff"}, +{"base":"#0000ffff","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#0000ffff","mode":"Multiply","out":{"hex":"#0000e9ff","u16":[0,0,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#0000ffff","mode":"Screen","out":{"hex":"#3daeffff","u16":[15677,44718,65535,65535]},"paint":"#3daee9ff"}, +{"base":"#0000ffff","mode":"SourceOver","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#0000ffff","mode":"Multiply","out":{"hex":"#000029ff","u16":[0,0,10537,65535]},"paint":"#232629ff"}, +{"base":"#0000ffff","mode":"Screen","out":{"hex":"#2326ffff","u16":[8995,9766,65535,65535]},"paint":"#232629ff"}, +{"base":"#0000ffff","mode":"SourceOver","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#0000ffff","mode":"Multiply","out":{"hex":"#0000f1ff","u16":[0,0,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#0000ffff","mode":"Screen","out":{"hex":"#eff0ffff","u16":[61423,61680,65535,65535]},"paint":"#eff0f1ff"}, +{"base":"#0000ffff","mode":"SourceOver","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#0000ffff","mode":"Multiply","out":{"hex":"#0000fcff","u16":[0,0,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#0000ffff","mode":"Screen","out":{"hex":"#fcfcffff","u16":[64764,64764,65535,65535]},"paint":"#fcfcfcff"}, +{"base":"#0000ffff","mode":"SourceOver","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#0000ffff","mode":"Multiply","out":{"hex":"#000053ff","u16":[0,0,21331,65535]},"paint":"#da4453ff"}, +{"base":"#0000ffff","mode":"Screen","out":{"hex":"#da44ffff","u16":[56026,17476,65535,65535]},"paint":"#da4453ff"}, +{"base":"#0000ffff","mode":"SourceOver","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#0000ffff","mode":"Multiply","out":{"hex":"#00002dff","u16":[0,0,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#0000ffff","mode":"Screen","out":{"hex":"#e8cbffff","u16":[59624,52171,65535,65535]},"paint":"#e8cb2dff"}, +{"base":"#0000ffff","mode":"SourceOver","out":{"hex":"#1f57f4ff","u16":[7967,22359,62708,65535]},"paint":"#3daee980"}, +{"base":"#0000ffff","mode":"Multiply","out":{"hex":"#0000f4ff","u16":[0,0,62708,65535]},"paint":"#3daee980"}, +{"base":"#0000ffff","mode":"Screen","out":{"hex":"#1f57ffff","u16":[7967,22359,65535,65535]},"paint":"#3daee980"}, +{"base":"#0000ffff","mode":"SourceOver","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#ffffff00"}, +{"base":"#0000ffff","mode":"Multiply","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#ffffff00"}, +{"base":"#0000ffff","mode":"Screen","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#ffffff00"}, +{"base":"#ffff00ff","mode":"SourceOver","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#ffff00ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#ffff00ff","mode":"Screen","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#000000ff"}, +{"base":"#ffff00ff","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#ffff00ff","mode":"Multiply","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffffffff"}, +{"base":"#ffff00ff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#ffff00ff","mode":"SourceOver","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#ffff00ff","mode":"Multiply","out":{"hex":"#7f7f00ff","u16":[32639,32639,0,65535]},"paint":"#7f7f7fff"}, +{"base":"#ffff00ff","mode":"Screen","out":{"hex":"#ffff7fff","u16":[65535,65535,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#ffff00ff","mode":"SourceOver","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#ffff00ff","mode":"Multiply","out":{"hex":"#808000ff","u16":[32896,32896,0,65535]},"paint":"#808080ff"}, +{"base":"#ffff00ff","mode":"Screen","out":{"hex":"#ffff80ff","u16":[65535,65535,32896,65535]},"paint":"#808080ff"}, +{"base":"#ffff00ff","mode":"SourceOver","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#ffff00ff","mode":"Multiply","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#ffff00ff","mode":"Screen","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ff0000ff"}, +{"base":"#ffff00ff","mode":"SourceOver","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#ffff00ff","mode":"Multiply","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#ffff00ff","mode":"Screen","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#ffff00ff","mode":"SourceOver","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#ffff00ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#0000ffff"}, +{"base":"#ffff00ff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#0000ffff"}, +{"base":"#ffff00ff","mode":"SourceOver","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#ffff00ff","mode":"Multiply","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#ffff00ff","mode":"Screen","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#ffff00ff","mode":"SourceOver","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#ffff00ff","mode":"Multiply","out":{"hex":"#030200ff","u16":[771,514,0,65535]},"paint":"#030201ff"}, +{"base":"#ffff00ff","mode":"Screen","out":{"hex":"#ffff01ff","u16":[65535,65535,257,65535]},"paint":"#030201ff"}, +{"base":"#ffff00ff","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#ffff00ff","mode":"Multiply","out":{"hex":"#3dae00ff","u16":[15677,44718,0,65535]},"paint":"#3daee9ff"}, +{"base":"#ffff00ff","mode":"Screen","out":{"hex":"#ffffe9ff","u16":[65535,65535,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#ffff00ff","mode":"SourceOver","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#ffff00ff","mode":"Multiply","out":{"hex":"#232600ff","u16":[8995,9766,0,65535]},"paint":"#232629ff"}, +{"base":"#ffff00ff","mode":"Screen","out":{"hex":"#ffff29ff","u16":[65535,65535,10537,65535]},"paint":"#232629ff"}, +{"base":"#ffff00ff","mode":"SourceOver","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#ffff00ff","mode":"Multiply","out":{"hex":"#eff000ff","u16":[61423,61680,0,65535]},"paint":"#eff0f1ff"}, +{"base":"#ffff00ff","mode":"Screen","out":{"hex":"#fffff1ff","u16":[65535,65535,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#ffff00ff","mode":"SourceOver","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#ffff00ff","mode":"Multiply","out":{"hex":"#fcfc00ff","u16":[64764,64764,0,65535]},"paint":"#fcfcfcff"}, +{"base":"#ffff00ff","mode":"Screen","out":{"hex":"#fffffcff","u16":[65535,65535,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#ffff00ff","mode":"SourceOver","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#ffff00ff","mode":"Multiply","out":{"hex":"#da4400ff","u16":[56026,17476,0,65535]},"paint":"#da4453ff"}, +{"base":"#ffff00ff","mode":"Screen","out":{"hex":"#ffff53ff","u16":[65535,65535,21331,65535]},"paint":"#da4453ff"}, +{"base":"#ffff00ff","mode":"SourceOver","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#ffff00ff","mode":"Multiply","out":{"hex":"#e8cb00ff","u16":[59624,52171,0,65535]},"paint":"#e8cb2dff"}, +{"base":"#ffff00ff","mode":"Screen","out":{"hex":"#ffff2dff","u16":[65535,65535,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#ffff00ff","mode":"SourceOver","out":{"hex":"#9ed675ff","u16":[40606,54998,30069,65535]},"paint":"#3daee980"}, +{"base":"#ffff00ff","mode":"Multiply","out":{"hex":"#9ed600ff","u16":[40606,54998,0,65535]},"paint":"#3daee980"}, +{"base":"#ffff00ff","mode":"Screen","out":{"hex":"#ffff75ff","u16":[65535,65535,30069,65535]},"paint":"#3daee980"}, +{"base":"#ffff00ff","mode":"SourceOver","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffffff00"}, +{"base":"#ffff00ff","mode":"Multiply","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffffff00"}, +{"base":"#ffff00ff","mode":"Screen","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffffff00"}, +{"base":"#030201ff","mode":"SourceOver","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#030201ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#030201ff","mode":"Screen","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#000000ff"}, +{"base":"#030201ff","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#030201ff","mode":"Multiply","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#ffffffff"}, +{"base":"#030201ff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#030201ff","mode":"SourceOver","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#030201ff","mode":"Multiply","out":{"hex":"#010100ff","u16":[257,257,0,65535]},"paint":"#7f7f7fff"}, +{"base":"#030201ff","mode":"Screen","out":{"hex":"#818080ff","u16":[33153,32896,32896,65535]},"paint":"#7f7f7fff"}, +{"base":"#030201ff","mode":"SourceOver","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#030201ff","mode":"Multiply","out":{"hex":"#020101ff","u16":[514,257,257,65535]},"paint":"#808080ff"}, +{"base":"#030201ff","mode":"Screen","out":{"hex":"#818180ff","u16":[33153,33153,32896,65535]},"paint":"#808080ff"}, +{"base":"#030201ff","mode":"SourceOver","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#030201ff","mode":"Multiply","out":{"hex":"#030000ff","u16":[771,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#030201ff","mode":"Screen","out":{"hex":"#ff0201ff","u16":[65535,514,257,65535]},"paint":"#ff0000ff"}, +{"base":"#030201ff","mode":"SourceOver","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#030201ff","mode":"Multiply","out":{"hex":"#000200ff","u16":[0,514,0,65535]},"paint":"#00ff00ff"}, +{"base":"#030201ff","mode":"Screen","out":{"hex":"#03ff01ff","u16":[771,65535,257,65535]},"paint":"#00ff00ff"}, +{"base":"#030201ff","mode":"SourceOver","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#030201ff","mode":"Multiply","out":{"hex":"#000001ff","u16":[0,0,257,65535]},"paint":"#0000ffff"}, +{"base":"#030201ff","mode":"Screen","out":{"hex":"#0302ffff","u16":[771,514,65535,65535]},"paint":"#0000ffff"}, +{"base":"#030201ff","mode":"SourceOver","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#030201ff","mode":"Multiply","out":{"hex":"#030200ff","u16":[771,514,0,65535]},"paint":"#ffff00ff"}, +{"base":"#030201ff","mode":"Screen","out":{"hex":"#ffff01ff","u16":[65535,65535,257,65535]},"paint":"#ffff00ff"}, +{"base":"#030201ff","mode":"SourceOver","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#030201ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#030201ff"}, +{"base":"#030201ff","mode":"Screen","out":{"hex":"#060402ff","u16":[1542,1028,514,65535]},"paint":"#030201ff"}, +{"base":"#030201ff","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#030201ff","mode":"Multiply","out":{"hex":"#010101ff","u16":[257,257,257,65535]},"paint":"#3daee9ff"}, +{"base":"#030201ff","mode":"Screen","out":{"hex":"#3fafe9ff","u16":[16191,44975,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#030201ff","mode":"SourceOver","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#030201ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#232629ff"}, +{"base":"#030201ff","mode":"Screen","out":{"hex":"#26282aff","u16":[9766,10280,10794,65535]},"paint":"#232629ff"}, +{"base":"#030201ff","mode":"SourceOver","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#030201ff","mode":"Multiply","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#eff0f1ff"}, +{"base":"#030201ff","mode":"Screen","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#030201ff","mode":"SourceOver","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#030201ff","mode":"Multiply","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#fcfcfcff"}, +{"base":"#030201ff","mode":"Screen","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#030201ff","mode":"SourceOver","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#030201ff","mode":"Multiply","out":{"hex":"#030100ff","u16":[771,257,0,65535]},"paint":"#da4453ff"}, +{"base":"#030201ff","mode":"Screen","out":{"hex":"#da4554ff","u16":[56026,17733,21588,65535]},"paint":"#da4453ff"}, +{"base":"#030201ff","mode":"SourceOver","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#030201ff","mode":"Multiply","out":{"hex":"#030200ff","u16":[771,514,0,65535]},"paint":"#e8cb2dff"}, +{"base":"#030201ff","mode":"Screen","out":{"hex":"#e8cb2eff","u16":[59624,52171,11822,65535]},"paint":"#e8cb2dff"}, +{"base":"#030201ff","mode":"SourceOver","out":{"hex":"#205875ff","u16":[8224,22616,30069,65535]},"paint":"#3daee980"}, +{"base":"#030201ff","mode":"Multiply","out":{"hex":"#020201ff","u16":[514,514,257,65535]},"paint":"#3daee980"}, +{"base":"#030201ff","mode":"Screen","out":{"hex":"#225876ff","u16":[8738,22616,30326,65535]},"paint":"#3daee980"}, +{"base":"#030201ff","mode":"SourceOver","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#ffffff00"}, +{"base":"#030201ff","mode":"Multiply","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#ffffff00"}, +{"base":"#030201ff","mode":"Screen","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#ffffff00"}, +{"base":"#3daee9ff","mode":"SourceOver","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#3daee9ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#3daee9ff","mode":"Screen","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#000000ff"}, +{"base":"#3daee9ff","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#3daee9ff","mode":"Multiply","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#ffffffff"}, +{"base":"#3daee9ff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#3daee9ff","mode":"SourceOver","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#3daee9ff","mode":"Multiply","out":{"hex":"#1e5774ff","u16":[7710,22359,29812,65535]},"paint":"#7f7f7fff"}, +{"base":"#3daee9ff","mode":"Screen","out":{"hex":"#9ed6f4ff","u16":[40606,54998,62708,65535]},"paint":"#7f7f7fff"}, +{"base":"#3daee9ff","mode":"SourceOver","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#3daee9ff","mode":"Multiply","out":{"hex":"#1f5775ff","u16":[7967,22359,30069,65535]},"paint":"#808080ff"}, +{"base":"#3daee9ff","mode":"Screen","out":{"hex":"#9ed7f4ff","u16":[40606,55255,62708,65535]},"paint":"#808080ff"}, +{"base":"#3daee9ff","mode":"SourceOver","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#3daee9ff","mode":"Multiply","out":{"hex":"#3d0000ff","u16":[15677,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#3daee9ff","mode":"Screen","out":{"hex":"#ffaee9ff","u16":[65535,44718,59881,65535]},"paint":"#ff0000ff"}, +{"base":"#3daee9ff","mode":"SourceOver","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#3daee9ff","mode":"Multiply","out":{"hex":"#00ae00ff","u16":[0,44718,0,65535]},"paint":"#00ff00ff"}, +{"base":"#3daee9ff","mode":"Screen","out":{"hex":"#3dffe9ff","u16":[15677,65535,59881,65535]},"paint":"#00ff00ff"}, +{"base":"#3daee9ff","mode":"SourceOver","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#3daee9ff","mode":"Multiply","out":{"hex":"#0000e9ff","u16":[0,0,59881,65535]},"paint":"#0000ffff"}, +{"base":"#3daee9ff","mode":"Screen","out":{"hex":"#3daeffff","u16":[15677,44718,65535,65535]},"paint":"#0000ffff"}, +{"base":"#3daee9ff","mode":"SourceOver","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#3daee9ff","mode":"Multiply","out":{"hex":"#3dae00ff","u16":[15677,44718,0,65535]},"paint":"#ffff00ff"}, +{"base":"#3daee9ff","mode":"Screen","out":{"hex":"#ffffe9ff","u16":[65535,65535,59881,65535]},"paint":"#ffff00ff"}, +{"base":"#3daee9ff","mode":"SourceOver","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#3daee9ff","mode":"Multiply","out":{"hex":"#010101ff","u16":[257,257,257,65535]},"paint":"#030201ff"}, +{"base":"#3daee9ff","mode":"Screen","out":{"hex":"#3fafe9ff","u16":[16191,44975,59881,65535]},"paint":"#030201ff"}, +{"base":"#3daee9ff","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#3daee9ff","mode":"Multiply","out":{"hex":"#0f77d5ff","u16":[3855,30583,54741,65535]},"paint":"#3daee9ff"}, +{"base":"#3daee9ff","mode":"Screen","out":{"hex":"#6be5fdff","u16":[27499,58853,65021,65535]},"paint":"#3daee9ff"}, +{"base":"#3daee9ff","mode":"SourceOver","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#3daee9ff","mode":"Multiply","out":{"hex":"#081a25ff","u16":[2056,6682,9509,65535]},"paint":"#232629ff"}, +{"base":"#3daee9ff","mode":"Screen","out":{"hex":"#58baedff","u16":[22616,47802,60909,65535]},"paint":"#232629ff"}, +{"base":"#3daee9ff","mode":"SourceOver","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#3daee9ff","mode":"Multiply","out":{"hex":"#39a4dcff","u16":[14649,42148,56540,65535]},"paint":"#eff0f1ff"}, +{"base":"#3daee9ff","mode":"Screen","out":{"hex":"#f3fafeff","u16":[62451,64250,65278,65535]},"paint":"#eff0f1ff"}, +{"base":"#3daee9ff","mode":"SourceOver","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#3daee9ff","mode":"Multiply","out":{"hex":"#3cace6ff","u16":[15420,44204,59110,65535]},"paint":"#fcfcfcff"}, +{"base":"#3daee9ff","mode":"Screen","out":{"hex":"#fdfeffff","u16":[65021,65278,65535,65535]},"paint":"#fcfcfcff"}, +{"base":"#3daee9ff","mode":"SourceOver","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#3daee9ff","mode":"Multiply","out":{"hex":"#342e4cff","u16":[13364,11822,19532,65535]},"paint":"#da4453ff"}, +{"base":"#3daee9ff","mode":"Screen","out":{"hex":"#e3c4f0ff","u16":[58339,50372,61680,65535]},"paint":"#da4453ff"}, +{"base":"#3daee9ff","mode":"SourceOver","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#3daee9ff","mode":"Multiply","out":{"hex":"#378b29ff","u16":[14135,35723,10537,65535]},"paint":"#e8cb2dff"}, +{"base":"#3daee9ff","mode":"Screen","out":{"hex":"#eeeeedff","u16":[61166,61166,60909,65535]},"paint":"#e8cb2dff"}, +{"base":"#3daee9ff","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee980"}, +{"base":"#3daee9ff","mode":"Multiply","out":{"hex":"#2692dfff","u16":[9766,37522,57311,65535]},"paint":"#3daee980"}, +{"base":"#3daee9ff","mode":"Screen","out":{"hex":"#55caf3ff","u16":[21845,51914,62451,65535]},"paint":"#3daee980"}, +{"base":"#3daee9ff","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#ffffff00"}, +{"base":"#3daee9ff","mode":"Multiply","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#ffffff00"}, +{"base":"#3daee9ff","mode":"Screen","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#ffffff00"}, +{"base":"#232629ff","mode":"SourceOver","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#232629ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#232629ff","mode":"Screen","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#000000ff"}, +{"base":"#232629ff","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#232629ff","mode":"Multiply","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#ffffffff"}, +{"base":"#232629ff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#232629ff","mode":"SourceOver","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#232629ff","mode":"Multiply","out":{"hex":"#111314ff","u16":[4369,4883,5140,65535]},"paint":"#7f7f7fff"}, +{"base":"#232629ff","mode":"Screen","out":{"hex":"#919294ff","u16":[37265,37522,38036,65535]},"paint":"#7f7f7fff"}, +{"base":"#232629ff","mode":"SourceOver","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#232629ff","mode":"Multiply","out":{"hex":"#121315ff","u16":[4626,4883,5397,65535]},"paint":"#808080ff"}, +{"base":"#232629ff","mode":"Screen","out":{"hex":"#919394ff","u16":[37265,37779,38036,65535]},"paint":"#808080ff"}, +{"base":"#232629ff","mode":"SourceOver","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#232629ff","mode":"Multiply","out":{"hex":"#230000ff","u16":[8995,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#232629ff","mode":"Screen","out":{"hex":"#ff2629ff","u16":[65535,9766,10537,65535]},"paint":"#ff0000ff"}, +{"base":"#232629ff","mode":"SourceOver","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#232629ff","mode":"Multiply","out":{"hex":"#002600ff","u16":[0,9766,0,65535]},"paint":"#00ff00ff"}, +{"base":"#232629ff","mode":"Screen","out":{"hex":"#23ff29ff","u16":[8995,65535,10537,65535]},"paint":"#00ff00ff"}, +{"base":"#232629ff","mode":"SourceOver","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#232629ff","mode":"Multiply","out":{"hex":"#000029ff","u16":[0,0,10537,65535]},"paint":"#0000ffff"}, +{"base":"#232629ff","mode":"Screen","out":{"hex":"#2326ffff","u16":[8995,9766,65535,65535]},"paint":"#0000ffff"}, +{"base":"#232629ff","mode":"SourceOver","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#232629ff","mode":"Multiply","out":{"hex":"#232600ff","u16":[8995,9766,0,65535]},"paint":"#ffff00ff"}, +{"base":"#232629ff","mode":"Screen","out":{"hex":"#ffff29ff","u16":[65535,65535,10537,65535]},"paint":"#ffff00ff"}, +{"base":"#232629ff","mode":"SourceOver","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#232629ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#030201ff"}, +{"base":"#232629ff","mode":"Screen","out":{"hex":"#26282aff","u16":[9766,10280,10794,65535]},"paint":"#030201ff"}, +{"base":"#232629ff","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#232629ff","mode":"Multiply","out":{"hex":"#081a25ff","u16":[2056,6682,9509,65535]},"paint":"#3daee9ff"}, +{"base":"#232629ff","mode":"Screen","out":{"hex":"#58baedff","u16":[22616,47802,60909,65535]},"paint":"#3daee9ff"}, +{"base":"#232629ff","mode":"SourceOver","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#232629ff","mode":"Multiply","out":{"hex":"#050607ff","u16":[1285,1542,1799,65535]},"paint":"#232629ff"}, +{"base":"#232629ff","mode":"Screen","out":{"hex":"#41464bff","u16":[16705,17990,19275,65535]},"paint":"#232629ff"}, +{"base":"#232629ff","mode":"SourceOver","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#232629ff","mode":"Multiply","out":{"hex":"#212427ff","u16":[8481,9252,10023,65535]},"paint":"#eff0f1ff"}, +{"base":"#232629ff","mode":"Screen","out":{"hex":"#f1f2f3ff","u16":[61937,62194,62451,65535]},"paint":"#eff0f1ff"}, +{"base":"#232629ff","mode":"SourceOver","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#232629ff","mode":"Multiply","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#fcfcfcff"}, +{"base":"#232629ff","mode":"Screen","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#232629ff","mode":"SourceOver","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#232629ff","mode":"Multiply","out":{"hex":"#1e0a0dff","u16":[7710,2570,3341,65535]},"paint":"#da4453ff"}, +{"base":"#232629ff","mode":"Screen","out":{"hex":"#df606fff","u16":[57311,24672,28527,65535]},"paint":"#da4453ff"}, +{"base":"#232629ff","mode":"SourceOver","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#232629ff","mode":"Multiply","out":{"hex":"#201e07ff","u16":[8224,7710,1799,65535]},"paint":"#e8cb2dff"}, +{"base":"#232629ff","mode":"Screen","out":{"hex":"#ebd34fff","u16":[60395,54227,20303,65535]},"paint":"#e8cb2dff"}, +{"base":"#232629ff","mode":"SourceOver","out":{"hex":"#306a89ff","u16":[12336,27242,35209,65535]},"paint":"#3daee980"}, +{"base":"#232629ff","mode":"Multiply","out":{"hex":"#162027ff","u16":[5654,8224,10023,65535]},"paint":"#3daee980"}, +{"base":"#232629ff","mode":"Screen","out":{"hex":"#3e708bff","u16":[15934,28784,35723,65535]},"paint":"#3daee980"}, +{"base":"#232629ff","mode":"SourceOver","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#ffffff00"}, +{"base":"#232629ff","mode":"Multiply","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#ffffff00"}, +{"base":"#232629ff","mode":"Screen","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#ffffff00"}, +{"base":"#eff0f1ff","mode":"SourceOver","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#eff0f1ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#eff0f1ff","mode":"Screen","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#000000ff"}, +{"base":"#eff0f1ff","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#eff0f1ff","mode":"Multiply","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#ffffffff"}, +{"base":"#eff0f1ff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#eff0f1ff","mode":"SourceOver","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#eff0f1ff","mode":"Multiply","out":{"hex":"#777878ff","u16":[30583,30840,30840,65535]},"paint":"#7f7f7fff"}, +{"base":"#eff0f1ff","mode":"Screen","out":{"hex":"#f7f7f8ff","u16":[63479,63479,63736,65535]},"paint":"#7f7f7fff"}, +{"base":"#eff0f1ff","mode":"SourceOver","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#eff0f1ff","mode":"Multiply","out":{"hex":"#787879ff","u16":[30840,30840,31097,65535]},"paint":"#808080ff"}, +{"base":"#eff0f1ff","mode":"Screen","out":{"hex":"#f7f8f8ff","u16":[63479,63736,63736,65535]},"paint":"#808080ff"}, +{"base":"#eff0f1ff","mode":"SourceOver","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#eff0f1ff","mode":"Multiply","out":{"hex":"#ef0000ff","u16":[61423,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#eff0f1ff","mode":"Screen","out":{"hex":"#fff0f1ff","u16":[65535,61680,61937,65535]},"paint":"#ff0000ff"}, +{"base":"#eff0f1ff","mode":"SourceOver","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#eff0f1ff","mode":"Multiply","out":{"hex":"#00f000ff","u16":[0,61680,0,65535]},"paint":"#00ff00ff"}, +{"base":"#eff0f1ff","mode":"Screen","out":{"hex":"#effff1ff","u16":[61423,65535,61937,65535]},"paint":"#00ff00ff"}, +{"base":"#eff0f1ff","mode":"SourceOver","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#eff0f1ff","mode":"Multiply","out":{"hex":"#0000f1ff","u16":[0,0,61937,65535]},"paint":"#0000ffff"}, +{"base":"#eff0f1ff","mode":"Screen","out":{"hex":"#eff0ffff","u16":[61423,61680,65535,65535]},"paint":"#0000ffff"}, +{"base":"#eff0f1ff","mode":"SourceOver","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#eff0f1ff","mode":"Multiply","out":{"hex":"#eff000ff","u16":[61423,61680,0,65535]},"paint":"#ffff00ff"}, +{"base":"#eff0f1ff","mode":"Screen","out":{"hex":"#fffff1ff","u16":[65535,65535,61937,65535]},"paint":"#ffff00ff"}, +{"base":"#eff0f1ff","mode":"SourceOver","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#eff0f1ff","mode":"Multiply","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#eff0f1ff","mode":"Screen","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#030201ff"}, +{"base":"#eff0f1ff","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#eff0f1ff","mode":"Multiply","out":{"hex":"#39a4dcff","u16":[14649,42148,56540,65535]},"paint":"#3daee9ff"}, +{"base":"#eff0f1ff","mode":"Screen","out":{"hex":"#f3fafeff","u16":[62451,64250,65278,65535]},"paint":"#3daee9ff"}, +{"base":"#eff0f1ff","mode":"SourceOver","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#eff0f1ff","mode":"Multiply","out":{"hex":"#212427ff","u16":[8481,9252,10023,65535]},"paint":"#232629ff"}, +{"base":"#eff0f1ff","mode":"Screen","out":{"hex":"#f1f2f3ff","u16":[61937,62194,62451,65535]},"paint":"#232629ff"}, +{"base":"#eff0f1ff","mode":"SourceOver","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#eff0f1ff","mode":"Multiply","out":{"hex":"#e0e2e4ff","u16":[57568,58082,58596,65535]},"paint":"#eff0f1ff"}, +{"base":"#eff0f1ff","mode":"Screen","out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]},"paint":"#eff0f1ff"}, +{"base":"#eff0f1ff","mode":"SourceOver","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#eff0f1ff","mode":"Multiply","out":{"hex":"#ecedeeff","u16":[60652,60909,61166,65535]},"paint":"#fcfcfcff"}, +{"base":"#eff0f1ff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#fcfcfcff"}, +{"base":"#eff0f1ff","mode":"SourceOver","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#eff0f1ff","mode":"Multiply","out":{"hex":"#cc404eff","u16":[52428,16448,20046,65535]},"paint":"#da4453ff"}, +{"base":"#eff0f1ff","mode":"Screen","out":{"hex":"#fdf4f6ff","u16":[65021,62708,63222,65535]},"paint":"#da4453ff"}, +{"base":"#eff0f1ff","mode":"SourceOver","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#eff0f1ff","mode":"Multiply","out":{"hex":"#d9bf2bff","u16":[55769,49087,11051,65535]},"paint":"#e8cb2dff"}, +{"base":"#eff0f1ff","mode":"Screen","out":{"hex":"#fefcf3ff","u16":[65278,64764,62451,65535]},"paint":"#e8cb2dff"}, +{"base":"#eff0f1ff","mode":"SourceOver","out":{"hex":"#96cfedff","u16":[38550,53199,60909,65535]},"paint":"#3daee980"}, +{"base":"#eff0f1ff","mode":"Multiply","out":{"hex":"#94c9e7ff","u16":[38036,51657,59367,65535]},"paint":"#3daee980"}, +{"base":"#eff0f1ff","mode":"Screen","out":{"hex":"#f1f5f7ff","u16":[61937,62965,63479,65535]},"paint":"#3daee980"}, +{"base":"#eff0f1ff","mode":"SourceOver","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#ffffff00"}, +{"base":"#eff0f1ff","mode":"Multiply","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#ffffff00"}, +{"base":"#eff0f1ff","mode":"Screen","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#ffffff00"}, +{"base":"#fcfcfcff","mode":"SourceOver","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#fcfcfcff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#fcfcfcff","mode":"Screen","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#000000ff"}, +{"base":"#fcfcfcff","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#fcfcfcff","mode":"Multiply","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#ffffffff"}, +{"base":"#fcfcfcff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#fcfcfcff","mode":"SourceOver","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#fcfcfcff","mode":"Multiply","out":{"hex":"#7e7e7eff","u16":[32382,32382,32382,65535]},"paint":"#7f7f7fff"}, +{"base":"#fcfcfcff","mode":"Screen","out":{"hex":"#fdfdfdff","u16":[65021,65021,65021,65535]},"paint":"#7f7f7fff"}, +{"base":"#fcfcfcff","mode":"SourceOver","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#fcfcfcff","mode":"Multiply","out":{"hex":"#7e7e7eff","u16":[32382,32382,32382,65535]},"paint":"#808080ff"}, +{"base":"#fcfcfcff","mode":"Screen","out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]},"paint":"#808080ff"}, +{"base":"#fcfcfcff","mode":"SourceOver","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#fcfcfcff","mode":"Multiply","out":{"hex":"#fc0000ff","u16":[64764,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#fcfcfcff","mode":"Screen","out":{"hex":"#fffcfcff","u16":[65535,64764,64764,65535]},"paint":"#ff0000ff"}, +{"base":"#fcfcfcff","mode":"SourceOver","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#fcfcfcff","mode":"Multiply","out":{"hex":"#00fc00ff","u16":[0,64764,0,65535]},"paint":"#00ff00ff"}, +{"base":"#fcfcfcff","mode":"Screen","out":{"hex":"#fcfffcff","u16":[64764,65535,64764,65535]},"paint":"#00ff00ff"}, +{"base":"#fcfcfcff","mode":"SourceOver","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#fcfcfcff","mode":"Multiply","out":{"hex":"#0000fcff","u16":[0,0,64764,65535]},"paint":"#0000ffff"}, +{"base":"#fcfcfcff","mode":"Screen","out":{"hex":"#fcfcffff","u16":[64764,64764,65535,65535]},"paint":"#0000ffff"}, +{"base":"#fcfcfcff","mode":"SourceOver","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#fcfcfcff","mode":"Multiply","out":{"hex":"#fcfc00ff","u16":[64764,64764,0,65535]},"paint":"#ffff00ff"}, +{"base":"#fcfcfcff","mode":"Screen","out":{"hex":"#fffffcff","u16":[65535,65535,64764,65535]},"paint":"#ffff00ff"}, +{"base":"#fcfcfcff","mode":"SourceOver","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#fcfcfcff","mode":"Multiply","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#fcfcfcff","mode":"Screen","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#030201ff"}, +{"base":"#fcfcfcff","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#fcfcfcff","mode":"Multiply","out":{"hex":"#3cace6ff","u16":[15420,44204,59110,65535]},"paint":"#3daee9ff"}, +{"base":"#fcfcfcff","mode":"Screen","out":{"hex":"#fdfeffff","u16":[65021,65278,65535,65535]},"paint":"#3daee9ff"}, +{"base":"#fcfcfcff","mode":"SourceOver","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#fcfcfcff","mode":"Multiply","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#fcfcfcff","mode":"Screen","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#232629ff"}, +{"base":"#fcfcfcff","mode":"SourceOver","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#fcfcfcff","mode":"Multiply","out":{"hex":"#ecedeeff","u16":[60652,60909,61166,65535]},"paint":"#eff0f1ff"}, +{"base":"#fcfcfcff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#eff0f1ff"}, +{"base":"#fcfcfcff","mode":"SourceOver","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#fcfcfcff","mode":"Multiply","out":{"hex":"#f9f9f9ff","u16":[63993,63993,63993,65535]},"paint":"#fcfcfcff"}, +{"base":"#fcfcfcff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#fcfcfcff"}, +{"base":"#fcfcfcff","mode":"SourceOver","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#fcfcfcff","mode":"Multiply","out":{"hex":"#d74352ff","u16":[55255,17219,21074,65535]},"paint":"#da4453ff"}, +{"base":"#fcfcfcff","mode":"Screen","out":{"hex":"#fffdfdff","u16":[65535,65021,65021,65535]},"paint":"#da4453ff"}, +{"base":"#fcfcfcff","mode":"SourceOver","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#fcfcfcff","mode":"Multiply","out":{"hex":"#e5c92cff","u16":[58853,51657,11308,65535]},"paint":"#e8cb2dff"}, +{"base":"#fcfcfcff","mode":"Screen","out":{"hex":"#fffefdff","u16":[65535,65278,65021,65535]},"paint":"#e8cb2dff"}, +{"base":"#fcfcfcff","mode":"SourceOver","out":{"hex":"#9dd5f3ff","u16":[40349,54741,62451,65535]},"paint":"#3daee980"}, +{"base":"#fcfcfcff","mode":"Multiply","out":{"hex":"#9cd3f1ff","u16":[40092,54227,61937,65535]},"paint":"#3daee980"}, +{"base":"#fcfcfcff","mode":"Screen","out":{"hex":"#fcfdfdff","u16":[64764,65021,65021,65535]},"paint":"#3daee980"}, +{"base":"#fcfcfcff","mode":"SourceOver","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#ffffff00"}, +{"base":"#fcfcfcff","mode":"Multiply","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#ffffff00"}, +{"base":"#fcfcfcff","mode":"Screen","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#ffffff00"}, +{"base":"#da4453ff","mode":"SourceOver","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#da4453ff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#da4453ff","mode":"Screen","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#000000ff"}, +{"base":"#da4453ff","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#da4453ff","mode":"Multiply","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#ffffffff"}, +{"base":"#da4453ff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#da4453ff","mode":"SourceOver","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#da4453ff","mode":"Multiply","out":{"hex":"#6d2229ff","u16":[28013,8738,10537,65535]},"paint":"#7f7f7fff"}, +{"base":"#da4453ff","mode":"Screen","out":{"hex":"#eca1a9ff","u16":[60652,41377,43433,65535]},"paint":"#7f7f7fff"}, +{"base":"#da4453ff","mode":"SourceOver","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#da4453ff","mode":"Multiply","out":{"hex":"#6d222aff","u16":[28013,8738,10794,65535]},"paint":"#808080ff"}, +{"base":"#da4453ff","mode":"Screen","out":{"hex":"#eda2a9ff","u16":[60909,41634,43433,65535]},"paint":"#808080ff"}, +{"base":"#da4453ff","mode":"SourceOver","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#da4453ff","mode":"Multiply","out":{"hex":"#da0000ff","u16":[56026,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#da4453ff","mode":"Screen","out":{"hex":"#ff4453ff","u16":[65535,17476,21331,65535]},"paint":"#ff0000ff"}, +{"base":"#da4453ff","mode":"SourceOver","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#da4453ff","mode":"Multiply","out":{"hex":"#004400ff","u16":[0,17476,0,65535]},"paint":"#00ff00ff"}, +{"base":"#da4453ff","mode":"Screen","out":{"hex":"#daff53ff","u16":[56026,65535,21331,65535]},"paint":"#00ff00ff"}, +{"base":"#da4453ff","mode":"SourceOver","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#da4453ff","mode":"Multiply","out":{"hex":"#000053ff","u16":[0,0,21331,65535]},"paint":"#0000ffff"}, +{"base":"#da4453ff","mode":"Screen","out":{"hex":"#da44ffff","u16":[56026,17476,65535,65535]},"paint":"#0000ffff"}, +{"base":"#da4453ff","mode":"SourceOver","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#da4453ff","mode":"Multiply","out":{"hex":"#da4400ff","u16":[56026,17476,0,65535]},"paint":"#ffff00ff"}, +{"base":"#da4453ff","mode":"Screen","out":{"hex":"#ffff53ff","u16":[65535,65535,21331,65535]},"paint":"#ffff00ff"}, +{"base":"#da4453ff","mode":"SourceOver","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#da4453ff","mode":"Multiply","out":{"hex":"#030100ff","u16":[771,257,0,65535]},"paint":"#030201ff"}, +{"base":"#da4453ff","mode":"Screen","out":{"hex":"#da4554ff","u16":[56026,17733,21588,65535]},"paint":"#030201ff"}, +{"base":"#da4453ff","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#da4453ff","mode":"Multiply","out":{"hex":"#342e4cff","u16":[13364,11822,19532,65535]},"paint":"#3daee9ff"}, +{"base":"#da4453ff","mode":"Screen","out":{"hex":"#e3c4f0ff","u16":[58339,50372,61680,65535]},"paint":"#3daee9ff"}, +{"base":"#da4453ff","mode":"SourceOver","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#da4453ff","mode":"Multiply","out":{"hex":"#1e0a0dff","u16":[7710,2570,3341,65535]},"paint":"#232629ff"}, +{"base":"#da4453ff","mode":"Screen","out":{"hex":"#df606fff","u16":[57311,24672,28527,65535]},"paint":"#232629ff"}, +{"base":"#da4453ff","mode":"SourceOver","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#da4453ff","mode":"Multiply","out":{"hex":"#cc404eff","u16":[52428,16448,20046,65535]},"paint":"#eff0f1ff"}, +{"base":"#da4453ff","mode":"Screen","out":{"hex":"#fdf4f6ff","u16":[65021,62708,63222,65535]},"paint":"#eff0f1ff"}, +{"base":"#da4453ff","mode":"SourceOver","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#da4453ff","mode":"Multiply","out":{"hex":"#d74352ff","u16":[55255,17219,21074,65535]},"paint":"#fcfcfcff"}, +{"base":"#da4453ff","mode":"Screen","out":{"hex":"#fffdfdff","u16":[65535,65021,65021,65535]},"paint":"#fcfcfcff"}, +{"base":"#da4453ff","mode":"SourceOver","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#da4453ff","mode":"Multiply","out":{"hex":"#ba121bff","u16":[47802,4626,6939,65535]},"paint":"#da4453ff"}, +{"base":"#da4453ff","mode":"Screen","out":{"hex":"#fa768bff","u16":[64250,30326,35723,65535]},"paint":"#da4453ff"}, +{"base":"#da4453ff","mode":"SourceOver","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#da4453ff","mode":"Multiply","out":{"hex":"#c6360fff","u16":[50886,13878,3855,65535]},"paint":"#e8cb2dff"}, +{"base":"#da4453ff","mode":"Screen","out":{"hex":"#fcd971ff","u16":[64764,55769,29041,65535]},"paint":"#e8cb2dff"}, +{"base":"#da4453ff","mode":"SourceOver","out":{"hex":"#8c799eff","u16":[35980,31097,40606,65535]},"paint":"#3daee980"}, +{"base":"#da4453ff","mode":"Multiply","out":{"hex":"#87394fff","u16":[34695,14649,20303,65535]},"paint":"#3daee980"}, +{"base":"#da4453ff","mode":"Screen","out":{"hex":"#de84a2ff","u16":[57054,33924,41634,65535]},"paint":"#3daee980"}, +{"base":"#da4453ff","mode":"SourceOver","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#ffffff00"}, +{"base":"#da4453ff","mode":"Multiply","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#ffffff00"}, +{"base":"#da4453ff","mode":"Screen","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#ffffff00"}, +{"base":"#e8cb2dff","mode":"SourceOver","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#e8cb2dff","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#e8cb2dff","mode":"Screen","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#000000ff"}, +{"base":"#e8cb2dff","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#e8cb2dff","mode":"Multiply","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#ffffffff"}, +{"base":"#e8cb2dff","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#e8cb2dff","mode":"SourceOver","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#e8cb2dff","mode":"Multiply","out":{"hex":"#746516ff","u16":[29812,25957,5654,65535]},"paint":"#7f7f7fff"}, +{"base":"#e8cb2dff","mode":"Screen","out":{"hex":"#f3e596ff","u16":[62451,58853,38550,65535]},"paint":"#7f7f7fff"}, +{"base":"#e8cb2dff","mode":"SourceOver","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#e8cb2dff","mode":"Multiply","out":{"hex":"#746617ff","u16":[29812,26214,5911,65535]},"paint":"#808080ff"}, +{"base":"#e8cb2dff","mode":"Screen","out":{"hex":"#f4e596ff","u16":[62708,58853,38550,65535]},"paint":"#808080ff"}, +{"base":"#e8cb2dff","mode":"SourceOver","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#e8cb2dff","mode":"Multiply","out":{"hex":"#e80000ff","u16":[59624,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#e8cb2dff","mode":"Screen","out":{"hex":"#ffcb2dff","u16":[65535,52171,11565,65535]},"paint":"#ff0000ff"}, +{"base":"#e8cb2dff","mode":"SourceOver","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#e8cb2dff","mode":"Multiply","out":{"hex":"#00cb00ff","u16":[0,52171,0,65535]},"paint":"#00ff00ff"}, +{"base":"#e8cb2dff","mode":"Screen","out":{"hex":"#e8ff2dff","u16":[59624,65535,11565,65535]},"paint":"#00ff00ff"}, +{"base":"#e8cb2dff","mode":"SourceOver","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#e8cb2dff","mode":"Multiply","out":{"hex":"#00002dff","u16":[0,0,11565,65535]},"paint":"#0000ffff"}, +{"base":"#e8cb2dff","mode":"Screen","out":{"hex":"#e8cbffff","u16":[59624,52171,65535,65535]},"paint":"#0000ffff"}, +{"base":"#e8cb2dff","mode":"SourceOver","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#e8cb2dff","mode":"Multiply","out":{"hex":"#e8cb00ff","u16":[59624,52171,0,65535]},"paint":"#ffff00ff"}, +{"base":"#e8cb2dff","mode":"Screen","out":{"hex":"#ffff2dff","u16":[65535,65535,11565,65535]},"paint":"#ffff00ff"}, +{"base":"#e8cb2dff","mode":"SourceOver","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#e8cb2dff","mode":"Multiply","out":{"hex":"#030200ff","u16":[771,514,0,65535]},"paint":"#030201ff"}, +{"base":"#e8cb2dff","mode":"Screen","out":{"hex":"#e8cb2eff","u16":[59624,52171,11822,65535]},"paint":"#030201ff"}, +{"base":"#e8cb2dff","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#e8cb2dff","mode":"Multiply","out":{"hex":"#378b29ff","u16":[14135,35723,10537,65535]},"paint":"#3daee9ff"}, +{"base":"#e8cb2dff","mode":"Screen","out":{"hex":"#eeeeedff","u16":[61166,61166,60909,65535]},"paint":"#3daee9ff"}, +{"base":"#e8cb2dff","mode":"SourceOver","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#e8cb2dff","mode":"Multiply","out":{"hex":"#201e07ff","u16":[8224,7710,1799,65535]},"paint":"#232629ff"}, +{"base":"#e8cb2dff","mode":"Screen","out":{"hex":"#ebd34fff","u16":[60395,54227,20303,65535]},"paint":"#232629ff"}, +{"base":"#e8cb2dff","mode":"SourceOver","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#e8cb2dff","mode":"Multiply","out":{"hex":"#d9bf2bff","u16":[55769,49087,11051,65535]},"paint":"#eff0f1ff"}, +{"base":"#e8cb2dff","mode":"Screen","out":{"hex":"#fefcf3ff","u16":[65278,64764,62451,65535]},"paint":"#eff0f1ff"}, +{"base":"#e8cb2dff","mode":"SourceOver","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#e8cb2dff","mode":"Multiply","out":{"hex":"#e5c92cff","u16":[58853,51657,11308,65535]},"paint":"#fcfcfcff"}, +{"base":"#e8cb2dff","mode":"Screen","out":{"hex":"#fffefdff","u16":[65535,65278,65021,65535]},"paint":"#fcfcfcff"}, +{"base":"#e8cb2dff","mode":"SourceOver","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#e8cb2dff","mode":"Multiply","out":{"hex":"#c6360fff","u16":[50886,13878,3855,65535]},"paint":"#da4453ff"}, +{"base":"#e8cb2dff","mode":"Screen","out":{"hex":"#fcd971ff","u16":[64764,55769,29041,65535]},"paint":"#da4453ff"}, +{"base":"#e8cb2dff","mode":"SourceOver","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#e8cb2dff","mode":"Multiply","out":{"hex":"#d3a208ff","u16":[54227,41634,2056,65535]},"paint":"#e8cb2dff"}, +{"base":"#e8cb2dff","mode":"Screen","out":{"hex":"#fdf452ff","u16":[65021,62708,21074,65535]},"paint":"#e8cb2dff"}, +{"base":"#e8cb2dff","mode":"SourceOver","out":{"hex":"#93bc8bff","u16":[37779,48316,35723,65535]},"paint":"#3daee980"}, +{"base":"#e8cb2dff","mode":"Multiply","out":{"hex":"#90aa2bff","u16":[37008,43690,11051,65535]},"paint":"#3daee980"}, +{"base":"#e8cb2dff","mode":"Screen","out":{"hex":"#ebdd8dff","u16":[60395,56797,36237,65535]},"paint":"#3daee980"}, +{"base":"#e8cb2dff","mode":"SourceOver","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#ffffff00"}, +{"base":"#e8cb2dff","mode":"Multiply","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#ffffff00"}, +{"base":"#e8cb2dff","mode":"Screen","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#ffffff00"}, +{"base":"#3daee980","mode":"SourceOver","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#3daee980","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#3daee980","mode":"Screen","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#000000ff"}, +{"base":"#3daee980","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#3daee980","mode":"Multiply","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#ffffffff"}, +{"base":"#3daee980","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#3daee980","mode":"SourceOver","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#3daee980","mode":"Multiply","out":{"hex":"#1e5774ff","u16":[7710,22359,29812,65535]},"paint":"#7f7f7fff"}, +{"base":"#3daee980","mode":"Screen","out":{"hex":"#9ed6f4ff","u16":[40606,54998,62708,65535]},"paint":"#7f7f7fff"}, +{"base":"#3daee980","mode":"SourceOver","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#3daee980","mode":"Multiply","out":{"hex":"#1f5775ff","u16":[7967,22359,30069,65535]},"paint":"#808080ff"}, +{"base":"#3daee980","mode":"Screen","out":{"hex":"#9ed7f4ff","u16":[40606,55255,62708,65535]},"paint":"#808080ff"}, +{"base":"#3daee980","mode":"SourceOver","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#3daee980","mode":"Multiply","out":{"hex":"#3d0000ff","u16":[15677,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#3daee980","mode":"Screen","out":{"hex":"#ffaee9ff","u16":[65535,44718,59881,65535]},"paint":"#ff0000ff"}, +{"base":"#3daee980","mode":"SourceOver","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#3daee980","mode":"Multiply","out":{"hex":"#00ae00ff","u16":[0,44718,0,65535]},"paint":"#00ff00ff"}, +{"base":"#3daee980","mode":"Screen","out":{"hex":"#3dffe9ff","u16":[15677,65535,59881,65535]},"paint":"#00ff00ff"}, +{"base":"#3daee980","mode":"SourceOver","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#3daee980","mode":"Multiply","out":{"hex":"#0000e9ff","u16":[0,0,59881,65535]},"paint":"#0000ffff"}, +{"base":"#3daee980","mode":"Screen","out":{"hex":"#3daeffff","u16":[15677,44718,65535,65535]},"paint":"#0000ffff"}, +{"base":"#3daee980","mode":"SourceOver","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#3daee980","mode":"Multiply","out":{"hex":"#3dae00ff","u16":[15677,44718,0,65535]},"paint":"#ffff00ff"}, +{"base":"#3daee980","mode":"Screen","out":{"hex":"#ffffe9ff","u16":[65535,65535,59881,65535]},"paint":"#ffff00ff"}, +{"base":"#3daee980","mode":"SourceOver","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#3daee980","mode":"Multiply","out":{"hex":"#010101ff","u16":[257,257,257,65535]},"paint":"#030201ff"}, +{"base":"#3daee980","mode":"Screen","out":{"hex":"#3fafe9ff","u16":[16191,44975,59881,65535]},"paint":"#030201ff"}, +{"base":"#3daee980","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#3daee980","mode":"Multiply","out":{"hex":"#0f77d5ff","u16":[3855,30583,54741,65535]},"paint":"#3daee9ff"}, +{"base":"#3daee980","mode":"Screen","out":{"hex":"#6be5fdff","u16":[27499,58853,65021,65535]},"paint":"#3daee9ff"}, +{"base":"#3daee980","mode":"SourceOver","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#3daee980","mode":"Multiply","out":{"hex":"#081a25ff","u16":[2056,6682,9509,65535]},"paint":"#232629ff"}, +{"base":"#3daee980","mode":"Screen","out":{"hex":"#58baedff","u16":[22616,47802,60909,65535]},"paint":"#232629ff"}, +{"base":"#3daee980","mode":"SourceOver","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#3daee980","mode":"Multiply","out":{"hex":"#39a4dcff","u16":[14649,42148,56540,65535]},"paint":"#eff0f1ff"}, +{"base":"#3daee980","mode":"Screen","out":{"hex":"#f3fafeff","u16":[62451,64250,65278,65535]},"paint":"#eff0f1ff"}, +{"base":"#3daee980","mode":"SourceOver","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#3daee980","mode":"Multiply","out":{"hex":"#3cace6ff","u16":[15420,44204,59110,65535]},"paint":"#fcfcfcff"}, +{"base":"#3daee980","mode":"Screen","out":{"hex":"#fdfeffff","u16":[65021,65278,65535,65535]},"paint":"#fcfcfcff"}, +{"base":"#3daee980","mode":"SourceOver","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#3daee980","mode":"Multiply","out":{"hex":"#342e4cff","u16":[13364,11822,19532,65535]},"paint":"#da4453ff"}, +{"base":"#3daee980","mode":"Screen","out":{"hex":"#e3c4f0ff","u16":[58339,50372,61680,65535]},"paint":"#da4453ff"}, +{"base":"#3daee980","mode":"SourceOver","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#3daee980","mode":"Multiply","out":{"hex":"#378b29ff","u16":[14135,35723,10537,65535]},"paint":"#e8cb2dff"}, +{"base":"#3daee980","mode":"Screen","out":{"hex":"#eeeeedff","u16":[61166,61166,60909,65535]},"paint":"#e8cb2dff"}, +{"base":"#3daee980","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee980"}, +{"base":"#3daee980","mode":"Multiply","out":{"hex":"#2692dfff","u16":[9766,37522,57311,65535]},"paint":"#3daee980"}, +{"base":"#3daee980","mode":"Screen","out":{"hex":"#55caf3ff","u16":[21845,51914,62451,65535]},"paint":"#3daee980"}, +{"base":"#3daee980","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#ffffff00"}, +{"base":"#3daee980","mode":"Multiply","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#ffffff00"}, +{"base":"#3daee980","mode":"Screen","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#ffffff00"}, +{"base":"#ffffff00","mode":"SourceOver","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#ffffff00","mode":"Multiply","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"paint":"#000000ff"}, +{"base":"#ffffff00","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#000000ff"}, +{"base":"#ffffff00","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#ffffff00","mode":"Multiply","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#ffffff00","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffffff"}, +{"base":"#ffffff00","mode":"SourceOver","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#ffffff00","mode":"Multiply","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]},"paint":"#7f7f7fff"}, +{"base":"#ffffff00","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#7f7f7fff"}, +{"base":"#ffffff00","mode":"SourceOver","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#ffffff00","mode":"Multiply","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"paint":"#808080ff"}, +{"base":"#ffffff00","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#808080ff"}, +{"base":"#ffffff00","mode":"SourceOver","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#ffffff00","mode":"Multiply","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"paint":"#ff0000ff"}, +{"base":"#ffffff00","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ff0000ff"}, +{"base":"#ffffff00","mode":"SourceOver","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#ffffff00","mode":"Multiply","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"paint":"#00ff00ff"}, +{"base":"#ffffff00","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#00ff00ff"}, +{"base":"#ffffff00","mode":"SourceOver","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#ffffff00","mode":"Multiply","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]},"paint":"#0000ffff"}, +{"base":"#ffffff00","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#0000ffff"}, +{"base":"#ffffff00","mode":"SourceOver","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#ffffff00","mode":"Multiply","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"paint":"#ffff00ff"}, +{"base":"#ffffff00","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffff00ff"}, +{"base":"#ffffff00","mode":"SourceOver","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#ffffff00","mode":"Multiply","out":{"hex":"#030201ff","u16":[771,514,257,65535]},"paint":"#030201ff"}, +{"base":"#ffffff00","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#030201ff"}, +{"base":"#ffffff00","mode":"SourceOver","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#ffffff00","mode":"Multiply","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"paint":"#3daee9ff"}, +{"base":"#ffffff00","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#3daee9ff"}, +{"base":"#ffffff00","mode":"SourceOver","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#ffffff00","mode":"Multiply","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"paint":"#232629ff"}, +{"base":"#ffffff00","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#232629ff"}, +{"base":"#ffffff00","mode":"SourceOver","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#ffffff00","mode":"Multiply","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"paint":"#eff0f1ff"}, +{"base":"#ffffff00","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#eff0f1ff"}, +{"base":"#ffffff00","mode":"SourceOver","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#ffffff00","mode":"Multiply","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"paint":"#fcfcfcff"}, +{"base":"#ffffff00","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#fcfcfcff"}, +{"base":"#ffffff00","mode":"SourceOver","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#ffffff00","mode":"Multiply","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"paint":"#da4453ff"}, +{"base":"#ffffff00","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#da4453ff"}, +{"base":"#ffffff00","mode":"SourceOver","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#ffffff00","mode":"Multiply","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]},"paint":"#e8cb2dff"}, +{"base":"#ffffff00","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#e8cb2dff"}, +{"base":"#ffffff00","mode":"SourceOver","out":{"hex":"#9ed6f4ff","u16":[40606,54998,62708,65535]},"paint":"#3daee980"}, +{"base":"#ffffff00","mode":"Multiply","out":{"hex":"#9ed6f4ff","u16":[40606,54998,62708,65535]},"paint":"#3daee980"}, +{"base":"#ffffff00","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#3daee980"}, +{"base":"#ffffff00","mode":"SourceOver","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffff00"}, +{"base":"#ffffff00","mode":"Multiply","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffff00"}, +{"base":"#ffffff00","mode":"Screen","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"paint":"#ffffff00"} +], +"hcy_color": [ +{"a":1,"c":-0.5,"h":-0.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":-0.5,"h":-0.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":-0.5,"h":-0.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":-0.5,"h":-0.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":-0.5,"h":-0.25,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]},"y":0.1}, +{"a":0.5,"c":-0.5,"h":-0.25,"out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32768]},"y":0.1}, +{"a":1,"c":-0.5,"h":-0.25,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]},"y":0.5}, +{"a":0.5,"c":-0.5,"h":-0.25,"out":{"hex":"#bababa80","u16":[47824,47824,47824,32768]},"y":0.5}, +{"a":1,"c":-0.5,"h":-0.25,"out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"y":0.9}, +{"a":0.5,"c":-0.5,"h":-0.25,"out":{"hex":"#f3f3f380","u16":[62470,62470,62470,32768]},"y":0.9}, +{"a":1,"c":-0.5,"h":-0.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":-0.5,"h":-0.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":-0.5,"h":-0.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":-0.5,"h":-0.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0,"h":-0.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0,"h":-0.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0,"h":-0.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0,"h":-0.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0,"h":-0.25,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]},"y":0.1}, +{"a":0.5,"c":0,"h":-0.25,"out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32768]},"y":0.1}, +{"a":1,"c":0,"h":-0.25,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]},"y":0.5}, +{"a":0.5,"c":0,"h":-0.25,"out":{"hex":"#bababa80","u16":[47824,47824,47824,32768]},"y":0.5}, +{"a":1,"c":0,"h":-0.25,"out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"y":0.9}, +{"a":0.5,"c":0,"h":-0.25,"out":{"hex":"#f3f3f380","u16":[62470,62470,62470,32768]},"y":0.9}, +{"a":1,"c":0,"h":-0.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0,"h":-0.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0,"h":-0.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0,"h":-0.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0.25,"h":-0.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0.25,"h":-0.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0.25,"h":-0.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0.25,"h":-0.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0.25,"h":-0.25,"out":{"hex":"#6a4f7fff","u16":[27247,20190,32590,65535]},"y":0.1}, +{"a":0.5,"c":0.25,"h":-0.25,"out":{"hex":"#6a4f7f80","u16":[27247,20190,32590,32768]},"y":0.1}, +{"a":1,"c":0.25,"h":-0.25,"out":{"hex":"#c2b5ceff","u16":[49896,46625,52929,65535]},"y":0.5}, +{"a":0.5,"c":0.25,"h":-0.25,"out":{"hex":"#c2b5ce80","u16":[49896,46625,52929,32768]},"y":0.5}, +{"a":1,"c":0.25,"h":-0.25,"out":{"hex":"#f4f2f6ff","u16":[62778,62299,63253,65535]},"y":0.9}, +{"a":0.5,"c":0.25,"h":-0.25,"out":{"hex":"#f4f2f680","u16":[62778,62299,63253,32768]},"y":0.9}, +{"a":1,"c":0.25,"h":-0.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0.25,"h":-0.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0.25,"h":-0.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0.25,"h":-0.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0.5,"h":-0.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0.5,"h":-0.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0.5,"h":-0.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0.5,"h":-0.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0.5,"h":-0.25,"out":{"hex":"#78419aff","u16":[30810,16792,39599,65535]},"y":0.1}, +{"a":0.5,"c":0.5,"h":-0.25,"out":{"hex":"#78419a80","u16":[30810,16792,39599,32768]},"y":0.1}, +{"a":1,"c":0.5,"h":-0.25,"out":{"hex":"#cab1e0ff","u16":[51871,45388,57502,65535]},"y":0.5}, +{"a":0.5,"c":0.5,"h":-0.25,"out":{"hex":"#cab1e080","u16":[51871,45388,57502,32768]},"y":0.5}, +{"a":1,"c":0.5,"h":-0.25,"out":{"hex":"#f5f2f9ff","u16":[63084,62127,64025,65535]},"y":0.9}, +{"a":0.5,"c":0.5,"h":-0.25,"out":{"hex":"#f5f2f980","u16":[63084,62127,64025,32768]},"y":0.9}, +{"a":1,"c":0.5,"h":-0.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0.5,"h":-0.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0.5,"h":-0.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0.5,"h":-0.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":1,"h":-0.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":1,"h":-0.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":1,"h":-0.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":1,"h":-0.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":1,"h":-0.25,"out":{"hex":"#8f00c4ff","u16":[36750,0,50361,65535]},"y":0.1}, +{"a":0.5,"c":1,"h":-0.25,"out":{"hex":"#8f00c480","u16":[36750,0,50361,32768]},"y":0.1}, +{"a":1,"c":1,"h":-0.25,"out":{"hex":"#d8a6ffff","u16":[55570,42784,65535,65535]},"y":0.5}, +{"a":0.5,"c":1,"h":-0.25,"out":{"hex":"#d8a6ff80","u16":[55570,42784,65535,32768]},"y":0.5}, +{"a":1,"c":1,"h":-0.25,"out":{"hex":"#f8f0ffff","u16":[63691,61780,65535,65535]},"y":0.9}, +{"a":0.5,"c":1,"h":-0.25,"out":{"hex":"#f8f0ff80","u16":[63691,61780,65535,32768]},"y":0.9}, +{"a":1,"c":1,"h":-0.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":1,"h":-0.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":1,"h":-0.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":1,"h":-0.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":1.5,"h":-0.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":1.5,"h":-0.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":1.5,"h":-0.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":1.5,"h":-0.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":1.5,"h":-0.25,"out":{"hex":"#8f00c4ff","u16":[36750,0,50361,65535]},"y":0.1}, +{"a":0.5,"c":1.5,"h":-0.25,"out":{"hex":"#8f00c480","u16":[36750,0,50361,32768]},"y":0.1}, +{"a":1,"c":1.5,"h":-0.25,"out":{"hex":"#d8a6ffff","u16":[55570,42784,65535,65535]},"y":0.5}, +{"a":0.5,"c":1.5,"h":-0.25,"out":{"hex":"#d8a6ff80","u16":[55570,42784,65535,32768]},"y":0.5}, +{"a":1,"c":1.5,"h":-0.25,"out":{"hex":"#f8f0ffff","u16":[63691,61780,65535,65535]},"y":0.9}, +{"a":0.5,"c":1.5,"h":-0.25,"out":{"hex":"#f8f0ff80","u16":[63691,61780,65535,32768]},"y":0.9}, +{"a":1,"c":1.5,"h":-0.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":1.5,"h":-0.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":1.5,"h":-0.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":1.5,"h":-0.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":-0.5,"h":0,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":-0.5,"h":0,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":-0.5,"h":0,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":-0.5,"h":0,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":-0.5,"h":0,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]},"y":0.1}, +{"a":0.5,"c":-0.5,"h":0,"out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32768]},"y":0.1}, +{"a":1,"c":-0.5,"h":0,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]},"y":0.5}, +{"a":0.5,"c":-0.5,"h":0,"out":{"hex":"#bababa80","u16":[47824,47824,47824,32768]},"y":0.5}, +{"a":1,"c":-0.5,"h":0,"out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"y":0.9}, +{"a":0.5,"c":-0.5,"h":0,"out":{"hex":"#f3f3f380","u16":[62470,62470,62470,32768]},"y":0.9}, +{"a":1,"c":-0.5,"h":0,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":-0.5,"h":0,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":-0.5,"h":0,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":-0.5,"h":0,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0,"h":0,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0,"h":0,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0,"h":0,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0,"h":0,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0,"h":0,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]},"y":0.1}, +{"a":0.5,"c":0,"h":0,"out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32768]},"y":0.1}, +{"a":1,"c":0,"h":0,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]},"y":0.5}, +{"a":0.5,"c":0,"h":0,"out":{"hex":"#bababa80","u16":[47824,47824,47824,32768]},"y":0.5}, +{"a":1,"c":0,"h":0,"out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"y":0.9}, +{"a":0.5,"c":0,"h":0,"out":{"hex":"#f3f3f380","u16":[62470,62470,62470,32768]},"y":0.9}, +{"a":1,"c":0,"h":0,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0,"h":0,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0,"h":0,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0,"h":0,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0.25,"h":0,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0.25,"h":0,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0.25,"h":0,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0.25,"h":0,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0.25,"h":0,"out":{"hex":"#794f4fff","u16":[30996,20190,20190,65535]},"y":0.1}, +{"a":0.5,"c":0.25,"h":0,"out":{"hex":"#794f4f80","u16":[30996,20190,20190,32768]},"y":0.1}, +{"a":1,"c":0.25,"h":0,"out":{"hex":"#ceb4b4ff","u16":[52929,46328,46328,65535]},"y":0.5}, +{"a":0.5,"c":0.25,"h":0,"out":{"hex":"#ceb4b480","u16":[52929,46328,46328,32768]},"y":0.5}, +{"a":1,"c":0.25,"h":0,"out":{"hex":"#f6f2f2ff","u16":[63253,62257,62257,65535]},"y":0.9}, +{"a":0.5,"c":0.25,"h":0,"out":{"hex":"#f6f2f280","u16":[63253,62257,62257,32768]},"y":0.9}, +{"a":1,"c":0.25,"h":0,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0.25,"h":0,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0.25,"h":0,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0.25,"h":0,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0.5,"h":0,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0.5,"h":0,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0.5,"h":0,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0.5,"h":0,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0.5,"h":0,"out":{"hex":"#904141ff","u16":[37051,16792,16792,65535]},"y":0.1}, +{"a":0.5,"c":0.5,"h":0,"out":{"hex":"#90414180","u16":[37051,16792,16792,32768]},"y":0.1}, +{"a":1,"c":0.5,"h":0,"out":{"hex":"#e0aeaeff","u16":[57502,44773,44773,65535]},"y":0.5}, +{"a":0.5,"c":0.5,"h":0,"out":{"hex":"#e0aeae80","u16":[57502,44773,44773,32768]},"y":0.5}, +{"a":1,"c":0.5,"h":0,"out":{"hex":"#f9f1f1ff","u16":[64025,62043,62043,65535]},"y":0.9}, +{"a":0.5,"c":0.5,"h":0,"out":{"hex":"#f9f1f180","u16":[64025,62043,62043,32768]},"y":0.9}, +{"a":1,"c":0.5,"h":0,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0.5,"h":0,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0.5,"h":0,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0.5,"h":0,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":1,"h":0,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":1,"h":0,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":1,"h":0,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":1,"h":0,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":1,"h":0,"out":{"hex":"#b50000ff","u16":[46514,0,0,65535]},"y":0.1}, +{"a":0.5,"c":1,"h":0,"out":{"hex":"#b5000080","u16":[46514,0,0,32768]},"y":0.1}, +{"a":1,"c":1,"h":0,"out":{"hex":"#ffa1a1ff","u16":[65535,41449,41449,65535]},"y":0.5}, +{"a":0.5,"c":1,"h":0,"out":{"hex":"#ffa1a180","u16":[65535,41449,41449,32768]},"y":0.5}, +{"a":1,"c":1,"h":0,"out":{"hex":"#fff0f0ff","u16":[65535,61611,61611,65535]},"y":0.9}, +{"a":0.5,"c":1,"h":0,"out":{"hex":"#fff0f080","u16":[65535,61611,61611,32768]},"y":0.9}, +{"a":1,"c":1,"h":0,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":1,"h":0,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":1,"h":0,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":1,"h":0,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":1.5,"h":0,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":1.5,"h":0,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":1.5,"h":0,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":1.5,"h":0,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":1.5,"h":0,"out":{"hex":"#b50000ff","u16":[46514,0,0,65535]},"y":0.1}, +{"a":0.5,"c":1.5,"h":0,"out":{"hex":"#b5000080","u16":[46514,0,0,32768]},"y":0.1}, +{"a":1,"c":1.5,"h":0,"out":{"hex":"#ffa1a1ff","u16":[65535,41449,41449,65535]},"y":0.5}, +{"a":0.5,"c":1.5,"h":0,"out":{"hex":"#ffa1a180","u16":[65535,41449,41449,32768]},"y":0.5}, +{"a":1,"c":1.5,"h":0,"out":{"hex":"#fff0f0ff","u16":[65535,61611,61611,65535]},"y":0.9}, +{"a":0.5,"c":1.5,"h":0,"out":{"hex":"#fff0f080","u16":[65535,61611,61611,32768]},"y":0.9}, +{"a":1,"c":1.5,"h":0,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":1.5,"h":0,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":1.5,"h":0,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":1.5,"h":0,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":-0.5,"h":0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":-0.5,"h":0.1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":-0.5,"h":0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":-0.5,"h":0.1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":-0.5,"h":0.1,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]},"y":0.1}, +{"a":0.5,"c":-0.5,"h":0.1,"out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32768]},"y":0.1}, +{"a":1,"c":-0.5,"h":0.1,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]},"y":0.5}, +{"a":0.5,"c":-0.5,"h":0.1,"out":{"hex":"#bababa80","u16":[47824,47824,47824,32768]},"y":0.5}, +{"a":1,"c":-0.5,"h":0.1,"out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"y":0.9}, +{"a":0.5,"c":-0.5,"h":0.1,"out":{"hex":"#f3f3f380","u16":[62470,62470,62470,32768]},"y":0.9}, +{"a":1,"c":-0.5,"h":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":-0.5,"h":0.1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":-0.5,"h":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":-0.5,"h":0.1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0,"h":0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0,"h":0.1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0,"h":0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0,"h":0.1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0,"h":0.1,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]},"y":0.1}, +{"a":0.5,"c":0,"h":0.1,"out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32768]},"y":0.1}, +{"a":1,"c":0,"h":0.1,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]},"y":0.5}, +{"a":0.5,"c":0,"h":0.1,"out":{"hex":"#bababa80","u16":[47824,47824,47824,32768]},"y":0.5}, +{"a":1,"c":0,"h":0.1,"out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"y":0.9}, +{"a":0.5,"c":0,"h":0.1,"out":{"hex":"#f3f3f380","u16":[62470,62470,62470,32768]},"y":0.9}, +{"a":1,"c":0,"h":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0,"h":0.1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0,"h":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0,"h":0.1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0.25,"h":0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0.25,"h":0.1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0.25,"h":0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0.25,"h":0.1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0.25,"h":0.1,"out":{"hex":"#5f594fff","u16":[24419,22840,20190,65535]},"y":0.1}, +{"a":0.5,"c":0.25,"h":0.1,"out":{"hex":"#5f594f80","u16":[24419,22840,20190,32768]},"y":0.1}, +{"a":1,"c":0.25,"h":0.1,"out":{"hex":"#c5b9a3ff","u16":[50750,47469,41962,65535]},"y":0.5}, +{"a":0.5,"c":0.25,"h":0.1,"out":{"hex":"#c5b9a380","u16":[50750,47469,41962,32768]},"y":0.5}, +{"a":1,"c":0.25,"h":0.1,"out":{"hex":"#f6f3eeff","u16":[63253,62378,61038,65535]},"y":0.9}, +{"a":0.5,"c":0.25,"h":0.1,"out":{"hex":"#f6f3ee80","u16":[63253,62378,61038,32768]},"y":0.9}, +{"a":1,"c":0.25,"h":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0.25,"h":0.1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0.25,"h":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0.25,"h":0.1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0.5,"h":0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0.5,"h":0.1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0.5,"h":0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0.5,"h":0.1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0.5,"h":0.1,"out":{"hex":"#645841ff","u16":[25735,22668,16792,65535]},"y":0.1}, +{"a":0.5,"c":0.5,"h":0.1,"out":{"hex":"#64584180","u16":[25735,22668,16792,32768]},"y":0.1}, +{"a":1,"c":0.5,"h":0.1,"out":{"hex":"#d0b788ff","u16":[53486,47111,34899,65535]},"y":0.5}, +{"a":0.5,"c":0.5,"h":0.1,"out":{"hex":"#d0b78880","u16":[53486,47111,34899,32768]},"y":0.5}, +{"a":1,"c":0.5,"h":0.1,"out":{"hex":"#f9f2e8ff","u16":[64025,62286,59564,65535]},"y":0.9}, +{"a":0.5,"c":0.5,"h":0.1,"out":{"hex":"#f9f2e880","u16":[64025,62286,59564,32768]},"y":0.9}, +{"a":1,"c":0.5,"h":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0.5,"h":0.1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0.5,"h":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0.5,"h":0.1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":1,"h":0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":1,"h":0.1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":1,"h":0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":1,"h":0.1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":1,"h":0.1,"out":{"hex":"#6e5700ff","u16":[28151,22318,0,65535]},"y":0.1}, +{"a":0.5,"c":1,"h":0.1,"out":{"hex":"#6e570080","u16":[28151,22318,0,32768]},"y":0.1}, +{"a":1,"c":1,"h":0.1,"out":{"hex":"#e4b400ff","u16":[58508,46384,0,65535]},"y":0.5}, +{"a":0.5,"c":1,"h":0.1,"out":{"hex":"#e4b40080","u16":[58508,46384,0,32768]},"y":0.5}, +{"a":1,"c":1,"h":0.1,"out":{"hex":"#fff2dcff","u16":[65535,62102,56477,65535]},"y":0.9}, +{"a":0.5,"c":1,"h":0.1,"out":{"hex":"#fff2dc80","u16":[65535,62102,56477,32768]},"y":0.9}, +{"a":1,"c":1,"h":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":1,"h":0.1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":1,"h":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":1,"h":0.1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":1.5,"h":0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":1.5,"h":0.1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":1.5,"h":0.1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":1.5,"h":0.1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":1.5,"h":0.1,"out":{"hex":"#6e5700ff","u16":[28151,22318,0,65535]},"y":0.1}, +{"a":0.5,"c":1.5,"h":0.1,"out":{"hex":"#6e570080","u16":[28151,22318,0,32768]},"y":0.1}, +{"a":1,"c":1.5,"h":0.1,"out":{"hex":"#e4b400ff","u16":[58508,46384,0,65535]},"y":0.5}, +{"a":0.5,"c":1.5,"h":0.1,"out":{"hex":"#e4b40080","u16":[58508,46384,0,32768]},"y":0.5}, +{"a":1,"c":1.5,"h":0.1,"out":{"hex":"#fff2dcff","u16":[65535,62102,56477,65535]},"y":0.9}, +{"a":0.5,"c":1.5,"h":0.1,"out":{"hex":"#fff2dc80","u16":[65535,62102,56477,32768]},"y":0.9}, +{"a":1,"c":1.5,"h":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":1.5,"h":0.1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":1.5,"h":0.1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":1.5,"h":0.1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":-0.5,"h":0.16666666666666666,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":-0.5,"h":0.16666666666666666,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":-0.5,"h":0.16666666666666666,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":-0.5,"h":0.16666666666666666,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":-0.5,"h":0.16666666666666666,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]},"y":0.1}, +{"a":0.5,"c":-0.5,"h":0.16666666666666666,"out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32768]},"y":0.1}, +{"a":1,"c":-0.5,"h":0.16666666666666666,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]},"y":0.5}, +{"a":0.5,"c":-0.5,"h":0.16666666666666666,"out":{"hex":"#bababa80","u16":[47824,47824,47824,32768]},"y":0.5}, +{"a":1,"c":-0.5,"h":0.16666666666666666,"out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"y":0.9}, +{"a":0.5,"c":-0.5,"h":0.16666666666666666,"out":{"hex":"#f3f3f380","u16":[62470,62470,62470,32768]},"y":0.9}, +{"a":1,"c":-0.5,"h":0.16666666666666666,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":-0.5,"h":0.16666666666666666,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":-0.5,"h":0.16666666666666666,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":-0.5,"h":0.16666666666666666,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0,"h":0.16666666666666666,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0,"h":0.16666666666666666,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0,"h":0.16666666666666666,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0,"h":0.16666666666666666,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0,"h":0.16666666666666666,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]},"y":0.1}, +{"a":0.5,"c":0,"h":0.16666666666666666,"out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32768]},"y":0.1}, +{"a":1,"c":0,"h":0.16666666666666666,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]},"y":0.5}, +{"a":0.5,"c":0,"h":0.16666666666666666,"out":{"hex":"#bababa80","u16":[47824,47824,47824,32768]},"y":0.5}, +{"a":1,"c":0,"h":0.16666666666666666,"out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"y":0.9}, +{"a":0.5,"c":0,"h":0.16666666666666666,"out":{"hex":"#f3f3f380","u16":[62470,62470,62470,32768]},"y":0.9}, +{"a":1,"c":0,"h":0.16666666666666666,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0,"h":0.16666666666666666,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0,"h":0.16666666666666666,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0,"h":0.16666666666666666,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0.25,"h":0.16666666666666666,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0.25,"h":0.16666666666666666,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0.25,"h":0.16666666666666666,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0.25,"h":0.16666666666666666,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0.25,"h":0.16666666666666666,"out":{"hex":"#5a5a4fff","u16":[23213,23213,20190,65535]},"y":0.1}, +{"a":0.5,"c":0.25,"h":0.16666666666666666,"out":{"hex":"#5a5a4f80","u16":[23213,23213,20190,32768]},"y":0.1}, +{"a":1,"c":0.25,"h":0.16666666666666666,"out":{"hex":"#bcbca3ff","u16":[48244,48244,41962,65535]},"y":0.5}, +{"a":0.5,"c":0.25,"h":0.16666666666666666,"out":{"hex":"#bcbca380","u16":[48244,48244,41962,32768]},"y":0.5}, +{"a":1,"c":0.25,"h":0.16666666666666666,"out":{"hex":"#f5f5d5ff","u16":[63020,63020,54813,65535]},"y":0.9}, +{"a":0.5,"c":0.25,"h":0.16666666666666666,"out":{"hex":"#f5f5d580","u16":[63020,63020,54813,32768]},"y":0.9}, +{"a":1,"c":0.25,"h":0.16666666666666666,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0.25,"h":0.16666666666666666,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0.25,"h":0.16666666666666666,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0.25,"h":0.16666666666666666,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0.5,"h":0.16666666666666666,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0.5,"h":0.16666666666666666,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0.5,"h":0.16666666666666666,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0.5,"h":0.16666666666666666,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0.5,"h":0.16666666666666666,"out":{"hex":"#5b5b41ff","u16":[23413,23413,16792,65535]},"y":0.1}, +{"a":0.5,"c":0.5,"h":0.16666666666666666,"out":{"hex":"#5b5b4180","u16":[23413,23413,16792,32768]},"y":0.1}, +{"a":1,"c":0.5,"h":0.16666666666666666,"out":{"hex":"#bdbd88ff","u16":[48661,48661,34899,65535]},"y":0.5}, +{"a":0.5,"c":0.5,"h":0.16666666666666666,"out":{"hex":"#bdbd8880","u16":[48661,48661,34899,32768]},"y":0.5}, +{"a":1,"c":0.5,"h":0.16666666666666666,"out":{"hex":"#f7f7b1ff","u16":[63564,63564,45587,65535]},"y":0.9}, +{"a":0.5,"c":0.5,"h":0.16666666666666666,"out":{"hex":"#f7f7b180","u16":[63564,63564,45587,32768]},"y":0.9}, +{"a":1,"c":0.5,"h":0.16666666666666666,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0.5,"h":0.16666666666666666,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0.5,"h":0.16666666666666666,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0.5,"h":0.16666666666666666,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":1,"h":0.16666666666666666,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":1,"h":0.16666666666666666,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":1,"h":0.16666666666666666,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":1,"h":0.16666666666666666,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":1,"h":0.16666666666666666,"out":{"hex":"#5d5d00ff","u16":[23808,23808,0,65535]},"y":0.1}, +{"a":0.5,"c":1,"h":0.16666666666666666,"out":{"hex":"#5d5d0080","u16":[23808,23808,0,32768]},"y":0.1}, +{"a":1,"c":1,"h":0.16666666666666666,"out":{"hex":"#c1c100ff","u16":[49481,49481,0,65535]},"y":0.5}, +{"a":0.5,"c":1,"h":0.16666666666666666,"out":{"hex":"#c1c10080","u16":[49481,49481,0,32768]},"y":0.5}, +{"a":1,"c":1,"h":0.16666666666666666,"out":{"hex":"#fbfb00ff","u16":[64635,64635,0,65535]},"y":0.9}, +{"a":0.5,"c":1,"h":0.16666666666666666,"out":{"hex":"#fbfb0080","u16":[64635,64635,0,32768]},"y":0.9}, +{"a":1,"c":1,"h":0.16666666666666666,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":1,"h":0.16666666666666666,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":1,"h":0.16666666666666666,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":1,"h":0.16666666666666666,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":1.5,"h":0.16666666666666666,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":1.5,"h":0.16666666666666666,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":1.5,"h":0.16666666666666666,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":1.5,"h":0.16666666666666666,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":1.5,"h":0.16666666666666666,"out":{"hex":"#5d5d00ff","u16":[23808,23808,0,65535]},"y":0.1}, +{"a":0.5,"c":1.5,"h":0.16666666666666666,"out":{"hex":"#5d5d0080","u16":[23808,23808,0,32768]},"y":0.1}, +{"a":1,"c":1.5,"h":0.16666666666666666,"out":{"hex":"#c1c100ff","u16":[49481,49481,0,65535]},"y":0.5}, +{"a":0.5,"c":1.5,"h":0.16666666666666666,"out":{"hex":"#c1c10080","u16":[49481,49481,0,32768]},"y":0.5}, +{"a":1,"c":1.5,"h":0.16666666666666666,"out":{"hex":"#fbfb00ff","u16":[64635,64635,0,65535]},"y":0.9}, +{"a":0.5,"c":1.5,"h":0.16666666666666666,"out":{"hex":"#fbfb0080","u16":[64635,64635,0,32768]},"y":0.9}, +{"a":1,"c":1.5,"h":0.16666666666666666,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":1.5,"h":0.16666666666666666,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":1.5,"h":0.16666666666666666,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":1.5,"h":0.16666666666666666,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":-0.5,"h":0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":-0.5,"h":0.5,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":-0.5,"h":0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":-0.5,"h":0.5,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":-0.5,"h":0.5,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]},"y":0.1}, +{"a":0.5,"c":-0.5,"h":0.5,"out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32768]},"y":0.1}, +{"a":1,"c":-0.5,"h":0.5,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]},"y":0.5}, +{"a":0.5,"c":-0.5,"h":0.5,"out":{"hex":"#bababa80","u16":[47824,47824,47824,32768]},"y":0.5}, +{"a":1,"c":-0.5,"h":0.5,"out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"y":0.9}, +{"a":0.5,"c":-0.5,"h":0.5,"out":{"hex":"#f3f3f380","u16":[62470,62470,62470,32768]},"y":0.9}, +{"a":1,"c":-0.5,"h":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":-0.5,"h":0.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":-0.5,"h":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":-0.5,"h":0.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0,"h":0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0,"h":0.5,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0,"h":0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0,"h":0.5,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0,"h":0.5,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]},"y":0.1}, +{"a":0.5,"c":0,"h":0.5,"out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32768]},"y":0.1}, +{"a":1,"c":0,"h":0.5,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]},"y":0.5}, +{"a":0.5,"c":0,"h":0.5,"out":{"hex":"#bababa80","u16":[47824,47824,47824,32768]},"y":0.5}, +{"a":1,"c":0,"h":0.5,"out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"y":0.9}, +{"a":0.5,"c":0,"h":0.5,"out":{"hex":"#f3f3f380","u16":[62470,62470,62470,32768]},"y":0.9}, +{"a":1,"c":0,"h":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0,"h":0.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0,"h":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0,"h":0.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0.25,"h":0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0.25,"h":0.5,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0.25,"h":0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0.25,"h":0.5,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0.25,"h":0.5,"out":{"hex":"#4f5c5cff","u16":[20190,23704,23704,65535]},"y":0.1}, +{"a":0.5,"c":0.25,"h":0.5,"out":{"hex":"#4f5c5c80","u16":[20190,23704,23704,32768]},"y":0.1}, +{"a":1,"c":0.25,"h":0.5,"out":{"hex":"#a3c0c0ff","u16":[41962,49265,49265,65535]},"y":0.5}, +{"a":0.5,"c":0.25,"h":0.5,"out":{"hex":"#a3c0c080","u16":[41962,49265,49265,32768]},"y":0.5}, +{"a":1,"c":0.25,"h":0.5,"out":{"hex":"#e7f6f6ff","u16":[59462,63253,63253,65535]},"y":0.9}, +{"a":0.5,"c":0.25,"h":0.5,"out":{"hex":"#e7f6f680","u16":[59462,63253,63253,32768]},"y":0.9}, +{"a":1,"c":0.25,"h":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0.25,"h":0.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0.25,"h":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0.25,"h":0.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0.5,"h":0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0.5,"h":0.5,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0.5,"h":0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0.5,"h":0.5,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0.5,"h":0.5,"out":{"hex":"#415f5fff","u16":[16792,24374,24374,65535]},"y":0.1}, +{"a":0.5,"c":0.5,"h":0.5,"out":{"hex":"#415f5f80","u16":[16792,24374,24374,32768]},"y":0.1}, +{"a":1,"c":0.5,"h":0.5,"out":{"hex":"#88c5c5ff","u16":[34899,50657,50657,65535]},"y":0.5}, +{"a":0.5,"c":0.5,"h":0.5,"out":{"hex":"#88c5c580","u16":[34899,50657,50657,32768]},"y":0.5}, +{"a":1,"c":0.5,"h":0.5,"out":{"hex":"#dbf9f9ff","u16":[56260,64025,64025,65535]},"y":0.9}, +{"a":0.5,"c":0.5,"h":0.5,"out":{"hex":"#dbf9f980","u16":[56260,64025,64025,32768]},"y":0.9}, +{"a":1,"c":0.5,"h":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0.5,"h":0.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0.5,"h":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0.5,"h":0.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":1,"h":0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":1,"h":0.5,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":1,"h":0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":1,"h":0.5,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":1,"h":0.5,"out":{"hex":"#006464ff","u16":[0,25651,25651,65535]},"y":0.1}, +{"a":0.5,"c":1,"h":0.5,"out":{"hex":"#00646480","u16":[0,25651,25651,32768]},"y":0.1}, +{"a":1,"c":1,"h":0.5,"out":{"hex":"#00cfcfff","u16":[0,53312,53312,65535]},"y":0.5}, +{"a":0.5,"c":1,"h":0.5,"out":{"hex":"#00cfcf80","u16":[0,53312,53312,32768]},"y":0.5}, +{"a":1,"c":1,"h":0.5,"out":{"hex":"#bfffffff","u16":[49092,65535,65535,65535]},"y":0.9}, +{"a":0.5,"c":1,"h":0.5,"out":{"hex":"#bfffff80","u16":[49092,65535,65535,32768]},"y":0.9}, +{"a":1,"c":1,"h":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":1,"h":0.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":1,"h":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":1,"h":0.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":1.5,"h":0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":1.5,"h":0.5,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":1.5,"h":0.5,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":1.5,"h":0.5,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":1.5,"h":0.5,"out":{"hex":"#006464ff","u16":[0,25651,25651,65535]},"y":0.1}, +{"a":0.5,"c":1.5,"h":0.5,"out":{"hex":"#00646480","u16":[0,25651,25651,32768]},"y":0.1}, +{"a":1,"c":1.5,"h":0.5,"out":{"hex":"#00cfcfff","u16":[0,53312,53312,65535]},"y":0.5}, +{"a":0.5,"c":1.5,"h":0.5,"out":{"hex":"#00cfcf80","u16":[0,53312,53312,32768]},"y":0.5}, +{"a":1,"c":1.5,"h":0.5,"out":{"hex":"#bfffffff","u16":[49092,65535,65535,65535]},"y":0.9}, +{"a":0.5,"c":1.5,"h":0.5,"out":{"hex":"#bfffff80","u16":[49092,65535,65535,32768]},"y":0.9}, +{"a":1,"c":1.5,"h":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":1.5,"h":0.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":1.5,"h":0.5,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":1.5,"h":0.5,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":-0.5,"h":0.9,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":-0.5,"h":0.9,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":-0.5,"h":0.9,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":-0.5,"h":0.9,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":-0.5,"h":0.9,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]},"y":0.1}, +{"a":0.5,"c":-0.5,"h":0.9,"out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32768]},"y":0.1}, +{"a":1,"c":-0.5,"h":0.9,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]},"y":0.5}, +{"a":0.5,"c":-0.5,"h":0.9,"out":{"hex":"#bababa80","u16":[47824,47824,47824,32768]},"y":0.5}, +{"a":1,"c":-0.5,"h":0.9,"out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"y":0.9}, +{"a":0.5,"c":-0.5,"h":0.9,"out":{"hex":"#f3f3f380","u16":[62470,62470,62470,32768]},"y":0.9}, +{"a":1,"c":-0.5,"h":0.9,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":-0.5,"h":0.9,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":-0.5,"h":0.9,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":-0.5,"h":0.9,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0,"h":0.9,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0,"h":0.9,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0,"h":0.9,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0,"h":0.9,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0,"h":0.9,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]},"y":0.1}, +{"a":0.5,"c":0,"h":0.9,"out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32768]},"y":0.1}, +{"a":1,"c":0,"h":0.9,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]},"y":0.5}, +{"a":0.5,"c":0,"h":0.9,"out":{"hex":"#bababa80","u16":[47824,47824,47824,32768]},"y":0.5}, +{"a":1,"c":0,"h":0.9,"out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"y":0.9}, +{"a":0.5,"c":0,"h":0.9,"out":{"hex":"#f3f3f380","u16":[62470,62470,62470,32768]},"y":0.9}, +{"a":1,"c":0,"h":0.9,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0,"h":0.9,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0,"h":0.9,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0,"h":0.9,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0.25,"h":0.9,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0.25,"h":0.9,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0.25,"h":0.9,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0.25,"h":0.9,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0.25,"h":0.9,"out":{"hex":"#734f66ff","u16":[29497,20190,26250,65535]},"y":0.1}, +{"a":0.5,"c":0.25,"h":0.9,"out":{"hex":"#734f6680","u16":[29497,20190,26250,32768]},"y":0.1}, +{"a":1,"c":0.25,"h":0.9,"out":{"hex":"#ceb3c4ff","u16":[52929,45908,50262,65535]},"y":0.5}, +{"a":0.5,"c":0.25,"h":0.9,"out":{"hex":"#ceb3c480","u16":[52929,45908,50262,32768]},"y":0.5}, +{"a":1,"c":0.25,"h":0.9,"out":{"hex":"#f6f2f4ff","u16":[63253,62198,62834,65535]},"y":0.9}, +{"a":0.5,"c":0.25,"h":0.9,"out":{"hex":"#f6f2f480","u16":[63253,62198,62834,32768]},"y":0.9}, +{"a":1,"c":0.25,"h":0.9,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0.25,"h":0.9,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0.25,"h":0.9,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0.25,"h":0.9,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0.5,"h":0.9,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0.5,"h":0.9,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0.5,"h":0.9,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0.5,"h":0.9,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0.5,"h":0.9,"out":{"hex":"#874171ff","u16":[34604,16792,29069,65535]},"y":0.1}, +{"a":0.5,"c":0.5,"h":0.9,"out":{"hex":"#87417180","u16":[34604,16792,29069,32768]},"y":0.1}, +{"a":1,"c":0.5,"h":0.9,"out":{"hex":"#e0abcdff","u16":[57502,43892,52566,65535]},"y":0.5}, +{"a":0.5,"c":0.5,"h":0.9,"out":{"hex":"#e0abcd80","u16":[57502,43892,52566,32768]},"y":0.5}, +{"a":1,"c":0.5,"h":0.9,"out":{"hex":"#f9f1f6ff","u16":[64025,61925,63195,65535]},"y":0.9}, +{"a":0.5,"c":0.5,"h":0.9,"out":{"hex":"#f9f1f680","u16":[64025,61925,63195,32768]},"y":0.9}, +{"a":1,"c":0.5,"h":0.9,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0.5,"h":0.9,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0.5,"h":0.9,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0.5,"h":0.9,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":1,"h":0.9,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":1,"h":0.9,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":1,"h":0.9,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":1,"h":0.9,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":1,"h":0.9,"out":{"hex":"#a60084ff","u16":[42753,0,33895,65535]},"y":0.1}, +{"a":0.5,"c":1,"h":0.9,"out":{"hex":"#a6008480","u16":[42753,0,33895,32768]},"y":0.1}, +{"a":1,"c":1,"h":0.9,"out":{"hex":"#ff9addff","u16":[65535,39485,56843,65535]},"y":0.5}, +{"a":0.5,"c":1,"h":0.9,"out":{"hex":"#ff9add80","u16":[65535,39485,56843,32768]},"y":0.5}, +{"a":1,"c":1,"h":0.9,"out":{"hex":"#ffeff9ff","u16":[65535,61374,63909,65535]},"y":0.9}, +{"a":0.5,"c":1,"h":0.9,"out":{"hex":"#ffeff980","u16":[65535,61374,63909,32768]},"y":0.9}, +{"a":1,"c":1,"h":0.9,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":1,"h":0.9,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":1,"h":0.9,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":1,"h":0.9,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":1.5,"h":0.9,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":1.5,"h":0.9,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":1.5,"h":0.9,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":1.5,"h":0.9,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":1.5,"h":0.9,"out":{"hex":"#a60084ff","u16":[42753,0,33895,65535]},"y":0.1}, +{"a":0.5,"c":1.5,"h":0.9,"out":{"hex":"#a6008480","u16":[42753,0,33895,32768]},"y":0.1}, +{"a":1,"c":1.5,"h":0.9,"out":{"hex":"#ff9addff","u16":[65535,39485,56843,65535]},"y":0.5}, +{"a":0.5,"c":1.5,"h":0.9,"out":{"hex":"#ff9add80","u16":[65535,39485,56843,32768]},"y":0.5}, +{"a":1,"c":1.5,"h":0.9,"out":{"hex":"#ffeff9ff","u16":[65535,61374,63909,65535]},"y":0.9}, +{"a":0.5,"c":1.5,"h":0.9,"out":{"hex":"#ffeff980","u16":[65535,61374,63909,32768]},"y":0.9}, +{"a":1,"c":1.5,"h":0.9,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":1.5,"h":0.9,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":1.5,"h":0.9,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":1.5,"h":0.9,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":-0.5,"h":1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":-0.5,"h":1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":-0.5,"h":1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":-0.5,"h":1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":-0.5,"h":1,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]},"y":0.1}, +{"a":0.5,"c":-0.5,"h":1,"out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32768]},"y":0.1}, +{"a":1,"c":-0.5,"h":1,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]},"y":0.5}, +{"a":0.5,"c":-0.5,"h":1,"out":{"hex":"#bababa80","u16":[47824,47824,47824,32768]},"y":0.5}, +{"a":1,"c":-0.5,"h":1,"out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"y":0.9}, +{"a":0.5,"c":-0.5,"h":1,"out":{"hex":"#f3f3f380","u16":[62470,62470,62470,32768]},"y":0.9}, +{"a":1,"c":-0.5,"h":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":-0.5,"h":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":-0.5,"h":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":-0.5,"h":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0,"h":1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0,"h":1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0,"h":1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0,"h":1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0,"h":1,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]},"y":0.1}, +{"a":0.5,"c":0,"h":1,"out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32768]},"y":0.1}, +{"a":1,"c":0,"h":1,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]},"y":0.5}, +{"a":0.5,"c":0,"h":1,"out":{"hex":"#bababa80","u16":[47824,47824,47824,32768]},"y":0.5}, +{"a":1,"c":0,"h":1,"out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"y":0.9}, +{"a":0.5,"c":0,"h":1,"out":{"hex":"#f3f3f380","u16":[62470,62470,62470,32768]},"y":0.9}, +{"a":1,"c":0,"h":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0,"h":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0,"h":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0,"h":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0.25,"h":1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0.25,"h":1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0.25,"h":1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0.25,"h":1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0.25,"h":1,"out":{"hex":"#794f4fff","u16":[30996,20190,20190,65535]},"y":0.1}, +{"a":0.5,"c":0.25,"h":1,"out":{"hex":"#794f4f80","u16":[30996,20190,20190,32768]},"y":0.1}, +{"a":1,"c":0.25,"h":1,"out":{"hex":"#ceb4b4ff","u16":[52929,46328,46328,65535]},"y":0.5}, +{"a":0.5,"c":0.25,"h":1,"out":{"hex":"#ceb4b480","u16":[52929,46328,46328,32768]},"y":0.5}, +{"a":1,"c":0.25,"h":1,"out":{"hex":"#f6f2f2ff","u16":[63253,62257,62257,65535]},"y":0.9}, +{"a":0.5,"c":0.25,"h":1,"out":{"hex":"#f6f2f280","u16":[63253,62257,62257,32768]},"y":0.9}, +{"a":1,"c":0.25,"h":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0.25,"h":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0.25,"h":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0.25,"h":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0.5,"h":1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0.5,"h":1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0.5,"h":1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0.5,"h":1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0.5,"h":1,"out":{"hex":"#904141ff","u16":[37051,16792,16792,65535]},"y":0.1}, +{"a":0.5,"c":0.5,"h":1,"out":{"hex":"#90414180","u16":[37051,16792,16792,32768]},"y":0.1}, +{"a":1,"c":0.5,"h":1,"out":{"hex":"#e0aeaeff","u16":[57502,44773,44773,65535]},"y":0.5}, +{"a":0.5,"c":0.5,"h":1,"out":{"hex":"#e0aeae80","u16":[57502,44773,44773,32768]},"y":0.5}, +{"a":1,"c":0.5,"h":1,"out":{"hex":"#f9f1f1ff","u16":[64025,62043,62043,65535]},"y":0.9}, +{"a":0.5,"c":0.5,"h":1,"out":{"hex":"#f9f1f180","u16":[64025,62043,62043,32768]},"y":0.9}, +{"a":1,"c":0.5,"h":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0.5,"h":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0.5,"h":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0.5,"h":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":1,"h":1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":1,"h":1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":1,"h":1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":1,"h":1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":1,"h":1,"out":{"hex":"#b50000ff","u16":[46514,0,0,65535]},"y":0.1}, +{"a":0.5,"c":1,"h":1,"out":{"hex":"#b5000080","u16":[46514,0,0,32768]},"y":0.1}, +{"a":1,"c":1,"h":1,"out":{"hex":"#ffa1a1ff","u16":[65535,41449,41449,65535]},"y":0.5}, +{"a":0.5,"c":1,"h":1,"out":{"hex":"#ffa1a180","u16":[65535,41449,41449,32768]},"y":0.5}, +{"a":1,"c":1,"h":1,"out":{"hex":"#fff0f0ff","u16":[65535,61611,61611,65535]},"y":0.9}, +{"a":0.5,"c":1,"h":1,"out":{"hex":"#fff0f080","u16":[65535,61611,61611,32768]},"y":0.9}, +{"a":1,"c":1,"h":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":1,"h":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":1,"h":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":1,"h":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":1.5,"h":1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":1.5,"h":1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":1.5,"h":1,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":1.5,"h":1,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":1.5,"h":1,"out":{"hex":"#b50000ff","u16":[46514,0,0,65535]},"y":0.1}, +{"a":0.5,"c":1.5,"h":1,"out":{"hex":"#b5000080","u16":[46514,0,0,32768]},"y":0.1}, +{"a":1,"c":1.5,"h":1,"out":{"hex":"#ffa1a1ff","u16":[65535,41449,41449,65535]},"y":0.5}, +{"a":0.5,"c":1.5,"h":1,"out":{"hex":"#ffa1a180","u16":[65535,41449,41449,32768]},"y":0.5}, +{"a":1,"c":1.5,"h":1,"out":{"hex":"#fff0f0ff","u16":[65535,61611,61611,65535]},"y":0.9}, +{"a":0.5,"c":1.5,"h":1,"out":{"hex":"#fff0f080","u16":[65535,61611,61611,32768]},"y":0.9}, +{"a":1,"c":1.5,"h":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":1.5,"h":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":1.5,"h":1,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":1.5,"h":1,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":-0.5,"h":1.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":-0.5,"h":1.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":-0.5,"h":1.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":-0.5,"h":1.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":-0.5,"h":1.25,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]},"y":0.1}, +{"a":0.5,"c":-0.5,"h":1.25,"out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32768]},"y":0.1}, +{"a":1,"c":-0.5,"h":1.25,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]},"y":0.5}, +{"a":0.5,"c":-0.5,"h":1.25,"out":{"hex":"#bababa80","u16":[47824,47824,47824,32768]},"y":0.5}, +{"a":1,"c":-0.5,"h":1.25,"out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"y":0.9}, +{"a":0.5,"c":-0.5,"h":1.25,"out":{"hex":"#f3f3f380","u16":[62470,62470,62470,32768]},"y":0.9}, +{"a":1,"c":-0.5,"h":1.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":-0.5,"h":1.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":-0.5,"h":1.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":-0.5,"h":1.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0,"h":1.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0,"h":1.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0,"h":1.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0,"h":1.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0,"h":1.25,"out":{"hex":"#5a5a5aff","u16":[23011,23011,23011,65535]},"y":0.1}, +{"a":0.5,"c":0,"h":1.25,"out":{"hex":"#5a5a5a80","u16":[23011,23011,23011,32768]},"y":0.1}, +{"a":1,"c":0,"h":1.25,"out":{"hex":"#bababaff","u16":[47824,47824,47824,65535]},"y":0.5}, +{"a":0.5,"c":0,"h":1.25,"out":{"hex":"#bababa80","u16":[47824,47824,47824,32768]},"y":0.5}, +{"a":1,"c":0,"h":1.25,"out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"y":0.9}, +{"a":0.5,"c":0,"h":1.25,"out":{"hex":"#f3f3f380","u16":[62470,62470,62470,32768]},"y":0.9}, +{"a":1,"c":0,"h":1.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0,"h":1.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0,"h":1.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0,"h":1.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0.25,"h":1.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0.25,"h":1.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0.25,"h":1.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0.25,"h":1.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0.25,"h":1.25,"out":{"hex":"#555c4fff","u16":[21958,23571,20190,65535]},"y":0.1}, +{"a":0.5,"c":0.25,"h":1.25,"out":{"hex":"#555c4f80","u16":[21958,23571,20190,32768]},"y":0.1}, +{"a":1,"c":0.25,"h":1.25,"out":{"hex":"#b2bfa3ff","u16":[45637,48987,41962,65535]},"y":0.5}, +{"a":0.5,"c":0.25,"h":1.25,"out":{"hex":"#b2bfa380","u16":[45637,48987,41962,32768]},"y":0.5}, +{"a":1,"c":0.25,"h":1.25,"out":{"hex":"#edf6e4ff","u16":[61030,63253,58705,65535]},"y":0.9}, +{"a":0.5,"c":0.25,"h":1.25,"out":{"hex":"#edf6e480","u16":[61030,63253,58705,32768]},"y":0.9}, +{"a":1,"c":0.25,"h":1.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0.25,"h":1.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0.25,"h":1.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0.25,"h":1.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":0.5,"h":1.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":0.5,"h":1.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":0.5,"h":1.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":0.5,"h":1.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":0.5,"h":1.25,"out":{"hex":"#515e41ff","u16":[20842,24115,16792,65535]},"y":0.1}, +{"a":0.5,"c":0.5,"h":1.25,"out":{"hex":"#515e4180","u16":[20842,24115,16792,32768]},"y":0.1}, +{"a":1,"c":0.5,"h":1.25,"out":{"hex":"#a9c388ff","u16":[43317,50119,34899,65535]},"y":0.5}, +{"a":0.5,"c":0.5,"h":1.25,"out":{"hex":"#a9c38880","u16":[43317,50119,34899,32768]},"y":0.5}, +{"a":1,"c":0.5,"h":1.25,"out":{"hex":"#e8f9d5ff","u16":[59547,64025,54624,65535]},"y":0.9}, +{"a":0.5,"c":0.5,"h":1.25,"out":{"hex":"#e8f9d580","u16":[59547,64025,54624,32768]},"y":0.9}, +{"a":1,"c":0.5,"h":1.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":0.5,"h":1.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":0.5,"h":1.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":0.5,"h":1.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":1,"h":1.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":1,"h":1.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":1,"h":1.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":1,"h":1.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":1,"h":1.25,"out":{"hex":"#476200ff","u16":[18362,25162,0,65535]},"y":0.1}, +{"a":0.5,"c":1,"h":1.25,"out":{"hex":"#47620080","u16":[18362,25162,0,32768]},"y":0.1}, +{"a":1,"c":1,"h":1.25,"out":{"hex":"#94cb00ff","u16":[38161,52295,0,65535]},"y":0.5}, +{"a":0.5,"c":1,"h":1.25,"out":{"hex":"#94cb0080","u16":[38161,52295,0,32768]},"y":0.5}, +{"a":1,"c":1,"h":1.25,"out":{"hex":"#dcffb0ff","u16":[56441,65535,45113,65535]},"y":0.9}, +{"a":0.5,"c":1,"h":1.25,"out":{"hex":"#dcffb080","u16":[56441,65535,45113,32768]},"y":0.9}, +{"a":1,"c":1,"h":1.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":1,"h":1.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":1,"h":1.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":1,"h":1.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1}, +{"a":1,"c":1.5,"h":1.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":-0.1}, +{"a":0.5,"c":1.5,"h":1.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":-0.1}, +{"a":1,"c":1.5,"h":1.25,"out":{"hex":"#000000ff","u16":[0,0,0,65535]},"y":0}, +{"a":0.5,"c":1.5,"h":1.25,"out":{"hex":"#00000080","u16":[0,0,0,32768]},"y":0}, +{"a":1,"c":1.5,"h":1.25,"out":{"hex":"#476200ff","u16":[18362,25162,0,65535]},"y":0.1}, +{"a":0.5,"c":1.5,"h":1.25,"out":{"hex":"#47620080","u16":[18362,25162,0,32768]},"y":0.1}, +{"a":1,"c":1.5,"h":1.25,"out":{"hex":"#94cb00ff","u16":[38161,52295,0,65535]},"y":0.5}, +{"a":0.5,"c":1.5,"h":1.25,"out":{"hex":"#94cb0080","u16":[38161,52295,0,32768]},"y":0.5}, +{"a":1,"c":1.5,"h":1.25,"out":{"hex":"#dcffb0ff","u16":[56441,65535,45113,65535]},"y":0.9}, +{"a":0.5,"c":1.5,"h":1.25,"out":{"hex":"#dcffb080","u16":[56441,65535,45113,32768]},"y":0.9}, +{"a":1,"c":1.5,"h":1.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1}, +{"a":0.5,"c":1.5,"h":1.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1}, +{"a":1,"c":1.5,"h":1.25,"out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"y":1.1}, +{"a":0.5,"c":1.5,"h":1.25,"out":{"hex":"#ffffff80","u16":[65535,65535,65535,32768]},"y":1.1} +], +"scheme_shade": [ +{"chroma":0,"contrast":-1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#000000ff","out":{"hex":"#414141ff","u16":[16792,16792,16792,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#000000ff","out":{"hex":"#693030ff","u16":[27038,12254,12254,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#000000ff","out":{"hex":"#aeaeaeff","u16":[44655,44655,44655,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#000000ff","out":{"hex":"#db9f9fff","u16":[56266,40827,40827,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#000000ff","out":{"hex":"#dbdbdbff","u16":[56266,56266,56266,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#000000ff","out":{"hex":"#eed5d5ff","u16":[61112,54869,54869,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#000000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#000000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#000000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#000000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#000000ff","out":{"hex":"#343434ff","u16":[13312,13312,13312,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#000000ff","out":{"hex":"#532626ff","u16":[21435,9715,9715,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#000000ff","out":{"hex":"#8d8d8dff","u16":[36141,36141,36141,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#000000ff","out":{"hex":"#cf7272ff","u16":[53312,29400,29400,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#000000ff","out":{"hex":"#b1b1b1ff","u16":[45587,45587,45587,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#000000ff","out":{"hex":"#dca3a3ff","u16":[56623,42000,42000,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#000000ff","out":{"hex":"#cfcfcfff","u16":[53121,53121,53121,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#000000ff","out":{"hex":"#e8c7c7ff","u16":[59716,51163,51163,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#000000ff","out":{"hex":"#cfcfcfff","u16":[53121,53121,53121,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#000000ff","out":{"hex":"#e8c7c7ff","u16":[59716,51163,51163,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#000000ff","out":{"hex":"#1f1f1fff","u16":[8079,8079,8079,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#000000ff","out":{"hex":"#331717ff","u16":[13009,5896,5896,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#000000ff","out":{"hex":"#555555ff","u16":[21935,21935,21935,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#000000ff","out":{"hex":"#893e3eff","u16":[35319,16007,16007,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#000000ff","out":{"hex":"#6c6c6cff","u16":[27667,27667,27667,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#000000ff","out":{"hex":"#ad4f4fff","u16":[44550,20190,20190,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#000000ff","out":{"hex":"#7d7d7dff","u16":[32240,32240,32240,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#000000ff","out":{"hex":"#ca5c5cff","u16":[51912,23527,23527,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#000000ff","out":{"hex":"#7d7d7dff","u16":[32240,32240,32240,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#000000ff","out":{"hex":"#ca5c5cff","u16":[51912,23527,23527,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#000000ff","out":{"hex":"#2b2b2bff","u16":[11072,11072,11072,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#000000ff","out":{"hex":"#451f1fff","u16":[17827,8079,8079,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#000000ff","out":{"hex":"#757575ff","u16":[30058,30058,30058,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#000000ff","out":{"hex":"#bc5555ff","u16":[48399,21935,21935,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#000000ff","out":{"hex":"#949494ff","u16":[37914,37914,37914,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#000000ff","out":{"hex":"#d27c7cff","u16":[53881,31924,31924,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#000000ff","out":{"hex":"#acacacff","u16":[44180,44180,44180,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#000000ff","out":{"hex":"#da9d9dff","u16":[56087,40225,40225,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#000000ff","out":{"hex":"#acacacff","u16":[44180,44180,44180,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#000000ff","out":{"hex":"#da9d9dff","u16":[56087,40225,40225,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#000000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#000000ff","out":{"hex":"#343434ff","u16":[13312,13312,13312,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#000000ff","out":{"hex":"#532626ff","u16":[21435,9715,9715,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#000000ff","out":{"hex":"#8d8d8dff","u16":[36141,36141,36141,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#000000ff","out":{"hex":"#cf7272ff","u16":[53312,29400,29400,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#000000ff","out":{"hex":"#b1b1b1ff","u16":[45587,45587,45587,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#000000ff","out":{"hex":"#dca3a3ff","u16":[56623,42000,42000,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#000000ff","out":{"hex":"#cfcfcfff","u16":[53121,53121,53121,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#000000ff","out":{"hex":"#e8c7c7ff","u16":[59716,51163,51163,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#000000ff","out":{"hex":"#cfcfcfff","u16":[53121,53121,53121,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#000000ff","out":{"hex":"#e8c7c7ff","u16":[59716,51163,51163,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#ffffffff","out":{"hex":"#fafafaff","u16":[64330,64330,64330,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#ffffffff","out":{"hex":"#fdfafaff","u16":[64936,64165,64165,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#ffffffff","out":{"hex":"#e6e6e6ff","u16":[59214,59214,59214,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#ffffffff","out":{"hex":"#f3e3e3ff","u16":[62470,58297,58297,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#ffffffff","out":{"hex":"#d6d6d6ff","u16":[54997,54997,54997,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#ffffffff","out":{"hex":"#ecd0d0ff","u16":[60542,53381,53381,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#ffffffff","out":{"hex":"#c4c4c4ff","u16":[50352,50352,50352,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#ffffffff","out":{"hex":"#e4babaff","u16":[58536,47850,47850,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#ffffffff","out":{"hex":"#c4c4c4ff","u16":[50352,50352,50352,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#ffffffff","out":{"hex":"#e4babaff","u16":[58536,47850,47850,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#ffffffff","out":{"hex":"#fdfdfdff","u16":[64936,64936,64936,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#ffffffff","out":{"hex":"#fefcfcff","u16":[65236,64855,64855,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#ffffffff","out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#ffffffff","out":{"hex":"#f9f1f1ff","u16":[64025,62043,62043,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#ffffffff","out":{"hex":"#ecececff","u16":[60542,60542,60542,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#ffffffff","out":{"hex":"#f6e9e9ff","u16":[63098,59829,59829,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#ffffffff","out":{"hex":"#e4e4e4ff","u16":[58536,58536,58536,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#ffffffff","out":{"hex":"#f2e0e0ff","u16":[62154,57512,57512,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#ffffffff","out":{"hex":"#e4e4e4ff","u16":[58536,58536,58536,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#ffffffff","out":{"hex":"#f2e0e0ff","u16":[62154,57512,57512,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#ffffffff","out":{"hex":"#fafafaff","u16":[64330,64330,64330,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#ffffffff","out":{"hex":"#fdfafaff","u16":[64936,64165,64165,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#ffffffff","out":{"hex":"#e6e6e6ff","u16":[59214,59214,59214,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#ffffffff","out":{"hex":"#f3e3e3ff","u16":[62470,58297,58297,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#ffffffff","out":{"hex":"#d6d6d6ff","u16":[54997,54997,54997,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#ffffffff","out":{"hex":"#ecd0d0ff","u16":[60542,53381,53381,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#ffffffff","out":{"hex":"#c4c4c4ff","u16":[50352,50352,50352,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#ffffffff","out":{"hex":"#e4babaff","u16":[58536,47850,47850,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#ffffffff","out":{"hex":"#c4c4c4ff","u16":[50352,50352,50352,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#ffffffff","out":{"hex":"#e4babaff","u16":[58536,47850,47850,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#ffffffff","out":{"hex":"#f8f8f8ff","u16":[63717,63717,63717,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#ffffffff","out":{"hex":"#fbf7f7ff","u16":[64634,63467,63467,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#ffffffff","out":{"hex":"#d9d9d9ff","u16":[55727,55727,55727,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#ffffffff","out":{"hex":"#edd3d3ff","u16":[60868,54237,54237,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#ffffffff","out":{"hex":"#bdbdbdff","u16":[48684,48684,48684,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#ffffffff","out":{"hex":"#e1b2b2ff","u16":[57849,45826,45826,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#ffffffff","out":{"hex":"#9c9c9cff","u16":[40134,40134,40134,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#ffffffff","out":{"hex":"#d58888ff","u16":[54628,34956,34956,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#ffffffff","out":{"hex":"#9c9c9cff","u16":[40134,40134,40134,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#ffffffff","out":{"hex":"#d58888ff","u16":[54628,34956,34956,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#ffffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#ffffffff","out":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#ffffffff","out":{"hex":"#f9f1f1ff","u16":[64025,62043,62043,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#ffffffff","out":{"hex":"#c1c1c1ff","u16":[49526,49526,49526,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#ffffffff","out":{"hex":"#e2b6b6ff","u16":[58194,46851,46851,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#ffffffff","out":{"hex":"#8d8d8dff","u16":[36141,36141,36141,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#ffffffff","out":{"hex":"#cf7272ff","u16":[53312,29400,29400,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#ffffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#ffffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#ffffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#ffffffff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#010101ff","out":{"hex":"#414141ff","u16":[16793,16793,16793,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#010101ff","out":{"hex":"#693030ff","u16":[27039,12254,12254,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#010101ff","out":{"hex":"#aeaeaeff","u16":[44655,44655,44655,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#010101ff","out":{"hex":"#db9f9fff","u16":[56266,40827,40827,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#010101ff","out":{"hex":"#dbdbdbff","u16":[56267,56267,56267,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#010101ff","out":{"hex":"#eed6d6ff","u16":[61112,54870,54870,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#010101ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#010101ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#010101ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#010101ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#010101ff","out":{"hex":"#343434ff","u16":[13313,13313,13313,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#010101ff","out":{"hex":"#532626ff","u16":[21437,9715,9715,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#010101ff","out":{"hex":"#8d8d8dff","u16":[36141,36141,36141,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#010101ff","out":{"hex":"#cf7272ff","u16":[53312,29401,29401,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#010101ff","out":{"hex":"#b1b1b1ff","u16":[45587,45587,45587,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#010101ff","out":{"hex":"#dca3a3ff","u16":[56623,42000,42000,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#010101ff","out":{"hex":"#cfcfcfff","u16":[53121,53121,53121,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#010101ff","out":{"hex":"#e8c7c7ff","u16":[59716,51163,51163,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#010101ff","out":{"hex":"#cfcfcfff","u16":[53121,53121,53121,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#010101ff","out":{"hex":"#e8c7c7ff","u16":[59716,51163,51163,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#010101ff","out":{"hex":"#1f1f1fff","u16":[8081,8081,8081,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#010101ff","out":{"hex":"#331717ff","u16":[13012,5897,5897,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#010101ff","out":{"hex":"#555555ff","u16":[21935,21935,21935,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#010101ff","out":{"hex":"#893e3eff","u16":[35320,16007,16007,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#010101ff","out":{"hex":"#6c6c6cff","u16":[27668,27668,27668,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#010101ff","out":{"hex":"#ad4f4fff","u16":[44550,20190,20190,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#010101ff","out":{"hex":"#7d7d7dff","u16":[32240,32240,32240,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#010101ff","out":{"hex":"#ca5c5cff","u16":[51912,23527,23527,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#010101ff","out":{"hex":"#7d7d7dff","u16":[32240,32240,32240,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#010101ff","out":{"hex":"#ca5c5cff","u16":[51912,23527,23527,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#010101ff","out":{"hex":"#2b2b2bff","u16":[11073,11073,11073,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#010101ff","out":{"hex":"#451f1fff","u16":[17829,8080,8080,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#010101ff","out":{"hex":"#757575ff","u16":[30058,30058,30058,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#010101ff","out":{"hex":"#bc5555ff","u16":[48400,21935,21935,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#010101ff","out":{"hex":"#949494ff","u16":[37914,37914,37914,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#010101ff","out":{"hex":"#d27c7cff","u16":[53881,31924,31924,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#010101ff","out":{"hex":"#acacacff","u16":[44180,44180,44180,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#010101ff","out":{"hex":"#da9d9dff","u16":[56087,40225,40225,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#010101ff","out":{"hex":"#acacacff","u16":[44180,44180,44180,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#010101ff","out":{"hex":"#da9d9dff","u16":[56087,40225,40225,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#010101ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#010101ff","out":{"hex":"#343434ff","u16":[13313,13313,13313,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#010101ff","out":{"hex":"#532626ff","u16":[21437,9715,9715,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#010101ff","out":{"hex":"#8d8d8dff","u16":[36141,36141,36141,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#010101ff","out":{"hex":"#cf7272ff","u16":[53312,29401,29401,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#010101ff","out":{"hex":"#b1b1b1ff","u16":[45587,45587,45587,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#010101ff","out":{"hex":"#dca3a3ff","u16":[56623,42000,42000,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#010101ff","out":{"hex":"#cfcfcfff","u16":[53121,53121,53121,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#010101ff","out":{"hex":"#e8c7c7ff","u16":[59716,51163,51163,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#010101ff","out":{"hex":"#cfcfcfff","u16":[53121,53121,53121,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#010101ff","out":{"hex":"#e8c7c7ff","u16":[59716,51163,51163,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#020202ff","out":{"hex":"#414141ff","u16":[16795,16795,16795,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#020202ff","out":{"hex":"#693030ff","u16":[27043,12256,12256,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#020202ff","out":{"hex":"#aeaeaeff","u16":[44656,44656,44656,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#020202ff","out":{"hex":"#db9f9fff","u16":[56267,40828,40828,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#020202ff","out":{"hex":"#dbdbdbff","u16":[56267,56267,56267,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#020202ff","out":{"hex":"#eed6d6ff","u16":[61112,54870,54870,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#020202ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#020202ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#020202ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#020202ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#020202ff","out":{"hex":"#343434ff","u16":[13317,13317,13317,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#020202ff","out":{"hex":"#532626ff","u16":[21443,9718,9718,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#020202ff","out":{"hex":"#8d8d8dff","u16":[36143,36143,36143,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#020202ff","out":{"hex":"#cf7272ff","u16":[53312,29402,29402,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#020202ff","out":{"hex":"#b1b1b1ff","u16":[45588,45588,45588,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#020202ff","out":{"hex":"#dca3a3ff","u16":[56623,42001,42001,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#020202ff","out":{"hex":"#cfcfcfff","u16":[53122,53122,53122,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#020202ff","out":{"hex":"#e8c7c7ff","u16":[59716,51164,51164,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#020202ff","out":{"hex":"#cfcfcfff","u16":[53122,53122,53122,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#020202ff","out":{"hex":"#e8c7c7ff","u16":[59716,51164,51164,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#020202ff","out":{"hex":"#1f1f1fff","u16":[8088,8088,8088,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#020202ff","out":{"hex":"#331717ff","u16":[13023,5902,5902,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#020202ff","out":{"hex":"#555555ff","u16":[21937,21937,21937,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#020202ff","out":{"hex":"#893e3eff","u16":[35323,16008,16008,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#020202ff","out":{"hex":"#6c6c6cff","u16":[27669,27669,27669,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#020202ff","out":{"hex":"#ad4f4fff","u16":[44553,20191,20191,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#020202ff","out":{"hex":"#7d7d7dff","u16":[32241,32241,32241,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#020202ff","out":{"hex":"#ca5c5cff","u16":[51914,23528,23528,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#020202ff","out":{"hex":"#7d7d7dff","u16":[32241,32241,32241,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#020202ff","out":{"hex":"#ca5c5cff","u16":[51914,23528,23528,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#020202ff","out":{"hex":"#2b2b2bff","u16":[11078,11078,11078,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#020202ff","out":{"hex":"#451f1fff","u16":[17837,8084,8084,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#020202ff","out":{"hex":"#757575ff","u16":[30060,30060,30060,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#020202ff","out":{"hex":"#bc5555ff","u16":[48402,21936,21936,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#020202ff","out":{"hex":"#949494ff","u16":[37915,37915,37915,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#020202ff","out":{"hex":"#d27c7cff","u16":[53881,31926,31926,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#020202ff","out":{"hex":"#acacacff","u16":[44181,44181,44181,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#020202ff","out":{"hex":"#da9d9dff","u16":[56088,40226,40226,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#020202ff","out":{"hex":"#acacacff","u16":[44181,44181,44181,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#020202ff","out":{"hex":"#da9d9dff","u16":[56088,40226,40226,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#020202ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#020202ff","out":{"hex":"#343434ff","u16":[13317,13317,13317,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#020202ff","out":{"hex":"#532626ff","u16":[21443,9718,9718,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#020202ff","out":{"hex":"#8d8d8dff","u16":[36143,36143,36143,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#020202ff","out":{"hex":"#cf7272ff","u16":[53312,29402,29402,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#020202ff","out":{"hex":"#b1b1b1ff","u16":[45588,45588,45588,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#020202ff","out":{"hex":"#dca3a3ff","u16":[56623,42001,42001,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#020202ff","out":{"hex":"#cfcfcfff","u16":[53122,53122,53122,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#020202ff","out":{"hex":"#e8c7c7ff","u16":[59716,51164,51164,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#020202ff","out":{"hex":"#cfcfcfff","u16":[53122,53122,53122,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#020202ff","out":{"hex":"#e8c7c7ff","u16":[59716,51164,51164,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#040404ff","out":{"hex":"#414141ff","u16":[16808,16808,16808,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#040404ff","out":{"hex":"#693030ff","u16":[27064,12266,12266,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#040404ff","out":{"hex":"#aeaeaeff","u16":[44660,44660,44660,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#040404ff","out":{"hex":"#db9f9fff","u16":[56268,40833,40833,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#040404ff","out":{"hex":"#dbdbdbff","u16":[56270,56270,56270,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#040404ff","out":{"hex":"#eed6d6ff","u16":[61114,54874,54874,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#040404ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#040404ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#040404ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#040404ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#040404ff","out":{"hex":"#343434ff","u16":[13334,13334,13334,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#040404ff","out":{"hex":"#542626ff","u16":[21470,9730,9730,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#040404ff","out":{"hex":"#8d8d8dff","u16":[36148,36148,36148,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#040404ff","out":{"hex":"#cf7272ff","u16":[53314,29410,29410,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#040404ff","out":{"hex":"#b1b1b1ff","u16":[45592,45592,45592,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#040404ff","out":{"hex":"#dca3a3ff","u16":[56625,42006,42006,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#040404ff","out":{"hex":"#cfcfcfff","u16":[53125,53125,53125,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#040404ff","out":{"hex":"#e8c7c7ff","u16":[59718,51168,51168,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#040404ff","out":{"hex":"#cfcfcfff","u16":[53125,53125,53125,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#040404ff","out":{"hex":"#e8c7c7ff","u16":[59718,51168,51168,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#040404ff","out":{"hex":"#202020ff","u16":[8119,8119,8119,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#040404ff","out":{"hex":"#331717ff","u16":[13073,5925,5925,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#040404ff","out":{"hex":"#555555ff","u16":[21946,21946,21946,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#040404ff","out":{"hex":"#8a3e3eff","u16":[35338,16015,16015,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#040404ff","out":{"hex":"#6c6c6cff","u16":[27676,27676,27676,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#040404ff","out":{"hex":"#ad4f4fff","u16":[44564,20197,20197,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#040404ff","out":{"hex":"#7d7d7dff","u16":[32247,32247,32247,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#040404ff","out":{"hex":"#ca5c5cff","u16":[51924,23532,23532,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#040404ff","out":{"hex":"#7d7d7dff","u16":[32247,32247,32247,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#040404ff","out":{"hex":"#ca5c5cff","u16":[51924,23532,23532,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#040404ff","out":{"hex":"#2b2b2bff","u16":[11099,11099,11099,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#040404ff","out":{"hex":"#462020ff","u16":[17871,8099,8099,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#040404ff","out":{"hex":"#757575ff","u16":[30066,30066,30066,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#040404ff","out":{"hex":"#bc5555ff","u16":[48412,21941,21941,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#040404ff","out":{"hex":"#949494ff","u16":[37920,37920,37920,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#040404ff","out":{"hex":"#d27c7cff","u16":[53883,31932,31932,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#040404ff","out":{"hex":"#acacacff","u16":[44185,44185,44185,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#040404ff","out":{"hex":"#da9d9dff","u16":[56089,40231,40231,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#040404ff","out":{"hex":"#acacacff","u16":[44185,44185,44185,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#040404ff","out":{"hex":"#da9d9dff","u16":[56089,40231,40231,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#040404ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#040404ff","out":{"hex":"#343434ff","u16":[13334,13334,13334,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#040404ff","out":{"hex":"#542626ff","u16":[21470,9730,9730,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#040404ff","out":{"hex":"#8d8d8dff","u16":[36148,36148,36148,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#040404ff","out":{"hex":"#cf7272ff","u16":[53314,29410,29410,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#040404ff","out":{"hex":"#b1b1b1ff","u16":[45592,45592,45592,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#040404ff","out":{"hex":"#dca3a3ff","u16":[56625,42006,42006,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#040404ff","out":{"hex":"#cfcfcfff","u16":[53125,53125,53125,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#040404ff","out":{"hex":"#e8c7c7ff","u16":[59718,51168,51168,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#040404ff","out":{"hex":"#cfcfcfff","u16":[53125,53125,53125,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#040404ff","out":{"hex":"#e8c7c7ff","u16":[59718,51168,51168,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#080808ff","out":{"hex":"#424242ff","u16":[16867,16867,16867,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#080808ff","out":{"hex":"#6a3030ff","u16":[27158,12308,12308,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#080808ff","out":{"hex":"#aeaeaeff","u16":[44678,44678,44678,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#080808ff","out":{"hex":"#db9f9fff","u16":[56275,40856,40856,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#080808ff","out":{"hex":"#dbdbdbff","u16":[56284,56284,56284,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#080808ff","out":{"hex":"#eed6d6ff","u16":[61120,54890,54890,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#080808ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#080808ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#080808ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#080808ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#080808ff","out":{"hex":"#343434ff","u16":[13411,13411,13411,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#080808ff","out":{"hex":"#542626ff","u16":[21595,9787,9787,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#080808ff","out":{"hex":"#8d8d8dff","u16":[36171,36171,36171,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#080808ff","out":{"hex":"#cf7373ff","u16":[53321,29444,29444,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#080808ff","out":{"hex":"#b1b1b1ff","u16":[45610,45610,45610,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#080808ff","out":{"hex":"#dca4a4ff","u16":[56631,42028,42028,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#080808ff","out":{"hex":"#cfcfcfff","u16":[53140,53140,53140,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#080808ff","out":{"hex":"#e8c7c7ff","u16":[59724,51186,51186,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#080808ff","out":{"hex":"#cfcfcfff","u16":[53140,53140,53140,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#080808ff","out":{"hex":"#e8c7c7ff","u16":[59724,51186,51186,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#080808ff","out":{"hex":"#202020ff","u16":[8258,8258,8258,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#080808ff","out":{"hex":"#341717ff","u16":[13297,6026,6026,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#080808ff","out":{"hex":"#565656ff","u16":[21989,21989,21989,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#080808ff","out":{"hex":"#8a3e3eff","u16":[35406,16046,16046,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#080808ff","out":{"hex":"#6c6c6cff","u16":[27709,27709,27709,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#080808ff","out":{"hex":"#ae4f4fff","u16":[44616,20220,20220,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#080808ff","out":{"hex":"#7e7e7eff","u16":[32274,32274,32274,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#080808ff","out":{"hex":"#ca5c5cff","u16":[51967,23552,23552,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#080808ff","out":{"hex":"#7e7e7eff","u16":[32274,32274,32274,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#080808ff","out":{"hex":"#ca5c5cff","u16":[51967,23552,23552,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#080808ff","out":{"hex":"#2c2c2cff","u16":[11195,11195,11195,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#080808ff","out":{"hex":"#462020ff","u16":[18026,8169,8169,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#080808ff","out":{"hex":"#757575ff","u16":[30095,30095,30095,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#080808ff","out":{"hex":"#bd5555ff","u16":[48459,21962,21962,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#080808ff","out":{"hex":"#949494ff","u16":[37942,37942,37942,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#080808ff","out":{"hex":"#d27c7cff","u16":[53890,31963,31963,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#080808ff","out":{"hex":"#acacacff","u16":[44203,44203,44203,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#080808ff","out":{"hex":"#da9d9dff","u16":[56096,40255,40255,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#080808ff","out":{"hex":"#acacacff","u16":[44203,44203,44203,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#080808ff","out":{"hex":"#da9d9dff","u16":[56096,40255,40255,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#080808ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#080808ff","out":{"hex":"#343434ff","u16":[13411,13411,13411,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#080808ff","out":{"hex":"#542626ff","u16":[21595,9787,9787,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#080808ff","out":{"hex":"#8d8d8dff","u16":[36171,36171,36171,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#080808ff","out":{"hex":"#cf7373ff","u16":[53321,29444,29444,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#080808ff","out":{"hex":"#b1b1b1ff","u16":[45610,45610,45610,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#080808ff","out":{"hex":"#dca4a4ff","u16":[56631,42028,42028,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#080808ff","out":{"hex":"#cfcfcfff","u16":[53140,53140,53140,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#080808ff","out":{"hex":"#e8c7c7ff","u16":[59724,51186,51186,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#080808ff","out":{"hex":"#cfcfcfff","u16":[53140,53140,53140,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#080808ff","out":{"hex":"#e8c7c7ff","u16":[59724,51186,51186,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#101010ff","out":{"hex":"#434343ff","u16":[17133,17133,17133,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#101010ff","out":{"hex":"#6b3131ff","u16":[27587,12503,12503,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#101010ff","out":{"hex":"#aeaeaeff","u16":[44761,44761,44761,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#101010ff","out":{"hex":"#db9f9fff","u16":[56307,40961,40961,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#101010ff","out":{"hex":"#dbdbdbff","u16":[56347,56347,56347,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#101010ff","out":{"hex":"#eed6d6ff","u16":[61148,54964,54964,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#101010ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#101010ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#101010ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#101010ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#101010ff","out":{"hex":"#363636ff","u16":[13760,13760,13760,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#101010ff","out":{"hex":"#562727ff","u16":[22156,10041,10041,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#101010ff","out":{"hex":"#8d8d8dff","u16":[36279,36279,36279,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#101010ff","out":{"hex":"#d07373ff","u16":[53355,29600,29600,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#101010ff","out":{"hex":"#b2b2b2ff","u16":[45691,45691,45691,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#101010ff","out":{"hex":"#dca4a4ff","u16":[56663,42130,42130,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#101010ff","out":{"hex":"#cfcfcfff","u16":[53207,53207,53207,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#101010ff","out":{"hex":"#e9c7c7ff","u16":[59754,51266,51266,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#101010ff","out":{"hex":"#cfcfcfff","u16":[53207,53207,53207,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#101010ff","out":{"hex":"#e9c7c7ff","u16":[59754,51266,51266,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#101010ff","out":{"hex":"#222222ff","u16":[8864,8864,8864,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#101010ff","out":{"hex":"#381919ff","u16":[14273,6469,6469,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#101010ff","out":{"hex":"#565656ff","u16":[22184,22184,22184,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#101010ff","out":{"hex":"#8b3f3fff","u16":[35720,16188,16188,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#101010ff","out":{"hex":"#6c6c6cff","u16":[27856,27856,27856,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#101010ff","out":{"hex":"#af4f4fff","u16":[44854,20328,20328,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#101010ff","out":{"hex":"#7e7e7eff","u16":[32397,32397,32397,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#101010ff","out":{"hex":"#cb5c5cff","u16":[52165,23642,23642,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#101010ff","out":{"hex":"#7e7e7eff","u16":[32397,32397,32397,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#101010ff","out":{"hex":"#cb5c5cff","u16":[52165,23642,23642,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#101010ff","out":{"hex":"#2d2d2dff","u16":[11625,11625,11625,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#101010ff","out":{"hex":"#492121ff","u16":[18718,8483,8483,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#101010ff","out":{"hex":"#767676ff","u16":[30229,30229,30229,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#101010ff","out":{"hex":"#bd5656ff","u16":[48675,22059,22059,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#101010ff","out":{"hex":"#949494ff","u16":[38044,38044,38044,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#101010ff","out":{"hex":"#d27d7dff","u16":[53923,32105,32105,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#101010ff","out":{"hex":"#acacacff","u16":[44288,44288,44288,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#101010ff","out":{"hex":"#da9d9dff","u16":[56128,40362,40362,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#101010ff","out":{"hex":"#acacacff","u16":[44288,44288,44288,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#101010ff","out":{"hex":"#da9d9dff","u16":[56128,40362,40362,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#101010ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#101010ff","out":{"hex":"#363636ff","u16":[13760,13760,13760,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#101010ff","out":{"hex":"#562727ff","u16":[22156,10041,10041,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#101010ff","out":{"hex":"#8d8d8dff","u16":[36279,36279,36279,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#101010ff","out":{"hex":"#d07373ff","u16":[53355,29600,29600,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#101010ff","out":{"hex":"#b2b2b2ff","u16":[45691,45691,45691,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#101010ff","out":{"hex":"#dca4a4ff","u16":[56663,42130,42130,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#101010ff","out":{"hex":"#cfcfcfff","u16":[53207,53207,53207,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#101010ff","out":{"hex":"#e9c7c7ff","u16":[59754,51266,51266,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#101010ff","out":{"hex":"#cfcfcfff","u16":[53207,53207,53207,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#101010ff","out":{"hex":"#e9c7c7ff","u16":[59754,51266,51266,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#202020ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#202020ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#202020ff","out":{"hex":"#2f2f2fff","u16":[12103,12103,12103,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#202020ff","out":{"hex":"#4c2222ff","u16":[19487,8832,8832,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#202020ff","out":{"hex":"#3c3c3cff","u16":[15351,15351,15351,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#202020ff","out":{"hex":"#602c2cff","u16":[24717,11202,11202,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#202020ff","out":{"hex":"#434343ff","u16":[17328,17328,17328,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#202020ff","out":{"hex":"#6d3131ff","u16":[27901,12645,12645,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#202020ff","out":{"hex":"#4a4a4aff","u16":[19066,19066,19066,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#202020ff","out":{"hex":"#773636ff","u16":[30699,13913,13913,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#202020ff","out":{"hex":"#4a4a4aff","u16":[19066,19066,19066,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#202020ff","out":{"hex":"#773636ff","u16":[30699,13913,13913,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#202020ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#202020ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#202020ff","out":{"hex":"#282828ff","u16":[10369,10369,10369,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#202020ff","out":{"hex":"#411d1dff","u16":[16695,7566,7566,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#202020ff","out":{"hex":"#303030ff","u16":[12388,12388,12388,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#202020ff","out":{"hex":"#4e2323ff","u16":[19948,9040,9040,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#202020ff","out":{"hex":"#353535ff","u16":[13676,13676,13676,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#202020ff","out":{"hex":"#562727ff","u16":[22021,9980,9980,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#202020ff","out":{"hex":"#3a3a3aff","u16":[14832,14832,14832,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#202020ff","out":{"hex":"#5d2a2aff","u16":[23882,10824,10824,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#202020ff","out":{"hex":"#3a3a3aff","u16":[14832,14832,14832,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#202020ff","out":{"hex":"#5d2a2aff","u16":[23882,10824,10824,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#202020ff","out":{"hex":"#1f1f1fff","u16":[7956,7956,7956,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#202020ff","out":{"hex":"#321717ff","u16":[12810,5806,5806,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#202020ff","out":{"hex":"#1d1d1dff","u16":[7459,7459,7459,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#202020ff","out":{"hex":"#2f1515ff","u16":[12010,5443,5443,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#202020ff","out":{"hex":"#1c1c1cff","u16":[7248,7248,7248,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#202020ff","out":{"hex":"#2d1515ff","u16":[11671,5289,5289,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#202020ff","out":{"hex":"#1c1c1cff","u16":[7086,7086,7086,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#202020ff","out":{"hex":"#2c1414ff","u16":[11409,5171,5171,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#202020ff","out":{"hex":"#1b1b1bff","u16":[6918,6918,6918,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#202020ff","out":{"hex":"#2b1414ff","u16":[11140,5048,5048,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#202020ff","out":{"hex":"#1b1b1bff","u16":[6918,6918,6918,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#202020ff","out":{"hex":"#2b1414ff","u16":[11140,5048,5048,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#202020ff","out":{"hex":"#1d1d1dff","u16":[7431,7431,7431,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#202020ff","out":{"hex":"#2f1515ff","u16":[11965,5423,5423,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#202020ff","out":{"hex":"#161616ff","u16":[5721,5721,5721,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#202020ff","out":{"hex":"#241010ff","u16":[9211,4175,4175,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#202020ff","out":{"hex":"#131313ff","u16":[4829,4829,4829,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#202020ff","out":{"hex":"#1e0e0eff","u16":[7776,3524,3524,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#202020ff","out":{"hex":"#101010ff","u16":[4002,4002,4002,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#202020ff","out":{"hex":"#190b0bff","u16":[6443,2920,2920,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#202020ff","out":{"hex":"#0b0b0bff","u16":[2888,2888,2888,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#202020ff","out":{"hex":"#120808ff","u16":[4650,2107,2107,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#202020ff","out":{"hex":"#0b0b0bff","u16":[2888,2888,2888,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#202020ff","out":{"hex":"#120808ff","u16":[4650,2107,2107,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#202020ff","out":{"hex":"#151515ff","u16":[5407,5407,5407,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#202020ff","out":{"hex":"#220f0fff","u16":[8707,3946,3946,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#202020ff","out":{"hex":"#101010ff","u16":[4163,4163,4163,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#202020ff","out":{"hex":"#1a0c0cff","u16":[6703,3038,3038,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#202020ff","out":{"hex":"#0e0e0eff","u16":[3514,3514,3514,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#202020ff","out":{"hex":"#160a0aff","u16":[5658,2564,2564,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#202020ff","out":{"hex":"#0b0b0bff","u16":[2912,2912,2912,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#202020ff","out":{"hex":"#120808ff","u16":[4688,2125,2125,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#202020ff","out":{"hex":"#080808ff","u16":[2102,2102,2102,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#202020ff","out":{"hex":"#0d0606ff","u16":[3384,1533,1533,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#202020ff","out":{"hex":"#080808ff","u16":[2102,2102,2102,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#202020ff","out":{"hex":"#0d0606ff","u16":[3384,1533,1533,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#404040ff","out":{"hex":"#1f1f1fff","u16":[7945,7945,7945,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#404040ff","out":{"hex":"#321717ff","u16":[12793,5798,5798,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#404040ff","out":{"hex":"#4b4b4bff","u16":[19161,19161,19161,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#404040ff","out":{"hex":"#783636ff","u16":[30852,13982,13982,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#404040ff","out":{"hex":"#555555ff","u16":[21904,21904,21904,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#404040ff","out":{"hex":"#893e3eff","u16":[35270,15985,15985,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#404040ff","out":{"hex":"#5c5c5cff","u16":[23718,23718,23718,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#404040ff","out":{"hex":"#954343ff","u16":[38191,17308,17308,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#404040ff","out":{"hex":"#636363ff","u16":[25379,25379,25379,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#404040ff","out":{"hex":"#9f4848ff","u16":[40865,18520,18520,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#404040ff","out":{"hex":"#636363ff","u16":[25379,25379,25379,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#404040ff","out":{"hex":"#9f4848ff","u16":[40865,18520,18520,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#404040ff","out":{"hex":"#333333ff","u16":[13179,13179,13179,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#404040ff","out":{"hex":"#532525ff","u16":[21221,9617,9617,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#404040ff","out":{"hex":"#454545ff","u16":[17821,17821,17821,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#404040ff","out":{"hex":"#703333ff","u16":[28695,13005,13005,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#404040ff","out":{"hex":"#4b4b4bff","u16":[19317,19317,19317,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#404040ff","out":{"hex":"#793737ff","u16":[31104,14096,14096,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#404040ff","out":{"hex":"#4f4f4fff","u16":[20354,20354,20354,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#404040ff","out":{"hex":"#803a3aff","u16":[32773,14853,14853,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#404040ff","out":{"hex":"#535353ff","u16":[21331,21331,21331,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#404040ff","out":{"hex":"#863d3dff","u16":[34346,15566,15566,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#404040ff","out":{"hex":"#535353ff","u16":[21331,21331,21331,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#404040ff","out":{"hex":"#863d3dff","u16":[34346,15566,15566,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#404040ff","out":{"hex":"#3e3e3eff","u16":[15903,15903,15903,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#404040ff","out":{"hex":"#642d2dff","u16":[25607,11605,11605,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#404040ff","out":{"hex":"#3a3a3aff","u16":[14892,14892,14892,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#404040ff","out":{"hex":"#5d2a2aff","u16":[23978,10867,10867,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#404040ff","out":{"hex":"#383838ff","u16":[14463,14463,14463,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#404040ff","out":{"hex":"#5b2929ff","u16":[23288,10554,10554,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#404040ff","out":{"hex":"#373737ff","u16":[14131,14131,14131,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#404040ff","out":{"hex":"#592828ff","u16":[22754,10312,10312,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#404040ff","out":{"hex":"#363636ff","u16":[13790,13790,13790,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#404040ff","out":{"hex":"#562727ff","u16":[22204,10063,10063,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#404040ff","out":{"hex":"#363636ff","u16":[13790,13790,13790,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#404040ff","out":{"hex":"#562727ff","u16":[22204,10063,10063,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#404040ff","out":{"hex":"#3a3a3aff","u16":[14862,14862,14862,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#404040ff","out":{"hex":"#5d2a2aff","u16":[23930,10845,10845,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#404040ff","out":{"hex":"#2d2d2dff","u16":[11441,11441,11441,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#404040ff","out":{"hex":"#482020ff","u16":[18423,8349,8349,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#404040ff","out":{"hex":"#262626ff","u16":[9659,9659,9659,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#404040ff","out":{"hex":"#3d1b1bff","u16":[15552,7048,7048,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#404040ff","out":{"hex":"#1f1f1fff","u16":[8003,8003,8003,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#404040ff","out":{"hex":"#321717ff","u16":[12887,5840,5840,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#404040ff","out":{"hex":"#161616ff","u16":[5775,5775,5775,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#404040ff","out":{"hex":"#241010ff","u16":[9299,4214,4214,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#404040ff","out":{"hex":"#161616ff","u16":[5775,5775,5775,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#404040ff","out":{"hex":"#241010ff","u16":[9299,4214,4214,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#404040ff","out":{"hex":"#2a2a2aff","u16":[10703,10703,10703,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#404040ff","out":{"hex":"#431e1eff","u16":[17233,7810,7810,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#404040ff","out":{"hex":"#202020ff","u16":[8239,8239,8239,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#404040ff","out":{"hex":"#341717ff","u16":[13267,6013,6013,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#404040ff","out":{"hex":"#1b1b1bff","u16":[6956,6956,6956,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#404040ff","out":{"hex":"#2c1414ff","u16":[11200,5076,5076,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#404040ff","out":{"hex":"#161616ff","u16":[5763,5763,5763,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#404040ff","out":{"hex":"#241010ff","u16":[9281,4206,4206,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#404040ff","out":{"hex":"#101010ff","u16":[4159,4159,4159,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#404040ff","out":{"hex":"#1a0c0cff","u16":[6697,3035,3035,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#404040ff","out":{"hex":"#101010ff","u16":[4159,4159,4159,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#404040ff","out":{"hex":"#1a0c0cff","u16":[6697,3035,3035,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#7f7f7fff","out":{"hex":"#656565ff","u16":[26054,26054,26054,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#7f7f7fff","out":{"hex":"#a34a4aff","u16":[41952,19013,19013,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#7f7f7fff","out":{"hex":"#8a8a8aff","u16":[35398,35398,35398,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#7f7f7fff","out":{"hex":"#cf6e6eff","u16":[53081,28308,28308,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#7f7f7fff","out":{"hex":"#959595ff","u16":[38401,38401,38401,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#7f7f7fff","out":{"hex":"#d27f7fff","u16":[54041,32599,32599,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#7f7f7fff","out":{"hex":"#9e9e9eff","u16":[40480,40480,40480,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#7f7f7fff","out":{"hex":"#d58a8aff","u16":[54748,35418,35418,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#7f7f7fff","out":{"hex":"#a5a5a5ff","u16":[42438,42438,42438,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#7f7f7fff","out":{"hex":"#d89494ff","u16":[55444,37991,37991,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#7f7f7fff","out":{"hex":"#a5a5a5ff","u16":[42438,42438,42438,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#7f7f7fff","out":{"hex":"#d89494ff","u16":[55444,37991,37991,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#7f7f7fff","out":{"hex":"#757575ff","u16":[30055,30055,30055,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#7f7f7fff","out":{"hex":"#bc5555ff","u16":[48395,21933,21933,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#7f7f7fff","out":{"hex":"#848484ff","u16":[33843,33843,33843,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#7f7f7fff","out":{"hex":"#cd6565ff","u16":[52613,25944,25944,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#7f7f7fff","out":{"hex":"#898989ff","u16":[35223,35223,35223,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#7f7f7fff","out":{"hex":"#ce6d6dff","u16":[53028,28049,28049,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#7f7f7fff","out":{"hex":"#8d8d8dff","u16":[36217,36217,36217,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#7f7f7fff","out":{"hex":"#d07373ff","u16":[53336,29511,29511,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#7f7f7fff","out":{"hex":"#919191ff","u16":[37180,37180,37180,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#7f7f7fff","out":{"hex":"#d17878ff","u16":[53642,30891,30891,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#7f7f7fff","out":{"hex":"#919191ff","u16":[37180,37180,37180,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#7f7f7fff","out":{"hex":"#d17878ff","u16":[53642,30891,30891,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#7f7f7fff","out":{"hex":"#7a7a7aff","u16":[31480,31480,31480,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#7f7f7fff","out":{"hex":"#c55959ff","u16":[50688,22972,22972,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#7f7f7fff","out":{"hex":"#727272ff","u16":[29318,29318,29318,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#7f7f7fff","out":{"hex":"#b85353ff","u16":[47207,21394,21394,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#7f7f7fff","out":{"hex":"#6e6e6eff","u16":[28397,28397,28397,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#7f7f7fff","out":{"hex":"#b25151ff","u16":[45724,20722,20722,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#7f7f7fff","out":{"hex":"#6c6c6cff","u16":[27682,27682,27682,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#7f7f7fff","out":{"hex":"#ad4f4fff","u16":[44573,20201,20201,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#7f7f7fff","out":{"hex":"#696969ff","u16":[26945,26945,26945,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#7f7f7fff","out":{"hex":"#a94d4dff","u16":[43386,19663,19663,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#7f7f7fff","out":{"hex":"#696969ff","u16":[26945,26945,26945,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#7f7f7fff","out":{"hex":"#a94d4dff","u16":[43386,19663,19663,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#7f7f7fff","out":{"hex":"#737373ff","u16":[29491,29491,29491,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#7f7f7fff","out":{"hex":"#b95454ff","u16":[47486,21521,21521,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#7f7f7fff","out":{"hex":"#585858ff","u16":[22704,22704,22704,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#7f7f7fff","out":{"hex":"#8e4040ff","u16":[36558,16568,16568,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#7f7f7fff","out":{"hex":"#4b4b4bff","u16":[19166,19166,19166,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#7f7f7fff","out":{"hex":"#783636ff","u16":[30861,13986,13986,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#7f7f7fff","out":{"hex":"#3e3e3eff","u16":[15882,15882,15882,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#7f7f7fff","out":{"hex":"#642d2dff","u16":[25572,11590,11590,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#7f7f7fff","out":{"hex":"#2d2d2dff","u16":[11460,11460,11460,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#7f7f7fff","out":{"hex":"#482121ff","u16":[18453,8363,8363,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#7f7f7fff","out":{"hex":"#2d2d2dff","u16":[11460,11460,11460,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#7f7f7fff","out":{"hex":"#482121ff","u16":[18453,8363,8363,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#7f7f7fff","out":{"hex":"#4f4f4fff","u16":[20206,20206,20206,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#7f7f7fff","out":{"hex":"#7f3939ff","u16":[32536,14746,14746,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#7f7f7fff","out":{"hex":"#3d3d3dff","u16":[15556,15556,15556,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#7f7f7fff","out":{"hex":"#612c2cff","u16":[25049,11352,11352,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#7f7f7fff","out":{"hex":"#333333ff","u16":[13132,13132,13132,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#7f7f7fff","out":{"hex":"#522525ff","u16":[21145,9583,9583,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#7f7f7fff","out":{"hex":"#2a2a2aff","u16":[10882,10882,10882,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#7f7f7fff","out":{"hex":"#441f1fff","u16":[17521,7941,7941,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#7f7f7fff","out":{"hex":"#1f1f1fff","u16":[7852,7852,7852,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#7f7f7fff","out":{"hex":"#311616ff","u16":[12643,5730,5730,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#7f7f7fff","out":{"hex":"#1f1f1fff","u16":[7852,7852,7852,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#7f7f7fff","out":{"hex":"#311616ff","u16":[12643,5730,5730,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#808080ff","out":{"hex":"#666666ff","u16":[26298,26298,26298,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#808080ff","out":{"hex":"#a54b4bff","u16":[42345,19191,19191,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#808080ff","out":{"hex":"#8b8b8bff","u16":[35663,35663,35663,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#808080ff","out":{"hex":"#cf7070ff","u16":[53163,28701,28701,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#808080ff","out":{"hex":"#969696ff","u16":[38676,38676,38676,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#808080ff","out":{"hex":"#d38080ff","u16":[54133,32979,32979,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#808080ff","out":{"hex":"#9f9f9fff","u16":[40763,40763,40763,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#808080ff","out":{"hex":"#d58b8bff","u16":[54847,35795,35795,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#808080ff","out":{"hex":"#a6a6a6ff","u16":[42729,42729,42729,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#808080ff","out":{"hex":"#d89595ff","u16":[55550,38367,38367,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#808080ff","out":{"hex":"#a6a6a6ff","u16":[42729,42729,42729,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#808080ff","out":{"hex":"#d89595ff","u16":[55550,38367,38367,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#808080ff","out":{"hex":"#767676ff","u16":[30314,30314,30314,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#808080ff","out":{"hex":"#be5656ff","u16":[48812,22122,22122,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#808080ff","out":{"hex":"#858585ff","u16":[34100,34100,34100,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#808080ff","out":{"hex":"#cd6767ff","u16":[52689,26343,26343,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#808080ff","out":{"hex":"#8a8a8aff","u16":[35480,35480,35480,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#808080ff","out":{"hex":"#cf6f6fff","u16":[53107,28431,28431,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#808080ff","out":{"hex":"#8e8e8eff","u16":[36475,36475,36475,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#808080ff","out":{"hex":"#d07474ff","u16":[53417,29883,29883,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#808080ff","out":{"hex":"#929292ff","u16":[37438,37438,37438,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#808080ff","out":{"hex":"#d17a7aff","u16":[53725,31256,31256,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#808080ff","out":{"hex":"#929292ff","u16":[37438,37438,37438,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#808080ff","out":{"hex":"#d17a7aff","u16":[53725,31256,31256,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#808080ff","out":{"hex":"#7b7b7bff","u16":[31726,31726,31726,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#808080ff","out":{"hex":"#c75a5aff","u16":[51084,23152,23152,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#808080ff","out":{"hex":"#737373ff","u16":[29543,29543,29543,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#808080ff","out":{"hex":"#b95454ff","u16":[47570,21559,21559,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#808080ff","out":{"hex":"#6f6f6fff","u16":[28614,28614,28614,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#808080ff","out":{"hex":"#b35151ff","u16":[46073,20881,20881,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#808080ff","out":{"hex":"#6d6d6dff","u16":[27892,27892,27892,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#808080ff","out":{"hex":"#af4f4fff","u16":[44911,20354,20354,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#808080ff","out":{"hex":"#6a6a6aff","u16":[27147,27147,27147,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#808080ff","out":{"hex":"#aa4d4dff","u16":[43712,19810,19810,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#808080ff","out":{"hex":"#6a6a6aff","u16":[27147,27147,27147,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#808080ff","out":{"hex":"#aa4d4dff","u16":[43712,19810,19810,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#808080ff","out":{"hex":"#747474ff","u16":[29723,29723,29723,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#808080ff","out":{"hex":"#ba5454ff","u16":[47859,21690,21690,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#808080ff","out":{"hex":"#595959ff","u16":[22883,22883,22883,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#808080ff","out":{"hex":"#8f4141ff","u16":[36846,16699,16699,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#808080ff","out":{"hex":"#4b4b4bff","u16":[19317,19317,19317,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#808080ff","out":{"hex":"#793737ff","u16":[31104,14097,14097,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#808080ff","out":{"hex":"#3e3e3eff","u16":[16007,16007,16007,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#808080ff","out":{"hex":"#642d2dff","u16":[25774,11681,11681,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#808080ff","out":{"hex":"#2d2d2dff","u16":[11550,11550,11550,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#808080ff","out":{"hex":"#482121ff","u16":[18598,8429,8429,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#808080ff","out":{"hex":"#2d2d2dff","u16":[11550,11550,11550,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#808080ff","out":{"hex":"#482121ff","u16":[18598,8429,8429,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#808080ff","out":{"hex":"#4f4f4fff","u16":[20341,20341,20341,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#808080ff","out":{"hex":"#7f3a3aff","u16":[32753,14844,14844,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#808080ff","out":{"hex":"#3d3d3dff","u16":[15660,15660,15660,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#808080ff","out":{"hex":"#622c2cff","u16":[25216,11428,11428,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#808080ff","out":{"hex":"#333333ff","u16":[13220,13220,13220,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#808080ff","out":{"hex":"#532626ff","u16":[21287,9648,9648,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#808080ff","out":{"hex":"#2b2b2bff","u16":[10955,10955,10955,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#808080ff","out":{"hex":"#451f1fff","u16":[17639,7994,7994,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#808080ff","out":{"hex":"#1f1f1fff","u16":[7904,7904,7904,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#808080ff","out":{"hex":"#321616ff","u16":[12728,5769,5769,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#808080ff","out":{"hex":"#1f1f1fff","u16":[7904,7904,7904,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#808080ff","out":{"hex":"#321616ff","u16":[12728,5769,5769,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#818181ff","out":{"hex":"#676767ff","u16":[26542,26542,26542,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#818181ff","out":{"hex":"#a64b4bff","u16":[42737,19369,19369,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#818181ff","out":{"hex":"#8c8c8cff","u16":[35928,35928,35928,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#818181ff","out":{"hex":"#cf7171ff","u16":[53245,29090,29090,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#818181ff","out":{"hex":"#989898ff","u16":[38952,38952,38952,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#818181ff","out":{"hex":"#d38282ff","u16":[54225,33357,33357,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#818181ff","out":{"hex":"#a0a0a0ff","u16":[41047,41047,41047,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#818181ff","out":{"hex":"#d68d8dff","u16":[54947,36170,36170,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#818181ff","out":{"hex":"#a7a7a7ff","u16":[43020,43020,43020,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#818181ff","out":{"hex":"#d99797ff","u16":[55657,38742,38742,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#818181ff","out":{"hex":"#a7a7a7ff","u16":[43020,43020,43020,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#818181ff","out":{"hex":"#d99797ff","u16":[55657,38742,38742,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#818181ff","out":{"hex":"#777777ff","u16":[30573,30573,30573,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#818181ff","out":{"hex":"#c05757ff","u16":[49229,22311,22311,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#818181ff","out":{"hex":"#868686ff","u16":[34357,34357,34357,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#818181ff","out":{"hex":"#cd6868ff","u16":[52766,26738,26738,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#818181ff","out":{"hex":"#8b8b8bff","u16":[35737,35737,35737,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#818181ff","out":{"hex":"#cf7070ff","u16":[53186,28810,28810,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#818181ff","out":{"hex":"#8f8f8fff","u16":[36732,36732,36732,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#818181ff","out":{"hex":"#d07676ff","u16":[53499,30253,30253,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#818181ff","out":{"hex":"#939393ff","u16":[37696,37696,37696,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#818181ff","out":{"hex":"#d17b7bff","u16":[53809,31619,31619,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#818181ff","out":{"hex":"#939393ff","u16":[37696,37696,37696,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#818181ff","out":{"hex":"#d17b7bff","u16":[53809,31619,31619,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#818181ff","out":{"hex":"#7c7c7cff","u16":[31972,31972,31972,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#818181ff","out":{"hex":"#c85b5bff","u16":[51481,23331,23331,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#818181ff","out":{"hex":"#747474ff","u16":[29769,29769,29769,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#818181ff","out":{"hex":"#bb5555ff","u16":[47933,21723,21723,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#818181ff","out":{"hex":"#707070ff","u16":[28830,28830,28830,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#818181ff","out":{"hex":"#b55252ff","u16":[46422,21039,21039,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#818181ff","out":{"hex":"#6d6d6dff","u16":[28102,28102,28102,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#818181ff","out":{"hex":"#b05050ff","u16":[45249,20507,20507,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#818181ff","out":{"hex":"#6a6a6aff","u16":[27350,27350,27350,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#818181ff","out":{"hex":"#ab4e4eff","u16":[44038,19958,19958,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#818181ff","out":{"hex":"#6a6a6aff","u16":[27350,27350,27350,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#818181ff","out":{"hex":"#ab4e4eff","u16":[44038,19958,19958,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#818181ff","out":{"hex":"#757575ff","u16":[29955,29955,29955,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#818181ff","out":{"hex":"#bc5555ff","u16":[48233,21860,21860,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#818181ff","out":{"hex":"#5a5a5aff","u16":[23062,23062,23062,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#818181ff","out":{"hex":"#904141ff","u16":[37134,16829,16829,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#818181ff","out":{"hex":"#4c4c4cff","u16":[19468,19468,19468,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#818181ff","out":{"hex":"#7a3737ff","u16":[31347,14207,14207,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#818181ff","out":{"hex":"#3f3f3fff","u16":[16132,16132,16132,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#818181ff","out":{"hex":"#652e2eff","u16":[25975,11772,11772,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#818181ff","out":{"hex":"#2d2d2dff","u16":[11641,11641,11641,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#818181ff","out":{"hex":"#492121ff","u16":[18744,8495,8495,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#818181ff","out":{"hex":"#2d2d2dff","u16":[11641,11641,11641,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#818181ff","out":{"hex":"#492121ff","u16":[18744,8495,8495,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#818181ff","out":{"hex":"#505050ff","u16":[20476,20476,20476,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#818181ff","out":{"hex":"#803a3aff","u16":[32970,14942,14942,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#818181ff","out":{"hex":"#3d3d3dff","u16":[15764,15764,15764,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#818181ff","out":{"hex":"#632d2dff","u16":[25383,11503,11503,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#818181ff","out":{"hex":"#343434ff","u16":[13307,13307,13307,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#818181ff","out":{"hex":"#532626ff","u16":[21427,9711,9711,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#818181ff","out":{"hex":"#2b2b2bff","u16":[11027,11027,11027,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#818181ff","out":{"hex":"#451f1fff","u16":[17755,8047,8047,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#818181ff","out":{"hex":"#1f1f1fff","u16":[7957,7957,7957,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#818181ff","out":{"hex":"#321717ff","u16":[12812,5807,5807,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#818181ff","out":{"hex":"#1f1f1fff","u16":[7957,7957,7957,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#818181ff","out":{"hex":"#321717ff","u16":[12812,5807,5807,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#bfbfbfff","out":{"hex":"#a0a0a0ff","u16":[41133,41133,41133,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#bfbfbfff","out":{"hex":"#d68d8dff","u16":[54977,36284,36284,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#bfbfbfff","out":{"hex":"#ccccccff","u16":[52536,52536,52536,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#bfbfbfff","out":{"hex":"#e7c4c4ff","u16":[59463,50467,50467,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#bfbfbfff","out":{"hex":"#dbdbdbff","u16":[56345,56345,56345,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#bfbfbfff","out":{"hex":"#eed6d6ff","u16":[61148,54961,54961,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#bfbfbfff","out":{"hex":"#e6e6e6ff","u16":[59011,59011,59011,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#bfbfbfff","out":{"hex":"#f3e2e2ff","u16":[62375,58062,58062,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#bfbfbfff","out":{"hex":"#efefefff","u16":[61540,61540,61540,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#bfbfbfff","out":{"hex":"#f7ededff","u16":[63575,60976,60976,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#bfbfbfff","out":{"hex":"#efefefff","u16":[61540,61540,61540,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#bfbfbfff","out":{"hex":"#f7ededff","u16":[63575,60976,60976,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#bfbfbfff","out":{"hex":"#b6b6b6ff","u16":[46759,46759,46759,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#bfbfbfff","out":{"hex":"#dea9a9ff","u16":[57079,43459,43459,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#bfbfbfff","out":{"hex":"#c3c3c3ff","u16":[50203,50203,50203,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#bfbfbfff","out":{"hex":"#e4b9b9ff","u16":[58474,47670,47670,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#bfbfbfff","out":{"hex":"#c8c8c8ff","u16":[51504,51504,51504,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#bfbfbfff","out":{"hex":"#e6c0c0ff","u16":[59021,49235,49235,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#bfbfbfff","out":{"hex":"#ccccccff","u16":[52454,52454,52454,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#bfbfbfff","out":{"hex":"#e7c4c4ff","u16":[59428,50370,50370,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#bfbfbfff","out":{"hex":"#d0d0d0ff","u16":[53384,53384,53384,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#bfbfbfff","out":{"hex":"#e9c8c8ff","u16":[59831,51476,51476,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#bfbfbfff","out":{"hex":"#d0d0d0ff","u16":[53384,53384,53384,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#bfbfbfff","out":{"hex":"#e9c8c8ff","u16":[59831,51476,51476,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#bfbfbfff","out":{"hex":"#b7b7b7ff","u16":[47124,47124,47124,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#bfbfbfff","out":{"hex":"#dfababff","u16":[57223,43911,43911,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#bfbfbfff","out":{"hex":"#a9a9a9ff","u16":[43429,43429,43429,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#bfbfbfff","out":{"hex":"#d99999ff","u16":[55807,39267,39267,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#bfbfbfff","out":{"hex":"#a3a3a3ff","u16":[41840,41840,41840,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#bfbfbfff","out":{"hex":"#d79191ff","u16":[55229,37213,37213,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#bfbfbfff","out":{"hex":"#9e9e9eff","u16":[40600,40600,40600,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#bfbfbfff","out":{"hex":"#d58a8aff","u16":[54790,35578,35578,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#bfbfbfff","out":{"hex":"#999999ff","u16":[39312,39312,39312,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#bfbfbfff","out":{"hex":"#d38484ff","u16":[54347,33847,33847,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#bfbfbfff","out":{"hex":"#999999ff","u16":[39312,39312,39312,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#bfbfbfff","out":{"hex":"#d38484ff","u16":[54347,33847,33847,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#bfbfbfff","out":{"hex":"#adadadff","u16":[44352,44352,44352,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#bfbfbfff","out":{"hex":"#da9d9dff","u16":[56152,40444,40444,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#bfbfbfff","out":{"hex":"#858585ff","u16":[34146,34146,34146,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#bfbfbfff","out":{"hex":"#cd6767ff","u16":[52703,26414,26414,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#bfbfbfff","out":{"hex":"#707070ff","u16":[28825,28825,28825,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#bfbfbfff","out":{"hex":"#b55252ff","u16":[46413,21035,21035,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#bfbfbfff","out":{"hex":"#5d5d5dff","u16":[23885,23885,23885,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#bfbfbfff","out":{"hex":"#964444ff","u16":[38459,17430,17430,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#bfbfbfff","out":{"hex":"#434343ff","u16":[17235,17235,17235,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#bfbfbfff","out":{"hex":"#6c3131ff","u16":[27752,12577,12577,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#bfbfbfff","out":{"hex":"#434343ff","u16":[17235,17235,17235,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#bfbfbfff","out":{"hex":"#6c3131ff","u16":[27752,12577,12577,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#bfbfbfff","out":{"hex":"#6a6a6aff","u16":[27203,27203,27203,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#bfbfbfff","out":{"hex":"#aa4d4dff","u16":[43802,19851,19851,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#bfbfbfff","out":{"hex":"#515151ff","u16":[20943,20943,20943,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#bfbfbfff","out":{"hex":"#833b3bff","u16":[33722,15283,15283,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#bfbfbfff","out":{"hex":"#454545ff","u16":[17679,17679,17679,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#bfbfbfff","out":{"hex":"#6f3232ff","u16":[28467,12902,12902,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#bfbfbfff","out":{"hex":"#393939ff","u16":[14650,14650,14650,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#bfbfbfff","out":{"hex":"#5c2a2aff","u16":[23588,10690,10690,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#bfbfbfff","out":{"hex":"#292929ff","u16":[10571,10571,10571,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#bfbfbfff","out":{"hex":"#421e1eff","u16":[17021,7714,7714,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#bfbfbfff","out":{"hex":"#292929ff","u16":[10571,10571,10571,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#bfbfbfff","out":{"hex":"#421e1eff","u16":[17021,7714,7714,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#c0c0c0ff","out":{"hex":"#a1a1a1ff","u16":[41363,41363,41363,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#c0c0c0ff","out":{"hex":"#d68e8eff","u16":[55059,36588,36588,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#c0c0c0ff","out":{"hex":"#cdcdcdff","u16":[52805,52805,52805,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#c0c0c0ff","out":{"hex":"#e8c6c6ff","u16":[59579,50788,50788,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#c0c0c0ff","out":{"hex":"#dcdcdcff","u16":[56629,56629,56629,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#c0c0c0ff","out":{"hex":"#eed7d7ff","u16":[61276,55293,55293,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#c0c0c0ff","out":{"hex":"#e7e7e7ff","u16":[59305,59305,59305,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#c0c0c0ff","out":{"hex":"#f3e3e3ff","u16":[62513,58402,58402,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#c0c0c0ff","out":{"hex":"#f1f1f1ff","u16":[61843,61843,61843,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#c0c0c0ff","out":{"hex":"#f8efefff","u16":[63721,61324,61324,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#c0c0c0ff","out":{"hex":"#f1f1f1ff","u16":[61843,61843,61843,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#c0c0c0ff","out":{"hex":"#f8efefff","u16":[63721,61324,61324,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#c0c0c0ff","out":{"hex":"#b7b7b7ff","u16":[47024,47024,47024,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#c0c0c0ff","out":{"hex":"#dfaaaaff","u16":[57184,43787,43787,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#c0c0c0ff","out":{"hex":"#c4c4c4ff","u16":[50456,50456,50456,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#c0c0c0ff","out":{"hex":"#e4bbbbff","u16":[58580,47976,47976,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#c0c0c0ff","out":{"hex":"#c9c9c9ff","u16":[51753,51753,51753,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#c0c0c0ff","out":{"hex":"#e6c1c1ff","u16":[59128,49534,49534,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#c0c0c0ff","out":{"hex":"#cdcdcdff","u16":[52701,52701,52701,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#c0c0c0ff","out":{"hex":"#e8c5c5ff","u16":[59534,50665,50665,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#c0c0c0ff","out":{"hex":"#d1d1d1ff","u16":[53629,53629,53629,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#c0c0c0ff","out":{"hex":"#e9c9c9ff","u16":[59938,51766,51766,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#c0c0c0ff","out":{"hex":"#d1d1d1ff","u16":[53629,53629,53629,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#c0c0c0ff","out":{"hex":"#e9c9c9ff","u16":[59938,51766,51766,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#c0c0c0ff","out":{"hex":"#b8b8b8ff","u16":[47366,47366,47366,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#c0c0c0ff","out":{"hex":"#dfacacff","u16":[57319,44210,44210,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#c0c0c0ff","out":{"hex":"#aaaaaaff","u16":[43643,43643,43643,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#c0c0c0ff","out":{"hex":"#d99a9aff","u16":[55887,39541,39541,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#c0c0c0ff","out":{"hex":"#a4a4a4ff","u16":[42042,42042,42042,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#c0c0c0ff","out":{"hex":"#d79292ff","u16":[55301,37476,37476,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#c0c0c0ff","out":{"hex":"#9f9f9fff","u16":[40792,40792,40792,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#c0c0c0ff","out":{"hex":"#d58b8bff","u16":[54857,35833,35833,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#c0c0c0ff","out":{"hex":"#9a9a9aff","u16":[39493,39493,39493,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#c0c0c0ff","out":{"hex":"#d48585ff","u16":[54409,34094,34094,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#c0c0c0ff","out":{"hex":"#9a9a9aff","u16":[39493,39493,39493,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#c0c0c0ff","out":{"hex":"#d48585ff","u16":[54409,34094,34094,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#c0c0c0ff","out":{"hex":"#adadadff","u16":[44585,44585,44585,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#c0c0c0ff","out":{"hex":"#db9f9fff","u16":[56240,40738,40738,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#c0c0c0ff","out":{"hex":"#868686ff","u16":[34324,34324,34324,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#c0c0c0ff","out":{"hex":"#cd6868ff","u16":[52756,26689,26689,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#c0c0c0ff","out":{"hex":"#717171ff","u16":[28976,28976,28976,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#c0c0c0ff","out":{"hex":"#b65252ff","u16":[46656,21145,21145,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#c0c0c0ff","out":{"hex":"#5d5d5dff","u16":[24010,24010,24010,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#c0c0c0ff","out":{"hex":"#964444ff","u16":[38661,17521,17521,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#c0c0c0ff","out":{"hex":"#434343ff","u16":[17326,17326,17326,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#c0c0c0ff","out":{"hex":"#6d3131ff","u16":[27897,12643,12643,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#c0c0c0ff","out":{"hex":"#434343ff","u16":[17326,17326,17326,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#c0c0c0ff","out":{"hex":"#6d3131ff","u16":[27897,12643,12643,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#c0c0c0ff","out":{"hex":"#6a6a6aff","u16":[27279,27279,27279,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#c0c0c0ff","out":{"hex":"#ab4d4dff","u16":[43923,19906,19906,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#c0c0c0ff","out":{"hex":"#525252ff","u16":[21001,21001,21001,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#c0c0c0ff","out":{"hex":"#843c3cff","u16":[33815,15325,15325,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#c0c0c0ff","out":{"hex":"#454545ff","u16":[17728,17728,17728,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#c0c0c0ff","out":{"hex":"#6f3232ff","u16":[28546,12937,12937,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#c0c0c0ff","out":{"hex":"#393939ff","u16":[14690,14690,14690,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#c0c0c0ff","out":{"hex":"#5c2a2aff","u16":[23654,10720,10720,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#c0c0c0ff","out":{"hex":"#292929ff","u16":[10601,10601,10601,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#c0c0c0ff","out":{"hex":"#421e1eff","u16":[17068,7735,7735,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#c0c0c0ff","out":{"hex":"#292929ff","u16":[10601,10601,10601,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#c0c0c0ff","out":{"hex":"#421e1eff","u16":[17068,7735,7735,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#fdfdfdff","out":{"hex":"#f8f8f8ff","u16":[63805,63805,63805,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#fdfdfdff","out":{"hex":"#fcf7f7ff","u16":[64677,63567,63567,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#fdfdfdff","out":{"hex":"#e4e4e4ff","u16":[58633,58633,58633,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#fdfdfdff","out":{"hex":"#f2e0e0ff","u16":[62199,57624,57624,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#fdfdfdff","out":{"hex":"#d4d4d4ff","u16":[54361,54361,54361,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#fdfdfdff","out":{"hex":"#eacdcdff","u16":[60260,52632,52632,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#fdfdfdff","out":{"hex":"#c1c1c1ff","u16":[49644,49644,49644,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#fdfdfdff","out":{"hex":"#e3b7b7ff","u16":[58243,46994,46994,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#fdfdfdff","out":{"hex":"#c1c1c1ff","u16":[49644,49644,49644,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#fdfdfdff","out":{"hex":"#e3b7b7ff","u16":[58243,46994,46994,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#fdfdfdff","out":{"hex":"#fbfbfbff","u16":[64416,64416,64416,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#fdfdfdff","out":{"hex":"#fdfafaff","u16":[64978,64263,64263,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#fdfdfdff","out":{"hex":"#f1f1f1ff","u16":[61926,61926,61926,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#fdfdfdff","out":{"hex":"#f8efefff","u16":[63761,61419,61419,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#fdfdfdff","out":{"hex":"#e9e9e9ff","u16":[59976,59976,59976,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#fdfdfdff","out":{"hex":"#f4e6e6ff","u16":[62829,59177,59177,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#fdfdfdff","out":{"hex":"#e1e1e1ff","u16":[57947,57947,57947,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#fdfdfdff","out":{"hex":"#f1ddddff","u16":[61881,56828,56828,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#fdfdfdff","out":{"hex":"#e1e1e1ff","u16":[57947,57947,57947,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#fdfdfdff","out":{"hex":"#f1ddddff","u16":[61881,56828,56828,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#fdfdfdff","out":{"hex":"#f8f8f8ff","u16":[63805,63805,63805,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#fdfdfdff","out":{"hex":"#fcf7f7ff","u16":[64677,63567,63567,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#fdfdfdff","out":{"hex":"#e4e4e4ff","u16":[58633,58633,58633,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#fdfdfdff","out":{"hex":"#f2e0e0ff","u16":[62199,57624,57624,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#fdfdfdff","out":{"hex":"#d4d4d4ff","u16":[54361,54361,54361,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#fdfdfdff","out":{"hex":"#eacdcdff","u16":[60260,52632,52632,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#fdfdfdff","out":{"hex":"#c1c1c1ff","u16":[49644,49644,49644,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#fdfdfdff","out":{"hex":"#e3b7b7ff","u16":[58243,46994,46994,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#fdfdfdff","out":{"hex":"#c1c1c1ff","u16":[49644,49644,49644,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#fdfdfdff","out":{"hex":"#e3b7b7ff","u16":[58243,46994,46994,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#fdfdfdff","out":{"hex":"#f6f6f6ff","u16":[63186,63186,63186,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#fdfdfdff","out":{"hex":"#faf5f5ff","u16":[64373,62860,62860,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#fdfdfdff","out":{"hex":"#d6d6d6ff","u16":[55101,55101,55101,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#fdfdfdff","out":{"hex":"#ecd0d0ff","u16":[60588,53503,53503,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#fdfdfdff","out":{"hex":"#bbbbbbff","u16":[47946,47946,47946,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#fdfdfdff","out":{"hex":"#e0afafff","u16":[57551,44923,44923,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#fdfdfdff","out":{"hex":"#999999ff","u16":[39199,39199,39199,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#fdfdfdff","out":{"hex":"#d38383ff","u16":[54309,33694,33694,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#fdfdfdff","out":{"hex":"#999999ff","u16":[39199,39199,39199,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#fdfdfdff","out":{"hex":"#d38383ff","u16":[54309,33694,33694,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#fdfdfdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#fdfdfdff","out":{"hex":"#f1f1f1ff","u16":[61926,61926,61926,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#fdfdfdff","out":{"hex":"#f8efefff","u16":[63761,61419,61419,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#fdfdfdff","out":{"hex":"#bebebeff","u16":[48804,48804,48804,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#fdfdfdff","out":{"hex":"#e1b3b3ff","u16":[57898,45972,45972,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#fdfdfdff","out":{"hex":"#888888ff","u16":[35078,35078,35078,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#fdfdfdff","out":{"hex":"#ce6c6cff","u16":[52983,27831,27831,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#fdfdfdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#fdfdfdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#fdfdfdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#fdfdfdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#fefefeff","out":{"hex":"#f9f9f9ff","u16":[64067,64067,64067,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#fefefeff","out":{"hex":"#fcf9f9ff","u16":[64806,63866,63866,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#fefefeff","out":{"hex":"#e5e5e5ff","u16":[58923,58923,58923,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#fefefeff","out":{"hex":"#f3e2e2ff","u16":[62334,57961,57961,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#fefefeff","out":{"hex":"#d5d5d5ff","u16":[54680,54680,54680,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#fefefeff","out":{"hex":"#ebceceff","u16":[60401,53007,53007,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#fefefeff","out":{"hex":"#c3c3c3ff","u16":[49998,49998,49998,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#fefefeff","out":{"hex":"#e3b9b9ff","u16":[58389,47423,47423,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#fefefeff","out":{"hex":"#c3c3c3ff","u16":[49998,49998,49998,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#fefefeff","out":{"hex":"#e3b9b9ff","u16":[58389,47423,47423,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#fefefeff","out":{"hex":"#fcfcfcff","u16":[64676,64676,64676,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#fefefeff","out":{"hex":"#fdfbfbff","u16":[65107,64559,64559,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#fefefeff","out":{"hex":"#f2f2f2ff","u16":[62198,62198,62198,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#fefefeff","out":{"hex":"#f9f0f0ff","u16":[63893,61731,61731,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#fefefeff","out":{"hex":"#eaeaeaff","u16":[60259,60259,60259,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#fefefeff","out":{"hex":"#f5e8e8ff","u16":[62963,59503,59503,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#fefefeff","out":{"hex":"#e3e3e3ff","u16":[58242,58242,58242,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#fefefeff","out":{"hex":"#f1dedeff","u16":[62017,57171,57171,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#fefefeff","out":{"hex":"#e3e3e3ff","u16":[58242,58242,58242,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#fefefeff","out":{"hex":"#f1dedeff","u16":[62017,57171,57171,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#fefefeff","out":{"hex":"#f9f9f9ff","u16":[64067,64067,64067,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#fefefeff","out":{"hex":"#fcf9f9ff","u16":[64806,63866,63866,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#fefefeff","out":{"hex":"#e5e5e5ff","u16":[58923,58923,58923,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#fefefeff","out":{"hex":"#f3e2e2ff","u16":[62334,57961,57961,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#fefefeff","out":{"hex":"#d5d5d5ff","u16":[54680,54680,54680,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#fefefeff","out":{"hex":"#ebceceff","u16":[60401,53007,53007,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#fefefeff","out":{"hex":"#c3c3c3ff","u16":[49998,49998,49998,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#fefefeff","out":{"hex":"#e3b9b9ff","u16":[58389,47423,47423,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#fefefeff","out":{"hex":"#c3c3c3ff","u16":[49998,49998,49998,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#fefefeff","out":{"hex":"#e3b9b9ff","u16":[58389,47423,47423,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#fefefeff","out":{"hex":"#f7f7f7ff","u16":[63452,63452,63452,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#fefefeff","out":{"hex":"#fbf6f6ff","u16":[64503,63164,63164,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#fefefeff","out":{"hex":"#d8d8d8ff","u16":[55414,55414,55414,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#fefefeff","out":{"hex":"#ecd2d2ff","u16":[60728,53871,53871,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#fefefeff","out":{"hex":"#bcbcbcff","u16":[48316,48316,48316,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#fefefeff","out":{"hex":"#e1b1b1ff","u16":[57700,45376,45376,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#fefefeff","out":{"hex":"#9a9a9aff","u16":[39669,39669,39669,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#fefefeff","out":{"hex":"#d48686ff","u16":[54468,34330,34330,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#fefefeff","out":{"hex":"#9a9a9aff","u16":[39669,39669,39669,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#fefefeff","out":{"hex":"#d48686ff","u16":[54468,34330,34330,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#fefefeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#fefefeff","out":{"hex":"#f2f2f2ff","u16":[62198,62198,62198,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#fefefeff","out":{"hex":"#f9f0f0ff","u16":[63893,61731,61731,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#fefefeff","out":{"hex":"#bfbfbfff","u16":[49166,49166,49166,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#fefefeff","out":{"hex":"#e2b5b5ff","u16":[58046,46413,46413,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#fefefeff","out":{"hex":"#8b8b8bff","u16":[35613,35613,35613,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#fefefeff","out":{"hex":"#cf6f6fff","u16":[53147,28627,28627,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#fefefeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#fefefeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#fefefeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#fefefeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#ff0000ff","out":{"hex":"#cb0000ff","u16":[52246,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#ff0000ff","out":{"hex":"#cb0000ff","u16":[52246,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#ff0000ff","out":{"hex":"#ff4343ff","u16":[65535,17242,17242,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#ff0000ff","out":{"hex":"#ff4343ff","u16":[65535,17242,17242,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#ff0000ff","out":{"hex":"#ff6060ff","u16":[65535,24674,24674,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff0000ff","out":{"hex":"#ff6060ff","u16":[65535,24674,24674,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#ff0000ff","out":{"hex":"#ff7070ff","u16":[65535,28837,28837,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff0000ff","out":{"hex":"#ff7070ff","u16":[65535,28837,28837,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#ff0000ff","out":{"hex":"#ff7e7eff","u16":[65535,32379,32379,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#ff0000ff","out":{"hex":"#ff7e7eff","u16":[65535,32379,32379,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#ff0000ff","out":{"hex":"#ff7e7eff","u16":[65535,32379,32379,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff0000ff","out":{"hex":"#ff7e7eff","u16":[65535,32379,32379,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#ff0000ff","out":{"hex":"#eb0000ff","u16":[60309,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#ff0000ff","out":{"hex":"#eb0000ff","u16":[60309,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#ff0000ff","out":{"hex":"#ff2e2eff","u16":[65535,11694,11694,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#ff0000ff","out":{"hex":"#ff2e2eff","u16":[65535,11694,11694,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#ff0000ff","out":{"hex":"#ff4141ff","u16":[65535,16734,16734,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff0000ff","out":{"hex":"#ff4141ff","u16":[65535,16734,16734,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#ff0000ff","out":{"hex":"#ff4c4cff","u16":[65535,19557,19557,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff0000ff","out":{"hex":"#ff4c4cff","u16":[65535,19557,19557,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#ff0000ff","out":{"hex":"#ff5555ff","u16":[65535,21960,21960,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#ff0000ff","out":{"hex":"#ff5555ff","u16":[65535,21960,21960,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#ff0000ff","out":{"hex":"#ff5555ff","u16":[65535,21960,21960,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff0000ff","out":{"hex":"#ff5555ff","u16":[65535,21960,21960,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#ff0000ff","out":{"hex":"#f60000ff","u16":[63210,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#ff0000ff","out":{"hex":"#f60000ff","u16":[63210,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#ff0000ff","out":{"hex":"#e50000ff","u16":[58875,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#ff0000ff","out":{"hex":"#e50000ff","u16":[58875,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#ff0000ff","out":{"hex":"#de0000ff","u16":[57029,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff0000ff","out":{"hex":"#de0000ff","u16":[57029,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#ff0000ff","out":{"hex":"#d80000ff","u16":[55596,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff0000ff","out":{"hex":"#d80000ff","u16":[55596,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#ff0000ff","out":{"hex":"#d30000ff","u16":[54118,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#ff0000ff","out":{"hex":"#d30000ff","u16":[54118,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#ff0000ff","out":{"hex":"#d30000ff","u16":[54118,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff0000ff","out":{"hex":"#d30000ff","u16":[54118,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#ff0000ff","out":{"hex":"#e60000ff","u16":[59214,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#ff0000ff","out":{"hex":"#e60000ff","u16":[59214,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#ff0000ff","out":{"hex":"#b10000ff","u16":[45587,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#ff0000ff","out":{"hex":"#b10000ff","u16":[45587,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#ff0000ff","out":{"hex":"#960000ff","u16":[38483,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff0000ff","out":{"hex":"#960000ff","u16":[38483,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#ff0000ff","out":{"hex":"#7c0000ff","u16":[31889,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff0000ff","out":{"hex":"#7c0000ff","u16":[31889,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#ff0000ff","out":{"hex":"#5a0000ff","u16":[23011,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#ff0000ff","out":{"hex":"#5a0000ff","u16":[23011,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#ff0000ff","out":{"hex":"#5a0000ff","u16":[23011,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff0000ff","out":{"hex":"#5a0000ff","u16":[23011,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#ff0000ff","out":{"hex":"#9e0000ff","u16":[40612,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#ff0000ff","out":{"hex":"#9e0000ff","u16":[40612,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#ff0000ff","out":{"hex":"#7a0000ff","u16":[31266,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#ff0000ff","out":{"hex":"#7a0000ff","u16":[31266,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#ff0000ff","out":{"hex":"#670000ff","u16":[26394,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff0000ff","out":{"hex":"#670000ff","u16":[26394,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#ff0000ff","out":{"hex":"#550000ff","u16":[21871,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff0000ff","out":{"hex":"#550000ff","u16":[21871,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#ff0000ff","out":{"hex":"#3d0000ff","u16":[15782,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#ff0000ff","out":{"hex":"#3d0000ff","u16":[15782,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#ff0000ff","out":{"hex":"#3d0000ff","u16":[15782,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff0000ff","out":{"hex":"#3d0000ff","u16":[15782,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#00ff00ff","out":{"hex":"#00d700ff","u16":[0,55365,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#00ff00ff","out":{"hex":"#00d700ff","u16":[0,55365,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#00ff00ff","out":{"hex":"#a6ffa6ff","u16":[42676,65535,42676,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#00ff00ff","out":{"hex":"#a6ffa6ff","u16":[42676,65535,42676,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#00ff00ff","out":{"hex":"#eeffeeff","u16":[61070,65535,61070,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#00ff00ff","out":{"hex":"#eeffeeff","u16":[61070,65535,61070,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#00ff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#00ff00ff","out":{"hex":"#00f600ff","u16":[0,63179,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#00ff00ff","out":{"hex":"#00f600ff","u16":[0,63179,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#00ff00ff","out":{"hex":"#58ff58ff","u16":[22712,65535,22712,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#00ff00ff","out":{"hex":"#58ff58ff","u16":[22712,65535,22712,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#00ff00ff","out":{"hex":"#7eff7eff","u16":[32502,65535,32502,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#00ff00ff","out":{"hex":"#7eff7eff","u16":[32502,65535,32502,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#00ff00ff","out":{"hex":"#94ff94ff","u16":[37985,65535,37985,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#00ff00ff","out":{"hex":"#94ff94ff","u16":[37985,65535,37985,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#00ff00ff","out":{"hex":"#a6ffa6ff","u16":[42651,65535,42651,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#00ff00ff","out":{"hex":"#a6ffa6ff","u16":[42651,65535,42651,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#00ff00ff","out":{"hex":"#a6ffa6ff","u16":[42651,65535,42651,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#00ff00ff","out":{"hex":"#a6ffa6ff","u16":[42651,65535,42651,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#00ff00ff","out":{"hex":"#00f400ff","u16":[0,62739,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#00ff00ff","out":{"hex":"#00f400ff","u16":[0,62739,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#00ff00ff","out":{"hex":"#00e000ff","u16":[0,57450,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#00ff00ff","out":{"hex":"#00e000ff","u16":[0,57450,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#00ff00ff","out":{"hex":"#00d700ff","u16":[0,55162,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#00ff00ff","out":{"hex":"#00d700ff","u16":[0,55162,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#00ff00ff","out":{"hex":"#00d000ff","u16":[0,53368,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#00ff00ff","out":{"hex":"#00d000ff","u16":[0,53368,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#00ff00ff","out":{"hex":"#00c800ff","u16":[0,51499,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#00ff00ff","out":{"hex":"#00c800ff","u16":[0,51499,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#00ff00ff","out":{"hex":"#00c800ff","u16":[0,51499,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#00ff00ff","out":{"hex":"#00c800ff","u16":[0,51499,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#00ff00ff","out":{"hex":"#00e600ff","u16":[0,59214,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#00ff00ff","out":{"hex":"#00e600ff","u16":[0,59214,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#00ff00ff","out":{"hex":"#00b100ff","u16":[0,45587,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#00ff00ff","out":{"hex":"#00b100ff","u16":[0,45587,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#00ff00ff","out":{"hex":"#009600ff","u16":[0,38483,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#00ff00ff","out":{"hex":"#009600ff","u16":[0,38483,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#00ff00ff","out":{"hex":"#007c00ff","u16":[0,31889,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#00ff00ff","out":{"hex":"#007c00ff","u16":[0,31889,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#00ff00ff","out":{"hex":"#005a00ff","u16":[0,23011,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#00ff00ff","out":{"hex":"#005a00ff","u16":[0,23011,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#00ff00ff","out":{"hex":"#005a00ff","u16":[0,23011,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#00ff00ff","out":{"hex":"#005a00ff","u16":[0,23011,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#00ff00ff","out":{"hex":"#008200ff","u16":[0,33491,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#00ff00ff","out":{"hex":"#008200ff","u16":[0,33491,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#00ff00ff","out":{"hex":"#006400ff","u16":[0,25784,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#00ff00ff","out":{"hex":"#006400ff","u16":[0,25784,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#00ff00ff","out":{"hex":"#005500ff","u16":[0,21766,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#00ff00ff","out":{"hex":"#005500ff","u16":[0,21766,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#00ff00ff","out":{"hex":"#004600ff","u16":[0,18036,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#00ff00ff","out":{"hex":"#004600ff","u16":[0,18036,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#00ff00ff","out":{"hex":"#003300ff","u16":[0,13015,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#00ff00ff","out":{"hex":"#003300ff","u16":[0,13015,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#00ff00ff","out":{"hex":"#003300ff","u16":[0,13015,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#00ff00ff","out":{"hex":"#003300ff","u16":[0,13015,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#0000ffff","out":{"hex":"#0000a4ff","u16":[0,0,42151,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#0000ffff","out":{"hex":"#0000a4ff","u16":[0,0,42151,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#0000ffff","out":{"hex":"#2f2fffff","u16":[12068,12068,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#0000ffff","out":{"hex":"#2f2fffff","u16":[12068,12068,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#0000ffff","out":{"hex":"#4343ffff","u16":[17269,17269,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#0000ffff","out":{"hex":"#4343ffff","u16":[17269,17269,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#0000ffff","out":{"hex":"#4f4fffff","u16":[20182,20182,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#0000ffff","out":{"hex":"#4f4fffff","u16":[20182,20182,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#0000ffff","out":{"hex":"#5858ffff","u16":[22661,22661,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#0000ffff","out":{"hex":"#5858ffff","u16":[22661,22661,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#0000ffff","out":{"hex":"#5858ffff","u16":[22661,22661,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#0000ffff","out":{"hex":"#5858ffff","u16":[22661,22661,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#0000ffff","out":{"hex":"#0000daff","u16":[0,0,55910,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#0000ffff","out":{"hex":"#0000daff","u16":[0,0,55910,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#0000ffff","out":{"hex":"#2121ffff","u16":[8601,8601,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#0000ffff","out":{"hex":"#2121ffff","u16":[8601,8601,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#0000ffff","out":{"hex":"#3030ffff","u16":[12308,12308,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#0000ffff","out":{"hex":"#3030ffff","u16":[12308,12308,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#0000ffff","out":{"hex":"#3838ffff","u16":[14385,14385,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#0000ffff","out":{"hex":"#3838ffff","u16":[14385,14385,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#0000ffff","out":{"hex":"#3f3fffff","u16":[16152,16152,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#0000ffff","out":{"hex":"#3f3fffff","u16":[16152,16152,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#0000ffff","out":{"hex":"#3f3fffff","u16":[16152,16152,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#0000ffff","out":{"hex":"#3f3fffff","u16":[16152,16152,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#0000ffff","out":{"hex":"#0000f6ff","u16":[0,0,63341,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#0000ffff","out":{"hex":"#0000f6ff","u16":[0,0,63341,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#0000ffff","out":{"hex":"#0000e7ff","u16":[0,0,59266,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#0000ffff","out":{"hex":"#0000e7ff","u16":[0,0,59266,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#0000ffff","out":{"hex":"#0000e0ff","u16":[0,0,57538,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#0000ffff","out":{"hex":"#0000e0ff","u16":[0,0,57538,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#0000ffff","out":{"hex":"#0000dbff","u16":[0,0,56200,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#0000ffff","out":{"hex":"#0000dbff","u16":[0,0,56200,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#0000ffff","out":{"hex":"#0000d5ff","u16":[0,0,54822,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#0000ffff","out":{"hex":"#0000d5ff","u16":[0,0,54822,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#0000ffff","out":{"hex":"#0000d5ff","u16":[0,0,54822,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#0000ffff","out":{"hex":"#0000d5ff","u16":[0,0,54822,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#0000ffff","out":{"hex":"#0000e6ff","u16":[0,0,59214,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#0000ffff","out":{"hex":"#0000e6ff","u16":[0,0,59214,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#0000ffff","out":{"hex":"#0000b1ff","u16":[0,0,45587,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#0000ffff","out":{"hex":"#0000b1ff","u16":[0,0,45587,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#0000ffff","out":{"hex":"#000096ff","u16":[0,0,38483,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#0000ffff","out":{"hex":"#000096ff","u16":[0,0,38483,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#0000ffff","out":{"hex":"#00007cff","u16":[0,0,31889,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#0000ffff","out":{"hex":"#00007cff","u16":[0,0,31889,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#0000ffff","out":{"hex":"#00005aff","u16":[0,0,23011,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#0000ffff","out":{"hex":"#00005aff","u16":[0,0,23011,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#0000ffff","out":{"hex":"#00005aff","u16":[0,0,23011,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#0000ffff","out":{"hex":"#00005aff","u16":[0,0,23011,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#0000ffff","out":{"hex":"#0000a5ff","u16":[0,0,42350,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#0000ffff","out":{"hex":"#0000a5ff","u16":[0,0,42350,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#0000ffff","out":{"hex":"#00007fff","u16":[0,0,32604,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#0000ffff","out":{"hex":"#00007fff","u16":[0,0,32604,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#0000ffff","out":{"hex":"#00006bff","u16":[0,0,27523,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#0000ffff","out":{"hex":"#00006bff","u16":[0,0,27523,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#0000ffff","out":{"hex":"#000059ff","u16":[0,0,22807,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#0000ffff","out":{"hex":"#000059ff","u16":[0,0,22807,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#0000ffff","out":{"hex":"#000040ff","u16":[0,0,16457,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#0000ffff","out":{"hex":"#000040ff","u16":[0,0,16457,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#0000ffff","out":{"hex":"#000040ff","u16":[0,0,16457,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#0000ffff","out":{"hex":"#000040ff","u16":[0,0,16457,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#ffff00ff","out":{"hex":"#d9d900ff","u16":[55656,55656,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#ffff00ff","out":{"hex":"#d9d900ff","u16":[55656,55656,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#ffff00ff","out":{"hex":"#f9f900ff","u16":[63935,63935,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#ffff00ff","out":{"hex":"#f9f900ff","u16":[63935,63935,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#ffff00ff","out":{"hex":"#ffff9cff","u16":[65535,65535,40136,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#ffff00ff","out":{"hex":"#ffff9cff","u16":[65535,65535,40136,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#ffff00ff","out":{"hex":"#ffffdfff","u16":[65535,65535,57435,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#ffff00ff","out":{"hex":"#ffffdfff","u16":[65535,65535,57435,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#ffff00ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#ffff00ff","out":{"hex":"#f3f300ff","u16":[62539,62539,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#ffff00ff","out":{"hex":"#f3f300ff","u16":[62539,62539,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#ffff00ff","out":{"hex":"#dddd00ff","u16":[56834,56834,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#ffff00ff","out":{"hex":"#dddd00ff","u16":[56834,56834,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#ffff00ff","out":{"hex":"#d3d300ff","u16":[54348,54348,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#ffff00ff","out":{"hex":"#d3d300ff","u16":[54348,54348,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#ffff00ff","out":{"hex":"#cccc00ff","u16":[52391,52391,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#ffff00ff","out":{"hex":"#cccc00ff","u16":[52391,52391,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#ffff00ff","out":{"hex":"#c4c400ff","u16":[50341,50341,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#ffff00ff","out":{"hex":"#c4c400ff","u16":[50341,50341,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#ffff00ff","out":{"hex":"#c4c400ff","u16":[50341,50341,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#ffff00ff","out":{"hex":"#c4c400ff","u16":[50341,50341,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#ffff00ff","out":{"hex":"#e6e600ff","u16":[59214,59214,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#ffff00ff","out":{"hex":"#e6e600ff","u16":[59214,59214,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#ffff00ff","out":{"hex":"#b1b100ff","u16":[45587,45587,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#ffff00ff","out":{"hex":"#b1b100ff","u16":[45587,45587,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#ffff00ff","out":{"hex":"#969600ff","u16":[38483,38483,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#ffff00ff","out":{"hex":"#969600ff","u16":[38483,38483,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#ffff00ff","out":{"hex":"#7c7c00ff","u16":[31889,31889,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#ffff00ff","out":{"hex":"#7c7c00ff","u16":[31889,31889,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#ffff00ff","out":{"hex":"#5a5a00ff","u16":[23011,23011,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#ffff00ff","out":{"hex":"#5a5a00ff","u16":[23011,23011,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#ffff00ff","out":{"hex":"#5a5a00ff","u16":[23011,23011,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#ffff00ff","out":{"hex":"#5a5a00ff","u16":[23011,23011,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#ffff00ff","out":{"hex":"#747400ff","u16":[29854,29854,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#ffff00ff","out":{"hex":"#747400ff","u16":[29854,29854,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#ffff00ff","out":{"hex":"#595900ff","u16":[22984,22984,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#ffff00ff","out":{"hex":"#595900ff","u16":[22984,22984,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#ffff00ff","out":{"hex":"#4b4b00ff","u16":[19402,19402,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#ffff00ff","out":{"hex":"#4b4b00ff","u16":[19402,19402,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#ffff00ff","out":{"hex":"#3f3f00ff","u16":[16078,16078,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#ffff00ff","out":{"hex":"#3f3f00ff","u16":[16078,16078,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#ffff00ff","out":{"hex":"#2d2d00ff","u16":[11602,11602,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#ffff00ff","out":{"hex":"#2d2d00ff","u16":[11602,11602,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#ffff00ff","out":{"hex":"#2d2d00ff","u16":[11602,11602,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#ffff00ff","out":{"hex":"#2d2d00ff","u16":[11602,11602,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#00ffffff","out":{"hex":"#00d8d8ff","u16":[0,55482,55482,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#00ffffff","out":{"hex":"#00d8d8ff","u16":[0,55482,55482,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#00ffffff","out":{"hex":"#c5ffffff","u16":[50679,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#00ffffff","out":{"hex":"#c5ffffff","u16":[50679,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#00ffffff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#00ffffff","out":{"hex":"#00f7f7ff","u16":[0,63444,63444,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#00ffffff","out":{"hex":"#00f7f7ff","u16":[0,63444,63444,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#00ffffff","out":{"hex":"#64ffffff","u16":[25695,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#00ffffff","out":{"hex":"#64ffffff","u16":[25695,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#00ffffff","out":{"hex":"#8fffffff","u16":[36770,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#00ffffff","out":{"hex":"#8fffffff","u16":[36770,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#00ffffff","out":{"hex":"#a7ffffff","u16":[42973,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#00ffffff","out":{"hex":"#a7ffffff","u16":[42973,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#00ffffff","out":{"hex":"#bcffffff","u16":[48252,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#00ffffff","out":{"hex":"#bcffffff","u16":[48252,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#00ffffff","out":{"hex":"#bcffffff","u16":[48252,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#00ffffff","out":{"hex":"#bcffffff","u16":[48252,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#00ffffff","out":{"hex":"#00f4f4ff","u16":[0,62671,62671,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#00ffffff","out":{"hex":"#00f4f4ff","u16":[0,62671,62671,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#00ffffff","out":{"hex":"#00dfdfff","u16":[0,57241,57241,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#00ffffff","out":{"hex":"#00dfdfff","u16":[0,57241,57241,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#00ffffff","out":{"hex":"#00d6d6ff","u16":[0,54887,54887,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#00ffffff","out":{"hex":"#00d6d6ff","u16":[0,54887,54887,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#00ffffff","out":{"hex":"#00ceceff","u16":[0,53038,53038,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#00ffffff","out":{"hex":"#00ceceff","u16":[0,53038,53038,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#00ffffff","out":{"hex":"#00c7c7ff","u16":[0,51109,51109,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#00ffffff","out":{"hex":"#00c7c7ff","u16":[0,51109,51109,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#00ffffff","out":{"hex":"#00c7c7ff","u16":[0,51109,51109,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#00ffffff","out":{"hex":"#00c7c7ff","u16":[0,51109,51109,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#00ffffff","out":{"hex":"#00e6e6ff","u16":[0,59214,59214,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#00ffffff","out":{"hex":"#00e6e6ff","u16":[0,59214,59214,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#00ffffff","out":{"hex":"#00b1b1ff","u16":[0,45587,45587,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#00ffffff","out":{"hex":"#00b1b1ff","u16":[0,45587,45587,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#00ffffff","out":{"hex":"#009696ff","u16":[0,38483,38483,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#00ffffff","out":{"hex":"#009696ff","u16":[0,38483,38483,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#00ffffff","out":{"hex":"#007c7cff","u16":[0,31889,31889,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#00ffffff","out":{"hex":"#007c7cff","u16":[0,31889,31889,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#00ffffff","out":{"hex":"#005a5aff","u16":[0,23011,23011,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#00ffffff","out":{"hex":"#005a5aff","u16":[0,23011,23011,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#00ffffff","out":{"hex":"#005a5aff","u16":[0,23011,23011,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#00ffffff","out":{"hex":"#005a5aff","u16":[0,23011,23011,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#00ffffff","out":{"hex":"#007e7eff","u16":[0,32311,32311,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#00ffffff","out":{"hex":"#007e7eff","u16":[0,32311,32311,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#00ffffff","out":{"hex":"#006161ff","u16":[0,24875,24875,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#00ffffff","out":{"hex":"#006161ff","u16":[0,24875,24875,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#00ffffff","out":{"hex":"#005252ff","u16":[0,20999,20999,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#00ffffff","out":{"hex":"#005252ff","u16":[0,20999,20999,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#00ffffff","out":{"hex":"#004444ff","u16":[0,17401,17401,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#00ffffff","out":{"hex":"#004444ff","u16":[0,17401,17401,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#00ffffff","out":{"hex":"#003131ff","u16":[0,12556,12556,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#00ffffff","out":{"hex":"#003131ff","u16":[0,12556,12556,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#00ffffff","out":{"hex":"#003131ff","u16":[0,12556,12556,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#00ffffff","out":{"hex":"#003131ff","u16":[0,12556,12556,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#ff00ffff","out":{"hex":"#d000d0ff","u16":[53397,0,53397,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#ff00ffff","out":{"hex":"#d000d0ff","u16":[53397,0,53397,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#ff00ffff","out":{"hex":"#ff4dffff","u16":[65535,19848,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#ff00ffff","out":{"hex":"#ff4dffff","u16":[65535,19848,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#ff00ffff","out":{"hex":"#ff6fffff","u16":[65535,28403,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff00ffff","out":{"hex":"#ff6fffff","u16":[65535,28403,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#ff00ffff","out":{"hex":"#ff81ffff","u16":[65535,33194,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff00ffff","out":{"hex":"#ff81ffff","u16":[65535,33194,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#ff00ffff","out":{"hex":"#ff91ffff","u16":[65535,37271,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#ff00ffff","out":{"hex":"#ff91ffff","u16":[65535,37271,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#ff00ffff","out":{"hex":"#ff91ffff","u16":[65535,37271,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff00ffff","out":{"hex":"#ff91ffff","u16":[65535,37271,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#ff00ffff","out":{"hex":"#ed00edff","u16":[61023,0,61023,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#ff00ffff","out":{"hex":"#ed00edff","u16":[61023,0,61023,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#ff00ffff","out":{"hex":"#ff33ffff","u16":[65535,13091,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#ff00ffff","out":{"hex":"#ff33ffff","u16":[65535,13091,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#ff00ffff","out":{"hex":"#ff49ffff","u16":[65535,18734,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff00ffff","out":{"hex":"#ff49ffff","u16":[65535,18734,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#ff00ffff","out":{"hex":"#ff55ffff","u16":[65535,21895,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff00ffff","out":{"hex":"#ff55ffff","u16":[65535,21895,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#ff00ffff","out":{"hex":"#ff60ffff","u16":[65535,24584,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#ff00ffff","out":{"hex":"#ff60ffff","u16":[65535,24584,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#ff00ffff","out":{"hex":"#ff60ffff","u16":[65535,24584,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff00ffff","out":{"hex":"#ff60ffff","u16":[65535,24584,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#ff00ffff","out":{"hex":"#f600f6ff","u16":[63143,0,63143,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#ff00ffff","out":{"hex":"#f600f6ff","u16":[63143,0,63143,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#ff00ffff","out":{"hex":"#e400e4ff","u16":[58673,0,58673,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#ff00ffff","out":{"hex":"#e400e4ff","u16":[58673,0,58673,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#ff00ffff","out":{"hex":"#dd00ddff","u16":[56765,0,56765,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff00ffff","out":{"hex":"#dd00ddff","u16":[56765,0,56765,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#ff00ffff","out":{"hex":"#d700d7ff","u16":[55283,0,55283,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff00ffff","out":{"hex":"#d700d7ff","u16":[55283,0,55283,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#ff00ffff","out":{"hex":"#d100d1ff","u16":[53751,0,53751,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#ff00ffff","out":{"hex":"#d100d1ff","u16":[53751,0,53751,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#ff00ffff","out":{"hex":"#d100d1ff","u16":[53751,0,53751,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff00ffff","out":{"hex":"#d100d1ff","u16":[53751,0,53751,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#ff00ffff","out":{"hex":"#e600e6ff","u16":[59214,0,59214,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#ff00ffff","out":{"hex":"#e600e6ff","u16":[59214,0,59214,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#ff00ffff","out":{"hex":"#b100b1ff","u16":[45587,0,45587,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#ff00ffff","out":{"hex":"#b100b1ff","u16":[45587,0,45587,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#ff00ffff","out":{"hex":"#960096ff","u16":[38483,0,38483,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff00ffff","out":{"hex":"#960096ff","u16":[38483,0,38483,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#ff00ffff","out":{"hex":"#7c007cff","u16":[31889,0,31889,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff00ffff","out":{"hex":"#7c007cff","u16":[31889,0,31889,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#ff00ffff","out":{"hex":"#5a005aff","u16":[23011,0,23011,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#ff00ffff","out":{"hex":"#5a005aff","u16":[23011,0,23011,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#ff00ffff","out":{"hex":"#5a005aff","u16":[23011,0,23011,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff00ffff","out":{"hex":"#5a005aff","u16":[23011,0,23011,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#ff00ffff","out":{"hex":"#9a009aff","u16":[39683,0,39683,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#ff00ffff","out":{"hex":"#9a009aff","u16":[39683,0,39683,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#ff00ffff","out":{"hex":"#770077ff","u16":[30550,0,30550,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#ff00ffff","out":{"hex":"#770077ff","u16":[30550,0,30550,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#ff00ffff","out":{"hex":"#640064ff","u16":[25790,0,25790,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff00ffff","out":{"hex":"#640064ff","u16":[25790,0,25790,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#ff00ffff","out":{"hex":"#530053ff","u16":[21371,0,21371,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff00ffff","out":{"hex":"#530053ff","u16":[21371,0,21371,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#ff00ffff","out":{"hex":"#3c003cff","u16":[15421,0,15421,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#ff00ffff","out":{"hex":"#3c003cff","u16":[15421,0,15421,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#ff00ffff","out":{"hex":"#3c003cff","u16":[15421,0,15421,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff00ffff","out":{"hex":"#3c003cff","u16":[15421,0,15421,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#800000ff","out":{"hex":"#3c0000ff","u16":[15438,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#800000ff","out":{"hex":"#3c0000ff","u16":[15438,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#800000ff","out":{"hex":"#950000ff","u16":[38399,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#800000ff","out":{"hex":"#950000ff","u16":[38399,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#800000ff","out":{"hex":"#ab0000ff","u16":[43953,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#800000ff","out":{"hex":"#ab0000ff","u16":[43953,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#800000ff","out":{"hex":"#b90000ff","u16":[47621,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#800000ff","out":{"hex":"#b90000ff","u16":[47621,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#800000ff","out":{"hex":"#c60000ff","u16":[50978,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#800000ff","out":{"hex":"#c60000ff","u16":[50978,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#800000ff","out":{"hex":"#c60000ff","u16":[50978,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#800000ff","out":{"hex":"#c60000ff","u16":[50978,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#800000ff","out":{"hex":"#660000ff","u16":[26235,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#800000ff","out":{"hex":"#660000ff","u16":[26235,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#800000ff","out":{"hex":"#8b0000ff","u16":[35685,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#800000ff","out":{"hex":"#8b0000ff","u16":[35685,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#800000ff","out":{"hex":"#970000ff","u16":[38720,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#800000ff","out":{"hex":"#970000ff","u16":[38720,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#800000ff","out":{"hex":"#9f0000ff","u16":[40821,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#800000ff","out":{"hex":"#9f0000ff","u16":[40821,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#800000ff","out":{"hex":"#a70000ff","u16":[42799,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#800000ff","out":{"hex":"#a70000ff","u16":[42799,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#800000ff","out":{"hex":"#a70000ff","u16":[42799,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#800000ff","out":{"hex":"#a70000ff","u16":[42799,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#800000ff","out":{"hex":"#7c0000ff","u16":[31807,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#800000ff","out":{"hex":"#7c0000ff","u16":[31807,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#800000ff","out":{"hex":"#740000ff","u16":[29785,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#800000ff","out":{"hex":"#740000ff","u16":[29785,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#800000ff","out":{"hex":"#710000ff","u16":[28928,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#800000ff","out":{"hex":"#710000ff","u16":[28928,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#800000ff","out":{"hex":"#6e0000ff","u16":[28265,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#800000ff","out":{"hex":"#6e0000ff","u16":[28265,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#800000ff","out":{"hex":"#6b0000ff","u16":[27582,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#800000ff","out":{"hex":"#6b0000ff","u16":[27582,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#800000ff","out":{"hex":"#6b0000ff","u16":[27582,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#800000ff","out":{"hex":"#6b0000ff","u16":[27582,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#800000ff","out":{"hex":"#740000ff","u16":[29723,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#800000ff","out":{"hex":"#740000ff","u16":[29723,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#800000ff","out":{"hex":"#590000ff","u16":[22883,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#800000ff","out":{"hex":"#590000ff","u16":[22883,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#800000ff","out":{"hex":"#4b0000ff","u16":[19317,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#800000ff","out":{"hex":"#4b0000ff","u16":[19317,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#800000ff","out":{"hex":"#3e0000ff","u16":[16007,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#800000ff","out":{"hex":"#3e0000ff","u16":[16007,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#800000ff","out":{"hex":"#2d0000ff","u16":[11550,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#800000ff","out":{"hex":"#2d0000ff","u16":[11550,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#800000ff","out":{"hex":"#2d0000ff","u16":[11550,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#800000ff","out":{"hex":"#2d0000ff","u16":[11550,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#800000ff","out":{"hex":"#530000ff","u16":[21412,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#800000ff","out":{"hex":"#530000ff","u16":[21412,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#800000ff","out":{"hex":"#400000ff","u16":[16484,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#800000ff","out":{"hex":"#400000ff","u16":[16484,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#800000ff","out":{"hex":"#360000ff","u16":[13916,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#800000ff","out":{"hex":"#360000ff","u16":[13916,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#800000ff","out":{"hex":"#2d0000ff","u16":[11531,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#800000ff","out":{"hex":"#2d0000ff","u16":[11531,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#800000ff","out":{"hex":"#200000ff","u16":[8320,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#800000ff","out":{"hex":"#200000ff","u16":[8320,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#800000ff","out":{"hex":"#200000ff","u16":[8320,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#800000ff","out":{"hex":"#200000ff","u16":[8320,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#008000ff","out":{"hex":"#006300ff","u16":[0,25392,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#008000ff","out":{"hex":"#006300ff","u16":[0,25392,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#008000ff","out":{"hex":"#008c00ff","u16":[0,35969,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#008000ff","out":{"hex":"#008c00ff","u16":[0,35969,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#008000ff","out":{"hex":"#009900ff","u16":[0,39285,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#008000ff","out":{"hex":"#009900ff","u16":[0,39285,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#008000ff","out":{"hex":"#00a200ff","u16":[0,41566,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#008000ff","out":{"hex":"#00a200ff","u16":[0,41566,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#008000ff","out":{"hex":"#00aa00ff","u16":[0,43706,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#008000ff","out":{"hex":"#00aa00ff","u16":[0,43706,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#008000ff","out":{"hex":"#00aa00ff","u16":[0,43706,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#008000ff","out":{"hex":"#00aa00ff","u16":[0,43706,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#008000ff","out":{"hex":"#007400ff","u16":[0,29837,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#008000ff","out":{"hex":"#007400ff","u16":[0,29837,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#008000ff","out":{"hex":"#008500ff","u16":[0,34305,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#008000ff","out":{"hex":"#008500ff","u16":[0,34305,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#008000ff","out":{"hex":"#008c00ff","u16":[0,35908,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#008000ff","out":{"hex":"#008c00ff","u16":[0,35908,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#008000ff","out":{"hex":"#009000ff","u16":[0,37057,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#008000ff","out":{"hex":"#009000ff","u16":[0,37057,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#008000ff","out":{"hex":"#009400ff","u16":[0,38164,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#008000ff","out":{"hex":"#009400ff","u16":[0,38164,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#008000ff","out":{"hex":"#009400ff","u16":[0,38164,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#008000ff","out":{"hex":"#009400ff","u16":[0,38164,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#008000ff","out":{"hex":"#007c00ff","u16":[0,31755,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#008000ff","out":{"hex":"#007c00ff","u16":[0,31755,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#008000ff","out":{"hex":"#007300ff","u16":[0,29631,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#008000ff","out":{"hex":"#007300ff","u16":[0,29631,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#008000ff","out":{"hex":"#007000ff","u16":[0,28728,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#008000ff","out":{"hex":"#007000ff","u16":[0,28728,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#008000ff","out":{"hex":"#006d00ff","u16":[0,28028,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#008000ff","out":{"hex":"#006d00ff","u16":[0,28028,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#008000ff","out":{"hex":"#006a00ff","u16":[0,27306,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#008000ff","out":{"hex":"#006a00ff","u16":[0,27306,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#008000ff","out":{"hex":"#006a00ff","u16":[0,27306,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#008000ff","out":{"hex":"#006a00ff","u16":[0,27306,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#008000ff","out":{"hex":"#007400ff","u16":[0,29723,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#008000ff","out":{"hex":"#007400ff","u16":[0,29723,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#008000ff","out":{"hex":"#005900ff","u16":[0,22883,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#008000ff","out":{"hex":"#005900ff","u16":[0,22883,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#008000ff","out":{"hex":"#004b00ff","u16":[0,19317,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#008000ff","out":{"hex":"#004b00ff","u16":[0,19317,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#008000ff","out":{"hex":"#003e00ff","u16":[0,16007,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#008000ff","out":{"hex":"#003e00ff","u16":[0,16007,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#008000ff","out":{"hex":"#002d00ff","u16":[0,11550,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#008000ff","out":{"hex":"#002d00ff","u16":[0,11550,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#008000ff","out":{"hex":"#002d00ff","u16":[0,11550,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#008000ff","out":{"hex":"#002d00ff","u16":[0,11550,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#008000ff","out":{"hex":"#005100ff","u16":[0,20736,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#008000ff","out":{"hex":"#005100ff","u16":[0,20736,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#008000ff","out":{"hex":"#003e00ff","u16":[0,15964,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#008000ff","out":{"hex":"#003e00ff","u16":[0,15964,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#008000ff","out":{"hex":"#003400ff","u16":[0,13476,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#008000ff","out":{"hex":"#003400ff","u16":[0,13476,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#008000ff","out":{"hex":"#002b00ff","u16":[0,11167,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#008000ff","out":{"hex":"#002b00ff","u16":[0,11167,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#008000ff","out":{"hex":"#001f00ff","u16":[0,8058,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#008000ff","out":{"hex":"#001f00ff","u16":[0,8058,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#008000ff","out":{"hex":"#001f00ff","u16":[0,8058,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#008000ff","out":{"hex":"#001f00ff","u16":[0,8058,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#000080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#000080ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#000080ff","out":{"hex":"#0000acff","u16":[0,0,44315,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#000080ff","out":{"hex":"#0000acff","u16":[0,0,44315,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#000080ff","out":{"hex":"#0000d4ff","u16":[0,0,54510,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#000080ff","out":{"hex":"#0000d4ff","u16":[0,0,54510,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#000080ff","out":{"hex":"#0000edff","u16":[0,0,60862,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#000080ff","out":{"hex":"#0000edff","u16":[0,0,60862,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#000080ff","out":{"hex":"#1111ffff","u16":[4342,4342,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#000080ff","out":{"hex":"#1111ffff","u16":[4342,4342,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#000080ff","out":{"hex":"#1111ffff","u16":[4342,4342,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#000080ff","out":{"hex":"#1111ffff","u16":[4342,4342,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#000080ff","out":{"hex":"#00002aff","u16":[0,0,10676,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#000080ff","out":{"hex":"#00002aff","u16":[0,0,10676,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#000080ff","out":{"hex":"#000098ff","u16":[0,0,39046,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#000080ff","out":{"hex":"#000098ff","u16":[0,0,39046,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#000080ff","out":{"hex":"#0000b0ff","u16":[0,0,45156,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#000080ff","out":{"hex":"#0000b0ff","u16":[0,0,45156,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#000080ff","out":{"hex":"#0000bfff","u16":[0,0,49156,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#000080ff","out":{"hex":"#0000bfff","u16":[0,0,49156,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#000080ff","out":{"hex":"#0000cdff","u16":[0,0,52799,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#000080ff","out":{"hex":"#0000cdff","u16":[0,0,52799,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#000080ff","out":{"hex":"#0000cdff","u16":[0,0,52799,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#000080ff","out":{"hex":"#0000cdff","u16":[0,0,52799,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#000080ff","out":{"hex":"#00007cff","u16":[0,0,31821,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#000080ff","out":{"hex":"#00007cff","u16":[0,0,31821,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#000080ff","out":{"hex":"#000074ff","u16":[0,0,29827,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#000080ff","out":{"hex":"#000074ff","u16":[0,0,29827,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#000080ff","out":{"hex":"#000071ff","u16":[0,0,28983,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#000080ff","out":{"hex":"#000071ff","u16":[0,0,28983,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#000080ff","out":{"hex":"#00006eff","u16":[0,0,28331,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#000080ff","out":{"hex":"#00006eff","u16":[0,0,28331,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#000080ff","out":{"hex":"#00006cff","u16":[0,0,27659,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#000080ff","out":{"hex":"#00006cff","u16":[0,0,27659,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#000080ff","out":{"hex":"#00006cff","u16":[0,0,27659,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#000080ff","out":{"hex":"#00006cff","u16":[0,0,27659,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#000080ff","out":{"hex":"#000074ff","u16":[0,0,29723,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#000080ff","out":{"hex":"#000074ff","u16":[0,0,29723,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#000080ff","out":{"hex":"#000059ff","u16":[0,0,22883,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#000080ff","out":{"hex":"#000059ff","u16":[0,0,22883,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#000080ff","out":{"hex":"#00004bff","u16":[0,0,19317,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#000080ff","out":{"hex":"#00004bff","u16":[0,0,19317,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#000080ff","out":{"hex":"#00003eff","u16":[0,0,16007,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#000080ff","out":{"hex":"#00003eff","u16":[0,0,16007,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#000080ff","out":{"hex":"#00002dff","u16":[0,0,11550,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#000080ff","out":{"hex":"#00002dff","u16":[0,0,11550,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#000080ff","out":{"hex":"#00002dff","u16":[0,0,11550,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#000080ff","out":{"hex":"#00002dff","u16":[0,0,11550,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#000080ff","out":{"hex":"#000054ff","u16":[0,0,21596,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#000080ff","out":{"hex":"#000054ff","u16":[0,0,21596,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#000080ff","out":{"hex":"#000041ff","u16":[0,0,16626,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#000080ff","out":{"hex":"#000041ff","u16":[0,0,16626,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#000080ff","out":{"hex":"#000037ff","u16":[0,0,14035,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#000080ff","out":{"hex":"#000037ff","u16":[0,0,14035,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#000080ff","out":{"hex":"#00002dff","u16":[0,0,11630,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#000080ff","out":{"hex":"#00002dff","u16":[0,0,11630,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#000080ff","out":{"hex":"#000021ff","u16":[0,0,8392,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#000080ff","out":{"hex":"#000021ff","u16":[0,0,8392,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#000080ff","out":{"hex":"#000021ff","u16":[0,0,8392,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#000080ff","out":{"hex":"#000021ff","u16":[0,0,8392,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#ff8080ff","out":{"hex":"#ff4343ff","u16":[65535,17265,17265,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#ff8080ff","out":{"hex":"#ff4343ff","u16":[65535,17265,17265,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#ff8080ff","out":{"hex":"#ff9494ff","u16":[65535,38069,38069,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#ff8080ff","out":{"hex":"#ff9494ff","u16":[65535,38069,38069,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#ff8080ff","out":{"hex":"#ffa9a9ff","u16":[65535,43335,43335,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff8080ff","out":{"hex":"#ffa9a9ff","u16":[65535,43335,43335,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#ff8080ff","out":{"hex":"#ffb6b6ff","u16":[65535,46828,46828,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff8080ff","out":{"hex":"#ffb6b6ff","u16":[65535,46828,46828,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#ff8080ff","out":{"hex":"#ffc3c3ff","u16":[65535,50034,50034,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#ff8080ff","out":{"hex":"#ffc3c3ff","u16":[65535,50034,50034,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#ff8080ff","out":{"hex":"#ffc3c3ff","u16":[65535,50034,50034,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff8080ff","out":{"hex":"#ffc3c3ff","u16":[65535,50034,50034,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#ff8080ff","out":{"hex":"#ff6e6eff","u16":[65535,28392,28392,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#ff8080ff","out":{"hex":"#ff6e6eff","u16":[65535,28392,28392,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#ff8080ff","out":{"hex":"#ff8888ff","u16":[65535,34892,34892,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#ff8080ff","out":{"hex":"#ff8888ff","u16":[65535,34892,34892,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#ff8080ff","out":{"hex":"#ff9090ff","u16":[65535,37119,37119,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff8080ff","out":{"hex":"#ff9090ff","u16":[65535,37119,37119,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#ff8080ff","out":{"hex":"#ff9797ff","u16":[65535,38690,38690,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff8080ff","out":{"hex":"#ff9797ff","u16":[65535,38690,38690,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#ff8080ff","out":{"hex":"#ff9c9cff","u16":[65535,40187,40187,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#ff8080ff","out":{"hex":"#ff9c9cff","u16":[65535,40187,40187,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#ff8080ff","out":{"hex":"#ff9c9cff","u16":[65535,40187,40187,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff8080ff","out":{"hex":"#ff9c9cff","u16":[65535,40187,40187,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#ff8080ff","out":{"hex":"#ff7575ff","u16":[65535,30027,30027,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#ff8080ff","out":{"hex":"#ff7575ff","u16":[65535,30027,30027,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#ff8080ff","out":{"hex":"#ff5d5dff","u16":[65535,24002,24002,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#ff8080ff","out":{"hex":"#ff5d5dff","u16":[65535,24002,24002,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#ff8080ff","out":{"hex":"#ff5252ff","u16":[65535,20999,20999,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff8080ff","out":{"hex":"#ff5252ff","u16":[65535,20999,20999,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#ff8080ff","out":{"hex":"#ff4747ff","u16":[65535,18354,18354,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff8080ff","out":{"hex":"#ff4747ff","u16":[65535,18354,18354,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#ff8080ff","out":{"hex":"#ff3b3bff","u16":[65535,15146,15146,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#ff8080ff","out":{"hex":"#ff3b3bff","u16":[65535,15146,15146,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#ff8080ff","out":{"hex":"#ff3b3bff","u16":[65535,15146,15146,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff8080ff","out":{"hex":"#ff3b3bff","u16":[65535,15146,15146,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#ff8080ff","out":{"hex":"#ff6262ff","u16":[65535,25151,25151,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#ff8080ff","out":{"hex":"#ff6262ff","u16":[65535,25151,25151,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#ff8080ff","out":{"hex":"#e80000ff","u16":[59745,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#ff8080ff","out":{"hex":"#e80000ff","u16":[59745,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#ff8080ff","out":{"hex":"#c40000ff","u16":[50435,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff8080ff","out":{"hex":"#c40000ff","u16":[50435,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#ff8080ff","out":{"hex":"#a30000ff","u16":[41792,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff8080ff","out":{"hex":"#a30000ff","u16":[41792,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#ff8080ff","out":{"hex":"#750000ff","u16":[30157,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#ff8080ff","out":{"hex":"#750000ff","u16":[30157,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#ff8080ff","out":{"hex":"#750000ff","u16":[30157,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff8080ff","out":{"hex":"#750000ff","u16":[30157,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#ff8080ff","out":{"hex":"#c40000ff","u16":[50249,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#ff8080ff","out":{"hex":"#c40000ff","u16":[50249,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#ff8080ff","out":{"hex":"#970000ff","u16":[38686,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#ff8080ff","out":{"hex":"#970000ff","u16":[38686,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#ff8080ff","out":{"hex":"#7f0000ff","u16":[32657,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff8080ff","out":{"hex":"#7f0000ff","u16":[32657,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#ff8080ff","out":{"hex":"#690000ff","u16":[27061,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff8080ff","out":{"hex":"#690000ff","u16":[27061,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#ff8080ff","out":{"hex":"#4c0000ff","u16":[19527,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#ff8080ff","out":{"hex":"#4c0000ff","u16":[19527,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#ff8080ff","out":{"hex":"#4c0000ff","u16":[19527,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff8080ff","out":{"hex":"#4c0000ff","u16":[19527,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#80ff80ff","out":{"hex":"#00e000ff","u16":[0,57621,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#80ff80ff","out":{"hex":"#00e000ff","u16":[0,57621,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#80ff80ff","out":{"hex":"#d0ffd0ff","u16":[53460,65535,53460,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#80ff80ff","out":{"hex":"#d0ffd0ff","u16":[53460,65535,53460,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#80ff80ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#80ff80ff","out":{"hex":"#33ff33ff","u16":[12997,65535,12997,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#80ff80ff","out":{"hex":"#33ff33ff","u16":[12997,65535,12997,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#80ff80ff","out":{"hex":"#97ff97ff","u16":[38767,65535,38767,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#80ff80ff","out":{"hex":"#97ff97ff","u16":[38767,65535,38767,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#80ff80ff","out":{"hex":"#aeffaeff","u16":[44640,65535,44640,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#80ff80ff","out":{"hex":"#aeffaeff","u16":[44640,65535,44640,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#80ff80ff","out":{"hex":"#bdffbdff","u16":[48499,65535,48499,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#80ff80ff","out":{"hex":"#bdffbdff","u16":[48499,65535,48499,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#80ff80ff","out":{"hex":"#caffcaff","u16":[52020,65535,52020,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#80ff80ff","out":{"hex":"#caffcaff","u16":[52020,65535,52020,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#80ff80ff","out":{"hex":"#caffcaff","u16":[52020,65535,52020,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#80ff80ff","out":{"hex":"#caffcaff","u16":[52020,65535,52020,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#80ff80ff","out":{"hex":"#00fd00ff","u16":[0,65114,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#80ff80ff","out":{"hex":"#00fd00ff","u16":[0,65114,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#80ff80ff","out":{"hex":"#00e700ff","u16":[0,59493,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#80ff80ff","out":{"hex":"#00e700ff","u16":[0,59493,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#80ff80ff","out":{"hex":"#00de00ff","u16":[0,57056,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#80ff80ff","out":{"hex":"#00de00ff","u16":[0,57056,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#80ff80ff","out":{"hex":"#00d700ff","u16":[0,55144,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#80ff80ff","out":{"hex":"#00d700ff","u16":[0,55144,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#80ff80ff","out":{"hex":"#00cf00ff","u16":[0,53148,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#80ff80ff","out":{"hex":"#00cf00ff","u16":[0,53148,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#80ff80ff","out":{"hex":"#00cf00ff","u16":[0,53148,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#80ff80ff","out":{"hex":"#00cf00ff","u16":[0,53148,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#80ff80ff","out":{"hex":"#00ef00ff","u16":[0,61513,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#80ff80ff","out":{"hex":"#00ef00ff","u16":[0,61513,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#80ff80ff","out":{"hex":"#00b800ff","u16":[0,47357,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#80ff80ff","out":{"hex":"#00b800ff","u16":[0,47357,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#80ff80ff","out":{"hex":"#009c00ff","u16":[0,39978,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#80ff80ff","out":{"hex":"#009c00ff","u16":[0,39978,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#80ff80ff","out":{"hex":"#008100ff","u16":[0,33127,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#80ff80ff","out":{"hex":"#008100ff","u16":[0,33127,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#80ff80ff","out":{"hex":"#005d00ff","u16":[0,23904,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#80ff80ff","out":{"hex":"#005d00ff","u16":[0,23904,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#80ff80ff","out":{"hex":"#005d00ff","u16":[0,23904,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#80ff80ff","out":{"hex":"#005d00ff","u16":[0,23904,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#80ff80ff","out":{"hex":"#008300ff","u16":[0,33733,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#80ff80ff","out":{"hex":"#008300ff","u16":[0,33733,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#80ff80ff","out":{"hex":"#006500ff","u16":[0,25970,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#80ff80ff","out":{"hex":"#006500ff","u16":[0,25970,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#80ff80ff","out":{"hex":"#005500ff","u16":[0,21924,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#80ff80ff","out":{"hex":"#005500ff","u16":[0,21924,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#80ff80ff","out":{"hex":"#004700ff","u16":[0,18167,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#80ff80ff","out":{"hex":"#004700ff","u16":[0,18167,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#80ff80ff","out":{"hex":"#003300ff","u16":[0,13109,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#80ff80ff","out":{"hex":"#003300ff","u16":[0,13109,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#80ff80ff","out":{"hex":"#003300ff","u16":[0,13109,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#80ff80ff","out":{"hex":"#003300ff","u16":[0,13109,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#8080ffff","out":{"hex":"#5e5effff","u16":[24109,24109,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#8080ffff","out":{"hex":"#5e5effff","u16":[24109,24109,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#8080ffff","out":{"hex":"#8e8effff","u16":[36376,36376,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#8080ffff","out":{"hex":"#8e8effff","u16":[36376,36376,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#8080ffff","out":{"hex":"#9c9cffff","u16":[40086,40086,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#8080ffff","out":{"hex":"#9c9cffff","u16":[40086,40086,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#8080ffff","out":{"hex":"#a6a6ffff","u16":[42618,42618,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#8080ffff","out":{"hex":"#a6a6ffff","u16":[42618,42618,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#8080ffff","out":{"hex":"#afafffff","u16":[44981,44981,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#8080ffff","out":{"hex":"#afafffff","u16":[44981,44981,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#8080ffff","out":{"hex":"#afafffff","u16":[44981,44981,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#8080ffff","out":{"hex":"#afafffff","u16":[44981,44981,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#8080ffff","out":{"hex":"#7474ffff","u16":[29726,29726,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#8080ffff","out":{"hex":"#7474ffff","u16":[29726,29726,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#8080ffff","out":{"hex":"#8686ffff","u16":[34351,34351,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#8080ffff","out":{"hex":"#8686ffff","u16":[34351,34351,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#8080ffff","out":{"hex":"#8c8cffff","u16":[36005,36005,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#8080ffff","out":{"hex":"#8c8cffff","u16":[36005,36005,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#8080ffff","out":{"hex":"#9191ffff","u16":[37188,37188,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#8080ffff","out":{"hex":"#9191ffff","u16":[37188,37188,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#8080ffff","out":{"hex":"#9595ffff","u16":[38327,38327,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#8080ffff","out":{"hex":"#9595ffff","u16":[38327,38327,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#8080ffff","out":{"hex":"#9595ffff","u16":[38327,38327,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#8080ffff","out":{"hex":"#9595ffff","u16":[38327,38327,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#8080ffff","out":{"hex":"#7a7affff","u16":[31262,31262,65535,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#8080ffff","out":{"hex":"#7a7affff","u16":[31262,31262,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#8080ffff","out":{"hex":"#6d6dffff","u16":[28125,28125,65535,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#8080ffff","out":{"hex":"#6d6dffff","u16":[28125,28125,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#8080ffff","out":{"hex":"#6868ffff","u16":[26746,26746,65535,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#8080ffff","out":{"hex":"#6868ffff","u16":[26746,26746,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#8080ffff","out":{"hex":"#6464ffff","u16":[25652,25652,65535,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#8080ffff","out":{"hex":"#6464ffff","u16":[25652,25652,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#8080ffff","out":{"hex":"#5f5fffff","u16":[24499,24499,65535,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#8080ffff","out":{"hex":"#5f5fffff","u16":[24499,24499,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#8080ffff","out":{"hex":"#5f5fffff","u16":[24499,24499,65535,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#8080ffff","out":{"hex":"#5f5fffff","u16":[24499,24499,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#8080ffff","out":{"hex":"#6f6fffff","u16":[28495,28495,65535,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#8080ffff","out":{"hex":"#6f6fffff","u16":[28495,28495,65535,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#8080ffff","out":{"hex":"#4545ffff","u16":[17677,17677,65535,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#8080ffff","out":{"hex":"#4545ffff","u16":[17677,17677,65535,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#8080ffff","out":{"hex":"#2525ffff","u16":[9523,9523,65535,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#8080ffff","out":{"hex":"#2525ffff","u16":[9523,9523,65535,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#8080ffff","out":{"hex":"#0000e4ff","u16":[0,0,58648,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#8080ffff","out":{"hex":"#0000e4ff","u16":[0,0,58648,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#8080ffff","out":{"hex":"#0000a5ff","u16":[0,0,42320,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#8080ffff","out":{"hex":"#0000a5ff","u16":[0,0,42320,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#8080ffff","out":{"hex":"#0000a5ff","u16":[0,0,42320,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#8080ffff","out":{"hex":"#0000a5ff","u16":[0,0,42320,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#8080ffff","out":{"hex":"#2c2cffff","u16":[11424,11424,65535,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#8080ffff","out":{"hex":"#2c2cffff","u16":[11424,11424,65535,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#8080ffff","out":{"hex":"#0000dbff","u16":[0,0,56352,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#8080ffff","out":{"hex":"#0000dbff","u16":[0,0,56352,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#8080ffff","out":{"hex":"#0000b9ff","u16":[0,0,47571,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#8080ffff","out":{"hex":"#0000b9ff","u16":[0,0,47571,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#8080ffff","out":{"hex":"#000099ff","u16":[0,0,39419,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#8080ffff","out":{"hex":"#000099ff","u16":[0,0,39419,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#8080ffff","out":{"hex":"#00006fff","u16":[0,0,28444,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#8080ffff","out":{"hex":"#00006fff","u16":[0,0,28444,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#8080ffff","out":{"hex":"#00006fff","u16":[0,0,28444,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#8080ffff","out":{"hex":"#00006fff","u16":[0,0,28444,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#030201ff","out":{"hex":"#593b1eff","u16":[22767,15178,7589,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#030201ff","out":{"hex":"#5d3a00ff","u16":[23803,14809,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#030201ff","out":{"hex":"#ec9d4fff","u16":[60531,40354,20177,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#030201ff","out":{"hex":"#f69900ff","u16":[63286,39374,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#030201ff","out":{"hex":"#f9d4bcff","u16":[64036,54467,48299,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#030201ff","out":{"hex":"#ffd2b5ff","u16":[65535,54079,46406,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#030201ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#030201ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#030201ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#030201ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#030201ff","out":{"hex":"#462f17ff","u16":[18053,12035,6018,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#030201ff","out":{"hex":"#492e00ff","u16":[18874,11743,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#030201ff","out":{"hex":"#bf7f40ff","u16":[48991,32661,16330,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#030201ff","out":{"hex":"#c77c00ff","u16":[51221,31868,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#030201ff","out":{"hex":"#f0a050ff","u16":[61794,41196,20598,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#030201ff","out":{"hex":"#fb9c00ff","u16":[64607,40196,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#030201ff","out":{"hex":"#f7c5a1ff","u16":[63581,50594,41456,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#030201ff","out":{"hex":"#ffc396ff","u16":[65535,50041,38443,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#030201ff","out":{"hex":"#f7c5a1ff","u16":[63581,50594,41456,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#030201ff","out":{"hex":"#ffc396ff","u16":[65535,50041,38443,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#030201ff","out":{"hex":"#2b1c0eff","u16":[10966,7311,3655,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#030201ff","out":{"hex":"#2d1c00ff","u16":[11465,7133,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#030201ff","out":{"hex":"#744d27ff","u16":[29736,19824,9912,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#030201ff","out":{"hex":"#794b00ff","u16":[31090,19343,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#030201ff","out":{"hex":"#926131ff","u16":[37506,25004,12502,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#030201ff","out":{"hex":"#995f00ff","u16":[39213,24397,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#030201ff","out":{"hex":"#aa7139ff","u16":[43703,29135,14568,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#030201ff","out":{"hex":"#b26f00ff","u16":[45692,28428,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#030201ff","out":{"hex":"#aa7139ff","u16":[43703,29135,14568,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#030201ff","out":{"hex":"#b26f00ff","u16":[45692,28428,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#030201ff","out":{"hex":"#3a2713ff","u16":[15017,10012,5006,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#030201ff","out":{"hex":"#3d2600ff","u16":[15701,9768,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#030201ff","out":{"hex":"#9f6a35ff","u16":[40746,27164,13582,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#030201ff","out":{"hex":"#a66700ff","u16":[42601,26504,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#030201ff","out":{"hex":"#c88543ff","u16":[51394,34263,17131,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#030201ff","out":{"hex":"#d18200ff","u16":[53733,33431,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#030201ff","out":{"hex":"#e99b4eff","u16":[59887,39924,19962,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#030201ff","out":{"hex":"#f49800ff","u16":[62612,38955,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#030201ff","out":{"hex":"#e99b4eff","u16":[59887,39924,19962,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#030201ff","out":{"hex":"#f49800ff","u16":[62612,38955,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#030201ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#030201ff","out":{"hex":"#462f17ff","u16":[18053,12035,6018,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#030201ff","out":{"hex":"#492e00ff","u16":[18874,11743,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#030201ff","out":{"hex":"#bf7f40ff","u16":[48991,32661,16330,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#030201ff","out":{"hex":"#c77c00ff","u16":[51221,31868,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#030201ff","out":{"hex":"#f0a050ff","u16":[61794,41196,20598,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#030201ff","out":{"hex":"#fb9c00ff","u16":[64607,40196,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#030201ff","out":{"hex":"#f7c5a1ff","u16":[63581,50594,41456,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#030201ff","out":{"hex":"#ffc396ff","u16":[65535,50041,38443,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#030201ff","out":{"hex":"#f7c5a1ff","u16":[63581,50594,41456,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#030201ff","out":{"hex":"#ffc396ff","u16":[65535,50041,38443,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#fffefdff","out":{"hex":"#fff9f2ff","u16":[65535,63866,62152,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#fffefdff","out":{"hex":"#fff9f2ff","u16":[65535,63866,62152,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#fffefdff","out":{"hex":"#ffe1bdff","u16":[65535,57802,48616,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#fffefdff","out":{"hex":"#ffe1bdff","u16":[65535,57802,48616,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#fffefdff","out":{"hex":"#ffcd85ff","u16":[65535,52696,34241,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#fffefdff","out":{"hex":"#ffcd85ff","u16":[65535,52696,34241,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#fffefdff","out":{"hex":"#fcb700ff","u16":[64651,47128,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#fffefdff","out":{"hex":"#fcb700ff","u16":[64651,47128,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#fffefdff","out":{"hex":"#fcb700ff","u16":[64651,47128,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#fffefdff","out":{"hex":"#fcb700ff","u16":[64651,47128,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#fffefdff","out":{"hex":"#fffbf7ff","u16":[65535,64577,63606,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#fffefdff","out":{"hex":"#fffbf7ff","u16":[65535,64577,63606,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#fffefdff","out":{"hex":"#fff0e0ff","u16":[65535,61676,57523,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#fffefdff","out":{"hex":"#fff0e0ff","u16":[65535,61676,57523,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#fffefdff","out":{"hex":"#ffe7ccff","u16":[65535,59388,52398,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#fffefdff","out":{"hex":"#ffe7ccff","u16":[65535,59388,52398,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#fffefdff","out":{"hex":"#ffdeb5ff","u16":[65535,56989,46585,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#fffefdff","out":{"hex":"#ffdeb5ff","u16":[65535,56989,46585,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#fffefdff","out":{"hex":"#ffdeb5ff","u16":[65535,56989,46585,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#fffefdff","out":{"hex":"#ffdeb5ff","u16":[65535,56989,46585,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#fffefdff","out":{"hex":"#fff9f2ff","u16":[65535,63866,62152,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#fffefdff","out":{"hex":"#fff9f2ff","u16":[65535,63866,62152,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#fffefdff","out":{"hex":"#ffe1bdff","u16":[65535,57802,48616,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#fffefdff","out":{"hex":"#ffe1bdff","u16":[65535,57802,48616,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#fffefdff","out":{"hex":"#ffcd85ff","u16":[65535,52696,34241,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#fffefdff","out":{"hex":"#ffcd85ff","u16":[65535,52696,34241,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#fffefdff","out":{"hex":"#fcb700ff","u16":[64651,47128,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#fffefdff","out":{"hex":"#fcb700ff","u16":[64651,47128,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#fffefdff","out":{"hex":"#fcb700ff","u16":[64651,47128,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#fffefdff","out":{"hex":"#fcb700ff","u16":[64651,47128,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#fffefdff","out":{"hex":"#fff6ecff","u16":[65535,63146,60656,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#fffefdff","out":{"hex":"#fff6ecff","u16":[65535,63146,60656,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#fffefdff","out":{"hex":"#ffd190ff","u16":[65535,53588,37111,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#fffefdff","out":{"hex":"#ffd190ff","u16":[65535,53588,37111,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#fffefdff","out":{"hex":"#f3b100ff","u16":[62481,45546,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#fffefdff","out":{"hex":"#f3b100ff","u16":[62481,45546,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#fffefdff","out":{"hex":"#c89200ff","u16":[51328,37416,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#fffefdff","out":{"hex":"#c89200ff","u16":[51328,37416,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#fffefdff","out":{"hex":"#c89200ff","u16":[51328,37416,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#fffefdff","out":{"hex":"#c89200ff","u16":[51328,37416,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#fffefdff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#fffefdff","out":{"hex":"#fff0e0ff","u16":[65535,61676,57523,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#fffefdff","out":{"hex":"#fff0e0ff","u16":[65535,61676,57523,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#fffefdff","out":{"hex":"#f7b400ff","u16":[63577,46345,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#fffefdff","out":{"hex":"#f7b400ff","u16":[63577,46345,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#fffefdff","out":{"hex":"#b38300ff","u16":[46101,33605,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#fffefdff","out":{"hex":"#b38300ff","u16":[46101,33605,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#fffefdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#fffefdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#fffefdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#fffefdff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#7f8081ff","out":{"hex":"#666667ff","u16":[26087,26293,26498,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#7f8081ff","out":{"hex":"#4a6a82ff","u16":[18907,27241,33317,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#7f8081ff","out":{"hex":"#8a8b8cff","u16":[35386,35665,35944,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#7f8081ff","out":{"hex":"#6490b0ff","u16":[25646,36950,45193,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#7f8081ff","out":{"hex":"#959798ff","u16":[38378,38680,38982,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#7f8081ff","out":{"hex":"#6c9cbfff","u16":[27814,40074,49013,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#7f8081ff","out":{"hex":"#9d9fa0ff","u16":[40449,40768,41086,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#7f8081ff","out":{"hex":"#72a4c9ff","u16":[29316,42237,51659,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#7f8081ff","out":{"hex":"#a5a6a8ff","u16":[42401,42735,43069,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#7f8081ff","out":{"hex":"#78acd3ff","u16":[30730,44275,54152,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#7f8081ff","out":{"hex":"#a5a6a8ff","u16":[42401,42735,43069,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#7f8081ff","out":{"hex":"#78acd3ff","u16":[30730,44275,54152,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#7f8081ff","out":{"hex":"#757677ff","u16":[30075,30311,30548,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#7f8081ff","out":{"hex":"#557a95ff","u16":[21797,31404,38409,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#7f8081ff","out":{"hex":"#848586ff","u16":[33835,34101,34368,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#7f8081ff","out":{"hex":"#5f89a8ff","u16":[24522,35330,43212,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#7f8081ff","out":{"hex":"#898a8bff","u16":[35206,35483,35760,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#7f8081ff","out":{"hex":"#638fafff","u16":[25516,36762,44963,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#7f8081ff","out":{"hex":"#8d8e8fff","u16":[36194,36479,36764,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#7f8081ff","out":{"hex":"#6693b4ff","u16":[26231,37793,46224,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#7f8081ff","out":{"hex":"#919293ff","u16":[37150,37443,37735,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#7f8081ff","out":{"hex":"#6997b9ff","u16":[26925,38792,47446,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#7f8081ff","out":{"hex":"#919293ff","u16":[37150,37443,37735,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#7f8081ff","out":{"hex":"#6997b9ff","u16":[26925,38792,47446,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#7f8081ff","out":{"hex":"#7a7b7cff","u16":[31478,31726,31974,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#7f8081ff","out":{"hex":"#59809cff","u16":[22814,32870,40202,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#7f8081ff","out":{"hex":"#727374ff","u16":[29313,29544,29775,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#7f8081ff","out":{"hex":"#537792ff","u16":[21245,30609,37437,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#7f8081ff","out":{"hex":"#6e6f70ff","u16":[28391,28615,28838,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#7f8081ff","out":{"hex":"#50738dff","u16":[20577,29646,36259,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#7f8081ff","out":{"hex":"#6c6d6dff","u16":[27675,27893,28111,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#7f8081ff","out":{"hex":"#4e708aff","u16":[20058,28899,35345,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#7f8081ff","out":{"hex":"#696a6aff","u16":[26937,27149,27361,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#7f8081ff","out":{"hex":"#4c6d86ff","u16":[19522,28127,34402,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#7f8081ff","out":{"hex":"#696a6aff","u16":[26937,27149,27361,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#7f8081ff","out":{"hex":"#4c6d86ff","u16":[19522,28127,34402,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#7f8081ff","out":{"hex":"#737475ff","u16":[29491,29723,29955,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#7f8081ff","out":{"hex":"#537893ff","u16":[21374,30794,37664,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#7f8081ff","out":{"hex":"#58595aff","u16":[22704,22883,23062,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#7f8081ff","out":{"hex":"#405c71ff","u16":[16455,23708,28996,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#7f8081ff","out":{"hex":"#4b4b4cff","u16":[19166,19317,19468,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#7f8081ff","out":{"hex":"#364e5fff","u16":[13891,20013,24478,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#7f8081ff","out":{"hex":"#3e3e3fff","u16":[15882,16007,16132,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#7f8081ff","out":{"hex":"#2d414fff","u16":[11510,16584,20283,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#7f8081ff","out":{"hex":"#2d2d2dff","u16":[11460,11550,11641,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#7f8081ff","out":{"hex":"#202f39ff","u16":[8306,11967,14636,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#7f8081ff","out":{"hex":"#2d2d2dff","u16":[11460,11550,11641,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#7f8081ff","out":{"hex":"#202f39ff","u16":[8306,11967,14636,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#7f8081ff","out":{"hex":"#4f4f50ff","u16":[20186,20345,20504,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#7f8081ff","out":{"hex":"#395264ff","u16":[14630,21078,25780,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#7f8081ff","out":{"hex":"#3c3d3dff","u16":[15540,15663,15785,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#7f8081ff","out":{"hex":"#2c3f4dff","u16":[11263,16228,19847,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#7f8081ff","out":{"hex":"#333334ff","u16":[13119,13222,13325,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#7f8081ff","out":{"hex":"#253541ff","u16":[9508,13698,16755,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#7f8081ff","out":{"hex":"#2a2b2bff","u16":[10871,10956,11042,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#7f8081ff","out":{"hex":"#1f2c36ff","u16":[7878,11351,13883,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#7f8081ff","out":{"hex":"#1f1f1fff","u16":[7844,7906,7968,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#7f8081ff","out":{"hex":"#162027ff","u16":[5685,8191,10018,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#7f8081ff","out":{"hex":"#1f1f1fff","u16":[7844,7906,7968,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#7f8081ff","out":{"hex":"#162027ff","u16":[5685,8191,10018,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#010000ff","out":{"hex":"#840000ff","u16":[33943,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#010000ff","out":{"hex":"#840000ff","u16":[33943,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#010000ff","out":{"hex":"#ff8e8eff","u16":[65535,36510,36510,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#010000ff","out":{"hex":"#ff8e8eff","u16":[65535,36510,36510,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#010000ff","out":{"hex":"#ffd0d0ff","u16":[65535,53428,53428,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#010000ff","out":{"hex":"#ffd0d0ff","u16":[65535,53428,53428,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#010000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#010000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#010000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#010000ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#010000ff","out":{"hex":"#690000ff","u16":[26910,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#010000ff","out":{"hex":"#690000ff","u16":[26910,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#010000ff","out":{"hex":"#ff4e4eff","u16":[65535,19931,19931,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#010000ff","out":{"hex":"#ff4e4eff","u16":[65535,19931,19931,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#010000ff","out":{"hex":"#ff9494ff","u16":[65535,38000,38000,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#010000ff","out":{"hex":"#ff9494ff","u16":[65535,38000,38000,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#010000ff","out":{"hex":"#ffbfbfff","u16":[65535,49111,49111,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#010000ff","out":{"hex":"#ffbfbfff","u16":[65535,49111,49111,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#010000ff","out":{"hex":"#ffbfbfff","u16":[65535,49111,49111,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#010000ff","out":{"hex":"#ffbfbfff","u16":[65535,49111,49111,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#010000ff","out":{"hex":"#400000ff","u16":[16333,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#010000ff","out":{"hex":"#400000ff","u16":[16333,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#010000ff","out":{"hex":"#ad0000ff","u16":[44339,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#010000ff","out":{"hex":"#ad0000ff","u16":[44339,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#010000ff","out":{"hex":"#da0000ff","u16":[55927,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#010000ff","out":{"hex":"#da0000ff","u16":[55927,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#010000ff","out":{"hex":"#fe0000ff","u16":[65170,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#010000ff","out":{"hex":"#fe0000ff","u16":[65170,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#010000ff","out":{"hex":"#fe0000ff","u16":[65170,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#010000ff","out":{"hex":"#fe0000ff","u16":[65170,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#010000ff","out":{"hex":"#570000ff","u16":[22381,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#010000ff","out":{"hex":"#570000ff","u16":[22381,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#010000ff","out":{"hex":"#ec0000ff","u16":[60760,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#010000ff","out":{"hex":"#ec0000ff","u16":[60760,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#010000ff","out":{"hex":"#ff5e5eff","u16":[65535,24128,24128,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#010000ff","out":{"hex":"#ff5e5eff","u16":[65535,24128,24128,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#010000ff","out":{"hex":"#ff8b8bff","u16":[65535,35737,35737,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#010000ff","out":{"hex":"#ff8b8bff","u16":[65535,35737,35737,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#010000ff","out":{"hex":"#ff8b8bff","u16":[65535,35737,35737,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#010000ff","out":{"hex":"#ff8b8bff","u16":[65535,35737,35737,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#010000ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#010000ff","out":{"hex":"#690000ff","u16":[26910,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#010000ff","out":{"hex":"#690000ff","u16":[26910,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#010000ff","out":{"hex":"#ff4e4eff","u16":[65535,19931,19931,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#010000ff","out":{"hex":"#ff4e4eff","u16":[65535,19931,19931,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#010000ff","out":{"hex":"#ff9494ff","u16":[65535,38000,38000,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#010000ff","out":{"hex":"#ff9494ff","u16":[65535,38000,38000,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#010000ff","out":{"hex":"#ffbfbfff","u16":[65535,49111,49111,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#010000ff","out":{"hex":"#ffbfbfff","u16":[65535,49111,49111,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#010000ff","out":{"hex":"#ffbfbfff","u16":[65535,49111,49111,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#010000ff","out":{"hex":"#ffbfbfff","u16":[65535,49111,49111,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#000001ff","out":{"hex":"#0000d8ff","u16":[0,0,55455,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#000001ff","out":{"hex":"#0000d8ff","u16":[0,0,55455,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#000001ff","out":{"hex":"#a5a5ffff","u16":[42499,42499,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#000001ff","out":{"hex":"#a5a5ffff","u16":[42499,42499,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#000001ff","out":{"hex":"#d8d8ffff","u16":[55466,55466,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#000001ff","out":{"hex":"#d8d8ffff","u16":[55466,55466,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#000001ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#000001ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#000001ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#000001ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#000001ff","out":{"hex":"#0000abff","u16":[0,0,43965,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#000001ff","out":{"hex":"#0000abff","u16":[0,0,43965,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#000001ff","out":{"hex":"#7e7effff","u16":[32462,32462,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#000001ff","out":{"hex":"#7e7effff","u16":[32462,32462,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#000001ff","out":{"hex":"#aaaaffff","u16":[43563,43563,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#000001ff","out":{"hex":"#aaaaffff","u16":[43563,43563,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#000001ff","out":{"hex":"#cacaffff","u16":[52003,52003,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#000001ff","out":{"hex":"#cacaffff","u16":[52003,52003,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#000001ff","out":{"hex":"#cacaffff","u16":[52003,52003,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#000001ff","out":{"hex":"#cacaffff","u16":[52003,52003,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#000001ff","out":{"hex":"#000068ff","u16":[0,0,26683,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#000001ff","out":{"hex":"#000068ff","u16":[0,0,26683,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#000001ff","out":{"hex":"#2a2affff","u16":[10864,10864,65535,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#000001ff","out":{"hex":"#2a2affff","u16":[10864,10864,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#000001ff","out":{"hex":"#5353ffff","u16":[21241,21241,65535,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#000001ff","out":{"hex":"#5353ffff","u16":[21241,21241,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#000001ff","out":{"hex":"#6b6bffff","u16":[27543,27543,65535,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#000001ff","out":{"hex":"#6b6bffff","u16":[27543,27543,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#000001ff","out":{"hex":"#6b6bffff","u16":[27543,27543,65535,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#000001ff","out":{"hex":"#6b6bffff","u16":[27543,27543,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#000001ff","out":{"hex":"#00008eff","u16":[0,0,36565,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#000001ff","out":{"hex":"#00008eff","u16":[0,0,36565,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#000001ff","out":{"hex":"#6060ffff","u16":[24635,24635,65535,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#000001ff","out":{"hex":"#6060ffff","u16":[24635,24635,65535,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#000001ff","out":{"hex":"#8787ffff","u16":[34614,34614,65535,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#000001ff","out":{"hex":"#8787ffff","u16":[34614,34614,65535,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#000001ff","out":{"hex":"#a3a3ffff","u16":[41955,41955,65535,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#000001ff","out":{"hex":"#a3a3ffff","u16":[41955,41955,65535,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#000001ff","out":{"hex":"#a3a3ffff","u16":[41955,41955,65535,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#000001ff","out":{"hex":"#a3a3ffff","u16":[41955,41955,65535,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#000001ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#000001ff","out":{"hex":"#0000abff","u16":[0,0,43965,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#000001ff","out":{"hex":"#0000abff","u16":[0,0,43965,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#000001ff","out":{"hex":"#7e7effff","u16":[32462,32462,65535,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#000001ff","out":{"hex":"#7e7effff","u16":[32462,32462,65535,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#000001ff","out":{"hex":"#aaaaffff","u16":[43563,43563,65535,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#000001ff","out":{"hex":"#aaaaffff","u16":[43563,43563,65535,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#000001ff","out":{"hex":"#cacaffff","u16":[52003,52003,65535,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#000001ff","out":{"hex":"#cacaffff","u16":[52003,52003,65535,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#000001ff","out":{"hex":"#cacaffff","u16":[52003,52003,65535,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#000001ff","out":{"hex":"#cacaffff","u16":[52003,52003,65535,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#fefffeff","out":{"hex":"#edffedff","u16":[60899,65535,60899,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#fefffeff","out":{"hex":"#edffedff","u16":[60899,65535,60899,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#fefffeff","out":{"hex":"#91ff91ff","u16":[37284,65535,37284,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#fefffeff","out":{"hex":"#91ff91ff","u16":[37284,65535,37284,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#fefffeff","out":{"hex":"#00f900ff","u16":[0,63944,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#fefffeff","out":{"hex":"#00f900ff","u16":[0,63944,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#fefffeff","out":{"hex":"#00e400ff","u16":[0,58522,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#fefffeff","out":{"hex":"#00e400ff","u16":[0,58522,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#fefffeff","out":{"hex":"#00e400ff","u16":[0,58522,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#fefffeff","out":{"hex":"#00e400ff","u16":[0,58522,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#fefffeff","out":{"hex":"#f6fff6ff","u16":[63134,65535,63134,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#fefffeff","out":{"hex":"#f6fff6ff","u16":[63134,65535,63134,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#fefffeff","out":{"hex":"#d0ffd0ff","u16":[53513,65535,53513,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#fefffeff","out":{"hex":"#d0ffd0ff","u16":[53513,65535,53513,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#fefffeff","out":{"hex":"#aeffaeff","u16":[44636,65535,44636,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#fefffeff","out":{"hex":"#aeffaeff","u16":[44636,65535,44636,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#fefffeff","out":{"hex":"#80ff80ff","u16":[32855,65535,32855,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#fefffeff","out":{"hex":"#80ff80ff","u16":[32855,65535,32855,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#fefffeff","out":{"hex":"#80ff80ff","u16":[32855,65535,32855,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#fefffeff","out":{"hex":"#80ff80ff","u16":[32855,65535,32855,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#fefffeff","out":{"hex":"#edffedff","u16":[60899,65535,60899,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#fefffeff","out":{"hex":"#edffedff","u16":[60899,65535,60899,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#fefffeff","out":{"hex":"#91ff91ff","u16":[37284,65535,37284,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#fefffeff","out":{"hex":"#91ff91ff","u16":[37284,65535,37284,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#fefffeff","out":{"hex":"#00f900ff","u16":[0,63944,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#fefffeff","out":{"hex":"#00f900ff","u16":[0,63944,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#fefffeff","out":{"hex":"#00e400ff","u16":[0,58522,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#fefffeff","out":{"hex":"#00e400ff","u16":[0,58522,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#fefffeff","out":{"hex":"#00e400ff","u16":[0,58522,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#fefffeff","out":{"hex":"#00e400ff","u16":[0,58522,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#fefffeff","out":{"hex":"#e4ffe4ff","u16":[58561,65535,58561,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#fefffeff","out":{"hex":"#e4ffe4ff","u16":[58561,65535,58561,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#fefffeff","out":{"hex":"#00fc00ff","u16":[0,64795,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#fefffeff","out":{"hex":"#00fc00ff","u16":[0,64795,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#fefffeff","out":{"hex":"#00dc00ff","u16":[0,56574,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#fefffeff","out":{"hex":"#00dc00ff","u16":[0,56574,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#fefffeff","out":{"hex":"#00b500ff","u16":[0,46585,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#fefffeff","out":{"hex":"#00b500ff","u16":[0,46585,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#fefffeff","out":{"hex":"#00b500ff","u16":[0,46585,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#fefffeff","out":{"hex":"#00b500ff","u16":[0,46585,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#fefffeff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#fefffeff","out":{"hex":"#d0ffd0ff","u16":[53513,65535,53513,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#fefffeff","out":{"hex":"#d0ffd0ff","u16":[53513,65535,53513,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#fefffeff","out":{"hex":"#00e000ff","u16":[0,57558,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#fefffeff","out":{"hex":"#00e000ff","u16":[0,57558,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#fefffeff","out":{"hex":"#00a300ff","u16":[0,41915,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#fefffeff","out":{"hex":"#00a300ff","u16":[0,41915,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#fefffeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#fefffeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#fefffeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#fefffeff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#3daee9ff","out":{"hex":"#3290c1ff","u16":[12967,36988,49529,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#3daee9ff","out":{"hex":"#0091c7ff","u16":[0,37260,51067,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#3daee9ff","out":{"hex":"#4bbaf7ff","u16":[19330,47912,63602,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#3daee9ff","out":{"hex":"#2bbcffff","u16":[11102,48251,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#3daee9ff","out":{"hex":"#7ac6f9ff","u16":[31305,50791,63873,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#3daee9ff","out":{"hex":"#6dc7ffff","u16":[28119,51064,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#3daee9ff","out":{"hex":"#92cef9ff","u16":[37530,52828,64075,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#3daee9ff","out":{"hex":"#89ceffff","u16":[35335,53057,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#3daee9ff","out":{"hex":"#a6d5faff","u16":[42710,54775,64277,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#3daee9ff","out":{"hex":"#a0d6ffff","u16":[41108,54964,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#3daee9ff","out":{"hex":"#a6d5faff","u16":[42710,54775,64277,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#3daee9ff","out":{"hex":"#a0d6ffff","u16":[41108,54964,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#3daee9ff","out":{"hex":"#39a4dbff","u16":[14749,42070,56336,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#3daee9ff","out":{"hex":"#00a5e2ff","u16":[0,42380,58085,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#3daee9ff","out":{"hex":"#3fb3f0ff","u16":[16117,45974,61563,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#3daee9ff","out":{"hex":"#00b4f7ff","u16":[0,46312,63474,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#3daee9ff","out":{"hex":"#41b9f7ff","u16":[16627,47428,63511,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#3daee9ff","out":{"hex":"#00baffff","u16":[0,47778,65483,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#3daee9ff","out":{"hex":"#52bcf8ff","u16":[21175,48262,63634,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#3daee9ff","out":{"hex":"#38bdffff","u16":[14469,48592,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#3daee9ff","out":{"hex":"#61bff8ff","u16":[24886,49070,63709,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#3daee9ff","out":{"hex":"#4ec0ffff","u16":[19992,49381,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#3daee9ff","out":{"hex":"#61bff8ff","u16":[24886,49070,63709,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#3daee9ff","out":{"hex":"#4ec0ffff","u16":[19992,49381,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#3daee9ff","out":{"hex":"#3ba7e0ff","u16":[15084,43027,57617,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#3daee9ff","out":{"hex":"#00a9e7ff","u16":[0,43344,59406,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#3daee9ff","out":{"hex":"#369bd0ff","u16":[13973,39859,53374,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#3daee9ff","out":{"hex":"#009cd6ff","u16":[0,40152,55031,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#3daee9ff","out":{"hex":"#3596c9ff","u16":[13498,38503,51559,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#3daee9ff","out":{"hex":"#0097cfff","u16":[0,38787,53160,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#3daee9ff","out":{"hex":"#3392c3ff","u16":[13128,37447,50145,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#3daee9ff","out":{"hex":"#0093c9ff","u16":[0,37723,51702,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#3daee9ff","out":{"hex":"#328dbdff","u16":[12745,36355,48682,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#3daee9ff","out":{"hex":"#008fc3ff","u16":[0,36623,50194,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#3daee9ff","out":{"hex":"#328dbdff","u16":[12745,36355,48682,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#3daee9ff","out":{"hex":"#008fc3ff","u16":[0,36623,50194,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#3daee9ff","out":{"hex":"#379dd3ff","u16":[14165,40405,54105,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#3daee9ff","out":{"hex":"#009ed9ff","u16":[0,40702,55785,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#3daee9ff","out":{"hex":"#2a79a2ff","u16":[10905,31107,41654,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#3daee9ff","out":{"hex":"#007aa7ff","u16":[0,31336,42948,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#3daee9ff","out":{"hex":"#246689ff","u16":[9206,26259,35163,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#3daee9ff","out":{"hex":"#00678dff","u16":[0,26453,36255,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#3daee9ff","out":{"hex":"#1e5571ff","u16":[7628,21759,29137,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#3daee9ff","out":{"hex":"#005575ff","u16":[0,21919,30042,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#3daee9ff","out":{"hex":"#153d52ff","u16":[5504,15701,21025,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#3daee9ff","out":{"hex":"#003e54ff","u16":[0,15817,21678,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#3daee9ff","out":{"hex":"#153d52ff","u16":[5504,15701,21025,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#3daee9ff","out":{"hex":"#003e54ff","u16":[0,15817,21678,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#3daee9ff","out":{"hex":"#246689ff","u16":[9200,26243,35140,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#3daee9ff","out":{"hex":"#00678dff","u16":[0,26435,36232,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#3daee9ff","out":{"hex":"#1c4f69ff","u16":[7083,20204,27054,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#3daee9ff","out":{"hex":"#004f6dff","u16":[0,20352,27894,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#3daee9ff","out":{"hex":"#174259ff","u16":[5979,17055,22838,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#3daee9ff","out":{"hex":"#00435cff","u16":[0,17181,23547,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#3daee9ff","out":{"hex":"#13374aff","u16":[4954,14132,18924,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#3daee9ff","out":{"hex":"#00374cff","u16":[0,14236,19512,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#3daee9ff","out":{"hex":"#0e2835ff","u16":[3575,10198,13655,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#3daee9ff","out":{"hex":"#002837ff","u16":[0,10273,14080,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#3daee9ff","out":{"hex":"#0e2835ff","u16":[3575,10198,13655,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#3daee9ff","out":{"hex":"#002837ff","u16":[0,10273,14080,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#232629ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#232629ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#232629ff","out":{"hex":"#303438ff","u16":[12270,13321,14373,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#232629ff","out":{"hex":"#203645ff","u16":[8218,13767,17737,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#232629ff","out":{"hex":"#3b4045ff","u16":[15165,16465,17765,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#232629ff","out":{"hex":"#284255ff","u16":[10157,17017,21923,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#232629ff","out":{"hex":"#42484dff","u16":[16963,18417,19871,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#232629ff","out":{"hex":"#2c4a5fff","u16":[11361,19034,24522,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#232629ff","out":{"hex":"#484e55ff","u16":[18556,20147,21738,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#232629ff","out":{"hex":"#305168ff","u16":[12429,20822,26825,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#232629ff","out":{"hex":"#484e55ff","u16":[18556,20147,21738,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#232629ff","out":{"hex":"#305168ff","u16":[12429,20822,26825,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#232629ff","out":{"hex":"#070808ff","u16":[1838,1996,2153,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#232629ff","out":{"hex":"#05080aff","u16":[1231,2063,2657,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#232629ff","out":{"hex":"#2a2d31ff","u16":[10765,11688,12611,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#232629ff","out":{"hex":"#1c2f3dff","u16":[7210,12080,15563,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#232629ff","out":{"hex":"#313539ff","u16":[12511,13583,14656,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#232629ff","out":{"hex":"#213746ff","u16":[8380,14038,18086,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#232629ff","out":{"hex":"#353a3eff","u16":[13649,14819,15989,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#232629ff","out":{"hex":"#243c4dff","u16":[9142,15316,19732,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#232629ff","out":{"hex":"#393e43ff","u16":[14684,15942,17201,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#232629ff","out":{"hex":"#264053ff","u16":[9835,16476,21227,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#232629ff","out":{"hex":"#393e43ff","u16":[14684,15942,17201,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#232629ff","out":{"hex":"#264053ff","u16":[9835,16476,21227,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#232629ff","out":{"hex":"#222528ff","u16":[8701,9447,10193,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#232629ff","out":{"hex":"#172631ff","u16":[5828,9763,12579,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#232629ff","out":{"hex":"#202225ff","u16":[8156,8855,9555,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#232629ff","out":{"hex":"#15242eff","u16":[5463,9152,11791,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#232629ff","out":{"hex":"#1f2124ff","u16":[7926,8605,9284,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#232629ff","out":{"hex":"#15232dff","u16":[5308,8893,11457,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#232629ff","out":{"hex":"#1e2123ff","u16":[7747,8411,9075,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#232629ff","out":{"hex":"#14222cff","u16":[5189,8693,11199,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#232629ff","out":{"hex":"#1d2022ff","u16":[7564,8212,8860,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#232629ff","out":{"hex":"#14212bff","u16":[5066,8487,10934,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#232629ff","out":{"hex":"#1d2022ff","u16":[7564,8212,8860,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#232629ff","out":{"hex":"#14212bff","u16":[5066,8487,10934,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#232629ff","out":{"hex":"#202225ff","u16":[8127,8824,9521,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#232629ff","out":{"hex":"#15232eff","u16":[5444,9120,11749,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#232629ff","out":{"hex":"#181a1dff","u16":[6257,6793,7330,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#232629ff","out":{"hex":"#101b23ff","u16":[4191,7021,9045,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#232629ff","out":{"hex":"#151618ff","u16":[5282,5735,6188,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#232629ff","out":{"hex":"#0e171eff","u16":[3538,5927,7636,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#232629ff","out":{"hex":"#111214ff","u16":[4377,4752,5127,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#232629ff","out":{"hex":"#0b1319ff","u16":[2932,4911,6327,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#232629ff","out":{"hex":"#0c0d0eff","u16":[3158,3429,3700,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#232629ff","out":{"hex":"#080e12ff","u16":[2115,3544,4566,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#232629ff","out":{"hex":"#0c0d0eff","u16":[3158,3429,3700,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#232629ff","out":{"hex":"#080e12ff","u16":[2115,3544,4566,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#232629ff","out":{"hex":"#17191bff","u16":[5907,6413,6920,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#232629ff","out":{"hex":"#0f1a21ff","u16":[3957,6628,8539,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#232629ff","out":{"hex":"#121315ff","u16":[4547,4937,5327,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#232629ff","out":{"hex":"#0c141aff","u16":[3046,5103,6574,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#232629ff","out":{"hex":"#0f1011ff","u16":[3839,4168,4497,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#232629ff","out":{"hex":"#0a1116ff","u16":[2571,4308,5550,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#232629ff","out":{"hex":"#0c0d0eff","u16":[3181,3454,3726,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#232629ff","out":{"hex":"#080e12ff","u16":[2131,3569,4598,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#232629ff","out":{"hex":"#090a0aff","u16":[2295,2492,2689,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#232629ff","out":{"hex":"#060a0dff","u16":[1537,2576,3318,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#232629ff","out":{"hex":"#090a0aff","u16":[2295,2492,2689,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#232629ff","out":{"hex":"#060a0dff","u16":[1537,2576,3318,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#eff0f1ff","out":{"hex":"#c8ccd0ff","u16":[51452,52431,53393,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#eff0f1ff","out":{"hex":"#b0d0ebff","u16":[45139,53353,60305,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#eff0f1ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#eff0f1ff","out":{"hex":"#e8eaebff","u16":[59643,60018,60392,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#eff0f1ff","out":{"hex":"#dfebf6ff","u16":[57368,60376,63227,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#eff0f1ff","out":{"hex":"#f2f3f4ff","u16":[62290,62491,62693,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#eff0f1ff","out":{"hex":"#eef4faff","u16":[61084,62684,64244,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#eff0f1ff","out":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#eff0f1ff","out":{"hex":"#f3f7fcff","u16":[62497,63580,64645,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#eff0f1ff","out":{"hex":"#f9fafaff","u16":[64065,64155,64245,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#eff0f1ff","out":{"hex":"#f7fafdff","u16":[63532,64241,64944,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#eff0f1ff","out":{"hex":"#fcfcfdff","u16":[64808,64852,64897,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#eff0f1ff","out":{"hex":"#fbfdfeff","u16":[64547,64895,65242,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#eff0f1ff","out":{"hex":"#fcfcfdff","u16":[64808,64852,64897,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#eff0f1ff","out":{"hex":"#fbfdfeff","u16":[64547,64895,65242,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#eff0f1ff","out":{"hex":"#e4e5e7ff","u16":[58483,58937,59388,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#eff0f1ff","out":{"hex":"#d9e7f4ff","u16":[55711,59369,62792,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#eff0f1ff","out":{"hex":"#ced1d4ff","u16":[52861,53727,54581,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#eff0f1ff","out":{"hex":"#b8d4edff","u16":[47346,54545,60782,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#eff0f1ff","out":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#eff0f1ff","out":{"hex":"#a9cce9ff","u16":[43450,52465,59955,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#eff0f1ff","out":{"hex":"#bdc1c6ff","u16":[48453,49685,50888,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#eff0f1ff","out":{"hex":"#9dc6e7ff","u16":[40227,50838,59326,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#eff0f1ff","out":{"hex":"#b5babfff","u16":[46408,47826,49202,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#eff0f1ff","out":{"hex":"#8fbfe4ff","u16":[36660,49145,58689,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#eff0f1ff","out":{"hex":"#b5babfff","u16":[46408,47826,49202,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#eff0f1ff","out":{"hex":"#8fbfe4ff","u16":[36660,49145,58689,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#eff0f1ff","out":{"hex":"#d6d9dcff","u16":[55099,55795,56484,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#eff0f1ff","out":{"hex":"#c5dcf0ff","u16":[50752,56455,61563,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#eff0f1ff","out":{"hex":"#a1a8aeff","u16":[41434,43111,44721,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#eff0f1ff","out":{"hex":"#71aed8ff","u16":[29134,44654,55482,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#eff0f1ff","out":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#eff0f1ff","out":{"hex":"#6093b6ff","u16":[24594,37696,46836,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#eff0f1ff","out":{"hex":"#71757aff","u16":[28983,30156,31282,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#eff0f1ff","out":{"hex":"#4f7a97ff","u16":[20379,31236,38810,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#eff0f1ff","out":{"hex":"#515558ff","u16":[20914,21761,22573,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#eff0f1ff","out":{"hex":"#39586dff","u16":[14706,22540,28005,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#eff0f1ff","out":{"hex":"#515558ff","u16":[20914,21761,22573,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#eff0f1ff","out":{"hex":"#39586dff","u16":[14706,22540,28005,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#eff0f1ff","out":{"hex":"#6d7176ff","u16":[28014,29149,30238,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#eff0f1ff","out":{"hex":"#4d7592ff","u16":[19698,30193,37514,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#eff0f1ff","out":{"hex":"#54575bff","u16":[21568,22441,23279,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#eff0f1ff","out":{"hex":"#3b5a70ff","u16":[15165,23244,28881,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#eff0f1ff","out":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#eff0f1ff","out":{"hex":"#324c5fff","u16":[12802,19622,24380,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#eff0f1ff","out":{"hex":"#3b3d3fff","u16":[15087,15697,16284,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#eff0f1ff","out":{"hex":"#293f4fff","u16":[10608,16260,20202,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#eff0f1ff","out":{"hex":"#2a2c2eff","u16":[10887,11328,11750,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#eff0f1ff","out":{"hex":"#1e2e39ff","u16":[7655,11733,14578,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#eff0f1ff","out":{"hex":"#2a2c2eff","u16":[10887,11328,11750,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#eff0f1ff","out":{"hex":"#1e2e39ff","u16":[7655,11733,14578,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#fcfcfcff","out":{"hex":"#f7f7f7ff","u16":[63542,63542,63542,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#fcfcfcff","out":{"hex":"#fbf6f6ff","u16":[64548,63267,63267,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#fcfcfcff","out":{"hex":"#e3e3e3ff","u16":[58341,58341,58341,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#fcfcfcff","out":{"hex":"#f1dfdfff","u16":[62063,57287,57287,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#fcfcfcff","out":{"hex":"#d2d2d2ff","u16":[54043,54043,54043,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#fcfcfcff","out":{"hex":"#eacbcbff","u16":[60119,52255,52255,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#fcfcfcff","out":{"hex":"#c0c0c0ff","u16":[49288,49288,49288,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#fcfcfcff","out":{"hex":"#e2b5b5ff","u16":[58096,46561,46561,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#fcfcfcff","out":{"hex":"#c0c0c0ff","u16":[49288,49288,49288,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#fcfcfcff","out":{"hex":"#e2b5b5ff","u16":[58096,46561,46561,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#fcfcfcff","out":{"hex":"#fafafaff","u16":[64156,64156,64156,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#fcfcfcff","out":{"hex":"#fcf9f9ff","u16":[64850,63967,63967,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#fcfcfcff","out":{"hex":"#f0f0f0ff","u16":[61653,61653,61653,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#fcfcfcff","out":{"hex":"#f8eeeeff","u16":[63630,61106,61106,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#fcfcfcff","out":{"hex":"#e8e8e8ff","u16":[59693,59693,59693,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#fcfcfcff","out":{"hex":"#f4e5e5ff","u16":[62696,58850,58850,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#fcfcfcff","out":{"hex":"#e0e0e0ff","u16":[57652,57652,57652,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#fcfcfcff","out":{"hex":"#f0dcdcff","u16":[61744,56485,56485,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#fcfcfcff","out":{"hex":"#e0e0e0ff","u16":[57652,57652,57652,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#fcfcfcff","out":{"hex":"#f0dcdcff","u16":[61744,56485,56485,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#fcfcfcff","out":{"hex":"#f7f7f7ff","u16":[63542,63542,63542,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#fcfcfcff","out":{"hex":"#fbf6f6ff","u16":[64548,63267,63267,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#fcfcfcff","out":{"hex":"#e3e3e3ff","u16":[58341,58341,58341,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#fcfcfcff","out":{"hex":"#f1dfdfff","u16":[62063,57287,57287,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#fcfcfcff","out":{"hex":"#d2d2d2ff","u16":[54043,54043,54043,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#fcfcfcff","out":{"hex":"#eacbcbff","u16":[60119,52255,52255,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#fcfcfcff","out":{"hex":"#c0c0c0ff","u16":[49288,49288,49288,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#fcfcfcff","out":{"hex":"#e2b5b5ff","u16":[58096,46561,46561,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#fcfcfcff","out":{"hex":"#c0c0c0ff","u16":[49288,49288,49288,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#fcfcfcff","out":{"hex":"#e2b5b5ff","u16":[58096,46561,46561,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#fcfcfcff","out":{"hex":"#f5f5f5ff","u16":[62920,62920,62920,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#fcfcfcff","out":{"hex":"#faf3f3ff","u16":[64243,62557,62557,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#fcfcfcff","out":{"hex":"#d5d5d5ff","u16":[54787,54787,54787,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#fcfcfcff","out":{"hex":"#ebcfcfff","u16":[60448,53133,53133,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#fcfcfcff","out":{"hex":"#b9b9b9ff","u16":[47575,47575,47575,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#fcfcfcff","out":{"hex":"#dfadadff","u16":[57403,44467,44467,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#fcfcfcff","out":{"hex":"#979797ff","u16":[38725,38725,38725,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#fcfcfcff","out":{"hex":"#d38181ff","u16":[54149,33046,33046,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#fcfcfcff","out":{"hex":"#979797ff","u16":[38725,38725,38725,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#fcfcfcff","out":{"hex":"#d38181ff","u16":[54149,33046,33046,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#fcfcfcff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#fcfcfcff","out":{"hex":"#f0f0f0ff","u16":[61653,61653,61653,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#fcfcfcff","out":{"hex":"#f8eeeeff","u16":[63630,61106,61106,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#fcfcfcff","out":{"hex":"#bcbcbcff","u16":[48440,48440,48440,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#fcfcfcff","out":{"hex":"#e1b1b1ff","u16":[57751,45529,45529,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#fcfcfcff","out":{"hex":"#868686ff","u16":[34535,34535,34535,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#fcfcfcff","out":{"hex":"#ce6969ff","u16":[52819,27011,27011,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#fcfcfcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#fcfcfcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#fcfcfcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#fcfcfcff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#31363bff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#31363bff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#31363bff","out":{"hex":"#3b4148ff","u16":[15268,16826,18384,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#31363bff","out":{"hex":"#274458ff","u16":[10027,17381,22614,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#31363bff","out":{"hex":"#464d54ff","u16":[17874,19698,21522,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#31363bff","out":{"hex":"#2e4f67ff","u16":[11739,20348,26475,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#31363bff","out":{"hex":"#4c545cff","u16":[19563,21559,23556,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#31363bff","out":{"hex":"#325771ff","u16":[12848,22271,28977,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#31363bff","out":{"hex":"#525a63ff","u16":[21093,23246,25398,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#31363bff","out":{"hex":"#365d7aff","u16":[13853,24013,31243,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#31363bff","out":{"hex":"#525a63ff","u16":[21093,23246,25398,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#31363bff","out":{"hex":"#365d7aff","u16":[13853,24013,31243,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#31363bff","out":{"hex":"#23272aff","u16":[9057,9981,10905,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#31363bff","out":{"hex":"#172834ff","u16":[5948,10310,13415,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#31363bff","out":{"hex":"#363c41ff","u16":[13977,15404,16830,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#31363bff","out":{"hex":"#243e51ff","u16":[9180,15912,20703,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#31363bff","out":{"hex":"#3c4248ff","u16":[15447,17023,18599,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#31363bff","out":{"hex":"#274459ff","u16":[10145,17585,22880,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#31363bff","out":{"hex":"#40474dff","u16":[16448,18126,19804,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#31363bff","out":{"hex":"#2a495fff","u16":[10802,18724,24362,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#31363bff","out":{"hex":"#444b51ff","u16":[17380,19154,20927,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#31363bff","out":{"hex":"#2c4d64ff","u16":[11415,19786,25743,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#31363bff","out":{"hex":"#444b51ff","u16":[17380,19154,20927,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#31363bff","out":{"hex":"#2c4d64ff","u16":[11415,19786,25743,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#31363bff","out":{"hex":"#2f3439ff","u16":[12179,13421,14664,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#31363bff","out":{"hex":"#1f3646ff","u16":[7999,13864,18039,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#31363bff","out":{"hex":"#2c3135ff","u16":[11410,12574,13738,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#31363bff","out":{"hex":"#1d3342ff","u16":[7494,12989,16900,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#31363bff","out":{"hex":"#2b3034ff","u16":[11084,12215,13346,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#31363bff","out":{"hex":"#1c3140ff","u16":[7280,12618,16418,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#31363bff","out":{"hex":"#2a2e33ff","u16":[10832,11937,13043,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#31363bff","out":{"hex":"#1c303eff","u16":[7114,12331,16044,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#31363bff","out":{"hex":"#292d32ff","u16":[10573,11652,12731,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#31363bff","out":{"hex":"#1b2f3dff","u16":[6944,12036,15660,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#31363bff","out":{"hex":"#292d32ff","u16":[10573,11652,12731,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#31363bff","out":{"hex":"#1b2f3dff","u16":[6944,12036,15660,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#31363bff","out":{"hex":"#2c3135ff","u16":[11378,12539,13700,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#31363bff","out":{"hex":"#1d3242ff","u16":[7473,12953,16854,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#31363bff","out":{"hex":"#222629ff","u16":[8760,9654,10548,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#31363bff","out":{"hex":"#162732ff","u16":[5753,9972,12975,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#31363bff","out":{"hex":"#1d2023ff","u16":[7395,8149,8904,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#31363bff","out":{"hex":"#13212bff","u16":[4857,8418,10953,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#31363bff","out":{"hex":"#181a1dff","u16":[6128,6753,7378,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#31363bff","out":{"hex":"#101b23ff","u16":[4024,6976,9076,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#31363bff","out":{"hex":"#111315ff","u16":[4422,4873,5324,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#31363bff","out":{"hex":"#0b1419ff","u16":[2904,5034,6549,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#31363bff","out":{"hex":"#111315ff","u16":[4422,4873,5324,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#31363bff","out":{"hex":"#0b1419ff","u16":[2904,5034,6549,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#31363bff","out":{"hex":"#202327ff","u16":[8230,9070,9910,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#31363bff","out":{"hex":"#15242fff","u16":[5405,9369,12191,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#31363bff","out":{"hex":"#191b1eff","u16":[6336,6983,7630,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#31363bff","out":{"hex":"#101c25ff","u16":[4161,7213,9385,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#31363bff","out":{"hex":"#151719ff","u16":[5349,5894,6441,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#31363bff","out":{"hex":"#0e181fff","u16":[3513,6089,7923,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#31363bff","out":{"hex":"#111315ff","u16":[4433,4885,5337,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#31363bff","out":{"hex":"#0b141aff","u16":[2911,5046,6565,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#31363bff","out":{"hex":"#0c0e0fff","u16":[3199,3525,3851,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#31363bff","out":{"hex":"#080e12ff","u16":[2101,3641,4737,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#31363bff","out":{"hex":"#0c0e0fff","u16":[3199,3525,3851,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#31363bff","out":{"hex":"#080e12ff","u16":[2101,3641,4737,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#1b1e20ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#1b1e20ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#1b1e20ff","out":{"hex":"#292e31ff","u16":[10657,11842,12631,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#1b1e20ff","out":{"hex":"#1b303aff","u16":[6950,12323,14943,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#1b1e20ff","out":{"hex":"#353b3fff","u16":[13684,15204,16218,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#1b1e20ff","out":{"hex":"#233e4bff","u16":[8923,15823,19187,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#1b1e20ff","out":{"hex":"#3c4348ff","u16":[15510,17233,18382,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#1b1e20ff","out":{"hex":"#274655ff","u16":[10114,17934,21747,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#1b1e20ff","out":{"hex":"#434a4fff","u16":[17108,19009,20277,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#1b1e20ff","out":{"hex":"#2b4d5dff","u16":[11156,19782,23989,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#1b1e20ff","out":{"hex":"#434a4fff","u16":[17108,19009,20277,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#1b1e20ff","out":{"hex":"#2b4d5dff","u16":[11156,19782,23989,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#1b1e20ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#1b1e20ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#1b1e20ff","out":{"hex":"#23272aff","u16":[9019,10021,10689,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#1b1e20ff","out":{"hex":"#172931ff","u16":[5881,10429,12646,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#1b1e20ff","out":{"hex":"#2b2f32ff","u16":[10929,12144,12953,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#1b1e20ff","out":{"hex":"#1c313cff","u16":[7127,12638,15325,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#1b1e20ff","out":{"hex":"#2f3438ff","u16":[12133,13482,14380,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#1b1e20ff","out":{"hex":"#1f3742ff","u16":[7912,14030,17013,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#1b1e20ff","out":{"hex":"#33393dff","u16":[13209,14677,15655,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#1b1e20ff","out":{"hex":"#223b48ff","u16":[8613,15273,18521,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#1b1e20ff","out":{"hex":"#33393dff","u16":[13209,14677,15655,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#1b1e20ff","out":{"hex":"#223b48ff","u16":[8613,15273,18521,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#1b1e20ff","out":{"hex":"#1a1d1fff","u16":[6713,7459,7956,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#1b1e20ff","out":{"hex":"#111e25ff","u16":[4377,7762,9413,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#1b1e20ff","out":{"hex":"#181b1dff","u16":[6294,6993,7459,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#1b1e20ff","out":{"hex":"#101c22ff","u16":[4104,7278,8825,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#1b1e20ff","out":{"hex":"#181a1cff","u16":[6116,6796,7249,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#1b1e20ff","out":{"hex":"#101c21ff","u16":[3988,7072,8576,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#1b1e20ff","out":{"hex":"#171a1cff","u16":[5979,6644,7086,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#1b1e20ff","out":{"hex":"#0f1b21ff","u16":[3899,6914,8384,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#1b1e20ff","out":{"hex":"#17191bff","u16":[5838,6487,6919,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#1b1e20ff","out":{"hex":"#0f1a20ff","u16":[3807,6751,8186,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#1b1e20ff","out":{"hex":"#17191bff","u16":[5838,6487,6919,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#1b1e20ff","out":{"hex":"#0f1a20ff","u16":[3807,6751,8186,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#1b1e20ff","out":{"hex":"#181b1dff","u16":[6270,6966,7431,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#1b1e20ff","out":{"hex":"#101c22ff","u16":[4088,7250,8791,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#1b1e20ff","out":{"hex":"#131516ff","u16":[4827,5363,5721,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#1b1e20ff","out":{"hex":"#0c161aff","u16":[3148,5581,6768,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#1b1e20ff","out":{"hex":"#101213ff","u16":[4075,4527,4829,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#1b1e20ff","out":{"hex":"#0a1216ff","u16":[2657,4712,5713,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#1b1e20ff","out":{"hex":"#0d0f10ff","u16":[3376,3752,4002,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#1b1e20ff","out":{"hex":"#090f12ff","u16":[2202,3904,4734,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#1b1e20ff","out":{"hex":"#090b0bff","u16":[2436,2707,2888,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#1b1e20ff","out":{"hex":"#060b0dff","u16":[1589,2817,3416,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#1b1e20ff","out":{"hex":"#090b0bff","u16":[2436,2707,2888,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#1b1e20ff","out":{"hex":"#060b0dff","u16":[1589,2817,3416,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#1b1e20ff","out":{"hex":"#121415ff","u16":[4565,5071,5410,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#1b1e20ff","out":{"hex":"#0c1519ff","u16":[2976,5278,6400,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#1b1e20ff","out":{"hex":"#0e0f10ff","u16":[3514,3904,4165,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#1b1e20ff","out":{"hex":"#091013ff","u16":[2292,4063,4927,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#1b1e20ff","out":{"hex":"#0c0d0eff","u16":[2967,3296,3516,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#1b1e20ff","out":{"hex":"#080d10ff","u16":[1934,3430,4159,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#1b1e20ff","out":{"hex":"#0a0b0bff","u16":[2458,2731,2913,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#1b1e20ff","out":{"hex":"#060b0dff","u16":[1603,2842,3446,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#1b1e20ff","out":{"hex":"#070808ff","u16":[1773,1971,2102,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#1b1e20ff","out":{"hex":"#05080aff","u16":[1157,2051,2487,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#1b1e20ff","out":{"hex":"#070808ff","u16":[1773,1971,2102,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#1b1e20ff","out":{"hex":"#05080aff","u16":[1157,2051,2487,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#da4453ff","out":{"hex":"#ac3642ff","u16":[44325,13826,16876,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#da4453ff","out":{"hex":"#c10030ff","u16":[49587,0,12229,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#da4453ff","out":{"hex":"#e55260ff","u16":[58764,21174,24579,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#da4453ff","out":{"hex":"#ff2f4cff","u16":[65535,12149,19487,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#da4453ff","out":{"hex":"#e66872ff","u16":[59210,26810,29311,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#da4453ff","out":{"hex":"#ff5364ff","u16":[65535,21355,25644,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#da4453ff","out":{"hex":"#e8767eff","u16":[59541,30246,32331,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#da4453ff","out":{"hex":"#ff6572ff","u16":[65535,25934,29294,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#da4453ff","out":{"hex":"#e98188ff","u16":[59871,33267,35046,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#da4453ff","out":{"hex":"#ff747eff","u16":[65535,29701,32465,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#da4453ff","out":{"hex":"#e98188ff","u16":[59871,33267,35046,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#da4453ff","out":{"hex":"#ff747eff","u16":[65535,29701,32465,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#da4453ff","out":{"hex":"#c83e4cff","u16":[51370,16024,19558,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#da4453ff","out":{"hex":"#e00037ff","u16":[57468,0,14172,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#da4453ff","out":{"hex":"#e24756ff","u16":[58188,18151,22154,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#da4453ff","out":{"hex":"#fd003eff","u16":[65096,0,16054,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#da4453ff","out":{"hex":"#e5515fff","u16":[58745,20895,24354,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#da4453ff","out":{"hex":"#ff2d4bff","u16":[65535,11558,19173,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#da4453ff","out":{"hex":"#e55965ff","u16":[58890,22929,26015,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#da4453ff","out":{"hex":"#ff3c53ff","u16":[65535,15429,21436,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#da4453ff","out":{"hex":"#e6606bff","u16":[59034,24767,27558,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#da4453ff","out":{"hex":"#ff485bff","u16":[65535,18384,23444,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#da4453ff","out":{"hex":"#e6606bff","u16":[59034,24767,27558,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#da4453ff","out":{"hex":"#ff485bff","u16":[65535,18384,23444,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#da4453ff","out":{"hex":"#d24250ff","u16":[54052,16860,20580,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#da4453ff","out":{"hex":"#eb003aff","u16":[60468,0,14913,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#da4453ff","out":{"hex":"#c43d4bff","u16":[50373,15713,19179,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#da4453ff","out":{"hex":"#db0036ff","u16":[56352,0,13897,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#da4453ff","out":{"hex":"#be3b48ff","u16":[48807,15224,18582,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#da4453ff","out":{"hex":"#d40034ff","u16":[54600,0,13465,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#da4453ff","out":{"hex":"#b93a47ff","u16":[47592,14845,18120,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#da4453ff","out":{"hex":"#cf0033ff","u16":[53241,0,13130,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#da4453ff","out":{"hex":"#b43845ff","u16":[46338,14454,17642,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#da4453ff","out":{"hex":"#ca0032ff","u16":[51838,0,12784,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#da4453ff","out":{"hex":"#b43845ff","u16":[46338,14454,17642,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#da4453ff","out":{"hex":"#ca0032ff","u16":[51838,0,12784,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#da4453ff","out":{"hex":"#c53d4bff","u16":[50622,15790,19274,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#da4453ff","out":{"hex":"#dc0036ff","u16":[56631,0,13966,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#da4453ff","out":{"hex":"#982f3aff","u16":[38973,12157,14838,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#da4453ff","out":{"hex":"#aa002aff","u16":[43599,0,10752,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#da4453ff","out":{"hex":"#802831ff","u16":[32900,10262,12526,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#da4453ff","out":{"hex":"#8f0023ff","u16":[36805,0,9077,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#da4453ff","out":{"hex":"#6a2128ff","u16":[27262,8504,10379,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#da4453ff","out":{"hex":"#77001dff","u16":[30498,0,7521,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#da4453ff","out":{"hex":"#4d181dff","u16":[19672,6136,7490,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#da4453ff","out":{"hex":"#560015ff","u16":[22007,0,5427,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#da4453ff","out":{"hex":"#4d181dff","u16":[19672,6136,7490,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#da4453ff","out":{"hex":"#560015ff","u16":[22007,0,5427,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#da4453ff","out":{"hex":"#882a34ff","u16":[34902,10886,13289,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#da4453ff","out":{"hex":"#980025ff","u16":[39044,0,9629,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#da4453ff","out":{"hex":"#692128ff","u16":[26870,8382,10230,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#da4453ff","out":{"hex":"#75001dff","u16":[30060,0,7413,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#da4453ff","out":{"hex":"#581c22ff","u16":[22683,7075,8636,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#da4453ff","out":{"hex":"#630018ff","u16":[25375,0,6258,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#da4453ff","out":{"hex":"#49171cff","u16":[18796,5863,7156,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#da4453ff","out":{"hex":"#520014ff","u16":[21027,0,5185,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#da4453ff","out":{"hex":"#351014ff","u16":[13563,4230,5164,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#da4453ff","out":{"hex":"#3b000fff","u16":[15173,0,3742,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#da4453ff","out":{"hex":"#351014ff","u16":[13563,4230,5164,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#da4453ff","out":{"hex":"#3b000fff","u16":[15173,0,3742,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#27ae60ff","out":{"hex":"#208f4fff","u16":[8223,36687,20241,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#27ae60ff","out":{"hex":"#00904bff","u16":[0,36913,19370,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#27ae60ff","out":{"hex":"#2abb67ff","u16":[10792,48147,26564,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#27ae60ff","out":{"hex":"#00bc63ff","u16":[0,48444,25420,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#27ae60ff","out":{"hex":"#2dca6fff","u16":[11635,51910,28640,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#27ae60ff","out":{"hex":"#00cb6bff","u16":[0,52230,27407,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#27ae60ff","out":{"hex":"#30d475ff","u16":[12222,54531,30086,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#27ae60ff","out":{"hex":"#00d570ff","u16":[0,54867,28790,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#27ae60ff","out":{"hex":"#32de7aff","u16":[12778,57008,31453,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#27ae60ff","out":{"hex":"#00df75ff","u16":[0,57359,30098,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#27ae60ff","out":{"hex":"#32de7aff","u16":[12778,57008,31453,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#27ae60ff","out":{"hex":"#00df75ff","u16":[0,57359,30098,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#27ae60ff","out":{"hex":"#24a35aff","u16":[9374,41822,23074,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#27ae60ff","out":{"hex":"#00a456ff","u16":[0,42080,22081,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#27ae60ff","out":{"hex":"#28b363ff","u16":[10329,46085,25426,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#27ae60ff","out":{"hex":"#00b45fff","u16":[0,46368,24331,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#27ae60ff","out":{"hex":"#2ab966ff","u16":[10683,47663,26297,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#27ae60ff","out":{"hex":"#00bb62ff","u16":[0,47956,25164,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#27ae60ff","out":{"hex":"#2bbe69ff","u16":[10939,48807,26928,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#27ae60ff","out":{"hex":"#00bf64ff","u16":[0,49107,25768,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#27ae60ff","out":{"hex":"#2cc26bff","u16":[11189,49919,27542,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#27ae60ff","out":{"hex":"#00c367ff","u16":[0,50227,26356,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#27ae60ff","out":{"hex":"#2cc26bff","u16":[11189,49919,27542,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#27ae60ff","out":{"hex":"#00c367ff","u16":[0,50227,26356,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#27ae60ff","out":{"hex":"#26a85cff","u16":[9652,43063,23759,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#27ae60ff","out":{"hex":"#00a958ff","u16":[0,43328,22736,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#27ae60ff","out":{"hex":"#239c56ff","u16":[8958,39967,22051,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#27ae60ff","out":{"hex":"#009c52ff","u16":[0,40213,21101,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#27ae60ff","out":{"hex":"#229653ff","u16":[8662,38645,21321,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#27ae60ff","out":{"hex":"#00974fff","u16":[0,38883,20403,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#27ae60ff","out":{"hex":"#219251ff","u16":[8431,37616,20754,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#27ae60ff","out":{"hex":"#00934dff","u16":[0,37848,19860,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#27ae60ff","out":{"hex":"#208e4eff","u16":[8193,36553,20167,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#27ae60ff","out":{"hex":"#008f4bff","u16":[0,36778,19299,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#27ae60ff","out":{"hex":"#208e4eff","u16":[8193,36553,20167,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#27ae60ff","out":{"hex":"#008f4bff","u16":[0,36778,19299,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#27ae60ff","out":{"hex":"#239d57ff","u16":[9056,40405,22292,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#27ae60ff","out":{"hex":"#009e53ff","u16":[0,40653,21332,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#27ae60ff","out":{"hex":"#1b7943ff","u16":[6972,31107,17162,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#27ae60ff","out":{"hex":"#007a40ff","u16":[0,31298,16423,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#27ae60ff","out":{"hex":"#176638ff","u16":[5886,26259,14488,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#27ae60ff","out":{"hex":"#006736ff","u16":[0,26421,13864,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#27ae60ff","out":{"hex":"#13552fff","u16":[4877,21759,12005,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#27ae60ff","out":{"hex":"#00552dff","u16":[0,21893,11488,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#27ae60ff","out":{"hex":"#0e3d22ff","u16":[3519,15701,8663,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#27ae60ff","out":{"hex":"#003d20ff","u16":[0,15798,8290,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#27ae60ff","out":{"hex":"#0e3d22ff","u16":[3519,15701,8663,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#27ae60ff","out":{"hex":"#003d20ff","u16":[0,15798,8290,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#27ae60ff","out":{"hex":"#176839ff","u16":[5998,26759,14763,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#27ae60ff","out":{"hex":"#006937ff","u16":[0,26923,14128,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#27ae60ff","out":{"hex":"#12502cff","u16":[4617,20601,11366,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#27ae60ff","out":{"hex":"#00512aff","u16":[0,20728,10876,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#27ae60ff","out":{"hex":"#0f4425ff","u16":[3898,17391,9595,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#27ae60ff","out":{"hex":"#004424ff","u16":[0,17498,9182,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#27ae60ff","out":{"hex":"#0d381fff","u16":[3230,14410,7951,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#27ae60ff","out":{"hex":"#00381eff","u16":[0,14499,7608,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#27ae60ff","out":{"hex":"#092816ff","u16":[2331,10398,5737,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#27ae60ff","out":{"hex":"#002915ff","u16":[0,10463,5490,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#27ae60ff","out":{"hex":"#092816ff","u16":[2331,10398,5737,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#27ae60ff","out":{"hex":"#002915ff","u16":[0,10463,5490,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#f67400ff","out":{"hex":"#ca5f00ff","u16":[51891,24469,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#f67400ff","out":{"hex":"#ca5f00ff","u16":[51891,24469,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#f67400ff","out":{"hex":"#ff823fff","u16":[65535,33536,16267,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#f67400ff","out":{"hex":"#ff823fff","u16":[65535,33536,16267,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#f67400ff","out":{"hex":"#ff976cff","u16":[65535,38702,27799,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#f67400ff","out":{"hex":"#ff976cff","u16":[65535,38702,27799,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#f67400ff","out":{"hex":"#ffa483ff","u16":[65535,42090,33619,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#f67400ff","out":{"hex":"#ffa483ff","u16":[65535,42090,33619,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#f67400ff","out":{"hex":"#ffb096ff","u16":[65535,45179,38426,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#f67400ff","out":{"hex":"#ffb096ff","u16":[65535,45179,38426,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#f67400ff","out":{"hex":"#ffb096ff","u16":[65535,45179,38426,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#f67400ff","out":{"hex":"#ffb096ff","u16":[65535,45179,38426,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#f67400ff","out":{"hex":"#e66d00ff","u16":[59146,27890,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#f67400ff","out":{"hex":"#e66d00ff","u16":[59146,27890,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#f67400ff","out":{"hex":"#fd7800ff","u16":[65147,30719,0,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#f67400ff","out":{"hex":"#fd7800ff","u16":[65147,30719,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#f67400ff","out":{"hex":"#ff8037ff","u16":[65535,32827,14022,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#f67400ff","out":{"hex":"#ff8037ff","u16":[65535,32827,14022,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#f67400ff","out":{"hex":"#ff8649ff","u16":[65535,34461,18798,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#f67400ff","out":{"hex":"#ff8649ff","u16":[65535,34461,18798,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#f67400ff","out":{"hex":"#ff8c57ff","u16":[65535,36006,22432,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#f67400ff","out":{"hex":"#ff8c57ff","u16":[65535,36006,22432,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#f67400ff","out":{"hex":"#ff8c57ff","u16":[65535,36006,22432,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#f67400ff","out":{"hex":"#ff8c57ff","u16":[65535,36006,22432,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#f67400ff","out":{"hex":"#ed7000ff","u16":[60880,28708,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#f67400ff","out":{"hex":"#ed7000ff","u16":[60880,28708,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#f67400ff","out":{"hex":"#dc6800ff","u16":[56499,26642,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#f67400ff","out":{"hex":"#dc6800ff","u16":[56499,26642,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#f67400ff","out":{"hex":"#d56400ff","u16":[54627,25759,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#f67400ff","out":{"hex":"#d56400ff","u16":[54627,25759,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#f67400ff","out":{"hex":"#cf6200ff","u16":[53171,25073,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#f67400ff","out":{"hex":"#cf6200ff","u16":[53171,25073,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#f67400ff","out":{"hex":"#c95f00ff","u16":[51666,24363,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#f67400ff","out":{"hex":"#c95f00ff","u16":[51666,24363,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#f67400ff","out":{"hex":"#c95f00ff","u16":[51666,24363,0,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#f67400ff","out":{"hex":"#c95f00ff","u16":[51666,24363,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#f67400ff","out":{"hex":"#de6900ff","u16":[57124,26936,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#f67400ff","out":{"hex":"#de6900ff","u16":[57124,26936,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#f67400ff","out":{"hex":"#ab5100ff","u16":[43978,20738,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#f67400ff","out":{"hex":"#ab5100ff","u16":[43978,20738,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#f67400ff","out":{"hex":"#904400ff","u16":[37125,17506,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#f67400ff","out":{"hex":"#904400ff","u16":[37125,17506,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#f67400ff","out":{"hex":"#783800ff","u16":[30763,14506,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#f67400ff","out":{"hex":"#783800ff","u16":[30763,14506,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#f67400ff","out":{"hex":"#562900ff","u16":[22198,10468,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#f67400ff","out":{"hex":"#562900ff","u16":[22198,10468,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#f67400ff","out":{"hex":"#562900ff","u16":[22198,10468,0,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#f67400ff","out":{"hex":"#562900ff","u16":[22198,10468,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#f67400ff","out":{"hex":"#934500ff","u16":[37799,17824,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#f67400ff","out":{"hex":"#934500ff","u16":[37799,17824,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#f67400ff","out":{"hex":"#713500ff","u16":[29100,13722,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#f67400ff","out":{"hex":"#713500ff","u16":[29100,13722,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#f67400ff","out":{"hex":"#602d00ff","u16":[24566,11584,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#f67400ff","out":{"hex":"#602d00ff","u16":[24566,11584,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#f67400ff","out":{"hex":"#4f2500ff","u16":[20356,9599,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#f67400ff","out":{"hex":"#4f2500ff","u16":[20356,9599,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#f67400ff","out":{"hex":"#391b00ff","u16":[14688,6927,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#f67400ff","out":{"hex":"#391b00ff","u16":[14688,6927,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#f67400ff","out":{"hex":"#391b00ff","u16":[14688,6927,0,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#f67400ff","out":{"hex":"#391b00ff","u16":[14688,6927,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#2980b9ff","out":{"hex":"#206592ff","u16":[8339,26035,37629,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#2980b9ff","out":{"hex":"#006696ff","u16":[0,26160,38647,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#2980b9ff","out":{"hex":"#2d8bc9ff","u16":[11452,35754,51675,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#2980b9ff","out":{"hex":"#008ccfff","u16":[0,35925,53073,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#2980b9ff","out":{"hex":"#3097dbff","u16":[12446,38857,56160,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#2980b9ff","out":{"hex":"#0098e0ff","u16":[0,39043,57679,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#2980b9ff","out":{"hex":"#33a0e7ff","u16":[13133,41002,59260,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#2980b9ff","out":{"hex":"#00a0edff","u16":[0,41198,60864,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#2980b9ff","out":{"hex":"#36a7f2ff","u16":[13780,43020,62177,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#2980b9ff","out":{"hex":"#00a8f8ff","u16":[0,43226,63860,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#2980b9ff","out":{"hex":"#36a7f2ff","u16":[13780,43020,62177,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#2980b9ff","out":{"hex":"#00a8f8ff","u16":[0,43226,63860,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#2980b9ff","out":{"hex":"#2675aaff","u16":[9663,30167,43601,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#2980b9ff","out":{"hex":"#0076aeff","u16":[0,30311,44780,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#2980b9ff","out":{"hex":"#2b85c0ff","u16":[10943,34164,49377,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#2980b9ff","out":{"hex":"#0086c5ff","u16":[0,34327,50713,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#2980b9ff","out":{"hex":"#2c8bc8ff","u16":[11408,35614,51473,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#2980b9ff","out":{"hex":"#008bceff","u16":[0,35784,52866,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#2980b9ff","out":{"hex":"#2e8fceff","u16":[11742,36657,52980,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#2980b9ff","out":{"hex":"#008fd4ff","u16":[0,36832,54414,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#2980b9ff","out":{"hex":"#2f93d4ff","u16":[12065,37665,54438,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#2980b9ff","out":{"hex":"#0093daff","u16":[0,37845,55910,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#2980b9ff","out":{"hex":"#2f93d4ff","u16":[12065,37665,54438,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#2980b9ff","out":{"hex":"#0093daff","u16":[0,37845,55910,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#2980b9ff","out":{"hex":"#287bb2ff","u16":[10166,31737,45869,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#2980b9ff","out":{"hex":"#007cb7ff","u16":[0,31889,47110,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#2980b9ff","out":{"hex":"#2573a6ff","u16":[9473,29576,42746,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#2980b9ff","out":{"hex":"#0074abff","u16":[0,29717,43902,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#2980b9ff","out":{"hex":"#2470a1ff","u16":[9179,28656,41417,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#2980b9ff","out":{"hex":"#0070a6ff","u16":[0,28793,42537,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#2980b9ff","out":{"hex":"#236d9dff","u16":[8950,27942,40385,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#2980b9ff","out":{"hex":"#006da1ff","u16":[0,28076,41478,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#2980b9ff","out":{"hex":"#226a99ff","u16":[8714,27206,39321,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#2980b9ff","out":{"hex":"#006a9dff","u16":[0,27336,40385,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#2980b9ff","out":{"hex":"#226a99ff","u16":[8714,27206,39321,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#2980b9ff","out":{"hex":"#006a9dff","u16":[0,27336,40385,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#2980b9ff","out":{"hex":"#2574a7ff","u16":[9521,29723,42959,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#2980b9ff","out":{"hex":"#0074acff","u16":[0,29865,44121,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#2980b9ff","out":{"hex":"#1d5981ff","u16":[7330,22883,33073,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#2980b9ff","out":{"hex":"#005984ff","u16":[0,22992,33968,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#2980b9ff","out":{"hex":"#184b6dff","u16":[6188,19317,27919,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#2980b9ff","out":{"hex":"#004c70ff","u16":[0,19410,28675,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#2980b9ff","out":{"hex":"#143e5aff","u16":[5127,16007,23135,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#2980b9ff","out":{"hex":"#003f5cff","u16":[0,16083,23761,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#2980b9ff","out":{"hex":"#0e2d41ff","u16":[3700,11550,16694,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#2980b9ff","out":{"hex":"#002d43ff","u16":[0,11606,17146,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#2980b9ff","out":{"hex":"#0e2d41ff","u16":[3700,11550,16694,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#2980b9ff","out":{"hex":"#002d43ff","u16":[0,11606,17146,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#2980b9ff","out":{"hex":"#1a5073ff","u16":[6563,20488,29612,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#2980b9ff","out":{"hex":"#005076ff","u16":[0,20586,30413,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#2980b9ff","out":{"hex":"#143d59ff","u16":[5053,15773,22797,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#2980b9ff","out":{"hex":"#003e5bff","u16":[0,15848,23414,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#2980b9ff","out":{"hex":"#11344bff","u16":[4265,13315,19245,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#2980b9ff","out":{"hex":"#00344dff","u16":[0,13379,19766,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#2980b9ff","out":{"hex":"#0e2b3eff","u16":[3534,11034,15947,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#2980b9ff","out":{"hex":"#002b40ff","u16":[0,11086,16379,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#2980b9ff","out":{"hex":"#0a1f2dff","u16":[2550,7961,11507,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#2980b9ff","out":{"hex":"#001f2eff","u16":[0,8000,11819,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#2980b9ff","out":{"hex":"#0a1f2dff","u16":[2550,7961,11507,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#2980b9ff","out":{"hex":"#001f2eff","u16":[0,8000,11819,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#7f8c8dff","out":{"hex":"#677172ff","u16":[26411,29114,29322,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#7f8c8dff","out":{"hex":"#44787bff","u16":[17515,30716,31514,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#7f8c8dff","out":{"hex":"#899798ff","u16":[35273,38884,39162,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#7f8c8dff","out":{"hex":"#5ba0a4ff","u16":[23393,41024,42089,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#7f8c8dff","out":{"hex":"#94a4a5ff","u16":[38152,42057,42357,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#7f8c8dff","out":{"hex":"#62adb1ff","u16":[25302,44371,45523,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#7f8c8dff","out":{"hex":"#9cacadff","u16":[40150,44260,44576,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#7f8c8dff","out":{"hex":"#68b6baff","u16":[26628,46696,47908,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#7f8c8dff","out":{"hex":"#a4b4b6ff","u16":[42036,46339,46670,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#7f8c8dff","out":{"hex":"#6cbec3ff","u16":[27878,48889,50158,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#7f8c8dff","out":{"hex":"#a4b4b6ff","u16":[42036,46339,46670,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#7f8c8dff","out":{"hex":"#6cbec3ff","u16":[27878,48889,50158,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#7f8c8dff","out":{"hex":"#768283ff","u16":[30270,33369,33607,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#7f8c8dff","out":{"hex":"#4e898dff","u16":[20075,35205,36119,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#7f8c8dff","out":{"hex":"#839192ff","u16":[33749,37204,37470,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#7f8c8dff","out":{"hex":"#57999dff","u16":[22383,39251,40270,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#7f8c8dff","out":{"hex":"#889697ff","u16":[35026,38612,38888,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#7f8c8dff","out":{"hex":"#5a9fa3ff","u16":[23229,40737,41794,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#7f8c8dff","out":{"hex":"#8c9a9bff","u16":[35949,39628,39911,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#7f8c8dff","out":{"hex":"#5da3a7ff","u16":[23841,41809,42895,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#7f8c8dff","out":{"hex":"#8f9e9fff","u16":[36843,40615,40905,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#7f8c8dff","out":{"hex":"#5fa7abff","u16":[24435,42850,43962,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#7f8c8dff","out":{"hex":"#8f9e9fff","u16":[36843,40615,40905,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#7f8c8dff","out":{"hex":"#5fa7abff","u16":[24435,42850,43962,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#7f8c8dff","out":{"hex":"#7a8788ff","u16":[31461,34681,34929,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#7f8c8dff","out":{"hex":"#518e92ff","u16":[20865,36590,37540,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#7f8c8dff","out":{"hex":"#727e7eff","u16":[29261,32256,32486,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#7f8c8dff","out":{"hex":"#4c8488ff","u16":[19406,34031,34914,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#7f8c8dff","out":{"hex":"#6e797aff","u16":[28323,31222,31445,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#7f8c8dff","out":{"hex":"#498083ff","u16":[18784,32940,33795,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#7f8c8dff","out":{"hex":"#6b7677ff","u16":[27594,30418,30636,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#7f8c8dff","out":{"hex":"#477d80ff","u16":[18300,32092,32926,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#7f8c8dff","out":{"hex":"#687374ff","u16":[26841,29589,29800,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#7f8c8dff","out":{"hex":"#45797dff","u16":[17801,31217,32028,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#7f8c8dff","out":{"hex":"#687374ff","u16":[26841,29589,29800,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#7f8c8dff","out":{"hex":"#45797dff","u16":[17801,31217,32028,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#7f8c8dff","out":{"hex":"#737e7fff","u16":[29491,32510,32742,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#7f8c8dff","out":{"hex":"#4c8589ff","u16":[19558,34299,35189,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#7f8c8dff","out":{"hex":"#586162ff","u16":[22704,25028,25207,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#7f8c8dff","out":{"hex":"#3b6769ff","u16":[15057,26406,27091,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#7f8c8dff","out":{"hex":"#4b5253ff","u16":[19166,21128,21279,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#7f8c8dff","out":{"hex":"#315759ff","u16":[12711,22291,22870,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#7f8c8dff","out":{"hex":"#3e4445ff","u16":[15882,17507,17632,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#7f8c8dff","out":{"hex":"#29484aff","u16":[10533,18471,18950,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#7f8c8dff","out":{"hex":"#2d3132ff","u16":[11460,12633,12724,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#7f8c8dff","out":{"hex":"#1e3435ff","u16":[7600,13328,13675,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#7f8c8dff","out":{"hex":"#2d3132ff","u16":[11460,12633,12724,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#7f8c8dff","out":{"hex":"#1e3435ff","u16":[7600,13328,13675,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#7f8c8dff","out":{"hex":"#4e5656ff","u16":[19945,21987,22144,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#7f8c8dff","out":{"hex":"#335a5dff","u16":[13227,23197,23799,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#7f8c8dff","out":{"hex":"#3c4242ff","u16":[15355,16927,17048,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#7f8c8dff","out":{"hex":"#284547ff","u16":[10183,17859,18322,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#7f8c8dff","out":{"hex":"#323838ff","u16":[12962,14289,14391,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#7f8c8dff","out":{"hex":"#213b3cff","u16":[8597,15076,15467,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#7f8c8dff","out":{"hex":"#2a2e2eff","u16":[10741,11840,11925,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#7f8c8dff","out":{"hex":"#1c3132ff","u16":[7124,12492,12816,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#7f8c8dff","out":{"hex":"#1e2121ff","u16":[7751,8544,8605,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#7f8c8dff","out":{"hex":"#142324ff","u16":[5140,9014,9249,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#7f8c8dff","out":{"hex":"#1e2121ff","u16":[7751,8544,8605,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#7f8c8dff","out":{"hex":"#142324ff","u16":[5140,9014,9249,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#9b59b6ff","out":{"hex":"#79468eff","u16":[31171,17898,36601,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#9b59b6ff","out":{"hex":"#9419b6ff","u16":[37917,6507,46796,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#9b59b6ff","out":{"hex":"#a763c4ff","u16":[42983,25335,50300,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#9b59b6ff","out":{"hex":"#cb2df9ff","u16":[52078,11583,64097,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#9b59b6ff","out":{"hex":"#ae73c8ff","u16":[44617,29491,51299,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#9b59b6ff","out":{"hex":"#ce4ffaff","u16":[52941,20410,64178,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#9b59b6ff","out":{"hex":"#b27dcaff","u16":[45798,32198,52033,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#9b59b6ff","out":{"hex":"#d060faff","u16":[53577,24794,64239,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#9b59b6ff","out":{"hex":"#b787cdff","u16":[46942,34655,52754,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#9b59b6ff","out":{"hex":"#d36ffaff","u16":[54205,28401,64300,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#9b59b6ff","out":{"hex":"#b787cdff","u16":[46942,34655,52754,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#9b59b6ff","out":{"hex":"#d36ffaff","u16":[54205,28401,64300,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#9b59b6ff","out":{"hex":"#8d51a6ff","u16":[36342,20868,42673,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#9b59b6ff","out":{"hex":"#ac1ed4ff","u16":[44207,7587,54560,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#9b59b6ff","out":{"hex":"#a15dbdff","u16":[41451,23801,48671,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#9b59b6ff","out":{"hex":"#c422f2ff","u16":[50421,8653,62228,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#9b59b6ff","out":{"hex":"#a762c4ff","u16":[42933,25199,50270,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#9b59b6ff","out":{"hex":"#cb2cf9ff","u16":[52052,11188,64095,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#9b59b6ff","out":{"hex":"#a968c5ff","u16":[43479,26660,50602,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#9b59b6ff","out":{"hex":"#cc3af9ff","u16":[52338,14903,64121,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#9b59b6ff","out":{"hex":"#ab6dc6ff","u16":[44018,28031,50930,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#9b59b6ff","out":{"hex":"#cd45faff","u16":[52622,17743,64148,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#9b59b6ff","out":{"hex":"#ab6dc6ff","u16":[44018,28031,50930,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#9b59b6ff","out":{"hex":"#cd45faff","u16":[52622,17743,64148,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#9b59b6ff","out":{"hex":"#9656b0ff","u16":[38443,22074,45139,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#9b59b6ff","out":{"hex":"#b61fe1ff","u16":[46762,8025,57713,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#9b59b6ff","out":{"hex":"#8b50a4ff","u16":[35849,20584,42093,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#9b59b6ff","out":{"hex":"#aa1dd1ff","u16":[43607,7484,53818,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#9b59b6ff","out":{"hex":"#874e9fff","u16":[34746,19951,40798,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#9b59b6ff","out":{"hex":"#a41ccbff","u16":[42265,7253,52162,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#9b59b6ff","out":{"hex":"#844c9bff","u16":[33890,19459,39793,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#9b59b6ff","out":{"hex":"#a01cc6ff","u16":[41224,7075,50877,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#9b59b6ff","out":{"hex":"#804a97ff","u16":[33007,18952,38757,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#9b59b6ff","out":{"hex":"#9c1bc1ff","u16":[40150,6890,49552,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#9b59b6ff","out":{"hex":"#804a97ff","u16":[33007,18952,38757,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#9b59b6ff","out":{"hex":"#9c1bc1ff","u16":[40150,6890,49552,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#9b59b6ff","out":{"hex":"#8c50a4ff","u16":[35993,20667,42262,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#9b59b6ff","out":{"hex":"#aa1dd2ff","u16":[43782,7514,54035,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#9b59b6ff","out":{"hex":"#6c3e7fff","u16":[27710,15911,32537,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#9b59b6ff","out":{"hex":"#8317a2ff","u16":[33707,5785,41600,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#9b59b6ff","out":{"hex":"#5b346bff","u16":[23392,13431,27467,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#9b59b6ff","out":{"hex":"#6f1389ff","u16":[28454,4883,35117,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#9b59b6ff","out":{"hex":"#4b2b59ff","u16":[19383,11130,22760,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#9b59b6ff","out":{"hex":"#5c1071ff","u16":[23578,4046,29099,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#9b59b6ff","out":{"hex":"#361f40ff","u16":[13987,8031,16423,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#9b59b6ff","out":{"hex":"#420b52ff","u16":[17014,2920,20998,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#9b59b6ff","out":{"hex":"#361f40ff","u16":[13987,8031,16423,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#9b59b6ff","out":{"hex":"#420b52ff","u16":[17014,2920,20998,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#9b59b6ff","out":{"hex":"#613872ff","u16":[24966,14335,29314,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#9b59b6ff","out":{"hex":"#761492ff","u16":[30369,5212,37480,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#9b59b6ff","out":{"hex":"#4b2b58ff","u16":[19220,11036,22569,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#9b59b6ff","out":{"hex":"#5b1070ff","u16":[23380,4013,28855,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#9b59b6ff","out":{"hex":"#3f244aff","u16":[16225,9316,19052,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#9b59b6ff","out":{"hex":"#4d0d5fff","u16":[19737,3387,24358,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#9b59b6ff","out":{"hex":"#341e3dff","u16":[13445,7720,15787,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#9b59b6ff","out":{"hex":"#400b4fff","u16":[16354,2806,20184,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#9b59b6ff","out":{"hex":"#26162cff","u16":[9702,5571,11391,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#9b59b6ff","out":{"hex":"#2e0839ff","u16":[11801,2025,14565,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#9b59b6ff","out":{"hex":"#26162cff","u16":[9702,5571,11391,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#9b59b6ff","out":{"hex":"#2e0839ff","u16":[11801,2025,14565,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#1d99f3ff","out":{"hex":"#187dc7ff","u16":[6091,32134,51037,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#1d99f3ff","out":{"hex":"#007dc8ff","u16":[0,32168,51480,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#1d99f3ff","out":{"hex":"#40a4fdff","u16":[16487,42211,64993,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#1d99f3ff","out":{"hex":"#3ba4ffff","u16":[15042,42250,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#1d99f3ff","out":{"hex":"#69b0fdff","u16":[27047,45198,65047,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#1d99f3ff","out":{"hex":"#67b0ffff","u16":[26356,45230,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#1d99f3ff","out":{"hex":"#7eb8fdff","u16":[32497,47291,65088,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#1d99f3ff","out":{"hex":"#7cb8ffff","u16":[31992,47320,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#1d99f3ff","out":{"hex":"#90c0fdff","u16":[37024,49279,65128,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#1d99f3ff","out":{"hex":"#8fc0ffff","u16":[36632,49304,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#1d99f3ff","out":{"hex":"#90c0fdff","u16":[37024,49279,65128,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#1d99f3ff","out":{"hex":"#8fc0ffff","u16":[36632,49304,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#1d99f3ff","out":{"hex":"#1b8fe3ff","u16":[6953,36682,58260,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#1d99f3ff","out":{"hex":"#008fe5ff","u16":[0,36720,58766,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#1d99f3ff","out":{"hex":"#1e9efbff","u16":[7689,40564,64425,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#1d99f3ff","out":{"hex":"#009efdff","u16":[0,40606,64985,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#1d99f3ff","out":{"hex":"#39a3fdff","u16":[14776,41871,64987,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#1d99f3ff","out":{"hex":"#33a3ffff","u16":[13082,41911,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#1d99f3ff","out":{"hex":"#4aa7fdff","u16":[19025,42791,65003,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#1d99f3ff","out":{"hex":"#45a7ffff","u16":[17850,42829,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#1d99f3ff","out":{"hex":"#57aafdff","u16":[22359,43688,65019,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#1d99f3ff","out":{"hex":"#53aaffff","u16":[21432,43724,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#1d99f3ff","out":{"hex":"#57aafdff","u16":[22359,43688,65019,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#1d99f3ff","out":{"hex":"#53aaffff","u16":[21432,43724,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#1d99f3ff","out":{"hex":"#1c93eaff","u16":[7179,37878,60159,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#1d99f3ff","out":{"hex":"#0094ecff","u16":[0,37917,60681,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#1d99f3ff","out":{"hex":"#1a89d9ff","u16":[6668,35179,55873,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#1d99f3ff","out":{"hex":"#0089dbff","u16":[0,35216,56359,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#1d99f3ff","out":{"hex":"#1984d2ff","u16":[6450,34028,54044,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#1d99f3ff","out":{"hex":"#0085d4ff","u16":[0,34063,54513,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#1d99f3ff","out":{"hex":"#1881cdff","u16":[6280,33132,52621,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#1d99f3ff","out":{"hex":"#0081cfff","u16":[0,33166,53079,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#1d99f3ff","out":{"hex":"#187dc7ff","u16":[6104,32206,51151,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#1d99f3ff","out":{"hex":"#007dc9ff","u16":[0,32240,51596,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#1d99f3ff","out":{"hex":"#187dc7ff","u16":[6104,32206,51151,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#1d99f3ff","out":{"hex":"#007dc9ff","u16":[0,32240,51596,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#1d99f3ff","out":{"hex":"#1a8adcff","u16":[6734,35528,56427,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#1d99f3ff","out":{"hex":"#008addff","u16":[0,35565,56918,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#1d99f3ff","out":{"hex":"#146aa9ff","u16":[5184,27352,43442,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#1d99f3ff","out":{"hex":"#006babff","u16":[0,27381,43819,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#1d99f3ff","out":{"hex":"#115a8fff","u16":[4377,23090,36672,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#1d99f3ff","out":{"hex":"#005a90ff","u16":[0,23114,36991,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#1d99f3ff","out":{"hex":"#0e4a76ff","u16":[3627,19133,30388,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#1d99f3ff","out":{"hex":"#004b77ff","u16":[0,19153,30652,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#1d99f3ff","out":{"hex":"#0a3655ff","u16":[2617,13806,21928,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#1d99f3ff","out":{"hex":"#003656ff","u16":[0,13821,22118,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#1d99f3ff","out":{"hex":"#0a3655ff","u16":[2617,13806,21928,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#1d99f3ff","out":{"hex":"#003656ff","u16":[0,13821,22118,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#1d99f3ff","out":{"hex":"#115c92ff","u16":[4491,23696,37636,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#1d99f3ff","out":{"hex":"#005c94ff","u16":[0,23721,37963,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#1d99f3ff","out":{"hex":"#0d4771ff","u16":[3458,18243,28975,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#1d99f3ff","out":{"hex":"#004772ff","u16":[0,18262,29226,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#1d99f3ff","out":{"hex":"#0b3c5fff","u16":[2919,15400,24459,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#1d99f3ff","out":{"hex":"#003c60ff","u16":[0,15417,24672,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#1d99f3ff","out":{"hex":"#09324fff","u16":[2419,12761,20268,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#1d99f3ff","out":{"hex":"#003250ff","u16":[0,12775,20444,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#1d99f3ff","out":{"hex":"#072439ff","u16":[1745,9208,14625,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#1d99f3ff","out":{"hex":"#002439ff","u16":[0,9218,14752,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#1d99f3ff","out":{"hex":"#072439ff","u16":[1745,9208,14625,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#1d99f3ff","out":{"hex":"#002439ff","u16":[0,9218,14752,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#dee0e2ff","out":{"hex":"#b9bec3ff","u16":[47576,48794,49989,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#dee0e2ff","out":{"hex":"#97c3e5ff","u16":[38726,50015,58938,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#dee0e2ff","out":{"hex":"#eeeff0ff","u16":[61149,61404,61661,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#dee0e2ff","out":{"hex":"#e7f0f8ff","u16":[59493,61666,63773,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#dee0e2ff","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#dee0e2ff","out":{"hex":"#d6d8dbff","u16":[54979,55633,56285,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#dee0e2ff","out":{"hex":"#c5dbefff","u16":[50573,56300,61453,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#dee0e2ff","out":{"hex":"#e2e4e5ff","u16":[58058,58507,58956,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#dee0e2ff","out":{"hex":"#d6e5f4ff","u16":[55099,58966,62587,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#dee0e2ff","out":{"hex":"#e6e8e9ff","u16":[59237,59610,59984,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#dee0e2ff","out":{"hex":"#dde9f5ff","u16":[56790,59993,63034,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#dee0e2ff","out":{"hex":"#eaebecff","u16":[60102,60421,60742,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#dee0e2ff","out":{"hex":"#e2ecf7ff","u16":[58019,60749,63366,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#dee0e2ff","out":{"hex":"#edeeefff","u16":[60953,61220,61489,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#dee0e2ff","out":{"hex":"#e6eff8ff","u16":[59218,61494,63697,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#dee0e2ff","out":{"hex":"#edeeefff","u16":[60953,61220,61489,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#dee0e2ff","out":{"hex":"#e6eff8ff","u16":[59218,61494,63697,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#dee0e2ff","out":{"hex":"#d4d6d9ff","u16":[54418,55111,55802,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#dee0e2ff","out":{"hex":"#c1d9eeff","u16":[49728,55817,61252,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#dee0e2ff","out":{"hex":"#c0c4c8ff","u16":[49394,50463,51516,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#dee0e2ff","out":{"hex":"#a3c9e8ff","u16":[41807,51540,59527,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#dee0e2ff","out":{"hex":"#b8bdc1ff","u16":[47203,48452,49677,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#dee0e2ff","out":{"hex":"#94c1e5ff","u16":[38075,49704,58820,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#dee0e2ff","out":{"hex":"#b1b6bcff","u16":[45476,46876,48242,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#dee0e2ff","out":{"hex":"#88bce3ff","u16":[34958,48272,58283,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#dee0e2ff","out":{"hex":"#aab0b6ff","u16":[43666,45233,46754,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#dee0e2ff","out":{"hex":"#7ab6e1ff","u16":[31466,46787,57740,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#dee0e2ff","out":{"hex":"#aab0b6ff","u16":[43666,45233,46754,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#dee0e2ff","out":{"hex":"#7ab6e1ff","u16":[31466,46787,57740,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#dee0e2ff","out":{"hex":"#c7cbceff","u16":[51148,52080,53002,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#dee0e2ff","out":{"hex":"#aeceeaff","u16":[44656,53022,60113,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#dee0e2ff","out":{"hex":"#979ca2ff","u16":[38744,40194,41599,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#dee0e2ff","out":{"hex":"#6aa2c9ff","u16":[27323,41630,51699,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#dee0e2ff","out":{"hex":"#7f8489ff","u16":[32707,33931,35117,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#dee0e2ff","out":{"hex":"#5a89aaff","u16":[23065,35143,43643,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#dee0e2ff","out":{"hex":"#696d71ff","u16":[27102,28116,29099,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#dee0e2ff","out":{"hex":"#4a718dff","u16":[19112,29120,36164,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#dee0e2ff","out":{"hex":"#4c4f52ff","u16":[19556,20288,20998,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#dee0e2ff","out":{"hex":"#365266ff","u16":[13791,21013,26096,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#dee0e2ff","out":{"hex":"#4c4f52ff","u16":[19556,20288,20998,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#dee0e2ff","out":{"hex":"#365266ff","u16":[13791,21013,26096,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#dee0e2ff","out":{"hex":"#6d7175ff","u16":[27988,29036,30050,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#dee0e2ff","out":{"hex":"#4d7591ff","u16":[19737,30072,37347,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#dee0e2ff","out":{"hex":"#54575aff","u16":[21547,22354,23135,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#dee0e2ff","out":{"hex":"#3b5a70ff","u16":[15195,23152,28752,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#dee0e2ff","out":{"hex":"#47494cff","u16":[18190,18870,19530,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#dee0e2ff","out":{"hex":"#324c5eff","u16":[12827,19544,24272,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#dee0e2ff","out":{"hex":"#3b3d3fff","u16":[15073,15636,16183,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#dee0e2ff","out":{"hex":"#293f4eff","u16":[10629,16195,20112,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#dee0e2ff","out":{"hex":"#2a2c2dff","u16":[10876,11283,11678,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#dee0e2ff","out":{"hex":"#1e2d38ff","u16":[7670,11686,14513,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#dee0e2ff","out":{"hex":"#2a2c2dff","u16":[10876,11283,11678,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#dee0e2ff","out":{"hex":"#1e2d38ff","u16":[7670,11686,14513,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#292c30ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#292c30ff","out":{"hex":"#000000ff","u16":[0,0,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#292c30ff","out":{"hex":"#35393eff","u16":[13566,14558,15882,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#292c30ff","out":{"hex":"#243a4fff","u16":[9194,14942,20300,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#292c30ff","out":{"hex":"#40444bff","u16":[16369,17567,19164,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#292c30ff","out":{"hex":"#2b465fff","u16":[11094,18029,24494,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#292c30ff","out":{"hex":"#474c53ff","u16":[18142,19469,21239,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#292c30ff","out":{"hex":"#304e6aff","u16":[12295,19982,27147,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#292c30ff","out":{"hex":"#4d525aff","u16":[19728,21171,23096,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#292c30ff","out":{"hex":"#345573ff","u16":[13370,21729,29520,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#292c30ff","out":{"hex":"#4d525aff","u16":[19728,21171,23096,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#292c30ff","out":{"hex":"#345573ff","u16":[13370,21729,29520,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#292c30ff","out":{"hex":"#17181aff","u16":[5784,6208,6772,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#292c30ff","out":{"hex":"#0f1922ff","u16":[3920,6371,8656,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#292c30ff","out":{"hex":"#2f3337ff","u16":[12143,13032,14217,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#292c30ff","out":{"hex":"#203447ff","u16":[8230,13375,18171,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#292c30ff","out":{"hex":"#363a3fff","u16":[13785,14794,16138,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#292c30ff","out":{"hex":"#243b50ff","u16":[9342,15183,20628,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#292c30ff","out":{"hex":"#3a3e44ff","u16":[14877,15965,17417,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#292c30ff","out":{"hex":"#274057ff","u16":[10082,16386,22261,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#292c30ff","out":{"hex":"#3e4248ff","u16":[15880,17042,18591,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#292c30ff","out":{"hex":"#2a445cff","u16":[10762,17490,23762,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#292c30ff","out":{"hex":"#3e4248ff","u16":[15880,17042,18591,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#292c30ff","out":{"hex":"#2a445cff","u16":[10762,17490,23762,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#292c30ff","out":{"hex":"#282b2eff","u16":[10192,10938,11932,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#292c30ff","out":{"hex":"#1b2c3bff","u16":[6907,11226,15251,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#292c30ff","out":{"hex":"#25282cff","u16":[9552,10251,11183,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#292c30ff","out":{"hex":"#192938ff","u16":[6474,10521,14293,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#292c30ff","out":{"hex":"#24272aff","u16":[9281,9960,10866,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#292c30ff","out":{"hex":"#182836ff","u16":[6290,10222,13888,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#292c30ff","out":{"hex":"#232629ff","u16":[9071,9735,10620,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#292c30ff","out":{"hex":"#182735ff","u16":[6148,9991,13574,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#292c30ff","out":{"hex":"#222528ff","u16":[8856,9504,10368,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#292c30ff","out":{"hex":"#172634ff","u16":[6002,9754,13252,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#292c30ff","out":{"hex":"#222528ff","u16":[8856,9504,10368,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#292c30ff","out":{"hex":"#172634ff","u16":[6002,9754,13252,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#292c30ff","out":{"hex":"#25282bff","u16":[9521,10217,11146,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#292c30ff","out":{"hex":"#192937ff","u16":[6452,10486,14247,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#292c30ff","out":{"hex":"#1d1f21ff","u16":[7330,7866,8581,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#292c30ff","out":{"hex":"#131f2bff","u16":[4968,8073,10968,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#292c30ff","out":{"hex":"#181a1cff","u16":[6188,6640,7244,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#292c30ff","out":{"hex":"#101b24ff","u16":[4193,6815,9259,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#292c30ff","out":{"hex":"#141517ff","u16":[5127,5502,6003,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#292c30ff","out":{"hex":"#0e161eff","u16":[3475,5647,7672,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#292c30ff","out":{"hex":"#0e0f11ff","u16":[3700,3970,4331,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#292c30ff","out":{"hex":"#0a1016ff","u16":[2507,4075,5536,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#292c30ff","out":{"hex":"#0e0f11ff","u16":[3700,3970,4331,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#292c30ff","out":{"hex":"#0a1016ff","u16":[2507,4075,5536,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#292c30ff","out":{"hex":"#1b1d1fff","u16":[6909,7414,8088,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#292c30ff","out":{"hex":"#121e28ff","u16":[4682,7609,10338,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#292c30ff","out":{"hex":"#151618ff","u16":[5319,5708,6227,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#292c30ff","out":{"hex":"#0e171fff","u16":[3605,5858,7959,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#292c30ff","out":{"hex":"#111314ff","u16":[4490,4818,5256,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#292c30ff","out":{"hex":"#0c131aff","u16":[3043,4945,6719,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#292c30ff","out":{"hex":"#0e1011ff","u16":[3720,3992,4356,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#292c30ff","out":{"hex":"#0a1016ff","u16":[2522,4098,5567,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#292c30ff","out":{"hex":"#0a0b0cff","u16":[2685,2881,3143,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#292c30ff","out":{"hex":"#070c10ff","u16":[1819,2957,4017,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#292c30ff","out":{"hex":"#0a0b0cff","u16":[2685,2881,3143,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#292c30ff","out":{"hex":"#070c10ff","u16":[1819,2957,4017,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#e93a9aff","out":{"hex":"#bb2e7bff","u16":[47981,11944,31713,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#e93a9aff","out":{"hex":"#c7007fff","u16":[51107,0,32632,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#e93a9aff","out":{"hex":"#f050a3ff","u16":[61688,20583,41979,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#e93a9aff","out":{"hex":"#ff3aa8ff","u16":[65535,15000,43071,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#e93a9aff","out":{"hex":"#f16aacff","u16":[61973,27170,44179,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#e93a9aff","out":{"hex":"#ff5db0ff","u16":[65535,23799,45135,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#e93a9aff","out":{"hex":"#f279b2ff","u16":[62185,31065,45746,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#e93a9aff","out":{"hex":"#ff6fb5ff","u16":[65535,28426,46612,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#e93a9aff","out":{"hex":"#f386b8ff","u16":[62396,34447,47252,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#e93a9aff","out":{"hex":"#ff7ebbff","u16":[65535,32289,48035,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#e93a9aff","out":{"hex":"#f386b8ff","u16":[62396,34447,47252,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#e93a9aff","out":{"hex":"#ff7ebbff","u16":[65535,32289,48035,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#e93a9aff","out":{"hex":"#d7368eff","u16":[55246,13752,36514,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#e93a9aff","out":{"hex":"#e50092ff","u16":[58846,0,37573,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#e93a9aff","out":{"hex":"#ef3f9fff","u16":[61550,16241,40866,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#e93a9aff","out":{"hex":"#ff19a4ff","u16":[65535,6342,42031,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#e93a9aff","out":{"hex":"#f04ea3ff","u16":[61671,20092,41839,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#e93a9aff","out":{"hex":"#ff37a7ff","u16":[65535,14239,42940,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#e93a9aff","out":{"hex":"#f057a6ff","u16":[61761,22481,42551,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#e93a9aff","out":{"hex":"#ff45aaff","u16":[65535,17747,43607,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#e93a9aff","out":{"hex":"#f160a8ff","u16":[61851,24598,43250,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#e93a9aff","out":{"hex":"#ff50acff","u16":[65535,20572,44262,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#e93a9aff","out":{"hex":"#f160a8ff","u16":[61851,24598,43250,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#e93a9aff","out":{"hex":"#ff50acff","u16":[65535,20572,44262,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#e93a9aff","out":{"hex":"#e13895ff","u16":[57746,14375,38167,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#e93a9aff","out":{"hex":"#ef0099ff","u16":[61509,0,39273,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#e93a9aff","out":{"hex":"#d1348aff","u16":[53762,13383,35534,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#e93a9aff","out":{"hex":"#df008eff","u16":[57265,0,36564,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#e93a9aff","out":{"hex":"#cb3286ff","u16":[52065,12960,34412,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#e93a9aff","out":{"hex":"#d8008aff","u16":[55458,0,35410,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#e93a9aff","out":{"hex":"#c53183ff","u16":[50748,12633,33542,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#e93a9aff","out":{"hex":"#d20086ff","u16":[54055,0,34514,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#e93a9aff","out":{"hex":"#c0307fff","u16":[49388,12294,32643,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#e93a9aff","out":{"hex":"#cd0083ff","u16":[52606,0,33589,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#e93a9aff","out":{"hex":"#c0307fff","u16":[49388,12294,32643,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#e93a9aff","out":{"hex":"#cd0083ff","u16":[52606,0,33589,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#e93a9aff","out":{"hex":"#d3348bff","u16":[54105,13468,35761,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#e93a9aff","out":{"hex":"#e0008fff","u16":[57631,0,36797,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#e93a9aff","out":{"hex":"#a2286bff","u16":[41654,10369,27531,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#e93a9aff","out":{"hex":"#ad006eff","u16":[44368,0,28329,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#e93a9aff","out":{"hex":"#89225aff","u16":[35163,8753,23241,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#e93a9aff","out":{"hex":"#92005dff","u16":[37455,0,23915,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#e93a9aff","out":{"hex":"#711c4bff","u16":[29137,7253,19258,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#e93a9aff","out":{"hex":"#79004dff","u16":[31036,0,19816,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#e93a9aff","out":{"hex":"#521436ff","u16":[21025,5234,13897,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#e93a9aff","out":{"hex":"#570038ff","u16":[22395,0,14299,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#e93a9aff","out":{"hex":"#521436ff","u16":[21025,5234,13897,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#e93a9aff","out":{"hex":"#570038ff","u16":[22395,0,14299,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#e93a9aff","out":{"hex":"#90245fff","u16":[36956,9199,24426,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#e93a9aff","out":{"hex":"#990062ff","u16":[39365,0,25134,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#e93a9aff","out":{"hex":"#6f1c49ff","u16":[28452,7083,18805,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#e93a9aff","out":{"hex":"#76004bff","u16":[30305,0,19350,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#e93a9aff","out":{"hex":"#5d173eff","u16":[24018,5979,15875,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#e93a9aff","out":{"hex":"#640040ff","u16":[25584,0,16335,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#e93a9aff","out":{"hex":"#4d1333ff","u16":[19902,4954,13154,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#e93a9aff","out":{"hex":"#520035ff","u16":[21199,0,13535,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#e93a9aff","out":{"hex":"#380e25ff","u16":[14361,3575,9492,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#e93a9aff","out":{"hex":"#3c0026ff","u16":[15297,0,9767,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#e93a9aff","out":{"hex":"#380e25ff","u16":[14361,3575,9492,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#e93a9aff","out":{"hex":"#3c0026ff","u16":[15297,0,9767,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#e93d58ff","out":{"hex":"#ba3146ff","u16":[47727,12495,18026,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#e93d58ff","out":{"hex":"#c9003bff","u16":[51626,0,15270,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#e93d58ff","out":{"hex":"#ed5568ff","u16":[60825,21738,26846,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#e93d58ff","out":{"hex":"#ff3f5eff","u16":[65535,16193,24185,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#e93d58ff","out":{"hex":"#ee6b7aff","u16":[61154,27609,31385,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#e93d58ff","out":{"hex":"#ff5e72ff","u16":[65535,24034,29371,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#e93d58ff","out":{"hex":"#ef7986ff","u16":[61400,31179,34330,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#e93d58ff","out":{"hex":"#ff6e7fff","u16":[65535,28325,32634,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#e93d58ff","out":{"hex":"#f08690ff","u16":[61644,34315,36999,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#e93d58ff","out":{"hex":"#ff7c8aff","u16":[65535,31950,35546,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#e93d58ff","out":{"hex":"#f08690ff","u16":[61644,34315,36999,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#e93d58ff","out":{"hex":"#ff7c8aff","u16":[65535,31950,35546,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#e93d58ff","out":{"hex":"#d63851ff","u16":[55099,14425,20810,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#e93d58ff","out":{"hex":"#e80045ff","u16":[59600,0,17629,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#e93d58ff","out":{"hex":"#ec465fff","u16":[60667,18106,24309,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#e93d58ff","out":{"hex":"#ff2652ff","u16":[65535,9888,21153,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#e93d58ff","out":{"hex":"#ed5367ff","u16":[60808,21374,26581,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#e93d58ff","out":{"hex":"#ff3d5dff","u16":[65535,15645,23873,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#e93d58ff","out":{"hex":"#ed5b6eff","u16":[60913,23477,28143,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#e93d58ff","out":{"hex":"#ff4964ff","u16":[65535,18678,25691,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#e93d58ff","out":{"hex":"#ed6373ff","u16":[61018,25376,29607,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#e93d58ff","out":{"hex":"#ff536aff","u16":[65535,21211,27367,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#e93d58ff","out":{"hex":"#ed6373ff","u16":[61018,25376,29607,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#e93d58ff","out":{"hex":"#ff536aff","u16":[65535,21211,27367,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#e93d58ff","out":{"hex":"#e13b55ff","u16":[57757,15121,21814,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#e93d58ff","out":{"hex":"#f30048ff","u16":[62475,0,18479,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#e93d58ff","out":{"hex":"#d1374fff","u16":[53797,14084,20318,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#e93d58ff","out":{"hex":"#e20043ff","u16":[58191,0,17212,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#e93d58ff","out":{"hex":"#cb354dff","u16":[52111,13643,19681,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#e93d58ff","out":{"hex":"#db0041ff","u16":[56367,0,16673,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#e93d58ff","out":{"hex":"#c6344bff","u16":[50802,13300,19187,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#e93d58ff","out":{"hex":"#d6003fff","u16":[54952,0,16254,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#e93d58ff","out":{"hex":"#c03249ff","u16":[49451,12946,18677,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#e93d58ff","out":{"hex":"#d0003eff","u16":[53491,0,15822,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#e93d58ff","out":{"hex":"#c03249ff","u16":[49451,12946,18677,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#e93d58ff","out":{"hex":"#d0003eff","u16":[53491,0,15822,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#e93d58ff","out":{"hex":"#d33750ff","u16":[54105,14165,20435,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#e93d58ff","out":{"hex":"#e40043ff","u16":[58525,0,17311,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#e93d58ff","out":{"hex":"#a22a3dff","u16":[41654,10905,15732,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#e93d58ff","out":{"hex":"#af0034ff","u16":[45057,0,13327,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#e93d58ff","out":{"hex":"#892434ff","u16":[35163,9206,13281,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#e93d58ff","out":{"hex":"#94002cff","u16":[38036,0,11250,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#e93d58ff","out":{"hex":"#711e2bff","u16":[29137,7628,11005,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#e93d58ff","out":{"hex":"#7b0024ff","u16":[31517,0,9322,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#e93d58ff","out":{"hex":"#52151fff","u16":[21025,5504,7941,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#e93d58ff","out":{"hex":"#58001aff","u16":[22743,0,6727,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#e93d58ff","out":{"hex":"#52151fff","u16":[21025,5504,7941,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#e93d58ff","out":{"hex":"#58001aff","u16":[22743,0,6727,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#e93d58ff","out":{"hex":"#902637ff","u16":[37115,9717,14018,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#e93d58ff","out":{"hex":"#9c002eff","u16":[40147,0,11875,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#e93d58ff","out":{"hex":"#6f1d2aff","u16":[28574,7481,10792,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#e93d58ff","out":{"hex":"#780024ff","u16":[30908,0,9142,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#e93d58ff","out":{"hex":"#5e1923ff","u16":[24121,6315,9110,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#e93d58ff","out":{"hex":"#66001eff","u16":[26092,0,7717,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#e93d58ff","out":{"hex":"#4e141dff","u16":[19987,5233,7549,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#e93d58ff","out":{"hex":"#540019ff","u16":[21620,0,6395,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#e93d58ff","out":{"hex":"#380f15ff","u16":[14423,3776,5447,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#e93d58ff","out":{"hex":"#3d0012ff","u16":[15601,0,4615,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#e93d58ff","out":{"hex":"#380f15ff","u16":[14423,3776,5447,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#e93d58ff","out":{"hex":"#3d0012ff","u16":[15601,0,4615,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#e9643aff","out":{"hex":"#bd512fff","u16":[48602,20859,12098,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#e9643aff","out":{"hex":"#c74a00ff","u16":[51017,19009,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#e9643aff","out":{"hex":"#f3724eff","u16":[62539,29173,20091,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#e9643aff","out":{"hex":"#ff6a36ff","u16":[65535,27123,13985,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#e9643aff","out":{"hex":"#f4856dff","u16":[62806,34308,28052,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#e9643aff","out":{"hex":"#ff8060ff","u16":[65535,32791,24751,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#e9643aff","out":{"hex":"#f5927fff","u16":[63005,37623,32582,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#e9643aff","out":{"hex":"#ff8e75ff","u16":[65535,36370,30087,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#e9643aff","out":{"hex":"#f69e8eff","u16":[63204,40620,36459,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#e9643aff","out":{"hex":"#ff9a86ff","u16":[65535,39570,34474,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#e9643aff","out":{"hex":"#f69e8eff","u16":[63204,40620,36459,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#e9643aff","out":{"hex":"#ff9a86ff","u16":[65535,39570,34474,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#e9643aff","out":{"hex":"#d85d36ff","u16":[55631,23876,13848,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#e9643aff","out":{"hex":"#e35500ff","u16":[58396,21759,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#e9643aff","out":{"hex":"#f1673cff","u16":[61876,26556,15403,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#e9643aff","out":{"hex":"#fd5e00ff","u16":[64951,24201,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#e9643aff","out":{"hex":"#f3704bff","u16":[62515,28663,19188,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#e9643aff","out":{"hex":"#ff6731ff","u16":[65535,26548,12469,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#e9643aff","out":{"hex":"#f47656ff","u16":[62596,30370,22105,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#e9643aff","out":{"hex":"#ff6f42ff","u16":[65535,28461,17026,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#e9643aff","out":{"hex":"#f47c60ff","u16":[62678,31968,24621,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#e9643aff","out":{"hex":"#ff7650ff","u16":[65535,30231,20448,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#e9643aff","out":{"hex":"#f47c60ff","u16":[62678,31968,24621,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#e9643aff","out":{"hex":"#ff7650ff","u16":[65535,30231,20448,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#e9643aff","out":{"hex":"#e16038ff","u16":[57709,24768,14365,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#e9643aff","out":{"hex":"#ec5800ff","u16":[60578,22572,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#e9643aff","out":{"hex":"#d15a34ff","u16":[53653,23027,13356,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#e9643aff","out":{"hex":"#db5200ff","u16":[56320,20985,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#e9643aff","out":{"hex":"#ca5732ff","u16":[51923,22285,12925,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#e9643aff","out":{"hex":"#d44f00ff","u16":[54504,20308,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#e9643aff","out":{"hex":"#c55431ff","u16":[50579,21708,12590,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#e9643aff","out":{"hex":"#cf4d00ff","u16":[53093,19783,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#e9643aff","out":{"hex":"#bf5230ff","u16":[49190,21112,12245,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#e9643aff","out":{"hex":"#c94b00ff","u16":[51635,19239,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#e9643aff","out":{"hex":"#bf5230ff","u16":[49190,21112,12245,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#e9643aff","out":{"hex":"#c94b00ff","u16":[51635,19239,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#e9643aff","out":{"hex":"#d35a34ff","u16":[54105,23221,13468,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#e9643aff","out":{"hex":"#dd5200ff","u16":[56794,21162,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#e9643aff","out":{"hex":"#a24628ff","u16":[41654,17877,10369,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#e9643aff","out":{"hex":"#aa3f00ff","u16":[43724,16292,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#e9643aff","out":{"hex":"#893b22ff","u16":[35163,15092,8753,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#e9643aff","out":{"hex":"#903600ff","u16":[36911,13753,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#e9643aff","out":{"hex":"#71311cff","u16":[29137,12505,7253,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#e9643aff","out":{"hex":"#772c00ff","u16":[30586,11396,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#e9643aff","out":{"hex":"#522314ff","u16":[21025,9024,5234,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#e9643aff","out":{"hex":"#562000ff","u16":[22070,8224,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#e9643aff","out":{"hex":"#522314ff","u16":[21025,9024,5234,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#e9643aff","out":{"hex":"#562000ff","u16":[22070,8224,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#e9643aff","out":{"hex":"#8e3d23ff","u16":[36455,15646,9074,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#e9643aff","out":{"hex":"#953700ff","u16":[38267,14259,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#e9643aff","out":{"hex":"#6d2f1bff","u16":[28066,12045,6986,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#e9643aff","out":{"hex":"#732b00ff","u16":[29460,10977,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#e9643aff","out":{"hex":"#5c2817ff","u16":[23692,10169,5898,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#e9643aff","out":{"hex":"#612400ff","u16":[24870,9266,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#e9643aff","out":{"hex":"#4c2113ff","u16":[19632,8426,4887,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#e9643aff","out":{"hex":"#501e00ff","u16":[20608,7678,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#e9643aff","out":{"hex":"#37180eff","u16":[14166,6080,3527,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#e9643aff","out":{"hex":"#3a1600ff","u16":[14870,5541,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#e9643aff","out":{"hex":"#37180eff","u16":[14166,6080,3527,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#e9643aff","out":{"hex":"#3a1600ff","u16":[14870,5541,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#e8cb2dff","out":{"hex":"#c3ab26ff","u16":[50165,43894,9730,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#e8cb2dff","out":{"hex":"#c4ab00ff","u16":[50381,43892,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#e8cb2dff","out":{"hex":"#f8d930ff","u16":[63737,55770,12363,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#e8cb2dff","out":{"hex":"#f9d900ff","u16":[64011,55767,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#e8cb2dff","out":{"hex":"#fee998ff","u16":[65339,59781,38987,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#e8cb2dff","out":{"hex":"#ffe994ff","u16":[65535,59779,37926,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#e8cb2dff","out":{"hex":"#fff4d1ff","u16":[65432,62600,53626,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#e8cb2dff","out":{"hex":"#fff4cfff","u16":[65535,62599,53251,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#e8cb2dff","out":{"hex":"#fffefbff","u16":[65526,65274,64558,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#e8cb2dff","out":{"hex":"#fffefbff","u16":[65535,65274,64531,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#e8cb2dff","out":{"hex":"#fffefbff","u16":[65526,65274,64558,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#e8cb2dff","out":{"hex":"#fffefbff","u16":[65535,65274,64531,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#e8cb2dff","out":{"hex":"#dec22bff","u16":[57097,49960,11075,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#e8cb2dff","out":{"hex":"#dfc200ff","u16":[57343,49957,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#e8cb2dff","out":{"hex":"#edcf2eff","u16":[60841,53236,11801,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#e8cb2dff","out":{"hex":"#eecf00ff","u16":[61102,53233,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#e8cb2dff","out":{"hex":"#f2d42fff","u16":[62263,54480,12077,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#e8cb2dff","out":{"hex":"#f3d400ff","u16":[62531,54477,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#e8cb2dff","out":{"hex":"#f6d830ff","u16":[63305,55392,12279,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#e8cb2dff","out":{"hex":"#f7d800ff","u16":[63577,55389,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#e8cb2dff","out":{"hex":"#fadb31ff","u16":[64326,56285,12477,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#e8cb2dff","out":{"hex":"#fbdb00ff","u16":[64603,56283,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#e8cb2dff","out":{"hex":"#fadb31ff","u16":[64326,56285,12477,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#e8cb2dff","out":{"hex":"#fbdb00ff","u16":[64603,56283,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#e8cb2dff","out":{"hex":"#dec32bff","u16":[57173,50026,11090,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#e8cb2dff","out":{"hex":"#dfc300ff","u16":[57419,50024,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#e8cb2dff","out":{"hex":"#ccb328ff","u16":[52549,45981,10193,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#e8cb2dff","out":{"hex":"#cdb300ff","u16":[52776,45978,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#e8cb2dff","out":{"hex":"#c5ac26ff","u16":[50557,44237,9806,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#e8cb2dff","out":{"hex":"#c6ac00ff","u16":[50774,44235,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#e8cb2dff","out":{"hex":"#bfa725ff","u16":[48998,42873,9504,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#e8cb2dff","out":{"hex":"#bfa700ff","u16":[49209,42871,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#e8cb2dff","out":{"hex":"#b8a124ff","u16":[47377,41455,9190,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#e8cb2dff","out":{"hex":"#b9a100ff","u16":[47581,41453,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#e8cb2dff","out":{"hex":"#b8a124ff","u16":[47377,41455,9190,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#e8cb2dff","out":{"hex":"#b9a100ff","u16":[47581,41453,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#e8cb2dff","out":{"hex":"#d2b729ff","u16":[53873,47139,10450,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#e8cb2dff","out":{"hex":"#d3b700ff","u16":[54105,47136,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#e8cb2dff","out":{"hex":"#a18d1fff","u16":[41475,36291,8045,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#e8cb2dff","out":{"hex":"#a28d00ff","u16":[41654,36289,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#e8cb2dff","out":{"hex":"#88771aff","u16":[35012,30636,6791,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#e8cb2dff","out":{"hex":"#897700ff","u16":[35163,30634,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#e8cb2dff","out":{"hex":"#716316ff","u16":[29012,25386,5627,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#e8cb2dff","out":{"hex":"#716300ff","u16":[29137,25384,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#e8cb2dff","out":{"hex":"#514710ff","u16":[20935,18318,4061,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#e8cb2dff","out":{"hex":"#524700ff","u16":[21025,18317,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#e8cb2dff","out":{"hex":"#514710ff","u16":[20935,18318,4061,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#e8cb2dff","out":{"hex":"#524700ff","u16":[21025,18317,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#e8cb2dff","out":{"hex":"#7c6d18ff","u16":[31995,27996,6206,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#e8cb2dff","out":{"hex":"#7d6d00ff","u16":[32133,27994,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#e8cb2dff","out":{"hex":"#605413ff","u16":[24632,21553,4778,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#e8cb2dff","out":{"hex":"#605400ff","u16":[24738,21552,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#e8cb2dff","out":{"hex":"#514710ff","u16":[20793,18195,4033,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#e8cb2dff","out":{"hex":"#514700ff","u16":[20883,18193,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#e8cb2dff","out":{"hex":"#433b0dff","u16":[17230,15077,3342,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#e8cb2dff","out":{"hex":"#433b00ff","u16":[17304,15075,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#e8cb2dff","out":{"hex":"#302a09ff","u16":[12433,10879,2412,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#e8cb2dff","out":{"hex":"#312a00ff","u16":[12487,10878,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#e8cb2dff","out":{"hex":"#302a09ff","u16":[12433,10879,2412,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#e8cb2dff","out":{"hex":"#312a00ff","u16":[12487,10878,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#3dd425ff","out":{"hex":"#33b11fff","u16":[13100,45528,7946,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#3dd425ff","out":{"hex":"#2bb200ff","u16":[11047,45696,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#3dd425ff","out":{"hex":"#41e328ff","u16":[16792,58359,10185,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#3dd425ff","out":{"hex":"#37e400ff","u16":[14161,58575,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#3dd425ff","out":{"hex":"#46f42bff","u16":[18023,62636,10932,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#3dd425ff","out":{"hex":"#3bf500ff","u16":[15198,62868,0,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#3dd425ff","out":{"hex":"#56fe42ff","u16":[22134,65300,16849,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#3dd425ff","out":{"hex":"#4dff34ff","u16":[19867,65535,13251,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#3dd425ff","out":{"hex":"#9bfe94ff","u16":[39845,65363,38160,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#3dd425ff","out":{"hex":"#98ff91ff","u16":[39066,65535,37284,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#3dd425ff","out":{"hex":"#9bfe94ff","u16":[39845,65363,38160,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#3dd425ff","out":{"hex":"#98ff91ff","u16":[39066,65535,37284,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#3dd425ff","out":{"hex":"#3ac923ff","u16":[14886,51736,9029,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#3dd425ff","out":{"hex":"#31ca00ff","u16":[12554,51928,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#3dd425ff","out":{"hex":"#3ed926ff","u16":[16055,55797,9738,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#3dd425ff","out":{"hex":"#35da00ff","u16":[13539,56004,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#3dd425ff","out":{"hex":"#40df27ff","u16":[16495,57326,10005,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#3dd425ff","out":{"hex":"#36e000ff","u16":[13910,57538,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#3dd425ff","out":{"hex":"#41e328ff","u16":[16816,58441,10200,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#3dd425ff","out":{"hex":"#37e400ff","u16":[14181,58658,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#3dd425ff","out":{"hex":"#43e828ff","u16":[17129,59532,10390,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#3dd425ff","out":{"hex":"#38e800ff","u16":[14445,59752,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#3dd425ff","out":{"hex":"#43e828ff","u16":[17129,59532,10390,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#3dd425ff","out":{"hex":"#38e800ff","u16":[14445,59752,0,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#3dd425ff","out":{"hex":"#3bcc24ff","u16":[15060,52338,9135,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#3dd425ff","out":{"hex":"#31cc00ff","u16":[12700,52532,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#3dd425ff","out":{"hex":"#36bc21ff","u16":[13899,48305,8431,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#3dd425ff","out":{"hex":"#2ebd00ff","u16":[11721,48484,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#3dd425ff","out":{"hex":"#34b520ff","u16":[13401,46574,8128,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#3dd425ff","out":{"hex":"#2cb600ff","u16":[11301,46746,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#3dd425ff","out":{"hex":"#33b01fff","u16":[13012,45223,7893,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#3dd425ff","out":{"hex":"#2bb100ff","u16":[10973,45390,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#3dd425ff","out":{"hex":"#31ab1eff","u16":[12609,43821,7648,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#3dd425ff","out":{"hex":"#29ab00ff","u16":[10633,43983,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#3dd425ff","out":{"hex":"#31ab1eff","u16":[12609,43821,7648,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#3dd425ff","out":{"hex":"#29ab00ff","u16":[10633,43983,0,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#3dd425ff","out":{"hex":"#37c021ff","u16":[14165,49229,8592,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#3dd425ff","out":{"hex":"#2ec000ff","u16":[11945,49411,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#3dd425ff","out":{"hex":"#2a931aff","u16":[10905,37900,6615,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#3dd425ff","out":{"hex":"#249400ff","u16":[9196,38040,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#3dd425ff","out":{"hex":"#247c16ff","u16":[9206,31994,5584,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#3dd425ff","out":{"hex":"#1e7d00ff","u16":[7763,32113,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#3dd425ff","out":{"hex":"#1e6712ff","u16":[7628,26511,4627,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#3dd425ff","out":{"hex":"#196800ff","u16":[6433,26609,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#3dd425ff","out":{"hex":"#154a0dff","u16":[5504,19130,3339,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#3dd425ff","out":{"hex":"#124b00ff","u16":[4642,19201,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#3dd425ff","out":{"hex":"#154a0dff","u16":[5504,19130,3339,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#3dd425ff","out":{"hex":"#124b00ff","u16":[4642,19201,0,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#3dd425ff","out":{"hex":"#227715ff","u16":[8836,30707,5359,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#3dd425ff","out":{"hex":"#1d7800ff","u16":[7451,30821,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#3dd425ff","out":{"hex":"#1a5c10ff","u16":[6802,23640,4126,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#3dd425ff","out":{"hex":"#165c00ff","u16":[5736,23728,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#3dd425ff","out":{"hex":"#164e0eff","u16":[5742,19957,3483,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#3dd425ff","out":{"hex":"#134e00ff","u16":[4842,20031,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#3dd425ff","out":{"hex":"#13400bff","u16":[4758,16536,2886,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#3dd425ff","out":{"hex":"#104100ff","u16":[4013,16598,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#3dd425ff","out":{"hex":"#0d2e08ff","u16":[3433,11932,2083,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#3dd425ff","out":{"hex":"#0b2f00ff","u16":[2895,11977,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#3dd425ff","out":{"hex":"#0d2e08ff","u16":[3433,11932,2083,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#3dd425ff","out":{"hex":"#0b2f00ff","u16":[2895,11977,0,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#00d3b8ff","out":{"hex":"#00b19aff","u16":[0,45375,39569,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#00d3b8ff","out":{"hex":"#00b19aff","u16":[0,45375,39569,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#00d3b8ff","out":{"hex":"#00e2c5ff","u16":[0,58061,50631,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#00d3b8ff","out":{"hex":"#00e2c5ff","u16":[0,58061,50631,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#00d3b8ff","out":{"hex":"#00f2d3ff","u16":[0,62294,54323,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#00d3b8ff","out":{"hex":"#00f2d3ff","u16":[0,62294,54323,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#00d3b8ff","out":{"hex":"#00feddff","u16":[0,65255,56905,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#00d3b8ff","out":{"hex":"#00feddff","u16":[0,65255,56905,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#00d3b8ff","out":{"hex":"#91ffe8ff","u16":[37247,65535,59714,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#00d3b8ff","out":{"hex":"#91ffe8ff","u16":[37247,65535,59714,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#00d3b8ff","out":{"hex":"#91ffe8ff","u16":[37247,65535,59714,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#00d3b8ff","out":{"hex":"#91ffe8ff","u16":[37247,65535,59714,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#00d3b8ff","out":{"hex":"#00c9afff","u16":[0,51570,44971,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#00d3b8ff","out":{"hex":"#00c9afff","u16":[0,51570,44971,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#00d3b8ff","out":{"hex":"#00d8bcff","u16":[0,55499,48397,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#00d3b8ff","out":{"hex":"#00d8bcff","u16":[0,55499,48397,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#00d3b8ff","out":{"hex":"#00dec1ff","u16":[0,56980,49689,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#00d3b8ff","out":{"hex":"#00dec1ff","u16":[0,56980,49689,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#00d3b8ff","out":{"hex":"#00e2c5ff","u16":[0,58062,50632,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#00d3b8ff","out":{"hex":"#00e2c5ff","u16":[0,58062,50632,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#00d3b8ff","out":{"hex":"#00e6c9ff","u16":[0,59120,51555,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#00d3b8ff","out":{"hex":"#00e6c9ff","u16":[0,59120,51555,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#00d3b8ff","out":{"hex":"#00e6c9ff","u16":[0,59120,51555,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#00d3b8ff","out":{"hex":"#00e6c9ff","u16":[0,59120,51555,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#00d3b8ff","out":{"hex":"#00cbb1ff","u16":[0,52076,45412,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#00d3b8ff","out":{"hex":"#00cbb1ff","u16":[0,52076,45412,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#00d3b8ff","out":{"hex":"#00bba3ff","u16":[0,48030,41884,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#00d3b8ff","out":{"hex":"#00bba3ff","u16":[0,48030,41884,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#00d3b8ff","out":{"hex":"#00b49dff","u16":[0,46292,40368,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#00d3b8ff","out":{"hex":"#00b49dff","u16":[0,46292,40368,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#00d3b8ff","out":{"hex":"#00af98ff","u16":[0,44935,39185,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#00d3b8ff","out":{"hex":"#00af98ff","u16":[0,44935,39185,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#00d3b8ff","out":{"hex":"#00a994ff","u16":[0,43527,37957,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#00d3b8ff","out":{"hex":"#00a994ff","u16":[0,43527,37957,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#00d3b8ff","out":{"hex":"#00a994ff","u16":[0,43527,37957,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#00d3b8ff","out":{"hex":"#00a994ff","u16":[0,43527,37957,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#00d3b8ff","out":{"hex":"#00bfa6ff","u16":[0,48997,42727,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#00d3b8ff","out":{"hex":"#00bfa6ff","u16":[0,48997,42727,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#00d3b8ff","out":{"hex":"#009380ff","u16":[0,37721,32894,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#00d3b8ff","out":{"hex":"#009380ff","u16":[0,37721,32894,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#00d3b8ff","out":{"hex":"#007c6cff","u16":[0,31843,27768,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#00d3b8ff","out":{"hex":"#007c6cff","u16":[0,31843,27768,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#00d3b8ff","out":{"hex":"#00675aff","u16":[0,26386,23010,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#00d3b8ff","out":{"hex":"#00675aff","u16":[0,26386,23010,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#00d3b8ff","out":{"hex":"#004a41ff","u16":[0,19040,16604,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#00d3b8ff","out":{"hex":"#004a41ff","u16":[0,19040,16604,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#00d3b8ff","out":{"hex":"#004a41ff","u16":[0,19040,16604,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#00d3b8ff","out":{"hex":"#004a41ff","u16":[0,19040,16604,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#00d3b8ff","out":{"hex":"#007667ff","u16":[0,30324,26444,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#00d3b8ff","out":{"hex":"#007667ff","u16":[0,30324,26444,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#00d3b8ff","out":{"hex":"#005b4fff","u16":[0,23346,20358,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#00d3b8ff","out":{"hex":"#005b4fff","u16":[0,23346,20358,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#00d3b8ff","out":{"hex":"#004d43ff","u16":[0,19708,17186,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#00d3b8ff","out":{"hex":"#004d43ff","u16":[0,19708,17186,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#00d3b8ff","out":{"hex":"#004037ff","u16":[0,16330,14241,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#00d3b8ff","out":{"hex":"#004037ff","u16":[0,16330,14241,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#00d3b8ff","out":{"hex":"#002e28ff","u16":[0,11784,10276,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#00d3b8ff","out":{"hex":"#002e28ff","u16":[0,11784,10276,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#00d3b8ff","out":{"hex":"#002e28ff","u16":[0,11784,10276,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#00d3b8ff","out":{"hex":"#002e28ff","u16":[0,11784,10276,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#b875dcff","out":{"hex":"#a84cd1ff","u16":[43068,19610,53754,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#b875dcff","out":{"hex":"#c000f8ff","u16":[49262,0,63755,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#b875dcff","out":{"hex":"#be85dfff","u16":[48885,34215,57247,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#b875dcff","out":{"hex":"#d174ffff","u16":[53656,29899,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#b875dcff","out":{"hex":"#c596e2ff","u16":[50723,38505,58081,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#b875dcff","out":{"hex":"#d689ffff","u16":[54897,35194,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#b875dcff","out":{"hex":"#cba1e4ff","u16":[52051,41380,58698,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#b875dcff","out":{"hex":"#d996ffff","u16":[55807,38611,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#b875dcff","out":{"hex":"#d0abe7ff","u16":[53339,44033,59307,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#b875dcff","out":{"hex":"#dda2ffff","u16":[56699,41699,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#b875dcff","out":{"hex":"#d0abe7ff","u16":[53339,44033,59307,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#b875dcff","out":{"hex":"#dda2ffff","u16":[56699,41699,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#b875dcff","out":{"hex":"#b366daff","u16":[45961,26172,55966,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#b875dcff","out":{"hex":"#c948ffff","u16":[51725,18611,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#b875dcff","out":{"hex":"#bb7cddff","u16":[47935,31807,56824,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#b875dcff","out":{"hex":"#ce68ffff","u16":[53022,26773,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#b875dcff","out":{"hex":"#bd83deff","u16":[48698,33752,57163,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#b875dcff","out":{"hex":"#d072ffff","u16":[53531,29309,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#b875dcff","out":{"hex":"#c089dfff","u16":[49261,35127,57416,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#b875dcff","out":{"hex":"#d279ffff","u16":[53908,31050,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#b875dcff","out":{"hex":"#c28ee0ff","u16":[49817,36441,57667,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#b875dcff","out":{"hex":"#d37fffff","u16":[54282,32682,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#b875dcff","out":{"hex":"#c28ee0ff","u16":[49817,36441,57667,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#b875dcff","out":{"hex":"#d37fffff","u16":[54282,32682,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#b875dcff","out":{"hex":"#b56ddbff","u16":[46576,28043,56231,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#b875dcff","out":{"hex":"#cb54ffff","u16":[52126,21512,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#b875dcff","out":{"hex":"#b05dd9ff","u16":[45297,23995,55684,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#b875dcff","out":{"hex":"#c83affff","u16":[51296,14778,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#b875dcff","out":{"hex":"#ae56d8ff","u16":[44773,22124,55464,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#b875dcff","out":{"hex":"#c629ffff","u16":[50959,10649,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#b875dcff","out":{"hex":"#ad50d7ff","u16":[44376,20584,55298,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#b875dcff","out":{"hex":"#c514ffff","u16":[50704,5213,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#b875dcff","out":{"hex":"#a94dd3ff","u16":[43355,19740,54112,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#b875dcff","out":{"hex":"#c100faff","u16":[49590,0,64180,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#b875dcff","out":{"hex":"#a94dd3ff","u16":[43355,19740,54112,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#b875dcff","out":{"hex":"#c100faff","u16":[49590,0,64180,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#b875dcff","out":{"hex":"#b15fd9ff","u16":[45448,24508,55748,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#b875dcff","out":{"hex":"#c83dffff","u16":[51393,15743,65535,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#b875dcff","out":{"hex":"#8f41b3ff","u16":[36770,16742,45893,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#b875dcff","out":{"hex":"#a400d4ff","u16":[42058,0,54432,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#b875dcff","out":{"hex":"#793797ff","u16":[31040,14133,38742,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#b875dcff","out":{"hex":"#8a00b3ff","u16":[35504,0,45950,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#b875dcff","out":{"hex":"#642e7dff","u16":[25721,11711,32102,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#b875dcff","out":{"hex":"#720094ff","u16":[29420,0,38075,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#b875dcff","out":{"hex":"#48215aff","u16":[18560,8451,23165,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#b875dcff","out":{"hex":"#53006bff","u16":[21229,0,27475,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#b875dcff","out":{"hex":"#48215aff","u16":[18560,8451,23165,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#b875dcff","out":{"hex":"#53006bff","u16":[21229,0,27475,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#b875dcff","out":{"hex":"#7d399bff","u16":[32008,14574,39950,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#b875dcff","out":{"hex":"#8e00b8ff","u16":[36611,0,47383,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#b875dcff","out":{"hex":"#602c78ff","u16":[24642,11220,30756,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#b875dcff","out":{"hex":"#6e008eff","u16":[28186,0,36479,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#b875dcff","out":{"hex":"#512565ff","u16":[20802,9472,25964,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#b875dcff","out":{"hex":"#5d0078ff","u16":[23794,0,30795,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#b875dcff","out":{"hex":"#431f54ff","u16":[17238,7848,21514,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#b875dcff","out":{"hex":"#4d0063ff","u16":[19717,0,25517,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#b875dcff","out":{"hex":"#30163cff","u16":[12438,5664,15525,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#b875dcff","out":{"hex":"#370048ff","u16":[14227,0,18413,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#b875dcff","out":{"hex":"#30163cff","u16":[12438,5664,15525,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#b875dcff","out":{"hex":"#370048ff","u16":[14227,0,18413,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#926ee4ff","out":{"hex":"#7e47e1ff","u16":[32362,18264,57731,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#926ee4ff","out":{"hex":"#8532ffff","u16":[34202,12784,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#926ee4ff","out":{"hex":"#9b7ce6ff","u16":[39807,31948,59023,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#926ee4ff","out":{"hex":"#a074ffff","u16":[41038,29921,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#926ee4ff","out":{"hex":"#a58be8ff","u16":[42357,35781,59530,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#926ee4ff","out":{"hex":"#a985ffff","u16":[43420,34160,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#926ee4ff","out":{"hex":"#ac95e9ff","u16":[44155,38361,59907,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#926ee4ff","out":{"hex":"#b090ffff","u16":[45108,36965,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#926ee4ff","out":{"hex":"#b29febff","u16":[45869,40747,60281,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#926ee4ff","out":{"hex":"#b69affff","u16":[46723,39536,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#926ee4ff","out":{"hex":"#b29febff","u16":[45869,40747,60281,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#926ee4ff","out":{"hex":"#b69affff","u16":[46723,39536,65535,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#926ee4ff","out":{"hex":"#8a60e3ff","u16":[35469,24672,58236,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#926ee4ff","out":{"hex":"#9054ffff","u16":[37030,21467,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#926ee4ff","out":{"hex":"#9674e5ff","u16":[38499,29878,58775,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#926ee4ff","out":{"hex":"#9b6bffff","u16":[39824,27584,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#926ee4ff","out":{"hex":"#9a7be6ff","u16":[39635,31679,58989,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#926ee4ff","out":{"hex":"#9f73ffff","u16":[40878,29620,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#926ee4ff","out":{"hex":"#9d80e6ff","u16":[40461,32954,59150,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#926ee4ff","out":{"hex":"#a279ffff","u16":[41647,31043,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#926ee4ff","out":{"hex":"#a185e7ff","u16":[41267,34172,59309,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#926ee4ff","out":{"hex":"#a57effff","u16":[42400,32392,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#926ee4ff","out":{"hex":"#a185e7ff","u16":[41267,34172,59309,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#926ee4ff","out":{"hex":"#a57effff","u16":[42400,32392,65535,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#926ee4ff","out":{"hex":"#8e68e3ff","u16":[36556,26619,58424,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#926ee4ff","out":{"hex":"#945dffff","u16":[38028,23806,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#926ee4ff","out":{"hex":"#875be2ff","u16":[34786,23388,58120,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#926ee4ff","out":{"hex":"#8e4dffff","u16":[36405,19874,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#926ee4ff","out":{"hex":"#8455e2ff","u16":[34047,21933,57999,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#926ee4ff","out":{"hex":"#8b46ffff","u16":[35731,18007,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#926ee4ff","out":{"hex":"#8251e1ff","u16":[33480,20761,57907,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#926ee4ff","out":{"hex":"#8940ffff","u16":[35215,16438,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#926ee4ff","out":{"hex":"#804ce1ff","u16":[32901,19504,57815,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#926ee4ff","out":{"hex":"#8739ffff","u16":[34690,14665,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#926ee4ff","out":{"hex":"#804ce1ff","u16":[32901,19504,57815,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#926ee4ff","out":{"hex":"#8739ffff","u16":[34690,14665,65535,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#926ee4ff","out":{"hex":"#885ce2ff","u16":[34942,23686,58147,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#926ee4ff","out":{"hex":"#8e4fffff","u16":[36548,20248,65535,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#926ee4ff","out":{"hex":"#7133d3ff","u16":[29009,13221,54202,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#926ee4ff","out":{"hex":"#7800f0ff","u16":[30895,0,61784,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#926ee4ff","out":{"hex":"#5f2bb2ff","u16":[24489,11160,45756,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#926ee4ff","out":{"hex":"#6500cbff","u16":[26081,0,52156,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#926ee4ff","out":{"hex":"#4f2494ff","u16":[20292,9248,37915,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#926ee4ff","out":{"hex":"#5400a8ff","u16":[21611,0,43218,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#926ee4ff","out":{"hex":"#391a6aff","u16":[14643,6673,27359,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#926ee4ff","out":{"hex":"#3d0079ff","u16":[15594,0,31186,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#926ee4ff","out":{"hex":"#391a6aff","u16":[14643,6673,27359,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#926ee4ff","out":{"hex":"#3d0079ff","u16":[15594,0,31186,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#926ee4ff","out":{"hex":"#642ebbff","u16":[25691,11708,48004,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#926ee4ff","out":{"hex":"#6a00d5ff","u16":[27362,0,54718,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#926ee4ff","out":{"hex":"#4d2390ff","u16":[19779,9015,36957,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#926ee4ff","out":{"hex":"#5200a4ff","u16":[21065,0,42126,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#926ee4ff","out":{"hex":"#411e79ff","u16":[16697,7609,31198,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#926ee4ff","out":{"hex":"#45008aff","u16":[17783,0,35562,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#926ee4ff","out":{"hex":"#361965ff","u16":[13836,6306,25852,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#926ee4ff","out":{"hex":"#390073ff","u16":[14735,0,29468,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#926ee4ff","out":{"hex":"#271249ff","u16":[9984,4550,18654,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#926ee4ff","out":{"hex":"#290053ff","u16":[10633,0,21264,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#926ee4ff","out":{"hex":"#271249ff","u16":[9984,4550,18654,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#926ee4ff","out":{"hex":"#290053ff","u16":[10633,0,21264,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#686b6fff","out":{"hex":"#505255ff","u16":[20451,21041,21827,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#686b6fff","out":{"hex":"#39546eff","u16":[14529,21633,28322,65535]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#686b6fff","out":{"hex":"#72757aff","u16":[29284,30129,31255,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#686b6fff","out":{"hex":"#51799eff","u16":[20804,30976,40556,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#686b6fff","out":{"hex":"#7d8085ff","u16":[32036,32960,34192,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#686b6fff","out":{"hex":"#5984adff","u16":[22759,33887,44366,65535]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#686b6fff","out":{"hex":"#84888dff","u16":[33926,34905,36210,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#686b6fff","out":{"hex":"#5e8cb7ff","u16":[24102,35887,46985,65535]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#686b6fff","out":{"hex":"#8b8f94ff","u16":[35698,36728,38101,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#686b6fff","out":{"hex":"#6393c0ff","u16":[25361,37761,49439,65535]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#686b6fff","out":{"hex":"#8b8f94ff","u16":[35698,36728,38101,65535]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#686b6fff","out":{"hex":"#6393c0ff","u16":[25361,37761,49439,65535]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#686b6fff","out":{"hex":"#5e6164ff","u16":[24155,24852,25781,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#686b6fff","out":{"hex":"#436382ff","u16":[17160,25551,33452,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#686b6fff","out":{"hex":"#6d7074ff","u16":[27909,28714,29788,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#686b6fff","out":{"hex":"#4d7396ff","u16":[19828,29522,38652,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#686b6fff","out":{"hex":"#727579ff","u16":[29252,30096,31221,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#686b6fff","out":{"hex":"#51789eff","u16":[20782,30943,40511,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#686b6fff","out":{"hex":"#76797dff","u16":[30213,31084,32246,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#686b6fff","out":{"hex":"#547ca3ff","u16":[21464,31959,41841,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#686b6fff","out":{"hex":"#797d81ff","u16":[31138,32036,33234,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#686b6fff","out":{"hex":"#5680a8ff","u16":[22121,32937,43123,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#686b6fff","out":{"hex":"#797d81ff","u16":[31138,32036,33234,65535]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#686b6fff","out":{"hex":"#5680a8ff","u16":[22121,32937,43123,65535]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#686b6fff","out":{"hex":"#64676bff","u16":[25805,26549,27542,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#686b6fff","out":{"hex":"#476a8bff","u16":[18333,27296,35737,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#686b6fff","out":{"hex":"#5e6064ff","u16":[24086,24781,25708,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#686b6fff","out":{"hex":"#436382ff","u16":[17112,25478,33357,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#686b6fff","out":{"hex":"#5b5e61ff","u16":[23356,24030,24928,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#686b6fff","out":{"hex":"#41607eff","u16":[16593,24706,32346,65535]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#686b6fff","out":{"hex":"#595b5fff","u16":[22790,23447,24324,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#686b6fff","out":{"hex":"#3f5e7bff","u16":[16191,24107,31562,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#686b6fff","out":{"hex":"#56595cff","u16":[22206,22847,23701,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#686b6fff","out":{"hex":"#3d5b78ff","u16":[15776,23490,30754,65535]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#686b6fff","out":{"hex":"#56595cff","u16":[22206,22847,23701,65535]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#686b6fff","out":{"hex":"#3d5b78ff","u16":[15776,23490,30754,65535]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#686b6fff","out":{"hex":"#5e6164ff","u16":[24150,24847,25775,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#686b6fff","out":{"hex":"#436382ff","u16":[17157,25546,33445,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#686b6fff","out":{"hex":"#484a4dff","u16":[18592,19129,19844,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#686b6fff","out":{"hex":"#334d64ff","u16":[13209,19667,25749,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#686b6fff","out":{"hex":"#3d3f41ff","u16":[15695,16148,16752,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#686b6fff","out":{"hex":"#2b4155ff","u16":[11150,16602,21736,65535]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#686b6fff","out":{"hex":"#333436ff","u16":[13006,13381,13881,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#686b6fff","out":{"hex":"#243646ff","u16":[9239,13757,18011,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#686b6fff","out":{"hex":"#252627ff","u16":[9385,9655,10016,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#686b6fff","out":{"hex":"#1a2733ff","u16":[6667,9927,12997,65535]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#686b6fff","out":{"hex":"#252627ff","u16":[9385,9655,10016,65535]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#686b6fff","out":{"hex":"#1a2733ff","u16":[6667,9927,12997,65535]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#686b6fff","out":{"hex":"#424446ff","u16":[16899,17387,18036,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#686b6fff","out":{"hex":"#2f465bff","u16":[12006,17876,23403,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#686b6fff","out":{"hex":"#333436ff","u16":[13010,13385,13886,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#686b6fff","out":{"hex":"#243646ff","u16":[9243,13762,18018,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#686b6fff","out":{"hex":"#2b2c2eff","u16":[10983,11300,11722,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#686b6fff","out":{"hex":"#1e2d3bff","u16":[7802,11617,15210,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#686b6fff","out":{"hex":"#232426ff","u16":[9101,9363,9713,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#686b6fff","out":{"hex":"#192531ff","u16":[6465,9626,12603,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#686b6fff","out":{"hex":"#1a1a1bff","u16":[6567,6756,7009,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#686b6fff","out":{"hex":"#121b23ff","u16":[4665,6946,9095,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#686b6fff","out":{"hex":"#1a1a1bff","u16":[6567,6756,7009,65535]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#686b6fff","out":{"hex":"#121b23ff","u16":[4665,6946,9095,65535]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#3daee980","out":{"hex":"#3290c180","u16":[12967,36988,49529,32896]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#3daee980","out":{"hex":"#0091c780","u16":[0,37260,51067,32896]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#3daee980","out":{"hex":"#4bbaf780","u16":[19330,47912,63602,32896]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#3daee980","out":{"hex":"#2bbcff80","u16":[11102,48251,65535,32896]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#3daee980","out":{"hex":"#7ac6f980","u16":[31305,50791,63873,32896]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#3daee980","out":{"hex":"#6dc7ff80","u16":[28119,51064,65535,32896]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#3daee980","out":{"hex":"#92cef980","u16":[37530,52828,64075,32896]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#3daee980","out":{"hex":"#89ceff80","u16":[35335,53057,65535,32896]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#3daee980","out":{"hex":"#a6d5fa80","u16":[42710,54775,64277,32896]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#3daee980","out":{"hex":"#a0d6ff80","u16":[41108,54964,65535,32896]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#3daee980","out":{"hex":"#a6d5fa80","u16":[42710,54775,64277,32896]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#3daee980","out":{"hex":"#a0d6ff80","u16":[41108,54964,65535,32896]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#3daee980","out":{"hex":"#39a4db80","u16":[14749,42070,56336,32896]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#3daee980","out":{"hex":"#00a5e280","u16":[0,42380,58085,32896]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#3daee980","out":{"hex":"#3fb3f080","u16":[16117,45974,61563,32896]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#3daee980","out":{"hex":"#00b4f780","u16":[0,46312,63474,32896]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#3daee980","out":{"hex":"#41b9f780","u16":[16627,47428,63511,32896]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#3daee980","out":{"hex":"#00baff80","u16":[0,47778,65483,32896]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#3daee980","out":{"hex":"#52bcf880","u16":[21175,48262,63634,32896]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#3daee980","out":{"hex":"#38bdff80","u16":[14469,48592,65535,32896]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#3daee980","out":{"hex":"#61bff880","u16":[24886,49070,63709,32896]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#3daee980","out":{"hex":"#4ec0ff80","u16":[19992,49381,65535,32896]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#3daee980","out":{"hex":"#61bff880","u16":[24886,49070,63709,32896]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#3daee980","out":{"hex":"#4ec0ff80","u16":[19992,49381,65535,32896]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#3daee980","out":{"hex":"#3ba7e080","u16":[15084,43027,57617,32896]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#3daee980","out":{"hex":"#00a9e780","u16":[0,43344,59406,32896]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#3daee980","out":{"hex":"#369bd080","u16":[13973,39859,53374,32896]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#3daee980","out":{"hex":"#009cd680","u16":[0,40152,55031,32896]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#3daee980","out":{"hex":"#3596c980","u16":[13498,38503,51559,32896]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#3daee980","out":{"hex":"#0097cf80","u16":[0,38787,53160,32896]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#3daee980","out":{"hex":"#3392c380","u16":[13128,37447,50145,32896]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#3daee980","out":{"hex":"#0093c980","u16":[0,37723,51702,32896]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#3daee980","out":{"hex":"#328dbd80","u16":[12745,36355,48682,32896]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#3daee980","out":{"hex":"#008fc380","u16":[0,36623,50194,32896]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#3daee980","out":{"hex":"#328dbd80","u16":[12745,36355,48682,32896]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#3daee980","out":{"hex":"#008fc380","u16":[0,36623,50194,32896]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#3daee980","out":{"hex":"#379dd380","u16":[14165,40405,54105,32896]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#3daee980","out":{"hex":"#009ed980","u16":[0,40702,55785,32896]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#3daee980","out":{"hex":"#2a79a280","u16":[10905,31107,41654,32896]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#3daee980","out":{"hex":"#007aa780","u16":[0,31336,42948,32896]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#3daee980","out":{"hex":"#24668980","u16":[9206,26259,35163,32896]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#3daee980","out":{"hex":"#00678d80","u16":[0,26453,36255,32896]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#3daee980","out":{"hex":"#1e557180","u16":[7628,21759,29137,32896]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#3daee980","out":{"hex":"#00557580","u16":[0,21919,30042,32896]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#3daee980","out":{"hex":"#153d5280","u16":[5504,15701,21025,32896]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#3daee980","out":{"hex":"#003e5480","u16":[0,15817,21678,32896]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#3daee980","out":{"hex":"#153d5280","u16":[5504,15701,21025,32896]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#3daee980","out":{"hex":"#003e5480","u16":[0,15817,21678,32896]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#3daee980","out":{"hex":"#24668980","u16":[9200,26243,35140,32896]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#3daee980","out":{"hex":"#00678d80","u16":[0,26435,36232,32896]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#3daee980","out":{"hex":"#1c4f6980","u16":[7083,20204,27054,32896]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#3daee980","out":{"hex":"#004f6d80","u16":[0,20352,27894,32896]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#3daee980","out":{"hex":"#17425980","u16":[5979,17055,22838,32896]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#3daee980","out":{"hex":"#00435c80","u16":[0,17181,23547,32896]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#3daee980","out":{"hex":"#13374a80","u16":[4954,14132,18924,32896]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#3daee980","out":{"hex":"#00374c80","u16":[0,14236,19512,32896]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#3daee980","out":{"hex":"#0e283580","u16":[3575,10198,13655,32896]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#3daee980","out":{"hex":"#00283780","u16":[0,10273,14080,32896]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#3daee980","out":{"hex":"#0e283580","u16":[3575,10198,13655,32896]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#3daee980","out":{"hex":"#00283780","u16":[0,10273,14080,32896]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#ffffff00","out":{"hex":"#fafafa00","u16":[64330,64330,64330,0]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#ffffff00","out":{"hex":"#fdfafa00","u16":[64936,64165,64165,0]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#ffffff00","out":{"hex":"#e6e6e600","u16":[59214,59214,59214,0]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#ffffff00","out":{"hex":"#f3e3e300","u16":[62470,58297,58297,0]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#ffffff00","out":{"hex":"#d6d6d600","u16":[54997,54997,54997,0]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#ffffff00","out":{"hex":"#ecd0d000","u16":[60542,53381,53381,0]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#ffffff00","out":{"hex":"#c4c4c400","u16":[50352,50352,50352,0]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#ffffff00","out":{"hex":"#e4baba00","u16":[58536,47850,47850,0]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#ffffff00","out":{"hex":"#c4c4c400","u16":[50352,50352,50352,0]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#ffffff00","out":{"hex":"#e4baba00","u16":[58536,47850,47850,0]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#ffffff00","out":{"hex":"#fdfdfd00","u16":[64936,64936,64936,0]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#ffffff00","out":{"hex":"#fefcfc00","u16":[65236,64855,64855,0]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#ffffff00","out":{"hex":"#f3f3f300","u16":[62470,62470,62470,0]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#ffffff00","out":{"hex":"#f9f1f100","u16":[64025,62043,62043,0]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#ffffff00","out":{"hex":"#ececec00","u16":[60542,60542,60542,0]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#ffffff00","out":{"hex":"#f6e9e900","u16":[63098,59829,59829,0]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#ffffff00","out":{"hex":"#e4e4e400","u16":[58536,58536,58536,0]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#ffffff00","out":{"hex":"#f2e0e000","u16":[62154,57512,57512,0]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#ffffff00","out":{"hex":"#e4e4e400","u16":[58536,58536,58536,0]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#ffffff00","out":{"hex":"#f2e0e000","u16":[62154,57512,57512,0]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#ffffff00","out":{"hex":"#fafafa00","u16":[64330,64330,64330,0]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#ffffff00","out":{"hex":"#fdfafa00","u16":[64936,64165,64165,0]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#ffffff00","out":{"hex":"#e6e6e600","u16":[59214,59214,59214,0]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#ffffff00","out":{"hex":"#f3e3e300","u16":[62470,58297,58297,0]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#ffffff00","out":{"hex":"#d6d6d600","u16":[54997,54997,54997,0]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#ffffff00","out":{"hex":"#ecd0d000","u16":[60542,53381,53381,0]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#ffffff00","out":{"hex":"#c4c4c400","u16":[50352,50352,50352,0]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#ffffff00","out":{"hex":"#e4baba00","u16":[58536,47850,47850,0]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#ffffff00","out":{"hex":"#c4c4c400","u16":[50352,50352,50352,0]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#ffffff00","out":{"hex":"#e4baba00","u16":[58536,47850,47850,0]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#ffffff00","out":{"hex":"#f8f8f800","u16":[63717,63717,63717,0]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#ffffff00","out":{"hex":"#fbf7f700","u16":[64634,63467,63467,0]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#ffffff00","out":{"hex":"#d9d9d900","u16":[55727,55727,55727,0]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#ffffff00","out":{"hex":"#edd3d300","u16":[60868,54237,54237,0]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#ffffff00","out":{"hex":"#bdbdbd00","u16":[48684,48684,48684,0]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#ffffff00","out":{"hex":"#e1b2b200","u16":[57849,45826,45826,0]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#ffffff00","out":{"hex":"#9c9c9c00","u16":[40134,40134,40134,0]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#ffffff00","out":{"hex":"#d5888800","u16":[54628,34956,34956,0]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#ffffff00","out":{"hex":"#9c9c9c00","u16":[40134,40134,40134,0]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#ffffff00","out":{"hex":"#d5888800","u16":[54628,34956,34956,0]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#ffffff00","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#ffffff00","out":{"hex":"#f3f3f300","u16":[62470,62470,62470,0]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#ffffff00","out":{"hex":"#f9f1f100","u16":[64025,62043,62043,0]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#ffffff00","out":{"hex":"#c1c1c100","u16":[49526,49526,49526,0]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#ffffff00","out":{"hex":"#e2b6b600","u16":[58194,46851,46851,0]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#ffffff00","out":{"hex":"#8d8d8d00","u16":[36141,36141,36141,0]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#ffffff00","out":{"hex":"#cf727200","u16":[53312,29400,29400,0]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,0]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,0]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,0]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#ffffff00","out":{"hex":"#00000000","u16":[0,0,0,0]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#00000080","out":{"hex":"#41414180","u16":[16792,16792,16792,32896]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#00000080","out":{"hex":"#69303080","u16":[27038,12254,12254,32896]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#00000080","out":{"hex":"#aeaeae80","u16":[44655,44655,44655,32896]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#00000080","out":{"hex":"#db9f9f80","u16":[56266,40827,40827,32896]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#00000080","out":{"hex":"#dbdbdb80","u16":[56266,56266,56266,32896]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#00000080","out":{"hex":"#eed5d580","u16":[61112,54869,54869,32896]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#00000080","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#00000080","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#00000080","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#00000080","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#00000080","out":{"hex":"#34343480","u16":[13312,13312,13312,32896]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#00000080","out":{"hex":"#53262680","u16":[21435,9715,9715,32896]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#00000080","out":{"hex":"#8d8d8d80","u16":[36141,36141,36141,32896]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#00000080","out":{"hex":"#cf727280","u16":[53312,29400,29400,32896]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#00000080","out":{"hex":"#b1b1b180","u16":[45587,45587,45587,32896]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#00000080","out":{"hex":"#dca3a380","u16":[56623,42000,42000,32896]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#00000080","out":{"hex":"#cfcfcf80","u16":[53121,53121,53121,32896]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#00000080","out":{"hex":"#e8c7c780","u16":[59716,51163,51163,32896]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#00000080","out":{"hex":"#cfcfcf80","u16":[53121,53121,53121,32896]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#00000080","out":{"hex":"#e8c7c780","u16":[59716,51163,51163,32896]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#00000080","out":{"hex":"#1f1f1f80","u16":[8079,8079,8079,32896]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#00000080","out":{"hex":"#33171780","u16":[13009,5896,5896,32896]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#00000080","out":{"hex":"#55555580","u16":[21935,21935,21935,32896]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#00000080","out":{"hex":"#893e3e80","u16":[35319,16007,16007,32896]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#00000080","out":{"hex":"#6c6c6c80","u16":[27667,27667,27667,32896]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#00000080","out":{"hex":"#ad4f4f80","u16":[44550,20190,20190,32896]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#00000080","out":{"hex":"#7d7d7d80","u16":[32240,32240,32240,32896]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#00000080","out":{"hex":"#ca5c5c80","u16":[51912,23527,23527,32896]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#00000080","out":{"hex":"#7d7d7d80","u16":[32240,32240,32240,32896]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#00000080","out":{"hex":"#ca5c5c80","u16":[51912,23527,23527,32896]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#00000080","out":{"hex":"#2b2b2b80","u16":[11072,11072,11072,32896]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#00000080","out":{"hex":"#451f1f80","u16":[17827,8079,8079,32896]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#00000080","out":{"hex":"#75757580","u16":[30058,30058,30058,32896]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#00000080","out":{"hex":"#bc555580","u16":[48399,21935,21935,32896]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#00000080","out":{"hex":"#94949480","u16":[37914,37914,37914,32896]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#00000080","out":{"hex":"#d27c7c80","u16":[53881,31924,31924,32896]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#00000080","out":{"hex":"#acacac80","u16":[44180,44180,44180,32896]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#00000080","out":{"hex":"#da9d9d80","u16":[56087,40225,40225,32896]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#00000080","out":{"hex":"#acacac80","u16":[44180,44180,44180,32896]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#00000080","out":{"hex":"#da9d9d80","u16":[56087,40225,40225,32896]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#00000080","out":{"hex":"#00000080","u16":[0,0,0,32896]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#00000080","out":{"hex":"#34343480","u16":[13312,13312,13312,32896]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#00000080","out":{"hex":"#53262680","u16":[21435,9715,9715,32896]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#00000080","out":{"hex":"#8d8d8d80","u16":[36141,36141,36141,32896]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#00000080","out":{"hex":"#cf727280","u16":[53312,29400,29400,32896]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#00000080","out":{"hex":"#b1b1b180","u16":[45587,45587,45587,32896]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#00000080","out":{"hex":"#dca3a380","u16":[56623,42000,42000,32896]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#00000080","out":{"hex":"#cfcfcf80","u16":[53121,53121,53121,32896]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#00000080","out":{"hex":"#e8c7c780","u16":[59716,51163,51163,32896]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#00000080","out":{"hex":"#cfcfcf80","u16":[53121,53121,53121,32896]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#00000080","out":{"hex":"#e8c7c780","u16":[59716,51163,51163,32896]},"role":"Shadow"}, +{"chroma":0,"contrast":-1,"in":"#ff000033","out":{"hex":"#cb000033","u16":[52246,0,0,13107]},"role":"Light"}, +{"chroma":0.5,"contrast":-1,"in":"#ff000033","out":{"hex":"#cb000033","u16":[52246,0,0,13107]},"role":"Light"}, +{"chroma":0,"contrast":0,"in":"#ff000033","out":{"hex":"#ff434333","u16":[65535,17242,17242,13107]},"role":"Light"}, +{"chroma":0.5,"contrast":0,"in":"#ff000033","out":{"hex":"#ff434333","u16":[65535,17242,17242,13107]},"role":"Light"}, +{"chroma":0,"contrast":0.4,"in":"#ff000033","out":{"hex":"#ff606033","u16":[65535,24674,24674,13107]},"role":"Light"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff000033","out":{"hex":"#ff606033","u16":[65535,24674,24674,13107]},"role":"Light"}, +{"chroma":0,"contrast":0.7,"in":"#ff000033","out":{"hex":"#ff707033","u16":[65535,28837,28837,13107]},"role":"Light"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff000033","out":{"hex":"#ff707033","u16":[65535,28837,28837,13107]},"role":"Light"}, +{"chroma":0,"contrast":1,"in":"#ff000033","out":{"hex":"#ff7e7e33","u16":[65535,32379,32379,13107]},"role":"Light"}, +{"chroma":0.5,"contrast":1,"in":"#ff000033","out":{"hex":"#ff7e7e33","u16":[65535,32379,32379,13107]},"role":"Light"}, +{"chroma":0,"contrast":1.5,"in":"#ff000033","out":{"hex":"#ff7e7e33","u16":[65535,32379,32379,13107]},"role":"Light"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff000033","out":{"hex":"#ff7e7e33","u16":[65535,32379,32379,13107]},"role":"Light"}, +{"chroma":0,"contrast":-1,"in":"#ff000033","out":{"hex":"#eb000033","u16":[60309,0,0,13107]},"role":"Midlight"}, +{"chroma":0.5,"contrast":-1,"in":"#ff000033","out":{"hex":"#eb000033","u16":[60309,0,0,13107]},"role":"Midlight"}, +{"chroma":0,"contrast":0,"in":"#ff000033","out":{"hex":"#ff2e2e33","u16":[65535,11694,11694,13107]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0,"in":"#ff000033","out":{"hex":"#ff2e2e33","u16":[65535,11694,11694,13107]},"role":"Midlight"}, +{"chroma":0,"contrast":0.4,"in":"#ff000033","out":{"hex":"#ff414133","u16":[65535,16734,16734,13107]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff000033","out":{"hex":"#ff414133","u16":[65535,16734,16734,13107]},"role":"Midlight"}, +{"chroma":0,"contrast":0.7,"in":"#ff000033","out":{"hex":"#ff4c4c33","u16":[65535,19557,19557,13107]},"role":"Midlight"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff000033","out":{"hex":"#ff4c4c33","u16":[65535,19557,19557,13107]},"role":"Midlight"}, +{"chroma":0,"contrast":1,"in":"#ff000033","out":{"hex":"#ff555533","u16":[65535,21960,21960,13107]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1,"in":"#ff000033","out":{"hex":"#ff555533","u16":[65535,21960,21960,13107]},"role":"Midlight"}, +{"chroma":0,"contrast":1.5,"in":"#ff000033","out":{"hex":"#ff555533","u16":[65535,21960,21960,13107]},"role":"Midlight"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff000033","out":{"hex":"#ff555533","u16":[65535,21960,21960,13107]},"role":"Midlight"}, +{"chroma":0,"contrast":-1,"in":"#ff000033","out":{"hex":"#f6000033","u16":[63210,0,0,13107]},"role":"Mid"}, +{"chroma":0.5,"contrast":-1,"in":"#ff000033","out":{"hex":"#f6000033","u16":[63210,0,0,13107]},"role":"Mid"}, +{"chroma":0,"contrast":0,"in":"#ff000033","out":{"hex":"#e5000033","u16":[58875,0,0,13107]},"role":"Mid"}, +{"chroma":0.5,"contrast":0,"in":"#ff000033","out":{"hex":"#e5000033","u16":[58875,0,0,13107]},"role":"Mid"}, +{"chroma":0,"contrast":0.4,"in":"#ff000033","out":{"hex":"#de000033","u16":[57029,0,0,13107]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff000033","out":{"hex":"#de000033","u16":[57029,0,0,13107]},"role":"Mid"}, +{"chroma":0,"contrast":0.7,"in":"#ff000033","out":{"hex":"#d8000033","u16":[55596,0,0,13107]},"role":"Mid"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff000033","out":{"hex":"#d8000033","u16":[55596,0,0,13107]},"role":"Mid"}, +{"chroma":0,"contrast":1,"in":"#ff000033","out":{"hex":"#d3000033","u16":[54118,0,0,13107]},"role":"Mid"}, +{"chroma":0.5,"contrast":1,"in":"#ff000033","out":{"hex":"#d3000033","u16":[54118,0,0,13107]},"role":"Mid"}, +{"chroma":0,"contrast":1.5,"in":"#ff000033","out":{"hex":"#d3000033","u16":[54118,0,0,13107]},"role":"Mid"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff000033","out":{"hex":"#d3000033","u16":[54118,0,0,13107]},"role":"Mid"}, +{"chroma":0,"contrast":-1,"in":"#ff000033","out":{"hex":"#e6000033","u16":[59214,0,0,13107]},"role":"Dark"}, +{"chroma":0.5,"contrast":-1,"in":"#ff000033","out":{"hex":"#e6000033","u16":[59214,0,0,13107]},"role":"Dark"}, +{"chroma":0,"contrast":0,"in":"#ff000033","out":{"hex":"#b1000033","u16":[45587,0,0,13107]},"role":"Dark"}, +{"chroma":0.5,"contrast":0,"in":"#ff000033","out":{"hex":"#b1000033","u16":[45587,0,0,13107]},"role":"Dark"}, +{"chroma":0,"contrast":0.4,"in":"#ff000033","out":{"hex":"#96000033","u16":[38483,0,0,13107]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff000033","out":{"hex":"#96000033","u16":[38483,0,0,13107]},"role":"Dark"}, +{"chroma":0,"contrast":0.7,"in":"#ff000033","out":{"hex":"#7c000033","u16":[31889,0,0,13107]},"role":"Dark"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff000033","out":{"hex":"#7c000033","u16":[31889,0,0,13107]},"role":"Dark"}, +{"chroma":0,"contrast":1,"in":"#ff000033","out":{"hex":"#5a000033","u16":[23011,0,0,13107]},"role":"Dark"}, +{"chroma":0.5,"contrast":1,"in":"#ff000033","out":{"hex":"#5a000033","u16":[23011,0,0,13107]},"role":"Dark"}, +{"chroma":0,"contrast":1.5,"in":"#ff000033","out":{"hex":"#5a000033","u16":[23011,0,0,13107]},"role":"Dark"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff000033","out":{"hex":"#5a000033","u16":[23011,0,0,13107]},"role":"Dark"}, +{"chroma":0,"contrast":-1,"in":"#ff000033","out":{"hex":"#9e000033","u16":[40612,0,0,13107]},"role":"Shadow"}, +{"chroma":0.5,"contrast":-1,"in":"#ff000033","out":{"hex":"#9e000033","u16":[40612,0,0,13107]},"role":"Shadow"}, +{"chroma":0,"contrast":0,"in":"#ff000033","out":{"hex":"#7a000033","u16":[31266,0,0,13107]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0,"in":"#ff000033","out":{"hex":"#7a000033","u16":[31266,0,0,13107]},"role":"Shadow"}, +{"chroma":0,"contrast":0.4,"in":"#ff000033","out":{"hex":"#67000033","u16":[26394,0,0,13107]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.4,"in":"#ff000033","out":{"hex":"#67000033","u16":[26394,0,0,13107]},"role":"Shadow"}, +{"chroma":0,"contrast":0.7,"in":"#ff000033","out":{"hex":"#55000033","u16":[21871,0,0,13107]},"role":"Shadow"}, +{"chroma":0.5,"contrast":0.7,"in":"#ff000033","out":{"hex":"#55000033","u16":[21871,0,0,13107]},"role":"Shadow"}, +{"chroma":0,"contrast":1,"in":"#ff000033","out":{"hex":"#3d000033","u16":[15782,0,0,13107]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1,"in":"#ff000033","out":{"hex":"#3d000033","u16":[15782,0,0,13107]},"role":"Shadow"}, +{"chroma":0,"contrast":1.5,"in":"#ff000033","out":{"hex":"#3d000033","u16":[15782,0,0,13107]},"role":"Shadow"}, +{"chroma":0.5,"contrast":1.5,"in":"#ff000033","out":{"hex":"#3d000033","u16":[15782,0,0,13107]},"role":"Shadow"} +], +"qt_lighter_darker": [ +{"factor":-10,"in":"#000000ff","op":"lighter","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":-10,"in":"#000000ff","op":"darker","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":0,"in":"#000000ff","op":"lighter","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":0,"in":"#000000ff","op":"darker","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":1,"in":"#000000ff","op":"lighter","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":1,"in":"#000000ff","op":"darker","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":50,"in":"#000000ff","op":"lighter","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":50,"in":"#000000ff","op":"darker","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":99,"in":"#000000ff","op":"lighter","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":99,"in":"#000000ff","op":"darker","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":100,"in":"#000000ff","op":"lighter","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":100,"in":"#000000ff","op":"darker","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":101,"in":"#000000ff","op":"lighter","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":101,"in":"#000000ff","op":"darker","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":102,"in":"#000000ff","op":"lighter","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":102,"in":"#000000ff","op":"darker","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":110,"in":"#000000ff","op":"lighter","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":110,"in":"#000000ff","op":"darker","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":120,"in":"#000000ff","op":"lighter","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":120,"in":"#000000ff","op":"darker","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":150,"in":"#000000ff","op":"lighter","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":150,"in":"#000000ff","op":"darker","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":200,"in":"#000000ff","op":"lighter","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":200,"in":"#000000ff","op":"darker","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":300,"in":"#000000ff","op":"lighter","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":300,"in":"#000000ff","op":"darker","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":1000,"in":"#000000ff","op":"lighter","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":1000,"in":"#000000ff","op":"darker","out":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"factor":-10,"in":"#ffffffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":-10,"in":"#ffffffff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":0,"in":"#ffffffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":0,"in":"#ffffffff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1,"in":"#ffffffff","op":"lighter","out":{"hex":"#030303ff","u16":[655,655,655,65535]}}, +{"factor":1,"in":"#ffffffff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#ffffffff","op":"lighter","out":{"hex":"#7f7f7fff","u16":[32767,32767,32767,65535]}}, +{"factor":50,"in":"#ffffffff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#ffffffff","op":"lighter","out":{"hex":"#fcfcfcff","u16":[64886,64886,64886,65535]}}, +{"factor":99,"in":"#ffffffff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":100,"in":"#ffffffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":100,"in":"#ffffffff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":101,"in":"#ffffffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":101,"in":"#ffffffff","op":"darker","out":{"hex":"#fcfcfcff","u16":[64886,64886,64886,65535]}}, +{"factor":102,"in":"#ffffffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":102,"in":"#ffffffff","op":"darker","out":{"hex":"#fafafaff","u16":[64250,64250,64250,65535]}}, +{"factor":110,"in":"#ffffffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":110,"in":"#ffffffff","op":"darker","out":{"hex":"#e8e8e8ff","u16":[59577,59577,59577,65535]}}, +{"factor":120,"in":"#ffffffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":120,"in":"#ffffffff","op":"darker","out":{"hex":"#d4d4d4ff","u16":[54612,54612,54612,65535]}}, +{"factor":150,"in":"#ffffffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":150,"in":"#ffffffff","op":"darker","out":{"hex":"#aaaaaaff","u16":[43690,43690,43690,65535]}}, +{"factor":200,"in":"#ffffffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#ffffffff","op":"darker","out":{"hex":"#7f7f7fff","u16":[32767,32767,32767,65535]}}, +{"factor":300,"in":"#ffffffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#ffffffff","op":"darker","out":{"hex":"#555555ff","u16":[21845,21845,21845,65535]}}, +{"factor":1000,"in":"#ffffffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#ffffffff","op":"darker","out":{"hex":"#191919ff","u16":[6553,6553,6553,65535]}}, +{"factor":-10,"in":"#010101ff","op":"lighter","out":{"hex":"#010101ff","u16":[257,257,257,65535]}}, +{"factor":-10,"in":"#010101ff","op":"darker","out":{"hex":"#010101ff","u16":[257,257,257,65535]}}, +{"factor":0,"in":"#010101ff","op":"lighter","out":{"hex":"#010101ff","u16":[257,257,257,65535]}}, +{"factor":0,"in":"#010101ff","op":"darker","out":{"hex":"#010101ff","u16":[257,257,257,65535]}}, +{"factor":1,"in":"#010101ff","op":"lighter","out":{"hex":"#000000ff","u16":[2,2,2,65535]}}, +{"factor":1,"in":"#010101ff","op":"darker","out":{"hex":"#646464ff","u16":[25700,25700,25700,65535]}}, +{"factor":50,"in":"#010101ff","op":"lighter","out":{"hex":"#000000ff","u16":[128,128,128,65535]}}, +{"factor":50,"in":"#010101ff","op":"darker","out":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"factor":99,"in":"#010101ff","op":"lighter","out":{"hex":"#010101ff","u16":[254,254,254,65535]}}, +{"factor":99,"in":"#010101ff","op":"darker","out":{"hex":"#010101ff","u16":[259,259,259,65535]}}, +{"factor":100,"in":"#010101ff","op":"lighter","out":{"hex":"#010101ff","u16":[257,257,257,65535]}}, +{"factor":100,"in":"#010101ff","op":"darker","out":{"hex":"#010101ff","u16":[257,257,257,65535]}}, +{"factor":101,"in":"#010101ff","op":"lighter","out":{"hex":"#010101ff","u16":[259,259,259,65535]}}, +{"factor":101,"in":"#010101ff","op":"darker","out":{"hex":"#010101ff","u16":[254,254,254,65535]}}, +{"factor":102,"in":"#010101ff","op":"lighter","out":{"hex":"#010101ff","u16":[262,262,262,65535]}}, +{"factor":102,"in":"#010101ff","op":"darker","out":{"hex":"#010101ff","u16":[251,251,251,65535]}}, +{"factor":110,"in":"#010101ff","op":"lighter","out":{"hex":"#010101ff","u16":[282,282,282,65535]}}, +{"factor":110,"in":"#010101ff","op":"darker","out":{"hex":"#010101ff","u16":[233,233,233,65535]}}, +{"factor":120,"in":"#010101ff","op":"lighter","out":{"hex":"#010101ff","u16":[308,308,308,65535]}}, +{"factor":120,"in":"#010101ff","op":"darker","out":{"hex":"#010101ff","u16":[214,214,214,65535]}}, +{"factor":150,"in":"#010101ff","op":"lighter","out":{"hex":"#010101ff","u16":[385,385,385,65535]}}, +{"factor":150,"in":"#010101ff","op":"darker","out":{"hex":"#010101ff","u16":[171,171,171,65535]}}, +{"factor":200,"in":"#010101ff","op":"lighter","out":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"factor":200,"in":"#010101ff","op":"darker","out":{"hex":"#000000ff","u16":[128,128,128,65535]}}, +{"factor":300,"in":"#010101ff","op":"lighter","out":{"hex":"#030303ff","u16":[771,771,771,65535]}}, +{"factor":300,"in":"#010101ff","op":"darker","out":{"hex":"#000000ff","u16":[85,85,85,65535]}}, +{"factor":1000,"in":"#010101ff","op":"lighter","out":{"hex":"#0a0a0aff","u16":[2570,2570,2570,65535]}}, +{"factor":1000,"in":"#010101ff","op":"darker","out":{"hex":"#000000ff","u16":[25,25,25,65535]}}, +{"factor":-10,"in":"#020202ff","op":"lighter","out":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"factor":-10,"in":"#020202ff","op":"darker","out":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"factor":0,"in":"#020202ff","op":"lighter","out":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"factor":0,"in":"#020202ff","op":"darker","out":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"factor":1,"in":"#020202ff","op":"lighter","out":{"hex":"#000000ff","u16":[5,5,5,65535]}}, +{"factor":1,"in":"#020202ff","op":"darker","out":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]}}, +{"factor":50,"in":"#020202ff","op":"lighter","out":{"hex":"#010101ff","u16":[257,257,257,65535]}}, +{"factor":50,"in":"#020202ff","op":"darker","out":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"factor":99,"in":"#020202ff","op":"lighter","out":{"hex":"#020202ff","u16":[508,508,508,65535]}}, +{"factor":99,"in":"#020202ff","op":"darker","out":{"hex":"#020202ff","u16":[519,519,519,65535]}}, +{"factor":100,"in":"#020202ff","op":"lighter","out":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"factor":100,"in":"#020202ff","op":"darker","out":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"factor":101,"in":"#020202ff","op":"lighter","out":{"hex":"#020202ff","u16":[519,519,519,65535]}}, +{"factor":101,"in":"#020202ff","op":"darker","out":{"hex":"#020202ff","u16":[508,508,508,65535]}}, +{"factor":102,"in":"#020202ff","op":"lighter","out":{"hex":"#020202ff","u16":[524,524,524,65535]}}, +{"factor":102,"in":"#020202ff","op":"darker","out":{"hex":"#020202ff","u16":[503,503,503,65535]}}, +{"factor":110,"in":"#020202ff","op":"lighter","out":{"hex":"#020202ff","u16":[565,565,565,65535]}}, +{"factor":110,"in":"#020202ff","op":"darker","out":{"hex":"#020202ff","u16":[467,467,467,65535]}}, +{"factor":120,"in":"#020202ff","op":"lighter","out":{"hex":"#020202ff","u16":[616,616,616,65535]}}, +{"factor":120,"in":"#020202ff","op":"darker","out":{"hex":"#020202ff","u16":[428,428,428,65535]}}, +{"factor":150,"in":"#020202ff","op":"lighter","out":{"hex":"#030303ff","u16":[771,771,771,65535]}}, +{"factor":150,"in":"#020202ff","op":"darker","out":{"hex":"#010101ff","u16":[342,342,342,65535]}}, +{"factor":200,"in":"#020202ff","op":"lighter","out":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"factor":200,"in":"#020202ff","op":"darker","out":{"hex":"#010101ff","u16":[257,257,257,65535]}}, +{"factor":300,"in":"#020202ff","op":"lighter","out":{"hex":"#060606ff","u16":[1542,1542,1542,65535]}}, +{"factor":300,"in":"#020202ff","op":"darker","out":{"hex":"#010101ff","u16":[171,171,171,65535]}}, +{"factor":1000,"in":"#020202ff","op":"lighter","out":{"hex":"#141414ff","u16":[5140,5140,5140,65535]}}, +{"factor":1000,"in":"#020202ff","op":"darker","out":{"hex":"#000000ff","u16":[51,51,51,65535]}}, +{"factor":-10,"in":"#040404ff","op":"lighter","out":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"factor":-10,"in":"#040404ff","op":"darker","out":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"factor":0,"in":"#040404ff","op":"lighter","out":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"factor":0,"in":"#040404ff","op":"darker","out":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"factor":1,"in":"#040404ff","op":"lighter","out":{"hex":"#000000ff","u16":[10,10,10,65535]}}, +{"factor":1,"in":"#040404ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#040404ff","op":"lighter","out":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"factor":50,"in":"#040404ff","op":"darker","out":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"factor":99,"in":"#040404ff","op":"lighter","out":{"hex":"#040404ff","u16":[1017,1017,1017,65535]}}, +{"factor":99,"in":"#040404ff","op":"darker","out":{"hex":"#040404ff","u16":[1038,1038,1038,65535]}}, +{"factor":100,"in":"#040404ff","op":"lighter","out":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"factor":100,"in":"#040404ff","op":"darker","out":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"factor":101,"in":"#040404ff","op":"lighter","out":{"hex":"#040404ff","u16":[1038,1038,1038,65535]}}, +{"factor":101,"in":"#040404ff","op":"darker","out":{"hex":"#040404ff","u16":[1017,1017,1017,65535]}}, +{"factor":102,"in":"#040404ff","op":"lighter","out":{"hex":"#040404ff","u16":[1048,1048,1048,65535]}}, +{"factor":102,"in":"#040404ff","op":"darker","out":{"hex":"#040404ff","u16":[1007,1007,1007,65535]}}, +{"factor":110,"in":"#040404ff","op":"lighter","out":{"hex":"#040404ff","u16":[1130,1130,1130,65535]}}, +{"factor":110,"in":"#040404ff","op":"darker","out":{"hex":"#040404ff","u16":[934,934,934,65535]}}, +{"factor":120,"in":"#040404ff","op":"lighter","out":{"hex":"#050505ff","u16":[1233,1233,1233,65535]}}, +{"factor":120,"in":"#040404ff","op":"darker","out":{"hex":"#030303ff","u16":[856,856,856,65535]}}, +{"factor":150,"in":"#040404ff","op":"lighter","out":{"hex":"#060606ff","u16":[1542,1542,1542,65535]}}, +{"factor":150,"in":"#040404ff","op":"darker","out":{"hex":"#030303ff","u16":[685,685,685,65535]}}, +{"factor":200,"in":"#040404ff","op":"lighter","out":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"factor":200,"in":"#040404ff","op":"darker","out":{"hex":"#020202ff","u16":[514,514,514,65535]}}, +{"factor":300,"in":"#040404ff","op":"lighter","out":{"hex":"#0c0c0cff","u16":[3084,3084,3084,65535]}}, +{"factor":300,"in":"#040404ff","op":"darker","out":{"hex":"#010101ff","u16":[342,342,342,65535]}}, +{"factor":1000,"in":"#040404ff","op":"lighter","out":{"hex":"#282828ff","u16":[10280,10280,10280,65535]}}, +{"factor":1000,"in":"#040404ff","op":"darker","out":{"hex":"#000000ff","u16":[102,102,102,65535]}}, +{"factor":-10,"in":"#080808ff","op":"lighter","out":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"factor":-10,"in":"#080808ff","op":"darker","out":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"factor":0,"in":"#080808ff","op":"lighter","out":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"factor":0,"in":"#080808ff","op":"darker","out":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"factor":1,"in":"#080808ff","op":"lighter","out":{"hex":"#000000ff","u16":[20,20,20,65535]}}, +{"factor":1,"in":"#080808ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#080808ff","op":"lighter","out":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"factor":50,"in":"#080808ff","op":"darker","out":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"factor":99,"in":"#080808ff","op":"lighter","out":{"hex":"#080808ff","u16":[2035,2035,2035,65535]}}, +{"factor":99,"in":"#080808ff","op":"darker","out":{"hex":"#080808ff","u16":[2076,2076,2076,65535]}}, +{"factor":100,"in":"#080808ff","op":"lighter","out":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"factor":100,"in":"#080808ff","op":"darker","out":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"factor":101,"in":"#080808ff","op":"lighter","out":{"hex":"#080808ff","u16":[2076,2076,2076,65535]}}, +{"factor":101,"in":"#080808ff","op":"darker","out":{"hex":"#080808ff","u16":[2035,2035,2035,65535]}}, +{"factor":102,"in":"#080808ff","op":"lighter","out":{"hex":"#080808ff","u16":[2097,2097,2097,65535]}}, +{"factor":102,"in":"#080808ff","op":"darker","out":{"hex":"#080808ff","u16":[2015,2015,2015,65535]}}, +{"factor":110,"in":"#080808ff","op":"lighter","out":{"hex":"#090909ff","u16":[2261,2261,2261,65535]}}, +{"factor":110,"in":"#080808ff","op":"darker","out":{"hex":"#070707ff","u16":[1869,1869,1869,65535]}}, +{"factor":120,"in":"#080808ff","op":"lighter","out":{"hex":"#0a0a0aff","u16":[2467,2467,2467,65535]}}, +{"factor":120,"in":"#080808ff","op":"darker","out":{"hex":"#070707ff","u16":[1713,1713,1713,65535]}}, +{"factor":150,"in":"#080808ff","op":"lighter","out":{"hex":"#0c0c0cff","u16":[3084,3084,3084,65535]}}, +{"factor":150,"in":"#080808ff","op":"darker","out":{"hex":"#050505ff","u16":[1370,1370,1370,65535]}}, +{"factor":200,"in":"#080808ff","op":"lighter","out":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"factor":200,"in":"#080808ff","op":"darker","out":{"hex":"#040404ff","u16":[1028,1028,1028,65535]}}, +{"factor":300,"in":"#080808ff","op":"lighter","out":{"hex":"#181818ff","u16":[6168,6168,6168,65535]}}, +{"factor":300,"in":"#080808ff","op":"darker","out":{"hex":"#030303ff","u16":[685,685,685,65535]}}, +{"factor":1000,"in":"#080808ff","op":"lighter","out":{"hex":"#505050ff","u16":[20560,20560,20560,65535]}}, +{"factor":1000,"in":"#080808ff","op":"darker","out":{"hex":"#010101ff","u16":[205,205,205,65535]}}, +{"factor":-10,"in":"#101010ff","op":"lighter","out":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"factor":-10,"in":"#101010ff","op":"darker","out":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"factor":0,"in":"#101010ff","op":"lighter","out":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"factor":0,"in":"#101010ff","op":"darker","out":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"factor":1,"in":"#101010ff","op":"lighter","out":{"hex":"#000000ff","u16":[41,41,41,65535]}}, +{"factor":1,"in":"#101010ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#101010ff","op":"lighter","out":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"factor":50,"in":"#101010ff","op":"darker","out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"factor":99,"in":"#101010ff","op":"lighter","out":{"hex":"#101010ff","u16":[4071,4071,4071,65535]}}, +{"factor":99,"in":"#101010ff","op":"darker","out":{"hex":"#101010ff","u16":[4153,4153,4153,65535]}}, +{"factor":100,"in":"#101010ff","op":"lighter","out":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"factor":100,"in":"#101010ff","op":"darker","out":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"factor":101,"in":"#101010ff","op":"lighter","out":{"hex":"#101010ff","u16":[4153,4153,4153,65535]}}, +{"factor":101,"in":"#101010ff","op":"darker","out":{"hex":"#101010ff","u16":[4071,4071,4071,65535]}}, +{"factor":102,"in":"#101010ff","op":"lighter","out":{"hex":"#101010ff","u16":[4194,4194,4194,65535]}}, +{"factor":102,"in":"#101010ff","op":"darker","out":{"hex":"#101010ff","u16":[4031,4031,4031,65535]}}, +{"factor":110,"in":"#101010ff","op":"lighter","out":{"hex":"#121212ff","u16":[4523,4523,4523,65535]}}, +{"factor":110,"in":"#101010ff","op":"darker","out":{"hex":"#0f0f0fff","u16":[3738,3738,3738,65535]}}, +{"factor":120,"in":"#101010ff","op":"lighter","out":{"hex":"#131313ff","u16":[4934,4934,4934,65535]}}, +{"factor":120,"in":"#101010ff","op":"darker","out":{"hex":"#0d0d0dff","u16":[3426,3426,3426,65535]}}, +{"factor":150,"in":"#101010ff","op":"lighter","out":{"hex":"#181818ff","u16":[6168,6168,6168,65535]}}, +{"factor":150,"in":"#101010ff","op":"darker","out":{"hex":"#0b0b0bff","u16":[2741,2741,2741,65535]}}, +{"factor":200,"in":"#101010ff","op":"lighter","out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"factor":200,"in":"#101010ff","op":"darker","out":{"hex":"#080808ff","u16":[2056,2056,2056,65535]}}, +{"factor":300,"in":"#101010ff","op":"lighter","out":{"hex":"#303030ff","u16":[12336,12336,12336,65535]}}, +{"factor":300,"in":"#101010ff","op":"darker","out":{"hex":"#050505ff","u16":[1370,1370,1370,65535]}}, +{"factor":1000,"in":"#101010ff","op":"lighter","out":{"hex":"#a0a0a0ff","u16":[41120,41120,41120,65535]}}, +{"factor":1000,"in":"#101010ff","op":"darker","out":{"hex":"#020202ff","u16":[411,411,411,65535]}}, +{"factor":-10,"in":"#202020ff","op":"lighter","out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"factor":-10,"in":"#202020ff","op":"darker","out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"factor":0,"in":"#202020ff","op":"lighter","out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"factor":0,"in":"#202020ff","op":"darker","out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"factor":1,"in":"#202020ff","op":"lighter","out":{"hex":"#000000ff","u16":[82,82,82,65535]}}, +{"factor":1,"in":"#202020ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#202020ff","op":"lighter","out":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"factor":50,"in":"#202020ff","op":"darker","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"factor":99,"in":"#202020ff","op":"lighter","out":{"hex":"#202020ff","u16":[8142,8142,8142,65535]}}, +{"factor":99,"in":"#202020ff","op":"darker","out":{"hex":"#202020ff","u16":[8306,8306,8306,65535]}}, +{"factor":100,"in":"#202020ff","op":"lighter","out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"factor":100,"in":"#202020ff","op":"darker","out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"factor":101,"in":"#202020ff","op":"lighter","out":{"hex":"#202020ff","u16":[8306,8306,8306,65535]}}, +{"factor":101,"in":"#202020ff","op":"darker","out":{"hex":"#202020ff","u16":[8142,8142,8142,65535]}}, +{"factor":102,"in":"#202020ff","op":"lighter","out":{"hex":"#212121ff","u16":[8388,8388,8388,65535]}}, +{"factor":102,"in":"#202020ff","op":"darker","out":{"hex":"#1f1f1fff","u16":[8062,8062,8062,65535]}}, +{"factor":110,"in":"#202020ff","op":"lighter","out":{"hex":"#232323ff","u16":[9046,9046,9046,65535]}}, +{"factor":110,"in":"#202020ff","op":"darker","out":{"hex":"#1d1d1dff","u16":[7476,7476,7476,65535]}}, +{"factor":120,"in":"#202020ff","op":"lighter","out":{"hex":"#262626ff","u16":[9868,9868,9868,65535]}}, +{"factor":120,"in":"#202020ff","op":"darker","out":{"hex":"#1b1b1bff","u16":[6853,6853,6853,65535]}}, +{"factor":150,"in":"#202020ff","op":"lighter","out":{"hex":"#303030ff","u16":[12336,12336,12336,65535]}}, +{"factor":150,"in":"#202020ff","op":"darker","out":{"hex":"#151515ff","u16":[5482,5482,5482,65535]}}, +{"factor":200,"in":"#202020ff","op":"lighter","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"factor":200,"in":"#202020ff","op":"darker","out":{"hex":"#101010ff","u16":[4112,4112,4112,65535]}}, +{"factor":300,"in":"#202020ff","op":"lighter","out":{"hex":"#606060ff","u16":[24672,24672,24672,65535]}}, +{"factor":300,"in":"#202020ff","op":"darker","out":{"hex":"#0b0b0bff","u16":[2741,2741,2741,65535]}}, +{"factor":1000,"in":"#202020ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#202020ff","op":"darker","out":{"hex":"#030303ff","u16":[822,822,822,65535]}}, +{"factor":-10,"in":"#404040ff","op":"lighter","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"factor":-10,"in":"#404040ff","op":"darker","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"factor":0,"in":"#404040ff","op":"lighter","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"factor":0,"in":"#404040ff","op":"darker","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"factor":1,"in":"#404040ff","op":"lighter","out":{"hex":"#010101ff","u16":[164,164,164,65535]}}, +{"factor":1,"in":"#404040ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#404040ff","op":"lighter","out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"factor":50,"in":"#404040ff","op":"darker","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"factor":99,"in":"#404040ff","op":"lighter","out":{"hex":"#3f3f3fff","u16":[16285,16285,16285,65535]}}, +{"factor":99,"in":"#404040ff","op":"darker","out":{"hex":"#414141ff","u16":[16612,16612,16612,65535]}}, +{"factor":100,"in":"#404040ff","op":"lighter","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"factor":100,"in":"#404040ff","op":"darker","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"factor":101,"in":"#404040ff","op":"lighter","out":{"hex":"#414141ff","u16":[16612,16612,16612,65535]}}, +{"factor":101,"in":"#404040ff","op":"darker","out":{"hex":"#3f3f3fff","u16":[16285,16285,16285,65535]}}, +{"factor":102,"in":"#404040ff","op":"lighter","out":{"hex":"#414141ff","u16":[16776,16776,16776,65535]}}, +{"factor":102,"in":"#404040ff","op":"darker","out":{"hex":"#3f3f3fff","u16":[16125,16125,16125,65535]}}, +{"factor":110,"in":"#404040ff","op":"lighter","out":{"hex":"#464646ff","u16":[18092,18092,18092,65535]}}, +{"factor":110,"in":"#404040ff","op":"darker","out":{"hex":"#3a3a3aff","u16":[14952,14952,14952,65535]}}, +{"factor":120,"in":"#404040ff","op":"lighter","out":{"hex":"#4d4d4dff","u16":[19737,19737,19737,65535]}}, +{"factor":120,"in":"#404040ff","op":"darker","out":{"hex":"#353535ff","u16":[13706,13706,13706,65535]}}, +{"factor":150,"in":"#404040ff","op":"lighter","out":{"hex":"#606060ff","u16":[24672,24672,24672,65535]}}, +{"factor":150,"in":"#404040ff","op":"darker","out":{"hex":"#2b2b2bff","u16":[10965,10965,10965,65535]}}, +{"factor":200,"in":"#404040ff","op":"lighter","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"factor":200,"in":"#404040ff","op":"darker","out":{"hex":"#202020ff","u16":[8224,8224,8224,65535]}}, +{"factor":300,"in":"#404040ff","op":"lighter","out":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]}}, +{"factor":300,"in":"#404040ff","op":"darker","out":{"hex":"#151515ff","u16":[5482,5482,5482,65535]}}, +{"factor":1000,"in":"#404040ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#404040ff","op":"darker","out":{"hex":"#060606ff","u16":[1644,1644,1644,65535]}}, +{"factor":-10,"in":"#7f7f7fff","op":"lighter","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"factor":-10,"in":"#7f7f7fff","op":"darker","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"factor":0,"in":"#7f7f7fff","op":"lighter","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"factor":0,"in":"#7f7f7fff","op":"darker","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"factor":1,"in":"#7f7f7fff","op":"lighter","out":{"hex":"#010101ff","u16":[326,326,326,65535]}}, +{"factor":1,"in":"#7f7f7fff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#7f7f7fff","op":"lighter","out":{"hex":"#3f3f3fff","u16":[16319,16319,16319,65535]}}, +{"factor":50,"in":"#7f7f7fff","op":"darker","out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]}}, +{"factor":99,"in":"#7f7f7fff","op":"lighter","out":{"hex":"#7e7e7eff","u16":[32315,32315,32315,65535]}}, +{"factor":99,"in":"#7f7f7fff","op":"darker","out":{"hex":"#808080ff","u16":[32965,32965,32965,65535]}}, +{"factor":100,"in":"#7f7f7fff","op":"lighter","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"factor":100,"in":"#7f7f7fff","op":"darker","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"factor":101,"in":"#7f7f7fff","op":"lighter","out":{"hex":"#808080ff","u16":[32965,32965,32965,65535]}}, +{"factor":101,"in":"#7f7f7fff","op":"darker","out":{"hex":"#7e7e7eff","u16":[32315,32315,32315,65535]}}, +{"factor":102,"in":"#7f7f7fff","op":"lighter","out":{"hex":"#828282ff","u16":[33291,33291,33291,65535]}}, +{"factor":102,"in":"#7f7f7fff","op":"darker","out":{"hex":"#7d7d7dff","u16":[31999,31999,31999,65535]}}, +{"factor":110,"in":"#7f7f7fff","op":"lighter","out":{"hex":"#8c8c8cff","u16":[35902,35902,35902,65535]}}, +{"factor":110,"in":"#7f7f7fff","op":"darker","out":{"hex":"#737373ff","u16":[29671,29671,29671,65535]}}, +{"factor":120,"in":"#7f7f7fff","op":"lighter","out":{"hex":"#989898ff","u16":[39166,39166,39166,65535]}}, +{"factor":120,"in":"#7f7f7fff","op":"darker","out":{"hex":"#6a6a6aff","u16":[27199,27199,27199,65535]}}, +{"factor":150,"in":"#7f7f7fff","op":"lighter","out":{"hex":"#bebebeff","u16":[48958,48958,48958,65535]}}, +{"factor":150,"in":"#7f7f7fff","op":"darker","out":{"hex":"#555555ff","u16":[21759,21759,21759,65535]}}, +{"factor":200,"in":"#7f7f7fff","op":"lighter","out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]}}, +{"factor":200,"in":"#7f7f7fff","op":"darker","out":{"hex":"#3f3f3fff","u16":[16319,16319,16319,65535]}}, +{"factor":300,"in":"#7f7f7fff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#7f7f7fff","op":"darker","out":{"hex":"#2a2a2aff","u16":[10879,10879,10879,65535]}}, +{"factor":1000,"in":"#7f7f7fff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#7f7f7fff","op":"darker","out":{"hex":"#0d0d0dff","u16":[3263,3263,3263,65535]}}, +{"factor":-10,"in":"#808080ff","op":"lighter","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"factor":-10,"in":"#808080ff","op":"darker","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"factor":0,"in":"#808080ff","op":"lighter","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"factor":0,"in":"#808080ff","op":"darker","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"factor":1,"in":"#808080ff","op":"lighter","out":{"hex":"#010101ff","u16":[328,328,328,65535]}}, +{"factor":1,"in":"#808080ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#808080ff","op":"lighter","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"factor":50,"in":"#808080ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#808080ff","op":"lighter","out":{"hex":"#7f7f7fff","u16":[32570,32570,32570,65535]}}, +{"factor":99,"in":"#808080ff","op":"darker","out":{"hex":"#818181ff","u16":[33224,33224,33224,65535]}}, +{"factor":100,"in":"#808080ff","op":"lighter","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"factor":100,"in":"#808080ff","op":"darker","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"factor":101,"in":"#808080ff","op":"lighter","out":{"hex":"#818181ff","u16":[33224,33224,33224,65535]}}, +{"factor":101,"in":"#808080ff","op":"darker","out":{"hex":"#7f7f7fff","u16":[32570,32570,32570,65535]}}, +{"factor":102,"in":"#808080ff","op":"lighter","out":{"hex":"#838383ff","u16":[33553,33553,33553,65535]}}, +{"factor":102,"in":"#808080ff","op":"darker","out":{"hex":"#7d7d7dff","u16":[32250,32250,32250,65535]}}, +{"factor":110,"in":"#808080ff","op":"lighter","out":{"hex":"#8d8d8dff","u16":[36185,36185,36185,65535]}}, +{"factor":110,"in":"#808080ff","op":"darker","out":{"hex":"#747474ff","u16":[29905,29905,29905,65535]}}, +{"factor":120,"in":"#808080ff","op":"lighter","out":{"hex":"#9a9a9aff","u16":[39475,39475,39475,65535]}}, +{"factor":120,"in":"#808080ff","op":"darker","out":{"hex":"#6b6b6bff","u16":[27413,27413,27413,65535]}}, +{"factor":150,"in":"#808080ff","op":"lighter","out":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]}}, +{"factor":150,"in":"#808080ff","op":"darker","out":{"hex":"#555555ff","u16":[21930,21930,21930,65535]}}, +{"factor":200,"in":"#808080ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#808080ff","op":"darker","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"factor":300,"in":"#808080ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#808080ff","op":"darker","out":{"hex":"#2b2b2bff","u16":[10965,10965,10965,65535]}}, +{"factor":1000,"in":"#808080ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#808080ff","op":"darker","out":{"hex":"#0d0d0dff","u16":[3289,3289,3289,65535]}}, +{"factor":-10,"in":"#818181ff","op":"lighter","out":{"hex":"#818181ff","u16":[33153,33153,33153,65535]}}, +{"factor":-10,"in":"#818181ff","op":"darker","out":{"hex":"#818181ff","u16":[33153,33153,33153,65535]}}, +{"factor":0,"in":"#818181ff","op":"lighter","out":{"hex":"#818181ff","u16":[33153,33153,33153,65535]}}, +{"factor":0,"in":"#818181ff","op":"darker","out":{"hex":"#818181ff","u16":[33153,33153,33153,65535]}}, +{"factor":1,"in":"#818181ff","op":"lighter","out":{"hex":"#010101ff","u16":[331,331,331,65535]}}, +{"factor":1,"in":"#818181ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#818181ff","op":"lighter","out":{"hex":"#404040ff","u16":[16576,16576,16576,65535]}}, +{"factor":50,"in":"#818181ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#818181ff","op":"lighter","out":{"hex":"#808080ff","u16":[32824,32824,32824,65535]}}, +{"factor":99,"in":"#818181ff","op":"darker","out":{"hex":"#828282ff","u16":[33484,33484,33484,65535]}}, +{"factor":100,"in":"#818181ff","op":"lighter","out":{"hex":"#818181ff","u16":[33153,33153,33153,65535]}}, +{"factor":100,"in":"#818181ff","op":"darker","out":{"hex":"#818181ff","u16":[33153,33153,33153,65535]}}, +{"factor":101,"in":"#818181ff","op":"lighter","out":{"hex":"#828282ff","u16":[33484,33484,33484,65535]}}, +{"factor":101,"in":"#818181ff","op":"darker","out":{"hex":"#808080ff","u16":[32824,32824,32824,65535]}}, +{"factor":102,"in":"#818181ff","op":"lighter","out":{"hex":"#848484ff","u16":[33816,33816,33816,65535]}}, +{"factor":102,"in":"#818181ff","op":"darker","out":{"hex":"#7e7e7eff","u16":[32502,32502,32502,65535]}}, +{"factor":110,"in":"#818181ff","op":"lighter","out":{"hex":"#8e8e8eff","u16":[36468,36468,36468,65535]}}, +{"factor":110,"in":"#818181ff","op":"darker","out":{"hex":"#757575ff","u16":[30139,30139,30139,65535]}}, +{"factor":120,"in":"#818181ff","op":"lighter","out":{"hex":"#9b9b9bff","u16":[39783,39783,39783,65535]}}, +{"factor":120,"in":"#818181ff","op":"darker","out":{"hex":"#6b6b6bff","u16":[27627,27627,27627,65535]}}, +{"factor":150,"in":"#818181ff","op":"lighter","out":{"hex":"#c1c1c1ff","u16":[49729,49729,49729,65535]}}, +{"factor":150,"in":"#818181ff","op":"darker","out":{"hex":"#565656ff","u16":[22102,22102,22102,65535]}}, +{"factor":200,"in":"#818181ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#818181ff","op":"darker","out":{"hex":"#404040ff","u16":[16576,16576,16576,65535]}}, +{"factor":300,"in":"#818181ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#818181ff","op":"darker","out":{"hex":"#2b2b2bff","u16":[11051,11051,11051,65535]}}, +{"factor":1000,"in":"#818181ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#818181ff","op":"darker","out":{"hex":"#0d0d0dff","u16":[3315,3315,3315,65535]}}, +{"factor":-10,"in":"#bfbfbfff","op":"lighter","out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]}}, +{"factor":-10,"in":"#bfbfbfff","op":"darker","out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]}}, +{"factor":0,"in":"#bfbfbfff","op":"lighter","out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]}}, +{"factor":0,"in":"#bfbfbfff","op":"darker","out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]}}, +{"factor":1,"in":"#bfbfbfff","op":"lighter","out":{"hex":"#020202ff","u16":[490,490,490,65535]}}, +{"factor":1,"in":"#bfbfbfff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#bfbfbfff","op":"lighter","out":{"hex":"#5f5f5fff","u16":[24543,24543,24543,65535]}}, +{"factor":50,"in":"#bfbfbfff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#bfbfbfff","op":"lighter","out":{"hex":"#bdbdbdff","u16":[48600,48600,48600,65535]}}, +{"factor":99,"in":"#bfbfbfff","op":"darker","out":{"hex":"#c1c1c1ff","u16":[49577,49577,49577,65535]}}, +{"factor":100,"in":"#bfbfbfff","op":"lighter","out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]}}, +{"factor":100,"in":"#bfbfbfff","op":"darker","out":{"hex":"#bfbfbfff","u16":[49087,49087,49087,65535]}}, +{"factor":101,"in":"#bfbfbfff","op":"lighter","out":{"hex":"#c1c1c1ff","u16":[49577,49577,49577,65535]}}, +{"factor":101,"in":"#bfbfbfff","op":"darker","out":{"hex":"#bdbdbdff","u16":[48600,48600,48600,65535]}}, +{"factor":102,"in":"#bfbfbfff","op":"lighter","out":{"hex":"#c3c3c3ff","u16":[50068,50068,50068,65535]}}, +{"factor":102,"in":"#bfbfbfff","op":"darker","out":{"hex":"#bbbbbbff","u16":[48124,48124,48124,65535]}}, +{"factor":110,"in":"#bfbfbfff","op":"lighter","out":{"hex":"#d2d2d2ff","u16":[53995,53995,53995,65535]}}, +{"factor":110,"in":"#bfbfbfff","op":"darker","out":{"hex":"#aeaeaeff","u16":[44624,44624,44624,65535]}}, +{"factor":120,"in":"#bfbfbfff","op":"lighter","out":{"hex":"#e5e5e5ff","u16":[58904,58904,58904,65535]}}, +{"factor":120,"in":"#bfbfbfff","op":"darker","out":{"hex":"#9f9f9fff","u16":[40905,40905,40905,65535]}}, +{"factor":150,"in":"#bfbfbfff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":150,"in":"#bfbfbfff","op":"darker","out":{"hex":"#7f7f7fff","u16":[32724,32724,32724,65535]}}, +{"factor":200,"in":"#bfbfbfff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#bfbfbfff","op":"darker","out":{"hex":"#5f5f5fff","u16":[24543,24543,24543,65535]}}, +{"factor":300,"in":"#bfbfbfff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#bfbfbfff","op":"darker","out":{"hex":"#404040ff","u16":[16362,16362,16362,65535]}}, +{"factor":1000,"in":"#bfbfbfff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#bfbfbfff","op":"darker","out":{"hex":"#131313ff","u16":[4908,4908,4908,65535]}}, +{"factor":-10,"in":"#c0c0c0ff","op":"lighter","out":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]}}, +{"factor":-10,"in":"#c0c0c0ff","op":"darker","out":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]}}, +{"factor":0,"in":"#c0c0c0ff","op":"lighter","out":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]}}, +{"factor":0,"in":"#c0c0c0ff","op":"darker","out":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]}}, +{"factor":1,"in":"#c0c0c0ff","op":"lighter","out":{"hex":"#020202ff","u16":[493,493,493,65535]}}, +{"factor":1,"in":"#c0c0c0ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#c0c0c0ff","op":"lighter","out":{"hex":"#606060ff","u16":[24672,24672,24672,65535]}}, +{"factor":50,"in":"#c0c0c0ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#c0c0c0ff","op":"lighter","out":{"hex":"#bebebeff","u16":[48855,48855,48855,65535]}}, +{"factor":99,"in":"#c0c0c0ff","op":"darker","out":{"hex":"#c2c2c2ff","u16":[49837,49837,49837,65535]}}, +{"factor":100,"in":"#c0c0c0ff","op":"lighter","out":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]}}, +{"factor":100,"in":"#c0c0c0ff","op":"darker","out":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]}}, +{"factor":101,"in":"#c0c0c0ff","op":"lighter","out":{"hex":"#c2c2c2ff","u16":[49837,49837,49837,65535]}}, +{"factor":101,"in":"#c0c0c0ff","op":"darker","out":{"hex":"#bebebeff","u16":[48855,48855,48855,65535]}}, +{"factor":102,"in":"#c0c0c0ff","op":"lighter","out":{"hex":"#c4c4c4ff","u16":[50330,50330,50330,65535]}}, +{"factor":102,"in":"#c0c0c0ff","op":"darker","out":{"hex":"#bcbcbcff","u16":[48376,48376,48376,65535]}}, +{"factor":110,"in":"#c0c0c0ff","op":"lighter","out":{"hex":"#d3d3d3ff","u16":[54278,54278,54278,65535]}}, +{"factor":110,"in":"#c0c0c0ff","op":"darker","out":{"hex":"#afafafff","u16":[44858,44858,44858,65535]}}, +{"factor":120,"in":"#c0c0c0ff","op":"lighter","out":{"hex":"#e6e6e6ff","u16":[59212,59212,59212,65535]}}, +{"factor":120,"in":"#c0c0c0ff","op":"darker","out":{"hex":"#a0a0a0ff","u16":[41120,41120,41120,65535]}}, +{"factor":150,"in":"#c0c0c0ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":150,"in":"#c0c0c0ff","op":"darker","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"factor":200,"in":"#c0c0c0ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#c0c0c0ff","op":"darker","out":{"hex":"#606060ff","u16":[24672,24672,24672,65535]}}, +{"factor":300,"in":"#c0c0c0ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#c0c0c0ff","op":"darker","out":{"hex":"#404040ff","u16":[16448,16448,16448,65535]}}, +{"factor":1000,"in":"#c0c0c0ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#c0c0c0ff","op":"darker","out":{"hex":"#131313ff","u16":[4934,4934,4934,65535]}}, +{"factor":-10,"in":"#fdfdfdff","op":"lighter","out":{"hex":"#fdfdfdff","u16":[65021,65021,65021,65535]}}, +{"factor":-10,"in":"#fdfdfdff","op":"darker","out":{"hex":"#fdfdfdff","u16":[65021,65021,65021,65535]}}, +{"factor":0,"in":"#fdfdfdff","op":"lighter","out":{"hex":"#fdfdfdff","u16":[65021,65021,65021,65535]}}, +{"factor":0,"in":"#fdfdfdff","op":"darker","out":{"hex":"#fdfdfdff","u16":[65021,65021,65021,65535]}}, +{"factor":1,"in":"#fdfdfdff","op":"lighter","out":{"hex":"#030303ff","u16":[650,650,650,65535]}}, +{"factor":1,"in":"#fdfdfdff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#fdfdfdff","op":"lighter","out":{"hex":"#7e7e7eff","u16":[32510,32510,32510,65535]}}, +{"factor":50,"in":"#fdfdfdff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#fdfdfdff","op":"lighter","out":{"hex":"#fafafaff","u16":[64377,64377,64377,65535]}}, +{"factor":99,"in":"#fdfdfdff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":100,"in":"#fdfdfdff","op":"lighter","out":{"hex":"#fdfdfdff","u16":[65021,65021,65021,65535]}}, +{"factor":100,"in":"#fdfdfdff","op":"darker","out":{"hex":"#fdfdfdff","u16":[65021,65021,65021,65535]}}, +{"factor":101,"in":"#fdfdfdff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":101,"in":"#fdfdfdff","op":"darker","out":{"hex":"#fafafaff","u16":[64377,64377,64377,65535]}}, +{"factor":102,"in":"#fdfdfdff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":102,"in":"#fdfdfdff","op":"darker","out":{"hex":"#f8f8f8ff","u16":[63746,63746,63746,65535]}}, +{"factor":110,"in":"#fdfdfdff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":110,"in":"#fdfdfdff","op":"darker","out":{"hex":"#e6e6e6ff","u16":[59110,59110,59110,65535]}}, +{"factor":120,"in":"#fdfdfdff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":120,"in":"#fdfdfdff","op":"darker","out":{"hex":"#d3d3d3ff","u16":[54184,54184,54184,65535]}}, +{"factor":150,"in":"#fdfdfdff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":150,"in":"#fdfdfdff","op":"darker","out":{"hex":"#a9a9a9ff","u16":[43347,43347,43347,65535]}}, +{"factor":200,"in":"#fdfdfdff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#fdfdfdff","op":"darker","out":{"hex":"#7e7e7eff","u16":[32510,32510,32510,65535]}}, +{"factor":300,"in":"#fdfdfdff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#fdfdfdff","op":"darker","out":{"hex":"#545454ff","u16":[21673,21673,21673,65535]}}, +{"factor":1000,"in":"#fdfdfdff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#fdfdfdff","op":"darker","out":{"hex":"#191919ff","u16":[6502,6502,6502,65535]}}, +{"factor":-10,"in":"#fefefeff","op":"lighter","out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]}}, +{"factor":-10,"in":"#fefefeff","op":"darker","out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]}}, +{"factor":0,"in":"#fefefeff","op":"lighter","out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]}}, +{"factor":0,"in":"#fefefeff","op":"darker","out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]}}, +{"factor":1,"in":"#fefefeff","op":"lighter","out":{"hex":"#030303ff","u16":[652,652,652,65535]}}, +{"factor":1,"in":"#fefefeff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#fefefeff","op":"lighter","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"factor":50,"in":"#fefefeff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#fefefeff","op":"lighter","out":{"hex":"#fbfbfbff","u16":[64631,64631,64631,65535]}}, +{"factor":99,"in":"#fefefeff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":100,"in":"#fefefeff","op":"lighter","out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]}}, +{"factor":100,"in":"#fefefeff","op":"darker","out":{"hex":"#fefefeff","u16":[65278,65278,65278,65535]}}, +{"factor":101,"in":"#fefefeff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":101,"in":"#fefefeff","op":"darker","out":{"hex":"#fbfbfbff","u16":[64631,64631,64631,65535]}}, +{"factor":102,"in":"#fefefeff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":102,"in":"#fefefeff","op":"darker","out":{"hex":"#f9f9f9ff","u16":[63998,63998,63998,65535]}}, +{"factor":110,"in":"#fefefeff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":110,"in":"#fefefeff","op":"darker","out":{"hex":"#e7e7e7ff","u16":[59343,59343,59343,65535]}}, +{"factor":120,"in":"#fefefeff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":120,"in":"#fefefeff","op":"darker","out":{"hex":"#d4d4d4ff","u16":[54398,54398,54398,65535]}}, +{"factor":150,"in":"#fefefeff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":150,"in":"#fefefeff","op":"darker","out":{"hex":"#a9a9a9ff","u16":[43518,43518,43518,65535]}}, +{"factor":200,"in":"#fefefeff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#fefefeff","op":"darker","out":{"hex":"#7f7f7fff","u16":[32639,32639,32639,65535]}}, +{"factor":300,"in":"#fefefeff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#fefefeff","op":"darker","out":{"hex":"#555555ff","u16":[21759,21759,21759,65535]}}, +{"factor":1000,"in":"#fefefeff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#fefefeff","op":"darker","out":{"hex":"#191919ff","u16":[6527,6527,6527,65535]}}, +{"factor":-10,"in":"#ff0000ff","op":"lighter","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"factor":-10,"in":"#ff0000ff","op":"darker","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"factor":0,"in":"#ff0000ff","op":"lighter","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"factor":0,"in":"#ff0000ff","op":"darker","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"factor":1,"in":"#ff0000ff","op":"lighter","out":{"hex":"#030000ff","u16":[655,0,0,65535]}}, +{"factor":1,"in":"#ff0000ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#ff0000ff","op":"lighter","out":{"hex":"#7f0000ff","u16":[32767,0,0,65535]}}, +{"factor":50,"in":"#ff0000ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#ff0000ff","op":"lighter","out":{"hex":"#fc0000ff","u16":[64886,0,0,65535]}}, +{"factor":99,"in":"#ff0000ff","op":"darker","out":{"hex":"#ff0303ff","u16":[65535,655,655,65535]}}, +{"factor":100,"in":"#ff0000ff","op":"lighter","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"factor":100,"in":"#ff0000ff","op":"darker","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"factor":101,"in":"#ff0000ff","op":"lighter","out":{"hex":"#ff0303ff","u16":[65535,655,655,65535]}}, +{"factor":101,"in":"#ff0000ff","op":"darker","out":{"hex":"#fc0000ff","u16":[64886,0,0,65535]}}, +{"factor":102,"in":"#ff0000ff","op":"lighter","out":{"hex":"#ff0505ff","u16":[65535,1310,1310,65535]}}, +{"factor":102,"in":"#ff0000ff","op":"darker","out":{"hex":"#fa0000ff","u16":[64250,0,0,65535]}}, +{"factor":110,"in":"#ff0000ff","op":"lighter","out":{"hex":"#ff1919ff","u16":[65535,6553,6553,65535]}}, +{"factor":110,"in":"#ff0000ff","op":"darker","out":{"hex":"#e80000ff","u16":[59577,0,0,65535]}}, +{"factor":120,"in":"#ff0000ff","op":"lighter","out":{"hex":"#ff3333ff","u16":[65535,13107,13107,65535]}}, +{"factor":120,"in":"#ff0000ff","op":"darker","out":{"hex":"#d40000ff","u16":[54612,0,0,65535]}}, +{"factor":150,"in":"#ff0000ff","op":"lighter","out":{"hex":"#ff7f7fff","u16":[65535,32767,32767,65535]}}, +{"factor":150,"in":"#ff0000ff","op":"darker","out":{"hex":"#aa0000ff","u16":[43690,0,0,65535]}}, +{"factor":200,"in":"#ff0000ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#ff0000ff","op":"darker","out":{"hex":"#7f0000ff","u16":[32767,0,0,65535]}}, +{"factor":300,"in":"#ff0000ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#ff0000ff","op":"darker","out":{"hex":"#550000ff","u16":[21845,0,0,65535]}}, +{"factor":1000,"in":"#ff0000ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#ff0000ff","op":"darker","out":{"hex":"#190000ff","u16":[6553,0,0,65535]}}, +{"factor":-10,"in":"#00ff00ff","op":"lighter","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"factor":-10,"in":"#00ff00ff","op":"darker","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"factor":0,"in":"#00ff00ff","op":"lighter","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"factor":0,"in":"#00ff00ff","op":"darker","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"factor":1,"in":"#00ff00ff","op":"lighter","out":{"hex":"#000300ff","u16":[0,655,0,65535]}}, +{"factor":1,"in":"#00ff00ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#00ff00ff","op":"lighter","out":{"hex":"#007f00ff","u16":[0,32767,0,65535]}}, +{"factor":50,"in":"#00ff00ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#00ff00ff","op":"lighter","out":{"hex":"#00fc00ff","u16":[0,64886,0,65535]}}, +{"factor":99,"in":"#00ff00ff","op":"darker","out":{"hex":"#03ff03ff","u16":[655,65535,655,65535]}}, +{"factor":100,"in":"#00ff00ff","op":"lighter","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"factor":100,"in":"#00ff00ff","op":"darker","out":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"factor":101,"in":"#00ff00ff","op":"lighter","out":{"hex":"#03ff03ff","u16":[655,65535,655,65535]}}, +{"factor":101,"in":"#00ff00ff","op":"darker","out":{"hex":"#00fc00ff","u16":[0,64886,0,65535]}}, +{"factor":102,"in":"#00ff00ff","op":"lighter","out":{"hex":"#05ff05ff","u16":[1310,65535,1310,65535]}}, +{"factor":102,"in":"#00ff00ff","op":"darker","out":{"hex":"#00fa00ff","u16":[0,64250,0,65535]}}, +{"factor":110,"in":"#00ff00ff","op":"lighter","out":{"hex":"#19ff19ff","u16":[6553,65535,6553,65535]}}, +{"factor":110,"in":"#00ff00ff","op":"darker","out":{"hex":"#00e800ff","u16":[0,59577,0,65535]}}, +{"factor":120,"in":"#00ff00ff","op":"lighter","out":{"hex":"#33ff33ff","u16":[13107,65535,13107,65535]}}, +{"factor":120,"in":"#00ff00ff","op":"darker","out":{"hex":"#00d400ff","u16":[0,54612,0,65535]}}, +{"factor":150,"in":"#00ff00ff","op":"lighter","out":{"hex":"#7fff7fff","u16":[32767,65535,32767,65535]}}, +{"factor":150,"in":"#00ff00ff","op":"darker","out":{"hex":"#00aa00ff","u16":[0,43690,0,65535]}}, +{"factor":200,"in":"#00ff00ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#00ff00ff","op":"darker","out":{"hex":"#007f00ff","u16":[0,32767,0,65535]}}, +{"factor":300,"in":"#00ff00ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#00ff00ff","op":"darker","out":{"hex":"#005500ff","u16":[0,21845,0,65535]}}, +{"factor":1000,"in":"#00ff00ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#00ff00ff","op":"darker","out":{"hex":"#001900ff","u16":[0,6553,0,65535]}}, +{"factor":-10,"in":"#0000ffff","op":"lighter","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"factor":-10,"in":"#0000ffff","op":"darker","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"factor":0,"in":"#0000ffff","op":"lighter","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"factor":0,"in":"#0000ffff","op":"darker","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"factor":1,"in":"#0000ffff","op":"lighter","out":{"hex":"#000003ff","u16":[0,0,655,65535]}}, +{"factor":1,"in":"#0000ffff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#0000ffff","op":"lighter","out":{"hex":"#00007fff","u16":[0,0,32767,65535]}}, +{"factor":50,"in":"#0000ffff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#0000ffff","op":"lighter","out":{"hex":"#0000fcff","u16":[0,0,64886,65535]}}, +{"factor":99,"in":"#0000ffff","op":"darker","out":{"hex":"#0303ffff","u16":[655,655,65535,65535]}}, +{"factor":100,"in":"#0000ffff","op":"lighter","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"factor":100,"in":"#0000ffff","op":"darker","out":{"hex":"#0000ffff","u16":[0,0,65535,65535]}}, +{"factor":101,"in":"#0000ffff","op":"lighter","out":{"hex":"#0303ffff","u16":[655,655,65535,65535]}}, +{"factor":101,"in":"#0000ffff","op":"darker","out":{"hex":"#0000fcff","u16":[0,0,64886,65535]}}, +{"factor":102,"in":"#0000ffff","op":"lighter","out":{"hex":"#0505ffff","u16":[1310,1310,65535,65535]}}, +{"factor":102,"in":"#0000ffff","op":"darker","out":{"hex":"#0000faff","u16":[0,0,64250,65535]}}, +{"factor":110,"in":"#0000ffff","op":"lighter","out":{"hex":"#1919ffff","u16":[6553,6553,65535,65535]}}, +{"factor":110,"in":"#0000ffff","op":"darker","out":{"hex":"#0000e8ff","u16":[0,0,59577,65535]}}, +{"factor":120,"in":"#0000ffff","op":"lighter","out":{"hex":"#3333ffff","u16":[13107,13107,65535,65535]}}, +{"factor":120,"in":"#0000ffff","op":"darker","out":{"hex":"#0000d4ff","u16":[0,0,54612,65535]}}, +{"factor":150,"in":"#0000ffff","op":"lighter","out":{"hex":"#7f7fffff","u16":[32767,32767,65535,65535]}}, +{"factor":150,"in":"#0000ffff","op":"darker","out":{"hex":"#0000aaff","u16":[0,0,43690,65535]}}, +{"factor":200,"in":"#0000ffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#0000ffff","op":"darker","out":{"hex":"#00007fff","u16":[0,0,32767,65535]}}, +{"factor":300,"in":"#0000ffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#0000ffff","op":"darker","out":{"hex":"#000055ff","u16":[0,0,21845,65535]}}, +{"factor":1000,"in":"#0000ffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#0000ffff","op":"darker","out":{"hex":"#000019ff","u16":[0,0,6553,65535]}}, +{"factor":-10,"in":"#ffff00ff","op":"lighter","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"factor":-10,"in":"#ffff00ff","op":"darker","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"factor":0,"in":"#ffff00ff","op":"lighter","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"factor":0,"in":"#ffff00ff","op":"darker","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"factor":1,"in":"#ffff00ff","op":"lighter","out":{"hex":"#030300ff","u16":[655,655,0,65535]}}, +{"factor":1,"in":"#ffff00ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#ffff00ff","op":"lighter","out":{"hex":"#7f7f00ff","u16":[32767,32767,0,65535]}}, +{"factor":50,"in":"#ffff00ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#ffff00ff","op":"lighter","out":{"hex":"#fcfc00ff","u16":[64886,64886,0,65535]}}, +{"factor":99,"in":"#ffff00ff","op":"darker","out":{"hex":"#ffff03ff","u16":[65535,65535,655,65535]}}, +{"factor":100,"in":"#ffff00ff","op":"lighter","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"factor":100,"in":"#ffff00ff","op":"darker","out":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"factor":101,"in":"#ffff00ff","op":"lighter","out":{"hex":"#ffff03ff","u16":[65535,65535,655,65535]}}, +{"factor":101,"in":"#ffff00ff","op":"darker","out":{"hex":"#fcfc00ff","u16":[64886,64886,0,65535]}}, +{"factor":102,"in":"#ffff00ff","op":"lighter","out":{"hex":"#ffff05ff","u16":[65535,65535,1310,65535]}}, +{"factor":102,"in":"#ffff00ff","op":"darker","out":{"hex":"#fafa00ff","u16":[64250,64250,0,65535]}}, +{"factor":110,"in":"#ffff00ff","op":"lighter","out":{"hex":"#ffff19ff","u16":[65535,65535,6553,65535]}}, +{"factor":110,"in":"#ffff00ff","op":"darker","out":{"hex":"#e8e800ff","u16":[59577,59577,0,65535]}}, +{"factor":120,"in":"#ffff00ff","op":"lighter","out":{"hex":"#ffff33ff","u16":[65535,65535,13107,65535]}}, +{"factor":120,"in":"#ffff00ff","op":"darker","out":{"hex":"#d4d400ff","u16":[54612,54612,0,65535]}}, +{"factor":150,"in":"#ffff00ff","op":"lighter","out":{"hex":"#ffff7fff","u16":[65535,65535,32767,65535]}}, +{"factor":150,"in":"#ffff00ff","op":"darker","out":{"hex":"#aaaa00ff","u16":[43690,43690,0,65535]}}, +{"factor":200,"in":"#ffff00ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#ffff00ff","op":"darker","out":{"hex":"#7f7f00ff","u16":[32767,32767,0,65535]}}, +{"factor":300,"in":"#ffff00ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#ffff00ff","op":"darker","out":{"hex":"#555500ff","u16":[21845,21845,0,65535]}}, +{"factor":1000,"in":"#ffff00ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#ffff00ff","op":"darker","out":{"hex":"#191900ff","u16":[6553,6553,0,65535]}}, +{"factor":-10,"in":"#00ffffff","op":"lighter","out":{"hex":"#00ffffff","u16":[0,65535,65535,65535]}}, +{"factor":-10,"in":"#00ffffff","op":"darker","out":{"hex":"#00ffffff","u16":[0,65535,65535,65535]}}, +{"factor":0,"in":"#00ffffff","op":"lighter","out":{"hex":"#00ffffff","u16":[0,65535,65535,65535]}}, +{"factor":0,"in":"#00ffffff","op":"darker","out":{"hex":"#00ffffff","u16":[0,65535,65535,65535]}}, +{"factor":1,"in":"#00ffffff","op":"lighter","out":{"hex":"#000303ff","u16":[0,655,655,65535]}}, +{"factor":1,"in":"#00ffffff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#00ffffff","op":"lighter","out":{"hex":"#007f7fff","u16":[0,32767,32767,65535]}}, +{"factor":50,"in":"#00ffffff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#00ffffff","op":"lighter","out":{"hex":"#00fcfcff","u16":[0,64886,64886,65535]}}, +{"factor":99,"in":"#00ffffff","op":"darker","out":{"hex":"#03ffffff","u16":[655,65535,65535,65535]}}, +{"factor":100,"in":"#00ffffff","op":"lighter","out":{"hex":"#00ffffff","u16":[0,65535,65535,65535]}}, +{"factor":100,"in":"#00ffffff","op":"darker","out":{"hex":"#00ffffff","u16":[0,65535,65535,65535]}}, +{"factor":101,"in":"#00ffffff","op":"lighter","out":{"hex":"#03ffffff","u16":[655,65535,65535,65535]}}, +{"factor":101,"in":"#00ffffff","op":"darker","out":{"hex":"#00fcfcff","u16":[0,64886,64886,65535]}}, +{"factor":102,"in":"#00ffffff","op":"lighter","out":{"hex":"#05ffffff","u16":[1310,65535,65535,65535]}}, +{"factor":102,"in":"#00ffffff","op":"darker","out":{"hex":"#00fafaff","u16":[0,64250,64250,65535]}}, +{"factor":110,"in":"#00ffffff","op":"lighter","out":{"hex":"#19ffffff","u16":[6553,65535,65535,65535]}}, +{"factor":110,"in":"#00ffffff","op":"darker","out":{"hex":"#00e8e8ff","u16":[0,59577,59577,65535]}}, +{"factor":120,"in":"#00ffffff","op":"lighter","out":{"hex":"#33ffffff","u16":[13107,65535,65535,65535]}}, +{"factor":120,"in":"#00ffffff","op":"darker","out":{"hex":"#00d4d4ff","u16":[0,54612,54612,65535]}}, +{"factor":150,"in":"#00ffffff","op":"lighter","out":{"hex":"#7fffffff","u16":[32767,65535,65535,65535]}}, +{"factor":150,"in":"#00ffffff","op":"darker","out":{"hex":"#00aaaaff","u16":[0,43690,43690,65535]}}, +{"factor":200,"in":"#00ffffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#00ffffff","op":"darker","out":{"hex":"#007f7fff","u16":[0,32767,32767,65535]}}, +{"factor":300,"in":"#00ffffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#00ffffff","op":"darker","out":{"hex":"#005555ff","u16":[0,21845,21845,65535]}}, +{"factor":1000,"in":"#00ffffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#00ffffff","op":"darker","out":{"hex":"#001919ff","u16":[0,6553,6553,65535]}}, +{"factor":-10,"in":"#ff00ffff","op":"lighter","out":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]}}, +{"factor":-10,"in":"#ff00ffff","op":"darker","out":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]}}, +{"factor":0,"in":"#ff00ffff","op":"lighter","out":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]}}, +{"factor":0,"in":"#ff00ffff","op":"darker","out":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]}}, +{"factor":1,"in":"#ff00ffff","op":"lighter","out":{"hex":"#030003ff","u16":[655,0,655,65535]}}, +{"factor":1,"in":"#ff00ffff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#ff00ffff","op":"lighter","out":{"hex":"#7f007fff","u16":[32767,0,32767,65535]}}, +{"factor":50,"in":"#ff00ffff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#ff00ffff","op":"lighter","out":{"hex":"#fc00fcff","u16":[64886,0,64886,65535]}}, +{"factor":99,"in":"#ff00ffff","op":"darker","out":{"hex":"#ff03ffff","u16":[65535,655,65535,65535]}}, +{"factor":100,"in":"#ff00ffff","op":"lighter","out":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]}}, +{"factor":100,"in":"#ff00ffff","op":"darker","out":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]}}, +{"factor":101,"in":"#ff00ffff","op":"lighter","out":{"hex":"#ff03ffff","u16":[65535,655,65535,65535]}}, +{"factor":101,"in":"#ff00ffff","op":"darker","out":{"hex":"#fc00fcff","u16":[64886,0,64886,65535]}}, +{"factor":102,"in":"#ff00ffff","op":"lighter","out":{"hex":"#ff05ffff","u16":[65535,1310,65535,65535]}}, +{"factor":102,"in":"#ff00ffff","op":"darker","out":{"hex":"#fa00faff","u16":[64250,0,64250,65535]}}, +{"factor":110,"in":"#ff00ffff","op":"lighter","out":{"hex":"#ff19ffff","u16":[65535,6553,65535,65535]}}, +{"factor":110,"in":"#ff00ffff","op":"darker","out":{"hex":"#e800e8ff","u16":[59577,0,59577,65535]}}, +{"factor":120,"in":"#ff00ffff","op":"lighter","out":{"hex":"#ff33ffff","u16":[65535,13107,65535,65535]}}, +{"factor":120,"in":"#ff00ffff","op":"darker","out":{"hex":"#d400d4ff","u16":[54612,0,54612,65535]}}, +{"factor":150,"in":"#ff00ffff","op":"lighter","out":{"hex":"#ff7fffff","u16":[65535,32767,65535,65535]}}, +{"factor":150,"in":"#ff00ffff","op":"darker","out":{"hex":"#aa00aaff","u16":[43690,0,43690,65535]}}, +{"factor":200,"in":"#ff00ffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#ff00ffff","op":"darker","out":{"hex":"#7f007fff","u16":[32767,0,32767,65535]}}, +{"factor":300,"in":"#ff00ffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#ff00ffff","op":"darker","out":{"hex":"#550055ff","u16":[21845,0,21845,65535]}}, +{"factor":1000,"in":"#ff00ffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#ff00ffff","op":"darker","out":{"hex":"#190019ff","u16":[6553,0,6553,65535]}}, +{"factor":-10,"in":"#800000ff","op":"lighter","out":{"hex":"#800000ff","u16":[32896,0,0,65535]}}, +{"factor":-10,"in":"#800000ff","op":"darker","out":{"hex":"#800000ff","u16":[32896,0,0,65535]}}, +{"factor":0,"in":"#800000ff","op":"lighter","out":{"hex":"#800000ff","u16":[32896,0,0,65535]}}, +{"factor":0,"in":"#800000ff","op":"darker","out":{"hex":"#800000ff","u16":[32896,0,0,65535]}}, +{"factor":1,"in":"#800000ff","op":"lighter","out":{"hex":"#010000ff","u16":[328,0,0,65535]}}, +{"factor":1,"in":"#800000ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#800000ff","op":"lighter","out":{"hex":"#400000ff","u16":[16448,0,0,65535]}}, +{"factor":50,"in":"#800000ff","op":"darker","out":{"hex":"#ff0101ff","u16":[65535,257,257,65535]}}, +{"factor":99,"in":"#800000ff","op":"lighter","out":{"hex":"#7f0000ff","u16":[32570,0,0,65535]}}, +{"factor":99,"in":"#800000ff","op":"darker","out":{"hex":"#810000ff","u16":[33224,0,0,65535]}}, +{"factor":100,"in":"#800000ff","op":"lighter","out":{"hex":"#800000ff","u16":[32896,0,0,65535]}}, +{"factor":100,"in":"#800000ff","op":"darker","out":{"hex":"#800000ff","u16":[32896,0,0,65535]}}, +{"factor":101,"in":"#800000ff","op":"lighter","out":{"hex":"#810000ff","u16":[33224,0,0,65535]}}, +{"factor":101,"in":"#800000ff","op":"darker","out":{"hex":"#7f0000ff","u16":[32570,0,0,65535]}}, +{"factor":102,"in":"#800000ff","op":"lighter","out":{"hex":"#830000ff","u16":[33553,0,0,65535]}}, +{"factor":102,"in":"#800000ff","op":"darker","out":{"hex":"#7d0000ff","u16":[32250,0,0,65535]}}, +{"factor":110,"in":"#800000ff","op":"lighter","out":{"hex":"#8d0000ff","u16":[36185,0,0,65535]}}, +{"factor":110,"in":"#800000ff","op":"darker","out":{"hex":"#740000ff","u16":[29905,0,0,65535]}}, +{"factor":120,"in":"#800000ff","op":"lighter","out":{"hex":"#9a0000ff","u16":[39475,0,0,65535]}}, +{"factor":120,"in":"#800000ff","op":"darker","out":{"hex":"#6b0000ff","u16":[27413,0,0,65535]}}, +{"factor":150,"in":"#800000ff","op":"lighter","out":{"hex":"#c00000ff","u16":[49344,0,0,65535]}}, +{"factor":150,"in":"#800000ff","op":"darker","out":{"hex":"#550000ff","u16":[21930,0,0,65535]}}, +{"factor":200,"in":"#800000ff","op":"lighter","out":{"hex":"#ff0101ff","u16":[65535,257,257,65535]}}, +{"factor":200,"in":"#800000ff","op":"darker","out":{"hex":"#400000ff","u16":[16448,0,0,65535]}}, +{"factor":300,"in":"#800000ff","op":"lighter","out":{"hex":"#ff8181ff","u16":[65535,33153,33153,65535]}}, +{"factor":300,"in":"#800000ff","op":"darker","out":{"hex":"#2b0000ff","u16":[10965,0,0,65535]}}, +{"factor":1000,"in":"#800000ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#800000ff","op":"darker","out":{"hex":"#0d0000ff","u16":[3289,0,0,65535]}}, +{"factor":-10,"in":"#008000ff","op":"lighter","out":{"hex":"#008000ff","u16":[0,32896,0,65535]}}, +{"factor":-10,"in":"#008000ff","op":"darker","out":{"hex":"#008000ff","u16":[0,32896,0,65535]}}, +{"factor":0,"in":"#008000ff","op":"lighter","out":{"hex":"#008000ff","u16":[0,32896,0,65535]}}, +{"factor":0,"in":"#008000ff","op":"darker","out":{"hex":"#008000ff","u16":[0,32896,0,65535]}}, +{"factor":1,"in":"#008000ff","op":"lighter","out":{"hex":"#000100ff","u16":[0,328,0,65535]}}, +{"factor":1,"in":"#008000ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#008000ff","op":"lighter","out":{"hex":"#004000ff","u16":[0,16448,0,65535]}}, +{"factor":50,"in":"#008000ff","op":"darker","out":{"hex":"#01ff01ff","u16":[257,65535,257,65535]}}, +{"factor":99,"in":"#008000ff","op":"lighter","out":{"hex":"#007f00ff","u16":[0,32570,0,65535]}}, +{"factor":99,"in":"#008000ff","op":"darker","out":{"hex":"#008100ff","u16":[0,33224,0,65535]}}, +{"factor":100,"in":"#008000ff","op":"lighter","out":{"hex":"#008000ff","u16":[0,32896,0,65535]}}, +{"factor":100,"in":"#008000ff","op":"darker","out":{"hex":"#008000ff","u16":[0,32896,0,65535]}}, +{"factor":101,"in":"#008000ff","op":"lighter","out":{"hex":"#008100ff","u16":[0,33224,0,65535]}}, +{"factor":101,"in":"#008000ff","op":"darker","out":{"hex":"#007f00ff","u16":[0,32570,0,65535]}}, +{"factor":102,"in":"#008000ff","op":"lighter","out":{"hex":"#008300ff","u16":[0,33553,0,65535]}}, +{"factor":102,"in":"#008000ff","op":"darker","out":{"hex":"#007d00ff","u16":[0,32250,0,65535]}}, +{"factor":110,"in":"#008000ff","op":"lighter","out":{"hex":"#008d00ff","u16":[0,36185,0,65535]}}, +{"factor":110,"in":"#008000ff","op":"darker","out":{"hex":"#007400ff","u16":[0,29905,0,65535]}}, +{"factor":120,"in":"#008000ff","op":"lighter","out":{"hex":"#009a00ff","u16":[0,39475,0,65535]}}, +{"factor":120,"in":"#008000ff","op":"darker","out":{"hex":"#006b00ff","u16":[0,27413,0,65535]}}, +{"factor":150,"in":"#008000ff","op":"lighter","out":{"hex":"#00c000ff","u16":[0,49344,0,65535]}}, +{"factor":150,"in":"#008000ff","op":"darker","out":{"hex":"#005500ff","u16":[0,21930,0,65535]}}, +{"factor":200,"in":"#008000ff","op":"lighter","out":{"hex":"#01ff01ff","u16":[257,65535,257,65535]}}, +{"factor":200,"in":"#008000ff","op":"darker","out":{"hex":"#004000ff","u16":[0,16448,0,65535]}}, +{"factor":300,"in":"#008000ff","op":"lighter","out":{"hex":"#81ff81ff","u16":[33153,65535,33153,65535]}}, +{"factor":300,"in":"#008000ff","op":"darker","out":{"hex":"#002b00ff","u16":[0,10965,0,65535]}}, +{"factor":1000,"in":"#008000ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#008000ff","op":"darker","out":{"hex":"#000d00ff","u16":[0,3289,0,65535]}}, +{"factor":-10,"in":"#000080ff","op":"lighter","out":{"hex":"#000080ff","u16":[0,0,32896,65535]}}, +{"factor":-10,"in":"#000080ff","op":"darker","out":{"hex":"#000080ff","u16":[0,0,32896,65535]}}, +{"factor":0,"in":"#000080ff","op":"lighter","out":{"hex":"#000080ff","u16":[0,0,32896,65535]}}, +{"factor":0,"in":"#000080ff","op":"darker","out":{"hex":"#000080ff","u16":[0,0,32896,65535]}}, +{"factor":1,"in":"#000080ff","op":"lighter","out":{"hex":"#000001ff","u16":[0,0,328,65535]}}, +{"factor":1,"in":"#000080ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#000080ff","op":"lighter","out":{"hex":"#000040ff","u16":[0,0,16448,65535]}}, +{"factor":50,"in":"#000080ff","op":"darker","out":{"hex":"#0101ffff","u16":[257,257,65535,65535]}}, +{"factor":99,"in":"#000080ff","op":"lighter","out":{"hex":"#00007fff","u16":[0,0,32570,65535]}}, +{"factor":99,"in":"#000080ff","op":"darker","out":{"hex":"#000081ff","u16":[0,0,33224,65535]}}, +{"factor":100,"in":"#000080ff","op":"lighter","out":{"hex":"#000080ff","u16":[0,0,32896,65535]}}, +{"factor":100,"in":"#000080ff","op":"darker","out":{"hex":"#000080ff","u16":[0,0,32896,65535]}}, +{"factor":101,"in":"#000080ff","op":"lighter","out":{"hex":"#000081ff","u16":[0,0,33224,65535]}}, +{"factor":101,"in":"#000080ff","op":"darker","out":{"hex":"#00007fff","u16":[0,0,32570,65535]}}, +{"factor":102,"in":"#000080ff","op":"lighter","out":{"hex":"#000083ff","u16":[0,0,33553,65535]}}, +{"factor":102,"in":"#000080ff","op":"darker","out":{"hex":"#00007dff","u16":[0,0,32250,65535]}}, +{"factor":110,"in":"#000080ff","op":"lighter","out":{"hex":"#00008dff","u16":[0,0,36185,65535]}}, +{"factor":110,"in":"#000080ff","op":"darker","out":{"hex":"#000074ff","u16":[0,0,29905,65535]}}, +{"factor":120,"in":"#000080ff","op":"lighter","out":{"hex":"#00009aff","u16":[0,0,39475,65535]}}, +{"factor":120,"in":"#000080ff","op":"darker","out":{"hex":"#00006bff","u16":[0,0,27413,65535]}}, +{"factor":150,"in":"#000080ff","op":"lighter","out":{"hex":"#0000c0ff","u16":[0,0,49344,65535]}}, +{"factor":150,"in":"#000080ff","op":"darker","out":{"hex":"#000055ff","u16":[0,0,21930,65535]}}, +{"factor":200,"in":"#000080ff","op":"lighter","out":{"hex":"#0101ffff","u16":[257,257,65535,65535]}}, +{"factor":200,"in":"#000080ff","op":"darker","out":{"hex":"#000040ff","u16":[0,0,16448,65535]}}, +{"factor":300,"in":"#000080ff","op":"lighter","out":{"hex":"#8181ffff","u16":[33153,33153,65535,65535]}}, +{"factor":300,"in":"#000080ff","op":"darker","out":{"hex":"#00002bff","u16":[0,0,10965,65535]}}, +{"factor":1000,"in":"#000080ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#000080ff","op":"darker","out":{"hex":"#00000dff","u16":[0,0,3289,65535]}}, +{"factor":-10,"in":"#ff8080ff","op":"lighter","out":{"hex":"#ff8080ff","u16":[65535,32896,32896,65535]}}, +{"factor":-10,"in":"#ff8080ff","op":"darker","out":{"hex":"#ff8080ff","u16":[65535,32896,32896,65535]}}, +{"factor":0,"in":"#ff8080ff","op":"lighter","out":{"hex":"#ff8080ff","u16":[65535,32896,32896,65535]}}, +{"factor":0,"in":"#ff8080ff","op":"darker","out":{"hex":"#ff8080ff","u16":[65535,32896,32896,65535]}}, +{"factor":1,"in":"#ff8080ff","op":"lighter","out":{"hex":"#030101ff","u16":[655,329,329,65535]}}, +{"factor":1,"in":"#ff8080ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#ff8080ff","op":"lighter","out":{"hex":"#7f4040ff","u16":[32767,16448,16448,65535]}}, +{"factor":50,"in":"#ff8080ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#ff8080ff","op":"lighter","out":{"hex":"#fc7f7fff","u16":[64886,32570,32570,65535]}}, +{"factor":99,"in":"#ff8080ff","op":"darker","out":{"hex":"#ff8383ff","u16":[65535,33551,33551,65535]}}, +{"factor":100,"in":"#ff8080ff","op":"lighter","out":{"hex":"#ff8080ff","u16":[65535,32896,32896,65535]}}, +{"factor":100,"in":"#ff8080ff","op":"darker","out":{"hex":"#ff8080ff","u16":[65535,32896,32896,65535]}}, +{"factor":101,"in":"#ff8080ff","op":"lighter","out":{"hex":"#ff8383ff","u16":[65535,33551,33551,65535]}}, +{"factor":101,"in":"#ff8080ff","op":"darker","out":{"hex":"#fc7f7fff","u16":[64886,32570,32570,65535]}}, +{"factor":102,"in":"#ff8080ff","op":"lighter","out":{"hex":"#ff8585ff","u16":[65535,34206,34206,65535]}}, +{"factor":102,"in":"#ff8080ff","op":"darker","out":{"hex":"#fa7d7dff","u16":[64250,32251,32251,65535]}}, +{"factor":110,"in":"#ff8080ff","op":"lighter","out":{"hex":"#ff9999ff","u16":[65535,39449,39449,65535]}}, +{"factor":110,"in":"#ff8080ff","op":"darker","out":{"hex":"#e87474ff","u16":[59577,29905,29905,65535]}}, +{"factor":120,"in":"#ff8080ff","op":"lighter","out":{"hex":"#ffb3b3ff","u16":[65535,46003,46003,65535]}}, +{"factor":120,"in":"#ff8080ff","op":"darker","out":{"hex":"#d46b6bff","u16":[54612,27413,27413,65535]}}, +{"factor":150,"in":"#ff8080ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":150,"in":"#ff8080ff","op":"darker","out":{"hex":"#aa5555ff","u16":[43690,21931,21931,65535]}}, +{"factor":200,"in":"#ff8080ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#ff8080ff","op":"darker","out":{"hex":"#7f4040ff","u16":[32767,16448,16448,65535]}}, +{"factor":300,"in":"#ff8080ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#ff8080ff","op":"darker","out":{"hex":"#552b2bff","u16":[21845,10965,10965,65535]}}, +{"factor":1000,"in":"#ff8080ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#ff8080ff","op":"darker","out":{"hex":"#190d0dff","u16":[6553,3289,3289,65535]}}, +{"factor":-10,"in":"#80ff80ff","op":"lighter","out":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]}}, +{"factor":-10,"in":"#80ff80ff","op":"darker","out":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]}}, +{"factor":0,"in":"#80ff80ff","op":"lighter","out":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]}}, +{"factor":0,"in":"#80ff80ff","op":"darker","out":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]}}, +{"factor":1,"in":"#80ff80ff","op":"lighter","out":{"hex":"#010301ff","u16":[329,655,329,65535]}}, +{"factor":1,"in":"#80ff80ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#80ff80ff","op":"lighter","out":{"hex":"#407f40ff","u16":[16448,32767,16448,65535]}}, +{"factor":50,"in":"#80ff80ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#80ff80ff","op":"lighter","out":{"hex":"#7ffc7fff","u16":[32570,64886,32570,65535]}}, +{"factor":99,"in":"#80ff80ff","op":"darker","out":{"hex":"#83ff83ff","u16":[33551,65535,33551,65535]}}, +{"factor":100,"in":"#80ff80ff","op":"lighter","out":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]}}, +{"factor":100,"in":"#80ff80ff","op":"darker","out":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]}}, +{"factor":101,"in":"#80ff80ff","op":"lighter","out":{"hex":"#83ff83ff","u16":[33551,65535,33551,65535]}}, +{"factor":101,"in":"#80ff80ff","op":"darker","out":{"hex":"#7ffc7fff","u16":[32570,64886,32570,65535]}}, +{"factor":102,"in":"#80ff80ff","op":"lighter","out":{"hex":"#85ff85ff","u16":[34206,65535,34206,65535]}}, +{"factor":102,"in":"#80ff80ff","op":"darker","out":{"hex":"#7dfa7dff","u16":[32251,64250,32251,65535]}}, +{"factor":110,"in":"#80ff80ff","op":"lighter","out":{"hex":"#99ff99ff","u16":[39449,65535,39449,65535]}}, +{"factor":110,"in":"#80ff80ff","op":"darker","out":{"hex":"#74e874ff","u16":[29905,59577,29905,65535]}}, +{"factor":120,"in":"#80ff80ff","op":"lighter","out":{"hex":"#b3ffb3ff","u16":[46003,65535,46003,65535]}}, +{"factor":120,"in":"#80ff80ff","op":"darker","out":{"hex":"#6bd46bff","u16":[27413,54612,27413,65535]}}, +{"factor":150,"in":"#80ff80ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":150,"in":"#80ff80ff","op":"darker","out":{"hex":"#55aa55ff","u16":[21931,43690,21931,65535]}}, +{"factor":200,"in":"#80ff80ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#80ff80ff","op":"darker","out":{"hex":"#407f40ff","u16":[16448,32767,16448,65535]}}, +{"factor":300,"in":"#80ff80ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#80ff80ff","op":"darker","out":{"hex":"#2b552bff","u16":[10965,21845,10965,65535]}}, +{"factor":1000,"in":"#80ff80ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#80ff80ff","op":"darker","out":{"hex":"#0d190dff","u16":[3289,6553,3289,65535]}}, +{"factor":-10,"in":"#8080ffff","op":"lighter","out":{"hex":"#8080ffff","u16":[32896,32896,65535,65535]}}, +{"factor":-10,"in":"#8080ffff","op":"darker","out":{"hex":"#8080ffff","u16":[32896,32896,65535,65535]}}, +{"factor":0,"in":"#8080ffff","op":"lighter","out":{"hex":"#8080ffff","u16":[32896,32896,65535,65535]}}, +{"factor":0,"in":"#8080ffff","op":"darker","out":{"hex":"#8080ffff","u16":[32896,32896,65535,65535]}}, +{"factor":1,"in":"#8080ffff","op":"lighter","out":{"hex":"#010103ff","u16":[329,329,655,65535]}}, +{"factor":1,"in":"#8080ffff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#8080ffff","op":"lighter","out":{"hex":"#40407fff","u16":[16448,16448,32767,65535]}}, +{"factor":50,"in":"#8080ffff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#8080ffff","op":"lighter","out":{"hex":"#7f7ffcff","u16":[32570,32570,64886,65535]}}, +{"factor":99,"in":"#8080ffff","op":"darker","out":{"hex":"#8383ffff","u16":[33551,33551,65535,65535]}}, +{"factor":100,"in":"#8080ffff","op":"lighter","out":{"hex":"#8080ffff","u16":[32896,32896,65535,65535]}}, +{"factor":100,"in":"#8080ffff","op":"darker","out":{"hex":"#8080ffff","u16":[32896,32896,65535,65535]}}, +{"factor":101,"in":"#8080ffff","op":"lighter","out":{"hex":"#8383ffff","u16":[33551,33551,65535,65535]}}, +{"factor":101,"in":"#8080ffff","op":"darker","out":{"hex":"#7f7ffcff","u16":[32570,32570,64886,65535]}}, +{"factor":102,"in":"#8080ffff","op":"lighter","out":{"hex":"#8585ffff","u16":[34206,34206,65535,65535]}}, +{"factor":102,"in":"#8080ffff","op":"darker","out":{"hex":"#7d7dfaff","u16":[32251,32251,64250,65535]}}, +{"factor":110,"in":"#8080ffff","op":"lighter","out":{"hex":"#9999ffff","u16":[39449,39449,65535,65535]}}, +{"factor":110,"in":"#8080ffff","op":"darker","out":{"hex":"#7474e8ff","u16":[29905,29905,59577,65535]}}, +{"factor":120,"in":"#8080ffff","op":"lighter","out":{"hex":"#b3b3ffff","u16":[46003,46003,65535,65535]}}, +{"factor":120,"in":"#8080ffff","op":"darker","out":{"hex":"#6b6bd4ff","u16":[27413,27413,54612,65535]}}, +{"factor":150,"in":"#8080ffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":150,"in":"#8080ffff","op":"darker","out":{"hex":"#5555aaff","u16":[21931,21931,43690,65535]}}, +{"factor":200,"in":"#8080ffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#8080ffff","op":"darker","out":{"hex":"#40407fff","u16":[16448,16448,32767,65535]}}, +{"factor":300,"in":"#8080ffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#8080ffff","op":"darker","out":{"hex":"#2b2b55ff","u16":[10965,10965,21845,65535]}}, +{"factor":1000,"in":"#8080ffff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#8080ffff","op":"darker","out":{"hex":"#0d0d19ff","u16":[3289,3289,6553,65535]}}, +{"factor":-10,"in":"#030201ff","op":"lighter","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"factor":-10,"in":"#030201ff","op":"darker","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"factor":0,"in":"#030201ff","op":"lighter","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"factor":0,"in":"#030201ff","op":"darker","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"factor":1,"in":"#030201ff","op":"lighter","out":{"hex":"#000000ff","u16":[7,5,2,65535]}}, +{"factor":1,"in":"#030201ff","op":"darker","out":{"hex":"#ffc182ff","u16":[65535,49473,33410,65535]}}, +{"factor":50,"in":"#030201ff","op":"lighter","out":{"hex":"#010100ff","u16":[385,257,128,65535]}}, +{"factor":50,"in":"#030201ff","op":"darker","out":{"hex":"#060402ff","u16":[1542,1028,514,65535]}}, +{"factor":99,"in":"#030201ff","op":"lighter","out":{"hex":"#030201ff","u16":[763,509,254,65535]}}, +{"factor":99,"in":"#030201ff","op":"darker","out":{"hex":"#030201ff","u16":[778,519,259,65535]}}, +{"factor":100,"in":"#030201ff","op":"lighter","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"factor":100,"in":"#030201ff","op":"darker","out":{"hex":"#030201ff","u16":[771,514,257,65535]}}, +{"factor":101,"in":"#030201ff","op":"lighter","out":{"hex":"#030201ff","u16":[778,519,259,65535]}}, +{"factor":101,"in":"#030201ff","op":"darker","out":{"hex":"#030201ff","u16":[763,509,254,65535]}}, +{"factor":102,"in":"#030201ff","op":"lighter","out":{"hex":"#030201ff","u16":[786,524,262,65535]}}, +{"factor":102,"in":"#030201ff","op":"darker","out":{"hex":"#030201ff","u16":[755,503,252,65535]}}, +{"factor":110,"in":"#030201ff","op":"lighter","out":{"hex":"#030201ff","u16":[848,565,283,65535]}}, +{"factor":110,"in":"#030201ff","op":"darker","out":{"hex":"#030201ff","u16":[700,467,233,65535]}}, +{"factor":120,"in":"#030201ff","op":"lighter","out":{"hex":"#040201ff","u16":[925,617,308,65535]}}, +{"factor":120,"in":"#030201ff","op":"darker","out":{"hex":"#020201ff","u16":[642,428,214,65535]}}, +{"factor":150,"in":"#030201ff","op":"lighter","out":{"hex":"#040301ff","u16":[1156,771,385,65535]}}, +{"factor":150,"in":"#030201ff","op":"darker","out":{"hex":"#020101ff","u16":[514,343,171,65535]}}, +{"factor":200,"in":"#030201ff","op":"lighter","out":{"hex":"#060402ff","u16":[1542,1028,514,65535]}}, +{"factor":200,"in":"#030201ff","op":"darker","out":{"hex":"#010100ff","u16":[385,257,128,65535]}}, +{"factor":300,"in":"#030201ff","op":"lighter","out":{"hex":"#090603ff","u16":[2313,1542,771,65535]}}, +{"factor":300,"in":"#030201ff","op":"darker","out":{"hex":"#010100ff","u16":[257,171,86,65535]}}, +{"factor":1000,"in":"#030201ff","op":"lighter","out":{"hex":"#1e140aff","u16":[7710,5140,2570,65535]}}, +{"factor":1000,"in":"#030201ff","op":"darker","out":{"hex":"#000000ff","u16":[77,51,26,65535]}}, +{"factor":-10,"in":"#fffefdff","op":"lighter","out":{"hex":"#fffefdff","u16":[65535,65278,65021,65535]}}, +{"factor":-10,"in":"#fffefdff","op":"darker","out":{"hex":"#fffefdff","u16":[65535,65278,65021,65535]}}, +{"factor":0,"in":"#fffefdff","op":"lighter","out":{"hex":"#fffefdff","u16":[65535,65278,65021,65535]}}, +{"factor":0,"in":"#fffefdff","op":"darker","out":{"hex":"#fffefdff","u16":[65535,65278,65021,65535]}}, +{"factor":1,"in":"#fffefdff","op":"lighter","out":{"hex":"#030303ff","u16":[655,652,650,65535]}}, +{"factor":1,"in":"#fffefdff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#fffefdff","op":"lighter","out":{"hex":"#7f7f7eff","u16":[32767,32639,32510,65535]}}, +{"factor":50,"in":"#fffefdff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#fffefdff","op":"lighter","out":{"hex":"#fcfbfaff","u16":[64886,64632,64377,65535]}}, +{"factor":99,"in":"#fffefdff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":100,"in":"#fffefdff","op":"lighter","out":{"hex":"#fffefdff","u16":[65535,65278,65021,65535]}}, +{"factor":100,"in":"#fffefdff","op":"darker","out":{"hex":"#fffefdff","u16":[65535,65278,65021,65535]}}, +{"factor":101,"in":"#fffefdff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":101,"in":"#fffefdff","op":"darker","out":{"hex":"#fcfbfaff","u16":[64886,64632,64377,65535]}}, +{"factor":102,"in":"#fffefdff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":102,"in":"#fffefdff","op":"darker","out":{"hex":"#faf9f8ff","u16":[64250,63998,63746,65535]}}, +{"factor":110,"in":"#fffefdff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":110,"in":"#fffefdff","op":"darker","out":{"hex":"#e8e7e6ff","u16":[59577,59343,59110,65535]}}, +{"factor":120,"in":"#fffefdff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":120,"in":"#fffefdff","op":"darker","out":{"hex":"#d4d4d3ff","u16":[54612,54398,54184,65535]}}, +{"factor":150,"in":"#fffefdff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":150,"in":"#fffefdff","op":"darker","out":{"hex":"#aaa9a9ff","u16":[43690,43519,43347,65535]}}, +{"factor":200,"in":"#fffefdff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#fffefdff","op":"darker","out":{"hex":"#7f7f7eff","u16":[32767,32639,32510,65535]}}, +{"factor":300,"in":"#fffefdff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#fffefdff","op":"darker","out":{"hex":"#555554ff","u16":[21845,21759,21674,65535]}}, +{"factor":1000,"in":"#fffefdff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#fffefdff","op":"darker","out":{"hex":"#191919ff","u16":[6553,6527,6502,65535]}}, +{"factor":-10,"in":"#7f8081ff","op":"lighter","out":{"hex":"#7f8081ff","u16":[32639,32896,33153,65535]}}, +{"factor":-10,"in":"#7f8081ff","op":"darker","out":{"hex":"#7f8081ff","u16":[32639,32896,33153,65535]}}, +{"factor":0,"in":"#7f8081ff","op":"lighter","out":{"hex":"#7f8081ff","u16":[32639,32896,33153,65535]}}, +{"factor":0,"in":"#7f8081ff","op":"darker","out":{"hex":"#7f8081ff","u16":[32639,32896,33153,65535]}}, +{"factor":1,"in":"#7f8081ff","op":"lighter","out":{"hex":"#010101ff","u16":[326,328,331,65535]}}, +{"factor":1,"in":"#7f8081ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#7f8081ff","op":"lighter","out":{"hex":"#3f4040ff","u16":[16319,16448,16576,65535]}}, +{"factor":50,"in":"#7f8081ff","op":"darker","out":{"hex":"#feffffff","u16":[65290,65413,65535,65535]}}, +{"factor":99,"in":"#7f8081ff","op":"lighter","out":{"hex":"#7e7f80ff","u16":[32315,32570,32824,65535]}}, +{"factor":99,"in":"#7f8081ff","op":"darker","out":{"hex":"#808182ff","u16":[32965,33224,33484,65535]}}, +{"factor":100,"in":"#7f8081ff","op":"lighter","out":{"hex":"#7f8081ff","u16":[32639,32896,33153,65535]}}, +{"factor":100,"in":"#7f8081ff","op":"darker","out":{"hex":"#7f8081ff","u16":[32639,32896,33153,65535]}}, +{"factor":101,"in":"#7f8081ff","op":"lighter","out":{"hex":"#808182ff","u16":[32965,33224,33484,65535]}}, +{"factor":101,"in":"#7f8081ff","op":"darker","out":{"hex":"#7e7f80ff","u16":[32315,32570,32824,65535]}}, +{"factor":102,"in":"#7f8081ff","op":"lighter","out":{"hex":"#828384ff","u16":[33292,33554,33816,65535]}}, +{"factor":102,"in":"#7f8081ff","op":"darker","out":{"hex":"#7d7d7eff","u16":[31998,32250,32502,65535]}}, +{"factor":110,"in":"#7f8081ff","op":"lighter","out":{"hex":"#8c8d8eff","u16":[35903,36185,36468,65535]}}, +{"factor":110,"in":"#7f8081ff","op":"darker","out":{"hex":"#737475ff","u16":[29672,29905,30139,65535]}}, +{"factor":120,"in":"#7f8081ff","op":"lighter","out":{"hex":"#989a9bff","u16":[39166,39475,39783,65535]}}, +{"factor":120,"in":"#7f8081ff","op":"darker","out":{"hex":"#6a6b6bff","u16":[27199,27413,27627,65535]}}, +{"factor":150,"in":"#7f8081ff","op":"lighter","out":{"hex":"#bec0c1ff","u16":[48958,49344,49729,65535]}}, +{"factor":150,"in":"#7f8081ff","op":"darker","out":{"hex":"#555556ff","u16":[21759,21931,22102,65535]}}, +{"factor":200,"in":"#7f8081ff","op":"lighter","out":{"hex":"#feffffff","u16":[65290,65413,65535,65535]}}, +{"factor":200,"in":"#7f8081ff","op":"darker","out":{"hex":"#3f4040ff","u16":[16319,16448,16576,65535]}}, +{"factor":300,"in":"#7f8081ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#7f8081ff","op":"darker","out":{"hex":"#2a2b2bff","u16":[10880,10965,11051,65535]}}, +{"factor":1000,"in":"#7f8081ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#7f8081ff","op":"darker","out":{"hex":"#0d0d0dff","u16":[3264,3289,3315,65535]}}, +{"factor":-10,"in":"#010000ff","op":"lighter","out":{"hex":"#010000ff","u16":[257,0,0,65535]}}, +{"factor":-10,"in":"#010000ff","op":"darker","out":{"hex":"#010000ff","u16":[257,0,0,65535]}}, +{"factor":0,"in":"#010000ff","op":"lighter","out":{"hex":"#010000ff","u16":[257,0,0,65535]}}, +{"factor":0,"in":"#010000ff","op":"darker","out":{"hex":"#010000ff","u16":[257,0,0,65535]}}, +{"factor":1,"in":"#010000ff","op":"lighter","out":{"hex":"#000000ff","u16":[2,0,0,65535]}}, +{"factor":1,"in":"#010000ff","op":"darker","out":{"hex":"#640000ff","u16":[25700,0,0,65535]}}, +{"factor":50,"in":"#010000ff","op":"lighter","out":{"hex":"#000000ff","u16":[128,0,0,65535]}}, +{"factor":50,"in":"#010000ff","op":"darker","out":{"hex":"#020000ff","u16":[514,0,0,65535]}}, +{"factor":99,"in":"#010000ff","op":"lighter","out":{"hex":"#010000ff","u16":[254,0,0,65535]}}, +{"factor":99,"in":"#010000ff","op":"darker","out":{"hex":"#010000ff","u16":[259,0,0,65535]}}, +{"factor":100,"in":"#010000ff","op":"lighter","out":{"hex":"#010000ff","u16":[257,0,0,65535]}}, +{"factor":100,"in":"#010000ff","op":"darker","out":{"hex":"#010000ff","u16":[257,0,0,65535]}}, +{"factor":101,"in":"#010000ff","op":"lighter","out":{"hex":"#010000ff","u16":[259,0,0,65535]}}, +{"factor":101,"in":"#010000ff","op":"darker","out":{"hex":"#010000ff","u16":[254,0,0,65535]}}, +{"factor":102,"in":"#010000ff","op":"lighter","out":{"hex":"#010000ff","u16":[262,0,0,65535]}}, +{"factor":102,"in":"#010000ff","op":"darker","out":{"hex":"#010000ff","u16":[251,0,0,65535]}}, +{"factor":110,"in":"#010000ff","op":"lighter","out":{"hex":"#010000ff","u16":[282,0,0,65535]}}, +{"factor":110,"in":"#010000ff","op":"darker","out":{"hex":"#010000ff","u16":[233,0,0,65535]}}, +{"factor":120,"in":"#010000ff","op":"lighter","out":{"hex":"#010000ff","u16":[308,0,0,65535]}}, +{"factor":120,"in":"#010000ff","op":"darker","out":{"hex":"#010000ff","u16":[214,0,0,65535]}}, +{"factor":150,"in":"#010000ff","op":"lighter","out":{"hex":"#010000ff","u16":[385,0,0,65535]}}, +{"factor":150,"in":"#010000ff","op":"darker","out":{"hex":"#010000ff","u16":[171,0,0,65535]}}, +{"factor":200,"in":"#010000ff","op":"lighter","out":{"hex":"#020000ff","u16":[514,0,0,65535]}}, +{"factor":200,"in":"#010000ff","op":"darker","out":{"hex":"#000000ff","u16":[128,0,0,65535]}}, +{"factor":300,"in":"#010000ff","op":"lighter","out":{"hex":"#030000ff","u16":[771,0,0,65535]}}, +{"factor":300,"in":"#010000ff","op":"darker","out":{"hex":"#000000ff","u16":[85,0,0,65535]}}, +{"factor":1000,"in":"#010000ff","op":"lighter","out":{"hex":"#0a0000ff","u16":[2570,0,0,65535]}}, +{"factor":1000,"in":"#010000ff","op":"darker","out":{"hex":"#000000ff","u16":[25,0,0,65535]}}, +{"factor":-10,"in":"#000001ff","op":"lighter","out":{"hex":"#000001ff","u16":[0,0,257,65535]}}, +{"factor":-10,"in":"#000001ff","op":"darker","out":{"hex":"#000001ff","u16":[0,0,257,65535]}}, +{"factor":0,"in":"#000001ff","op":"lighter","out":{"hex":"#000001ff","u16":[0,0,257,65535]}}, +{"factor":0,"in":"#000001ff","op":"darker","out":{"hex":"#000001ff","u16":[0,0,257,65535]}}, +{"factor":1,"in":"#000001ff","op":"lighter","out":{"hex":"#000000ff","u16":[0,0,2,65535]}}, +{"factor":1,"in":"#000001ff","op":"darker","out":{"hex":"#000064ff","u16":[0,0,25700,65535]}}, +{"factor":50,"in":"#000001ff","op":"lighter","out":{"hex":"#000000ff","u16":[0,0,128,65535]}}, +{"factor":50,"in":"#000001ff","op":"darker","out":{"hex":"#000002ff","u16":[0,0,514,65535]}}, +{"factor":99,"in":"#000001ff","op":"lighter","out":{"hex":"#000001ff","u16":[0,0,254,65535]}}, +{"factor":99,"in":"#000001ff","op":"darker","out":{"hex":"#000001ff","u16":[0,0,259,65535]}}, +{"factor":100,"in":"#000001ff","op":"lighter","out":{"hex":"#000001ff","u16":[0,0,257,65535]}}, +{"factor":100,"in":"#000001ff","op":"darker","out":{"hex":"#000001ff","u16":[0,0,257,65535]}}, +{"factor":101,"in":"#000001ff","op":"lighter","out":{"hex":"#000001ff","u16":[0,0,259,65535]}}, +{"factor":101,"in":"#000001ff","op":"darker","out":{"hex":"#000001ff","u16":[0,0,254,65535]}}, +{"factor":102,"in":"#000001ff","op":"lighter","out":{"hex":"#000001ff","u16":[0,0,262,65535]}}, +{"factor":102,"in":"#000001ff","op":"darker","out":{"hex":"#000001ff","u16":[0,0,251,65535]}}, +{"factor":110,"in":"#000001ff","op":"lighter","out":{"hex":"#000001ff","u16":[0,0,282,65535]}}, +{"factor":110,"in":"#000001ff","op":"darker","out":{"hex":"#000001ff","u16":[0,0,233,65535]}}, +{"factor":120,"in":"#000001ff","op":"lighter","out":{"hex":"#000001ff","u16":[0,0,308,65535]}}, +{"factor":120,"in":"#000001ff","op":"darker","out":{"hex":"#000001ff","u16":[0,0,214,65535]}}, +{"factor":150,"in":"#000001ff","op":"lighter","out":{"hex":"#000001ff","u16":[0,0,385,65535]}}, +{"factor":150,"in":"#000001ff","op":"darker","out":{"hex":"#000001ff","u16":[0,0,171,65535]}}, +{"factor":200,"in":"#000001ff","op":"lighter","out":{"hex":"#000002ff","u16":[0,0,514,65535]}}, +{"factor":200,"in":"#000001ff","op":"darker","out":{"hex":"#000000ff","u16":[0,0,128,65535]}}, +{"factor":300,"in":"#000001ff","op":"lighter","out":{"hex":"#000003ff","u16":[0,0,771,65535]}}, +{"factor":300,"in":"#000001ff","op":"darker","out":{"hex":"#000000ff","u16":[0,0,85,65535]}}, +{"factor":1000,"in":"#000001ff","op":"lighter","out":{"hex":"#00000aff","u16":[0,0,2570,65535]}}, +{"factor":1000,"in":"#000001ff","op":"darker","out":{"hex":"#000000ff","u16":[0,0,25,65535]}}, +{"factor":-10,"in":"#fefffeff","op":"lighter","out":{"hex":"#fefffeff","u16":[65278,65535,65278,65535]}}, +{"factor":-10,"in":"#fefffeff","op":"darker","out":{"hex":"#fefffeff","u16":[65278,65535,65278,65535]}}, +{"factor":0,"in":"#fefffeff","op":"lighter","out":{"hex":"#fefffeff","u16":[65278,65535,65278,65535]}}, +{"factor":0,"in":"#fefffeff","op":"darker","out":{"hex":"#fefffeff","u16":[65278,65535,65278,65535]}}, +{"factor":1,"in":"#fefffeff","op":"lighter","out":{"hex":"#030303ff","u16":[652,655,652,65535]}}, +{"factor":1,"in":"#fefffeff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#fefffeff","op":"lighter","out":{"hex":"#7f7f7fff","u16":[32639,32767,32639,65535]}}, +{"factor":50,"in":"#fefffeff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#fefffeff","op":"lighter","out":{"hex":"#fbfcfbff","u16":[64632,64886,64632,65535]}}, +{"factor":99,"in":"#fefffeff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":100,"in":"#fefffeff","op":"lighter","out":{"hex":"#fefffeff","u16":[65278,65535,65278,65535]}}, +{"factor":100,"in":"#fefffeff","op":"darker","out":{"hex":"#fefffeff","u16":[65278,65535,65278,65535]}}, +{"factor":101,"in":"#fefffeff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":101,"in":"#fefffeff","op":"darker","out":{"hex":"#fbfcfbff","u16":[64632,64886,64632,65535]}}, +{"factor":102,"in":"#fefffeff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":102,"in":"#fefffeff","op":"darker","out":{"hex":"#f9faf9ff","u16":[63998,64250,63998,65535]}}, +{"factor":110,"in":"#fefffeff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":110,"in":"#fefffeff","op":"darker","out":{"hex":"#e7e8e7ff","u16":[59343,59577,59343,65535]}}, +{"factor":120,"in":"#fefffeff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":120,"in":"#fefffeff","op":"darker","out":{"hex":"#d4d4d4ff","u16":[54398,54612,54398,65535]}}, +{"factor":150,"in":"#fefffeff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":150,"in":"#fefffeff","op":"darker","out":{"hex":"#a9aaa9ff","u16":[43519,43690,43519,65535]}}, +{"factor":200,"in":"#fefffeff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#fefffeff","op":"darker","out":{"hex":"#7f7f7fff","u16":[32639,32767,32639,65535]}}, +{"factor":300,"in":"#fefffeff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#fefffeff","op":"darker","out":{"hex":"#555555ff","u16":[21759,21845,21759,65535]}}, +{"factor":1000,"in":"#fefffeff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#fefffeff","op":"darker","out":{"hex":"#191919ff","u16":[6527,6553,6527,65535]}}, +{"factor":-10,"in":"#3daee9ff","op":"lighter","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"factor":-10,"in":"#3daee9ff","op":"darker","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"factor":0,"in":"#3daee9ff","op":"lighter","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"factor":0,"in":"#3daee9ff","op":"darker","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"factor":1,"in":"#3daee9ff","op":"lighter","out":{"hex":"#010202ff","u16":[157,447,598,65535]}}, +{"factor":1,"in":"#3daee9ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#3daee9ff","op":"lighter","out":{"hex":"#1e5774ff","u16":[7838,22359,29940,65535]}}, +{"factor":50,"in":"#3daee9ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#3daee9ff","op":"lighter","out":{"hex":"#3cace7ff","u16":[15522,44276,59288,65535]}}, +{"factor":99,"in":"#3daee9ff","op":"darker","out":{"hex":"#3eb0ebff","u16":[15833,45166,60479,65535]}}, +{"factor":100,"in":"#3daee9ff","op":"lighter","out":{"hex":"#3daee9ff","u16":[15677,44719,59881,65535]}}, +{"factor":100,"in":"#3daee9ff","op":"darker","out":{"hex":"#3daee9ff","u16":[15677,44719,59881,65535]}}, +{"factor":101,"in":"#3daee9ff","op":"lighter","out":{"hex":"#3eb0ebff","u16":[15833,45166,60479,65535]}}, +{"factor":101,"in":"#3daee9ff","op":"darker","out":{"hex":"#3cace7ff","u16":[15522,44276,59288,65535]}}, +{"factor":102,"in":"#3daee9ff","op":"lighter","out":{"hex":"#3eb1eeff","u16":[15990,45613,61078,65535]}}, +{"factor":102,"in":"#3daee9ff","op":"darker","out":{"hex":"#3cabe4ff","u16":[15369,43841,58706,65535]}}, +{"factor":110,"in":"#3daee9ff","op":"lighter","out":{"hex":"#44bfffff","u16":[17491,49056,65535,65535]}}, +{"factor":110,"in":"#3daee9ff","op":"darker","out":{"hex":"#379ed4ff","u16":[14252,40653,54437,65535]}}, +{"factor":120,"in":"#3daee9ff","op":"lighter","out":{"hex":"#5bc7ffff","u16":[23479,51110,65535,65535]}}, +{"factor":120,"in":"#3daee9ff","op":"darker","out":{"hex":"#3391c2ff","u16":[13064,37265,49900,65535]}}, +{"factor":150,"in":"#3daee9ff","op":"lighter","out":{"hex":"#a1dfffff","u16":[41443,57271,65535,65535]}}, +{"factor":150,"in":"#3daee9ff","op":"darker","out":{"hex":"#29749bff","u16":[10451,29812,39920,65535]}}, +{"factor":200,"in":"#3daee9ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#3daee9ff","op":"darker","out":{"hex":"#1e5774ff","u16":[7838,22359,29940,65535]}}, +{"factor":300,"in":"#3daee9ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#3daee9ff","op":"darker","out":{"hex":"#143a4eff","u16":[5226,14906,19960,65535]}}, +{"factor":1000,"in":"#3daee9ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#3daee9ff","op":"darker","out":{"hex":"#061117ff","u16":[1568,4472,5988,65535]}}, +{"factor":-10,"in":"#232629ff","op":"lighter","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"factor":-10,"in":"#232629ff","op":"darker","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"factor":0,"in":"#232629ff","op":"lighter","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"factor":0,"in":"#232629ff","op":"darker","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"factor":1,"in":"#232629ff","op":"lighter","out":{"hex":"#000000ff","u16":[90,97,105,65535]}}, +{"factor":1,"in":"#232629ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#232629ff","op":"lighter","out":{"hex":"#111314ff","u16":[4497,4883,5268,65535]}}, +{"factor":50,"in":"#232629ff","op":"darker","out":{"hex":"#464c52ff","u16":[17990,19532,21074,65535]}}, +{"factor":99,"in":"#232629ff","op":"lighter","out":{"hex":"#232629ff","u16":[8905,9669,10432,65535]}}, +{"factor":99,"in":"#232629ff","op":"darker","out":{"hex":"#232629ff","u16":[9085,9863,10642,65535]}}, +{"factor":100,"in":"#232629ff","op":"lighter","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"factor":100,"in":"#232629ff","op":"darker","out":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}, +{"factor":101,"in":"#232629ff","op":"lighter","out":{"hex":"#232629ff","u16":[9085,9863,10642,65535]}}, +{"factor":101,"in":"#232629ff","op":"darker","out":{"hex":"#232629ff","u16":[8905,9669,10432,65535]}}, +{"factor":102,"in":"#232629ff","op":"lighter","out":{"hex":"#24272aff","u16":[9174,9961,10747,65535]}}, +{"factor":102,"in":"#232629ff","op":"darker","out":{"hex":"#222528ff","u16":[8818,9574,10330,65535]}}, +{"factor":110,"in":"#232629ff","op":"lighter","out":{"hex":"#262a2dff","u16":[9894,10742,11590,65535]}}, +{"factor":110,"in":"#232629ff","op":"darker","out":{"hex":"#202325ff","u16":[8177,8878,9579,65535]}}, +{"factor":120,"in":"#232629ff","op":"lighter","out":{"hex":"#2a2e31ff","u16":[10794,11719,12644,65535]}}, +{"factor":120,"in":"#232629ff","op":"darker","out":{"hex":"#1d2022ff","u16":[7495,8138,8780,65535]}}, +{"factor":150,"in":"#232629ff","op":"lighter","out":{"hex":"#34393dff","u16":[13492,14649,15805,65535]}}, +{"factor":150,"in":"#232629ff","op":"darker","out":{"hex":"#17191bff","u16":[5996,6510,7024,65535]}}, +{"factor":200,"in":"#232629ff","op":"lighter","out":{"hex":"#464c52ff","u16":[17990,19532,21074,65535]}}, +{"factor":200,"in":"#232629ff","op":"darker","out":{"hex":"#111314ff","u16":[4497,4883,5268,65535]}}, +{"factor":300,"in":"#232629ff","op":"lighter","out":{"hex":"#69727bff","u16":[26985,29298,31611,65535]}}, +{"factor":300,"in":"#232629ff","op":"darker","out":{"hex":"#0c0d0eff","u16":[2998,3255,3512,65535]}}, +{"factor":1000,"in":"#232629ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#232629ff","op":"darker","out":{"hex":"#030404ff","u16":[899,976,1053,65535]}}, +{"factor":-10,"in":"#eff0f1ff","op":"lighter","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"factor":-10,"in":"#eff0f1ff","op":"darker","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"factor":0,"in":"#eff0f1ff","op":"lighter","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"factor":0,"in":"#eff0f1ff","op":"darker","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"factor":1,"in":"#eff0f1ff","op":"lighter","out":{"hex":"#020202ff","u16":[614,616,619,65535]}}, +{"factor":1,"in":"#eff0f1ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#eff0f1ff","op":"lighter","out":{"hex":"#777878ff","u16":[30711,30839,30968,65535]}}, +{"factor":50,"in":"#eff0f1ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#eff0f1ff","op":"lighter","out":{"hex":"#edeeefff","u16":[60814,61068,61323,65535]}}, +{"factor":99,"in":"#eff0f1ff","op":"darker","out":{"hex":"#f1f2f3ff","u16":[62037,62296,62556,65535]}}, +{"factor":100,"in":"#eff0f1ff","op":"lighter","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"factor":100,"in":"#eff0f1ff","op":"darker","out":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]}}, +{"factor":101,"in":"#eff0f1ff","op":"lighter","out":{"hex":"#f1f2f3ff","u16":[62037,62296,62556,65535]}}, +{"factor":101,"in":"#eff0f1ff","op":"darker","out":{"hex":"#edeeefff","u16":[60814,61068,61323,65535]}}, +{"factor":102,"in":"#eff0f1ff","op":"lighter","out":{"hex":"#f4f5f6ff","u16":[62651,62913,63175,65535]}}, +{"factor":102,"in":"#eff0f1ff","op":"darker","out":{"hex":"#eaebecff","u16":[60218,60470,60722,65535]}}, +{"factor":110,"in":"#eff0f1ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":110,"in":"#eff0f1ff","op":"darker","out":{"hex":"#d9dadbff","u16":[55839,56072,56306,65535]}}, +{"factor":120,"in":"#eff0f1ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":120,"in":"#eff0f1ff","op":"darker","out":{"hex":"#c7c8c9ff","u16":[51186,51400,51614,65535]}}, +{"factor":150,"in":"#eff0f1ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":150,"in":"#eff0f1ff","op":"darker","out":{"hex":"#9fa0a1ff","u16":[40948,41120,41291,65535]}}, +{"factor":200,"in":"#eff0f1ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#eff0f1ff","op":"darker","out":{"hex":"#777878ff","u16":[30711,30839,30968,65535]}}, +{"factor":300,"in":"#eff0f1ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#eff0f1ff","op":"darker","out":{"hex":"#505050ff","u16":[20474,20559,20645,65535]}}, +{"factor":1000,"in":"#eff0f1ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#eff0f1ff","op":"darker","out":{"hex":"#181818ff","u16":[6142,6167,6193,65535]}}, +{"factor":-10,"in":"#fcfcfcff","op":"lighter","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"factor":-10,"in":"#fcfcfcff","op":"darker","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"factor":0,"in":"#fcfcfcff","op":"lighter","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"factor":0,"in":"#fcfcfcff","op":"darker","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"factor":1,"in":"#fcfcfcff","op":"lighter","out":{"hex":"#030303ff","u16":[647,647,647,65535]}}, +{"factor":1,"in":"#fcfcfcff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#fcfcfcff","op":"lighter","out":{"hex":"#7e7e7eff","u16":[32382,32382,32382,65535]}}, +{"factor":50,"in":"#fcfcfcff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#fcfcfcff","op":"lighter","out":{"hex":"#fafafaff","u16":[64122,64122,64122,65535]}}, +{"factor":99,"in":"#fcfcfcff","op":"darker","out":{"hex":"#ffffffff","u16":[65411,65411,65411,65535]}}, +{"factor":100,"in":"#fcfcfcff","op":"lighter","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"factor":100,"in":"#fcfcfcff","op":"darker","out":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}, +{"factor":101,"in":"#fcfcfcff","op":"lighter","out":{"hex":"#ffffffff","u16":[65411,65411,65411,65535]}}, +{"factor":101,"in":"#fcfcfcff","op":"darker","out":{"hex":"#fafafaff","u16":[64122,64122,64122,65535]}}, +{"factor":102,"in":"#fcfcfcff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":102,"in":"#fcfcfcff","op":"darker","out":{"hex":"#f7f7f7ff","u16":[63494,63494,63494,65535]}}, +{"factor":110,"in":"#fcfcfcff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":110,"in":"#fcfcfcff","op":"darker","out":{"hex":"#e5e5e5ff","u16":[58876,58876,58876,65535]}}, +{"factor":120,"in":"#fcfcfcff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":120,"in":"#fcfcfcff","op":"darker","out":{"hex":"#d2d2d2ff","u16":[53970,53970,53970,65535]}}, +{"factor":150,"in":"#fcfcfcff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":150,"in":"#fcfcfcff","op":"darker","out":{"hex":"#a8a8a8ff","u16":[43176,43176,43176,65535]}}, +{"factor":200,"in":"#fcfcfcff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#fcfcfcff","op":"darker","out":{"hex":"#7e7e7eff","u16":[32382,32382,32382,65535]}}, +{"factor":300,"in":"#fcfcfcff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#fcfcfcff","op":"darker","out":{"hex":"#545454ff","u16":[21588,21588,21588,65535]}}, +{"factor":1000,"in":"#fcfcfcff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#fcfcfcff","op":"darker","out":{"hex":"#191919ff","u16":[6476,6476,6476,65535]}}, +{"factor":-10,"in":"#31363bff","op":"lighter","out":{"hex":"#31363bff","u16":[12593,13878,15163,65535]}}, +{"factor":-10,"in":"#31363bff","op":"darker","out":{"hex":"#31363bff","u16":[12593,13878,15163,65535]}}, +{"factor":0,"in":"#31363bff","op":"lighter","out":{"hex":"#31363bff","u16":[12593,13878,15163,65535]}}, +{"factor":0,"in":"#31363bff","op":"darker","out":{"hex":"#31363bff","u16":[12593,13878,15163,65535]}}, +{"factor":1,"in":"#31363bff","op":"lighter","out":{"hex":"#000101ff","u16":[125,138,151,65535]}}, +{"factor":1,"in":"#31363bff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#31363bff","op":"lighter","out":{"hex":"#181b1dff","u16":[6296,6939,7581,65535]}}, +{"factor":50,"in":"#31363bff","op":"darker","out":{"hex":"#626c76ff","u16":[25186,27756,30326,65535]}}, +{"factor":99,"in":"#31363bff","op":"lighter","out":{"hex":"#31353aff","u16":[12468,13740,15012,65535]}}, +{"factor":99,"in":"#31363bff","op":"darker","out":{"hex":"#31373cff","u16":[12718,14016,15314,65535]}}, +{"factor":100,"in":"#31363bff","op":"lighter","out":{"hex":"#31363bff","u16":[12593,13878,15163,65535]}}, +{"factor":100,"in":"#31363bff","op":"darker","out":{"hex":"#31363bff","u16":[12593,13878,15163,65535]}}, +{"factor":101,"in":"#31363bff","op":"lighter","out":{"hex":"#31373cff","u16":[12718,14016,15314,65535]}}, +{"factor":101,"in":"#31363bff","op":"darker","out":{"hex":"#31353aff","u16":[12468,13740,15012,65535]}}, +{"factor":102,"in":"#31363bff","op":"lighter","out":{"hex":"#32373cff","u16":[12845,14155,15466,65535]}}, +{"factor":102,"in":"#31363bff","op":"darker","out":{"hex":"#30353aff","u16":[12345,13605,14865,65535]}}, +{"factor":110,"in":"#31363bff","op":"lighter","out":{"hex":"#363b41ff","u16":[13852,15265,16679,65535]}}, +{"factor":110,"in":"#31363bff","op":"darker","out":{"hex":"#2d3136ff","u16":[11448,12616,13784,65535]}}, +{"factor":120,"in":"#31363bff","op":"lighter","out":{"hex":"#3b4147ff","u16":[15111,16653,18195,65535]}}, +{"factor":120,"in":"#31363bff","op":"darker","out":{"hex":"#292d31ff","u16":[10493,11564,12635,65535]}}, +{"factor":150,"in":"#31363bff","op":"lighter","out":{"hex":"#495158ff","u16":[18889,20816,22744,65535]}}, +{"factor":150,"in":"#31363bff","op":"darker","out":{"hex":"#212427ff","u16":[8395,9251,10108,65535]}}, +{"factor":200,"in":"#31363bff","op":"lighter","out":{"hex":"#626c76ff","u16":[25186,27756,30326,65535]}}, +{"factor":200,"in":"#31363bff","op":"darker","out":{"hex":"#181b1dff","u16":[6296,6939,7581,65535]}}, +{"factor":300,"in":"#31363bff","op":"lighter","out":{"hex":"#93a2b1ff","u16":[37779,41634,45489,65535]}}, +{"factor":300,"in":"#31363bff","op":"darker","out":{"hex":"#101214ff","u16":[4197,4626,5054,65535]}}, +{"factor":1000,"in":"#31363bff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#31363bff","op":"darker","out":{"hex":"#050506ff","u16":[1259,1388,1516,65535]}}, +{"factor":-10,"in":"#1b1e20ff","op":"lighter","out":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]}}, +{"factor":-10,"in":"#1b1e20ff","op":"darker","out":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]}}, +{"factor":0,"in":"#1b1e20ff","op":"lighter","out":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]}}, +{"factor":0,"in":"#1b1e20ff","op":"darker","out":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]}}, +{"factor":1,"in":"#1b1e20ff","op":"lighter","out":{"hex":"#000000ff","u16":[69,77,82,65535]}}, +{"factor":1,"in":"#1b1e20ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#1b1e20ff","op":"lighter","out":{"hex":"#0d0f10ff","u16":[3469,3855,4112,65535]}}, +{"factor":50,"in":"#1b1e20ff","op":"darker","out":{"hex":"#363c40ff","u16":[13878,15420,16448,65535]}}, +{"factor":99,"in":"#1b1e20ff","op":"lighter","out":{"hex":"#1b1e20ff","u16":[6870,7633,8142,65535]}}, +{"factor":99,"in":"#1b1e20ff","op":"darker","out":{"hex":"#1b1e20ff","u16":[7008,7787,8306,65535]}}, +{"factor":100,"in":"#1b1e20ff","op":"lighter","out":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]}}, +{"factor":100,"in":"#1b1e20ff","op":"darker","out":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]}}, +{"factor":101,"in":"#1b1e20ff","op":"lighter","out":{"hex":"#1b1e20ff","u16":[7008,7787,8306,65535]}}, +{"factor":101,"in":"#1b1e20ff","op":"darker","out":{"hex":"#1b1e20ff","u16":[6870,7633,8142,65535]}}, +{"factor":102,"in":"#1b1e20ff","op":"lighter","out":{"hex":"#1c1f21ff","u16":[7077,7864,8388,65535]}}, +{"factor":102,"in":"#1b1e20ff","op":"darker","out":{"hex":"#1a1d1fff","u16":[6802,7558,8062,65535]}}, +{"factor":110,"in":"#1b1e20ff","op":"lighter","out":{"hex":"#1e2123ff","u16":[7633,8481,9046,65535]}}, +{"factor":110,"in":"#1b1e20ff","op":"darker","out":{"hex":"#191b1dff","u16":[6308,7009,7476,65535]}}, +{"factor":120,"in":"#1b1e20ff","op":"lighter","out":{"hex":"#202426ff","u16":[8326,9251,9868,65535]}}, +{"factor":120,"in":"#1b1e20ff","op":"darker","out":{"hex":"#16191bff","u16":[5782,6425,6853,65535]}}, +{"factor":150,"in":"#1b1e20ff","op":"lighter","out":{"hex":"#282d30ff","u16":[10408,11565,12336,65535]}}, +{"factor":150,"in":"#1b1e20ff","op":"darker","out":{"hex":"#121415ff","u16":[4625,5139,5482,65535]}}, +{"factor":200,"in":"#1b1e20ff","op":"lighter","out":{"hex":"#363c40ff","u16":[13878,15420,16448,65535]}}, +{"factor":200,"in":"#1b1e20ff","op":"darker","out":{"hex":"#0d0f10ff","u16":[3469,3855,4112,65535]}}, +{"factor":300,"in":"#1b1e20ff","op":"lighter","out":{"hex":"#515a60ff","u16":[20817,23130,24672,65535]}}, +{"factor":300,"in":"#1b1e20ff","op":"darker","out":{"hex":"#090a0bff","u16":[2313,2570,2741,65535]}}, +{"factor":1000,"in":"#1b1e20ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#1b1e20ff","op":"darker","out":{"hex":"#030303ff","u16":[694,771,822,65535]}}, +{"factor":-10,"in":"#da4453ff","op":"lighter","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"factor":-10,"in":"#da4453ff","op":"darker","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"factor":0,"in":"#da4453ff","op":"lighter","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"factor":0,"in":"#da4453ff","op":"darker","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"factor":1,"in":"#da4453ff","op":"lighter","out":{"hex":"#020101ff","u16":[560,175,213,65535]}}, +{"factor":1,"in":"#da4453ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#da4453ff","op":"lighter","out":{"hex":"#6d2229ff","u16":[28013,8738,10665,65535]}}, +{"factor":50,"in":"#da4453ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#da4453ff","op":"lighter","out":{"hex":"#d84352ff","u16":[55471,17303,21120,65535]}}, +{"factor":99,"in":"#da4453ff","op":"darker","out":{"hex":"#dc4554ff","u16":[56586,17651,21544,65535]}}, +{"factor":100,"in":"#da4453ff","op":"lighter","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"factor":100,"in":"#da4453ff","op":"darker","out":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]}}, +{"factor":101,"in":"#da4453ff","op":"lighter","out":{"hex":"#dc4554ff","u16":[56586,17651,21544,65535]}}, +{"factor":101,"in":"#da4453ff","op":"darker","out":{"hex":"#d84352ff","u16":[55471,17303,21120,65535]}}, +{"factor":102,"in":"#da4453ff","op":"lighter","out":{"hex":"#de4555ff","u16":[57146,17825,21757,65535]}}, +{"factor":102,"in":"#da4453ff","op":"darker","out":{"hex":"#d64351ff","u16":[54927,17133,20912,65535]}}, +{"factor":110,"in":"#da4453ff","op":"lighter","out":{"hex":"#f04b5bff","u16":[61628,19223,23464,65535]}}, +{"factor":110,"in":"#da4453ff","op":"darker","out":{"hex":"#c63e4bff","u16":[50932,15887,19391,65535]}}, +{"factor":120,"in":"#da4453ff","op":"lighter","out":{"hex":"#ff5667ff","u16":[65535,22138,26478,65535]}}, +{"factor":120,"in":"#da4453ff","op":"darker","out":{"hex":"#b63945ff","u16":[46688,14563,17776,65535]}}, +{"factor":150,"in":"#da4453ff","op":"lighter","out":{"hex":"#ff98a2ff","u16":[65535,38946,41605,65535]}}, +{"factor":150,"in":"#da4453ff","op":"darker","out":{"hex":"#912d37ff","u16":[37350,11650,14220,65535]}}, +{"factor":200,"in":"#da4453ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#da4453ff","op":"darker","out":{"hex":"#6d2229ff","u16":[28013,8738,10665,65535]}}, +{"factor":300,"in":"#da4453ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#da4453ff","op":"darker","out":{"hex":"#49171cff","u16":[18675,5825,7110,65535]}}, +{"factor":1000,"in":"#da4453ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#da4453ff","op":"darker","out":{"hex":"#160708ff","u16":[5602,1747,2133,65535]}}, +{"factor":-10,"in":"#27ae60ff","op":"lighter","out":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]}}, +{"factor":-10,"in":"#27ae60ff","op":"darker","out":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]}}, +{"factor":0,"in":"#27ae60ff","op":"lighter","out":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]}}, +{"factor":0,"in":"#27ae60ff","op":"darker","out":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]}}, +{"factor":1,"in":"#27ae60ff","op":"lighter","out":{"hex":"#000201ff","u16":[100,447,247,65535]}}, +{"factor":1,"in":"#27ae60ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#27ae60ff","op":"lighter","out":{"hex":"#145730ff","u16":[5012,22359,12335,65535]}}, +{"factor":50,"in":"#27ae60ff","op":"darker","out":{"hex":"#96ffc2ff","u16":[38590,65535,49965,65535]}}, +{"factor":99,"in":"#27ae60ff","op":"lighter","out":{"hex":"#27ac5fff","u16":[9924,44275,24426,65535]}}, +{"factor":99,"in":"#27ae60ff","op":"darker","out":{"hex":"#27b061ff","u16":[10123,45165,24917,65535]}}, +{"factor":100,"in":"#27ae60ff","op":"lighter","out":{"hex":"#27ae60ff","u16":[10023,44718,24670,65535]}}, +{"factor":100,"in":"#27ae60ff","op":"darker","out":{"hex":"#27ae60ff","u16":[10023,44718,24670,65535]}}, +{"factor":101,"in":"#27ae60ff","op":"lighter","out":{"hex":"#27b061ff","u16":[10123,45165,24917,65535]}}, +{"factor":101,"in":"#27ae60ff","op":"darker","out":{"hex":"#27ac5fff","u16":[9924,44275,24426,65535]}}, +{"factor":102,"in":"#27ae60ff","op":"lighter","out":{"hex":"#28b162ff","u16":[10223,45612,25163,65535]}}, +{"factor":102,"in":"#27ae60ff","op":"darker","out":{"hex":"#26ab5eff","u16":[9827,43841,24186,65535]}}, +{"factor":110,"in":"#27ae60ff","op":"lighter","out":{"hex":"#2bbf6aff","u16":[11025,49189,27137,65535]}}, +{"factor":110,"in":"#27ae60ff","op":"darker","out":{"hex":"#239e57ff","u16":[9112,40652,22427,65535]}}, +{"factor":120,"in":"#27ae60ff","op":"lighter","out":{"hex":"#2fd173ff","u16":[12028,53661,29604,65535]}}, +{"factor":120,"in":"#27ae60ff","op":"darker","out":{"hex":"#219150ff","u16":[8353,37265,20558,65535]}}, +{"factor":150,"in":"#27ae60ff","op":"lighter","out":{"hex":"#3fff90ff","u16":[16231,65535,37046,65535]}}, +{"factor":150,"in":"#27ae60ff","op":"darker","out":{"hex":"#1a7440ff","u16":[6682,29812,16447,65535]}}, +{"factor":200,"in":"#27ae60ff","op":"lighter","out":{"hex":"#96ffc2ff","u16":[38590,65535,49965,65535]}}, +{"factor":200,"in":"#27ae60ff","op":"darker","out":{"hex":"#145730ff","u16":[5012,22359,12335,65535]}}, +{"factor":300,"in":"#27ae60ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#27ae60ff","op":"darker","out":{"hex":"#0d3a20ff","u16":[3341,14906,8223,65535]}}, +{"factor":1000,"in":"#27ae60ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#27ae60ff","op":"darker","out":{"hex":"#04110aff","u16":[1002,4471,2467,65535]}}, +{"factor":-10,"in":"#f67400ff","op":"lighter","out":{"hex":"#f67400ff","u16":[63222,29812,0,65535]}}, +{"factor":-10,"in":"#f67400ff","op":"darker","out":{"hex":"#f67400ff","u16":[63222,29812,0,65535]}}, +{"factor":0,"in":"#f67400ff","op":"lighter","out":{"hex":"#f67400ff","u16":[63222,29812,0,65535]}}, +{"factor":0,"in":"#f67400ff","op":"darker","out":{"hex":"#f67400ff","u16":[63222,29812,0,65535]}}, +{"factor":1,"in":"#f67400ff","op":"lighter","out":{"hex":"#020100ff","u16":[632,298,0,65535]}}, +{"factor":1,"in":"#f67400ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#f67400ff","op":"lighter","out":{"hex":"#7b3a00ff","u16":[31611,14905,0,65535]}}, +{"factor":50,"in":"#f67400ff","op":"darker","out":{"hex":"#fff5edff","u16":[65535,63090,60909,65535]}}, +{"factor":99,"in":"#f67400ff","op":"lighter","out":{"hex":"#f47300ff","u16":[62596,29514,0,65535]}}, +{"factor":99,"in":"#f67400ff","op":"darker","out":{"hex":"#f87500ff","u16":[63854,30107,0,65535]}}, +{"factor":100,"in":"#f67400ff","op":"lighter","out":{"hex":"#f67400ff","u16":[63222,29809,0,65535]}}, +{"factor":100,"in":"#f67400ff","op":"darker","out":{"hex":"#f67400ff","u16":[63222,29809,0,65535]}}, +{"factor":101,"in":"#f67400ff","op":"lighter","out":{"hex":"#f87500ff","u16":[63854,30107,0,65535]}}, +{"factor":101,"in":"#f67400ff","op":"darker","out":{"hex":"#f47300ff","u16":[62596,29514,0,65535]}}, +{"factor":102,"in":"#f67400ff","op":"lighter","out":{"hex":"#fb7600ff","u16":[64486,30405,0,65535]}}, +{"factor":102,"in":"#f67400ff","op":"darker","out":{"hex":"#f17200ff","u16":[61982,29225,0,65535]}}, +{"factor":110,"in":"#f67400ff","op":"lighter","out":{"hex":"#ff8010ff","u16":[65535,33019,4009,65535]}}, +{"factor":110,"in":"#f67400ff","op":"darker","out":{"hex":"#e06900ff","u16":[57474,27099,0,65535]}}, +{"factor":120,"in":"#f67400ff","op":"lighter","out":{"hex":"#ff8d28ff","u16":[65535,36360,10331,65535]}}, +{"factor":120,"in":"#f67400ff","op":"darker","out":{"hex":"#cd6100ff","u16":[52685,24841,0,65535]}}, +{"factor":150,"in":"#f67400ff","op":"lighter","out":{"hex":"#ffb472ff","u16":[65535,46384,29298,65535]}}, +{"factor":150,"in":"#f67400ff","op":"darker","out":{"hex":"#a44d00ff","u16":[42148,19873,0,65535]}}, +{"factor":200,"in":"#f67400ff","op":"lighter","out":{"hex":"#fff5edff","u16":[65535,63090,60909,65535]}}, +{"factor":200,"in":"#f67400ff","op":"darker","out":{"hex":"#7b3a00ff","u16":[31611,14905,0,65535]}}, +{"factor":300,"in":"#f67400ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#f67400ff","op":"darker","out":{"hex":"#522700ff","u16":[21074,9936,0,65535]}}, +{"factor":1000,"in":"#f67400ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#f67400ff","op":"darker","out":{"hex":"#190c00ff","u16":[6322,2981,0,65535]}}, +{"factor":-10,"in":"#2980b9ff","op":"lighter","out":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]}}, +{"factor":-10,"in":"#2980b9ff","op":"darker","out":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]}}, +{"factor":0,"in":"#2980b9ff","op":"lighter","out":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]}}, +{"factor":0,"in":"#2980b9ff","op":"darker","out":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]}}, +{"factor":1,"in":"#2980b9ff","op":"lighter","out":{"hex":"#000102ff","u16":[105,329,475,65535]}}, +{"factor":1,"in":"#2980b9ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#2980b9ff","op":"lighter","out":{"hex":"#14405cff","u16":[5268,16448,23772,65535]}}, +{"factor":50,"in":"#2980b9ff","op":"darker","out":{"hex":"#acdeffff","u16":[44079,57042,65535,65535]}}, +{"factor":99,"in":"#2980b9ff","op":"lighter","out":{"hex":"#297fb7ff","u16":[10433,32570,47074,65535]}}, +{"factor":99,"in":"#2980b9ff","op":"darker","out":{"hex":"#2981bbff","u16":[10642,33225,48020,65535]}}, +{"factor":100,"in":"#2980b9ff","op":"lighter","out":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]}}, +{"factor":100,"in":"#2980b9ff","op":"darker","out":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]}}, +{"factor":101,"in":"#2980b9ff","op":"lighter","out":{"hex":"#2981bbff","u16":[10642,33225,48020,65535]}}, +{"factor":101,"in":"#2980b9ff","op":"darker","out":{"hex":"#297fb7ff","u16":[10433,32570,47074,65535]}}, +{"factor":102,"in":"#2980b9ff","op":"lighter","out":{"hex":"#2a83bdff","u16":[10748,33553,48495,65535]}}, +{"factor":102,"in":"#2980b9ff","op":"darker","out":{"hex":"#287db5ff","u16":[10330,32250,46612,65535]}}, +{"factor":110,"in":"#2980b9ff","op":"lighter","out":{"hex":"#2d8dcbff","u16":[11591,36185,52299,65535]}}, +{"factor":110,"in":"#2980b9ff","op":"darker","out":{"hex":"#2574a8ff","u16":[9579,29905,43222,65535]}}, +{"factor":120,"in":"#2980b9ff","op":"lighter","out":{"hex":"#319adeff","u16":[12644,39475,57054,65535]}}, +{"factor":120,"in":"#2980b9ff","op":"darker","out":{"hex":"#226b9aff","u16":[8781,27413,39620,65535]}}, +{"factor":150,"in":"#2980b9ff","op":"lighter","out":{"hex":"#4fb9ffff","u16":[20306,47632,65535,65535]}}, +{"factor":150,"in":"#2980b9ff","op":"darker","out":{"hex":"#1b557bff","u16":[7025,21930,31696,65535]}}, +{"factor":200,"in":"#2980b9ff","op":"lighter","out":{"hex":"#acdeffff","u16":[44079,57042,65535,65535]}}, +{"factor":200,"in":"#2980b9ff","op":"darker","out":{"hex":"#14405cff","u16":[5268,16448,23772,65535]}}, +{"factor":300,"in":"#2980b9ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#2980b9ff","op":"darker","out":{"hex":"#0e2b3eff","u16":[3512,10965,15848,65535]}}, +{"factor":1000,"in":"#2980b9ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#2980b9ff","op":"darker","out":{"hex":"#040d12ff","u16":[1054,3289,4754,65535]}}, +{"factor":-10,"in":"#7f8c8dff","op":"lighter","out":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}}, +{"factor":-10,"in":"#7f8c8dff","op":"darker","out":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}}, +{"factor":0,"in":"#7f8c8dff","op":"lighter","out":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}}, +{"factor":0,"in":"#7f8c8dff","op":"darker","out":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}}, +{"factor":1,"in":"#7f8c8dff","op":"lighter","out":{"hex":"#010101ff","u16":[326,359,362,65535]}}, +{"factor":1,"in":"#7f8c8dff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#7f8c8dff","op":"lighter","out":{"hex":"#3f4646ff","u16":[16319,17989,18118,65535]}}, +{"factor":50,"in":"#7f8c8dff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#7f8c8dff","op":"lighter","out":{"hex":"#7e8b8cff","u16":[32316,35623,35878,65535]}}, +{"factor":99,"in":"#7f8c8dff","op":"darker","out":{"hex":"#808d8eff","u16":[32965,36339,36599,65535]}}, +{"factor":100,"in":"#7f8c8dff","op":"lighter","out":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}}, +{"factor":100,"in":"#7f8c8dff","op":"darker","out":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}}, +{"factor":101,"in":"#7f8c8dff","op":"lighter","out":{"hex":"#808d8eff","u16":[32965,36339,36599,65535]}}, +{"factor":101,"in":"#7f8c8dff","op":"darker","out":{"hex":"#7e8b8cff","u16":[32316,35623,35878,65535]}}, +{"factor":102,"in":"#7f8c8dff","op":"lighter","out":{"hex":"#828f90ff","u16":[33291,36699,36961,65535]}}, +{"factor":102,"in":"#7f8c8dff","op":"darker","out":{"hex":"#7d898aff","u16":[31999,35274,35526,65535]}}, +{"factor":110,"in":"#7f8c8dff","op":"lighter","out":{"hex":"#8c9a9bff","u16":[35902,39577,39860,65535]}}, +{"factor":110,"in":"#7f8c8dff","op":"darker","out":{"hex":"#737f80ff","u16":[29671,32708,32942,65535]}}, +{"factor":120,"in":"#7f8c8dff","op":"lighter","out":{"hex":"#98a8a9ff","u16":[39166,43175,43484,65535]}}, +{"factor":120,"in":"#7f8c8dff","op":"darker","out":{"hex":"#6a7575ff","u16":[27199,29983,30197,65535]}}, +{"factor":150,"in":"#7f8c8dff","op":"lighter","out":{"hex":"#bed2d3ff","u16":[48958,53969,54355,65535]}}, +{"factor":150,"in":"#7f8c8dff","op":"darker","out":{"hex":"#555d5eff","u16":[21759,23986,24158,65535]}}, +{"factor":200,"in":"#7f8c8dff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#7f8c8dff","op":"darker","out":{"hex":"#3f4646ff","u16":[16319,17989,18118,65535]}}, +{"factor":300,"in":"#7f8c8dff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#7f8c8dff","op":"darker","out":{"hex":"#2a2f2fff","u16":[10880,11993,12079,65535]}}, +{"factor":1000,"in":"#7f8c8dff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#7f8c8dff","op":"darker","out":{"hex":"#0d0e0eff","u16":[3263,3597,3623,65535]}}, +{"factor":-10,"in":"#9b59b6ff","op":"lighter","out":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}}, +{"factor":-10,"in":"#9b59b6ff","op":"darker","out":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}}, +{"factor":0,"in":"#9b59b6ff","op":"lighter","out":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}}, +{"factor":0,"in":"#9b59b6ff","op":"darker","out":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}}, +{"factor":1,"in":"#9b59b6ff","op":"lighter","out":{"hex":"#020102ff","u16":[398,228,467,65535]}}, +{"factor":1,"in":"#9b59b6ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#9b59b6ff","op":"lighter","out":{"hex":"#4d2c5bff","u16":[19917,11436,23387,65535]}}, +{"factor":50,"in":"#9b59b6ff","op":"darker","out":{"hex":"#f9eaffff","u16":[63945,60060,65535,65535]}}, +{"factor":99,"in":"#9b59b6ff","op":"lighter","out":{"hex":"#9958b4ff","u16":[39440,22646,46310,65535]}}, +{"factor":99,"in":"#9b59b6ff","op":"darker","out":{"hex":"#9d5ab8ff","u16":[40232,23101,47241,65535]}}, +{"factor":100,"in":"#9b59b6ff","op":"lighter","out":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}}, +{"factor":100,"in":"#9b59b6ff","op":"darker","out":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}}, +{"factor":101,"in":"#9b59b6ff","op":"lighter","out":{"hex":"#9d5ab8ff","u16":[40232,23101,47241,65535]}}, +{"factor":101,"in":"#9b59b6ff","op":"darker","out":{"hex":"#9958b4ff","u16":[39440,22646,46310,65535]}}, +{"factor":102,"in":"#9b59b6ff","op":"lighter","out":{"hex":"#9e5bbaff","u16":[40631,23330,47709,65535]}}, +{"factor":102,"in":"#9b59b6ff","op":"darker","out":{"hex":"#9857b2ff","u16":[39053,22424,45856,65535]}}, +{"factor":110,"in":"#9b59b6ff","op":"lighter","out":{"hex":"#aa62c8ff","u16":[43818,25160,51451,65535]}}, +{"factor":110,"in":"#9b59b6ff","op":"darker","out":{"hex":"#8d51a5ff","u16":[36213,20793,42521,65535]}}, +{"factor":120,"in":"#9b59b6ff","op":"lighter","out":{"hex":"#ba6bdaff","u16":[47801,27447,56128,65535]}}, +{"factor":120,"in":"#9b59b6ff","op":"darker","out":{"hex":"#814a98ff","u16":[33195,19060,38978,65535]}}, +{"factor":150,"in":"#9b59b6ff","op":"lighter","out":{"hex":"#de8fffff","u16":[57155,36673,65535,65535]}}, +{"factor":150,"in":"#9b59b6ff","op":"darker","out":{"hex":"#673b79ff","u16":[26556,15248,31182,65535]}}, +{"factor":200,"in":"#9b59b6ff","op":"lighter","out":{"hex":"#f9eaffff","u16":[63945,60060,65535,65535]}}, +{"factor":200,"in":"#9b59b6ff","op":"darker","out":{"hex":"#4d2c5bff","u16":[19917,11436,23387,65535]}}, +{"factor":300,"in":"#9b59b6ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#9b59b6ff","op":"darker","out":{"hex":"#341e3dff","u16":[13278,7624,15591,65535]}}, +{"factor":1000,"in":"#9b59b6ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#9b59b6ff","op":"darker","out":{"hex":"#0f0912ff","u16":[3983,2287,4677,65535]}}, +{"factor":-10,"in":"#1d99f3ff","op":"lighter","out":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]}}, +{"factor":-10,"in":"#1d99f3ff","op":"darker","out":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]}}, +{"factor":0,"in":"#1d99f3ff","op":"lighter","out":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]}}, +{"factor":0,"in":"#1d99f3ff","op":"darker","out":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]}}, +{"factor":1,"in":"#1d99f3ff","op":"lighter","out":{"hex":"#000202ff","u16":[74,393,624,65535]}}, +{"factor":1,"in":"#1d99f3ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#1d99f3ff","op":"lighter","out":{"hex":"#0e4d79ff","u16":[3726,19662,31225,65535]}}, +{"factor":50,"in":"#1d99f3ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#1d99f3ff","op":"lighter","out":{"hex":"#1d97f1ff","u16":[7379,38935,61832,65535]}}, +{"factor":99,"in":"#1d99f3ff","op":"darker","out":{"hex":"#1d9bf5ff","u16":[7527,39717,63075,65535]}}, +{"factor":100,"in":"#1d99f3ff","op":"lighter","out":{"hex":"#1d99f3ff","u16":[7453,39324,62451,65535]}}, +{"factor":100,"in":"#1d99f3ff","op":"darker","out":{"hex":"#1d99f3ff","u16":[7453,39324,62451,65535]}}, +{"factor":101,"in":"#1d99f3ff","op":"lighter","out":{"hex":"#1d9bf5ff","u16":[7527,39717,63075,65535]}}, +{"factor":101,"in":"#1d99f3ff","op":"darker","out":{"hex":"#1d97f1ff","u16":[7379,38935,61832,65535]}}, +{"factor":102,"in":"#1d99f3ff","op":"lighter","out":{"hex":"#1e9cf8ff","u16":[7602,40111,63700,65535]}}, +{"factor":102,"in":"#1d99f3ff","op":"darker","out":{"hex":"#1c96eeff","u16":[7307,38553,61226,65535]}}, +{"factor":110,"in":"#1d99f3ff","op":"lighter","out":{"hex":"#2ba6ffff","u16":[10982,42595,65535,65535]}}, +{"factor":110,"in":"#1d99f3ff","op":"darker","out":{"hex":"#1a8bddff","u16":[6775,35749,56773,65535]}}, +{"factor":120,"in":"#1d99f3ff","op":"lighter","out":{"hex":"#43b0ffff","u16":[17227,45221,65535,65535]}}, +{"factor":120,"in":"#1d99f3ff","op":"darker","out":{"hex":"#1880caff","u16":[6211,32770,52042,65535]}}, +{"factor":150,"in":"#1d99f3ff","op":"lighter","out":{"hex":"#8ccfffff","u16":[35962,53100,65535,65535]}}, +{"factor":150,"in":"#1d99f3ff","op":"darker","out":{"hex":"#1366a2ff","u16":[4969,26216,41634,65535]}}, +{"factor":200,"in":"#1d99f3ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#1d99f3ff","op":"darker","out":{"hex":"#0e4d79ff","u16":[3726,19662,31225,65535]}}, +{"factor":300,"in":"#1d99f3ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#1d99f3ff","op":"darker","out":{"hex":"#0a3351ff","u16":[2484,13108,20817,65535]}}, +{"factor":1000,"in":"#1d99f3ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#1d99f3ff","op":"darker","out":{"hex":"#030f18ff","u16":[745,3932,6245,65535]}}, +{"factor":-10,"in":"#dee0e2ff","op":"lighter","out":{"hex":"#dee0e2ff","u16":[57054,57568,58082,65535]}}, +{"factor":-10,"in":"#dee0e2ff","op":"darker","out":{"hex":"#dee0e2ff","u16":[57054,57568,58082,65535]}}, +{"factor":0,"in":"#dee0e2ff","op":"lighter","out":{"hex":"#dee0e2ff","u16":[57054,57568,58082,65535]}}, +{"factor":0,"in":"#dee0e2ff","op":"darker","out":{"hex":"#dee0e2ff","u16":[57054,57568,58082,65535]}}, +{"factor":1,"in":"#dee0e2ff","op":"lighter","out":{"hex":"#020202ff","u16":[570,575,580,65535]}}, +{"factor":1,"in":"#dee0e2ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#dee0e2ff","op":"lighter","out":{"hex":"#6f7071ff","u16":[28527,28784,29041,65535]}}, +{"factor":50,"in":"#dee0e2ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#dee0e2ff","op":"lighter","out":{"hex":"#dcdee0ff","u16":[56488,56997,57506,65535]}}, +{"factor":99,"in":"#dee0e2ff","op":"darker","out":{"hex":"#e0e2e4ff","u16":[57624,58143,58662,65535]}}, +{"factor":100,"in":"#dee0e2ff","op":"lighter","out":{"hex":"#dee0e2ff","u16":[57054,57568,58082,65535]}}, +{"factor":100,"in":"#dee0e2ff","op":"darker","out":{"hex":"#dee0e2ff","u16":[57054,57568,58082,65535]}}, +{"factor":101,"in":"#dee0e2ff","op":"lighter","out":{"hex":"#e0e2e4ff","u16":[57624,58143,58662,65535]}}, +{"factor":101,"in":"#dee0e2ff","op":"darker","out":{"hex":"#dcdee0ff","u16":[56488,56997,57506,65535]}}, +{"factor":102,"in":"#dee0e2ff","op":"lighter","out":{"hex":"#e2e4e7ff","u16":[58194,58719,59243,65535]}}, +{"factor":102,"in":"#dee0e2ff","op":"darker","out":{"hex":"#dadcdeff","u16":[55935,56439,56943,65535]}}, +{"factor":110,"in":"#dee0e2ff","op":"lighter","out":{"hex":"#f4f6f9ff","u16":[62759,63325,63890,65535]}}, +{"factor":110,"in":"#dee0e2ff","op":"darker","out":{"hex":"#cacccdff","u16":[51866,52334,52801,65535]}}, +{"factor":120,"in":"#dee0e2ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":120,"in":"#dee0e2ff","op":"darker","out":{"hex":"#b9bbbcff","u16":[47544,47973,48401,65535]}}, +{"factor":150,"in":"#dee0e2ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":150,"in":"#dee0e2ff","op":"darker","out":{"hex":"#949597ff","u16":[38036,38378,38721,65535]}}, +{"factor":200,"in":"#dee0e2ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#dee0e2ff","op":"darker","out":{"hex":"#6f7071ff","u16":[28527,28784,29041,65535]}}, +{"factor":300,"in":"#dee0e2ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#dee0e2ff","op":"darker","out":{"hex":"#4a4b4bff","u16":[19017,19189,19360,65535]}}, +{"factor":1000,"in":"#dee0e2ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#dee0e2ff","op":"darker","out":{"hex":"#161617ff","u16":[5705,5757,5808,65535]}}, +{"factor":-10,"in":"#292c30ff","op":"lighter","out":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]}}, +{"factor":-10,"in":"#292c30ff","op":"darker","out":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]}}, +{"factor":0,"in":"#292c30ff","op":"lighter","out":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]}}, +{"factor":0,"in":"#292c30ff","op":"darker","out":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]}}, +{"factor":1,"in":"#292c30ff","op":"lighter","out":{"hex":"#000000ff","u16":[105,113,123,65535]}}, +{"factor":1,"in":"#292c30ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#292c30ff","op":"lighter","out":{"hex":"#151618ff","u16":[5269,5654,6168,65535]}}, +{"factor":50,"in":"#292c30ff","op":"darker","out":{"hex":"#525860ff","u16":[21074,22616,24672,65535]}}, +{"factor":99,"in":"#292c30ff","op":"lighter","out":{"hex":"#292c30ff","u16":[10432,11195,12213,65535]}}, +{"factor":99,"in":"#292c30ff","op":"darker","out":{"hex":"#292c30ff","u16":[10642,11421,12459,65535]}}, +{"factor":100,"in":"#292c30ff","op":"lighter","out":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]}}, +{"factor":100,"in":"#292c30ff","op":"darker","out":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]}}, +{"factor":101,"in":"#292c30ff","op":"lighter","out":{"hex":"#292c30ff","u16":[10642,11421,12459,65535]}}, +{"factor":101,"in":"#292c30ff","op":"darker","out":{"hex":"#292c30ff","u16":[10432,11195,12213,65535]}}, +{"factor":102,"in":"#292c30ff","op":"lighter","out":{"hex":"#2a2d31ff","u16":[10747,11533,12582,65535]}}, +{"factor":102,"in":"#292c30ff","op":"darker","out":{"hex":"#282b2fff","u16":[10330,11086,12094,65535]}}, +{"factor":110,"in":"#292c30ff","op":"lighter","out":{"hex":"#2d3035ff","u16":[11590,12438,13569,65535]}}, +{"factor":110,"in":"#292c30ff","op":"darker","out":{"hex":"#25282cff","u16":[9579,10279,11214,65535]}}, +{"factor":120,"in":"#292c30ff","op":"lighter","out":{"hex":"#31353aff","u16":[12644,13569,14803,65535]}}, +{"factor":120,"in":"#292c30ff","op":"darker","out":{"hex":"#222528ff","u16":[8781,9423,10280,65535]}}, +{"factor":150,"in":"#292c30ff","op":"lighter","out":{"hex":"#3e4248ff","u16":[15806,16962,18504,65535]}}, +{"factor":150,"in":"#292c30ff","op":"darker","out":{"hex":"#1b1d20ff","u16":[7025,7539,8224,65535]}}, +{"factor":200,"in":"#292c30ff","op":"lighter","out":{"hex":"#525860ff","u16":[21074,22616,24672,65535]}}, +{"factor":200,"in":"#292c30ff","op":"darker","out":{"hex":"#151618ff","u16":[5269,5654,6168,65535]}}, +{"factor":300,"in":"#292c30ff","op":"lighter","out":{"hex":"#7b8490ff","u16":[31611,33924,37008,65535]}}, +{"factor":300,"in":"#292c30ff","op":"darker","out":{"hex":"#0e0f10ff","u16":[3512,3769,4112,65535]}}, +{"factor":1000,"in":"#292c30ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#292c30ff","op":"darker","out":{"hex":"#040405ff","u16":[1053,1130,1233,65535]}}, +{"factor":-10,"in":"#e93a9aff","op":"lighter","out":{"hex":"#e93a9aff","u16":[59881,14906,39578,65535]}}, +{"factor":-10,"in":"#e93a9aff","op":"darker","out":{"hex":"#e93a9aff","u16":[59881,14906,39578,65535]}}, +{"factor":0,"in":"#e93a9aff","op":"lighter","out":{"hex":"#e93a9aff","u16":[59881,14906,39578,65535]}}, +{"factor":0,"in":"#e93a9aff","op":"darker","out":{"hex":"#e93a9aff","u16":[59881,14906,39578,65535]}}, +{"factor":1,"in":"#e93a9aff","op":"lighter","out":{"hex":"#020102ff","u16":[598,149,395,65535]}}, +{"factor":1,"in":"#e93a9aff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#e93a9aff","op":"lighter","out":{"hex":"#741d4dff","u16":[29940,7453,19787,65535]}}, +{"factor":50,"in":"#e93a9aff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#e93a9aff","op":"lighter","out":{"hex":"#e73998ff","u16":[59288,14758,39183,65535]}}, +{"factor":99,"in":"#e93a9aff","op":"darker","out":{"hex":"#eb3b9cff","u16":[60479,15054,39970,65535]}}, +{"factor":100,"in":"#e93a9aff","op":"lighter","out":{"hex":"#e93a9aff","u16":[59881,14906,39575,65535]}}, +{"factor":100,"in":"#e93a9aff","op":"darker","out":{"hex":"#e93a9aff","u16":[59881,14906,39575,65535]}}, +{"factor":101,"in":"#e93a9aff","op":"lighter","out":{"hex":"#eb3b9cff","u16":[60479,15054,39970,65535]}}, +{"factor":101,"in":"#e93a9aff","op":"darker","out":{"hex":"#e73998ff","u16":[59288,14758,39183,65535]}}, +{"factor":102,"in":"#e93a9aff","op":"lighter","out":{"hex":"#ee3b9dff","u16":[61078,15204,40366,65535]}}, +{"factor":102,"in":"#e93a9aff","op":"darker","out":{"hex":"#e43997ff","u16":[58706,14613,38798,65535]}}, +{"factor":110,"in":"#e93a9aff","op":"lighter","out":{"hex":"#ff41a9ff","u16":[65535,16647,43462,65535]}}, +{"factor":110,"in":"#e93a9aff","op":"darker","out":{"hex":"#d4358cff","u16":[54437,13550,35977,65535]}}, +{"factor":120,"in":"#e93a9aff","op":"lighter","out":{"hex":"#ff58b4ff","u16":[65535,22635,46166,65535]}}, +{"factor":120,"in":"#e93a9aff","op":"darker","out":{"hex":"#c23080ff","u16":[49900,12421,32978,65535]}}, +{"factor":150,"in":"#e93a9aff","op":"lighter","out":{"hex":"#ff9ed3ff","u16":[65535,40599,54276,65535]}}, +{"factor":150,"in":"#e93a9aff","op":"darker","out":{"hex":"#9b2767ff","u16":[39920,9937,26383,65535]}}, +{"factor":200,"in":"#e93a9aff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#e93a9aff","op":"darker","out":{"hex":"#741d4dff","u16":[29940,7453,19787,65535]}}, +{"factor":300,"in":"#e93a9aff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#e93a9aff","op":"darker","out":{"hex":"#4e1333ff","u16":[19960,4968,13191,65535]}}, +{"factor":1000,"in":"#e93a9aff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#e93a9aff","op":"darker","out":{"hex":"#17060fff","u16":[5988,1491,3957,65535]}}, +{"factor":-10,"in":"#e93d58ff","op":"lighter","out":{"hex":"#e93d58ff","u16":[59881,15677,22616,65535]}}, +{"factor":-10,"in":"#e93d58ff","op":"darker","out":{"hex":"#e93d58ff","u16":[59881,15677,22616,65535]}}, +{"factor":0,"in":"#e93d58ff","op":"lighter","out":{"hex":"#e93d58ff","u16":[59881,15677,22616,65535]}}, +{"factor":0,"in":"#e93d58ff","op":"darker","out":{"hex":"#e93d58ff","u16":[59881,15677,22616,65535]}}, +{"factor":1,"in":"#e93d58ff","op":"lighter","out":{"hex":"#020101ff","u16":[598,157,226,65535]}}, +{"factor":1,"in":"#e93d58ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#e93d58ff","op":"lighter","out":{"hex":"#741e2cff","u16":[29940,7838,11308,65535]}}, +{"factor":50,"in":"#e93d58ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#e93d58ff","op":"lighter","out":{"hex":"#e73c57ff","u16":[59288,15522,22393,65535]}}, +{"factor":99,"in":"#e93d58ff","op":"darker","out":{"hex":"#eb3e59ff","u16":[60479,15833,22843,65535]}}, +{"factor":100,"in":"#e93d58ff","op":"lighter","out":{"hex":"#e93d58ff","u16":[59881,15677,22617,65535]}}, +{"factor":100,"in":"#e93d58ff","op":"darker","out":{"hex":"#e93d58ff","u16":[59881,15677,22617,65535]}}, +{"factor":101,"in":"#e93d58ff","op":"lighter","out":{"hex":"#eb3e59ff","u16":[60479,15833,22843,65535]}}, +{"factor":101,"in":"#e93d58ff","op":"darker","out":{"hex":"#e73c57ff","u16":[59288,15522,22393,65535]}}, +{"factor":102,"in":"#e93d58ff","op":"lighter","out":{"hex":"#ee3e5aff","u16":[61078,15990,23069,65535]}}, +{"factor":102,"in":"#e93d58ff","op":"darker","out":{"hex":"#e43c56ff","u16":[58706,15369,22173,65535]}}, +{"factor":110,"in":"#e93d58ff","op":"lighter","out":{"hex":"#ff4461ff","u16":[65535,17491,25034,65535]}}, +{"factor":110,"in":"#e93d58ff","op":"darker","out":{"hex":"#d43750ff","u16":[54437,14252,20561,65535]}}, +{"factor":120,"in":"#e93d58ff","op":"lighter","out":{"hex":"#ff5b75ff","u16":[65535,23479,30082,65535]}}, +{"factor":120,"in":"#e93d58ff","op":"darker","out":{"hex":"#c23349ff","u16":[49900,13064,18847,65535]}}, +{"factor":150,"in":"#e93d58ff","op":"lighter","out":{"hex":"#ffa1b0ff","u16":[65535,41443,45225,65535]}}, +{"factor":150,"in":"#e93d58ff","op":"darker","out":{"hex":"#9b293bff","u16":[39920,10451,15078,65535]}}, +{"factor":200,"in":"#e93d58ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#e93d58ff","op":"darker","out":{"hex":"#741e2cff","u16":[29940,7838,11308,65535]}}, +{"factor":300,"in":"#e93d58ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#e93d58ff","op":"darker","out":{"hex":"#4e141dff","u16":[19960,5226,7539,65535]}}, +{"factor":1000,"in":"#e93d58ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#e93d58ff","op":"darker","out":{"hex":"#170609ff","u16":[5988,1568,2262,65535]}}, +{"factor":-10,"in":"#e9643aff","op":"lighter","out":{"hex":"#e9643aff","u16":[59881,25700,14906,65535]}}, +{"factor":-10,"in":"#e9643aff","op":"darker","out":{"hex":"#e9643aff","u16":[59881,25700,14906,65535]}}, +{"factor":0,"in":"#e9643aff","op":"lighter","out":{"hex":"#e9643aff","u16":[59881,25700,14906,65535]}}, +{"factor":0,"in":"#e9643aff","op":"darker","out":{"hex":"#e9643aff","u16":[59881,25700,14906,65535]}}, +{"factor":1,"in":"#e9643aff","op":"lighter","out":{"hex":"#020101ff","u16":[598,257,149,65535]}}, +{"factor":1,"in":"#e9643aff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#e9643aff","op":"lighter","out":{"hex":"#74321dff","u16":[29940,12850,7453,65535]}}, +{"factor":50,"in":"#e9643aff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#e9643aff","op":"lighter","out":{"hex":"#e76339ff","u16":[59288,25445,14758,65535]}}, +{"factor":99,"in":"#e9643aff","op":"darker","out":{"hex":"#eb653bff","u16":[60479,25956,15054,65535]}}, +{"factor":100,"in":"#e9643aff","op":"lighter","out":{"hex":"#e9643aff","u16":[59881,25700,14906,65535]}}, +{"factor":100,"in":"#e9643aff","op":"darker","out":{"hex":"#e9643aff","u16":[59881,25700,14906,65535]}}, +{"factor":101,"in":"#e9643aff","op":"lighter","out":{"hex":"#eb653bff","u16":[60479,25956,15054,65535]}}, +{"factor":101,"in":"#e9643aff","op":"darker","out":{"hex":"#e76339ff","u16":[59288,25445,14758,65535]}}, +{"factor":102,"in":"#e9643aff","op":"lighter","out":{"hex":"#ee663bff","u16":[61078,26213,15204,65535]}}, +{"factor":102,"in":"#e9643aff","op":"darker","out":{"hex":"#e46239ff","u16":[58706,25195,14613,65535]}}, +{"factor":110,"in":"#e9643aff","op":"lighter","out":{"hex":"#ff6e41ff","u16":[65535,28380,16647,65535]}}, +{"factor":110,"in":"#e9643aff","op":"darker","out":{"hex":"#d45b35ff","u16":[54437,23363,13550,65535]}}, +{"factor":120,"in":"#e9643aff","op":"lighter","out":{"hex":"#ff8058ff","u16":[65535,32931,22635,65535]}}, +{"factor":120,"in":"#e9643aff","op":"darker","out":{"hex":"#c25330ff","u16":[49900,21416,12421,65535]}}, +{"factor":150,"in":"#e9643aff","op":"lighter","out":{"hex":"#ffb59eff","u16":[65535,46584,40599,65535]}}, +{"factor":150,"in":"#e9643aff","op":"darker","out":{"hex":"#9b4327ff","u16":[39920,17133,9937,65535]}}, +{"factor":200,"in":"#e9643aff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#e9643aff","op":"darker","out":{"hex":"#74321dff","u16":[29940,12850,7453,65535]}}, +{"factor":300,"in":"#e9643aff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#e9643aff","op":"darker","out":{"hex":"#4e2113ff","u16":[19960,8566,4968,65535]}}, +{"factor":1000,"in":"#e9643aff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#e9643aff","op":"darker","out":{"hex":"#170a06ff","u16":[5988,2570,1491,65535]}}, +{"factor":-10,"in":"#e8cb2dff","op":"lighter","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"factor":-10,"in":"#e8cb2dff","op":"darker","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"factor":0,"in":"#e8cb2dff","op":"lighter","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"factor":0,"in":"#e8cb2dff","op":"darker","out":{"hex":"#e8cb2dff","u16":[59624,52171,11565,65535]}}, +{"factor":1,"in":"#e8cb2dff","op":"lighter","out":{"hex":"#020200ff","u16":[596,522,116,65535]}}, +{"factor":1,"in":"#e8cb2dff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#e8cb2dff","op":"lighter","out":{"hex":"#746617ff","u16":[29812,26087,5783,65535]}}, +{"factor":50,"in":"#e8cb2dff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#e8cb2dff","op":"lighter","out":{"hex":"#e6c92dff","u16":[59033,51658,11451,65535]}}, +{"factor":99,"in":"#e8cb2dff","op":"darker","out":{"hex":"#eacd2dff","u16":[60220,52696,11681,65535]}}, +{"factor":100,"in":"#e8cb2dff","op":"lighter","out":{"hex":"#e8cb2dff","u16":[59624,52175,11565,65535]}}, +{"factor":100,"in":"#e8cb2dff","op":"darker","out":{"hex":"#e8cb2dff","u16":[59624,52175,11565,65535]}}, +{"factor":101,"in":"#e8cb2dff","op":"lighter","out":{"hex":"#eacd2dff","u16":[60220,52696,11681,65535]}}, +{"factor":101,"in":"#e8cb2dff","op":"darker","out":{"hex":"#e6c92dff","u16":[59033,51658,11451,65535]}}, +{"factor":102,"in":"#e8cb2dff","op":"lighter","out":{"hex":"#edcf2eff","u16":[60816,53218,11797,65535]}}, +{"factor":102,"in":"#e8cb2dff","op":"darker","out":{"hex":"#e3c72cff","u16":[58454,51151,11338,65535]}}, +{"factor":110,"in":"#e8cb2dff","op":"lighter","out":{"hex":"#ffdf32ff","u16":[65535,57355,12763,65535]}}, +{"factor":110,"in":"#e8cb2dff","op":"darker","out":{"hex":"#d3b929ff","u16":[54203,47431,10514,65535]}}, +{"factor":120,"in":"#e8cb2dff","op":"lighter","out":{"hex":"#ffe349ff","u16":[65535,58279,18725,65535]}}, +{"factor":120,"in":"#e8cb2dff","op":"darker","out":{"hex":"#c1a926ff","u16":[49686,43479,9638,65535]}}, +{"factor":150,"in":"#e8cb2dff","op":"lighter","out":{"hex":"#ffee8eff","u16":[65535,61052,36613,65535]}}, +{"factor":150,"in":"#e8cb2dff","op":"darker","out":{"hex":"#9b871eff","u16":[39749,34783,7710,65535]}}, +{"factor":200,"in":"#e8cb2dff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#e8cb2dff","op":"darker","out":{"hex":"#746617ff","u16":[29812,26087,5783,65535]}}, +{"factor":300,"in":"#e8cb2dff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#e8cb2dff","op":"darker","out":{"hex":"#4d440fff","u16":[19874,17391,3855,65535]}}, +{"factor":1000,"in":"#e8cb2dff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#e8cb2dff","op":"darker","out":{"hex":"#171404ff","u16":[5962,5217,1156,65535]}}, +{"factor":-10,"in":"#3dd425ff","op":"lighter","out":{"hex":"#3dd425ff","u16":[15677,54484,9509,65535]}}, +{"factor":-10,"in":"#3dd425ff","op":"darker","out":{"hex":"#3dd425ff","u16":[15677,54484,9509,65535]}}, +{"factor":0,"in":"#3dd425ff","op":"lighter","out":{"hex":"#3dd425ff","u16":[15677,54484,9509,65535]}}, +{"factor":0,"in":"#3dd425ff","op":"darker","out":{"hex":"#3dd425ff","u16":[15677,54484,9509,65535]}}, +{"factor":1,"in":"#3dd425ff","op":"lighter","out":{"hex":"#010200ff","u16":[157,544,95,65535]}}, +{"factor":1,"in":"#3dd425ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#3dd425ff","op":"lighter","out":{"hex":"#1f6a13ff","u16":[7839,27242,4755,65535]}}, +{"factor":50,"in":"#3dd425ff","op":"darker","out":{"hex":"#dbffd6ff","u16":[56334,65535,54871,65535]}}, +{"factor":99,"in":"#3dd425ff","op":"lighter","out":{"hex":"#3cd225ff","u16":[15523,53944,9415,65535]}}, +{"factor":99,"in":"#3dd425ff","op":"darker","out":{"hex":"#3ed625ff","u16":[15835,55028,9604,65535]}}, +{"factor":100,"in":"#3dd425ff","op":"lighter","out":{"hex":"#3dd425ff","u16":[15678,54484,9509,65535]}}, +{"factor":100,"in":"#3dd425ff","op":"darker","out":{"hex":"#3dd425ff","u16":[15678,54484,9509,65535]}}, +{"factor":101,"in":"#3dd425ff","op":"lighter","out":{"hex":"#3ed625ff","u16":[15835,55028,9604,65535]}}, +{"factor":101,"in":"#3dd425ff","op":"darker","out":{"hex":"#3cd225ff","u16":[15523,53944,9415,65535]}}, +{"factor":102,"in":"#3dd425ff","op":"lighter","out":{"hex":"#3ed826ff","u16":[15992,55573,9699,65535]}}, +{"factor":102,"in":"#3dd425ff","op":"darker","out":{"hex":"#3cd024ff","u16":[15371,53415,9323,65535]}}, +{"factor":110,"in":"#3dd425ff","op":"lighter","out":{"hex":"#43e929ff","u16":[17246,59932,10460,65535]}}, +{"factor":110,"in":"#3dd425ff","op":"darker","out":{"hex":"#37c122ff","u16":[14253,49530,8645,65535]}}, +{"factor":120,"in":"#3dd425ff","op":"lighter","out":{"hex":"#49fe2cff","u16":[18814,65380,11411,65535]}}, +{"factor":120,"in":"#3dd425ff","op":"darker","out":{"hex":"#33b11fff","u16":[13065,45403,7924,65535]}}, +{"factor":150,"in":"#3dd425ff","op":"lighter","out":{"hex":"#80ff6cff","u16":[32828,65535,27629,65535]}}, +{"factor":150,"in":"#3dd425ff","op":"darker","out":{"hex":"#298d19ff","u16":[10452,36322,6339,65535]}}, +{"factor":200,"in":"#3dd425ff","op":"lighter","out":{"hex":"#dbffd6ff","u16":[56334,65535,54871,65535]}}, +{"factor":200,"in":"#3dd425ff","op":"darker","out":{"hex":"#1f6a13ff","u16":[7839,27242,4755,65535]}}, +{"factor":300,"in":"#3dd425ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#3dd425ff","op":"darker","out":{"hex":"#14470cff","u16":[5226,18161,3170,65535]}}, +{"factor":1000,"in":"#3dd425ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#3dd425ff","op":"darker","out":{"hex":"#061504ff","u16":[1568,5448,951,65535]}}, +{"factor":-10,"in":"#00d3b8ff","op":"lighter","out":{"hex":"#00d3b8ff","u16":[0,54227,47288,65535]}}, +{"factor":-10,"in":"#00d3b8ff","op":"darker","out":{"hex":"#00d3b8ff","u16":[0,54227,47288,65535]}}, +{"factor":0,"in":"#00d3b8ff","op":"lighter","out":{"hex":"#00d3b8ff","u16":[0,54227,47288,65535]}}, +{"factor":0,"in":"#00d3b8ff","op":"darker","out":{"hex":"#00d3b8ff","u16":[0,54227,47288,65535]}}, +{"factor":1,"in":"#00d3b8ff","op":"lighter","out":{"hex":"#000202ff","u16":[0,542,473,65535]}}, +{"factor":1,"in":"#00d3b8ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#00d3b8ff","op":"lighter","out":{"hex":"#00695cff","u16":[0,27113,23643,65535]}}, +{"factor":50,"in":"#00d3b8ff","op":"darker","out":{"hex":"#a7fff4ff","u16":[42919,65535,62640,65535]}}, +{"factor":99,"in":"#00d3b8ff","op":"lighter","out":{"hex":"#00d1b6ff","u16":[0,53690,46818,65535]}}, +{"factor":99,"in":"#00d3b8ff","op":"darker","out":{"hex":"#00d5baff","u16":[0,54769,47759,65535]}}, +{"factor":100,"in":"#00d3b8ff","op":"lighter","out":{"hex":"#00d3b8ff","u16":[0,54227,47286,65535]}}, +{"factor":100,"in":"#00d3b8ff","op":"darker","out":{"hex":"#00d3b8ff","u16":[0,54227,47286,65535]}}, +{"factor":101,"in":"#00d3b8ff","op":"lighter","out":{"hex":"#00d5baff","u16":[0,54769,47759,65535]}}, +{"factor":101,"in":"#00d3b8ff","op":"darker","out":{"hex":"#00d1b6ff","u16":[0,53690,46818,65535]}}, +{"factor":102,"in":"#00d3b8ff","op":"lighter","out":{"hex":"#00d7bcff","u16":[0,55311,48231,65535]}}, +{"factor":102,"in":"#00d3b8ff","op":"darker","out":{"hex":"#00cfb4ff","u16":[0,53163,46358,65535]}}, +{"factor":110,"in":"#00d3b8ff","op":"lighter","out":{"hex":"#00e8caff","u16":[0,59649,52014,65535]}}, +{"factor":110,"in":"#00d3b8ff","op":"darker","out":{"hex":"#00c0a7ff","u16":[0,49297,42987,65535]}}, +{"factor":120,"in":"#00d3b8ff","op":"lighter","out":{"hex":"#00fdddff","u16":[0,65072,56743,65535]}}, +{"factor":120,"in":"#00d3b8ff","op":"darker","out":{"hex":"#00b099ff","u16":[0,45189,39405,65535]}}, +{"factor":150,"in":"#00d3b8ff","op":"lighter","out":{"hex":"#3dffe6ff","u16":[15805,65535,59170,65535]}}, +{"factor":150,"in":"#00d3b8ff","op":"darker","out":{"hex":"#008d7bff","u16":[0,36151,31524,65535]}}, +{"factor":200,"in":"#00d3b8ff","op":"lighter","out":{"hex":"#a7fff4ff","u16":[42919,65535,62640,65535]}}, +{"factor":200,"in":"#00d3b8ff","op":"darker","out":{"hex":"#00695cff","u16":[0,27113,23643,65535]}}, +{"factor":300,"in":"#00d3b8ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#00d3b8ff","op":"darker","out":{"hex":"#00463dff","u16":[0,18075,15761,65535]}}, +{"factor":1000,"in":"#00d3b8ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#00d3b8ff","op":"darker","out":{"hex":"#001512ff","u16":[0,5422,4728,65535]}}, +{"factor":-10,"in":"#b875dcff","op":"lighter","out":{"hex":"#b875dcff","u16":[47288,30069,56540,65535]}}, +{"factor":-10,"in":"#b875dcff","op":"darker","out":{"hex":"#b875dcff","u16":[47288,30069,56540,65535]}}, +{"factor":0,"in":"#b875dcff","op":"lighter","out":{"hex":"#b875dcff","u16":[47288,30069,56540,65535]}}, +{"factor":0,"in":"#b875dcff","op":"darker","out":{"hex":"#b875dcff","u16":[47288,30069,56540,65535]}}, +{"factor":1,"in":"#b875dcff","op":"lighter","out":{"hex":"#020102ff","u16":[473,300,565,65535]}}, +{"factor":1,"in":"#b875dcff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#b875dcff","op":"lighter","out":{"hex":"#5c3b6eff","u16":[23644,15035,28270,65535]}}, +{"factor":50,"in":"#b875dcff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#b875dcff","op":"lighter","out":{"hex":"#b674daff","u16":[46820,29771,55980,65535]}}, +{"factor":99,"in":"#b875dcff","op":"darker","out":{"hex":"#ba76deff","u16":[47761,30370,57105,65535]}}, +{"factor":100,"in":"#b875dcff","op":"lighter","out":{"hex":"#b875dcff","u16":[47288,30069,56540,65535]}}, +{"factor":100,"in":"#b875dcff","op":"darker","out":{"hex":"#b875dcff","u16":[47288,30069,56540,65535]}}, +{"factor":101,"in":"#b875dcff","op":"lighter","out":{"hex":"#ba76deff","u16":[47761,30370,57105,65535]}}, +{"factor":101,"in":"#b875dcff","op":"darker","out":{"hex":"#b674daff","u16":[46820,29771,55980,65535]}}, +{"factor":102,"in":"#b875dcff","op":"lighter","out":{"hex":"#bc77e0ff","u16":[48234,30670,57670,65535]}}, +{"factor":102,"in":"#b875dcff","op":"darker","out":{"hex":"#b473d8ff","u16":[46361,29479,55431,65535]}}, +{"factor":110,"in":"#b875dcff","op":"lighter","out":{"hex":"#ca81f2ff","u16":[52017,33076,62194,65535]}}, +{"factor":110,"in":"#b875dcff","op":"darker","out":{"hex":"#a76ac8ff","u16":[42990,27336,51400,65535]}}, +{"factor":120,"in":"#b875dcff","op":"lighter","out":{"hex":"#d891ffff","u16":[55620,37166,65535,65535]}}, +{"factor":120,"in":"#b875dcff","op":"darker","out":{"hex":"#9961b7ff","u16":[39407,25057,47116,65535]}}, +{"factor":150,"in":"#b875dcff","op":"lighter","out":{"hex":"#efd3ffff","u16":[61548,54128,65535,65535]}}, +{"factor":150,"in":"#b875dcff","op":"darker","out":{"hex":"#7b4e93ff","u16":[31525,20046,37693,65535]}}, +{"factor":200,"in":"#b875dcff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#b875dcff","op":"darker","out":{"hex":"#5c3b6eff","u16":[23644,15035,28270,65535]}}, +{"factor":300,"in":"#b875dcff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#b875dcff","op":"darker","out":{"hex":"#3d2749ff","u16":[15762,10023,18846,65535]}}, +{"factor":1000,"in":"#b875dcff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#b875dcff","op":"darker","out":{"hex":"#120c16ff","u16":[4729,3007,5654,65535]}}, +{"factor":-10,"in":"#926ee4ff","op":"lighter","out":{"hex":"#926ee4ff","u16":[37522,28270,58596,65535]}}, +{"factor":-10,"in":"#926ee4ff","op":"darker","out":{"hex":"#926ee4ff","u16":[37522,28270,58596,65535]}}, +{"factor":0,"in":"#926ee4ff","op":"lighter","out":{"hex":"#926ee4ff","u16":[37522,28270,58596,65535]}}, +{"factor":0,"in":"#926ee4ff","op":"darker","out":{"hex":"#926ee4ff","u16":[37522,28270,58596,65535]}}, +{"factor":1,"in":"#926ee4ff","op":"lighter","out":{"hex":"#010102ff","u16":[375,282,585,65535]}}, +{"factor":1,"in":"#926ee4ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#926ee4ff","op":"lighter","out":{"hex":"#493772ff","u16":[18762,14135,29298,65535]}}, +{"factor":50,"in":"#926ee4ff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":99,"in":"#926ee4ff","op":"lighter","out":{"hex":"#916de2ff","u16":[37153,27990,58015,65535]}}, +{"factor":99,"in":"#926ee4ff","op":"darker","out":{"hex":"#936fe6ff","u16":[37899,28552,59181,65535]}}, +{"factor":100,"in":"#926ee4ff","op":"lighter","out":{"hex":"#926ee4ff","u16":[37525,28270,58596,65535]}}, +{"factor":100,"in":"#926ee4ff","op":"darker","out":{"hex":"#926ee4ff","u16":[37525,28270,58596,65535]}}, +{"factor":101,"in":"#926ee4ff","op":"lighter","out":{"hex":"#936fe6ff","u16":[37899,28552,59181,65535]}}, +{"factor":101,"in":"#926ee4ff","op":"darker","out":{"hex":"#916de2ff","u16":[37153,27990,58015,65535]}}, +{"factor":102,"in":"#926ee4ff","op":"lighter","out":{"hex":"#9570e9ff","u16":[38275,28835,59767,65535]}}, +{"factor":102,"in":"#926ee4ff","op":"darker","out":{"hex":"#8f6ce0ff","u16":[36789,27716,57447,65535]}}, +{"factor":110,"in":"#926ee4ff","op":"lighter","out":{"hex":"#a179fbff","u16":[41277,31097,64455,65535]}}, +{"factor":110,"in":"#926ee4ff","op":"darker","out":{"hex":"#8564cfff","u16":[34113,25700,53269,65535]}}, +{"factor":120,"in":"#926ee4ff","op":"lighter","out":{"hex":"#b08effff","u16":[45290,36398,65535,65535]}}, +{"factor":120,"in":"#926ee4ff","op":"darker","out":{"hex":"#7a5cbeff","u16":[31271,23559,48830,65535]}}, +{"factor":150,"in":"#926ee4ff","op":"lighter","out":{"hex":"#e0d2ffff","u16":[57504,53977,65535,65535]}}, +{"factor":150,"in":"#926ee4ff","op":"darker","out":{"hex":"#614998ff","u16":[25016,18847,39064,65535]}}, +{"factor":200,"in":"#926ee4ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":200,"in":"#926ee4ff","op":"darker","out":{"hex":"#493772ff","u16":[18762,14135,29298,65535]}}, +{"factor":300,"in":"#926ee4ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#926ee4ff","op":"darker","out":{"hex":"#31254cff","u16":[12508,9423,19532,65535]}}, +{"factor":1000,"in":"#926ee4ff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#926ee4ff","op":"darker","out":{"hex":"#0f0b17ff","u16":[3752,2827,5859,65535]}}, +{"factor":-10,"in":"#686b6fff","op":"lighter","out":{"hex":"#686b6fff","u16":[26728,27499,28527,65535]}}, +{"factor":-10,"in":"#686b6fff","op":"darker","out":{"hex":"#686b6fff","u16":[26728,27499,28527,65535]}}, +{"factor":0,"in":"#686b6fff","op":"lighter","out":{"hex":"#686b6fff","u16":[26728,27499,28527,65535]}}, +{"factor":0,"in":"#686b6fff","op":"darker","out":{"hex":"#686b6fff","u16":[26728,27499,28527,65535]}}, +{"factor":1,"in":"#686b6fff","op":"lighter","out":{"hex":"#010101ff","u16":[267,275,285,65535]}}, +{"factor":1,"in":"#686b6fff","op":"darker","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":50,"in":"#686b6fff","op":"lighter","out":{"hex":"#343537ff","u16":[13363,13749,14263,65535]}}, +{"factor":50,"in":"#686b6fff","op":"darker","out":{"hex":"#d0d6deff","u16":[53456,54998,57054,65535]}}, +{"factor":99,"in":"#686b6fff","op":"lighter","out":{"hex":"#676a6eff","u16":[26463,27226,28244,65535]}}, +{"factor":99,"in":"#686b6fff","op":"darker","out":{"hex":"#696c70ff","u16":[26995,27774,28812,65535]}}, +{"factor":100,"in":"#686b6fff","op":"lighter","out":{"hex":"#686b6fff","u16":[26728,27499,28527,65535]}}, +{"factor":100,"in":"#686b6fff","op":"darker","out":{"hex":"#686b6fff","u16":[26728,27499,28527,65535]}}, +{"factor":101,"in":"#686b6fff","op":"lighter","out":{"hex":"#696c70ff","u16":[26995,27774,28812,65535]}}, +{"factor":101,"in":"#686b6fff","op":"darker","out":{"hex":"#676a6eff","u16":[26463,27226,28244,65535]}}, +{"factor":102,"in":"#686b6fff","op":"lighter","out":{"hex":"#6a6d71ff","u16":[27262,28048,29097,65535]}}, +{"factor":102,"in":"#686b6fff","op":"darker","out":{"hex":"#66696dff","u16":[26203,26959,27967,65535]}}, +{"factor":110,"in":"#686b6fff","op":"lighter","out":{"hex":"#72767aff","u16":[29400,30248,31379,65535]}}, +{"factor":110,"in":"#686b6fff","op":"darker","out":{"hex":"#5f6165ff","u16":[24298,24998,25933,65535]}}, +{"factor":120,"in":"#686b6fff","op":"lighter","out":{"hex":"#7d8085ff","u16":[32073,32998,34232,65535]}}, +{"factor":120,"in":"#686b6fff","op":"darker","out":{"hex":"#57595cff","u16":[22273,22915,23772,65535]}}, +{"factor":150,"in":"#686b6fff","op":"lighter","out":{"hex":"#9ca0a6ff","u16":[40091,41248,42790,65535]}}, +{"factor":150,"in":"#686b6fff","op":"darker","out":{"hex":"#45474aff","u16":[17819,18333,19018,65535]}}, +{"factor":200,"in":"#686b6fff","op":"lighter","out":{"hex":"#d0d6deff","u16":[53456,54998,57054,65535]}}, +{"factor":200,"in":"#686b6fff","op":"darker","out":{"hex":"#343537ff","u16":[13363,13749,14263,65535]}}, +{"factor":300,"in":"#686b6fff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":300,"in":"#686b6fff","op":"darker","out":{"hex":"#232425ff","u16":[8909,9166,9509,65535]}}, +{"factor":1000,"in":"#686b6fff","op":"lighter","out":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"factor":1000,"in":"#686b6fff","op":"darker","out":{"hex":"#0a0b0bff","u16":[2672,2749,2852,65535]}}, +{"factor":-10,"in":"#3daee980","op":"lighter","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"factor":-10,"in":"#3daee980","op":"darker","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"factor":0,"in":"#3daee980","op":"lighter","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"factor":0,"in":"#3daee980","op":"darker","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"factor":1,"in":"#3daee980","op":"lighter","out":{"hex":"#01020280","u16":[157,447,598,32896]}}, +{"factor":1,"in":"#3daee980","op":"darker","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"factor":50,"in":"#3daee980","op":"lighter","out":{"hex":"#1e577480","u16":[7838,22359,29940,32896]}}, +{"factor":50,"in":"#3daee980","op":"darker","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"factor":99,"in":"#3daee980","op":"lighter","out":{"hex":"#3cace780","u16":[15522,44276,59288,32896]}}, +{"factor":99,"in":"#3daee980","op":"darker","out":{"hex":"#3eb0eb80","u16":[15833,45166,60479,32896]}}, +{"factor":100,"in":"#3daee980","op":"lighter","out":{"hex":"#3daee980","u16":[15677,44719,59881,32896]}}, +{"factor":100,"in":"#3daee980","op":"darker","out":{"hex":"#3daee980","u16":[15677,44719,59881,32896]}}, +{"factor":101,"in":"#3daee980","op":"lighter","out":{"hex":"#3eb0eb80","u16":[15833,45166,60479,32896]}}, +{"factor":101,"in":"#3daee980","op":"darker","out":{"hex":"#3cace780","u16":[15522,44276,59288,32896]}}, +{"factor":102,"in":"#3daee980","op":"lighter","out":{"hex":"#3eb1ee80","u16":[15990,45613,61078,32896]}}, +{"factor":102,"in":"#3daee980","op":"darker","out":{"hex":"#3cabe480","u16":[15369,43841,58706,32896]}}, +{"factor":110,"in":"#3daee980","op":"lighter","out":{"hex":"#44bfff80","u16":[17491,49056,65535,32896]}}, +{"factor":110,"in":"#3daee980","op":"darker","out":{"hex":"#379ed480","u16":[14252,40653,54437,32896]}}, +{"factor":120,"in":"#3daee980","op":"lighter","out":{"hex":"#5bc7ff80","u16":[23479,51110,65535,32896]}}, +{"factor":120,"in":"#3daee980","op":"darker","out":{"hex":"#3391c280","u16":[13064,37265,49900,32896]}}, +{"factor":150,"in":"#3daee980","op":"lighter","out":{"hex":"#a1dfff80","u16":[41443,57271,65535,32896]}}, +{"factor":150,"in":"#3daee980","op":"darker","out":{"hex":"#29749b80","u16":[10451,29812,39920,32896]}}, +{"factor":200,"in":"#3daee980","op":"lighter","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"factor":200,"in":"#3daee980","op":"darker","out":{"hex":"#1e577480","u16":[7838,22359,29940,32896]}}, +{"factor":300,"in":"#3daee980","op":"lighter","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"factor":300,"in":"#3daee980","op":"darker","out":{"hex":"#143a4e80","u16":[5226,14906,19960,32896]}}, +{"factor":1000,"in":"#3daee980","op":"lighter","out":{"hex":"#ffffff80","u16":[65535,65535,65535,32896]}}, +{"factor":1000,"in":"#3daee980","op":"darker","out":{"hex":"#06111780","u16":[1568,4472,5988,32896]}}, +{"factor":-10,"in":"#ffffff00","op":"lighter","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"factor":-10,"in":"#ffffff00","op":"darker","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"factor":0,"in":"#ffffff00","op":"lighter","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"factor":0,"in":"#ffffff00","op":"darker","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"factor":1,"in":"#ffffff00","op":"lighter","out":{"hex":"#03030300","u16":[655,655,655,0]}}, +{"factor":1,"in":"#ffffff00","op":"darker","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"factor":50,"in":"#ffffff00","op":"lighter","out":{"hex":"#7f7f7f00","u16":[32767,32767,32767,0]}}, +{"factor":50,"in":"#ffffff00","op":"darker","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"factor":99,"in":"#ffffff00","op":"lighter","out":{"hex":"#fcfcfc00","u16":[64886,64886,64886,0]}}, +{"factor":99,"in":"#ffffff00","op":"darker","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"factor":100,"in":"#ffffff00","op":"lighter","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"factor":100,"in":"#ffffff00","op":"darker","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"factor":101,"in":"#ffffff00","op":"lighter","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"factor":101,"in":"#ffffff00","op":"darker","out":{"hex":"#fcfcfc00","u16":[64886,64886,64886,0]}}, +{"factor":102,"in":"#ffffff00","op":"lighter","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"factor":102,"in":"#ffffff00","op":"darker","out":{"hex":"#fafafa00","u16":[64250,64250,64250,0]}}, +{"factor":110,"in":"#ffffff00","op":"lighter","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"factor":110,"in":"#ffffff00","op":"darker","out":{"hex":"#e8e8e800","u16":[59577,59577,59577,0]}}, +{"factor":120,"in":"#ffffff00","op":"lighter","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"factor":120,"in":"#ffffff00","op":"darker","out":{"hex":"#d4d4d400","u16":[54612,54612,54612,0]}}, +{"factor":150,"in":"#ffffff00","op":"lighter","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"factor":150,"in":"#ffffff00","op":"darker","out":{"hex":"#aaaaaa00","u16":[43690,43690,43690,0]}}, +{"factor":200,"in":"#ffffff00","op":"lighter","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"factor":200,"in":"#ffffff00","op":"darker","out":{"hex":"#7f7f7f00","u16":[32767,32767,32767,0]}}, +{"factor":300,"in":"#ffffff00","op":"lighter","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"factor":300,"in":"#ffffff00","op":"darker","out":{"hex":"#55555500","u16":[21845,21845,21845,0]}}, +{"factor":1000,"in":"#ffffff00","op":"lighter","out":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"factor":1000,"in":"#ffffff00","op":"darker","out":{"hex":"#19191900","u16":[6553,6553,6553,0]}}, +{"factor":-10,"in":"#00000080","op":"lighter","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":-10,"in":"#00000080","op":"darker","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":0,"in":"#00000080","op":"lighter","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":0,"in":"#00000080","op":"darker","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":1,"in":"#00000080","op":"lighter","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":1,"in":"#00000080","op":"darker","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":50,"in":"#00000080","op":"lighter","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":50,"in":"#00000080","op":"darker","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":99,"in":"#00000080","op":"lighter","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":99,"in":"#00000080","op":"darker","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":100,"in":"#00000080","op":"lighter","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":100,"in":"#00000080","op":"darker","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":101,"in":"#00000080","op":"lighter","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":101,"in":"#00000080","op":"darker","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":102,"in":"#00000080","op":"lighter","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":102,"in":"#00000080","op":"darker","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":110,"in":"#00000080","op":"lighter","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":110,"in":"#00000080","op":"darker","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":120,"in":"#00000080","op":"lighter","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":120,"in":"#00000080","op":"darker","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":150,"in":"#00000080","op":"lighter","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":150,"in":"#00000080","op":"darker","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":200,"in":"#00000080","op":"lighter","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":200,"in":"#00000080","op":"darker","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":300,"in":"#00000080","op":"lighter","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":300,"in":"#00000080","op":"darker","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":1000,"in":"#00000080","op":"lighter","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":1000,"in":"#00000080","op":"darker","out":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"factor":-10,"in":"#ff000033","op":"lighter","out":{"hex":"#ff000033","u16":[65535,0,0,13107]}}, +{"factor":-10,"in":"#ff000033","op":"darker","out":{"hex":"#ff000033","u16":[65535,0,0,13107]}}, +{"factor":0,"in":"#ff000033","op":"lighter","out":{"hex":"#ff000033","u16":[65535,0,0,13107]}}, +{"factor":0,"in":"#ff000033","op":"darker","out":{"hex":"#ff000033","u16":[65535,0,0,13107]}}, +{"factor":1,"in":"#ff000033","op":"lighter","out":{"hex":"#03000033","u16":[655,0,0,13107]}}, +{"factor":1,"in":"#ff000033","op":"darker","out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"factor":50,"in":"#ff000033","op":"lighter","out":{"hex":"#7f000033","u16":[32767,0,0,13107]}}, +{"factor":50,"in":"#ff000033","op":"darker","out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"factor":99,"in":"#ff000033","op":"lighter","out":{"hex":"#fc000033","u16":[64886,0,0,13107]}}, +{"factor":99,"in":"#ff000033","op":"darker","out":{"hex":"#ff030333","u16":[65535,655,655,13107]}}, +{"factor":100,"in":"#ff000033","op":"lighter","out":{"hex":"#ff000033","u16":[65535,0,0,13107]}}, +{"factor":100,"in":"#ff000033","op":"darker","out":{"hex":"#ff000033","u16":[65535,0,0,13107]}}, +{"factor":101,"in":"#ff000033","op":"lighter","out":{"hex":"#ff030333","u16":[65535,655,655,13107]}}, +{"factor":101,"in":"#ff000033","op":"darker","out":{"hex":"#fc000033","u16":[64886,0,0,13107]}}, +{"factor":102,"in":"#ff000033","op":"lighter","out":{"hex":"#ff050533","u16":[65535,1310,1310,13107]}}, +{"factor":102,"in":"#ff000033","op":"darker","out":{"hex":"#fa000033","u16":[64250,0,0,13107]}}, +{"factor":110,"in":"#ff000033","op":"lighter","out":{"hex":"#ff191933","u16":[65535,6553,6553,13107]}}, +{"factor":110,"in":"#ff000033","op":"darker","out":{"hex":"#e8000033","u16":[59577,0,0,13107]}}, +{"factor":120,"in":"#ff000033","op":"lighter","out":{"hex":"#ff333333","u16":[65535,13107,13107,13107]}}, +{"factor":120,"in":"#ff000033","op":"darker","out":{"hex":"#d4000033","u16":[54612,0,0,13107]}}, +{"factor":150,"in":"#ff000033","op":"lighter","out":{"hex":"#ff7f7f33","u16":[65535,32767,32767,13107]}}, +{"factor":150,"in":"#ff000033","op":"darker","out":{"hex":"#aa000033","u16":[43690,0,0,13107]}}, +{"factor":200,"in":"#ff000033","op":"lighter","out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"factor":200,"in":"#ff000033","op":"darker","out":{"hex":"#7f000033","u16":[32767,0,0,13107]}}, +{"factor":300,"in":"#ff000033","op":"lighter","out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"factor":300,"in":"#ff000033","op":"darker","out":{"hex":"#55000033","u16":[21845,0,0,13107]}}, +{"factor":1000,"in":"#ff000033","op":"lighter","out":{"hex":"#ffffff33","u16":[65535,65535,65535,13107]}}, +{"factor":1000,"in":"#ff000033","op":"darker","out":{"hex":"#19000033","u16":[6553,0,0,13107]}} +], +"qt_colorspace": [ +{"from_linear":{"hex":"#000000ff","u16":[0,0,0,65535]},"in":"#000000ff","to_linear":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"from_linear":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"in":"#ffffffff","to_linear":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"from_linear":{"hex":"#0d0d0dff","u16":[3266,3266,3266,65535]},"in":"#010101ff","to_linear":{"hex":"#000000ff","u16":[20,20,20,65535]}}, +{"from_linear":{"hex":"#161616ff","u16":[5567,5567,5567,65535]},"in":"#020202ff","to_linear":{"hex":"#000000ff","u16":[40,40,40,65535]}}, +{"from_linear":{"hex":"#222222ff","u16":[8638,8638,8638,65535]},"in":"#040404ff","to_linear":{"hex":"#000000ff","u16":[80,80,80,65535]}}, +{"from_linear":{"hex":"#323232ff","u16":[12737,12737,12737,65535]},"in":"#080808ff","to_linear":{"hex":"#010101ff","u16":[159,159,159,65535]}}, +{"from_linear":{"hex":"#474747ff","u16":[18209,18209,18209,65535]},"in":"#101010ff","to_linear":{"hex":"#010101ff","u16":[340,340,340,65535]}}, +{"from_linear":{"hex":"#636363ff","u16":[25513,25513,25513,65535]},"in":"#202020ff","to_linear":{"hex":"#040404ff","u16":[947,947,947,65535]}}, +{"from_linear":{"hex":"#898989ff","u16":[35262,35262,35262,65535]},"in":"#404040ff","to_linear":{"hex":"#0d0d0dff","u16":[3360,3360,3360,65535]}}, +{"from_linear":{"hex":"#bbbbbbff","u16":[48107,48107,48107,65535]},"in":"#7f7f7fff","to_linear":{"hex":"#363636ff","u16":[13909,13909,13909,65535]}}, +{"from_linear":{"hex":"#bcbcbcff","u16":[48276,48276,48276,65535]},"in":"#808080ff","to_linear":{"hex":"#373737ff","u16":[14146,14146,14146,65535]}}, +{"from_linear":{"hex":"#bdbdbdff","u16":[48445,48445,48445,65535]},"in":"#818181ff","to_linear":{"hex":"#383838ff","u16":[14387,14387,14387,65535]}}, +{"from_linear":{"hex":"#e0e0e0ff","u16":[57691,57691,57691,65535]},"in":"#bfbfbfff","to_linear":{"hex":"#858585ff","u16":[34143,34143,34143,65535]}}, +{"from_linear":{"hex":"#e1e1e1ff","u16":[57825,57825,57825,65535]},"in":"#c0c0c0ff","to_linear":{"hex":"#868686ff","u16":[34544,34544,34544,65535]}}, +{"from_linear":{"hex":"#fefefeff","u16":[65309,65309,65309,65535]},"in":"#fdfdfdff","to_linear":{"hex":"#fafafaff","u16":[64372,64372,64372,65535]}}, +{"from_linear":{"hex":"#ffffffff","u16":[65422,65422,65422,65535]},"in":"#fefefeff","to_linear":{"hex":"#fdfdfdff","u16":[64952,64952,64952,65535]}}, +{"from_linear":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"in":"#ff0000ff","to_linear":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"from_linear":{"hex":"#00ff00ff","u16":[0,65535,0,65535]},"in":"#00ff00ff","to_linear":{"hex":"#00ff00ff","u16":[0,65535,0,65535]}}, +{"from_linear":{"f":[-3.5762786865234375e-07,0,1,1],"hex":"#0000ffff","spec":"ExtendedRgb","u16":[0,0,65535,65535]},"in":"#0000ffff","to_linear":{"f":[0,0,1,1],"hex":"#0000ffff","spec":"ExtendedRgb","u16":[0,0,65535,65535]}}, +{"from_linear":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]},"in":"#ffff00ff","to_linear":{"hex":"#ffff00ff","u16":[65535,65535,0,65535]}}, +{"from_linear":{"hex":"#00ffffff","u16":[0,65535,65535,65535]},"in":"#00ffffff","to_linear":{"hex":"#00ffffff","u16":[0,65535,65535,65535]}}, +{"from_linear":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]},"in":"#ff00ffff","to_linear":{"hex":"#ff00ffff","u16":[65535,0,65535,65535]}}, +{"from_linear":{"hex":"#bc0000ff","u16":[48276,0,0,65535]},"in":"#800000ff","to_linear":{"hex":"#370000ff","u16":[14146,0,0,65535]}}, +{"from_linear":{"hex":"#00bc00ff","u16":[0,48276,0,65535]},"in":"#008000ff","to_linear":{"hex":"#003700ff","u16":[0,14146,0,65535]}}, +{"from_linear":{"f":[-1.7881393432617188e-07,0,0.73681640625,1],"hex":"#0000bcff","spec":"ExtendedRgb","u16":[0,0,48287,65535]},"in":"#000080ff","to_linear":{"f":[0,0,0.2158203125,1],"hex":"#000037ff","spec":"ExtendedRgb","u16":[0,0,14144,65535]}}, +{"from_linear":{"hex":"#ffbcbcff","u16":[65535,48276,48276,65535]},"in":"#ff8080ff","to_linear":{"hex":"#ff3737ff","u16":[65535,14146,14146,65535]}}, +{"from_linear":{"hex":"#bcffbcff","u16":[48276,65535,48276,65535]},"in":"#80ff80ff","to_linear":{"hex":"#37ff37ff","u16":[14146,65535,14146,65535]}}, +{"from_linear":{"hex":"#bcbcffff","u16":[48276,48276,65535,65535]},"in":"#8080ffff","to_linear":{"hex":"#3737ffff","u16":[14146,14146,65535,65535]}}, +{"from_linear":{"hex":"#1c160dff","u16":[7255,5567,3266,65535]},"in":"#030201ff","to_linear":{"hex":"#000000ff","u16":[60,40,20,65535]}}, +{"from_linear":{"hex":"#fffffeff","u16":[65535,65422,65309,65535]},"in":"#fffefdff","to_linear":{"hex":"#fffdfaff","u16":[65535,64952,64372,65535]}}, +{"from_linear":{"hex":"#bbbcbdff","u16":[48107,48276,48445,65535]},"in":"#7f8081ff","to_linear":{"hex":"#363738ff","u16":[13909,14146,14387,65535]}}, +{"from_linear":{"hex":"#0d0000ff","u16":[3266,0,0,65535]},"in":"#010000ff","to_linear":{"hex":"#000000ff","u16":[20,0,0,65535]}}, +{"from_linear":{"f":[0,0,0.049835205078125,1],"hex":"#00000dff","spec":"ExtendedRgb","u16":[0,0,3266,65535]},"in":"#000001ff","to_linear":{"f":[0,0,0.00030350685119628906,1],"hex":"#000000ff","spec":"ExtendedRgb","u16":[0,0,20,65535]}}, +{"from_linear":{"hex":"#ffffffff","u16":[65422,65535,65422,65535]},"in":"#fefffeff","to_linear":{"hex":"#fdfffdff","u16":[64952,65535,64952,65535]}}, +{"from_linear":{"hex":"#86d7f5ff","u16":[34492,55356,62984,65535]},"in":"#3daee9ff","to_linear":{"hex":"#0c6cd0ff","u16":[3058,27739,53401,65535]}}, +{"from_linear":{"hex":"#686c70ff","u16":[26620,27674,28680,65535]},"in":"#232629ff","to_linear":{"hex":"#040506ff","u16":[1101,1270,1453,65535]}}, +{"from_linear":{"hex":"#f8f8f9ff","u16":[63693,63810,63927,65535]},"in":"#eff0f1ff","to_linear":{"hex":"#dcdee0ff","u16":[56567,57105,57646,65535]}}, +{"from_linear":{"hex":"#fefefeff","u16":[65195,65195,65195,65535]},"in":"#fcfcfcff","to_linear":{"hex":"#f8f8f8ff","u16":[63795,63795,63795,65535]}}, +{"from_linear":{"hex":"#797f84ff","u16":[31169,32606,33967,65535]},"in":"#31363bff","to_linear":{"hex":"#08090bff","u16":[2013,2418,2866,65535]}}, +{"from_linear":{"hex":"#5c6063ff","u16":[23523,24740,25513,65535]},"in":"#1b1e20ff","to_linear":{"hex":"#030304ff","u16":[718,851,947,65535]}}, +{"from_linear":{"hex":"#ee8d9bff","u16":[61163,36256,39708,65535]},"in":"#da4453ff","to_linear":{"hex":"#b30f16ff","u16":[45947,3788,5669,65535]}}, +{"from_linear":{"hex":"#6dd7a5ff","u16":[28014,55356,42416,65535]},"in":"#27ae60ff","to_linear":{"hex":"#056c1eff","u16":[1330,27739,7666,65535]}}, +{"from_linear":{"hex":"#fbb400ff","u16":[64508,46191,0,65535]},"in":"#f67400ff","to_linear":{"hex":"#eb2d00ff","u16":[60396,11446,0,65535]}}, +{"from_linear":{"hex":"#70bcddff","u16":[28680,48276,56882,65535]},"in":"#2980b9ff","to_linear":{"hex":"#06377cff","u16":[1453,14146,31794,65535]}}, +{"from_linear":{"hex":"#bbc4c4ff","u16":[48107,50250,50410,65535]},"in":"#7f8c8dff","to_linear":{"hex":"#364344ff","u16":[13909,17187,17456,65535]}}, +{"from_linear":{"hex":"#cd9fdcff","u16":[52583,40987,56471,65535]},"in":"#9b59b6ff","to_linear":{"hex":"#541977ff","u16":[21481,6547,30656,65535]}}, +{"from_linear":{"hex":"#5fcbfaff","u16":[24342,52280,64160,65535]},"in":"#1d99f3ff","to_linear":{"hex":"#0351e5ff","u16":[805,20876,58737,65535]}}, +{"from_linear":{"hex":"#f0f1f2ff","u16":[61656,61900,62143,65535]},"in":"#dee0e2ff","to_linear":{"hex":"#babec2ff","u16":[47871,48850,49841,65535]}}, +{"from_linear":{"hex":"#707378ff","u16":[28680,29644,30872,65535]},"in":"#292c30ff","to_linear":{"hex":"#060608ff","u16":[1453,1651,1937,65535]}}, +{"from_linear":{"hex":"#f583ccff","u16":[62984,33700,52432,65535]},"in":"#e93a9aff","to_linear":{"hex":"#d00b52ff","u16":[53401,2773,21177,65535]}}, +{"from_linear":{"hex":"#f5869fff","u16":[62984,34492,40777,65535]},"in":"#e93d58ff","to_linear":{"hex":"#d00c19ff","u16":[53401,3058,6395,65535]}}, +{"from_linear":{"hex":"#f5a883ff","u16":[62984,43205,33700,65535]},"in":"#e9643aff","to_linear":{"hex":"#d0200bff","u16":[53401,8352,2773,65535]}}, +{"from_linear":{"hex":"#f5e775ff","u16":[62865,59268,29957,65535]},"in":"#e8cb2dff","to_linear":{"hex":"#ce9807ff","u16":[52884,39138,1720,65535]}}, +{"from_linear":{"hex":"#86eb6aff","u16":[34492,60414,27328,65535]},"in":"#3dd425ff","to_linear":{"hex":"#0ca805ff","u16":[3058,43147,1212,65535]}}, +{"from_linear":{"hex":"#00ebddff","u16":[0,60288,56745,65535]},"in":"#00d3b8ff","to_linear":{"hex":"#00a67aff","u16":[0,42690,31412,65535]}}, +{"from_linear":{"hex":"#ddb4efff","u16":[56745,46370,61410,65535]},"in":"#b875dcff","to_linear":{"hex":"#7a2db7ff","u16":[31412,11658,46903,65535]}}, +{"from_linear":{"hex":"#c7aff3ff","u16":[51200,45101,62385,65535]},"in":"#926ee4ff","to_linear":{"hex":"#4928c6ff","u16":[18837,10219,50844,65535]}}, +{"from_linear":{"hex":"#abadb0ff","u16":[43976,44543,45285,65535]},"in":"#686b6fff","to_linear":{"hex":"#232529ff","u16":[9072,9635,10417,65535]}}, +{"from_linear":{"hex":"#86d7f580","u16":[34492,55356,62984,32896]},"in":"#3daee980","to_linear":{"hex":"#0c6cd080","u16":[3058,27739,53401,32896]}}, +{"from_linear":{"hex":"#ffffff00","u16":[65535,65535,65535,0]},"in":"#ffffff00","to_linear":{"hex":"#ffffff00","u16":[65535,65535,65535,0]}}, +{"from_linear":{"hex":"#00000080","u16":[0,0,0,32896]},"in":"#00000080","to_linear":{"hex":"#00000080","u16":[0,0,0,32896]}}, +{"from_linear":{"hex":"#ff000033","u16":[65535,0,0,13107]},"in":"#ff000033","to_linear":{"hex":"#ff000033","u16":[65535,0,0,13107]}}, +{"from_linear":{"hex":"#000000ff","u16":[0,0,0,65535]},"in":"#000000ff","to_linear":{"hex":"#000000ff","u16":[0,0,0,65535]}}, +{"from_linear":{"hex":"#0d0d0dff","u16":[3266,3266,3266,65535]},"in":"#010101ff","to_linear":{"hex":"#000000ff","u16":[20,20,20,65535]}}, +{"from_linear":{"hex":"#161616ff","u16":[5567,5567,5567,65535]},"in":"#020202ff","to_linear":{"hex":"#000000ff","u16":[40,40,40,65535]}}, +{"from_linear":{"hex":"#1c1c1cff","u16":[7255,7255,7255,65535]},"in":"#030303ff","to_linear":{"hex":"#000000ff","u16":[60,60,60,65535]}}, +{"from_linear":{"hex":"#222222ff","u16":[8638,8638,8638,65535]},"in":"#040404ff","to_linear":{"hex":"#000000ff","u16":[80,80,80,65535]}}, +{"from_linear":{"hex":"#262626ff","u16":[9831,9831,9831,65535]},"in":"#050505ff","to_linear":{"hex":"#000000ff","u16":[99,99,99,65535]}}, +{"from_linear":{"hex":"#2a2a2aff","u16":[10891,10891,10891,65535]},"in":"#060606ff","to_linear":{"hex":"#000000ff","u16":[119,119,119,65535]}}, +{"from_linear":{"hex":"#2e2e2eff","u16":[11853,11853,11853,65535]},"in":"#070707ff","to_linear":{"hex":"#010101ff","u16":[139,139,139,65535]}}, +{"from_linear":{"hex":"#323232ff","u16":[12737,12737,12737,65535]},"in":"#080808ff","to_linear":{"hex":"#010101ff","u16":[159,159,159,65535]}}, +{"from_linear":{"hex":"#353535ff","u16":[13559,13559,13559,65535]},"in":"#090909ff","to_linear":{"hex":"#010101ff","u16":[179,179,179,65535]}}, +{"from_linear":{"hex":"#383838ff","u16":[14329,14329,14329,65535]},"in":"#0a0a0aff","to_linear":{"hex":"#010101ff","u16":[199,199,199,65535]}}, +{"from_linear":{"hex":"#3b3b3bff","u16":[15056,15056,15056,65535]},"in":"#0b0b0bff","to_linear":{"hex":"#010101ff","u16":[219,219,219,65535]}}, +{"from_linear":{"hex":"#3d3d3dff","u16":[15745,15745,15745,65535]},"in":"#0c0c0cff","to_linear":{"hex":"#010101ff","u16":[241,241,241,65535]}}, +{"from_linear":{"hex":"#404040ff","u16":[16401,16401,16401,65535]},"in":"#0d0d0dff","to_linear":{"hex":"#010101ff","u16":[264,264,264,65535]}}, +{"from_linear":{"hex":"#424242ff","u16":[17028,17028,17028,65535]},"in":"#0e0e0eff","to_linear":{"hex":"#010101ff","u16":[288,288,288,65535]}}, +{"from_linear":{"hex":"#454545ff","u16":[17630,17630,17630,65535]},"in":"#0f0f0fff","to_linear":{"hex":"#010101ff","u16":[313,313,313,65535]}}, +{"from_linear":{"hex":"#474747ff","u16":[18209,18209,18209,65535]},"in":"#101010ff","to_linear":{"hex":"#010101ff","u16":[340,340,340,65535]}}, +{"from_linear":{"hex":"#494949ff","u16":[18767,18767,18767,65535]},"in":"#111111ff","to_linear":{"hex":"#010101ff","u16":[367,367,367,65535]}}, +{"from_linear":{"hex":"#4b4b4bff","u16":[19306,19306,19306,65535]},"in":"#121212ff","to_linear":{"hex":"#020202ff","u16":[396,396,396,65535]}}, +{"from_linear":{"hex":"#4d4d4dff","u16":[19828,19828,19828,65535]},"in":"#131313ff","to_linear":{"hex":"#020202ff","u16":[427,427,427,65535]}}, +{"from_linear":{"hex":"#4f4f4fff","u16":[20334,20334,20334,65535]},"in":"#141414ff","to_linear":{"hex":"#020202ff","u16":[458,458,458,65535]}}, +{"from_linear":{"hex":"#515151ff","u16":[20826,20826,20826,65535]},"in":"#151515ff","to_linear":{"hex":"#020202ff","u16":[491,491,491,65535]}}, +{"from_linear":{"hex":"#535353ff","u16":[21304,21304,21304,65535]},"in":"#161616ff","to_linear":{"hex":"#020202ff","u16":[526,526,526,65535]}}, +{"from_linear":{"hex":"#555555ff","u16":[21769,21769,21769,65535]},"in":"#171717ff","to_linear":{"hex":"#020202ff","u16":[562,562,562,65535]}}, +{"from_linear":{"hex":"#565656ff","u16":[22223,22223,22223,65535]},"in":"#181818ff","to_linear":{"hex":"#020202ff","u16":[599,599,599,65535]}}, +{"from_linear":{"hex":"#585858ff","u16":[22667,22667,22667,65535]},"in":"#191919ff","to_linear":{"hex":"#020202ff","u16":[637,637,637,65535]}}, +{"from_linear":{"hex":"#5a5a5aff","u16":[23099,23099,23099,65535]},"in":"#1a1a1aff","to_linear":{"hex":"#030303ff","u16":[677,677,677,65535]}}, +{"from_linear":{"hex":"#5c5c5cff","u16":[23523,23523,23523,65535]},"in":"#1b1b1bff","to_linear":{"hex":"#030303ff","u16":[718,718,718,65535]}}, +{"from_linear":{"hex":"#5d5d5dff","u16":[23937,23937,23937,65535]},"in":"#1c1c1cff","to_linear":{"hex":"#030303ff","u16":[761,761,761,65535]}}, +{"from_linear":{"hex":"#5f5f5fff","u16":[24342,24342,24342,65535]},"in":"#1d1d1dff","to_linear":{"hex":"#030303ff","u16":[805,805,805,65535]}}, +{"from_linear":{"hex":"#606060ff","u16":[24740,24740,24740,65535]},"in":"#1e1e1eff","to_linear":{"hex":"#030303ff","u16":[851,851,851,65535]}}, +{"from_linear":{"hex":"#626262ff","u16":[25130,25130,25130,65535]},"in":"#1f1f1fff","to_linear":{"hex":"#030303ff","u16":[898,898,898,65535]}}, +{"from_linear":{"hex":"#636363ff","u16":[25513,25513,25513,65535]},"in":"#202020ff","to_linear":{"hex":"#040404ff","u16":[947,947,947,65535]}}, +{"from_linear":{"hex":"#656565ff","u16":[25888,25888,25888,65535]},"in":"#212121ff","to_linear":{"hex":"#040404ff","u16":[997,997,997,65535]}}, +{"from_linear":{"hex":"#666666ff","u16":[26257,26257,26257,65535]},"in":"#222222ff","to_linear":{"hex":"#040404ff","u16":[1048,1048,1048,65535]}}, +{"from_linear":{"hex":"#686868ff","u16":[26620,26620,26620,65535]},"in":"#232323ff","to_linear":{"hex":"#040404ff","u16":[1101,1101,1101,65535]}}, +{"from_linear":{"hex":"#696969ff","u16":[26977,26977,26977,65535]},"in":"#242424ff","to_linear":{"hex":"#040404ff","u16":[1156,1156,1156,65535]}}, +{"from_linear":{"hex":"#6a6a6aff","u16":[27328,27328,27328,65535]},"in":"#252525ff","to_linear":{"hex":"#050505ff","u16":[1212,1212,1212,65535]}}, +{"from_linear":{"hex":"#6c6c6cff","u16":[27674,27674,27674,65535]},"in":"#262626ff","to_linear":{"hex":"#050505ff","u16":[1270,1270,1270,65535]}}, +{"from_linear":{"hex":"#6d6d6dff","u16":[28014,28014,28014,65535]},"in":"#272727ff","to_linear":{"hex":"#050505ff","u16":[1330,1330,1330,65535]}}, +{"from_linear":{"hex":"#6e6e6eff","u16":[28350,28350,28350,65535]},"in":"#282828ff","to_linear":{"hex":"#050505ff","u16":[1391,1391,1391,65535]}}, +{"from_linear":{"hex":"#707070ff","u16":[28680,28680,28680,65535]},"in":"#292929ff","to_linear":{"hex":"#060606ff","u16":[1453,1453,1453,65535]}}, +{"from_linear":{"hex":"#717171ff","u16":[29006,29006,29006,65535]},"in":"#2a2a2aff","to_linear":{"hex":"#060606ff","u16":[1517,1517,1517,65535]}}, +{"from_linear":{"hex":"#727272ff","u16":[29327,29327,29327,65535]},"in":"#2b2b2bff","to_linear":{"hex":"#060606ff","u16":[1583,1583,1583,65535]}}, +{"from_linear":{"hex":"#737373ff","u16":[29644,29644,29644,65535]},"in":"#2c2c2cff","to_linear":{"hex":"#060606ff","u16":[1651,1651,1651,65535]}}, +{"from_linear":{"hex":"#757575ff","u16":[29957,29957,29957,65535]},"in":"#2d2d2dff","to_linear":{"hex":"#070707ff","u16":[1720,1720,1720,65535]}}, +{"from_linear":{"hex":"#767676ff","u16":[30266,30266,30266,65535]},"in":"#2e2e2eff","to_linear":{"hex":"#070707ff","u16":[1790,1790,1790,65535]}}, +{"from_linear":{"hex":"#777777ff","u16":[30571,30571,30571,65535]},"in":"#2f2f2fff","to_linear":{"hex":"#070707ff","u16":[1863,1863,1863,65535]}}, +{"from_linear":{"hex":"#787878ff","u16":[30872,30872,30872,65535]},"in":"#303030ff","to_linear":{"hex":"#080808ff","u16":[1937,1937,1937,65535]}}, +{"from_linear":{"hex":"#797979ff","u16":[31169,31169,31169,65535]},"in":"#313131ff","to_linear":{"hex":"#080808ff","u16":[2013,2013,2013,65535]}}, +{"from_linear":{"hex":"#7a7a7aff","u16":[31463,31463,31463,65535]},"in":"#323232ff","to_linear":{"hex":"#080808ff","u16":[2090,2090,2090,65535]}}, +{"from_linear":{"hex":"#7c7c7cff","u16":[31754,31754,31754,65535]},"in":"#333333ff","to_linear":{"hex":"#080808ff","u16":[2170,2170,2170,65535]}}, +{"from_linear":{"hex":"#7d7d7dff","u16":[32041,32041,32041,65535]},"in":"#343434ff","to_linear":{"hex":"#090909ff","u16":[2250,2250,2250,65535]}}, +{"from_linear":{"hex":"#7e7e7eff","u16":[32325,32325,32325,65535]},"in":"#353535ff","to_linear":{"hex":"#090909ff","u16":[2333,2333,2333,65535]}}, +{"from_linear":{"hex":"#7f7f7fff","u16":[32606,32606,32606,65535]},"in":"#363636ff","to_linear":{"hex":"#090909ff","u16":[2418,2418,2418,65535]}}, +{"from_linear":{"hex":"#808080ff","u16":[32884,32884,32884,65535]},"in":"#373737ff","to_linear":{"hex":"#0a0a0aff","u16":[2504,2504,2504,65535]}}, +{"from_linear":{"hex":"#818181ff","u16":[33159,33159,33159,65535]},"in":"#383838ff","to_linear":{"hex":"#0a0a0aff","u16":[2592,2592,2592,65535]}}, +{"from_linear":{"hex":"#828282ff","u16":[33431,33431,33431,65535]},"in":"#393939ff","to_linear":{"hex":"#0a0a0aff","u16":[2681,2681,2681,65535]}}, +{"from_linear":{"hex":"#838383ff","u16":[33700,33700,33700,65535]},"in":"#3a3a3aff","to_linear":{"hex":"#0b0b0bff","u16":[2773,2773,2773,65535]}}, +{"from_linear":{"hex":"#848484ff","u16":[33967,33967,33967,65535]},"in":"#3b3b3bff","to_linear":{"hex":"#0b0b0bff","u16":[2866,2866,2866,65535]}}, +{"from_linear":{"hex":"#858585ff","u16":[34231,34231,34231,65535]},"in":"#3c3c3cff","to_linear":{"hex":"#0c0c0cff","u16":[2961,2961,2961,65535]}}, +{"from_linear":{"hex":"#868686ff","u16":[34492,34492,34492,65535]},"in":"#3d3d3dff","to_linear":{"hex":"#0c0c0cff","u16":[3058,3058,3058,65535]}}, +{"from_linear":{"hex":"#878787ff","u16":[34751,34751,34751,65535]},"in":"#3e3e3eff","to_linear":{"hex":"#0c0c0cff","u16":[3157,3157,3157,65535]}}, +{"from_linear":{"hex":"#888888ff","u16":[35008,35008,35008,65535]},"in":"#3f3f3fff","to_linear":{"hex":"#0d0d0dff","u16":[3258,3258,3258,65535]}}, +{"from_linear":{"hex":"#898989ff","u16":[35262,35262,35262,65535]},"in":"#404040ff","to_linear":{"hex":"#0d0d0dff","u16":[3360,3360,3360,65535]}}, +{"from_linear":{"hex":"#8a8a8aff","u16":[35514,35514,35514,65535]},"in":"#414141ff","to_linear":{"hex":"#0d0d0dff","u16":[3464,3464,3464,65535]}}, +{"from_linear":{"hex":"#8b8b8bff","u16":[35764,35764,35764,65535]},"in":"#424242ff","to_linear":{"hex":"#0e0e0eff","u16":[3570,3570,3570,65535]}}, +{"from_linear":{"hex":"#8c8c8cff","u16":[36011,36011,36011,65535]},"in":"#434343ff","to_linear":{"hex":"#0e0e0eff","u16":[3678,3678,3678,65535]}}, +{"from_linear":{"hex":"#8d8d8dff","u16":[36256,36256,36256,65535]},"in":"#444444ff","to_linear":{"hex":"#0f0f0fff","u16":[3788,3788,3788,65535]}}, +{"from_linear":{"hex":"#8e8e8eff","u16":[36500,36500,36500,65535]},"in":"#454545ff","to_linear":{"hex":"#0f0f0fff","u16":[3900,3900,3900,65535]}}, +{"from_linear":{"hex":"#8f8f8fff","u16":[36741,36741,36741,65535]},"in":"#464646ff","to_linear":{"hex":"#101010ff","u16":[4014,4014,4014,65535]}}, +{"from_linear":{"hex":"#909090ff","u16":[36980,36980,36980,65535]},"in":"#474747ff","to_linear":{"hex":"#101010ff","u16":[4129,4129,4129,65535]}}, +{"from_linear":{"hex":"#919191ff","u16":[37217,37217,37217,65535]},"in":"#484848ff","to_linear":{"hex":"#111111ff","u16":[4247,4247,4247,65535]}}, +{"from_linear":{"hex":"#929292ff","u16":[37452,37452,37452,65535]},"in":"#494949ff","to_linear":{"hex":"#111111ff","u16":[4366,4366,4366,65535]}}, +{"from_linear":{"hex":"#939393ff","u16":[37686,37686,37686,65535]},"in":"#4a4a4aff","to_linear":{"hex":"#111111ff","u16":[4488,4488,4488,65535]}}, +{"from_linear":{"hex":"#949494ff","u16":[37917,37917,37917,65535]},"in":"#4b4b4bff","to_linear":{"hex":"#121212ff","u16":[4611,4611,4611,65535]}}, +{"from_linear":{"hex":"#949494ff","u16":[38147,38147,38147,65535]},"in":"#4c4c4cff","to_linear":{"hex":"#121212ff","u16":[4736,4736,4736,65535]}}, +{"from_linear":{"hex":"#959595ff","u16":[38375,38375,38375,65535]},"in":"#4d4d4dff","to_linear":{"hex":"#131313ff","u16":[4864,4864,4864,65535]}}, +{"from_linear":{"hex":"#969696ff","u16":[38601,38602,38601,65535]},"in":"#4e4e4eff","to_linear":{"hex":"#131313ff","u16":[4993,4993,4993,65535]}}, +{"from_linear":{"hex":"#979797ff","u16":[38826,38826,38826,65535]},"in":"#4f4f4fff","to_linear":{"hex":"#141414ff","u16":[5124,5124,5124,65535]}}, +{"from_linear":{"hex":"#989898ff","u16":[39049,39049,39049,65535]},"in":"#505050ff","to_linear":{"hex":"#141414ff","u16":[5257,5257,5257,65535]}}, +{"from_linear":{"hex":"#999999ff","u16":[39270,39270,39270,65535]},"in":"#515151ff","to_linear":{"hex":"#151515ff","u16":[5392,5392,5392,65535]}}, +{"from_linear":{"hex":"#9a9a9aff","u16":[39490,39490,39490,65535]},"in":"#525252ff","to_linear":{"hex":"#161616ff","u16":[5530,5530,5530,65535]}}, +{"from_linear":{"hex":"#9b9b9bff","u16":[39708,39708,39708,65535]},"in":"#535353ff","to_linear":{"hex":"#161616ff","u16":[5669,5669,5669,65535]}}, +{"from_linear":{"hex":"#9b9b9bff","u16":[39925,39925,39925,65535]},"in":"#545454ff","to_linear":{"hex":"#171717ff","u16":[5810,5810,5810,65535]}}, +{"from_linear":{"hex":"#9c9c9cff","u16":[40140,40140,40140,65535]},"in":"#555555ff","to_linear":{"hex":"#171717ff","u16":[5953,5953,5953,65535]}}, +{"from_linear":{"hex":"#9d9d9dff","u16":[40354,40354,40354,65535]},"in":"#565656ff","to_linear":{"hex":"#181818ff","u16":[6099,6099,6099,65535]}}, +{"from_linear":{"hex":"#9e9e9eff","u16":[40566,40566,40566,65535]},"in":"#575757ff","to_linear":{"hex":"#181818ff","u16":[6246,6246,6246,65535]}}, +{"from_linear":{"hex":"#9f9f9fff","u16":[40777,40777,40777,65535]},"in":"#585858ff","to_linear":{"hex":"#191919ff","u16":[6395,6395,6395,65535]}}, +{"from_linear":{"hex":"#9f9f9fff","u16":[40987,40987,40987,65535]},"in":"#595959ff","to_linear":{"hex":"#191919ff","u16":[6547,6547,6547,65535]}}, +{"from_linear":{"hex":"#a0a0a0ff","u16":[41195,41195,41195,65535]},"in":"#5a5a5aff","to_linear":{"hex":"#1a1a1aff","u16":[6700,6700,6700,65535]}}, +{"from_linear":{"hex":"#a1a1a1ff","u16":[41401,41401,41401,65535]},"in":"#5b5b5bff","to_linear":{"hex":"#1b1b1bff","u16":[6856,6856,6856,65535]}}, +{"from_linear":{"hex":"#a2a2a2ff","u16":[41607,41607,41607,65535]},"in":"#5c5c5cff","to_linear":{"hex":"#1b1b1bff","u16":[7014,7014,7014,65535]}}, +{"from_linear":{"hex":"#a3a3a3ff","u16":[41811,41811,41811,65535]},"in":"#5d5d5dff","to_linear":{"hex":"#1c1c1cff","u16":[7174,7174,7174,65535]}}, +{"from_linear":{"hex":"#a3a3a3ff","u16":[42014,42014,42014,65535]},"in":"#5e5e5eff","to_linear":{"hex":"#1d1d1dff","u16":[7335,7335,7335,65535]}}, +{"from_linear":{"hex":"#a4a4a4ff","u16":[42215,42215,42215,65535]},"in":"#5f5f5fff","to_linear":{"hex":"#1d1d1dff","u16":[7500,7500,7500,65535]}}, +{"from_linear":{"hex":"#a5a5a5ff","u16":[42416,42416,42416,65535]},"in":"#606060ff","to_linear":{"hex":"#1e1e1eff","u16":[7666,7666,7666,65535]}}, +{"from_linear":{"hex":"#a6a6a6ff","u16":[42615,42615,42615,65535]},"in":"#616161ff","to_linear":{"hex":"#1e1e1eff","u16":[7834,7834,7834,65535]}}, +{"from_linear":{"hex":"#a7a7a7ff","u16":[42813,42813,42813,65535]},"in":"#626262ff","to_linear":{"hex":"#1f1f1fff","u16":[8004,8004,8004,65535]}}, +{"from_linear":{"hex":"#a7a7a7ff","u16":[43009,43009,43009,65535]},"in":"#636363ff","to_linear":{"hex":"#202020ff","u16":[8177,8177,8177,65535]}}, +{"from_linear":{"hex":"#a8a8a8ff","u16":[43205,43205,43205,65535]},"in":"#646464ff","to_linear":{"hex":"#202020ff","u16":[8352,8352,8352,65535]}}, +{"from_linear":{"hex":"#a9a9a9ff","u16":[43400,43400,43400,65535]},"in":"#656565ff","to_linear":{"hex":"#212121ff","u16":[8528,8528,8528,65535]}}, +{"from_linear":{"hex":"#aaaaaaff","u16":[43593,43593,43593,65535]},"in":"#666666ff","to_linear":{"hex":"#222222ff","u16":[8708,8708,8708,65535]}}, +{"from_linear":{"hex":"#aaaaaaff","u16":[43785,43785,43785,65535]},"in":"#676767ff","to_linear":{"hex":"#232323ff","u16":[8889,8889,8889,65535]}}, +{"from_linear":{"hex":"#abababff","u16":[43976,43976,43976,65535]},"in":"#686868ff","to_linear":{"hex":"#232323ff","u16":[9072,9072,9072,65535]}}, +{"from_linear":{"hex":"#acacacff","u16":[44166,44166,44166,65535]},"in":"#696969ff","to_linear":{"hex":"#242424ff","u16":[9258,9258,9258,65535]}}, +{"from_linear":{"hex":"#adadadff","u16":[44355,44355,44355,65535]},"in":"#6a6a6aff","to_linear":{"hex":"#252525ff","u16":[9445,9445,9445,65535]}}, +{"from_linear":{"hex":"#adadadff","u16":[44543,44543,44543,65535]},"in":"#6b6b6bff","to_linear":{"hex":"#252525ff","u16":[9635,9635,9635,65535]}}, +{"from_linear":{"hex":"#aeaeaeff","u16":[44730,44730,44730,65535]},"in":"#6c6c6cff","to_linear":{"hex":"#262626ff","u16":[9828,9828,9828,65535]}}, +{"from_linear":{"hex":"#afafafff","u16":[44916,44916,44916,65535]},"in":"#6d6d6dff","to_linear":{"hex":"#272727ff","u16":[10022,10022,10022,65535]}}, +{"from_linear":{"hex":"#afafafff","u16":[45101,45101,45101,65535]},"in":"#6e6e6eff","to_linear":{"hex":"#282828ff","u16":[10219,10219,10219,65535]}}, +{"from_linear":{"hex":"#b0b0b0ff","u16":[45285,45285,45285,65535]},"in":"#6f6f6fff","to_linear":{"hex":"#292929ff","u16":[10417,10417,10417,65535]}}, +{"from_linear":{"hex":"#b1b1b1ff","u16":[45468,45468,45468,65535]},"in":"#707070ff","to_linear":{"hex":"#292929ff","u16":[10619,10619,10619,65535]}}, +{"from_linear":{"hex":"#b2b2b2ff","u16":[45651,45651,45651,65535]},"in":"#717171ff","to_linear":{"hex":"#2a2a2aff","u16":[10822,10822,10822,65535]}}, +{"from_linear":{"hex":"#b2b2b2ff","u16":[45832,45832,45832,65535]},"in":"#727272ff","to_linear":{"hex":"#2b2b2bff","u16":[11028,11028,11028,65535]}}, +{"from_linear":{"hex":"#b3b3b3ff","u16":[46012,46012,46012,65535]},"in":"#737373ff","to_linear":{"hex":"#2c2c2cff","u16":[11235,11235,11235,65535]}}, +{"from_linear":{"hex":"#b4b4b4ff","u16":[46191,46191,46191,65535]},"in":"#747474ff","to_linear":{"hex":"#2d2d2dff","u16":[11446,11446,11446,65535]}}, +{"from_linear":{"hex":"#b4b4b4ff","u16":[46370,46370,46370,65535]},"in":"#757575ff","to_linear":{"hex":"#2d2d2dff","u16":[11658,11658,11658,65535]}}, +{"from_linear":{"hex":"#b5b5b5ff","u16":[46547,46547,46547,65535]},"in":"#767676ff","to_linear":{"hex":"#2e2e2eff","u16":[11873,11873,11873,65535]}}, +{"from_linear":{"hex":"#b6b6b6ff","u16":[46724,46724,46724,65535]},"in":"#777777ff","to_linear":{"hex":"#2f2f2fff","u16":[12090,12090,12090,65535]}}, +{"from_linear":{"hex":"#b6b6b6ff","u16":[46900,46900,46900,65535]},"in":"#787878ff","to_linear":{"hex":"#303030ff","u16":[12309,12309,12309,65535]}}, +{"from_linear":{"hex":"#b7b7b7ff","u16":[47075,47075,47075,65535]},"in":"#797979ff","to_linear":{"hex":"#313131ff","u16":[12530,12530,12530,65535]}}, +{"from_linear":{"hex":"#b8b8b8ff","u16":[47249,47249,47249,65535]},"in":"#7a7a7aff","to_linear":{"hex":"#323232ff","u16":[12754,12754,12754,65535]}}, +{"from_linear":{"hex":"#b9b9b9ff","u16":[47422,47422,47422,65535]},"in":"#7b7b7bff","to_linear":{"hex":"#333333ff","u16":[12980,12980,12980,65535]}}, +{"from_linear":{"hex":"#b9b9b9ff","u16":[47594,47594,47594,65535]},"in":"#7c7c7cff","to_linear":{"hex":"#333333ff","u16":[13209,13209,13209,65535]}}, +{"from_linear":{"hex":"#bababaff","u16":[47766,47766,47766,65535]},"in":"#7d7d7dff","to_linear":{"hex":"#343434ff","u16":[13440,13440,13440,65535]}}, +{"from_linear":{"hex":"#bbbbbbff","u16":[47937,47937,47937,65535]},"in":"#7e7e7eff","to_linear":{"hex":"#353535ff","u16":[13673,13673,13673,65535]}}, +{"from_linear":{"hex":"#bbbbbbff","u16":[48107,48107,48107,65535]},"in":"#7f7f7fff","to_linear":{"hex":"#363636ff","u16":[13909,13909,13909,65535]}}, +{"from_linear":{"hex":"#bcbcbcff","u16":[48276,48276,48276,65535]},"in":"#808080ff","to_linear":{"hex":"#373737ff","u16":[14146,14146,14146,65535]}}, +{"from_linear":{"hex":"#bdbdbdff","u16":[48445,48445,48445,65535]},"in":"#818181ff","to_linear":{"hex":"#383838ff","u16":[14387,14387,14387,65535]}}, +{"from_linear":{"hex":"#bdbdbdff","u16":[48612,48612,48612,65535]},"in":"#828282ff","to_linear":{"hex":"#393939ff","u16":[14629,14629,14629,65535]}}, +{"from_linear":{"hex":"#bebebeff","u16":[48779,48779,48779,65535]},"in":"#838383ff","to_linear":{"hex":"#3a3a3aff","u16":[14874,14874,14874,65535]}}, +{"from_linear":{"hex":"#bebebeff","u16":[48946,48946,48946,65535]},"in":"#848484ff","to_linear":{"hex":"#3b3b3bff","u16":[15122,15122,15122,65535]}}, +{"from_linear":{"hex":"#bfbfbfff","u16":[49111,49111,49111,65535]},"in":"#858585ff","to_linear":{"hex":"#3c3c3cff","u16":[15371,15371,15371,65535]}}, +{"from_linear":{"hex":"#c0c0c0ff","u16":[49276,49276,49276,65535]},"in":"#868686ff","to_linear":{"hex":"#3d3d3dff","u16":[15623,15623,15623,65535]}}, +{"from_linear":{"hex":"#c0c0c0ff","u16":[49440,49440,49440,65535]},"in":"#878787ff","to_linear":{"hex":"#3e3e3eff","u16":[15878,15878,15878,65535]}}, +{"from_linear":{"hex":"#c1c1c1ff","u16":[49603,49603,49603,65535]},"in":"#888888ff","to_linear":{"hex":"#3f3f3fff","u16":[16135,16135,16135,65535]}}, +{"from_linear":{"hex":"#c2c2c2ff","u16":[49766,49766,49766,65535]},"in":"#898989ff","to_linear":{"hex":"#404040ff","u16":[16394,16394,16394,65535]}}, +{"from_linear":{"hex":"#c2c2c2ff","u16":[49928,49928,49928,65535]},"in":"#8a8a8aff","to_linear":{"hex":"#414141ff","u16":[16656,16656,16656,65535]}}, +{"from_linear":{"hex":"#c3c3c3ff","u16":[50089,50089,50089,65535]},"in":"#8b8b8bff","to_linear":{"hex":"#424242ff","u16":[16920,16920,16920,65535]}}, +{"from_linear":{"hex":"#c4c4c4ff","u16":[50250,50250,50250,65535]},"in":"#8c8c8cff","to_linear":{"hex":"#434343ff","u16":[17187,17187,17187,65535]}}, +{"from_linear":{"hex":"#c4c4c4ff","u16":[50410,50410,50410,65535]},"in":"#8d8d8dff","to_linear":{"hex":"#444444ff","u16":[17456,17456,17456,65535]}}, +{"from_linear":{"hex":"#c5c5c5ff","u16":[50569,50569,50569,65535]},"in":"#8e8e8eff","to_linear":{"hex":"#454545ff","u16":[17727,17727,17727,65535]}}, +{"from_linear":{"hex":"#c5c5c5ff","u16":[50728,50728,50728,65535]},"in":"#8f8f8fff","to_linear":{"hex":"#464646ff","u16":[18001,18001,18001,65535]}}, +{"from_linear":{"hex":"#c6c6c6ff","u16":[50886,50886,50886,65535]},"in":"#909090ff","to_linear":{"hex":"#474747ff","u16":[18277,18277,18277,65535]}}, +{"from_linear":{"hex":"#c7c7c7ff","u16":[51043,51043,51043,65535]},"in":"#919191ff","to_linear":{"hex":"#484848ff","u16":[18556,18556,18556,65535]}}, +{"from_linear":{"hex":"#c7c7c7ff","u16":[51200,51200,51200,65535]},"in":"#929292ff","to_linear":{"hex":"#494949ff","u16":[18837,18837,18837,65535]}}, +{"from_linear":{"hex":"#c8c8c8ff","u16":[51356,51356,51356,65535]},"in":"#939393ff","to_linear":{"hex":"#4a4a4aff","u16":[19121,19121,19121,65535]}}, +{"from_linear":{"hex":"#c8c8c8ff","u16":[51511,51511,51511,65535]},"in":"#949494ff","to_linear":{"hex":"#4c4c4cff","u16":[19407,19407,19407,65535]}}, +{"from_linear":{"hex":"#c9c9c9ff","u16":[51666,51666,51666,65535]},"in":"#959595ff","to_linear":{"hex":"#4d4d4dff","u16":[19696,19696,19696,65535]}}, +{"from_linear":{"hex":"#cacacaff","u16":[51821,51821,51821,65535]},"in":"#969696ff","to_linear":{"hex":"#4e4e4eff","u16":[19987,19987,19987,65535]}}, +{"from_linear":{"hex":"#cacacaff","u16":[51974,51974,51974,65535]},"in":"#979797ff","to_linear":{"hex":"#4f4f4fff","u16":[20281,20281,20281,65535]}}, +{"from_linear":{"hex":"#cbcbcbff","u16":[52127,52127,52127,65535]},"in":"#989898ff","to_linear":{"hex":"#505050ff","u16":[20577,20577,20577,65535]}}, +{"from_linear":{"hex":"#cbcbcbff","u16":[52280,52280,52280,65535]},"in":"#999999ff","to_linear":{"hex":"#515151ff","u16":[20876,20876,20876,65535]}}, +{"from_linear":{"hex":"#ccccccff","u16":[52432,52432,52432,65535]},"in":"#9a9a9aff","to_linear":{"hex":"#525252ff","u16":[21177,21177,21177,65535]}}, +{"from_linear":{"hex":"#cdcdcdff","u16":[52583,52583,52583,65535]},"in":"#9b9b9bff","to_linear":{"hex":"#545454ff","u16":[21481,21481,21481,65535]}}, +{"from_linear":{"hex":"#cdcdcdff","u16":[52734,52734,52734,65535]},"in":"#9c9c9cff","to_linear":{"hex":"#555555ff","u16":[21787,21787,21787,65535]}}, +{"from_linear":{"hex":"#cececeff","u16":[52884,52884,52884,65535]},"in":"#9d9d9dff","to_linear":{"hex":"#565656ff","u16":[22096,22096,22096,65535]}}, +{"from_linear":{"hex":"#cececeff","u16":[53034,53034,53034,65535]},"in":"#9e9e9eff","to_linear":{"hex":"#575757ff","u16":[22407,22407,22407,65535]}}, +{"from_linear":{"hex":"#cfcfcfff","u16":[53183,53183,53183,65535]},"in":"#9f9f9fff","to_linear":{"hex":"#585858ff","u16":[22721,22721,22721,65535]}}, +{"from_linear":{"hex":"#d0d0d0ff","u16":[53331,53331,53331,65535]},"in":"#a0a0a0ff","to_linear":{"hex":"#5a5a5aff","u16":[23038,23038,23038,65535]}}, +{"from_linear":{"hex":"#d0d0d0ff","u16":[53479,53479,53479,65535]},"in":"#a1a1a1ff","to_linear":{"hex":"#5b5b5bff","u16":[23357,23357,23357,65535]}}, +{"from_linear":{"hex":"#d1d1d1ff","u16":[53627,53627,53627,65535]},"in":"#a2a2a2ff","to_linear":{"hex":"#5c5c5cff","u16":[23678,23678,23678,65535]}}, +{"from_linear":{"hex":"#d1d1d1ff","u16":[53774,53774,53774,65535]},"in":"#a3a3a3ff","to_linear":{"hex":"#5d5d5dff","u16":[24002,24002,24002,65535]}}, +{"from_linear":{"hex":"#d2d2d2ff","u16":[53920,53920,53920,65535]},"in":"#a4a4a4ff","to_linear":{"hex":"#5f5f5fff","u16":[24329,24329,24329,65535]}}, +{"from_linear":{"hex":"#d2d2d2ff","u16":[54066,54066,54066,65535]},"in":"#a5a5a5ff","to_linear":{"hex":"#606060ff","u16":[24658,24658,24658,65535]}}, +{"from_linear":{"hex":"#d3d3d3ff","u16":[54211,54211,54211,65535]},"in":"#a6a6a6ff","to_linear":{"hex":"#616161ff","u16":[24990,24990,24990,65535]}}, +{"from_linear":{"hex":"#d4d4d4ff","u16":[54356,54356,54356,65535]},"in":"#a7a7a7ff","to_linear":{"hex":"#636363ff","u16":[25325,25325,25325,65535]}}, +{"from_linear":{"hex":"#d4d4d4ff","u16":[54500,54500,54500,65535]},"in":"#a8a8a8ff","to_linear":{"hex":"#646464ff","u16":[25662,25662,25662,65535]}}, +{"from_linear":{"hex":"#d5d5d5ff","u16":[54644,54644,54644,65535]},"in":"#a9a9a9ff","to_linear":{"hex":"#656565ff","u16":[26001,26001,26001,65535]}}, +{"from_linear":{"hex":"#d5d5d5ff","u16":[54788,54788,54788,65535]},"in":"#aaaaaaff","to_linear":{"hex":"#676767ff","u16":[26344,26344,26344,65535]}}, +{"from_linear":{"hex":"#d6d6d6ff","u16":[54931,54931,54931,65535]},"in":"#abababff","to_linear":{"hex":"#686868ff","u16":[26688,26688,26688,65535]}}, +{"from_linear":{"hex":"#d6d6d6ff","u16":[55073,55073,55073,65535]},"in":"#acacacff","to_linear":{"hex":"#696969ff","u16":[27036,27036,27036,65535]}}, +{"from_linear":{"hex":"#d7d7d7ff","u16":[55215,55215,55215,65535]},"in":"#adadadff","to_linear":{"hex":"#6b6b6bff","u16":[27386,27386,27386,65535]}}, +{"from_linear":{"hex":"#d7d7d7ff","u16":[55356,55356,55356,65535]},"in":"#aeaeaeff","to_linear":{"hex":"#6c6c6cff","u16":[27739,27739,27739,65535]}}, +{"from_linear":{"hex":"#d8d8d8ff","u16":[55497,55497,55497,65535]},"in":"#afafafff","to_linear":{"hex":"#6d6d6dff","u16":[28094,28094,28094,65535]}}, +{"from_linear":{"hex":"#d8d8d8ff","u16":[55638,55638,55638,65535]},"in":"#b0b0b0ff","to_linear":{"hex":"#6f6f6fff","u16":[28452,28452,28452,65535]}}, +{"from_linear":{"hex":"#d9d9d9ff","u16":[55778,55778,55778,65535]},"in":"#b1b1b1ff","to_linear":{"hex":"#707070ff","u16":[28813,28813,28813,65535]}}, +{"from_linear":{"hex":"#dadadaff","u16":[55917,55917,55917,65535]},"in":"#b2b2b2ff","to_linear":{"hex":"#727272ff","u16":[29176,29176,29176,65535]}}, +{"from_linear":{"hex":"#dadadaff","u16":[56056,56056,56056,65535]},"in":"#b3b3b3ff","to_linear":{"hex":"#737373ff","u16":[29542,29542,29542,65535]}}, +{"from_linear":{"hex":"#dbdbdbff","u16":[56195,56195,56195,65535]},"in":"#b4b4b4ff","to_linear":{"hex":"#747474ff","u16":[29911,29911,29911,65535]}}, +{"from_linear":{"hex":"#dbdbdbff","u16":[56333,56333,56333,65535]},"in":"#b5b5b5ff","to_linear":{"hex":"#767676ff","u16":[30282,30282,30282,65535]}}, +{"from_linear":{"hex":"#dcdcdcff","u16":[56471,56471,56471,65535]},"in":"#b6b6b6ff","to_linear":{"hex":"#777777ff","u16":[30656,30656,30656,65535]}}, +{"from_linear":{"hex":"#dcdcdcff","u16":[56608,56608,56608,65535]},"in":"#b7b7b7ff","to_linear":{"hex":"#797979ff","u16":[31033,31033,31033,65535]}}, +{"from_linear":{"hex":"#ddddddff","u16":[56745,56745,56745,65535]},"in":"#b8b8b8ff","to_linear":{"hex":"#7a7a7aff","u16":[31412,31412,31412,65535]}}, +{"from_linear":{"hex":"#ddddddff","u16":[56882,56882,56882,65535]},"in":"#b9b9b9ff","to_linear":{"hex":"#7c7c7cff","u16":[31794,31794,31794,65535]}}, +{"from_linear":{"hex":"#dededeff","u16":[57018,57018,57018,65535]},"in":"#bababaff","to_linear":{"hex":"#7d7d7dff","u16":[32179,32179,32179,65535]}}, +{"from_linear":{"hex":"#dededeff","u16":[57153,57153,57153,65535]},"in":"#bbbbbbff","to_linear":{"hex":"#7f7f7fff","u16":[32567,32567,32567,65535]}}, +{"from_linear":{"hex":"#dfdfdfff","u16":[57288,57288,57288,65535]},"in":"#bcbcbcff","to_linear":{"hex":"#808080ff","u16":[32957,32957,32957,65535]}}, +{"from_linear":{"hex":"#dfdfdfff","u16":[57423,57423,57423,65535]},"in":"#bdbdbdff","to_linear":{"hex":"#828282ff","u16":[33350,33350,33350,65535]}}, +{"from_linear":{"hex":"#e0e0e0ff","u16":[57558,57558,57558,65535]},"in":"#bebebeff","to_linear":{"hex":"#838383ff","u16":[33745,33745,33745,65535]}}, +{"from_linear":{"hex":"#e0e0e0ff","u16":[57691,57691,57691,65535]},"in":"#bfbfbfff","to_linear":{"hex":"#858585ff","u16":[34143,34143,34143,65535]}}, +{"from_linear":{"hex":"#e1e1e1ff","u16":[57825,57825,57825,65535]},"in":"#c0c0c0ff","to_linear":{"hex":"#868686ff","u16":[34544,34544,34544,65535]}}, +{"from_linear":{"hex":"#e2e2e2ff","u16":[57958,57958,57958,65535]},"in":"#c1c1c1ff","to_linear":{"hex":"#888888ff","u16":[34948,34948,34948,65535]}}, +{"from_linear":{"hex":"#e2e2e2ff","u16":[58091,58091,58091,65535]},"in":"#c2c2c2ff","to_linear":{"hex":"#8a8a8aff","u16":[35355,35355,35355,65535]}}, +{"from_linear":{"hex":"#e3e3e3ff","u16":[58223,58223,58223,65535]},"in":"#c3c3c3ff","to_linear":{"hex":"#8b8b8bff","u16":[35764,35764,35764,65535]}}, +{"from_linear":{"hex":"#e3e3e3ff","u16":[58355,58355,58355,65535]},"in":"#c4c4c4ff","to_linear":{"hex":"#8d8d8dff","u16":[36176,36176,36176,65535]}}, +{"from_linear":{"hex":"#e4e4e4ff","u16":[58487,58487,58487,65535]},"in":"#c5c5c5ff","to_linear":{"hex":"#8e8e8eff","u16":[36591,36591,36591,65535]}}, +{"from_linear":{"hex":"#e4e4e4ff","u16":[58618,58618,58618,65535]},"in":"#c6c6c6ff","to_linear":{"hex":"#909090ff","u16":[37008,37008,37008,65535]}}, +{"from_linear":{"hex":"#e5e5e5ff","u16":[58748,58748,58748,65535]},"in":"#c7c7c7ff","to_linear":{"hex":"#929292ff","u16":[37429,37429,37429,65535]}}, +{"from_linear":{"hex":"#e5e5e5ff","u16":[58879,58879,58879,65535]},"in":"#c8c8c8ff","to_linear":{"hex":"#939393ff","u16":[37852,37852,37852,65535]}}, +{"from_linear":{"hex":"#e6e6e6ff","u16":[59009,59009,59009,65535]},"in":"#c9c9c9ff","to_linear":{"hex":"#959595ff","u16":[38278,38278,38278,65535]}}, +{"from_linear":{"hex":"#e6e6e6ff","u16":[59138,59138,59138,65535]},"in":"#cacacaff","to_linear":{"hex":"#979797ff","u16":[38706,38706,38706,65535]}}, +{"from_linear":{"hex":"#e7e7e7ff","u16":[59268,59268,59268,65535]},"in":"#cbcbcbff","to_linear":{"hex":"#989898ff","u16":[39138,39138,39138,65535]}}, +{"from_linear":{"hex":"#e7e7e7ff","u16":[59396,59396,59396,65535]},"in":"#ccccccff","to_linear":{"hex":"#9a9a9aff","u16":[39572,39572,39572,65535]}}, +{"from_linear":{"hex":"#e8e8e8ff","u16":[59525,59525,59525,65535]},"in":"#cdcdcdff","to_linear":{"hex":"#9c9c9cff","u16":[40009,40009,40009,65535]}}, +{"from_linear":{"hex":"#e8e8e8ff","u16":[59653,59653,59653,65535]},"in":"#cececeff","to_linear":{"hex":"#9d9d9dff","u16":[40449,40449,40449,65535]}}, +{"from_linear":{"hex":"#e9e9e9ff","u16":[59781,59781,59781,65535]},"in":"#cfcfcfff","to_linear":{"hex":"#9f9f9fff","u16":[40891,40891,40891,65535]}}, +{"from_linear":{"hex":"#e9e9e9ff","u16":[59908,59908,59908,65535]},"in":"#d0d0d0ff","to_linear":{"hex":"#a1a1a1ff","u16":[41337,41337,41337,65535]}}, +{"from_linear":{"hex":"#eaeaeaff","u16":[60035,60035,60035,65535]},"in":"#d1d1d1ff","to_linear":{"hex":"#a3a3a3ff","u16":[41785,41785,41785,65535]}}, +{"from_linear":{"hex":"#eaeaeaff","u16":[60162,60162,60162,65535]},"in":"#d2d2d2ff","to_linear":{"hex":"#a4a4a4ff","u16":[42236,42236,42236,65535]}}, +{"from_linear":{"hex":"#ebebebff","u16":[60288,60288,60288,65535]},"in":"#d3d3d3ff","to_linear":{"hex":"#a6a6a6ff","u16":[42690,42690,42690,65535]}}, +{"from_linear":{"hex":"#ebebebff","u16":[60414,60414,60414,65535]},"in":"#d4d4d4ff","to_linear":{"hex":"#a8a8a8ff","u16":[43147,43147,43147,65535]}}, +{"from_linear":{"hex":"#ecececff","u16":[60540,60540,60540,65535]},"in":"#d5d5d5ff","to_linear":{"hex":"#aaaaaaff","u16":[43606,43606,43606,65535]}}, +{"from_linear":{"hex":"#ecececff","u16":[60665,60665,60665,65535]},"in":"#d6d6d6ff","to_linear":{"hex":"#abababff","u16":[44069,44069,44069,65535]}}, +{"from_linear":{"hex":"#edededff","u16":[60790,60790,60790,65535]},"in":"#d7d7d7ff","to_linear":{"hex":"#adadadff","u16":[44534,44534,44534,65535]}}, +{"from_linear":{"hex":"#edededff","u16":[60915,60915,60915,65535]},"in":"#d8d8d8ff","to_linear":{"hex":"#afafafff","u16":[45002,45002,45002,65535]}}, +{"from_linear":{"hex":"#eeeeeeff","u16":[61039,61039,61039,65535]},"in":"#d9d9d9ff","to_linear":{"hex":"#b1b1b1ff","u16":[45473,45473,45473,65535]}}, +{"from_linear":{"hex":"#eeeeeeff","u16":[61163,61163,61163,65535]},"in":"#dadadaff","to_linear":{"hex":"#b3b3b3ff","u16":[45947,45947,45947,65535]}}, +{"from_linear":{"hex":"#eeeeeeff","u16":[61287,61287,61287,65535]},"in":"#dbdbdbff","to_linear":{"hex":"#b5b5b5ff","u16":[46423,46423,46423,65535]}}, +{"from_linear":{"hex":"#efefefff","u16":[61410,61410,61410,65535]},"in":"#dcdcdcff","to_linear":{"hex":"#b7b7b7ff","u16":[46903,46903,46903,65535]}}, +{"from_linear":{"hex":"#efefefff","u16":[61533,61533,61533,65535]},"in":"#ddddddff","to_linear":{"hex":"#b8b8b8ff","u16":[47385,47385,47385,65535]}}, +{"from_linear":{"hex":"#f0f0f0ff","u16":[61656,61656,61656,65535]},"in":"#dededeff","to_linear":{"hex":"#bababaff","u16":[47871,47871,47871,65535]}}, +{"from_linear":{"hex":"#f0f0f0ff","u16":[61778,61778,61778,65535]},"in":"#dfdfdfff","to_linear":{"hex":"#bcbcbcff","u16":[48359,48359,48359,65535]}}, +{"from_linear":{"hex":"#f1f1f1ff","u16":[61900,61900,61900,65535]},"in":"#e0e0e0ff","to_linear":{"hex":"#bebebeff","u16":[48850,48850,48850,65535]}}, +{"from_linear":{"hex":"#f1f1f1ff","u16":[62022,62022,62022,65535]},"in":"#e1e1e1ff","to_linear":{"hex":"#c0c0c0ff","u16":[49344,49344,49344,65535]}}, +{"from_linear":{"hex":"#f2f2f2ff","u16":[62143,62143,62143,65535]},"in":"#e2e2e2ff","to_linear":{"hex":"#c2c2c2ff","u16":[49841,49841,49841,65535]}}, +{"from_linear":{"hex":"#f2f2f2ff","u16":[62264,62264,62264,65535]},"in":"#e3e3e3ff","to_linear":{"hex":"#c4c4c4ff","u16":[50341,50341,50341,65535]}}, +{"from_linear":{"hex":"#f3f3f3ff","u16":[62385,62385,62385,65535]},"in":"#e4e4e4ff","to_linear":{"hex":"#c6c6c6ff","u16":[50844,50844,50844,65535]}}, +{"from_linear":{"hex":"#f3f3f3ff","u16":[62505,62505,62505,65535]},"in":"#e5e5e5ff","to_linear":{"hex":"#c8c8c8ff","u16":[51349,51349,51349,65535]}}, +{"from_linear":{"hex":"#f4f4f4ff","u16":[62625,62625,62625,65535]},"in":"#e6e6e6ff","to_linear":{"hex":"#cacacaff","u16":[51858,51858,51858,65535]}}, +{"from_linear":{"hex":"#f4f4f4ff","u16":[62745,62745,62745,65535]},"in":"#e7e7e7ff","to_linear":{"hex":"#ccccccff","u16":[52369,52369,52369,65535]}}, +{"from_linear":{"hex":"#f5f5f5ff","u16":[62865,62865,62865,65535]},"in":"#e8e8e8ff","to_linear":{"hex":"#cececeff","u16":[52884,52884,52884,65535]}}, +{"from_linear":{"hex":"#f5f5f5ff","u16":[62984,62984,62984,65535]},"in":"#e9e9e9ff","to_linear":{"hex":"#d0d0d0ff","u16":[53401,53401,53401,65535]}}, +{"from_linear":{"hex":"#f6f6f6ff","u16":[63103,63103,63103,65535]},"in":"#eaeaeaff","to_linear":{"hex":"#d2d2d2ff","u16":[53921,53921,53921,65535]}}, +{"from_linear":{"hex":"#f6f6f6ff","u16":[63222,63222,63222,65535]},"in":"#ebebebff","to_linear":{"hex":"#d4d4d4ff","u16":[54445,54445,54445,65535]}}, +{"from_linear":{"hex":"#f6f6f6ff","u16":[63340,63340,63340,65535]},"in":"#ecececff","to_linear":{"hex":"#d6d6d6ff","u16":[54971,54971,54971,65535]}}, +{"from_linear":{"hex":"#f7f7f7ff","u16":[63458,63458,63458,65535]},"in":"#edededff","to_linear":{"hex":"#d8d8d8ff","u16":[55500,55500,55500,65535]}}, +{"from_linear":{"hex":"#f7f7f7ff","u16":[63576,63576,63576,65535]},"in":"#eeeeeeff","to_linear":{"hex":"#dadadaff","u16":[56032,56032,56032,65535]}}, +{"from_linear":{"hex":"#f8f8f8ff","u16":[63693,63693,63693,65535]},"in":"#efefefff","to_linear":{"hex":"#dcdcdcff","u16":[56567,56567,56567,65535]}}, +{"from_linear":{"hex":"#f8f8f8ff","u16":[63810,63810,63810,65535]},"in":"#f0f0f0ff","to_linear":{"hex":"#dededeff","u16":[57105,57105,57105,65535]}}, +{"from_linear":{"hex":"#f9f9f9ff","u16":[63927,63927,63927,65535]},"in":"#f1f1f1ff","to_linear":{"hex":"#e0e0e0ff","u16":[57646,57646,57646,65535]}}, +{"from_linear":{"hex":"#f9f9f9ff","u16":[64044,64044,64044,65535]},"in":"#f2f2f2ff","to_linear":{"hex":"#e2e2e2ff","u16":[58190,58190,58190,65535]}}, +{"from_linear":{"hex":"#fafafaff","u16":[64160,64160,64160,65535]},"in":"#f3f3f3ff","to_linear":{"hex":"#e5e5e5ff","u16":[58737,58737,58737,65535]}}, +{"from_linear":{"hex":"#fafafaff","u16":[64276,64276,64276,65535]},"in":"#f4f4f4ff","to_linear":{"hex":"#e7e7e7ff","u16":[59287,59287,59287,65535]}}, +{"from_linear":{"hex":"#fbfbfbff","u16":[64392,64392,64392,65535]},"in":"#f5f5f5ff","to_linear":{"hex":"#e9e9e9ff","u16":[59840,59840,59840,65535]}}, +{"from_linear":{"hex":"#fbfbfbff","u16":[64508,64508,64508,65535]},"in":"#f6f6f6ff","to_linear":{"hex":"#ebebebff","u16":[60396,60396,60396,65535]}}, +{"from_linear":{"hex":"#fbfbfbff","u16":[64623,64623,64623,65535]},"in":"#f7f7f7ff","to_linear":{"hex":"#edededff","u16":[60955,60955,60955,65535]}}, +{"from_linear":{"hex":"#fcfcfcff","u16":[64738,64738,64738,65535]},"in":"#f8f8f8ff","to_linear":{"hex":"#efefefff","u16":[61517,61517,61517,65535]}}, +{"from_linear":{"hex":"#fcfcfcff","u16":[64852,64852,64852,65535]},"in":"#f9f9f9ff","to_linear":{"hex":"#f2f2f2ff","u16":[62082,62082,62082,65535]}}, +{"from_linear":{"hex":"#fdfdfdff","u16":[64967,64967,64967,65535]},"in":"#fafafaff","to_linear":{"hex":"#f4f4f4ff","u16":[62650,62650,62650,65535]}}, +{"from_linear":{"hex":"#fdfdfdff","u16":[65081,65081,65081,65535]},"in":"#fbfbfbff","to_linear":{"hex":"#f6f6f6ff","u16":[63221,63221,63221,65535]}}, +{"from_linear":{"hex":"#fefefeff","u16":[65195,65195,65195,65535]},"in":"#fcfcfcff","to_linear":{"hex":"#f8f8f8ff","u16":[63795,63795,63795,65535]}}, +{"from_linear":{"hex":"#fefefeff","u16":[65309,65309,65309,65535]},"in":"#fdfdfdff","to_linear":{"hex":"#fafafaff","u16":[64372,64372,64372,65535]}}, +{"from_linear":{"hex":"#ffffffff","u16":[65422,65422,65422,65535]},"in":"#fefefeff","to_linear":{"hex":"#fdfdfdff","u16":[64952,64952,64952,65535]}}, +{"from_linear":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"in":"#ffffffff","to_linear":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]}}, +{"from_linear":{"hex":"#0d0000ff","u16":[3266,0,0,65535]},"in":"#010000ff","to_linear":{"hex":"#000000ff","u16":[20,0,0,65535]}}, +{"from_linear":{"hex":"#160000ff","u16":[5567,0,0,65535]},"in":"#020000ff","to_linear":{"hex":"#000000ff","u16":[40,0,0,65535]}}, +{"from_linear":{"hex":"#1c0000ff","u16":[7255,0,0,65535]},"in":"#030000ff","to_linear":{"hex":"#000000ff","u16":[60,0,0,65535]}}, +{"from_linear":{"hex":"#220000ff","u16":[8638,0,0,65535]},"in":"#040000ff","to_linear":{"hex":"#000000ff","u16":[80,0,0,65535]}}, +{"from_linear":{"hex":"#260000ff","u16":[9831,0,0,65535]},"in":"#050000ff","to_linear":{"hex":"#000000ff","u16":[99,0,0,65535]}}, +{"from_linear":{"hex":"#2a0000ff","u16":[10891,0,0,65535]},"in":"#060000ff","to_linear":{"hex":"#000000ff","u16":[119,0,0,65535]}}, +{"from_linear":{"hex":"#2e0000ff","u16":[11853,0,0,65535]},"in":"#070000ff","to_linear":{"hex":"#010000ff","u16":[139,0,0,65535]}}, +{"from_linear":{"hex":"#320000ff","u16":[12737,0,0,65535]},"in":"#080000ff","to_linear":{"hex":"#010000ff","u16":[159,0,0,65535]}}, +{"from_linear":{"hex":"#350000ff","u16":[13559,0,0,65535]},"in":"#090000ff","to_linear":{"hex":"#010000ff","u16":[179,0,0,65535]}}, +{"from_linear":{"hex":"#380000ff","u16":[14329,0,0,65535]},"in":"#0a0000ff","to_linear":{"hex":"#010000ff","u16":[199,0,0,65535]}}, +{"from_linear":{"hex":"#3b0000ff","u16":[15056,0,0,65535]},"in":"#0b0000ff","to_linear":{"hex":"#010000ff","u16":[219,0,0,65535]}}, +{"from_linear":{"hex":"#3d0000ff","u16":[15745,0,0,65535]},"in":"#0c0000ff","to_linear":{"hex":"#010000ff","u16":[241,0,0,65535]}}, +{"from_linear":{"hex":"#400000ff","u16":[16401,0,0,65535]},"in":"#0d0000ff","to_linear":{"hex":"#010000ff","u16":[264,0,0,65535]}}, +{"from_linear":{"hex":"#420000ff","u16":[17028,0,0,65535]},"in":"#0e0000ff","to_linear":{"hex":"#010000ff","u16":[288,0,0,65535]}}, +{"from_linear":{"hex":"#450000ff","u16":[17630,0,0,65535]},"in":"#0f0000ff","to_linear":{"hex":"#010000ff","u16":[313,0,0,65535]}}, +{"from_linear":{"hex":"#470000ff","u16":[18209,0,0,65535]},"in":"#100000ff","to_linear":{"hex":"#010000ff","u16":[340,0,0,65535]}}, +{"from_linear":{"hex":"#490000ff","u16":[18767,0,0,65535]},"in":"#110000ff","to_linear":{"hex":"#010000ff","u16":[367,0,0,65535]}}, +{"from_linear":{"hex":"#4b0000ff","u16":[19306,0,0,65535]},"in":"#120000ff","to_linear":{"hex":"#020000ff","u16":[396,0,0,65535]}}, +{"from_linear":{"hex":"#4d0000ff","u16":[19828,0,0,65535]},"in":"#130000ff","to_linear":{"hex":"#020000ff","u16":[427,0,0,65535]}}, +{"from_linear":{"hex":"#4f0000ff","u16":[20334,0,0,65535]},"in":"#140000ff","to_linear":{"hex":"#020000ff","u16":[458,0,0,65535]}}, +{"from_linear":{"hex":"#510000ff","u16":[20826,0,0,65535]},"in":"#150000ff","to_linear":{"hex":"#020000ff","u16":[491,0,0,65535]}}, +{"from_linear":{"hex":"#530000ff","u16":[21304,0,0,65535]},"in":"#160000ff","to_linear":{"hex":"#020000ff","u16":[526,0,0,65535]}}, +{"from_linear":{"hex":"#550000ff","u16":[21769,0,0,65535]},"in":"#170000ff","to_linear":{"hex":"#020000ff","u16":[562,0,0,65535]}}, +{"from_linear":{"hex":"#560000ff","u16":[22223,0,0,65535]},"in":"#180000ff","to_linear":{"hex":"#020000ff","u16":[599,0,0,65535]}}, +{"from_linear":{"hex":"#580000ff","u16":[22667,0,0,65535]},"in":"#190000ff","to_linear":{"hex":"#020000ff","u16":[637,0,0,65535]}}, +{"from_linear":{"hex":"#5a0000ff","u16":[23099,0,0,65535]},"in":"#1a0000ff","to_linear":{"hex":"#030000ff","u16":[677,0,0,65535]}}, +{"from_linear":{"hex":"#5c0000ff","u16":[23523,0,0,65535]},"in":"#1b0000ff","to_linear":{"hex":"#030000ff","u16":[718,0,0,65535]}}, +{"from_linear":{"hex":"#5d0000ff","u16":[23937,0,0,65535]},"in":"#1c0000ff","to_linear":{"hex":"#030000ff","u16":[761,0,0,65535]}}, +{"from_linear":{"hex":"#5f0000ff","u16":[24342,0,0,65535]},"in":"#1d0000ff","to_linear":{"hex":"#030000ff","u16":[805,0,0,65535]}}, +{"from_linear":{"hex":"#600000ff","u16":[24740,0,0,65535]},"in":"#1e0000ff","to_linear":{"hex":"#030000ff","u16":[851,0,0,65535]}}, +{"from_linear":{"hex":"#620000ff","u16":[25130,0,0,65535]},"in":"#1f0000ff","to_linear":{"hex":"#030000ff","u16":[898,0,0,65535]}}, +{"from_linear":{"hex":"#630000ff","u16":[25513,0,0,65535]},"in":"#200000ff","to_linear":{"hex":"#040000ff","u16":[947,0,0,65535]}}, +{"from_linear":{"hex":"#650000ff","u16":[25888,0,0,65535]},"in":"#210000ff","to_linear":{"hex":"#040000ff","u16":[997,0,0,65535]}}, +{"from_linear":{"hex":"#660000ff","u16":[26257,0,0,65535]},"in":"#220000ff","to_linear":{"hex":"#040000ff","u16":[1048,0,0,65535]}}, +{"from_linear":{"hex":"#680000ff","u16":[26620,0,0,65535]},"in":"#230000ff","to_linear":{"hex":"#040000ff","u16":[1101,0,0,65535]}}, +{"from_linear":{"hex":"#690000ff","u16":[26977,0,0,65535]},"in":"#240000ff","to_linear":{"hex":"#040000ff","u16":[1156,0,0,65535]}}, +{"from_linear":{"hex":"#6a0000ff","u16":[27328,0,0,65535]},"in":"#250000ff","to_linear":{"hex":"#050000ff","u16":[1212,0,0,65535]}}, +{"from_linear":{"hex":"#6c0000ff","u16":[27674,0,0,65535]},"in":"#260000ff","to_linear":{"hex":"#050000ff","u16":[1270,0,0,65535]}}, +{"from_linear":{"hex":"#6d0000ff","u16":[28014,0,0,65535]},"in":"#270000ff","to_linear":{"hex":"#050000ff","u16":[1330,0,0,65535]}}, +{"from_linear":{"hex":"#6e0000ff","u16":[28350,0,0,65535]},"in":"#280000ff","to_linear":{"hex":"#050000ff","u16":[1391,0,0,65535]}}, +{"from_linear":{"hex":"#700000ff","u16":[28680,0,0,65535]},"in":"#290000ff","to_linear":{"hex":"#060000ff","u16":[1453,0,0,65535]}}, +{"from_linear":{"hex":"#710000ff","u16":[29006,0,0,65535]},"in":"#2a0000ff","to_linear":{"hex":"#060000ff","u16":[1517,0,0,65535]}}, +{"from_linear":{"hex":"#720000ff","u16":[29327,0,0,65535]},"in":"#2b0000ff","to_linear":{"hex":"#060000ff","u16":[1583,0,0,65535]}}, +{"from_linear":{"hex":"#730000ff","u16":[29644,0,0,65535]},"in":"#2c0000ff","to_linear":{"hex":"#060000ff","u16":[1651,0,0,65535]}}, +{"from_linear":{"hex":"#750000ff","u16":[29957,0,0,65535]},"in":"#2d0000ff","to_linear":{"hex":"#070000ff","u16":[1720,0,0,65535]}}, +{"from_linear":{"hex":"#760000ff","u16":[30266,0,0,65535]},"in":"#2e0000ff","to_linear":{"hex":"#070000ff","u16":[1790,0,0,65535]}}, +{"from_linear":{"hex":"#770000ff","u16":[30571,0,0,65535]},"in":"#2f0000ff","to_linear":{"hex":"#070000ff","u16":[1863,0,0,65535]}}, +{"from_linear":{"hex":"#780000ff","u16":[30872,0,0,65535]},"in":"#300000ff","to_linear":{"hex":"#080000ff","u16":[1937,0,0,65535]}}, +{"from_linear":{"hex":"#790000ff","u16":[31169,0,0,65535]},"in":"#310000ff","to_linear":{"hex":"#080000ff","u16":[2013,0,0,65535]}}, +{"from_linear":{"hex":"#7a0000ff","u16":[31463,0,0,65535]},"in":"#320000ff","to_linear":{"hex":"#080000ff","u16":[2090,0,0,65535]}}, +{"from_linear":{"hex":"#7c0000ff","u16":[31754,0,0,65535]},"in":"#330000ff","to_linear":{"hex":"#080000ff","u16":[2170,0,0,65535]}}, +{"from_linear":{"hex":"#7d0000ff","u16":[32041,0,0,65535]},"in":"#340000ff","to_linear":{"hex":"#090000ff","u16":[2250,0,0,65535]}}, +{"from_linear":{"hex":"#7e0000ff","u16":[32325,0,0,65535]},"in":"#350000ff","to_linear":{"hex":"#090000ff","u16":[2333,0,0,65535]}}, +{"from_linear":{"hex":"#7f0000ff","u16":[32606,0,0,65535]},"in":"#360000ff","to_linear":{"hex":"#090000ff","u16":[2418,0,0,65535]}}, +{"from_linear":{"hex":"#800000ff","u16":[32884,0,0,65535]},"in":"#370000ff","to_linear":{"hex":"#0a0000ff","u16":[2504,0,0,65535]}}, +{"from_linear":{"hex":"#810000ff","u16":[33159,0,0,65535]},"in":"#380000ff","to_linear":{"hex":"#0a0000ff","u16":[2592,0,0,65535]}}, +{"from_linear":{"hex":"#820000ff","u16":[33431,0,0,65535]},"in":"#390000ff","to_linear":{"hex":"#0a0000ff","u16":[2681,0,0,65535]}}, +{"from_linear":{"hex":"#830000ff","u16":[33700,0,0,65535]},"in":"#3a0000ff","to_linear":{"hex":"#0b0000ff","u16":[2773,0,0,65535]}}, +{"from_linear":{"hex":"#840000ff","u16":[33967,0,0,65535]},"in":"#3b0000ff","to_linear":{"hex":"#0b0000ff","u16":[2866,0,0,65535]}}, +{"from_linear":{"hex":"#850000ff","u16":[34231,0,0,65535]},"in":"#3c0000ff","to_linear":{"hex":"#0c0000ff","u16":[2961,0,0,65535]}}, +{"from_linear":{"hex":"#860000ff","u16":[34492,0,0,65535]},"in":"#3d0000ff","to_linear":{"hex":"#0c0000ff","u16":[3058,0,0,65535]}}, +{"from_linear":{"hex":"#870000ff","u16":[34751,0,0,65535]},"in":"#3e0000ff","to_linear":{"hex":"#0c0000ff","u16":[3157,0,0,65535]}}, +{"from_linear":{"hex":"#880000ff","u16":[35008,0,0,65535]},"in":"#3f0000ff","to_linear":{"hex":"#0d0000ff","u16":[3258,0,0,65535]}}, +{"from_linear":{"hex":"#890000ff","u16":[35262,0,0,65535]},"in":"#400000ff","to_linear":{"hex":"#0d0000ff","u16":[3360,0,0,65535]}}, +{"from_linear":{"hex":"#8a0000ff","u16":[35514,0,0,65535]},"in":"#410000ff","to_linear":{"hex":"#0d0000ff","u16":[3464,0,0,65535]}}, +{"from_linear":{"hex":"#8b0000ff","u16":[35764,0,0,65535]},"in":"#420000ff","to_linear":{"hex":"#0e0000ff","u16":[3570,0,0,65535]}}, +{"from_linear":{"hex":"#8c0000ff","u16":[36011,0,0,65535]},"in":"#430000ff","to_linear":{"hex":"#0e0000ff","u16":[3678,0,0,65535]}}, +{"from_linear":{"hex":"#8d0000ff","u16":[36256,0,0,65535]},"in":"#440000ff","to_linear":{"hex":"#0f0000ff","u16":[3788,0,0,65535]}}, +{"from_linear":{"hex":"#8e0000ff","u16":[36500,0,0,65535]},"in":"#450000ff","to_linear":{"hex":"#0f0000ff","u16":[3900,0,0,65535]}}, +{"from_linear":{"hex":"#8f0000ff","u16":[36741,0,0,65535]},"in":"#460000ff","to_linear":{"hex":"#100000ff","u16":[4014,0,0,65535]}}, +{"from_linear":{"hex":"#900000ff","u16":[36980,0,0,65535]},"in":"#470000ff","to_linear":{"hex":"#100000ff","u16":[4129,0,0,65535]}}, +{"from_linear":{"hex":"#910000ff","u16":[37217,0,0,65535]},"in":"#480000ff","to_linear":{"hex":"#110000ff","u16":[4247,0,0,65535]}}, +{"from_linear":{"hex":"#920000ff","u16":[37452,0,0,65535]},"in":"#490000ff","to_linear":{"hex":"#110000ff","u16":[4366,0,0,65535]}}, +{"from_linear":{"hex":"#930000ff","u16":[37686,0,0,65535]},"in":"#4a0000ff","to_linear":{"hex":"#110000ff","u16":[4488,0,0,65535]}}, +{"from_linear":{"hex":"#940000ff","u16":[37917,0,0,65535]},"in":"#4b0000ff","to_linear":{"hex":"#120000ff","u16":[4611,0,0,65535]}}, +{"from_linear":{"hex":"#940000ff","u16":[38147,0,0,65535]},"in":"#4c0000ff","to_linear":{"hex":"#120000ff","u16":[4736,0,0,65535]}}, +{"from_linear":{"hex":"#950000ff","u16":[38375,0,0,65535]},"in":"#4d0000ff","to_linear":{"hex":"#130000ff","u16":[4864,0,0,65535]}}, +{"from_linear":{"hex":"#960000ff","u16":[38601,0,0,65535]},"in":"#4e0000ff","to_linear":{"hex":"#130000ff","u16":[4993,0,0,65535]}}, +{"from_linear":{"hex":"#970000ff","u16":[38826,0,0,65535]},"in":"#4f0000ff","to_linear":{"hex":"#140000ff","u16":[5124,0,0,65535]}}, +{"from_linear":{"hex":"#980000ff","u16":[39049,0,0,65535]},"in":"#500000ff","to_linear":{"hex":"#140000ff","u16":[5257,0,0,65535]}}, +{"from_linear":{"hex":"#990000ff","u16":[39270,0,0,65535]},"in":"#510000ff","to_linear":{"hex":"#150000ff","u16":[5392,0,0,65535]}}, +{"from_linear":{"hex":"#9a0000ff","u16":[39490,0,0,65535]},"in":"#520000ff","to_linear":{"hex":"#160000ff","u16":[5530,0,0,65535]}}, +{"from_linear":{"hex":"#9b0000ff","u16":[39708,0,0,65535]},"in":"#530000ff","to_linear":{"hex":"#160000ff","u16":[5669,0,0,65535]}}, +{"from_linear":{"hex":"#9b0000ff","u16":[39925,0,0,65535]},"in":"#540000ff","to_linear":{"hex":"#170000ff","u16":[5810,0,0,65535]}}, +{"from_linear":{"hex":"#9c0000ff","u16":[40140,0,0,65535]},"in":"#550000ff","to_linear":{"hex":"#170000ff","u16":[5953,0,0,65535]}}, +{"from_linear":{"hex":"#9d0000ff","u16":[40354,0,0,65535]},"in":"#560000ff","to_linear":{"hex":"#180000ff","u16":[6099,0,0,65535]}}, +{"from_linear":{"hex":"#9e0000ff","u16":[40566,0,0,65535]},"in":"#570000ff","to_linear":{"hex":"#180000ff","u16":[6246,0,0,65535]}}, +{"from_linear":{"hex":"#9f0000ff","u16":[40777,0,0,65535]},"in":"#580000ff","to_linear":{"hex":"#190000ff","u16":[6395,0,0,65535]}}, +{"from_linear":{"hex":"#9f0000ff","u16":[40987,0,0,65535]},"in":"#590000ff","to_linear":{"hex":"#190000ff","u16":[6547,0,0,65535]}}, +{"from_linear":{"hex":"#a00000ff","u16":[41195,0,0,65535]},"in":"#5a0000ff","to_linear":{"hex":"#1a0000ff","u16":[6700,0,0,65535]}}, +{"from_linear":{"hex":"#a10000ff","u16":[41401,0,0,65535]},"in":"#5b0000ff","to_linear":{"hex":"#1b0000ff","u16":[6856,0,0,65535]}}, +{"from_linear":{"hex":"#a20000ff","u16":[41607,0,0,65535]},"in":"#5c0000ff","to_linear":{"hex":"#1b0000ff","u16":[7014,0,0,65535]}}, +{"from_linear":{"hex":"#a30000ff","u16":[41811,0,0,65535]},"in":"#5d0000ff","to_linear":{"hex":"#1c0000ff","u16":[7174,0,0,65535]}}, +{"from_linear":{"hex":"#a30000ff","u16":[42014,0,0,65535]},"in":"#5e0000ff","to_linear":{"hex":"#1d0000ff","u16":[7335,0,0,65535]}}, +{"from_linear":{"hex":"#a40000ff","u16":[42215,0,0,65535]},"in":"#5f0000ff","to_linear":{"hex":"#1d0000ff","u16":[7500,0,0,65535]}}, +{"from_linear":{"hex":"#a50000ff","u16":[42416,0,0,65535]},"in":"#600000ff","to_linear":{"hex":"#1e0000ff","u16":[7666,0,0,65535]}}, +{"from_linear":{"hex":"#a60000ff","u16":[42615,0,0,65535]},"in":"#610000ff","to_linear":{"hex":"#1e0000ff","u16":[7834,0,0,65535]}}, +{"from_linear":{"hex":"#a70000ff","u16":[42813,0,0,65535]},"in":"#620000ff","to_linear":{"hex":"#1f0000ff","u16":[8004,0,0,65535]}}, +{"from_linear":{"hex":"#a70000ff","u16":[43009,0,0,65535]},"in":"#630000ff","to_linear":{"hex":"#200000ff","u16":[8177,0,0,65535]}}, +{"from_linear":{"hex":"#a80000ff","u16":[43205,0,0,65535]},"in":"#640000ff","to_linear":{"hex":"#200000ff","u16":[8352,0,0,65535]}}, +{"from_linear":{"hex":"#a90000ff","u16":[43400,0,0,65535]},"in":"#650000ff","to_linear":{"hex":"#210000ff","u16":[8528,0,0,65535]}}, +{"from_linear":{"hex":"#aa0000ff","u16":[43593,0,0,65535]},"in":"#660000ff","to_linear":{"hex":"#220000ff","u16":[8708,0,0,65535]}}, +{"from_linear":{"hex":"#aa0000ff","u16":[43785,0,0,65535]},"in":"#670000ff","to_linear":{"hex":"#230000ff","u16":[8889,0,0,65535]}}, +{"from_linear":{"hex":"#ab0000ff","u16":[43976,0,0,65535]},"in":"#680000ff","to_linear":{"hex":"#230000ff","u16":[9072,0,0,65535]}}, +{"from_linear":{"hex":"#ac0000ff","u16":[44166,0,0,65535]},"in":"#690000ff","to_linear":{"hex":"#240000ff","u16":[9258,0,0,65535]}}, +{"from_linear":{"hex":"#ad0000ff","u16":[44355,0,0,65535]},"in":"#6a0000ff","to_linear":{"hex":"#250000ff","u16":[9445,0,0,65535]}}, +{"from_linear":{"hex":"#ad0000ff","u16":[44543,0,0,65535]},"in":"#6b0000ff","to_linear":{"hex":"#250000ff","u16":[9635,0,0,65535]}}, +{"from_linear":{"hex":"#ae0000ff","u16":[44730,0,0,65535]},"in":"#6c0000ff","to_linear":{"hex":"#260000ff","u16":[9828,0,0,65535]}}, +{"from_linear":{"hex":"#af0000ff","u16":[44916,0,0,65535]},"in":"#6d0000ff","to_linear":{"hex":"#270000ff","u16":[10022,0,0,65535]}}, +{"from_linear":{"hex":"#af0000ff","u16":[45101,0,0,65535]},"in":"#6e0000ff","to_linear":{"hex":"#280000ff","u16":[10219,0,0,65535]}}, +{"from_linear":{"hex":"#b00000ff","u16":[45285,0,0,65535]},"in":"#6f0000ff","to_linear":{"hex":"#290000ff","u16":[10417,0,0,65535]}}, +{"from_linear":{"hex":"#b10000ff","u16":[45468,0,0,65535]},"in":"#700000ff","to_linear":{"hex":"#290000ff","u16":[10619,0,0,65535]}}, +{"from_linear":{"hex":"#b20000ff","u16":[45651,0,0,65535]},"in":"#710000ff","to_linear":{"hex":"#2a0000ff","u16":[10822,0,0,65535]}}, +{"from_linear":{"hex":"#b20000ff","u16":[45832,0,0,65535]},"in":"#720000ff","to_linear":{"hex":"#2b0000ff","u16":[11028,0,0,65535]}}, +{"from_linear":{"hex":"#b30000ff","u16":[46012,0,0,65535]},"in":"#730000ff","to_linear":{"hex":"#2c0000ff","u16":[11235,0,0,65535]}}, +{"from_linear":{"hex":"#b40000ff","u16":[46191,0,0,65535]},"in":"#740000ff","to_linear":{"hex":"#2d0000ff","u16":[11446,0,0,65535]}}, +{"from_linear":{"hex":"#b40000ff","u16":[46370,0,0,65535]},"in":"#750000ff","to_linear":{"hex":"#2d0000ff","u16":[11658,0,0,65535]}}, +{"from_linear":{"hex":"#b50000ff","u16":[46547,0,0,65535]},"in":"#760000ff","to_linear":{"hex":"#2e0000ff","u16":[11873,0,0,65535]}}, +{"from_linear":{"hex":"#b60000ff","u16":[46724,0,0,65535]},"in":"#770000ff","to_linear":{"hex":"#2f0000ff","u16":[12090,0,0,65535]}}, +{"from_linear":{"hex":"#b60000ff","u16":[46900,0,0,65535]},"in":"#780000ff","to_linear":{"hex":"#300000ff","u16":[12309,0,0,65535]}}, +{"from_linear":{"hex":"#b70000ff","u16":[47075,0,0,65535]},"in":"#790000ff","to_linear":{"hex":"#310000ff","u16":[12530,0,0,65535]}}, +{"from_linear":{"hex":"#b80000ff","u16":[47249,0,0,65535]},"in":"#7a0000ff","to_linear":{"hex":"#320000ff","u16":[12754,0,0,65535]}}, +{"from_linear":{"hex":"#b90000ff","u16":[47422,0,0,65535]},"in":"#7b0000ff","to_linear":{"hex":"#330000ff","u16":[12980,0,0,65535]}}, +{"from_linear":{"hex":"#b90000ff","u16":[47594,0,0,65535]},"in":"#7c0000ff","to_linear":{"hex":"#330000ff","u16":[13209,0,0,65535]}}, +{"from_linear":{"hex":"#ba0000ff","u16":[47766,0,0,65535]},"in":"#7d0000ff","to_linear":{"hex":"#340000ff","u16":[13440,0,0,65535]}}, +{"from_linear":{"hex":"#bb0000ff","u16":[47937,0,0,65535]},"in":"#7e0000ff","to_linear":{"hex":"#350000ff","u16":[13673,0,0,65535]}}, +{"from_linear":{"hex":"#bb0000ff","u16":[48107,0,0,65535]},"in":"#7f0000ff","to_linear":{"hex":"#360000ff","u16":[13909,0,0,65535]}}, +{"from_linear":{"hex":"#bc0000ff","u16":[48276,0,0,65535]},"in":"#800000ff","to_linear":{"hex":"#370000ff","u16":[14146,0,0,65535]}}, +{"from_linear":{"hex":"#bd0000ff","u16":[48445,0,0,65535]},"in":"#810000ff","to_linear":{"hex":"#380000ff","u16":[14387,0,0,65535]}}, +{"from_linear":{"hex":"#bd0000ff","u16":[48612,0,0,65535]},"in":"#820000ff","to_linear":{"hex":"#390000ff","u16":[14629,0,0,65535]}}, +{"from_linear":{"hex":"#be0000ff","u16":[48779,0,0,65535]},"in":"#830000ff","to_linear":{"hex":"#3a0000ff","u16":[14874,0,0,65535]}}, +{"from_linear":{"hex":"#be0000ff","u16":[48946,0,0,65535]},"in":"#840000ff","to_linear":{"hex":"#3b0000ff","u16":[15122,0,0,65535]}}, +{"from_linear":{"hex":"#bf0000ff","u16":[49111,0,0,65535]},"in":"#850000ff","to_linear":{"hex":"#3c0000ff","u16":[15371,0,0,65535]}}, +{"from_linear":{"hex":"#c00000ff","u16":[49276,0,0,65535]},"in":"#860000ff","to_linear":{"hex":"#3d0000ff","u16":[15623,0,0,65535]}}, +{"from_linear":{"hex":"#c00000ff","u16":[49440,0,0,65535]},"in":"#870000ff","to_linear":{"hex":"#3e0000ff","u16":[15878,0,0,65535]}}, +{"from_linear":{"hex":"#c10000ff","u16":[49603,0,0,65535]},"in":"#880000ff","to_linear":{"hex":"#3f0000ff","u16":[16135,0,0,65535]}}, +{"from_linear":{"hex":"#c20000ff","u16":[49766,0,0,65535]},"in":"#890000ff","to_linear":{"hex":"#400000ff","u16":[16394,0,0,65535]}}, +{"from_linear":{"hex":"#c20000ff","u16":[49928,0,0,65535]},"in":"#8a0000ff","to_linear":{"hex":"#410000ff","u16":[16656,0,0,65535]}}, +{"from_linear":{"hex":"#c30000ff","u16":[50089,0,0,65535]},"in":"#8b0000ff","to_linear":{"hex":"#420000ff","u16":[16920,0,0,65535]}}, +{"from_linear":{"hex":"#c40000ff","u16":[50250,0,0,65535]},"in":"#8c0000ff","to_linear":{"hex":"#430000ff","u16":[17187,0,0,65535]}}, +{"from_linear":{"hex":"#c40000ff","u16":[50410,0,0,65535]},"in":"#8d0000ff","to_linear":{"hex":"#440000ff","u16":[17456,0,0,65535]}}, +{"from_linear":{"hex":"#c50000ff","u16":[50569,0,0,65535]},"in":"#8e0000ff","to_linear":{"hex":"#450000ff","u16":[17727,0,0,65535]}}, +{"from_linear":{"hex":"#c50000ff","u16":[50728,0,0,65535]},"in":"#8f0000ff","to_linear":{"hex":"#460000ff","u16":[18001,0,0,65535]}}, +{"from_linear":{"hex":"#c60000ff","u16":[50886,0,0,65535]},"in":"#900000ff","to_linear":{"hex":"#470000ff","u16":[18277,0,0,65535]}}, +{"from_linear":{"hex":"#c70000ff","u16":[51043,0,0,65535]},"in":"#910000ff","to_linear":{"hex":"#480000ff","u16":[18556,0,0,65535]}}, +{"from_linear":{"hex":"#c70000ff","u16":[51200,0,0,65535]},"in":"#920000ff","to_linear":{"hex":"#490000ff","u16":[18837,0,0,65535]}}, +{"from_linear":{"hex":"#c80000ff","u16":[51356,0,0,65535]},"in":"#930000ff","to_linear":{"hex":"#4a0000ff","u16":[19121,0,0,65535]}}, +{"from_linear":{"hex":"#c80000ff","u16":[51511,0,0,65535]},"in":"#940000ff","to_linear":{"hex":"#4c0000ff","u16":[19407,0,0,65535]}}, +{"from_linear":{"hex":"#c90000ff","u16":[51666,0,0,65535]},"in":"#950000ff","to_linear":{"hex":"#4d0000ff","u16":[19696,0,0,65535]}}, +{"from_linear":{"hex":"#ca0000ff","u16":[51821,0,0,65535]},"in":"#960000ff","to_linear":{"hex":"#4e0000ff","u16":[19987,0,0,65535]}}, +{"from_linear":{"hex":"#ca0000ff","u16":[51974,0,0,65535]},"in":"#970000ff","to_linear":{"hex":"#4f0000ff","u16":[20281,0,0,65535]}}, +{"from_linear":{"hex":"#cb0000ff","u16":[52127,0,0,65535]},"in":"#980000ff","to_linear":{"hex":"#500000ff","u16":[20577,0,0,65535]}}, +{"from_linear":{"hex":"#cb0000ff","u16":[52280,0,0,65535]},"in":"#990000ff","to_linear":{"hex":"#510000ff","u16":[20876,0,0,65535]}}, +{"from_linear":{"hex":"#cc0000ff","u16":[52432,0,0,65535]},"in":"#9a0000ff","to_linear":{"hex":"#520000ff","u16":[21177,0,0,65535]}}, +{"from_linear":{"hex":"#cd0000ff","u16":[52583,0,0,65535]},"in":"#9b0000ff","to_linear":{"hex":"#540000ff","u16":[21481,0,0,65535]}}, +{"from_linear":{"hex":"#cd0000ff","u16":[52734,0,0,65535]},"in":"#9c0000ff","to_linear":{"hex":"#550000ff","u16":[21787,0,0,65535]}}, +{"from_linear":{"hex":"#ce0000ff","u16":[52884,0,0,65535]},"in":"#9d0000ff","to_linear":{"hex":"#560000ff","u16":[22096,0,0,65535]}}, +{"from_linear":{"hex":"#ce0000ff","u16":[53034,0,0,65535]},"in":"#9e0000ff","to_linear":{"hex":"#570000ff","u16":[22407,0,0,65535]}}, +{"from_linear":{"hex":"#cf0000ff","u16":[53183,0,0,65535]},"in":"#9f0000ff","to_linear":{"hex":"#580000ff","u16":[22721,0,0,65535]}}, +{"from_linear":{"hex":"#d00000ff","u16":[53331,0,0,65535]},"in":"#a00000ff","to_linear":{"hex":"#5a0000ff","u16":[23038,0,0,65535]}}, +{"from_linear":{"hex":"#d00000ff","u16":[53479,0,0,65535]},"in":"#a10000ff","to_linear":{"hex":"#5b0000ff","u16":[23357,0,0,65535]}}, +{"from_linear":{"hex":"#d10000ff","u16":[53627,0,0,65535]},"in":"#a20000ff","to_linear":{"hex":"#5c0000ff","u16":[23678,0,0,65535]}}, +{"from_linear":{"hex":"#d10000ff","u16":[53774,0,0,65535]},"in":"#a30000ff","to_linear":{"hex":"#5d0000ff","u16":[24002,0,0,65535]}}, +{"from_linear":{"hex":"#d20000ff","u16":[53920,0,0,65535]},"in":"#a40000ff","to_linear":{"hex":"#5f0000ff","u16":[24329,0,0,65535]}}, +{"from_linear":{"hex":"#d20000ff","u16":[54066,0,0,65535]},"in":"#a50000ff","to_linear":{"hex":"#600000ff","u16":[24658,0,0,65535]}}, +{"from_linear":{"hex":"#d30000ff","u16":[54211,0,0,65535]},"in":"#a60000ff","to_linear":{"hex":"#610000ff","u16":[24990,0,0,65535]}}, +{"from_linear":{"hex":"#d40000ff","u16":[54356,0,0,65535]},"in":"#a70000ff","to_linear":{"hex":"#630000ff","u16":[25325,0,0,65535]}}, +{"from_linear":{"hex":"#d40000ff","u16":[54500,0,0,65535]},"in":"#a80000ff","to_linear":{"hex":"#640000ff","u16":[25662,0,0,65535]}}, +{"from_linear":{"hex":"#d50000ff","u16":[54644,0,0,65535]},"in":"#a90000ff","to_linear":{"hex":"#650000ff","u16":[26001,0,0,65535]}}, +{"from_linear":{"hex":"#d50000ff","u16":[54788,0,0,65535]},"in":"#aa0000ff","to_linear":{"hex":"#670000ff","u16":[26344,0,0,65535]}}, +{"from_linear":{"hex":"#d60000ff","u16":[54931,0,0,65535]},"in":"#ab0000ff","to_linear":{"hex":"#680000ff","u16":[26688,0,0,65535]}}, +{"from_linear":{"hex":"#d60000ff","u16":[55073,0,0,65535]},"in":"#ac0000ff","to_linear":{"hex":"#690000ff","u16":[27036,0,0,65535]}}, +{"from_linear":{"hex":"#d70000ff","u16":[55215,0,0,65535]},"in":"#ad0000ff","to_linear":{"hex":"#6b0000ff","u16":[27386,0,0,65535]}}, +{"from_linear":{"hex":"#d70000ff","u16":[55356,0,0,65535]},"in":"#ae0000ff","to_linear":{"hex":"#6c0000ff","u16":[27739,0,0,65535]}}, +{"from_linear":{"hex":"#d80000ff","u16":[55497,0,0,65535]},"in":"#af0000ff","to_linear":{"hex":"#6d0000ff","u16":[28094,0,0,65535]}}, +{"from_linear":{"hex":"#d80000ff","u16":[55638,0,0,65535]},"in":"#b00000ff","to_linear":{"hex":"#6f0000ff","u16":[28452,0,0,65535]}}, +{"from_linear":{"hex":"#d90000ff","u16":[55778,0,0,65535]},"in":"#b10000ff","to_linear":{"hex":"#700000ff","u16":[28813,0,0,65535]}}, +{"from_linear":{"hex":"#da0000ff","u16":[55917,0,0,65535]},"in":"#b20000ff","to_linear":{"hex":"#720000ff","u16":[29176,0,0,65535]}}, +{"from_linear":{"hex":"#da0000ff","u16":[56056,0,0,65535]},"in":"#b30000ff","to_linear":{"hex":"#730000ff","u16":[29542,0,0,65535]}}, +{"from_linear":{"hex":"#db0000ff","u16":[56195,0,0,65535]},"in":"#b40000ff","to_linear":{"hex":"#740000ff","u16":[29911,0,0,65535]}}, +{"from_linear":{"hex":"#db0000ff","u16":[56333,0,0,65535]},"in":"#b50000ff","to_linear":{"hex":"#760000ff","u16":[30282,0,0,65535]}}, +{"from_linear":{"hex":"#dc0000ff","u16":[56471,0,0,65535]},"in":"#b60000ff","to_linear":{"hex":"#770000ff","u16":[30656,0,0,65535]}}, +{"from_linear":{"hex":"#dc0000ff","u16":[56608,0,0,65535]},"in":"#b70000ff","to_linear":{"hex":"#790000ff","u16":[31033,0,0,65535]}}, +{"from_linear":{"hex":"#dd0000ff","u16":[56745,0,0,65535]},"in":"#b80000ff","to_linear":{"hex":"#7a0000ff","u16":[31412,0,0,65535]}}, +{"from_linear":{"hex":"#dd0000ff","u16":[56882,0,0,65535]},"in":"#b90000ff","to_linear":{"hex":"#7c0000ff","u16":[31794,0,0,65535]}}, +{"from_linear":{"hex":"#de0000ff","u16":[57018,0,0,65535]},"in":"#ba0000ff","to_linear":{"hex":"#7d0000ff","u16":[32179,0,0,65535]}}, +{"from_linear":{"hex":"#de0000ff","u16":[57153,0,0,65535]},"in":"#bb0000ff","to_linear":{"hex":"#7f0000ff","u16":[32567,0,0,65535]}}, +{"from_linear":{"hex":"#df0000ff","u16":[57288,0,0,65535]},"in":"#bc0000ff","to_linear":{"hex":"#800000ff","u16":[32957,0,0,65535]}}, +{"from_linear":{"hex":"#df0000ff","u16":[57423,0,0,65535]},"in":"#bd0000ff","to_linear":{"hex":"#820000ff","u16":[33350,0,0,65535]}}, +{"from_linear":{"hex":"#e00000ff","u16":[57558,0,0,65535]},"in":"#be0000ff","to_linear":{"hex":"#830000ff","u16":[33745,0,0,65535]}}, +{"from_linear":{"hex":"#e00000ff","u16":[57691,0,0,65535]},"in":"#bf0000ff","to_linear":{"hex":"#850000ff","u16":[34143,0,0,65535]}}, +{"from_linear":{"hex":"#e10000ff","u16":[57825,0,0,65535]},"in":"#c00000ff","to_linear":{"hex":"#860000ff","u16":[34544,0,0,65535]}}, +{"from_linear":{"hex":"#e20000ff","u16":[57958,0,0,65535]},"in":"#c10000ff","to_linear":{"hex":"#880000ff","u16":[34948,0,0,65535]}}, +{"from_linear":{"hex":"#e20000ff","u16":[58091,0,0,65535]},"in":"#c20000ff","to_linear":{"hex":"#8a0000ff","u16":[35355,0,0,65535]}}, +{"from_linear":{"hex":"#e30000ff","u16":[58223,0,0,65535]},"in":"#c30000ff","to_linear":{"hex":"#8b0000ff","u16":[35764,0,0,65535]}}, +{"from_linear":{"hex":"#e30000ff","u16":[58355,0,0,65535]},"in":"#c40000ff","to_linear":{"hex":"#8d0000ff","u16":[36176,0,0,65535]}}, +{"from_linear":{"hex":"#e40000ff","u16":[58487,0,0,65535]},"in":"#c50000ff","to_linear":{"hex":"#8e0000ff","u16":[36591,0,0,65535]}}, +{"from_linear":{"hex":"#e40000ff","u16":[58618,0,0,65535]},"in":"#c60000ff","to_linear":{"hex":"#900000ff","u16":[37008,0,0,65535]}}, +{"from_linear":{"hex":"#e50000ff","u16":[58748,0,0,65535]},"in":"#c70000ff","to_linear":{"hex":"#920000ff","u16":[37429,0,0,65535]}}, +{"from_linear":{"hex":"#e50000ff","u16":[58879,0,0,65535]},"in":"#c80000ff","to_linear":{"hex":"#930000ff","u16":[37852,0,0,65535]}}, +{"from_linear":{"hex":"#e60000ff","u16":[59009,0,0,65535]},"in":"#c90000ff","to_linear":{"hex":"#950000ff","u16":[38278,0,0,65535]}}, +{"from_linear":{"hex":"#e60000ff","u16":[59138,0,0,65535]},"in":"#ca0000ff","to_linear":{"hex":"#970000ff","u16":[38706,0,0,65535]}}, +{"from_linear":{"hex":"#e70000ff","u16":[59268,0,0,65535]},"in":"#cb0000ff","to_linear":{"hex":"#980000ff","u16":[39138,0,0,65535]}}, +{"from_linear":{"hex":"#e70000ff","u16":[59396,0,0,65535]},"in":"#cc0000ff","to_linear":{"hex":"#9a0000ff","u16":[39572,0,0,65535]}}, +{"from_linear":{"hex":"#e80000ff","u16":[59525,0,0,65535]},"in":"#cd0000ff","to_linear":{"hex":"#9c0000ff","u16":[40009,0,0,65535]}}, +{"from_linear":{"hex":"#e80000ff","u16":[59653,0,0,65535]},"in":"#ce0000ff","to_linear":{"hex":"#9d0000ff","u16":[40449,0,0,65535]}}, +{"from_linear":{"hex":"#e90000ff","u16":[59781,0,0,65535]},"in":"#cf0000ff","to_linear":{"hex":"#9f0000ff","u16":[40891,0,0,65535]}}, +{"from_linear":{"hex":"#e90000ff","u16":[59908,0,0,65535]},"in":"#d00000ff","to_linear":{"hex":"#a10000ff","u16":[41337,0,0,65535]}}, +{"from_linear":{"hex":"#ea0000ff","u16":[60035,0,0,65535]},"in":"#d10000ff","to_linear":{"hex":"#a30000ff","u16":[41785,0,0,65535]}}, +{"from_linear":{"hex":"#ea0000ff","u16":[60162,0,0,65535]},"in":"#d20000ff","to_linear":{"hex":"#a40000ff","u16":[42236,0,0,65535]}}, +{"from_linear":{"hex":"#eb0000ff","u16":[60288,0,0,65535]},"in":"#d30000ff","to_linear":{"hex":"#a60000ff","u16":[42690,0,0,65535]}}, +{"from_linear":{"hex":"#eb0000ff","u16":[60414,0,0,65535]},"in":"#d40000ff","to_linear":{"hex":"#a80000ff","u16":[43147,0,0,65535]}}, +{"from_linear":{"hex":"#ec0000ff","u16":[60540,0,0,65535]},"in":"#d50000ff","to_linear":{"hex":"#aa0000ff","u16":[43606,0,0,65535]}}, +{"from_linear":{"hex":"#ec0000ff","u16":[60665,0,0,65535]},"in":"#d60000ff","to_linear":{"hex":"#ab0000ff","u16":[44069,0,0,65535]}}, +{"from_linear":{"hex":"#ed0000ff","u16":[60790,0,0,65535]},"in":"#d70000ff","to_linear":{"hex":"#ad0000ff","u16":[44534,0,0,65535]}}, +{"from_linear":{"hex":"#ed0000ff","u16":[60915,0,0,65535]},"in":"#d80000ff","to_linear":{"hex":"#af0000ff","u16":[45002,0,0,65535]}}, +{"from_linear":{"hex":"#ee0000ff","u16":[61039,0,0,65535]},"in":"#d90000ff","to_linear":{"hex":"#b10000ff","u16":[45473,0,0,65535]}}, +{"from_linear":{"hex":"#ee0000ff","u16":[61163,0,0,65535]},"in":"#da0000ff","to_linear":{"hex":"#b30000ff","u16":[45947,0,0,65535]}}, +{"from_linear":{"hex":"#ee0000ff","u16":[61287,0,0,65535]},"in":"#db0000ff","to_linear":{"hex":"#b50000ff","u16":[46423,0,0,65535]}}, +{"from_linear":{"hex":"#ef0000ff","u16":[61410,0,0,65535]},"in":"#dc0000ff","to_linear":{"hex":"#b70000ff","u16":[46903,0,0,65535]}}, +{"from_linear":{"hex":"#ef0000ff","u16":[61533,0,0,65535]},"in":"#dd0000ff","to_linear":{"hex":"#b80000ff","u16":[47385,0,0,65535]}}, +{"from_linear":{"hex":"#f00000ff","u16":[61656,0,0,65535]},"in":"#de0000ff","to_linear":{"hex":"#ba0000ff","u16":[47871,0,0,65535]}}, +{"from_linear":{"hex":"#f00000ff","u16":[61778,0,0,65535]},"in":"#df0000ff","to_linear":{"hex":"#bc0000ff","u16":[48359,0,0,65535]}}, +{"from_linear":{"hex":"#f10000ff","u16":[61900,0,0,65535]},"in":"#e00000ff","to_linear":{"hex":"#be0000ff","u16":[48850,0,0,65535]}}, +{"from_linear":{"hex":"#f10000ff","u16":[62022,0,0,65535]},"in":"#e10000ff","to_linear":{"hex":"#c00000ff","u16":[49344,0,0,65535]}}, +{"from_linear":{"hex":"#f20000ff","u16":[62143,0,0,65535]},"in":"#e20000ff","to_linear":{"hex":"#c20000ff","u16":[49841,0,0,65535]}}, +{"from_linear":{"hex":"#f20000ff","u16":[62264,0,0,65535]},"in":"#e30000ff","to_linear":{"hex":"#c40000ff","u16":[50341,0,0,65535]}}, +{"from_linear":{"hex":"#f30000ff","u16":[62385,0,0,65535]},"in":"#e40000ff","to_linear":{"hex":"#c60000ff","u16":[50844,0,0,65535]}}, +{"from_linear":{"hex":"#f30000ff","u16":[62505,0,0,65535]},"in":"#e50000ff","to_linear":{"hex":"#c80000ff","u16":[51349,0,0,65535]}}, +{"from_linear":{"hex":"#f40000ff","u16":[62625,0,0,65535]},"in":"#e60000ff","to_linear":{"hex":"#ca0000ff","u16":[51858,0,0,65535]}}, +{"from_linear":{"hex":"#f40000ff","u16":[62745,0,0,65535]},"in":"#e70000ff","to_linear":{"hex":"#cc0000ff","u16":[52369,0,0,65535]}}, +{"from_linear":{"hex":"#f50000ff","u16":[62865,0,0,65535]},"in":"#e80000ff","to_linear":{"hex":"#ce0000ff","u16":[52884,0,0,65535]}}, +{"from_linear":{"hex":"#f50000ff","u16":[62984,0,0,65535]},"in":"#e90000ff","to_linear":{"hex":"#d00000ff","u16":[53401,0,0,65535]}}, +{"from_linear":{"hex":"#f60000ff","u16":[63103,0,0,65535]},"in":"#ea0000ff","to_linear":{"hex":"#d20000ff","u16":[53921,0,0,65535]}}, +{"from_linear":{"hex":"#f60000ff","u16":[63222,0,0,65535]},"in":"#eb0000ff","to_linear":{"hex":"#d40000ff","u16":[54445,0,0,65535]}}, +{"from_linear":{"hex":"#f60000ff","u16":[63340,0,0,65535]},"in":"#ec0000ff","to_linear":{"hex":"#d60000ff","u16":[54971,0,0,65535]}}, +{"from_linear":{"hex":"#f70000ff","u16":[63458,0,0,65535]},"in":"#ed0000ff","to_linear":{"hex":"#d80000ff","u16":[55500,0,0,65535]}}, +{"from_linear":{"hex":"#f70000ff","u16":[63576,0,0,65535]},"in":"#ee0000ff","to_linear":{"hex":"#da0000ff","u16":[56032,0,0,65535]}}, +{"from_linear":{"hex":"#f80000ff","u16":[63693,0,0,65535]},"in":"#ef0000ff","to_linear":{"hex":"#dc0000ff","u16":[56567,0,0,65535]}}, +{"from_linear":{"hex":"#f80000ff","u16":[63810,0,0,65535]},"in":"#f00000ff","to_linear":{"hex":"#de0000ff","u16":[57105,0,0,65535]}}, +{"from_linear":{"hex":"#f90000ff","u16":[63927,0,0,65535]},"in":"#f10000ff","to_linear":{"hex":"#e00000ff","u16":[57646,0,0,65535]}}, +{"from_linear":{"hex":"#f90000ff","u16":[64044,0,0,65535]},"in":"#f20000ff","to_linear":{"hex":"#e20000ff","u16":[58190,0,0,65535]}}, +{"from_linear":{"hex":"#fa0000ff","u16":[64160,0,0,65535]},"in":"#f30000ff","to_linear":{"hex":"#e50000ff","u16":[58737,0,0,65535]}}, +{"from_linear":{"hex":"#fa0000ff","u16":[64276,0,0,65535]},"in":"#f40000ff","to_linear":{"hex":"#e70000ff","u16":[59287,0,0,65535]}}, +{"from_linear":{"hex":"#fb0000ff","u16":[64392,0,0,65535]},"in":"#f50000ff","to_linear":{"hex":"#e90000ff","u16":[59840,0,0,65535]}}, +{"from_linear":{"hex":"#fb0000ff","u16":[64508,0,0,65535]},"in":"#f60000ff","to_linear":{"hex":"#eb0000ff","u16":[60396,0,0,65535]}}, +{"from_linear":{"hex":"#fb0000ff","u16":[64623,0,0,65535]},"in":"#f70000ff","to_linear":{"hex":"#ed0000ff","u16":[60955,0,0,65535]}}, +{"from_linear":{"hex":"#fc0000ff","u16":[64738,0,0,65535]},"in":"#f80000ff","to_linear":{"hex":"#ef0000ff","u16":[61517,0,0,65535]}}, +{"from_linear":{"hex":"#fc0000ff","u16":[64852,0,0,65535]},"in":"#f90000ff","to_linear":{"hex":"#f20000ff","u16":[62082,0,0,65535]}}, +{"from_linear":{"hex":"#fd0000ff","u16":[64967,0,0,65535]},"in":"#fa0000ff","to_linear":{"hex":"#f40000ff","u16":[62650,0,0,65535]}}, +{"from_linear":{"hex":"#fd0000ff","u16":[65081,0,0,65535]},"in":"#fb0000ff","to_linear":{"hex":"#f60000ff","u16":[63221,0,0,65535]}}, +{"from_linear":{"hex":"#fe0000ff","u16":[65195,0,0,65535]},"in":"#fc0000ff","to_linear":{"hex":"#f80000ff","u16":[63795,0,0,65535]}}, +{"from_linear":{"hex":"#fe0000ff","u16":[65309,0,0,65535]},"in":"#fd0000ff","to_linear":{"hex":"#fa0000ff","u16":[64372,0,0,65535]}}, +{"from_linear":{"hex":"#ff0000ff","u16":[65422,0,0,65535]},"in":"#fe0000ff","to_linear":{"hex":"#fd0000ff","u16":[64952,0,0,65535]}}, +{"from_linear":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"in":"#ff0000ff","to_linear":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}} +], +"qt_extended": [ +{"in":[1.0499999523162842,0.12345679104328156,-0.009999999776482582],"stored":{"f":[1.0498046875,0.12347412109375,-0.01000213623046875,1],"hex":"#ff1f00ff","spec":"ExtendedRgb","u16":[65535,8092,0,65535]},"to_rgb":{"hex":"#ff1f00ff","u16":[65535,8092,0,65535]}}, +{"in":[-1.0000000116860974e-07,0.5,0.75],"stored":{"f":[-1.1920928955078125e-07,0.5,0.75,1],"hex":"#0080bfff","spec":"ExtendedRgb","u16":[0,32768,49151,65535]},"to_rgb":{"hex":"#0080bfff","u16":[0,32768,49151,65535]}}, +{"in":[1.0000001192092896,0.3333333432674408,0.6666666865348816],"stored":{"f":[1,0.333251953125,0.66650390625,1],"hex":"#ff55aaff","spec":"ExtendedRgb","u16":[65535,21840,43679,65535]},"to_rgb":{"hex":"#ff55aaff","u16":[65535,21840,43679,65535]}}, +{"in":[2,-1,9.999999747378752e-05],"stored":{"f":[2,-1,0.00010001659393310547,1],"hex":"#ff0000ff","spec":"ExtendedRgb","u16":[65535,0,7,65535]},"to_rgb":{"hex":"#ff0000ff","u16":[65535,0,7,65535]}}, +{"in":[0.9990000128746033,1.0010000467300415,0.20000000298023224],"stored":{"f":[0.9990234375,1.0009765625,0.199951171875,1],"hex":"#ffff33ff","spec":"ExtendedRgb","u16":[65471,65535,13104,65535]},"to_rgb":{"hex":"#ffff33ff","u16":[65471,65535,13104,65535]}}, +{"in":[0.10000000149011612,0.20000000298023224,1.5],"stored":{"f":[0.0999755859375,0.199951171875,1.5,1],"hex":"#1933ffff","spec":"ExtendedRgb","u16":[6552,13104,65535,65535]},"to_rgb":{"hex":"#1933ffff","u16":[6552,13104,65535,65535]}} +], +"qt_color_text": [ +{"in":"#abc","out":{"hex":"#aabbccff","u16":[43690,48059,52428,65535]}}, +{"in":"#3daee9","out":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}}, +{"in":"#803daee9","out":{"hex":"#3daee980","u16":[15677,44718,59881,32896]}}, +{"in":"#123456789","out":{"hex":"#124578ff","u16":[4657,17764,30871,65535]}}, +{"in":"#123456789abc","out":{"hex":"#12569aff","u16":[4660,22136,39612,65535]}}, +{"in":"#12","out":{"valid":false}}, +{"in":"#12345","out":{"valid":false}}, +{"in":"#1234567","out":{"valid":false}}, +{"in":"#xyzxyz","out":{"valid":false}}, +{"in":"red","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"in":"Red","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"in":"RED","out":{"hex":"#ff0000ff","u16":[65535,0,0,65535]}}, +{"in":"transparent","out":{"hex":"#00000000","u16":[0,0,0,0]}}, +{"in":"rebeccapurple","out":{"valid":false}}, +{"in":"grey","out":{"hex":"#808080ff","u16":[32896,32896,32896,65535]}}, +{"in":"notacolour","out":{"valid":false}}, +{"in":" #3daee9","out":{"valid":false}}, +{"in":"","out":{"valid":false}} +] +} diff --git a/tools/kde_golden/vectors/pixels.json b/tools/kde_golden/vectors/pixels.json new file mode 100644 index 000000000..6f0fb8bb6 --- /dev/null +++ b/tools/kde_golden/vectors/pixels.json @@ -0,0 +1,147 @@ +{ +"meta": {"generator": "tools/kde_golden/driver (kde_golden)", "image": "invent-registry.kde.org/neon/docker-images/plasma@sha256:f58f9b97f218ee976cf928f6fe00abb929a644aded8c9dfb02f77a9b2a6e1732", "kcolorscheme_build": "6.31.0", "kguiaddons_build": "6.31.0", "kind": "pixels", "packages": {"breeze": "4:6.8.0-0zneon+24.04+noble+release+build80", "fonts-hack": "3.003-3", "fonts-noto-core": "20201225-2", "kde-style-breeze": "4:6.8.0-0zneon+24.04+noble+release+build80", "kde-style-oxygen": "4:6.8.0-0zneon+24.04+noble+release+build59", "kf6-kcolorscheme": "6.31.0-0zneon+24.04+noble+release+build47", "kf6-kconfig": "6.31.0-0zneon+24.04+noble+release+build36", "kf6-kguiaddons": "6.31.0-0zneon+24.04+noble+release+build59", "libkf6colorscheme-dev": "6.31.0-0zneon+24.04+noble+release+build47", "plasma-workspace": "4:6.8.0-0zneon+24.04+noble+release+build99", "qt6-base": "6.11.1-0zneon+24.04+noble+release+build162"}, "qt_build": "6.11.1", "qt_runtime": "6.11.1", "readme": "tools/kde_golden/README.md documents every field"}, +"schemes": { +"BreezeLight": { +"environment": {"image_format": "ARGB32, filled opaque with the palette background, then painted", "kdeglobals_color_scheme": "BreezeLight", "platform": "offscreen", "scheme": "BreezeLight", "style": "breeze"}, +"records": [ +{"background": "#eff0f1ff", "cols": {"0": [[0, 34, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#e3e4e5ff"], [4, 1, "#d5d5d7ff"], [5, 1, "#d3d3d4ff"], [6, 22, "#d1d1d2ff"], [28, 1, "#d3d3d4ff"], [29, 1, "#d4d4d5ff"], [30, 1, "#d8d9daff"], [31, 1, "#e8e9eaff"], [32, 2, "#eff0f1ff"]], "2": [[0, 2, "#eff0f1ff"], [2, 1, "#dbdcddff"], [3, 1, "#d5d5d6ff"], [4, 1, "#ededeeff"], [5, 1, "#f7f7f8ff"], [6, 22, "#fcfcfcff"], [28, 1, "#f7f7f8ff"], [29, 1, "#ededeeff"], [30, 1, "#d5d5d7ff"], [31, 1, "#d5d5d6ff"], [32, 1, "#e2e3e4ff"], [33, 1, "#eff0f1ff"]], "42": [[0, 1, "#eff0f1ff"], [1, 1, "#d1d1d2ff"], [2, 30, "#fcfcfcff"], [32, 1, "#d1d1d2ff"], [33, 1, "#d1d2d3ff"]]}, "control": "CE_PushButtonBevel", "id": "push_button.normal", "rows": {"0": [[0, 84, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#e3e4e5ff"], [4, 1, "#d5d5d7ff"], [5, 1, "#d3d3d4ff"], [6, 72, "#d1d1d2ff"], [78, 1, "#d3d3d4ff"], [79, 1, "#d5d5d7ff"], [80, 1, "#e3e4e5ff"], [81, 3, "#eff0f1ff"]], "17": [[0, 1, "#eff0f1ff"], [1, 1, "#d1d1d2ff"], [2, 80, "#fcfcfcff"], [82, 1, "#d1d1d2ff"], [83, 1, "#eff0f1ff"]], "2": [[0, 2, "#eff0f1ff"], [2, 1, "#dbdcddff"], [3, 1, "#d5d5d6ff"], [4, 1, "#ededeeff"], [5, 1, "#f7f7f8ff"], [6, 72, "#fcfcfcff"], [78, 1, "#f7f7f8ff"], [79, 1, "#ededeeff"], [80, 1, "#d5d5d6ff"], [81, 1, "#dbdcddff"], [82, 2, "#eff0f1ff"]], "32": [[0, 2, "#eff0f1ff"], [2, 1, "#e2e3e4ff"], [3, 1, "#d5d6d6ff"], [4, 1, "#d8d8d9ff"], [5, 1, "#d5d5d6ff"], [6, 72, "#d1d1d2ff"], [78, 1, "#d5d5d6ff"], [79, 1, "#d8d8d9ff"], [80, 1, "#d5d6d6ff"], [81, 1, "#e2e3e4ff"], [82, 2, "#eff0f1ff"]], "33": [[0, 3, "#eff0f1ff"], [3, 1, "#e8e9eaff"], [4, 1, "#dadbdcff"], [5, 1, "#d4d5d6ff"], [6, 72, "#d1d2d3ff"], [78, 1, "#d4d5d6ff"], [79, 1, "#dadbdcff"], [80, 1, "#e8e9eaff"], [81, 3, "#eff0f1ff"]]}, "size": [84, 34], "state": {"features": 0, "flags": 2, "group": "Active", "name": "normal"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 34, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#c2dceaff"], [4, 1, "#70bde7ff"], [5, 1, "#4eb3e8ff"], [6, 22, "#3daee9ff"], [28, 1, "#4eb3e8ff"], [29, 1, "#6fbce5ff"], [30, 1, "#b7d1dfff"], [31, 1, "#e8e9eaff"], [32, 2, "#eff0f1ff"]], "2": [[0, 2, "#eff0f1ff"], [2, 1, "#99cce7ff"], [3, 1, "#56b7eaff"], [4, 1, "#bce2f6ff"], [5, 1, "#e9f4faff"], [6, 22, "#fcfcfcff"], [28, 1, "#e9f4faff"], [29, 1, "#bce2f6ff"], [30, 1, "#56b7ebff"], [31, 1, "#93c5e0ff"], [32, 1, "#e2e3e4ff"], [33, 1, "#eff0f1ff"]], "42": [[0, 1, "#eff0f1ff"], [1, 1, "#3daee9ff"], [2, 30, "#fcfcfcff"], [32, 1, "#3daee9ff"], [33, 1, "#d1d2d3ff"]]}, "control": "CE_PushButtonBevel", "id": "push_button.hover", "rows": {"0": [[0, 84, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#c2dceaff"], [4, 1, "#70bde7ff"], [5, 1, "#4eb3e8ff"], [6, 72, "#3daee9ff"], [78, 1, "#4eb3e8ff"], [79, 1, "#70bde7ff"], [80, 1, "#c2dceaff"], [81, 3, "#eff0f1ff"]], "17": [[0, 1, "#eff0f1ff"], [1, 1, "#3daee9ff"], [2, 80, "#fcfcfcff"], [82, 1, "#3daee9ff"], [83, 1, "#eff0f1ff"]], "2": [[0, 2, "#eff0f1ff"], [2, 1, "#99cce7ff"], [3, 1, "#56b7eaff"], [4, 1, "#bce2f6ff"], [5, 1, "#e9f4faff"], [6, 72, "#fcfcfcff"], [78, 1, "#e9f4faff"], [79, 1, "#bce2f6ff"], [80, 1, "#56b7eaff"], [81, 1, "#99cde7ff"], [82, 2, "#eff0f1ff"]], "32": [[0, 2, "#eff0f1ff"], [2, 1, "#e2e3e4ff"], [3, 1, "#b4cedbff"], [4, 1, "#73c0e9ff"], [5, 1, "#50b5eaff"], [6, 72, "#3daee9ff"], [78, 1, "#50b5eaff"], [79, 1, "#73c0e9ff"], [80, 1, "#b5cfdbff"], [81, 1, "#e2e3e4ff"], [82, 2, "#eff0f1ff"]], "33": [[0, 3, "#eff0f1ff"], [3, 1, "#e8e9eaff"], [4, 1, "#dadbdcff"], [5, 1, "#d4d5d6ff"], [6, 72, "#d1d2d3ff"], [78, 1, "#d4d5d6ff"], [79, 1, "#dadbdcff"], [80, 1, "#e8e9eaff"], [81, 3, "#eff0f1ff"]]}, "size": [84, 34], "state": {"features": 0, "flags": 8194, "group": "Active", "name": "hover"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 34, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#c2dceaff"], [4, 1, "#70bde7ff"], [5, 1, "#4eb3e8ff"], [6, 22, "#3daee9ff"], [28, 1, "#4eb3e8ff"], [29, 1, "#6fbce5ff"], [30, 1, "#b7d1dfff"], [31, 1, "#e8e9eaff"], [32, 2, "#eff0f1ff"]], "2": [[0, 2, "#eff0f1ff"], [2, 1, "#99cce7ff"], [3, 1, "#56b7eaff"], [4, 1, "#bce2f6ff"], [5, 1, "#e9f4faff"], [6, 22, "#fcfcfcff"], [28, 1, "#e9f4faff"], [29, 1, "#bce2f6ff"], [30, 1, "#56b7ebff"], [31, 1, "#93c5e0ff"], [32, 1, "#e2e3e4ff"], [33, 1, "#eff0f1ff"]], "42": [[0, 1, "#eff0f1ff"], [1, 1, "#3daee9ff"], [2, 30, "#fcfcfcff"], [32, 1, "#3daee9ff"], [33, 1, "#d1d2d3ff"]]}, "control": "CE_PushButtonBevel", "id": "push_button.focus", "rows": {"0": [[0, 84, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#c2dceaff"], [4, 1, "#70bde7ff"], [5, 1, "#4eb3e8ff"], [6, 72, "#3daee9ff"], [78, 1, "#4eb3e8ff"], [79, 1, "#70bde7ff"], [80, 1, "#c2dceaff"], [81, 3, "#eff0f1ff"]], "17": [[0, 1, "#eff0f1ff"], [1, 1, "#3daee9ff"], [2, 80, "#fcfcfcff"], [82, 1, "#3daee9ff"], [83, 1, "#eff0f1ff"]], "2": [[0, 2, "#eff0f1ff"], [2, 1, "#99cce7ff"], [3, 1, "#56b7eaff"], [4, 1, "#bce2f6ff"], [5, 1, "#e9f4faff"], [6, 72, "#fcfcfcff"], [78, 1, "#e9f4faff"], [79, 1, "#bce2f6ff"], [80, 1, "#56b7eaff"], [81, 1, "#99cde7ff"], [82, 2, "#eff0f1ff"]], "32": [[0, 2, "#eff0f1ff"], [2, 1, "#e2e3e4ff"], [3, 1, "#b4cedbff"], [4, 1, "#73c0e9ff"], [5, 1, "#50b5eaff"], [6, 72, "#3daee9ff"], [78, 1, "#50b5eaff"], [79, 1, "#73c0e9ff"], [80, 1, "#b5cfdbff"], [81, 1, "#e2e3e4ff"], [82, 2, "#eff0f1ff"]], "33": [[0, 3, "#eff0f1ff"], [3, 1, "#e8e9eaff"], [4, 1, "#dadbdcff"], [5, 1, "#d4d5d6ff"], [6, 72, "#d1d2d3ff"], [78, 1, "#d4d5d6ff"], [79, 1, "#dadbdcff"], [80, 1, "#e8e9eaff"], [81, 3, "#eff0f1ff"]]}, "size": [84, 34], "state": {"features": 0, "flags": 8388866, "group": "Active", "name": "focus"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 34, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#c8e1efff"], [4, 1, "#72c2ecff"], [5, 1, "#4eb4eaff"], [6, 22, "#3daee9ff"], [28, 1, "#4eb4eaff"], [29, 1, "#72c2ecff"], [30, 1, "#c8e1efff"], [31, 3, "#eff0f1ff"]], "2": [[0, 2, "#eff0f1ff"], [2, 1, "#9ed1edff"], [3, 1, "#52b6eaff"], [4, 1, "#96d3f2ff"], [5, 1, "#b6e0f5ff"], [6, 22, "#c3e5f6ff"], [28, 1, "#b6e0f5ff"], [29, 1, "#96d3f2ff"], [30, 1, "#52b6eaff"], [31, 1, "#9ed1edff"], [32, 2, "#eff0f1ff"]], "42": [[0, 1, "#eff0f1ff"], [1, 1, "#3daee9ff"], [2, 30, "#c3e5f6ff"], [32, 1, "#3daee9ff"], [33, 1, "#eff0f1ff"]]}, "control": "CE_PushButtonBevel", "id": "push_button.pressed", "rows": {"0": [[0, 84, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#c8e1efff"], [4, 1, "#72c2ecff"], [5, 1, "#4eb4eaff"], [6, 72, "#3daee9ff"], [78, 1, "#4eb4eaff"], [79, 1, "#72c2ecff"], [80, 1, "#c8e1efff"], [81, 3, "#eff0f1ff"]], "17": [[0, 1, "#eff0f1ff"], [1, 1, "#3daee9ff"], [2, 80, "#c3e5f6ff"], [82, 1, "#3daee9ff"], [83, 1, "#eff0f1ff"]], "2": [[0, 2, "#eff0f1ff"], [2, 1, "#9ed1edff"], [3, 1, "#52b6eaff"], [4, 1, "#96d3f2ff"], [5, 1, "#b6e0f5ff"], [6, 72, "#c3e5f6ff"], [78, 1, "#b6e0f5ff"], [79, 1, "#96d3f2ff"], [80, 1, "#52b6eaff"], [81, 1, "#9dd2edff"], [82, 2, "#eff0f1ff"]], "32": [[0, 3, "#eff0f1ff"], [3, 1, "#c8e1efff"], [4, 1, "#72c2ecff"], [5, 1, "#4eb4eaff"], [6, 72, "#3daee9ff"], [78, 1, "#4eb4eaff"], [79, 1, "#72c2ecff"], [80, 1, "#c8e2efff"], [81, 3, "#eff0f1ff"]], "33": [[0, 84, "#eff0f1ff"]]}, "size": [84, 34], "state": {"features": 0, "flags": 4, "group": "Active", "name": "pressed"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 34, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#d3e0e8ff"], [4, 1, "#a1cadfff"], [5, 1, "#8fc3ddff"], [6, 22, "#87c0ddff"], [28, 1, "#8fc2ddff"], [29, 1, "#a0c8ddff"], [30, 1, "#c8d5ddff"], [31, 1, "#e8e9eaff"], [32, 2, "#eff0f1ff"]], "2": [[0, 2, "#eff0f1ff"], [2, 1, "#b9d4e2ff"], [3, 1, "#92c5dfff"], [4, 1, "#bcddefff"], [5, 1, "#cee8f6ff"], [6, 22, "#d6ecf8ff"], [28, 1, "#cee8f6ff"], [29, 1, "#bcddefff"], [30, 1, "#93c6e0ff"], [31, 1, "#b2cedbff"], [32, 1, "#e2e3e4ff"], [33, 1, "#eff0f1ff"]], "42": [[0, 1, "#eff0f1ff"], [1, 1, "#87c0ddff"], [2, 30, "#d6ecf8ff"], [32, 1, "#87c0ddff"], [33, 1, "#d1d2d3ff"]]}, "control": "CE_PushButtonBevel", "id": "push_button.default", "rows": {"0": [[0, 84, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#d3e0e8ff"], [4, 1, "#a1cadfff"], [5, 1, "#8fc3ddff"], [6, 72, "#87c0ddff"], [78, 1, "#8fc3ddff"], [79, 1, "#a1cadfff"], [80, 1, "#d3e0e8ff"], [81, 3, "#eff0f1ff"]], "17": [[0, 1, "#eff0f1ff"], [1, 1, "#87c0ddff"], [2, 80, "#d6ecf8ff"], [82, 1, "#87c0ddff"], [83, 1, "#eff0f1ff"]], "2": [[0, 2, "#eff0f1ff"], [2, 1, "#b9d4e2ff"], [3, 1, "#92c5dfff"], [4, 1, "#bcddefff"], [5, 1, "#cee8f6ff"], [6, 72, "#d6ecf8ff"], [78, 1, "#cee8f6ff"], [79, 1, "#bcddefff"], [80, 1, "#92c5dfff"], [81, 1, "#b9d4e2ff"], [82, 2, "#eff0f1ff"]], "32": [[0, 2, "#eff0f1ff"], [2, 1, "#e2e3e4ff"], [3, 1, "#c5d2d9ff"], [4, 1, "#a4cde1ff"], [5, 1, "#90c4dfff"], [6, 72, "#87c0ddff"], [78, 1, "#90c4dfff"], [79, 1, "#a4cde1ff"], [80, 1, "#c5d2d9ff"], [81, 1, "#e2e3e4ff"], [82, 2, "#eff0f1ff"]], "33": [[0, 3, "#eff0f1ff"], [3, 1, "#e8e9eaff"], [4, 1, "#dadbdcff"], [5, 1, "#d4d5d6ff"], [6, 72, "#d1d2d3ff"], [78, 1, "#d4d5d6ff"], [79, 1, "#dadbdcff"], [80, 1, "#e8e9eaff"], [81, 3, "#eff0f1ff"]]}, "size": [84, 34], "state": {"features": 4, "flags": 2, "group": "Active", "name": "default"}}, +{"background": "#e3e5e7ff", "cols": {"0": [[0, 34, "#e3e5e7ff"]], "1": [[0, 3, "#e3e5e7ff"], [3, 1, "#e3e5e6ff"], [4, 1, "#e3e3e4ff"], [5, 1, "#e3e3e3ff"], [6, 22, "#e2e2e2ff"], [28, 1, "#e3e3e3ff"], [29, 1, "#e3e3e4ff"], [30, 1, "#e3e5e6ff"], [31, 3, "#e3e5e7ff"]], "2": [[0, 2, "#e3e5e7ff"], [2, 1, "#e3e4e5ff"], [3, 1, "#e3e3e3ff"], [4, 1, "#ebebebff"], [5, 1, "#eeeeeeff"], [6, 22, "#f0f0f0ff"], [28, 1, "#eeeeeeff"], [29, 1, "#ebebebff"], [30, 1, "#e3e3e3ff"], [31, 1, "#e3e4e5ff"], [32, 2, "#e3e5e7ff"]], "42": [[0, 1, "#e3e5e7ff"], [1, 1, "#e2e2e2ff"], [2, 30, "#f0f0f0ff"], [32, 1, "#e2e2e2ff"], [33, 1, "#e3e5e7ff"]]}, "control": "CE_PushButtonBevel", "id": "push_button.disabled", "rows": {"0": [[0, 84, "#e3e5e7ff"]], "1": [[0, 3, "#e3e5e7ff"], [3, 1, "#e3e5e6ff"], [4, 1, "#e3e3e4ff"], [5, 1, "#e3e3e3ff"], [6, 72, "#e2e2e2ff"], [78, 1, "#e3e3e3ff"], [79, 1, "#e3e3e4ff"], [80, 1, "#e3e5e6ff"], [81, 3, "#e3e5e7ff"]], "17": [[0, 1, "#e3e5e7ff"], [1, 1, "#e2e2e2ff"], [2, 80, "#f0f0f0ff"], [82, 1, "#e2e2e2ff"], [83, 1, "#e3e5e7ff"]], "2": [[0, 2, "#e3e5e7ff"], [2, 1, "#e3e4e5ff"], [3, 1, "#e3e3e3ff"], [4, 1, "#ebebebff"], [5, 1, "#eeeeeeff"], [6, 72, "#f0f0f0ff"], [78, 1, "#eeeeeeff"], [79, 1, "#ebebebff"], [80, 1, "#e3e3e3ff"], [81, 1, "#e3e4e5ff"], [82, 2, "#e3e5e7ff"]], "32": [[0, 3, "#e3e5e7ff"], [3, 1, "#e3e5e6ff"], [4, 1, "#e3e3e4ff"], [5, 1, "#e3e3e3ff"], [6, 72, "#e2e2e2ff"], [78, 1, "#e3e3e3ff"], [79, 1, "#e3e3e4ff"], [80, 1, "#e3e5e6ff"], [81, 3, "#e3e5e7ff"]], "33": [[0, 84, "#e3e5e7ff"]]}, "size": [84, 34], "state": {"features": 0, "flags": 2, "group": "Disabled", "name": "disabled"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 34, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#e3e4e5ff"], [4, 1, "#d5d5d7ff"], [5, 1, "#d3d3d4ff"], [6, 22, "#d1d1d2ff"], [28, 1, "#d3d3d4ff"], [29, 1, "#d4d4d5ff"], [30, 1, "#d8d9daff"], [31, 1, "#e8e9eaff"], [32, 2, "#eff0f1ff"]], "2": [[0, 2, "#eff0f1ff"], [2, 1, "#dbdcddff"], [3, 1, "#d5d5d6ff"], [4, 1, "#ededeeff"], [5, 1, "#f7f7f8ff"], [6, 22, "#fcfcfcff"], [28, 1, "#f7f7f8ff"], [29, 1, "#ededeeff"], [30, 1, "#d5d5d7ff"], [31, 1, "#d5d5d6ff"], [32, 1, "#e2e3e4ff"], [33, 1, "#eff0f1ff"]], "42": [[0, 1, "#eff0f1ff"], [1, 1, "#d1d1d2ff"], [2, 30, "#fcfcfcff"], [32, 1, "#d1d1d2ff"], [33, 1, "#d1d2d3ff"]]}, "control": "CE_PushButtonBevel", "id": "push_button.inactive_window", "rows": {"0": [[0, 84, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#e3e4e5ff"], [4, 1, "#d5d5d7ff"], [5, 1, "#d3d3d4ff"], [6, 72, "#d1d1d2ff"], [78, 1, "#d3d3d4ff"], [79, 1, "#d5d5d7ff"], [80, 1, "#e3e4e5ff"], [81, 3, "#eff0f1ff"]], "17": [[0, 1, "#eff0f1ff"], [1, 1, "#d1d1d2ff"], [2, 80, "#fcfcfcff"], [82, 1, "#d1d1d2ff"], [83, 1, "#eff0f1ff"]], "2": [[0, 2, "#eff0f1ff"], [2, 1, "#dbdcddff"], [3, 1, "#d5d5d6ff"], [4, 1, "#ededeeff"], [5, 1, "#f7f7f8ff"], [6, 72, "#fcfcfcff"], [78, 1, "#f7f7f8ff"], [79, 1, "#ededeeff"], [80, 1, "#d5d5d6ff"], [81, 1, "#dbdcddff"], [82, 2, "#eff0f1ff"]], "32": [[0, 2, "#eff0f1ff"], [2, 1, "#e2e3e4ff"], [3, 1, "#d5d6d6ff"], [4, 1, "#d8d8d9ff"], [5, 1, "#d5d5d6ff"], [6, 72, "#d1d1d2ff"], [78, 1, "#d5d5d6ff"], [79, 1, "#d8d8d9ff"], [80, 1, "#d5d6d6ff"], [81, 1, "#e2e3e4ff"], [82, 2, "#eff0f1ff"]], "33": [[0, 3, "#eff0f1ff"], [3, 1, "#e8e9eaff"], [4, 1, "#dadbdcff"], [5, 1, "#d4d5d6ff"], [6, 72, "#d1d2d3ff"], [78, 1, "#d4d5d6ff"], [79, 1, "#dadbdcff"], [80, 1, "#e8e9eaff"], [81, 3, "#eff0f1ff"]]}, "size": [84, 34], "state": {"features": 0, "flags": 2, "group": "Inactive", "name": "inactive_window"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 34, "#eff0f1ff"]], "1": [[0, 34, "#eff0f1ff"]], "2": [[0, 34, "#eff0f1ff"]], "42": [[0, 34, "#eff0f1ff"]]}, "control": "CE_PushButtonBevel", "id": "push_button.flat", "rows": {"0": [[0, 84, "#eff0f1ff"]], "1": [[0, 84, "#eff0f1ff"]], "17": [[0, 84, "#eff0f1ff"]], "2": [[0, 84, "#eff0f1ff"]], "32": [[0, 84, "#eff0f1ff"]], "33": [[0, 84, "#eff0f1ff"]]}, "size": [84, 34], "state": {"features": 1, "flags": 0, "group": "Active", "name": "flat"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 34, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#c8e1efff"], [4, 1, "#75c2ecff"], [5, 1, "#4fb4eaff"], [6, 22, "#3daee9ff"], [28, 1, "#4fb4eaff"], [29, 1, "#75c2ecff"], [30, 1, "#c8e1efff"], [31, 3, "#eff0f1ff"]], "2": [[0, 2, "#eff0f1ff"], [2, 1, "#9fd2edff"], [3, 1, "#56b7eaff"], [4, 1, "#b3daefff"], [5, 1, "#dee9f0ff"], [6, 22, "#eff0f1ff"], [28, 1, "#dee9f0ff"], [29, 1, "#b3daefff"], [30, 1, "#56b7eaff"], [31, 1, "#9fd2edff"], [32, 2, "#eff0f1ff"]], "42": [[0, 1, "#eff0f1ff"], [1, 1, "#3daee9ff"], [2, 30, "#eff0f1ff"], [32, 1, "#3daee9ff"], [33, 1, "#eff0f1ff"]]}, "control": "CE_PushButtonBevel", "id": "push_button.flat_hover", "rows": {"0": [[0, 84, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#c8e1efff"], [4, 1, "#75c2ecff"], [5, 1, "#4fb4eaff"], [6, 72, "#3daee9ff"], [78, 1, "#4fb4eaff"], [79, 1, "#75c2ecff"], [80, 1, "#c8e1efff"], [81, 3, "#eff0f1ff"]], "17": [[0, 1, "#eff0f1ff"], [1, 1, "#3daee9ff"], [2, 80, "#eff0f1ff"], [82, 1, "#3daee9ff"], [83, 1, "#eff0f1ff"]], "2": [[0, 2, "#eff0f1ff"], [2, 1, "#9fd2edff"], [3, 1, "#56b7eaff"], [4, 1, "#b3daefff"], [5, 1, "#dee9f0ff"], [6, 72, "#eff0f1ff"], [78, 1, "#dee9f0ff"], [79, 1, "#b3daefff"], [80, 1, "#56b7eaff"], [81, 1, "#9fd3edff"], [82, 2, "#eff0f1ff"]], "32": [[0, 3, "#eff0f1ff"], [3, 1, "#c8e1efff"], [4, 1, "#75c2ecff"], [5, 1, "#4fb4eaff"], [6, 72, "#3daee9ff"], [78, 1, "#4fb4eaff"], [79, 1, "#75c2ecff"], [80, 1, "#c8e2efff"], [81, 3, "#eff0f1ff"]], "33": [[0, 84, "#eff0f1ff"]]}, "size": [84, 34], "state": {"features": 1, "flags": 8192, "group": "Active", "name": "flat_hover"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 28, "#eff0f1ff"]], "1": [[0, 28, "#eff0f1ff"]], "14": [[0, 28, "#eff0f1ff"]]}, "control": "CC_ToolButton", "id": "tool_button.normal", "rows": {"0": [[0, 28, "#eff0f1ff"]], "1": [[0, 28, "#eff0f1ff"]], "14": [[0, 28, "#eff0f1ff"]]}, "size": [28, 28], "state": {"flags": 4098, "group": "Active", "name": "normal"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 28, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#c8e1efff"], [4, 1, "#75c2ecff"], [5, 1, "#4fb4eaff"], [6, 16, "#3daee9ff"], [22, 1, "#4fb4eaff"], [23, 1, "#75c2ecff"], [24, 1, "#c8e1efff"], [25, 3, "#eff0f1ff"]], "14": [[0, 1, "#eff0f1ff"], [1, 1, "#3daee9ff"], [2, 24, "#eff0f1ff"], [26, 1, "#3daee9ff"], [27, 1, "#eff0f1ff"]]}, "control": "CC_ToolButton", "id": "tool_button.hover", "rows": {"0": [[0, 28, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#c8e1efff"], [4, 1, "#75c2ecff"], [5, 1, "#4fb4eaff"], [6, 16, "#3daee9ff"], [22, 1, "#4fb4eaff"], [23, 1, "#75c2ecff"], [24, 1, "#c8e1efff"], [25, 3, "#eff0f1ff"]], "14": [[0, 1, "#eff0f1ff"], [1, 1, "#3daee9ff"], [2, 24, "#eff0f1ff"], [26, 1, "#3daee9ff"], [27, 1, "#eff0f1ff"]]}, "size": [28, 28], "state": {"flags": 12290, "group": "Active", "name": "hover"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 28, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#c8e1efff"], [4, 1, "#72c1ecff"], [5, 1, "#4db4e9ff"], [6, 16, "#3daee9ff"], [22, 1, "#4db4e9ff"], [23, 1, "#72c1ecff"], [24, 1, "#c8e1efff"], [25, 3, "#eff0f1ff"]], "14": [[0, 1, "#eff0f1ff"], [1, 1, "#3daee9ff"], [2, 24, "#b9dceeff"], [26, 1, "#3daee9ff"], [27, 1, "#eff0f1ff"]]}, "control": "CC_ToolButton", "id": "tool_button.pressed", "rows": {"0": [[0, 28, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#c8e1efff"], [4, 1, "#72c1ecff"], [5, 1, "#4db4e9ff"], [6, 16, "#3daee9ff"], [22, 1, "#4db4e9ff"], [23, 1, "#72c1ecff"], [24, 1, "#c8e1efff"], [25, 3, "#eff0f1ff"]], "14": [[0, 1, "#eff0f1ff"], [1, 1, "#3daee9ff"], [2, 24, "#b9dceeff"], [26, 1, "#3daee9ff"], [27, 1, "#eff0f1ff"]]}, "size": [28, 28], "state": {"flags": 12292, "group": "Active", "name": "pressed"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 28, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#e9e9eaff"], [4, 1, "#d8d9daff"], [5, 1, "#d3d3d5ff"], [6, 16, "#d1d1d2ff"], [22, 1, "#d3d3d5ff"], [23, 1, "#d8d9daff"], [24, 1, "#e9e9eaff"], [25, 3, "#eff0f1ff"]], "14": [[0, 1, "#eff0f1ff"], [1, 1, "#d1d1d2ff"], [2, 24, "#d5d7d8ff"], [26, 1, "#d1d1d2ff"], [27, 1, "#eff0f1ff"]]}, "control": "CC_ToolButton", "id": "tool_button.checked", "rows": {"0": [[0, 28, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#e9e9eaff"], [4, 1, "#d8d9daff"], [5, 1, "#d3d3d5ff"], [6, 16, "#d1d1d2ff"], [22, 1, "#d3d3d5ff"], [23, 1, "#d8d9daff"], [24, 1, "#e9e9eaff"], [25, 3, "#eff0f1ff"]], "14": [[0, 1, "#eff0f1ff"], [1, 1, "#d1d1d2ff"], [2, 24, "#d5d7d8ff"], [26, 1, "#d1d1d2ff"], [27, 1, "#eff0f1ff"]]}, "size": [28, 28], "state": {"flags": 4128, "group": "Active", "name": "checked"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 28, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#e3e4e5ff"], [4, 1, "#d5d5d7ff"], [5, 1, "#d3d3d4ff"], [6, 16, "#d1d1d2ff"], [22, 1, "#d3d3d4ff"], [23, 1, "#d4d4d5ff"], [24, 1, "#d8d9daff"], [25, 1, "#e8e9eaff"], [26, 2, "#eff0f1ff"]], "14": [[0, 1, "#eff0f1ff"], [1, 1, "#d1d1d2ff"], [2, 24, "#fcfcfcff"], [26, 1, "#d1d1d2ff"], [27, 1, "#d1d2d3ff"]]}, "control": "CC_ToolButton", "id": "tool_button.framed", "rows": {"0": [[0, 28, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#e3e4e5ff"], [4, 1, "#d5d5d7ff"], [5, 1, "#d3d3d4ff"], [6, 16, "#d1d1d2ff"], [22, 1, "#d3d3d4ff"], [23, 1, "#d5d5d7ff"], [24, 1, "#e3e4e5ff"], [25, 3, "#eff0f1ff"]], "14": [[0, 1, "#eff0f1ff"], [1, 1, "#d1d1d2ff"], [2, 24, "#fcfcfcff"], [26, 1, "#d1d1d2ff"], [27, 1, "#eff0f1ff"]]}, "size": [28, 28], "state": {"flags": 2, "group": "Active", "name": "framed"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#e8eaebff"], [3, 1, "#d6d7d9ff"], [4, 1, "#cacccdff"], [5, 21, "#c6c8c9ff"], [26, 1, "#c7c9caff"], [27, 1, "#cbcccdff"], [28, 1, "#d7d8d9ff"], [29, 1, "#e9eaebff"], [30, 2, "#eff0f1ff"]], "1": [[0, 1, "#eff0f1ff"], [1, 1, "#e9eaeaff"], [2, 1, "#cdcfd0ff"], [3, 1, "#f0f1f1ff"], [4, 1, "#fafafaff"], [5, 22, "#ffffffff"], [27, 1, "#f9fafaff"], [28, 1, "#f0f1f1ff"], [29, 1, "#cccfd0ff"], [30, 1, "#e9eaecff"], [31, 1, "#eff0f1ff"]], "2": [[0, 1, "#e8eaebff"], [1, 1, "#cdcecfff"], [2, 28, "#ffffffff"], [30, 1, "#cdceceff"], [31, 1, "#e9eaecff"]], "75": [[0, 1, "#c6c8c9ff"], [1, 29, "#ffffffff"], [30, 1, "#fefefeff"], [31, 1, "#c7c9caff"]]}, "control": "PE_PanelLineEdit", "id": "line_edit.normal", "rows": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#e8eaebff"], [3, 1, "#d6d7d9ff"], [4, 1, "#cacccdff"], [5, 139, "#c6c8c9ff"], [144, 1, "#c7c9caff"], [145, 1, "#cbcccdff"], [146, 1, "#d6d8d9ff"], [147, 1, "#e9eaebff"], [148, 2, "#eff0f1ff"]], "1": [[0, 1, "#eff0f1ff"], [1, 1, "#e9eaeaff"], [2, 1, "#cdcecfff"], [3, 1, "#f0f1f1ff"], [4, 1, "#fafafaff"], [5, 140, "#ffffffff"], [145, 1, "#f9fafaff"], [146, 1, "#f1f2f2ff"], [147, 1, "#cccfd0ff"], [148, 1, "#e9eaecff"], [149, 1, "#eff0f1ff"]], "16": [[0, 1, "#c6c8c9ff"], [1, 147, "#ffffffff"], [148, 1, "#fefefeff"], [149, 1, "#c7c9caff"]], "2": [[0, 1, "#e8eaebff"], [1, 1, "#cdcfd0ff"], [2, 146, "#ffffffff"], [148, 1, "#cdcfcfff"], [149, 1, "#e9eaecff"]], "30": [[0, 1, "#eff0f1ff"], [1, 1, "#e9eaecff"], [2, 1, "#cdceceff"], [3, 1, "#f1f1f1ff"], [4, 1, "#f9f9f9ff"], [5, 139, "#fefefeff"], [144, 1, "#ffffffff"], [145, 1, "#f9f9f9ff"], [146, 1, "#f0f0f1ff"], [147, 1, "#cccecfff"], [148, 1, "#eaebecff"], [149, 1, "#eff0f1ff"]], "31": [[0, 2, "#eff0f1ff"], [2, 1, "#e9eaecff"], [3, 1, "#d7d8daff"], [4, 1, "#cbcdceff"], [5, 139, "#c7c9caff"], [144, 1, "#c8cacaff"], [145, 1, "#cbcdceff"], [146, 1, "#d7d9d9ff"], [147, 1, "#eaebecff"], [148, 2, "#eff0f1ff"]]}, "size": [150, 32], "state": {"flags": 4, "group": "Active", "line_width": 6, "name": "normal"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#d3e6f0ff"], [3, 1, "#80c7edff"], [4, 1, "#4eb5eaff"], [5, 21, "#3daee9ff"], [26, 1, "#40afe9ff"], [27, 1, "#4fb5eaff"], [28, 1, "#80c7edff"], [29, 1, "#d5e6f0ff"], [30, 2, "#eff0f1ff"]], "1": [[0, 1, "#eff0f1ff"], [1, 1, "#d2e6f0ff"], [2, 1, "#57b8ebff"], [3, 1, "#cfebf9ff"], [4, 1, "#edf7fdff"], [5, 22, "#ffffffff"], [27, 1, "#ecf7fdff"], [28, 1, "#ceebf9ff"], [29, 1, "#56b8ebff"], [30, 1, "#d4e7f0ff"], [31, 1, "#eff0f1ff"]], "2": [[0, 1, "#d3e6f0ff"], [1, 1, "#57b8ebff"], [2, 28, "#ffffffff"], [30, 1, "#55b7ebff"], [31, 1, "#d6e7f0ff"]], "75": [[0, 1, "#3daee9ff"], [1, 29, "#ffffffff"], [30, 1, "#fdfeffff"], [31, 1, "#3fafe9ff"]]}, "control": "PE_PanelLineEdit", "id": "line_edit.hover", "rows": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#d3e6f0ff"], [3, 1, "#80c7edff"], [4, 1, "#4eb5eaff"], [5, 139, "#3daee9ff"], [144, 1, "#40afe9ff"], [145, 1, "#4fb5eaff"], [146, 1, "#80c7edff"], [147, 1, "#d5e6f0ff"], [148, 2, "#eff0f1ff"]], "1": [[0, 1, "#eff0f1ff"], [1, 1, "#d2e6f0ff"], [2, 1, "#57b8ebff"], [3, 1, "#cfebf9ff"], [4, 1, "#edf7fdff"], [5, 140, "#ffffffff"], [145, 1, "#ecf7fdff"], [146, 1, "#ceebf9ff"], [147, 1, "#55b8ebff"], [148, 1, "#d4e7f0ff"], [149, 1, "#eff0f1ff"]], "16": [[0, 1, "#3daee9ff"], [1, 147, "#ffffffff"], [148, 1, "#fdfeffff"], [149, 1, "#3fafe9ff"]], "2": [[0, 1, "#d3e6f0ff"], [1, 1, "#57b8ebff"], [2, 146, "#ffffffff"], [148, 1, "#55b7ebff"], [149, 1, "#d6e7f0ff"]], "30": [[0, 1, "#eff0f1ff"], [1, 1, "#d4e7f0ff"], [2, 1, "#55b7ebff"], [3, 1, "#cceaf9ff"], [4, 1, "#eaf6fdff"], [5, 140, "#fdfeffff"], [145, 1, "#e9f6fcff"], [146, 1, "#cbe9f9ff"], [147, 1, "#53b6ebff"], [148, 1, "#d7e7f0ff"], [149, 1, "#eff0f1ff"]], "31": [[0, 2, "#eff0f1ff"], [2, 1, "#d6e7f0ff"], [3, 1, "#82c7edff"], [4, 1, "#51b6eaff"], [5, 139, "#3fafe9ff"], [144, 1, "#42b0eaff"], [145, 1, "#52b6eaff"], [146, 1, "#83c8eeff"], [147, 1, "#d8e8f0ff"], [148, 2, "#eff0f1ff"]]}, "size": [150, 32], "state": {"flags": 8196, "group": "Active", "line_width": 6, "name": "hover"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#d3e6f0ff"], [3, 1, "#80c7edff"], [4, 1, "#4eb5eaff"], [5, 21, "#3daee9ff"], [26, 1, "#40afe9ff"], [27, 1, "#4fb5eaff"], [28, 1, "#80c7edff"], [29, 1, "#d5e6f0ff"], [30, 2, "#eff0f1ff"]], "1": [[0, 1, "#eff0f1ff"], [1, 1, "#d2e6f0ff"], [2, 1, "#57b8ebff"], [3, 1, "#cfebf9ff"], [4, 1, "#edf7fdff"], [5, 22, "#ffffffff"], [27, 1, "#ecf7fdff"], [28, 1, "#ceebf9ff"], [29, 1, "#56b8ebff"], [30, 1, "#d4e7f0ff"], [31, 1, "#eff0f1ff"]], "2": [[0, 1, "#d3e6f0ff"], [1, 1, "#57b8ebff"], [2, 28, "#ffffffff"], [30, 1, "#55b7ebff"], [31, 1, "#d6e7f0ff"]], "75": [[0, 1, "#3daee9ff"], [1, 29, "#ffffffff"], [30, 1, "#fdfeffff"], [31, 1, "#3fafe9ff"]]}, "control": "PE_PanelLineEdit", "id": "line_edit.focus", "rows": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#d3e6f0ff"], [3, 1, "#80c7edff"], [4, 1, "#4eb5eaff"], [5, 139, "#3daee9ff"], [144, 1, "#40afe9ff"], [145, 1, "#4fb5eaff"], [146, 1, "#80c7edff"], [147, 1, "#d5e6f0ff"], [148, 2, "#eff0f1ff"]], "1": [[0, 1, "#eff0f1ff"], [1, 1, "#d2e6f0ff"], [2, 1, "#57b8ebff"], [3, 1, "#cfebf9ff"], [4, 1, "#edf7fdff"], [5, 140, "#ffffffff"], [145, 1, "#ecf7fdff"], [146, 1, "#ceebf9ff"], [147, 1, "#55b8ebff"], [148, 1, "#d4e7f0ff"], [149, 1, "#eff0f1ff"]], "16": [[0, 1, "#3daee9ff"], [1, 147, "#ffffffff"], [148, 1, "#fdfeffff"], [149, 1, "#3fafe9ff"]], "2": [[0, 1, "#d3e6f0ff"], [1, 1, "#57b8ebff"], [2, 146, "#ffffffff"], [148, 1, "#55b7ebff"], [149, 1, "#d6e7f0ff"]], "30": [[0, 1, "#eff0f1ff"], [1, 1, "#d4e7f0ff"], [2, 1, "#55b7ebff"], [3, 1, "#cceaf9ff"], [4, 1, "#eaf6fdff"], [5, 140, "#fdfeffff"], [145, 1, "#e9f6fcff"], [146, 1, "#cbe9f9ff"], [147, 1, "#53b6ebff"], [148, 1, "#d7e7f0ff"], [149, 1, "#eff0f1ff"]], "31": [[0, 2, "#eff0f1ff"], [2, 1, "#d6e7f0ff"], [3, 1, "#82c7edff"], [4, 1, "#51b6eaff"], [5, 139, "#3fafe9ff"], [144, 1, "#42b0eaff"], [145, 1, "#52b6eaff"], [146, 1, "#83c8eeff"], [147, 1, "#d8e8f0ff"], [148, 2, "#eff0f1ff"]]}, "size": [150, 32], "state": {"flags": 8388868, "group": "Active", "line_width": 6, "name": "focus"}}, +{"background": "#e3e5e7ff", "cols": {"0": [[0, 2, "#e3e5e7ff"], [2, 1, "#e1e3e5ff"], [3, 1, "#dcdcdfff"], [4, 1, "#d8d9dbff"], [5, 21, "#d6d7d9ff"], [26, 1, "#d7d8daff"], [27, 1, "#d8d9dbff"], [28, 1, "#dcdedfff"], [29, 1, "#e1e3e4ff"], [30, 2, "#e3e5e7ff"]], "1": [[0, 1, "#e3e5e7ff"], [1, 1, "#e0e4e5ff"], [2, 1, "#d9dadcff"], [3, 1, "#ededeeff"], [4, 1, "#f0f0f0ff"], [5, 22, "#f3f3f3ff"], [27, 1, "#f0f0f0ff"], [28, 1, "#ececedff"], [29, 1, "#d9dadcff"], [30, 1, "#e2e4e5ff"], [31, 1, "#e3e5e7ff"]], "2": [[0, 1, "#e1e3e5ff"], [1, 1, "#d9dadcff"], [2, 28, "#f3f3f3ff"], [30, 1, "#d9d9dcff"], [31, 1, "#e1e4e5ff"]], "75": [[0, 1, "#d6d7d9ff"], [1, 30, "#f3f3f3ff"], [31, 1, "#d6d7d9ff"]]}, "control": "PE_PanelLineEdit", "id": "line_edit.disabled", "rows": {"0": [[0, 2, "#e3e5e7ff"], [2, 1, "#e1e3e5ff"], [3, 1, "#dcdddfff"], [4, 1, "#d8d9dbff"], [5, 139, "#d6d7d9ff"], [144, 1, "#d7d8daff"], [145, 1, "#d8d9dbff"], [146, 1, "#dcdedfff"], [147, 1, "#e1e3e4ff"], [148, 2, "#e3e5e7ff"]], "1": [[0, 1, "#e3e5e7ff"], [1, 1, "#e0e4e5ff"], [2, 1, "#d9dadcff"], [3, 1, "#ececedff"], [4, 1, "#f0f0f0ff"], [5, 140, "#f3f3f3ff"], [145, 1, "#f0f0f0ff"], [146, 1, "#ececedff"], [147, 1, "#d9dbdcff"], [148, 1, "#e2e4e5ff"], [149, 1, "#e3e5e7ff"]], "16": [[0, 1, "#d6d7d9ff"], [1, 148, "#f3f3f3ff"], [149, 1, "#d6d7d9ff"]], "2": [[0, 1, "#e1e3e5ff"], [1, 1, "#d9dadcff"], [2, 146, "#f3f3f3ff"], [148, 1, "#d9d9dcff"], [149, 1, "#e1e4e5ff"]], "30": [[0, 1, "#e3e5e7ff"], [1, 1, "#e2e4e5ff"], [2, 1, "#d9d9dcff"], [3, 1, "#ececedff"], [4, 1, "#eff0f0ff"], [5, 140, "#f3f3f3ff"], [145, 1, "#efeff0ff"], [146, 1, "#ecececff"], [147, 1, "#d8dadcff"], [148, 1, "#e2e4e5ff"], [149, 1, "#e3e5e7ff"]], "31": [[0, 2, "#e3e5e7ff"], [2, 1, "#e1e4e5ff"], [3, 1, "#dcdde0ff"], [4, 1, "#d8d9dbff"], [5, 139, "#d6d7d9ff"], [144, 1, "#d6d7daff"], [145, 1, "#d8dadbff"], [146, 1, "#dcdddeff"], [147, 1, "#e2e3e5ff"], [148, 2, "#e3e5e7ff"]]}, "size": [150, 32], "state": {"flags": 4, "group": "Disabled", "line_width": 6, "name": "disabled"}}, +{"background": "#eff0f1ff", "cols": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#c6c8c9ff"], [3, 14, "#fcfcfcff"], [17, 1, "#c6c8c9ff"], [18, 2, "#eff0f1ff"]], "2": [[0, 3, "#eff0f1ff"], [3, 1, "#eeeff0ff"], [4, 1, "#dedfe0ff"], [5, 1, "#d0d1d2ff"], [6, 1, "#c7c9caff"], [7, 6, "#c6c8c9ff"], [13, 1, "#c7c9caff"], [14, 1, "#d0d1d2ff"], [15, 1, "#dedfe0ff"], [16, 1, "#eeeff0ff"], [17, 3, "#eff0f1ff"]], "3": [[0, 2, "#eff0f1ff"], [2, 1, "#eeeff0ff"], [3, 1, "#d2d4d5ff"], [4, 1, "#d7d8d9ff"], [5, 1, "#f2f2f2ff"], [6, 1, "#fbfbfbff"], [7, 6, "#fcfcfcff"], [13, 1, "#fbfbfbff"], [14, 1, "#f2f2f2ff"], [15, 1, "#d7d8d9ff"], [16, 1, "#d2d4d5ff"], [17, 1, "#eeeff0ff"], [18, 2, "#eff0f1ff"]], "8": [[0, 2, "#eff0f1ff"], [2, 1, "#c6c8c9ff"], [3, 14, "#fcfcfcff"], [17, 1, "#c6c8c9ff"], [18, 2, "#eff0f1ff"]]}, "control": "PE_IndicatorCheckBox", "id": "check_box.off", "rows": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#c6c8c9ff"], [3, 14, "#fcfcfcff"], [17, 1, "#c6c8c9ff"], [18, 2, "#eff0f1ff"]], "12": [[0, 2, "#eff0f1ff"], [2, 1, "#c6c8c9ff"], [3, 14, "#fcfcfcff"], [17, 1, "#c6c8c9ff"], [18, 2, "#eff0f1ff"]], "2": [[0, 3, "#eff0f1ff"], [3, 1, "#eeeff0ff"], [4, 1, "#dedfe0ff"], [5, 1, "#d0d1d2ff"], [6, 1, "#c7c9caff"], [7, 6, "#c6c8c9ff"], [13, 1, "#c7c9caff"], [14, 1, "#d0d1d2ff"], [15, 1, "#dedfe0ff"], [16, 1, "#eeeff0ff"], [17, 3, "#eff0f1ff"]], "3": [[0, 2, "#eff0f1ff"], [2, 1, "#eeeff0ff"], [3, 1, "#d2d4d5ff"], [4, 1, "#d7d8d9ff"], [5, 1, "#f2f2f2ff"], [6, 1, "#fbfbfbff"], [7, 6, "#fcfcfcff"], [13, 1, "#fbfbfbff"], [14, 1, "#f2f2f2ff"], [15, 1, "#d7d8d9ff"], [16, 1, "#d2d4d5ff"], [17, 1, "#eeeff0ff"], [18, 2, "#eff0f1ff"]], "8": [[0, 2, "#eff0f1ff"], [2, 1, "#c6c8c9ff"], [3, 14, "#fcfcfcff"], [17, 1, "#c6c8c9ff"], [18, 2, "#eff0f1ff"]]}, "size": [20, 20], "state": {"flags": 8, "group": "Active", "name": "off"}}, +{"background": "#eff0f1ff", "cols": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 6, "#c2e4f6ff"], [9, 1, "#b4d3e5ff"], [10, 1, "#3e464cff"], [11, 1, "#232629ff"], [12, 1, "#3e464cff"], [13, 1, "#b4d3e5ff"], [14, 3, "#c2e4f6ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]], "2": [[0, 3, "#eff0f1ff"], [3, 1, "#ebeef1ff"], [4, 1, "#74c2ecff"], [5, 1, "#45b1e9ff"], [6, 8, "#3daee9ff"], [14, 1, "#45b1e9ff"], [15, 1, "#74c2ecff"], [16, 1, "#ebeef1ff"], [17, 3, "#eff0f1ff"]], "3": [[0, 2, "#eff0f1ff"], [2, 1, "#ebeef1ff"], [3, 1, "#4bb3eaff"], [4, 1, "#4cb4eaff"], [5, 1, "#93d0f2ff"], [6, 1, "#bbe2f4ff"], [7, 6, "#c2e4f6ff"], [13, 1, "#bbe2f4ff"], [14, 1, "#93d0f2ff"], [15, 1, "#4cb4eaff"], [16, 1, "#4bb3eaff"], [17, 1, "#ebeef1ff"], [18, 2, "#eff0f1ff"]], "8": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 7, "#c2e4f6ff"], [10, 1, "#b4d3e5ff"], [11, 1, "#31383bff"], [12, 1, "#232629ff"], [13, 1, "#3e464bff"], [14, 1, "#b3d2e4ff"], [15, 2, "#c2e4f6ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]]}, "control": "PE_IndicatorCheckBox", "id": "check_box.on", "rows": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 1, "#c2e4f6ff"], [4, 1, "#b3d2e4ff"], [5, 1, "#3e464bff"], [6, 1, "#232629ff"], [7, 1, "#3e464cff"], [8, 2, "#b4d3e5ff"], [10, 1, "#3e464cff"], [11, 1, "#232629ff"], [12, 1, "#3e464cff"], [13, 1, "#b4d3e5ff"], [14, 3, "#c2e4f6ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]], "12": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 3, "#c2e4f6ff"], [6, 1, "#b4d3e5ff"], [7, 1, "#3e464cff"], [8, 2, "#232629ff"], [10, 1, "#3e464cff"], [11, 1, "#b4d3e5ff"], [12, 5, "#c2e4f6ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]], "2": [[0, 3, "#eff0f1ff"], [3, 1, "#ebeef1ff"], [4, 1, "#74c2ecff"], [5, 1, "#45b1e9ff"], [6, 8, "#3daee9ff"], [14, 1, "#45b1e9ff"], [15, 1, "#75c2ebff"], [16, 1, "#ebeef1ff"], [17, 3, "#eff0f1ff"]], "3": [[0, 2, "#eff0f1ff"], [2, 1, "#ebeef1ff"], [3, 1, "#4bb3eaff"], [4, 1, "#4cb4eaff"], [5, 1, "#93d0f2ff"], [6, 1, "#bbe2f4ff"], [7, 6, "#c2e4f6ff"], [13, 1, "#bbe2f4ff"], [14, 1, "#93d0f2ff"], [15, 1, "#4cb4eaff"], [16, 1, "#4bb3eaff"], [17, 1, "#ebeef1ff"], [18, 2, "#eff0f1ff"]], "8": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 2, "#c2e4f6ff"], [5, 2, "#b3d2e4ff"], [7, 4, "#c2e4f6ff"], [11, 1, "#b4d3e5ff"], [12, 1, "#3e464cff"], [13, 1, "#232629ff"], [14, 1, "#3e464cff"], [15, 1, "#b4d3e5ff"], [16, 1, "#c2e4f6ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]]}, "size": [20, 20], "state": {"flags": 32, "group": "Active", "name": "on"}}, +{"background": "#eff0f1ff", "cols": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 6, "#c2e4f6ff"], [9, 2, "#232629ff"], [11, 6, "#c2e4f6ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]], "2": [[0, 3, "#eff0f1ff"], [3, 1, "#ebeef1ff"], [4, 1, "#74c2ecff"], [5, 1, "#45b1e9ff"], [6, 8, "#3daee9ff"], [14, 1, "#45b1e9ff"], [15, 1, "#74c2ecff"], [16, 1, "#ebeef1ff"], [17, 3, "#eff0f1ff"]], "3": [[0, 2, "#eff0f1ff"], [2, 1, "#ebeef1ff"], [3, 1, "#4bb3eaff"], [4, 1, "#4cb4eaff"], [5, 1, "#93d0f2ff"], [6, 1, "#bbe2f4ff"], [7, 6, "#c2e4f6ff"], [13, 1, "#bbe2f4ff"], [14, 1, "#93d0f2ff"], [15, 1, "#4cb4eaff"], [16, 1, "#4bb3eaff"], [17, 1, "#ebeef1ff"], [18, 2, "#eff0f1ff"]], "8": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 14, "#c2e4f6ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]]}, "control": "PE_IndicatorCheckBox", "id": "check_box.partial", "rows": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 2, "#c2e4f6ff"], [5, 2, "#232629ff"], [7, 2, "#c2e4f6ff"], [9, 2, "#232629ff"], [11, 2, "#c2e4f6ff"], [13, 2, "#232629ff"], [15, 2, "#c2e4f6ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]], "12": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 14, "#c2e4f6ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]], "2": [[0, 3, "#eff0f1ff"], [3, 1, "#ebeef1ff"], [4, 1, "#74c2ecff"], [5, 1, "#45b1e9ff"], [6, 8, "#3daee9ff"], [14, 1, "#45b1e9ff"], [15, 1, "#75c2ebff"], [16, 1, "#ebeef1ff"], [17, 3, "#eff0f1ff"]], "3": [[0, 2, "#eff0f1ff"], [2, 1, "#ebeef1ff"], [3, 1, "#4bb3eaff"], [4, 1, "#4cb4eaff"], [5, 1, "#93d0f2ff"], [6, 1, "#bbe2f4ff"], [7, 6, "#c2e4f6ff"], [13, 1, "#bbe2f4ff"], [14, 1, "#93d0f2ff"], [15, 1, "#4cb4eaff"], [16, 1, "#4bb3eaff"], [17, 1, "#ebeef1ff"], [18, 2, "#eff0f1ff"]], "8": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 14, "#c2e4f6ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]]}, "size": [20, 20], "state": {"flags": 16, "group": "Active", "name": "partial"}}, +{"background": "#eff0f1ff", "cols": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 14, "#fcfcfcff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]], "2": [[0, 3, "#eff0f1ff"], [3, 1, "#eceef0ff"], [4, 1, "#97c9e4ff"], [5, 1, "#5bb6e4ff"], [6, 1, "#40afe8ff"], [7, 6, "#3daee9ff"], [13, 1, "#40afe8ff"], [14, 1, "#5bb6e4ff"], [15, 1, "#97c9e4ff"], [16, 1, "#eceef0ff"], [17, 3, "#eff0f1ff"]], "3": [[0, 2, "#eff0f1ff"], [2, 1, "#eceef0ff"], [3, 1, "#68b9e3ff"], [4, 1, "#70bce3ff"], [5, 1, "#cfe5f1ff"], [6, 1, "#f6f9faff"], [7, 6, "#fcfcfcff"], [13, 1, "#f6f9faff"], [14, 1, "#cfe5f1ff"], [15, 1, "#70bce3ff"], [16, 1, "#68b9e3ff"], [17, 1, "#eceef0ff"], [18, 2, "#eff0f1ff"]], "8": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 14, "#fcfcfcff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]]}, "control": "PE_IndicatorCheckBox", "id": "check_box.hover_off", "rows": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 14, "#fcfcfcff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]], "12": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 14, "#fcfcfcff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]], "2": [[0, 3, "#eff0f1ff"], [3, 1, "#eceef0ff"], [4, 1, "#97c9e4ff"], [5, 1, "#5bb6e4ff"], [6, 1, "#40afe8ff"], [7, 6, "#3daee9ff"], [13, 1, "#40afe8ff"], [14, 1, "#5bb6e4ff"], [15, 1, "#97c9e4ff"], [16, 1, "#eceef0ff"], [17, 3, "#eff0f1ff"]], "3": [[0, 2, "#eff0f1ff"], [2, 1, "#eceef0ff"], [3, 1, "#68b9e3ff"], [4, 1, "#70bce3ff"], [5, 1, "#cfe5f1ff"], [6, 1, "#f6f9faff"], [7, 6, "#fcfcfcff"], [13, 1, "#f6f9faff"], [14, 1, "#cfe5f1ff"], [15, 1, "#70bce3ff"], [16, 1, "#68b9e3ff"], [17, 1, "#eceef0ff"], [18, 2, "#eff0f1ff"]], "8": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 14, "#fcfcfcff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]]}, "size": [20, 20], "state": {"flags": 8200, "group": "Active", "name": "hover_off"}}, +{"background": "#eff0f1ff", "cols": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 6, "#c2e4f6ff"], [9, 1, "#b4d3e5ff"], [10, 1, "#3e464cff"], [11, 1, "#232629ff"], [12, 1, "#3e464cff"], [13, 1, "#b4d3e5ff"], [14, 3, "#c2e4f6ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]], "2": [[0, 3, "#eff0f1ff"], [3, 1, "#ebeef1ff"], [4, 1, "#74c2ecff"], [5, 1, "#45b1e9ff"], [6, 8, "#3daee9ff"], [14, 1, "#45b1e9ff"], [15, 1, "#74c2ecff"], [16, 1, "#ebeef1ff"], [17, 3, "#eff0f1ff"]], "3": [[0, 2, "#eff0f1ff"], [2, 1, "#ebeef1ff"], [3, 1, "#4bb3eaff"], [4, 1, "#4cb4eaff"], [5, 1, "#93d0f2ff"], [6, 1, "#bbe2f4ff"], [7, 6, "#c2e4f6ff"], [13, 1, "#bbe2f4ff"], [14, 1, "#93d0f2ff"], [15, 1, "#4cb4eaff"], [16, 1, "#4bb3eaff"], [17, 1, "#ebeef1ff"], [18, 2, "#eff0f1ff"]], "8": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 7, "#c2e4f6ff"], [10, 1, "#b4d3e5ff"], [11, 1, "#31383bff"], [12, 1, "#232629ff"], [13, 1, "#3e464bff"], [14, 1, "#b3d2e4ff"], [15, 2, "#c2e4f6ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]]}, "control": "PE_IndicatorCheckBox", "id": "check_box.focus_on", "rows": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 1, "#c2e4f6ff"], [4, 1, "#b3d2e4ff"], [5, 1, "#3e464bff"], [6, 1, "#232629ff"], [7, 1, "#3e464cff"], [8, 2, "#b4d3e5ff"], [10, 1, "#3e464cff"], [11, 1, "#232629ff"], [12, 1, "#3e464cff"], [13, 1, "#b4d3e5ff"], [14, 3, "#c2e4f6ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]], "12": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 3, "#c2e4f6ff"], [6, 1, "#b4d3e5ff"], [7, 1, "#3e464cff"], [8, 2, "#232629ff"], [10, 1, "#3e464cff"], [11, 1, "#b4d3e5ff"], [12, 5, "#c2e4f6ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]], "2": [[0, 3, "#eff0f1ff"], [3, 1, "#ebeef1ff"], [4, 1, "#74c2ecff"], [5, 1, "#45b1e9ff"], [6, 8, "#3daee9ff"], [14, 1, "#45b1e9ff"], [15, 1, "#75c2ebff"], [16, 1, "#ebeef1ff"], [17, 3, "#eff0f1ff"]], "3": [[0, 2, "#eff0f1ff"], [2, 1, "#ebeef1ff"], [3, 1, "#4bb3eaff"], [4, 1, "#4cb4eaff"], [5, 1, "#93d0f2ff"], [6, 1, "#bbe2f4ff"], [7, 6, "#c2e4f6ff"], [13, 1, "#bbe2f4ff"], [14, 1, "#93d0f2ff"], [15, 1, "#4cb4eaff"], [16, 1, "#4bb3eaff"], [17, 1, "#ebeef1ff"], [18, 2, "#eff0f1ff"]], "8": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 2, "#c2e4f6ff"], [5, 2, "#b3d2e4ff"], [7, 4, "#c2e4f6ff"], [11, 1, "#b4d3e5ff"], [12, 1, "#3e464cff"], [13, 1, "#232629ff"], [14, 1, "#3e464cff"], [15, 1, "#b4d3e5ff"], [16, 1, "#c2e4f6ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]]}, "size": [20, 20], "state": {"flags": 8388896, "group": "Active", "name": "focus_on"}}, +{"background": "#eff0f1ff", "cols": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#c6c8c9ff"], [3, 14, "#e5e5e5ff"], [17, 1, "#c6c8c9ff"], [18, 2, "#eff0f1ff"]], "2": [[0, 3, "#eff0f1ff"], [3, 1, "#eeeff0ff"], [4, 1, "#dddfdfff"], [5, 1, "#cecfd0ff"], [6, 1, "#c7c9caff"], [7, 6, "#c6c8c9ff"], [13, 1, "#c7c9caff"], [14, 1, "#cecfd0ff"], [15, 1, "#dddfdfff"], [16, 1, "#eeeff0ff"], [17, 3, "#eff0f1ff"]], "3": [[0, 2, "#eff0f1ff"], [2, 1, "#eeeff0ff"], [3, 1, "#d1d3d3ff"], [4, 1, "#d1d2d3ff"], [5, 1, "#dfdfdfff"], [6, 8, "#e5e5e5ff"], [14, 1, "#dfdfdfff"], [15, 1, "#d1d2d3ff"], [16, 1, "#d1d3d3ff"], [17, 1, "#eeeff0ff"], [18, 2, "#eff0f1ff"]], "8": [[0, 2, "#eff0f1ff"], [2, 1, "#c6c8c9ff"], [3, 14, "#e5e5e5ff"], [17, 1, "#c6c8c9ff"], [18, 2, "#eff0f1ff"]]}, "control": "PE_IndicatorCheckBox", "id": "check_box.pressed_off", "rows": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#c6c8c9ff"], [3, 14, "#e5e5e5ff"], [17, 1, "#c6c8c9ff"], [18, 2, "#eff0f1ff"]], "12": [[0, 2, "#eff0f1ff"], [2, 1, "#c6c8c9ff"], [3, 14, "#e5e5e5ff"], [17, 1, "#c6c8c9ff"], [18, 2, "#eff0f1ff"]], "2": [[0, 3, "#eff0f1ff"], [3, 1, "#eeeff0ff"], [4, 1, "#dddfdfff"], [5, 1, "#cecfd0ff"], [6, 1, "#c7c9caff"], [7, 6, "#c6c8c9ff"], [13, 1, "#c7c9caff"], [14, 1, "#cecfd0ff"], [15, 1, "#dddfdfff"], [16, 1, "#eeeff0ff"], [17, 3, "#eff0f1ff"]], "3": [[0, 2, "#eff0f1ff"], [2, 1, "#eeeff0ff"], [3, 1, "#d1d3d3ff"], [4, 1, "#d1d2d3ff"], [5, 1, "#dfdfdfff"], [6, 8, "#e5e5e5ff"], [14, 1, "#dfdfdfff"], [15, 1, "#d1d2d3ff"], [16, 1, "#d1d3d3ff"], [17, 1, "#eeeff0ff"], [18, 2, "#eff0f1ff"]], "8": [[0, 2, "#eff0f1ff"], [2, 1, "#c6c8c9ff"], [3, 14, "#e5e5e5ff"], [17, 1, "#c6c8c9ff"], [18, 2, "#eff0f1ff"]]}, "size": [20, 20], "state": {"flags": 12, "group": "Active", "name": "pressed_off"}}, +{"background": "#e3e5e7ff", "cols": {"10": [[0, 3, "#e3e5e7ff"], [3, 6, "#ecededff"], [9, 1, "#e7e8e8ff"], [10, 1, "#b6b6b7ff"], [11, 1, "#aaabacff"], [12, 1, "#b6b6b7ff"], [13, 1, "#e7e8e8ff"], [14, 3, "#ecededff"], [17, 3, "#e3e5e7ff"]], "2": [[0, 5, "#e3e5e7ff"], [5, 1, "#e3e4e7ff"], [6, 1, "#e3e6e7ff"], [7, 6, "#e3e5e7ff"], [13, 1, "#e3e6e7ff"], [14, 1, "#e3e4e7ff"], [15, 5, "#e3e5e7ff"]], "3": [[0, 4, "#e3e5e7ff"], [4, 1, "#e3e6e7ff"], [5, 1, "#e9eaeaff"], [6, 1, "#eaebebff"], [7, 6, "#ecededff"], [13, 1, "#eaebebff"], [14, 1, "#e9eaeaff"], [15, 1, "#e3e6e7ff"], [16, 4, "#e3e5e7ff"]], "8": [[0, 3, "#e3e5e7ff"], [3, 7, "#ecededff"], [10, 1, "#e7e8e8ff"], [11, 1, "#b0b1b1ff"], [12, 1, "#aaabacff"], [13, 1, "#b5b6b7ff"], [14, 1, "#e6e7e8ff"], [15, 2, "#ecededff"], [17, 3, "#e3e5e7ff"]]}, "control": "PE_IndicatorCheckBox", "id": "check_box.disabled_on", "rows": {"10": [[0, 3, "#e3e5e7ff"], [3, 1, "#ecededff"], [4, 1, "#e6e7e8ff"], [5, 1, "#b5b6b7ff"], [6, 1, "#aaabacff"], [7, 1, "#b6b6b7ff"], [8, 2, "#e7e8e8ff"], [10, 1, "#b6b6b7ff"], [11, 1, "#aaabacff"], [12, 1, "#b6b6b7ff"], [13, 1, "#e7e8e8ff"], [14, 3, "#ecededff"], [17, 3, "#e3e5e7ff"]], "12": [[0, 3, "#e3e5e7ff"], [3, 3, "#ecededff"], [6, 1, "#e7e8e8ff"], [7, 1, "#b6b6b7ff"], [8, 2, "#aaabacff"], [10, 1, "#b6b6b7ff"], [11, 1, "#e7e8e8ff"], [12, 5, "#ecededff"], [17, 3, "#e3e5e7ff"]], "2": [[0, 5, "#e3e5e7ff"], [5, 1, "#e3e4e7ff"], [6, 1, "#e3e6e7ff"], [7, 6, "#e3e5e7ff"], [13, 1, "#e3e6e7ff"], [14, 1, "#e3e4e7ff"], [15, 5, "#e3e5e7ff"]], "3": [[0, 4, "#e3e5e7ff"], [4, 1, "#e3e6e7ff"], [5, 1, "#e9eaeaff"], [6, 1, "#eaebebff"], [7, 6, "#ecededff"], [13, 1, "#eaebebff"], [14, 1, "#e9eaeaff"], [15, 1, "#e3e6e7ff"], [16, 4, "#e3e5e7ff"]], "8": [[0, 3, "#e3e5e7ff"], [3, 2, "#ecededff"], [5, 2, "#e6e7e8ff"], [7, 4, "#ecededff"], [11, 1, "#e7e8e8ff"], [12, 1, "#b6b6b7ff"], [13, 1, "#aaabacff"], [14, 1, "#b6b6b7ff"], [15, 1, "#e7e8e8ff"], [16, 1, "#ecededff"], [17, 3, "#e3e5e7ff"]]}, "size": [20, 20], "state": {"flags": 32, "group": "Disabled", "name": "disabled_on"}}, +{"background": "#eff0f1ff", "cols": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#c9cbccff"], [3, 1, "#f9f9f9ff"], [4, 12, "#fcfcfcff"], [16, 1, "#f9f9f9ff"], [17, 1, "#c8cbccff"], [18, 2, "#eff0f1ff"]]}, "control": "PE_IndicatorRadioButton", "id": "radio_button.off", "rows": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#c9cbccff"], [3, 1, "#f9f9f9ff"], [4, 12, "#fcfcfcff"], [16, 1, "#f9f9f9ff"], [17, 1, "#c8cbccff"], [18, 2, "#eff0f1ff"]], "3": [[0, 4, "#eff0f1ff"], [4, 1, "#eeeff0ff"], [5, 1, "#d9dbdcff"], [6, 1, "#cbcdceff"], [7, 1, "#e2e3e3ff"], [8, 1, "#f3f3f3ff"], [9, 2, "#f9f9f9ff"], [11, 1, "#f3f3f3ff"], [12, 1, "#e2e3e3ff"], [13, 1, "#cbcdceff"], [14, 1, "#d9dbdcff"], [15, 1, "#eeeff0ff"], [16, 4, "#eff0f1ff"]]}, "size": [20, 20], "state": {"flags": 8, "group": "Active", "name": "off"}}, +{"background": "#eff0f1ff", "cols": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 1, "#b4dff5ff"], [4, 3, "#c2e4f6ff"], [7, 1, "#32373cff"], [8, 4, "#232629ff"], [12, 1, "#33383dff"], [13, 3, "#c2e4f6ff"], [16, 1, "#b4dff5ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]]}, "control": "PE_IndicatorRadioButton", "id": "radio_button.on", "rows": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 1, "#b4dff5ff"], [4, 3, "#c2e4f6ff"], [7, 1, "#32373cff"], [8, 4, "#232629ff"], [12, 1, "#33383dff"], [13, 3, "#c2e4f6ff"], [16, 1, "#b4dff5ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]], "3": [[0, 4, "#eff0f1ff"], [4, 1, "#e9eef1ff"], [5, 1, "#63bbebff"], [6, 1, "#3faee9ff"], [7, 1, "#61bcecff"], [8, 1, "#96d2f2ff"], [9, 2, "#b4dff5ff"], [11, 1, "#96d2f2ff"], [12, 1, "#61bcecff"], [13, 1, "#3faee9ff"], [14, 1, "#63bbebff"], [15, 1, "#e9eef1ff"], [16, 4, "#eff0f1ff"]]}, "size": [20, 20], "state": {"flags": 32, "group": "Active", "name": "on"}}, +{"background": "#eff0f1ff", "cols": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#43b0e8ff"], [3, 1, "#eff5f8ff"], [4, 12, "#fcfcfcff"], [16, 1, "#eff5f8ff"], [17, 1, "#44afe7ff"], [18, 2, "#eff0f1ff"]]}, "control": "PE_IndicatorRadioButton", "id": "radio_button.hover_off", "rows": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#43b0e8ff"], [3, 1, "#eff5f8ff"], [4, 12, "#fcfcfcff"], [16, 1, "#eff5f8ff"], [17, 1, "#44afe7ff"], [18, 2, "#eff0f1ff"]], "3": [[0, 4, "#eff0f1ff"], [4, 1, "#ebeef0ff"], [5, 1, "#85c2e3ff"], [6, 1, "#4db1e5ff"], [7, 1, "#93c9e5ff"], [8, 1, "#d2e6f1ff"], [9, 2, "#eff5f8ff"], [11, 1, "#d2e6f1ff"], [12, 1, "#93c9e5ff"], [13, 1, "#4db1e5ff"], [14, 1, "#85c2e3ff"], [15, 1, "#ebeef0ff"], [16, 4, "#eff0f1ff"]]}, "size": [20, 20], "state": {"flags": 8200, "group": "Active", "name": "hover_off"}}, +{"background": "#eff0f1ff", "cols": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 1, "#b4dff5ff"], [4, 3, "#c2e4f6ff"], [7, 1, "#32373cff"], [8, 4, "#232629ff"], [12, 1, "#33383dff"], [13, 3, "#c2e4f6ff"], [16, 1, "#b4dff5ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]]}, "control": "PE_IndicatorRadioButton", "id": "radio_button.focus_on", "rows": {"10": [[0, 2, "#eff0f1ff"], [2, 1, "#3daee9ff"], [3, 1, "#b4dff5ff"], [4, 3, "#c2e4f6ff"], [7, 1, "#32373cff"], [8, 4, "#232629ff"], [12, 1, "#33383dff"], [13, 3, "#c2e4f6ff"], [16, 1, "#b4dff5ff"], [17, 1, "#3daee9ff"], [18, 2, "#eff0f1ff"]], "3": [[0, 4, "#eff0f1ff"], [4, 1, "#e9eef1ff"], [5, 1, "#63bbebff"], [6, 1, "#3faee9ff"], [7, 1, "#61bcecff"], [8, 1, "#96d2f2ff"], [9, 2, "#b4dff5ff"], [11, 1, "#96d2f2ff"], [12, 1, "#61bcecff"], [13, 1, "#3faee9ff"], [14, 1, "#63bbebff"], [15, 1, "#e9eef1ff"], [16, 4, "#eff0f1ff"]]}, "size": [20, 20], "state": {"flags": 8388896, "group": "Active", "name": "focus_on"}}, +{"background": "#e3e5e7ff", "cols": {"10": [[0, 3, "#e3e5e7ff"], [3, 4, "#ecededff"], [7, 1, "#b0b1b2ff"], [8, 4, "#aaabacff"], [12, 1, "#b0b1b2ff"], [13, 4, "#ecededff"], [17, 3, "#e3e5e7ff"]]}, "control": "PE_IndicatorRadioButton", "id": "radio_button.disabled_on", "rows": {"10": [[0, 3, "#e3e5e7ff"], [3, 4, "#ecededff"], [7, 1, "#b0b1b2ff"], [8, 4, "#aaabacff"], [12, 1, "#b0b1b2ff"], [13, 4, "#ecededff"], [17, 3, "#e3e5e7ff"]], "3": [[0, 5, "#e3e5e7ff"], [5, 1, "#e4e5e7ff"], [6, 1, "#e3e5e7ff"], [7, 1, "#e5e8e9ff"], [8, 1, "#e9eaebff"], [9, 2, "#ecededff"], [11, 1, "#e9eaebff"], [12, 1, "#e5e8e9ff"], [13, 1, "#e3e5e7ff"], [14, 1, "#e4e5e7ff"], [15, 5, "#e3e5e7ff"]]}, "size": [20, 20], "state": {"flags": 32, "group": "Disabled", "name": "disabled_on"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 32, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#e3e4e5ff"], [4, 1, "#d5d5d7ff"], [5, 1, "#d3d3d4ff"], [6, 20, "#d1d1d2ff"], [26, 1, "#d3d3d4ff"], [27, 1, "#d4d4d5ff"], [28, 1, "#d8d9daff"], [29, 1, "#e8e9eaff"], [30, 2, "#eff0f1ff"]], "140": [[0, 1, "#eff0f1ff"], [1, 1, "#d1d1d2ff"], [2, 13, "#fcfcfcff"], [15, 1, "#cccccdff"], [16, 1, "#525457ff"], [17, 1, "#cccccdff"], [18, 12, "#fcfcfcff"], [30, 1, "#d1d1d2ff"], [31, 1, "#d1d2d3ff"]], "40": [[0, 1, "#eff0f1ff"], [1, 1, "#d1d1d2ff"], [2, 28, "#fcfcfcff"], [30, 1, "#d1d1d2ff"], [31, 1, "#d1d2d3ff"]]}, "control": "CC_ComboBox", "id": "combo_box.normal", "rows": {"0": [[0, 150, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#e3e4e5ff"], [4, 1, "#d5d5d7ff"], [5, 1, "#d3d3d4ff"], [6, 138, "#d1d1d2ff"], [144, 1, "#d3d3d4ff"], [145, 1, "#d5d5d7ff"], [146, 1, "#e3e4e5ff"], [147, 3, "#eff0f1ff"]], "16": [[0, 1, "#eff0f1ff"], [1, 1, "#d1d1d2ff"], [2, 132, "#fcfcfcff"], [134, 1, "#cccccdff"], [135, 1, "#525457ff"], [136, 1, "#cccccdff"], [137, 2, "#fcfcfcff"], [139, 1, "#cccccdff"], [140, 1, "#525457ff"], [141, 1, "#cccccdff"], [142, 6, "#fcfcfcff"], [148, 1, "#d1d1d2ff"], [149, 1, "#eff0f1ff"]], "31": [[0, 3, "#eff0f1ff"], [3, 1, "#e8e9eaff"], [4, 1, "#dadbdcff"], [5, 1, "#d4d5d6ff"], [6, 138, "#d1d2d3ff"], [144, 1, "#d4d5d6ff"], [145, 1, "#dadbdcff"], [146, 1, "#e8e9eaff"], [147, 3, "#eff0f1ff"]]}, "size": [150, 32], "state": {"editable": false, "flags": 0, "group": "Active", "name": "normal"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 32, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#c2dceaff"], [4, 1, "#70bde7ff"], [5, 1, "#4eb3e8ff"], [6, 20, "#3daee9ff"], [26, 1, "#4eb3e8ff"], [27, 1, "#6fbce5ff"], [28, 1, "#b7d1dfff"], [29, 1, "#e8e9eaff"], [30, 2, "#eff0f1ff"]], "140": [[0, 1, "#eff0f1ff"], [1, 1, "#3daee9ff"], [2, 13, "#fcfcfcff"], [15, 1, "#cccccdff"], [16, 1, "#525457ff"], [17, 1, "#cccccdff"], [18, 12, "#fcfcfcff"], [30, 1, "#3daee9ff"], [31, 1, "#d1d2d3ff"]], "40": [[0, 1, "#eff0f1ff"], [1, 1, "#3daee9ff"], [2, 28, "#fcfcfcff"], [30, 1, "#3daee9ff"], [31, 1, "#d1d2d3ff"]]}, "control": "CC_ComboBox", "id": "combo_box.hover", "rows": {"0": [[0, 150, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#c2dceaff"], [4, 1, "#70bde7ff"], [5, 1, "#4eb3e8ff"], [6, 138, "#3daee9ff"], [144, 1, "#4eb3e8ff"], [145, 1, "#70bde7ff"], [146, 1, "#c2dceaff"], [147, 3, "#eff0f1ff"]], "16": [[0, 1, "#eff0f1ff"], [1, 1, "#3daee9ff"], [2, 132, "#fcfcfcff"], [134, 1, "#cccccdff"], [135, 1, "#525457ff"], [136, 1, "#cccccdff"], [137, 2, "#fcfcfcff"], [139, 1, "#cccccdff"], [140, 1, "#525457ff"], [141, 1, "#cccccdff"], [142, 6, "#fcfcfcff"], [148, 1, "#3daee9ff"], [149, 1, "#eff0f1ff"]], "31": [[0, 3, "#eff0f1ff"], [3, 1, "#e8e9eaff"], [4, 1, "#dadbdcff"], [5, 1, "#d4d5d6ff"], [6, 138, "#d1d2d3ff"], [144, 1, "#d4d5d6ff"], [145, 1, "#dadbdcff"], [146, 1, "#e8e9eaff"], [147, 3, "#eff0f1ff"]]}, "size": [150, 32], "state": {"editable": false, "flags": 8192, "group": "Active", "name": "hover"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 32, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#c2dceaff"], [4, 1, "#70bde7ff"], [5, 1, "#4eb3e8ff"], [6, 20, "#3daee9ff"], [26, 1, "#4eb3e8ff"], [27, 1, "#6fbce5ff"], [28, 1, "#b7d1dfff"], [29, 1, "#e8e9eaff"], [30, 2, "#eff0f1ff"]], "140": [[0, 1, "#eff0f1ff"], [1, 1, "#3daee9ff"], [2, 13, "#fcfcfcff"], [15, 1, "#c3c4c5ff"], [16, 1, "#333639ff"], [17, 1, "#c3c4c5ff"], [18, 12, "#fcfcfcff"], [30, 1, "#3daee9ff"], [31, 1, "#d1d2d3ff"]], "40": [[0, 1, "#eff0f1ff"], [1, 1, "#3daee9ff"], [2, 28, "#fcfcfcff"], [30, 1, "#3daee9ff"], [31, 1, "#d1d2d3ff"]]}, "control": "CC_ComboBox", "id": "combo_box.focus", "rows": {"0": [[0, 150, "#eff0f1ff"]], "1": [[0, 3, "#eff0f1ff"], [3, 1, "#c2dceaff"], [4, 1, "#70bde7ff"], [5, 1, "#4eb3e8ff"], [6, 138, "#3daee9ff"], [144, 1, "#4eb3e8ff"], [145, 1, "#70bde7ff"], [146, 1, "#c2dceaff"], [147, 3, "#eff0f1ff"]], "16": [[0, 1, "#eff0f1ff"], [1, 1, "#3daee9ff"], [2, 132, "#fcfcfcff"], [134, 1, "#c3c4c5ff"], [135, 1, "#333639ff"], [136, 1, "#c3c4c5ff"], [137, 2, "#fcfcfcff"], [139, 1, "#c3c4c5ff"], [140, 1, "#333639ff"], [141, 1, "#c3c4c5ff"], [142, 6, "#fcfcfcff"], [148, 1, "#3daee9ff"], [149, 1, "#eff0f1ff"]], "31": [[0, 3, "#eff0f1ff"], [3, 1, "#e8e9eaff"], [4, 1, "#dadbdcff"], [5, 1, "#d4d5d6ff"], [6, 138, "#d1d2d3ff"], [144, 1, "#d4d5d6ff"], [145, 1, "#dadbdcff"], [146, 1, "#e8e9eaff"], [147, 3, "#eff0f1ff"]]}, "size": [150, 32], "state": {"editable": false, "flags": 8388864, "group": "Active", "name": "focus"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#e8eaebff"], [3, 1, "#d6d7d9ff"], [4, 1, "#cacccdff"], [5, 21, "#c6c8c9ff"], [26, 1, "#c7c9caff"], [27, 1, "#cbcccdff"], [28, 1, "#d7d8d9ff"], [29, 1, "#e9eaebff"], [30, 2, "#eff0f1ff"]], "1": [[0, 1, "#eff0f1ff"], [1, 1, "#e9eaeaff"], [2, 1, "#cdcfd0ff"], [3, 1, "#f0f1f1ff"], [4, 1, "#fafafaff"], [5, 22, "#ffffffff"], [27, 1, "#f9fafaff"], [28, 1, "#f0f1f1ff"], [29, 1, "#cccfd0ff"], [30, 1, "#e9eaecff"], [31, 1, "#eff0f1ff"]], "140": [[0, 1, "#c6c8c9ff"], [1, 14, "#ffffffff"], [15, 1, "#cdcecfff"], [16, 1, "#505255ff"], [17, 1, "#cdcecfff"], [18, 12, "#ffffffff"], [30, 1, "#fefefeff"], [31, 1, "#c7c9caff"]], "40": [[0, 1, "#c6c8c9ff"], [1, 29, "#ffffffff"], [30, 1, "#fefefeff"], [31, 1, "#c7c9caff"]]}, "control": "CC_ComboBox", "id": "combo_box.editable", "rows": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#e8eaebff"], [3, 1, "#d6d7d9ff"], [4, 1, "#cacccdff"], [5, 139, "#c6c8c9ff"], [144, 1, "#c7c9caff"], [145, 1, "#cbcccdff"], [146, 1, "#d6d8d9ff"], [147, 1, "#e9eaebff"], [148, 2, "#eff0f1ff"]], "1": [[0, 1, "#eff0f1ff"], [1, 1, "#e9eaeaff"], [2, 1, "#cdcecfff"], [3, 1, "#f0f1f1ff"], [4, 1, "#fafafaff"], [5, 140, "#ffffffff"], [145, 1, "#f9fafaff"], [146, 1, "#f1f2f2ff"], [147, 1, "#cccfd0ff"], [148, 1, "#e9eaecff"], [149, 1, "#eff0f1ff"]], "16": [[0, 1, "#c6c8c9ff"], [1, 133, "#ffffffff"], [134, 1, "#cdcecfff"], [135, 1, "#505255ff"], [136, 1, "#cdcecfff"], [137, 2, "#ffffffff"], [139, 1, "#cdcecfff"], [140, 1, "#505255ff"], [141, 1, "#cdcecfff"], [142, 6, "#ffffffff"], [148, 1, "#fefefeff"], [149, 1, "#c7c9caff"]], "31": [[0, 2, "#eff0f1ff"], [2, 1, "#e9eaecff"], [3, 1, "#d7d8daff"], [4, 1, "#cbcdceff"], [5, 139, "#c7c9caff"], [144, 1, "#c8cacaff"], [145, 1, "#cbcdceff"], [146, 1, "#d7d9d9ff"], [147, 1, "#eaebecff"], [148, 2, "#eff0f1ff"]]}, "size": [150, 32], "state": {"editable": true, "flags": 0, "group": "Active", "name": "editable"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#e8eaebff"], [3, 1, "#d6d7d9ff"], [4, 1, "#cacccdff"], [5, 21, "#c6c8c9ff"], [26, 1, "#c7c9caff"], [27, 1, "#cbcccdff"], [28, 1, "#d7d8d9ff"], [29, 1, "#e9eaebff"], [30, 2, "#eff0f1ff"]], "40": [[0, 1, "#c6c8c9ff"], [1, 29, "#ffffffff"], [30, 1, "#fefefeff"], [31, 1, "#c7c9caff"]], "90": [[0, 1, "#c6c8c9ff"], [1, 8, "#ffffffff"], [9, 1, "#cecfcfff"], [10, 1, "#525557ff"], [11, 1, "#cecfcfff"], [12, 8, "#ffffffff"], [20, 1, "#cecfcfff"], [21, 1, "#525557ff"], [22, 1, "#cecfcfff"], [23, 7, "#ffffffff"], [30, 1, "#fefefeff"], [31, 1, "#c7c9caff"]]}, "control": "CC_SpinBox", "id": "spin_box.normal", "rows": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#e8eaebff"], [3, 1, "#d6d7d9ff"], [4, 1, "#cacccdff"], [5, 89, "#c6c8c9ff"], [94, 1, "#c7c9caff"], [95, 1, "#cbcccdff"], [96, 1, "#d6d8d9ff"], [97, 1, "#e9eaebff"], [98, 2, "#eff0f1ff"]], "16": [[0, 1, "#c6c8c9ff"], [1, 97, "#ffffffff"], [98, 1, "#fefefeff"], [99, 1, "#c7c9caff"]], "24": [[0, 1, "#c6c8c9ff"], [1, 86, "#ffffffff"], [87, 2, "#cfcfd0ff"], [89, 9, "#ffffffff"], [98, 1, "#fefefeff"], [99, 1, "#c7c9caff"]], "31": [[0, 2, "#eff0f1ff"], [2, 1, "#e9eaecff"], [3, 1, "#d7d8daff"], [4, 1, "#cbcdceff"], [5, 89, "#c7c9caff"], [94, 1, "#c8cacaff"], [95, 1, "#cbcdceff"], [96, 1, "#d7d9d9ff"], [97, 1, "#eaebecff"], [98, 2, "#eff0f1ff"]], "8": [[0, 1, "#c6c8c9ff"], [1, 85, "#ffffffff"], [86, 1, "#cecfcfff"], [87, 2, "#444749ff"], [89, 1, "#cecfcfff"], [90, 8, "#ffffffff"], [98, 1, "#fefefeff"], [99, 1, "#c7c9caff"]]}, "size": [100, 32], "state": {"flags": 0, "group": "Active", "name": "normal"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#d3e6f0ff"], [3, 1, "#80c7edff"], [4, 1, "#4eb5eaff"], [5, 21, "#3daee9ff"], [26, 1, "#40afe9ff"], [27, 1, "#4fb5eaff"], [28, 1, "#80c7edff"], [29, 1, "#d5e6f0ff"], [30, 2, "#eff0f1ff"]], "40": [[0, 1, "#3daee9ff"], [1, 29, "#ffffffff"], [30, 1, "#fdfeffff"], [31, 1, "#3fafe9ff"]], "90": [[0, 1, "#3daee9ff"], [1, 8, "#ffffffff"], [9, 1, "#cecfcfff"], [10, 1, "#525557ff"], [11, 1, "#cecfcfff"], [12, 8, "#ffffffff"], [20, 1, "#cecfcfff"], [21, 1, "#525557ff"], [22, 1, "#cecfcfff"], [23, 7, "#ffffffff"], [30, 1, "#fdfeffff"], [31, 1, "#3fafe9ff"]]}, "control": "CC_SpinBox", "id": "spin_box.hover", "rows": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#d3e6f0ff"], [3, 1, "#80c7edff"], [4, 1, "#4eb5eaff"], [5, 89, "#3daee9ff"], [94, 1, "#40afe9ff"], [95, 1, "#4fb5eaff"], [96, 1, "#80c7edff"], [97, 1, "#d5e6f0ff"], [98, 2, "#eff0f1ff"]], "16": [[0, 1, "#3daee9ff"], [1, 97, "#ffffffff"], [98, 1, "#fdfeffff"], [99, 1, "#3fafe9ff"]], "24": [[0, 1, "#3daee9ff"], [1, 86, "#ffffffff"], [87, 2, "#cfcfd0ff"], [89, 9, "#ffffffff"], [98, 1, "#fdfeffff"], [99, 1, "#3fafe9ff"]], "31": [[0, 2, "#eff0f1ff"], [2, 1, "#d6e7f0ff"], [3, 1, "#82c7edff"], [4, 1, "#51b6eaff"], [5, 89, "#3fafe9ff"], [94, 1, "#42b0eaff"], [95, 1, "#52b6eaff"], [96, 1, "#83c8eeff"], [97, 1, "#d8e8f0ff"], [98, 2, "#eff0f1ff"]], "8": [[0, 1, "#3daee9ff"], [1, 85, "#ffffffff"], [86, 1, "#cecfcfff"], [87, 2, "#444749ff"], [89, 1, "#cecfcfff"], [90, 8, "#ffffffff"], [98, 1, "#fdfeffff"], [99, 1, "#3fafe9ff"]]}, "size": [100, 32], "state": {"flags": 8192, "group": "Active", "name": "hover"}}, +{"background": "#eff0f1ff", "cols": {"10": [[0, 7, "#eff0f1ff"], [7, 1, "#84bcd9ff"], [8, 4, "#72c2ebff"], [12, 1, "#84bcd9ff"], [13, 7, "#eff0f1ff"]], "190": [[0, 7, "#eff0f1ff"], [7, 1, "#babdbeff"], [8, 4, "#d2d3d5ff"], [12, 1, "#babdbeff"], [13, 7, "#eff0f1ff"]], "63": [[0, 1, "#eff0f1ff"], [1, 1, "#d2d2d3ff"], [2, 1, "#fafafaff"], [3, 14, "#fcfcfcff"], [17, 1, "#fafafaff"], [18, 1, "#d2d2d3ff"], [19, 1, "#e1e2e3ff"]]}, "control": "CC_Slider", "id": "slider.normal", "rows": {"10": [[0, 1, "#91c0d6ff"], [1, 1, "#71c2ebff"], [2, 53, "#72c2ebff"], [55, 1, "#cfd1d3ff"], [56, 1, "#fafafaff"], [57, 14, "#fcfcfcff"], [71, 1, "#fafafaff"], [72, 1, "#d2d2d3ff"], [73, 1, "#c1c2c3ff"], [74, 124, "#d2d3d5ff"], [198, 1, "#cfd0d2ff"], [199, 1, "#c2c4c4ff"]]}, "size": [200, 20], "state": {"flags": 128, "group": "Active", "handle_rect": [54, 0, 20, 20], "name": "normal", "value": 30}}, +{"background": "#eff0f1ff", "cols": {"10": [[0, 7, "#eff0f1ff"], [7, 1, "#84bcd9ff"], [8, 4, "#72c2ebff"], [12, 1, "#84bcd9ff"], [13, 7, "#eff0f1ff"]], "190": [[0, 7, "#eff0f1ff"], [7, 1, "#babdbeff"], [8, 4, "#d2d3d5ff"], [12, 1, "#babdbeff"], [13, 7, "#eff0f1ff"]], "63": [[0, 1, "#eff0f1ff"], [1, 1, "#45b1e9ff"], [2, 1, "#f3f8fbff"], [3, 14, "#fcfcfcff"], [17, 1, "#f2f8fbff"], [18, 1, "#45b1e9ff"], [19, 1, "#e1e2e3ff"]]}, "control": "CC_Slider", "id": "slider.handle_hover", "rows": {"10": [[0, 1, "#91c0d6ff"], [1, 1, "#71c2ebff"], [2, 53, "#72c2ebff"], [55, 1, "#42b0e9ff"], [56, 1, "#f3f8fbff"], [57, 14, "#fcfcfcff"], [71, 1, "#f2f8fbff"], [72, 1, "#45b1e9ff"], [73, 1, "#c1c2c3ff"], [74, 124, "#d2d3d5ff"], [198, 1, "#cfd0d2ff"], [199, 1, "#c2c4c4ff"]]}, "size": [200, 20], "state": {"flags": 8320, "group": "Active", "handle_rect": [54, 0, 20, 20], "name": "handle_hover", "value": 30}}, +{"background": "#eff0f1ff", "cols": {"10": [[0, 7, "#eff0f1ff"], [7, 1, "#84bcd9ff"], [8, 4, "#72c2ebff"], [12, 1, "#84bcd9ff"], [13, 7, "#eff0f1ff"]], "190": [[0, 7, "#eff0f1ff"], [7, 1, "#babdbeff"], [8, 4, "#d2d3d5ff"], [12, 1, "#babdbeff"], [13, 7, "#eff0f1ff"]], "63": [[0, 1, "#eff0f1ff"], [1, 1, "#45b1e9ff"], [2, 1, "#f3f8fbff"], [3, 14, "#fcfcfcff"], [17, 1, "#f2f8fbff"], [18, 1, "#45b1e9ff"], [19, 1, "#e1e2e3ff"]]}, "control": "CC_Slider", "id": "slider.focus", "rows": {"10": [[0, 1, "#91c0d6ff"], [1, 1, "#71c2ebff"], [2, 53, "#72c2ebff"], [55, 1, "#42b0e9ff"], [56, 1, "#f3f8fbff"], [57, 14, "#fcfcfcff"], [71, 1, "#f2f8fbff"], [72, 1, "#45b1e9ff"], [73, 1, "#c1c2c3ff"], [74, 124, "#d2d3d5ff"], [198, 1, "#cfd0d2ff"], [199, 1, "#c2c4c4ff"]]}, "size": [200, 20], "state": {"flags": 8388992, "group": "Active", "handle_rect": [54, 0, 20, 20], "name": "focus", "value": 30}}, +{"background": "#e3e5e7ff", "cols": {"10": [[0, 7, "#e3e5e7ff"], [7, 1, "#d2d3d6ff"], [8, 4, "#d9dcddff"], [12, 1, "#d2d3d6ff"], [13, 7, "#e3e5e7ff"]], "190": [[0, 7, "#e3e5e7ff"], [7, 1, "#d2d3d6ff"], [8, 4, "#d9dcddff"], [12, 1, "#d2d3d6ff"], [13, 7, "#e3e5e7ff"]], "63": [[0, 1, "#e3e5e7ff"], [1, 1, "#e1e1e1ff"], [2, 16, "#f0f0f0ff"], [18, 1, "#e2e2e2ff"], [19, 1, "#d6d8d9ff"]]}, "control": "CC_Slider", "id": "slider.disabled", "rows": {"10": [[0, 1, "#d4d6d8ff"], [1, 1, "#d8dbdcff"], [2, 53, "#d9dcddff"], [55, 1, "#e1e1e1ff"], [56, 16, "#f0f0f0ff"], [72, 1, "#e1e2e2ff"], [73, 1, "#c6c9caff"], [74, 124, "#d9dcddff"], [198, 1, "#d8dbdcff"], [199, 1, "#d4d6d8ff"]]}, "size": [200, 20], "state": {"flags": 128, "group": "Disabled", "handle_rect": [54, 0, 20, 20], "name": "disabled", "value": 30}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 200, "#c6c8c9ff"]], "10": [[0, 3, "#eff0f1ff"], [3, 1, "#bfc2c2ff"], [4, 1, "#c7c9c9ff"], [5, 28, "#cbcdcdff"], [33, 1, "#c7c9c9ff"], [34, 1, "#bfc2c2ff"], [35, 165, "#eff0f1ff"]]}, "control": "CC_ScrollBar", "id": "scroll_bar.normal", "rows": {"150": [[0, 1, "#c6c8c9ff"], [1, 20, "#eff0f1ff"]], "18": [[0, 1, "#c6c8c9ff"], [1, 6, "#eff0f1ff"], [7, 1, "#b8babaff"], [8, 6, "#cbcdcdff"], [14, 1, "#b8babaff"], [15, 6, "#eff0f1ff"]]}, "size": [21, 200], "state": {"active_sub_control": "none", "flags": 0, "group": "Active", "name": "normal", "slider_rect": [0, 3, 21, 32]}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 200, "#c6c8c9ff"]], "10": [[0, 3, "#eff0f1ff"], [3, 1, "#bfc2c2ff"], [4, 1, "#c7c9c9ff"], [5, 28, "#cbcdcdff"], [33, 1, "#c7c9c9ff"], [34, 1, "#bfc2c2ff"], [35, 165, "#eff0f1ff"]]}, "control": "CC_ScrollBar", "id": "scroll_bar.hover", "rows": {"150": [[0, 1, "#c6c8c9ff"], [1, 20, "#eff0f1ff"]], "18": [[0, 1, "#c6c8c9ff"], [1, 6, "#eff0f1ff"], [7, 1, "#b8babaff"], [8, 6, "#cbcdcdff"], [14, 1, "#b8babaff"], [15, 6, "#eff0f1ff"]]}, "size": [21, 200], "state": {"active_sub_control": "none", "flags": 8192, "group": "Active", "name": "hover", "slider_rect": [0, 3, 21, 32]}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 200, "#c6c8c9ff"]], "10": [[0, 3, "#eff0f1ff"], [3, 1, "#b3daefff"], [4, 1, "#93ceecff"], [5, 28, "#96cfedff"], [33, 1, "#93ceecff"], [34, 1, "#b3daefff"], [35, 165, "#eff0f1ff"]]}, "control": "CC_ScrollBar", "id": "scroll_bar.slider_hover", "rows": {"150": [[0, 1, "#c6c8c9ff"], [1, 20, "#eff0f1ff"]], "18": [[0, 1, "#c6c8c9ff"], [1, 6, "#eff0f1ff"], [7, 1, "#a7d6eeff"], [8, 6, "#96cfedff"], [14, 1, "#a7d6eeff"], [15, 6, "#eff0f1ff"]]}, "size": [21, 200], "state": {"active_sub_control": "SC_ScrollBarSlider", "flags": 8192, "group": "Active", "name": "slider_hover", "slider_rect": [0, 3, 21, 32]}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 200, "#c6c8c9ff"]], "10": [[0, 3, "#eff0f1ff"], [3, 1, "#b3daefff"], [4, 1, "#93ceecff"], [5, 28, "#96cfedff"], [33, 1, "#93ceecff"], [34, 1, "#b3daefff"], [35, 165, "#eff0f1ff"]]}, "control": "CC_ScrollBar", "id": "scroll_bar.slider_pressed", "rows": {"150": [[0, 1, "#c6c8c9ff"], [1, 20, "#eff0f1ff"]], "18": [[0, 1, "#c6c8c9ff"], [1, 6, "#eff0f1ff"], [7, 1, "#a7d6eeff"], [8, 6, "#96cfedff"], [14, 1, "#a7d6eeff"], [15, 6, "#eff0f1ff"]]}, "size": [21, 200], "state": {"active_sub_control": "SC_ScrollBarSlider", "flags": 8196, "group": "Active", "name": "slider_pressed", "slider_rect": [0, 3, 21, 32]}}, +{"background": "#eff0f1ff", "cols": {"150": [[0, 6, "#eff0f1ff"], [6, 1, "#babdbeff"], [7, 4, "#d2d3d5ff"], [11, 1, "#babdbeff"], [12, 6, "#eff0f1ff"]], "50": [[0, 6, "#eff0f1ff"], [6, 1, "#84bcd9ff"], [7, 4, "#72c2ebff"], [11, 1, "#84bcd9ff"], [12, 6, "#eff0f1ff"]]}, "control": "CE_ProgressBar", "id": "progress_bar.half", "rows": {"9": [[0, 1, "#91c0d6ff"], [1, 1, "#71c2ebff"], [2, 96, "#72c2ebff"], [98, 1, "#71c2ebff"], [99, 1, "#99c8dfff"], [100, 98, "#d2d3d5ff"], [198, 1, "#cfd0d2ff"], [199, 1, "#c2c4c4ff"]]}, "size": [200, 18], "state": {"flags": 128, "group": "Active", "name": "half"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 100, "#c6c8c9ff"]], "1": [[0, 1, "#c6c8c9ff"], [1, 98, "#f4f5f5ff"], [99, 1, "#c6c8c9ff"]], "100": [[0, 1, "#c6c8c9ff"], [1, 98, "#f4f5f5ff"], [99, 1, "#c6c8c9ff"]]}, "control": "PE_PanelMenu+PE_FrameMenu", "id": "menu.panel", "rows": {"0": [[0, 200, "#c6c8c9ff"]], "1": [[0, 1, "#c6c8c9ff"], [1, 198, "#f4f5f5ff"], [199, 1, "#c6c8c9ff"]], "50": [[0, 1, "#c6c8c9ff"], [1, 198, "#f4f5f5ff"], [199, 1, "#c6c8c9ff"]]}, "size": [200, 100], "state": {"flags": 0, "group": "Active", "name": "normal"}}, +{"background": "#eff0f1ff", "cols": {"100": [[0, 29, "#eff0f1ff"]], "4": [[0, 29, "#eff0f1ff"]], "5": [[0, 29, "#eff0f1ff"]], "6": [[0, 29, "#eff0f1ff"]]}, "control": "CE_MenuItem", "id": "menu_item.normal", "rows": {"0": [[0, 200, "#eff0f1ff"]], "1": [[0, 200, "#eff0f1ff"]], "14": [[0, 200, "#eff0f1ff"]], "2": [[0, 200, "#eff0f1ff"]], "3": [[0, 200, "#eff0f1ff"]], "4": [[0, 200, "#eff0f1ff"]], "5": [[0, 200, "#eff0f1ff"]]}, "size": [200, 29], "state": {"flags": 0, "group": "Active", "name": "normal", "type": 0}}, +{"background": "#eff0f1ff", "cols": {"100": [[0, 1, "#399accff"], [1, 26, "#b9dceeff"], [27, 1, "#b8dbedff"], [28, 1, "#3a9bcdff"]], "4": [[0, 1, "#48a2d0ff"], [1, 1, "#add5ebff"], [2, 25, "#b9dceeff"], [27, 1, "#abd5eaff"], [28, 1, "#4ba2d0ff"]], "5": [[0, 1, "#399accff"], [1, 26, "#b9dceeff"], [27, 1, "#b8dbedff"], [28, 1, "#3a9bcdff"]], "6": [[0, 1, "#399accff"], [1, 26, "#b9dceeff"], [27, 1, "#b8dbedff"], [28, 1, "#3a9bcdff"]]}, "control": "CE_MenuItem", "id": "menu_item.selected", "rows": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#d3e3ebff"], [3, 1, "#78b8d9ff"], [4, 1, "#48a2d0ff"], [5, 189, "#399accff"], [194, 1, "#3b9ccdff"], [195, 1, "#48a2d0ff"], [196, 1, "#7ab9daff"], [197, 1, "#d4e3ecff"], [198, 2, "#eff0f1ff"]], "1": [[0, 1, "#eff0f1ff"], [1, 1, "#cedfebff"], [2, 1, "#4da4d1ff"], [3, 1, "#99cbe6ff"], [4, 1, "#add5ebff"], [5, 190, "#b9dceeff"], [195, 1, "#add5ebff"], [196, 1, "#98cce6ff"], [197, 1, "#4da4d1ff"], [198, 1, "#d0e1eaff"], [199, 1, "#eff0f1ff"]], "14": [[0, 1, "#399accff"], [1, 197, "#b9dceeff"], [198, 1, "#b8dbedff"], [199, 1, "#3a9bcdff"]], "2": [[0, 1, "#d3e3ebff"], [1, 1, "#4da4d1ff"], [2, 196, "#b9dceeff"], [198, 1, "#4ba3d0ff"], [199, 1, "#d6e4ecff"]], "3": [[0, 1, "#78b8daff"], [1, 1, "#99cce6ff"], [2, 196, "#b9dceeff"], [198, 1, "#97cbe5ff"], [199, 1, "#7abadaff"]], "4": [[0, 1, "#48a2d0ff"], [1, 1, "#add5ebff"], [2, 196, "#b9dceeff"], [198, 1, "#abd5eaff"], [199, 1, "#4ba2d0ff"]], "5": [[0, 1, "#399accff"], [1, 197, "#b9dceeff"], [198, 1, "#b8dbedff"], [199, 1, "#3a9bcdff"]]}, "size": [200, 29], "state": {"flags": 32768, "group": "Active", "name": "selected", "type": 0}}, +{"background": "#eff0f1ff", "cols": {"100": [[0, 2, "#eff0f1ff"], [2, 1, "#c6c8c9ff"], [3, 2, "#eff0f1ff"]], "4": [[0, 2, "#eff0f1ff"], [2, 1, "#c6c8c9ff"], [3, 2, "#eff0f1ff"]], "5": [[0, 2, "#eff0f1ff"], [2, 1, "#c6c8c9ff"], [3, 2, "#eff0f1ff"]], "6": [[0, 2, "#eff0f1ff"], [2, 1, "#c6c8c9ff"], [3, 2, "#eff0f1ff"]]}, "control": "CE_MenuItem", "id": "menu_item.separator", "rows": {"0": [[0, 200, "#eff0f1ff"]], "1": [[0, 200, "#eff0f1ff"]], "2": [[0, 4, "#eff0f1ff"], [4, 193, "#c6c8c9ff"], [197, 3, "#eff0f1ff"]], "3": [[0, 200, "#eff0f1ff"]], "4": [[0, 200, "#eff0f1ff"]], "5": [[0, 200, "#00303900"]]}, "size": [200, 5], "state": {"flags": 0, "group": "Active", "name": "separator", "type": 2}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#bdd9e9ff"], [3, 1, "#a5c9dbff"], [4, 1, "#bbc9d1ff"], [5, 25, "#c6c8c9ff"]], "1": [[0, 1, "#eff0f1ff"], [1, 1, "#91c8e4ff"], [2, 1, "#3fafe9ff"], [3, 1, "#e1e2e4ff"], [4, 1, "#ebecedff"], [5, 25, "#eff0f1ff"]], "40": [[0, 3, "#3daee9ff"], [3, 27, "#eff0f1ff"]], "79": [[0, 2, "#eff0f1ff"], [2, 1, "#bdd9e9ff"], [3, 1, "#a5c8dcff"], [4, 1, "#bbc9d1ff"], [5, 25, "#c6c8c9ff"]]}, "control": "CE_TabBarTabShape", "id": "tab.selected", "rows": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#bdd9e9ff"], [3, 1, "#6ab9e4ff"], [4, 1, "#4bb1e6ff"], [5, 70, "#3daee9ff"], [75, 1, "#4bb1e6ff"], [76, 1, "#6ab9e4ff"], [77, 1, "#bdd9e9ff"], [78, 2, "#eff0f1ff"]], "1": [[0, 1, "#eff0f1ff"], [1, 1, "#91c8e4ff"], [2, 1, "#3eaee9ff"], [3, 74, "#3daee9ff"], [77, 1, "#3fafe9ff"], [78, 1, "#91c8e4ff"], [79, 1, "#eff0f1ff"]], "15": [[0, 1, "#c6c8c9ff"], [1, 78, "#eff0f1ff"], [79, 1, "#c6c8c9ff"]], "2": [[0, 1, "#bdd9e9ff"], [1, 1, "#3fafe9ff"], [2, 76, "#3daee9ff"], [78, 1, "#3fafe9ff"], [79, 1, "#bdd9e9ff"]], "27": [[0, 1, "#c6c8c9ff"], [1, 78, "#eff0f1ff"], [79, 1, "#c6c8c9ff"]], "28": [[0, 1, "#c6c8c9ff"], [1, 78, "#eff0f1ff"], [79, 1, "#c6c8c9ff"]], "29": [[0, 1, "#c6c8c9ff"], [1, 78, "#eff0f1ff"], [79, 1, "#c6c8c9ff"]], "3": [[0, 1, "#a5c9dbff"], [1, 1, "#e1e2e4ff"], [2, 76, "#eff0f1ff"], [78, 1, "#e1e2e4ff"], [79, 1, "#a5c8dcff"]]}, "size": [80, 30], "state": {"document_mode": false, "flags": 32768, "group": "Active", "name": "selected"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 30, "#c7c8c9ff"]], "1": [[0, 30, "#c7c8c9ff"]], "40": [[0, 30, "#c7c8c9ff"]], "79": [[0, 30, "#c7c8c9ff"]]}, "control": "CE_TabBarTabShape", "id": "tab.unselected", "rows": {"0": [[0, 80, "#c7c8c9ff"]], "1": [[0, 80, "#c7c8c9ff"]], "15": [[0, 80, "#c7c8c9ff"]], "2": [[0, 80, "#c7c8c9ff"]], "27": [[0, 80, "#c7c8c9ff"]], "28": [[0, 80, "#c7c8c9ff"]], "29": [[0, 80, "#c7c8c9ff"]], "3": [[0, 80, "#c7c8c9ff"]]}, "size": [80, 30], "state": {"document_mode": false, "flags": 0, "group": "Active", "name": "unselected"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 30, "#cbe3f0ff"]], "1": [[0, 30, "#cbe3f0ff"]], "40": [[0, 30, "#cbe3f0ff"]], "79": [[0, 30, "#cbe3f0ff"]]}, "control": "CE_TabBarTabShape", "id": "tab.hover", "rows": {"0": [[0, 80, "#cbe3f0ff"]], "1": [[0, 80, "#cbe3f0ff"]], "15": [[0, 80, "#cbe3f0ff"]], "2": [[0, 80, "#cbe3f0ff"]], "27": [[0, 80, "#cbe3f0ff"]], "28": [[0, 80, "#cbe3f0ff"]], "29": [[0, 80, "#cbe3f0ff"]], "3": [[0, 80, "#cbe3f0ff"]]}, "size": [80, 30], "state": {"document_mode": false, "flags": 8192, "group": "Active", "name": "hover"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#bdd9e9ff"], [3, 1, "#a5c9dbff"], [4, 1, "#bbc9d1ff"], [5, 25, "#c6c8c9ff"]], "1": [[0, 1, "#eff0f1ff"], [1, 1, "#91c8e4ff"], [2, 1, "#3fafe9ff"], [3, 1, "#e1e2e4ff"], [4, 1, "#ebecedff"], [5, 25, "#eff0f1ff"]], "40": [[0, 3, "#3daee9ff"], [3, 27, "#eff0f1ff"]], "79": [[0, 2, "#eff0f1ff"], [2, 1, "#bdd9e9ff"], [3, 1, "#a5c8dcff"], [4, 1, "#bbc9d1ff"], [5, 25, "#c6c8c9ff"]]}, "control": "CE_TabBarTabShape", "id": "tab.selected.document_mode", "rows": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#bdd9e9ff"], [3, 1, "#6ab9e4ff"], [4, 1, "#4bb1e6ff"], [5, 70, "#3daee9ff"], [75, 1, "#4bb1e6ff"], [76, 1, "#6ab9e4ff"], [77, 1, "#bdd9e9ff"], [78, 2, "#eff0f1ff"]], "1": [[0, 1, "#eff0f1ff"], [1, 1, "#91c8e4ff"], [2, 1, "#3eaee9ff"], [3, 74, "#3daee9ff"], [77, 1, "#3fafe9ff"], [78, 1, "#91c8e4ff"], [79, 1, "#eff0f1ff"]], "15": [[0, 1, "#c6c8c9ff"], [1, 78, "#eff0f1ff"], [79, 1, "#c6c8c9ff"]], "2": [[0, 1, "#bdd9e9ff"], [1, 1, "#3fafe9ff"], [2, 76, "#3daee9ff"], [78, 1, "#3fafe9ff"], [79, 1, "#bdd9e9ff"]], "27": [[0, 1, "#c6c8c9ff"], [1, 78, "#eff0f1ff"], [79, 1, "#c6c8c9ff"]], "28": [[0, 1, "#c6c8c9ff"], [1, 78, "#eff0f1ff"], [79, 1, "#c6c8c9ff"]], "29": [[0, 1, "#c6c8c9ff"], [1, 78, "#eff0f1ff"], [79, 1, "#c6c8c9ff"]], "3": [[0, 1, "#a5c9dbff"], [1, 1, "#e1e2e4ff"], [2, 76, "#eff0f1ff"], [78, 1, "#e1e2e4ff"], [79, 1, "#a5c8dcff"]]}, "size": [80, 30], "state": {"document_mode": true, "flags": 32768, "group": "Active", "name": "selected.document_mode"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 30, "#c7c8c9ff"]], "1": [[0, 30, "#c7c8c9ff"]], "40": [[0, 30, "#c7c8c9ff"]], "79": [[0, 30, "#c7c8c9ff"]]}, "control": "CE_TabBarTabShape", "id": "tab.unselected.document_mode", "rows": {"0": [[0, 80, "#c7c8c9ff"]], "1": [[0, 80, "#c7c8c9ff"]], "15": [[0, 80, "#c7c8c9ff"]], "2": [[0, 80, "#c7c8c9ff"]], "27": [[0, 80, "#c7c8c9ff"]], "28": [[0, 80, "#c7c8c9ff"]], "29": [[0, 80, "#c7c8c9ff"]], "3": [[0, 80, "#c7c8c9ff"]]}, "size": [80, 30], "state": {"document_mode": true, "flags": 0, "group": "Active", "name": "unselected.document_mode"}}, +{"background": "#ffffffff", "cols": {"0": [[0, 29, "#fcfcfcff"], [29, 1, "#d1d2d2ff"]], "50": [[0, 29, "#fcfcfcff"], [29, 1, "#d1d2d2ff"]], "98": [[0, 29, "#fcfcfcff"], [29, 1, "#d1d2d2ff"]], "99": [[0, 30, "#d1d2d2ff"]]}, "control": "CE_HeaderSection", "id": "header.normal", "rows": {"0": [[0, 99, "#fcfcfcff"], [99, 1, "#d1d2d2ff"]], "15": [[0, 99, "#fcfcfcff"], [99, 1, "#d1d2d2ff"]], "28": [[0, 99, "#fcfcfcff"], [99, 1, "#d1d2d2ff"]], "29": [[0, 100, "#d1d2d2ff"]]}, "size": [100, 30], "state": {"flags": 2, "group": "Active", "name": "normal"}}, +{"background": "#ffffffff", "cols": {"0": [[0, 29, "#d6ecf8ff"], [29, 1, "#b2c5ceff"]], "50": [[0, 29, "#d6ecf8ff"], [29, 1, "#b2c5ceff"]], "98": [[0, 29, "#d6ecf8ff"], [29, 1, "#b2c5ceff"]], "99": [[0, 30, "#b2c5ceff"]]}, "control": "CE_HeaderSection", "id": "header.hover", "rows": {"0": [[0, 99, "#d6ecf8ff"], [99, 1, "#b2c5ceff"]], "15": [[0, 99, "#d6ecf8ff"], [99, 1, "#b2c5ceff"]], "28": [[0, 99, "#d6ecf8ff"], [99, 1, "#b2c5ceff"]], "29": [[0, 100, "#b2c5ceff"]]}, "size": [100, 30], "state": {"flags": 8194, "group": "Active", "name": "hover"}}, +{"background": "#ffffffff", "cols": {"0": [[0, 29, "#d6ecf8ff"], [29, 1, "#b2c5ceff"]], "50": [[0, 29, "#d6ecf8ff"], [29, 1, "#b2c5ceff"]], "98": [[0, 29, "#d6ecf8ff"], [29, 1, "#b2c5ceff"]], "99": [[0, 30, "#b2c5ceff"]]}, "control": "CE_HeaderSection", "id": "header.sunken", "rows": {"0": [[0, 99, "#d6ecf8ff"], [99, 1, "#b2c5ceff"]], "15": [[0, 99, "#d6ecf8ff"], [99, 1, "#b2c5ceff"]], "28": [[0, 99, "#d6ecf8ff"], [99, 1, "#b2c5ceff"]], "29": [[0, 100, "#b2c5ceff"]]}, "size": [100, 30], "state": {"flags": 4, "group": "Active", "name": "sunken"}}, +{"background": "#ffffffff", "cols": {"0": [[0, 24, "#ffffffff"]], "1": [[0, 24, "#ffffffff"]], "100": [[0, 24, "#ffffffff"]], "2": [[0, 24, "#ffffffff"]], "3": [[0, 24, "#ffffffff"]]}, "control": "PE_PanelItemViewItem", "id": "item_view_row.normal", "rows": {"0": [[0, 200, "#ffffffff"]], "1": [[0, 200, "#ffffffff"]], "12": [[0, 200, "#ffffffff"]], "2": [[0, 200, "#ffffffff"]], "22": [[0, 200, "#ffffffff"]], "23": [[0, 200, "#ffffffff"]]}, "size": [200, 24], "state": {"flags": 0, "group": "Active", "name": "normal"}}, +{"background": "#ffffffff", "cols": {"0": [[0, 24, "#ffffffff"]], "1": [[0, 24, "#ffffffff"]], "100": [[0, 1, "#ffffffff"], [1, 1, "#5ebbecff"], [2, 19, "#c4e6f8ff"], [21, 1, "#c3e6f8ff"], [22, 1, "#5fbbecff"], [23, 1, "#ffffffff"]], "2": [[0, 3, "#ffffffff"], [3, 1, "#e7f5fcff"], [4, 1, "#96d2f3ff"], [5, 1, "#6bc1edff"], [6, 11, "#5ebbecff"], [17, 1, "#5fbcecff"], [18, 1, "#6cc1eeff"], [19, 1, "#95d3f2ff"], [20, 1, "#e8f5fcff"], [21, 3, "#ffffffff"]], "3": [[0, 2, "#ffffffff"], [2, 1, "#e0f2faff"], [3, 1, "#6cc2edff"], [4, 1, "#a9dbf5ff"], [5, 1, "#bae2f8ff"], [6, 12, "#c4e6f8ff"], [18, 1, "#bae2f7ff"], [19, 1, "#a8dbf4ff"], [20, 1, "#6bc1eeff"], [21, 1, "#e3f2fbff"], [22, 2, "#ffffffff"]]}, "control": "PE_PanelItemViewItem", "id": "item_view_row.hover", "rows": {"0": [[0, 200, "#ffffffff"]], "1": [[0, 4, "#ffffffff"], [4, 1, "#e7f5fcff"], [5, 1, "#96d2f3ff"], [6, 1, "#6bc1edff"], [7, 185, "#5ebbecff"], [192, 1, "#60bdecff"], [193, 1, "#6cc1eeff"], [194, 1, "#95d2f2ff"], [195, 1, "#e8f5fcff"], [196, 4, "#ffffffff"]], "12": [[0, 2, "#ffffffff"], [2, 1, "#5ebbecff"], [3, 193, "#c4e6f8ff"], [196, 1, "#c3e6f8ff"], [197, 1, "#5fbbecff"], [198, 2, "#ffffffff"]], "2": [[0, 3, "#ffffffff"], [3, 1, "#e0f2faff"], [4, 1, "#6cc1eeff"], [5, 1, "#aadcf5ff"], [6, 1, "#bae2f8ff"], [7, 186, "#c4e6f8ff"], [193, 1, "#bae2f7ff"], [194, 1, "#a8daf4ff"], [195, 1, "#6bc2edff"], [196, 1, "#e3f2fbff"], [197, 3, "#ffffffff"]], "22": [[0, 4, "#ffffffff"], [4, 1, "#eaf6fdff"], [5, 1, "#96d4f3ff"], [6, 1, "#6ec2eeff"], [7, 185, "#5fbbecff"], [192, 1, "#62bdedff"], [193, 1, "#6ec2eeff"], [194, 1, "#97d3f2ff"], [195, 1, "#ebf7fdff"], [196, 4, "#ffffffff"]], "23": [[0, 200, "#ffffffff"]]}, "size": [200, 24], "state": {"flags": 8192, "group": "Active", "name": "hover"}}, +{"background": "#ffffffff", "cols": {"0": [[0, 24, "#ffffffff"]], "1": [[0, 24, "#ffffffff"]], "100": [[0, 1, "#ffffffff"], [1, 21, "#3daee9ff"], [22, 1, "#3eafe9ff"], [23, 1, "#ffffffff"]], "2": [[0, 3, "#ffffffff"], [3, 1, "#e1f3fcff"], [4, 1, "#78c6f0ff"], [5, 1, "#48b3eaff"], [6, 11, "#3daee9ff"], [17, 1, "#3eaee9ff"], [18, 1, "#48b3eaff"], [19, 1, "#78c6f0ff"], [20, 1, "#e3f3fcff"], [21, 3, "#ffffffff"]], "3": [[0, 2, "#ffffffff"], [2, 1, "#d5edfaff"], [3, 1, "#47b2eaff"], [4, 16, "#3daee9ff"], [20, 1, "#46b2eaff"], [21, 1, "#d8eefaff"], [22, 2, "#ffffffff"]]}, "control": "PE_PanelItemViewItem", "id": "item_view_row.selected", "rows": {"0": [[0, 200, "#ffffffff"]], "1": [[0, 4, "#ffffffff"], [4, 1, "#e1f3fcff"], [5, 1, "#78c6f0ff"], [6, 1, "#48b3eaff"], [7, 185, "#3daee9ff"], [192, 1, "#3eaee9ff"], [193, 1, "#48b3eaff"], [194, 1, "#78c6f0ff"], [195, 1, "#e3f3fcff"], [196, 4, "#ffffffff"]], "12": [[0, 2, "#ffffffff"], [2, 195, "#3daee9ff"], [197, 1, "#3eafe9ff"], [198, 2, "#ffffffff"]], "2": [[0, 3, "#ffffffff"], [3, 1, "#d5edfaff"], [4, 1, "#47b1eaff"], [5, 190, "#3daee9ff"], [195, 1, "#46b2eaff"], [196, 1, "#d8eefaff"], [197, 3, "#ffffffff"]], "22": [[0, 4, "#ffffffff"], [4, 1, "#e4f4fcff"], [5, 1, "#7ac7f0ff"], [6, 1, "#49b3eaff"], [7, 185, "#3eafe9ff"], [192, 1, "#3fafeaff"], [193, 1, "#4ab3eaff"], [194, 1, "#7bc7f1ff"], [195, 1, "#e6f5fcff"], [196, 4, "#ffffffff"]], "23": [[0, 200, "#ffffffff"]]}, "size": [200, 24], "state": {"flags": 32768, "group": "Active", "name": "selected"}}, +{"background": "#ffffffff", "cols": {"0": [[0, 24, "#ffffffff"]], "1": [[0, 24, "#ffffffff"]], "100": [[0, 1, "#ffffffff"], [1, 21, "#44bfffff"], [22, 1, "#45c0ffff"], [23, 1, "#ffffffff"]], "2": [[0, 3, "#ffffffff"], [3, 1, "#e2f5ffff"], [4, 1, "#7cd1ffff"], [5, 1, "#4fc3ffff"], [6, 11, "#44bfffff"], [17, 1, "#46bfffff"], [18, 1, "#4fc2ffff"], [19, 1, "#7dd2ffff"], [20, 1, "#e4f6ffff"], [21, 3, "#ffffffff"]], "3": [[0, 2, "#ffffffff"], [2, 1, "#d7f0ffff"], [3, 1, "#4dc3ffff"], [4, 16, "#44bfffff"], [20, 1, "#4dc2ffff"], [21, 1, "#d9f2ffff"], [22, 2, "#ffffffff"]]}, "control": "PE_PanelItemViewItem", "id": "item_view_row.selected_hover", "rows": {"0": [[0, 200, "#ffffffff"]], "1": [[0, 4, "#ffffffff"], [4, 1, "#e2f5ffff"], [5, 1, "#7dd1ffff"], [6, 1, "#4fc3ffff"], [7, 185, "#44bfffff"], [192, 1, "#46bfffff"], [193, 1, "#4fc2ffff"], [194, 1, "#7dd2ffff"], [195, 1, "#e4f6ffff"], [196, 4, "#ffffffff"]], "12": [[0, 2, "#ffffffff"], [2, 195, "#44bfffff"], [197, 1, "#45c0ffff"], [198, 2, "#ffffffff"]], "2": [[0, 3, "#ffffffff"], [3, 1, "#d7f0ffff"], [4, 1, "#4dc2ffff"], [5, 190, "#44bfffff"], [195, 1, "#4cc2ffff"], [196, 1, "#d9f2ffff"], [197, 3, "#ffffffff"]], "22": [[0, 4, "#ffffffff"], [4, 1, "#e5f6ffff"], [5, 1, "#7ed3ffff"], [6, 1, "#51c3ffff"], [7, 185, "#45c0ffff"], [192, 1, "#46c0ffff"], [193, 1, "#50c3ffff"], [194, 1, "#7fd3ffff"], [195, 1, "#e7f7ffff"], [196, 4, "#ffffffff"]], "23": [[0, 200, "#ffffffff"]]}, "size": [200, 24], "state": {"flags": 40960, "group": "Active", "name": "selected_hover"}}, +{"background": "#ffffffff", "cols": {"0": [[0, 24, "#ffffffff"]], "1": [[0, 24, "#ffffffff"]], "100": [[0, 1, "#ffffffff"], [1, 21, "#c2e0f5ff"], [22, 1, "#c3e0f5ff"], [23, 1, "#ffffffff"]], "2": [[0, 3, "#ffffffff"], [3, 1, "#f6fafdff"], [4, 1, "#d4e9f8ff"], [5, 1, "#c6e2f6ff"], [6, 12, "#c2e0f5ff"], [18, 1, "#c6e2f6ff"], [19, 1, "#d5eaf8ff"], [20, 1, "#f6fbfeff"], [21, 3, "#ffffffff"]], "3": [[0, 2, "#ffffffff"], [2, 1, "#f2f7fcff"], [3, 1, "#c5e2f6ff"], [4, 16, "#c2e0f5ff"], [20, 1, "#c5e1f5ff"], [21, 1, "#f2f8fcff"], [22, 2, "#ffffffff"]]}, "control": "PE_PanelItemViewItem", "id": "item_view_row.selected_inactive_window", "rows": {"0": [[0, 200, "#ffffffff"]], "1": [[0, 4, "#ffffffff"], [4, 1, "#f6fafdff"], [5, 1, "#d4e9f8ff"], [6, 1, "#c6e2f6ff"], [7, 185, "#c2e0f5ff"], [192, 1, "#c3e0f5ff"], [193, 1, "#c6e2f6ff"], [194, 1, "#d6eaf8ff"], [195, 1, "#f6fbfeff"], [196, 4, "#ffffffff"]], "12": [[0, 2, "#ffffffff"], [2, 195, "#c2e0f5ff"], [197, 1, "#c3e0f5ff"], [198, 2, "#ffffffff"]], "2": [[0, 3, "#ffffffff"], [3, 1, "#f2f7fcff"], [4, 1, "#c5e2f6ff"], [5, 190, "#c2e0f5ff"], [195, 1, "#c5e1f5ff"], [196, 1, "#f2f8fcff"], [197, 3, "#ffffffff"]], "22": [[0, 4, "#ffffffff"], [4, 1, "#f7fbfeff"], [5, 1, "#d5eaf8ff"], [6, 1, "#c6e2f6ff"], [7, 185, "#c3e0f5ff"], [192, 1, "#c3e1f5ff"], [193, 1, "#c6e3f6ff"], [194, 1, "#d5eaf8ff"], [195, 1, "#f7fbfeff"], [196, 4, "#ffffffff"]], "23": [[0, 200, "#ffffffff"]]}, "size": [200, 24], "state": {"flags": 32768, "group": "Inactive", "name": "selected_inactive_window"}}, +{"background": "#ffffffff", "cols": {"0": [[0, 24, "#ffffffff"]], "1": [[0, 24, "#ffffffff"]], "100": [[0, 24, "#ffffffff"]], "2": [[0, 24, "#ffffffff"]], "3": [[0, 24, "#ffffffff"]]}, "control": "PE_PanelItemViewItem", "id": "item_view_row.focus", "rows": {"0": [[0, 200, "#ffffffff"]], "1": [[0, 200, "#ffffffff"]], "12": [[0, 200, "#ffffffff"]], "2": [[0, 200, "#ffffffff"]], "22": [[0, 200, "#ffffffff"]], "23": [[0, 200, "#ffffffff"]]}, "size": [200, 24], "state": {"flags": 8388864, "group": "Active", "name": "focus"}}, +{"background": "#f7f7f7ff", "cols": {"0": [[0, 30, "#cdcdceff"]], "1": [[0, 1, "#cdcdceff"], [1, 28, "#f7f7f7ff"], [29, 1, "#cdcdceff"]], "50": [[0, 1, "#cdcdceff"], [1, 28, "#f7f7f7ff"], [29, 1, "#cdcdceff"]]}, "control": "PE_PanelTipLabel", "id": "tooltip.panel", "rows": {"0": [[0, 100, "#cdcdceff"]], "1": [[0, 1, "#cdcdceff"], [1, 98, "#f7f7f7ff"], [99, 1, "#cdcdceff"]], "15": [[0, 1, "#cdcdceff"], [1, 98, "#f7f7f7ff"], [99, 1, "#cdcdceff"]]}, "size": [100, 30], "state": {"flags": 0, "group": "Active", "name": "normal"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#e8eaebff"], [3, 1, "#d6d7d9ff"], [4, 1, "#cacccdff"], [5, 39, "#c6c8c9ff"], [44, 1, "#c7c9caff"], [45, 1, "#cbcccdff"], [46, 1, "#d7d8d9ff"], [47, 1, "#e9eaebff"], [48, 2, "#eff0f1ff"]], "1": [[0, 1, "#eff0f1ff"], [1, 1, "#e9eaeaff"], [2, 1, "#cdcfd0ff"], [3, 1, "#f0f1f1ff"], [4, 1, "#fafafaff"], [5, 40, "#ffffffff"], [45, 1, "#f9fafaff"], [46, 1, "#f0f1f1ff"], [47, 1, "#cccfd0ff"], [48, 1, "#e9eaecff"], [49, 1, "#eff0f1ff"]], "50": [[0, 1, "#c6c8c9ff"], [1, 47, "#ffffffff"], [48, 1, "#fefefeff"], [49, 1, "#c7c9caff"]]}, "control": "PE_Frame", "id": "frame.styled_panel", "rows": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#e8eaebff"], [3, 1, "#d6d7d9ff"], [4, 1, "#cacccdff"], [5, 89, "#c6c8c9ff"], [94, 1, "#c7c9caff"], [95, 1, "#cbcccdff"], [96, 1, "#d6d8d9ff"], [97, 1, "#e9eaebff"], [98, 2, "#eff0f1ff"]], "1": [[0, 1, "#eff0f1ff"], [1, 1, "#e9eaeaff"], [2, 1, "#cdcecfff"], [3, 1, "#f0f1f1ff"], [4, 1, "#fafafaff"], [5, 90, "#ffffffff"], [95, 1, "#f9fafaff"], [96, 1, "#f1f2f2ff"], [97, 1, "#cccfd0ff"], [98, 1, "#e9eaecff"], [99, 1, "#eff0f1ff"]], "25": [[0, 1, "#c6c8c9ff"], [1, 97, "#ffffffff"], [98, 1, "#fefefeff"], [99, 1, "#c7c9caff"]]}, "size": [100, 50], "state": {"flags": 4, "group": "Active", "name": "sunken"}}, +{"background": "#eff0f1ff", "cols": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#e8eaebff"], [3, 1, "#d5d7d8ff"], [4, 1, "#cacccdff"], [5, 49, "#c6c8c9ff"], [54, 1, "#c7c9caff"], [55, 1, "#cbcccdff"], [56, 1, "#d6d8d8ff"], [57, 1, "#e9eaebff"], [58, 2, "#eff0f1ff"]], "1": [[0, 1, "#eff0f1ff"], [1, 1, "#e8e9eaff"], [2, 1, "#cccecfff"], [3, 1, "#e8eaeaff"], [4, 1, "#f0f1f1ff"], [5, 50, "#f4f5f5ff"], [55, 1, "#eff1f1ff"], [56, 1, "#e8eaeaff"], [57, 1, "#cbcecfff"], [58, 1, "#e9e9ebff"], [59, 1, "#eff0f1ff"]], "2": [[0, 1, "#e8eaebff"], [1, 1, "#cccecfff"], [2, 56, "#f4f5f5ff"], [58, 1, "#cccdcdff"], [59, 1, "#e9eaecff"]], "50": [[0, 1, "#c6c8c9ff"], [1, 57, "#f4f5f5ff"], [58, 1, "#f3f4f4ff"], [59, 1, "#c7c9caff"]]}, "control": "PE_FrameGroupBox", "id": "group_box.frame", "rows": {"0": [[0, 2, "#eff0f1ff"], [2, 1, "#e8eaebff"], [3, 1, "#d5d7d8ff"], [4, 1, "#cacccdff"], [5, 89, "#c6c8c9ff"], [94, 1, "#c7c9caff"], [95, 1, "#cbcccdff"], [96, 1, "#d6d7d8ff"], [97, 1, "#e9eaebff"], [98, 2, "#eff0f1ff"]], "1": [[0, 1, "#eff0f1ff"], [1, 1, "#e8e9eaff"], [2, 1, "#cccecfff"], [3, 1, "#e8eaeaff"], [4, 1, "#f0f1f1ff"], [5, 90, "#f4f5f5ff"], [95, 1, "#eff1f1ff"], [96, 1, "#e8eaeaff"], [97, 1, "#cbcecfff"], [98, 1, "#e9e9ebff"], [99, 1, "#eff0f1ff"]], "2": [[0, 1, "#e8eaebff"], [1, 1, "#cccecfff"], [2, 96, "#f4f5f5ff"], [98, 1, "#ccceceff"], [99, 1, "#e9eaecff"]], "30": [[0, 1, "#c6c8c9ff"], [1, 97, "#f4f5f5ff"], [98, 1, "#f3f4f4ff"], [99, 1, "#c7c9caff"]]}, "size": [100, 60], "state": {"flags": 0, "group": "Active", "name": "normal"}} +] +}, +"BreezeDark": { +"environment": {"image_format": "ARGB32, filled opaque with the palette background, then painted", "kdeglobals_color_scheme": "BreezeDark", "platform": "offscreen", "scheme": "BreezeDark", "style": "breeze"}, +"records": [ +{"background": "#202326ff", "cols": {"0": [[0, 34, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#2a2e31ff"], [4, 1, "#434649ff"], [5, 1, "#4e5154ff"], [6, 22, "#535659ff"], [28, 1, "#4e5154ff"], [29, 1, "#424549ff"], [30, 1, "#292c2fff"], [31, 1, "#1f2225ff"], [32, 2, "#202326ff"]], "2": [[0, 2, "#202326ff"], [2, 1, "#353a3cff"], [3, 1, "#4c5052ff"], [4, 1, "#373a3eff"], [5, 1, "#2d3034ff"], [6, 22, "#292c30ff"], [28, 1, "#2d3034ff"], [29, 1, "#373a3eff"], [30, 1, "#4c5052ff"], [31, 1, "#35393bff"], [32, 1, "#1e2124ff"], [33, 1, "#202326ff"]], "42": [[0, 1, "#202326ff"], [1, 1, "#535659ff"], [2, 30, "#292c30ff"], [32, 1, "#535659ff"], [33, 1, "#1c1f21ff"]]}, "control": "CE_PushButtonBevel", "id": "push_button.normal", "rows": {"0": [[0, 84, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#2a2e31ff"], [4, 1, "#434649ff"], [5, 1, "#4e5154ff"], [6, 72, "#535659ff"], [78, 1, "#4e5154ff"], [79, 1, "#434649ff"], [80, 1, "#2a2e31ff"], [81, 3, "#202326ff"]], "17": [[0, 1, "#202326ff"], [1, 1, "#535659ff"], [2, 80, "#292c30ff"], [82, 1, "#535659ff"], [83, 1, "#202326ff"]], "2": [[0, 2, "#202326ff"], [2, 1, "#353a3cff"], [3, 1, "#4c5052ff"], [4, 1, "#373a3eff"], [5, 1, "#2d3034ff"], [6, 72, "#292c30ff"], [78, 1, "#2d3034ff"], [79, 1, "#373a3eff"], [80, 1, "#4c5052ff"], [81, 1, "#36393cff"], [82, 2, "#202326ff"]], "32": [[0, 2, "#202326ff"], [2, 1, "#1e2124ff"], [3, 1, "#292b2fff"], [4, 1, "#434649ff"], [5, 1, "#4f5154ff"], [6, 72, "#535659ff"], [78, 1, "#4f5154ff"], [79, 1, "#434649ff"], [80, 1, "#292b2eff"], [81, 1, "#1e2124ff"], [82, 2, "#202326ff"]], "33": [[0, 3, "#202326ff"], [3, 1, "#1f2225ff"], [4, 1, "#1d2023ff"], [5, 1, "#1c1f22ff"], [6, 72, "#1c1f21ff"], [78, 1, "#1c1f22ff"], [79, 1, "#1d2023ff"], [80, 1, "#1f2225ff"], [81, 3, "#202326ff"]]}, "size": [84, 34], "state": {"features": 0, "flags": 2, "group": "Active", "name": "normal"}}, +{"background": "#202326ff", "cols": {"0": [[0, 34, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#254150ff"], [4, 1, "#3482acff"], [5, 1, "#3aa0d5ff"], [6, 22, "#3daee9ff"], [28, 1, "#3aa0d5ff"], [29, 1, "#3381acff"], [30, 1, "#243f4eff"], [31, 1, "#1f2225ff"], [32, 2, "#202326ff"]], "2": [[0, 2, "#202326ff"], [2, 1, "#2c617dff"], [3, 1, "#399bceff"], [4, 1, "#30586fff"], [5, 1, "#2b3942ff"], [6, 22, "#292c30ff"], [28, 1, "#2b3942ff"], [29, 1, "#30586fff"], [30, 1, "#399bceff"], [31, 1, "#2c607cff"], [32, 1, "#1e2124ff"], [33, 1, "#202326ff"]], "42": [[0, 1, "#202326ff"], [1, 1, "#3daee9ff"], [2, 30, "#292c30ff"], [32, 1, "#3daee9ff"], [33, 1, "#1c1f21ff"]]}, "control": "CE_PushButtonBevel", "id": "push_button.hover", "rows": {"0": [[0, 84, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#254150ff"], [4, 1, "#3482acff"], [5, 1, "#3aa0d5ff"], [6, 72, "#3daee9ff"], [78, 1, "#3aa0d5ff"], [79, 1, "#3482acff"], [80, 1, "#254150ff"], [81, 3, "#202326ff"]], "17": [[0, 1, "#202326ff"], [1, 1, "#3daee9ff"], [2, 80, "#292c30ff"], [82, 1, "#3daee9ff"], [83, 1, "#202326ff"]], "2": [[0, 2, "#202326ff"], [2, 1, "#2c617dff"], [3, 1, "#399bceff"], [4, 1, "#30586fff"], [5, 1, "#2b3942ff"], [6, 72, "#292c30ff"], [78, 1, "#2b3942ff"], [79, 1, "#30586fff"], [80, 1, "#399bceff"], [81, 1, "#2c617cff"], [82, 2, "#202326ff"]], "32": [[0, 2, "#202326ff"], [2, 1, "#1e2124ff"], [3, 1, "#243e4eff"], [4, 1, "#3482acff"], [5, 1, "#3ba0d5ff"], [6, 72, "#3daee9ff"], [78, 1, "#3ba0d5ff"], [79, 1, "#3482acff"], [80, 1, "#243e4dff"], [81, 1, "#1e2124ff"], [82, 2, "#202326ff"]], "33": [[0, 3, "#202326ff"], [3, 1, "#1f2225ff"], [4, 1, "#1d2023ff"], [5, 1, "#1c1f22ff"], [6, 72, "#1c1f21ff"], [78, 1, "#1c1f22ff"], [79, 1, "#1d2023ff"], [80, 1, "#1f2225ff"], [81, 3, "#202326ff"]]}, "size": [84, 34], "state": {"features": 0, "flags": 8194, "group": "Active", "name": "hover"}}, +{"background": "#202326ff", "cols": {"0": [[0, 34, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#254150ff"], [4, 1, "#3482acff"], [5, 1, "#3aa0d5ff"], [6, 22, "#3daee9ff"], [28, 1, "#3aa0d5ff"], [29, 1, "#3381acff"], [30, 1, "#243f4eff"], [31, 1, "#1f2225ff"], [32, 2, "#202326ff"]], "2": [[0, 2, "#202326ff"], [2, 1, "#2c617dff"], [3, 1, "#399bceff"], [4, 1, "#30586fff"], [5, 1, "#2b3942ff"], [6, 22, "#292c30ff"], [28, 1, "#2b3942ff"], [29, 1, "#30586fff"], [30, 1, "#399bceff"], [31, 1, "#2c607cff"], [32, 1, "#1e2124ff"], [33, 1, "#202326ff"]], "42": [[0, 1, "#202326ff"], [1, 1, "#3daee9ff"], [2, 30, "#292c30ff"], [32, 1, "#3daee9ff"], [33, 1, "#1c1f21ff"]]}, "control": "CE_PushButtonBevel", "id": "push_button.focus", "rows": {"0": [[0, 84, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#254150ff"], [4, 1, "#3482acff"], [5, 1, "#3aa0d5ff"], [6, 72, "#3daee9ff"], [78, 1, "#3aa0d5ff"], [79, 1, "#3482acff"], [80, 1, "#254150ff"], [81, 3, "#202326ff"]], "17": [[0, 1, "#202326ff"], [1, 1, "#3daee9ff"], [2, 80, "#292c30ff"], [82, 1, "#3daee9ff"], [83, 1, "#202326ff"]], "2": [[0, 2, "#202326ff"], [2, 1, "#2c617dff"], [3, 1, "#399bceff"], [4, 1, "#30586fff"], [5, 1, "#2b3942ff"], [6, 72, "#292c30ff"], [78, 1, "#2b3942ff"], [79, 1, "#30586fff"], [80, 1, "#399bceff"], [81, 1, "#2c617cff"], [82, 2, "#202326ff"]], "32": [[0, 2, "#202326ff"], [2, 1, "#1e2124ff"], [3, 1, "#243e4eff"], [4, 1, "#3482acff"], [5, 1, "#3ba0d5ff"], [6, 72, "#3daee9ff"], [78, 1, "#3ba0d5ff"], [79, 1, "#3482acff"], [80, 1, "#243e4dff"], [81, 1, "#1e2124ff"], [82, 2, "#202326ff"]], "33": [[0, 3, "#202326ff"], [3, 1, "#1f2225ff"], [4, 1, "#1d2023ff"], [5, 1, "#1c1f22ff"], [6, 72, "#1c1f21ff"], [78, 1, "#1c1f22ff"], [79, 1, "#1d2023ff"], [80, 1, "#1f2225ff"], [81, 3, "#202326ff"]]}, "size": [84, 34], "state": {"features": 0, "flags": 8388866, "group": "Active", "name": "focus"}}, +{"background": "#202326ff", "cols": {"0": [[0, 34, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#264151ff"], [4, 1, "#3585b0ff"], [5, 1, "#3ba2d8ff"], [6, 22, "#3daee9ff"], [28, 1, "#3ba2d8ff"], [29, 1, "#3585b0ff"], [30, 1, "#264151ff"], [31, 3, "#202326ff"]], "2": [[0, 2, "#202326ff"], [2, 1, "#2e6380ff"], [3, 1, "#3a9ed3ff"], [4, 1, "#347294ff"], [5, 1, "#305c75ff"], [6, 22, "#2f5368ff"], [28, 1, "#305c75ff"], [29, 1, "#347294ff"], [30, 1, "#3a9ed3ff"], [31, 1, "#2e6380ff"], [32, 2, "#202326ff"]], "42": [[0, 1, "#202326ff"], [1, 1, "#3daee9ff"], [2, 30, "#2f5368ff"], [32, 1, "#3daee9ff"], [33, 1, "#202326ff"]]}, "control": "CE_PushButtonBevel", "id": "push_button.pressed", "rows": {"0": [[0, 84, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#264151ff"], [4, 1, "#3585b0ff"], [5, 1, "#3ba2d8ff"], [6, 72, "#3daee9ff"], [78, 1, "#3ba2d8ff"], [79, 1, "#3585b0ff"], [80, 1, "#264151ff"], [81, 3, "#202326ff"]], "17": [[0, 1, "#202326ff"], [1, 1, "#3daee9ff"], [2, 80, "#2f5368ff"], [82, 1, "#3daee9ff"], [83, 1, "#202326ff"]], "2": [[0, 2, "#202326ff"], [2, 1, "#2e6380ff"], [3, 1, "#3a9ed3ff"], [4, 1, "#347294ff"], [5, 1, "#305c75ff"], [6, 72, "#2f5368ff"], [78, 1, "#305c75ff"], [79, 1, "#347294ff"], [80, 1, "#3a9ed3ff"], [81, 1, "#2d637fff"], [82, 2, "#202326ff"]], "32": [[0, 3, "#202326ff"], [3, 1, "#264151ff"], [4, 1, "#3585b0ff"], [5, 1, "#3ba2d8ff"], [6, 72, "#3daee9ff"], [78, 1, "#3ba2d8ff"], [79, 1, "#3585b0ff"], [80, 1, "#264150ff"], [81, 3, "#202326ff"]], "33": [[0, 84, "#202326ff"]]}, "size": [84, 34], "state": {"features": 0, "flags": 4, "group": "Active", "name": "pressed"}}, +{"background": "#202326ff", "cols": {"0": [[0, 34, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#283840ff"], [4, 1, "#3b657cff"], [5, 1, "#457a97ff"], [6, 22, "#4882a1ff"], [28, 1, "#457a97ff"], [29, 1, "#3b657bff"], [30, 1, "#27363eff"], [31, 1, "#1f2225ff"], [32, 2, "#202326ff"]], "2": [[0, 2, "#202326ff"], [2, 1, "#314e5eff"], [3, 1, "#447893ff"], [4, 1, "#365a6eff"], [5, 1, "#304c5dff"], [6, 22, "#2d4655ff"], [28, 1, "#304c5dff"], [29, 1, "#365a6eff"], [30, 1, "#447894ff"], [31, 1, "#304d5dff"], [32, 1, "#1e2124ff"], [33, 1, "#202326ff"]], "42": [[0, 1, "#202326ff"], [1, 1, "#4882a1ff"], [2, 30, "#2d4655ff"], [32, 1, "#4882a1ff"], [33, 1, "#1c1f21ff"]]}, "control": "CE_PushButtonBevel", "id": "push_button.default", "rows": {"0": [[0, 84, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#283840ff"], [4, 1, "#3b657cff"], [5, 1, "#457a97ff"], [6, 72, "#4882a1ff"], [78, 1, "#457a97ff"], [79, 1, "#3b657cff"], [80, 1, "#283840ff"], [81, 3, "#202326ff"]], "17": [[0, 1, "#202326ff"], [1, 1, "#4882a1ff"], [2, 80, "#2d4655ff"], [82, 1, "#4882a1ff"], [83, 1, "#202326ff"]], "2": [[0, 2, "#202326ff"], [2, 1, "#314e5eff"], [3, 1, "#447893ff"], [4, 1, "#365a6eff"], [5, 1, "#304c5dff"], [6, 72, "#2d4655ff"], [78, 1, "#304c5dff"], [79, 1, "#365a6eff"], [80, 1, "#447893ff"], [81, 1, "#314d5eff"], [82, 2, "#202326ff"]], "32": [[0, 2, "#202326ff"], [2, 1, "#1e2124ff"], [3, 1, "#27353eff"], [4, 1, "#3b667cff"], [5, 1, "#457a97ff"], [6, 72, "#4882a1ff"], [78, 1, "#457a97ff"], [79, 1, "#3b667cff"], [80, 1, "#27343eff"], [81, 1, "#1e2124ff"], [82, 2, "#202326ff"]], "33": [[0, 3, "#202326ff"], [3, 1, "#1f2225ff"], [4, 1, "#1d2023ff"], [5, 1, "#1c1f22ff"], [6, 72, "#1c1f21ff"], [78, 1, "#1c1f22ff"], [79, 1, "#1d2023ff"], [80, 1, "#1f2225ff"], [81, 3, "#202326ff"]]}, "size": [84, 34], "state": {"features": 4, "flags": 2, "group": "Active", "name": "default"}}, +{"background": "#1f2124ff", "cols": {"0": [[0, 34, "#1f2124ff"]], "1": [[0, 3, "#1f2124ff"], [3, 1, "#242629ff"], [4, 1, "#2e3134ff"], [5, 1, "#343639ff"], [6, 22, "#35383bff"], [28, 1, "#343639ff"], [29, 1, "#2e3134ff"], [30, 1, "#242629ff"], [31, 3, "#1f2124ff"]], "2": [[0, 2, "#1f2124ff"], [2, 1, "#292b2fff"], [3, 1, "#333639ff"], [4, 1, "#2c2f32ff"], [5, 1, "#282b2fff"], [6, 22, "#272a2eff"], [28, 1, "#282b2fff"], [29, 1, "#2c2f32ff"], [30, 1, "#333639ff"], [31, 1, "#292b2fff"], [32, 2, "#1f2124ff"]], "42": [[0, 1, "#1f2124ff"], [1, 1, "#35383bff"], [2, 30, "#272a2eff"], [32, 1, "#35383bff"], [33, 1, "#1f2124ff"]]}, "control": "CE_PushButtonBevel", "id": "push_button.disabled", "rows": {"0": [[0, 84, "#1f2124ff"]], "1": [[0, 3, "#1f2124ff"], [3, 1, "#242629ff"], [4, 1, "#2e3134ff"], [5, 1, "#343639ff"], [6, 72, "#35383bff"], [78, 1, "#343639ff"], [79, 1, "#2e3134ff"], [80, 1, "#242629ff"], [81, 3, "#1f2124ff"]], "17": [[0, 1, "#1f2124ff"], [1, 1, "#35383bff"], [2, 80, "#272a2eff"], [82, 1, "#35383bff"], [83, 1, "#1f2124ff"]], "2": [[0, 2, "#1f2124ff"], [2, 1, "#292b2fff"], [3, 1, "#333639ff"], [4, 1, "#2c2f32ff"], [5, 1, "#282b2fff"], [6, 72, "#272a2eff"], [78, 1, "#282b2fff"], [79, 1, "#2c2f32ff"], [80, 1, "#333639ff"], [81, 1, "#292b2eff"], [82, 2, "#1f2124ff"]], "32": [[0, 3, "#1f2124ff"], [3, 1, "#242629ff"], [4, 1, "#2e3134ff"], [5, 1, "#343639ff"], [6, 72, "#35383bff"], [78, 1, "#343639ff"], [79, 1, "#2e3134ff"], [80, 1, "#232629ff"], [81, 3, "#1f2124ff"]], "33": [[0, 84, "#1f2124ff"]]}, "size": [84, 34], "state": {"features": 0, "flags": 2, "group": "Disabled", "name": "disabled"}}, +{"background": "#202326ff", "cols": {"0": [[0, 34, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#2a2e31ff"], [4, 1, "#434649ff"], [5, 1, "#4e5154ff"], [6, 22, "#535659ff"], [28, 1, "#4e5154ff"], [29, 1, "#424549ff"], [30, 1, "#292c2fff"], [31, 1, "#1f2225ff"], [32, 2, "#202326ff"]], "2": [[0, 2, "#202326ff"], [2, 1, "#353a3cff"], [3, 1, "#4c5052ff"], [4, 1, "#373a3eff"], [5, 1, "#2d3034ff"], [6, 22, "#292c30ff"], [28, 1, "#2d3034ff"], [29, 1, "#373a3eff"], [30, 1, "#4c5052ff"], [31, 1, "#35393bff"], [32, 1, "#1e2124ff"], [33, 1, "#202326ff"]], "42": [[0, 1, "#202326ff"], [1, 1, "#535659ff"], [2, 30, "#292c30ff"], [32, 1, "#535659ff"], [33, 1, "#1c1f21ff"]]}, "control": "CE_PushButtonBevel", "id": "push_button.inactive_window", "rows": {"0": [[0, 84, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#2a2e31ff"], [4, 1, "#434649ff"], [5, 1, "#4e5154ff"], [6, 72, "#535659ff"], [78, 1, "#4e5154ff"], [79, 1, "#434649ff"], [80, 1, "#2a2e31ff"], [81, 3, "#202326ff"]], "17": [[0, 1, "#202326ff"], [1, 1, "#535659ff"], [2, 80, "#292c30ff"], [82, 1, "#535659ff"], [83, 1, "#202326ff"]], "2": [[0, 2, "#202326ff"], [2, 1, "#353a3cff"], [3, 1, "#4c5052ff"], [4, 1, "#373a3eff"], [5, 1, "#2d3034ff"], [6, 72, "#292c30ff"], [78, 1, "#2d3034ff"], [79, 1, "#373a3eff"], [80, 1, "#4c5052ff"], [81, 1, "#36393cff"], [82, 2, "#202326ff"]], "32": [[0, 2, "#202326ff"], [2, 1, "#1e2124ff"], [3, 1, "#292b2fff"], [4, 1, "#434649ff"], [5, 1, "#4f5154ff"], [6, 72, "#535659ff"], [78, 1, "#4f5154ff"], [79, 1, "#434649ff"], [80, 1, "#292b2eff"], [81, 1, "#1e2124ff"], [82, 2, "#202326ff"]], "33": [[0, 3, "#202326ff"], [3, 1, "#1f2225ff"], [4, 1, "#1d2023ff"], [5, 1, "#1c1f22ff"], [6, 72, "#1c1f21ff"], [78, 1, "#1c1f22ff"], [79, 1, "#1d2023ff"], [80, 1, "#1f2225ff"], [81, 3, "#202326ff"]]}, "size": [84, 34], "state": {"features": 0, "flags": 2, "group": "Inactive", "name": "inactive_window"}}, +{"background": "#202326ff", "cols": {"0": [[0, 34, "#202326ff"]], "1": [[0, 34, "#202326ff"]], "2": [[0, 34, "#202326ff"]], "42": [[0, 34, "#202326ff"]]}, "control": "CE_PushButtonBevel", "id": "push_button.flat", "rows": {"0": [[0, 84, "#202326ff"]], "1": [[0, 84, "#202326ff"]], "17": [[0, 84, "#202326ff"]], "2": [[0, 84, "#202326ff"]], "32": [[0, 84, "#202326ff"]], "33": [[0, 84, "#202326ff"]]}, "size": [84, 34], "state": {"features": 1, "flags": 0, "group": "Active", "name": "flat"}}, +{"background": "#202326ff", "cols": {"0": [[0, 34, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#264151ff"], [4, 1, "#3482acff"], [5, 1, "#3aa0d5ff"], [6, 22, "#3daee9ff"], [28, 1, "#3aa0d5ff"], [29, 1, "#3482acff"], [30, 1, "#264151ff"], [31, 3, "#202326ff"]], "2": [[0, 2, "#202326ff"], [2, 1, "#2e617eff"], [3, 1, "#399acdff"], [4, 1, "#2a5268ff"], [5, 1, "#233139ff"], [6, 22, "#202326ff"], [28, 1, "#233139ff"], [29, 1, "#2a5268ff"], [30, 1, "#399acdff"], [31, 1, "#2e617eff"], [32, 2, "#202326ff"]], "42": [[0, 1, "#202326ff"], [1, 1, "#3daee9ff"], [2, 30, "#202326ff"], [32, 1, "#3daee9ff"], [33, 1, "#202326ff"]]}, "control": "CE_PushButtonBevel", "id": "push_button.flat_hover", "rows": {"0": [[0, 84, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#264151ff"], [4, 1, "#3482acff"], [5, 1, "#3aa0d5ff"], [6, 72, "#3daee9ff"], [78, 1, "#3aa0d5ff"], [79, 1, "#3482acff"], [80, 1, "#264151ff"], [81, 3, "#202326ff"]], "17": [[0, 1, "#202326ff"], [1, 1, "#3daee9ff"], [2, 80, "#202326ff"], [82, 1, "#3daee9ff"], [83, 1, "#202326ff"]], "2": [[0, 2, "#202326ff"], [2, 1, "#2e617eff"], [3, 1, "#399acdff"], [4, 1, "#2a5268ff"], [5, 1, "#233139ff"], [6, 72, "#202326ff"], [78, 1, "#233139ff"], [79, 1, "#2a5268ff"], [80, 1, "#399acdff"], [81, 1, "#2d617dff"], [82, 2, "#202326ff"]], "32": [[0, 3, "#202326ff"], [3, 1, "#264151ff"], [4, 1, "#3482acff"], [5, 1, "#3aa0d5ff"], [6, 72, "#3daee9ff"], [78, 1, "#3aa0d5ff"], [79, 1, "#3482acff"], [80, 1, "#264150ff"], [81, 3, "#202326ff"]], "33": [[0, 84, "#202326ff"]]}, "size": [84, 34], "state": {"features": 1, "flags": 8192, "group": "Active", "name": "flat_hover"}}, +{"background": "#202326ff", "cols": {"0": [[0, 28, "#202326ff"]], "1": [[0, 28, "#202326ff"]], "14": [[0, 28, "#202326ff"]]}, "control": "CC_ToolButton", "id": "tool_button.normal", "rows": {"0": [[0, 28, "#202326ff"]], "1": [[0, 28, "#202326ff"]], "14": [[0, 28, "#202326ff"]]}, "size": [28, 28], "state": {"flags": 4098, "group": "Active", "name": "normal"}}, +{"background": "#202326ff", "cols": {"0": [[0, 28, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#264151ff"], [4, 1, "#3482acff"], [5, 1, "#3aa0d5ff"], [6, 16, "#3daee9ff"], [22, 1, "#3aa0d5ff"], [23, 1, "#3482acff"], [24, 1, "#264151ff"], [25, 3, "#202326ff"]], "14": [[0, 1, "#202326ff"], [1, 1, "#3daee9ff"], [2, 24, "#202326ff"], [26, 1, "#3daee9ff"], [27, 1, "#202326ff"]]}, "control": "CC_ToolButton", "id": "tool_button.hover", "rows": {"0": [[0, 28, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#264151ff"], [4, 1, "#3482acff"], [5, 1, "#3aa0d5ff"], [6, 16, "#3daee9ff"], [22, 1, "#3aa0d5ff"], [23, 1, "#3482acff"], [24, 1, "#264151ff"], [25, 3, "#202326ff"]], "14": [[0, 1, "#202326ff"], [1, 1, "#3daee9ff"], [2, 24, "#202326ff"], [26, 1, "#3daee9ff"], [27, 1, "#202326ff"]]}, "size": [28, 28], "state": {"flags": 12290, "group": "Active", "name": "hover"}}, +{"background": "#202326ff", "cols": {"0": [[0, 28, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#264151ff"], [4, 1, "#3484afff"], [5, 1, "#3ba1d7ff"], [6, 16, "#3daee9ff"], [22, 1, "#3ba1d7ff"], [23, 1, "#3484afff"], [24, 1, "#264151ff"], [25, 3, "#202326ff"]], "14": [[0, 1, "#202326ff"], [1, 1, "#3daee9ff"], [2, 24, "#284c61ff"], [26, 1, "#3daee9ff"], [27, 1, "#202326ff"]]}, "control": "CC_ToolButton", "id": "tool_button.pressed", "rows": {"0": [[0, 28, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#264151ff"], [4, 1, "#3484afff"], [5, 1, "#3ba1d7ff"], [6, 16, "#3daee9ff"], [22, 1, "#3ba1d7ff"], [23, 1, "#3484afff"], [24, 1, "#264151ff"], [25, 3, "#202326ff"]], "14": [[0, 1, "#202326ff"], [1, 1, "#3daee9ff"], [2, 24, "#284c61ff"], [26, 1, "#3daee9ff"], [27, 1, "#202326ff"]]}, "size": [28, 28], "state": {"flags": 12292, "group": "Active", "name": "pressed"}}, +{"background": "#202326ff", "cols": {"0": [[0, 28, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#2b2e32ff"], [4, 1, "#45484aff"], [5, 1, "#4f5255ff"], [6, 16, "#535659ff"], [22, 1, "#4f5255ff"], [23, 1, "#45484aff"], [24, 1, "#2b2e32ff"], [25, 3, "#202326ff"]], "14": [[0, 1, "#202326ff"], [1, 1, "#535659ff"], [2, 24, "#3c3f41ff"], [26, 1, "#535659ff"], [27, 1, "#202326ff"]]}, "control": "CC_ToolButton", "id": "tool_button.checked", "rows": {"0": [[0, 28, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#2b2e32ff"], [4, 1, "#45484aff"], [5, 1, "#4f5255ff"], [6, 16, "#535659ff"], [22, 1, "#4f5255ff"], [23, 1, "#45484aff"], [24, 1, "#2b2e32ff"], [25, 3, "#202326ff"]], "14": [[0, 1, "#202326ff"], [1, 1, "#535659ff"], [2, 24, "#3c3f41ff"], [26, 1, "#535659ff"], [27, 1, "#202326ff"]]}, "size": [28, 28], "state": {"flags": 4128, "group": "Active", "name": "checked"}}, +{"background": "#202326ff", "cols": {"0": [[0, 28, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#2a2e31ff"], [4, 1, "#434649ff"], [5, 1, "#4e5154ff"], [6, 16, "#535659ff"], [22, 1, "#4e5154ff"], [23, 1, "#424549ff"], [24, 1, "#292c2fff"], [25, 1, "#1f2225ff"], [26, 2, "#202326ff"]], "14": [[0, 1, "#202326ff"], [1, 1, "#535659ff"], [2, 24, "#292c30ff"], [26, 1, "#535659ff"], [27, 1, "#1c1f21ff"]]}, "control": "CC_ToolButton", "id": "tool_button.framed", "rows": {"0": [[0, 28, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#2a2e31ff"], [4, 1, "#434649ff"], [5, 1, "#4e5154ff"], [6, 16, "#535659ff"], [22, 1, "#4e5154ff"], [23, 1, "#434649ff"], [24, 1, "#2a2e31ff"], [25, 3, "#202326ff"]], "14": [[0, 1, "#202326ff"], [1, 1, "#535659ff"], [2, 24, "#292c30ff"], [26, 1, "#535659ff"], [27, 1, "#202326ff"]]}, "size": [28, 28], "state": {"flags": 2, "group": "Active", "name": "framed"}}, +{"background": "#202326ff", "cols": {"0": [[0, 2, "#202326ff"], [2, 1, "#272a2cff"], [3, 1, "#3b3d40ff"], [4, 1, "#484a4cff"], [5, 21, "#4c4e51ff"], [26, 1, "#4b4d51ff"], [27, 1, "#48494cff"], [28, 1, "#3a3d40ff"], [29, 1, "#26292cff"], [30, 2, "#202326ff"]], "1": [[0, 1, "#202326ff"], [1, 1, "#272a2cff"], [2, 1, "#44474aff"], [3, 1, "#232427ff"], [4, 1, "#191b1eff"], [5, 22, "#141618ff"], [27, 1, "#191c1eff"], [28, 1, "#222426ff"], [29, 1, "#45474aff"], [30, 1, "#25282cff"], [31, 1, "#202326ff"]], "2": [[0, 1, "#272a2cff"], [1, 1, "#44474aff"], [2, 28, "#141618ff"], [30, 1, "#46484aff"], [31, 1, "#26292cff"]], "75": [[0, 1, "#4c4e51ff"], [1, 29, "#141618ff"], [30, 1, "#151719ff"], [31, 1, "#4b4d50ff"]]}, "control": "PE_PanelLineEdit", "id": "line_edit.normal", "rows": {"0": [[0, 2, "#202326ff"], [2, 1, "#272a2cff"], [3, 1, "#3b3d40ff"], [4, 1, "#484a4cff"], [5, 139, "#4c4e51ff"], [144, 1, "#4b4d50ff"], [145, 1, "#48494cff"], [146, 1, "#3a3d40ff"], [147, 1, "#26292cff"], [148, 2, "#202326ff"]], "1": [[0, 1, "#202326ff"], [1, 1, "#272a2cff"], [2, 1, "#44474aff"], [3, 1, "#222426ff"], [4, 1, "#191b1eff"], [5, 140, "#141618ff"], [145, 1, "#191c1eff"], [146, 1, "#232426ff"], [147, 1, "#44484aff"], [148, 1, "#26282cff"], [149, 1, "#202326ff"]], "16": [[0, 1, "#4c4e51ff"], [1, 147, "#141618ff"], [148, 1, "#151719ff"], [149, 1, "#4b4d50ff"]], "2": [[0, 1, "#272a2cff"], [1, 1, "#44474aff"], [2, 146, "#141618ff"], [148, 1, "#46474bff"], [149, 1, "#26292cff"]], "30": [[0, 1, "#202326ff"], [1, 1, "#25282cff"], [2, 1, "#46484aff"], [3, 1, "#232527ff"], [4, 1, "#1a1d1eff"], [5, 140, "#151719ff"], [145, 1, "#1b1c1eff"], [146, 1, "#242528ff"], [147, 1, "#46484bff"], [148, 1, "#26282bff"], [149, 1, "#202326ff"]], "31": [[0, 2, "#202326ff"], [2, 1, "#26292cff"], [3, 1, "#3b3d40ff"], [4, 1, "#47484cff"], [5, 140, "#4b4d50ff"], [145, 1, "#46484cff"], [146, 1, "#3a3c3fff"], [147, 1, "#26282bff"], [148, 2, "#202326ff"]]}, "size": [150, 32], "state": {"flags": 4, "group": "Active", "line_width": 6, "name": "normal"}}, +{"background": "#202326ff", "cols": {"0": [[0, 2, "#202326ff"], [2, 1, "#243944ff"], [3, 1, "#327aa0ff"], [4, 1, "#3aa1d6ff"], [5, 21, "#3daee9ff"], [26, 1, "#3cabe6ff"], [27, 1, "#3aa0d5ff"], [28, 1, "#31799fff"], [29, 1, "#243742ff"], [30, 2, "#202326ff"]], "1": [[0, 1, "#202326ff"], [1, 1, "#233945ff"], [2, 1, "#3999ccff"], [3, 1, "#1e3b4cff"], [4, 1, "#18242cff"], [5, 22, "#141618ff"], [27, 1, "#18252dff"], [28, 1, "#1e3d4dff"], [29, 1, "#389bceff"], [30, 1, "#233743ff"], [31, 1, "#202326ff"]], "2": [[0, 1, "#243944ff"], [1, 1, "#3899ccff"], [2, 28, "#141618ff"], [30, 1, "#399cd0ff"], [31, 1, "#243641ff"]], "75": [[0, 1, "#3daee9ff"], [1, 29, "#141618ff"], [30, 1, "#15181bff"], [31, 1, "#3cace6ff"]]}, "control": "PE_PanelLineEdit", "id": "line_edit.hover", "rows": {"0": [[0, 2, "#202326ff"], [2, 1, "#243944ff"], [3, 1, "#327aa0ff"], [4, 1, "#3aa1d6ff"], [5, 139, "#3daee9ff"], [144, 1, "#3cabe5ff"], [145, 1, "#3aa0d5ff"], [146, 1, "#31799fff"], [147, 1, "#243742ff"], [148, 2, "#202326ff"]], "1": [[0, 1, "#202326ff"], [1, 1, "#233945ff"], [2, 1, "#3899ccff"], [3, 1, "#1d3b4bff"], [4, 1, "#18242cff"], [5, 140, "#141618ff"], [145, 1, "#18252dff"], [146, 1, "#1f3d4dff"], [147, 1, "#389bceff"], [148, 1, "#243743ff"], [149, 1, "#202326ff"]], "16": [[0, 1, "#3daee9ff"], [1, 147, "#141618ff"], [148, 1, "#15181bff"], [149, 1, "#3cace6ff"]], "2": [[0, 1, "#243944ff"], [1, 1, "#3999ccff"], [2, 146, "#141618ff"], [148, 1, "#399bcfff"], [149, 1, "#243641ff"]], "30": [[0, 1, "#202326ff"], [1, 1, "#233743ff"], [2, 1, "#399cd0ff"], [3, 1, "#1e3e4eff"], [4, 1, "#19272fff"], [5, 139, "#15181bff"], [144, 1, "#14171aff"], [145, 1, "#19272fff"], [146, 1, "#1f3e50ff"], [147, 1, "#399cd1ff"], [148, 1, "#243640ff"], [149, 1, "#202326ff"]], "31": [[0, 2, "#202326ff"], [2, 1, "#243641ff"], [3, 1, "#31789dff"], [4, 1, "#399ed3ff"], [5, 139, "#3cace6ff"], [144, 1, "#3caae4ff"], [145, 1, "#399dd2ff"], [146, 1, "#31779dff"], [147, 1, "#24353fff"], [148, 2, "#202326ff"]]}, "size": [150, 32], "state": {"flags": 8196, "group": "Active", "line_width": 6, "name": "hover"}}, +{"background": "#202326ff", "cols": {"0": [[0, 2, "#202326ff"], [2, 1, "#243944ff"], [3, 1, "#327aa0ff"], [4, 1, "#3aa1d6ff"], [5, 21, "#3daee9ff"], [26, 1, "#3cabe6ff"], [27, 1, "#3aa0d5ff"], [28, 1, "#31799fff"], [29, 1, "#243742ff"], [30, 2, "#202326ff"]], "1": [[0, 1, "#202326ff"], [1, 1, "#233945ff"], [2, 1, "#3999ccff"], [3, 1, "#1e3b4cff"], [4, 1, "#18242cff"], [5, 22, "#141618ff"], [27, 1, "#18252dff"], [28, 1, "#1e3d4dff"], [29, 1, "#389bceff"], [30, 1, "#233743ff"], [31, 1, "#202326ff"]], "2": [[0, 1, "#243944ff"], [1, 1, "#3899ccff"], [2, 28, "#141618ff"], [30, 1, "#399cd0ff"], [31, 1, "#243641ff"]], "75": [[0, 1, "#3daee9ff"], [1, 29, "#141618ff"], [30, 1, "#15181bff"], [31, 1, "#3cace6ff"]]}, "control": "PE_PanelLineEdit", "id": "line_edit.focus", "rows": {"0": [[0, 2, "#202326ff"], [2, 1, "#243944ff"], [3, 1, "#327aa0ff"], [4, 1, "#3aa1d6ff"], [5, 139, "#3daee9ff"], [144, 1, "#3cabe5ff"], [145, 1, "#3aa0d5ff"], [146, 1, "#31799fff"], [147, 1, "#243742ff"], [148, 2, "#202326ff"]], "1": [[0, 1, "#202326ff"], [1, 1, "#233945ff"], [2, 1, "#3899ccff"], [3, 1, "#1d3b4bff"], [4, 1, "#18242cff"], [5, 140, "#141618ff"], [145, 1, "#18252dff"], [146, 1, "#1f3d4dff"], [147, 1, "#389bceff"], [148, 1, "#243743ff"], [149, 1, "#202326ff"]], "16": [[0, 1, "#3daee9ff"], [1, 147, "#141618ff"], [148, 1, "#15181bff"], [149, 1, "#3cace6ff"]], "2": [[0, 1, "#243944ff"], [1, 1, "#3999ccff"], [2, 146, "#141618ff"], [148, 1, "#399bcfff"], [149, 1, "#243641ff"]], "30": [[0, 1, "#202326ff"], [1, 1, "#233743ff"], [2, 1, "#399cd0ff"], [3, 1, "#1e3e4eff"], [4, 1, "#19272fff"], [5, 139, "#15181bff"], [144, 1, "#14171aff"], [145, 1, "#19272fff"], [146, 1, "#1f3e50ff"], [147, 1, "#399cd1ff"], [148, 1, "#243640ff"], [149, 1, "#202326ff"]], "31": [[0, 2, "#202326ff"], [2, 1, "#243641ff"], [3, 1, "#31789dff"], [4, 1, "#399ed3ff"], [5, 139, "#3cace6ff"], [144, 1, "#3caae4ff"], [145, 1, "#399dd2ff"], [146, 1, "#31779dff"], [147, 1, "#24353fff"], [148, 2, "#202326ff"]]}, "size": [150, 32], "state": {"flags": 8388868, "group": "Active", "line_width": 6, "name": "focus"}}, +{"background": "#1f2124ff", "cols": {"0": [[0, 2, "#1f2124ff"], [2, 1, "#212326ff"], [3, 1, "#27292dff"], [4, 1, "#2c2e31ff"], [5, 21, "#2d3033ff"], [26, 1, "#2c2f32ff"], [27, 1, "#2c2e31ff"], [28, 1, "#27292cff"], [29, 1, "#222326ff"], [30, 2, "#1f2124ff"]], "1": [[0, 1, "#1f2124ff"], [1, 1, "#202225ff"], [2, 1, "#2a2e2fff"], [3, 1, "#1a1c1eff"], [4, 1, "#15181aff"], [5, 22, "#131517ff"], [27, 1, "#15181aff"], [28, 1, "#1a1c1eff"], [29, 1, "#2a2d30ff"], [30, 1, "#212225ff"], [31, 1, "#1f2124ff"]], "2": [[0, 1, "#212326ff"], [1, 1, "#2a2d30ff"], [2, 28, "#131517ff"], [30, 1, "#2a2d31ff"], [31, 1, "#212326ff"]], "75": [[0, 1, "#2d3033ff"], [1, 29, "#131517ff"], [30, 1, "#141618ff"], [31, 1, "#2c2f32ff"]]}, "control": "PE_PanelLineEdit", "id": "line_edit.disabled", "rows": {"0": [[0, 2, "#1f2124ff"], [2, 1, "#212326ff"], [3, 1, "#272a2dff"], [4, 1, "#2c2e31ff"], [5, 139, "#2d3033ff"], [144, 1, "#2c2f32ff"], [145, 1, "#2c2e31ff"], [146, 1, "#262a2cff"], [147, 1, "#222326ff"], [148, 2, "#1f2124ff"]], "1": [[0, 1, "#1f2124ff"], [1, 1, "#202225ff"], [2, 1, "#2a2d30ff"], [3, 1, "#1a1c1eff"], [4, 1, "#15181aff"], [5, 140, "#131517ff"], [145, 1, "#15181aff"], [146, 1, "#1a1c1eff"], [147, 1, "#292e30ff"], [148, 1, "#212225ff"], [149, 1, "#1f2124ff"]], "16": [[0, 1, "#2d3033ff"], [1, 147, "#131517ff"], [148, 1, "#141618ff"], [149, 1, "#2c2f32ff"]], "2": [[0, 1, "#212326ff"], [1, 1, "#2a2e2fff"], [2, 146, "#131517ff"], [148, 1, "#2a2d30ff"], [149, 1, "#212326ff"]], "30": [[0, 1, "#1f2124ff"], [1, 1, "#212225ff"], [2, 1, "#2a2d31ff"], [3, 1, "#1a1c1fff"], [4, 1, "#16181aff"], [5, 139, "#141618ff"], [144, 1, "#131517ff"], [145, 1, "#16181aff"], [146, 1, "#191c1eff"], [147, 1, "#2a2e30ff"], [148, 1, "#202325ff"], [149, 1, "#1f2124ff"]], "31": [[0, 2, "#1f2124ff"], [2, 1, "#212326ff"], [3, 1, "#27292dff"], [4, 1, "#2b2e30ff"], [5, 139, "#2c2f32ff"], [144, 1, "#2d3033ff"], [145, 1, "#2b2e31ff"], [146, 1, "#262a2cff"], [147, 1, "#212326ff"], [148, 2, "#1f2124ff"]]}, "size": [150, 32], "state": {"flags": 4, "group": "Disabled", "line_width": 6, "name": "disabled"}}, +{"background": "#202326ff", "cols": {"10": [[0, 2, "#202326ff"], [2, 1, "#4c4e51ff"], [3, 14, "#292c30ff"], [17, 1, "#4c4e51ff"], [18, 2, "#202326ff"]], "2": [[0, 3, "#202326ff"], [3, 1, "#212427ff"], [4, 1, "#34373aff"], [5, 1, "#444648ff"], [6, 1, "#4c4d50ff"], [7, 6, "#4c4e51ff"], [13, 1, "#4c4d50ff"], [14, 1, "#444648ff"], [15, 1, "#34373aff"], [16, 1, "#212427ff"], [17, 3, "#202326ff"]], "3": [[0, 2, "#202326ff"], [2, 1, "#212427ff"], [3, 1, "#404345ff"], [4, 1, "#404245ff"], [5, 1, "#303237ff"], [6, 1, "#2a2d31ff"], [7, 6, "#292c30ff"], [13, 1, "#2a2d31ff"], [14, 1, "#303237ff"], [15, 1, "#404245ff"], [16, 1, "#404345ff"], [17, 1, "#212427ff"], [18, 2, "#202326ff"]], "8": [[0, 2, "#202326ff"], [2, 1, "#4c4e51ff"], [3, 14, "#292c30ff"], [17, 1, "#4c4e51ff"], [18, 2, "#202326ff"]]}, "control": "PE_IndicatorCheckBox", "id": "check_box.off", "rows": {"10": [[0, 2, "#202326ff"], [2, 1, "#4c4e51ff"], [3, 14, "#292c30ff"], [17, 1, "#4c4e51ff"], [18, 2, "#202326ff"]], "12": [[0, 2, "#202326ff"], [2, 1, "#4c4e51ff"], [3, 14, "#292c30ff"], [17, 1, "#4c4e51ff"], [18, 2, "#202326ff"]], "2": [[0, 3, "#202326ff"], [3, 1, "#212427ff"], [4, 1, "#34373aff"], [5, 1, "#444648ff"], [6, 1, "#4c4d50ff"], [7, 6, "#4c4e51ff"], [13, 1, "#4c4d50ff"], [14, 1, "#444648ff"], [15, 1, "#34363aff"], [16, 1, "#212427ff"], [17, 3, "#202326ff"]], "3": [[0, 2, "#202326ff"], [2, 1, "#212427ff"], [3, 1, "#404345ff"], [4, 1, "#404245ff"], [5, 1, "#303237ff"], [6, 1, "#2a2d31ff"], [7, 6, "#292c30ff"], [13, 1, "#2a2d31ff"], [14, 1, "#303237ff"], [15, 1, "#404245ff"], [16, 1, "#404345ff"], [17, 1, "#212427ff"], [18, 2, "#202326ff"]], "8": [[0, 2, "#202326ff"], [2, 1, "#4c4e51ff"], [3, 14, "#292c30ff"], [17, 1, "#4c4e51ff"], [18, 2, "#202326ff"]]}, "size": [20, 20], "state": {"flags": 8, "group": "Active", "name": "off"}}, +{"background": "#202326ff", "cols": {"10": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 6, "#2f5368ff"], [9, 1, "#416275ff"], [10, 1, "#d9dfe3ff"], [11, 1, "#fcfcfcff"], [12, 1, "#d9dfe3ff"], [13, 1, "#416275ff"], [14, 3, "#2f5368ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]], "2": [[0, 3, "#202326ff"], [3, 1, "#22272cff"], [4, 1, "#3484aeff"], [5, 1, "#3da9e1ff"], [6, 1, "#3daee8ff"], [7, 6, "#3daee9ff"], [13, 1, "#3daee8ff"], [14, 1, "#3da9e1ff"], [15, 1, "#3484aeff"], [16, 1, "#22272cff"], [17, 3, "#202326ff"]], "3": [[0, 2, "#202326ff"], [2, 1, "#22272cff"], [3, 2, "#3ba4daff"], [5, 1, "#337296ff"], [6, 1, "#2f576dff"], [7, 6, "#2f5368ff"], [13, 1, "#2f576dff"], [14, 1, "#337296ff"], [15, 2, "#3ba4daff"], [17, 1, "#22272cff"], [18, 2, "#202326ff"]], "8": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 7, "#2f5368ff"], [10, 1, "#416275ff"], [11, 1, "#e9eceeff"], [12, 1, "#fcfcfcff"], [13, 1, "#dae0e4ff"], [14, 1, "#426376ff"], [15, 2, "#2f5368ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]]}, "control": "PE_IndicatorCheckBox", "id": "check_box.on", "rows": {"10": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 1, "#2f5368ff"], [4, 1, "#426376ff"], [5, 1, "#dae0e4ff"], [6, 1, "#fcfcfcff"], [7, 1, "#d9dfe3ff"], [8, 2, "#416275ff"], [10, 1, "#d9dfe3ff"], [11, 1, "#fcfcfcff"], [12, 1, "#d9dfe3ff"], [13, 1, "#416275ff"], [14, 3, "#2f5368ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]], "12": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 3, "#2f5368ff"], [6, 1, "#416275ff"], [7, 1, "#d9dfe3ff"], [8, 2, "#fcfcfcff"], [10, 1, "#d9dfe3ff"], [11, 1, "#416275ff"], [12, 5, "#2f5368ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]], "2": [[0, 3, "#202326ff"], [3, 1, "#22272cff"], [4, 1, "#3484aeff"], [5, 1, "#3da9e1ff"], [6, 1, "#3daee8ff"], [7, 6, "#3daee9ff"], [13, 1, "#3daee8ff"], [14, 1, "#3da9e1ff"], [15, 1, "#3582adff"], [16, 1, "#22272cff"], [17, 3, "#202326ff"]], "3": [[0, 2, "#202326ff"], [2, 1, "#22272cff"], [3, 2, "#3ba4daff"], [5, 1, "#337296ff"], [6, 1, "#2f576dff"], [7, 6, "#2f5368ff"], [13, 1, "#2f576dff"], [14, 1, "#337296ff"], [15, 1, "#3ba3daff"], [16, 1, "#3ba4daff"], [17, 1, "#22272cff"], [18, 2, "#202326ff"]], "8": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 2, "#2f5368ff"], [5, 2, "#426376ff"], [7, 4, "#2f5368ff"], [11, 1, "#416275ff"], [12, 1, "#d9dfe3ff"], [13, 1, "#fcfcfcff"], [14, 1, "#d9dfe3ff"], [15, 1, "#416275ff"], [16, 1, "#2f5368ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]]}, "size": [20, 20], "state": {"flags": 32, "group": "Active", "name": "on"}}, +{"background": "#202326ff", "cols": {"10": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 6, "#2f5368ff"], [9, 2, "#fcfcfcff"], [11, 6, "#2f5368ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]], "2": [[0, 3, "#202326ff"], [3, 1, "#22272cff"], [4, 1, "#3484aeff"], [5, 1, "#3da9e1ff"], [6, 1, "#3daee8ff"], [7, 6, "#3daee9ff"], [13, 1, "#3daee8ff"], [14, 1, "#3da9e1ff"], [15, 1, "#3484aeff"], [16, 1, "#22272cff"], [17, 3, "#202326ff"]], "3": [[0, 2, "#202326ff"], [2, 1, "#22272cff"], [3, 2, "#3ba4daff"], [5, 1, "#337296ff"], [6, 1, "#2f576dff"], [7, 6, "#2f5368ff"], [13, 1, "#2f576dff"], [14, 1, "#337296ff"], [15, 2, "#3ba4daff"], [17, 1, "#22272cff"], [18, 2, "#202326ff"]], "8": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 14, "#2f5368ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]]}, "control": "PE_IndicatorCheckBox", "id": "check_box.partial", "rows": {"10": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 2, "#2f5368ff"], [5, 2, "#fcfcfcff"], [7, 2, "#2f5368ff"], [9, 2, "#fcfcfcff"], [11, 2, "#2f5368ff"], [13, 2, "#fcfcfcff"], [15, 2, "#2f5368ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]], "12": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 14, "#2f5368ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]], "2": [[0, 3, "#202326ff"], [3, 1, "#22272cff"], [4, 1, "#3484aeff"], [5, 1, "#3da9e1ff"], [6, 1, "#3daee8ff"], [7, 6, "#3daee9ff"], [13, 1, "#3daee8ff"], [14, 1, "#3da9e1ff"], [15, 1, "#3582adff"], [16, 1, "#22272cff"], [17, 3, "#202326ff"]], "3": [[0, 2, "#202326ff"], [2, 1, "#22272cff"], [3, 2, "#3ba4daff"], [5, 1, "#337296ff"], [6, 1, "#2f576dff"], [7, 6, "#2f5368ff"], [13, 1, "#2f576dff"], [14, 1, "#337296ff"], [15, 1, "#3ba3daff"], [16, 1, "#3ba4daff"], [17, 1, "#22272cff"], [18, 2, "#202326ff"]], "8": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 14, "#2f5368ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]]}, "size": [20, 20], "state": {"flags": 16, "group": "Active", "name": "partial"}}, +{"background": "#202326ff", "cols": {"10": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 14, "#292c30ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]], "2": [[0, 3, "#202326ff"], [3, 1, "#22262aff"], [4, 1, "#386c87ff"], [5, 1, "#3f99c8ff"], [6, 1, "#3dade6ff"], [7, 6, "#3daee9ff"], [13, 1, "#3dade6ff"], [14, 1, "#3f99c8ff"], [15, 1, "#386c87ff"], [16, 1, "#22262aff"], [17, 3, "#202326ff"]], "3": [[0, 2, "#202326ff"], [2, 1, "#22262aff"], [3, 1, "#3e8fbaff"], [4, 1, "#3e8bb3ff"], [5, 1, "#334a5aff"], [6, 1, "#2a3035ff"], [7, 6, "#292c30ff"], [13, 1, "#2a3035ff"], [14, 1, "#334a5aff"], [15, 1, "#3e8bb3ff"], [16, 1, "#3e8fbaff"], [17, 1, "#22262aff"], [18, 2, "#202326ff"]], "8": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 14, "#292c30ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]]}, "control": "PE_IndicatorCheckBox", "id": "check_box.hover_off", "rows": {"10": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 14, "#292c30ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]], "12": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 14, "#292c30ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]], "2": [[0, 3, "#202326ff"], [3, 1, "#22262aff"], [4, 1, "#386c87ff"], [5, 1, "#3f99c8ff"], [6, 1, "#3dade6ff"], [7, 6, "#3daee9ff"], [13, 1, "#3dade6ff"], [14, 1, "#3f99c8ff"], [15, 1, "#386a87ff"], [16, 1, "#22262aff"], [17, 3, "#202326ff"]], "3": [[0, 2, "#202326ff"], [2, 1, "#22262aff"], [3, 1, "#3e8fbaff"], [4, 1, "#3e8bb3ff"], [5, 1, "#334a5aff"], [6, 1, "#2a3035ff"], [7, 6, "#292c30ff"], [13, 1, "#2a3035ff"], [14, 1, "#334a5aff"], [15, 1, "#3e8bb3ff"], [16, 1, "#3e8fbaff"], [17, 1, "#22262aff"], [18, 2, "#202326ff"]], "8": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 14, "#292c30ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]]}, "size": [20, 20], "state": {"flags": 8200, "group": "Active", "name": "hover_off"}}, +{"background": "#202326ff", "cols": {"10": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 6, "#2f5368ff"], [9, 1, "#416275ff"], [10, 1, "#d9dfe3ff"], [11, 1, "#fcfcfcff"], [12, 1, "#d9dfe3ff"], [13, 1, "#416275ff"], [14, 3, "#2f5368ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]], "2": [[0, 3, "#202326ff"], [3, 1, "#22272cff"], [4, 1, "#3484aeff"], [5, 1, "#3da9e1ff"], [6, 1, "#3daee8ff"], [7, 6, "#3daee9ff"], [13, 1, "#3daee8ff"], [14, 1, "#3da9e1ff"], [15, 1, "#3484aeff"], [16, 1, "#22272cff"], [17, 3, "#202326ff"]], "3": [[0, 2, "#202326ff"], [2, 1, "#22272cff"], [3, 2, "#3ba4daff"], [5, 1, "#337296ff"], [6, 1, "#2f576dff"], [7, 6, "#2f5368ff"], [13, 1, "#2f576dff"], [14, 1, "#337296ff"], [15, 2, "#3ba4daff"], [17, 1, "#22272cff"], [18, 2, "#202326ff"]], "8": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 7, "#2f5368ff"], [10, 1, "#416275ff"], [11, 1, "#e9eceeff"], [12, 1, "#fcfcfcff"], [13, 1, "#dae0e4ff"], [14, 1, "#426376ff"], [15, 2, "#2f5368ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]]}, "control": "PE_IndicatorCheckBox", "id": "check_box.focus_on", "rows": {"10": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 1, "#2f5368ff"], [4, 1, "#426376ff"], [5, 1, "#dae0e4ff"], [6, 1, "#fcfcfcff"], [7, 1, "#d9dfe3ff"], [8, 2, "#416275ff"], [10, 1, "#d9dfe3ff"], [11, 1, "#fcfcfcff"], [12, 1, "#d9dfe3ff"], [13, 1, "#416275ff"], [14, 3, "#2f5368ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]], "12": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 3, "#2f5368ff"], [6, 1, "#416275ff"], [7, 1, "#d9dfe3ff"], [8, 2, "#fcfcfcff"], [10, 1, "#d9dfe3ff"], [11, 1, "#416275ff"], [12, 5, "#2f5368ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]], "2": [[0, 3, "#202326ff"], [3, 1, "#22272cff"], [4, 1, "#3484aeff"], [5, 1, "#3da9e1ff"], [6, 1, "#3daee8ff"], [7, 6, "#3daee9ff"], [13, 1, "#3daee8ff"], [14, 1, "#3da9e1ff"], [15, 1, "#3582adff"], [16, 1, "#22272cff"], [17, 3, "#202326ff"]], "3": [[0, 2, "#202326ff"], [2, 1, "#22272cff"], [3, 2, "#3ba4daff"], [5, 1, "#337296ff"], [6, 1, "#2f576dff"], [7, 6, "#2f5368ff"], [13, 1, "#2f576dff"], [14, 1, "#337296ff"], [15, 1, "#3ba3daff"], [16, 1, "#3ba4daff"], [17, 1, "#22272cff"], [18, 2, "#202326ff"]], "8": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 2, "#2f5368ff"], [5, 2, "#426376ff"], [7, 4, "#2f5368ff"], [11, 1, "#416275ff"], [12, 1, "#d9dfe3ff"], [13, 1, "#fcfcfcff"], [14, 1, "#d9dfe3ff"], [15, 1, "#416275ff"], [16, 1, "#2f5368ff"], [17, 1, "#3daee9ff"], [18, 2, "#202326ff"]]}, "size": [20, 20], "state": {"flags": 8388896, "group": "Active", "name": "focus_on"}}, +{"background": "#202326ff", "cols": {"10": [[0, 2, "#202326ff"], [2, 1, "#4c4e51ff"], [3, 14, "#25282cff"], [17, 1, "#4c4e51ff"], [18, 2, "#202326ff"]], "2": [[0, 3, "#202326ff"], [3, 1, "#212427ff"], [4, 1, "#34373aff"], [5, 1, "#444548ff"], [6, 1, "#4c4d50ff"], [7, 6, "#4c4e51ff"], [13, 1, "#4c4d50ff"], [14, 1, "#444548ff"], [15, 1, "#34373aff"], [16, 1, "#212427ff"], [17, 3, "#202326ff"]], "3": [[0, 2, "#202326ff"], [2, 1, "#212427ff"], [3, 1, "#3f4245ff"], [4, 1, "#3f4144ff"], [5, 1, "#2d2f33ff"], [6, 1, "#26292dff"], [7, 6, "#25282cff"], [13, 1, "#26292dff"], [14, 1, "#2d2f33ff"], [15, 1, "#3f4144ff"], [16, 1, "#3f4245ff"], [17, 1, "#212427ff"], [18, 2, "#202326ff"]], "8": [[0, 2, "#202326ff"], [2, 1, "#4c4e51ff"], [3, 14, "#25282cff"], [17, 1, "#4c4e51ff"], [18, 2, "#202326ff"]]}, "control": "PE_IndicatorCheckBox", "id": "check_box.pressed_off", "rows": {"10": [[0, 2, "#202326ff"], [2, 1, "#4c4e51ff"], [3, 14, "#25282cff"], [17, 1, "#4c4e51ff"], [18, 2, "#202326ff"]], "12": [[0, 2, "#202326ff"], [2, 1, "#4c4e51ff"], [3, 14, "#25282cff"], [17, 1, "#4c4e51ff"], [18, 2, "#202326ff"]], "2": [[0, 3, "#202326ff"], [3, 1, "#212427ff"], [4, 1, "#34373aff"], [5, 1, "#444548ff"], [6, 1, "#4c4d50ff"], [7, 6, "#4c4e51ff"], [13, 1, "#4c4d50ff"], [14, 1, "#444548ff"], [15, 1, "#33363aff"], [16, 1, "#212427ff"], [17, 3, "#202326ff"]], "3": [[0, 2, "#202326ff"], [2, 1, "#212427ff"], [3, 1, "#3f4245ff"], [4, 1, "#3f4144ff"], [5, 1, "#2d2f33ff"], [6, 1, "#26292dff"], [7, 6, "#25282cff"], [13, 1, "#26292dff"], [14, 1, "#2d2f33ff"], [15, 1, "#3f4144ff"], [16, 1, "#3f4245ff"], [17, 1, "#212427ff"], [18, 2, "#202326ff"]], "8": [[0, 2, "#202326ff"], [2, 1, "#4c4e51ff"], [3, 14, "#25282cff"], [17, 1, "#4c4e51ff"], [18, 2, "#202326ff"]]}, "size": [20, 20], "state": {"flags": 12, "group": "Active", "name": "pressed_off"}}, +{"background": "#1f2124ff", "cols": {"10": [[0, 3, "#1f2124ff"], [3, 6, "#24272bff"], [9, 1, "#292c30ff"], [10, 1, "#555859ff"], [11, 1, "#606263ff"], [12, 1, "#555859ff"], [13, 1, "#292c30ff"], [14, 3, "#24272bff"], [17, 3, "#1f2124ff"]], "2": [[0, 4, "#1f2124ff"], [4, 1, "#202225ff"], [5, 1, "#202125ff"], [6, 8, "#1f2124ff"], [14, 1, "#202125ff"], [15, 1, "#202225ff"], [16, 4, "#1f2124ff"]], "3": [[0, 3, "#1f2124ff"], [3, 1, "#1f2225ff"], [4, 1, "#202225ff"], [5, 1, "#222529ff"], [6, 8, "#24272bff"], [14, 1, "#222529ff"], [15, 1, "#202225ff"], [16, 1, "#1f2225ff"], [17, 3, "#1f2124ff"]], "8": [[0, 3, "#1f2124ff"], [3, 7, "#24272bff"], [10, 1, "#292c30ff"], [11, 1, "#5a5d5eff"], [12, 1, "#606263ff"], [13, 1, "#565859ff"], [14, 1, "#2a2c30ff"], [15, 2, "#24272bff"], [17, 3, "#1f2124ff"]]}, "control": "PE_IndicatorCheckBox", "id": "check_box.disabled_on", "rows": {"10": [[0, 3, "#1f2124ff"], [3, 1, "#24272bff"], [4, 1, "#2a2c30ff"], [5, 1, "#565859ff"], [6, 1, "#606263ff"], [7, 1, "#555859ff"], [8, 2, "#292c30ff"], [10, 1, "#555859ff"], [11, 1, "#606263ff"], [12, 1, "#555859ff"], [13, 1, "#292c30ff"], [14, 3, "#24272bff"], [17, 3, "#1f2124ff"]], "12": [[0, 3, "#1f2124ff"], [3, 3, "#24272bff"], [6, 1, "#292c30ff"], [7, 1, "#555859ff"], [8, 2, "#606263ff"], [10, 1, "#555859ff"], [11, 1, "#292c30ff"], [12, 5, "#24272bff"], [17, 3, "#1f2124ff"]], "2": [[0, 4, "#1f2124ff"], [4, 1, "#202225ff"], [5, 1, "#202125ff"], [6, 8, "#1f2124ff"], [14, 2, "#202125ff"], [16, 4, "#1f2124ff"]], "3": [[0, 3, "#1f2124ff"], [3, 1, "#1f2225ff"], [4, 1, "#202225ff"], [5, 1, "#222529ff"], [6, 8, "#24272bff"], [14, 1, "#222529ff"], [15, 1, "#202224ff"], [16, 1, "#1f2225ff"], [17, 3, "#1f2124ff"]], "8": [[0, 3, "#1f2124ff"], [3, 2, "#24272bff"], [5, 2, "#2a2c30ff"], [7, 4, "#24272bff"], [11, 1, "#292c30ff"], [12, 1, "#555859ff"], [13, 1, "#606263ff"], [14, 1, "#555859ff"], [15, 1, "#292c30ff"], [16, 1, "#24272bff"], [17, 3, "#1f2124ff"]]}, "size": [20, 20], "state": {"flags": 32, "group": "Disabled", "name": "disabled_on"}}, +{"background": "#202326ff", "cols": {"10": [[0, 2, "#202326ff"], [2, 1, "#4a4c4fff"], [3, 1, "#2b2e32ff"], [4, 12, "#292c30ff"], [16, 1, "#2b2e32ff"], [17, 1, "#4a4c4fff"], [18, 2, "#202326ff"]]}, "control": "PE_IndicatorRadioButton", "id": "radio_button.off", "rows": {"10": [[0, 2, "#202326ff"], [2, 1, "#4a4c4fff"], [3, 1, "#2b2e32ff"], [4, 12, "#292c30ff"], [16, 1, "#2b2e32ff"], [17, 1, "#4a4c4fff"], [18, 2, "#202326ff"]], "3": [[0, 5, "#202326ff"], [5, 1, "#383b3eff"], [6, 1, "#474a4dff"], [7, 1, "#393c40ff"], [8, 1, "#303236ff"], [9, 2, "#2b2e32ff"], [11, 1, "#303236ff"], [12, 1, "#393c40ff"], [13, 1, "#474a4dff"], [14, 1, "#383b3eff"], [15, 5, "#202326ff"]]}, "size": [20, 20], "state": {"flags": 8, "group": "Active", "name": "off"}}, +{"background": "#202326ff", "cols": {"10": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 1, "#305d74ff"], [4, 3, "#2f5368ff"], [7, 1, "#e8eceeff"], [8, 4, "#fcfcfcff"], [12, 1, "#e8ebedff"], [13, 3, "#2f5368ff"], [16, 1, "#305d74ff"], [17, 1, "#3daee8ff"], [18, 2, "#202326ff"]]}, "control": "PE_IndicatorRadioButton", "id": "radio_button.on", "rows": {"10": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 1, "#305d74ff"], [4, 3, "#2f5368ff"], [7, 1, "#e8eceeff"], [8, 4, "#fcfcfcff"], [12, 1, "#e8ebedff"], [13, 3, "#2f5368ff"], [16, 1, "#305d74ff"], [17, 1, "#3daee8ff"], [18, 2, "#202326ff"]], "3": [[0, 4, "#202326ff"], [4, 1, "#20272cff"], [5, 1, "#3790c1ff"], [6, 1, "#3dace6ff"], [7, 1, "#3994c5ff"], [8, 1, "#337092ff"], [9, 2, "#305d74ff"], [11, 1, "#337092ff"], [12, 1, "#3994c5ff"], [13, 1, "#3dace6ff"], [14, 1, "#3790c1ff"], [15, 1, "#20272cff"], [16, 4, "#202326ff"]]}, "size": [20, 20], "state": {"flags": 32, "group": "Active", "name": "on"}}, +{"background": "#202326ff", "cols": {"10": [[0, 2, "#202326ff"], [2, 1, "#3daae2ff"], [3, 1, "#2c353bff"], [4, 12, "#292c30ff"], [16, 1, "#2c353bff"], [17, 1, "#3ea9e1ff"], [18, 2, "#202326ff"]]}, "control": "PE_IndicatorRadioButton", "id": "radio_button.hover_off", "rows": {"10": [[0, 2, "#202326ff"], [2, 1, "#3daae2ff"], [3, 1, "#2c353bff"], [4, 12, "#292c30ff"], [16, 1, "#2c353bff"], [17, 1, "#3ea9e1ff"], [18, 2, "#202326ff"]], "3": [[0, 4, "#202326ff"], [4, 1, "#202529ff"], [5, 1, "#3b789aff"], [6, 1, "#3ea2d7ff"], [7, 1, "#3b7290ff"], [8, 1, "#324856ff"], [9, 2, "#2c353bff"], [11, 1, "#324856ff"], [12, 1, "#3b7290ff"], [13, 1, "#3ea2d7ff"], [14, 1, "#3b789aff"], [15, 1, "#202529ff"], [16, 4, "#202326ff"]]}, "size": [20, 20], "state": {"flags": 8200, "group": "Active", "name": "hover_off"}}, +{"background": "#202326ff", "cols": {"10": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 1, "#305d74ff"], [4, 3, "#2f5368ff"], [7, 1, "#e8eceeff"], [8, 4, "#fcfcfcff"], [12, 1, "#e8ebedff"], [13, 3, "#2f5368ff"], [16, 1, "#305d74ff"], [17, 1, "#3daee8ff"], [18, 2, "#202326ff"]]}, "control": "PE_IndicatorRadioButton", "id": "radio_button.focus_on", "rows": {"10": [[0, 2, "#202326ff"], [2, 1, "#3daee9ff"], [3, 1, "#305d74ff"], [4, 3, "#2f5368ff"], [7, 1, "#e8eceeff"], [8, 4, "#fcfcfcff"], [12, 1, "#e8ebedff"], [13, 3, "#2f5368ff"], [16, 1, "#305d74ff"], [17, 1, "#3daee8ff"], [18, 2, "#202326ff"]], "3": [[0, 4, "#202326ff"], [4, 1, "#20272cff"], [5, 1, "#3790c1ff"], [6, 1, "#3dace6ff"], [7, 1, "#3994c5ff"], [8, 1, "#337092ff"], [9, 2, "#305d74ff"], [11, 1, "#337092ff"], [12, 1, "#3994c5ff"], [13, 1, "#3dace6ff"], [14, 1, "#3790c1ff"], [15, 1, "#20272cff"], [16, 4, "#202326ff"]]}, "size": [20, 20], "state": {"flags": 8388896, "group": "Active", "name": "focus_on"}}, +{"background": "#1f2124ff", "cols": {"10": [[0, 2, "#1f2124ff"], [2, 1, "#202124ff"], [3, 4, "#24272bff"], [7, 1, "#5a5d5eff"], [8, 4, "#606263ff"], [12, 1, "#5b5c5dff"], [13, 4, "#24272bff"], [17, 3, "#1f2124ff"]]}, "control": "PE_IndicatorRadioButton", "id": "radio_button.disabled_on", "rows": {"10": [[0, 2, "#1f2124ff"], [2, 1, "#202124ff"], [3, 4, "#24272bff"], [7, 1, "#5a5d5eff"], [8, 4, "#606263ff"], [12, 1, "#5b5c5dff"], [13, 4, "#24272bff"], [17, 3, "#1f2124ff"]], "3": [[0, 6, "#1f2124ff"], [6, 1, "#1e2124ff"], [7, 1, "#212326ff"], [8, 1, "#242528ff"], [9, 2, "#24272bff"], [11, 1, "#242528ff"], [12, 1, "#212326ff"], [13, 1, "#1e2124ff"], [14, 6, "#1f2124ff"]]}, "size": [20, 20], "state": {"flags": 32, "group": "Disabled", "name": "disabled_on"}}, +{"background": "#202326ff", "cols": {"0": [[0, 32, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#2a2e31ff"], [4, 1, "#434649ff"], [5, 1, "#4e5154ff"], [6, 20, "#535659ff"], [26, 1, "#4e5154ff"], [27, 1, "#424549ff"], [28, 1, "#292c2fff"], [29, 1, "#1f2225ff"], [30, 2, "#202326ff"]], "140": [[0, 1, "#202326ff"], [1, 1, "#535659ff"], [2, 13, "#292c30ff"], [15, 1, "#585a5dff"], [16, 1, "#cfd0d1ff"], [17, 1, "#585a5dff"], [18, 12, "#292c30ff"], [30, 1, "#535659ff"], [31, 1, "#1c1f21ff"]], "40": [[0, 1, "#202326ff"], [1, 1, "#535659ff"], [2, 28, "#292c30ff"], [30, 1, "#535659ff"], [31, 1, "#1c1f21ff"]]}, "control": "CC_ComboBox", "id": "combo_box.normal", "rows": {"0": [[0, 150, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#2a2e31ff"], [4, 1, "#434649ff"], [5, 1, "#4e5154ff"], [6, 138, "#535659ff"], [144, 1, "#4e5154ff"], [145, 1, "#434649ff"], [146, 1, "#2a2e31ff"], [147, 3, "#202326ff"]], "16": [[0, 1, "#202326ff"], [1, 1, "#535659ff"], [2, 132, "#292c30ff"], [134, 1, "#585a5dff"], [135, 1, "#cfd0d1ff"], [136, 1, "#585a5dff"], [137, 2, "#292c30ff"], [139, 1, "#585a5dff"], [140, 1, "#cfd0d1ff"], [141, 1, "#585a5dff"], [142, 6, "#292c30ff"], [148, 1, "#535659ff"], [149, 1, "#202326ff"]], "31": [[0, 3, "#202326ff"], [3, 1, "#1f2225ff"], [4, 1, "#1d2023ff"], [5, 1, "#1c1f22ff"], [6, 138, "#1c1f21ff"], [144, 1, "#1c1f22ff"], [145, 1, "#1d2023ff"], [146, 1, "#1f2225ff"], [147, 3, "#202326ff"]]}, "size": [150, 32], "state": {"editable": false, "flags": 0, "group": "Active", "name": "normal"}}, +{"background": "#202326ff", "cols": {"0": [[0, 32, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#254150ff"], [4, 1, "#3482acff"], [5, 1, "#3aa0d5ff"], [6, 20, "#3daee9ff"], [26, 1, "#3aa0d5ff"], [27, 1, "#3381acff"], [28, 1, "#243f4eff"], [29, 1, "#1f2225ff"], [30, 2, "#202326ff"]], "140": [[0, 1, "#202326ff"], [1, 1, "#3daee9ff"], [2, 13, "#292c30ff"], [15, 1, "#585a5dff"], [16, 1, "#cfd0d1ff"], [17, 1, "#585a5dff"], [18, 12, "#292c30ff"], [30, 1, "#3daee9ff"], [31, 1, "#1c1f21ff"]], "40": [[0, 1, "#202326ff"], [1, 1, "#3daee9ff"], [2, 28, "#292c30ff"], [30, 1, "#3daee9ff"], [31, 1, "#1c1f21ff"]]}, "control": "CC_ComboBox", "id": "combo_box.hover", "rows": {"0": [[0, 150, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#254150ff"], [4, 1, "#3482acff"], [5, 1, "#3aa0d5ff"], [6, 138, "#3daee9ff"], [144, 1, "#3aa0d5ff"], [145, 1, "#3482acff"], [146, 1, "#254150ff"], [147, 3, "#202326ff"]], "16": [[0, 1, "#202326ff"], [1, 1, "#3daee9ff"], [2, 132, "#292c30ff"], [134, 1, "#585a5dff"], [135, 1, "#cfd0d1ff"], [136, 1, "#585a5dff"], [137, 2, "#292c30ff"], [139, 1, "#585a5dff"], [140, 1, "#cfd0d1ff"], [141, 1, "#585a5dff"], [142, 6, "#292c30ff"], [148, 1, "#3daee9ff"], [149, 1, "#202326ff"]], "31": [[0, 3, "#202326ff"], [3, 1, "#1f2225ff"], [4, 1, "#1d2023ff"], [5, 1, "#1c1f22ff"], [6, 138, "#1c1f21ff"], [144, 1, "#1c1f22ff"], [145, 1, "#1d2023ff"], [146, 1, "#1f2225ff"], [147, 3, "#202326ff"]]}, "size": [150, 32], "state": {"editable": false, "flags": 8192, "group": "Active", "name": "hover"}}, +{"background": "#202326ff", "cols": {"0": [[0, 32, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#254150ff"], [4, 1, "#3482acff"], [5, 1, "#3aa0d5ff"], [6, 20, "#3daee9ff"], [26, 1, "#3aa0d5ff"], [27, 1, "#3381acff"], [28, 1, "#243f4eff"], [29, 1, "#1f2225ff"], [30, 2, "#202326ff"]], "140": [[0, 1, "#202326ff"], [1, 1, "#3daee9ff"], [2, 13, "#292c30ff"], [15, 1, "#606265ff"], [16, 1, "#ececedff"], [17, 1, "#606265ff"], [18, 12, "#292c30ff"], [30, 1, "#3daee9ff"], [31, 1, "#1c1f21ff"]], "40": [[0, 1, "#202326ff"], [1, 1, "#3daee9ff"], [2, 28, "#292c30ff"], [30, 1, "#3daee9ff"], [31, 1, "#1c1f21ff"]]}, "control": "CC_ComboBox", "id": "combo_box.focus", "rows": {"0": [[0, 150, "#202326ff"]], "1": [[0, 3, "#202326ff"], [3, 1, "#254150ff"], [4, 1, "#3482acff"], [5, 1, "#3aa0d5ff"], [6, 138, "#3daee9ff"], [144, 1, "#3aa0d5ff"], [145, 1, "#3482acff"], [146, 1, "#254150ff"], [147, 3, "#202326ff"]], "16": [[0, 1, "#202326ff"], [1, 1, "#3daee9ff"], [2, 132, "#292c30ff"], [134, 1, "#606265ff"], [135, 1, "#ececedff"], [136, 1, "#606265ff"], [137, 2, "#292c30ff"], [139, 1, "#606265ff"], [140, 1, "#ececedff"], [141, 1, "#606265ff"], [142, 6, "#292c30ff"], [148, 1, "#3daee9ff"], [149, 1, "#202326ff"]], "31": [[0, 3, "#202326ff"], [3, 1, "#1f2225ff"], [4, 1, "#1d2023ff"], [5, 1, "#1c1f22ff"], [6, 138, "#1c1f21ff"], [144, 1, "#1c1f22ff"], [145, 1, "#1d2023ff"], [146, 1, "#1f2225ff"], [147, 3, "#202326ff"]]}, "size": [150, 32], "state": {"editable": false, "flags": 8388864, "group": "Active", "name": "focus"}}, +{"background": "#202326ff", "cols": {"0": [[0, 2, "#202326ff"], [2, 1, "#272a2cff"], [3, 1, "#3b3d40ff"], [4, 1, "#484a4cff"], [5, 21, "#4c4e51ff"], [26, 1, "#4b4d51ff"], [27, 1, "#48494cff"], [28, 1, "#3a3d40ff"], [29, 1, "#26292cff"], [30, 2, "#202326ff"]], "1": [[0, 1, "#202326ff"], [1, 1, "#272a2cff"], [2, 1, "#44474aff"], [3, 1, "#232427ff"], [4, 1, "#191b1eff"], [5, 22, "#141618ff"], [27, 1, "#191c1eff"], [28, 1, "#222426ff"], [29, 1, "#45474aff"], [30, 1, "#25282cff"], [31, 1, "#202326ff"]], "140": [[0, 1, "#4c4e51ff"], [1, 14, "#141618ff"], [15, 1, "#494a4cff"], [16, 1, "#cccdceff"], [17, 1, "#494a4cff"], [18, 12, "#141618ff"], [30, 1, "#151719ff"], [31, 1, "#4b4d50ff"]], "40": [[0, 1, "#4c4e51ff"], [1, 29, "#141618ff"], [30, 1, "#151719ff"], [31, 1, "#4b4d50ff"]]}, "control": "CC_ComboBox", "id": "combo_box.editable", "rows": {"0": [[0, 2, "#202326ff"], [2, 1, "#272a2cff"], [3, 1, "#3b3d40ff"], [4, 1, "#484a4cff"], [5, 139, "#4c4e51ff"], [144, 1, "#4b4d50ff"], [145, 1, "#48494cff"], [146, 1, "#3a3d40ff"], [147, 1, "#26292cff"], [148, 2, "#202326ff"]], "1": [[0, 1, "#202326ff"], [1, 1, "#272a2cff"], [2, 1, "#44474aff"], [3, 1, "#222426ff"], [4, 1, "#191b1eff"], [5, 140, "#141618ff"], [145, 1, "#191c1eff"], [146, 1, "#232426ff"], [147, 1, "#44484aff"], [148, 1, "#26282cff"], [149, 1, "#202326ff"]], "16": [[0, 1, "#4c4e51ff"], [1, 133, "#141618ff"], [134, 1, "#494a4cff"], [135, 1, "#cccdceff"], [136, 1, "#494a4cff"], [137, 2, "#141618ff"], [139, 1, "#494a4cff"], [140, 1, "#cccdceff"], [141, 1, "#494a4cff"], [142, 6, "#141618ff"], [148, 1, "#151719ff"], [149, 1, "#4b4d50ff"]], "31": [[0, 2, "#202326ff"], [2, 1, "#26292cff"], [3, 1, "#3b3d40ff"], [4, 1, "#47484cff"], [5, 140, "#4b4d50ff"], [145, 1, "#46484cff"], [146, 1, "#3a3c3fff"], [147, 1, "#26282bff"], [148, 2, "#202326ff"]]}, "size": [150, 32], "state": {"editable": true, "flags": 0, "group": "Active", "name": "editable"}}, +{"background": "#202326ff", "cols": {"0": [[0, 2, "#202326ff"], [2, 1, "#272a2cff"], [3, 1, "#3b3d40ff"], [4, 1, "#484a4cff"], [5, 21, "#4c4e51ff"], [26, 1, "#4b4d51ff"], [27, 1, "#48494cff"], [28, 1, "#3a3d40ff"], [29, 1, "#26292cff"], [30, 2, "#202326ff"]], "40": [[0, 1, "#4c4e51ff"], [1, 29, "#141618ff"], [30, 1, "#151719ff"], [31, 1, "#4b4d50ff"]], "90": [[0, 1, "#4c4e51ff"], [1, 8, "#141618ff"], [9, 1, "#48494bff"], [10, 1, "#caccccff"], [11, 1, "#48494bff"], [12, 8, "#141618ff"], [20, 1, "#48494bff"], [21, 1, "#caccccff"], [22, 1, "#48494bff"], [23, 7, "#141618ff"], [30, 1, "#151719ff"], [31, 1, "#4b4d50ff"]]}, "control": "CC_SpinBox", "id": "spin_box.normal", "rows": {"0": [[0, 2, "#202326ff"], [2, 1, "#272a2cff"], [3, 1, "#3b3d40ff"], [4, 1, "#484a4cff"], [5, 89, "#4c4e51ff"], [94, 1, "#4b4d50ff"], [95, 1, "#48494cff"], [96, 1, "#3a3d40ff"], [97, 1, "#26292cff"], [98, 2, "#202326ff"]], "16": [[0, 1, "#4c4e51ff"], [1, 97, "#141618ff"], [98, 1, "#151719ff"], [99, 1, "#4b4d50ff"]], "24": [[0, 1, "#4c4e51ff"], [1, 86, "#141618ff"], [87, 2, "#47484aff"], [89, 9, "#141618ff"], [98, 1, "#151719ff"], [99, 1, "#4b4d50ff"]], "31": [[0, 2, "#202326ff"], [2, 1, "#26292cff"], [3, 1, "#3b3d40ff"], [4, 1, "#47484cff"], [5, 90, "#4b4d50ff"], [95, 1, "#46484cff"], [96, 1, "#3a3c3fff"], [97, 1, "#26282bff"], [98, 2, "#202326ff"]], "8": [[0, 1, "#4c4e51ff"], [1, 85, "#141618ff"], [86, 1, "#48494bff"], [87, 2, "#d9dadaff"], [89, 1, "#48494bff"], [90, 8, "#141618ff"], [98, 1, "#151719ff"], [99, 1, "#4b4d50ff"]]}, "size": [100, 32], "state": {"flags": 0, "group": "Active", "name": "normal"}}, +{"background": "#202326ff", "cols": {"0": [[0, 2, "#202326ff"], [2, 1, "#243944ff"], [3, 1, "#327aa0ff"], [4, 1, "#3aa1d6ff"], [5, 21, "#3daee9ff"], [26, 1, "#3cabe6ff"], [27, 1, "#3aa0d5ff"], [28, 1, "#31799fff"], [29, 1, "#243742ff"], [30, 2, "#202326ff"]], "40": [[0, 1, "#3daee9ff"], [1, 29, "#141618ff"], [30, 1, "#15181bff"], [31, 1, "#3cace6ff"]], "90": [[0, 1, "#3daee9ff"], [1, 8, "#141618ff"], [9, 1, "#48494bff"], [10, 1, "#caccccff"], [11, 1, "#48494bff"], [12, 8, "#141618ff"], [20, 1, "#48494bff"], [21, 1, "#caccccff"], [22, 1, "#48494bff"], [23, 7, "#141618ff"], [30, 1, "#15181bff"], [31, 1, "#3cace6ff"]]}, "control": "CC_SpinBox", "id": "spin_box.hover", "rows": {"0": [[0, 2, "#202326ff"], [2, 1, "#243944ff"], [3, 1, "#327aa0ff"], [4, 1, "#3aa1d6ff"], [5, 89, "#3daee9ff"], [94, 1, "#3cabe5ff"], [95, 1, "#3aa0d5ff"], [96, 1, "#31799fff"], [97, 1, "#243742ff"], [98, 2, "#202326ff"]], "16": [[0, 1, "#3daee9ff"], [1, 97, "#141618ff"], [98, 1, "#15181bff"], [99, 1, "#3cace6ff"]], "24": [[0, 1, "#3daee9ff"], [1, 86, "#141618ff"], [87, 2, "#47484aff"], [89, 9, "#141618ff"], [98, 1, "#15181bff"], [99, 1, "#3cace6ff"]], "31": [[0, 2, "#202326ff"], [2, 1, "#243641ff"], [3, 1, "#31789dff"], [4, 1, "#399ed3ff"], [5, 89, "#3cace6ff"], [94, 1, "#3caae4ff"], [95, 1, "#399dd2ff"], [96, 1, "#31779dff"], [97, 1, "#24353fff"], [98, 2, "#202326ff"]], "8": [[0, 1, "#3daee9ff"], [1, 85, "#141618ff"], [86, 1, "#48494bff"], [87, 2, "#d9dadaff"], [89, 1, "#48494bff"], [90, 8, "#141618ff"], [98, 1, "#15181bff"], [99, 1, "#3cace6ff"]]}, "size": [100, 32], "state": {"flags": 8192, "group": "Active", "name": "hover"}}, +{"background": "#202326ff", "cols": {"10": [[0, 7, "#202326ff"], [7, 1, "#457c99ff"], [8, 4, "#3584aeff"], [12, 1, "#457c99ff"], [13, 7, "#202326ff"]], "190": [[0, 7, "#202326ff"], [7, 1, "#585a5cff"], [8, 4, "#3e4144ff"], [12, 1, "#585a5cff"], [13, 7, "#202326ff"]], "63": [[0, 1, "#202326ff"], [1, 1, "#515457ff"], [2, 1, "#2b2e32ff"], [3, 14, "#292c30ff"], [17, 1, "#2b2e33ff"], [18, 1, "#515457ff"], [19, 1, "#1e2124ff"]]}, "control": "CC_Slider", "id": "slider.normal", "rows": {"10": [[0, 1, "#45728bff"], [1, 1, "#3585b0ff"], [2, 53, "#3584aeff"], [55, 1, "#51565aff"], [56, 1, "#2b2e32ff"], [57, 14, "#292c30ff"], [71, 1, "#2b2e33ff"], [72, 1, "#515558ff"], [73, 1, "#383b3eff"], [74, 124, "#3e4144ff"], [198, 1, "#424548ff"], [199, 1, "#505355ff"]]}, "size": [200, 20], "state": {"flags": 128, "group": "Active", "handle_rect": [54, 0, 20, 20], "name": "normal", "value": 30}}, +{"background": "#202326ff", "cols": {"10": [[0, 7, "#202326ff"], [7, 1, "#457c99ff"], [8, 4, "#3584aeff"], [12, 1, "#457c99ff"], [13, 7, "#202326ff"]], "190": [[0, 7, "#202326ff"], [7, 1, "#585a5cff"], [8, 4, "#3e4144ff"], [12, 1, "#585a5cff"], [13, 7, "#202326ff"]], "63": [[0, 1, "#202326ff"], [1, 1, "#3ca8e0ff"], [2, 1, "#2a3239ff"], [3, 14, "#292c30ff"], [17, 1, "#2a333aff"], [18, 1, "#3ca8e0ff"], [19, 1, "#1e2124ff"]]}, "control": "CC_Slider", "id": "slider.handle_hover", "rows": {"10": [[0, 1, "#45728bff"], [1, 1, "#3585b0ff"], [2, 53, "#3584aeff"], [55, 1, "#3caae3ff"], [56, 1, "#2a3239ff"], [57, 14, "#292c30ff"], [71, 1, "#2a333aff"], [72, 1, "#3ca9e1ff"], [73, 1, "#383b3eff"], [74, 124, "#3e4144ff"], [198, 1, "#424548ff"], [199, 1, "#505355ff"]]}, "size": [200, 20], "state": {"flags": 8320, "group": "Active", "handle_rect": [54, 0, 20, 20], "name": "handle_hover", "value": 30}}, +{"background": "#202326ff", "cols": {"10": [[0, 7, "#202326ff"], [7, 1, "#457c99ff"], [8, 4, "#3584aeff"], [12, 1, "#457c99ff"], [13, 7, "#202326ff"]], "190": [[0, 7, "#202326ff"], [7, 1, "#585a5cff"], [8, 4, "#3e4144ff"], [12, 1, "#585a5cff"], [13, 7, "#202326ff"]], "63": [[0, 1, "#202326ff"], [1, 1, "#3ca8e0ff"], [2, 1, "#2a3239ff"], [3, 14, "#292c30ff"], [17, 1, "#2a333aff"], [18, 1, "#3ca8e0ff"], [19, 1, "#1e2124ff"]]}, "control": "CC_Slider", "id": "slider.focus", "rows": {"10": [[0, 1, "#45728bff"], [1, 1, "#3585b0ff"], [2, 53, "#3584aeff"], [55, 1, "#3caae3ff"], [56, 1, "#2a3239ff"], [57, 14, "#292c30ff"], [71, 1, "#2a333aff"], [72, 1, "#3ca9e1ff"], [73, 1, "#383b3eff"], [74, 124, "#3e4144ff"], [198, 1, "#424548ff"], [199, 1, "#505355ff"]]}, "size": [200, 20], "state": {"flags": 8388992, "group": "Active", "handle_rect": [54, 0, 20, 20], "name": "focus", "value": 30}}, +{"background": "#1f2124ff", "cols": {"10": [[0, 7, "#1f2124ff"], [7, 1, "#323337ff"], [8, 4, "#2a2b2eff"], [12, 1, "#323337ff"], [13, 7, "#1f2124ff"]], "190": [[0, 7, "#1f2124ff"], [7, 1, "#323337ff"], [8, 4, "#2a2b2eff"], [12, 1, "#323337ff"], [13, 7, "#1f2124ff"]], "63": [[0, 1, "#1f2124ff"], [1, 1, "#35373aff"], [2, 1, "#272b2fff"], [3, 14, "#272a2eff"], [17, 1, "#282b2fff"], [18, 1, "#35373aff"], [19, 1, "#1d1f22ff"]]}, "control": "CC_Slider", "id": "slider.disabled", "rows": {"10": [[0, 1, "#303133ff"], [1, 1, "#2b2c2fff"], [2, 53, "#2a2b2eff"], [55, 1, "#35373aff"], [56, 1, "#272b2fff"], [57, 14, "#272a2eff"], [71, 1, "#282b2fff"], [72, 1, "#35373aff"], [73, 1, "#27272aff"], [74, 124, "#2a2b2eff"], [198, 1, "#2b2c2fff"], [199, 1, "#303133ff"]]}, "size": [200, 20], "state": {"flags": 128, "group": "Disabled", "handle_rect": [54, 0, 20, 20], "name": "disabled", "value": 30}}, +{"background": "#202326ff", "cols": {"0": [[0, 200, "#4c4e50ff"]], "10": [[0, 3, "#202326ff"], [3, 1, "#535457ff"], [4, 1, "#4a4d4fff"], [5, 28, "#46494bff"], [33, 1, "#4a4d4fff"], [34, 1, "#535457ff"], [35, 165, "#202326ff"]]}, "control": "CC_ScrollBar", "id": "scroll_bar.normal", "rows": {"150": [[0, 1, "#4c4e50ff"], [1, 20, "#202326ff"]], "18": [[0, 1, "#4c4e50ff"], [1, 6, "#202326ff"], [7, 1, "#5b5d60ff"], [8, 6, "#46494bff"], [14, 1, "#5b5d60ff"], [15, 6, "#202326ff"]]}, "size": [21, 200], "state": {"active_sub_control": "none", "flags": 0, "group": "Active", "name": "normal", "slider_rect": [0, 3, 21, 32]}}, +{"background": "#202326ff", "cols": {"0": [[0, 200, "#4c4e50ff"]], "10": [[0, 3, "#202326ff"], [3, 1, "#535457ff"], [4, 1, "#4a4d4fff"], [5, 28, "#46494bff"], [33, 1, "#4a4d4fff"], [34, 1, "#535457ff"], [35, 165, "#202326ff"]]}, "control": "CC_ScrollBar", "id": "scroll_bar.hover", "rows": {"150": [[0, 1, "#4c4e50ff"], [1, 20, "#202326ff"]], "18": [[0, 1, "#4c4e50ff"], [1, 6, "#202326ff"], [7, 1, "#5b5d60ff"], [8, 6, "#46494bff"], [14, 1, "#5b5d60ff"], [15, 6, "#202326ff"]]}, "size": [21, 200], "state": {"active_sub_control": "none", "flags": 8192, "group": "Active", "name": "hover", "slider_rect": [0, 3, 21, 32]}}, +{"background": "#202326ff", "cols": {"0": [[0, 200, "#4c4e50ff"]], "10": [[0, 3, "#202326ff"], [3, 1, "#2a5169ff"], [4, 1, "#2f6a8aff"], [5, 28, "#2f6888ff"], [33, 1, "#2f6a8aff"], [34, 1, "#2a5169ff"], [35, 165, "#202326ff"]]}, "control": "CC_ScrollBar", "id": "scroll_bar.slider_hover", "rows": {"150": [[0, 1, "#4c4e50ff"], [1, 20, "#202326ff"]], "18": [[0, 1, "#4c4e50ff"], [1, 6, "#202326ff"], [7, 1, "#2c5a75ff"], [8, 6, "#2f6888ff"], [14, 1, "#2c5a75ff"], [15, 6, "#202326ff"]]}, "size": [21, 200], "state": {"active_sub_control": "SC_ScrollBarSlider", "flags": 8192, "group": "Active", "name": "slider_hover", "slider_rect": [0, 3, 21, 32]}}, +{"background": "#202326ff", "cols": {"0": [[0, 200, "#4c4e50ff"]], "10": [[0, 3, "#202326ff"], [3, 1, "#2a5169ff"], [4, 1, "#2f6a8aff"], [5, 28, "#2f6888ff"], [33, 1, "#2f6a8aff"], [34, 1, "#2a5169ff"], [35, 165, "#202326ff"]]}, "control": "CC_ScrollBar", "id": "scroll_bar.slider_pressed", "rows": {"150": [[0, 1, "#4c4e50ff"], [1, 20, "#202326ff"]], "18": [[0, 1, "#4c4e50ff"], [1, 6, "#202326ff"], [7, 1, "#2c5a75ff"], [8, 6, "#2f6888ff"], [14, 1, "#2c5a75ff"], [15, 6, "#202326ff"]]}, "size": [21, 200], "state": {"active_sub_control": "SC_ScrollBarSlider", "flags": 8196, "group": "Active", "name": "slider_pressed", "slider_rect": [0, 3, 21, 32]}}, +{"background": "#202326ff", "cols": {"150": [[0, 6, "#202326ff"], [6, 1, "#585a5cff"], [7, 4, "#3e4144ff"], [11, 1, "#585a5cff"], [12, 6, "#202326ff"]], "50": [[0, 6, "#202326ff"], [6, 1, "#457c99ff"], [7, 4, "#3584aeff"], [11, 1, "#457c99ff"], [12, 6, "#202326ff"]]}, "control": "CE_ProgressBar", "id": "progress_bar.half", "rows": {"9": [[0, 1, "#45728bff"], [1, 1, "#3585b0ff"], [2, 96, "#3584aeff"], [98, 1, "#3585b0ff"], [99, 1, "#3b6982ff"], [100, 98, "#3e4144ff"], [198, 1, "#424548ff"], [199, 1, "#505355ff"]]}, "size": [200, 18], "state": {"flags": 128, "group": "Active", "name": "half"}}, +{"background": "#202326ff", "cols": {"0": [[0, 100, "#4c4e51ff"]], "1": [[0, 1, "#4c4e51ff"], [1, 98, "#1c1f22ff"], [99, 1, "#4c4e51ff"]], "100": [[0, 1, "#4c4e51ff"], [1, 98, "#1c1f22ff"], [99, 1, "#4c4e51ff"]]}, "control": "PE_PanelMenu+PE_FrameMenu", "id": "menu.panel", "rows": {"0": [[0, 200, "#4c4e51ff"]], "1": [[0, 1, "#4c4e51ff"], [1, 198, "#1c1f22ff"], [199, 1, "#4c4e51ff"]], "50": [[0, 1, "#4c4e51ff"], [1, 198, "#1c1f22ff"], [199, 1, "#4c4e51ff"]]}, "size": [200, 100], "state": {"flags": 0, "group": "Active", "name": "normal"}}, +{"background": "#202326ff", "cols": {"100": [[0, 29, "#202326ff"]], "4": [[0, 29, "#202326ff"]], "5": [[0, 29, "#202326ff"]], "6": [[0, 29, "#202326ff"]]}, "control": "CE_MenuItem", "id": "menu_item.normal", "rows": {"0": [[0, 200, "#202326ff"]], "1": [[0, 200, "#202326ff"]], "14": [[0, 200, "#202326ff"]], "2": [[0, 200, "#202326ff"]], "3": [[0, 200, "#202326ff"]], "4": [[0, 200, "#202326ff"]], "5": [[0, 200, "#202326ff"]]}, "size": [200, 29], "state": {"flags": 0, "group": "Active", "name": "normal", "type": 0}}, +{"background": "#202326ff", "cols": {"100": [[0, 1, "#5abaecff"], [1, 26, "#284c61ff"], [27, 1, "#294d63ff"], [28, 1, "#59b9eaff"]], "4": [[0, 1, "#55addcff"], [1, 1, "#2c576eff"], [2, 25, "#284c61ff"], [27, 1, "#2e5870ff"], [28, 1, "#54acd9ff"]], "5": [[0, 1, "#5abaecff"], [1, 26, "#284c61ff"], [27, 1, "#294d63ff"], [28, 1, "#59b9eaff"]], "6": [[0, 1, "#5abaecff"], [1, 26, "#284c61ff"], [27, 1, "#294d63ff"], [28, 1, "#59b9eaff"]]}, "control": "CE_MenuItem", "id": "menu_item.selected", "rows": {"0": [[0, 2, "#202326ff"], [2, 1, "#293a44ff"], [3, 1, "#4685a7ff"], [4, 1, "#55addcff"], [5, 189, "#5abaecff"], [194, 1, "#5ab8e9ff"], [195, 1, "#54addbff"], [196, 1, "#4584a6ff"], [197, 1, "#283942ff"], [198, 2, "#202326ff"]], "1": [[0, 1, "#202326ff"], [1, 1, "#2a3e48ff"], [2, 1, "#53a9d6ff"], [3, 1, "#356784ff"], [4, 1, "#2c576eff"], [5, 190, "#284c61ff"], [195, 1, "#2d576eff"], [196, 1, "#356884ff"], [197, 1, "#54aad7ff"], [198, 1, "#283c47ff"], [199, 1, "#202326ff"]], "14": [[0, 1, "#5abaecff"], [1, 197, "#284c61ff"], [198, 1, "#294d63ff"], [199, 1, "#59b9eaff"]], "2": [[0, 1, "#293a44ff"], [1, 1, "#53a9d6ff"], [2, 196, "#284c61ff"], [198, 1, "#54aad8ff"], [199, 1, "#283841ff"]], "3": [[0, 1, "#4584a7ff"], [1, 1, "#346783ff"], [2, 196, "#284c61ff"], [198, 1, "#356885ff"], [199, 1, "#4583a5ff"]], "4": [[0, 1, "#55addcff"], [1, 1, "#2c576eff"], [2, 196, "#284c61ff"], [198, 1, "#2e5870ff"], [199, 1, "#54acd9ff"]], "5": [[0, 1, "#5abaecff"], [1, 197, "#284c61ff"], [198, 1, "#294d63ff"], [199, 1, "#59b9eaff"]]}, "size": [200, 29], "state": {"flags": 32768, "group": "Active", "name": "selected", "type": 0}}, +{"background": "#202326ff", "cols": {"100": [[0, 2, "#202326ff"], [2, 1, "#4c4e51ff"], [3, 2, "#202326ff"]], "4": [[0, 2, "#202326ff"], [2, 1, "#4c4e51ff"], [3, 2, "#202326ff"]], "5": [[0, 2, "#202326ff"], [2, 1, "#4c4e51ff"], [3, 2, "#202326ff"]], "6": [[0, 2, "#202326ff"], [2, 1, "#4c4e51ff"], [3, 2, "#202326ff"]]}, "control": "CE_MenuItem", "id": "menu_item.separator", "rows": {"0": [[0, 200, "#202326ff"]], "1": [[0, 200, "#202326ff"]], "2": [[0, 4, "#202326ff"], [4, 193, "#4c4e51ff"], [197, 3, "#202326ff"]], "3": [[0, 200, "#202326ff"]], "4": [[0, 200, "#202326ff"]], "5": [[0, 200, "#00303900"]]}, "size": [200, 5], "state": {"flags": 0, "group": "Active", "name": "separator", "type": 2}}, +{"background": "#202326ff", "cols": {"0": [[0, 2, "#202326ff"], [2, 1, "#2f4b5dff"], [3, 1, "#3d6275ff"], [4, 1, "#46545dff"], [5, 25, "#4c4e51ff"]], "1": [[0, 1, "#202326ff"], [1, 1, "#386f8dff"], [2, 1, "#3eaee8ff"], [3, 1, "#2f3134ff"], [4, 1, "#24282aff"], [5, 25, "#202326ff"]], "40": [[0, 3, "#3daee9ff"], [3, 27, "#202326ff"]], "79": [[0, 2, "#202326ff"], [2, 1, "#2f4b5dff"], [3, 1, "#3e6276ff"], [4, 1, "#46545dff"], [5, 25, "#4c4e51ff"]]}, "control": "CE_TabBarTabShape", "id": "tab.selected", "rows": {"0": [[0, 2, "#202326ff"], [2, 1, "#2f4b5dff"], [3, 1, "#3d8db8ff"], [4, 1, "#3ea4daff"], [5, 70, "#3daee9ff"], [75, 1, "#3ea4daff"], [76, 1, "#3d8db8ff"], [77, 1, "#2f4b5dff"], [78, 2, "#202326ff"]], "1": [[0, 1, "#202326ff"], [1, 1, "#386f8dff"], [2, 1, "#3dade8ff"], [3, 74, "#3daee9ff"], [77, 1, "#3eaee8ff"], [78, 1, "#386f8dff"], [79, 1, "#202326ff"]], "15": [[0, 1, "#4c4e51ff"], [1, 78, "#202326ff"], [79, 1, "#4c4e51ff"]], "2": [[0, 1, "#2f4b5dff"], [1, 1, "#3eaee8ff"], [2, 76, "#3daee9ff"], [78, 1, "#3eaee8ff"], [79, 1, "#2f4b5dff"]], "27": [[0, 1, "#4c4e51ff"], [1, 78, "#202326ff"], [79, 1, "#4c4e51ff"]], "28": [[0, 1, "#4c4e51ff"], [1, 78, "#202326ff"], [79, 1, "#4c4e51ff"]], "29": [[0, 1, "#4c4e51ff"], [1, 78, "#202326ff"], [79, 1, "#4c4e51ff"]], "3": [[0, 1, "#3d6275ff"], [1, 1, "#2f3134ff"], [2, 76, "#202326ff"], [78, 1, "#2f3235ff"], [79, 1, "#3e6276ff"]]}, "size": [80, 30], "state": {"document_mode": false, "flags": 32768, "group": "Active", "name": "selected"}}, +{"background": "#202326ff", "cols": {"0": [[0, 30, "#1b1d20ff"]], "1": [[0, 30, "#1b1d20ff"]], "40": [[0, 30, "#1b1d20ff"]], "79": [[0, 30, "#1b1d20ff"]]}, "control": "CE_TabBarTabShape", "id": "tab.unselected", "rows": {"0": [[0, 80, "#1b1d20ff"]], "1": [[0, 80, "#1b1d20ff"]], "15": [[0, 80, "#1b1d20ff"]], "2": [[0, 80, "#1b1d20ff"]], "27": [[0, 80, "#1b1d20ff"]], "28": [[0, 80, "#1b1d20ff"]], "29": [[0, 80, "#1b1d20ff"]], "3": [[0, 80, "#1b1d20ff"]]}, "size": [80, 30], "state": {"document_mode": false, "flags": 0, "group": "Active", "name": "unselected"}}, +{"background": "#202326ff", "cols": {"0": [[0, 30, "#263f4dff"]], "1": [[0, 30, "#263f4dff"]], "40": [[0, 30, "#263f4dff"]], "79": [[0, 30, "#263f4dff"]]}, "control": "CE_TabBarTabShape", "id": "tab.hover", "rows": {"0": [[0, 80, "#263f4dff"]], "1": [[0, 80, "#263f4dff"]], "15": [[0, 80, "#263f4dff"]], "2": [[0, 80, "#263f4dff"]], "27": [[0, 80, "#263f4dff"]], "28": [[0, 80, "#263f4dff"]], "29": [[0, 80, "#263f4dff"]], "3": [[0, 80, "#263f4dff"]]}, "size": [80, 30], "state": {"document_mode": false, "flags": 8192, "group": "Active", "name": "hover"}}, +{"background": "#202326ff", "cols": {"0": [[0, 2, "#202326ff"], [2, 1, "#2f4b5dff"], [3, 1, "#3d6275ff"], [4, 1, "#46545dff"], [5, 25, "#4c4e51ff"]], "1": [[0, 1, "#202326ff"], [1, 1, "#386f8dff"], [2, 1, "#3eaee8ff"], [3, 1, "#2f3134ff"], [4, 1, "#24282aff"], [5, 25, "#202326ff"]], "40": [[0, 3, "#3daee9ff"], [3, 27, "#202326ff"]], "79": [[0, 2, "#202326ff"], [2, 1, "#2f4b5dff"], [3, 1, "#3e6276ff"], [4, 1, "#46545dff"], [5, 25, "#4c4e51ff"]]}, "control": "CE_TabBarTabShape", "id": "tab.selected.document_mode", "rows": {"0": [[0, 2, "#202326ff"], [2, 1, "#2f4b5dff"], [3, 1, "#3d8db8ff"], [4, 1, "#3ea4daff"], [5, 70, "#3daee9ff"], [75, 1, "#3ea4daff"], [76, 1, "#3d8db8ff"], [77, 1, "#2f4b5dff"], [78, 2, "#202326ff"]], "1": [[0, 1, "#202326ff"], [1, 1, "#386f8dff"], [2, 1, "#3dade8ff"], [3, 74, "#3daee9ff"], [77, 1, "#3eaee8ff"], [78, 1, "#386f8dff"], [79, 1, "#202326ff"]], "15": [[0, 1, "#4c4e51ff"], [1, 78, "#202326ff"], [79, 1, "#4c4e51ff"]], "2": [[0, 1, "#2f4b5dff"], [1, 1, "#3eaee8ff"], [2, 76, "#3daee9ff"], [78, 1, "#3eaee8ff"], [79, 1, "#2f4b5dff"]], "27": [[0, 1, "#4c4e51ff"], [1, 78, "#202326ff"], [79, 1, "#4c4e51ff"]], "28": [[0, 1, "#4c4e51ff"], [1, 78, "#202326ff"], [79, 1, "#4c4e51ff"]], "29": [[0, 1, "#4c4e51ff"], [1, 78, "#202326ff"], [79, 1, "#4c4e51ff"]], "3": [[0, 1, "#3d6275ff"], [1, 1, "#2f3134ff"], [2, 76, "#202326ff"], [78, 1, "#2f3235ff"], [79, 1, "#3e6276ff"]]}, "size": [80, 30], "state": {"document_mode": true, "flags": 32768, "group": "Active", "name": "selected.document_mode"}}, +{"background": "#202326ff", "cols": {"0": [[0, 30, "#1b1d20ff"]], "1": [[0, 30, "#1b1d20ff"]], "40": [[0, 30, "#1b1d20ff"]], "79": [[0, 30, "#1b1d20ff"]]}, "control": "CE_TabBarTabShape", "id": "tab.unselected.document_mode", "rows": {"0": [[0, 80, "#1b1d20ff"]], "1": [[0, 80, "#1b1d20ff"]], "15": [[0, 80, "#1b1d20ff"]], "2": [[0, 80, "#1b1d20ff"]], "27": [[0, 80, "#1b1d20ff"]], "28": [[0, 80, "#1b1d20ff"]], "29": [[0, 80, "#1b1d20ff"]], "3": [[0, 80, "#1b1d20ff"]]}, "size": [80, 30], "state": {"document_mode": true, "flags": 0, "group": "Active", "name": "unselected.document_mode"}}, +{"background": "#141618ff", "cols": {"0": [[0, 29, "#292c30ff"], [29, 1, "#535558ff"]], "50": [[0, 29, "#292c30ff"], [29, 1, "#535558ff"]], "98": [[0, 29, "#292c30ff"], [29, 1, "#535558ff"]], "99": [[0, 30, "#535558ff"]]}, "control": "CE_HeaderSection", "id": "header.normal", "rows": {"0": [[0, 99, "#292c30ff"], [99, 1, "#535558ff"]], "15": [[0, 99, "#292c30ff"], [99, 1, "#535558ff"]], "28": [[0, 99, "#292c30ff"], [99, 1, "#535558ff"]], "29": [[0, 100, "#535558ff"]]}, "size": [100, 30], "state": {"flags": 2, "group": "Active", "name": "normal"}}, +{"background": "#141618ff", "cols": {"0": [[0, 29, "#2d4655ff"], [29, 1, "#566a76ff"]], "50": [[0, 29, "#2d4655ff"], [29, 1, "#566a76ff"]], "98": [[0, 29, "#2d4655ff"], [29, 1, "#566a76ff"]], "99": [[0, 30, "#566a76ff"]]}, "control": "CE_HeaderSection", "id": "header.hover", "rows": {"0": [[0, 99, "#2d4655ff"], [99, 1, "#566a76ff"]], "15": [[0, 99, "#2d4655ff"], [99, 1, "#566a76ff"]], "28": [[0, 99, "#2d4655ff"], [99, 1, "#566a76ff"]], "29": [[0, 100, "#566a76ff"]]}, "size": [100, 30], "state": {"flags": 8194, "group": "Active", "name": "hover"}}, +{"background": "#141618ff", "cols": {"0": [[0, 29, "#2d4655ff"], [29, 1, "#566a76ff"]], "50": [[0, 29, "#2d4655ff"], [29, 1, "#566a76ff"]], "98": [[0, 29, "#2d4655ff"], [29, 1, "#566a76ff"]], "99": [[0, 30, "#566a76ff"]]}, "control": "CE_HeaderSection", "id": "header.sunken", "rows": {"0": [[0, 99, "#2d4655ff"], [99, 1, "#566a76ff"]], "15": [[0, 99, "#2d4655ff"], [99, 1, "#566a76ff"]], "28": [[0, 99, "#2d4655ff"], [99, 1, "#566a76ff"]], "29": [[0, 100, "#566a76ff"]]}, "size": [100, 30], "state": {"flags": 4, "group": "Active", "name": "sunken"}}, +{"background": "#141618ff", "cols": {"0": [[0, 24, "#141618ff"]], "1": [[0, 24, "#141618ff"]], "100": [[0, 24, "#141618ff"]], "2": [[0, 24, "#141618ff"]], "3": [[0, 24, "#141618ff"]]}, "control": "PE_PanelItemViewItem", "id": "item_view_row.normal", "rows": {"0": [[0, 200, "#141618ff"]], "1": [[0, 200, "#141618ff"]], "12": [[0, 200, "#141618ff"]], "2": [[0, 200, "#141618ff"]], "22": [[0, 200, "#141618ff"]], "23": [[0, 200, "#141618ff"]]}, "size": [200, 24], "state": {"flags": 0, "group": "Active", "name": "normal"}}, +{"background": "#141618ff", "cols": {"0": [[0, 24, "#141618ff"]], "1": [[0, 24, "#141618ff"]], "100": [[0, 1, "#141618ff"], [1, 1, "#3694c5ff"], [2, 19, "#204357ff"], [21, 1, "#214458ff"], [22, 1, "#3592c3ff"], [23, 1, "#141618ff"]], "2": [[0, 3, "#141618ff"], [3, 1, "#192831ff"], [4, 1, "#2c698aff"], [5, 1, "#3389b5ff"], [6, 11, "#3694c5ff"], [17, 1, "#3693c3ff"], [18, 1, "#3388b6ff"], [19, 1, "#2a6989ff"], [20, 1, "#192730ff"], [21, 3, "#141618ff"]], "3": [[0, 2, "#141618ff"], [2, 1, "#1a2d37ff"], [3, 1, "#348ab7ff"], [4, 1, "#265975ff"], [5, 1, "#234b63ff"], [6, 12, "#204357ff"], [18, 1, "#224c62ff"], [19, 1, "#265975ff"], [20, 1, "#348bb7ff"], [21, 1, "#1a2b35ff"], [22, 2, "#141618ff"]]}, "control": "PE_PanelItemViewItem", "id": "item_view_row.hover", "rows": {"0": [[0, 200, "#141618ff"]], "1": [[0, 4, "#141618ff"], [4, 1, "#192831ff"], [5, 1, "#2b698bff"], [6, 1, "#3389b5ff"], [7, 185, "#3694c5ff"], [192, 1, "#3794c3ff"], [193, 1, "#3388b6ff"], [194, 1, "#2b6889ff"], [195, 1, "#192730ff"], [196, 4, "#141618ff"]], "12": [[0, 2, "#141618ff"], [2, 1, "#3694c5ff"], [3, 193, "#204357ff"], [196, 1, "#214458ff"], [197, 1, "#3592c3ff"], [198, 2, "#141618ff"]], "2": [[0, 3, "#141618ff"], [3, 1, "#1a2d37ff"], [4, 1, "#348ab7ff"], [5, 1, "#265975ff"], [6, 1, "#234b63ff"], [7, 186, "#204357ff"], [193, 1, "#224c62ff"], [194, 1, "#265975ff"], [195, 1, "#348bb7ff"], [196, 1, "#1a2b35ff"], [197, 3, "#141618ff"]], "22": [[0, 4, "#141618ff"], [4, 1, "#19272fff"], [5, 1, "#2a6889ff"], [6, 1, "#3387b4ff"], [7, 185, "#3592c3ff"], [192, 1, "#3692c2ff"], [193, 1, "#3287b3ff"], [194, 1, "#296787ff"], [195, 1, "#18262eff"], [196, 4, "#141618ff"]], "23": [[0, 200, "#141618ff"]]}, "size": [200, 24], "state": {"flags": 8192, "group": "Active", "name": "hover"}}, +{"background": "#141618ff", "cols": {"0": [[0, 24, "#141618ff"]], "1": [[0, 24, "#141618ff"]], "100": [[0, 1, "#141618ff"], [1, 21, "#3daee9ff"], [22, 1, "#3cade8ff"], [23, 1, "#141618ff"]], "2": [[0, 3, "#141618ff"], [3, 1, "#1a2e38ff"], [4, 1, "#307faaff"], [5, 1, "#3aa6ddff"], [6, 11, "#3daee9ff"], [17, 1, "#3dade7ff"], [18, 1, "#3ba5dcff"], [19, 1, "#307fa9ff"], [20, 1, "#1a2c37ff"], [21, 3, "#141618ff"]], "3": [[0, 2, "#141618ff"], [2, 1, "#1d3645ff"], [3, 1, "#3ba7deff"], [4, 16, "#3daee9ff"], [20, 1, "#3ba7dfff"], [21, 1, "#1d3543ff"], [22, 2, "#141618ff"]]}, "control": "PE_PanelItemViewItem", "id": "item_view_row.selected", "rows": {"0": [[0, 200, "#141618ff"]], "1": [[0, 4, "#141618ff"], [4, 1, "#1a2e38ff"], [5, 1, "#317faaff"], [6, 1, "#3aa6ddff"], [7, 185, "#3daee9ff"], [192, 1, "#3dade7ff"], [193, 1, "#3ba5dcff"], [194, 1, "#307fa9ff"], [195, 1, "#1a2c37ff"], [196, 4, "#141618ff"]], "12": [[0, 2, "#141618ff"], [2, 195, "#3daee9ff"], [197, 1, "#3cade8ff"], [198, 2, "#141618ff"]], "2": [[0, 3, "#141618ff"], [3, 1, "#1d3645ff"], [4, 1, "#3ba6dfff"], [5, 190, "#3daee9ff"], [195, 1, "#3ba8dfff"], [196, 1, "#1d3543ff"], [197, 3, "#141618ff"]], "22": [[0, 4, "#141618ff"], [4, 1, "#192b35ff"], [5, 1, "#307ea8ff"], [6, 1, "#3aa4dbff"], [7, 185, "#3cade8ff"], [192, 1, "#3cace7ff"], [193, 1, "#3aa3daff"], [194, 1, "#307ea8ff"], [195, 1, "#192a33ff"], [196, 4, "#141618ff"]], "23": [[0, 200, "#141618ff"]]}, "size": [200, 24], "state": {"flags": 32768, "group": "Active", "name": "selected"}}, +{"background": "#141618ff", "cols": {"0": [[0, 24, "#141618ff"]], "1": [[0, 24, "#141618ff"]], "100": [[0, 1, "#141618ff"], [1, 21, "#44bfffff"], [22, 1, "#44befeff"], [23, 1, "#141618ff"]], "2": [[0, 3, "#141618ff"], [3, 1, "#1b303bff"], [4, 1, "#358bb9ff"], [5, 1, "#42b5f2ff"], [6, 11, "#44bfffff"], [17, 1, "#44befdff"], [18, 1, "#41b5f1ff"], [19, 1, "#358bb8ff"], [20, 1, "#1b2f3aff"], [21, 3, "#141618ff"]], "3": [[0, 2, "#141618ff"], [2, 1, "#1f394aff"], [3, 1, "#43b7f3ff"], [4, 16, "#44bfffff"], [20, 1, "#42b7f4ff"], [21, 1, "#1e3848ff"], [22, 2, "#141618ff"]]}, "control": "PE_PanelItemViewItem", "id": "item_view_row.selected_hover", "rows": {"0": [[0, 200, "#141618ff"]], "1": [[0, 4, "#141618ff"], [4, 1, "#1b303bff"], [5, 1, "#368bb9ff"], [6, 1, "#42b5f2ff"], [7, 185, "#44bfffff"], [192, 1, "#44befdff"], [193, 1, "#41b5f1ff"], [194, 1, "#358bb8ff"], [195, 1, "#1b2f3aff"], [196, 4, "#141618ff"]], "12": [[0, 2, "#141618ff"], [2, 195, "#44bfffff"], [197, 1, "#44befeff"], [198, 2, "#141618ff"]], "2": [[0, 3, "#141618ff"], [3, 1, "#1f394aff"], [4, 1, "#42b7f4ff"], [5, 190, "#44bfffff"], [195, 1, "#42b7f4ff"], [196, 1, "#1e3847ff"], [197, 3, "#141618ff"]], "22": [[0, 4, "#141618ff"], [4, 1, "#1a2d38ff"], [5, 1, "#358ab7ff"], [6, 1, "#41b4f0ff"], [7, 185, "#44befeff"], [192, 1, "#43bdfcff"], [193, 1, "#40b3efff"], [194, 1, "#348ab6ff"], [195, 1, "#1a2c36ff"], [196, 4, "#141618ff"]], "23": [[0, 200, "#141618ff"]]}, "size": [200, 24], "state": {"flags": 40960, "group": "Active", "name": "selected_hover"}}, +{"background": "#141618ff", "cols": {"0": [[0, 24, "#141618ff"]], "1": [[0, 24, "#141618ff"]], "100": [[0, 1, "#141618ff"], [1, 22, "#1b4155ff"], [23, 1, "#141618ff"]], "2": [[0, 3, "#141618ff"], [3, 1, "#151d21ff"], [4, 1, "#193443ff"], [5, 1, "#1a3f52ff"], [6, 12, "#1b4155ff"], [18, 1, "#1a3f52ff"], [19, 1, "#193342ff"], [20, 1, "#151c21ff"], [21, 3, "#141618ff"]], "3": [[0, 2, "#141618ff"], [2, 1, "#152025ff"], [3, 1, "#1b3f52ff"], [4, 16, "#1b4155ff"], [20, 1, "#1b3f52ff"], [21, 1, "#151f25ff"], [22, 2, "#141618ff"]]}, "control": "PE_PanelItemViewItem", "id": "item_view_row.selected_inactive_window", "rows": {"0": [[0, 200, "#141618ff"]], "1": [[0, 4, "#141618ff"], [4, 1, "#151d21ff"], [5, 1, "#193443ff"], [6, 1, "#1a3f52ff"], [7, 186, "#1b4155ff"], [193, 1, "#1a3f52ff"], [194, 1, "#193342ff"], [195, 1, "#151c21ff"], [196, 4, "#141618ff"]], "12": [[0, 2, "#141618ff"], [2, 196, "#1b4155ff"], [198, 2, "#141618ff"]], "2": [[0, 3, "#141618ff"], [3, 1, "#152025ff"], [4, 1, "#1b3f52ff"], [5, 190, "#1b4155ff"], [195, 1, "#1a3f52ff"], [196, 1, "#151f25ff"], [197, 3, "#141618ff"]], "22": [[0, 4, "#141618ff"], [4, 1, "#151c21ff"], [5, 1, "#183341ff"], [6, 1, "#1b3e51ff"], [7, 185, "#1b4155ff"], [192, 1, "#1b4055ff"], [193, 1, "#1b3e50ff"], [194, 1, "#193442ff"], [195, 1, "#141b20ff"], [196, 4, "#141618ff"]], "23": [[0, 200, "#141618ff"]]}, "size": [200, 24], "state": {"flags": 32768, "group": "Inactive", "name": "selected_inactive_window"}}, +{"background": "#141618ff", "cols": {"0": [[0, 24, "#141618ff"]], "1": [[0, 24, "#141618ff"]], "100": [[0, 24, "#141618ff"]], "2": [[0, 24, "#141618ff"]], "3": [[0, 24, "#141618ff"]]}, "control": "PE_PanelItemViewItem", "id": "item_view_row.focus", "rows": {"0": [[0, 200, "#141618ff"]], "1": [[0, 200, "#141618ff"]], "12": [[0, 200, "#141618ff"]], "2": [[0, 200, "#141618ff"]], "22": [[0, 200, "#141618ff"]], "23": [[0, 200, "#141618ff"]]}, "size": [200, 24], "state": {"flags": 8388864, "group": "Active", "name": "focus"}}, +{"background": "#292c30ff", "cols": {"0": [[0, 30, "#535659ff"]], "1": [[0, 1, "#535659ff"], [1, 28, "#292c30ff"], [29, 1, "#535659ff"]], "50": [[0, 1, "#535659ff"], [1, 28, "#292c30ff"], [29, 1, "#535659ff"]]}, "control": "PE_PanelTipLabel", "id": "tooltip.panel", "rows": {"0": [[0, 100, "#535659ff"]], "1": [[0, 1, "#535659ff"], [1, 98, "#292c30ff"], [99, 1, "#535659ff"]], "15": [[0, 1, "#535659ff"], [1, 98, "#292c30ff"], [99, 1, "#535659ff"]]}, "size": [100, 30], "state": {"flags": 0, "group": "Active", "name": "normal"}}, +{"background": "#202326ff", "cols": {"0": [[0, 2, "#202326ff"], [2, 1, "#272a2cff"], [3, 1, "#3b3d40ff"], [4, 1, "#484a4cff"], [5, 39, "#4c4e51ff"], [44, 1, "#4b4d51ff"], [45, 1, "#48494cff"], [46, 1, "#3a3d40ff"], [47, 1, "#26292cff"], [48, 2, "#202326ff"]], "1": [[0, 1, "#202326ff"], [1, 1, "#272a2cff"], [2, 1, "#44474aff"], [3, 1, "#232427ff"], [4, 1, "#191b1eff"], [5, 40, "#141618ff"], [45, 1, "#191c1eff"], [46, 1, "#222426ff"], [47, 1, "#45474aff"], [48, 1, "#25282cff"], [49, 1, "#202326ff"]], "50": [[0, 1, "#4c4e51ff"], [1, 47, "#141618ff"], [48, 1, "#151719ff"], [49, 1, "#4b4d50ff"]]}, "control": "PE_Frame", "id": "frame.styled_panel", "rows": {"0": [[0, 2, "#202326ff"], [2, 1, "#272a2cff"], [3, 1, "#3b3d40ff"], [4, 1, "#484a4cff"], [5, 89, "#4c4e51ff"], [94, 1, "#4b4d50ff"], [95, 1, "#48494cff"], [96, 1, "#3a3d40ff"], [97, 1, "#26292cff"], [98, 2, "#202326ff"]], "1": [[0, 1, "#202326ff"], [1, 1, "#272a2cff"], [2, 1, "#44474aff"], [3, 1, "#222426ff"], [4, 1, "#191b1eff"], [5, 90, "#141618ff"], [95, 1, "#191c1eff"], [96, 1, "#232426ff"], [97, 1, "#44484aff"], [98, 1, "#26282cff"], [99, 1, "#202326ff"]], "25": [[0, 1, "#4c4e51ff"], [1, 97, "#141618ff"], [98, 1, "#151719ff"], [99, 1, "#4b4d50ff"]]}, "size": [100, 50], "state": {"flags": 4, "group": "Active", "name": "sunken"}}, +{"background": "#202326ff", "cols": {"0": [[0, 2, "#202326ff"], [2, 1, "#272a2cff"], [3, 1, "#3b3e41ff"], [4, 1, "#484a4cff"], [5, 49, "#4c4e51ff"], [54, 1, "#4b4e51ff"], [55, 1, "#48494dff"], [56, 1, "#3b3e41ff"], [57, 1, "#26292cff"], [58, 2, "#202326ff"]], "1": [[0, 1, "#202326ff"], [1, 1, "#282b2dff"], [2, 1, "#44484bff"], [3, 1, "#292b2eff"], [4, 1, "#202327ff"], [5, 50, "#1c1f22ff"], [55, 1, "#202427ff"], [56, 1, "#282b2eff"], [57, 1, "#46484bff"], [58, 1, "#26292dff"], [59, 1, "#202326ff"]], "2": [[0, 1, "#272a2cff"], [1, 1, "#45484bff"], [2, 56, "#1c1f22ff"], [58, 1, "#47484bff"], [59, 1, "#26292cff"]], "50": [[0, 1, "#4c4e51ff"], [1, 57, "#1c1f22ff"], [58, 1, "#1d2023ff"], [59, 1, "#4b4d50ff"]]}, "control": "PE_FrameGroupBox", "id": "group_box.frame", "rows": {"0": [[0, 2, "#202326ff"], [2, 1, "#272a2cff"], [3, 1, "#3b3e41ff"], [4, 1, "#484a4cff"], [5, 89, "#4c4e51ff"], [94, 1, "#4b4e51ff"], [95, 1, "#48494dff"], [96, 1, "#3b3d41ff"], [97, 1, "#26292cff"], [98, 2, "#202326ff"]], "1": [[0, 1, "#202326ff"], [1, 1, "#282b2dff"], [2, 1, "#45484bff"], [3, 1, "#282b2eff"], [4, 1, "#202327ff"], [5, 90, "#1c1f22ff"], [95, 1, "#202427ff"], [96, 1, "#282a2eff"], [97, 1, "#45494bff"], [98, 1, "#26292dff"], [99, 1, "#202326ff"]], "2": [[0, 1, "#272a2cff"], [1, 1, "#44484bff"], [2, 96, "#1c1f22ff"], [98, 1, "#47484bff"], [99, 1, "#26292cff"]], "30": [[0, 1, "#4c4e51ff"], [1, 97, "#1c1f22ff"], [98, 1, "#1d2023ff"], [99, 1, "#4b4d50ff"]]}, "size": [100, 60], "state": {"flags": 0, "group": "Active", "name": "normal"}} +] +} +} +} diff --git a/tools/kde_golden/vectors/resolve.json b/tools/kde_golden/vectors/resolve.json new file mode 100644 index 000000000..1145233e3 --- /dev/null +++ b/tools/kde_golden/vectors/resolve.json @@ -0,0 +1,19 @@ +{ +"meta": {"generator":"tools/kde_golden/driver (kde_golden)","image":"invent-registry.kde.org/neon/docker-images/plasma@sha256:f58f9b97f218ee976cf928f6fe00abb929a644aded8c9dfb02f77a9b2a6e1732","kcolorscheme_build":"6.31.0","kguiaddons_build":"6.31.0","kind":"resolve","packages":{"breeze":"4:6.8.0-0zneon+24.04+noble+release+build80","fonts-hack":"3.003-3","fonts-noto-core":"20201225-2","kde-style-breeze":"4:6.8.0-0zneon+24.04+noble+release+build80","kde-style-oxygen":"4:6.8.0-0zneon+24.04+noble+release+build59","kf6-kcolorscheme":"6.31.0-0zneon+24.04+noble+release+build47","kf6-kconfig":"6.31.0-0zneon+24.04+noble+release+build36","kf6-kguiaddons":"6.31.0-0zneon+24.04+noble+release+build59","libkf6colorscheme-dev":"6.31.0-0zneon+24.04+noble+release+build47","plasma-workspace":"4:6.8.0-0zneon+24.04+noble+release+build99","qt6-base":"6.11.1-0zneon+24.04+noble+release+build162"},"qt_build":"6.11.1","qt_runtime":"6.11.1","readme":"tools/kde_golden/README.md documents every field"}, +"missing_installed": [], +"schemes": [ +{"contrastF":0.4,"frameContrast":0.2,"input":{"ColorEffects:Disabled":{"Color":"56,56,56","ColorAmount":"0","ColorEffect":"0","ContrastAmount":"0.65","ContrastEffect":"1","IntensityAmount":"0.1","IntensityEffect":"2"},"ColorEffects:Inactive":{"ChangeSelectionColor":"true","Color":"112,111,110","ColorAmount":"0.025","ColorEffect":"2","ContrastAmount":"0.1","ContrastEffect":"2","Enable":"false","IntensityAmount":"0","IntensityEffect":"0"},"Colors:Button":{"BackgroundAlternate":"163,212,250","BackgroundNormal":"252,252,252","DecorationFocus":"61,174,233","DecorationHover":"61,174,233","ForegroundActive":"61,174,233","ForegroundInactive":"112,125,138","ForegroundLink":"41,128,185","ForegroundNegative":"218,68,83","ForegroundNeutral":"246,116,0","ForegroundNormal":"35,38,41","ForegroundPositive":"39,174,96","ForegroundVisited":"155,89,182"},"Colors:Complementary":{"BackgroundAlternate":"27,30,32","BackgroundNormal":"42,46,50","DecorationFocus":"61,174,233","DecorationHover":"61,174,233","ForegroundActive":"61,174,233","ForegroundInactive":"161,169,177","ForegroundLink":"29,153,243","ForegroundNegative":"218,68,83","ForegroundNeutral":"246,116,0","ForegroundNormal":"252,252,252","ForegroundPositive":"39,174,96","ForegroundVisited":"155,89,182"},"Colors:Header":{"BackgroundAlternate":"239,240,241","BackgroundNormal":"222,224,226","DecorationFocus":"61,174,233","DecorationHover":"61,174,233","ForegroundActive":"61,174,233","ForegroundInactive":"112,125,138","ForegroundLink":"41,128,185","ForegroundNegative":"218,68,83","ForegroundNeutral":"246,116,0","ForegroundNormal":"35,38,41","ForegroundPositive":"39,174,96","ForegroundVisited":"155,89,182"},"Colors:Header][Inactive":{"BackgroundAlternate":"227,229,231","BackgroundNormal":"239,240,241","DecorationFocus":"61,174,233","DecorationHover":"61,174,233","ForegroundActive":"61,174,233","ForegroundInactive":"112,125,138","ForegroundLink":"41,128,185","ForegroundNegative":"218,68,83","ForegroundNeutral":"246,116,0","ForegroundNormal":"35,38,41","ForegroundPositive":"39,174,96","ForegroundVisited":"155,89,182"},"Colors:Selection":{"BackgroundAlternate":"163,212,250","BackgroundNormal":"61,174,233","DecorationFocus":"61,174,233","DecorationHover":"61,174,233","ForegroundActive":"255,255,255","ForegroundInactive":"112,125,138","ForegroundLink":"253,188,75","ForegroundNegative":"176,55,69","ForegroundNeutral":"198,92,0","ForegroundNormal":"255,255,255","ForegroundPositive":"23,104,57","ForegroundVisited":"155,89,182"},"Colors:Tooltip":{"BackgroundAlternate":"239,240,241","BackgroundNormal":"247,247,247","DecorationFocus":"61,174,233","DecorationHover":"61,174,233","ForegroundActive":"61,174,233","ForegroundInactive":"112,125,138","ForegroundLink":"41,128,185","ForegroundNegative":"218,68,83","ForegroundNeutral":"246,116,0","ForegroundNormal":"35,38,41","ForegroundPositive":"39,174,96","ForegroundVisited":"155,89,182"},"Colors:View":{"BackgroundAlternate":"247,247,247","BackgroundNormal":"255,255,255","DecorationFocus":"61,174,233","DecorationHover":"61,174,233","ForegroundActive":"61,174,233","ForegroundInactive":"112,125,138","ForegroundLink":"41,128,185","ForegroundNegative":"218,68,83","ForegroundNeutral":"246,116,0","ForegroundNormal":"35,38,41","ForegroundPositive":"39,174,96","ForegroundVisited":"155,89,182"},"Colors:Window":{"BackgroundAlternate":"227,229,231","BackgroundNormal":"239,240,241","DecorationFocus":"61,174,233","DecorationHover":"61,174,233","ForegroundActive":"61,174,233","ForegroundInactive":"112,125,138","ForegroundLink":"41,128,185","ForegroundNegative":"218,68,83","ForegroundNeutral":"246,116,0","ForegroundNormal":"35,38,41","ForegroundPositive":"39,174,96","ForegroundVisited":"155,89,182"},"General":{"ColorScheme":"BreezeLight","Name":"Breeze Light","shadeSortColumn":"true"},"KDE":{"contrast":"4"},"WM":{"activeBackground":"227,229,231","activeBlend":"227,229,231","activeForeground":"35,38,41","inactiveBackground":"239,240,241","inactiveBlend":"239,240,241","inactiveForeground":"112,125,138"}},"name":"BreezeLight","origin":"installed","palette":{"Active":{"Accent":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"AlternateBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Base":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"ButtonText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Highlight":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"HighlightedText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"LinkVisited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"PlaceholderText":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]},"Text":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"ToolTipBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"ToolTipText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Window":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"WindowText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}},"Disabled":{"Accent":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"AlternateBase":{"hex":"#ebebebff","u16":[60511,60511,60511,65535]},"Base":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#f0f0f0ff","u16":[61735,61735,61735,65535]},"ButtonText":{"hex":"#a8a9aaff","u16":[43111,43390,43668,65535]},"Dark":{"hex":"#82878cff","u16":[33341,34691,35987,65535]},"Highlight":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"HighlightedText":{"hex":"#a0a1a3ff","u16":[41059,41475,41892,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Link":{"hex":"#a3cae2ff","u16":[42003,51899,58104,65535]},"LinkVisited":{"hex":"#d6bae1ff","u16":[54932,47677,57833,65535]},"Mid":{"hex":"#bbc0c5ff","u16":[48130,49391,50621,65535]},"Midlight":{"hex":"#ebedeeff","u16":[60472,60791,61110,65535]},"PlaceholderText":{"hex":"#c2c8ceff","u16":[49903,51372,52827,65535]},"Shadow":{"hex":"#474a4cff","u16":[18200,18937,19645,65535]},"Text":{"hex":"#aaabacff","u16":[43578,43869,44159,65535]},"ToolTipBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"ToolTipText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Window":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"WindowText":{"hex":"#a0a1a3ff","u16":[41059,41475,41892,65535]}},"Inactive":{"Accent":{"hex":"#c2e0f5ff","u16":[49797,57489,62894,65535]},"AlternateBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Base":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"ButtonText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Highlight":{"hex":"#c2e0f5ff","u16":[49797,57489,62894,65535]},"HighlightedText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"LinkVisited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"PlaceholderText":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]},"Text":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"ToolTipBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"ToolTipText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Window":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"WindowText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}},"set_supported":{"Button":true,"Complementary":true,"Header":true,"Selection":true,"Tooltip":true,"View":true,"Window":true},"sets":{"Button":{"Active":{"background":{"Active":{"hex":"#e8f3fbff","u16":[59585,62560,64614,65535]},"Alternate":{"hex":"#a3d4faff","u16":[41891,54484,64250,65535]},"Link":{"hex":"#e4eef7ff","u16":[58702,61204,63367,65535]},"Negative":{"hex":"#f9e9eaff","u16":[64094,59877,60196,65535]},"Neutral":{"hex":"#fdeee5ff","u16":[65131,61115,58894,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#d4fae2ff","u16":[54552,64146,58102,65535]},"Visited":{"hex":"#f1e9f4ff","u16":[61816,59985,62701,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#d5d5d5ff","u16":[54787,54787,54787,65535]},"Light":{"hex":"#e3e3e3ff","u16":[58341,58341,58341,65535]},"Mid":{"hex":"#e3e3e3ff","u16":[58341,58341,58341,65535]},"Midlight":{"hex":"#f0f0f0ff","u16":[61653,61653,61653,65535]},"Shadow":{"hex":"#bcbcbcff","u16":[48440,48440,48440,65535]}}},"Disabled":{"background":{"Active":{"hex":"#d8edf7ff","u16":[55550,60800,63569,65535]},"Alternate":{"hex":"#8cccf9ff","u16":[36095,52366,64033,65535]},"Link":{"hex":"#dfeaf2ff","u16":[57339,60254,62215,65535]},"Negative":{"hex":"#f7e4e6ff","u16":[63468,58657,59124,65535]},"Neutral":{"hex":"#fae6d4ff","u16":[64273,59033,54466,65535]},"Normal":{"hex":"#f0f0f0ff","u16":[61735,61735,61735,65535]},"Positive":{"hex":"#d9eee2ff","u16":[55792,61232,58043,65535]},"Visited":{"hex":"#eee6f2ff","u16":[61262,59074,62174,65535]}},"decoration":{"Focus":{"hex":"#a2d8f3ff","u16":[41654,55609,62421,65535]},"Hover":{"hex":"#a2d8f3ff","u16":[41654,55609,62421,65535]}},"foreground":{"Active":{"hex":"#a2d8f3ff","u16":[41654,55609,62421,65535]},"Inactive":{"hex":"#c0c6ccff","u16":[49437,50892,52336,65535]},"Link":{"hex":"#a2c8e0ff","u16":[41595,51411,57571,65535]},"Negative":{"hex":"#eeafb6ff","u16":[61133,45056,46720,65535]},"Neutral":{"hex":"#f9c088ff","u16":[63954,49376,34973,65535]},"Normal":{"hex":"#a8a9aaff","u16":[43111,43390,43668,65535]},"Positive":{"hex":"#a9d6bcff","u16":[43472,55048,48360,65535]},"Visited":{"hex":"#d4b8dfff","u16":[54420,47217,57302,65535]}},"shade":{"Dark":{"hex":"#8d8d8dff","u16":[36252,36252,36252,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c8c8c8ff","u16":[51382,51382,51382,65535]},"Midlight":{"hex":"#f7f7f7ff","u16":[63513,63513,63513,65535]},"Shadow":{"hex":"#494949ff","u16":[18840,18840,18840,65535]}}},"Inactive":{"background":{"Active":{"hex":"#e8f3fbff","u16":[59585,62560,64614,65535]},"Alternate":{"hex":"#a3d4faff","u16":[41891,54484,64250,65535]},"Link":{"hex":"#e4eef7ff","u16":[58702,61204,63367,65535]},"Negative":{"hex":"#f9e9eaff","u16":[64094,59877,60196,65535]},"Neutral":{"hex":"#fdeee5ff","u16":[65131,61115,58894,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#d4fae2ff","u16":[54552,64146,58102,65535]},"Visited":{"hex":"#f1e9f4ff","u16":[61816,59985,62701,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#d5d5d5ff","u16":[54787,54787,54787,65535]},"Light":{"hex":"#e3e3e3ff","u16":[58341,58341,58341,65535]},"Mid":{"hex":"#e3e3e3ff","u16":[58341,58341,58341,65535]},"Midlight":{"hex":"#f0f0f0ff","u16":[61653,61653,61653,65535]},"Shadow":{"hex":"#bcbcbcff","u16":[48440,48440,48440,65535]}}}},"Complementary":{"Active":{"background":{"Active":{"hex":"#1c3c4dff","u16":[7084,15330,19761,65535]},"Alternate":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]},"Link":{"hex":"#143955ff","u16":[5076,14725,21803,65535]},"Negative":{"hex":"#57242bff","u16":[22290,9359,10973,65535]},"Neutral":{"hex":"#532e0dff","u16":[21296,11822,3397,65535]},"Normal":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Positive":{"hex":"#163e29ff","u16":[5742,16007,10505,65535]},"Visited":{"hex":"#412c4dff","u16":[16787,11259,19761,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#191b1dff","u16":[6338,6942,7546,65535]},"Light":{"hex":"#40464cff","u16":[16436,18002,19567,65535]},"Mid":{"hex":"#25292cff","u16":[9506,10412,11317,65535]},"Midlight":{"hex":"#363b40ff","u16":[13917,15242,16568,65535]},"Shadow":{"hex":"#121415ff","u16":[4597,5035,5473,65535]}}},"Disabled":{"background":{"Active":{"hex":"#20333dff","u16":[8232,13011,15777,65535]},"Alternate":{"hex":"#1a1d1fff","u16":[6615,7349,7839,65535]},"Link":{"hex":"#1c3242ff","u16":[7317,12882,17081,65535]},"Negative":{"hex":"#42282eff","u16":[16927,10389,11726,65535]},"Neutral":{"hex":"#3e2c1cff","u16":[16044,11402,7322,65535]},"Normal":{"hex":"#282c30ff","u16":[10289,11269,12249,65535]},"Positive":{"hex":"#1e352bff","u16":[7632,13521,11035,65535]},"Visited":{"hex":"#352c3fff","u16":[13699,11243,16190,65535]}},"decoration":{"Focus":{"hex":"#2e576dff","u16":[11918,22245,27940,65535]},"Hover":{"hex":"#2e576dff","u16":[11918,22245,27940,65535]}},"foreground":{"Active":{"hex":"#2e576dff","u16":[11918,22245,27940,65535]},"Inactive":{"hex":"#50555aff","u16":[20493,21816,23139,65535]},"Link":{"hex":"#245070ff","u16":[9175,20444,28797,65535]},"Negative":{"hex":"#63333bff","u16":[25380,13156,15078,65535]},"Neutral":{"hex":"#6c431fff","u16":[27781,17272,7962,65535]},"Normal":{"hex":"#6e7173ff","u16":[28296,28933,29569,65535]},"Positive":{"hex":"#27573fff","u16":[10032,22245,16194,65535]},"Visited":{"hex":"#4e3a5cff","u16":[19978,14956,23567,65535]}},"shade":{"Dark":{"hex":"#181a1cff","u16":[6042,6617,7193,65535]},"Light":{"hex":"#3e444aff","u16":[16045,17573,19101,65535]},"Mid":{"hex":"#23272aff","u16":[9063,9926,10789,65535]},"Midlight":{"hex":"#353a3fff","u16":[13498,14784,16069,65535]},"Shadow":{"hex":"#111314ff","u16":[4385,4802,5220,65535]}}},"Inactive":{"background":{"Active":{"hex":"#1c3c4dff","u16":[7084,15330,19761,65535]},"Alternate":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]},"Link":{"hex":"#143955ff","u16":[5076,14725,21803,65535]},"Negative":{"hex":"#57242bff","u16":[22290,9359,10973,65535]},"Neutral":{"hex":"#532e0dff","u16":[21296,11822,3397,65535]},"Normal":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Positive":{"hex":"#163e29ff","u16":[5742,16007,10505,65535]},"Visited":{"hex":"#412c4dff","u16":[16787,11259,19761,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#191b1dff","u16":[6338,6942,7546,65535]},"Light":{"hex":"#40464cff","u16":[16436,18002,19567,65535]},"Mid":{"hex":"#25292cff","u16":[9506,10412,11317,65535]},"Midlight":{"hex":"#363b40ff","u16":[13917,15242,16568,65535]},"Shadow":{"hex":"#121415ff","u16":[4597,5035,5473,65535]}}}},"Header":{"Active":{"background":{"Active":{"hex":"#bddcf1ff","u16":[48617,56620,61865,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#bed8edff","u16":[48753,55447,60903,65535]},"Negative":{"hex":"#eecccfff","u16":[61219,52482,53238,65535]},"Neutral":{"hex":"#f7cfb7ff","u16":[63498,53297,47153,65535]},"Normal":{"hex":"#dee0e2ff","u16":[57054,57568,58082,65535]},"Positive":{"hex":"#85ecb2ff","u16":[34118,60679,45709,65535]},"Visited":{"hex":"#ddcfe5ff","u16":[56819,53117,58755,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#7f8489ff","u16":[32707,33931,35117,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#b8bdc1ff","u16":[47203,48452,49677,65535]},"Midlight":{"hex":"#e6e8e9ff","u16":[59237,59610,59984,65535]},"Shadow":{"hex":"#47494cff","u16":[18190,18870,19530,65535]}}},"Disabled":{"background":{"Active":{"hex":"#b6d4e4ff","u16":[46809,54437,58578,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Link":{"hex":"#c1d1dcff","u16":[49596,53745,56654,65535]},"Negative":{"hex":"#e2c8ccff","u16":[58118,51520,52524,65535]},"Neutral":{"hex":"#e5cbb3ff","u16":[58796,52066,46125,65535]},"Normal":{"hex":"#d3d6d8ff","u16":[54197,54906,55612,65535]},"Positive":{"hex":"#b3d7c5ff","u16":[46026,55365,50692,65535]},"Visited":{"hex":"#d6cbddff","u16":[54939,52124,56916,65535]}},"decoration":{"Focus":{"hex":"#93c6e0ff","u16":[37880,50983,57656,65535]},"Hover":{"hex":"#93c6e0ff","u16":[37880,50983,57656,65535]}},"foreground":{"Active":{"hex":"#93c6e0ff","u16":[37880,50983,57656,65535]},"Inactive":{"hex":"#aeb5bbff","u16":[44665,46432,48183,65535]},"Link":{"hex":"#94b6ccff","u16":[37989,46772,52533,65535]},"Negative":{"hex":"#d99fa6ff","u16":[55802,40796,42771,65535]},"Neutral":{"hex":"#e2b080ff","u16":[58104,45186,32907,65535]},"Normal":{"hex":"#95979aff","u16":[38352,38927,39503,65535]},"Positive":{"hex":"#97c5acff","u16":[38695,50589,44220,65535]},"Visited":{"hex":"#c0a7ceff","u16":[49363,42888,52873,65535]}},"shade":{"Dark":{"hex":"#797e82ff","u16":[31176,32344,33476,65535]},"Light":{"hex":"#f3f4f5ff","u16":[62526,62699,62873,65535]},"Mid":{"hex":"#afb5baff","u16":[45016,46458,47864,65535]},"Midlight":{"hex":"#dcdee0ff","u16":[56538,57086,57635,65535]},"Shadow":{"hex":"#46494bff","u16":[17969,18642,19295,65535]}}},"Inactive":{"background":{"Active":{"hex":"#d5eaf7ff","u16":[54852,60051,63563,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58339,58853,59367,65535]},"Link":{"hex":"#d4e5f2ff","u16":[54604,58745,62251,65535]},"Negative":{"hex":"#f5dddfff","u16":[62983,56715,57221,65535]},"Neutral":{"hex":"#fbe1d2ff","u16":[64389,57815,54057,65535]},"Normal":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Positive":{"hex":"#adf6caff","u16":[44364,63230,51951,65535]},"Visited":{"hex":"#e8deeeff","u16":[59726,57050,61072,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]}}}},"Selection":{"Active":{"background":{"Active":{"hex":"#5ab7dcff","u16":[23235,46907,56572,65535]},"Alternate":{"hex":"#a3d4faff","u16":[41891,54484,64250,65535]},"Link":{"hex":"#b3ab74ff","u16":[46003,43823,29737,65535]},"Negative":{"hex":"#aa96b0ff","u16":[43694,38429,45353,65535]},"Neutral":{"hex":"#b29b74ff","u16":[45660,39812,29747,65535]},"Normal":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Positive":{"hex":"#32ada4ff","u16":[12736,44427,42135,65535]},"Visited":{"hex":"#9799d3ff","u16":[38815,39221,54248,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#fdbc4bff","u16":[65021,48316,19275,65535]},"Negative":{"hex":"#b03745ff","u16":[45232,14135,17733,65535]},"Neutral":{"hex":"#c65c00ff","u16":[50886,23644,0,65535]},"Normal":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Positive":{"hex":"#176839ff","u16":[5911,26728,14649,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#246689ff","u16":[9206,26259,35163,65535]},"Light":{"hex":"#7ac6f9ff","u16":[31305,50791,63873,65535]},"Mid":{"hex":"#3596c9ff","u16":[13498,38503,51559,65535]},"Midlight":{"hex":"#41b9f7ff","u16":[16627,47428,63511,65535]},"Shadow":{"hex":"#174259ff","u16":[5979,17055,22838,65535]}}},"Disabled":{"background":{"Active":{"hex":"#c9e2f0ff","u16":[51633,58104,61582,65535]},"Alternate":{"hex":"#d8daddff","u16":[55389,56136,56880,65535]},"Link":{"hex":"#d1e0eaff","u16":[53755,57510,60082,65535]},"Negative":{"hex":"#efd8dbff","u16":[61309,55555,56290,65535]},"Neutral":{"hex":"#f2dac5ff","u16":[62133,56004,50594,65535]},"Normal":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Positive":{"hex":"#c3e6d3ff","u16":[50108,59146,54349,65535]},"Visited":{"hex":"#e4daeaff","u16":[58594,56069,60044,65535]}},"decoration":{"Focus":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Hover":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]}},"foreground":{"Active":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Inactive":{"hex":"#b8bfc5ff","u16":[47365,48981,50583,65535]},"Link":{"hex":"#9bc0d9ff","u16":[39710,49467,55672,65535]},"Negative":{"hex":"#e5a8afff","u16":[58782,43247,45071,65535]},"Neutral":{"hex":"#efb984ff","u16":[61470,47568,34027,65535]},"Normal":{"hex":"#a0a1a3ff","u16":[41059,41475,41892,65535]},"Positive":{"hex":"#a1cfb5ff","u16":[41402,53136,46608,65535]},"Visited":{"hex":"#cbb1d8ff","u16":[52205,45373,55410,65535]}},"shade":{"Dark":{"hex":"#82878cff","u16":[33341,34691,35987,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bbc0c5ff","u16":[48130,49391,50621,65535]},"Midlight":{"hex":"#ebedeeff","u16":[60472,60791,61110,65535]},"Shadow":{"hex":"#474a4cff","u16":[18200,18937,19645,65535]}}},"Inactive":{"background":{"Active":{"hex":"#b3d9f4ff","u16":[45899,55787,62650,65535]},"Alternate":{"hex":"#b0d8f3ff","u16":[45158,55455,62438,65535]},"Link":{"hex":"#b5d4efff","u16":[46454,54609,61533,65535]},"Negative":{"hex":"#e8c9cfff","u16":[59622,51622,53083,65535]},"Neutral":{"hex":"#f4cbb0ff","u16":[62731,52266,45109,65535]},"Normal":{"hex":"#c2e0f5ff","u16":[49797,57489,62894,65535]},"Positive":{"hex":"#75e9b8ff","u16":[30182,59846,47181,65535]},"Visited":{"hex":"#d6cbe6ff","u16":[55093,52228,59148,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#4b88a8ff","u16":[19360,34951,43113,65535]},"Light":{"hex":"#f8fbfeff","u16":[63734,64548,65196,65535]},"Mid":{"hex":"#75c2ecff","u16":[30160,49859,60666,65535]},"Midlight":{"hex":"#d1e7f7ff","u16":[53672,59338,63476,65535]},"Shadow":{"hex":"#2b4d5fff","u16":[10934,19739,24349,65535]}}}},"Tooltip":{"Active":{"background":{"Active":{"hex":"#e0effaff","u16":[57630,61532,64195,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#deeaf5ff","u16":[57046,60196,62891,65535]},"Negative":{"hex":"#f8e4e5ff","u16":[63672,58581,58970,65535]},"Neutral":{"hex":"#fce9ddff","u16":[64875,59755,56885,65535]},"Normal":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Positive":{"hex":"#c5f8d8ff","u16":[50674,63750,55628,65535]},"Visited":{"hex":"#ede5f1ff","u16":[60978,58784,62034,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#cfcfcfff","u16":[53208,53208,53208,65535]},"Light":{"hex":"#ddddddff","u16":[56880,56880,56880,65535]},"Mid":{"hex":"#ddddddff","u16":[56880,56880,56880,65535]},"Midlight":{"hex":"#ebebebff","u16":[60288,60288,60288,65535]},"Shadow":{"hex":"#b5b5b5ff","u16":[46599,46599,46599,65535]}}},"Disabled":{"background":{"Active":{"hex":"#d2e8f4ff","u16":[53968,59692,62698,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Link":{"hex":"#dae6eeff","u16":[55898,59123,61286,65535]},"Negative":{"hex":"#f4dfe1ff","u16":[62678,57357,57876,65535]},"Neutral":{"hex":"#f7e1cdff","u16":[63504,57761,52725,65535]},"Normal":{"hex":"#ebebebff","u16":[60511,60511,60511,65535]},"Positive":{"hex":"#d0ebdbff","u16":[53508,60379,56375,65535]},"Visited":{"hex":"#eae1eeff","u16":[60238,57818,61243,65535]}},"decoration":{"Focus":{"hex":"#a0d5efff","u16":[41134,54770,61453,65535]},"Hover":{"hex":"#a0d5efff","u16":[41134,54770,61453,65535]}},"foreground":{"Active":{"hex":"#a0d5efff","u16":[41134,54770,61453,65535]},"Inactive":{"hex":"#bdc3c8ff","u16":[48657,50093,51518,65535]},"Link":{"hex":"#9fc5ddff","u16":[40903,50598,56692,65535]},"Negative":{"hex":"#eaacb3ff","u16":[60222,44302,45948,65535]},"Neutral":{"hex":"#f5bd86ff","u16":[62984,48622,34500,65535]},"Normal":{"hex":"#a5a6a7ff","u16":[42332,42590,42849,65535]},"Positive":{"hex":"#a6d3b9ff","u16":[42675,54252,47564,65535]},"Visited":{"hex":"#d0b5dcff","u16":[53574,46448,56425,65535]}},"shade":{"Dark":{"hex":"#8a8a8aff","u16":[35533,35533,35533,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c4c4c4ff","u16":[50497,50497,50497,65535]},"Midlight":{"hex":"#f3f3f3ff","u16":[62379,62379,62379,65535]},"Shadow":{"hex":"#494949ff","u16":[18863,18863,18863,65535]}}},"Inactive":{"background":{"Active":{"hex":"#e0effaff","u16":[57630,61532,64195,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#deeaf5ff","u16":[57046,60196,62891,65535]},"Negative":{"hex":"#f8e4e5ff","u16":[63672,58581,58970,65535]},"Neutral":{"hex":"#fce9ddff","u16":[64875,59755,56885,65535]},"Normal":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Positive":{"hex":"#c5f8d8ff","u16":[50674,63750,55628,65535]},"Visited":{"hex":"#ede5f1ff","u16":[60978,58784,62034,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#cfcfcfff","u16":[53208,53208,53208,65535]},"Light":{"hex":"#ddddddff","u16":[56880,56880,56880,65535]},"Mid":{"hex":"#ddddddff","u16":[56880,56880,56880,65535]},"Midlight":{"hex":"#ebebebff","u16":[60288,60288,60288,65535]},"Shadow":{"hex":"#b5b5b5ff","u16":[46599,46599,46599,65535]}}}},"View":{"Active":{"background":{"Active":{"hex":"#ecf6fcff","u16":[60771,63172,64842,65535]},"Alternate":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Link":{"hex":"#e8f0f8ff","u16":[59682,61808,63658,65535]},"Negative":{"hex":"#faecedff","u16":[64334,60663,60940,65535]},"Neutral":{"hex":"#fef1eaff","u16":[65257,61930,60105,65535]},"Normal":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Positive":{"hex":"#ddfbe8ff","u16":[56769,64393,59555,65535]},"Visited":{"hex":"#f2ecf6ff","u16":[62319,60713,63097,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#d9d9d9ff","u16":[55727,55727,55727,65535]},"Light":{"hex":"#e6e6e6ff","u16":[59214,59214,59214,65535]},"Mid":{"hex":"#e6e6e6ff","u16":[59214,59214,59214,65535]},"Midlight":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"Shadow":{"hex":"#c1c1c1ff","u16":[49526,49526,49526,65535]}}},"Disabled":{"background":{"Active":{"hex":"#dceff9ff","u16":[56552,61460,64057,65535]},"Alternate":{"hex":"#ebebebff","u16":[60511,60511,60511,65535]},"Link":{"hex":"#e3edf4ff","u16":[58230,60929,62750,65535]},"Negative":{"hex":"#f9e7e9ff","u16":[63907,59452,59885,65535]},"Neutral":{"hex":"#fce9d8ff","u16":[64691,59802,55559,65535]},"Normal":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"Positive":{"hex":"#def0e6ff","u16":[57106,61751,59018,65535]},"Visited":{"hex":"#f1e9f4ff","u16":[61864,59835,62710,65535]}},"decoration":{"Focus":{"hex":"#a3daf5ff","u16":[41938,56116,63017,65535]},"Hover":{"hex":"#a3daf5ff","u16":[41938,56116,63017,65535]}},"foreground":{"Active":{"hex":"#a3daf5ff","u16":[41938,56116,63017,65535]},"Inactive":{"hex":"#c2c8ceff","u16":[49903,51372,52827,65535]},"Link":{"hex":"#a3cae2ff","u16":[42003,51899,58104,65535]},"Negative":{"hex":"#f0b1b8ff","u16":[61685,45506,47184,65535]},"Neutral":{"hex":"#fbc289ff","u16":[64548,49824,35228,65535]},"Normal":{"hex":"#aaabacff","u16":[43578,43869,44159,65535]},"Positive":{"hex":"#abd8beff","u16":[43950,55525,48837,65535]},"Visited":{"hex":"#d6bae1ff","u16":[54932,47677,57833,65535]}},"shade":{"Dark":{"hex":"#8f8f8fff","u16":[36684,36684,36684,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#cacacaff","u16":[51909,51909,51909,65535]},"Midlight":{"hex":"#fafafaff","u16":[64191,64191,64191,65535]},"Shadow":{"hex":"#494949ff","u16":[18809,18809,18809,65535]}}},"Inactive":{"background":{"Active":{"hex":"#ecf6fcff","u16":[60771,63172,64842,65535]},"Alternate":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Link":{"hex":"#e8f0f8ff","u16":[59682,61808,63658,65535]},"Negative":{"hex":"#faecedff","u16":[64334,60663,60940,65535]},"Neutral":{"hex":"#fef1eaff","u16":[65257,61930,60105,65535]},"Normal":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Positive":{"hex":"#ddfbe8ff","u16":[56769,64393,59555,65535]},"Visited":{"hex":"#f2ecf6ff","u16":[62319,60713,63097,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#d9d9d9ff","u16":[55727,55727,55727,65535]},"Light":{"hex":"#e6e6e6ff","u16":[59214,59214,59214,65535]},"Mid":{"hex":"#e6e6e6ff","u16":[59214,59214,59214,65535]},"Midlight":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"Shadow":{"hex":"#c1c1c1ff","u16":[49526,49526,49526,65535]}}}},"Window":{"Active":{"background":{"Active":{"hex":"#d5eaf7ff","u16":[54852,60051,63563,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58339,58853,59367,65535]},"Link":{"hex":"#d4e5f2ff","u16":[54604,58745,62251,65535]},"Negative":{"hex":"#f5dddfff","u16":[62983,56715,57221,65535]},"Neutral":{"hex":"#fbe1d2ff","u16":[64389,57815,54057,65535]},"Normal":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Positive":{"hex":"#adf6caff","u16":[44364,63230,51951,65535]},"Visited":{"hex":"#e8deeeff","u16":[59726,57050,61072,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]}}},"Disabled":{"background":{"Active":{"hex":"#c9e2f0ff","u16":[51633,58104,61582,65535]},"Alternate":{"hex":"#d8daddff","u16":[55389,56136,56880,65535]},"Link":{"hex":"#d1e0eaff","u16":[53755,57510,60082,65535]},"Negative":{"hex":"#efd8dbff","u16":[61309,55555,56290,65535]},"Neutral":{"hex":"#f2dac5ff","u16":[62133,56004,50594,65535]},"Normal":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Positive":{"hex":"#c3e6d3ff","u16":[50108,59146,54349,65535]},"Visited":{"hex":"#e4daeaff","u16":[58594,56069,60044,65535]}},"decoration":{"Focus":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Hover":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]}},"foreground":{"Active":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Inactive":{"hex":"#b8bfc5ff","u16":[47365,48981,50583,65535]},"Link":{"hex":"#9bc0d9ff","u16":[39710,49467,55672,65535]},"Negative":{"hex":"#e5a8afff","u16":[58782,43247,45071,65535]},"Neutral":{"hex":"#efb984ff","u16":[61470,47568,34027,65535]},"Normal":{"hex":"#a0a1a3ff","u16":[41059,41475,41892,65535]},"Positive":{"hex":"#a1cfb5ff","u16":[41402,53136,46608,65535]},"Visited":{"hex":"#cbb1d8ff","u16":[52205,45373,55410,65535]}},"shade":{"Dark":{"hex":"#82878cff","u16":[33341,34691,35987,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bbc0c5ff","u16":[48130,49391,50621,65535]},"Midlight":{"hex":"#ebedeeff","u16":[60472,60791,61110,65535]},"Shadow":{"hex":"#474a4cff","u16":[18200,18937,19645,65535]}}},"Inactive":{"background":{"Active":{"hex":"#d5eaf7ff","u16":[54852,60051,63563,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58339,58853,59367,65535]},"Link":{"hex":"#d4e5f2ff","u16":[54604,58745,62251,65535]},"Negative":{"hex":"#f5dddfff","u16":[62983,56715,57221,65535]},"Neutral":{"hex":"#fbe1d2ff","u16":[64389,57815,54057,65535]},"Normal":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Positive":{"hex":"#adf6caff","u16":[44364,63230,51951,65535]},"Visited":{"hex":"#e8deeeff","u16":[59726,57050,61072,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]}}}}},"sha256":"c46470b75e7df3e1ebff344748b92347f8d5adfa306aef9c91c4d2edae2cd6df","source":"/usr/share/color-schemes/BreezeLight.colors"}, +{"contrastF":0.4,"frameContrast":0.2,"input":{"ColorEffects:Disabled":{"Color":"56,56,56","ColorAmount":"0","ColorEffect":"0","ContrastAmount":"0.65","ContrastEffect":"1","IntensityAmount":"0.1","IntensityEffect":"2"},"ColorEffects:Inactive":{"ChangeSelectionColor":"true","Color":"112,111,110","ColorAmount":"0.025","ColorEffect":"2","ContrastAmount":"0.1","ContrastEffect":"2","Enable":"false","IntensityAmount":"0","IntensityEffect":"0"},"Colors:Button":{"BackgroundAlternate":"30,87,116","BackgroundNormal":"41,44,48","DecorationFocus":"61,174,233","DecorationHover":"61,174,233","ForegroundActive":"61,174,233","ForegroundInactive":"161,169,177","ForegroundLink":"29,153,243","ForegroundNegative":"218,68,83","ForegroundNeutral":"246,116,0","ForegroundNormal":"252,252,252","ForegroundPositive":"39,174,96","ForegroundVisited":"155,89,182"},"Colors:Complementary":{"BackgroundAlternate":"30,87,116","BackgroundNormal":"32,35,38","DecorationFocus":"61,174,233","DecorationHover":"61,174,233","ForegroundActive":"61,174,233","ForegroundInactive":"161,169,177","ForegroundLink":"29,153,243","ForegroundNegative":"218,68,83","ForegroundNeutral":"246,116,0","ForegroundNormal":"252,252,252","ForegroundPositive":"39,174,96","ForegroundVisited":"155,89,182"},"Colors:Header":{"BackgroundAlternate":"32,35,38","BackgroundNormal":"41,44,48","DecorationFocus":"61,174,233","DecorationHover":"61,174,233","ForegroundActive":"61,174,233","ForegroundInactive":"161,169,177","ForegroundLink":"29,153,243","ForegroundNegative":"218,68,83","ForegroundNeutral":"246,116,0","ForegroundNormal":"252,252,252","ForegroundPositive":"39,174,96","ForegroundVisited":"155,89,182"},"Colors:Header][Inactive":{"BackgroundAlternate":"41,44,48","BackgroundNormal":"32,35,38","DecorationFocus":"61,174,233","DecorationHover":"61,174,233","ForegroundActive":"61,174,233","ForegroundInactive":"161,169,177","ForegroundLink":"29,153,243","ForegroundNegative":"218,68,83","ForegroundNeutral":"246,116,0","ForegroundNormal":"252,252,252","ForegroundPositive":"39,174,96","ForegroundVisited":"155,89,182"},"Colors:Selection":{"BackgroundAlternate":"30,87,116","BackgroundNormal":"61,174,233","DecorationFocus":"61,174,233","DecorationHover":"61,174,233","ForegroundActive":"252,252,252","ForegroundInactive":"161,169,177","ForegroundLink":"253,188,75","ForegroundNegative":"176,55,69","ForegroundNeutral":"198,92,0","ForegroundNormal":"252,252,252","ForegroundPositive":"23,104,57","ForegroundVisited":"155,89,182"},"Colors:Tooltip":{"BackgroundAlternate":"32,35,38","BackgroundNormal":"41,44,48","DecorationFocus":"61,174,233","DecorationHover":"61,174,233","ForegroundActive":"61,174,233","ForegroundInactive":"161,169,177","ForegroundLink":"29,153,243","ForegroundNegative":"218,68,83","ForegroundNeutral":"246,116,0","ForegroundNormal":"252,252,252","ForegroundPositive":"39,174,96","ForegroundVisited":"155,89,182"},"Colors:View":{"BackgroundAlternate":"29,31,34","BackgroundNormal":"20,22,24","DecorationFocus":"61,174,233","DecorationHover":"61,174,233","ForegroundActive":"61,174,233","ForegroundInactive":"161,169,177","ForegroundLink":"29,153,243","ForegroundNegative":"218,68,83","ForegroundNeutral":"246,116,0","ForegroundNormal":"252,252,252","ForegroundPositive":"39,174,96","ForegroundVisited":"155,89,182"},"Colors:Window":{"BackgroundAlternate":"41,44,48","BackgroundNormal":"32,35,38","DecorationFocus":"61,174,233","DecorationHover":"61,174,233","ForegroundActive":"61,174,233","ForegroundInactive":"161,169,177","ForegroundLink":"29,153,243","ForegroundNegative":"218,68,83","ForegroundNeutral":"246,116,0","ForegroundNormal":"252,252,252","ForegroundPositive":"39,174,96","ForegroundVisited":"155,89,182"},"General":{"ColorScheme":"BreezeDark","Name":"Breeze Dark","shadeSortColumn":"true"},"KDE":{"contrast":"4"},"WM":{"activeBackground":"39,44,49","activeBlend":"252,252,252","activeForeground":"252,252,252","inactiveBackground":"32,36,40","inactiveBlend":"161,169,177","inactiveForeground":"161,169,177"}},"name":"BreezeDark","origin":"installed","palette":{"Active":{"Accent":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"AlternateBase":{"hex":"#1d1f22ff","u16":[7453,7967,8738,65535]},"Base":{"hex":"#141618ff","u16":[5140,5654,6168,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]},"ButtonText":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Dark":{"hex":"#131516ff","u16":[4829,5282,5735,65535]},"Highlight":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"HighlightedText":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Light":{"hex":"#393e43ff","u16":[14585,15952,17319,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"LinkVisited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]},"Mid":{"hex":"#1c1f21ff","u16":[7247,7927,8606,65535]},"Midlight":{"hex":"#2e3337ff","u16":[11896,13011,14126,65535]},"PlaceholderText":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Shadow":{"hex":"#0e0f10ff","u16":[3512,3841,4171,65535]},"Text":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"ToolTipBase":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]},"ToolTipText":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Window":{"hex":"#202326ff","u16":[8224,8995,9766,65535]},"WindowText":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}},"Disabled":{"Accent":{"hex":"#1f2124ff","u16":[7839,8574,9309,65535]},"AlternateBase":{"hex":"#1c1e20ff","u16":[7104,7594,8329,65535]},"Base":{"hex":"#131517ff","u16":[4900,5390,5880,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#272a2eff","u16":[10044,10779,11759,65535]},"ButtonText":{"hex":"#6d6f72ff","u16":[28136,28614,29251,65535]},"Dark":{"hex":"#121415ff","u16":[4603,5035,5466,65535]},"Highlight":{"hex":"#1f2124ff","u16":[7839,8574,9309,65535]},"HighlightedText":{"hex":"#686a6cff","u16":[26703,27181,27658,65535]},"Light":{"hex":"#383d42ff","u16":[14337,15681,17025,65535]},"Link":{"hex":"#164160ff","u16":[5672,16622,24657,65535]},"LinkVisited":{"hex":"#402b4cff","u16":[16475,11135,19427,65535]},"Mid":{"hex":"#1b1d20ff","u16":[6909,7556,8204,65535]},"Midlight":{"hex":"#2d3136ff","u16":[11618,12707,13796,65535]},"PlaceholderText":{"hex":"#42464aff","u16":[16990,17994,18998,65535]},"Shadow":{"hex":"#0d0e0fff","u16":[3349,3663,3977,65535]},"Text":{"hex":"#606263ff","u16":[24792,25111,25430,65535]},"ToolTipBase":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]},"ToolTipText":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Window":{"hex":"#1f2124ff","u16":[7839,8574,9309,65535]},"WindowText":{"hex":"#686a6cff","u16":[26703,27181,27658,65535]}},"Inactive":{"Accent":{"hex":"#1b4155ff","u16":[6925,16757,21966,65535]},"AlternateBase":{"hex":"#1d1f22ff","u16":[7453,7967,8738,65535]},"Base":{"hex":"#141618ff","u16":[5140,5654,6168,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]},"ButtonText":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Dark":{"hex":"#131516ff","u16":[4829,5282,5735,65535]},"Highlight":{"hex":"#1b4155ff","u16":[6925,16757,21966,65535]},"HighlightedText":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Light":{"hex":"#393e43ff","u16":[14585,15952,17319,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"LinkVisited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]},"Mid":{"hex":"#1c1f21ff","u16":[7247,7927,8606,65535]},"Midlight":{"hex":"#2e3337ff","u16":[11896,13011,14126,65535]},"PlaceholderText":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Shadow":{"hex":"#0e0f10ff","u16":[3512,3841,4171,65535]},"Text":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"ToolTipBase":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]},"ToolTipText":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Window":{"hex":"#202326ff","u16":[8224,8995,9766,65535]},"WindowText":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}}},"set_supported":{"Button":true,"Complementary":true,"Header":true,"Selection":true,"Tooltip":true,"View":true,"Window":true},"sets":{"Button":{"Active":{"background":{"Active":{"hex":"#1b3a4bff","u16":[6896,14933,19288,65535]},"Alternate":{"hex":"#1e5774ff","u16":[7710,22359,29812,65535]},"Link":{"hex":"#133853ff","u16":[4917,14324,21273,65535]},"Negative":{"hex":"#552329ff","u16":[21732,9020,10600,65535]},"Neutral":{"hex":"#512d0cff","u16":[20833,11468,3200,65535]},"Normal":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]},"Positive":{"hex":"#163d28ff","u16":[5574,15604,10191,65535]},"Visited":{"hex":"#402a4bff","u16":[16359,10883,19199,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#181a1cff","u16":[6188,6640,7244,65535]},"Light":{"hex":"#40444bff","u16":[16369,17567,19164,65535]},"Mid":{"hex":"#24272aff","u16":[9281,9960,10866,65535]},"Midlight":{"hex":"#363a3fff","u16":[13785,14794,16138,65535]},"Shadow":{"hex":"#111314ff","u16":[4490,4818,5256,65535]}}},"Disabled":{"background":{"Active":{"hex":"#1f313cff","u16":[7990,12570,15303,65535]},"Alternate":{"hex":"#1d536fff","u16":[7349,21313,28418,65535]},"Link":{"hex":"#1c3041ff","u16":[7087,12438,16585,65535]},"Negative":{"hex":"#40272cff","u16":[16526,9950,11269,65535]},"Neutral":{"hex":"#3d2b1bff","u16":[15671,10956,6941,65535]},"Normal":{"hex":"#272a2eff","u16":[10044,10779,11759,65535]},"Positive":{"hex":"#1d3329ff","u16":[7399,13073,10618,65535]},"Visited":{"hex":"#342a3dff","u16":[13371,10802,15678,65535]}},"decoration":{"Focus":{"hex":"#2e556bff","u16":[11759,21926,27622,65535]},"Hover":{"hex":"#2e556bff","u16":[11759,21926,27622,65535]}},"foreground":{"Active":{"hex":"#2e556bff","u16":[11759,21926,27622,65535]},"Inactive":{"hex":"#4f5459ff","u16":[20334,21497,22821,65535]},"Link":{"hex":"#234e6fff","u16":[9016,20126,28479,65535]},"Negative":{"hex":"#623239ff","u16":[25221,12837,14760,65535]},"Neutral":{"hex":"#6b421eff","u16":[27622,16952,7643,65535]},"Normal":{"hex":"#6d6f72ff","u16":[28136,28614,29251,65535]},"Positive":{"hex":"#26553eff","u16":[9873,21926,15875,65535]},"Visited":{"hex":"#4d395aff","u16":[19819,14638,23249,65535]}},"shade":{"Dark":{"hex":"#17191bff","u16":[5898,6330,6905,65535]},"Light":{"hex":"#3e4349ff","u16":[15996,17167,18727,65535]},"Mid":{"hex":"#222528ff","u16":[8848,9495,10359,65535]},"Midlight":{"hex":"#34383dff","u16":[13383,14362,15668,65535]},"Shadow":{"hex":"#111214ff","u16":[4282,4596,5013,65535]}}},"Inactive":{"background":{"Active":{"hex":"#1b3a4bff","u16":[6896,14933,19288,65535]},"Alternate":{"hex":"#1e5774ff","u16":[7710,22359,29812,65535]},"Link":{"hex":"#133853ff","u16":[4917,14324,21273,65535]},"Negative":{"hex":"#552329ff","u16":[21732,9020,10600,65535]},"Neutral":{"hex":"#512d0cff","u16":[20833,11468,3200,65535]},"Normal":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]},"Positive":{"hex":"#163d28ff","u16":[5574,15604,10191,65535]},"Visited":{"hex":"#402a4bff","u16":[16359,10883,19199,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#181a1cff","u16":[6188,6640,7244,65535]},"Light":{"hex":"#40444bff","u16":[16369,17567,19164,65535]},"Mid":{"hex":"#24272aff","u16":[9281,9960,10866,65535]},"Midlight":{"hex":"#363a3fff","u16":[13785,14794,16138,65535]},"Shadow":{"hex":"#111314ff","u16":[4490,4818,5256,65535]}}}},"Complementary":{"Active":{"background":{"Active":{"hex":"#163342ff","u16":[5768,13132,17061,65535]},"Alternate":{"hex":"#1e5774ff","u16":[7710,22359,29812,65535]},"Link":{"hex":"#0f3049ff","u16":[3907,12432,18670,65535]},"Negative":{"hex":"#491d22ff","u16":[18861,7508,8858,65535]},"Neutral":{"hex":"#472609ff","u16":[18363,9864,2300,65535]},"Normal":{"hex":"#202326ff","u16":[8224,8995,9766,65535]},"Positive":{"hex":"#123522ff","u16":[4517,13637,8654,65535]},"Visited":{"hex":"#372440ff","u16":[14073,9174,16553,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#131516ff","u16":[4829,5282,5735,65535]},"Light":{"hex":"#393e43ff","u16":[14585,15952,17319,65535]},"Mid":{"hex":"#1c1f21ff","u16":[7247,7927,8606,65535]},"Midlight":{"hex":"#2e3337ff","u16":[11896,13011,14126,65535]},"Shadow":{"hex":"#0e0f10ff","u16":[3512,3841,4171,65535]}}},"Disabled":{"background":{"Active":{"hex":"#182932ff","u16":[6250,10508,12917,65535]},"Alternate":{"hex":"#1d536fff","u16":[7349,21313,28418,65535]},"Link":{"hex":"#152837ff","u16":[5382,10359,14083,65535]},"Negative":{"hex":"#371f23ff","u16":[14113,8013,9100,65535]},"Neutral":{"hex":"#342314ff","u16":[13355,8977,5114,65535]},"Normal":{"hex":"#1f2124ff","u16":[7839,8574,9309,65535]},"Positive":{"hex":"#162b21ff","u16":[5678,10951,8536,65535]},"Visited":{"hex":"#2c2234ff","u16":[11222,8830,13239,65535]}},"decoration":{"Focus":{"hex":"#285065ff","u16":[10326,20493,26029,65535]},"Hover":{"hex":"#285065ff","u16":[10326,20493,26029,65535]}},"foreground":{"Active":{"hex":"#285065ff","u16":[10326,20493,26029,65535]},"Inactive":{"hex":"#4a4e53ff","u16":[18901,20064,21228,65535]},"Link":{"hex":"#1e4969ff","u16":[7582,18692,26887,65535]},"Negative":{"hex":"#5d2c33ff","u16":[23788,11404,13168,65535]},"Neutral":{"hex":"#663c18ff","u16":[26188,15520,6051,65535]},"Normal":{"hex":"#686a6cff","u16":[26703,27181,27658,65535]},"Positive":{"hex":"#215038ff","u16":[8440,20493,14282,65535]},"Visited":{"hex":"#483354ff","u16":[18386,13204,21657,65535]}},"shade":{"Dark":{"hex":"#121415ff","u16":[4603,5035,5466,65535]},"Light":{"hex":"#383d42ff","u16":[14337,15681,17025,65535]},"Mid":{"hex":"#1b1d20ff","u16":[6909,7556,8204,65535]},"Midlight":{"hex":"#2d3136ff","u16":[11618,12707,13796,65535]},"Shadow":{"hex":"#0d0e0fff","u16":[3349,3663,3977,65535]}}},"Inactive":{"background":{"Active":{"hex":"#163342ff","u16":[5768,13132,17061,65535]},"Alternate":{"hex":"#1e5774ff","u16":[7710,22359,29812,65535]},"Link":{"hex":"#0f3049ff","u16":[3907,12432,18670,65535]},"Negative":{"hex":"#491d22ff","u16":[18861,7508,8858,65535]},"Neutral":{"hex":"#472609ff","u16":[18363,9864,2300,65535]},"Normal":{"hex":"#202326ff","u16":[8224,8995,9766,65535]},"Positive":{"hex":"#123522ff","u16":[4517,13637,8654,65535]},"Visited":{"hex":"#372440ff","u16":[14073,9174,16553,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#131516ff","u16":[4829,5282,5735,65535]},"Light":{"hex":"#393e43ff","u16":[14585,15952,17319,65535]},"Mid":{"hex":"#1c1f21ff","u16":[7247,7927,8606,65535]},"Midlight":{"hex":"#2e3337ff","u16":[11896,13011,14126,65535]},"Shadow":{"hex":"#0e0f10ff","u16":[3512,3841,4171,65535]}}}},"Header":{"Active":{"background":{"Active":{"hex":"#1b3a4bff","u16":[6896,14933,19288,65535]},"Alternate":{"hex":"#202326ff","u16":[8224,8995,9766,65535]},"Link":{"hex":"#133853ff","u16":[4917,14324,21273,65535]},"Negative":{"hex":"#552329ff","u16":[21732,9020,10600,65535]},"Neutral":{"hex":"#512d0cff","u16":[20833,11468,3200,65535]},"Normal":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]},"Positive":{"hex":"#163d28ff","u16":[5574,15604,10191,65535]},"Visited":{"hex":"#402a4bff","u16":[16359,10883,19199,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#181a1cff","u16":[6188,6640,7244,65535]},"Light":{"hex":"#40444bff","u16":[16369,17567,19164,65535]},"Mid":{"hex":"#24272aff","u16":[9281,9960,10866,65535]},"Midlight":{"hex":"#363a3fff","u16":[13785,14794,16138,65535]},"Shadow":{"hex":"#111314ff","u16":[4490,4818,5256,65535]}}},"Disabled":{"background":{"Active":{"hex":"#1f313cff","u16":[7990,12570,15303,65535]},"Alternate":{"hex":"#1f2124ff","u16":[7839,8574,9309,65535]},"Link":{"hex":"#1c3041ff","u16":[7087,12438,16585,65535]},"Negative":{"hex":"#40272cff","u16":[16526,9950,11269,65535]},"Neutral":{"hex":"#3d2b1bff","u16":[15671,10956,6941,65535]},"Normal":{"hex":"#272a2eff","u16":[10044,10779,11759,65535]},"Positive":{"hex":"#1d3329ff","u16":[7399,13073,10618,65535]},"Visited":{"hex":"#342a3dff","u16":[13371,10802,15678,65535]}},"decoration":{"Focus":{"hex":"#2e556bff","u16":[11759,21926,27622,65535]},"Hover":{"hex":"#2e556bff","u16":[11759,21926,27622,65535]}},"foreground":{"Active":{"hex":"#2e556bff","u16":[11759,21926,27622,65535]},"Inactive":{"hex":"#4f5459ff","u16":[20334,21497,22821,65535]},"Link":{"hex":"#234e6fff","u16":[9016,20126,28479,65535]},"Negative":{"hex":"#623239ff","u16":[25221,12837,14760,65535]},"Neutral":{"hex":"#6b421eff","u16":[27622,16952,7643,65535]},"Normal":{"hex":"#6d6f72ff","u16":[28136,28614,29251,65535]},"Positive":{"hex":"#26553eff","u16":[9873,21926,15875,65535]},"Visited":{"hex":"#4d395aff","u16":[19819,14638,23249,65535]}},"shade":{"Dark":{"hex":"#17191bff","u16":[5898,6330,6905,65535]},"Light":{"hex":"#3e4349ff","u16":[15996,17167,18727,65535]},"Mid":{"hex":"#222528ff","u16":[8848,9495,10359,65535]},"Midlight":{"hex":"#34383dff","u16":[13383,14362,15668,65535]},"Shadow":{"hex":"#111214ff","u16":[4282,4596,5013,65535]}}},"Inactive":{"background":{"Active":{"hex":"#163342ff","u16":[5768,13132,17061,65535]},"Alternate":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]},"Link":{"hex":"#0f3049ff","u16":[3907,12432,18670,65535]},"Negative":{"hex":"#491d22ff","u16":[18861,7508,8858,65535]},"Neutral":{"hex":"#472609ff","u16":[18363,9864,2300,65535]},"Normal":{"hex":"#202326ff","u16":[8224,8995,9766,65535]},"Positive":{"hex":"#123522ff","u16":[4517,13637,8654,65535]},"Visited":{"hex":"#372440ff","u16":[14073,9174,16553,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#131516ff","u16":[4829,5282,5735,65535]},"Light":{"hex":"#393e43ff","u16":[14585,15952,17319,65535]},"Mid":{"hex":"#1c1f21ff","u16":[7247,7927,8606,65535]},"Midlight":{"hex":"#2e3337ff","u16":[11896,13011,14126,65535]},"Shadow":{"hex":"#0e0f10ff","u16":[3512,3841,4171,65535]}}}},"Selection":{"Active":{"background":{"Active":{"hex":"#5fb6daff","u16":[24519,46759,56078,65535]},"Alternate":{"hex":"#1e5774ff","u16":[7710,22359,29812,65535]},"Link":{"hex":"#b3ab74ff","u16":[46003,43823,29737,65535]},"Negative":{"hex":"#aa96b0ff","u16":[43694,38429,45353,65535]},"Neutral":{"hex":"#b29b74ff","u16":[45660,39812,29747,65535]},"Normal":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Positive":{"hex":"#32ada4ff","u16":[12736,44427,42135,65535]},"Visited":{"hex":"#9799d3ff","u16":[38815,39221,54248,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#fdbc4bff","u16":[65021,48316,19275,65535]},"Negative":{"hex":"#b03745ff","u16":[45232,14135,17733,65535]},"Neutral":{"hex":"#c65c00ff","u16":[50886,23644,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#176839ff","u16":[5911,26728,14649,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#246689ff","u16":[9206,26259,35163,65535]},"Light":{"hex":"#7ac6f9ff","u16":[31305,50791,63873,65535]},"Mid":{"hex":"#3596c9ff","u16":[13498,38503,51559,65535]},"Midlight":{"hex":"#41b9f7ff","u16":[16627,47428,63511,65535]},"Shadow":{"hex":"#174259ff","u16":[5979,17055,22838,65535]}}},"Disabled":{"background":{"Active":{"hex":"#182932ff","u16":[6250,10508,12917,65535]},"Alternate":{"hex":"#272a2eff","u16":[10044,10779,11759,65535]},"Link":{"hex":"#152837ff","u16":[5382,10359,14083,65535]},"Negative":{"hex":"#371f23ff","u16":[14113,8013,9100,65535]},"Neutral":{"hex":"#342314ff","u16":[13355,8977,5114,65535]},"Normal":{"hex":"#1f2124ff","u16":[7839,8574,9309,65535]},"Positive":{"hex":"#162b21ff","u16":[5678,10951,8536,65535]},"Visited":{"hex":"#2c2234ff","u16":[11222,8830,13239,65535]}},"decoration":{"Focus":{"hex":"#285065ff","u16":[10326,20493,26029,65535]},"Hover":{"hex":"#285065ff","u16":[10326,20493,26029,65535]}},"foreground":{"Active":{"hex":"#285065ff","u16":[10326,20493,26029,65535]},"Inactive":{"hex":"#4a4e53ff","u16":[18901,20064,21228,65535]},"Link":{"hex":"#1e4969ff","u16":[7582,18692,26887,65535]},"Negative":{"hex":"#5d2c33ff","u16":[23788,11404,13168,65535]},"Neutral":{"hex":"#663c18ff","u16":[26188,15520,6051,65535]},"Normal":{"hex":"#686a6cff","u16":[26703,27181,27658,65535]},"Positive":{"hex":"#215038ff","u16":[8440,20493,14282,65535]},"Visited":{"hex":"#483354ff","u16":[18386,13204,21657,65535]}},"shade":{"Dark":{"hex":"#121415ff","u16":[4603,5035,5466,65535]},"Light":{"hex":"#383d42ff","u16":[14337,15681,17025,65535]},"Mid":{"hex":"#1b1d20ff","u16":[6909,7556,8204,65535]},"Midlight":{"hex":"#2d3136ff","u16":[11618,12707,13796,65535]},"Shadow":{"hex":"#0d0e0fff","u16":[3349,3663,3977,65535]}}},"Inactive":{"background":{"Active":{"hex":"#1b4a63ff","u16":[6989,19050,25370,65535]},"Alternate":{"hex":"#1e475cff","u16":[7822,18208,23768,65535]},"Link":{"hex":"#12486cff","u16":[4643,18446,27874,65535]},"Negative":{"hex":"#68323fff","u16":[26686,12898,16217,65535]},"Neutral":{"hex":"#603d1aff","u16":[24702,15719,6629,65535]},"Normal":{"hex":"#1b4155ff","u16":[6925,16757,21966,65535]},"Positive":{"hex":"#154e3aff","u16":[5442,19994,14886,65535]},"Visited":{"hex":"#4a3b68ff","u16":[19071,15048,26829,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#102632ff","u16":[4066,9840,12899,65535]},"Light":{"hex":"#245873ff","u16":[9343,22609,29637,65535]},"Mid":{"hex":"#18394bff","u16":[6091,14738,19320,65535]},"Midlight":{"hex":"#204d65ff","u16":[8205,19854,26025,65535]},"Shadow":{"hex":"#0b1c24ff","u16":[2932,7095,9300,65535]}}}},"Tooltip":{"Active":{"background":{"Active":{"hex":"#1b3a4bff","u16":[6896,14933,19288,65535]},"Alternate":{"hex":"#202326ff","u16":[8224,8995,9766,65535]},"Link":{"hex":"#133853ff","u16":[4917,14324,21273,65535]},"Negative":{"hex":"#552329ff","u16":[21732,9020,10600,65535]},"Neutral":{"hex":"#512d0cff","u16":[20833,11468,3200,65535]},"Normal":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]},"Positive":{"hex":"#163d28ff","u16":[5574,15604,10191,65535]},"Visited":{"hex":"#402a4bff","u16":[16359,10883,19199,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#181a1cff","u16":[6188,6640,7244,65535]},"Light":{"hex":"#40444bff","u16":[16369,17567,19164,65535]},"Mid":{"hex":"#24272aff","u16":[9281,9960,10866,65535]},"Midlight":{"hex":"#363a3fff","u16":[13785,14794,16138,65535]},"Shadow":{"hex":"#111314ff","u16":[4490,4818,5256,65535]}}},"Disabled":{"background":{"Active":{"hex":"#1f313cff","u16":[7990,12570,15303,65535]},"Alternate":{"hex":"#1f2124ff","u16":[7839,8574,9309,65535]},"Link":{"hex":"#1c3041ff","u16":[7087,12438,16585,65535]},"Negative":{"hex":"#40272cff","u16":[16526,9950,11269,65535]},"Neutral":{"hex":"#3d2b1bff","u16":[15671,10956,6941,65535]},"Normal":{"hex":"#272a2eff","u16":[10044,10779,11759,65535]},"Positive":{"hex":"#1d3329ff","u16":[7399,13073,10618,65535]},"Visited":{"hex":"#342a3dff","u16":[13371,10802,15678,65535]}},"decoration":{"Focus":{"hex":"#2e556bff","u16":[11759,21926,27622,65535]},"Hover":{"hex":"#2e556bff","u16":[11759,21926,27622,65535]}},"foreground":{"Active":{"hex":"#2e556bff","u16":[11759,21926,27622,65535]},"Inactive":{"hex":"#4f5459ff","u16":[20334,21497,22821,65535]},"Link":{"hex":"#234e6fff","u16":[9016,20126,28479,65535]},"Negative":{"hex":"#623239ff","u16":[25221,12837,14760,65535]},"Neutral":{"hex":"#6b421eff","u16":[27622,16952,7643,65535]},"Normal":{"hex":"#6d6f72ff","u16":[28136,28614,29251,65535]},"Positive":{"hex":"#26553eff","u16":[9873,21926,15875,65535]},"Visited":{"hex":"#4d395aff","u16":[19819,14638,23249,65535]}},"shade":{"Dark":{"hex":"#17191bff","u16":[5898,6330,6905,65535]},"Light":{"hex":"#3e4349ff","u16":[15996,17167,18727,65535]},"Mid":{"hex":"#222528ff","u16":[8848,9495,10359,65535]},"Midlight":{"hex":"#34383dff","u16":[13383,14362,15668,65535]},"Shadow":{"hex":"#111214ff","u16":[4282,4596,5013,65535]}}},"Inactive":{"background":{"Active":{"hex":"#1b3a4bff","u16":[6896,14933,19288,65535]},"Alternate":{"hex":"#202326ff","u16":[8224,8995,9766,65535]},"Link":{"hex":"#133853ff","u16":[4917,14324,21273,65535]},"Negative":{"hex":"#552329ff","u16":[21732,9020,10600,65535]},"Neutral":{"hex":"#512d0cff","u16":[20833,11468,3200,65535]},"Normal":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]},"Positive":{"hex":"#163d28ff","u16":[5574,15604,10191,65535]},"Visited":{"hex":"#402a4bff","u16":[16359,10883,19199,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#181a1cff","u16":[6188,6640,7244,65535]},"Light":{"hex":"#40444bff","u16":[16369,17567,19164,65535]},"Mid":{"hex":"#24272aff","u16":[9281,9960,10866,65535]},"Midlight":{"hex":"#363a3fff","u16":[13785,14794,16138,65535]},"Shadow":{"hex":"#111314ff","u16":[4490,4818,5256,65535]}}}},"View":{"Active":{"background":{"Active":{"hex":"#122b38ff","u16":[4508,11049,14513,65535]},"Alternate":{"hex":"#1d1f22ff","u16":[7453,7967,8738,65535]},"Link":{"hex":"#0b283dff","u16":[2774,10231,15673,65535]},"Negative":{"hex":"#3c161aff","u16":[15396,5670,6764,65535]},"Neutral":{"hex":"#3c1f05ff","u16":[15545,7989,1258,65535]},"Normal":{"hex":"#141618ff","u16":[5140,5654,6168,65535]},"Positive":{"hex":"#0d2c1bff","u16":[3334,11349,6883,65535]},"Visited":{"hex":"#2c1c34ff","u16":[11338,7094,13342,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#6d7883ff","u16":[27950,30745,33540,65535]},"Light":{"hex":"#a2b0bfff","u16":[41613,45334,49093,65535]},"Mid":{"hex":"#505860ff","u16":[20618,22680,24742,65535]},"Midlight":{"hex":"#828f9cff","u16":[33483,36832,40180,65535]},"Shadow":{"hex":"#828f9cff","u16":[33483,36832,40180,65535]}}},"Disabled":{"background":{"Active":{"hex":"#101e26ff","u16":[4138,7824,9858,65535]},"Alternate":{"hex":"#1c1e20ff","u16":[7104,7594,8329,65535]},"Link":{"hex":"#0d1e2aff","u16":[3316,7643,10848,65535]},"Negative":{"hex":"#2b1518ff","u16":[11025,5446,6284,65535]},"Neutral":{"hex":"#29190bff","u16":[10415,6388,2820,65535]},"Normal":{"hex":"#131517ff","u16":[4900,5390,5880,65535]},"Positive":{"hex":"#0e2017ff","u16":[3593,8184,5900,65535]},"Visited":{"hex":"#211827ff","u16":[8529,6234,10080,65535]}},"decoration":{"Focus":{"hex":"#21485dff","u16":[8415,18422,23800,65535]},"Hover":{"hex":"#21485dff","u16":[8415,18422,23800,65535]}},"foreground":{"Active":{"hex":"#21485dff","u16":[8415,18422,23800,65535]},"Inactive":{"hex":"#42464aff","u16":[16990,17994,18998,65535]},"Link":{"hex":"#164160ff","u16":[5672,16622,24657,65535]},"Negative":{"hex":"#55242bff","u16":[21877,9334,10938,65535]},"Neutral":{"hex":"#5e340fff","u16":[24278,13449,3822,65535]},"Normal":{"hex":"#606263ff","u16":[24792,25111,25430,65535]},"Positive":{"hex":"#19482fff","u16":[6529,18422,12053,65535]},"Visited":{"hex":"#402b4cff","u16":[16475,11135,19427,65535]}},"shade":{"Dark":{"hex":"#6d7782ff","u16":[27919,30711,33503,65535]},"Light":{"hex":"#a2b0bfff","u16":[41588,45314,49078,65535]},"Mid":{"hex":"#505860ff","u16":[20574,22631,24689,65535]},"Midlight":{"hex":"#828f9cff","u16":[33459,36805,40150,65535]},"Shadow":{"hex":"#828f9cff","u16":[33459,36805,40150,65535]}}},"Inactive":{"background":{"Active":{"hex":"#122b38ff","u16":[4508,11049,14513,65535]},"Alternate":{"hex":"#1d1f22ff","u16":[7453,7967,8738,65535]},"Link":{"hex":"#0b283dff","u16":[2774,10231,15673,65535]},"Negative":{"hex":"#3c161aff","u16":[15396,5670,6764,65535]},"Neutral":{"hex":"#3c1f05ff","u16":[15545,7989,1258,65535]},"Normal":{"hex":"#141618ff","u16":[5140,5654,6168,65535]},"Positive":{"hex":"#0d2c1bff","u16":[3334,11349,6883,65535]},"Visited":{"hex":"#2c1c34ff","u16":[11338,7094,13342,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#6d7883ff","u16":[27950,30745,33540,65535]},"Light":{"hex":"#a2b0bfff","u16":[41613,45334,49093,65535]},"Mid":{"hex":"#505860ff","u16":[20618,22680,24742,65535]},"Midlight":{"hex":"#828f9cff","u16":[33483,36832,40180,65535]},"Shadow":{"hex":"#828f9cff","u16":[33483,36832,40180,65535]}}}},"Window":{"Active":{"background":{"Active":{"hex":"#163342ff","u16":[5768,13132,17061,65535]},"Alternate":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]},"Link":{"hex":"#0f3049ff","u16":[3907,12432,18670,65535]},"Negative":{"hex":"#491d22ff","u16":[18861,7508,8858,65535]},"Neutral":{"hex":"#472609ff","u16":[18363,9864,2300,65535]},"Normal":{"hex":"#202326ff","u16":[8224,8995,9766,65535]},"Positive":{"hex":"#123522ff","u16":[4517,13637,8654,65535]},"Visited":{"hex":"#372440ff","u16":[14073,9174,16553,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#131516ff","u16":[4829,5282,5735,65535]},"Light":{"hex":"#393e43ff","u16":[14585,15952,17319,65535]},"Mid":{"hex":"#1c1f21ff","u16":[7247,7927,8606,65535]},"Midlight":{"hex":"#2e3337ff","u16":[11896,13011,14126,65535]},"Shadow":{"hex":"#0e0f10ff","u16":[3512,3841,4171,65535]}}},"Disabled":{"background":{"Active":{"hex":"#182932ff","u16":[6250,10508,12917,65535]},"Alternate":{"hex":"#272a2eff","u16":[10044,10779,11759,65535]},"Link":{"hex":"#152837ff","u16":[5382,10359,14083,65535]},"Negative":{"hex":"#371f23ff","u16":[14113,8013,9100,65535]},"Neutral":{"hex":"#342314ff","u16":[13355,8977,5114,65535]},"Normal":{"hex":"#1f2124ff","u16":[7839,8574,9309,65535]},"Positive":{"hex":"#162b21ff","u16":[5678,10951,8536,65535]},"Visited":{"hex":"#2c2234ff","u16":[11222,8830,13239,65535]}},"decoration":{"Focus":{"hex":"#285065ff","u16":[10326,20493,26029,65535]},"Hover":{"hex":"#285065ff","u16":[10326,20493,26029,65535]}},"foreground":{"Active":{"hex":"#285065ff","u16":[10326,20493,26029,65535]},"Inactive":{"hex":"#4a4e53ff","u16":[18901,20064,21228,65535]},"Link":{"hex":"#1e4969ff","u16":[7582,18692,26887,65535]},"Negative":{"hex":"#5d2c33ff","u16":[23788,11404,13168,65535]},"Neutral":{"hex":"#663c18ff","u16":[26188,15520,6051,65535]},"Normal":{"hex":"#686a6cff","u16":[26703,27181,27658,65535]},"Positive":{"hex":"#215038ff","u16":[8440,20493,14282,65535]},"Visited":{"hex":"#483354ff","u16":[18386,13204,21657,65535]}},"shade":{"Dark":{"hex":"#121415ff","u16":[4603,5035,5466,65535]},"Light":{"hex":"#383d42ff","u16":[14337,15681,17025,65535]},"Mid":{"hex":"#1b1d20ff","u16":[6909,7556,8204,65535]},"Midlight":{"hex":"#2d3136ff","u16":[11618,12707,13796,65535]},"Shadow":{"hex":"#0d0e0fff","u16":[3349,3663,3977,65535]}}},"Inactive":{"background":{"Active":{"hex":"#163342ff","u16":[5768,13132,17061,65535]},"Alternate":{"hex":"#292c30ff","u16":[10537,11308,12336,65535]},"Link":{"hex":"#0f3049ff","u16":[3907,12432,18670,65535]},"Negative":{"hex":"#491d22ff","u16":[18861,7508,8858,65535]},"Neutral":{"hex":"#472609ff","u16":[18363,9864,2300,65535]},"Normal":{"hex":"#202326ff","u16":[8224,8995,9766,65535]},"Positive":{"hex":"#123522ff","u16":[4517,13637,8654,65535]},"Visited":{"hex":"#372440ff","u16":[14073,9174,16553,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#131516ff","u16":[4829,5282,5735,65535]},"Light":{"hex":"#393e43ff","u16":[14585,15952,17319,65535]},"Mid":{"hex":"#1c1f21ff","u16":[7247,7927,8606,65535]},"Midlight":{"hex":"#2e3337ff","u16":[11896,13011,14126,65535]},"Shadow":{"hex":"#0e0f10ff","u16":[3512,3841,4171,65535]}}}}},"sha256":"11fce1d8ab97b529162e50eb200d1a93fab65c7612f9bebd0230a6a348d0cc21","source":"/usr/share/color-schemes/BreezeDark.colors"}, +{"contrastF":0.4,"frameContrast":0.2,"input":{"ColorEffects:Disabled":{"Color":"56,56,56","ColorAmount":"0","ColorEffect":"0","ContrastAmount":"0.65","ContrastEffect":"1","IntensityAmount":"0.1","IntensityEffect":"2"},"ColorEffects:Inactive":{"ChangeSelectionColor":"true","Color":"112,111,110","ColorAmount":"0.025","ColorEffect":"2","ContrastAmount":"0.1","ContrastEffect":"2","Enable":"false","IntensityAmount":"0","IntensityEffect":"0"},"Colors:Button":{"BackgroundAlternate":"189,195,199","BackgroundNormal":"239,240,241","DecorationFocus":"61,174,233","DecorationHover":"147,206,233","ForegroundActive":"61,174,233","ForegroundInactive":"127,140,141","ForegroundLink":"41,128,185","ForegroundNegative":"218,68,83","ForegroundNeutral":"198,92,0","ForegroundNormal":"35,38,39","ForegroundPositive":"39,174,96","ForegroundVisited":"127,140,141"},"Colors:Complementary":{"BackgroundAlternate":"59,64,69","BackgroundNormal":"49,54,59","DecorationFocus":"30,146,255","DecorationHover":"61,174,230","ForegroundActive":"147,206,233","ForegroundInactive":"175,176,179","ForegroundLink":"61,174,230","ForegroundNegative":"231,76,60","ForegroundNeutral":"253,188,75","ForegroundNormal":"239,240,241","ForegroundPositive":"46,204,113","ForegroundVisited":"61,174,230"},"Colors:Selection":{"BackgroundAlternate":"29,153,243","BackgroundNormal":"61,174,233","DecorationFocus":"61,174,233","DecorationHover":"147,206,233","ForegroundActive":"252,252,252","ForegroundInactive":"239,240,241","ForegroundLink":"253,188,75","ForegroundNegative":"176,55,69","ForegroundNeutral":"246,116,0","ForegroundNormal":"252,252,252","ForegroundPositive":"23,104,57","ForegroundVisited":"189,195,199"},"Colors:Tooltip":{"BackgroundAlternate":"77,77,77","BackgroundNormal":"35,38,39","DecorationFocus":"61,174,233","DecorationHover":"147,206,233","ForegroundActive":"61,174,233","ForegroundInactive":"189,195,199","ForegroundLink":"41,128,185","ForegroundNegative":"218,68,83","ForegroundNeutral":"246,116,0","ForegroundNormal":"252,252,252","ForegroundPositive":"39,174,96","ForegroundVisited":"127,140,141"},"Colors:View":{"BackgroundAlternate":"239,240,241","BackgroundNormal":"252,252,252","DecorationFocus":"61,174,233","DecorationHover":"147,206,233","ForegroundActive":"61,174,233","ForegroundInactive":"127,140,141","ForegroundLink":"41,128,185","ForegroundNegative":"218,68,83","ForegroundNeutral":"246,116,0","ForegroundNormal":"35,38,39","ForegroundPositive":"39,174,96","ForegroundVisited":"127,140,141"},"Colors:Window":{"BackgroundAlternate":"189,195,199","BackgroundNormal":"239,240,241","DecorationFocus":"61,174,233","DecorationHover":"147,206,233","ForegroundActive":"61,174,233","ForegroundInactive":"127,140,141","ForegroundLink":"41,128,185","ForegroundNegative":"218,68,83","ForegroundNeutral":"246,116,0","ForegroundNormal":"35,38,39","ForegroundPositive":"39,174,96","ForegroundVisited":"127,140,141"},"General":{"ColorScheme":"BreezeClassic","Name":"Breeze Classic","accentActiveTitlebar":"true","accentInactiveTitlebar":"false","shadeSortColumn":"true"},"KDE":{"contrast":"4"},"WM":{"activeBackground":"71,80,87","activeBlend":"252,252,252","activeForeground":"252,252,252","inactiveBackground":"239,240,241","inactiveBlend":"75,71,67","inactiveForeground":"189,195,199"}},"name":"BreezeClassic","origin":"installed","palette":{"Active":{"Accent":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"AlternateBase":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Base":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"ButtonText":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Highlight":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"HighlightedText":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"LinkVisited":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"PlaceholderText":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]},"Text":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"ToolTipBase":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"ToolTipText":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Window":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"WindowText":{"hex":"#232627ff","u16":[8995,9766,10023,65535]}},"Disabled":{"Accent":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"AlternateBase":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Base":{"hex":"#f0f0f0ff","u16":[61735,61735,61735,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"ButtonText":{"hex":"#a0a1a2ff","u16":[41059,41475,41720,65535]},"Dark":{"hex":"#82878cff","u16":[33341,34691,35987,65535]},"Highlight":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"HighlightedText":{"hex":"#a0a1a2ff","u16":[41059,41475,41720,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Link":{"hex":"#a2c8e0ff","u16":[41595,51411,57571,65535]},"LinkVisited":{"hex":"#c7cbcbff","u16":[51017,52133,52218,65535]},"Mid":{"hex":"#bbc0c5ff","u16":[48130,49391,50621,65535]},"Midlight":{"hex":"#ebedeeff","u16":[60472,60791,61110,65535]},"PlaceholderText":{"hex":"#c7cbcbff","u16":[51017,52133,52218,65535]},"Shadow":{"hex":"#474a4cff","u16":[18200,18937,19645,65535]},"Text":{"hex":"#a8a9a9ff","u16":[43129,43387,43472,65535]},"ToolTipBase":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"ToolTipText":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Window":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"WindowText":{"hex":"#a0a1a2ff","u16":[41059,41475,41720,65535]}},"Inactive":{"Accent":{"hex":"#c2e0f5ff","u16":[49797,57489,62894,65535]},"AlternateBase":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Base":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"ButtonText":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Highlight":{"hex":"#c2e0f5ff","u16":[49797,57489,62894,65535]},"HighlightedText":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"LinkVisited":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"PlaceholderText":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]},"Text":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"ToolTipBase":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"ToolTipText":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Window":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"WindowText":{"hex":"#232627ff","u16":[8995,9766,10023,65535]}}},"set_supported":{"Button":true,"Complementary":true,"Header":false,"Selection":true,"Tooltip":true,"View":true,"Window":true},"sets":{"Button":{"Active":{"background":{"Active":{"hex":"#d5eaf7ff","u16":[54852,60051,63563,65535]},"Alternate":{"hex":"#bdc3c7ff","u16":[48573,50115,51143,65535]},"Link":{"hex":"#d4e5f2ff","u16":[54604,58745,62251,65535]},"Negative":{"hex":"#f5dddfff","u16":[62983,56715,57221,65535]},"Neutral":{"hex":"#f7deceff","u16":[63563,56954,53062,65535]},"Normal":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Positive":{"hex":"#adf6caff","u16":[44364,63230,51951,65535]},"Visited":{"hex":"#dee6e7ff","u16":[57140,59044,59270,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#c65c00ff","u16":[50886,23644,0,65535]},"Normal":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}},"shade":{"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]}}},"Disabled":{"background":{"Active":{"hex":"#c9e2f0ff","u16":[51633,58104,61582,65535]},"Alternate":{"hex":"#b3babfff","u16":[46008,47826,49030,65535]},"Link":{"hex":"#d1e0eaff","u16":[53755,57510,60082,65535]},"Negative":{"hex":"#efd8dbff","u16":[61309,55555,56290,65535]},"Neutral":{"hex":"#ebdbceff","u16":[60270,56259,52901,65535]},"Normal":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Positive":{"hex":"#c3e6d3ff","u16":[50108,59146,54349,65535]},"Visited":{"hex":"#dcdedfff","u16":[56481,57129,57326,65535]}},"decoration":{"Focus":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Hover":{"hex":"#bddbe9ff","u16":[48529,56272,59804,65535]}},"foreground":{"Active":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Inactive":{"hex":"#bec3c4ff","u16":[48948,50221,50466,65535]},"Link":{"hex":"#9bc0d9ff","u16":[39710,49467,55672,65535]},"Negative":{"hex":"#e5a8afff","u16":[58782,43247,45071,65535]},"Neutral":{"hex":"#dbb28dff","u16":[56379,45777,36142,65535]},"Normal":{"hex":"#a0a1a2ff","u16":[41059,41475,41720,65535]},"Positive":{"hex":"#a1cfb5ff","u16":[41402,53136,46608,65535]},"Visited":{"hex":"#bec3c4ff","u16":[48948,50221,50466,65535]}},"shade":{"Dark":{"hex":"#82878cff","u16":[33341,34691,35987,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bbc0c5ff","u16":[48130,49391,50621,65535]},"Midlight":{"hex":"#ebedeeff","u16":[60472,60791,61110,65535]},"Shadow":{"hex":"#474a4cff","u16":[18200,18937,19645,65535]}}},"Inactive":{"background":{"Active":{"hex":"#d5eaf7ff","u16":[54852,60051,63563,65535]},"Alternate":{"hex":"#bdc3c7ff","u16":[48573,50115,51143,65535]},"Link":{"hex":"#d4e5f2ff","u16":[54604,58745,62251,65535]},"Negative":{"hex":"#f5dddfff","u16":[62983,56715,57221,65535]},"Neutral":{"hex":"#f7deceff","u16":[63563,56954,53062,65535]},"Normal":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Positive":{"hex":"#adf6caff","u16":[44364,63230,51951,65535]},"Visited":{"hex":"#dee6e7ff","u16":[57140,59044,59270,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#c65c00ff","u16":[50886,23644,0,65535]},"Normal":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}},"shade":{"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]}}}},"Complementary":{"Active":{"background":{"Active":{"hex":"#33444dff","u16":[13230,17572,19739,65535]},"Alternate":{"hex":"#3b4045ff","u16":[15163,16448,17733,65535]},"Link":{"hex":"#204355ff","u16":[8135,17104,21728,65535]},"Negative":{"hex":"#622c27ff","u16":[25139,11184,10089,65535]},"Neutral":{"hex":"#504023ff","u16":[20486,16381,9001,65535]},"Normal":{"hex":"#31363bff","u16":[12593,13878,15163,65535]},"Positive":{"hex":"#1a4830ff","u16":[6722,18565,12287,65535]},"Visited":{"hex":"#204355ff","u16":[8135,17104,21728,65535]}},"decoration":{"Focus":{"hex":"#1e92ffff","u16":[7710,37522,65535,65535]},"Hover":{"hex":"#3daee6ff","u16":[15677,44718,59110,65535]}},"foreground":{"Active":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]},"Inactive":{"hex":"#afb0b3ff","u16":[44975,45232,46003,65535]},"Link":{"hex":"#3daee6ff","u16":[15677,44718,59110,65535]},"Negative":{"hex":"#e74c3cff","u16":[59367,19532,15420,65535]},"Neutral":{"hex":"#fdbc4bff","u16":[65021,48316,19275,65535]},"Normal":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Positive":{"hex":"#2ecc71ff","u16":[11822,52428,29041,65535]},"Visited":{"hex":"#3daee6ff","u16":[15677,44718,59110,65535]}},"shade":{"Dark":{"hex":"#1d2023ff","u16":[7395,8149,8904,65535]},"Light":{"hex":"#464d54ff","u16":[17874,19698,21522,65535]},"Mid":{"hex":"#2b3034ff","u16":[11084,12215,13346,65535]},"Midlight":{"hex":"#3c4248ff","u16":[15447,17023,18599,65535]},"Shadow":{"hex":"#151719ff","u16":[5349,5894,6441,65535]}}},"Disabled":{"background":{"Active":{"hex":"#2f3a40ff","u16":[12041,14808,16455,65535]},"Alternate":{"hex":"#383d42ff","u16":[14454,15679,16904,65535]},"Link":{"hex":"#263a45ff","u16":[9705,14907,17861,65535]},"Negative":{"hex":"#4a3030ff","u16":[19084,12321,12339,65535]},"Neutral":{"hex":"#3e372bff","u16":[15825,14245,10976,65535]},"Normal":{"hex":"#2f3338ff","u16":[12004,13229,14454,65535]},"Positive":{"hex":"#233d32ff","u16":[8905,15613,12901,65535]},"Visited":{"hex":"#263a45ff","u16":[9705,14907,17861,65535]}},"decoration":{"Focus":{"hex":"#28527aff","u16":[10375,21117,31260,65535]},"Hover":{"hex":"#335c71ff","u16":[13033,23518,29116,65535]}},"foreground":{"Active":{"hex":"#4f6672ff","u16":[20407,26262,29373,65535]},"Inactive":{"hex":"#595c60ff","u16":[22808,23690,24743,65535]},"Link":{"hex":"#335c71ff","u16":[13033,23518,29116,65535]},"Negative":{"hex":"#6b3b39ff","u16":[27610,15115,14540,65535]},"Neutral":{"hex":"#73603eff","u16":[29496,24718,15826,65535]},"Normal":{"hex":"#6e7275ff","u16":[28296,29178,30059,65535]},"Positive":{"hex":"#2e664aff","u16":[11747,26091,19084,65535]},"Visited":{"hex":"#335c71ff","u16":[13033,23518,29116,65535]}},"shade":{"Dark":{"hex":"#1b1e21ff","u16":[7049,7768,8488,65535]},"Light":{"hex":"#444b51ff","u16":[17376,19149,20922,65535]},"Mid":{"hex":"#292d32ff","u16":[10568,11646,12725,65535]},"Midlight":{"hex":"#3a4046ff","u16":[14928,16451,17975,65535]},"Shadow":{"hex":"#141618ff","u16":[5103,5624,6145,65535]}}},"Inactive":{"background":{"Active":{"hex":"#33444dff","u16":[13230,17572,19739,65535]},"Alternate":{"hex":"#3b4045ff","u16":[15163,16448,17733,65535]},"Link":{"hex":"#204355ff","u16":[8135,17104,21728,65535]},"Negative":{"hex":"#622c27ff","u16":[25139,11184,10089,65535]},"Neutral":{"hex":"#504023ff","u16":[20486,16381,9001,65535]},"Normal":{"hex":"#31363bff","u16":[12593,13878,15163,65535]},"Positive":{"hex":"#1a4830ff","u16":[6722,18565,12287,65535]},"Visited":{"hex":"#204355ff","u16":[8135,17104,21728,65535]}},"decoration":{"Focus":{"hex":"#1e92ffff","u16":[7710,37522,65535,65535]},"Hover":{"hex":"#3daee6ff","u16":[15677,44718,59110,65535]}},"foreground":{"Active":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]},"Inactive":{"hex":"#afb0b3ff","u16":[44975,45232,46003,65535]},"Link":{"hex":"#3daee6ff","u16":[15677,44718,59110,65535]},"Negative":{"hex":"#e74c3cff","u16":[59367,19532,15420,65535]},"Neutral":{"hex":"#fdbc4bff","u16":[65021,48316,19275,65535]},"Normal":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Positive":{"hex":"#2ecc71ff","u16":[11822,52428,29041,65535]},"Visited":{"hex":"#3daee6ff","u16":[15677,44718,59110,65535]}},"shade":{"Dark":{"hex":"#1d2023ff","u16":[7395,8149,8904,65535]},"Light":{"hex":"#464d54ff","u16":[17874,19698,21522,65535]},"Mid":{"hex":"#2b3034ff","u16":[11084,12215,13346,65535]},"Midlight":{"hex":"#3c4248ff","u16":[15447,17023,18599,65535]},"Shadow":{"hex":"#151719ff","u16":[5349,5894,6441,65535]}}}},"Header":{"Active":{"background":{"Active":{"hex":"#d5eaf7ff","u16":[54852,60051,63563,65535]},"Alternate":{"hex":"#bdc3c7ff","u16":[48573,50115,51143,65535]},"Link":{"hex":"#d4e5f2ff","u16":[54604,58745,62251,65535]},"Negative":{"hex":"#f5dddfff","u16":[62983,56715,57221,65535]},"Neutral":{"hex":"#fbe1d2ff","u16":[64389,57815,54057,65535]},"Normal":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Positive":{"hex":"#adf6caff","u16":[44364,63230,51951,65535]},"Visited":{"hex":"#dee6e7ff","u16":[57140,59044,59270,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}},"shade":{"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]}}},"Disabled":{"background":{"Active":{"hex":"#c9e2f0ff","u16":[51633,58104,61582,65535]},"Alternate":{"hex":"#b3babfff","u16":[46008,47826,49030,65535]},"Link":{"hex":"#d1e0eaff","u16":[53755,57510,60082,65535]},"Negative":{"hex":"#efd8dbff","u16":[61309,55555,56290,65535]},"Neutral":{"hex":"#f2dac5ff","u16":[62133,56004,50594,65535]},"Normal":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Positive":{"hex":"#c3e6d3ff","u16":[50108,59146,54349,65535]},"Visited":{"hex":"#dcdedfff","u16":[56481,57129,57326,65535]}},"decoration":{"Focus":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Hover":{"hex":"#bddbe9ff","u16":[48529,56272,59804,65535]}},"foreground":{"Active":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Inactive":{"hex":"#bec3c4ff","u16":[48948,50221,50466,65535]},"Link":{"hex":"#9bc0d9ff","u16":[39710,49467,55672,65535]},"Negative":{"hex":"#e5a8afff","u16":[58782,43247,45071,65535]},"Neutral":{"hex":"#efb984ff","u16":[61470,47568,34027,65535]},"Normal":{"hex":"#a0a1a2ff","u16":[41059,41475,41720,65535]},"Positive":{"hex":"#a1cfb5ff","u16":[41402,53136,46608,65535]},"Visited":{"hex":"#bec3c4ff","u16":[48948,50221,50466,65535]}},"shade":{"Dark":{"hex":"#82878cff","u16":[33341,34691,35987,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bbc0c5ff","u16":[48130,49391,50621,65535]},"Midlight":{"hex":"#ebedeeff","u16":[60472,60791,61110,65535]},"Shadow":{"hex":"#474a4cff","u16":[18200,18937,19645,65535]}}},"Inactive":{"background":{"Active":{"hex":"#d5eaf7ff","u16":[54852,60051,63563,65535]},"Alternate":{"hex":"#bdc3c7ff","u16":[48573,50115,51143,65535]},"Link":{"hex":"#d4e5f2ff","u16":[54604,58745,62251,65535]},"Negative":{"hex":"#f5dddfff","u16":[62983,56715,57221,65535]},"Neutral":{"hex":"#fbe1d2ff","u16":[64389,57815,54057,65535]},"Normal":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Positive":{"hex":"#adf6caff","u16":[44364,63230,51951,65535]},"Visited":{"hex":"#dee6e7ff","u16":[57140,59044,59270,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}},"shade":{"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]}}}},"Selection":{"Active":{"background":{"Active":{"hex":"#5fb6daff","u16":[24519,46759,56078,65535]},"Alternate":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Link":{"hex":"#b3ab74ff","u16":[46003,43823,29737,65535]},"Negative":{"hex":"#aa96b0ff","u16":[43694,38429,45353,65535]},"Neutral":{"hex":"#cb9555ff","u16":[52118,38235,21913,65535]},"Normal":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Positive":{"hex":"#32ada4ff","u16":[12736,44427,42135,65535]},"Visited":{"hex":"#89afc3ff","u16":[35206,44847,50019,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Inactive":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#fdbc4bff","u16":[65021,48316,19275,65535]},"Negative":{"hex":"#b03745ff","u16":[45232,14135,17733,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#176839ff","u16":[5911,26728,14649,65535]},"Visited":{"hex":"#bdc3c7ff","u16":[48573,50115,51143,65535]}},"shade":{"Dark":{"hex":"#246689ff","u16":[9206,26259,35163,65535]},"Light":{"hex":"#7ac6f9ff","u16":[31305,50791,63873,65535]},"Mid":{"hex":"#3596c9ff","u16":[13498,38503,51559,65535]},"Midlight":{"hex":"#41b9f7ff","u16":[16627,47428,63511,65535]},"Shadow":{"hex":"#174259ff","u16":[5979,17055,22838,65535]}}},"Disabled":{"background":{"Active":{"hex":"#c9e2f0ff","u16":[51633,58104,61582,65535]},"Alternate":{"hex":"#b3babfff","u16":[46008,47826,49030,65535]},"Link":{"hex":"#d1e0eaff","u16":[53755,57510,60082,65535]},"Negative":{"hex":"#efd8dbff","u16":[61309,55555,56290,65535]},"Neutral":{"hex":"#f2dac5ff","u16":[62133,56004,50594,65535]},"Normal":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Positive":{"hex":"#c3e6d3ff","u16":[50108,59146,54349,65535]},"Visited":{"hex":"#dcdedfff","u16":[56481,57129,57326,65535]}},"decoration":{"Focus":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Hover":{"hex":"#bddbe9ff","u16":[48529,56272,59804,65535]}},"foreground":{"Active":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Inactive":{"hex":"#bec3c4ff","u16":[48948,50221,50466,65535]},"Link":{"hex":"#9bc0d9ff","u16":[39710,49467,55672,65535]},"Negative":{"hex":"#e5a8afff","u16":[58782,43247,45071,65535]},"Neutral":{"hex":"#efb984ff","u16":[61470,47568,34027,65535]},"Normal":{"hex":"#a0a1a2ff","u16":[41059,41475,41720,65535]},"Positive":{"hex":"#a1cfb5ff","u16":[41402,53136,46608,65535]},"Visited":{"hex":"#bec3c4ff","u16":[48948,50221,50466,65535]}},"shade":{"Dark":{"hex":"#82878cff","u16":[33341,34691,35987,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bbc0c5ff","u16":[48130,49391,50621,65535]},"Midlight":{"hex":"#ebedeeff","u16":[60472,60791,61110,65535]},"Shadow":{"hex":"#474a4cff","u16":[18200,18937,19645,65535]}}},"Inactive":{"background":{"Active":{"hex":"#b3d9f4ff","u16":[45899,55787,62650,65535]},"Alternate":{"hex":"#63bff1ff","u16":[25410,49055,62014,65535]},"Link":{"hex":"#b5d4efff","u16":[46454,54609,61533,65535]},"Negative":{"hex":"#e8c9cfff","u16":[59622,51622,53083,65535]},"Neutral":{"hex":"#f4cbb0ff","u16":[62731,52266,45109,65535]},"Normal":{"hex":"#c2e0f5ff","u16":[49797,57489,62894,65535]},"Positive":{"hex":"#75e9b8ff","u16":[30182,59846,47181,65535]},"Visited":{"hex":"#c5d5dcff","u16":[50597,54642,56482,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}},"shade":{"Dark":{"hex":"#4b88a8ff","u16":[19360,34951,43113,65535]},"Light":{"hex":"#f8fbfeff","u16":[63734,64548,65196,65535]},"Mid":{"hex":"#75c2ecff","u16":[30160,49859,60666,65535]},"Midlight":{"hex":"#d1e7f7ff","u16":[53672,59338,63476,65535]},"Shadow":{"hex":"#2b4d5fff","u16":[10934,19739,24349,65535]}}}},"Tooltip":{"Active":{"background":{"Active":{"hex":"#183545ff","u16":[6119,13690,17608,65535]},"Alternate":{"hex":"#4d4d4dff","u16":[19789,19789,19789,65535]},"Link":{"hex":"#153042ff","u16":[5520,12451,16928,65535]},"Negative":{"hex":"#4d1f24ff","u16":[19746,7978,9242,65535]},"Neutral":{"hex":"#4a2809ff","u16":[19123,10359,2434,65535]},"Normal":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"Positive":{"hex":"#133723ff","u16":[4843,14233,8978,65535]},"Visited":{"hex":"#2c3031ff","u16":[11296,12414,12550,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#bdc3c7ff","u16":[48573,50115,51143,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}},"shade":{"Dark":{"hex":"#151617ff","u16":[5282,5735,5886,65535]},"Light":{"hex":"#3b4042ff","u16":[15202,16505,16940,65535]},"Mid":{"hex":"#1f2122ff","u16":[7926,8605,8832,65535]},"Midlight":{"hex":"#313536ff","u16":[12535,13609,13967,65535]},"Shadow":{"hex":"#0f1011ff","u16":[3839,4168,4278,65535]}}},"Disabled":{"background":{"Active":{"hex":"#1a2b34ff","u16":[6808,11169,13370,65535]},"Alternate":{"hex":"#494949ff","u16":[18864,18864,18864,65535]},"Link":{"hex":"#1a2a34ff","u16":[6802,10915,13469,65535]},"Negative":{"hex":"#3a2225ff","u16":[14878,8635,9451,65535]},"Neutral":{"hex":"#372515ff","u16":[14082,9603,5374,65535]},"Normal":{"hex":"#212425ff","u16":[8574,9309,9554,65535]},"Positive":{"hex":"#182d23ff","u16":[6227,11621,8879,65535]},"Visited":{"hex":"#262a2aff","u16":[9762,10680,10858,65535]}},"decoration":{"Focus":{"hex":"#2a5266ff","u16":[10804,20970,26188,65535]},"Hover":{"hex":"#475c66ff","u16":[18177,23715,26188,65535]}},"foreground":{"Active":{"hex":"#2a5266ff","u16":[10804,20970,26188,65535]},"Inactive":{"hex":"#55595bff","u16":[21779,22771,23273,65535]},"Link":{"hex":"#234256ff","u16":[9089,17027,22073,65535]},"Negative":{"hex":"#5e2e34ff","u16":[24266,11882,13327,65535]},"Neutral":{"hex":"#683e18ff","u16":[26666,15997,6210,65535]},"Normal":{"hex":"#6a6c6cff","u16":[27181,27658,27817,65535]},"Positive":{"hex":"#235238ff","u16":[8918,20970,14442,65535]},"Visited":{"hex":"#404647ff","u16":[16462,18055,18300,65535]}},"shade":{"Dark":{"hex":"#141516ff","u16":[5035,5466,5610,65535]},"Light":{"hex":"#3a3f41ff","u16":[14915,16194,16620,65535]},"Mid":{"hex":"#1d2021ff","u16":[7555,8203,8419,65535]},"Midlight":{"hex":"#303435ff","u16":[12217,13264,13613,65535]},"Shadow":{"hex":"#0e0f10ff","u16":[3661,3974,4079,65535]}}},"Inactive":{"background":{"Active":{"hex":"#183545ff","u16":[6119,13690,17608,65535]},"Alternate":{"hex":"#4d4d4dff","u16":[19789,19789,19789,65535]},"Link":{"hex":"#153042ff","u16":[5520,12451,16928,65535]},"Negative":{"hex":"#4d1f24ff","u16":[19746,7978,9242,65535]},"Neutral":{"hex":"#4a2809ff","u16":[19123,10359,2434,65535]},"Normal":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"Positive":{"hex":"#133723ff","u16":[4843,14233,8978,65535]},"Visited":{"hex":"#2c3031ff","u16":[11296,12414,12550,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#bdc3c7ff","u16":[48573,50115,51143,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}},"shade":{"Dark":{"hex":"#151617ff","u16":[5282,5735,5886,65535]},"Light":{"hex":"#3b4042ff","u16":[15202,16505,16940,65535]},"Mid":{"hex":"#1f2122ff","u16":[7926,8605,8832,65535]},"Midlight":{"hex":"#313536ff","u16":[12535,13609,13967,65535]},"Shadow":{"hex":"#0f1011ff","u16":[3839,4168,4278,65535]}}}},"View":{"Active":{"background":{"Active":{"hex":"#e8f3fbff","u16":[59585,62560,64614,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#e4eef7ff","u16":[58702,61204,63367,65535]},"Negative":{"hex":"#f9e9eaff","u16":[64094,59877,60196,65535]},"Neutral":{"hex":"#fdeee5ff","u16":[65131,61115,58894,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#d4fae2ff","u16":[54552,64146,58102,65535]},"Visited":{"hex":"#ebf0f0ff","u16":[60480,61653,61745,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}},"shade":{"Dark":{"hex":"#d5d5d5ff","u16":[54787,54787,54787,65535]},"Light":{"hex":"#e3e3e3ff","u16":[58341,58341,58341,65535]},"Mid":{"hex":"#e3e3e3ff","u16":[58341,58341,58341,65535]},"Midlight":{"hex":"#f0f0f0ff","u16":[61653,61653,61653,65535]},"Shadow":{"hex":"#bcbcbcff","u16":[48440,48440,48440,65535]}}},"Disabled":{"background":{"Active":{"hex":"#d8edf7ff","u16":[55550,60800,63569,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Link":{"hex":"#dfeaf2ff","u16":[57339,60254,62215,65535]},"Negative":{"hex":"#f7e4e6ff","u16":[63468,58657,59124,65535]},"Neutral":{"hex":"#fae6d4ff","u16":[64273,59033,54466,65535]},"Normal":{"hex":"#f0f0f0ff","u16":[61735,61735,61735,65535]},"Positive":{"hex":"#d9eee2ff","u16":[55792,61232,58043,65535]},"Visited":{"hex":"#e7e9eaff","u16":[59471,59982,60022,65535]}},"decoration":{"Focus":{"hex":"#a2d8f3ff","u16":[41654,55609,62421,65535]},"Hover":{"hex":"#c3e3f1ff","u16":[49996,58299,61922,65535]}},"foreground":{"Active":{"hex":"#a2d8f3ff","u16":[41654,55609,62421,65535]},"Inactive":{"hex":"#c7cbcbff","u16":[51017,52133,52218,65535]},"Link":{"hex":"#a2c8e0ff","u16":[41595,51411,57571,65535]},"Negative":{"hex":"#eeafb6ff","u16":[61133,45056,46720,65535]},"Neutral":{"hex":"#f9c088ff","u16":[63954,49376,34973,65535]},"Normal":{"hex":"#a8a9a9ff","u16":[43129,43387,43472,65535]},"Positive":{"hex":"#a9d6bcff","u16":[43472,55048,48360,65535]},"Visited":{"hex":"#c7cbcbff","u16":[51017,52133,52218,65535]}},"shade":{"Dark":{"hex":"#8d8d8dff","u16":[36252,36252,36252,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c8c8c8ff","u16":[51382,51382,51382,65535]},"Midlight":{"hex":"#f7f7f7ff","u16":[63513,63513,63513,65535]},"Shadow":{"hex":"#494949ff","u16":[18840,18840,18840,65535]}}},"Inactive":{"background":{"Active":{"hex":"#e8f3fbff","u16":[59585,62560,64614,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#e4eef7ff","u16":[58702,61204,63367,65535]},"Negative":{"hex":"#f9e9eaff","u16":[64094,59877,60196,65535]},"Neutral":{"hex":"#fdeee5ff","u16":[65131,61115,58894,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#d4fae2ff","u16":[54552,64146,58102,65535]},"Visited":{"hex":"#ebf0f0ff","u16":[60480,61653,61745,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}},"shade":{"Dark":{"hex":"#d5d5d5ff","u16":[54787,54787,54787,65535]},"Light":{"hex":"#e3e3e3ff","u16":[58341,58341,58341,65535]},"Mid":{"hex":"#e3e3e3ff","u16":[58341,58341,58341,65535]},"Midlight":{"hex":"#f0f0f0ff","u16":[61653,61653,61653,65535]},"Shadow":{"hex":"#bcbcbcff","u16":[48440,48440,48440,65535]}}}},"Window":{"Active":{"background":{"Active":{"hex":"#d5eaf7ff","u16":[54852,60051,63563,65535]},"Alternate":{"hex":"#bdc3c7ff","u16":[48573,50115,51143,65535]},"Link":{"hex":"#d4e5f2ff","u16":[54604,58745,62251,65535]},"Negative":{"hex":"#f5dddfff","u16":[62983,56715,57221,65535]},"Neutral":{"hex":"#fbe1d2ff","u16":[64389,57815,54057,65535]},"Normal":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Positive":{"hex":"#adf6caff","u16":[44364,63230,51951,65535]},"Visited":{"hex":"#dee6e7ff","u16":[57140,59044,59270,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}},"shade":{"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]}}},"Disabled":{"background":{"Active":{"hex":"#c9e2f0ff","u16":[51633,58104,61582,65535]},"Alternate":{"hex":"#b3babfff","u16":[46008,47826,49030,65535]},"Link":{"hex":"#d1e0eaff","u16":[53755,57510,60082,65535]},"Negative":{"hex":"#efd8dbff","u16":[61309,55555,56290,65535]},"Neutral":{"hex":"#f2dac5ff","u16":[62133,56004,50594,65535]},"Normal":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Positive":{"hex":"#c3e6d3ff","u16":[50108,59146,54349,65535]},"Visited":{"hex":"#dcdedfff","u16":[56481,57129,57326,65535]}},"decoration":{"Focus":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Hover":{"hex":"#bddbe9ff","u16":[48529,56272,59804,65535]}},"foreground":{"Active":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Inactive":{"hex":"#bec3c4ff","u16":[48948,50221,50466,65535]},"Link":{"hex":"#9bc0d9ff","u16":[39710,49467,55672,65535]},"Negative":{"hex":"#e5a8afff","u16":[58782,43247,45071,65535]},"Neutral":{"hex":"#efb984ff","u16":[61470,47568,34027,65535]},"Normal":{"hex":"#a0a1a2ff","u16":[41059,41475,41720,65535]},"Positive":{"hex":"#a1cfb5ff","u16":[41402,53136,46608,65535]},"Visited":{"hex":"#bec3c4ff","u16":[48948,50221,50466,65535]}},"shade":{"Dark":{"hex":"#82878cff","u16":[33341,34691,35987,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bbc0c5ff","u16":[48130,49391,50621,65535]},"Midlight":{"hex":"#ebedeeff","u16":[60472,60791,61110,65535]},"Shadow":{"hex":"#474a4cff","u16":[18200,18937,19645,65535]}}},"Inactive":{"background":{"Active":{"hex":"#d5eaf7ff","u16":[54852,60051,63563,65535]},"Alternate":{"hex":"#bdc3c7ff","u16":[48573,50115,51143,65535]},"Link":{"hex":"#d4e5f2ff","u16":[54604,58745,62251,65535]},"Negative":{"hex":"#f5dddfff","u16":[62983,56715,57221,65535]},"Neutral":{"hex":"#fbe1d2ff","u16":[64389,57815,54057,65535]},"Normal":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Positive":{"hex":"#adf6caff","u16":[44364,63230,51951,65535]},"Visited":{"hex":"#dee6e7ff","u16":[57140,59044,59270,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232627ff","u16":[8995,9766,10023,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#7f8c8dff","u16":[32639,35980,36237,65535]}},"shade":{"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]}}}}},"sha256":"19dcbd1883c03d2d9e0176a39e3ec9df6c18d6e22f0474e6c886aa20aff76508","source":"/usr/share/color-schemes/BreezeClassic.colors"}, +{"contrastF":0.7000000000000001,"frameContrast":0.2,"input":{"ColorEffects:Disabled":{"Color":"56,56,56","ColorAmount":"0","ColorEffect":"0","ContrastAmount":"0.65","ContrastEffect":"1","IntensityAmount":"0.1","IntensityEffect":"2"},"ColorEffects:Inactive":{"ChangeSelectionColor":"true","Color":"112,111,110","ColorAmount":"-0.9","ColorEffect":"1","ContrastAmount":"0.25","ContrastEffect":"2","Enable":"true","IntensityAmount":"0","IntensityEffect":"0"},"Colors:Button":{"BackgroundAlternate":"224,223,222","BackgroundNormal":"223,220,217","DecorationFocus":"58,167,221","DecorationHover":"110,214,255","ForegroundActive":"146,76,157","ForegroundInactive":"137,136,135","ForegroundLink":"0,87,174","ForegroundNegative":"191,3,3","ForegroundNeutral":"176,128,0","ForegroundNormal":"34,31,30","ForegroundPositive":"0,110,40","ForegroundVisited":"100,74,155"},"Colors:Complementary":{"BackgroundAlternate":"196,224,255","BackgroundNormal":"24,21,19","DecorationFocus":"58,167,221","DecorationHover":"110,214,255","ForegroundActive":"255,128,224","ForegroundInactive":"137,136,135","ForegroundLink":"88,172,255","ForegroundNegative":"191,3,3","ForegroundNeutral":"176,128,0","ForegroundNormal":"231,253,255","ForegroundPositive":"0,110,40","ForegroundVisited":"150,111,232"},"Colors:Selection":{"BackgroundAlternate":"62,138,204","BackgroundNormal":"67,172,232","DecorationFocus":"58,167,221","DecorationHover":"110,214,255","ForegroundActive":"108,36,119","ForegroundInactive":"199,226,248","ForegroundLink":"0,49,110","ForegroundNegative":"156,14,14","ForegroundNeutral":"255,221,0","ForegroundNormal":"255,255,255","ForegroundPositive":"128,255,128","ForegroundVisited":"69,40,134"},"Colors:Tooltip":{"BackgroundAlternate":"196,224,255","BackgroundNormal":"24,21,19","DecorationFocus":"58,167,221","DecorationHover":"110,214,255","ForegroundActive":"255,128,224","ForegroundInactive":"137,136,135","ForegroundLink":"88,172,255","ForegroundNegative":"191,3,3","ForegroundNeutral":"176,128,0","ForegroundNormal":"231,253,255","ForegroundPositive":"0,110,40","ForegroundVisited":"150,111,232"},"Colors:View":{"BackgroundAlternate":"248,247,246","BackgroundNormal":"255,255,255","DecorationFocus":"58,167,221","DecorationHover":"110,214,255","ForegroundActive":"146,76,157","ForegroundInactive":"137,136,135","ForegroundLink":"0,87,174","ForegroundNegative":"191,3,3","ForegroundNeutral":"176,128,0","ForegroundNormal":"31,28,27","ForegroundPositive":"0,110,40","ForegroundVisited":"100,74,155"},"Colors:Window":{"BackgroundAlternate":"218,217,216","BackgroundNormal":"214,210,208","DecorationFocus":"58,167,221","DecorationHover":"110,214,255","ForegroundActive":"146,76,157","ForegroundInactive":"137,136,135","ForegroundLink":"0,87,174","ForegroundNegative":"191,3,3","ForegroundNeutral":"176,128,0","ForegroundNormal":"34,31,30","ForegroundPositive":"0,110,40","ForegroundVisited":"100,74,155"},"General":{"ColorScheme":"Oxygen","Name":"Oxygen","shadeSortColumn":"true"},"KDE":{"contrast":"7"},"WM":{"activeBackground":"48,174,232","activeForeground":"255,255,255","inactiveBackground":"224,223,222","inactiveForeground":"75,71,67"}},"name":"Oxygen","origin":"installed","palette":{"Active":{"Accent":{"hex":"#43ace8ff","u16":[17219,44204,59624,65535]},"AlternateBase":{"hex":"#f8f7f6ff","u16":[63736,63479,63222,65535]},"Base":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#dfdcd9ff","u16":[57311,56540,55769,65535]},"ButtonText":{"hex":"#221f1eff","u16":[8738,7967,7710,65535]},"Dark":{"hex":"#6a6663ff","u16":[27308,26139,25540,65535]},"Highlight":{"hex":"#43ace8ff","u16":[17219,44204,59624,65535]},"HighlightedText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Light":{"hex":"#fcfcfcff","u16":[64868,64810,64782,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"LinkVisited":{"hex":"#644a9bff","u16":[25700,19018,39835,65535]},"Mid":{"hex":"#b3aba7ff","u16":[45927,43961,42954,65535]},"Midlight":{"hex":"#e1deddff","u16":[57863,57141,56783,65535]},"PlaceholderText":{"hex":"#898887ff","u16":[35209,34952,34695,65535]},"Shadow":{"hex":"#3e3b3aff","u16":[15866,15187,14839,65535]},"Text":{"hex":"#1f1c1bff","u16":[7967,7196,6939,65535]},"ToolTipBase":{"hex":"#181513ff","u16":[6168,5397,4883,65535]},"ToolTipText":{"hex":"#e7fdffff","u16":[59367,65021,65535,65535]},"Window":{"hex":"#d6d2d0ff","u16":[54998,53970,53456,65535]},"WindowText":{"hex":"#221f1eff","u16":[8738,7967,7710,65535]}},"Disabled":{"Accent":{"hex":"#cdc8c5ff","u16":[52684,51389,50738,65535]},"AlternateBase":{"hex":"#eeebe9ff","u16":[61105,60453,59795,65535]},"Base":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#d6d2ceff","u16":[54884,53854,52816,65535]},"ButtonText":{"hex":"#969390ff","u16":[38425,37690,37127,65535]},"Dark":{"hex":"#65615fff","u16":[26031,24916,24346,65535]},"Highlight":{"hex":"#cdc8c5ff","u16":[52684,51389,50738,65535]},"HighlightedText":{"hex":"#908c8bff","u16":[36992,36098,35694,65535]},"Light":{"hex":"#f2f1f0ff","u16":[62161,61859,61710,65535]},"Link":{"hex":"#97bcdfff","u16":[38808,48270,57321,65535]},"LinkVisited":{"hex":"#c1b6d7ff","u16":[49480,46689,55271,65535]},"Mid":{"hex":"#aba4a0ff","u16":[44022,42136,41171,65535]},"Midlight":{"hex":"#d9d5d3ff","u16":[55662,54707,54230,65535]},"PlaceholderText":{"hex":"#cccbcbff","u16":[52378,52263,52148,65535]},"Shadow":{"hex":"#3d3a39ff","u16":[15564,14897,14556,65535]},"Text":{"hex":"#a9a7a7ff","u16":[43305,42997,42894,65535]},"ToolTipBase":{"hex":"#181513ff","u16":[6168,5397,4883,65535]},"ToolTipText":{"hex":"#e7fdffff","u16":[59367,65021,65535,65535]},"Window":{"hex":"#cdc8c5ff","u16":[52684,51389,50738,65535]},"WindowText":{"hex":"#908c8bff","u16":[36992,36098,35694,65535]}},"Inactive":{"Accent":{"hex":"#77cdffff","u16":[30690,52623,65535,65535]},"AlternateBase":{"hex":"#f9f7f5ff","u16":[63934,63446,62957,65535]},"Base":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#e1dcd6ff","u16":[57898,56441,54962,65535]},"ButtonText":{"hex":"#302e2cff","u16":[12315,11750,11380,65535]},"Dark":{"hex":"#6d6560ff","u16":[28138,25946,24784,65535]},"Highlight":{"hex":"#77cdffff","u16":[30690,52623,65535,65535]},"HighlightedText":{"hex":"#192e3aff","u16":[6406,11812,14819,65535]},"Light":{"hex":"#fdfcfcff","u16":[64911,64801,64747,65535]},"Link":{"hex":"#196595ff","u16":[6435,25994,38342,65535]},"LinkVisited":{"hex":"#7c3cccff","u16":[31909,15310,52402,65535]},"Mid":{"hex":"#b8aaa2ff","u16":[47322,43637,41682,65535]},"Midlight":{"hex":"#e3dedbff","u16":[58391,57025,56340,65535]},"PlaceholderText":{"hex":"#8e8d8cff","u16":[36462,36267,36073,65535]},"Shadow":{"hex":"#403b38ff","u16":[16348,15075,14399,65535]},"Text":{"hex":"#313030ff","u16":[12590,12306,12211,65535]},"ToolTipBase":{"hex":"#181513ff","u16":[6168,5397,4883,65535]},"ToolTipText":{"hex":"#e7fdffff","u16":[59367,65021,65535,65535]},"Window":{"hex":"#d9d1ceff","u16":[55745,53804,52819,65535]},"WindowText":{"hex":"#2f2d2bff","u16":[12120,11458,11173,65535]}}},"set_supported":{"Button":true,"Complementary":true,"Header":false,"Selection":true,"Tooltip":true,"View":true,"Window":true},"sets":{"Button":{"Active":{"background":{"Active":{"hex":"#dacadcff","u16":[56000,51927,56485,65535]},"Alternate":{"hex":"#e0dfdeff","u16":[57568,57311,57054,65535]},"Link":{"hex":"#b7ceefff","u16":[46978,53038,61457,65535]},"Negative":{"hex":"#ebc5c4ff","u16":[60277,50531,50474,65535]},"Neutral":{"hex":"#f6cf69ff","u16":[63211,53134,26879,65535]},"Normal":{"hex":"#dfdcd9ff","u16":[57311,56540,55769,65535]},"Positive":{"hex":"#7be39eff","u16":[31679,58330,40673,65535]},"Visited":{"hex":"#cfcadbff","u16":[53279,51862,56384,65535]}},"decoration":{"Focus":{"hex":"#3aa7ddff","u16":[14906,42919,56797,65535]},"Hover":{"hex":"#6ed6ffff","u16":[28270,54998,65535,65535]}},"foreground":{"Active":{"hex":"#924c9dff","u16":[37522,19532,40349,65535]},"Inactive":{"hex":"#898887ff","u16":[35209,34952,34695,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#221f1eff","u16":[8738,7967,7710,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#644a9bff","u16":[25700,19018,39835,65535]}},"shade":{"Dark":{"hex":"#6e6b68ff","u16":[28210,27457,26691,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#b8b3aeff","u16":[47169,45910,44630,65535]},"Midlight":{"hex":"#eae8e6ff","u16":[60025,59525,59028,65535]},"Shadow":{"hex":"#3e3c3aff","u16":[15875,15451,15020,65535]}}},"Disabled":{"background":{"Active":{"hex":"#d6c7d4ff","u16":[54920,51222,54444,65535]},"Alternate":{"hex":"#d6d5d3ff","u16":[54968,54616,54263,65535]},"Link":{"hex":"#c2ccd8ff","u16":[49768,52540,55417,65535]},"Negative":{"hex":"#e1c4c2ff","u16":[57922,50378,49971,65535]},"Neutral":{"hex":"#dacba8ff","u16":[55943,52128,43100,65535]},"Normal":{"hex":"#d6d2ceff","u16":[54884,53854,52816,65535]},"Positive":{"hex":"#b9d1bdff","u16":[47589,53835,48626,65535]},"Visited":{"hex":"#cfc9d5ff","u16":[53246,51652,54701,65535]}},"decoration":{"Focus":{"hex":"#9ac1d2ff","u16":[39567,49501,54066,65535]},"Hover":{"hex":"#a5d2e1ff","u16":[42287,53845,57815,65535]}},"foreground":{"Active":{"hex":"#bea0beff","u16":[48883,41138,48869,65535]},"Inactive":{"hex":"#b8b6b3ff","u16":[47257,46693,46130,65535]},"Link":{"hex":"#88a6c2ff","u16":[35026,42548,49966,65535]},"Negative":{"hex":"#d18684ff","u16":[53710,34488,33910,65535]},"Neutral":{"hex":"#c5b386ff","u16":[50601,46008,34555,65535]},"Normal":{"hex":"#969390ff","u16":[38425,37690,37127,65535]},"Positive":{"hex":"#8aad94ff","u16":[35510,44465,37985,65535]},"Visited":{"hex":"#ada0beff","u16":[44390,41161,48807,65535]}},"shade":{"Dark":{"hex":"#696663ff","u16":[26890,26173,25443,65535]},"Light":{"hex":"#fcfbfbff","u16":[64707,64635,64565,65535]},"Mid":{"hex":"#b0aba7ff","u16":[45240,44034,42806,65535]},"Midlight":{"hex":"#e1dedbff","u16":[57749,57023,56298,65535]},"Shadow":{"hex":"#3d3b3aff","u16":[15652,15234,14809,65535]}}},"Inactive":{"background":{"Active":{"hex":"#dbcbdbff","u16":[56358,52122,56218,65535]},"Alternate":{"hex":"#e1dfddff","u16":[57766,57278,56789,65535]},"Link":{"hex":"#aad3edff","u16":[43799,54256,60979,65535]},"Negative":{"hex":"#e9c7c5ff","u16":[59840,51034,50611,65535]},"Neutral":{"hex":"#edd365ff","u16":[60858,54136,26007,65535]},"Normal":{"hex":"#e1dcd6ff","u16":[57898,56441,54962,65535]},"Positive":{"hex":"#7be3b0ff","u16":[31616,58324,45110,65535]},"Visited":{"hex":"#d4c9e1ff","u16":[54497,51716,57853,65535]}},"decoration":{"Focus":{"hex":"#46acd1ff","u16":[18005,44292,53678,65535]},"Hover":{"hex":"#86d8f0ff","u16":[34485,55640,61794,65535]}},"foreground":{"Active":{"hex":"#97539cff","u16":[38916,21245,40110,65535]},"Inactive":{"hex":"#8f8c89ff","u16":[36684,35927,35161,65535]},"Link":{"hex":"#0a6495ff","u16":[2661,25592,38353,65535]},"Negative":{"hex":"#c42119ff","u16":[50282,8598,6378,65535]},"Neutral":{"hex":"#a88900ff","u16":[43074,35307,0,65535]},"Normal":{"hex":"#302e2cff","u16":[12315,11750,11380,65535]},"Positive":{"hex":"#00733fff","u16":[0,29664,16284,65535]},"Visited":{"hex":"#7745b2ff","u16":[30514,17759,45744,65535]}},"shade":{"Dark":{"hex":"#706a65ff","u16":[28775,27359,25875,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bbb2a8ff","u16":[48114,45747,43264,65535]},"Midlight":{"hex":"#ebe7e4ff","u16":[60408,59461,58511,65535]},"Shadow":{"hex":"#3f3c39ff","u16":[16193,15396,14561,65535]}}}},"Complementary":{"Active":{"background":{"Active":{"hex":"#3c2035ff","u16":[15508,8241,13516,65535]},"Alternate":{"hex":"#c4e0ffff","u16":[50372,57568,65535,65535]},"Link":{"hex":"#182a3cff","u16":[6220,10826,15427,65535]},"Negative":{"hex":"#400605ff","u16":[16353,1449,1334,65535]},"Neutral":{"hex":"#2f2304ff","u16":[12000,8917,1016,65535]},"Normal":{"hex":"#181513ff","u16":[6168,5397,4883,65535]},"Positive":{"hex":"#052510ff","u16":[1385,9425,4083,65535]},"Visited":{"hex":"#291f3bff","u16":[10514,7954,15288,65535]}},"decoration":{"Focus":{"hex":"#3aa7ddff","u16":[14906,42919,56797,65535]},"Hover":{"hex":"#6ed6ffff","u16":[28270,54998,65535,65535]}},"foreground":{"Active":{"hex":"#ff80e0ff","u16":[65535,32896,57568,65535]},"Inactive":{"hex":"#898887ff","u16":[35209,34952,34695,65535]},"Link":{"hex":"#58acffff","u16":[22616,44204,65535,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#e7fdffff","u16":[59367,65021,65535,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#966fe8ff","u16":[38550,28527,59624,65535]}},"shade":{"Dark":{"hex":"#a59183ff","u16":[42506,37193,33650,65535]},"Light":{"hex":"#e5dad3ff","u16":[58782,55921,54181,65535]},"Mid":{"hex":"#796a60ff","u16":[31219,27317,24715,65535]},"Midlight":{"hex":"#c6ae9dff","u16":[50997,44622,40373,65535]},"Shadow":{"hex":"#c6ae9dff","u16":[50997,44622,40373,65535]}}},"Disabled":{"background":{"Active":{"hex":"#281822ff","u16":[10225,6130,8751,65535]},"Alternate":{"hex":"#b0d7ffff","u16":[45226,55185,65535,65535]},"Link":{"hex":"#151e26ff","u16":[5376,7586,9878,65535]},"Negative":{"hex":"#330c0bff","u16":[13174,3130,2847,65535]},"Neutral":{"hex":"#231b09ff","u16":[8933,6923,2284,65535]},"Normal":{"hex":"#171412ff","u16":[5880,5145,4655,65535]},"Positive":{"hex":"#0d1f11ff","u16":[3268,7894,4418,65535]},"Visited":{"hex":"#201928ff","u16":[8148,6422,10407,65535]}},"decoration":{"Focus":{"hex":"#224556ff","u16":[8795,17663,21975,65535]},"Hover":{"hex":"#345461ff","u16":[13254,21693,24890,65535]}},"foreground":{"Active":{"hex":"#643857ff","u16":[25686,14320,22232,65535]},"Inactive":{"hex":"#3d3a39ff","u16":[15568,15005,14601,65535]},"Link":{"hex":"#2c4661ff","u16":[11367,18091,24890,65535]},"Negative":{"hex":"#4f0e0dff","u16":[20199,3601,3283,65535]},"Neutral":{"hex":"#4a380cff","u16":[18912,14320,3026,65535]},"Normal":{"hex":"#5c6161ff","u16":[23629,25037,24890,65535]},"Positive":{"hex":"#0f3219ff","u16":[3822,12776,6455,65535]},"Visited":{"hex":"#413259ff","u16":[16684,12862,22918,65535]}},"shade":{"Dark":{"hex":"#a59183ff","u16":[42478,37168,33629,65535]},"Light":{"hex":"#e5dad3ff","u16":[58771,55904,54161,65535]},"Mid":{"hex":"#796a60ff","u16":[31179,27282,24683,65535]},"Midlight":{"hex":"#c6ae9dff","u16":[50975,44603,40355,65535]},"Shadow":{"hex":"#c6ae9dff","u16":[50975,44603,40355,65535]}}},"Inactive":{"background":{"Active":{"hex":"#3a1f31ff","u16":[15011,7846,12561,65535]},"Alternate":{"hex":"#c4e0ffff","u16":[50372,57568,65535,65535]},"Link":{"hex":"#05293dff","u16":[1354,10646,15691,65535]},"Negative":{"hex":"#3e0804ff","u16":[16042,1988,948,65535]},"Neutral":{"hex":"#2d2203ff","u16":[11613,8729,881,65535]},"Normal":{"hex":"#1a1410ff","u16":[6675,5266,4187,65535]},"Positive":{"hex":"#062411ff","u16":[1510,9298,4427,65535]},"Visited":{"hex":"#291f36ff","u16":[10470,7907,13882,65535]}},"decoration":{"Focus":{"hex":"#009fd0ff","u16":[0,40773,53497,65535]},"Hover":{"hex":"#00c8f3ff","u16":[0,51437,62574,65535]}},"foreground":{"Active":{"hex":"#ef77cdff","u16":[61381,30480,52626,65535]},"Inactive":{"hex":"#87807aff","u16":[34702,32854,31455,65535]},"Link":{"hex":"#00a3fdff","u16":[0,41889,64909,65535]},"Negative":{"hex":"#b70a00ff","u16":[47037,2575,0,65535]},"Neutral":{"hex":"#a47a00ff","u16":[42168,31480,0,65535]},"Normal":{"hex":"#c9e0ddff","u16":[51726,57507,56697,65535]},"Positive":{"hex":"#00692dff","u16":[0,27091,11631,65535]},"Visited":{"hex":"#906cceff","u16":[36973,27725,53044,65535]}},"shade":{"Dark":{"hex":"#b38d70ff","u16":[46002,36292,28856,65535]},"Light":{"hex":"#edd8cbff","u16":[60812,55465,52067,65535]},"Mid":{"hex":"#836852ff","u16":[33787,26655,21194,65535]},"Midlight":{"hex":"#d7a987ff","u16":[55192,43542,34620,65535]},"Shadow":{"hex":"#d7a987ff","u16":[55192,43542,34620,65535]}}}},"Header":{"Active":{"background":{"Active":{"hex":"#d3c1d5ff","u16":[54283,49581,54830,65535]},"Alternate":{"hex":"#dad9d8ff","u16":[56026,55769,55512,65535]},"Link":{"hex":"#abc7edff","u16":[43821,51052,60911,65535]},"Negative":{"hex":"#e8bbbaff","u16":[59547,47942,47895,65535]},"Neutral":{"hex":"#edc662ff","u16":[60858,50846,25195,65535]},"Normal":{"hex":"#d6d2d0ff","u16":[54998,53970,53456,65535]},"Positive":{"hex":"#76da98ff","u16":[30268,56023,38990,65535]},"Visited":{"hex":"#c8c1d5ff","u16":[51330,49683,54833,65535]}},"decoration":{"Focus":{"hex":"#3aa7ddff","u16":[14906,42919,56797,65535]},"Hover":{"hex":"#6ed6ffff","u16":[28270,54998,65535,65535]}},"foreground":{"Active":{"hex":"#924c9dff","u16":[37522,19532,40349,65535]},"Inactive":{"hex":"#898887ff","u16":[35209,34952,34695,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#221f1eff","u16":[8738,7967,7710,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#644a9bff","u16":[25700,19018,39835,65535]}},"shade":{"Dark":{"hex":"#6a6663ff","u16":[27308,26139,25540,65535]},"Light":{"hex":"#fcfcfcff","u16":[64868,64810,64782,65535]},"Mid":{"hex":"#b3aba7ff","u16":[45927,43961,42954,65535]},"Midlight":{"hex":"#e1deddff","u16":[57863,57141,56783,65535]},"Shadow":{"hex":"#3e3b3aff","u16":[15866,15187,14839,65535]}}},"Disabled":{"background":{"Active":{"hex":"#cebeccff","u16":[52893,48806,52422,65535]},"Alternate":{"hex":"#d0cfcdff","u16":[53484,53148,52811,65535]},"Link":{"hex":"#b9c3cfff","u16":[47572,50207,53262,65535]},"Negative":{"hex":"#dabab9ff","u16":[56114,47920,47637,65535]},"Neutral":{"hex":"#d1c29fff","u16":[53796,49760,40913,65535]},"Normal":{"hex":"#cdc8c5ff","u16":[52684,51389,50738,65535]},"Positive":{"hex":"#b1c8b5ff","u16":[45436,51479,46532,65535]},"Visited":{"hex":"#c7c0cdff","u16":[51120,49276,52701,65535]}},"decoration":{"Focus":{"hex":"#98bacbff","u16":[39050,47759,52071,65535]},"Hover":{"hex":"#a1cbdaff","u16":[41472,52142,56110,65535]}},"foreground":{"Active":{"hex":"#b89ab8ff","u16":[47415,39558,47402,65535]},"Inactive":{"hex":"#b3afaeff","u16":[45885,45088,44642,65535]},"Link":{"hex":"#859fbbff","u16":[34077,40900,48041,65535]},"Negative":{"hex":"#cb807fff","u16":[52196,32912,32529,65535]},"Neutral":{"hex":"#bfad81ff","u16":[49168,44415,33121,65535]},"Normal":{"hex":"#908c8bff","u16":[36992,36098,35694,65535]},"Positive":{"hex":"#85a78eff","u16":[34077,42872,36551,65535]},"Visited":{"hex":"#a79ab8ff","u16":[42959,39571,47337,65535]}},"shade":{"Dark":{"hex":"#65615fff","u16":[26031,24916,24346,65535]},"Light":{"hex":"#f2f1f0ff","u16":[62161,61859,61710,65535]},"Mid":{"hex":"#aba4a0ff","u16":[44022,42136,41171,65535]},"Midlight":{"hex":"#d9d5d3ff","u16":[55662,54707,54230,65535]},"Shadow":{"hex":"#3d3a39ff","u16":[15564,14897,14556,65535]}}},"Inactive":{"background":{"Active":{"hex":"#d4c2d3ff","u16":[54495,49806,54309,65535]},"Alternate":{"hex":"#dbd9d7ff","u16":[56224,55736,55246,65535]},"Link":{"hex":"#95cdeeff","u16":[38241,52592,61074,65535]},"Negative":{"hex":"#e3bdbcff","u16":[58331,48656,48380,65535]},"Neutral":{"hex":"#e4c95fff","u16":[58722,51745,24377,65535]},"Normal":{"hex":"#d9d1ceff","u16":[55745,53804,52819,65535]},"Positive":{"hex":"#76daa9ff","u16":[30296,55957,43398,65535]},"Visited":{"hex":"#cdc1daff","u16":[52576,49481,56119,65535]}},"decoration":{"Focus":{"hex":"#49acd1ff","u16":[18778,44148,53597,65535]},"Hover":{"hex":"#acd3e0ff","u16":[44265,54109,57515,65535]}},"foreground":{"Active":{"hex":"#955499ff","u16":[38305,21586,39425,65535]},"Inactive":{"hex":"#8f8b89ff","u16":[36773,35801,35207,65535]},"Link":{"hex":"#006396ff","u16":[0,25448,38509,65535]},"Negative":{"hex":"#c02723ff","u16":[49320,10047,8987,65535]},"Neutral":{"hex":"#a88900ff","u16":[43137,35187,0,65535]},"Normal":{"hex":"#2f2d2bff","u16":[12120,11458,11173,65535]},"Positive":{"hex":"#00733fff","u16":[0,29551,16251,65535]},"Visited":{"hex":"#7546aeff","u16":[30181,18069,44607,65535]}},"shade":{"Dark":{"hex":"#6d6560ff","u16":[28138,25946,24784,65535]},"Light":{"hex":"#fdfcfcff","u16":[64911,64801,64747,65535]},"Mid":{"hex":"#b8aaa2ff","u16":[47322,43637,41682,65535]},"Midlight":{"hex":"#e3dedbff","u16":[58391,57025,56340,65535]},"Shadow":{"hex":"#403b38ff","u16":[16348,15075,14399,65535]}}}},"Selection":{"Active":{"background":{"Active":{"hex":"#9694bdff","u16":[38561,38131,48466,65535]},"Alternate":{"hex":"#3e8accff","u16":[15934,35466,52428,65535]},"Link":{"hex":"#329afbff","u16":[12977,39481,64413,65535]},"Negative":{"hex":"#bb8ba9ff","u16":[48092,35813,43322,65535]},"Neutral":{"hex":"#a0b14fff","u16":[41102,45571,20258,65535]},"Normal":{"hex":"#43ace8ff","u16":[17219,44204,59624,65535]},"Positive":{"hex":"#57bb92ff","u16":[22398,48154,37529,65535]},"Visited":{"hex":"#8894d4ff","u16":[34861,37915,54387,65535]}},"decoration":{"Focus":{"hex":"#3aa7ddff","u16":[14906,42919,56797,65535]},"Hover":{"hex":"#6ed6ffff","u16":[28270,54998,65535,65535]}},"foreground":{"Active":{"hex":"#6c2477ff","u16":[27756,9252,30583,65535]},"Inactive":{"hex":"#c7e2f8ff","u16":[51143,58082,63736,65535]},"Link":{"hex":"#00316eff","u16":[0,12593,28270,65535]},"Negative":{"hex":"#9c0e0eff","u16":[40092,3598,3598,65535]},"Neutral":{"hex":"#ffdd00ff","u16":[65535,56797,0,65535]},"Normal":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Positive":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]},"Visited":{"hex":"#452886ff","u16":[17733,10280,34438,65535]}},"shade":{"Dark":{"hex":"#215471ff","u16":[8379,21509,29012,65535]},"Light":{"hex":"#94ccf8ff","u16":[37938,52318,63666,65535]},"Mid":{"hex":"#3890c2ff","u16":[14427,37035,49955,65535]},"Midlight":{"hex":"#5abaf6ff","u16":[23020,47709,63118,65535]},"Shadow":{"hex":"#153649ff","u16":[5454,14000,18884,65535]}}},"Disabled":{"background":{"Active":{"hex":"#cebeccff","u16":[52893,48806,52422,65535]},"Alternate":{"hex":"#d0cfcdff","u16":[53484,53148,52811,65535]},"Link":{"hex":"#b9c3cfff","u16":[47572,50207,53262,65535]},"Negative":{"hex":"#dabab9ff","u16":[56114,47920,47637,65535]},"Neutral":{"hex":"#d1c29fff","u16":[53796,49760,40913,65535]},"Normal":{"hex":"#cdc8c5ff","u16":[52684,51389,50738,65535]},"Positive":{"hex":"#b1c8b5ff","u16":[45436,51479,46532,65535]},"Visited":{"hex":"#c7c0cdff","u16":[51120,49276,52701,65535]}},"decoration":{"Focus":{"hex":"#98bacbff","u16":[39050,47759,52071,65535]},"Hover":{"hex":"#a1cbdaff","u16":[41472,52142,56110,65535]}},"foreground":{"Active":{"hex":"#b89ab8ff","u16":[47415,39558,47402,65535]},"Inactive":{"hex":"#b3afaeff","u16":[45885,45088,44642,65535]},"Link":{"hex":"#859fbbff","u16":[34077,40900,48041,65535]},"Negative":{"hex":"#cb807fff","u16":[52196,32912,32529,65535]},"Neutral":{"hex":"#bfad81ff","u16":[49168,44415,33121,65535]},"Normal":{"hex":"#908c8bff","u16":[36992,36098,35694,65535]},"Positive":{"hex":"#85a78eff","u16":[34077,42872,36551,65535]},"Visited":{"hex":"#a79ab8ff","u16":[42959,39571,47337,65535]}},"shade":{"Dark":{"hex":"#65615fff","u16":[26031,24916,24346,65535]},"Light":{"hex":"#f2f1f0ff","u16":[62161,61859,61710,65535]},"Mid":{"hex":"#aba4a0ff","u16":[44022,42136,41171,65535]},"Midlight":{"hex":"#d9d5d3ff","u16":[55662,54707,54230,65535]},"Shadow":{"hex":"#3d3a39ff","u16":[15564,14897,14556,65535]}}},"Inactive":{"background":{"Active":{"hex":"#b0b5f3ff","u16":[45318,46412,62556,65535]},"Alternate":{"hex":"#88d1ffff","u16":[34829,53793,65535,65535]},"Link":{"hex":"#6fc0f9ff","u16":[28642,49264,64059,65535]},"Negative":{"hex":"#bdb5c7ff","u16":[48657,46510,51177,65535]},"Neutral":{"hex":"#9bc79eff","u16":[39728,51110,40482,65535]},"Normal":{"hex":"#77cdffff","u16":[30690,52623,65535,65535]},"Positive":{"hex":"#3ecbd5ff","u16":[15905,52052,54787,65535]},"Visited":{"hex":"#a1b7ecff","u16":[41442,47136,60614,65535]}},"decoration":{"Focus":{"hex":"#00ace4ff","u16":[0,44267,58657,65535]},"Hover":{"hex":"#7bd0ffff","u16":[31535,53475,65535,65535]}},"foreground":{"Active":{"hex":"#7550e3ff","u16":[30030,20474,58335,65535]},"Inactive":{"hex":"#6292adff","u16":[25241,37448,44447,65535]},"Link":{"hex":"#006297ff","u16":[0,25172,38914,65535]},"Negative":{"hex":"#9b4767ff","u16":[39899,18333,26514,65535]},"Neutral":{"hex":"#88923dff","u16":[35065,37414,15664,65535]},"Normal":{"hex":"#192e3aff","u16":[6406,11812,14819,65535]},"Positive":{"hex":"#00705eff","u16":[0,28851,24245,65535]},"Visited":{"hex":"#3256c2ff","u16":[12896,21979,49802,65535]}},"shade":{"Dark":{"hex":"#006688ff","u16":[0,26215,35039,65535]},"Light":{"hex":"#d7edffff","u16":[55286,60957,65535,65535]},"Mid":{"hex":"#00ade7ff","u16":[0,44471,59441,65535]},"Midlight":{"hex":"#9cd7ffff","u16":[40208,55336,65535,65535]},"Shadow":{"hex":"#003e53ff","u16":[0,15923,21283,65535]}}}},"Tooltip":{"Active":{"background":{"Active":{"hex":"#3c2035ff","u16":[15508,8241,13516,65535]},"Alternate":{"hex":"#c4e0ffff","u16":[50372,57568,65535,65535]},"Link":{"hex":"#182a3cff","u16":[6220,10826,15427,65535]},"Negative":{"hex":"#400605ff","u16":[16353,1449,1334,65535]},"Neutral":{"hex":"#2f2304ff","u16":[12000,8917,1016,65535]},"Normal":{"hex":"#181513ff","u16":[6168,5397,4883,65535]},"Positive":{"hex":"#052510ff","u16":[1385,9425,4083,65535]},"Visited":{"hex":"#291f3bff","u16":[10514,7954,15288,65535]}},"decoration":{"Focus":{"hex":"#3aa7ddff","u16":[14906,42919,56797,65535]},"Hover":{"hex":"#6ed6ffff","u16":[28270,54998,65535,65535]}},"foreground":{"Active":{"hex":"#ff80e0ff","u16":[65535,32896,57568,65535]},"Inactive":{"hex":"#898887ff","u16":[35209,34952,34695,65535]},"Link":{"hex":"#58acffff","u16":[22616,44204,65535,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#e7fdffff","u16":[59367,65021,65535,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#966fe8ff","u16":[38550,28527,59624,65535]}},"shade":{"Dark":{"hex":"#a59183ff","u16":[42506,37193,33650,65535]},"Light":{"hex":"#e5dad3ff","u16":[58782,55921,54181,65535]},"Mid":{"hex":"#796a60ff","u16":[31219,27317,24715,65535]},"Midlight":{"hex":"#c6ae9dff","u16":[50997,44622,40373,65535]},"Shadow":{"hex":"#c6ae9dff","u16":[50997,44622,40373,65535]}}},"Disabled":{"background":{"Active":{"hex":"#281822ff","u16":[10225,6130,8751,65535]},"Alternate":{"hex":"#b0d7ffff","u16":[45226,55185,65535,65535]},"Link":{"hex":"#151e26ff","u16":[5376,7586,9878,65535]},"Negative":{"hex":"#330c0bff","u16":[13174,3130,2847,65535]},"Neutral":{"hex":"#231b09ff","u16":[8933,6923,2284,65535]},"Normal":{"hex":"#171412ff","u16":[5880,5145,4655,65535]},"Positive":{"hex":"#0d1f11ff","u16":[3268,7894,4418,65535]},"Visited":{"hex":"#201928ff","u16":[8148,6422,10407,65535]}},"decoration":{"Focus":{"hex":"#224556ff","u16":[8795,17663,21975,65535]},"Hover":{"hex":"#345461ff","u16":[13254,21693,24890,65535]}},"foreground":{"Active":{"hex":"#643857ff","u16":[25686,14320,22232,65535]},"Inactive":{"hex":"#3d3a39ff","u16":[15568,15005,14601,65535]},"Link":{"hex":"#2c4661ff","u16":[11367,18091,24890,65535]},"Negative":{"hex":"#4f0e0dff","u16":[20199,3601,3283,65535]},"Neutral":{"hex":"#4a380cff","u16":[18912,14320,3026,65535]},"Normal":{"hex":"#5c6161ff","u16":[23629,25037,24890,65535]},"Positive":{"hex":"#0f3219ff","u16":[3822,12776,6455,65535]},"Visited":{"hex":"#413259ff","u16":[16684,12862,22918,65535]}},"shade":{"Dark":{"hex":"#a59183ff","u16":[42478,37168,33629,65535]},"Light":{"hex":"#e5dad3ff","u16":[58771,55904,54161,65535]},"Mid":{"hex":"#796a60ff","u16":[31179,27282,24683,65535]},"Midlight":{"hex":"#c6ae9dff","u16":[50975,44603,40355,65535]},"Shadow":{"hex":"#c6ae9dff","u16":[50975,44603,40355,65535]}}},"Inactive":{"background":{"Active":{"hex":"#3a1f31ff","u16":[15011,7846,12561,65535]},"Alternate":{"hex":"#c4e0ffff","u16":[50372,57568,65535,65535]},"Link":{"hex":"#05293dff","u16":[1354,10646,15691,65535]},"Negative":{"hex":"#3e0804ff","u16":[16042,1988,948,65535]},"Neutral":{"hex":"#2d2203ff","u16":[11613,8729,881,65535]},"Normal":{"hex":"#1a1410ff","u16":[6675,5266,4187,65535]},"Positive":{"hex":"#062411ff","u16":[1510,9298,4427,65535]},"Visited":{"hex":"#291f36ff","u16":[10470,7907,13882,65535]}},"decoration":{"Focus":{"hex":"#009fd0ff","u16":[0,40773,53497,65535]},"Hover":{"hex":"#00c8f3ff","u16":[0,51437,62574,65535]}},"foreground":{"Active":{"hex":"#ef77cdff","u16":[61381,30480,52626,65535]},"Inactive":{"hex":"#87807aff","u16":[34702,32854,31455,65535]},"Link":{"hex":"#00a3fdff","u16":[0,41889,64909,65535]},"Negative":{"hex":"#b70a00ff","u16":[47037,2575,0,65535]},"Neutral":{"hex":"#a47a00ff","u16":[42168,31480,0,65535]},"Normal":{"hex":"#c9e0ddff","u16":[51726,57507,56697,65535]},"Positive":{"hex":"#00692dff","u16":[0,27091,11631,65535]},"Visited":{"hex":"#906cceff","u16":[36973,27725,53044,65535]}},"shade":{"Dark":{"hex":"#b38d70ff","u16":[46002,36292,28856,65535]},"Light":{"hex":"#edd8cbff","u16":[60812,55465,52067,65535]},"Mid":{"hex":"#836852ff","u16":[33787,26655,21194,65535]},"Midlight":{"hex":"#d7a987ff","u16":[55192,43542,34620,65535]},"Shadow":{"hex":"#d7a987ff","u16":[55192,43542,34620,65535]}}}},"View":{"Active":{"background":{"Active":{"hex":"#f0eaf2ff","u16":[61790,60037,62113,65535]},"Alternate":{"hex":"#f8f7f6ff","u16":[63736,63479,63222,65535]},"Link":{"hex":"#dfe9f7ff","u16":[57398,59836,63573,65535]},"Negative":{"hex":"#f6e6e6ff","u16":[63304,59085,59085,65535]},"Neutral":{"hex":"#fcf0dbff","u16":[64670,61790,56227,65535]},"Normal":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Positive":{"hex":"#baf8ceff","u16":[47784,63784,52916,65535]},"Visited":{"hex":"#e9e7f0ff","u16":[59959,59310,61613,65535]}},"decoration":{"Focus":{"hex":"#3aa7ddff","u16":[14906,42919,56797,65535]},"Hover":{"hex":"#6ed6ffff","u16":[28270,54998,65535,65535]}},"foreground":{"Active":{"hex":"#924c9dff","u16":[37522,19532,40349,65535]},"Inactive":{"hex":"#898887ff","u16":[35209,34952,34695,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#1f1c1bff","u16":[7967,7196,6939,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#644a9bff","u16":[25700,19018,39835,65535]}},"shade":{"Dark":{"hex":"#bdbdbdff","u16":[48684,48684,48684,65535]},"Light":{"hex":"#d6d6d6ff","u16":[54997,54997,54997,65535]},"Mid":{"hex":"#d6d6d6ff","u16":[54997,54997,54997,65535]},"Midlight":{"hex":"#ecececff","u16":[60542,60542,60542,65535]},"Shadow":{"hex":"#8d8d8dff","u16":[36141,36141,36141,65535]}}},"Disabled":{"background":{"Active":{"hex":"#f1e9f2ff","u16":[61821,59832,62140,65535]},"Alternate":{"hex":"#eeebe9ff","u16":[61105,60453,59795,65535]},"Link":{"hex":"#e4ecf5ff","u16":[58470,60620,62873,65535]},"Negative":{"hex":"#f7e7e7ff","u16":[63522,59266,59266,65535]},"Neutral":{"hex":"#f1ebddff","u16":[61989,60497,56760,65535]},"Normal":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"Positive":{"hex":"#e0efe5ff","u16":[57469,61347,58850,65535]},"Visited":{"hex":"#eceaf2ff","u16":[60763,60075,62250,65535]}},"decoration":{"Focus":{"hex":"#a4d8f0ff","u16":[42079,55471,61700,65535]},"Hover":{"hex":"#ace9ffff","u16":[44274,59915,65535,65535]}},"foreground":{"Active":{"hex":"#d3b5d7ff","u16":[54168,46603,55334,65535]},"Inactive":{"hex":"#cccbcbff","u16":[52378,52263,52148,65535]},"Link":{"hex":"#97bcdfff","u16":[38808,48270,57321,65535]},"Negative":{"hex":"#e69b9bff","u16":[59205,39935,39935,65535]},"Neutral":{"hex":"#d9c99eff","u16":[55697,51581,40606,65535]},"Normal":{"hex":"#a9a7a7ff","u16":[43305,42997,42894,65535]},"Positive":{"hex":"#9ec3abff","u16":[40606,50037,44036,65535]},"Visited":{"hex":"#c1b6d7ff","u16":[49480,46689,55271,65535]}},"shade":{"Dark":{"hex":"#767676ff","u16":[30397,30397,30397,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c3c3c3ff","u16":[50064,50064,50064,65535]},"Midlight":{"hex":"#fcfcfcff","u16":[64880,64880,64880,65535]},"Shadow":{"hex":"#3d3d3dff","u16":[15585,15585,15585,65535]}}},"Inactive":{"background":{"Active":{"hex":"#f3eaf4ff","u16":[62499,60260,62819,65535]},"Alternate":{"hex":"#f9f7f5ff","u16":[63934,63446,62957,65535]},"Link":{"hex":"#e0ecf6ff","u16":[57512,60572,63111,65535]},"Negative":{"hex":"#f9e8e8ff","u16":[63890,59498,59498,65535]},"Neutral":{"hex":"#fcf2cfff","u16":[64740,62274,53179,65535]},"Normal":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Positive":{"hex":"#bff8dcff","u16":[49038,63773,56592,65535]},"Visited":{"hex":"#ede7f7ff","u16":[61025,59492,63560,65535]}},"decoration":{"Focus":{"hex":"#00afdbff","u16":[0,45047,56338,65535]},"Hover":{"hex":"#66dcffff","u16":[26281,56584,65535,65535]}},"foreground":{"Active":{"hex":"#a448afff","u16":[42114,18572,44897,65535]},"Inactive":{"hex":"#8e8d8cff","u16":[36462,36267,36073,65535]},"Link":{"hex":"#196595ff","u16":[6435,25994,38342,65535]},"Negative":{"hex":"#cd0000ff","u16":[52677,0,0,65535]},"Neutral":{"hex":"#a88b00ff","u16":[43097,35672,0,65535]},"Normal":{"hex":"#313030ff","u16":[12590,12306,12211,65535]},"Positive":{"hex":"#097545ff","u16":[2245,30036,17623,65535]},"Visited":{"hex":"#7c3cccff","u16":[31909,15310,52402,65535]}},"shade":{"Dark":{"hex":"#bdbdbdff","u16":[48684,48684,48684,65535]},"Light":{"hex":"#d6d6d6ff","u16":[54997,54997,54997,65535]},"Mid":{"hex":"#d6d6d6ff","u16":[54997,54997,54997,65535]},"Midlight":{"hex":"#ecececff","u16":[60542,60542,60542,65535]},"Shadow":{"hex":"#8d8d8dff","u16":[36141,36141,36141,65535]}}}},"Window":{"Active":{"background":{"Active":{"hex":"#d3c1d5ff","u16":[54283,49581,54830,65535]},"Alternate":{"hex":"#dad9d8ff","u16":[56026,55769,55512,65535]},"Link":{"hex":"#abc7edff","u16":[43821,51052,60911,65535]},"Negative":{"hex":"#e8bbbaff","u16":[59547,47942,47895,65535]},"Neutral":{"hex":"#edc662ff","u16":[60858,50846,25195,65535]},"Normal":{"hex":"#d6d2d0ff","u16":[54998,53970,53456,65535]},"Positive":{"hex":"#76da98ff","u16":[30268,56023,38990,65535]},"Visited":{"hex":"#c8c1d5ff","u16":[51330,49683,54833,65535]}},"decoration":{"Focus":{"hex":"#3aa7ddff","u16":[14906,42919,56797,65535]},"Hover":{"hex":"#6ed6ffff","u16":[28270,54998,65535,65535]}},"foreground":{"Active":{"hex":"#924c9dff","u16":[37522,19532,40349,65535]},"Inactive":{"hex":"#898887ff","u16":[35209,34952,34695,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#221f1eff","u16":[8738,7967,7710,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#644a9bff","u16":[25700,19018,39835,65535]}},"shade":{"Dark":{"hex":"#6a6663ff","u16":[27308,26139,25540,65535]},"Light":{"hex":"#fcfcfcff","u16":[64868,64810,64782,65535]},"Mid":{"hex":"#b3aba7ff","u16":[45927,43961,42954,65535]},"Midlight":{"hex":"#e1deddff","u16":[57863,57141,56783,65535]},"Shadow":{"hex":"#3e3b3aff","u16":[15866,15187,14839,65535]}}},"Disabled":{"background":{"Active":{"hex":"#cebeccff","u16":[52893,48806,52422,65535]},"Alternate":{"hex":"#d0cfcdff","u16":[53484,53148,52811,65535]},"Link":{"hex":"#b9c3cfff","u16":[47572,50207,53262,65535]},"Negative":{"hex":"#dabab9ff","u16":[56114,47920,47637,65535]},"Neutral":{"hex":"#d1c29fff","u16":[53796,49760,40913,65535]},"Normal":{"hex":"#cdc8c5ff","u16":[52684,51389,50738,65535]},"Positive":{"hex":"#b1c8b5ff","u16":[45436,51479,46532,65535]},"Visited":{"hex":"#c7c0cdff","u16":[51120,49276,52701,65535]}},"decoration":{"Focus":{"hex":"#98bacbff","u16":[39050,47759,52071,65535]},"Hover":{"hex":"#a1cbdaff","u16":[41472,52142,56110,65535]}},"foreground":{"Active":{"hex":"#b89ab8ff","u16":[47415,39558,47402,65535]},"Inactive":{"hex":"#b3afaeff","u16":[45885,45088,44642,65535]},"Link":{"hex":"#859fbbff","u16":[34077,40900,48041,65535]},"Negative":{"hex":"#cb807fff","u16":[52196,32912,32529,65535]},"Neutral":{"hex":"#bfad81ff","u16":[49168,44415,33121,65535]},"Normal":{"hex":"#908c8bff","u16":[36992,36098,35694,65535]},"Positive":{"hex":"#85a78eff","u16":[34077,42872,36551,65535]},"Visited":{"hex":"#a79ab8ff","u16":[42959,39571,47337,65535]}},"shade":{"Dark":{"hex":"#65615fff","u16":[26031,24916,24346,65535]},"Light":{"hex":"#f2f1f0ff","u16":[62161,61859,61710,65535]},"Mid":{"hex":"#aba4a0ff","u16":[44022,42136,41171,65535]},"Midlight":{"hex":"#d9d5d3ff","u16":[55662,54707,54230,65535]},"Shadow":{"hex":"#3d3a39ff","u16":[15564,14897,14556,65535]}}},"Inactive":{"background":{"Active":{"hex":"#d4c2d3ff","u16":[54495,49806,54309,65535]},"Alternate":{"hex":"#dbd9d7ff","u16":[56224,55736,55246,65535]},"Link":{"hex":"#95cdeeff","u16":[38241,52592,61074,65535]},"Negative":{"hex":"#e3bdbcff","u16":[58331,48656,48380,65535]},"Neutral":{"hex":"#e4c95fff","u16":[58722,51745,24377,65535]},"Normal":{"hex":"#d9d1ceff","u16":[55745,53804,52819,65535]},"Positive":{"hex":"#76daa9ff","u16":[30296,55957,43398,65535]},"Visited":{"hex":"#cdc1daff","u16":[52576,49481,56119,65535]}},"decoration":{"Focus":{"hex":"#49acd1ff","u16":[18778,44148,53597,65535]},"Hover":{"hex":"#acd3e0ff","u16":[44265,54109,57515,65535]}},"foreground":{"Active":{"hex":"#955499ff","u16":[38305,21586,39425,65535]},"Inactive":{"hex":"#8f8b89ff","u16":[36773,35801,35207,65535]},"Link":{"hex":"#006396ff","u16":[0,25448,38509,65535]},"Negative":{"hex":"#c02723ff","u16":[49320,10047,8987,65535]},"Neutral":{"hex":"#a88900ff","u16":[43137,35187,0,65535]},"Normal":{"hex":"#2f2d2bff","u16":[12120,11458,11173,65535]},"Positive":{"hex":"#00733fff","u16":[0,29551,16251,65535]},"Visited":{"hex":"#7546aeff","u16":[30181,18069,44607,65535]}},"shade":{"Dark":{"hex":"#6d6560ff","u16":[28138,25946,24784,65535]},"Light":{"hex":"#fdfcfcff","u16":[64911,64801,64747,65535]},"Mid":{"hex":"#b8aaa2ff","u16":[47322,43637,41682,65535]},"Midlight":{"hex":"#e3dedbff","u16":[58391,57025,56340,65535]},"Shadow":{"hex":"#403b38ff","u16":[16348,15075,14399,65535]}}}}},"sha256":"ddae1440fd20100bcff97e08eb79c6f1fb79bbd4e4f7dc406ae724f8f94582a2","source":"/usr/share/color-schemes/Oxygen.colors"}, +{"contrastF":0.7000000000000001,"frameContrast":0.2,"input":{"ColorEffects:Disabled":{"ColorAmount":"0","ColorEffect":"0","ContrastAmount":"0.65","ContrastEffect":"1","IntensityAmount":"0.1","IntensityEffect":"2"},"ColorEffects:Inactive":{"Color":"112,111,110","ColorAmount":"0.025","ColorEffect":"2","ContrastAmount":"0.1","ContrastEffect":"2","IntensityAmount":"0","IntensityEffect":"0"},"Colors:Button":{"BackgroundAlternate":"224,223,222","BackgroundNormal":"232,231,230","DecorationFocus":"43,116,199","DecorationHover":"119,183,255","ForegroundActive":"255,128,224","ForegroundInactive":"136,135,134","ForegroundLink":"0,87,174","ForegroundNegative":"191,3,3","ForegroundNeutral":"176,128,0","ForegroundNormal":"20,19,18","ForegroundPositive":"0,110,40","ForegroundVisited":"69,40,134"},"Colors:Complementary":{"BackgroundAlternate":"196,224,255","BackgroundNormal":"24,21,19","DecorationFocus":"58,167,221","DecorationHover":"110,214,255","ForegroundActive":"255,128,224","ForegroundInactive":"137,136,135","ForegroundLink":"88,172,255","ForegroundNegative":"191,3,3","ForegroundNeutral":"176,128,0","ForegroundNormal":"231,253,255","ForegroundPositive":"0,110,40","ForegroundVisited":"150,111,232"},"Colors:Selection":{"BackgroundAlternate":"62,138,204","BackgroundNormal":"65,139,212","DecorationFocus":"43,116,199","DecorationHover":"119,183,255","ForegroundActive":"255,128,224","ForegroundInactive":"165,193,228","ForegroundLink":"0,49,110","ForegroundNegative":"156,14,14","ForegroundNeutral":"255,221,0","ForegroundNormal":"255,255,255","ForegroundPositive":"128,255,128","ForegroundVisited":"69,40,134"},"Colors:Tooltip":{"BackgroundAlternate":"196,224,255","BackgroundNormal":"192,218,255","DecorationFocus":"43,116,199","DecorationHover":"119,183,255","ForegroundActive":"255,128,224","ForegroundInactive":"96,112,128","ForegroundLink":"0,87,174","ForegroundNegative":"191,3,3","ForegroundNeutral":"176,128,0","ForegroundNormal":"20,19,18","ForegroundPositive":"0,110,40","ForegroundVisited":"69,40,134"},"Colors:View":{"BackgroundAlternate":"248,247,246","BackgroundNormal":"255,255,255","DecorationFocus":"43,116,199","DecorationHover":"119,183,255","ForegroundActive":"255,128,224","ForegroundInactive":"136,135,134","ForegroundLink":"0,87,174","ForegroundNegative":"191,3,3","ForegroundNeutral":"176,128,0","ForegroundNormal":"20,19,18","ForegroundPositive":"0,110,40","ForegroundVisited":"69,40,134"},"Colors:Window":{"BackgroundAlternate":"218,217,216","BackgroundNormal":"224,223,222","DecorationFocus":"43,116,199","DecorationHover":"119,183,255","ForegroundActive":"255,128,224","ForegroundInactive":"136,135,134","ForegroundLink":"0,87,174","ForegroundNegative":"191,3,3","ForegroundNeutral":"176,128,0","ForegroundNormal":"20,19,18","ForegroundPositive":"0,110,40","ForegroundVisited":"69,40,134"},"General":{"Name":"Oxygen Cold"},"WM":{"activeBackground":"96,148,207","activeForeground":"255,255,255","inactiveBackground":"224,223,222","inactiveForeground":"20,19,18"}},"name":"OxygenCold","origin":"installed","palette":{"Active":{"Accent":{"hex":"#418bd4ff","u16":[16705,35723,54484,65535]},"AlternateBase":{"hex":"#f8f7f6ff","u16":[63736,63479,63222,65535]},"Base":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#e8e7e6ff","u16":[59624,59367,59110,65535]},"ButtonText":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"Dark":{"hex":"#6e6c6bff","u16":[28142,27865,27587,65535]},"Highlight":{"hex":"#418bd4ff","u16":[16705,35723,54484,65535]},"HighlightedText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"LinkVisited":{"hex":"#452886ff","u16":[17733,10280,34438,65535]},"Mid":{"hex":"#b7b5b3ff","u16":[46976,46514,46049,65535]},"Midlight":{"hex":"#ebeaeaff","u16":[60378,60217,60056,65535]},"PlaceholderText":{"hex":"#888786ff","u16":[34952,34695,34438,65535]},"Shadow":{"hex":"#3d3c3cff","u16":[15684,15530,15375,65535]},"Text":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"ToolTipBase":{"hex":"#c0daffff","u16":[49344,56026,65535,65535]},"ToolTipText":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"Window":{"hex":"#e0dfdeff","u16":[57568,57311,57054,65535]},"WindowText":{"hex":"#141312ff","u16":[5140,4883,4626,65535]}},"Disabled":{"Accent":{"hex":"#d6d5d3ff","u16":[54968,54616,54263,65535]},"AlternateBase":{"hex":"#eeebe9ff","u16":[61105,60453,59795,65535]},"Base":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#dedcdbff","u16":[56956,56571,56185,65535]},"ButtonText":{"hex":"#969595ff","u16":[38659,38414,38169,65535]},"Dark":{"hex":"#686766ff","u16":[26826,26562,26297,65535]},"Highlight":{"hex":"#d6d5d3ff","u16":[54968,54616,54263,65535]},"HighlightedText":{"hex":"#919190ff","u16":[37384,37139,36894,65535]},"Light":{"hex":"#fffffeff","u16":[65412,65409,65405,65535]},"Link":{"hex":"#97bcdfff","u16":[38808,48270,57321,65535]},"LinkVisited":{"hex":"#b6aad0ff","u16":[46802,43774,53459,65535]},"Mid":{"hex":"#afaeacff","u16":[45064,44621,44174,65535]},"Midlight":{"hex":"#e2e1e0ff","u16":[57959,57715,57472,65535]},"PlaceholderText":{"hex":"#cbcbcbff","u16":[52292,52177,52062,65535]},"Shadow":{"hex":"#3c3c3bff","u16":[15489,15337,15184,65535]},"Text":{"hex":"#a5a4a4ff","u16":[42321,42235,42149,65535]},"ToolTipBase":{"hex":"#c0daffff","u16":[49344,56026,65535,65535]},"ToolTipText":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"Window":{"hex":"#d6d5d3ff","u16":[54968,54616,54263,65535]},"WindowText":{"hex":"#919190ff","u16":[37384,37139,36894,65535]}},"Inactive":{"Accent":{"hex":"#b4cceaff","u16":[46186,52325,60111,65535]},"AlternateBase":{"hex":"#f8f7f6ff","u16":[63736,63479,63222,65535]},"Base":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#e8e7e6ff","u16":[59624,59367,59110,65535]},"ButtonText":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"Dark":{"hex":"#6e6c6bff","u16":[28142,27865,27587,65535]},"Highlight":{"hex":"#b4cceaff","u16":[46186,52325,60111,65535]},"HighlightedText":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"LinkVisited":{"hex":"#452886ff","u16":[17733,10280,34438,65535]},"Mid":{"hex":"#b7b5b3ff","u16":[46976,46514,46049,65535]},"Midlight":{"hex":"#ebeaeaff","u16":[60378,60217,60056,65535]},"PlaceholderText":{"hex":"#888786ff","u16":[34952,34695,34438,65535]},"Shadow":{"hex":"#3d3c3cff","u16":[15684,15530,15375,65535]},"Text":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"ToolTipBase":{"hex":"#c0daffff","u16":[49344,56026,65535,65535]},"ToolTipText":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"Window":{"hex":"#e0dfdeff","u16":[57568,57311,57054,65535]},"WindowText":{"hex":"#141312ff","u16":[5140,4883,4626,65535]}}},"set_supported":{"Button":true,"Complementary":true,"Header":false,"Selection":true,"Tooltip":true,"View":true,"Window":true},"sets":{"Button":{"Active":{"background":{"Active":{"hex":"#fad4f0ff","u16":[64372,54562,61658,65535]},"Alternate":{"hex":"#e0dfdeff","u16":[57568,57311,57054,65535]},"Link":{"hex":"#c4d7f2ff","u16":[50369,55183,62124,65535]},"Negative":{"hex":"#edd0cfff","u16":[60981,53341,53326,65535]},"Neutral":{"hex":"#f8da95ff","u16":[63609,55900,38195,65535]},"Normal":{"hex":"#e8e7e6ff","u16":[59624,59367,59110,65535]},"Positive":{"hex":"#81eda7ff","u16":[33034,60829,42909,65535]},"Visited":{"hex":"#cfcbdbff","u16":[53245,52132,56394,65535]}},"decoration":{"Focus":{"hex":"#2b74c7ff","u16":[11051,29812,51143,65535]},"Hover":{"hex":"#77b7ffff","u16":[30583,47031,65535,65535]}},"foreground":{"Active":{"hex":"#ff80e0ff","u16":[65535,32896,57568,65535]},"Inactive":{"hex":"#888786ff","u16":[34952,34695,34438,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#452886ff","u16":[17733,10280,34438,65535]}},"shade":{"Dark":{"hex":"#72706fff","u16":[29240,28849,28454,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bdbab8ff","u16":[48557,47908,47252,65535]},"Midlight":{"hex":"#f2f2f1ff","u16":[62241,62101,61962,65535]},"Shadow":{"hex":"#3d3d3cff","u16":[15804,15593,15379,65535]}}},"Disabled":{"background":{"Active":{"hex":"#eecde4ff","u16":[61041,52684,58662,65535]},"Alternate":{"hex":"#d6d5d3ff","u16":[54968,54616,54263,65535]},"Link":{"hex":"#cad6e3ff","u16":[52012,55116,58310,65535]},"Negative":{"hex":"#e8cfceff","u16":[59699,53118,52988,65535]},"Neutral":{"hex":"#e2d5b4ff","u16":[58092,54742,46219,65535]},"Normal":{"hex":"#dedcdbff","u16":[56956,56571,56185,65535]},"Positive":{"hex":"#c1dcc9ff","u16":[49705,56426,51708,65535]},"Visited":{"hex":"#d7d3dfff","u16":[55262,54127,57262,65535]}},"decoration":{"Focus":{"hex":"#99b6d7ff","u16":[39262,46878,55248,65535]},"Hover":{"hex":"#b1cdebff","u16":[45453,52673,60491,65535]}},"foreground":{"Active":{"hex":"#edb6dfff","u16":[60983,46724,57232,65535]},"Inactive":{"hex":"#bdbcbbff","u16":[48606,48359,48113,65535]},"Link":{"hex":"#8aadceff","u16":[35465,44409,53006,65535]},"Negative":{"hex":"#d78d8cff","u16":[55226,36219,36025,65535]},"Neutral":{"hex":"#caba8fff","u16":[52034,47759,36625,65535]},"Normal":{"hex":"#969595ff","u16":[38659,38414,38169,65535]},"Positive":{"hex":"#90b49cff","u16":[36944,46216,40055,65535]},"Visited":{"hex":"#a89cc0ff","u16":[43123,39985,49246,65535]}},"shade":{"Dark":{"hex":"#6c6b6aff","u16":[27873,27500,27123,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#b5b3b0ff","u16":[46609,45985,45355,65535]},"Midlight":{"hex":"#e9e8e7ff","u16":[59788,59538,59288,65535]},"Shadow":{"hex":"#3d3c3bff","u16":[15690,15480,15268,65535]}}},"Inactive":{"background":{"Active":{"hex":"#fad4f0ff","u16":[64372,54562,61658,65535]},"Alternate":{"hex":"#e0dfdeff","u16":[57568,57311,57054,65535]},"Link":{"hex":"#c4d7f2ff","u16":[50369,55183,62124,65535]},"Negative":{"hex":"#edd0cfff","u16":[60981,53341,53326,65535]},"Neutral":{"hex":"#f8da95ff","u16":[63609,55900,38195,65535]},"Normal":{"hex":"#e8e7e6ff","u16":[59624,59367,59110,65535]},"Positive":{"hex":"#81eda7ff","u16":[33034,60829,42909,65535]},"Visited":{"hex":"#cfcbdbff","u16":[53245,52132,56394,65535]}},"decoration":{"Focus":{"hex":"#2b74c7ff","u16":[11051,29812,51143,65535]},"Hover":{"hex":"#77b7ffff","u16":[30583,47031,65535,65535]}},"foreground":{"Active":{"hex":"#ff80e0ff","u16":[65535,32896,57568,65535]},"Inactive":{"hex":"#888786ff","u16":[34952,34695,34438,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#452886ff","u16":[17733,10280,34438,65535]}},"shade":{"Dark":{"hex":"#72706fff","u16":[29240,28849,28454,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bdbab8ff","u16":[48557,47908,47252,65535]},"Midlight":{"hex":"#f2f2f1ff","u16":[62241,62101,61962,65535]},"Shadow":{"hex":"#3d3d3cff","u16":[15804,15593,15379,65535]}}}},"Complementary":{"Active":{"background":{"Active":{"hex":"#3c2035ff","u16":[15508,8241,13516,65535]},"Alternate":{"hex":"#c4e0ffff","u16":[50372,57568,65535,65535]},"Link":{"hex":"#182a3cff","u16":[6220,10826,15427,65535]},"Negative":{"hex":"#400605ff","u16":[16353,1449,1334,65535]},"Neutral":{"hex":"#2f2304ff","u16":[12000,8917,1016,65535]},"Normal":{"hex":"#181513ff","u16":[6168,5397,4883,65535]},"Positive":{"hex":"#052510ff","u16":[1385,9425,4083,65535]},"Visited":{"hex":"#291f3bff","u16":[10514,7954,15288,65535]}},"decoration":{"Focus":{"hex":"#3aa7ddff","u16":[14906,42919,56797,65535]},"Hover":{"hex":"#6ed6ffff","u16":[28270,54998,65535,65535]}},"foreground":{"Active":{"hex":"#ff80e0ff","u16":[65535,32896,57568,65535]},"Inactive":{"hex":"#898887ff","u16":[35209,34952,34695,65535]},"Link":{"hex":"#58acffff","u16":[22616,44204,65535,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#e7fdffff","u16":[59367,65021,65535,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#966fe8ff","u16":[38550,28527,59624,65535]}},"shade":{"Dark":{"hex":"#a59183ff","u16":[42506,37193,33650,65535]},"Light":{"hex":"#e5dad3ff","u16":[58782,55921,54181,65535]},"Mid":{"hex":"#796a60ff","u16":[31219,27317,24715,65535]},"Midlight":{"hex":"#c6ae9dff","u16":[50997,44622,40373,65535]},"Shadow":{"hex":"#c6ae9dff","u16":[50997,44622,40373,65535]}}},"Disabled":{"background":{"Active":{"hex":"#281822ff","u16":[10225,6130,8751,65535]},"Alternate":{"hex":"#b0d7ffff","u16":[45226,55185,65535,65535]},"Link":{"hex":"#151e26ff","u16":[5376,7586,9878,65535]},"Negative":{"hex":"#330c0bff","u16":[13174,3130,2847,65535]},"Neutral":{"hex":"#231b09ff","u16":[8933,6923,2284,65535]},"Normal":{"hex":"#171412ff","u16":[5880,5145,4655,65535]},"Positive":{"hex":"#0d1f11ff","u16":[3268,7894,4418,65535]},"Visited":{"hex":"#201928ff","u16":[8148,6422,10407,65535]}},"decoration":{"Focus":{"hex":"#224556ff","u16":[8795,17663,21975,65535]},"Hover":{"hex":"#345461ff","u16":[13254,21693,24890,65535]}},"foreground":{"Active":{"hex":"#643857ff","u16":[25686,14320,22232,65535]},"Inactive":{"hex":"#3d3a39ff","u16":[15568,15005,14601,65535]},"Link":{"hex":"#2c4661ff","u16":[11367,18091,24890,65535]},"Negative":{"hex":"#4f0e0dff","u16":[20199,3601,3283,65535]},"Neutral":{"hex":"#4a380cff","u16":[18912,14320,3026,65535]},"Normal":{"hex":"#5c6161ff","u16":[23629,25037,24890,65535]},"Positive":{"hex":"#0f3219ff","u16":[3822,12776,6455,65535]},"Visited":{"hex":"#413259ff","u16":[16684,12862,22918,65535]}},"shade":{"Dark":{"hex":"#a59183ff","u16":[42478,37168,33629,65535]},"Light":{"hex":"#e5dad3ff","u16":[58771,55904,54161,65535]},"Mid":{"hex":"#796a60ff","u16":[31179,27282,24683,65535]},"Midlight":{"hex":"#c6ae9dff","u16":[50975,44603,40355,65535]},"Shadow":{"hex":"#c6ae9dff","u16":[50975,44603,40355,65535]}}},"Inactive":{"background":{"Active":{"hex":"#3c2035ff","u16":[15508,8241,13516,65535]},"Alternate":{"hex":"#c4e0ffff","u16":[50372,57568,65535,65535]},"Link":{"hex":"#182a3cff","u16":[6220,10826,15427,65535]},"Negative":{"hex":"#400605ff","u16":[16353,1449,1334,65535]},"Neutral":{"hex":"#2f2304ff","u16":[12000,8917,1016,65535]},"Normal":{"hex":"#181513ff","u16":[6168,5397,4883,65535]},"Positive":{"hex":"#052510ff","u16":[1385,9425,4083,65535]},"Visited":{"hex":"#291f3bff","u16":[10514,7954,15288,65535]}},"decoration":{"Focus":{"hex":"#3aa7ddff","u16":[14906,42919,56797,65535]},"Hover":{"hex":"#6ed6ffff","u16":[28270,54998,65535,65535]}},"foreground":{"Active":{"hex":"#ff80e0ff","u16":[65535,32896,57568,65535]},"Inactive":{"hex":"#898887ff","u16":[35209,34952,34695,65535]},"Link":{"hex":"#58acffff","u16":[22616,44204,65535,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#e7fdffff","u16":[59367,65021,65535,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#966fe8ff","u16":[38550,28527,59624,65535]}},"shade":{"Dark":{"hex":"#a59183ff","u16":[42506,37193,33650,65535]},"Light":{"hex":"#e5dad3ff","u16":[58782,55921,54181,65535]},"Mid":{"hex":"#796a60ff","u16":[31219,27317,24715,65535]},"Midlight":{"hex":"#c6ae9dff","u16":[50997,44622,40373,65535]},"Shadow":{"hex":"#c6ae9dff","u16":[50997,44622,40373,65535]}}}},"Header":{"Active":{"background":{"Active":{"hex":"#f8cbecff","u16":[63758,52062,60560,65535]},"Alternate":{"hex":"#dad9d8ff","u16":[56026,55769,55512,65535]},"Link":{"hex":"#bad1f0ff","u16":[47846,53590,61679,65535]},"Negative":{"hex":"#ebc8c7ff","u16":[60341,51284,51266,65535]},"Neutral":{"hex":"#f6d273ff","u16":[63329,53866,29598,65535]},"Normal":{"hex":"#e0dfdeff","u16":[57568,57311,57054,65535]},"Positive":{"hex":"#7ce5a1ff","u16":[31836,58980,41473,65535]},"Visited":{"hex":"#cac5d7ff","u16":[51802,50570,55262,65535]}},"decoration":{"Focus":{"hex":"#2b74c7ff","u16":[11051,29812,51143,65535]},"Hover":{"hex":"#77b7ffff","u16":[30583,47031,65535,65535]}},"foreground":{"Active":{"hex":"#ff80e0ff","u16":[65535,32896,57568,65535]},"Inactive":{"hex":"#888786ff","u16":[34952,34695,34438,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#452886ff","u16":[17733,10280,34438,65535]}},"shade":{"Dark":{"hex":"#6e6c6bff","u16":[28142,27865,27587,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#b7b5b3ff","u16":[46976,46514,46049,65535]},"Midlight":{"hex":"#ebeaeaff","u16":[60378,60217,60056,65535]},"Shadow":{"hex":"#3d3c3cff","u16":[15684,15530,15375,65535]}}},"Disabled":{"background":{"Active":{"hex":"#e7c5deff","u16":[59485,50631,56991,65535]},"Alternate":{"hex":"#d0cfcdff","u16":[53484,53148,52811,65535]},"Link":{"hex":"#c3cfdcff","u16":[50098,53226,56468,65535]},"Negative":{"hex":"#e2c7c6ff","u16":[58193,51114,50980,65535]},"Neutral":{"hex":"#dbceacff","u16":[56200,52849,44298,65535]},"Normal":{"hex":"#d6d5d3ff","u16":[54968,54616,54263,65535]},"Positive":{"hex":"#bad4c2ff","u16":[47796,54538,49831,65535]},"Visited":{"hex":"#d0cbd8ff","u16":[53420,52204,55585,65535]}},"decoration":{"Focus":{"hex":"#94b1d2ff","u16":[38066,45594,53878,65535]},"Hover":{"hex":"#adc8e6ff","u16":[44338,51380,59026,65535]}},"foreground":{"Active":{"hex":"#e8b1d9ff","u16":[59517,45538,55835,65535]},"Inactive":{"hex":"#b8b7b6ff","u16":[47330,47085,46840,65535]},"Link":{"hex":"#87a8c7ff","u16":[34796,43067,51140,65535]},"Negative":{"hex":"#d28887ff","u16":[53865,34973,34781,65535]},"Neutral":{"hex":"#c6b58aff","u16":[50760,46486,35351,65535]},"Normal":{"hex":"#919190ff","u16":[37384,37139,36894,65535]},"Positive":{"hex":"#8baf97ff","u16":[35669,44942,38781,65535]},"Visited":{"hex":"#a397baff","u16":[41837,38720,47920,65535]}},"shade":{"Dark":{"hex":"#686766ff","u16":[26826,26562,26297,65535]},"Light":{"hex":"#fffffeff","u16":[65412,65409,65405,65535]},"Mid":{"hex":"#afaeacff","u16":[45064,44621,44174,65535]},"Midlight":{"hex":"#e2e1e0ff","u16":[57959,57715,57472,65535]},"Shadow":{"hex":"#3c3c3bff","u16":[15489,15337,15184,65535]}}},"Inactive":{"background":{"Active":{"hex":"#f8cbecff","u16":[63758,52062,60560,65535]},"Alternate":{"hex":"#dad9d8ff","u16":[56026,55769,55512,65535]},"Link":{"hex":"#bad1f0ff","u16":[47846,53590,61679,65535]},"Negative":{"hex":"#ebc8c7ff","u16":[60341,51284,51266,65535]},"Neutral":{"hex":"#f6d273ff","u16":[63329,53866,29598,65535]},"Normal":{"hex":"#e0dfdeff","u16":[57568,57311,57054,65535]},"Positive":{"hex":"#7ce5a1ff","u16":[31836,58980,41473,65535]},"Visited":{"hex":"#cac5d7ff","u16":[51802,50570,55262,65535]}},"decoration":{"Focus":{"hex":"#2b74c7ff","u16":[11051,29812,51143,65535]},"Hover":{"hex":"#77b7ffff","u16":[30583,47031,65535,65535]}},"foreground":{"Active":{"hex":"#ff80e0ff","u16":[65535,32896,57568,65535]},"Inactive":{"hex":"#888786ff","u16":[34952,34695,34438,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#452886ff","u16":[17733,10280,34438,65535]}},"shade":{"Dark":{"hex":"#6e6c6bff","u16":[28142,27865,27587,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#b7b5b3ff","u16":[46976,46514,46049,65535]},"Midlight":{"hex":"#ebeaeaff","u16":[60378,60217,60056,65535]},"Shadow":{"hex":"#3d3c3cff","u16":[15684,15530,15375,65535]}}}},"Selection":{"Active":{"background":{"Active":{"hex":"#b66fd8ff","u16":[46884,28628,55570,65535]},"Alternate":{"hex":"#3e8accff","u16":[15934,35466,52428,65535]},"Link":{"hex":"#267fe3ff","u16":[9667,32637,58389,65535]},"Negative":{"hex":"#b46898ff","u16":[46327,26740,39119,65535]},"Neutral":{"hex":"#89944bff","u16":[35286,38084,19239,65535]},"Normal":{"hex":"#418bd4ff","u16":[16705,35723,54484,65535]},"Positive":{"hex":"#4d9d81ff","u16":[19802,40322,33281,65535]},"Visited":{"hex":"#737ac1ff","u16":[29511,31271,49645,65535]}},"decoration":{"Focus":{"hex":"#2b74c7ff","u16":[11051,29812,51143,65535]},"Hover":{"hex":"#77b7ffff","u16":[30583,47031,65535,65535]}},"foreground":{"Active":{"hex":"#ff80e0ff","u16":[65535,32896,57568,65535]},"Inactive":{"hex":"#a5c1e4ff","u16":[42405,49601,58596,65535]},"Link":{"hex":"#00316eff","u16":[0,12593,28270,65535]},"Negative":{"hex":"#9c0e0eff","u16":[40092,3598,3598,65535]},"Neutral":{"hex":"#ffdd00ff","u16":[65535,56797,0,65535]},"Normal":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Positive":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]},"Visited":{"hex":"#452886ff","u16":[17733,10280,34438,65535]}},"shade":{"Dark":{"hex":"#204467ff","u16":[8128,17382,26511,65535]},"Light":{"hex":"#6faaf0ff","u16":[28606,43688,61771,65535]},"Mid":{"hex":"#3776b3ff","u16":[14134,30224,46098,65535]},"Midlight":{"hex":"#4899eaff","u16":[18429,39410,60108,65535]},"Shadow":{"hex":"#152e46ff","u16":[5515,11793,17987,65535]}}},"Disabled":{"background":{"Active":{"hex":"#e7c5deff","u16":[59485,50631,56991,65535]},"Alternate":{"hex":"#d0cfcdff","u16":[53484,53148,52811,65535]},"Link":{"hex":"#c3cfdcff","u16":[50098,53226,56468,65535]},"Negative":{"hex":"#e2c7c6ff","u16":[58193,51114,50980,65535]},"Neutral":{"hex":"#dbceacff","u16":[56200,52849,44298,65535]},"Normal":{"hex":"#d6d5d3ff","u16":[54968,54616,54263,65535]},"Positive":{"hex":"#bad4c2ff","u16":[47796,54538,49831,65535]},"Visited":{"hex":"#d0cbd8ff","u16":[53420,52204,55585,65535]}},"decoration":{"Focus":{"hex":"#94b1d2ff","u16":[38066,45594,53878,65535]},"Hover":{"hex":"#adc8e6ff","u16":[44338,51380,59026,65535]}},"foreground":{"Active":{"hex":"#e8b1d9ff","u16":[59517,45538,55835,65535]},"Inactive":{"hex":"#b8b7b6ff","u16":[47330,47085,46840,65535]},"Link":{"hex":"#87a8c7ff","u16":[34796,43067,51140,65535]},"Negative":{"hex":"#d28887ff","u16":[53865,34973,34781,65535]},"Neutral":{"hex":"#c6b58aff","u16":[50760,46486,35351,65535]},"Normal":{"hex":"#919190ff","u16":[37384,37139,36894,65535]},"Positive":{"hex":"#8baf97ff","u16":[35669,44942,38781,65535]},"Visited":{"hex":"#a397baff","u16":[41837,38720,47920,65535]}},"shade":{"Dark":{"hex":"#686766ff","u16":[26826,26562,26297,65535]},"Light":{"hex":"#fffffeff","u16":[65412,65409,65405,65535]},"Mid":{"hex":"#afaeacff","u16":[45064,44621,44174,65535]},"Midlight":{"hex":"#e2e1e0ff","u16":[57959,57715,57472,65535]},"Shadow":{"hex":"#3c3c3bff","u16":[15489,15337,15184,65535]}}},"Inactive":{"background":{"Active":{"hex":"#ecb0e9ff","u16":[60569,45324,59758,65535]},"Alternate":{"hex":"#acc7e9ff","u16":[44269,51162,59757,65535]},"Link":{"hex":"#9cbff1ff","u16":[40133,48975,61893,65535]},"Negative":{"hex":"#e2b1b5ff","u16":[58074,45533,46564,65535]},"Neutral":{"hex":"#d9c06dff","u16":[55873,49335,27917,65535]},"Normal":{"hex":"#b4cceaff","u16":[46186,52325,60111,65535]},"Positive":{"hex":"#62d2a3ff","u16":[25066,53921,41904,65535]},"Visited":{"hex":"#b7b4cfff","u16":[47031,46171,53298,65535]}},"decoration":{"Focus":{"hex":"#2b74c7ff","u16":[11051,29812,51143,65535]},"Hover":{"hex":"#77b7ffff","u16":[30583,47031,65535,65535]}},"foreground":{"Active":{"hex":"#ff80e0ff","u16":[65535,32896,57568,65535]},"Inactive":{"hex":"#888786ff","u16":[34952,34695,34438,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#452886ff","u16":[17733,10280,34438,65535]}},"shade":{"Dark":{"hex":"#426587ff","u16":[17082,25925,34647,65535]},"Light":{"hex":"#edf2f9ff","u16":[60842,62163,64067,65535]},"Mid":{"hex":"#78aadeff","u16":[30723,43695,57099,65535]},"Midlight":{"hex":"#c6d8efff","u16":[50996,55417,61298,65535]},"Shadow":{"hex":"#283c51ff","u16":[10203,15484,20694,65535]}}}},"Tooltip":{"Active":{"background":{"Active":{"hex":"#f0c3f1ff","u16":[61648,50021,61988,65535]},"Alternate":{"hex":"#c4e0ffff","u16":[50372,57568,65535,65535]},"Link":{"hex":"#b1caf3ff","u16":[45425,51960,62417,65535]},"Negative":{"hex":"#e6c0c4ff","u16":[59230,49458,50386,65535]},"Neutral":{"hex":"#e6cd7bff","u16":[59192,52793,31706,65535]},"Normal":{"hex":"#c0daffff","u16":[49344,56026,65535,65535]},"Positive":{"hex":"#69dfb1ff","u16":[27040,57348,45602,65535]},"Visited":{"hex":"#c2bfd8ff","u16":[49858,49133,55513,65535]}},"decoration":{"Focus":{"hex":"#2b74c7ff","u16":[11051,29812,51143,65535]},"Hover":{"hex":"#77b7ffff","u16":[30583,47031,65535,65535]}},"foreground":{"Active":{"hex":"#ff80e0ff","u16":[65535,32896,57568,65535]},"Inactive":{"hex":"#607080ff","u16":[24672,28784,32896,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#452886ff","u16":[17733,10280,34438,65535]}},"shade":{"Dark":{"hex":"#006eacff","u16":[0,28177,44177,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#6eb5ffff","u16":[28330,46546,65535,65535]},"Midlight":{"hex":"#d4e5ffff","u16":[54465,58874,65535,65535]},"Shadow":{"hex":"#003f62ff","u16":[0,16107,25254,65535]}}},"Disabled":{"background":{"Active":{"hex":"#cfc0f7ff","u16":[53223,49406,63364,65535]},"Alternate":{"hex":"#b0d7ffff","u16":[45226,55185,65535,65535]},"Link":{"hex":"#acc9f0ff","u16":[44233,51776,61714,65535]},"Negative":{"hex":"#cfc2d6ff","u16":[53120,49833,55113,65535]},"Neutral":{"hex":"#bfcacaff","u16":[49002,51881,51863,65535]},"Normal":{"hex":"#aed1ffff","u16":[44702,53600,65535,65535]},"Positive":{"hex":"#9bcfe1ff","u16":[39796,53278,57757,65535]},"Visited":{"hex":"#bbc6eaff","u16":[48166,50764,60257,65535]}},"decoration":{"Focus":{"hex":"#7caeeaff","u16":[31853,44824,60047,65535]},"Hover":{"hex":"#93c5ffff","u16":[37878,50633,65535,65535]}},"foreground":{"Active":{"hex":"#d0aff3ff","u16":[53429,44966,62367,65535]},"Inactive":{"hex":"#93adceff","u16":[37681,44421,53008,65535]},"Link":{"hex":"#6da5e1ff","u16":[28046,42344,57721,65535]},"Negative":{"hex":"#bc86a1ff","u16":[48226,34366,41273,65535]},"Neutral":{"hex":"#b2b29eff","u16":[45665,45690,40606,65535]},"Normal":{"hex":"#7e8da4ff","u16":[32289,36343,42149,65535]},"Positive":{"hex":"#77acabff","u16":[30574,44145,44036,65535]},"Visited":{"hex":"#8c94d2ff","u16":[36032,37990,53974,65535]}},"shade":{"Dark":{"hex":"#0069a4ff","u16":[0,26860,42111,65535]},"Light":{"hex":"#f2f7ffff","u16":[62186,63456,65535,65535]},"Mid":{"hex":"#59aeffff","u16":[22896,44841,65535,65535]},"Midlight":{"hex":"#c4dcffff","u16":[50378,56587,65535,65535]},"Shadow":{"hex":"#003e61ff","u16":[0,15841,24836,65535]}}},"Inactive":{"background":{"Active":{"hex":"#f0c3f1ff","u16":[61648,50021,61988,65535]},"Alternate":{"hex":"#c4e0ffff","u16":[50372,57568,65535,65535]},"Link":{"hex":"#b1caf3ff","u16":[45425,51960,62417,65535]},"Negative":{"hex":"#e6c0c4ff","u16":[59230,49458,50386,65535]},"Neutral":{"hex":"#e6cd7bff","u16":[59192,52793,31706,65535]},"Normal":{"hex":"#c0daffff","u16":[49344,56026,65535,65535]},"Positive":{"hex":"#69dfb1ff","u16":[27040,57348,45602,65535]},"Visited":{"hex":"#c2bfd8ff","u16":[49858,49133,55513,65535]}},"decoration":{"Focus":{"hex":"#2b74c7ff","u16":[11051,29812,51143,65535]},"Hover":{"hex":"#77b7ffff","u16":[30583,47031,65535,65535]}},"foreground":{"Active":{"hex":"#ff80e0ff","u16":[65535,32896,57568,65535]},"Inactive":{"hex":"#607080ff","u16":[24672,28784,32896,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#452886ff","u16":[17733,10280,34438,65535]}},"shade":{"Dark":{"hex":"#006eacff","u16":[0,28177,44177,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#6eb5ffff","u16":[28330,46546,65535,65535]},"Midlight":{"hex":"#d4e5ffff","u16":[54465,58874,65535,65535]},"Shadow":{"hex":"#003f62ff","u16":[0,16107,25254,65535]}}}},"View":{"Active":{"background":{"Active":{"hex":"#fff1fbff","u16":[65535,62022,64558,65535]},"Alternate":{"hex":"#f8f7f6ff","u16":[63736,63479,63222,65535]},"Link":{"hex":"#dfe9f7ff","u16":[57398,59836,63573,65535]},"Negative":{"hex":"#f6e6e6ff","u16":[63304,59085,59085,65535]},"Neutral":{"hex":"#fcf0dbff","u16":[64670,61790,56227,65535]},"Normal":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Positive":{"hex":"#baf8ceff","u16":[47784,63784,52916,65535]},"Visited":{"hex":"#dfdce8ff","u16":[57377,56631,59591,65535]}},"decoration":{"Focus":{"hex":"#2b74c7ff","u16":[11051,29812,51143,65535]},"Hover":{"hex":"#77b7ffff","u16":[30583,47031,65535,65535]}},"foreground":{"Active":{"hex":"#ff80e0ff","u16":[65535,32896,57568,65535]},"Inactive":{"hex":"#888786ff","u16":[34952,34695,34438,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#452886ff","u16":[17733,10280,34438,65535]}},"shade":{"Dark":{"hex":"#bdbdbdff","u16":[48684,48684,48684,65535]},"Light":{"hex":"#d6d6d6ff","u16":[54997,54997,54997,65535]},"Mid":{"hex":"#d6d6d6ff","u16":[54997,54997,54997,65535]},"Midlight":{"hex":"#ecececff","u16":[60542,60542,60542,65535]},"Shadow":{"hex":"#8d8d8dff","u16":[36141,36141,36141,65535]}}},"Disabled":{"background":{"Active":{"hex":"#fde6f7ff","u16":[65034,59000,63552,65535]},"Alternate":{"hex":"#eeebe9ff","u16":[61105,60453,59795,65535]},"Link":{"hex":"#e4ecf5ff","u16":[58470,60620,62873,65535]},"Negative":{"hex":"#f7e7e7ff","u16":[63522,59266,59266,65535]},"Neutral":{"hex":"#f1ebddff","u16":[61989,60497,56760,65535]},"Normal":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"Positive":{"hex":"#e0efe5ff","u16":[57469,61347,58850,65535]},"Visited":{"hex":"#ece9f2ff","u16":[60578,59920,62095,65535]}},"decoration":{"Focus":{"hex":"#a6c5e8ff","u16":[42545,50744,59666,65535]},"Hover":{"hex":"#bbdcffff","u16":[48178,56606,65535,65535]}},"foreground":{"Active":{"hex":"#ffc3f1ff","u16":[65535,50120,61893,65535]},"Inactive":{"hex":"#cbcbcbff","u16":[52292,52177,52062,65535]},"Link":{"hex":"#97bcdfff","u16":[38808,48270,57321,65535]},"Negative":{"hex":"#e69b9bff","u16":[59205,39935,39935,65535]},"Neutral":{"hex":"#d9c99eff","u16":[55697,51581,40606,65535]},"Normal":{"hex":"#a5a4a4ff","u16":[42321,42235,42149,65535]},"Positive":{"hex":"#9ec3abff","u16":[40606,50037,44036,65535]},"Visited":{"hex":"#b6aad0ff","u16":[46802,43774,53459,65535]}},"shade":{"Dark":{"hex":"#767676ff","u16":[30397,30397,30397,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c3c3c3ff","u16":[50064,50064,50064,65535]},"Midlight":{"hex":"#fcfcfcff","u16":[64880,64880,64880,65535]},"Shadow":{"hex":"#3d3d3dff","u16":[15585,15585,15585,65535]}}},"Inactive":{"background":{"Active":{"hex":"#fff1fbff","u16":[65535,62022,64558,65535]},"Alternate":{"hex":"#f8f7f6ff","u16":[63736,63479,63222,65535]},"Link":{"hex":"#dfe9f7ff","u16":[57398,59836,63573,65535]},"Negative":{"hex":"#f6e6e6ff","u16":[63304,59085,59085,65535]},"Neutral":{"hex":"#fcf0dbff","u16":[64670,61790,56227,65535]},"Normal":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Positive":{"hex":"#baf8ceff","u16":[47784,63784,52916,65535]},"Visited":{"hex":"#dfdce8ff","u16":[57377,56631,59591,65535]}},"decoration":{"Focus":{"hex":"#2b74c7ff","u16":[11051,29812,51143,65535]},"Hover":{"hex":"#77b7ffff","u16":[30583,47031,65535,65535]}},"foreground":{"Active":{"hex":"#ff80e0ff","u16":[65535,32896,57568,65535]},"Inactive":{"hex":"#888786ff","u16":[34952,34695,34438,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#452886ff","u16":[17733,10280,34438,65535]}},"shade":{"Dark":{"hex":"#bdbdbdff","u16":[48684,48684,48684,65535]},"Light":{"hex":"#d6d6d6ff","u16":[54997,54997,54997,65535]},"Mid":{"hex":"#d6d6d6ff","u16":[54997,54997,54997,65535]},"Midlight":{"hex":"#ecececff","u16":[60542,60542,60542,65535]},"Shadow":{"hex":"#8d8d8dff","u16":[36141,36141,36141,65535]}}}},"Window":{"Active":{"background":{"Active":{"hex":"#f8cbecff","u16":[63758,52062,60560,65535]},"Alternate":{"hex":"#dad9d8ff","u16":[56026,55769,55512,65535]},"Link":{"hex":"#bad1f0ff","u16":[47846,53590,61679,65535]},"Negative":{"hex":"#ebc8c7ff","u16":[60341,51284,51266,65535]},"Neutral":{"hex":"#f6d273ff","u16":[63329,53866,29598,65535]},"Normal":{"hex":"#e0dfdeff","u16":[57568,57311,57054,65535]},"Positive":{"hex":"#7ce5a1ff","u16":[31836,58980,41473,65535]},"Visited":{"hex":"#cac5d7ff","u16":[51802,50570,55262,65535]}},"decoration":{"Focus":{"hex":"#2b74c7ff","u16":[11051,29812,51143,65535]},"Hover":{"hex":"#77b7ffff","u16":[30583,47031,65535,65535]}},"foreground":{"Active":{"hex":"#ff80e0ff","u16":[65535,32896,57568,65535]},"Inactive":{"hex":"#888786ff","u16":[34952,34695,34438,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#452886ff","u16":[17733,10280,34438,65535]}},"shade":{"Dark":{"hex":"#6e6c6bff","u16":[28142,27865,27587,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#b7b5b3ff","u16":[46976,46514,46049,65535]},"Midlight":{"hex":"#ebeaeaff","u16":[60378,60217,60056,65535]},"Shadow":{"hex":"#3d3c3cff","u16":[15684,15530,15375,65535]}}},"Disabled":{"background":{"Active":{"hex":"#e7c5deff","u16":[59485,50631,56991,65535]},"Alternate":{"hex":"#d0cfcdff","u16":[53484,53148,52811,65535]},"Link":{"hex":"#c3cfdcff","u16":[50098,53226,56468,65535]},"Negative":{"hex":"#e2c7c6ff","u16":[58193,51114,50980,65535]},"Neutral":{"hex":"#dbceacff","u16":[56200,52849,44298,65535]},"Normal":{"hex":"#d6d5d3ff","u16":[54968,54616,54263,65535]},"Positive":{"hex":"#bad4c2ff","u16":[47796,54538,49831,65535]},"Visited":{"hex":"#d0cbd8ff","u16":[53420,52204,55585,65535]}},"decoration":{"Focus":{"hex":"#94b1d2ff","u16":[38066,45594,53878,65535]},"Hover":{"hex":"#adc8e6ff","u16":[44338,51380,59026,65535]}},"foreground":{"Active":{"hex":"#e8b1d9ff","u16":[59517,45538,55835,65535]},"Inactive":{"hex":"#b8b7b6ff","u16":[47330,47085,46840,65535]},"Link":{"hex":"#87a8c7ff","u16":[34796,43067,51140,65535]},"Negative":{"hex":"#d28887ff","u16":[53865,34973,34781,65535]},"Neutral":{"hex":"#c6b58aff","u16":[50760,46486,35351,65535]},"Normal":{"hex":"#919190ff","u16":[37384,37139,36894,65535]},"Positive":{"hex":"#8baf97ff","u16":[35669,44942,38781,65535]},"Visited":{"hex":"#a397baff","u16":[41837,38720,47920,65535]}},"shade":{"Dark":{"hex":"#686766ff","u16":[26826,26562,26297,65535]},"Light":{"hex":"#fffffeff","u16":[65412,65409,65405,65535]},"Mid":{"hex":"#afaeacff","u16":[45064,44621,44174,65535]},"Midlight":{"hex":"#e2e1e0ff","u16":[57959,57715,57472,65535]},"Shadow":{"hex":"#3c3c3bff","u16":[15489,15337,15184,65535]}}},"Inactive":{"background":{"Active":{"hex":"#f8cbecff","u16":[63758,52062,60560,65535]},"Alternate":{"hex":"#dad9d8ff","u16":[56026,55769,55512,65535]},"Link":{"hex":"#bad1f0ff","u16":[47846,53590,61679,65535]},"Negative":{"hex":"#ebc8c7ff","u16":[60341,51284,51266,65535]},"Neutral":{"hex":"#f6d273ff","u16":[63329,53866,29598,65535]},"Normal":{"hex":"#e0dfdeff","u16":[57568,57311,57054,65535]},"Positive":{"hex":"#7ce5a1ff","u16":[31836,58980,41473,65535]},"Visited":{"hex":"#cac5d7ff","u16":[51802,50570,55262,65535]}},"decoration":{"Focus":{"hex":"#2b74c7ff","u16":[11051,29812,51143,65535]},"Hover":{"hex":"#77b7ffff","u16":[30583,47031,65535,65535]}},"foreground":{"Active":{"hex":"#ff80e0ff","u16":[65535,32896,57568,65535]},"Inactive":{"hex":"#888786ff","u16":[34952,34695,34438,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#141312ff","u16":[5140,4883,4626,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#452886ff","u16":[17733,10280,34438,65535]}},"shade":{"Dark":{"hex":"#6e6c6bff","u16":[28142,27865,27587,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#b7b5b3ff","u16":[46976,46514,46049,65535]},"Midlight":{"hex":"#ebeaeaff","u16":[60378,60217,60056,65535]},"Shadow":{"hex":"#3d3c3cff","u16":[15684,15530,15375,65535]}}}}},"sha256":"d4ab861f7e396ddb1dd28ab7d83780c7d2eb3ba9feef832e1ffee7e18383c0ee","source":"/usr/share/color-schemes/OxygenCold.colors"}, +{"contrastF":0.7000000000000001,"frameContrast":0.2,"input":{"ColorEffects:Disabled":{"Color":"56,56,56","ColorAmount":"0","ColorEffect":"0","ContrastAmount":"0.65","ContrastEffect":"1","IntensityAmount":"0.1","IntensityEffect":"2"},"ColorEffects:Inactive":{"ChangeSelectionColor":"true","Color":"112,111,110","ColorAmount":"-0.9","ColorEffect":"1","ContrastAmount":"0.25","ContrastEffect":"2","Enable":"true","IntensityAmount":"0","IntensityEffect":"0"},"Colors:Button":{"BackgroundAlternate":"50,49,48","BackgroundNormal":"57,53,50","DecorationFocus":"255,217,190","DecorationHover":"255,229,208","ForegroundActive":"146,76,157","ForegroundInactive":"137,136,135","ForegroundLink":"0,87,174","ForegroundNegative":"191,3,3","ForegroundNeutral":"176,128,0","ForegroundNormal":"255,234,225","ForegroundPositive":"0,110,40","ForegroundVisited":"100,74,155"},"Colors:Complementary":{"BackgroundAlternate":"61,55,53","BackgroundNormal":"24,21,19","DecorationFocus":"58,167,221","DecorationHover":"110,214,255","ForegroundActive":"255,128,224","ForegroundInactive":"137,136,135","ForegroundLink":"88,172,255","ForegroundNegative":"191,3,3","ForegroundNeutral":"176,128,0","ForegroundNormal":"231,253,255","ForegroundPositive":"0,110,40","ForegroundVisited":"150,111,232"},"Colors:Selection":{"BackgroundAlternate":"62,138,204","BackgroundNormal":"247,159,82","DecorationFocus":"240,213,194","DecorationHover":"255,229,208","ForegroundActive":"108,36,119","ForegroundInactive":"58,52,47","ForegroundLink":"0,49,110","ForegroundNegative":"156,14,14","ForegroundNeutral":"255,221,0","ForegroundNormal":"38,36,35","ForegroundPositive":"128,255,128","ForegroundVisited":"69,40,134"},"Colors:Tooltip":{"BackgroundAlternate":"49,45,38","BackgroundNormal":"24,21,19","DecorationFocus":"240,213,194","DecorationHover":"255,229,208","ForegroundActive":"255,128,224","ForegroundInactive":"137,136,135","ForegroundLink":"88,172,255","ForegroundNegative":"191,3,3","ForegroundNeutral":"176,128,0","ForegroundNormal":"255,242,228","ForegroundPositive":"0,110,40","ForegroundVisited":"150,111,232"},"Colors:View":{"BackgroundAlternate":"33,31,30","BackgroundNormal":"30,29,29","DecorationFocus":"240,213,194","DecorationHover":"255,229,208","ForegroundActive":"146,76,157","ForegroundInactive":"137,136,135","ForegroundLink":"0,87,174","ForegroundNegative":"191,3,3","ForegroundNeutral":"176,128,0","ForegroundNormal":"255,230,222","ForegroundPositive":"0,110,40","ForegroundVisited":"100,74,155"},"Colors:Window":{"BackgroundAlternate":"31,31,31","BackgroundNormal":"38,36,35","DecorationFocus":"240,213,194","DecorationHover":"255,229,208","ForegroundActive":"146,76,157","ForegroundInactive":"137,136,135","ForegroundLink":"0,87,174","ForegroundNegative":"191,3,3","ForegroundNeutral":"176,128,0","ForegroundNormal":"255,232,223","ForegroundPositive":"0,110,40","ForegroundVisited":"100,74,155"},"General":{"Name":"Oxygen Dark","TintFactor":"0.15","shadeSortColumn":"true"},"KDE":{"contrast":"7"},"WM":{"activeBackground":"56,51,49","activeBlend":"0,0,0","activeForeground":"59,57,55","inactiveBackground":"24,23,23","inactiveForeground":"218,206,195"}},"name":"OxygenDark","origin":"installed","palette":{"Active":{"Accent":{"hex":"#f79f52ff","u16":[63479,40863,21074,65535]},"AlternateBase":{"hex":"#211f1eff","u16":[8481,7967,7710,65535]},"Base":{"hex":"#1e1d1dff","u16":[7710,7453,7453,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#393532ff","u16":[14649,13621,12850,65535]},"ButtonText":{"hex":"#ffeae1ff","u16":[65535,60138,57825,65535]},"Dark":{"hex":"#121211ff","u16":[4752,4502,4377,65535]},"Highlight":{"hex":"#f79f52ff","u16":[63479,40863,21074,65535]},"HighlightedText":{"hex":"#262423ff","u16":[9766,9252,8995,65535]},"Light":{"hex":"#494543ff","u16":[18829,17838,17343,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"LinkVisited":{"hex":"#644a9bff","u16":[25700,19018,39835,65535]},"Mid":{"hex":"#211f1eff","u16":[8412,7969,7748,65535]},"Midlight":{"hex":"#3b3836ff","u16":[15088,14294,13897,65535]},"PlaceholderText":{"hex":"#898887ff","u16":[35209,34952,34695,65535]},"Shadow":{"hex":"#0d0d0cff","u16":[3455,3273,3182,65535]},"Text":{"hex":"#ffe6deff","u16":[65535,59110,57054,65535]},"ToolTipBase":{"hex":"#181513ff","u16":[6168,5397,4883,65535]},"ToolTipText":{"hex":"#fff2e4ff","u16":[65535,62194,58596,65535]},"Window":{"hex":"#262423ff","u16":[9766,9252,8995,65535]},"WindowText":{"hex":"#ffe8dfff","u16":[65535,59624,57311,65535]}},"Disabled":{"Accent":{"hex":"#242221ff","u16":[9309,8819,8574,65535]},"AlternateBase":{"hex":"#1f1e1dff","u16":[8084,7594,7349,65535]},"Base":{"hex":"#1d1c1cff","u16":[7349,7104,7104,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#363330ff","u16":[13964,12984,12249,65535]},"ButtonText":{"hex":"#786f6aff","u16":[30941,28504,27254,65535]},"Dark":{"hex":"#121110ff","u16":[4530,4291,4172,65535]},"Highlight":{"hex":"#242221ff","u16":[9309,8819,8574,65535]},"HighlightedText":{"hex":"#6d6460ff","u16":[27916,25625,24695,65535]},"Light":{"hex":"#484442ff","u16":[18539,17563,17075,65535]},"Link":{"hex":"#132f4cff","u16":[4778,12078,19538,65535]},"LinkVisited":{"hex":"#342b46ff","u16":[13352,10963,17908,65535]},"Mid":{"hex":"#1f1e1dff","u16":[8019,7597,7386,65535]},"Midlight":{"hex":"#393635ff","u16":[14769,13992,13603,65535]},"PlaceholderText":{"hex":"#403f3fff","u16":[16524,16279,16194,65535]},"Shadow":{"hex":"#0d0c0cff","u16":[3295,3121,3034,65535]},"Text":{"hex":"#685f5cff","u16":[26642,24339,23653,65535]},"ToolTipBase":{"hex":"#181513ff","u16":[6168,5397,4883,65535]},"ToolTipText":{"hex":"#fff2e4ff","u16":[65535,62194,58596,65535]},"Window":{"hex":"#242221ff","u16":[9309,8819,8574,65535]},"WindowText":{"hex":"#6d6460ff","u16":[27916,25625,24695,65535]}},"Inactive":{"Accent":{"hex":"#5e3900ff","u16":[24163,14680,0,65535]},"AlternateBase":{"hex":"#221f1dff","u16":[8838,7881,7376,65535]},"Base":{"hex":"#1f1d1dff","u16":[7886,7403,7403,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#3c342eff","u16":[15370,13463,11922,65535]},"ButtonText":{"hex":"#e4d9d3ff","u16":[58624,55752,54338,65535]},"Dark":{"hex":"#131110ff","u16":[4927,4460,4216,65535]},"Highlight":{"hex":"#5e3900ff","u16":[24163,14680,0,65535]},"HighlightedText":{"hex":"#f5d7c4ff","u16":[62890,55287,50298,65535]},"Light":{"hex":"#4c4541ff","u16":[19524,17673,16705,65535]},"Link":{"hex":"#005799ff","u16":[0,22341,39358,65535]},"LinkVisited":{"hex":"#6641a2ff","u16":[26248,16727,41666,65535]},"Mid":{"hex":"#221f1dff","u16":[8722,7895,7463,65535]},"Midlight":{"hex":"#3d3734ff","u16":[15645,14161,13386,65535]},"PlaceholderText":{"hex":"#84817fff","u16":[33940,33113,32746,65535]},"Shadow":{"hex":"#0e0d0cff","u16":[3582,3242,3065,65535]},"Text":{"hex":"#dcd1cdff","u16":[56502,53589,52752,65535]},"ToolTipBase":{"hex":"#181513ff","u16":[6168,5397,4883,65535]},"ToolTipText":{"hex":"#fff2e4ff","u16":[65535,62194,58596,65535]},"Window":{"hex":"#272422ff","u16":[10126,9166,8664,65535]},"WindowText":{"hex":"#dfd3cfff","u16":[57339,54281,53073,65535]}}},"set_supported":{"Button":true,"Complementary":true,"Header":false,"Selection":true,"Tooltip":true,"View":true,"Window":true},"sets":{"Button":{"Active":{"background":{"Active":{"hex":"#4e3051ff","u16":[20109,12347,20715,65535]},"Alternate":{"hex":"#323130ff","u16":[12850,12593,12336,65535]},"Link":{"hex":"#113b65ff","u16":[4470,15186,25981,65535]},"Negative":{"hex":"#731110ff","u16":[29609,4398,4173,65535]},"Neutral":{"hex":"#4c3a0fff","u16":[19451,15023,3801,65535]},"Normal":{"hex":"#393532ff","u16":[14649,13621,12850,65535]},"Positive":{"hex":"#124322ff","u16":[4547,17188,8702,65535]},"Visited":{"hex":"#413359ff","u16":[16690,13216,22802,65535]}},"decoration":{"Focus":{"hex":"#ffd9beff","u16":[65535,55769,48830,65535]},"Hover":{"hex":"#ffe5d0ff","u16":[65535,58853,53456,65535]}},"foreground":{"Active":{"hex":"#924c9dff","u16":[37522,19532,40349,65535]},"Inactive":{"hex":"#898887ff","u16":[35209,34952,34695,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#ffeae1ff","u16":[65535,60138,57825,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#644a9bff","u16":[25700,19018,39835,65535]}},"shade":{"Dark":{"hex":"#1c1a18ff","u16":[7128,6628,6253,65535]},"Light":{"hex":"#58524dff","u16":[22699,21106,19911,65535]},"Mid":{"hex":"#312e2bff","u16":[12600,11716,11053,65535]},"Midlight":{"hex":"#4a4541ff","u16":[19097,17756,16751,65535]},"Shadow":{"hex":"#141312ff","u16":[5155,4794,4522,65535]}}},"Disabled":{"background":{"Active":{"hex":"#433241ff","u16":[17150,12730,16600,65535]},"Alternate":{"hex":"#302f2eff","u16":[12249,12004,11759,65535]},"Link":{"hex":"#25384cff","u16":[9431,14455,19646,65535]},"Negative":{"hex":"#5f2220ff","u16":[24386,8839,8351,65535]},"Neutral":{"hex":"#41361eff","u16":[16643,13899,7772,65535]},"Normal":{"hex":"#363330ff","u16":[13964,12984,12249,65535]},"Positive":{"hex":"#253c2aff","u16":[9412,15408,10677,65535]},"Visited":{"hex":"#3c3344ff","u16":[15429,13205,17584,65535]}},"decoration":{"Focus":{"hex":"#78695eff","u16":[30941,27046,24253,65535]},"Hover":{"hex":"#786d64ff","u16":[30941,28075,25797,65535]}},"foreground":{"Active":{"hex":"#543a53ff","u16":[21596,14956,21424,65535]},"Inactive":{"hex":"#514e4cff","u16":[20823,20101,19538,65535]},"Link":{"hex":"#233e59ff","u16":[9077,15899,22882,65535]},"Negative":{"hex":"#632220ff","u16":[25453,8697,8219,65535]},"Neutral":{"hex":"#5e4c1fff","u16":[24167,19415,7962,65535]},"Normal":{"hex":"#786f6aff","u16":[30941,28504,27254,65535]},"Positive":{"hex":"#23462cff","u16":[9077,17871,11392,65535]},"Visited":{"hex":"#453a53ff","u16":[17651,14785,21252,65535]}},"shade":{"Dark":{"hex":"#1a1917ff","u16":[6795,6318,5960,65535]},"Light":{"hex":"#56504cff","u16":[22129,20576,19411,65535]},"Mid":{"hex":"#2f2b29ff","u16":[12014,11171,10538,65535]},"Midlight":{"hex":"#48433fff","u16":[18509,17210,16236,65535]},"Shadow":{"hex":"#131211ff","u16":[4919,4574,4314,65535]}}},"Inactive":{"background":{"Active":{"hex":"#532d50ff","u16":[21408,11543,20606,65535]},"Alternate":{"hex":"#33312fff","u16":[13044,12560,12064,65535]},"Link":{"hex":"#123d58ff","u16":[4643,15705,22720,65535]},"Negative":{"hex":"#70180eff","u16":[28771,6190,3542,65535]},"Neutral":{"hex":"#4a3b0eff","u16":[18927,15092,3571,65535]},"Normal":{"hex":"#3c342eff","u16":[15370,13463,11922,65535]},"Positive":{"hex":"#124226ff","u16":[4747,17079,9801,65535]},"Visited":{"hex":"#453255ff","u16":[17652,12968,21748,65535]}},"decoration":{"Focus":{"hex":"#e9cab4ff","u16":[59768,51978,46381,65535]},"Hover":{"hex":"#e8d4c5ff","u16":[59506,54497,50559,65535]}},"foreground":{"Active":{"hex":"#974399ff","u16":[38776,17122,39424,65535]},"Inactive":{"hex":"#89827cff","u16":[35219,33367,31853,65535]},"Link":{"hex":"#005992ff","u16":[0,22902,37623,65535]},"Negative":{"hex":"#b81100ff","u16":[47273,4277,0,65535]},"Neutral":{"hex":"#a37e00ff","u16":[41886,32342,0,65535]},"Normal":{"hex":"#e4d9d3ff","u16":[58624,55752,54338,65535]},"Positive":{"hex":"#006a32ff","u16":[0,27325,12940,65535]},"Visited":{"hex":"#674691ff","u16":[26539,18114,37162,65535]}},"shade":{"Dark":{"hex":"#1d1917ff","u16":[7479,6551,5801,65535]},"Light":{"hex":"#5d5148ff","u16":[23816,20861,18473,65535]},"Mid":{"hex":"#332d28ff","u16":[13220,11580,10255,65535]},"Midlight":{"hex":"#4e443cff","u16":[20036,17550,15542,65535]},"Shadow":{"hex":"#151210ff","u16":[5409,4738,4196,65535]}}}},"Complementary":{"Active":{"background":{"Active":{"hex":"#3c2035ff","u16":[15508,8241,13516,65535]},"Alternate":{"hex":"#3d3735ff","u16":[15677,14135,13621,65535]},"Link":{"hex":"#182a3cff","u16":[6220,10826,15427,65535]},"Negative":{"hex":"#400605ff","u16":[16353,1449,1334,65535]},"Neutral":{"hex":"#2f2304ff","u16":[12000,8917,1016,65535]},"Normal":{"hex":"#181513ff","u16":[6168,5397,4883,65535]},"Positive":{"hex":"#052510ff","u16":[1385,9425,4083,65535]},"Visited":{"hex":"#291f3bff","u16":[10514,7954,15288,65535]}},"decoration":{"Focus":{"hex":"#3aa7ddff","u16":[14906,42919,56797,65535]},"Hover":{"hex":"#6ed6ffff","u16":[28270,54998,65535,65535]}},"foreground":{"Active":{"hex":"#ff80e0ff","u16":[65535,32896,57568,65535]},"Inactive":{"hex":"#898887ff","u16":[35209,34952,34695,65535]},"Link":{"hex":"#58acffff","u16":[22616,44204,65535,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#e7fdffff","u16":[59367,65021,65535,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#966fe8ff","u16":[38550,28527,59624,65535]}},"shade":{"Dark":{"hex":"#a59183ff","u16":[42506,37193,33650,65535]},"Light":{"hex":"#e5dad3ff","u16":[58782,55921,54181,65535]},"Mid":{"hex":"#796a60ff","u16":[31219,27317,24715,65535]},"Midlight":{"hex":"#c6ae9dff","u16":[50997,44622,40373,65535]},"Shadow":{"hex":"#c6ae9dff","u16":[50997,44622,40373,65535]}}},"Disabled":{"background":{"Active":{"hex":"#281822ff","u16":[10225,6130,8751,65535]},"Alternate":{"hex":"#3a3433ff","u16":[14944,13474,12984,65535]},"Link":{"hex":"#151e26ff","u16":[5376,7586,9878,65535]},"Negative":{"hex":"#330c0bff","u16":[13174,3130,2847,65535]},"Neutral":{"hex":"#231b09ff","u16":[8933,6923,2284,65535]},"Normal":{"hex":"#171412ff","u16":[5880,5145,4655,65535]},"Positive":{"hex":"#0d1f11ff","u16":[3268,7894,4418,65535]},"Visited":{"hex":"#201928ff","u16":[8148,6422,10407,65535]}},"decoration":{"Focus":{"hex":"#224556ff","u16":[8795,17663,21975,65535]},"Hover":{"hex":"#345461ff","u16":[13254,21693,24890,65535]}},"foreground":{"Active":{"hex":"#643857ff","u16":[25686,14320,22232,65535]},"Inactive":{"hex":"#3d3a39ff","u16":[15568,15005,14601,65535]},"Link":{"hex":"#2c4661ff","u16":[11367,18091,24890,65535]},"Negative":{"hex":"#4f0e0dff","u16":[20199,3601,3283,65535]},"Neutral":{"hex":"#4a380cff","u16":[18912,14320,3026,65535]},"Normal":{"hex":"#5c6161ff","u16":[23629,25037,24890,65535]},"Positive":{"hex":"#0f3219ff","u16":[3822,12776,6455,65535]},"Visited":{"hex":"#413259ff","u16":[16684,12862,22918,65535]}},"shade":{"Dark":{"hex":"#a59183ff","u16":[42478,37168,33629,65535]},"Light":{"hex":"#e5dad3ff","u16":[58771,55904,54161,65535]},"Mid":{"hex":"#796a60ff","u16":[31179,27282,24683,65535]},"Midlight":{"hex":"#c6ae9dff","u16":[50975,44603,40355,65535]},"Shadow":{"hex":"#c6ae9dff","u16":[50975,44603,40355,65535]}}},"Inactive":{"background":{"Active":{"hex":"#3a1f31ff","u16":[15011,7846,12561,65535]},"Alternate":{"hex":"#413632ff","u16":[16695,13850,12826,65535]},"Link":{"hex":"#05293dff","u16":[1354,10646,15691,65535]},"Negative":{"hex":"#3e0804ff","u16":[16042,1988,948,65535]},"Neutral":{"hex":"#2d2203ff","u16":[11613,8729,881,65535]},"Normal":{"hex":"#1a1410ff","u16":[6675,5266,4187,65535]},"Positive":{"hex":"#062411ff","u16":[1510,9298,4427,65535]},"Visited":{"hex":"#291f36ff","u16":[10470,7907,13882,65535]}},"decoration":{"Focus":{"hex":"#009fd0ff","u16":[0,40773,53497,65535]},"Hover":{"hex":"#00c8f3ff","u16":[0,51437,62574,65535]}},"foreground":{"Active":{"hex":"#ef77cdff","u16":[61381,30480,52626,65535]},"Inactive":{"hex":"#87807aff","u16":[34702,32854,31455,65535]},"Link":{"hex":"#00a3fdff","u16":[0,41889,64909,65535]},"Negative":{"hex":"#b70a00ff","u16":[47037,2575,0,65535]},"Neutral":{"hex":"#a47a00ff","u16":[42168,31480,0,65535]},"Normal":{"hex":"#c9e0ddff","u16":[51726,57507,56697,65535]},"Positive":{"hex":"#00692dff","u16":[0,27091,11631,65535]},"Visited":{"hex":"#906cceff","u16":[36973,27725,53044,65535]}},"shade":{"Dark":{"hex":"#b38d70ff","u16":[46002,36292,28856,65535]},"Light":{"hex":"#edd8cbff","u16":[60812,55465,52067,65535]},"Mid":{"hex":"#836852ff","u16":[33787,26655,21194,65535]},"Midlight":{"hex":"#d7a987ff","u16":[55192,43542,34620,65535]},"Shadow":{"hex":"#d7a987ff","u16":[55192,43542,34620,65535]}}}},"Header":{"Active":{"background":{"Active":{"hex":"#3b233eff","u16":[15082,8974,15812,65535]},"Alternate":{"hex":"#1f1f1fff","u16":[7967,7967,7967,65535]},"Link":{"hex":"#0b2b4cff","u16":[2701,11066,19503,65535]},"Negative":{"hex":"#550b0bff","u16":[21923,2813,2744,65535]},"Neutral":{"hex":"#3a2c09ff","u16":[14977,11427,2237,65535]},"Normal":{"hex":"#262423ff","u16":[9766,9252,8995,65535]},"Positive":{"hex":"#0a3118ff","u16":[2677,12695,6160,65535]},"Visited":{"hex":"#2f2543ff","u16":[12203,9592,17211,65535]}},"decoration":{"Focus":{"hex":"#f0d5c2ff","u16":[61680,54741,49858,65535]},"Hover":{"hex":"#ffe5d0ff","u16":[65535,58853,53456,65535]}},"foreground":{"Active":{"hex":"#924c9dff","u16":[37522,19532,40349,65535]},"Inactive":{"hex":"#898887ff","u16":[35209,34952,34695,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#ffe8dfff","u16":[65535,59624,57311,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#644a9bff","u16":[25700,19018,39835,65535]}},"shade":{"Dark":{"hex":"#121211ff","u16":[4752,4502,4377,65535]},"Light":{"hex":"#494543ff","u16":[18829,17838,17343,65535]},"Mid":{"hex":"#211f1eff","u16":[8412,7969,7748,65535]},"Midlight":{"hex":"#3b3836ff","u16":[15088,14294,13897,65535]},"Shadow":{"hex":"#0d0d0cff","u16":[3455,3273,3182,65535]}}},"Disabled":{"background":{"Active":{"hex":"#312331ff","u16":[12511,8935,12577,65535]},"Alternate":{"hex":"#1e1e1eff","u16":[7594,7594,7594,65535]},"Link":{"hex":"#17283aff","u16":[5914,10346,14935,65535]},"Negative":{"hex":"#451716ff","u16":[17838,5914,5756,65535]},"Neutral":{"hex":"#2f2713ff","u16":[12141,9995,4877,65535]},"Normal":{"hex":"#242221ff","u16":[9309,8819,8574,65535]},"Positive":{"hex":"#172c1dff","u16":[5831,11183,7429,65535]},"Visited":{"hex":"#2b2434ff","u16":[10998,9349,13374,65535]}},"decoration":{"Focus":{"hex":"#685d56ff","u16":[26630,23996,22208,65535]},"Hover":{"hex":"#6d635bff","u16":[27916,25368,23408,65535]}},"foreground":{"Active":{"hex":"#48304aff","u16":[18570,12249,19035,65535]},"Inactive":{"hex":"#454443ff","u16":[17798,17394,17149,65535]},"Link":{"hex":"#183350ff","u16":[6051,13192,20493,65535]},"Negative":{"hex":"#571717ff","u16":[22428,5990,5831,65535]},"Neutral":{"hex":"#524116ff","u16":[21142,16707,5574,65535]},"Normal":{"hex":"#6d6460ff","u16":[27916,25625,24695,65535]},"Positive":{"hex":"#183b23ff","u16":[6051,15164,9003,65535]},"Visited":{"hex":"#392f49ff","u16":[14626,12078,18864,65535]}},"shade":{"Dark":{"hex":"#121110ff","u16":[4530,4291,4172,65535]},"Light":{"hex":"#484442ff","u16":[18539,17563,17075,65535]},"Mid":{"hex":"#1f1e1dff","u16":[8019,7597,7386,65535]},"Midlight":{"hex":"#393635ff","u16":[14769,13992,13603,65535]},"Shadow":{"hex":"#0d0c0cff","u16":[3295,3121,3034,65535]}}},"Inactive":{"background":{"Active":{"hex":"#401e41ff","u16":[16395,7795,16715,65535]},"Alternate":{"hex":"#1f1f1fff","u16":[7967,7967,7967,65535]},"Link":{"hex":"#0b2c44ff","u16":[2811,11351,17554,65535]},"Negative":{"hex":"#540d09ff","u16":[21615,3428,2363,65535]},"Neutral":{"hex":"#382c09ff","u16":[14433,11418,2188,65535]},"Normal":{"hex":"#272422ff","u16":[10126,9166,8664,65535]},"Positive":{"hex":"#0b311cff","u16":[2789,12576,7170,65535]},"Visited":{"hex":"#322345ff","u16":[12886,9100,17764,65535]}},"decoration":{"Focus":{"hex":"#dec2afff","u16":[56953,49895,44934,65535]},"Hover":{"hex":"#e4d0c0ff","u16":[58692,53349,49239,65535]}},"foreground":{"Active":{"hex":"#9a3ca2ff","u16":[39570,15386,41650,65535]},"Inactive":{"hex":"#86817eff","u16":[34394,33173,32376,65535]},"Link":{"hex":"#005897ff","u16":[0,22524,38747,65535]},"Negative":{"hex":"#b80900ff","u16":[47269,2326,0,65535]},"Neutral":{"hex":"#a27c00ff","u16":[41727,31988,0,65535]},"Normal":{"hex":"#dfd3cfff","u16":[57339,54281,53073,65535]},"Positive":{"hex":"#006a32ff","u16":[0,27163,12926,65535]},"Visited":{"hex":"#67439dff","u16":[26390,17164,40244,65535]}},"shade":{"Dark":{"hex":"#131110ff","u16":[4927,4460,4216,65535]},"Light":{"hex":"#4c4541ff","u16":[19524,17673,16705,65535]},"Mid":{"hex":"#221f1dff","u16":[8722,7895,7463,65535]},"Midlight":{"hex":"#3d3734ff","u16":[15645,14161,13386,65535]},"Shadow":{"hex":"#0e0d0cff","u16":[3582,3242,3065,65535]}}}},"Selection":{"Active":{"background":{"Active":{"hex":"#d395a6ff","u16":[54117,38403,42666,65535]},"Alternate":{"hex":"#3e8accff","u16":[15934,35466,52428,65535]},"Link":{"hex":"#a3a3a7ff","u16":[41765,41810,42926,65535]},"Negative":{"hex":"#f7897aff","u16":[63525,35249,31405,65535]},"Neutral":{"hex":"#e3b31bff","u16":[58379,45895,6999,65535]},"Normal":{"hex":"#f79f52ff","u16":[63479,40863,21074,65535]},"Positive":{"hex":"#9ac764ff","u16":[39668,51085,25827,65535]},"Visited":{"hex":"#c796b5ff","u16":[51108,38675,46480,65535]}},"decoration":{"Focus":{"hex":"#f0d5c2ff","u16":[61680,54741,49858,65535]},"Hover":{"hex":"#ffe5d0ff","u16":[65535,58853,53456,65535]}},"foreground":{"Active":{"hex":"#6c2477ff","u16":[27756,9252,30583,65535]},"Inactive":{"hex":"#3a342fff","u16":[14906,13364,12079,65535]},"Link":{"hex":"#00316eff","u16":[0,12593,28270,65535]},"Negative":{"hex":"#9c0e0eff","u16":[40092,3598,3598,65535]},"Neutral":{"hex":"#ffdd00ff","u16":[65535,56797,0,65535]},"Normal":{"hex":"#262423ff","u16":[9766,9252,8995,65535]},"Positive":{"hex":"#80ff80ff","u16":[32896,65535,32896,65535]},"Visited":{"hex":"#452886ff","u16":[17733,10280,34438,65535]}},"shade":{"Dark":{"hex":"#7a4d22ff","u16":[31368,19703,8674,65535]},"Light":{"hex":"#facfb6ff","u16":[64373,53192,46823,65535]},"Mid":{"hex":"#d1833aff","u16":[53636,33691,14832,65535]},"Midlight":{"hex":"#f8b17fff","u16":[63785,45509,32701,65535]},"Shadow":{"hex":"#4d3015ff","u16":[19786,12428,5471,65535]}}},"Disabled":{"background":{"Active":{"hex":"#312331ff","u16":[12511,8935,12577,65535]},"Alternate":{"hex":"#1e1e1eff","u16":[7594,7594,7594,65535]},"Link":{"hex":"#17283aff","u16":[5914,10346,14935,65535]},"Negative":{"hex":"#451716ff","u16":[17838,5914,5756,65535]},"Neutral":{"hex":"#2f2713ff","u16":[12141,9995,4877,65535]},"Normal":{"hex":"#242221ff","u16":[9309,8819,8574,65535]},"Positive":{"hex":"#172c1dff","u16":[5831,11183,7429,65535]},"Visited":{"hex":"#2b2434ff","u16":[10998,9349,13374,65535]}},"decoration":{"Focus":{"hex":"#685d56ff","u16":[26630,23996,22208,65535]},"Hover":{"hex":"#6d635bff","u16":[27916,25368,23408,65535]}},"foreground":{"Active":{"hex":"#48304aff","u16":[18570,12249,19035,65535]},"Inactive":{"hex":"#454443ff","u16":[17798,17394,17149,65535]},"Link":{"hex":"#183350ff","u16":[6051,13192,20493,65535]},"Negative":{"hex":"#571717ff","u16":[22428,5990,5831,65535]},"Neutral":{"hex":"#524116ff","u16":[21142,16707,5574,65535]},"Normal":{"hex":"#6d6460ff","u16":[27916,25625,24695,65535]},"Positive":{"hex":"#183b23ff","u16":[6051,15164,9003,65535]},"Visited":{"hex":"#392f49ff","u16":[14626,12078,18864,65535]}},"shade":{"Dark":{"hex":"#121110ff","u16":[4530,4291,4172,65535]},"Light":{"hex":"#484442ff","u16":[18539,17563,17075,65535]},"Mid":{"hex":"#1f1e1dff","u16":[8019,7597,7386,65535]},"Midlight":{"hex":"#393635ff","u16":[14769,13992,13603,65535]},"Shadow":{"hex":"#0d0c0cff","u16":[3295,3121,3034,65535]}}},"Inactive":{"background":{"Active":{"hex":"#72313aff","u16":[29321,12526,15028,65535]},"Alternate":{"hex":"#5a3700ff","u16":[23185,14094,0,65535]},"Link":{"hex":"#174b5eff","u16":[6001,19152,24071,65535]},"Negative":{"hex":"#802600ff","u16":[32838,9713,0,65535]},"Neutral":{"hex":"#614100ff","u16":[24892,16708,0,65535]},"Normal":{"hex":"#5e3900ff","u16":[24163,14680,0,65535]},"Positive":{"hex":"#374c00ff","u16":[14070,19560,0,65535]},"Visited":{"hex":"#663840ff","u16":[26130,14335,16484,65535]}},"decoration":{"Focus":{"hex":"#f6c399ff","u16":[63280,50187,39266,65535]},"Hover":{"hex":"#f8d3b6ff","u16":[63775,54329,46787,65535]}},"foreground":{"Active":{"hex":"#a83d75ff","u16":[43251,15681,30112,65535]},"Inactive":{"hex":"#a57c50ff","u16":[42284,31914,20657,65535]},"Link":{"hex":"#005b8dff","u16":[0,23266,36118,65535]},"Negative":{"hex":"#b22500ff","u16":[45689,9447,0,65535]},"Neutral":{"hex":"#ae7a00ff","u16":[44775,31361,0,65535]},"Normal":{"hex":"#f5d7c4ff","u16":[62890,55287,50298,65535]},"Positive":{"hex":"#2f6900ff","u16":[12122,27048,0,65535]},"Visited":{"hex":"#7e426cff","u16":[32315,17032,27838,65535]}},"shade":{"Dark":{"hex":"#2e1c00ff","u16":[11757,7143,0,65535]},"Light":{"hex":"#865200ff","u16":[34556,20994,0,65535]},"Mid":{"hex":"#513100ff","u16":[20756,12610,0,65535]},"Midlight":{"hex":"#744600ff","u16":[29725,18059,0,65535]},"Shadow":{"hex":"#211400ff","u16":[8461,5140,0,65535]}}}},"Tooltip":{"Active":{"background":{"Active":{"hex":"#3c2035ff","u16":[15508,8241,13516,65535]},"Alternate":{"hex":"#312d26ff","u16":[12593,11565,9766,65535]},"Link":{"hex":"#182a3cff","u16":[6220,10826,15427,65535]},"Negative":{"hex":"#400605ff","u16":[16353,1449,1334,65535]},"Neutral":{"hex":"#2f2304ff","u16":[12000,8917,1016,65535]},"Normal":{"hex":"#181513ff","u16":[6168,5397,4883,65535]},"Positive":{"hex":"#052510ff","u16":[1385,9425,4083,65535]},"Visited":{"hex":"#291f3bff","u16":[10514,7954,15288,65535]}},"decoration":{"Focus":{"hex":"#f0d5c2ff","u16":[61680,54741,49858,65535]},"Hover":{"hex":"#ffe5d0ff","u16":[65535,58853,53456,65535]}},"foreground":{"Active":{"hex":"#ff80e0ff","u16":[65535,32896,57568,65535]},"Inactive":{"hex":"#898887ff","u16":[35209,34952,34695,65535]},"Link":{"hex":"#58acffff","u16":[22616,44204,65535,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#fff2e4ff","u16":[65535,62194,58596,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#966fe8ff","u16":[38550,28527,59624,65535]}},"shade":{"Dark":{"hex":"#a59183ff","u16":[42506,37193,33650,65535]},"Light":{"hex":"#e5dad3ff","u16":[58782,55921,54181,65535]},"Mid":{"hex":"#796a60ff","u16":[31219,27317,24715,65535]},"Midlight":{"hex":"#c6ae9dff","u16":[50997,44622,40373,65535]},"Shadow":{"hex":"#c6ae9dff","u16":[50997,44622,40373,65535]}}},"Disabled":{"background":{"Active":{"hex":"#281822ff","u16":[10225,6130,8751,65535]},"Alternate":{"hex":"#2f2b24ff","u16":[12004,11024,9309,65535]},"Link":{"hex":"#151e26ff","u16":[5376,7586,9878,65535]},"Negative":{"hex":"#330c0bff","u16":[13174,3130,2847,65535]},"Neutral":{"hex":"#231b09ff","u16":[8933,6923,2284,65535]},"Normal":{"hex":"#171412ff","u16":[5880,5145,4655,65535]},"Positive":{"hex":"#0d1f11ff","u16":[3268,7894,4418,65535]},"Visited":{"hex":"#201928ff","u16":[8148,6422,10407,65535]}},"decoration":{"Focus":{"hex":"#5f544cff","u16":[24400,21607,19660,65535]},"Hover":{"hex":"#645951ff","u16":[25686,22980,20861,65535]}},"foreground":{"Active":{"hex":"#643857ff","u16":[25686,14320,22232,65535]},"Inactive":{"hex":"#3d3a39ff","u16":[15568,15005,14601,65535]},"Link":{"hex":"#2c4661ff","u16":[11367,18091,24890,65535]},"Negative":{"hex":"#4f0e0dff","u16":[20199,3601,3283,65535]},"Neutral":{"hex":"#4a380cff","u16":[18912,14320,3026,65535]},"Normal":{"hex":"#645e58ff","u16":[25686,24094,22576,65535]},"Positive":{"hex":"#0f3219ff","u16":[3822,12776,6455,65535]},"Visited":{"hex":"#413259ff","u16":[16684,12862,22918,65535]}},"shade":{"Dark":{"hex":"#a59183ff","u16":[42478,37168,33629,65535]},"Light":{"hex":"#e5dad3ff","u16":[58771,55904,54161,65535]},"Mid":{"hex":"#796a60ff","u16":[31179,27282,24683,65535]},"Midlight":{"hex":"#c6ae9dff","u16":[50975,44603,40355,65535]},"Shadow":{"hex":"#c6ae9dff","u16":[50975,44603,40355,65535]}}},"Inactive":{"background":{"Active":{"hex":"#3a1f31ff","u16":[15011,7846,12561,65535]},"Alternate":{"hex":"#342d1dff","u16":[13354,11463,7543,65535]},"Link":{"hex":"#05293dff","u16":[1354,10646,15691,65535]},"Negative":{"hex":"#3e0804ff","u16":[16042,1988,948,65535]},"Neutral":{"hex":"#2d2203ff","u16":[11613,8729,881,65535]},"Normal":{"hex":"#1a1410ff","u16":[6675,5266,4187,65535]},"Positive":{"hex":"#062411ff","u16":[1510,9298,4427,65535]},"Visited":{"hex":"#291f36ff","u16":[10470,7907,13882,65535]}},"decoration":{"Focus":{"hex":"#e0bea6ff","u16":[57586,48928,42565,65535]},"Hover":{"hex":"#e6ccb7ff","u16":[59041,52324,47011,65535]}},"foreground":{"Active":{"hex":"#ef77cdff","u16":[61381,30480,52626,65535]},"Inactive":{"hex":"#87807aff","u16":[34702,32854,31455,65535]},"Link":{"hex":"#00a3fdff","u16":[0,41889,64909,65535]},"Negative":{"hex":"#b70a00ff","u16":[47037,2575,0,65535]},"Neutral":{"hex":"#a47a00ff","u16":[42168,31480,0,65535]},"Normal":{"hex":"#e4d5c7ff","u16":[58584,54814,51248,65535]},"Positive":{"hex":"#00692dff","u16":[0,27091,11631,65535]},"Visited":{"hex":"#906cceff","u16":[36973,27725,53044,65535]}},"shade":{"Dark":{"hex":"#b38d70ff","u16":[46002,36292,28856,65535]},"Light":{"hex":"#edd8cbff","u16":[60812,55465,52067,65535]},"Mid":{"hex":"#836852ff","u16":[33787,26655,21194,65535]},"Midlight":{"hex":"#d7a987ff","u16":[55192,43542,34620,65535]},"Shadow":{"hex":"#d7a987ff","u16":[55192,43542,34620,65535]}}}},"View":{"Active":{"background":{"Active":{"hex":"#331e36ff","u16":[13194,7715,13982,65535]},"Alternate":{"hex":"#211f1eff","u16":[8481,7967,7710,65535]},"Link":{"hex":"#082543ff","u16":[1958,9505,17116,65535]},"Negative":{"hex":"#4a0808ff","u16":[19073,2133,2133,65535]},"Neutral":{"hex":"#342707ff","u16":[13364,10141,1701,65535]},"Normal":{"hex":"#1e1d1dff","u16":[7710,7453,7453,65535]},"Positive":{"hex":"#082b14ff","u16":[1933,11017,5196,65535]},"Visited":{"hex":"#29203bff","u16":[10506,8218,15140,65535]}},"decoration":{"Focus":{"hex":"#f0d5c2ff","u16":[61680,54741,49858,65535]},"Hover":{"hex":"#ffe5d0ff","u16":[65535,58853,53456,65535]}},"foreground":{"Active":{"hex":"#924c9dff","u16":[37522,19532,40349,65535]},"Inactive":{"hex":"#898887ff","u16":[35209,34952,34695,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#ffe6deff","u16":[65535,59110,57054,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#644a9bff","u16":[25700,19018,39835,65535]}},"shade":{"Dark":{"hex":"#0f0e0eff","u16":[3752,3627,3627,65535]},"Light":{"hex":"#444141ff","u16":[17381,16802,16802,65535]},"Mid":{"hex":"#1a1919ff","u16":[6644,6422,6422,65535]},"Midlight":{"hex":"#353333ff","u16":[13581,13128,13128,65535]},"Shadow":{"hex":"#0b0a0aff","u16":[2732,2641,2641,65535]}}},"Disabled":{"background":{"Active":{"hex":"#2a1d2bff","u16":[10699,7459,11044,65535]},"Alternate":{"hex":"#1f1e1dff","u16":[8084,7594,7349,65535]},"Link":{"hex":"#112233ff","u16":[4446,8738,13180,65535]},"Negative":{"hex":"#3c1212ff","u16":[15443,4594,4594,65535]},"Neutral":{"hex":"#28210fff","u16":[10385,8490,3788,65535]},"Normal":{"hex":"#1d1c1cff","u16":[7349,7104,7104,65535]},"Positive":{"hex":"#112518ff","u16":[4369,9541,6157,65535]},"Visited":{"hex":"#241f2eff","u16":[9259,7845,11794,65535]}},"decoration":{"Focus":{"hex":"#635953ff","u16":[25356,22882,21252,65535]},"Hover":{"hex":"#685e57ff","u16":[26642,24253,22453,65535]}},"foreground":{"Active":{"hex":"#432b46ff","u16":[17296,11135,18080,65535]},"Inactive":{"hex":"#403f3fff","u16":[16524,16279,16194,65535]},"Link":{"hex":"#132f4cff","u16":[4778,12078,19538,65535]},"Negative":{"hex":"#521313ff","u16":[21154,4875,4875,65535]},"Neutral":{"hex":"#4d3d12ff","u16":[19868,15593,4617,65535]},"Normal":{"hex":"#685f5cff","u16":[26642,24339,23653,65535]},"Positive":{"hex":"#13371fff","u16":[4778,14050,8047,65535]},"Visited":{"hex":"#342b46ff","u16":[13352,10963,17908,65535]}},"shade":{"Dark":{"hex":"#0e0d0dff","u16":[3576,3457,3457,65535]},"Light":{"hex":"#434141ff","u16":[17191,16618,16618,65535]},"Mid":{"hex":"#191818ff","u16":[6333,6122,6122,65535]},"Midlight":{"hex":"#343232ff","u16":[13366,12920,12920,65535]},"Shadow":{"hex":"#0a0a0aff","u16":[2604,2517,2517,65535]}}},"Inactive":{"background":{"Active":{"hex":"#38193bff","u16":[14458,6387,15237,65535]},"Alternate":{"hex":"#221f1dff","u16":[8838,7881,7376,65535]},"Link":{"hex":"#08263dff","u16":[2014,9703,15655,65535]},"Negative":{"hex":"#4a0707ff","u16":[18980,1863,1863,65535]},"Neutral":{"hex":"#322707ff","u16":[12786,10089,1714,65535]},"Normal":{"hex":"#1f1d1dff","u16":[7886,7403,7403,65535]},"Positive":{"hex":"#082a18ff","u16":[1992,10886,6142,65535]},"Visited":{"hex":"#2b1e3fff","u16":[11033,7639,16207,65535]}},"decoration":{"Focus":{"hex":"#dcc1aeff","u16":[56552,49555,44778,65535]},"Hover":{"hex":"#e3cebeff","u16":[58293,52937,48898,65535]}},"foreground":{"Active":{"hex":"#9b38a6ff","u16":[39893,14518,42763,65535]},"Inactive":{"hex":"#84817fff","u16":[33940,33113,32746,65535]},"Link":{"hex":"#005799ff","u16":[0,22341,39358,65535]},"Negative":{"hex":"#b80000ff","u16":[47256,0,0,65535]},"Neutral":{"hex":"#a27c00ff","u16":[41673,31843,0,65535]},"Normal":{"hex":"#dcd1cdff","u16":[56502,53589,52752,65535]},"Positive":{"hex":"#006932ff","u16":[0,27104,12845,65535]},"Visited":{"hex":"#6641a2ff","u16":[26248,16727,41666,65535]}},"shade":{"Dark":{"hex":"#0f0e0eff","u16":[3837,3602,3602,65535]},"Light":{"hex":"#454141ff","u16":[17777,16688,16688,65535]},"Mid":{"hex":"#1a1919ff","u16":[6795,6379,6379,65535]},"Midlight":{"hex":"#363333ff","u16":[13891,13040,13040,65535]},"Shadow":{"hex":"#0b0a0aff","u16":[2794,2622,2622,65535]}}}},"Window":{"Active":{"background":{"Active":{"hex":"#3b233eff","u16":[15082,8974,15812,65535]},"Alternate":{"hex":"#1f1f1fff","u16":[7967,7967,7967,65535]},"Link":{"hex":"#0b2b4cff","u16":[2701,11066,19503,65535]},"Negative":{"hex":"#550b0bff","u16":[21923,2813,2744,65535]},"Neutral":{"hex":"#3a2c09ff","u16":[14977,11427,2237,65535]},"Normal":{"hex":"#262423ff","u16":[9766,9252,8995,65535]},"Positive":{"hex":"#0a3118ff","u16":[2677,12695,6160,65535]},"Visited":{"hex":"#2f2543ff","u16":[12203,9592,17211,65535]}},"decoration":{"Focus":{"hex":"#f0d5c2ff","u16":[61680,54741,49858,65535]},"Hover":{"hex":"#ffe5d0ff","u16":[65535,58853,53456,65535]}},"foreground":{"Active":{"hex":"#924c9dff","u16":[37522,19532,40349,65535]},"Inactive":{"hex":"#898887ff","u16":[35209,34952,34695,65535]},"Link":{"hex":"#0057aeff","u16":[0,22359,44718,65535]},"Negative":{"hex":"#bf0303ff","u16":[49087,771,771,65535]},"Neutral":{"hex":"#b08000ff","u16":[45232,32896,0,65535]},"Normal":{"hex":"#ffe8dfff","u16":[65535,59624,57311,65535]},"Positive":{"hex":"#006e28ff","u16":[0,28270,10280,65535]},"Visited":{"hex":"#644a9bff","u16":[25700,19018,39835,65535]}},"shade":{"Dark":{"hex":"#121211ff","u16":[4752,4502,4377,65535]},"Light":{"hex":"#494543ff","u16":[18829,17838,17343,65535]},"Mid":{"hex":"#211f1eff","u16":[8412,7969,7748,65535]},"Midlight":{"hex":"#3b3836ff","u16":[15088,14294,13897,65535]},"Shadow":{"hex":"#0d0d0cff","u16":[3455,3273,3182,65535]}}},"Disabled":{"background":{"Active":{"hex":"#312331ff","u16":[12511,8935,12577,65535]},"Alternate":{"hex":"#1e1e1eff","u16":[7594,7594,7594,65535]},"Link":{"hex":"#17283aff","u16":[5914,10346,14935,65535]},"Negative":{"hex":"#451716ff","u16":[17838,5914,5756,65535]},"Neutral":{"hex":"#2f2713ff","u16":[12141,9995,4877,65535]},"Normal":{"hex":"#242221ff","u16":[9309,8819,8574,65535]},"Positive":{"hex":"#172c1dff","u16":[5831,11183,7429,65535]},"Visited":{"hex":"#2b2434ff","u16":[10998,9349,13374,65535]}},"decoration":{"Focus":{"hex":"#685d56ff","u16":[26630,23996,22208,65535]},"Hover":{"hex":"#6d635bff","u16":[27916,25368,23408,65535]}},"foreground":{"Active":{"hex":"#48304aff","u16":[18570,12249,19035,65535]},"Inactive":{"hex":"#454443ff","u16":[17798,17394,17149,65535]},"Link":{"hex":"#183350ff","u16":[6051,13192,20493,65535]},"Negative":{"hex":"#571717ff","u16":[22428,5990,5831,65535]},"Neutral":{"hex":"#524116ff","u16":[21142,16707,5574,65535]},"Normal":{"hex":"#6d6460ff","u16":[27916,25625,24695,65535]},"Positive":{"hex":"#183b23ff","u16":[6051,15164,9003,65535]},"Visited":{"hex":"#392f49ff","u16":[14626,12078,18864,65535]}},"shade":{"Dark":{"hex":"#121110ff","u16":[4530,4291,4172,65535]},"Light":{"hex":"#484442ff","u16":[18539,17563,17075,65535]},"Mid":{"hex":"#1f1e1dff","u16":[8019,7597,7386,65535]},"Midlight":{"hex":"#393635ff","u16":[14769,13992,13603,65535]},"Shadow":{"hex":"#0d0c0cff","u16":[3295,3121,3034,65535]}}},"Inactive":{"background":{"Active":{"hex":"#401e41ff","u16":[16395,7795,16715,65535]},"Alternate":{"hex":"#1f1f1fff","u16":[7967,7967,7967,65535]},"Link":{"hex":"#0b2c44ff","u16":[2811,11351,17554,65535]},"Negative":{"hex":"#540d09ff","u16":[21615,3428,2363,65535]},"Neutral":{"hex":"#382c09ff","u16":[14433,11418,2188,65535]},"Normal":{"hex":"#272422ff","u16":[10126,9166,8664,65535]},"Positive":{"hex":"#0b311cff","u16":[2789,12576,7170,65535]},"Visited":{"hex":"#322345ff","u16":[12886,9100,17764,65535]}},"decoration":{"Focus":{"hex":"#dec2afff","u16":[56953,49895,44934,65535]},"Hover":{"hex":"#e4d0c0ff","u16":[58692,53349,49239,65535]}},"foreground":{"Active":{"hex":"#9a3ca2ff","u16":[39570,15386,41650,65535]},"Inactive":{"hex":"#86817eff","u16":[34394,33173,32376,65535]},"Link":{"hex":"#005897ff","u16":[0,22524,38747,65535]},"Negative":{"hex":"#b80900ff","u16":[47269,2326,0,65535]},"Neutral":{"hex":"#a27c00ff","u16":[41727,31988,0,65535]},"Normal":{"hex":"#dfd3cfff","u16":[57339,54281,53073,65535]},"Positive":{"hex":"#006a32ff","u16":[0,27163,12926,65535]},"Visited":{"hex":"#67439dff","u16":[26390,17164,40244,65535]}},"shade":{"Dark":{"hex":"#131110ff","u16":[4927,4460,4216,65535]},"Light":{"hex":"#4c4541ff","u16":[19524,17673,16705,65535]},"Mid":{"hex":"#221f1dff","u16":[8722,7895,7463,65535]},"Midlight":{"hex":"#3d3734ff","u16":[15645,14161,13386,65535]},"Shadow":{"hex":"#0e0d0cff","u16":[3582,3242,3065,65535]}}}}},"sha256":"e52f4df2c05da0e5f10257b9e5daa27a62bec74fdfe34c09f29391c2efe8caeb","source":"/usr/share/color-schemes/OxygenDark.colors"}, +{"contrastF":0.7000000000000001,"frameContrast":0.2,"input":{"Colors:Button":{"BackgroundAlternate":"210,204,190","BackgroundNormal":"236,232,224","DecorationFocus":"200,90,10","DecorationHover":"230,130,50","ForegroundActive":"200,90,10","ForegroundInactive":"110,100,90","ForegroundLink":"10,90,200","ForegroundNegative":"190,20,40","ForegroundNeutral":"200,140,0","ForegroundNormal":"30,25,20","ForegroundPositive":"20,140,60","ForegroundVisited":"120,40,160"},"Colors:Complementary":{"BackgroundAlternate":"30,27,22","BackgroundNormal":"40,36,30","DecorationFocus":"255,160,60","DecorationHover":"255,190,110","ForegroundActive":"255,160,60","ForegroundInactive":"160,150,140","ForegroundLink":"100,170,255","ForegroundNegative":"255,90,100","ForegroundNeutral":"255,200,60","ForegroundNormal":"240,235,225","ForegroundPositive":"90,220,130","ForegroundVisited":"200,140,230"},"Colors:Selection":{"BackgroundAlternate":"170,80,20","BackgroundNormal":"200,90,10","DecorationFocus":"200,90,10","DecorationHover":"230,130,50","ForegroundActive":"255,240,200","ForegroundInactive":"240,220,200","ForegroundLink":"255,230,160","ForegroundNegative":"255,180,180","ForegroundNeutral":"255,230,120","ForegroundNormal":"255,255,255","ForegroundPositive":"180,255,190","ForegroundVisited":"240,200,240"},"Colors:Tooltip":{"BackgroundAlternate":"245,238,200","BackgroundNormal":"255,250,220","DecorationFocus":"200,90,10","DecorationHover":"230,130,50","ForegroundActive":"200,90,10","ForegroundInactive":"100,100,90","ForegroundLink":"10,90,200","ForegroundNegative":"190,20,40","ForegroundNeutral":"200,140,0","ForegroundNormal":"20,20,20","ForegroundPositive":"20,140,60","ForegroundVisited":"120,40,160"},"Colors:View":{"BackgroundAlternate":"240,236,226","BackgroundNormal":"250,248,240","DecorationFocus":"200,90,10","DecorationHover":"230,130,50","ForegroundActive":"200,90,10","ForegroundInactive":"120,110,100","ForegroundLink":"10,90,200","ForegroundNegative":"190,20,40","ForegroundNeutral":"200,140,0","ForegroundNormal":"40,30,20","ForegroundPositive":"20,140,60","ForegroundVisited":"120,40,160"},"Colors:Window":{"BackgroundAlternate":"220,214,202","BackgroundNormal":"230,226,216","DecorationFocus":"200,90,10","DecorationHover":"230,130,50","ForegroundActive":"200,90,10","ForegroundInactive":"110,100,90","ForegroundLink":"10,90,200","ForegroundNegative":"190,20,40","ForegroundNeutral":"200,140,0","ForegroundNormal":"30,25,20","ForegroundPositive":"20,140,60","ForegroundVisited":"120,40,160"},"General":{"ColorScheme":"SyntheticNoHeader","Name":"Synthetic No Header"},"KDE":{"contrast":"7"}},"name":"SyntheticNoHeader","origin":"synthetic","palette":{"Active":{"Accent":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"AlternateBase":{"hex":"#f0ece2ff","u16":[61680,60652,58082,65535]},"Base":{"hex":"#faf8f0ff","u16":[64250,63736,61680,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#ece8e0ff","u16":[60652,59624,57568,65535]},"ButtonText":{"hex":"#1e1914ff","u16":[7710,6425,5140,65535]},"Dark":{"hex":"#706e68ff","u16":[28904,28256,26616,65535]},"Highlight":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"HighlightedText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Link":{"hex":"#0a5ac8ff","u16":[2570,23130,51400,65535]},"LinkVisited":{"hex":"#7828a0ff","u16":[30840,10280,41120,65535]},"Mid":{"hex":"#bbb7adff","u16":[48156,47076,44344,65535]},"Midlight":{"hex":"#efede7ff","u16":[61547,60927,59404,65535]},"PlaceholderText":{"hex":"#786e64ff","u16":[30840,28270,25700,65535]},"Shadow":{"hex":"#3e3d39ff","u16":[15930,15573,14669,65535]},"Text":{"hex":"#281e14ff","u16":[10280,7710,5140,65535]},"ToolTipBase":{"hex":"#fffadcff","u16":[65535,64250,56540,65535]},"ToolTipText":{"hex":"#141414ff","u16":[5140,5140,5140,65535]},"Window":{"hex":"#e6e2d8ff","u16":[59110,58082,55512,65535]},"WindowText":{"hex":"#1e1914ff","u16":[7710,6425,5140,65535]}},"Disabled":{"Accent":{"hex":"#dcd7cbff","u16":[56625,55354,52142,65535]},"AlternateBase":{"hex":"#e7e1d0ff","u16":[59458,57789,53502,65535]},"Base":{"hex":"#f2edd6ff","u16":[62193,60818,55050,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#e3ddd1ff","u16":[58352,56793,53615,65535]},"ButtonText":{"hex":"#9c9891ff","u16":[40152,39087,37384,65535]},"Dark":{"hex":"#6b6963ff","u16":[27553,26935,25372,65535]},"Highlight":{"hex":"#dcd7cbff","u16":[56625,55354,52142,65535]},"HighlightedText":{"hex":"#99948dff","u16":[39197,38131,36111,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Link":{"hex":"#98b8dfff","u16":[39130,47354,57189,65535]},"LinkVisited":{"hex":"#c7a5cfff","u16":[51086,42388,53265,65535]},"Mid":{"hex":"#b4b0a6ff","u16":[46206,45169,42548,65535]},"Midlight":{"hex":"#e7e3daff","u16":[59382,58401,55954,65535]},"PlaceholderText":{"hex":"#c3beb6ff","u16":[50099,48923,46792,65535]},"Shadow":{"hex":"#3d3c38ff","u16":[15762,15408,14514,65535]},"Text":{"hex":"#a8a49bff","u16":[43240,42064,39932,65535]},"ToolTipBase":{"hex":"#fffadcff","u16":[65535,64250,56540,65535]},"ToolTipText":{"hex":"#141414ff","u16":[5140,5140,5140,65535]},"Window":{"hex":"#dcd7cbff","u16":[56625,55354,52142,65535]},"WindowText":{"hex":"#99948dff","u16":[39197,38131,36111,65535]}},"Inactive":{"Accent":{"hex":"#f7bc9fff","u16":[63530,48385,40845,65535]},"AlternateBase":{"hex":"#f0ece2ff","u16":[61680,60652,58082,65535]},"Base":{"hex":"#faf8f0ff","u16":[64250,63736,61680,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#ece8e0ff","u16":[60652,59624,57568,65535]},"ButtonText":{"hex":"#1e1914ff","u16":[7710,6425,5140,65535]},"Dark":{"hex":"#706e68ff","u16":[28904,28256,26616,65535]},"Highlight":{"hex":"#f7bc9fff","u16":[63530,48385,40845,65535]},"HighlightedText":{"hex":"#1e1914ff","u16":[7710,6425,5140,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Link":{"hex":"#0a5ac8ff","u16":[2570,23130,51400,65535]},"LinkVisited":{"hex":"#7828a0ff","u16":[30840,10280,41120,65535]},"Mid":{"hex":"#bbb7adff","u16":[48156,47076,44344,65535]},"Midlight":{"hex":"#efede7ff","u16":[61547,60927,59404,65535]},"PlaceholderText":{"hex":"#786e64ff","u16":[30840,28270,25700,65535]},"Shadow":{"hex":"#3e3d39ff","u16":[15930,15573,14669,65535]},"Text":{"hex":"#281e14ff","u16":[10280,7710,5140,65535]},"ToolTipBase":{"hex":"#fffadcff","u16":[65535,64250,56540,65535]},"ToolTipText":{"hex":"#141414ff","u16":[5140,5140,5140,65535]},"Window":{"hex":"#e6e2d8ff","u16":[59110,58082,55512,65535]},"WindowText":{"hex":"#1e1914ff","u16":[7710,6425,5140,65535]}}},"purpose":"no Colors:Header group and no ColorEffects groups: Header falls back, effects take their defaults","set_supported":{"Button":true,"Complementary":true,"Header":false,"Selection":true,"Tooltip":true,"View":true,"Window":true},"sets":{"Button":{"Active":{"background":{"Active":{"hex":"#f5d6c5ff","u16":[63036,54908,50667,65535]},"Alternate":{"hex":"#d2ccbeff","u16":[53970,52428,48830,65535]},"Link":{"hex":"#ccd8f0ff","u16":[52406,55511,61737,65535]},"Negative":{"hex":"#edd1d3ff","u16":[60906,53698,54127,65535]},"Neutral":{"hex":"#f9dba5ff","u16":[64039,56343,42302,65535]},"Normal":{"hex":"#ece8e0ff","u16":[60652,59624,57568,65535]},"Positive":{"hex":"#8df1a9ff","u16":[36110,62036,43319,65535]},"Visited":{"hex":"#ddd0e3ff","u16":[56670,53338,58427,65535]}},"decoration":{"Focus":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Hover":{"hex":"#e68232ff","u16":[59110,33410,12850,65535]}},"foreground":{"Active":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Inactive":{"hex":"#6e645aff","u16":[28270,25700,23130,65535]},"Link":{"hex":"#0a5ac8ff","u16":[2570,23130,51400,65535]},"Negative":{"hex":"#be1428ff","u16":[48830,5140,10280,65535]},"Neutral":{"hex":"#c88c00ff","u16":[51400,35980,0,65535]},"Normal":{"hex":"#1e1914ff","u16":[7710,6425,5140,65535]},"Positive":{"hex":"#148c3cff","u16":[5140,35980,15420,65535]},"Visited":{"hex":"#7828a0ff","u16":[30840,10280,41120,65535]}},"shade":{"Dark":{"hex":"#757169ff","u16":[29979,28975,26899,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c2bbaeff","u16":[49745,48079,44635,65535]},"Midlight":{"hex":"#f5f3eeff","u16":[62892,62350,61284,65535]},"Shadow":{"hex":"#3f3d38ff","u16":[16127,15587,14471,65535]}}},"Disabled":{"background":{"Active":{"hex":"#e7d3c2ff","u16":[59462,54264,49913,65535]},"Alternate":{"hex":"#c8c2b5ff","u16":[51446,49976,46547,65535]},"Link":{"hex":"#ced7e3ff","u16":[52838,55295,58336,65535]},"Negative":{"hex":"#ead0ceff","u16":[60117,53459,53057,65535]},"Neutral":{"hex":"#e8d5acff","u16":[59637,54866,44083,65535]},"Normal":{"hex":"#e3ddd1ff","u16":[58352,56793,53615,65535]},"Positive":{"hex":"#c4dec2ff","u16":[50327,56952,49748,65535]},"Visited":{"hex":"#dfd2deff","u16":[57417,53949,57112,65535]}},"decoration":{"Focus":{"hex":"#d9ad88ff","u16":[55769,44390,34840,65535]},"Hover":{"hex":"#e6b98fff","u16":[59228,47621,36639,65535]}},"foreground":{"Active":{"hex":"#d9ad88ff","u16":[55769,44390,34840,65535]},"Inactive":{"hex":"#b7b1a9ff","u16":[47012,45518,43387,65535]},"Link":{"hex":"#90aed4ff","u16":[37131,44776,54422,65535]},"Negative":{"hex":"#d99395ff","u16":[55768,37862,38401,65535]},"Neutral":{"hex":"#d5be8bff","u16":[54729,48948,35669,65535]},"Normal":{"hex":"#9c9891ff","u16":[40152,39087,37384,65535]},"Positive":{"hex":"#99be9fff","u16":[39295,48948,40814,65535]},"Visited":{"hex":"#be9bc5ff","u16":[48794,39875,50565,65535]}},"shade":{"Dark":{"hex":"#6f6b64ff","u16":[28577,27620,25641,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bab4a7ff","u16":[47753,46153,42847,65535]},"Midlight":{"hex":"#ece9e1ff","u16":[60764,59761,57756,65535]},"Shadow":{"hex":"#3e3c38ff","u16":[16024,15488,14378,65535]}}},"Inactive":{"background":{"Active":{"hex":"#f5d6c5ff","u16":[63036,54908,50667,65535]},"Alternate":{"hex":"#d2ccbeff","u16":[53970,52428,48830,65535]},"Link":{"hex":"#ccd8f0ff","u16":[52406,55511,61737,65535]},"Negative":{"hex":"#edd1d3ff","u16":[60906,53698,54127,65535]},"Neutral":{"hex":"#f9dba5ff","u16":[64039,56343,42302,65535]},"Normal":{"hex":"#ece8e0ff","u16":[60652,59624,57568,65535]},"Positive":{"hex":"#8df1a9ff","u16":[36110,62036,43319,65535]},"Visited":{"hex":"#ddd0e3ff","u16":[56670,53338,58427,65535]}},"decoration":{"Focus":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Hover":{"hex":"#e68232ff","u16":[59110,33410,12850,65535]}},"foreground":{"Active":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Inactive":{"hex":"#6e645aff","u16":[28270,25700,23130,65535]},"Link":{"hex":"#0a5ac8ff","u16":[2570,23130,51400,65535]},"Negative":{"hex":"#be1428ff","u16":[48830,5140,10280,65535]},"Neutral":{"hex":"#c88c00ff","u16":[51400,35980,0,65535]},"Normal":{"hex":"#1e1914ff","u16":[7710,6425,5140,65535]},"Positive":{"hex":"#148c3cff","u16":[5140,35980,15420,65535]},"Visited":{"hex":"#7828a0ff","u16":[30840,10280,41120,65535]}},"shade":{"Dark":{"hex":"#757169ff","u16":[29979,28975,26899,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c2bbaeff","u16":[49745,48079,44635,65535]},"Midlight":{"hex":"#f5f3eeff","u16":[62892,62350,61284,65535]},"Shadow":{"hex":"#3f3d38ff","u16":[16127,15587,14471,65535]}}}},"Complementary":{"Active":{"background":{"Active":{"hex":"#462f15ff","u16":[18061,11967,5448,65535]},"Alternate":{"hex":"#1e1b16ff","u16":[7710,6939,5654,65535]},"Link":{"hex":"#223347ff","u16":[8829,13093,18203,65535]},"Negative":{"hex":"#4f2122ff","u16":[20227,8510,8829,65535]},"Neutral":{"hex":"#433514ff","u16":[17108,13676,5175,65535]},"Normal":{"hex":"#28241eff","u16":[10280,9252,7710,65535]},"Positive":{"hex":"#1e3b25ff","u16":[7689,15281,9526,65535]},"Visited":{"hex":"#3c2c41ff","u16":[15365,11238,16705,65535]}},"decoration":{"Focus":{"hex":"#ffa03cff","u16":[65535,41120,15420,65535]},"Hover":{"hex":"#ffbe6eff","u16":[65535,48830,28270,65535]}},"foreground":{"Active":{"hex":"#ffa03cff","u16":[65535,41120,15420,65535]},"Inactive":{"hex":"#a0968cff","u16":[41120,38550,35980,65535]},"Link":{"hex":"#64aaffff","u16":[25700,43690,65535,65535]},"Negative":{"hex":"#ff5a64ff","u16":[65535,23130,25700,65535]},"Neutral":{"hex":"#ffc83cff","u16":[65535,51400,15420,65535]},"Normal":{"hex":"#f0ebe1ff","u16":[61680,60395,57825,65535]},"Positive":{"hex":"#5adc82ff","u16":[23130,56540,33410,65535]},"Visited":{"hex":"#c88ce6ff","u16":[51400,35980,59110,65535]}},"shade":{"Dark":{"hex":"#13120fff","u16":[5002,4502,3752,65535]},"Light":{"hex":"#4d453aff","u16":[19768,17791,14826,65535]},"Mid":{"hex":"#221f1aff","u16":[8855,7969,6641,65535]},"Midlight":{"hex":"#3e372eff","u16":[15848,14263,11886,65535]},"Shadow":{"hex":"#0e0d0bff","u16":[3636,3273,2728,65535]}}},"Disabled":{"background":{"Active":{"hex":"#342617ff","u16":[13419,9815,5791,65535]},"Alternate":{"hex":"#1d1a15ff","u16":[7349,6615,5390,65535]},"Link":{"hex":"#222932ff","u16":[8721,10609,12751,65535]},"Negative":{"hex":"#3b211fff","u16":[15249,8404,7957,65535]},"Neutral":{"hex":"#312815ff","u16":[12548,10408,5470,65535]},"Normal":{"hex":"#26221dff","u16":[9799,8819,7349,65535]},"Positive":{"hex":"#1f2d1fff","u16":[7853,11442,7857,65535]},"Visited":{"hex":"#30252eff","u16":[12220,9612,11939,65535]}},"decoration":{"Focus":{"hex":"#6e4c27ff","u16":[28234,19452,9922,65535]},"Hover":{"hex":"#6e5637ff","u16":[28234,22024,14209,65535]}},"foreground":{"Active":{"hex":"#6e4c27ff","u16":[28234,19452,9922,65535]},"Inactive":{"hex":"#4e4841ff","u16":[20089,18594,16782,65535]},"Link":{"hex":"#3a4f68ff","u16":[14944,20309,26642,65535]},"Negative":{"hex":"#6e3434ff","u16":[28234,13449,13352,65535]},"Neutral":{"hex":"#6e5927ff","u16":[28234,22882,9922,65535]},"Normal":{"hex":"#69655eff","u16":[26948,25882,24069,65535]},"Positive":{"hex":"#37603eff","u16":[14087,24596,15924,65535]},"Visited":{"hex":"#5c455fff","u16":[23518,17737,24498,65535]}},"shade":{"Dark":{"hex":"#13110eff","u16":[4768,4291,3576,65535]},"Light":{"hex":"#4c4439ff","u16":[19461,17514,14595,65535]},"Mid":{"hex":"#211e19ff","u16":[8441,7597,6331,65535]},"Midlight":{"hex":"#3c362dff","u16":[15511,13960,11633,65535]},"Shadow":{"hex":"#0d0c0aff","u16":[3468,3121,2601,65535]}}},"Inactive":{"background":{"Active":{"hex":"#462f15ff","u16":[18061,11967,5448,65535]},"Alternate":{"hex":"#1e1b16ff","u16":[7710,6939,5654,65535]},"Link":{"hex":"#223347ff","u16":[8829,13093,18203,65535]},"Negative":{"hex":"#4f2122ff","u16":[20227,8510,8829,65535]},"Neutral":{"hex":"#433514ff","u16":[17108,13676,5175,65535]},"Normal":{"hex":"#28241eff","u16":[10280,9252,7710,65535]},"Positive":{"hex":"#1e3b25ff","u16":[7689,15281,9526,65535]},"Visited":{"hex":"#3c2c41ff","u16":[15365,11238,16705,65535]}},"decoration":{"Focus":{"hex":"#ffa03cff","u16":[65535,41120,15420,65535]},"Hover":{"hex":"#ffbe6eff","u16":[65535,48830,28270,65535]}},"foreground":{"Active":{"hex":"#ffa03cff","u16":[65535,41120,15420,65535]},"Inactive":{"hex":"#a0968cff","u16":[41120,38550,35980,65535]},"Link":{"hex":"#64aaffff","u16":[25700,43690,65535,65535]},"Negative":{"hex":"#ff5a64ff","u16":[65535,23130,25700,65535]},"Neutral":{"hex":"#ffc83cff","u16":[65535,51400,15420,65535]},"Normal":{"hex":"#f0ebe1ff","u16":[61680,60395,57825,65535]},"Positive":{"hex":"#5adc82ff","u16":[23130,56540,33410,65535]},"Visited":{"hex":"#c88ce6ff","u16":[51400,35980,59110,65535]}},"shade":{"Dark":{"hex":"#13120fff","u16":[5002,4502,3752,65535]},"Light":{"hex":"#4d453aff","u16":[19768,17791,14826,65535]},"Mid":{"hex":"#221f1aff","u16":[8855,7969,6641,65535]},"Midlight":{"hex":"#3e372eff","u16":[15848,14263,11886,65535]},"Shadow":{"hex":"#0e0d0bff","u16":[3636,3273,2728,65535]}}}},"Header":{"Active":{"background":{"Active":{"hex":"#f4cfbbff","u16":[62786,53235,48073,65535]},"Alternate":{"hex":"#dcd6caff","u16":[56540,54998,51914,65535]},"Link":{"hex":"#c5d3efff","u16":[50620,54244,61307,65535]},"Negative":{"hex":"#eacbcdff","u16":[60194,52203,52639,65535]},"Neutral":{"hex":"#f9d58fff","u16":[63904,54710,36739,65535]},"Normal":{"hex":"#e6e2d8ff","u16":[59110,58082,55512,65535]},"Positive":{"hex":"#88eca3ff","u16":[35054,60578,41870,65535]},"Visited":{"hex":"#d9cae0ff","u16":[55688,51964,57566,65535]}},"decoration":{"Focus":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Hover":{"hex":"#e68232ff","u16":[59110,33410,12850,65535]}},"foreground":{"Active":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Inactive":{"hex":"#6e645aff","u16":[28270,25700,23130,65535]},"Link":{"hex":"#0a5ac8ff","u16":[2570,23130,51400,65535]},"Negative":{"hex":"#be1428ff","u16":[48830,5140,10280,65535]},"Neutral":{"hex":"#c88c00ff","u16":[51400,35980,0,65535]},"Normal":{"hex":"#1e1914ff","u16":[7710,6425,5140,65535]},"Positive":{"hex":"#148c3cff","u16":[5140,35980,15420,65535]},"Visited":{"hex":"#7828a0ff","u16":[30840,10280,41120,65535]}},"shade":{"Dark":{"hex":"#706e68ff","u16":[28904,28256,26616,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bbb7adff","u16":[48156,47076,44344,65535]},"Midlight":{"hex":"#efede7ff","u16":[61547,60927,59404,65535]},"Shadow":{"hex":"#3e3d39ff","u16":[15930,15573,14669,65535]}}},"Disabled":{"background":{"Active":{"hex":"#e1cebcff","u16":[57920,52843,48412,65535]},"Alternate":{"hex":"#d2ccc0ff","u16":[53908,52425,49457,65535]},"Link":{"hex":"#c7d2deff","u16":[51216,53883,56944,65535]},"Negative":{"hex":"#e5cac8ff","u16":[58939,51935,51367,65535]},"Neutral":{"hex":"#e3d0a4ff","u16":[58254,53431,42023,65535]},"Normal":{"hex":"#dcd7cbff","u16":[56625,55354,52142,65535]},"Positive":{"hex":"#bed8bbff","u16":[48787,55537,48086,65535]},"Visited":{"hex":"#daccd9ff","u16":[56086,52469,55670,65535]}},"decoration":{"Focus":{"hex":"#d2aa88ff","u16":[53908,43671,35033,65535]},"Hover":{"hex":"#e2b68aff","u16":[58157,46698,35439,65535]}},"foreground":{"Active":{"hex":"#d2aa88ff","u16":[53908,43671,35033,65535]},"Inactive":{"hex":"#b3ada4ff","u16":[46057,44562,42112,65535]},"Link":{"hex":"#8dabceff","u16":[36232,43821,53035,65535]},"Negative":{"hex":"#d59090ff","u16":[54742,36935,37085,65535]},"Neutral":{"hex":"#d1bb86ff","u16":[53774,47992,34396,65535]},"Normal":{"hex":"#99948dff","u16":[39197,38131,36111,65535]},"Positive":{"hex":"#95bb9aff","u16":[38340,47992,39540,65535]},"Visited":{"hex":"#ba98bfff","u16":[47807,38942,49200,65535]}},"shade":{"Dark":{"hex":"#6b6963ff","u16":[27553,26935,25372,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#b4b0a6ff","u16":[46206,45169,42548,65535]},"Midlight":{"hex":"#e7e3daff","u16":[59382,58401,55954,65535]},"Shadow":{"hex":"#3d3c38ff","u16":[15762,15408,14514,65535]}}},"Inactive":{"background":{"Active":{"hex":"#f4cfbbff","u16":[62786,53235,48073,65535]},"Alternate":{"hex":"#dcd6caff","u16":[56540,54998,51914,65535]},"Link":{"hex":"#c5d3efff","u16":[50620,54244,61307,65535]},"Negative":{"hex":"#eacbcdff","u16":[60194,52203,52639,65535]},"Neutral":{"hex":"#f9d58fff","u16":[63904,54710,36739,65535]},"Normal":{"hex":"#e6e2d8ff","u16":[59110,58082,55512,65535]},"Positive":{"hex":"#88eca3ff","u16":[35054,60578,41870,65535]},"Visited":{"hex":"#d9cae0ff","u16":[55688,51964,57566,65535]}},"decoration":{"Focus":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Hover":{"hex":"#e68232ff","u16":[59110,33410,12850,65535]}},"foreground":{"Active":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Inactive":{"hex":"#6e645aff","u16":[28270,25700,23130,65535]},"Link":{"hex":"#0a5ac8ff","u16":[2570,23130,51400,65535]},"Negative":{"hex":"#be1428ff","u16":[48830,5140,10280,65535]},"Neutral":{"hex":"#c88c00ff","u16":[51400,35980,0,65535]},"Normal":{"hex":"#1e1914ff","u16":[7710,6425,5140,65535]},"Positive":{"hex":"#148c3cff","u16":[5140,35980,15420,65535]},"Visited":{"hex":"#7828a0ff","u16":[30840,10280,41120,65535]}},"shade":{"Dark":{"hex":"#706e68ff","u16":[28904,28256,26616,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bbb7adff","u16":[48156,47076,44344,65535]},"Midlight":{"hex":"#efede7ff","u16":[61547,60927,59404,65535]},"Shadow":{"hex":"#3e3d39ff","u16":[15930,15573,14669,65535]}}}},"Selection":{"Active":{"background":{"Active":{"hex":"#a57a4fff","u16":[42499,31354,20408,65535]},"Alternate":{"hex":"#aa5014ff","u16":[43690,20560,5140,65535]},"Link":{"hex":"#a87942ff","u16":[43290,31005,16889,65535]},"Negative":{"hex":"#ba6d4cff","u16":[47781,27923,19608,65535]},"Neutral":{"hex":"#a97932ff","u16":[43399,31083,12921,65535]},"Normal":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Positive":{"hex":"#8b834eff","u16":[35848,33758,20128,65535]},"Visited":{"hex":"#bb6c59ff","u16":[48177,27749,22775,65535]}},"decoration":{"Focus":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Hover":{"hex":"#e68232ff","u16":[59110,33410,12850,65535]}},"foreground":{"Active":{"hex":"#fff0c8ff","u16":[65535,61680,51400,65535]},"Inactive":{"hex":"#f0dcc8ff","u16":[61680,56540,51400,65535]},"Link":{"hex":"#ffe6a0ff","u16":[65535,59110,41120,65535]},"Negative":{"hex":"#ffb4b4ff","u16":[65535,46260,46260,65535]},"Neutral":{"hex":"#ffe678ff","u16":[65535,59110,30840,65535]},"Normal":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Positive":{"hex":"#b4ffbeff","u16":[46260,65535,48830,65535]},"Visited":{"hex":"#f0c8f0ff","u16":[61680,51400,61680,65535]}},"shade":{"Dark":{"hex":"#612c05ff","u16":[25011,11255,1251,65535]},"Light":{"hex":"#f9700cff","u16":[64056,28825,3203,65535]},"Mid":{"hex":"#aa4c08ff","u16":[43658,19646,2183,65535]},"Midlight":{"hex":"#df640bff","u16":[57269,25771,2863,65535]},"Shadow":{"hex":"#431e03ff","u16":[17237,7757,862,65535]}}},"Disabled":{"background":{"Active":{"hex":"#e1cebcff","u16":[57920,52843,48412,65535]},"Alternate":{"hex":"#d2ccc0ff","u16":[53908,52425,49457,65535]},"Link":{"hex":"#c7d2deff","u16":[51216,53883,56944,65535]},"Negative":{"hex":"#e5cac8ff","u16":[58939,51935,51367,65535]},"Neutral":{"hex":"#e3d0a4ff","u16":[58254,53431,42023,65535]},"Normal":{"hex":"#dcd7cbff","u16":[56625,55354,52142,65535]},"Positive":{"hex":"#bed8bbff","u16":[48787,55537,48086,65535]},"Visited":{"hex":"#daccd9ff","u16":[56086,52469,55670,65535]}},"decoration":{"Focus":{"hex":"#d2aa88ff","u16":[53908,43671,35033,65535]},"Hover":{"hex":"#e2b68aff","u16":[58157,46698,35439,65535]}},"foreground":{"Active":{"hex":"#d2aa88ff","u16":[53908,43671,35033,65535]},"Inactive":{"hex":"#b3ada4ff","u16":[46057,44562,42112,65535]},"Link":{"hex":"#8dabceff","u16":[36232,43821,53035,65535]},"Negative":{"hex":"#d59090ff","u16":[54742,36935,37085,65535]},"Neutral":{"hex":"#d1bb86ff","u16":[53774,47992,34396,65535]},"Normal":{"hex":"#99948dff","u16":[39197,38131,36111,65535]},"Positive":{"hex":"#95bb9aff","u16":[38340,47992,39540,65535]},"Visited":{"hex":"#ba98bfff","u16":[47807,38942,49200,65535]}},"shade":{"Dark":{"hex":"#6b6963ff","u16":[27553,26935,25372,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#b4b0a6ff","u16":[46206,45169,42548,65535]},"Midlight":{"hex":"#e7e3daff","u16":[59382,58401,55954,65535]},"Shadow":{"hex":"#3d3c38ff","u16":[15762,15408,14514,65535]}}},"Inactive":{"background":{"Active":{"hex":"#f6b090ff","u16":[63134,45330,36989,65535]},"Alternate":{"hex":"#f7b08bff","u16":[63416,45335,35740,65535]},"Link":{"hex":"#b2bddbff","u16":[45633,48495,56224,65535]},"Negative":{"hex":"#e6b0b0ff","u16":[59110,45142,45207,65535]},"Neutral":{"hex":"#fab643ff","u16":[64282,46677,17228,65535]},"Normal":{"hex":"#f7bc9fff","u16":[63530,48385,40845,65535]},"Positive":{"hex":"#8fd081ff","u16":[36637,53545,33244,65535]},"Visited":{"hex":"#daadd5ff","u16":[55937,44369,54698,65535]}},"decoration":{"Focus":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Hover":{"hex":"#e68232ff","u16":[59110,33410,12850,65535]}},"foreground":{"Active":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Inactive":{"hex":"#6e645aff","u16":[28270,25700,23130,65535]},"Link":{"hex":"#0a5ac8ff","u16":[2570,23130,51400,65535]},"Negative":{"hex":"#be1428ff","u16":[48830,5140,10280,65535]},"Neutral":{"hex":"#c88c00ff","u16":[51400,35980,0,65535]},"Normal":{"hex":"#1e1914ff","u16":[7710,6425,5140,65535]},"Positive":{"hex":"#148c3cff","u16":[5140,35980,15420,65535]},"Visited":{"hex":"#7828a0ff","u16":[30840,10280,41120,65535]}},"shade":{"Dark":{"hex":"#8c542bff","u16":[36006,21691,10963,65535]},"Light":{"hex":"#fdeee8ff","u16":[64962,61162,59645,65535]},"Mid":{"hex":"#ed8f48ff","u16":[60893,36683,18540,65535]},"Midlight":{"hex":"#f9ccb8ff","u16":[63954,52521,47303,65535]},"Shadow":{"hex":"#54321aff","u16":[21533,12972,6556,65535]}}}},"Tooltip":{"Active":{"background":{"Active":{"hex":"#fae7dcff","u16":[64235,59292,56570,65535]},"Alternate":{"hex":"#f5eec8ff","u16":[62965,61166,51400,65535]},"Link":{"hex":"#dde6f5ff","u16":[56861,59010,62880,65535]},"Negative":{"hex":"#f4e1e1ff","u16":[62751,57759,57818,65535]},"Neutral":{"hex":"#fcecd1ff","u16":[64806,60692,53657,65535]},"Normal":{"hex":"#fffadcff","u16":[65535,64250,56540,65535]},"Positive":{"hex":"#c3f7cbff","u16":[50177,63504,52043,65535]},"Visited":{"hex":"#e7deebff","u16":[59465,56994,60335,65535]}},"decoration":{"Focus":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Hover":{"hex":"#e68232ff","u16":[59110,33410,12850,65535]}},"foreground":{"Active":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Inactive":{"hex":"#64645aff","u16":[25700,25700,23130,65535]},"Link":{"hex":"#0a5ac8ff","u16":[2570,23130,51400,65535]},"Negative":{"hex":"#be1428ff","u16":[48830,5140,10280,65535]},"Neutral":{"hex":"#c88c00ff","u16":[51400,35980,0,65535]},"Normal":{"hex":"#141414ff","u16":[5140,5140,5140,65535]},"Positive":{"hex":"#148c3cff","u16":[5140,35980,15420,65535]},"Visited":{"hex":"#7828a0ff","u16":[30840,10280,41120,65535]}},"shade":{"Dark":{"hex":"#c6b800ff","u16":[50922,47201,0,65535]},"Light":{"hex":"#e2d200ff","u16":[58183,53932,0,65535]},"Mid":{"hex":"#e2d200ff","u16":[58183,53932,0,65535]},"Midlight":{"hex":"#fbe900ff","u16":[64492,59780,0,65535]},"Shadow":{"hex":"#8c8200ff","u16":[36042,33409,0,65535]}}},"Disabled":{"background":{"Active":{"hex":"#f7e4c3ff","u16":[63519,58538,50042,65535]},"Alternate":{"hex":"#ece3afff","u16":[60758,58398,44876,65535]},"Link":{"hex":"#dbebccff","u16":[56263,60348,52308,65535]},"Negative":{"hex":"#f7e1d0ff","u16":[63575,57931,53354,65535]},"Neutral":{"hex":"#f7e6acff","u16":[63408,59193,44284,65535]},"Normal":{"hex":"#fff07bff","u16":[65535,61747,31631,65535]},"Positive":{"hex":"#d9efa2ff","u16":[55809,61433,41576,65535]},"Visited":{"hex":"#efe3daff","u16":[61485,58390,55907,65535]}},"decoration":{"Focus":{"hex":"#e7b77dff","u16":[59434,47142,32045,65535]},"Hover":{"hex":"#f4c482ff","u16":[62796,50437,33300,65535]}},"foreground":{"Active":{"hex":"#e7b77dff","u16":[59434,47142,32045,65535]},"Inactive":{"hex":"#bfbca6ff","u16":[49180,48384,42750,65535]},"Link":{"hex":"#9cbad0ff","u16":[40118,47722,53375,65535]},"Negative":{"hex":"#e69e8fff","u16":[59091,40688,36816,65535]},"Neutral":{"hex":"#e1ca88ff","u16":[57755,51814,35032,65535]},"Normal":{"hex":"#a5a28fff","u16":[42321,41525,36747,65535]},"Positive":{"hex":"#a5ca9cff","u16":[42321,51814,40177,65535]},"Visited":{"hex":"#caa6c0ff","u16":[52012,42745,49452,65535]}},"shade":{"Dark":{"hex":"#7f7500ff","u16":[32531,30154,0,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#d1c200ff","u16":[53792,49862,0,65535]},"Midlight":{"hex":"#fff9d1ff","u16":[65535,63889,53726,65535]},"Shadow":{"hex":"#433e00ff","u16":[17122,15871,0,65535]}}},"Inactive":{"background":{"Active":{"hex":"#fae7dcff","u16":[64235,59292,56570,65535]},"Alternate":{"hex":"#f5eec8ff","u16":[62965,61166,51400,65535]},"Link":{"hex":"#dde6f5ff","u16":[56861,59010,62880,65535]},"Negative":{"hex":"#f4e1e1ff","u16":[62751,57759,57818,65535]},"Neutral":{"hex":"#fcecd1ff","u16":[64806,60692,53657,65535]},"Normal":{"hex":"#fffadcff","u16":[65535,64250,56540,65535]},"Positive":{"hex":"#c3f7cbff","u16":[50177,63504,52043,65535]},"Visited":{"hex":"#e7deebff","u16":[59465,56994,60335,65535]}},"decoration":{"Focus":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Hover":{"hex":"#e68232ff","u16":[59110,33410,12850,65535]}},"foreground":{"Active":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Inactive":{"hex":"#64645aff","u16":[25700,25700,23130,65535]},"Link":{"hex":"#0a5ac8ff","u16":[2570,23130,51400,65535]},"Negative":{"hex":"#be1428ff","u16":[48830,5140,10280,65535]},"Neutral":{"hex":"#c88c00ff","u16":[51400,35980,0,65535]},"Normal":{"hex":"#141414ff","u16":[5140,5140,5140,65535]},"Positive":{"hex":"#148c3cff","u16":[5140,35980,15420,65535]},"Visited":{"hex":"#7828a0ff","u16":[30840,10280,41120,65535]}},"shade":{"Dark":{"hex":"#c6b800ff","u16":[50922,47201,0,65535]},"Light":{"hex":"#e2d200ff","u16":[58183,53932,0,65535]},"Mid":{"hex":"#e2d200ff","u16":[58183,53932,0,65535]},"Midlight":{"hex":"#fbe900ff","u16":[64492,59780,0,65535]},"Shadow":{"hex":"#8c8200ff","u16":[36042,33409,0,65535]}}}},"View":{"Active":{"background":{"Active":{"hex":"#f9e6dcff","u16":[63881,59040,56599,65535]},"Alternate":{"hex":"#f0ece2ff","u16":[61680,60652,58082,65535]},"Link":{"hex":"#dde4f5ff","u16":[56679,58719,62899,65535]},"Negative":{"hex":"#f3e0e1ff","u16":[62546,57464,57768,65535]},"Neutral":{"hex":"#fbebd0ff","u16":[64585,60401,53387,65535]},"Normal":{"hex":"#faf8f0ff","u16":[64250,63736,61680,65535]},"Positive":{"hex":"#bdf7ccff","u16":[48611,63473,52376,65535]},"Visited":{"hex":"#e6ddecff","u16":[59172,56733,60544,65535]}},"decoration":{"Focus":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Hover":{"hex":"#e68232ff","u16":[59110,33410,12850,65535]}},"foreground":{"Active":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Inactive":{"hex":"#786e64ff","u16":[30840,28270,25700,65535]},"Link":{"hex":"#0a5ac8ff","u16":[2570,23130,51400,65535]},"Negative":{"hex":"#be1428ff","u16":[48830,5140,10280,65535]},"Neutral":{"hex":"#c88c00ff","u16":[51400,35980,0,65535]},"Normal":{"hex":"#281e14ff","u16":[10280,7710,5140,65535]},"Positive":{"hex":"#148c3cff","u16":[5140,35980,15420,65535]},"Visited":{"hex":"#7828a0ff","u16":[30840,10280,41120,65535]}},"shade":{"Dark":{"hex":"#bab399ff","u16":[47709,46131,39232,65535]},"Light":{"hex":"#d5ceafff","u16":[54650,52842,44939,65535]},"Mid":{"hex":"#d5ceafff","u16":[54650,52842,44939,65535]},"Midlight":{"hex":"#ece4c2ff","u16":[60666,58659,49886,65535]},"Shadow":{"hex":"#827e6bff","u16":[33383,32279,27451,65535]}}},"Disabled":{"background":{"Active":{"hex":"#f3e2d2ff","u16":[62491,58118,53966,65535]},"Alternate":{"hex":"#e7e1d0ff","u16":[59458,57789,53502,65535]},"Link":{"hex":"#dde5edff","u16":[56866,58973,60990,65535]},"Negative":{"hex":"#f4e0ddff","u16":[62673,57490,56811,65535]},"Neutral":{"hex":"#f0e5c9ff","u16":[61663,58761,51722,65535]},"Normal":{"hex":"#f2edd6ff","u16":[62193,60818,55050,65535]},"Positive":{"hex":"#d6ebd2ff","u16":[54936,60350,53946,65535]},"Visited":{"hex":"#ebe1e9ff","u16":[60516,57886,59999,65535]}},"decoration":{"Focus":{"hex":"#e5b68cff","u16":[58881,46721,35854,65535]},"Hover":{"hex":"#f0c396ff","u16":[61794,50105,38549,65535]}},"foreground":{"Active":{"hex":"#e5b68cff","u16":[58881,46721,35854,65535]},"Inactive":{"hex":"#c3beb6ff","u16":[50099,48923,46792,65535]},"Link":{"hex":"#98b8dfff","u16":[39130,47354,57189,65535]},"Negative":{"hex":"#e29d9fff","u16":[58179,40356,40904,65535]},"Neutral":{"hex":"#dec895ff","u16":[56959,51495,38217,65535]},"Normal":{"hex":"#a8a49bff","u16":[43240,42064,39932,65535]},"Positive":{"hex":"#a2c8a9ff","u16":[41525,51495,43362,65535]},"Visited":{"hex":"#c7a5cfff","u16":[51086,42388,53265,65535]}},"shade":{"Dark":{"hex":"#777362ff","u16":[30631,29618,25189,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c5bfa2ff","u16":[50690,49014,41684,65535]},"Midlight":{"hex":"#f9f7edff","u16":[63981,63357,60848,65535]},"Shadow":{"hex":"#3f3d34ff","u16":[16203,15667,13324,65535]}}},"Inactive":{"background":{"Active":{"hex":"#f9e6dcff","u16":[63881,59040,56599,65535]},"Alternate":{"hex":"#f0ece2ff","u16":[61680,60652,58082,65535]},"Link":{"hex":"#dde4f5ff","u16":[56679,58719,62899,65535]},"Negative":{"hex":"#f3e0e1ff","u16":[62546,57464,57768,65535]},"Neutral":{"hex":"#fbebd0ff","u16":[64585,60401,53387,65535]},"Normal":{"hex":"#faf8f0ff","u16":[64250,63736,61680,65535]},"Positive":{"hex":"#bdf7ccff","u16":[48611,63473,52376,65535]},"Visited":{"hex":"#e6ddecff","u16":[59172,56733,60544,65535]}},"decoration":{"Focus":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Hover":{"hex":"#e68232ff","u16":[59110,33410,12850,65535]}},"foreground":{"Active":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Inactive":{"hex":"#786e64ff","u16":[30840,28270,25700,65535]},"Link":{"hex":"#0a5ac8ff","u16":[2570,23130,51400,65535]},"Negative":{"hex":"#be1428ff","u16":[48830,5140,10280,65535]},"Neutral":{"hex":"#c88c00ff","u16":[51400,35980,0,65535]},"Normal":{"hex":"#281e14ff","u16":[10280,7710,5140,65535]},"Positive":{"hex":"#148c3cff","u16":[5140,35980,15420,65535]},"Visited":{"hex":"#7828a0ff","u16":[30840,10280,41120,65535]}},"shade":{"Dark":{"hex":"#bab399ff","u16":[47709,46131,39232,65535]},"Light":{"hex":"#d5ceafff","u16":[54650,52842,44939,65535]},"Mid":{"hex":"#d5ceafff","u16":[54650,52842,44939,65535]},"Midlight":{"hex":"#ece4c2ff","u16":[60666,58659,49886,65535]},"Shadow":{"hex":"#827e6bff","u16":[33383,32279,27451,65535]}}}},"Window":{"Active":{"background":{"Active":{"hex":"#f4cfbbff","u16":[62786,53235,48073,65535]},"Alternate":{"hex":"#dcd6caff","u16":[56540,54998,51914,65535]},"Link":{"hex":"#c5d3efff","u16":[50620,54244,61307,65535]},"Negative":{"hex":"#eacbcdff","u16":[60194,52203,52639,65535]},"Neutral":{"hex":"#f9d58fff","u16":[63904,54710,36739,65535]},"Normal":{"hex":"#e6e2d8ff","u16":[59110,58082,55512,65535]},"Positive":{"hex":"#88eca3ff","u16":[35054,60578,41870,65535]},"Visited":{"hex":"#d9cae0ff","u16":[55688,51964,57566,65535]}},"decoration":{"Focus":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Hover":{"hex":"#e68232ff","u16":[59110,33410,12850,65535]}},"foreground":{"Active":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Inactive":{"hex":"#6e645aff","u16":[28270,25700,23130,65535]},"Link":{"hex":"#0a5ac8ff","u16":[2570,23130,51400,65535]},"Negative":{"hex":"#be1428ff","u16":[48830,5140,10280,65535]},"Neutral":{"hex":"#c88c00ff","u16":[51400,35980,0,65535]},"Normal":{"hex":"#1e1914ff","u16":[7710,6425,5140,65535]},"Positive":{"hex":"#148c3cff","u16":[5140,35980,15420,65535]},"Visited":{"hex":"#7828a0ff","u16":[30840,10280,41120,65535]}},"shade":{"Dark":{"hex":"#706e68ff","u16":[28904,28256,26616,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bbb7adff","u16":[48156,47076,44344,65535]},"Midlight":{"hex":"#efede7ff","u16":[61547,60927,59404,65535]},"Shadow":{"hex":"#3e3d39ff","u16":[15930,15573,14669,65535]}}},"Disabled":{"background":{"Active":{"hex":"#e1cebcff","u16":[57920,52843,48412,65535]},"Alternate":{"hex":"#d2ccc0ff","u16":[53908,52425,49457,65535]},"Link":{"hex":"#c7d2deff","u16":[51216,53883,56944,65535]},"Negative":{"hex":"#e5cac8ff","u16":[58939,51935,51367,65535]},"Neutral":{"hex":"#e3d0a4ff","u16":[58254,53431,42023,65535]},"Normal":{"hex":"#dcd7cbff","u16":[56625,55354,52142,65535]},"Positive":{"hex":"#bed8bbff","u16":[48787,55537,48086,65535]},"Visited":{"hex":"#daccd9ff","u16":[56086,52469,55670,65535]}},"decoration":{"Focus":{"hex":"#d2aa88ff","u16":[53908,43671,35033,65535]},"Hover":{"hex":"#e2b68aff","u16":[58157,46698,35439,65535]}},"foreground":{"Active":{"hex":"#d2aa88ff","u16":[53908,43671,35033,65535]},"Inactive":{"hex":"#b3ada4ff","u16":[46057,44562,42112,65535]},"Link":{"hex":"#8dabceff","u16":[36232,43821,53035,65535]},"Negative":{"hex":"#d59090ff","u16":[54742,36935,37085,65535]},"Neutral":{"hex":"#d1bb86ff","u16":[53774,47992,34396,65535]},"Normal":{"hex":"#99948dff","u16":[39197,38131,36111,65535]},"Positive":{"hex":"#95bb9aff","u16":[38340,47992,39540,65535]},"Visited":{"hex":"#ba98bfff","u16":[47807,38942,49200,65535]}},"shade":{"Dark":{"hex":"#6b6963ff","u16":[27553,26935,25372,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#b4b0a6ff","u16":[46206,45169,42548,65535]},"Midlight":{"hex":"#e7e3daff","u16":[59382,58401,55954,65535]},"Shadow":{"hex":"#3d3c38ff","u16":[15762,15408,14514,65535]}}},"Inactive":{"background":{"Active":{"hex":"#f4cfbbff","u16":[62786,53235,48073,65535]},"Alternate":{"hex":"#dcd6caff","u16":[56540,54998,51914,65535]},"Link":{"hex":"#c5d3efff","u16":[50620,54244,61307,65535]},"Negative":{"hex":"#eacbcdff","u16":[60194,52203,52639,65535]},"Neutral":{"hex":"#f9d58fff","u16":[63904,54710,36739,65535]},"Normal":{"hex":"#e6e2d8ff","u16":[59110,58082,55512,65535]},"Positive":{"hex":"#88eca3ff","u16":[35054,60578,41870,65535]},"Visited":{"hex":"#d9cae0ff","u16":[55688,51964,57566,65535]}},"decoration":{"Focus":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Hover":{"hex":"#e68232ff","u16":[59110,33410,12850,65535]}},"foreground":{"Active":{"hex":"#c85a0aff","u16":[51400,23130,2570,65535]},"Inactive":{"hex":"#6e645aff","u16":[28270,25700,23130,65535]},"Link":{"hex":"#0a5ac8ff","u16":[2570,23130,51400,65535]},"Negative":{"hex":"#be1428ff","u16":[48830,5140,10280,65535]},"Neutral":{"hex":"#c88c00ff","u16":[51400,35980,0,65535]},"Normal":{"hex":"#1e1914ff","u16":[7710,6425,5140,65535]},"Positive":{"hex":"#148c3cff","u16":[5140,35980,15420,65535]},"Visited":{"hex":"#7828a0ff","u16":[30840,10280,41120,65535]}},"shade":{"Dark":{"hex":"#706e68ff","u16":[28904,28256,26616,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bbb7adff","u16":[48156,47076,44344,65535]},"Midlight":{"hex":"#efede7ff","u16":[61547,60927,59404,65535]},"Shadow":{"hex":"#3e3d39ff","u16":[15930,15573,14669,65535]}}}}},"sha256":"f64aeb4af3d1a47374df3125a2c7219c8c5bcf55aa0ef117f2c2acc04bb57f39","source_text":"[General]\nColorScheme=SyntheticNoHeader\nName=Synthetic No Header\n\n[KDE]\ncontrast=7\n\n[Colors:View]\nBackgroundNormal=250,248,240\nBackgroundAlternate=240,236,226\nForegroundNormal=40,30,20\nForegroundInactive=120,110,100\nForegroundActive=200,90,10\nForegroundLink=10,90,200\nForegroundVisited=120,40,160\nForegroundNegative=190,20,40\nForegroundNeutral=200,140,0\nForegroundPositive=20,140,60\nDecorationFocus=200,90,10\nDecorationHover=230,130,50\n\n[Colors:Window]\nBackgroundNormal=230,226,216\nBackgroundAlternate=220,214,202\nForegroundNormal=30,25,20\nForegroundInactive=110,100,90\nForegroundActive=200,90,10\nForegroundLink=10,90,200\nForegroundVisited=120,40,160\nForegroundNegative=190,20,40\nForegroundNeutral=200,140,0\nForegroundPositive=20,140,60\nDecorationFocus=200,90,10\nDecorationHover=230,130,50\n\n[Colors:Button]\nBackgroundNormal=236,232,224\nBackgroundAlternate=210,204,190\nForegroundNormal=30,25,20\nForegroundInactive=110,100,90\nForegroundActive=200,90,10\nForegroundLink=10,90,200\nForegroundVisited=120,40,160\nForegroundNegative=190,20,40\nForegroundNeutral=200,140,0\nForegroundPositive=20,140,60\nDecorationFocus=200,90,10\nDecorationHover=230,130,50\n\n[Colors:Selection]\nBackgroundNormal=200,90,10\nBackgroundAlternate=170,80,20\nForegroundNormal=255,255,255\nForegroundInactive=240,220,200\nForegroundActive=255,240,200\nForegroundLink=255,230,160\nForegroundVisited=240,200,240\nForegroundNegative=255,180,180\nForegroundNeutral=255,230,120\nForegroundPositive=180,255,190\nDecorationFocus=200,90,10\nDecorationHover=230,130,50\n\n[Colors:Tooltip]\nBackgroundNormal=255,250,220\nBackgroundAlternate=245,238,200\nForegroundNormal=20,20,20\nForegroundInactive=100,100,90\nForegroundActive=200,90,10\nForegroundLink=10,90,200\nForegroundVisited=120,40,160\nForegroundNegative=190,20,40\nForegroundNeutral=200,140,0\nForegroundPositive=20,140,60\nDecorationFocus=200,90,10\nDecorationHover=230,130,50\n\n[Colors:Complementary]\nBackgroundNormal=40,36,30\nBackgroundAlternate=30,27,22\nForegroundNormal=240,235,225\nForegroundInactive=160,150,140\nForegroundActive=255,160,60\nForegroundLink=100,170,255\nForegroundVisited=200,140,230\nForegroundNegative=255,90,100\nForegroundNeutral=255,200,60\nForegroundPositive=90,220,130\nDecorationFocus=255,160,60\nDecorationHover=255,190,110\n"}, +{"contrastF":0.2,"frameContrast":0.35,"input":{"ColorEffects:Disabled":{"Color":"56,56,56","ColorAmount":"0.5","ColorEffect":"3","ContrastAmount":"0.6","ContrastEffect":"2","IntensityAmount":"0.2","IntensityEffect":"3"},"ColorEffects:Inactive":{"ChangeSelectionColor":"true","Color":"112,111,110","ColorAmount":"0.3","ColorEffect":"1","ContrastAmount":"0.4","ContrastEffect":"1","Enable":"true","IntensityAmount":"0.25","IntensityEffect":"1"},"Colors:Button":{"BackgroundAlternate":"38,42,48","BackgroundNormal":"44,48,54","DecorationFocus":"90,200,250","DecorationHover":"90,200,250","ForegroundActive":"90,200,250","ForegroundInactive":"140,146,154","ForegroundLink":"80,160,255","ForegroundNegative":"240,80,90","ForegroundNeutral":"240,170,40","ForegroundNormal":"220,224,230","ForegroundPositive":"60,200,110","ForegroundVisited":"170,120,230"},"Colors:Complementary":{"BackgroundAlternate":"12,13,15","BackgroundNormal":"16,18,20","DecorationFocus":"90,200,250","DecorationHover":"90,200,250","ForegroundActive":"90,200,250","ForegroundInactive":"150,156,164","ForegroundLink":"80,160,255","ForegroundNegative":"240,80,90","ForegroundNeutral":"240,170,40","ForegroundNormal":"235,238,242","ForegroundPositive":"60,200,110","ForegroundVisited":"170,120,230"},"Colors:Header":{"BackgroundAlternate":"36,39,44","BackgroundNormal":"52,56,62","DecorationFocus":"90,200,250","DecorationHover":"90,200,250","ForegroundActive":"90,200,250","ForegroundInactive":"140,146,154","ForegroundLink":"80,160,255","ForegroundNegative":"240,80,90","ForegroundNeutral":"240,170,40","ForegroundNormal":"225,228,234","ForegroundPositive":"60,200,110","ForegroundVisited":"170,120,230"},"Colors:Selection":{"BackgroundAlternate":"60,150,200","BackgroundNormal":"90,200,250","DecorationFocus":"90,200,250","DecorationHover":"90,200,250","ForegroundActive":"0,0,0","ForegroundInactive":"40,60,70","ForegroundLink":"0,40,120","ForegroundNegative":"120,0,10","ForegroundNeutral":"110,70,0","ForegroundNormal":"10,10,10","ForegroundPositive":"0,90,30","ForegroundVisited":"70,20,110"},"Colors:Tooltip":{"BackgroundAlternate":"40,44,50","BackgroundNormal":"48,52,58","DecorationFocus":"90,200,250","DecorationHover":"90,200,250","ForegroundActive":"90,200,250","ForegroundInactive":"150,156,164","ForegroundLink":"80,160,255","ForegroundNegative":"240,80,90","ForegroundNeutral":"240,170,40","ForegroundNormal":"230,232,236","ForegroundPositive":"60,200,110","ForegroundVisited":"170,120,230"},"Colors:View":{"BackgroundAlternate":"32,35,40","BackgroundNormal":"24,26,30","DecorationFocus":"90,200,250","DecorationHover":"90,200,250","ForegroundActive":"90,200,250","ForegroundInactive":"140,146,154","ForegroundLink":"80,160,255","ForegroundNegative":"240,80,90","ForegroundNeutral":"240,170,40","ForegroundNormal":"220,224,230","ForegroundPositive":"60,200,110","ForegroundVisited":"170,120,230"},"Colors:Window":{"BackgroundAlternate":"30,33,38","BackgroundNormal":"36,39,44","DecorationFocus":"90,200,250","DecorationHover":"90,200,250","ForegroundActive":"90,200,250","ForegroundInactive":"140,146,154","ForegroundLink":"80,160,255","ForegroundNegative":"240,80,90","ForegroundNeutral":"240,170,40","ForegroundNormal":"220,224,230","ForegroundPositive":"60,200,110","ForegroundVisited":"170,120,230"},"General":{"ColorScheme":"SyntheticInactiveEffects","Name":"Synthetic Inactive Effects"},"KDE":{"contrast":"2","frameContrast":"0.35"}},"name":"SyntheticInactiveEffects","origin":"synthetic","palette":{"Active":{"Accent":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]},"AlternateBase":{"hex":"#202328ff","u16":[8224,8995,10280,65535]},"Base":{"hex":"#181a1eff","u16":[6168,6682,7710,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#2c3036ff","u16":[11308,12336,13878,65535]},"ButtonText":{"hex":"#dce0e6ff","u16":[56540,57568,59110,65535]},"Dark":{"hex":"#17191cff","u16":[5960,6456,7284,65535]},"Highlight":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]},"HighlightedText":{"hex":"#0a0a0aff","u16":[2570,2570,2570,65535]},"Light":{"hex":"#363b42ff","u16":[13982,15147,17089,65535]},"Link":{"hex":"#50a0ffff","u16":[20560,41120,65535,65535]},"LinkVisited":{"hex":"#aa78e6ff","u16":[43690,30840,59110,65535]},"Mid":{"hex":"#202327ff","u16":[8271,8961,10109,65535]},"Midlight":{"hex":"#2e3238ff","u16":[11876,12865,14515,65535]},"PlaceholderText":{"hex":"#8c929aff","u16":[35980,37522,39578,65535]},"Shadow":{"hex":"#111215ff","u16":[4330,4691,5292,65535]},"Text":{"hex":"#dce0e6ff","u16":[56540,57568,59110,65535]},"ToolTipBase":{"hex":"#30343aff","u16":[12336,13364,14906,65535]},"ToolTipText":{"hex":"#e6e8ecff","u16":[59110,59624,60652,65535]},"Window":{"hex":"#24272cff","u16":[9252,10023,11308,65535]},"WindowText":{"hex":"#dce0e6ff","u16":[56540,57568,59110,65535]}},"Disabled":{"Accent":{"hex":"#616367ff","u16":[24843,25438,26430,65535]},"AlternateBase":{"hex":"#606367ff","u16":[24663,25320,26416,65535]},"Base":{"hex":"#5f6266ff","u16":[24495,25073,26229,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#626468ff","u16":[25119,25778,26768,65535]},"ButtonText":{"hex":"#737579ff","u16":[29496,30187,31223,65535]},"Dark":{"hex":"#3e4042ff","u16":[16003,16386,17025,65535]},"Highlight":{"hex":"#616367ff","u16":[24843,25438,26430,65535]},"HighlightedText":{"hex":"#717478ff","u16":[29106,29716,30728,65535]},"Light":{"hex":"#707377ff","u16":[28770,29459,30608,65535]},"Link":{"hex":"#666e79ff","u16":[26089,28179,31037,65535]},"LinkVisited":{"hex":"#6c6b6eff","u16":[27676,27535,28356,65535]},"Mid":{"hex":"#56585bff","u16":[22079,22608,23490,65535]},"Midlight":{"hex":"#686a6fff","u16":[26722,27362,28429,65535]},"PlaceholderText":{"hex":"#6a6c70ff","u16":[27146,27726,28800,65535]},"Shadow":{"hex":"#2c2d2fff","u16":[11274,11544,11994,65535]},"Text":{"hex":"#6f7176ff","u16":[28637,29168,30205,65535]},"ToolTipBase":{"hex":"#30343aff","u16":[12336,13364,14906,65535]},"ToolTipText":{"hex":"#e6e8ecff","u16":[59110,59624,60652,65535]},"Window":{"hex":"#616367ff","u16":[24843,25438,26430,65535]},"WindowText":{"hex":"#717478ff","u16":[29106,29716,30728,65535]}},"Inactive":{"Accent":{"hex":"#6a9bb7ff","u16":[27285,39912,46996,65535]},"AlternateBase":{"hex":"#838b9aff","u16":[33711,35834,39515,65535]},"Base":{"hex":"#828a99ff","u16":[33514,35396,39312,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#868f9bff","u16":[34513,36626,39912,65535]},"ButtonText":{"hex":"#c5c7c9ff","u16":[50668,51037,51606,65535]},"Dark":{"hex":"#565a63ff","u16":[21974,23210,25344,65535]},"Highlight":{"hex":"#6a9bb7ff","u16":[27285,39912,46996,65535]},"HighlightedText":{"hex":"#c5ced4ff","u16":[50519,52853,54388,65535]},"Light":{"hex":"#969eabff","u16":[38578,40511,43876,65535]},"Link":{"hex":"#8aa8d9ff","u16":[35480,43104,55793,65535]},"LinkVisited":{"hex":"#a79db9ff","u16":[43030,40398,47521,65535]},"Mid":{"hex":"#757c87ff","u16":[30080,31773,34695,65535]},"Midlight":{"hex":"#8c94a1ff","u16":[35917,37939,41427,65535]},"PlaceholderText":{"hex":"#9ea3aaff","u16":[40660,41867,43663,65535]},"Shadow":{"hex":"#3a3d42ff","u16":[14817,15651,17090,65535]},"Text":{"hex":"#bfc0c2ff","u16":[49082,49418,49978,65535]},"ToolTipBase":{"hex":"#30343aff","u16":[12336,13364,14906,65535]},"ToolTipText":{"hex":"#e6e8ecff","u16":[59110,59624,60652,65535]},"Window":{"hex":"#858c99ff","u16":[34112,36032,39345,65535]},"WindowText":{"hex":"#c3c4c6ff","u16":[50020,50370,50928,65535]}}},"purpose":"dark scheme, Header without an Inactive subgroup, Inactive effects enabled with the selection change; every effect kind with non-zero amounts in both states","set_supported":{"Button":true,"Complementary":true,"Header":true,"Selection":true,"Tooltip":true,"View":true,"Window":true},"sets":{"Button":{"Active":{"background":{"Active":{"hex":"#22404fff","u16":[8835,16447,20176,65535]},"Alternate":{"hex":"#262a30ff","u16":[9766,10794,12336,65535]},"Link":{"hex":"#233b57ff","u16":[8903,15066,22469,65535]},"Negative":{"hex":"#5a272cff","u16":[23224,10150,11418,65535]},"Neutral":{"hex":"#4b3918ff","u16":[19211,14696,6221,65535]},"Normal":{"hex":"#2c3036ff","u16":[11308,12336,13878,65535]},"Positive":{"hex":"#1c422cff","u16":[7072,17087,11212,65535]},"Visited":{"hex":"#403255ff","u16":[16369,12754,21754,65535]}},"decoration":{"Focus":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]},"Hover":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]}},"foreground":{"Active":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]},"Inactive":{"hex":"#8c929aff","u16":[35980,37522,39578,65535]},"Link":{"hex":"#50a0ffff","u16":[20560,41120,65535,65535]},"Negative":{"hex":"#f0505aff","u16":[61680,20560,23130,65535]},"Neutral":{"hex":"#f0aa28ff","u16":[61680,43690,10280,65535]},"Normal":{"hex":"#dce0e6ff","u16":[56540,57568,59110,65535]},"Positive":{"hex":"#3cc86eff","u16":[15420,51400,28270,65535]},"Visited":{"hex":"#aa78e6ff","u16":[43690,30840,59110,65535]}},"shade":{"Dark":{"hex":"#1c1f23ff","u16":[7284,7946,8940,65535]},"Light":{"hex":"#3d424aff","u16":[15569,16985,19108,65535]},"Mid":{"hex":"#272b30ff","u16":[10104,11023,12401,65535]},"Midlight":{"hex":"#353a41ff","u16":[13603,14839,16694,65535]},"Shadow":{"hex":"#151619ff","u16":[5279,5759,6479,65535]}}},"Disabled":{"background":{"Active":{"hex":"#63696eff","u16":[25334,26901,28236,65535]},"Alternate":{"hex":"#616368ff","u16":[24814,25557,26672,65535]},"Link":{"hex":"#636870ff","u16":[25371,26808,28698,65535]},"Negative":{"hex":"#6b666aff","u16":[27523,26302,27222,65535]},"Neutral":{"hex":"#686867ff","u16":[26729,26686,26393,65535]},"Normal":{"hex":"#626468ff","u16":[25119,25778,26768,65535]},"Positive":{"hex":"#626969ff","u16":[25127,27064,27095,65535]},"Visited":{"hex":"#676869ff","u16":[26516,26636,27074,65535]}},"decoration":{"Focus":{"hex":"#6c747aff","u16":[27662,29709,31292,65535]},"Hover":{"hex":"#6c747aff","u16":[27662,29709,31292,65535]}},"foreground":{"Active":{"hex":"#6c747aff","u16":[27662,29709,31292,65535]},"Inactive":{"hex":"#6c6e72ff","u16":[27638,28321,29332,65535]},"Link":{"hex":"#697079ff","u16":[27036,28799,31082,65535]},"Negative":{"hex":"#726b6fff","u16":[29199,27494,28436,65535]},"Neutral":{"hex":"#73726fff","u16":[29584,29281,28493,65535]},"Normal":{"hex":"#737579ff","u16":[29496,30187,31223,65535]},"Positive":{"hex":"#697372ff","u16":[27113,29652,29348,65535]},"Visited":{"hex":"#6e6e6fff","u16":[28179,28163,28479,65535]}},"shade":{"Dark":{"hex":"#3f4143ff","u16":[16181,16605,17243,65535]},"Light":{"hex":"#717478ff","u16":[29047,29809,30954,65535]},"Mid":{"hex":"#57595dff","u16":[22320,22906,23785,65535]},"Midlight":{"hex":"#696c70ff","u16":[26993,27701,28765,65535]},"Shadow":{"hex":"#2c2d2fff","u16":[11388,11686,12135,65535]}}},"Inactive":{"background":{"Active":{"hex":"#7698aeff","u16":[30199,39002,44695,65535]},"Alternate":{"hex":"#848d9cff","u16":[33871,36257,39985,65535]},"Link":{"hex":"#7c94baff","u16":[31941,38086,47690,65535]},"Negative":{"hex":"#b2888fff","u16":[45839,34840,36689,65535]},"Neutral":{"hex":"#a49074ff","u16":[42226,37069,29801,65535]},"Normal":{"hex":"#868f9bff","u16":[34513,36626,39912,65535]},"Positive":{"hex":"#709d85ff","u16":[28676,40315,34132,65535]},"Visited":{"hex":"#9490a7ff","u16":[37912,36990,43040,65535]}},"decoration":{"Focus":{"hex":"#85bfe0ff","u16":[34073,49016,57468,65535]},"Hover":{"hex":"#85bfe0ff","u16":[34073,49016,57468,65535]}},"foreground":{"Active":{"hex":"#85bfe0ff","u16":[34073,49016,57468,65535]},"Inactive":{"hex":"#a3a8afff","u16":[41878,43133,44917,65535]},"Link":{"hex":"#92add9ff","u16":[37520,44397,55776,65535]},"Negative":{"hex":"#cd9498ff","u16":[52645,38080,38971,65535]},"Neutral":{"hex":"#d7ae73ff","u16":[55380,44778,29647,65535]},"Normal":{"hex":"#c5c7c9ff","u16":[50668,51037,51606,65535]},"Positive":{"hex":"#77c290ff","u16":[30536,49885,37030,65535]},"Visited":{"hex":"#aba3baff","u16":[43951,41805,47854,65535]}},"shade":{"Dark":{"hex":"#575c64ff","u16":[22232,23593,25710,65535]},"Light":{"hex":"#98a0adff","u16":[38958,41144,44567,65535]},"Mid":{"hex":"#767e89ff","u16":[30419,32281,35177,65535]},"Midlight":{"hex":"#8d96a3ff","u16":[36311,38534,41991,65535]},"Shadow":{"hex":"#3a3e43ff","u16":[14947,15862,17285,65535]}}}},"Complementary":{"Active":{"background":{"Active":{"hex":"#162d38ff","u16":[5615,11619,14402,65535]},"Alternate":{"hex":"#0c0d0fff","u16":[3084,3341,3855,65535]},"Link":{"hex":"#15263cff","u16":[5297,9892,15330,65535]},"Negative":{"hex":"#3b1619ff","u16":[15233,5729,6432,65535]},"Neutral":{"hex":"#36270cff","u16":[13754,10070,3143,65535]},"Normal":{"hex":"#101214ff","u16":[4112,4626,5140,65535]},"Positive":{"hex":"#102e1bff","u16":[4067,11811,6995,65535]},"Visited":{"hex":"#291f38ff","u16":[10659,7865,14337,65535]}},"decoration":{"Focus":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]},"Hover":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]}},"foreground":{"Active":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]},"Inactive":{"hex":"#969ca4ff","u16":[38550,40092,42148,65535]},"Link":{"hex":"#50a0ffff","u16":[20560,41120,65535,65535]},"Negative":{"hex":"#f0505aff","u16":[61680,20560,23130,65535]},"Neutral":{"hex":"#f0aa28ff","u16":[61680,43690,10280,65535]},"Normal":{"hex":"#ebeef2ff","u16":[60395,61166,62194,65535]},"Positive":{"hex":"#3cc86eff","u16":[15420,51400,28270,65535]},"Visited":{"hex":"#aa78e6ff","u16":[43690,30840,59110,65535]}},"shade":{"Dark":{"hex":"#525c66ff","u16":[21002,23627,26253,65535]},"Light":{"hex":"#798897ff","u16":[31037,34916,38796,65535]},"Mid":{"hex":"#3c444bff","u16":[15517,17457,19397,65535]},"Midlight":{"hex":"#626e7aff","u16":[25146,28290,31433,65535]},"Shadow":{"hex":"#626e7aff","u16":[25146,28290,31433,65535]}}},"Disabled":{"background":{"Active":{"hex":"#5d666bff","u16":[23954,26204,27570,65535]},"Alternate":{"hex":"#5f6165ff","u16":[24306,24875,26013,65535]},"Link":{"hex":"#5d656fff","u16":[24001,26075,28424,65535]},"Negative":{"hex":"#6c6265ff","u16":[27713,25209,25928,65535]},"Neutral":{"hex":"#66655fff","u16":[26292,25847,24481,65535]},"Normal":{"hex":"#5e6165ff","u16":[24179,25014,25849,65535]},"Positive":{"hex":"#5c6764ff","u16":[23594,26488,25653,65535]},"Visited":{"hex":"#646468ff","u16":[25723,25752,26784,65535]}},"decoration":{"Focus":{"hex":"#657077ff","u16":[25902,28855,30528,65535]},"Hover":{"hex":"#657077ff","u16":[25902,28855,30528,65535]}},"foreground":{"Active":{"hex":"#657077ff","u16":[25902,28855,30528,65535]},"Inactive":{"hex":"#6a6c6fff","u16":[27138,27863,28635,65535]},"Link":{"hex":"#636d79ff","u16":[25515,28108,31079,65535]},"Negative":{"hex":"#75676aff","u16":[29947,26472,27196,65535]},"Neutral":{"hex":"#726e65ff","u16":[29190,28255,25996,65535]},"Normal":{"hex":"#6f7174ff","u16":[28442,29144,29863,65535]},"Positive":{"hex":"#62716bff","u16":[25220,29044,27572,65535]},"Visited":{"hex":"#6b6a6eff","u16":[27565,27368,28375,65535]}},"shade":{"Dark":{"hex":"#3d3f41ff","u16":[15575,16113,16651,65535]},"Light":{"hex":"#6d7175ff","u16":[28066,29035,30004,65535]},"Mid":{"hex":"#545759ff","u16":[21495,22237,22980,65535]},"Midlight":{"hex":"#65696cff","u16":[26047,26947,27846,65535]},"Shadow":{"hex":"#2b2c2eff","u16":[10989,11369,11749,65535]}}},"Inactive":{"background":{"Active":{"hex":"#6e93a9ff","u16":[28272,37686,43322,65535]},"Alternate":{"hex":"#818898ff","u16":[33209,35075,38954,65535]},"Link":{"hex":"#768fb4ff","u16":[30449,36706,46215,65535]},"Negative":{"hex":"#b38086ff","u16":[45952,32868,34497,65535]},"Neutral":{"hex":"#a08b6dff","u16":[41065,35600,27981,65535]},"Normal":{"hex":"#7f8a95ff","u16":[32698,35419,38248,65535]},"Positive":{"hex":"#69987dff","u16":[26869,39025,32069,65535]},"Visited":{"hex":"#8f8aa5ff","u16":[36679,35447,42415,65535]}},"decoration":{"Focus":{"hex":"#7bb7d9ff","u16":[31539,47111,55689,65535]},"Hover":{"hex":"#7bb7d9ff","u16":[31539,47111,55689,65535]}},"foreground":{"Active":{"hex":"#7bb7d9ff","u16":[31539,47111,55689,65535]},"Inactive":{"hex":"#a0a5abff","u16":[41002,42278,43930,65535]},"Link":{"hex":"#87a6d9ff","u16":[34610,42658,55868,65535]},"Negative":{"hex":"#d08b8eff","u16":[53338,35809,36622,65535]},"Neutral":{"hex":"#d2a66aff","u16":[54079,42662,27321,65535]},"Normal":{"hex":"#c3c4c6ff","u16":[50074,50378,50758,65535]},"Positive":{"hex":"#6ebb85ff","u16":[28351,48132,34285,65535]},"Visited":{"hex":"#a69bb8ff","u16":[42700,39888,47399,65535]}},"shade":{"Dark":{"hex":"#525960ff","u16":[21063,22815,24638,65535]},"Light":{"hex":"#8f9ba8ff","u16":[36828,39893,43079,65535]},"Mid":{"hex":"#707a83ff","u16":[28854,31256,33752,65535]},"Midlight":{"hex":"#86919dff","u16":[34469,37338,40320,65535]},"Shadow":{"hex":"#373c41ff","u16":[14263,15449,16684,65535]}}}},"Header":{"Active":{"background":{"Active":{"hex":"#274756ff","u16":[10013,18161,22151,65535]},"Alternate":{"hex":"#24272cff","u16":[9252,10023,11308,65535]},"Link":{"hex":"#284261ff","u16":[10188,16842,24837,65535]},"Negative":{"hex":"#652d33ff","u16":[25882,11614,12989,65535]},"Neutral":{"hex":"#523f1cff","u16":[21138,16304,7229,65535]},"Normal":{"hex":"#34383eff","u16":[13364,14392,15934,65535]},"Positive":{"hex":"#204a31ff","u16":[8163,18923,12611,65535]},"Visited":{"hex":"#47385eff","u16":[18305,14389,24130,65535]}},"decoration":{"Focus":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]},"Hover":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]}},"foreground":{"Active":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]},"Inactive":{"hex":"#8c929aff","u16":[35980,37522,39578,65535]},"Link":{"hex":"#50a0ffff","u16":[20560,41120,65535,65535]},"Negative":{"hex":"#f0505aff","u16":[61680,20560,23130,65535]},"Neutral":{"hex":"#f0aa28ff","u16":[61680,43690,10280,65535]},"Normal":{"hex":"#e1e4eaff","u16":[57825,58596,60138,65535]},"Positive":{"hex":"#3cc86eff","u16":[15420,51400,28270,65535]},"Visited":{"hex":"#aa78e6ff","u16":[43690,30840,59110,65535]}},"shade":{"Dark":{"hex":"#212428ff","u16":[8609,9271,10264,65535]},"Light":{"hex":"#444951ff","u16":[17410,18750,20759,65535]},"Mid":{"hex":"#2e3237ff","u16":[11935,12853,14230,65535]},"Midlight":{"hex":"#3c4148ff","u16":[15497,16689,18477,65535]},"Shadow":{"hex":"#181a1dff","u16":[6222,6700,7418,65535]}}},"Disabled":{"background":{"Active":{"hex":"#646a6fff","u16":[25804,27250,28462,65535]},"Alternate":{"hex":"#616367ff","u16":[24843,25438,26430,65535]},"Link":{"hex":"#656a70ff","u16":[25844,27157,28881,65535]},"Negative":{"hex":"#6c686bff","u16":[27789,26700,27502,65535]},"Neutral":{"hex":"#6a6968ff","u16":[27118,27045,26723,65535]},"Normal":{"hex":"#636669ff","u16":[25550,26129,26999,65535]},"Positive":{"hex":"#646b6bff","u16":[25612,27400,27385,65535]},"Visited":{"hex":"#69696bff","u16":[26897,26994,27371,65535]}},"decoration":{"Focus":{"hex":"#6e757bff","u16":[28154,30050,31496,65535]},"Hover":{"hex":"#6e757bff","u16":[28154,30050,31496,65535]}},"foreground":{"Active":{"hex":"#6e757bff","u16":[28154,30050,31496,65535]},"Inactive":{"hex":"#6d6f73ff","u16":[27951,28565,29472,65535]},"Link":{"hex":"#6b7179ff","u16":[27460,29068,31146,65535]},"Negative":{"hex":"#726c6fff","u16":[29251,27771,28588,65535]},"Neutral":{"hex":"#747370ff","u16":[29934,29620,28838,65535]},"Normal":{"hex":"#75777bff","u16":[30143,30702,31562,65535]},"Positive":{"hex":"#6b7473ff","u16":[27589,29931,29609,65535]},"Visited":{"hex":"#6f6e70ff","u16":[28409,28394,28666,65535]}},"shade":{"Dark":{"hex":"#404144ff","u16":[16458,16831,17392,65535]},"Light":{"hex":"#737579ff","u16":[29500,30168,31173,65535]},"Mid":{"hex":"#585a5dff","u16":[22698,23213,23985,65535]},"Midlight":{"hex":"#6b6d71ff","u16":[27428,28049,28983,65535]},"Shadow":{"hex":"#2d2e30ff","u16":[11569,11831,12226,65535]}}},"Inactive":{"background":{"Active":{"hex":"#7a9aafff","u16":[31261,39568,44916,65535]},"Alternate":{"hex":"#858c99ff","u16":[34112,36032,39345,65535]},"Link":{"hex":"#7f97bbff","u16":[32631,38706,48136,65535]},"Negative":{"hex":"#b48a91ff","u16":[46169,35579,37228,65535]},"Neutral":{"hex":"#a79376ff","u16":[42884,37683,30243,65535]},"Normal":{"hex":"#8a919cff","u16":[35369,37212,40065,65535]},"Positive":{"hex":"#729f87ff","u16":[29383,40926,34631,65535]},"Visited":{"hex":"#9692a9ff","u16":[38628,37599,43430,65535]}},"decoration":{"Focus":{"hex":"#8ac1e0ff","u16":[35356,49477,57526,65535]},"Hover":{"hex":"#8ac1e0ff","u16":[35356,49477,57526,65535]}},"foreground":{"Active":{"hex":"#8ac1e0ff","u16":[35356,49477,57526,65535]},"Inactive":{"hex":"#a5aab0ff","u16":[42426,43607,45291,65535]},"Link":{"hex":"#95afd9ff","u16":[38293,44884,55761,65535]},"Negative":{"hex":"#cc979aff","u16":[52545,38697,39551,65535]},"Neutral":{"hex":"#d9b076ff","u16":[55815,45352,30254,65535]},"Normal":{"hex":"#cacbcdff","u16":[51834,52111,52615,65535]},"Positive":{"hex":"#79c493ff","u16":[31167,50377,37669,65535]},"Visited":{"hex":"#ada5bcff","u16":[44410,42282,48253,65535]}},"shade":{"Dark":{"hex":"#595d64ff","u16":[22783,23970,25808,65535]},"Light":{"hex":"#9ba2aeff","u16":[39931,41759,44613,65535]},"Mid":{"hex":"#798089ff","u16":[31155,32779,35292,65535]},"Midlight":{"hex":"#9198a4ff","u16":[37180,39117,42116,65535]},"Shadow":{"hex":"#3b3e43ff","u16":[15267,16062,17294,65535]}}}},"Selection":{"Active":{"background":{"Active":{"hex":"#4eadd8ff","u16":[20025,44500,55627,65535]},"Alternate":{"hex":"#3c96c8ff","u16":[15420,38550,51400,65535]},"Link":{"hex":"#7caaf9ff","u16":[31985,43747,64022,65535]},"Negative":{"hex":"#c6a1baff","u16":[50773,41484,47822,65535]},"Neutral":{"hex":"#9eb790ff","u16":[40635,46918,36887,65535]},"Normal":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]},"Positive":{"hex":"#32c4a7ff","u16":[12763,50477,42825,65535]},"Visited":{"hex":"#a6a7c6ff","u16":[42684,42993,50789,65535]}},"decoration":{"Focus":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]},"Hover":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]}},"foreground":{"Active":{"hex":"#000000ff","u16":[0,0,0,65535]},"Inactive":{"hex":"#283c46ff","u16":[10280,15420,17990,65535]},"Link":{"hex":"#002878ff","u16":[0,10280,30840,65535]},"Negative":{"hex":"#78000aff","u16":[30840,0,2570,65535]},"Neutral":{"hex":"#6e4600ff","u16":[28270,17990,0,65535]},"Normal":{"hex":"#0a0a0aff","u16":[2570,2570,2570,65535]},"Positive":{"hex":"#005a1eff","u16":[0,23130,7710,65535]},"Visited":{"hex":"#46146eff","u16":[17990,5140,28270,65535]}},"shade":{"Dark":{"hex":"#2882a6ff","u16":[10240,33381,42590,65535]},"Light":{"hex":"#9dd8fbff","u16":[40315,55638,64599,65535]},"Mid":{"hex":"#36afe0ff","u16":[13825,45070,57503,65535]},"Midlight":{"hex":"#75cdfaff","u16":[29986,52808,64363,65535]},"Shadow":{"hex":"#195066ff","u16":[6330,20635,26328,65535]}}},"Disabled":{"background":{"Active":{"hex":"#61676dff","u16":[24983,26573,27932,65535]},"Alternate":{"hex":"#606267ff","u16":[24573,25267,26424,65535]},"Link":{"hex":"#61676fff","u16":[25016,26475,28456,65535]},"Negative":{"hex":"#6b6568ff","u16":[27415,25913,26816,65535]},"Neutral":{"hex":"#676665ff","u16":[26513,26335,25905,65535]},"Normal":{"hex":"#616367ff","u16":[24843,25438,26430,65535]},"Positive":{"hex":"#606868ff","u16":[24751,26755,26677,65535]},"Visited":{"hex":"#666668ff","u16":[26207,26289,26853,65535]}},"decoration":{"Focus":{"hex":"#6a7278ff","u16":[27247,29349,30966,65535]},"Hover":{"hex":"#6a7278ff","u16":[27247,29349,30966,65535]}},"foreground":{"Active":{"hex":"#6a7278ff","u16":[27247,29349,30966,65535]},"Inactive":{"hex":"#6b6d71ff","u16":[27433,28050,29044,65535]},"Link":{"hex":"#686f78ff","u16":[26689,28511,30928,65535]},"Negative":{"hex":"#726a6dff","u16":[29261,27183,28104,65535]},"Neutral":{"hex":"#72706dff","u16":[29366,28892,27908,65535]},"Normal":{"hex":"#717478ff","u16":[29106,29716,30728,65535]},"Positive":{"hex":"#687270ff","u16":[26690,29347,28887,65535]},"Visited":{"hex":"#6d6d6eff","u16":[27941,27889,28367,65535]}},"shade":{"Dark":{"hex":"#3e4042ff","u16":[16003,16386,17025,65535]},"Light":{"hex":"#707377ff","u16":[28770,29459,30608,65535]},"Mid":{"hex":"#56585bff","u16":[22079,22608,23490,65535]},"Midlight":{"hex":"#686a6fff","u16":[26722,27362,28429,65535]},"Shadow":{"hex":"#2c2d2fff","u16":[11274,11544,11994,65535]}}},"Inactive":{"background":{"Active":{"hex":"#72a0bbff","u16":[29212,41246,48159,65535]},"Alternate":{"hex":"#699ab6ff","u16":[26905,39620,46782,65535]},"Link":{"hex":"#789dc4ff","u16":[30884,40476,50399,65535]},"Negative":{"hex":"#ac939fff","u16":[44267,37717,40781,65535]},"Neutral":{"hex":"#9c9c83ff","u16":[39966,40026,33788,65535]},"Normal":{"hex":"#6a9bb7ff","u16":[27285,39912,46996,65535]},"Positive":{"hex":"#67a695ff","u16":[26513,42699,38399,65535]},"Visited":{"hex":"#8c9ab8ff","u16":[36099,39553,47300,65535]}},"decoration":{"Focus":{"hex":"#8dc4e4ff","u16":[36365,50491,58709,65535]},"Hover":{"hex":"#8dc4e4ff","u16":[36365,50491,58709,65535]}},"foreground":{"Active":{"hex":"#8dc4e4ff","u16":[36365,50491,58709,65535]},"Inactive":{"hex":"#9cafbbff","u16":[40125,44927,48176,65535]},"Link":{"hex":"#95b3dfff","u16":[38301,45958,57296,65535]},"Negative":{"hex":"#c79a9fff","u16":[51261,39465,40889,65535]},"Neutral":{"hex":"#d1b67dff","u16":[53787,46798,32032,65535]},"Normal":{"hex":"#c5ced4ff","u16":[50519,52853,54388,65535]},"Positive":{"hex":"#77c99cff","u16":[30576,51531,40036,65535]},"Visited":{"hex":"#aca8c1ff","u16":[44216,43069,49728,65535]}},"shade":{"Dark":{"hex":"#446476ff","u16":[17576,25710,30273,65535]},"Light":{"hex":"#77aecdff","u16":[30583,44737,52677,65535]},"Mid":{"hex":"#5d89a1ff","u16":[24006,35116,41349,65535]},"Midlight":{"hex":"#6fa3c0ff","u16":[28636,41888,49322,65535]},"Shadow":{"hex":"#2e434eff","u16":[11697,17110,20146,65535]}}}},"Tooltip":{"Active":{"background":{"Active":{"hex":"#254352ff","u16":[9411,17284,21141,65535]},"Alternate":{"hex":"#282c32ff","u16":[10280,11308,12850,65535]},"Link":{"hex":"#253e5cff","u16":[9537,15947,23647,65535]},"Negative":{"hex":"#602a2fff","u16":[24551,10876,12198,65535]},"Neutral":{"hex":"#4e3c1aff","u16":[20152,15483,6715,65535]},"Normal":{"hex":"#30343aff","u16":[12336,13364,14906,65535]},"Positive":{"hex":"#1e462eff","u16":[7608,17996,11902,65535]},"Visited":{"hex":"#433559ff","u16":[17324,13560,22927,65535]}},"decoration":{"Focus":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]},"Hover":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]}},"foreground":{"Active":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]},"Inactive":{"hex":"#969ca4ff","u16":[38550,40092,42148,65535]},"Link":{"hex":"#50a0ffff","u16":[20560,41120,65535,65535]},"Negative":{"hex":"#f0505aff","u16":[61680,20560,23130,65535]},"Neutral":{"hex":"#f0aa28ff","u16":[61680,43690,10280,65535]},"Normal":{"hex":"#e6e8ecff","u16":[59110,59624,60652,65535]},"Positive":{"hex":"#3cc86eff","u16":[15420,51400,28270,65535]},"Visited":{"hex":"#aa78e6ff","u16":[43690,30840,59110,65535]}},"shade":{"Dark":{"hex":"#1f2125ff","u16":[7946,8609,9602,65535]},"Light":{"hex":"#40454dff","u16":[16479,17852,19912,65535]},"Mid":{"hex":"#2b2e34ff","u16":[11020,11938,13316,65535]},"Midlight":{"hex":"#393d44ff","u16":[14542,15754,17572,65535]},"Shadow":{"hex":"#16181bff","u16":[5751,6231,6950,65535]}}},"Disabled":{"background":{"Active":{"hex":"#63696eff","u16":[25567,27068,28336,65535]},"Alternate":{"hex":"#616468ff","u16":[24913,25627,26695,65535]},"Link":{"hex":"#646970ff","u16":[25604,26975,28776,65535]},"Negative":{"hex":"#6c676aff","u16":[27647,26496,27351,65535]},"Neutral":{"hex":"#696967ff","u16":[26916,26857,26549,65535]},"Normal":{"hex":"#636569ff","u16":[25329,25946,26871,65535]},"Positive":{"hex":"#636a6aff","u16":[25367,27224,27232,65535]},"Visited":{"hex":"#68686aff","u16":[26699,26807,27214,65535]}},"decoration":{"Focus":{"hex":"#6d747aff","u16":[27906,29870,31378,65535]},"Hover":{"hex":"#6d747aff","u16":[27906,29870,31378,65535]}},"foreground":{"Active":{"hex":"#6d747aff","u16":[27906,29870,31378,65535]},"Inactive":{"hex":"#6d7074ff","u16":[28111,28760,29721,65535]},"Link":{"hex":"#6a7179ff","u16":[27255,28938,31114,65535]},"Negative":{"hex":"#726c6fff","u16":[29221,27634,28507,65535]},"Neutral":{"hex":"#747370ff","u16":[29755,29445,28661,65535]},"Normal":{"hex":"#75777aff","u16":[29953,30551,31466,65535]},"Positive":{"hex":"#6a7473ff","u16":[27361,29796,29484,65535]},"Visited":{"hex":"#6e6e6fff","u16":[28298,28282,28576,65535]}},"shade":{"Dark":{"hex":"#3f4143ff","u16":[16316,16713,17309,65535]},"Light":{"hex":"#727579ff","u16":[29268,29981,31050,65535]},"Mid":{"hex":"#585a5dff","u16":[22504,23053,23874,65535]},"Midlight":{"hex":"#6a6c70ff","u16":[27205,27868,28861,65535]},"Shadow":{"hex":"#2d2e2fff","u16":[11476,11756,12175,65535]}}},"Inactive":{"background":{"Active":{"hex":"#7899aeff","u16":[30725,39275,44788,65535]},"Alternate":{"hex":"#858e9bff","u16":[34088,36374,39940,65535]},"Link":{"hex":"#7e95baff","u16":[32284,38384,47884,65535]},"Negative":{"hex":"#b38990ff","u16":[45993,35199,36942,65535]},"Neutral":{"hex":"#a69175ff","u16":[42539,37362,30009,65535]},"Normal":{"hex":"#88909bff","u16":[34939,36907,39957,65535]},"Positive":{"hex":"#719e86ff","u16":[29023,40610,34366,65535]},"Visited":{"hex":"#9591a8ff","u16":[38250,37294,43169,65535]}},"decoration":{"Focus":{"hex":"#87c0e0ff","u16":[34716,49247,57496,65535]},"Hover":{"hex":"#87c0e0ff","u16":[34716,49247,57496,65535]}},"foreground":{"Active":{"hex":"#87c0e0ff","u16":[34716,49247,57496,65535]},"Inactive":{"hex":"#a8acb2ff","u16":[43187,44279,45835,65535]},"Link":{"hex":"#93aed9ff","u16":[37905,44640,55766,65535]},"Negative":{"hex":"#cd9599ff","u16":[52591,38389,39261,65535]},"Neutral":{"hex":"#d8af75ff","u16":[55596,45064,29949,65535]},"Normal":{"hex":"#cacbcdff","u16":[52040,52269,52670,65535]},"Positive":{"hex":"#78c391ff","u16":[30850,50131,37349,65535]},"Visited":{"hex":"#aca4bbff","u16":[44163,42055,47989,65535]}},"shade":{"Dark":{"hex":"#585d64ff","u16":[22506,23774,25739,65535]},"Light":{"hex":"#99a1adff","u16":[39441,41439,44559,65535]},"Mid":{"hex":"#787f89ff","u16":[30786,32520,35207,65535]},"Midlight":{"hex":"#8f97a4ff","u16":[36744,38814,42021,65535]},"Shadow":{"hex":"#3b3e43ff","u16":[15107,15958,17277,65535]}}}},"View":{"Active":{"background":{"Active":{"hex":"#18313dff","u16":[6292,12558,15566,65535]},"Alternate":{"hex":"#202328ff","u16":[8224,8995,10280,65535]},"Link":{"hex":"#182b41ff","u16":[6073,10951,16833,65535]},"Negative":{"hex":"#421a1dff","u16":[16954,6668,7544,65535]},"Neutral":{"hex":"#3a2b0fff","u16":[14861,10999,3841,65535]},"Normal":{"hex":"#181a1eff","u16":[6168,6682,7710,65535]},"Positive":{"hex":"#12321fff","u16":[4721,12877,7913,65535]},"Visited":{"hex":"#2e233eff","u16":[11876,8887,15931,65535]}},"decoration":{"Focus":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]},"Hover":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]}},"foreground":{"Active":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]},"Inactive":{"hex":"#8c929aff","u16":[35980,37522,39578,65535]},"Link":{"hex":"#50a0ffff","u16":[20560,41120,65535,65535]},"Negative":{"hex":"#f0505aff","u16":[61680,20560,23130,65535]},"Neutral":{"hex":"#f0aa28ff","u16":[61680,43690,10280,65535]},"Normal":{"hex":"#dce0e6ff","u16":[56540,57568,59110,65535]},"Positive":{"hex":"#3cc86eff","u16":[15420,51400,28270,65535]},"Visited":{"hex":"#aa78e6ff","u16":[43690,30840,59110,65535]}},"shade":{"Dark":{"hex":"#0f1113ff","u16":[3973,4304,4966,65535]},"Light":{"hex":"#2e323aff","u16":[11945,12940,14931,65535]},"Mid":{"hex":"#15171bff","u16":[5517,5977,6896,65535]},"Midlight":{"hex":"#25282fff","u16":[9577,10375,11972,65535]},"Shadow":{"hex":"#0b0c0eff","u16":[2894,3135,3617,65535]}}},"Disabled":{"background":{"Active":{"hex":"#5f666cff","u16":[24448,26241,27793,65535]},"Alternate":{"hex":"#606367ff","u16":[24663,25320,26416,65535]},"Link":{"hex":"#5f666fff","u16":[24482,26131,28468,65535]},"Negative":{"hex":"#6b6367ff","u16":[27515,25422,26420,65535]},"Neutral":{"hex":"#676562ff","u16":[26345,25950,25283,65535]},"Normal":{"hex":"#5f6266ff","u16":[24495,25073,26229,65535]},"Positive":{"hex":"#5e6766ff","u16":[24159,26471,26240,65535]},"Visited":{"hex":"#656568ff","u16":[25878,25893,26845,65535]}},"decoration":{"Focus":{"hex":"#677178ff","u16":[26547,28941,30773,65535]},"Hover":{"hex":"#677178ff","u16":[26547,28941,30773,65535]}},"foreground":{"Active":{"hex":"#677178ff","u16":[26547,28941,30773,65535]},"Inactive":{"hex":"#6a6c70ff","u16":[27146,27726,28800,65535]},"Link":{"hex":"#666e79ff","u16":[26089,28179,31037,65535]},"Negative":{"hex":"#73686cff","u16":[29584,26716,27722,65535]},"Neutral":{"hex":"#726f69ff","u16":[29207,28429,27052,65535]},"Normal":{"hex":"#6f7176ff","u16":[28637,29168,30205,65535]},"Positive":{"hex":"#65716eff","u16":[25937,29030,28300,65535]},"Visited":{"hex":"#6c6b6eff","u16":[27676,27535,28356,65535]}},"shade":{"Dark":{"hex":"#3d3f42ff","u16":[15779,16151,16896,65535]},"Light":{"hex":"#6f7176ff","u16":[28414,29084,30425,65535]},"Mid":{"hex":"#55575bff","u16":[21774,22288,23316,65535]},"Midlight":{"hex":"#67696eff","u16":[26376,26999,28243,65535]},"Shadow":{"hex":"#2b2c2eff","u16":[11129,11391,11917,65535]}}},"Inactive":{"background":{"Active":{"hex":"#7093abff","u16":[28836,37830,43858,65535]},"Alternate":{"hex":"#838b9aff","u16":[33711,35834,39515,65535]},"Link":{"hex":"#778fb8ff","u16":[30602,36877,47182,65535]},"Negative":{"hex":"#b38189ff","u16":[45877,33194,35273,65535]},"Neutral":{"hex":"#a18b6fff","u16":[41383,35788,28651,65535]},"Normal":{"hex":"#828a99ff","u16":[33514,35396,39312,65535]},"Positive":{"hex":"#6b9880ff","u16":[27439,39168,32828,65535]},"Visited":{"hex":"#908ba6ff","u16":[37034,35644,42735,65535]}},"decoration":{"Focus":{"hex":"#7db9dbff","u16":[32186,47607,56277,65535]},"Hover":{"hex":"#7db9dbff","u16":[32186,47607,56277,65535]}},"foreground":{"Active":{"hex":"#7db9dbff","u16":[32186,47607,56277,65535]},"Inactive":{"hex":"#9ea3aaff","u16":[40660,41867,43663,65535]},"Link":{"hex":"#8aa8d9ff","u16":[35480,43104,55793,65535]},"Negative":{"hex":"#cf8e91ff","u16":[53135,36422,37304,65535]},"Neutral":{"hex":"#d4a86dff","u16":[54451,43213,27961,65535]},"Normal":{"hex":"#bfc0c2ff","u16":[49082,49418,49978,65535]},"Positive":{"hex":"#71bd89ff","u16":[28957,48581,35099,65535]},"Visited":{"hex":"#a79db9ff","u16":[43030,40398,47521,65535]}},"shade":{"Dark":{"hex":"#545963ff","u16":[21588,22801,25323,65535]},"Light":{"hex":"#949ba9ff","u16":[38114,39833,43472,65535]},"Mid":{"hex":"#737a87ff","u16":[29568,31229,34684,65535]},"Midlight":{"hex":"#8991a1ff","u16":[35318,37301,41428,65535]},"Shadow":{"hex":"#393c43ff","u16":[14601,15422,17127,65535]}}}},"Window":{"Active":{"background":{"Active":{"hex":"#1e3946ff","u16":[7689,14672,18060,65535]},"Alternate":{"hex":"#1e2126ff","u16":[7710,8481,9766,65535]},"Link":{"hex":"#1e334eff","u16":[7645,13225,19942,65535]},"Negative":{"hex":"#502126ff","u16":[20476,8604,9688,65535]},"Neutral":{"hex":"#433314ff","u16":[17253,13023,5133,65535]},"Normal":{"hex":"#24272cff","u16":[9252,10023,11308,65535]},"Positive":{"hex":"#173b26ff","u16":[6022,15191,9714,65535]},"Visited":{"hex":"#382b4bff","u16":[14384,11032,19157,65535]}},"decoration":{"Focus":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]},"Hover":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]}},"foreground":{"Active":{"hex":"#5ac8faff","u16":[23130,51400,64250,65535]},"Inactive":{"hex":"#8c929aff","u16":[35980,37522,39578,65535]},"Link":{"hex":"#50a0ffff","u16":[20560,41120,65535,65535]},"Negative":{"hex":"#f0505aff","u16":[61680,20560,23130,65535]},"Neutral":{"hex":"#f0aa28ff","u16":[61680,43690,10280,65535]},"Normal":{"hex":"#dce0e6ff","u16":[56540,57568,59110,65535]},"Positive":{"hex":"#3cc86eff","u16":[15420,51400,28270,65535]},"Visited":{"hex":"#aa78e6ff","u16":[43690,30840,59110,65535]}},"shade":{"Dark":{"hex":"#17191cff","u16":[5960,6456,7284,65535]},"Light":{"hex":"#363b42ff","u16":[13982,15147,17089,65535]},"Mid":{"hex":"#202327ff","u16":[8271,8961,10109,65535]},"Midlight":{"hex":"#2e3238ff","u16":[11876,12865,14515,65535]},"Shadow":{"hex":"#111215ff","u16":[4330,4691,5292,65535]}}},"Disabled":{"background":{"Active":{"hex":"#61676dff","u16":[24983,26573,27932,65535]},"Alternate":{"hex":"#606267ff","u16":[24573,25267,26424,65535]},"Link":{"hex":"#61676fff","u16":[25016,26475,28456,65535]},"Negative":{"hex":"#6b6568ff","u16":[27415,25913,26816,65535]},"Neutral":{"hex":"#676665ff","u16":[26513,26335,25905,65535]},"Normal":{"hex":"#616367ff","u16":[24843,25438,26430,65535]},"Positive":{"hex":"#606868ff","u16":[24751,26755,26677,65535]},"Visited":{"hex":"#666668ff","u16":[26207,26289,26853,65535]}},"decoration":{"Focus":{"hex":"#6a7278ff","u16":[27247,29349,30966,65535]},"Hover":{"hex":"#6a7278ff","u16":[27247,29349,30966,65535]}},"foreground":{"Active":{"hex":"#6a7278ff","u16":[27247,29349,30966,65535]},"Inactive":{"hex":"#6b6d71ff","u16":[27433,28050,29044,65535]},"Link":{"hex":"#686f78ff","u16":[26689,28511,30928,65535]},"Negative":{"hex":"#726a6dff","u16":[29261,27183,28104,65535]},"Neutral":{"hex":"#72706dff","u16":[29366,28892,27908,65535]},"Normal":{"hex":"#717478ff","u16":[29106,29716,30728,65535]},"Positive":{"hex":"#687270ff","u16":[26690,29347,28887,65535]},"Visited":{"hex":"#6d6d6eff","u16":[27941,27889,28367,65535]}},"shade":{"Dark":{"hex":"#3e4042ff","u16":[16003,16386,17025,65535]},"Light":{"hex":"#707377ff","u16":[28770,29459,30608,65535]},"Mid":{"hex":"#56585bff","u16":[22079,22608,23490,65535]},"Midlight":{"hex":"#686a6fff","u16":[26722,27362,28429,65535]},"Shadow":{"hex":"#2c2d2fff","u16":[11274,11544,11994,65535]}}},"Inactive":{"background":{"Active":{"hex":"#7396acff","u16":[29542,38445,44208,65535]},"Alternate":{"hex":"#828b9aff","u16":[33502,35747,39646,65535]},"Link":{"hex":"#7a92b8ff","u16":[31409,37502,47219,65535]},"Negative":{"hex":"#b2858cff","u16":[45763,34088,35958,65535]},"Neutral":{"hex":"#a38e72ff","u16":[41809,36456,29186,65535]},"Normal":{"hex":"#858c99ff","u16":[34112,36032,39345,65535]},"Positive":{"hex":"#6e9b82ff","u16":[28148,39749,33447,65535]},"Visited":{"hex":"#928da6ff","u16":[37495,36351,42738,65535]}},"decoration":{"Focus":{"hex":"#81bddeff","u16":[33171,48449,57030,65535]},"Hover":{"hex":"#81bddeff","u16":[33171,48449,57030,65535]}},"foreground":{"Active":{"hex":"#81bddeff","u16":[33171,48449,57030,65535]},"Inactive":{"hex":"#a1a6adff","u16":[41387,42604,44373,65535]},"Link":{"hex":"#8fabd9ff","u16":[36685,43861,55755,65535]},"Negative":{"hex":"#ce9295ff","u16":[52824,37405,38286,65535]},"Neutral":{"hex":"#d6ac71ff","u16":[55003,44132,28936,65535]},"Normal":{"hex":"#c3c4c6ff","u16":[50020,50370,50928,65535]},"Positive":{"hex":"#74c08dff","u16":[29896,49342,36223,65535]},"Visited":{"hex":"#aaa0baff","u16":[43567,41221,47697,65535]}},"shade":{"Dark":{"hex":"#565a63ff","u16":[21974,23210,25344,65535]},"Light":{"hex":"#969eabff","u16":[38578,40511,43876,65535]},"Mid":{"hex":"#757c87ff","u16":[30080,31773,34695,65535]},"Midlight":{"hex":"#8c94a1ff","u16":[35917,37939,41427,65535]},"Shadow":{"hex":"#3a3d42ff","u16":[14817,15651,17090,65535]}}}}},"sha256":"8d209d8ff01f1ef4b7d5db0d16816d34563955942cb94f8d1971e34e90e37117","source_text":"[General]\nColorScheme=SyntheticInactiveEffects\nName=Synthetic Inactive Effects\n\n[KDE]\ncontrast=2\nframeContrast=0.35\n\n[ColorEffects:Inactive]\nEnable=true\nChangeSelectionColor=true\nIntensityEffect=1\nIntensityAmount=0.25\nColorEffect=1\nColorAmount=0.3\nColor=112,111,110\nContrastEffect=1\nContrastAmount=0.4\n\n[ColorEffects:Disabled]\nIntensityEffect=3\nIntensityAmount=0.2\nColorEffect=3\nColorAmount=0.5\nColor=56,56,56\nContrastEffect=2\nContrastAmount=0.6\n\n[Colors:View]\nBackgroundNormal=24,26,30\nBackgroundAlternate=32,35,40\nForegroundNormal=220,224,230\nForegroundInactive=140,146,154\nForegroundActive=90,200,250\nForegroundLink=80,160,255\nForegroundVisited=170,120,230\nForegroundNegative=240,80,90\nForegroundNeutral=240,170,40\nForegroundPositive=60,200,110\nDecorationFocus=90,200,250\nDecorationHover=90,200,250\n\n[Colors:Window]\nBackgroundNormal=36,39,44\nBackgroundAlternate=30,33,38\nForegroundNormal=220,224,230\nForegroundInactive=140,146,154\nForegroundActive=90,200,250\nForegroundLink=80,160,255\nForegroundVisited=170,120,230\nForegroundNegative=240,80,90\nForegroundNeutral=240,170,40\nForegroundPositive=60,200,110\nDecorationFocus=90,200,250\nDecorationHover=90,200,250\n\n[Colors:Button]\nBackgroundNormal=44,48,54\nBackgroundAlternate=38,42,48\nForegroundNormal=220,224,230\nForegroundInactive=140,146,154\nForegroundActive=90,200,250\nForegroundLink=80,160,255\nForegroundVisited=170,120,230\nForegroundNegative=240,80,90\nForegroundNeutral=240,170,40\nForegroundPositive=60,200,110\nDecorationFocus=90,200,250\nDecorationHover=90,200,250\n\n[Colors:Selection]\nBackgroundNormal=90,200,250\nBackgroundAlternate=60,150,200\nForegroundNormal=10,10,10\nForegroundInactive=40,60,70\nForegroundActive=0,0,0\nForegroundLink=0,40,120\nForegroundVisited=70,20,110\nForegroundNegative=120,0,10\nForegroundNeutral=110,70,0\nForegroundPositive=0,90,30\nDecorationFocus=90,200,250\nDecorationHover=90,200,250\n\n[Colors:Tooltip]\nBackgroundNormal=48,52,58\nBackgroundAlternate=40,44,50\nForegroundNormal=230,232,236\nForegroundInactive=150,156,164\nForegroundActive=90,200,250\nForegroundLink=80,160,255\nForegroundVisited=170,120,230\nForegroundNegative=240,80,90\nForegroundNeutral=240,170,40\nForegroundPositive=60,200,110\nDecorationFocus=90,200,250\nDecorationHover=90,200,250\n\n[Colors:Complementary]\nBackgroundNormal=16,18,20\nBackgroundAlternate=12,13,15\nForegroundNormal=235,238,242\nForegroundInactive=150,156,164\nForegroundActive=90,200,250\nForegroundLink=80,160,255\nForegroundVisited=170,120,230\nForegroundNegative=240,80,90\nForegroundNeutral=240,170,40\nForegroundPositive=60,200,110\nDecorationFocus=90,200,250\nDecorationHover=90,200,250\n\n[Colors:Header]\nBackgroundNormal=52,56,62\nBackgroundAlternate=36,39,44\nForegroundNormal=225,228,234\nForegroundInactive=140,146,154\nForegroundActive=90,200,250\nForegroundLink=80,160,255\nForegroundVisited=170,120,230\nForegroundNegative=240,80,90\nForegroundNeutral=240,170,40\nForegroundPositive=60,200,110\nDecorationFocus=90,200,250\nDecorationHover=90,200,250\n"}, +{"contrastF":0.5,"frameContrast":0.2,"input":{"ColorEffects:Disabled":{"ColorAmount":"0.8","ColorEffect":"1","ContrastAmount":"0.5","ContrastEffect":"1","IntensityAmount":"-0.5","IntensityEffect":"1"},"ColorEffects:Inactive":{"ChangeSelectionColor":"false","Color":"200,0,0","ColorAmount":"0.25","ColorEffect":"2","ContrastAmount":"0.3","ContrastEffect":"2","Enable":"true","IntensityAmount":"0.15","IntensityEffect":"2"},"Colors:Button":{"BackgroundAlternate":"220,222,226","BackgroundNormal":"248,249,250","DecorationFocus":"0,120,215","DecorationHover":"60,150,230","ForegroundActive":"0,120,215","ForegroundInactive":"110,116,124","ForegroundLink":"0,100,200","ForegroundNegative":"200,30,40","ForegroundNeutral":"190,120,0","ForegroundNormal":"20,22,26","ForegroundPositive":"20,130,50","ForegroundVisited":"110,60,180"},"Colors:Complementary":{"BackgroundAlternate":"24,26,30","BackgroundNormal":"30,32,36","DecorationFocus":"80,170,255","DecorationHover":"110,190,255","ForegroundActive":"80,170,255","ForegroundInactive":"150,156,164","ForegroundLink":"80,170,255","ForegroundNegative":"255,90,100","ForegroundNeutral":"255,190,60","ForegroundNormal":"240,242,245","ForegroundPositive":"80,210,120","ForegroundVisited":"180,140,240"},"Colors:Header":{"BackgroundAlternate":"240,241,243","BackgroundNormal":"226,228,232","DecorationFocus":"0,120,215","DecorationHover":"60,150,230","ForegroundActive":"0,120,215","ForegroundInactive":"110,116,124","ForegroundLink":"0,100,200","ForegroundNegative":"200,30,40","ForegroundNeutral":"190,120,0","ForegroundNormal":"20,22,26","ForegroundPositive":"20,130,50","ForegroundVisited":"110,60,180"},"Colors:Header][Inactive":{"BackgroundAlternate":"226,228,232","BackgroundNormal":"240,241,243","DecorationFocus":"0,120,215","DecorationHover":"60,150,230","ForegroundActive":"0,120,215","ForegroundInactive":"130,136,144","ForegroundLink":"0,100,200","ForegroundNegative":"200,30,40","ForegroundNeutral":"190,120,0","ForegroundNormal":"90,94,100","ForegroundPositive":"20,130,50","ForegroundVisited":"110,60,180"},"Colors:Selection":{"BackgroundAlternate":"0,100,180","BackgroundNormal":"0,120,215","DecorationFocus":"0,120,215","DecorationHover":"60,150,230","ForegroundActive":"255,255,255","ForegroundInactive":"200,220,240","ForegroundLink":"220,240,255","ForegroundNegative":"255,200,200","ForegroundNeutral":"255,230,170","ForegroundNormal":"255,255,255","ForegroundPositive":"200,255,210","ForegroundVisited":"230,210,255"},"Colors:Tooltip":{"BackgroundAlternate":"240,240,240","BackgroundNormal":"250,250,250","DecorationFocus":"0,120,215","DecorationHover":"60,150,230","ForegroundActive":"0,120,215","ForegroundInactive":"110,116,124","ForegroundLink":"0,100,200","ForegroundNegative":"200,30,40","ForegroundNeutral":"190,120,0","ForegroundNormal":"20,22,26","ForegroundPositive":"20,130,50","ForegroundVisited":"110,60,180"},"Colors:View":{"BackgroundAlternate":"245,247,250","BackgroundNormal":"255,255,255","DecorationFocus":"0,120,215","DecorationHover":"60,150,230","ForegroundActive":"0,120,215","ForegroundInactive":"110,116,124","ForegroundLink":"0,100,200","ForegroundNegative":"200,30,40","ForegroundNeutral":"190,120,0","ForegroundNormal":"20,22,26","ForegroundPositive":"20,130,50","ForegroundVisited":"110,60,180"},"Colors:View][Inactive":{"BackgroundNormal":"250,250,250","ForegroundNormal":"60,62,66"},"Colors:Window":{"BackgroundAlternate":"228,230,233","BackgroundNormal":"240,241,243","DecorationFocus":"0,120,215","DecorationHover":"60,150,230","ForegroundActive":"0,120,215","ForegroundInactive":"110,116,124","ForegroundLink":"0,100,200","ForegroundNegative":"200,30,40","ForegroundNeutral":"190,120,0","ForegroundNormal":"20,22,26","ForegroundPositive":"20,130,50","ForegroundVisited":"110,60,180"},"Colors:Window][Inactive":{"BackgroundNormal":"232,233,235"},"General":{"ColorScheme":"SyntheticInactiveSubgroups","Name":"Synthetic Inactive Subgroups"},"KDE":{"contrast":"5"}},"name":"SyntheticInactiveSubgroups","origin":"synthetic","palette":{"Active":{"Accent":{"hex":"#0078d7ff","u16":[0,30840,55255,65535]},"AlternateBase":{"hex":"#f5f7faff","u16":[62965,63479,64250,65535]},"Base":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#f8f9faff","u16":[63736,63993,64250,65535]},"ButtonText":{"hex":"#14161aff","u16":[5140,5654,6682,65535]},"Dark":{"hex":"#7d8798ff","u16":[32106,34594,39044,65535]},"Highlight":{"hex":"#0078d7ff","u16":[0,30840,55255,65535]},"HighlightedText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Link":{"hex":"#0064c8ff","u16":[0,25700,51400,65535]},"LinkVisited":{"hex":"#6e3cb4ff","u16":[28270,15420,46260,65535]},"Mid":{"hex":"#c2c6cfff","u16":[49805,50997,53302,65535]},"Midlight":{"hex":"#f8f9faff","u16":[63815,63928,64153,65535]},"PlaceholderText":{"hex":"#6e747cff","u16":[28270,29812,31868,65535]},"Shadow":{"hex":"#41464fff","u16":[16630,17918,20223,65535]},"Text":{"hex":"#14161aff","u16":[5140,5654,6682,65535]},"ToolTipBase":{"hex":"#fafafaff","u16":[64250,64250,64250,65535]},"ToolTipText":{"hex":"#14161aff","u16":[5140,5654,6682,65535]},"Window":{"hex":"#f0f1f3ff","u16":[61680,61937,62451,65535]},"WindowText":{"hex":"#14161aff","u16":[5140,5654,6682,65535]}},"Disabled":{"Accent":{"hex":"#a3a5a8ff","u16":[41949,42377,43224,65535]},"AlternateBase":{"hex":"#a9aeb6ff","u16":[43517,44814,46701,65535]},"Base":{"hex":"#bababaff","u16":[47824,47824,47824,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#aeb1b5ff","u16":[44776,45599,46409,65535]},"ButtonText":{"hex":"#000000ff","u16":[0,0,0,65535]},"Dark":{"hex":"#5a5c5eff","u16":[23242,23572,24220,65535]},"Highlight":{"hex":"#a3a5a8ff","u16":[41949,42377,43224,65535]},"HighlightedText":{"hex":"#000000ff","u16":[0,0,0,65535]},"Light":{"hex":"#c1c2c4ff","u16":[49510,49769,50287,65535]},"Link":{"hex":"#000000ff","u16":[0,0,0,65535]},"LinkVisited":{"hex":"#000000ff","u16":[0,0,0,65535]},"Mid":{"hex":"#8b8d91ff","u16":[35646,36152,37147,65535]},"Midlight":{"hex":"#afb0b3ff","u16":[44895,45252,45961,65535]},"PlaceholderText":{"hex":"#000000ff","u16":[0,0,0,65535]},"Shadow":{"hex":"#3b3b3dff","u16":[15064,15278,15698,65535]},"Text":{"hex":"#000000ff","u16":[0,0,0,65535]},"ToolTipBase":{"hex":"#fafafaff","u16":[64250,64250,64250,65535]},"ToolTipText":{"hex":"#14161aff","u16":[5140,5654,6682,65535]},"Window":{"hex":"#a3a5a8ff","u16":[41949,42377,43224,65535]},"WindowText":{"hex":"#000000ff","u16":[0,0,0,65535]}},"Inactive":{"Accent":{"hex":"#325496ff","u16":[12850,21483,38490,65535]},"AlternateBase":{"hex":"#deacacff","u16":[57069,44219,44219,65535]},"Base":{"hex":"#e0aeaeff","u16":[57606,44756,44756,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#ddaeb1ff","u16":[56723,44662,45438,65535]},"ButtonText":{"hex":"#572626ff","u16":[22438,9692,9863,65535]},"Dark":{"hex":"#924d52ff","u16":[37406,19760,21038,65535]},"Highlight":{"hex":"#325496ff","u16":[12850,21483,38490,65535]},"HighlightedText":{"hex":"#cca8b8ff","u16":[52410,43154,47345,65535]},"Light":{"hex":"#e2c6c7ff","u16":[58098,50765,51147,65535]},"Link":{"hex":"#795e6dff","u16":[30987,24236,28108,65535]},"LinkVisited":{"hex":"#a74485ff","u16":[42925,17447,34205,65535]},"Mid":{"hex":"#c78286ff","u16":[51192,33326,34448,65535]},"Midlight":{"hex":"#d8b0b2ff","u16":[55608,45124,45695,65535]},"PlaceholderText":{"hex":"#8a5d61ff","u16":[35555,23861,24995,65535]},"Shadow":{"hex":"#5d3134ff","u16":[23810,12578,13391,65535]},"Text":{"hex":"#683637ff","u16":[26739,13992,14198,65535]},"ToolTipBase":{"hex":"#fafafaff","u16":[64250,64250,64250,65535]},"ToolTipText":{"hex":"#14161aff","u16":[5140,5654,6682,65535]},"Window":{"hex":"#d3a2a5ff","u16":[54219,41725,42429,65535]},"WindowText":{"hex":"#5b292aff","u16":[23296,10599,10792,65535]}}},"purpose":"Inactive effects enabled without the selection change, plus explicit Inactive subgroups for Header, View and (partial) Window; Disabled uses shade, desaturate and fade","set_supported":{"Button":true,"Complementary":true,"Header":true,"Selection":true,"Tooltip":true,"View":true,"Window":true},"sets":{"Button":{"Active":{"background":{"Active":{"hex":"#dfebf9ff","u16":[57422,60368,63979,65535]},"Alternate":{"hex":"#dcdee2ff","u16":[56540,57054,58082,65535]},"Link":{"hex":"#dde7f7ff","u16":[56799,59455,63597,65535]},"Negative":{"hex":"#f5e2e3ff","u16":[63046,58084,58292,65535]},"Neutral":{"hex":"#faead5ff","u16":[64320,60047,54842,65535]},"Normal":{"hex":"#f8f9faff","u16":[63736,63993,64250,65535]},"Positive":{"hex":"#bcf7cbff","u16":[48291,63351,52070,65535]},"Visited":{"hex":"#e6e1f1ff","u16":[59156,57710,61846,65535]}},"decoration":{"Focus":{"hex":"#0078d7ff","u16":[0,30840,55255,65535]},"Hover":{"hex":"#3c96e6ff","u16":[15420,38550,59110,65535]}},"foreground":{"Active":{"hex":"#0078d7ff","u16":[0,30840,55255,65535]},"Inactive":{"hex":"#6e747cff","u16":[28270,29812,31868,65535]},"Link":{"hex":"#0064c8ff","u16":[0,25700,51400,65535]},"Negative":{"hex":"#c81e28ff","u16":[51400,7710,10280,65535]},"Neutral":{"hex":"#be7800ff","u16":[48830,30840,0,65535]},"Normal":{"hex":"#14161aff","u16":[5140,5654,6682,65535]},"Positive":{"hex":"#148232ff","u16":[5140,33410,12850,65535]},"Visited":{"hex":"#6e3cb4ff","u16":[28270,15420,46260,65535]}},"shade":{"Dark":{"hex":"#bfcad4ff","u16":[49149,51839,54383,65535]},"Light":{"hex":"#d4dbe1ff","u16":[54537,56243,57897,65535]},"Mid":{"hex":"#d4dbe1ff","u16":[54537,56243,57897,65535]},"Midlight":{"hex":"#e7ebeeff","u16":[59351,60268,61173,65535]},"Shadow":{"hex":"#99aab9ff","u16":[39309,43683,47603,65535]}}},"Disabled":{"background":{"Active":{"hex":"#999b9eff","u16":[39204,39923,40633,65535]},"Alternate":{"hex":"#838487ff","u16":[33653,34038,34804,65535]},"Link":{"hex":"#999b9eff","u16":[39204,39923,40633,65535]},"Negative":{"hex":"#999b9eff","u16":[39204,39923,40633,65535]},"Neutral":{"hex":"#a0a09fff","u16":[41019,41024,40857,65535]},"Normal":{"hex":"#aeb1b5ff","u16":[44776,45599,46409,65535]},"Positive":{"hex":"#999b9eff","u16":[39204,39923,40633,65535]},"Visited":{"hex":"#999b9eff","u16":[39204,39923,40633,65535]}},"decoration":{"Focus":{"hex":"#000000ff","u16":[0,0,0,65535]},"Hover":{"hex":"#3d4247ff","u16":[15653,16967,18347,65535]}},"foreground":{"Active":{"hex":"#000000ff","u16":[0,0,0,65535]},"Inactive":{"hex":"#000000ff","u16":[0,0,0,65535]},"Link":{"hex":"#000000ff","u16":[0,0,0,65535]},"Negative":{"hex":"#000000ff","u16":[0,0,0,65535]},"Neutral":{"hex":"#2b2927ff","u16":[10939,10529,9985,65535]},"Normal":{"hex":"#000000ff","u16":[0,0,0,65535]},"Positive":{"hex":"#000000ff","u16":[0,0,0,65535]},"Visited":{"hex":"#000000ff","u16":[0,0,0,65535]}},"shade":{"Dark":{"hex":"#616365ff","u16":[24868,25363,25849,65535]},"Light":{"hex":"#cecfd1ff","u16":[52846,53297,53746,65535]},"Mid":{"hex":"#94979aff","u16":[37965,38721,39463,65535]},"Midlight":{"hex":"#babcbfff","u16":[47732,48408,49077,65535]},"Shadow":{"hex":"#3d3e40ff","u16":[15741,16055,16362,65535]}}},"Inactive":{"background":{"Active":{"hex":"#bbabb7ff","u16":[48001,43995,46949,65535]},"Alternate":{"hex":"#ca9b9fff","u16":[52010,39759,40946,65535]},"Link":{"hex":"#bda9b4ff","u16":[48508,43461,46310,65535]},"Negative":{"hex":"#d8a3a5ff","u16":[55394,41788,42396,65535]},"Neutral":{"hex":"#d6a69aff","u16":[55070,42740,39646,65535]},"Normal":{"hex":"#ddaeb1ff","u16":[56723,44662,45438,65535]},"Positive":{"hex":"#c9a89fff","u16":[51604,43274,40845,65535]},"Visited":{"hex":"#d1a0c0ff","u16":[53810,41047,49315,65535]}},"decoration":{"Focus":{"hex":"#685d79ff","u16":[26793,23925,31035,65535]},"Hover":{"hex":"#6e7094ff","u16":[28196,28706,37912,65535]}},"foreground":{"Active":{"hex":"#685d79ff","u16":[26793,23925,31035,65535]},"Inactive":{"hex":"#87575aff","u16":[34620,22415,23232,65535]},"Link":{"hex":"#66516cff","u16":[26226,20822,27665,65535]},"Negative":{"hex":"#b7333bff","u16":[46920,13121,15093,65535]},"Neutral":{"hex":"#a56245ff","u16":[42310,25131,17661,65535]},"Normal":{"hex":"#572626ff","u16":[22438,9692,9863,65535]},"Positive":{"hex":"#745b49ff","u16":[29685,23381,18729,65535]},"Visited":{"hex":"#8b3380ff","u16":[35616,13157,32939,65535]}},"shade":{"Dark":{"hex":"#a14e55ff","u16":[41346,19976,21871,65535]},"Light":{"hex":"#ebd3d4ff","u16":[60418,54148,54521,65535]},"Mid":{"hex":"#d18a8fff","u16":[53726,35441,36758,65535]},"Midlight":{"hex":"#e2bbbdff","u16":[57962,48012,48632,65535]},"Shadow":{"hex":"#643035ff","u16":[25710,12421,13600,65535]}}}},"Complementary":{"Active":{"background":{"Active":{"hex":"#1a3045ff","u16":[6660,12335,17816,65535]},"Alternate":{"hex":"#181a1eff","u16":[6168,6682,7710,65535]},"Link":{"hex":"#1a3045ff","u16":[6660,12335,17816,65535]},"Negative":{"hex":"#491f22ff","u16":[18772,7898,8802,65535]},"Neutral":{"hex":"#3f3115ff","u16":[16246,12627,5388,65535]},"Normal":{"hex":"#1e2024ff","u16":[7710,8224,9252,65535]},"Positive":{"hex":"#193723ff","u16":[6372,14142,9061,65535]},"Visited":{"hex":"#332943ff","u16":[13004,10615,17107,65535]}},"decoration":{"Focus":{"hex":"#50aaffff","u16":[20560,43690,65535,65535]},"Hover":{"hex":"#6ebeffff","u16":[28270,48830,65535,65535]}},"foreground":{"Active":{"hex":"#50aaffff","u16":[20560,43690,65535,65535]},"Inactive":{"hex":"#969ca4ff","u16":[38550,40092,42148,65535]},"Link":{"hex":"#50aaffff","u16":[20560,43690,65535,65535]},"Negative":{"hex":"#ff5a64ff","u16":[65535,23130,25700,65535]},"Neutral":{"hex":"#ffbe3cff","u16":[65535,48830,15420,65535]},"Normal":{"hex":"#f0f2f5ff","u16":[61680,62194,62965,65535]},"Positive":{"hex":"#50d278ff","u16":[20560,53970,30840,65535]},"Visited":{"hex":"#b48cf0ff","u16":[46260,35980,61680,65535]}},"shade":{"Dark":{"hex":"#111214ff","u16":[4288,4573,5145,65535]},"Light":{"hex":"#3b3f46ff","u16":[15072,16077,18086,65535]},"Mid":{"hex":"#1a1c1fff","u16":[6745,7195,8094,65535]},"Midlight":{"hex":"#2f3238ff","u16":[12054,12857,14464,65535]},"Shadow":{"hex":"#0c0d0fff","u16":[3120,3328,3744,65535]}}},"Disabled":{"background":{"Active":{"hex":"#000000ff","u16":[0,0,0,65535]},"Alternate":{"hex":"#000000ff","u16":[0,0,0,65535]},"Link":{"hex":"#000000ff","u16":[0,0,0,65535]},"Negative":{"hex":"#000000ff","u16":[0,0,0,65535]},"Neutral":{"hex":"#000000ff","u16":[0,0,0,65535]},"Normal":{"hex":"#000000ff","u16":[0,0,0,65535]},"Positive":{"hex":"#000000ff","u16":[0,0,0,65535]},"Visited":{"hex":"#000000ff","u16":[0,0,0,65535]}},"decoration":{"Focus":{"hex":"#000000ff","u16":[0,0,0,65535]},"Hover":{"hex":"#000000ff","u16":[0,0,0,65535]}},"foreground":{"Active":{"hex":"#000000ff","u16":[0,0,0,65535]},"Inactive":{"hex":"#000000ff","u16":[0,0,0,65535]},"Link":{"hex":"#000000ff","u16":[0,0,0,65535]},"Negative":{"hex":"#000000ff","u16":[0,0,0,65535]},"Neutral":{"hex":"#000000ff","u16":[0,0,0,65535]},"Normal":{"hex":"#000000ff","u16":[0,0,0,65535]},"Positive":{"hex":"#000000ff","u16":[0,0,0,65535]},"Visited":{"hex":"#000000ff","u16":[0,0,0,65535]}},"shade":{"Dark":{"hex":"#808080ff","u16":[32929,32929,32929,65535]},"Light":{"hex":"#bebebeff","u16":[48896,48896,48896,65535]},"Mid":{"hex":"#5d5d5dff","u16":[24029,24029,24029,65535]},"Midlight":{"hex":"#9a9a9aff","u16":[39593,39593,39593,65535]},"Shadow":{"hex":"#9a9a9aff","u16":[39593,39593,39593,65535]}}},"Inactive":{"background":{"Active":{"hex":"#392a39ff","u16":[14765,10753,14619,65535]},"Alternate":{"hex":"#431215ff","u16":[17147,4655,5371,65535]},"Link":{"hex":"#392a39ff","u16":[14765,10753,14619,65535]},"Negative":{"hex":"#521c20ff","u16":[21153,7303,8167,65535]},"Neutral":{"hex":"#4a2819ff","u16":[19111,10207,6393,65535]},"Normal":{"hex":"#471619ff","u16":[18221,5729,6445,65535]},"Positive":{"hex":"#382e23ff","u16":[14293,11861,9033,65535]},"Visited":{"hex":"#45252eff","u16":[17814,9587,11907,65535]}},"decoration":{"Focus":{"hex":"#726b95ff","u16":[29170,27396,38342,65535]},"Hover":{"hex":"#817596ff","u16":[33048,30003,38555,65535]}},"foreground":{"Active":{"hex":"#726b95ff","u16":[29170,27396,38342,65535]},"Inactive":{"hex":"#90636aff","u16":[37057,25352,27170,65535]},"Link":{"hex":"#726b95ff","u16":[29170,27396,38342,65535]},"Negative":{"hex":"#c4464eff","u16":[50436,17891,19974,65535]},"Neutral":{"hex":"#c37640ff","u16":[50228,30415,16490,65535]},"Normal":{"hex":"#bd8d90ff","u16":[48682,36200,36902,65535]},"Positive":{"hex":"#747f5aff","u16":[29720,32567,23049,65535]},"Visited":{"hex":"#9a607aff","u16":[39665,24778,31339,65535]}},"shade":{"Dark":{"hex":"#270c0eff","u16":[10133,3186,3584,65535]},"Light":{"hex":"#79262bff","u16":[31072,9769,10990,65535]},"Mid":{"hex":"#3e1316ff","u16":[15934,5010,5636,65535]},"Midlight":{"hex":"#631f23ff","u16":[25556,8035,9039,65535]},"Shadow":{"hex":"#1d090aff","u16":[7361,2314,2604,65535]}}}},"Header":{"Active":{"background":{"Active":{"hex":"#c3daf5ff","u16":[50156,56013,62930,65535]},"Alternate":{"hex":"#f0f1f3ff","u16":[61680,61937,62451,65535]},"Link":{"hex":"#c4d7f3ff","u16":[50274,55140,62470,65535]},"Negative":{"hex":"#edcecfff","u16":[60781,52900,53302,65535]},"Neutral":{"hex":"#f6d4a6ff","u16":[63323,54589,42622,65535]},"Normal":{"hex":"#e2e4e8ff","u16":[58082,58596,59624,65535]},"Positive":{"hex":"#89eca7ff","u16":[35326,60572,42954,65535]},"Visited":{"hex":"#d7cfe7ff","u16":[55255,53074,59411,65535]}},"decoration":{"Focus":{"hex":"#0078d7ff","u16":[0,30840,55255,65535]},"Hover":{"hex":"#3c96e6ff","u16":[15420,38550,59110,65535]}},"foreground":{"Active":{"hex":"#0078d7ff","u16":[0,30840,55255,65535]},"Inactive":{"hex":"#6e747cff","u16":[28270,29812,31868,65535]},"Link":{"hex":"#0064c8ff","u16":[0,25700,51400,65535]},"Negative":{"hex":"#c81e28ff","u16":[51400,7710,10280,65535]},"Neutral":{"hex":"#be7800ff","u16":[48830,30840,0,65535]},"Normal":{"hex":"#14161aff","u16":[5140,5654,6682,65535]},"Positive":{"hex":"#148232ff","u16":[5140,33410,12850,65535]},"Visited":{"hex":"#6e3cb4ff","u16":[28270,15420,46260,65535]}},"shade":{"Dark":{"hex":"#767f90ff","u16":[30351,32716,36978,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#b8bdc8ff","u16":[47185,48621,51393,65535]},"Midlight":{"hex":"#ebedefff","u16":[60510,60848,61529,65535]},"Shadow":{"hex":"#41464fff","u16":[16618,17913,20247,65535]}}},"Disabled":{"background":{"Active":{"hex":"#808185ff","u16":[32785,33253,34181,65535]},"Alternate":{"hex":"#a3a5a8ff","u16":[41949,42377,43224,65535]},"Link":{"hex":"#808185ff","u16":[32785,33253,34181,65535]},"Negative":{"hex":"#808185ff","u16":[32785,33253,34181,65535]},"Neutral":{"hex":"#808185ff","u16":[32785,33253,34181,65535]},"Normal":{"hex":"#8d8f93ff","u16":[36305,36823,37849,65535]},"Positive":{"hex":"#808185ff","u16":[32785,33253,34181,65535]},"Visited":{"hex":"#808185ff","u16":[32785,33253,34181,65535]}},"decoration":{"Focus":{"hex":"#000000ff","u16":[0,0,0,65535]},"Hover":{"hex":"#000000ff","u16":[0,0,0,65535]}},"foreground":{"Active":{"hex":"#000000ff","u16":[0,0,0,65535]},"Inactive":{"hex":"#000000ff","u16":[0,0,0,65535]},"Link":{"hex":"#000000ff","u16":[0,0,0,65535]},"Negative":{"hex":"#000000ff","u16":[0,0,0,65535]},"Neutral":{"hex":"#000000ff","u16":[0,0,0,65535]},"Normal":{"hex":"#000000ff","u16":[0,0,0,65535]},"Positive":{"hex":"#000000ff","u16":[0,0,0,65535]},"Visited":{"hex":"#000000ff","u16":[0,0,0,65535]}},"shade":{"Dark":{"hex":"#4f5052ff","u16":[20189,20477,21048,65535]},"Light":{"hex":"#a8aaadff","u16":[43258,43653,44442,65535]},"Mid":{"hex":"#797b7fff","u16":[31185,31630,32511,65535]},"Midlight":{"hex":"#999b9eff","u16":[39239,39739,40733,65535]},"Shadow":{"hex":"#353537ff","u16":[13548,13741,14124,65535]}}},"Inactive":{"background":{"Active":{"hex":"#b8a6b2ff","u16":[47275,42596,45635,65535]},"Alternate":{"hex":"#ce9fa4ff","u16":[53038,40837,42118,65535]},"Link":{"hex":"#baa4afff","u16":[47819,42069,45047,65535]},"Negative":{"hex":"#d49da0ff","u16":[54534,40354,41029,65535]},"Neutral":{"hex":"#d5a093ff","u16":[54637,41165,37791,65535]},"Normal":{"hex":"#d8a8abff","u16":[55563,43163,44052,65535]},"Positive":{"hex":"#c6a399ff","u16":[50910,41857,39270,65535]},"Visited":{"hex":"#cf9abbff","u16":[53195,39537,48160,65535]}},"decoration":{"Focus":{"hex":"#6b5c77ff","u16":[27426,23769,30619,65535]},"Hover":{"hex":"#726f91ff","u16":[29376,28528,37295,65535]}},"foreground":{"Active":{"hex":"#6b5c77ff","u16":[27426,23769,30619,65535]},"Inactive":{"hex":"#936469ff","u16":[37696,25754,27026,65535]},"Link":{"hex":"#67506aff","u16":[26599,20674,27288,65535]},"Negative":{"hex":"#b3353cff","u16":[46091,13605,15546,65535]},"Neutral":{"hex":"#a46144ff","u16":[42257,25048,17600,65535]},"Normal":{"hex":"#79494bff","u16":[31200,18701,19261,65535]},"Positive":{"hex":"#735b49ff","u16":[29532,23302,18663,65535]},"Visited":{"hex":"#89347eff","u16":[35231,13341,32297,65535]}},"shade":{"Dark":{"hex":"#994d54ff","u16":[39387,19858,21711,65535]},"Light":{"hex":"#e7ccceff","u16":[59335,52442,52899,65535]},"Mid":{"hex":"#cd868bff","u16":[52562,34335,35793,65535]},"Midlight":{"hex":"#ddb5b8ff","u16":[56871,46547,47264,65535]},"Shadow":{"hex":"#603135ff","u16":[24786,12497,13663,65535]}}}},"Selection":{"Active":{"background":{"Active":{"hex":"#4b86afff","u16":[19297,34522,45033,65535]},"Alternate":{"hex":"#0064b4ff","u16":[0,25700,46260,65535]},"Link":{"hex":"#4785b1ff","u16":[18346,34221,45558,65535]},"Negative":{"hex":"#637fadff","u16":[25474,32653,44398,65535]},"Neutral":{"hex":"#65848dff","u16":[25975,33948,36164,65535]},"Normal":{"hex":"#0078d7ff","u16":[0,30840,55255,65535]},"Positive":{"hex":"#4b8898ff","u16":[19270,35017,38953,65535]},"Visited":{"hex":"#4380caff","u16":[17259,32986,51992,65535]}},"decoration":{"Focus":{"hex":"#0078d7ff","u16":[0,30840,55255,65535]},"Hover":{"hex":"#3c96e6ff","u16":[15420,38550,59110,65535]}},"foreground":{"Active":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Inactive":{"hex":"#c8dcf0ff","u16":[51400,56540,61680,65535]},"Link":{"hex":"#dcf0ffff","u16":[56540,61680,65535,65535]},"Negative":{"hex":"#ffc8c8ff","u16":[65535,51400,51400,65535]},"Neutral":{"hex":"#ffe6aaff","u16":[65535,59110,43690,65535]},"Normal":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Positive":{"hex":"#c8ffd2ff","u16":[51400,65535,53970,65535]},"Visited":{"hex":"#e6d2ffff","u16":[59110,53970,65535,65535]}},"shade":{"Dark":{"hex":"#004378ff","u16":[0,17150,30727,65535]},"Light":{"hex":"#2591ffff","u16":[9524,37194,65535,65535]},"Mid":{"hex":"#0068baff","u16":[0,26663,47772,65535]},"Midlight":{"hex":"#0083ecff","u16":[0,33791,60542,65535]},"Shadow":{"hex":"#002e53ff","u16":[0,11860,21250,65535]}}},"Disabled":{"background":{"Active":{"hex":"#919295ff","u16":[37164,37542,38294,65535]},"Alternate":{"hex":"#919395ff","u16":[37232,37693,38382,65535]},"Link":{"hex":"#919295ff","u16":[37164,37542,38294,65535]},"Negative":{"hex":"#919295ff","u16":[37164,37542,38294,65535]},"Neutral":{"hex":"#919295ff","u16":[37164,37542,38294,65535]},"Normal":{"hex":"#a3a5a8ff","u16":[41949,42377,43224,65535]},"Positive":{"hex":"#919295ff","u16":[37164,37542,38294,65535]},"Visited":{"hex":"#919295ff","u16":[37164,37542,38294,65535]}},"decoration":{"Focus":{"hex":"#000000ff","u16":[0,0,0,65535]},"Hover":{"hex":"#2d3135ff","u16":[11668,12578,13559,65535]}},"foreground":{"Active":{"hex":"#000000ff","u16":[0,0,0,65535]},"Inactive":{"hex":"#000000ff","u16":[0,0,0,65535]},"Link":{"hex":"#000000ff","u16":[0,0,0,65535]},"Negative":{"hex":"#000000ff","u16":[0,0,0,65535]},"Neutral":{"hex":"#000000ff","u16":[0,0,0,65535]},"Normal":{"hex":"#000000ff","u16":[0,0,0,65535]},"Positive":{"hex":"#000000ff","u16":[0,0,0,65535]},"Visited":{"hex":"#000000ff","u16":[0,0,0,65535]}},"shade":{"Dark":{"hex":"#5a5c5eff","u16":[23242,23572,24220,65535]},"Light":{"hex":"#c1c2c4ff","u16":[49510,49769,50287,65535]},"Mid":{"hex":"#8b8d91ff","u16":[35646,36152,37147,65535]},"Midlight":{"hex":"#afb0b3ff","u16":[44895,45252,45961,65535]},"Shadow":{"hex":"#3b3b3dff","u16":[15064,15278,15698,65535]}}},"Inactive":{"background":{"Active":{"hex":"#5b5593ff","u16":[23333,21822,37811,65535]},"Alternate":{"hex":"#32467dff","u16":[12850,17903,32225,65535]},"Link":{"hex":"#545596ff","u16":[21590,21935,38670,65535]},"Negative":{"hex":"#555494ff","u16":[21963,21659,37944,65535]},"Neutral":{"hex":"#525986ff","u16":[21005,22805,34363,65535]},"Normal":{"hex":"#325496ff","u16":[12850,21483,38490,65535]},"Positive":{"hex":"#515a82ff","u16":[20880,23095,33416,65535]},"Visited":{"hex":"#555497ff","u16":[21798,21590,38867,65535]}},"decoration":{"Focus":{"hex":"#325496ff","u16":[12850,21483,38490,65535]},"Hover":{"hex":"#4164aaff","u16":[16635,25691,43584,65535]}},"foreground":{"Active":{"hex":"#cca8b8ff","u16":[52410,43154,47345,65535]},"Inactive":{"hex":"#a593b6ff","u16":[42379,37722,46773,65535]},"Link":{"hex":"#ba9eb7ff","u16":[47745,40601,47148,65535]},"Negative":{"hex":"#ac8facff","u16":[44144,36692,44267,65535]},"Neutral":{"hex":"#af9db2ff","u16":[44953,40352,45818,65535]},"Normal":{"hex":"#cca8b8ff","u16":[52410,43154,47345,65535]},"Positive":{"hex":"#b1a3baff","u16":[45454,41991,47694,65535]},"Visited":{"hex":"#ae91b3ff","u16":[44791,37366,45997,65535]}},"shade":{"Dark":{"hex":"#1c2e53ff","u16":[7146,11947,21404,65535]},"Light":{"hex":"#3f6abeff","u16":[16319,27283,48882,65535]},"Mid":{"hex":"#2c4982ff","u16":[11182,18695,33494,65535]},"Midlight":{"hex":"#395faaff","u16":[14599,24408,43730,65535]},"Shadow":{"hex":"#14213bff","u16":[5085,8502,15231,65535]}}}},"Tooltip":{"Active":{"background":{"Active":{"hex":"#e1ecf9ff","u16":[57803,60603,64030,65535]},"Alternate":{"hex":"#f0f0f0ff","u16":[61680,61680,61680,65535]},"Link":{"hex":"#dee8f8ff","u16":[57136,59680,63648,65535]},"Negative":{"hex":"#f6e3e4ff","u16":[63172,58358,58547,65535]},"Neutral":{"hex":"#fbebd8ff","u16":[64390,60331,55443,65535]},"Normal":{"hex":"#fafafaff","u16":[64250,64250,64250,65535]},"Positive":{"hex":"#c0f7cdff","u16":[49244,63422,52659,65535]},"Visited":{"hex":"#e7e2f1ff","u16":[59376,57957,61951,65535]}},"decoration":{"Focus":{"hex":"#0078d7ff","u16":[0,30840,55255,65535]},"Hover":{"hex":"#3c96e6ff","u16":[15420,38550,59110,65535]}},"foreground":{"Active":{"hex":"#0078d7ff","u16":[0,30840,55255,65535]},"Inactive":{"hex":"#6e747cff","u16":[28270,29812,31868,65535]},"Link":{"hex":"#0064c8ff","u16":[0,25700,51400,65535]},"Negative":{"hex":"#c81e28ff","u16":[51400,7710,10280,65535]},"Neutral":{"hex":"#be7800ff","u16":[48830,30840,0,65535]},"Normal":{"hex":"#14161aff","u16":[5140,5654,6682,65535]},"Positive":{"hex":"#148232ff","u16":[5140,33410,12850,65535]},"Visited":{"hex":"#6e3cb4ff","u16":[28270,15420,46260,65535]}},"shade":{"Dark":{"hex":"#cacacaff","u16":[51852,51852,51852,65535]},"Light":{"hex":"#dbdbdbff","u16":[56351,56351,56351,65535]},"Mid":{"hex":"#dbdbdbff","u16":[56351,56351,56351,65535]},"Midlight":{"hex":"#ebebebff","u16":[60455,60455,60455,65535]},"Shadow":{"hex":"#aaaaaaff","u16":[43571,43571,43571,65535]}}},"Disabled":{"background":{"Active":{"hex":"#9c9c9cff","u16":[40134,40134,40134,65535]},"Alternate":{"hex":"#a3a3a3ff","u16":[41969,41969,41969,65535]},"Link":{"hex":"#9c9c9cff","u16":[40134,40134,40134,65535]},"Negative":{"hex":"#9c9c9cff","u16":[40134,40134,40134,65535]},"Neutral":{"hex":"#a3a19fff","u16":[42002,41464,40757,65535]},"Normal":{"hex":"#b3b3b3ff","u16":[45925,45925,45925,65535]},"Positive":{"hex":"#9c9c9cff","u16":[40134,40134,40134,65535]},"Visited":{"hex":"#9c9c9cff","u16":[40134,40134,40134,65535]}},"decoration":{"Focus":{"hex":"#000000ff","u16":[0,0,0,65535]},"Hover":{"hex":"#3f4449ff","u16":[16117,17466,18876,65535]}},"foreground":{"Active":{"hex":"#000000ff","u16":[0,0,0,65535]},"Inactive":{"hex":"#000000ff","u16":[0,0,0,65535]},"Link":{"hex":"#000000ff","u16":[0,0,0,65535]},"Negative":{"hex":"#000000ff","u16":[0,0,0,65535]},"Neutral":{"hex":"#2e2d2aff","u16":[11889,11438,10845,65535]},"Normal":{"hex":"#000000ff","u16":[0,0,0,65535]},"Positive":{"hex":"#000000ff","u16":[0,0,0,65535]},"Visited":{"hex":"#000000ff","u16":[0,0,0,65535]}},"shade":{"Dark":{"hex":"#636363ff","u16":[25539,25539,25539,65535]},"Light":{"hex":"#d1d1d1ff","u16":[53724,53724,53724,65535]},"Mid":{"hex":"#989898ff","u16":[38963,38963,38963,65535]},"Midlight":{"hex":"#bebebeff","u16":[48745,48745,48745,65535]},"Shadow":{"hex":"#3f3f3fff","u16":[16108,16108,16108,65535]}}},"Inactive":{"background":{"Active":{"hex":"#bcacb6ff","u16":[48255,44244,46852,65535]},"Alternate":{"hex":"#d9a7a7ff","u16":[55816,42966,42966,65535]},"Link":{"hex":"#beaab4ff","u16":[48755,43711,46247,65535]},"Negative":{"hex":"#d9a3a5ff","u16":[55788,41974,42417,65535]},"Neutral":{"hex":"#d8a79aff","u16":[55521,42906,39591,65535]},"Normal":{"hex":"#e0aeaeff","u16":[57606,44756,44756,65535]},"Positive":{"hex":"#cba99eff","u16":[52203,43396,40625,65535]},"Visited":{"hex":"#d2a1bfff","u16":[53971,41361,49016,65535]}},"decoration":{"Focus":{"hex":"#685d79ff","u16":[26835,23935,30994,65535]},"Hover":{"hex":"#6e7093ff","u16":[28263,28716,37863,65535]}},"foreground":{"Active":{"hex":"#685d79ff","u16":[26835,23935,30994,65535]},"Inactive":{"hex":"#87575aff","u16":[34701,22421,23172,65535]},"Link":{"hex":"#66516cff","u16":[26268,20842,27647,65535]},"Negative":{"hex":"#b8323aff","u16":[47177,12967,14796,65535]},"Neutral":{"hex":"#a56244ff","u16":[42373,25129,17595,65535]},"Normal":{"hex":"#582626ff","u16":[22505,9722,9857,65535]},"Positive":{"hex":"#745b49ff","u16":[29772,23390,18686,65535]},"Visited":{"hex":"#8b337fff","u16":[35736,13202,32697,65535]}},"shade":{"Dark":{"hex":"#a74b4bff","u16":[42978,19314,19314,65535]},"Light":{"hex":"#edd4d4ff","u16":[60981,54373,54373,65535]},"Mid":{"hex":"#d68989ff","u16":[54878,35334,35334,65535]},"Midlight":{"hex":"#e5bbbbff","u16":[58728,48135,48135,65535]},"Shadow":{"hex":"#682f2fff","u16":[26665,11983,11983,65535]}}}},"View":{"Active":{"background":{"Active":{"hex":"#e7f0faff","u16":[59436,61619,64322,65535]},"Alternate":{"hex":"#f5f7faff","u16":[62965,63479,64250,65535]},"Link":{"hex":"#e4ecf9ff","u16":[58623,60692,63953,65535]},"Negative":{"hex":"#f8e8e8ff","u16":[63632,59579,59737,65535]},"Neutral":{"hex":"#fcf0e2ff","u16":[64647,61600,58007,65535]},"Normal":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Positive":{"hex":"#cdf8d7ff","u16":[52778,63812,55361,65535]},"Visited":{"hex":"#ebe6f3ff","u16":[60270,59042,62508,65535]}},"decoration":{"Focus":{"hex":"#0078d7ff","u16":[0,30840,55255,65535]},"Hover":{"hex":"#3c96e6ff","u16":[15420,38550,59110,65535]}},"foreground":{"Active":{"hex":"#0078d7ff","u16":[0,30840,55255,65535]},"Inactive":{"hex":"#6e747cff","u16":[28270,29812,31868,65535]},"Link":{"hex":"#0064c8ff","u16":[0,25700,51400,65535]},"Negative":{"hex":"#c81e28ff","u16":[51400,7710,10280,65535]},"Neutral":{"hex":"#be7800ff","u16":[48830,30840,0,65535]},"Normal":{"hex":"#14161aff","u16":[5140,5654,6682,65535]},"Positive":{"hex":"#148232ff","u16":[5140,33410,12850,65535]},"Visited":{"hex":"#6e3cb4ff","u16":[28270,15420,46260,65535]}},"shade":{"Dark":{"hex":"#d0d0d0ff","u16":[53502,53502,53502,65535]},"Light":{"hex":"#e1e1e1ff","u16":[57849,57849,57849,65535]},"Mid":{"hex":"#e1e1e1ff","u16":[57849,57849,57849,65535]},"Midlight":{"hex":"#f1f1f1ff","u16":[61836,61836,61836,65535]},"Shadow":{"hex":"#b1b1b1ff","u16":[45587,45587,45587,65535]}}},"Disabled":{"background":{"Active":{"hex":"#a1a1a1ff","u16":[41470,41470,41470,65535]},"Alternate":{"hex":"#a9aeb6ff","u16":[43517,44814,46701,65535]},"Link":{"hex":"#a1a1a1ff","u16":[41470,41470,41470,65535]},"Negative":{"hex":"#a1a1a1ff","u16":[41470,41470,41470,65535]},"Neutral":{"hex":"#acaaa6ff","u16":[44203,43580,42756,65535]},"Normal":{"hex":"#bababaff","u16":[47824,47824,47824,65535]},"Positive":{"hex":"#a1a1a1ff","u16":[41470,41470,41470,65535]},"Visited":{"hex":"#a1a1a1ff","u16":[41470,41470,41470,65535]}},"decoration":{"Focus":{"hex":"#000000ff","u16":[0,0,0,65535]},"Hover":{"hex":"#464c53ff","u16":[18042,19638,21295,65535]}},"foreground":{"Active":{"hex":"#000000ff","u16":[0,0,0,65535]},"Inactive":{"hex":"#000000ff","u16":[0,0,0,65535]},"Link":{"hex":"#000000ff","u16":[0,0,0,65535]},"Negative":{"hex":"#000000ff","u16":[0,0,0,65535]},"Neutral":{"hex":"#3b3936ff","u16":[15111,14546,13799,65535]},"Normal":{"hex":"#000000ff","u16":[0,0,0,65535]},"Positive":{"hex":"#000000ff","u16":[0,0,0,65535]},"Visited":{"hex":"#000000ff","u16":[0,0,0,65535]}},"shade":{"Dark":{"hex":"#676767ff","u16":[26595,26595,26595,65535]},"Light":{"hex":"#d9d9d9ff","u16":[55840,55840,55840,65535]},"Mid":{"hex":"#9d9d9dff","u16":[40451,40451,40451,65535]},"Midlight":{"hex":"#c5c5c5ff","u16":[50597,50597,50597,65535]},"Shadow":{"hex":"#404040ff","u16":[16503,16503,16503,65535]}}},"Inactive":{"background":{"Active":{"hex":"#b9b0baff","u16":[47484,45304,47816,65535]},"Alternate":{"hex":"#deacacff","u16":[57069,44219,44219,65535]},"Link":{"hex":"#bfacb1ff","u16":[49147,44242,45468,65535]},"Negative":{"hex":"#e3a1a5ff","u16":[58283,41378,42506,65535]},"Neutral":{"hex":"#e7a38bff","u16":[59331,42017,35629,65535]},"Normal":{"hex":"#e0aeaeff","u16":[57606,44756,44756,65535]},"Positive":{"hex":"#c9ada1ff","u16":[51730,44382,41375,65535]},"Visited":{"hex":"#d2a5b9ff","u16":[53909,42357,47632,65535]}},"decoration":{"Focus":{"hex":"#777e97ff","u16":[30468,32502,38840,65535]},"Hover":{"hex":"#9695a8ff","u16":[38647,38420,43151,65535]}},"foreground":{"Active":{"hex":"#777e97ff","u16":[30468,32502,38840,65535]},"Inactive":{"hex":"#8a5d61ff","u16":[35555,23861,24995,65535]},"Link":{"hex":"#795e6dff","u16":[30987,24236,28108,65535]},"Negative":{"hex":"#d23647ff","u16":[53874,13874,18122,65535]},"Neutral":{"hex":"#c7662eff","u16":[51237,26226,11810,65535]},"Normal":{"hex":"#683637ff","u16":[26739,13992,14198,65535]},"Positive":{"hex":"#877763ff","u16":[34714,30535,25526,65535]},"Visited":{"hex":"#a74485ff","u16":[42925,17447,34205,65535]}},"shade":{"Dark":{"hex":"#a74b4bff","u16":[42978,19314,19314,65535]},"Light":{"hex":"#edd4d4ff","u16":[60981,54373,54373,65535]},"Mid":{"hex":"#d68989ff","u16":[54878,35334,35334,65535]},"Midlight":{"hex":"#e5bbbbff","u16":[58728,48135,48135,65535]},"Shadow":{"hex":"#682f2fff","u16":[26665,11983,11983,65535]}}}},"Window":{"Active":{"background":{"Active":{"hex":"#d5e5f7ff","u16":[54755,58731,63548,65535]},"Alternate":{"hex":"#e4e6e9ff","u16":[58596,59110,59881,65535]},"Link":{"hex":"#d4e1f6ff","u16":[54413,57846,63140,65535]},"Negative":{"hex":"#f2dadbff","u16":[62249,56129,56404,65535]},"Neutral":{"hex":"#f9e2c5ff","u16":[63925,58008,50547,65535]},"Normal":{"hex":"#f0f1f3ff","u16":[61680,61937,62451,65535]},"Positive":{"hex":"#a3f4b9ff","u16":[41870,62764,47551,65535]},"Visited":{"hex":"#e1daedff","u16":[57722,55985,60955,65535]}},"decoration":{"Focus":{"hex":"#0078d7ff","u16":[0,30840,55255,65535]},"Hover":{"hex":"#3c96e6ff","u16":[15420,38550,59110,65535]}},"foreground":{"Active":{"hex":"#0078d7ff","u16":[0,30840,55255,65535]},"Inactive":{"hex":"#6e747cff","u16":[28270,29812,31868,65535]},"Link":{"hex":"#0064c8ff","u16":[0,25700,51400,65535]},"Negative":{"hex":"#c81e28ff","u16":[51400,7710,10280,65535]},"Neutral":{"hex":"#be7800ff","u16":[48830,30840,0,65535]},"Normal":{"hex":"#14161aff","u16":[5140,5654,6682,65535]},"Positive":{"hex":"#148232ff","u16":[5140,33410,12850,65535]},"Visited":{"hex":"#6e3cb4ff","u16":[28270,15420,46260,65535]}},"shade":{"Dark":{"hex":"#7d8798ff","u16":[32106,34594,39044,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c2c6cfff","u16":[49805,50997,53302,65535]},"Midlight":{"hex":"#f8f9faff","u16":[63815,63928,64153,65535]},"Shadow":{"hex":"#41464fff","u16":[16630,17918,20223,65535]}}},"Disabled":{"background":{"Active":{"hex":"#919295ff","u16":[37164,37542,38294,65535]},"Alternate":{"hex":"#919395ff","u16":[37232,37693,38382,65535]},"Link":{"hex":"#919295ff","u16":[37164,37542,38294,65535]},"Negative":{"hex":"#919295ff","u16":[37164,37542,38294,65535]},"Neutral":{"hex":"#919295ff","u16":[37164,37542,38294,65535]},"Normal":{"hex":"#a3a5a8ff","u16":[41949,42377,43224,65535]},"Positive":{"hex":"#919295ff","u16":[37164,37542,38294,65535]},"Visited":{"hex":"#919295ff","u16":[37164,37542,38294,65535]}},"decoration":{"Focus":{"hex":"#000000ff","u16":[0,0,0,65535]},"Hover":{"hex":"#2d3135ff","u16":[11668,12578,13559,65535]}},"foreground":{"Active":{"hex":"#000000ff","u16":[0,0,0,65535]},"Inactive":{"hex":"#000000ff","u16":[0,0,0,65535]},"Link":{"hex":"#000000ff","u16":[0,0,0,65535]},"Negative":{"hex":"#000000ff","u16":[0,0,0,65535]},"Neutral":{"hex":"#000000ff","u16":[0,0,0,65535]},"Normal":{"hex":"#000000ff","u16":[0,0,0,65535]},"Positive":{"hex":"#000000ff","u16":[0,0,0,65535]},"Visited":{"hex":"#000000ff","u16":[0,0,0,65535]}},"shade":{"Dark":{"hex":"#5a5c5eff","u16":[23242,23572,24220,65535]},"Light":{"hex":"#c1c2c4ff","u16":[49510,49769,50287,65535]},"Mid":{"hex":"#8b8d91ff","u16":[35646,36152,37147,65535]},"Midlight":{"hex":"#afb0b3ff","u16":[44895,45252,45961,65535]},"Shadow":{"hex":"#3b3b3dff","u16":[15064,15278,15698,65535]}}},"Inactive":{"background":{"Active":{"hex":"#b3a4aeff","u16":[45916,42114,44776,65535]},"Alternate":{"hex":"#cfa0a2ff","u16":[53231,41038,41690,65535]},"Link":{"hex":"#b7a0a6ff","u16":[47097,41246,42754,65535]},"Negative":{"hex":"#d8969bff","u16":[55559,38462,39753,65535]},"Neutral":{"hex":"#dc9885ff","u16":[56453,39006,34072,65535]},"Normal":{"hex":"#d3a2a5ff","u16":[54219,41725,42429,65535]},"Positive":{"hex":"#c1a194ff","u16":[49681,41320,38063,65535]},"Visited":{"hex":"#cc98b0ff","u16":[52348,39016,45188,65535]}},"decoration":{"Focus":{"hex":"#827d92ff","u16":[33431,32030,37546,65535]},"Hover":{"hex":"#a493a2ff","u16":[42217,37748,41538,65535]}},"foreground":{"Active":{"hex":"#827d92ff","u16":[33431,32030,37546,65535]},"Inactive":{"hex":"#8a5c61ff","u16":[35409,23682,24878,65535]},"Link":{"hex":"#7a5d6cff","u16":[31369,23975,27643,65535]},"Negative":{"hex":"#c83d4bff","u16":[51490,15633,19338,65535]},"Neutral":{"hex":"#c06741ff","u16":[49464,26585,16714,65535]},"Normal":{"hex":"#5b292aff","u16":[23296,10599,10792,65535]},"Positive":{"hex":"#867663ff","u16":[34512,30403,25566,65535]},"Visited":{"hex":"#a34681ff","u16":[41856,17915,33264,65535]}},"shade":{"Dark":{"hex":"#924d52ff","u16":[37406,19760,21038,65535]},"Light":{"hex":"#e2c6c7ff","u16":[58098,50765,51147,65535]},"Mid":{"hex":"#c78286ff","u16":[51192,33326,34448,65535]},"Midlight":{"hex":"#d8b0b2ff","u16":[55608,45124,45695,65535]},"Shadow":{"hex":"#5d3134ff","u16":[23810,12578,13391,65535]}}}}},"sha256":"ac9ad89f34b65297f5f939a695deb0672788b6b872aa1b2a0d905731365a67df","source_text":"[General]\nColorScheme=SyntheticInactiveSubgroups\nName=Synthetic Inactive Subgroups\n\n[KDE]\ncontrast=5\n\n[ColorEffects:Inactive]\nEnable=true\nChangeSelectionColor=false\nIntensityEffect=2\nIntensityAmount=0.15\nColorEffect=2\nColorAmount=0.25\nColor=200,0,0\nContrastEffect=2\nContrastAmount=0.3\n\n[ColorEffects:Disabled]\nIntensityEffect=1\nIntensityAmount=-0.5\nColorEffect=1\nColorAmount=0.8\nContrastEffect=1\nContrastAmount=0.5\n\n[Colors:View]\nBackgroundNormal=255,255,255\nBackgroundAlternate=245,247,250\nForegroundNormal=20,22,26\nForegroundInactive=110,116,124\nForegroundActive=0,120,215\nForegroundLink=0,100,200\nForegroundVisited=110,60,180\nForegroundNegative=200,30,40\nForegroundNeutral=190,120,0\nForegroundPositive=20,130,50\nDecorationFocus=0,120,215\nDecorationHover=60,150,230\n\n[Colors:View][Inactive]\nBackgroundNormal=250,250,250\nForegroundNormal=60,62,66\n\n[Colors:Window]\nBackgroundNormal=240,241,243\nBackgroundAlternate=228,230,233\nForegroundNormal=20,22,26\nForegroundInactive=110,116,124\nForegroundActive=0,120,215\nForegroundLink=0,100,200\nForegroundVisited=110,60,180\nForegroundNegative=200,30,40\nForegroundNeutral=190,120,0\nForegroundPositive=20,130,50\nDecorationFocus=0,120,215\nDecorationHover=60,150,230\n\n[Colors:Window][Inactive]\nBackgroundNormal=232,233,235\n\n[Colors:Button]\nBackgroundNormal=248,249,250\nBackgroundAlternate=220,222,226\nForegroundNormal=20,22,26\nForegroundInactive=110,116,124\nForegroundActive=0,120,215\nForegroundLink=0,100,200\nForegroundVisited=110,60,180\nForegroundNegative=200,30,40\nForegroundNeutral=190,120,0\nForegroundPositive=20,130,50\nDecorationFocus=0,120,215\nDecorationHover=60,150,230\n\n[Colors:Selection]\nBackgroundNormal=0,120,215\nBackgroundAlternate=0,100,180\nForegroundNormal=255,255,255\nForegroundInactive=200,220,240\nForegroundActive=255,255,255\nForegroundLink=220,240,255\nForegroundVisited=230,210,255\nForegroundNegative=255,200,200\nForegroundNeutral=255,230,170\nForegroundPositive=200,255,210\nDecorationFocus=0,120,215\nDecorationHover=60,150,230\n\n[Colors:Tooltip]\nBackgroundNormal=250,250,250\nBackgroundAlternate=240,240,240\nForegroundNormal=20,22,26\nForegroundInactive=110,116,124\nForegroundActive=0,120,215\nForegroundLink=0,100,200\nForegroundVisited=110,60,180\nForegroundNegative=200,30,40\nForegroundNeutral=190,120,0\nForegroundPositive=20,130,50\nDecorationFocus=0,120,215\nDecorationHover=60,150,230\n\n[Colors:Complementary]\nBackgroundNormal=30,32,36\nBackgroundAlternate=24,26,30\nForegroundNormal=240,242,245\nForegroundInactive=150,156,164\nForegroundActive=80,170,255\nForegroundLink=80,170,255\nForegroundVisited=180,140,240\nForegroundNegative=255,90,100\nForegroundNeutral=255,190,60\nForegroundPositive=80,210,120\nDecorationFocus=80,170,255\nDecorationHover=110,190,255\n\n[Colors:Header]\nBackgroundNormal=226,228,232\nBackgroundAlternate=240,241,243\nForegroundNormal=20,22,26\nForegroundInactive=110,116,124\nForegroundActive=0,120,215\nForegroundLink=0,100,200\nForegroundVisited=110,60,180\nForegroundNegative=200,30,40\nForegroundNeutral=190,120,0\nForegroundPositive=20,130,50\nDecorationFocus=0,120,215\nDecorationHover=60,150,230\n\n[Colors:Header][Inactive]\nBackgroundNormal=240,241,243\nBackgroundAlternate=226,228,232\nForegroundNormal=90,94,100\nForegroundInactive=130,136,144\nForegroundActive=0,120,215\nForegroundLink=0,100,200\nForegroundVisited=110,60,180\nForegroundNegative=200,30,40\nForegroundNeutral=190,120,0\nForegroundPositive=20,130,50\nDecorationFocus=0,120,215\nDecorationHover=60,150,230\n"}, +{"contrastF":0.4,"frameContrast":0.2,"input":{"Colors:Selection":{"BackgroundNormal":"61,174,233","ForegroundNormal":"255,255,255"},"Colors:View":{"BackgroundNormal":"252,252,252","DecorationFocus":"61,174,233","ForegroundNormal":"35,38,41"},"Colors:Window":{"BackgroundNormal":"239,240,241","ForegroundNormal":"35,38,41"},"General":{"AccentColor":"233,58,154","ColorScheme":"SyntheticAccentKeys","Name":"Synthetic Accent Keys","TintFactor":"0.3","TitlebarIsAccentColored":"true"},"KDE":{"contrast":"4"},"WM":{"activeBackground":"200,40,120","activeForeground":"255,255,255","inactiveBackground":"240,230,236","inactiveForeground":"120,100,110"}},"name":"SyntheticAccentKeys","origin":"synthetic","palette":{"Active":{"Accent":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"AlternateBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Base":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"ButtonText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Highlight":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"HighlightedText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"LinkVisited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"PlaceholderText":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]},"Text":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"ToolTipBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"ToolTipText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Window":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"WindowText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}},"Disabled":{"Accent":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"AlternateBase":{"hex":"#ebebebff","u16":[60511,60511,60511,65535]},"Base":{"hex":"#f0f0f0ff","u16":[61735,61735,61735,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#f0f0f0ff","u16":[61735,61735,61735,65535]},"ButtonText":{"hex":"#a8a9aaff","u16":[43111,43390,43668,65535]},"Dark":{"hex":"#82878cff","u16":[33341,34691,35987,65535]},"Highlight":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"HighlightedText":{"hex":"#a0a1a3ff","u16":[41059,41475,41892,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Link":{"hex":"#a2c8e0ff","u16":[41595,51411,57571,65535]},"LinkVisited":{"hex":"#d4b8dfff","u16":[54420,47217,57302,65535]},"Mid":{"hex":"#bbc0c5ff","u16":[48130,49391,50621,65535]},"Midlight":{"hex":"#ebedeeff","u16":[60472,60791,61110,65535]},"PlaceholderText":{"hex":"#c0c6ccff","u16":[49437,50892,52336,65535]},"Shadow":{"hex":"#474a4cff","u16":[18200,18937,19645,65535]},"Text":{"hex":"#a8a9aaff","u16":[43111,43390,43668,65535]},"ToolTipBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"ToolTipText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Window":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"WindowText":{"hex":"#a0a1a3ff","u16":[41059,41475,41892,65535]}},"Inactive":{"Accent":{"hex":"#c2e0f5ff","u16":[49797,57489,62894,65535]},"AlternateBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Base":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"ButtonText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Highlight":{"hex":"#c2e0f5ff","u16":[49797,57489,62894,65535]},"HighlightedText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"LinkVisited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"PlaceholderText":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]},"Text":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"ToolTipBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"ToolTipText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Window":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"WindowText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}},"purpose":"a light scheme carrying the [General] accent keys (AccentColor, TintFactor, TitlebarIsAccentColored) and a [WM] group; shows which of them KColorScheme itself reads","set_supported":{"Button":false,"Complementary":false,"Header":false,"Selection":true,"Tooltip":false,"View":true,"Window":true},"sets":{"Button":{"Active":{"background":{"Active":{"hex":"#e8f3fbff","u16":[59585,62560,64614,65535]},"Alternate":{"hex":"#a3d4faff","u16":[41891,54484,64250,65535]},"Link":{"hex":"#e4eef7ff","u16":[58702,61204,63367,65535]},"Negative":{"hex":"#f9e9eaff","u16":[64094,59877,60196,65535]},"Neutral":{"hex":"#fdeee5ff","u16":[65131,61115,58894,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#d4fae2ff","u16":[54552,64146,58102,65535]},"Visited":{"hex":"#f1e9f4ff","u16":[61816,59985,62701,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#d5d5d5ff","u16":[54787,54787,54787,65535]},"Light":{"hex":"#e3e3e3ff","u16":[58341,58341,58341,65535]},"Mid":{"hex":"#e3e3e3ff","u16":[58341,58341,58341,65535]},"Midlight":{"hex":"#f0f0f0ff","u16":[61653,61653,61653,65535]},"Shadow":{"hex":"#bcbcbcff","u16":[48440,48440,48440,65535]}}},"Disabled":{"background":{"Active":{"hex":"#d8edf7ff","u16":[55550,60800,63569,65535]},"Alternate":{"hex":"#8cccf9ff","u16":[36095,52366,64033,65535]},"Link":{"hex":"#dfeaf2ff","u16":[57339,60254,62215,65535]},"Negative":{"hex":"#f7e4e6ff","u16":[63468,58657,59124,65535]},"Neutral":{"hex":"#fae6d4ff","u16":[64273,59033,54466,65535]},"Normal":{"hex":"#f0f0f0ff","u16":[61735,61735,61735,65535]},"Positive":{"hex":"#d9eee2ff","u16":[55792,61232,58043,65535]},"Visited":{"hex":"#eee6f2ff","u16":[61262,59074,62174,65535]}},"decoration":{"Focus":{"hex":"#a2d8f3ff","u16":[41654,55609,62421,65535]},"Hover":{"hex":"#c3e3f1ff","u16":[49996,58299,61922,65535]}},"foreground":{"Active":{"hex":"#a2d8f3ff","u16":[41654,55609,62421,65535]},"Inactive":{"hex":"#c0c6ccff","u16":[49437,50892,52336,65535]},"Link":{"hex":"#a2c8e0ff","u16":[41595,51411,57571,65535]},"Negative":{"hex":"#eeafb6ff","u16":[61133,45056,46720,65535]},"Neutral":{"hex":"#f9c088ff","u16":[63954,49376,34973,65535]},"Normal":{"hex":"#a8a9aaff","u16":[43111,43390,43668,65535]},"Positive":{"hex":"#a9d6bcff","u16":[43472,55048,48360,65535]},"Visited":{"hex":"#d4b8dfff","u16":[54420,47217,57302,65535]}},"shade":{"Dark":{"hex":"#8d8d8dff","u16":[36252,36252,36252,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c8c8c8ff","u16":[51382,51382,51382,65535]},"Midlight":{"hex":"#f7f7f7ff","u16":[63513,63513,63513,65535]},"Shadow":{"hex":"#494949ff","u16":[18840,18840,18840,65535]}}},"Inactive":{"background":{"Active":{"hex":"#e8f3fbff","u16":[59585,62560,64614,65535]},"Alternate":{"hex":"#a3d4faff","u16":[41891,54484,64250,65535]},"Link":{"hex":"#e4eef7ff","u16":[58702,61204,63367,65535]},"Negative":{"hex":"#f9e9eaff","u16":[64094,59877,60196,65535]},"Neutral":{"hex":"#fdeee5ff","u16":[65131,61115,58894,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#d4fae2ff","u16":[54552,64146,58102,65535]},"Visited":{"hex":"#f1e9f4ff","u16":[61816,59985,62701,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#d5d5d5ff","u16":[54787,54787,54787,65535]},"Light":{"hex":"#e3e3e3ff","u16":[58341,58341,58341,65535]},"Mid":{"hex":"#e3e3e3ff","u16":[58341,58341,58341,65535]},"Midlight":{"hex":"#f0f0f0ff","u16":[61653,61653,61653,65535]},"Shadow":{"hex":"#bcbcbcff","u16":[48440,48440,48440,65535]}}}},"Complementary":{"Active":{"background":{"Active":{"hex":"#1c3c4dff","u16":[7084,15330,19761,65535]},"Alternate":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]},"Link":{"hex":"#143955ff","u16":[5076,14725,21803,65535]},"Negative":{"hex":"#57242bff","u16":[22290,9359,10973,65535]},"Neutral":{"hex":"#532e0dff","u16":[21296,11822,3397,65535]},"Normal":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Positive":{"hex":"#163e29ff","u16":[5742,16007,10505,65535]},"Visited":{"hex":"#412c4dff","u16":[16787,11259,19761,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#191b1dff","u16":[6338,6942,7546,65535]},"Light":{"hex":"#40464cff","u16":[16436,18002,19567,65535]},"Mid":{"hex":"#25292cff","u16":[9506,10412,11317,65535]},"Midlight":{"hex":"#363b40ff","u16":[13917,15242,16568,65535]},"Shadow":{"hex":"#121415ff","u16":[4597,5035,5473,65535]}}},"Disabled":{"background":{"Active":{"hex":"#20333dff","u16":[8232,13011,15777,65535]},"Alternate":{"hex":"#1a1d1fff","u16":[6615,7349,7839,65535]},"Link":{"hex":"#1c3242ff","u16":[7317,12882,17081,65535]},"Negative":{"hex":"#42282eff","u16":[16927,10389,11726,65535]},"Neutral":{"hex":"#3e2c1cff","u16":[16044,11402,7322,65535]},"Normal":{"hex":"#282c30ff","u16":[10289,11269,12249,65535]},"Positive":{"hex":"#1e352bff","u16":[7632,13521,11035,65535]},"Visited":{"hex":"#352c3fff","u16":[13699,11243,16190,65535]}},"decoration":{"Focus":{"hex":"#2e576dff","u16":[11918,22245,27940,65535]},"Hover":{"hex":"#4b616dff","u16":[19293,24988,27940,65535]}},"foreground":{"Active":{"hex":"#2e576dff","u16":[11918,22245,27940,65535]},"Inactive":{"hex":"#50555aff","u16":[20493,21816,23139,65535]},"Link":{"hex":"#245070ff","u16":[9175,20444,28797,65535]},"Negative":{"hex":"#63333bff","u16":[25380,13156,15078,65535]},"Neutral":{"hex":"#6c431fff","u16":[27781,17272,7962,65535]},"Normal":{"hex":"#6e7173ff","u16":[28296,28933,29569,65535]},"Positive":{"hex":"#27573fff","u16":[10032,22245,16194,65535]},"Visited":{"hex":"#4e3a5cff","u16":[19978,14956,23567,65535]}},"shade":{"Dark":{"hex":"#181a1cff","u16":[6042,6617,7193,65535]},"Light":{"hex":"#3e444aff","u16":[16045,17573,19101,65535]},"Mid":{"hex":"#23272aff","u16":[9063,9926,10789,65535]},"Midlight":{"hex":"#353a3fff","u16":[13498,14784,16069,65535]},"Shadow":{"hex":"#111314ff","u16":[4385,4802,5220,65535]}}},"Inactive":{"background":{"Active":{"hex":"#1c3c4dff","u16":[7084,15330,19761,65535]},"Alternate":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]},"Link":{"hex":"#143955ff","u16":[5076,14725,21803,65535]},"Negative":{"hex":"#57242bff","u16":[22290,9359,10973,65535]},"Neutral":{"hex":"#532e0dff","u16":[21296,11822,3397,65535]},"Normal":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Positive":{"hex":"#163e29ff","u16":[5742,16007,10505,65535]},"Visited":{"hex":"#412c4dff","u16":[16787,11259,19761,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#191b1dff","u16":[6338,6942,7546,65535]},"Light":{"hex":"#40464cff","u16":[16436,18002,19567,65535]},"Mid":{"hex":"#25292cff","u16":[9506,10412,11317,65535]},"Midlight":{"hex":"#363b40ff","u16":[13917,15242,16568,65535]},"Shadow":{"hex":"#121415ff","u16":[4597,5035,5473,65535]}}}},"Header":{"Active":{"background":{"Active":{"hex":"#d5eaf7ff","u16":[54852,60051,63563,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#d4e5f2ff","u16":[54604,58745,62251,65535]},"Negative":{"hex":"#f5dddfff","u16":[62983,56715,57221,65535]},"Neutral":{"hex":"#fbe1d2ff","u16":[64389,57815,54057,65535]},"Normal":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Positive":{"hex":"#adf6caff","u16":[44364,63230,51951,65535]},"Visited":{"hex":"#e8deeeff","u16":[59726,57050,61072,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]}}},"Disabled":{"background":{"Active":{"hex":"#c9e2f0ff","u16":[51633,58104,61582,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Link":{"hex":"#d1e0eaff","u16":[53755,57510,60082,65535]},"Negative":{"hex":"#efd8dbff","u16":[61309,55555,56290,65535]},"Neutral":{"hex":"#f2dac5ff","u16":[62133,56004,50594,65535]},"Normal":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Positive":{"hex":"#c3e6d3ff","u16":[50108,59146,54349,65535]},"Visited":{"hex":"#e4daeaff","u16":[58594,56069,60044,65535]}},"decoration":{"Focus":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Hover":{"hex":"#bddbe9ff","u16":[48529,56272,59804,65535]}},"foreground":{"Active":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Inactive":{"hex":"#b8bfc5ff","u16":[47365,48981,50583,65535]},"Link":{"hex":"#9bc0d9ff","u16":[39710,49467,55672,65535]},"Negative":{"hex":"#e5a8afff","u16":[58782,43247,45071,65535]},"Neutral":{"hex":"#efb984ff","u16":[61470,47568,34027,65535]},"Normal":{"hex":"#a0a1a3ff","u16":[41059,41475,41892,65535]},"Positive":{"hex":"#a1cfb5ff","u16":[41402,53136,46608,65535]},"Visited":{"hex":"#cbb1d8ff","u16":[52205,45373,55410,65535]}},"shade":{"Dark":{"hex":"#82878cff","u16":[33341,34691,35987,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bbc0c5ff","u16":[48130,49391,50621,65535]},"Midlight":{"hex":"#ebedeeff","u16":[60472,60791,61110,65535]},"Shadow":{"hex":"#474a4cff","u16":[18200,18937,19645,65535]}}},"Inactive":{"background":{"Active":{"hex":"#d5eaf7ff","u16":[54852,60051,63563,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#d4e5f2ff","u16":[54604,58745,62251,65535]},"Negative":{"hex":"#f5dddfff","u16":[62983,56715,57221,65535]},"Neutral":{"hex":"#fbe1d2ff","u16":[64389,57815,54057,65535]},"Normal":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Positive":{"hex":"#adf6caff","u16":[44364,63230,51951,65535]},"Visited":{"hex":"#e8deeeff","u16":[59726,57050,61072,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]}}}},"Selection":{"Active":{"background":{"Active":{"hex":"#5ab7dcff","u16":[23235,46907,56572,65535]},"Alternate":{"hex":"#a3d4faff","u16":[41891,54484,64250,65535]},"Link":{"hex":"#b3ab74ff","u16":[46003,43823,29737,65535]},"Negative":{"hex":"#aa96b0ff","u16":[43694,38429,45353,65535]},"Neutral":{"hex":"#b29b74ff","u16":[45660,39812,29747,65535]},"Normal":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Positive":{"hex":"#32ada4ff","u16":[12736,44427,42135,65535]},"Visited":{"hex":"#9799d3ff","u16":[38815,39221,54248,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#fdbc4bff","u16":[65021,48316,19275,65535]},"Negative":{"hex":"#b03745ff","u16":[45232,14135,17733,65535]},"Neutral":{"hex":"#c65c00ff","u16":[50886,23644,0,65535]},"Normal":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Positive":{"hex":"#176839ff","u16":[5911,26728,14649,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#246689ff","u16":[9206,26259,35163,65535]},"Light":{"hex":"#7ac6f9ff","u16":[31305,50791,63873,65535]},"Mid":{"hex":"#3596c9ff","u16":[13498,38503,51559,65535]},"Midlight":{"hex":"#41b9f7ff","u16":[16627,47428,63511,65535]},"Shadow":{"hex":"#174259ff","u16":[5979,17055,22838,65535]}}},"Disabled":{"background":{"Active":{"hex":"#c9e2f0ff","u16":[51633,58104,61582,65535]},"Alternate":{"hex":"#d8daddff","u16":[55389,56136,56880,65535]},"Link":{"hex":"#d1e0eaff","u16":[53755,57510,60082,65535]},"Negative":{"hex":"#efd8dbff","u16":[61309,55555,56290,65535]},"Neutral":{"hex":"#f2dac5ff","u16":[62133,56004,50594,65535]},"Normal":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Positive":{"hex":"#c3e6d3ff","u16":[50108,59146,54349,65535]},"Visited":{"hex":"#e4daeaff","u16":[58594,56069,60044,65535]}},"decoration":{"Focus":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Hover":{"hex":"#bddbe9ff","u16":[48529,56272,59804,65535]}},"foreground":{"Active":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Inactive":{"hex":"#b8bfc5ff","u16":[47365,48981,50583,65535]},"Link":{"hex":"#9bc0d9ff","u16":[39710,49467,55672,65535]},"Negative":{"hex":"#e5a8afff","u16":[58782,43247,45071,65535]},"Neutral":{"hex":"#efb984ff","u16":[61470,47568,34027,65535]},"Normal":{"hex":"#a0a1a3ff","u16":[41059,41475,41892,65535]},"Positive":{"hex":"#a1cfb5ff","u16":[41402,53136,46608,65535]},"Visited":{"hex":"#cbb1d8ff","u16":[52205,45373,55410,65535]}},"shade":{"Dark":{"hex":"#82878cff","u16":[33341,34691,35987,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bbc0c5ff","u16":[48130,49391,50621,65535]},"Midlight":{"hex":"#ebedeeff","u16":[60472,60791,61110,65535]},"Shadow":{"hex":"#474a4cff","u16":[18200,18937,19645,65535]}}},"Inactive":{"background":{"Active":{"hex":"#b3d9f4ff","u16":[45899,55787,62650,65535]},"Alternate":{"hex":"#b0d8f3ff","u16":[45158,55455,62438,65535]},"Link":{"hex":"#b5d4efff","u16":[46454,54609,61533,65535]},"Negative":{"hex":"#e8c9cfff","u16":[59622,51622,53083,65535]},"Neutral":{"hex":"#f4cbb0ff","u16":[62731,52266,45109,65535]},"Normal":{"hex":"#c2e0f5ff","u16":[49797,57489,62894,65535]},"Positive":{"hex":"#75e9b8ff","u16":[30182,59846,47181,65535]},"Visited":{"hex":"#d6cbe6ff","u16":[55093,52228,59148,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#4b88a8ff","u16":[19360,34951,43113,65535]},"Light":{"hex":"#f8fbfeff","u16":[63734,64548,65196,65535]},"Mid":{"hex":"#75c2ecff","u16":[30160,49859,60666,65535]},"Midlight":{"hex":"#d1e7f7ff","u16":[53672,59338,63476,65535]},"Shadow":{"hex":"#2b4d5fff","u16":[10934,19739,24349,65535]}}}},"Tooltip":{"Active":{"background":{"Active":{"hex":"#e0effaff","u16":[57630,61532,64195,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#deeaf5ff","u16":[57046,60196,62891,65535]},"Negative":{"hex":"#f8e4e5ff","u16":[63672,58581,58970,65535]},"Neutral":{"hex":"#fce9ddff","u16":[64875,59755,56885,65535]},"Normal":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Positive":{"hex":"#c5f8d8ff","u16":[50674,63750,55628,65535]},"Visited":{"hex":"#ede5f1ff","u16":[60978,58784,62034,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#cfcfcfff","u16":[53208,53208,53208,65535]},"Light":{"hex":"#ddddddff","u16":[56880,56880,56880,65535]},"Mid":{"hex":"#ddddddff","u16":[56880,56880,56880,65535]},"Midlight":{"hex":"#ebebebff","u16":[60288,60288,60288,65535]},"Shadow":{"hex":"#b5b5b5ff","u16":[46599,46599,46599,65535]}}},"Disabled":{"background":{"Active":{"hex":"#d2e8f4ff","u16":[53968,59692,62698,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Link":{"hex":"#dae6eeff","u16":[55898,59123,61286,65535]},"Negative":{"hex":"#f4dfe1ff","u16":[62678,57357,57876,65535]},"Neutral":{"hex":"#f7e1cdff","u16":[63504,57761,52725,65535]},"Normal":{"hex":"#ebebebff","u16":[60511,60511,60511,65535]},"Positive":{"hex":"#d0ebdbff","u16":[53508,60379,56375,65535]},"Visited":{"hex":"#eae1eeff","u16":[60238,57818,61243,65535]}},"decoration":{"Focus":{"hex":"#a0d5efff","u16":[41134,54770,61453,65535]},"Hover":{"hex":"#c1e0edff","u16":[49531,57442,60912,65535]}},"foreground":{"Active":{"hex":"#a0d5efff","u16":[41134,54770,61453,65535]},"Inactive":{"hex":"#bdc3c8ff","u16":[48657,50093,51518,65535]},"Link":{"hex":"#9fc5ddff","u16":[40903,50598,56692,65535]},"Negative":{"hex":"#eaacb3ff","u16":[60222,44302,45948,65535]},"Neutral":{"hex":"#f5bd86ff","u16":[62984,48622,34500,65535]},"Normal":{"hex":"#a5a6a7ff","u16":[42332,42590,42849,65535]},"Positive":{"hex":"#a6d3b9ff","u16":[42675,54252,47564,65535]},"Visited":{"hex":"#d0b5dcff","u16":[53574,46448,56425,65535]}},"shade":{"Dark":{"hex":"#8a8a8aff","u16":[35533,35533,35533,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c4c4c4ff","u16":[50497,50497,50497,65535]},"Midlight":{"hex":"#f3f3f3ff","u16":[62379,62379,62379,65535]},"Shadow":{"hex":"#494949ff","u16":[18863,18863,18863,65535]}}},"Inactive":{"background":{"Active":{"hex":"#e0effaff","u16":[57630,61532,64195,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#deeaf5ff","u16":[57046,60196,62891,65535]},"Negative":{"hex":"#f8e4e5ff","u16":[63672,58581,58970,65535]},"Neutral":{"hex":"#fce9ddff","u16":[64875,59755,56885,65535]},"Normal":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Positive":{"hex":"#c5f8d8ff","u16":[50674,63750,55628,65535]},"Visited":{"hex":"#ede5f1ff","u16":[60978,58784,62034,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#cfcfcfff","u16":[53208,53208,53208,65535]},"Light":{"hex":"#ddddddff","u16":[56880,56880,56880,65535]},"Mid":{"hex":"#ddddddff","u16":[56880,56880,56880,65535]},"Midlight":{"hex":"#ebebebff","u16":[60288,60288,60288,65535]},"Shadow":{"hex":"#b5b5b5ff","u16":[46599,46599,46599,65535]}}}},"View":{"Active":{"background":{"Active":{"hex":"#e8f3fbff","u16":[59585,62560,64614,65535]},"Alternate":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Link":{"hex":"#e4eef7ff","u16":[58702,61204,63367,65535]},"Negative":{"hex":"#f9e9eaff","u16":[64094,59877,60196,65535]},"Neutral":{"hex":"#fdeee5ff","u16":[65131,61115,58894,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#d4fae2ff","u16":[54552,64146,58102,65535]},"Visited":{"hex":"#f1e9f4ff","u16":[61816,59985,62701,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#d5d5d5ff","u16":[54787,54787,54787,65535]},"Light":{"hex":"#e3e3e3ff","u16":[58341,58341,58341,65535]},"Mid":{"hex":"#e3e3e3ff","u16":[58341,58341,58341,65535]},"Midlight":{"hex":"#f0f0f0ff","u16":[61653,61653,61653,65535]},"Shadow":{"hex":"#bcbcbcff","u16":[48440,48440,48440,65535]}}},"Disabled":{"background":{"Active":{"hex":"#d8edf7ff","u16":[55550,60800,63569,65535]},"Alternate":{"hex":"#ebebebff","u16":[60511,60511,60511,65535]},"Link":{"hex":"#dfeaf2ff","u16":[57339,60254,62215,65535]},"Negative":{"hex":"#f7e4e6ff","u16":[63468,58657,59124,65535]},"Neutral":{"hex":"#fae6d4ff","u16":[64273,59033,54466,65535]},"Normal":{"hex":"#f0f0f0ff","u16":[61735,61735,61735,65535]},"Positive":{"hex":"#d9eee2ff","u16":[55792,61232,58043,65535]},"Visited":{"hex":"#eee6f2ff","u16":[61262,59074,62174,65535]}},"decoration":{"Focus":{"hex":"#a2d8f3ff","u16":[41654,55609,62421,65535]},"Hover":{"hex":"#c3e3f1ff","u16":[49996,58299,61922,65535]}},"foreground":{"Active":{"hex":"#a2d8f3ff","u16":[41654,55609,62421,65535]},"Inactive":{"hex":"#c0c6ccff","u16":[49437,50892,52336,65535]},"Link":{"hex":"#a2c8e0ff","u16":[41595,51411,57571,65535]},"Negative":{"hex":"#eeafb6ff","u16":[61133,45056,46720,65535]},"Neutral":{"hex":"#f9c088ff","u16":[63954,49376,34973,65535]},"Normal":{"hex":"#a8a9aaff","u16":[43111,43390,43668,65535]},"Positive":{"hex":"#a9d6bcff","u16":[43472,55048,48360,65535]},"Visited":{"hex":"#d4b8dfff","u16":[54420,47217,57302,65535]}},"shade":{"Dark":{"hex":"#8d8d8dff","u16":[36252,36252,36252,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c8c8c8ff","u16":[51382,51382,51382,65535]},"Midlight":{"hex":"#f7f7f7ff","u16":[63513,63513,63513,65535]},"Shadow":{"hex":"#494949ff","u16":[18840,18840,18840,65535]}}},"Inactive":{"background":{"Active":{"hex":"#e8f3fbff","u16":[59585,62560,64614,65535]},"Alternate":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Link":{"hex":"#e4eef7ff","u16":[58702,61204,63367,65535]},"Negative":{"hex":"#f9e9eaff","u16":[64094,59877,60196,65535]},"Neutral":{"hex":"#fdeee5ff","u16":[65131,61115,58894,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#d4fae2ff","u16":[54552,64146,58102,65535]},"Visited":{"hex":"#f1e9f4ff","u16":[61816,59985,62701,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#d5d5d5ff","u16":[54787,54787,54787,65535]},"Light":{"hex":"#e3e3e3ff","u16":[58341,58341,58341,65535]},"Mid":{"hex":"#e3e3e3ff","u16":[58341,58341,58341,65535]},"Midlight":{"hex":"#f0f0f0ff","u16":[61653,61653,61653,65535]},"Shadow":{"hex":"#bcbcbcff","u16":[48440,48440,48440,65535]}}}},"Window":{"Active":{"background":{"Active":{"hex":"#d5eaf7ff","u16":[54852,60051,63563,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58339,58853,59367,65535]},"Link":{"hex":"#d4e5f2ff","u16":[54604,58745,62251,65535]},"Negative":{"hex":"#f5dddfff","u16":[62983,56715,57221,65535]},"Neutral":{"hex":"#fbe1d2ff","u16":[64389,57815,54057,65535]},"Normal":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Positive":{"hex":"#adf6caff","u16":[44364,63230,51951,65535]},"Visited":{"hex":"#e8deeeff","u16":[59726,57050,61072,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]}}},"Disabled":{"background":{"Active":{"hex":"#c9e2f0ff","u16":[51633,58104,61582,65535]},"Alternate":{"hex":"#d8daddff","u16":[55389,56136,56880,65535]},"Link":{"hex":"#d1e0eaff","u16":[53755,57510,60082,65535]},"Negative":{"hex":"#efd8dbff","u16":[61309,55555,56290,65535]},"Neutral":{"hex":"#f2dac5ff","u16":[62133,56004,50594,65535]},"Normal":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Positive":{"hex":"#c3e6d3ff","u16":[50108,59146,54349,65535]},"Visited":{"hex":"#e4daeaff","u16":[58594,56069,60044,65535]}},"decoration":{"Focus":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Hover":{"hex":"#bddbe9ff","u16":[48529,56272,59804,65535]}},"foreground":{"Active":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Inactive":{"hex":"#b8bfc5ff","u16":[47365,48981,50583,65535]},"Link":{"hex":"#9bc0d9ff","u16":[39710,49467,55672,65535]},"Negative":{"hex":"#e5a8afff","u16":[58782,43247,45071,65535]},"Neutral":{"hex":"#efb984ff","u16":[61470,47568,34027,65535]},"Normal":{"hex":"#a0a1a3ff","u16":[41059,41475,41892,65535]},"Positive":{"hex":"#a1cfb5ff","u16":[41402,53136,46608,65535]},"Visited":{"hex":"#cbb1d8ff","u16":[52205,45373,55410,65535]}},"shade":{"Dark":{"hex":"#82878cff","u16":[33341,34691,35987,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bbc0c5ff","u16":[48130,49391,50621,65535]},"Midlight":{"hex":"#ebedeeff","u16":[60472,60791,61110,65535]},"Shadow":{"hex":"#474a4cff","u16":[18200,18937,19645,65535]}}},"Inactive":{"background":{"Active":{"hex":"#d5eaf7ff","u16":[54852,60051,63563,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58339,58853,59367,65535]},"Link":{"hex":"#d4e5f2ff","u16":[54604,58745,62251,65535]},"Negative":{"hex":"#f5dddfff","u16":[62983,56715,57221,65535]},"Neutral":{"hex":"#fbe1d2ff","u16":[64389,57815,54057,65535]},"Normal":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Positive":{"hex":"#adf6caff","u16":[44364,63230,51951,65535]},"Visited":{"hex":"#e8deeeff","u16":[59726,57050,61072,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#888e93ff","u16":[34977,36393,37752,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c4c8ccff","u16":[50399,51464,52509,65535]},"Midlight":{"hex":"#f6f7f7ff","u16":[63312,63448,63585,65535]},"Shadow":{"hex":"#474a4cff","u16":[18207,18944,19651,65535]}}}}},"sha256":"30632aee976f7120b57c107e3a1bed1cc5bfa141f222044f739c9554bdc8a93c","source_text":"[General]\nColorScheme=SyntheticAccentKeys\nName=Synthetic Accent Keys\nAccentColor=233,58,154\nTintFactor=0.3\nTitlebarIsAccentColored=true\n\n[KDE]\ncontrast=4\n\n[WM]\nactiveBackground=200,40,120\nactiveForeground=255,255,255\ninactiveBackground=240,230,236\ninactiveForeground=120,100,110\n\n[Colors:View]\nBackgroundNormal=252,252,252\nForegroundNormal=35,38,41\nDecorationFocus=61,174,233\n\n[Colors:Window]\nBackgroundNormal=239,240,241\nForegroundNormal=35,38,41\n\n[Colors:Selection]\nBackgroundNormal=61,174,233\nForegroundNormal=255,255,255\n"}, +{"contrastF":0.7000000000000001,"frameContrast":0.2,"input":{},"name":"SyntheticEmpty","origin":"synthetic","palette":{"Active":{"Accent":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"AlternateBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Base":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"ButtonText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Dark":{"hex":"#71757aff","u16":[28983,30156,31282,65535]},"Highlight":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"HighlightedText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"LinkVisited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]},"Mid":{"hex":"#bdc1c6ff","u16":[48453,49685,50888,65535]},"Midlight":{"hex":"#f9fafaff","u16":[64065,64155,64245,65535]},"PlaceholderText":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Shadow":{"hex":"#3b3d3fff","u16":[15087,15697,16284,65535]},"Text":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"ToolTipBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"ToolTipText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Window":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"WindowText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}},"Disabled":{"Accent":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"AlternateBase":{"hex":"#ebebebff","u16":[60511,60511,60511,65535]},"Base":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#f0f0f0ff","u16":[61735,61735,61735,65535]},"ButtonText":{"hex":"#a8a9aaff","u16":[43111,43390,43668,65535]},"Dark":{"hex":"#6b7074ff","u16":[27627,28746,29820,65535]},"Highlight":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"HighlightedText":{"hex":"#a0a1a3ff","u16":[41059,41475,41892,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Link":{"hex":"#a3cae2ff","u16":[42003,51899,58104,65535]},"LinkVisited":{"hex":"#d6bae1ff","u16":[54932,47677,57833,65535]},"Mid":{"hex":"#b4babfff","u16":[46330,47756,49140,65535]},"Midlight":{"hex":"#eff0f1ff","u16":[61309,61573,61838,65535]},"PlaceholderText":{"hex":"#c2c8ceff","u16":[49903,51372,52827,65535]},"Shadow":{"hex":"#3b3d3fff","u16":[15081,15692,16278,65535]},"Text":{"hex":"#aaabacff","u16":[43578,43869,44159,65535]},"ToolTipBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"ToolTipText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Window":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"WindowText":{"hex":"#a0a1a3ff","u16":[41059,41475,41892,65535]}},"Inactive":{"Accent":{"hex":"#c2e0f5ff","u16":[49797,57489,62894,65535]},"AlternateBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Base":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"ButtonText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Dark":{"hex":"#71757aff","u16":[28983,30156,31282,65535]},"Highlight":{"hex":"#c2e0f5ff","u16":[49797,57489,62894,65535]},"HighlightedText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"LinkVisited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]},"Mid":{"hex":"#bdc1c6ff","u16":[48453,49685,50888,65535]},"Midlight":{"hex":"#f9fafaff","u16":[64065,64155,64245,65535]},"PlaceholderText":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Shadow":{"hex":"#3b3d3fff","u16":[15087,15697,16284,65535]},"Text":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"ToolTipBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"ToolTipText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Window":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"WindowText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}}},"purpose":"an empty file: every value is KColorScheme's built-in default","set_supported":{"Button":false,"Complementary":false,"Header":false,"Selection":false,"Tooltip":false,"View":false,"Window":false},"sets":{"Button":{"Active":{"background":{"Active":{"hex":"#e8f3fbff","u16":[59585,62560,64614,65535]},"Alternate":{"hex":"#a3d4faff","u16":[41891,54484,64250,65535]},"Link":{"hex":"#e4eef7ff","u16":[58702,61204,63367,65535]},"Negative":{"hex":"#f9e9eaff","u16":[64094,59877,60196,65535]},"Neutral":{"hex":"#fdeee5ff","u16":[65131,61115,58894,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#d4fae2ff","u16":[54552,64146,58102,65535]},"Visited":{"hex":"#f1e9f4ff","u16":[61816,59985,62701,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#b9b9b9ff","u16":[47575,47575,47575,65535]},"Light":{"hex":"#d2d2d2ff","u16":[54043,54043,54043,65535]},"Mid":{"hex":"#d2d2d2ff","u16":[54043,54043,54043,65535]},"Midlight":{"hex":"#e8e8e8ff","u16":[59693,59693,59693,65535]},"Shadow":{"hex":"#868686ff","u16":[34535,34535,34535,65535]}}},"Disabled":{"background":{"Active":{"hex":"#d8edf7ff","u16":[55550,60800,63569,65535]},"Alternate":{"hex":"#8cccf9ff","u16":[36095,52366,64033,65535]},"Link":{"hex":"#dfeaf2ff","u16":[57339,60254,62215,65535]},"Negative":{"hex":"#f7e4e6ff","u16":[63468,58657,59124,65535]},"Neutral":{"hex":"#fae6d4ff","u16":[64273,59033,54466,65535]},"Normal":{"hex":"#f0f0f0ff","u16":[61735,61735,61735,65535]},"Positive":{"hex":"#d9eee2ff","u16":[55792,61232,58043,65535]},"Visited":{"hex":"#eee6f2ff","u16":[61262,59074,62174,65535]}},"decoration":{"Focus":{"hex":"#a2d8f3ff","u16":[41654,55609,62421,65535]},"Hover":{"hex":"#c3e3f1ff","u16":[49996,58299,61922,65535]}},"foreground":{"Active":{"hex":"#a2d8f3ff","u16":[41654,55609,62421,65535]},"Inactive":{"hex":"#c0c6ccff","u16":[49437,50892,52336,65535]},"Link":{"hex":"#a2c8e0ff","u16":[41595,51411,57571,65535]},"Negative":{"hex":"#eeafb6ff","u16":[61133,45056,46720,65535]},"Neutral":{"hex":"#f9c088ff","u16":[63954,49376,34973,65535]},"Normal":{"hex":"#a8a9aaff","u16":[43111,43390,43668,65535]},"Positive":{"hex":"#a9d6bcff","u16":[43472,55048,48360,65535]},"Visited":{"hex":"#d4b8dfff","u16":[54420,47217,57302,65535]}},"shade":{"Dark":{"hex":"#757575ff","u16":[30039,30039,30039,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c1c1c1ff","u16":[49575,49575,49575,65535]},"Midlight":{"hex":"#fafafaff","u16":[64224,64224,64224,65535]},"Shadow":{"hex":"#3d3d3dff","u16":[15611,15611,15611,65535]}}},"Inactive":{"background":{"Active":{"hex":"#e8f3fbff","u16":[59585,62560,64614,65535]},"Alternate":{"hex":"#a3d4faff","u16":[41891,54484,64250,65535]},"Link":{"hex":"#e4eef7ff","u16":[58702,61204,63367,65535]},"Negative":{"hex":"#f9e9eaff","u16":[64094,59877,60196,65535]},"Neutral":{"hex":"#fdeee5ff","u16":[65131,61115,58894,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#d4fae2ff","u16":[54552,64146,58102,65535]},"Visited":{"hex":"#f1e9f4ff","u16":[61816,59985,62701,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#b9b9b9ff","u16":[47575,47575,47575,65535]},"Light":{"hex":"#d2d2d2ff","u16":[54043,54043,54043,65535]},"Mid":{"hex":"#d2d2d2ff","u16":[54043,54043,54043,65535]},"Midlight":{"hex":"#e8e8e8ff","u16":[59693,59693,59693,65535]},"Shadow":{"hex":"#868686ff","u16":[34535,34535,34535,65535]}}}},"Complementary":{"Active":{"background":{"Active":{"hex":"#1c3c4dff","u16":[7084,15330,19761,65535]},"Alternate":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]},"Link":{"hex":"#143955ff","u16":[5076,14725,21803,65535]},"Negative":{"hex":"#57242bff","u16":[22290,9359,10973,65535]},"Neutral":{"hex":"#532e0dff","u16":[21296,11822,3397,65535]},"Normal":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Positive":{"hex":"#163e29ff","u16":[5742,16007,10505,65535]},"Visited":{"hex":"#412c4dff","u16":[16787,11259,19761,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#141618ff","u16":[5252,5752,6253,65535]},"Light":{"hex":"#474d54ff","u16":[18170,19901,21631,65535]},"Mid":{"hex":"#24282bff","u16":[9291,10176,11061,65535]},"Midlight":{"hex":"#3a4045ff","u16":[14977,16403,17829,65535]},"Shadow":{"hex":"#0f1012ff","u16":[3809,4172,4535,65535]}}},"Disabled":{"background":{"Active":{"hex":"#20333dff","u16":[8232,13011,15777,65535]},"Alternate":{"hex":"#1a1d1fff","u16":[6615,7349,7839,65535]},"Link":{"hex":"#1c3242ff","u16":[7317,12882,17081,65535]},"Negative":{"hex":"#42282eff","u16":[16927,10389,11726,65535]},"Neutral":{"hex":"#3e2c1cff","u16":[16044,11402,7322,65535]},"Normal":{"hex":"#282c30ff","u16":[10289,11269,12249,65535]},"Positive":{"hex":"#1e352bff","u16":[7632,13521,11035,65535]},"Visited":{"hex":"#352c3fff","u16":[13699,11243,16190,65535]}},"decoration":{"Focus":{"hex":"#2e576dff","u16":[11918,22245,27940,65535]},"Hover":{"hex":"#4b616dff","u16":[19293,24988,27940,65535]}},"foreground":{"Active":{"hex":"#2e576dff","u16":[11918,22245,27940,65535]},"Inactive":{"hex":"#50555aff","u16":[20493,21816,23139,65535]},"Link":{"hex":"#245070ff","u16":[9175,20444,28797,65535]},"Negative":{"hex":"#63333bff","u16":[25380,13156,15078,65535]},"Neutral":{"hex":"#6c431fff","u16":[27781,17272,7962,65535]},"Normal":{"hex":"#6e7173ff","u16":[28296,28933,29569,65535]},"Positive":{"hex":"#27573fff","u16":[10032,22245,16194,65535]},"Visited":{"hex":"#4e3a5cff","u16":[19978,14956,23567,65535]}},"shade":{"Dark":{"hex":"#131517ff","u16":[5006,5483,5960,65535]},"Light":{"hex":"#454c52ff","u16":[17791,19485,21180,65535]},"Mid":{"hex":"#222629ff","u16":[8858,9702,10546,65535]},"Midlight":{"hex":"#393e44ff","u16":[14575,15963,17351,65535]},"Shadow":{"hex":"#0e0f11ff","u16":[3633,3979,4325,65535]}}},"Inactive":{"background":{"Active":{"hex":"#1c3c4dff","u16":[7084,15330,19761,65535]},"Alternate":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]},"Link":{"hex":"#143955ff","u16":[5076,14725,21803,65535]},"Negative":{"hex":"#57242bff","u16":[22290,9359,10973,65535]},"Neutral":{"hex":"#532e0dff","u16":[21296,11822,3397,65535]},"Normal":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Positive":{"hex":"#163e29ff","u16":[5742,16007,10505,65535]},"Visited":{"hex":"#412c4dff","u16":[16787,11259,19761,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#141618ff","u16":[5252,5752,6253,65535]},"Light":{"hex":"#474d54ff","u16":[18170,19901,21631,65535]},"Mid":{"hex":"#24282bff","u16":[9291,10176,11061,65535]},"Midlight":{"hex":"#3a4045ff","u16":[14977,16403,17829,65535]},"Shadow":{"hex":"#0f1012ff","u16":[3809,4172,4535,65535]}}}},"Header":{"Active":{"background":{"Active":{"hex":"#bddcf1ff","u16":[48617,56620,61865,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#bed8edff","u16":[48753,55447,60903,65535]},"Negative":{"hex":"#eecccfff","u16":[61219,52482,53238,65535]},"Neutral":{"hex":"#f7cfb7ff","u16":[63498,53297,47153,65535]},"Normal":{"hex":"#dee0e2ff","u16":[57054,57568,58082,65535]},"Positive":{"hex":"#85ecb2ff","u16":[34118,60679,45709,65535]},"Visited":{"hex":"#ddcfe5ff","u16":[56819,53117,58755,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#696d71ff","u16":[27102,28116,29099,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#b1b6bcff","u16":[45476,46876,48242,65535]},"Midlight":{"hex":"#eaebecff","u16":[60102,60421,60742,65535]},"Shadow":{"hex":"#3b3d3fff","u16":[15073,15636,16183,65535]}}},"Disabled":{"background":{"Active":{"hex":"#b6d4e4ff","u16":[46809,54437,58578,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Link":{"hex":"#c1d1dcff","u16":[49596,53745,56654,65535]},"Negative":{"hex":"#e2c8ccff","u16":[58118,51520,52524,65535]},"Neutral":{"hex":"#e5cbb3ff","u16":[58796,52066,46125,65535]},"Normal":{"hex":"#d3d6d8ff","u16":[54197,54906,55612,65535]},"Positive":{"hex":"#b3d7c5ff","u16":[46026,55365,50692,65535]},"Visited":{"hex":"#d6cbddff","u16":[54939,52124,56916,65535]}},"decoration":{"Focus":{"hex":"#93c6e0ff","u16":[37880,50983,57656,65535]},"Hover":{"hex":"#b4d1deff","u16":[46270,53637,57131,65535]}},"foreground":{"Active":{"hex":"#93c6e0ff","u16":[37880,50983,57656,65535]},"Inactive":{"hex":"#aeb5bbff","u16":[44665,46432,48183,65535]},"Link":{"hex":"#94b6ccff","u16":[37989,46772,52533,65535]},"Negative":{"hex":"#d99fa6ff","u16":[55802,40796,42771,65535]},"Neutral":{"hex":"#e2b080ff","u16":[58104,45186,32907,65535]},"Normal":{"hex":"#95979aff","u16":[38352,38927,39503,65535]},"Positive":{"hex":"#97c5acff","u16":[38695,50589,44220,65535]},"Visited":{"hex":"#c0a7ceff","u16":[49363,42888,52873,65535]}},"shade":{"Dark":{"hex":"#65686cff","u16":[25834,26801,27739,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#a9afb5ff","u16":[43411,45003,46547,65535]},"Midlight":{"hex":"#e0e1e3ff","u16":[57463,57950,58438,65535]},"Shadow":{"hex":"#3a3c3eff","u16":[14890,15447,15988,65535]}}},"Inactive":{"background":{"Active":{"hex":"#bddcf1ff","u16":[48617,56620,61865,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#bed8edff","u16":[48753,55447,60903,65535]},"Negative":{"hex":"#eecccfff","u16":[61219,52482,53238,65535]},"Neutral":{"hex":"#f7cfb7ff","u16":[63498,53297,47153,65535]},"Normal":{"hex":"#dee0e2ff","u16":[57054,57568,58082,65535]},"Positive":{"hex":"#85ecb2ff","u16":[34118,60679,45709,65535]},"Visited":{"hex":"#ddcfe5ff","u16":[56819,53117,58755,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#696d71ff","u16":[27102,28116,29099,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#b1b6bcff","u16":[45476,46876,48242,65535]},"Midlight":{"hex":"#eaebecff","u16":[60102,60421,60742,65535]},"Shadow":{"hex":"#3b3d3fff","u16":[15073,15636,16183,65535]}}}},"Selection":{"Active":{"background":{"Active":{"hex":"#5ab7dcff","u16":[23235,46907,56572,65535]},"Alternate":{"hex":"#a3d4faff","u16":[41891,54484,64250,65535]},"Link":{"hex":"#b3ab74ff","u16":[46003,43823,29737,65535]},"Negative":{"hex":"#aa96b0ff","u16":[43694,38429,45353,65535]},"Neutral":{"hex":"#b29b74ff","u16":[45660,39812,29747,65535]},"Normal":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Positive":{"hex":"#32ada4ff","u16":[12736,44427,42135,65535]},"Visited":{"hex":"#9799d3ff","u16":[38815,39221,54248,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#fdbc4bff","u16":[65021,48316,19275,65535]},"Negative":{"hex":"#b03745ff","u16":[45232,14135,17733,65535]},"Neutral":{"hex":"#c65c00ff","u16":[50886,23644,0,65535]},"Normal":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Positive":{"hex":"#176839ff","u16":[5911,26728,14649,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#1e5571ff","u16":[7628,21759,29137,65535]},"Light":{"hex":"#92cef9ff","u16":[37530,52828,64075,65535]},"Mid":{"hex":"#3392c3ff","u16":[13128,37447,50145,65535]},"Midlight":{"hex":"#52bcf8ff","u16":[21175,48262,63634,65535]},"Shadow":{"hex":"#13374aff","u16":[4954,14132,18924,65535]}}},"Disabled":{"background":{"Active":{"hex":"#c9e2f0ff","u16":[51633,58104,61582,65535]},"Alternate":{"hex":"#d8daddff","u16":[55389,56136,56880,65535]},"Link":{"hex":"#d1e0eaff","u16":[53755,57510,60082,65535]},"Negative":{"hex":"#efd8dbff","u16":[61309,55555,56290,65535]},"Neutral":{"hex":"#f2dac5ff","u16":[62133,56004,50594,65535]},"Normal":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Positive":{"hex":"#c3e6d3ff","u16":[50108,59146,54349,65535]},"Visited":{"hex":"#e4daeaff","u16":[58594,56069,60044,65535]}},"decoration":{"Focus":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Hover":{"hex":"#bddbe9ff","u16":[48529,56272,59804,65535]}},"foreground":{"Active":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Inactive":{"hex":"#b8bfc5ff","u16":[47365,48981,50583,65535]},"Link":{"hex":"#9bc0d9ff","u16":[39710,49467,55672,65535]},"Negative":{"hex":"#e5a8afff","u16":[58782,43247,45071,65535]},"Neutral":{"hex":"#efb984ff","u16":[61470,47568,34027,65535]},"Normal":{"hex":"#a0a1a3ff","u16":[41059,41475,41892,65535]},"Positive":{"hex":"#a1cfb5ff","u16":[41402,53136,46608,65535]},"Visited":{"hex":"#cbb1d8ff","u16":[52205,45373,55410,65535]}},"shade":{"Dark":{"hex":"#6b7074ff","u16":[27627,28746,29820,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#b4babfff","u16":[46330,47756,49140,65535]},"Midlight":{"hex":"#eff0f1ff","u16":[61309,61573,61838,65535]},"Shadow":{"hex":"#3b3d3fff","u16":[15081,15692,16278,65535]}}},"Inactive":{"background":{"Active":{"hex":"#b3d9f4ff","u16":[45899,55787,62650,65535]},"Alternate":{"hex":"#b0d8f3ff","u16":[45158,55455,62438,65535]},"Link":{"hex":"#b5d4efff","u16":[46454,54609,61533,65535]},"Negative":{"hex":"#e8c9cfff","u16":[59622,51622,53083,65535]},"Neutral":{"hex":"#f4cbb0ff","u16":[62731,52266,45109,65535]},"Normal":{"hex":"#c2e0f5ff","u16":[49797,57489,62894,65535]},"Positive":{"hex":"#75e9b8ff","u16":[30182,59846,47181,65535]},"Visited":{"hex":"#d6cbe6ff","u16":[55093,52228,59148,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#3e718bff","u16":[16042,28962,35725,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#68bde9ff","u16":[26841,48457,59772,65535]},"Midlight":{"hex":"#d7eaf8ff","u16":[55164,60075,63712,65535]},"Shadow":{"hex":"#23404fff","u16":[9060,16357,20176,65535]}}}},"Tooltip":{"Active":{"background":{"Active":{"hex":"#e0effaff","u16":[57630,61532,64195,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#deeaf5ff","u16":[57046,60196,62891,65535]},"Negative":{"hex":"#f8e4e5ff","u16":[63672,58581,58970,65535]},"Neutral":{"hex":"#fce9ddff","u16":[64875,59755,56885,65535]},"Normal":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Positive":{"hex":"#c5f8d8ff","u16":[50674,63750,55628,65535]},"Visited":{"hex":"#ede5f1ff","u16":[60978,58784,62034,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#b2b2b2ff","u16":[45692,45692,45692,65535]},"Light":{"hex":"#ccccccff","u16":[52436,52436,52436,65535]},"Mid":{"hex":"#ccccccff","u16":[52436,52436,52436,65535]},"Midlight":{"hex":"#e3e3e3ff","u16":[58272,58272,58272,65535]},"Shadow":{"hex":"#7b7b7bff","u16":[31695,31695,31695,65535]}}},"Disabled":{"background":{"Active":{"hex":"#d2e8f4ff","u16":[53968,59692,62698,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Link":{"hex":"#dae6eeff","u16":[55898,59123,61286,65535]},"Negative":{"hex":"#f4dfe1ff","u16":[62678,57357,57876,65535]},"Neutral":{"hex":"#f7e1cdff","u16":[63504,57761,52725,65535]},"Normal":{"hex":"#ebebebff","u16":[60511,60511,60511,65535]},"Positive":{"hex":"#d0ebdbff","u16":[53508,60379,56375,65535]},"Visited":{"hex":"#eae1eeff","u16":[60238,57818,61243,65535]}},"decoration":{"Focus":{"hex":"#a0d5efff","u16":[41134,54770,61453,65535]},"Hover":{"hex":"#c1e0edff","u16":[49531,57442,60912,65535]}},"foreground":{"Active":{"hex":"#a0d5efff","u16":[41134,54770,61453,65535]},"Inactive":{"hex":"#bdc3c8ff","u16":[48657,50093,51518,65535]},"Link":{"hex":"#9fc5ddff","u16":[40903,50598,56692,65535]},"Negative":{"hex":"#eaacb3ff","u16":[60222,44302,45948,65535]},"Neutral":{"hex":"#f5bd86ff","u16":[62984,48622,34500,65535]},"Normal":{"hex":"#a5a6a7ff","u16":[42332,42590,42849,65535]},"Positive":{"hex":"#a6d3b9ff","u16":[42675,54252,47564,65535]},"Visited":{"hex":"#d0b5dcff","u16":[53574,46448,56425,65535]}},"shade":{"Dark":{"hex":"#737373ff","u16":[29444,29444,29444,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bebebeff","u16":[48753,48753,48753,65535]},"Midlight":{"hex":"#f6f6f6ff","u16":[63124,63124,63124,65535]},"Shadow":{"hex":"#3d3d3dff","u16":[15630,15630,15630,65535]}}},"Inactive":{"background":{"Active":{"hex":"#e0effaff","u16":[57630,61532,64195,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#deeaf5ff","u16":[57046,60196,62891,65535]},"Negative":{"hex":"#f8e4e5ff","u16":[63672,58581,58970,65535]},"Neutral":{"hex":"#fce9ddff","u16":[64875,59755,56885,65535]},"Normal":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Positive":{"hex":"#c5f8d8ff","u16":[50674,63750,55628,65535]},"Visited":{"hex":"#ede5f1ff","u16":[60978,58784,62034,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#b2b2b2ff","u16":[45692,45692,45692,65535]},"Light":{"hex":"#ccccccff","u16":[52436,52436,52436,65535]},"Mid":{"hex":"#ccccccff","u16":[52436,52436,52436,65535]},"Midlight":{"hex":"#e3e3e3ff","u16":[58272,58272,58272,65535]},"Shadow":{"hex":"#7b7b7bff","u16":[31695,31695,31695,65535]}}}},"View":{"Active":{"background":{"Active":{"hex":"#ecf6fcff","u16":[60771,63172,64842,65535]},"Alternate":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Link":{"hex":"#e8f0f8ff","u16":[59682,61808,63658,65535]},"Negative":{"hex":"#faecedff","u16":[64334,60663,60940,65535]},"Neutral":{"hex":"#fef1eaff","u16":[65257,61930,60105,65535]},"Normal":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Positive":{"hex":"#ddfbe8ff","u16":[56769,64393,59555,65535]},"Visited":{"hex":"#f2ecf6ff","u16":[62319,60713,63097,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#bdbdbdff","u16":[48684,48684,48684,65535]},"Light":{"hex":"#d6d6d6ff","u16":[54997,54997,54997,65535]},"Mid":{"hex":"#d6d6d6ff","u16":[54997,54997,54997,65535]},"Midlight":{"hex":"#ecececff","u16":[60542,60542,60542,65535]},"Shadow":{"hex":"#8d8d8dff","u16":[36141,36141,36141,65535]}}},"Disabled":{"background":{"Active":{"hex":"#dceff9ff","u16":[56552,61460,64057,65535]},"Alternate":{"hex":"#ebebebff","u16":[60511,60511,60511,65535]},"Link":{"hex":"#e3edf4ff","u16":[58230,60929,62750,65535]},"Negative":{"hex":"#f9e7e9ff","u16":[63907,59452,59885,65535]},"Neutral":{"hex":"#fce9d8ff","u16":[64691,59802,55559,65535]},"Normal":{"hex":"#f3f3f3ff","u16":[62470,62470,62470,65535]},"Positive":{"hex":"#def0e6ff","u16":[57106,61751,59018,65535]},"Visited":{"hex":"#f1e9f4ff","u16":[61864,59835,62710,65535]}},"decoration":{"Focus":{"hex":"#a3daf5ff","u16":[41938,56116,63017,65535]},"Hover":{"hex":"#c3e5f3ff","u16":[50224,58822,62559,65535]}},"foreground":{"Active":{"hex":"#a3daf5ff","u16":[41938,56116,63017,65535]},"Inactive":{"hex":"#c2c8ceff","u16":[49903,51372,52827,65535]},"Link":{"hex":"#a3cae2ff","u16":[42003,51899,58104,65535]},"Negative":{"hex":"#f0b1b8ff","u16":[61685,45506,47184,65535]},"Neutral":{"hex":"#fbc289ff","u16":[64548,49824,35228,65535]},"Normal":{"hex":"#aaabacff","u16":[43578,43869,44159,65535]},"Positive":{"hex":"#abd8beff","u16":[43950,55525,48837,65535]},"Visited":{"hex":"#d6bae1ff","u16":[54932,47677,57833,65535]}},"shade":{"Dark":{"hex":"#767676ff","u16":[30397,30397,30397,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c3c3c3ff","u16":[50064,50064,50064,65535]},"Midlight":{"hex":"#fcfcfcff","u16":[64880,64880,64880,65535]},"Shadow":{"hex":"#3d3d3dff","u16":[15585,15585,15585,65535]}}},"Inactive":{"background":{"Active":{"hex":"#ecf6fcff","u16":[60771,63172,64842,65535]},"Alternate":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Link":{"hex":"#e8f0f8ff","u16":[59682,61808,63658,65535]},"Negative":{"hex":"#faecedff","u16":[64334,60663,60940,65535]},"Neutral":{"hex":"#fef1eaff","u16":[65257,61930,60105,65535]},"Normal":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Positive":{"hex":"#ddfbe8ff","u16":[56769,64393,59555,65535]},"Visited":{"hex":"#f2ecf6ff","u16":[62319,60713,63097,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#bdbdbdff","u16":[48684,48684,48684,65535]},"Light":{"hex":"#d6d6d6ff","u16":[54997,54997,54997,65535]},"Mid":{"hex":"#d6d6d6ff","u16":[54997,54997,54997,65535]},"Midlight":{"hex":"#ecececff","u16":[60542,60542,60542,65535]},"Shadow":{"hex":"#8d8d8dff","u16":[36141,36141,36141,65535]}}}},"Window":{"Active":{"background":{"Active":{"hex":"#d5eaf7ff","u16":[54852,60051,63563,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58339,58853,59367,65535]},"Link":{"hex":"#d4e5f2ff","u16":[54604,58745,62251,65535]},"Negative":{"hex":"#f5dddfff","u16":[62983,56715,57221,65535]},"Neutral":{"hex":"#fbe1d2ff","u16":[64389,57815,54057,65535]},"Normal":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Positive":{"hex":"#adf6caff","u16":[44364,63230,51951,65535]},"Visited":{"hex":"#e8deeeff","u16":[59726,57050,61072,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#71757aff","u16":[28983,30156,31282,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bdc1c6ff","u16":[48453,49685,50888,65535]},"Midlight":{"hex":"#f9fafaff","u16":[64065,64155,64245,65535]},"Shadow":{"hex":"#3b3d3fff","u16":[15087,15697,16284,65535]}}},"Disabled":{"background":{"Active":{"hex":"#c9e2f0ff","u16":[51633,58104,61582,65535]},"Alternate":{"hex":"#d8daddff","u16":[55389,56136,56880,65535]},"Link":{"hex":"#d1e0eaff","u16":[53755,57510,60082,65535]},"Negative":{"hex":"#efd8dbff","u16":[61309,55555,56290,65535]},"Neutral":{"hex":"#f2dac5ff","u16":[62133,56004,50594,65535]},"Normal":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Positive":{"hex":"#c3e6d3ff","u16":[50108,59146,54349,65535]},"Visited":{"hex":"#e4daeaff","u16":[58594,56069,60044,65535]}},"decoration":{"Focus":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Hover":{"hex":"#bddbe9ff","u16":[48529,56272,59804,65535]}},"foreground":{"Active":{"hex":"#9cd1ebff","u16":[40116,53610,60344,65535]},"Inactive":{"hex":"#b8bfc5ff","u16":[47365,48981,50583,65535]},"Link":{"hex":"#9bc0d9ff","u16":[39710,49467,55672,65535]},"Negative":{"hex":"#e5a8afff","u16":[58782,43247,45071,65535]},"Neutral":{"hex":"#efb984ff","u16":[61470,47568,34027,65535]},"Normal":{"hex":"#a0a1a3ff","u16":[41059,41475,41892,65535]},"Positive":{"hex":"#a1cfb5ff","u16":[41402,53136,46608,65535]},"Visited":{"hex":"#cbb1d8ff","u16":[52205,45373,55410,65535]}},"shade":{"Dark":{"hex":"#6b7074ff","u16":[27627,28746,29820,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#b4babfff","u16":[46330,47756,49140,65535]},"Midlight":{"hex":"#eff0f1ff","u16":[61309,61573,61838,65535]},"Shadow":{"hex":"#3b3d3fff","u16":[15081,15692,16278,65535]}}},"Inactive":{"background":{"Active":{"hex":"#d5eaf7ff","u16":[54852,60051,63563,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58339,58853,59367,65535]},"Link":{"hex":"#d4e5f2ff","u16":[54604,58745,62251,65535]},"Negative":{"hex":"#f5dddfff","u16":[62983,56715,57221,65535]},"Neutral":{"hex":"#fbe1d2ff","u16":[64389,57815,54057,65535]},"Normal":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Positive":{"hex":"#adf6caff","u16":[44364,63230,51951,65535]},"Visited":{"hex":"#e8deeeff","u16":[59726,57050,61072,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#71757aff","u16":[28983,30156,31282,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bdc1c6ff","u16":[48453,49685,50888,65535]},"Midlight":{"hex":"#f9fafaff","u16":[64065,64155,64245,65535]},"Shadow":{"hex":"#3b3d3fff","u16":[15087,15697,16284,65535]}}}}},"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","source_text":""}, +{"contrastF":1.5,"frameContrast":0.2,"input":{"ColorEffects:Disabled":{"ColorEffect":"0","ContrastAmount":"2.5","ContrastEffect":"1","IntensityAmount":"0.4","IntensityEffect":"7"},"Colors:Selection":{"BackgroundNormal":"0,0,0"},"Colors:View":{"BackgroundAlternate":"10,20,30,128","BackgroundNormal":"#ff8800","ForegroundActive":"red","ForegroundInactive":"300,20","ForegroundLink":"","ForegroundNormal":"12 , 34 , 56","ForegroundPositive":"0,200,0","ForegroundVisited":"256,-1,1000"},"Colors:Window":{"BackgroundNormal":"200,200,200","ForegroundNormal":"1,2,3"},"General":{"ColorScheme":"SyntheticMalformed","Name":"Synthetic Malformed"},"KDE":{"contrast":"15"}},"name":"SyntheticMalformed","origin":"synthetic","palette":{"Active":{"Accent":{"hex":"#000000ff","u16":[0,0,0,65535]},"AlternateBase":{"hex":"#0a141e80","u16":[2570,5140,7710,32896]},"Base":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"ButtonText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Dark":{"hex":"#464646ff","u16":[18048,18048,18048,65535]},"Highlight":{"hex":"#000000ff","u16":[0,0,0,65535]},"HighlightedText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Light":{"hex":"#fafafaff","u16":[64277,64277,64277,65535]},"Link":{"valid":false},"LinkVisited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]},"Mid":{"hex":"#9f9f9fff","u16":[40931,40931,40931,65535]},"Midlight":{"hex":"#d8d8d8ff","u16":[55573,55573,55573,65535]},"PlaceholderText":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Shadow":{"hex":"#2a2a2aff","u16":[10816,10816,10816,65535]},"Text":{"hex":"#0c2238ff","u16":[3084,8738,14392,65535]},"ToolTipBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"ToolTipText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Window":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"WindowText":{"hex":"#010203ff","u16":[257,514,771,65535]}},"Disabled":{"Accent":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"AlternateBase":{"hex":"#0a141e80","u16":[2570,5140,7710,32896]},"Base":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"ButtonText":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Dark":{"hex":"#464646ff","u16":[18048,18048,18048,65535]},"Highlight":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"HighlightedText":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Light":{"hex":"#fafafaff","u16":[64277,64277,64277,65535]},"Link":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"LinkVisited":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"Mid":{"hex":"#9f9f9fff","u16":[40931,40931,40931,65535]},"Midlight":{"hex":"#d8d8d8ff","u16":[55573,55573,55573,65535]},"PlaceholderText":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"Shadow":{"hex":"#2a2a2aff","u16":[10816,10816,10816,65535]},"Text":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"ToolTipBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"ToolTipText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Window":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"WindowText":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]}},"Inactive":{"Accent":{"hex":"#919191ff","u16":[37249,37249,37249,65535]},"AlternateBase":{"hex":"#0a141e80","u16":[2570,5140,7710,32896]},"Base":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"ButtonText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Dark":{"hex":"#464646ff","u16":[18048,18048,18048,65535]},"Highlight":{"hex":"#919191ff","u16":[37249,37249,37249,65535]},"HighlightedText":{"hex":"#010203ff","u16":[257,514,771,65535]},"Light":{"hex":"#fafafaff","u16":[64277,64277,64277,65535]},"Link":{"valid":false},"LinkVisited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]},"Mid":{"hex":"#9f9f9fff","u16":[40931,40931,40931,65535]},"Midlight":{"hex":"#d8d8d8ff","u16":[55573,55573,55573,65535]},"PlaceholderText":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Shadow":{"hex":"#2a2a2aff","u16":[10816,10816,10816,65535]},"Text":{"hex":"#0c2238ff","u16":[3084,8738,14392,65535]},"ToolTipBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"ToolTipText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Window":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"WindowText":{"hex":"#010203ff","u16":[257,514,771,65535]}}},"purpose":"value syntax edge cases (hex, alpha, spaces, named colour, too few components, empty value), an out-of-range contrast and effect id, a duplicated key and a duplicated group","set_supported":{"Button":false,"Complementary":false,"Header":false,"Selection":true,"Tooltip":false,"View":true,"Window":true},"sets":{"Button":{"Active":{"background":{"Active":{"hex":"#e8f3fbff","u16":[59585,62560,64614,65535]},"Alternate":{"hex":"#a3d4faff","u16":[41891,54484,64250,65535]},"Link":{"hex":"#e4eef7ff","u16":[58702,61204,63367,65535]},"Negative":{"hex":"#f9e9eaff","u16":[64094,59877,60196,65535]},"Neutral":{"hex":"#fdeee5ff","u16":[65131,61115,58894,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#d4fae2ff","u16":[54552,64146,58102,65535]},"Visited":{"hex":"#f1e9f4ff","u16":[61816,59985,62701,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#979797ff","u16":[38725,38725,38725,65535]},"Light":{"hex":"#c0c0c0ff","u16":[49288,49288,49288,65535]},"Mid":{"hex":"#c0c0c0ff","u16":[49288,49288,49288,65535]},"Midlight":{"hex":"#e0e0e0ff","u16":[57652,57652,57652,65535]},"Shadow":{"hex":"#000000ff","u16":[0,0,0,65535]}}},"Disabled":{"background":{"Active":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Alternate":{"hex":"#a3d4faff","u16":[41891,54484,64250,65535]},"Link":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Negative":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Neutral":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Visited":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}},"decoration":{"Focus":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Hover":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}},"foreground":{"Active":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Inactive":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Link":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Negative":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Neutral":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Visited":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]}},"shade":{"Dark":{"hex":"#979797ff","u16":[38725,38725,38725,65535]},"Light":{"hex":"#c0c0c0ff","u16":[49288,49288,49288,65535]},"Mid":{"hex":"#c0c0c0ff","u16":[49288,49288,49288,65535]},"Midlight":{"hex":"#e0e0e0ff","u16":[57652,57652,57652,65535]},"Shadow":{"hex":"#000000ff","u16":[0,0,0,65535]}}},"Inactive":{"background":{"Active":{"hex":"#e8f3fbff","u16":[59585,62560,64614,65535]},"Alternate":{"hex":"#a3d4faff","u16":[41891,54484,64250,65535]},"Link":{"hex":"#e4eef7ff","u16":[58702,61204,63367,65535]},"Negative":{"hex":"#f9e9eaff","u16":[64094,59877,60196,65535]},"Neutral":{"hex":"#fdeee5ff","u16":[65131,61115,58894,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#d4fae2ff","u16":[54552,64146,58102,65535]},"Visited":{"hex":"#f1e9f4ff","u16":[61816,59985,62701,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#979797ff","u16":[38725,38725,38725,65535]},"Light":{"hex":"#c0c0c0ff","u16":[49288,49288,49288,65535]},"Mid":{"hex":"#c0c0c0ff","u16":[49288,49288,49288,65535]},"Midlight":{"hex":"#e0e0e0ff","u16":[57652,57652,57652,65535]},"Shadow":{"hex":"#000000ff","u16":[0,0,0,65535]}}}},"Complementary":{"Active":{"background":{"Active":{"hex":"#1c3c4dff","u16":[7084,15330,19761,65535]},"Alternate":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]},"Link":{"hex":"#143955ff","u16":[5076,14725,21803,65535]},"Negative":{"hex":"#57242bff","u16":[22290,9359,10973,65535]},"Neutral":{"hex":"#532e0dff","u16":[21296,11822,3397,65535]},"Normal":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Positive":{"hex":"#163e29ff","u16":[5742,16007,10505,65535]},"Visited":{"hex":"#412c4dff","u16":[16787,11259,19761,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#0f1012ff","u16":[3790,4151,4512,65535]},"Light":{"hex":"#4d545bff","u16":[19725,21604,23482,65535]},"Mid":{"hex":"#23272aff","u16":[9070,9934,10798,65535]},"Midlight":{"hex":"#3e444aff","u16":[15953,17472,18992,65535]},"Shadow":{"hex":"#0b0c0dff","u16":[2749,3010,3272,65535]}}},"Disabled":{"background":{"Active":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Alternate":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]},"Link":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Negative":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Neutral":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Normal":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Positive":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Visited":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]}},"decoration":{"Focus":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Hover":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]}},"foreground":{"Active":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Inactive":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Link":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Negative":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Neutral":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Normal":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Positive":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Visited":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]}},"shade":{"Dark":{"hex":"#0f1012ff","u16":[3790,4151,4512,65535]},"Light":{"hex":"#4d545bff","u16":[19725,21604,23482,65535]},"Mid":{"hex":"#23272aff","u16":[9070,9934,10798,65535]},"Midlight":{"hex":"#3e444aff","u16":[15953,17472,18992,65535]},"Shadow":{"hex":"#0b0c0dff","u16":[2749,3010,3272,65535]}}},"Inactive":{"background":{"Active":{"hex":"#1c3c4dff","u16":[7084,15330,19761,65535]},"Alternate":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]},"Link":{"hex":"#143955ff","u16":[5076,14725,21803,65535]},"Negative":{"hex":"#57242bff","u16":[22290,9359,10973,65535]},"Neutral":{"hex":"#532e0dff","u16":[21296,11822,3397,65535]},"Normal":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Positive":{"hex":"#163e29ff","u16":[5742,16007,10505,65535]},"Visited":{"hex":"#412c4dff","u16":[16787,11259,19761,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#0f1012ff","u16":[3790,4151,4512,65535]},"Light":{"hex":"#4d545bff","u16":[19725,21604,23482,65535]},"Mid":{"hex":"#23272aff","u16":[9070,9934,10798,65535]},"Midlight":{"hex":"#3e444aff","u16":[15953,17472,18992,65535]},"Shadow":{"hex":"#0b0c0dff","u16":[2749,3010,3272,65535]}}}},"Header":{"Active":{"background":{"Active":{"hex":"#8fc9ecff","u16":[36692,51778,60566,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#98c5e6ff","u16":[38948,50592,59122,65535]},"Negative":{"hex":"#e3b4b7ff","u16":[58317,46137,47125,65535]},"Neutral":{"hex":"#f6b386ff","u16":[63180,46046,34370,65535]},"Normal":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Positive":{"hex":"#71d59cff","u16":[29144,54796,39975,65535]},"Visited":{"hex":"#ccb8d5ff","u16":[52449,47208,54864,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#010203ff","u16":[257,514,771,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#464646ff","u16":[18048,18048,18048,65535]},"Light":{"hex":"#fafafaff","u16":[64277,64277,64277,65535]},"Mid":{"hex":"#9f9f9fff","u16":[40931,40931,40931,65535]},"Midlight":{"hex":"#d8d8d8ff","u16":[55573,55573,55573,65535]},"Shadow":{"hex":"#2a2a2aff","u16":[10816,10816,10816,65535]}}},"Disabled":{"background":{"Active":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Negative":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Neutral":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Normal":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Positive":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Visited":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]}},"decoration":{"Focus":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Hover":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]}},"foreground":{"Active":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Inactive":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Link":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Negative":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Neutral":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Normal":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Positive":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Visited":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]}},"shade":{"Dark":{"hex":"#464646ff","u16":[18048,18048,18048,65535]},"Light":{"hex":"#fafafaff","u16":[64277,64277,64277,65535]},"Mid":{"hex":"#9f9f9fff","u16":[40931,40931,40931,65535]},"Midlight":{"hex":"#d8d8d8ff","u16":[55573,55573,55573,65535]},"Shadow":{"hex":"#2a2a2aff","u16":[10816,10816,10816,65535]}}},"Inactive":{"background":{"Active":{"hex":"#8fc9ecff","u16":[36692,51778,60566,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#98c5e6ff","u16":[38948,50592,59122,65535]},"Negative":{"hex":"#e3b4b7ff","u16":[58317,46137,47125,65535]},"Neutral":{"hex":"#f6b386ff","u16":[63180,46046,34370,65535]},"Normal":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Positive":{"hex":"#71d59cff","u16":[29144,54796,39975,65535]},"Visited":{"hex":"#ccb8d5ff","u16":[52449,47208,54864,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#010203ff","u16":[257,514,771,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#464646ff","u16":[18048,18048,18048,65535]},"Light":{"hex":"#fafafaff","u16":[64277,64277,64277,65535]},"Mid":{"hex":"#9f9f9fff","u16":[40931,40931,40931,65535]},"Midlight":{"hex":"#d8d8d8ff","u16":[55573,55573,55573,65535]},"Shadow":{"hex":"#2a2a2aff","u16":[10816,10816,10816,65535]}}}},"Selection":{"Active":{"background":{"Active":{"hex":"#343434ff","u16":[13263,13263,13263,65535]},"Alternate":{"hex":"#a3d4faff","u16":[41891,54484,64250,65535]},"Link":{"hex":"#352710ff","u16":[13520,10047,4008,65535]},"Negative":{"hex":"#2d0e12ff","u16":[11474,3586,4498,65535]},"Neutral":{"hex":"#2e1500ff","u16":[11869,5515,0,65535]},"Normal":{"hex":"#000000ff","u16":[0,0,0,65535]},"Positive":{"hex":"#061b0fff","u16":[1557,7040,3859,65535]},"Visited":{"hex":"#25152bff","u16":[9456,5429,11103,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#fdbc4bff","u16":[65021,48316,19275,65535]},"Negative":{"hex":"#b03745ff","u16":[45232,14135,17733,65535]},"Neutral":{"hex":"#c65c00ff","u16":[50886,23644,0,65535]},"Normal":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Positive":{"hex":"#176839ff","u16":[5911,26728,14649,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#acacacff","u16":[44180,44180,44180,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#7d7d7dff","u16":[32240,32240,32240,65535]},"Midlight":{"hex":"#cfcfcfff","u16":[53121,53121,53121,65535]},"Shadow":{"hex":"#cfcfcfff","u16":[53121,53121,53121,65535]}}},"Disabled":{"background":{"Active":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58339,58853,59367,65535]},"Link":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Negative":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Neutral":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Normal":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Positive":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Visited":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]}},"decoration":{"Focus":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Hover":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]}},"foreground":{"Active":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Inactive":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Link":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Negative":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Neutral":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Normal":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Positive":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Visited":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]}},"shade":{"Dark":{"hex":"#464646ff","u16":[18048,18048,18048,65535]},"Light":{"hex":"#fafafaff","u16":[64277,64277,64277,65535]},"Mid":{"hex":"#9f9f9fff","u16":[40931,40931,40931,65535]},"Midlight":{"hex":"#d8d8d8ff","u16":[55573,55573,55573,65535]},"Shadow":{"hex":"#2a2a2aff","u16":[10816,10816,10816,65535]}}},"Inactive":{"background":{"Active":{"hex":"#4f9ec8ff","u16":[20250,40707,51388,65535]},"Alternate":{"hex":"#9b9d9eff","u16":[39930,40284,40633,65535]},"Link":{"hex":"#5193beff","u16":[20929,37794,48845,65535]},"Negative":{"hex":"#ca747cff","u16":[51945,29763,31762,65535]},"Neutral":{"hex":"#eb750cff","u16":[60466,30148,3093,65535]},"Normal":{"hex":"#919191ff","u16":[37249,37249,37249,65535]},"Positive":{"hex":"#2faa63ff","u16":[12113,43715,25456,65535]},"Visited":{"hex":"#a47fb3ff","u16":[42031,32593,46113,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#010203ff","u16":[257,514,771,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#333333ff","u16":[13079,13079,13079,65535]},"Light":{"hex":"#bababaff","u16":[47703,47703,47703,65535]},"Mid":{"hex":"#777777ff","u16":[30540,30540,30540,65535]},"Midlight":{"hex":"#a3a3a3ff","u16":[41799,41799,41799,65535]},"Shadow":{"hex":"#222222ff","u16":[8754,8754,8754,65535]}}}},"Tooltip":{"Active":{"background":{"Active":{"hex":"#e0effaff","u16":[57630,61532,64195,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#deeaf5ff","u16":[57046,60196,62891,65535]},"Negative":{"hex":"#f8e4e5ff","u16":[63672,58581,58970,65535]},"Neutral":{"hex":"#fce9ddff","u16":[64875,59755,56885,65535]},"Normal":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Positive":{"hex":"#c5f8d8ff","u16":[50674,63750,55628,65535]},"Visited":{"hex":"#ede5f1ff","u16":[60978,58784,62034,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#8d8d8dff","u16":[36279,36279,36279,65535]},"Light":{"hex":"#b9b9b9ff","u16":[47486,47486,47486,65535]},"Mid":{"hex":"#b9b9b9ff","u16":[47486,47486,47486,65535]},"Midlight":{"hex":"#dbdbdbff","u16":[56169,56169,56169,65535]},"Shadow":{"hex":"#000000ff","u16":[0,0,0,65535]}}},"Disabled":{"background":{"Active":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Negative":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Neutral":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Normal":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Positive":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Visited":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]}},"decoration":{"Focus":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Hover":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]}},"foreground":{"Active":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Inactive":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Link":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Negative":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Neutral":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Normal":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Positive":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Visited":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]}},"shade":{"Dark":{"hex":"#8d8d8dff","u16":[36279,36279,36279,65535]},"Light":{"hex":"#b9b9b9ff","u16":[47486,47486,47486,65535]},"Mid":{"hex":"#b9b9b9ff","u16":[47486,47486,47486,65535]},"Midlight":{"hex":"#dbdbdbff","u16":[56169,56169,56169,65535]},"Shadow":{"hex":"#000000ff","u16":[0,0,0,65535]}}},"Inactive":{"background":{"Active":{"hex":"#e0effaff","u16":[57630,61532,64195,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#deeaf5ff","u16":[57046,60196,62891,65535]},"Negative":{"hex":"#f8e4e5ff","u16":[63672,58581,58970,65535]},"Neutral":{"hex":"#fce9ddff","u16":[64875,59755,56885,65535]},"Normal":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Positive":{"hex":"#c5f8d8ff","u16":[50674,63750,55628,65535]},"Visited":{"hex":"#ede5f1ff","u16":[60978,58784,62034,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#8d8d8dff","u16":[36279,36279,36279,65535]},"Light":{"hex":"#b9b9b9ff","u16":[47486,47486,47486,65535]},"Mid":{"hex":"#b9b9b9ff","u16":[47486,47486,47486,65535]},"Midlight":{"hex":"#dbdbdbff","u16":[56169,56169,56169,65535]},"Shadow":{"hex":"#000000ff","u16":[0,0,0,65535]}}}},"View":{"Active":{"background":{"Active":{"hex":"#ff7971ff","u16":[65535,30980,28951,65535]},"Alternate":{"hex":"#0a141e80","u16":[2570,5140,7710,32896]},"Link":{"hex":"#e27800ff","u16":[57972,30918,0,65535]},"Negative":{"hex":"#f67f68ff","u16":[63116,32718,26783,65535]},"Neutral":{"hex":"#ff7f25ff","u16":[65535,32583,9453,65535]},"Normal":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"Positive":{"hex":"#02c700ff","u16":[430,51261,0,65535]},"Visited":{"hex":"#cd9195ff","u16":[52611,37234,38193,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"valid":false},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#0c2238ff","u16":[3084,8738,14392,65535]},"Positive":{"hex":"#00c800ff","u16":[0,51400,0,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#5a3000ff","u16":[23011,12272,0,65535]},"Light":{"hex":"#ffc7afff","u16":[65535,51085,44976,65535]},"Mid":{"hex":"#cf6e00ff","u16":[53200,28374,0,65535]},"Midlight":{"hex":"#ffa26eff","u16":[65535,41684,28368,65535]},"Shadow":{"hex":"#3a1f00ff","u16":[14865,7928,0,65535]}}},"Disabled":{"background":{"Active":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"Alternate":{"hex":"#0a141e80","u16":[2570,5140,7710,32896]},"Link":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"Negative":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"Neutral":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"Normal":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"Positive":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"Visited":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]}},"decoration":{"Focus":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"Hover":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]}},"foreground":{"Active":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"Inactive":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"Link":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"Negative":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"Neutral":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"Normal":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"Positive":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"Visited":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]}},"shade":{"Dark":{"hex":"#5a3000ff","u16":[23011,12272,0,65535]},"Light":{"hex":"#ffc7afff","u16":[65535,51085,44976,65535]},"Mid":{"hex":"#cf6e00ff","u16":[53200,28374,0,65535]},"Midlight":{"hex":"#ffa26eff","u16":[65535,41684,28368,65535]},"Shadow":{"hex":"#3a1f00ff","u16":[14865,7928,0,65535]}}},"Inactive":{"background":{"Active":{"hex":"#ff7971ff","u16":[65535,30980,28951,65535]},"Alternate":{"hex":"#0a141e80","u16":[2570,5140,7710,32896]},"Link":{"hex":"#e27800ff","u16":[57972,30918,0,65535]},"Negative":{"hex":"#f67f68ff","u16":[63116,32718,26783,65535]},"Neutral":{"hex":"#ff7f25ff","u16":[65535,32583,9453,65535]},"Normal":{"hex":"#ff8800ff","u16":[65535,34952,0,65535]},"Positive":{"hex":"#02c700ff","u16":[430,51261,0,65535]},"Visited":{"hex":"#cd9195ff","u16":[52611,37234,38193,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"valid":false},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#0c2238ff","u16":[3084,8738,14392,65535]},"Positive":{"hex":"#00c800ff","u16":[0,51400,0,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#5a3000ff","u16":[23011,12272,0,65535]},"Light":{"hex":"#ffc7afff","u16":[65535,51085,44976,65535]},"Mid":{"hex":"#cf6e00ff","u16":[53200,28374,0,65535]},"Midlight":{"hex":"#ffa26eff","u16":[65535,41684,28368,65535]},"Shadow":{"hex":"#3a1f00ff","u16":[14865,7928,0,65535]}}}},"Window":{"Active":{"background":{"Active":{"hex":"#8fc9ecff","u16":[36692,51778,60566,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58339,58853,59367,65535]},"Link":{"hex":"#98c5e6ff","u16":[38948,50592,59122,65535]},"Negative":{"hex":"#e3b4b7ff","u16":[58317,46137,47125,65535]},"Neutral":{"hex":"#f6b386ff","u16":[63180,46046,34370,65535]},"Normal":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Positive":{"hex":"#71d59cff","u16":[29144,54796,39975,65535]},"Visited":{"hex":"#ccb8d5ff","u16":[52449,47208,54864,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#010203ff","u16":[257,514,771,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#464646ff","u16":[18048,18048,18048,65535]},"Light":{"hex":"#fafafaff","u16":[64277,64277,64277,65535]},"Mid":{"hex":"#9f9f9fff","u16":[40931,40931,40931,65535]},"Midlight":{"hex":"#d8d8d8ff","u16":[55573,55573,55573,65535]},"Shadow":{"hex":"#2a2a2aff","u16":[10816,10816,10816,65535]}}},"Disabled":{"background":{"Active":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58339,58853,59367,65535]},"Link":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Negative":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Neutral":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Normal":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Positive":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Visited":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]}},"decoration":{"Focus":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Hover":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]}},"foreground":{"Active":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Inactive":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Link":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Negative":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Neutral":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Normal":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Positive":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Visited":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]}},"shade":{"Dark":{"hex":"#464646ff","u16":[18048,18048,18048,65535]},"Light":{"hex":"#fafafaff","u16":[64277,64277,64277,65535]},"Mid":{"hex":"#9f9f9fff","u16":[40931,40931,40931,65535]},"Midlight":{"hex":"#d8d8d8ff","u16":[55573,55573,55573,65535]},"Shadow":{"hex":"#2a2a2aff","u16":[10816,10816,10816,65535]}}},"Inactive":{"background":{"Active":{"hex":"#8fc9ecff","u16":[36692,51778,60566,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58339,58853,59367,65535]},"Link":{"hex":"#98c5e6ff","u16":[38948,50592,59122,65535]},"Negative":{"hex":"#e3b4b7ff","u16":[58317,46137,47125,65535]},"Neutral":{"hex":"#f6b386ff","u16":[63180,46046,34370,65535]},"Normal":{"hex":"#c8c8c8ff","u16":[51400,51400,51400,65535]},"Positive":{"hex":"#71d59cff","u16":[29144,54796,39975,65535]},"Visited":{"hex":"#ccb8d5ff","u16":[52449,47208,54864,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#010203ff","u16":[257,514,771,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#464646ff","u16":[18048,18048,18048,65535]},"Light":{"hex":"#fafafaff","u16":[64277,64277,64277,65535]},"Mid":{"hex":"#9f9f9fff","u16":[40931,40931,40931,65535]},"Midlight":{"hex":"#d8d8d8ff","u16":[55573,55573,55573,65535]},"Shadow":{"hex":"#2a2a2aff","u16":[10816,10816,10816,65535]}}}}},"sha256":"b9d9f11d67c015390ea379ed5cf717f876432fe5377aa951b2692c68916bb4cf","source_text":"[General]\nColorScheme=SyntheticMalformed\nName=Synthetic Malformed\n\n[KDE]\ncontrast=15\n\n[ColorEffects:Disabled]\nIntensityEffect=7\nIntensityAmount=0.4\nColorEffect=0\nContrastEffect=1\nContrastAmount=2.5\n\n[Colors:View]\nBackgroundNormal=#ff8800\nBackgroundAlternate=10,20,30,128\nForegroundNormal= 12 , 34 , 56 \nForegroundInactive=300,20\nForegroundActive=red\nForegroundLink=\nForegroundVisited=256,-1,1000\nForegroundPositive=0,100,0\nForegroundPositive=0,200,0\n\n[Colors:Window]\nBackgroundNormal=100,100,100\nForegroundNormal=1,2,3\n\n[Colors:Window]\nBackgroundNormal=200,200,200\n\n[Colors:Selection]\nBackgroundNormal=0,0,0\n"}, +{"contrastF":0.7000000000000001,"frameContrast":0.2,"input":{"ColorEffects:Inactive":{"ChangeSelectionColor":"off","Enable":""},"Colors:View":{"BackgroundAlternate":"#abc","BackgroundNormal":"+250,240,230","DecorationFocus":"#803daee9","ForegroundActive":"Red","ForegroundInactive":"#123456789abc","ForegroundLink":"grey","ForegroundNegative":"10,20,30,","ForegroundNeutral":"0x10,20,30","ForegroundNormal":"#123456789","ForegroundPositive":"transparent","ForegroundVisited":"rebeccapurple"},"Colors:Window":{"BackgroundNormal":"200,190,180"},"General":{"ColorScheme":"SyntheticValueForms","Name":"Synthetic Value Forms"}},"name":"SyntheticValueForms","origin":"synthetic","palette":{"Active":{"Accent":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"AlternateBase":{"hex":"#aabbccff","u16":[43690,48059,52428,65535]},"Base":{"hex":"#faf0e6ff","u16":[64250,61680,59110,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"ButtonText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Dark":{"hex":"#615c58ff","u16":[25011,23760,22510,65535]},"Highlight":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"HighlightedText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Light":{"hex":"#eae6e2ff","u16":[60012,59007,58046,65535]},"Link":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"LinkVisited":{"valid":false},"Mid":{"hex":"#a59d95ff","u16":[42502,40377,38252,65535]},"Midlight":{"hex":"#d4cbc3ff","u16":[54432,52252,50101,65535]},"PlaceholderText":{"hex":"#12569aff","u16":[4660,22136,39612,65535]},"Shadow":{"hex":"#3c3936ff","u16":[15322,14556,13790,65535]},"Text":{"hex":"#124578ff","u16":[4657,17764,30871,65535]},"ToolTipBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"ToolTipText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Window":{"hex":"#c8beb4ff","u16":[51400,48830,46260,65535]},"WindowText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]}},"Disabled":{"Accent":{"hex":"#bfb5acff","u16":[48996,46547,44097,65535]},"AlternateBase":{"hex":"#9fb3c6ff","u16":[40797,45925,50935,65535]},"Base":{"hex":"#f6e3d0ff","u16":[63220,58439,53409,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#f0f0f0ff","u16":[61735,61735,61735,65535]},"ButtonText":{"hex":"#a8a9aaff","u16":[43111,43390,43668,65535]},"Dark":{"hex":"#5d5853ff","u16":[23841,22649,21457,65535]},"Highlight":{"hex":"#bfb5acff","u16":[48996,46547,44097,65535]},"HighlightedText":{"hex":"#88827dff","u16":[34848,33514,32178,65535]},"Light":{"hex":"#e1dbd6ff","u16":[57767,56313,54905,65535]},"Link":{"hex":"#c6bfb8ff","u16":[50984,49158,47320,65535]},"LinkVisited":{"hex":"#9b958fff","u16":[39810,38217,36625,65535]},"Mid":{"hex":"#9e968fff","u16":[40692,38658,36623,65535]},"Midlight":{"hex":"#cdc2b8ff","u16":[52581,49963,47344,65535]},"PlaceholderText":{"hex":"#9eb2c6ff","u16":[40507,45717,50805,65535]},"Shadow":{"hex":"#3a3734ff","u16":[14913,14167,13422,65535]},"Text":{"hex":"#9facb9ff","u16":[40904,44209,47470,65535]},"ToolTipBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"ToolTipText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Window":{"hex":"#bfb5acff","u16":[48996,46547,44097,65535]},"WindowText":{"hex":"#88827dff","u16":[34848,33514,32178,65535]}},"Inactive":{"Accent":{"hex":"#00aff0ff","u16":[0,45047,61740,65535]},"AlternateBase":{"hex":"#9bbddcff","u16":[39872,48547,56423,65535]},"Base":{"hex":"#ffefdfff","u16":[65535,61450,57236,65535]},"BrightText":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Button":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"ButtonText":{"hex":"#343537ff","u16":[13414,13729,14039,65535]},"Dark":{"hex":"#655c52ff","u16":[25924,23591,21115,65535]},"Highlight":{"hex":"#00aff0ff","u16":[0,45047,61740,65535]},"HighlightedText":{"hex":"#f2faffff","u16":[62257,64220,65535,65535]},"Light":{"hex":"#ece5deff","u16":[60771,58875,57027,65535]},"Link":{"hex":"#8a847dff","u16":[35549,33906,32214,65535]},"LinkVisited":{"hex":"#292623ff","u16":[10494,9731,8930,65535]},"Mid":{"hex":"#ab9c8cff","u16":[44055,40090,35883,65535]},"Midlight":{"hex":"#dacabaff","u16":[56041,51960,47744,65535]},"PlaceholderText":{"hex":"#356082ff","u16":[13566,24734,33448,65535]},"Shadow":{"hex":"#3e3832ff","u16":[15881,14452,12935,65535]},"Text":{"hex":"#354f65ff","u16":[13694,20399,26017,65535]},"ToolTipBase":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"ToolTipText":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Window":{"hex":"#cfbda9ff","u16":[53278,48483,43395,65535]},"WindowText":{"hex":"#322f2dff","u16":[12773,12144,11495,65535]}}},"purpose":"more value forms: an empty boolean (Inactive effects Enable=), a signed component, the 3-, 9- and 12-digit hex forms, colour names in other cases, transparent, a trailing comma, a hex component and an unknown CSS name","set_supported":{"Button":false,"Complementary":false,"Header":false,"Selection":false,"Tooltip":false,"View":true,"Window":true},"sets":{"Button":{"Active":{"background":{"Active":{"hex":"#e8f3fbff","u16":[59585,62560,64614,65535]},"Alternate":{"hex":"#a3d4faff","u16":[41891,54484,64250,65535]},"Link":{"hex":"#e4eef7ff","u16":[58702,61204,63367,65535]},"Negative":{"hex":"#f9e9eaff","u16":[64094,59877,60196,65535]},"Neutral":{"hex":"#fdeee5ff","u16":[65131,61115,58894,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#d4fae2ff","u16":[54552,64146,58102,65535]},"Visited":{"hex":"#f1e9f4ff","u16":[61816,59985,62701,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#b9b9b9ff","u16":[47575,47575,47575,65535]},"Light":{"hex":"#d2d2d2ff","u16":[54043,54043,54043,65535]},"Mid":{"hex":"#d2d2d2ff","u16":[54043,54043,54043,65535]},"Midlight":{"hex":"#e8e8e8ff","u16":[59693,59693,59693,65535]},"Shadow":{"hex":"#868686ff","u16":[34535,34535,34535,65535]}}},"Disabled":{"background":{"Active":{"hex":"#d8edf7ff","u16":[55550,60800,63569,65535]},"Alternate":{"hex":"#8cccf9ff","u16":[36095,52366,64033,65535]},"Link":{"hex":"#dfeaf2ff","u16":[57339,60254,62215,65535]},"Negative":{"hex":"#f7e4e6ff","u16":[63468,58657,59124,65535]},"Neutral":{"hex":"#fae6d4ff","u16":[64273,59033,54466,65535]},"Normal":{"hex":"#f0f0f0ff","u16":[61735,61735,61735,65535]},"Positive":{"hex":"#d9eee2ff","u16":[55792,61232,58043,65535]},"Visited":{"hex":"#eee6f2ff","u16":[61262,59074,62174,65535]}},"decoration":{"Focus":{"hex":"#a2d8f3ff","u16":[41654,55609,62421,65535]},"Hover":{"hex":"#c3e3f1ff","u16":[49996,58299,61922,65535]}},"foreground":{"Active":{"hex":"#a2d8f3ff","u16":[41654,55609,62421,65535]},"Inactive":{"hex":"#c0c6ccff","u16":[49437,50892,52336,65535]},"Link":{"hex":"#a2c8e0ff","u16":[41595,51411,57571,65535]},"Negative":{"hex":"#eeafb6ff","u16":[61133,45056,46720,65535]},"Neutral":{"hex":"#f9c088ff","u16":[63954,49376,34973,65535]},"Normal":{"hex":"#a8a9aaff","u16":[43111,43390,43668,65535]},"Positive":{"hex":"#a9d6bcff","u16":[43472,55048,48360,65535]},"Visited":{"hex":"#d4b8dfff","u16":[54420,47217,57302,65535]}},"shade":{"Dark":{"hex":"#757575ff","u16":[30039,30039,30039,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#c1c1c1ff","u16":[49575,49575,49575,65535]},"Midlight":{"hex":"#fafafaff","u16":[64224,64224,64224,65535]},"Shadow":{"hex":"#3d3d3dff","u16":[15611,15611,15611,65535]}}},"Inactive":{"background":{"Active":{"hex":"#e3f5fcff","u16":[58341,63009,64822,65535]},"Alternate":{"hex":"#9cd5ffff","u16":[40208,54680,65535,65535]},"Link":{"hex":"#e5eff6ff","u16":[58751,61508,63159,65535]},"Negative":{"hex":"#ffe8edff","u16":[65421,59691,60919,65535]},"Neutral":{"hex":"#fcefe0ff","u16":[64758,61502,57680,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#d2fae7ff","u16":[54011,64324,59265,65535]},"Visited":{"hex":"#f6e8fbff","u16":[63221,59722,64413,65535]}},"decoration":{"Focus":{"hex":"#00b6e6ff","u16":[0,46845,59198,65535]},"Hover":{"hex":"#5dd9ffff","u16":[23837,55708,65535,65535]}},"foreground":{"Active":{"hex":"#00b6e6ff","u16":[0,46845,59198,65535]},"Inactive":{"hex":"#76828eff","u16":[30379,33503,36442,65535]},"Link":{"hex":"#3a87adff","u16":[14823,34774,44470,65535]},"Negative":{"hex":"#fe0050ff","u16":[65159,0,20458,65535]},"Neutral":{"hex":"#dc8c00ff","u16":[56474,36005,0,65535]},"Normal":{"hex":"#343537ff","u16":[13414,13729,14039,65535]},"Positive":{"hex":"#20b373ff","u16":[8261,45937,29571,65535]},"Visited":{"hex":"#c039e3ff","u16":[49258,14648,58229,65535]}},"shade":{"Dark":{"hex":"#b9b9b9ff","u16":[47575,47575,47575,65535]},"Light":{"hex":"#d2d2d2ff","u16":[54043,54043,54043,65535]},"Mid":{"hex":"#d2d2d2ff","u16":[54043,54043,54043,65535]},"Midlight":{"hex":"#e8e8e8ff","u16":[59693,59693,59693,65535]},"Shadow":{"hex":"#868686ff","u16":[34535,34535,34535,65535]}}}},"Complementary":{"Active":{"background":{"Active":{"hex":"#1c3c4dff","u16":[7084,15330,19761,65535]},"Alternate":{"hex":"#1b1e20ff","u16":[6939,7710,8224,65535]},"Link":{"hex":"#143955ff","u16":[5076,14725,21803,65535]},"Negative":{"hex":"#57242bff","u16":[22290,9359,10973,65535]},"Neutral":{"hex":"#532e0dff","u16":[21296,11822,3397,65535]},"Normal":{"hex":"#2a2e32ff","u16":[10794,11822,12850,65535]},"Positive":{"hex":"#163e29ff","u16":[5742,16007,10505,65535]},"Visited":{"hex":"#412c4dff","u16":[16787,11259,19761,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#a1a9b1ff","u16":[41377,43433,45489,65535]},"Link":{"hex":"#1d99f3ff","u16":[7453,39321,62451,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#fcfcfcff","u16":[64764,64764,64764,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#141618ff","u16":[5252,5752,6253,65535]},"Light":{"hex":"#474d54ff","u16":[18170,19901,21631,65535]},"Mid":{"hex":"#24282bff","u16":[9291,10176,11061,65535]},"Midlight":{"hex":"#3a4045ff","u16":[14977,16403,17829,65535]},"Shadow":{"hex":"#0f1012ff","u16":[3809,4172,4535,65535]}}},"Disabled":{"background":{"Active":{"hex":"#20333dff","u16":[8232,13011,15777,65535]},"Alternate":{"hex":"#1a1d1fff","u16":[6615,7349,7839,65535]},"Link":{"hex":"#1c3242ff","u16":[7317,12882,17081,65535]},"Negative":{"hex":"#42282eff","u16":[16927,10389,11726,65535]},"Neutral":{"hex":"#3e2c1cff","u16":[16044,11402,7322,65535]},"Normal":{"hex":"#282c30ff","u16":[10289,11269,12249,65535]},"Positive":{"hex":"#1e352bff","u16":[7632,13521,11035,65535]},"Visited":{"hex":"#352c3fff","u16":[13699,11243,16190,65535]}},"decoration":{"Focus":{"hex":"#2e576dff","u16":[11918,22245,27940,65535]},"Hover":{"hex":"#4b616dff","u16":[19293,24988,27940,65535]}},"foreground":{"Active":{"hex":"#2e576dff","u16":[11918,22245,27940,65535]},"Inactive":{"hex":"#50555aff","u16":[20493,21816,23139,65535]},"Link":{"hex":"#245070ff","u16":[9175,20444,28797,65535]},"Negative":{"hex":"#63333bff","u16":[25380,13156,15078,65535]},"Neutral":{"hex":"#6c431fff","u16":[27781,17272,7962,65535]},"Normal":{"hex":"#6e7173ff","u16":[28296,28933,29569,65535]},"Positive":{"hex":"#27573fff","u16":[10032,22245,16194,65535]},"Visited":{"hex":"#4e3a5cff","u16":[19978,14956,23567,65535]}},"shade":{"Dark":{"hex":"#131517ff","u16":[5006,5483,5960,65535]},"Light":{"hex":"#454c52ff","u16":[17791,19485,21180,65535]},"Mid":{"hex":"#222629ff","u16":[8858,9702,10546,65535]},"Midlight":{"hex":"#393e44ff","u16":[14575,15963,17351,65535]},"Shadow":{"hex":"#0e0f11ff","u16":[3633,3979,4325,65535]}}},"Inactive":{"background":{"Active":{"hex":"#0a3c4eff","u16":[2599,15367,19971,65535]},"Alternate":{"hex":"#181e22ff","u16":[6279,7813,8746,65535]},"Link":{"hex":"#0a3a52ff","u16":[2690,14783,21073,65535]},"Negative":{"hex":"#61182dff","u16":[24882,6143,11455,65535]},"Neutral":{"hex":"#4b310eff","u16":[19371,12604,3707,65535]},"Normal":{"hex":"#272e36ff","u16":[9901,11938,13794,65535]},"Positive":{"hex":"#0a3e2dff","u16":[2662,15936,11640,65535]},"Visited":{"hex":"#422954ff","u16":[17036,10580,21661,65535]}},"decoration":{"Focus":{"hex":"#00a7dfff","u16":[0,42903,57343,65535]},"Hover":{"hex":"#60c5edff","u16":[24628,50520,60803,65535]}},"foreground":{"Active":{"hex":"#00a7dfff","u16":[0,42903,57343,65535]},"Inactive":{"hex":"#8fa1b2ff","u16":[36789,41455,45844,65535]},"Link":{"hex":"#0094deff","u16":[0,38084,57174,65535]},"Negative":{"hex":"#e61c4eff","u16":[59015,7314,20110,65535]},"Neutral":{"hex":"#d97a00ff","u16":[55760,31353,0,65535]},"Normal":{"hex":"#e2e4e6ff","u16":[58036,58559,59093,65535]},"Positive":{"hex":"#00a667ff","u16":[0,42664,26590,65535]},"Visited":{"hex":"#9b4ec1ff","u16":[39783,19975,49600,65535]}},"shade":{"Dark":{"hex":"#13171aff","u16":[4818,5809,6712,65535]},"Light":{"hex":"#414e5aff","u16":[16667,20096,23220,65535]},"Mid":{"hex":"#21282eff","u16":[8523,10276,11874,65535]},"Midlight":{"hex":"#35404aff","u16":[13737,16564,19139,65535]},"Shadow":{"hex":"#0e1013ff","u16":[3494,4213,4868,65535]}}}},"Header":{"Active":{"background":{"Active":{"hex":"#78c3eaff","u16":[30928,50157,60086,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#88bee2ff","u16":[34959,48892,58027,65535]},"Negative":{"hex":"#e1aaacff","u16":[57701,43666,44286,65535]},"Neutral":{"hex":"#f7a86fff","u16":[63573,43095,28453,65535]},"Normal":{"hex":"#c8beb4ff","u16":[51400,48830,46260,65535]},"Positive":{"hex":"#6dcd8fff","u16":[28078,52627,36812,65535]},"Visited":{"hex":"#c8afcdff","u16":[51300,44976,52731,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#615c58ff","u16":[25011,23760,22510,65535]},"Light":{"hex":"#eae6e2ff","u16":[60012,59007,58046,65535]},"Mid":{"hex":"#a59d95ff","u16":[42502,40377,38252,65535]},"Midlight":{"hex":"#d4cbc3ff","u16":[54432,52252,50101,65535]},"Shadow":{"hex":"#3c3936ff","u16":[15322,14556,13790,65535]}}},"Disabled":{"background":{"Active":{"hex":"#9db6bfff","u16":[40277,46683,49169,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Link":{"hex":"#a5b3baff","u16":[42401,46109,47855,65535]},"Negative":{"hex":"#cfa8a5ff","u16":[53190,43151,42377,65535]},"Neutral":{"hex":"#d4aa83ff","u16":[54406,43586,33729,65535]},"Normal":{"hex":"#bfb5acff","u16":[48996,46547,44097,65535]},"Positive":{"hex":"#9cb99dff","u16":[40082,47525,40275,65535]},"Visited":{"hex":"#c0abb9ff","u16":[49430,43977,47646,65535]}},"decoration":{"Focus":{"hex":"#90b0bdff","u16":[37078,45175,48641,65535]},"Hover":{"hex":"#adbabdff","u16":[44452,47918,48641,65535]}},"foreground":{"Active":{"hex":"#90b0bdff","u16":[37078,45175,48641,65535]},"Inactive":{"hex":"#a19f9eff","u16":[41451,40973,40495,65535]},"Link":{"hex":"#8aa0adff","u16":[35363,41230,44526,65535]},"Negative":{"hex":"#cb8a88ff","u16":[52176,35408,35040,65535]},"Neutral":{"hex":"#ce9c70ff","u16":[52941,40202,28663,65535]},"Normal":{"hex":"#88827dff","u16":[34848,33514,32178,65535]},"Positive":{"hex":"#89b090ff","u16":[35192,45175,36894,65535]},"Visited":{"hex":"#b392afff","u16":[45975,37487,44971,65535]}},"shade":{"Dark":{"hex":"#5d5853ff","u16":[23841,22649,21457,65535]},"Light":{"hex":"#e1dbd6ff","u16":[57767,56313,54905,65535]},"Mid":{"hex":"#9e968fff","u16":[40692,38658,36623,65535]},"Midlight":{"hex":"#cdc2b8ff","u16":[52581,49963,47344,65535]},"Shadow":{"hex":"#3a3734ff","u16":[14913,14167,13422,65535]}}},"Inactive":{"background":{"Active":{"hex":"#90c2d0ff","u16":[36953,49846,53514,65535]},"Alternate":{"hex":"#eef0f2ff","u16":[61223,61712,62199,65535]},"Link":{"hex":"#91bfcfff","u16":[37140,49092,53310,65535]},"Negative":{"hex":"#eda6a6ff","u16":[60927,42537,42661,65535]},"Neutral":{"hex":"#f0ae3fff","u16":[61578,44611,16261,65535]},"Normal":{"hex":"#cfbda9ff","u16":[53278,48483,43395,65535]},"Positive":{"hex":"#82ca8dff","u16":[33284,51902,36153,65535]},"Visited":{"hex":"#ccafc6ff","u16":[52551,44871,50873,65535]}},"decoration":{"Focus":{"hex":"#67b1ccff","u16":[26530,45435,52350,65535]},"Hover":{"hex":"#c2c3bbff","u16":[49844,50177,48043,65535]}},"foreground":{"Active":{"hex":"#67b1ccff","u16":[26530,45435,52350,65535]},"Inactive":{"hex":"#7d7f82ff","u16":[32032,32716,33393,65535]},"Link":{"hex":"#3e85a7ff","u16":[15814,34265,42846,65535]},"Negative":{"hex":"#f42a39ff","u16":[62647,10752,14713,65535]},"Neutral":{"hex":"#da8b00ff","u16":[56057,35621,0,65535]},"Normal":{"hex":"#322f2dff","u16":[12773,12144,11495,65535]},"Positive":{"hex":"#44af67ff","u16":[17432,45070,26418,65535]},"Visited":{"hex":"#a55cacff","u16":[42446,23757,44121,65535]}},"shade":{"Dark":{"hex":"#655c52ff","u16":[25924,23591,21115,65535]},"Light":{"hex":"#ece5deff","u16":[60771,58875,57027,65535]},"Mid":{"hex":"#ab9c8cff","u16":[44055,40090,35883,65535]},"Midlight":{"hex":"#dacabaff","u16":[56041,51960,47744,65535]},"Shadow":{"hex":"#3e3832ff","u16":[15881,14452,12935,65535]}}}},"Selection":{"Active":{"background":{"Active":{"hex":"#5ab7dcff","u16":[23235,46907,56572,65535]},"Alternate":{"hex":"#a3d4faff","u16":[41891,54484,64250,65535]},"Link":{"hex":"#b3ab74ff","u16":[46003,43823,29737,65535]},"Negative":{"hex":"#aa96b0ff","u16":[43694,38429,45353,65535]},"Neutral":{"hex":"#b29b74ff","u16":[45660,39812,29747,65535]},"Normal":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Positive":{"hex":"#32ada4ff","u16":[12736,44427,42135,65535]},"Visited":{"hex":"#9799d3ff","u16":[38815,39221,54248,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#fdbc4bff","u16":[65021,48316,19275,65535]},"Negative":{"hex":"#b03745ff","u16":[45232,14135,17733,65535]},"Neutral":{"hex":"#c65c00ff","u16":[50886,23644,0,65535]},"Normal":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Positive":{"hex":"#176839ff","u16":[5911,26728,14649,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#1e5571ff","u16":[7628,21759,29137,65535]},"Light":{"hex":"#92cef9ff","u16":[37530,52828,64075,65535]},"Mid":{"hex":"#3392c3ff","u16":[13128,37447,50145,65535]},"Midlight":{"hex":"#52bcf8ff","u16":[21175,48262,63634,65535]},"Shadow":{"hex":"#13374aff","u16":[4954,14132,18924,65535]}}},"Disabled":{"background":{"Active":{"hex":"#9db6bfff","u16":[40277,46683,49169,65535]},"Alternate":{"hex":"#d8daddff","u16":[55389,56136,56880,65535]},"Link":{"hex":"#a5b3baff","u16":[42401,46109,47855,65535]},"Negative":{"hex":"#cfa8a5ff","u16":[53190,43151,42377,65535]},"Neutral":{"hex":"#d4aa83ff","u16":[54406,43586,33729,65535]},"Normal":{"hex":"#bfb5acff","u16":[48996,46547,44097,65535]},"Positive":{"hex":"#9cb99dff","u16":[40082,47525,40275,65535]},"Visited":{"hex":"#c0abb9ff","u16":[49430,43977,47646,65535]}},"decoration":{"Focus":{"hex":"#90b0bdff","u16":[37078,45175,48641,65535]},"Hover":{"hex":"#adbabdff","u16":[44452,47918,48641,65535]}},"foreground":{"Active":{"hex":"#90b0bdff","u16":[37078,45175,48641,65535]},"Inactive":{"hex":"#a19f9eff","u16":[41451,40973,40495,65535]},"Link":{"hex":"#8aa0adff","u16":[35363,41230,44526,65535]},"Negative":{"hex":"#cb8a88ff","u16":[52176,35408,35040,65535]},"Neutral":{"hex":"#ce9c70ff","u16":[52941,40202,28663,65535]},"Normal":{"hex":"#88827dff","u16":[34848,33514,32178,65535]},"Positive":{"hex":"#89b090ff","u16":[35192,45175,36894,65535]},"Visited":{"hex":"#b392afff","u16":[45975,37487,44971,65535]}},"shade":{"Dark":{"hex":"#5d5853ff","u16":[23841,22649,21457,65535]},"Light":{"hex":"#e1dbd6ff","u16":[57767,56313,54905,65535]},"Mid":{"hex":"#9e968fff","u16":[40692,38658,36623,65535]},"Midlight":{"hex":"#cdc2b8ff","u16":[52581,49963,47344,65535]},"Shadow":{"hex":"#3a3734ff","u16":[14913,14167,13422,65535]}}},"Inactive":{"background":{"Active":{"hex":"#47b8dcff","u16":[18304,47384,56431,65535]},"Alternate":{"hex":"#9cd5ffff","u16":[40208,54680,65535,65535]},"Link":{"hex":"#50b9b7ff","u16":[20567,47559,47046,65535]},"Negative":{"hex":"#50a1f4ff","u16":[20583,41345,62581,65535]},"Neutral":{"hex":"#3dabc5ff","u16":[15688,44019,50751,65535]},"Normal":{"hex":"#00aff0ff","u16":[0,45047,61740,65535]},"Positive":{"hex":"#00aacdff","u16":[0,43766,52591,65535]},"Visited":{"hex":"#52a0ffff","u16":[20971,41173,65535,65535]}},"decoration":{"Focus":{"hex":"#00aff0ff","u16":[0,45047,61740,65535]},"Hover":{"hex":"#6ccdffff","u16":[27638,52703,65535,65535]}},"foreground":{"Active":{"hex":"#f2faffff","u16":[62257,64220,65535,65535]},"Inactive":{"hex":"#0088b5ff","u16":[0,34932,46497,65535]},"Link":{"hex":"#80d4b1ff","u16":[32978,54498,45610,65535]},"Negative":{"hex":"#5361aaff","u16":[21354,24801,43671,65535]},"Neutral":{"hex":"#528686ff","u16":[21046,34421,34324,65535]},"Normal":{"hex":"#f2faffff","u16":[62257,64220,65535,65535]},"Positive":{"hex":"#00696cff","u16":[0,26957,27776,65535]},"Visited":{"hex":"#0074eaff","u16":[0,29814,60169,65535]}},"shade":{"Dark":{"hex":"#005575ff","u16":[0,21919,30042,65535]},"Light":{"hex":"#89ceffff","u16":[35335,53057,65535,65535]},"Mid":{"hex":"#0093c9ff","u16":[0,37723,51702,65535]},"Midlight":{"hex":"#38bdffff","u16":[14467,48592,65535,65535]},"Shadow":{"hex":"#00374cff","u16":[0,14236,19512,65535]}}}},"Tooltip":{"Active":{"background":{"Active":{"hex":"#e0effaff","u16":[57630,61532,64195,65535]},"Alternate":{"hex":"#eff0f1ff","u16":[61423,61680,61937,65535]},"Link":{"hex":"#deeaf5ff","u16":[57046,60196,62891,65535]},"Negative":{"hex":"#f8e4e5ff","u16":[63672,58581,58970,65535]},"Neutral":{"hex":"#fce9ddff","u16":[64875,59755,56885,65535]},"Normal":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Positive":{"hex":"#c5f8d8ff","u16":[50674,63750,55628,65535]},"Visited":{"hex":"#ede5f1ff","u16":[60978,58784,62034,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#b2b2b2ff","u16":[45692,45692,45692,65535]},"Light":{"hex":"#ccccccff","u16":[52436,52436,52436,65535]},"Mid":{"hex":"#ccccccff","u16":[52436,52436,52436,65535]},"Midlight":{"hex":"#e3e3e3ff","u16":[58272,58272,58272,65535]},"Shadow":{"hex":"#7b7b7bff","u16":[31695,31695,31695,65535]}}},"Disabled":{"background":{"Active":{"hex":"#d2e8f4ff","u16":[53968,59692,62698,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58364,58826,59286,65535]},"Link":{"hex":"#dae6eeff","u16":[55898,59123,61286,65535]},"Negative":{"hex":"#f4dfe1ff","u16":[62678,57357,57876,65535]},"Neutral":{"hex":"#f7e1cdff","u16":[63504,57761,52725,65535]},"Normal":{"hex":"#ebebebff","u16":[60511,60511,60511,65535]},"Positive":{"hex":"#d0ebdbff","u16":[53508,60379,56375,65535]},"Visited":{"hex":"#eae1eeff","u16":[60238,57818,61243,65535]}},"decoration":{"Focus":{"hex":"#a0d5efff","u16":[41134,54770,61453,65535]},"Hover":{"hex":"#c1e0edff","u16":[49531,57442,60912,65535]}},"foreground":{"Active":{"hex":"#a0d5efff","u16":[41134,54770,61453,65535]},"Inactive":{"hex":"#bdc3c8ff","u16":[48657,50093,51518,65535]},"Link":{"hex":"#9fc5ddff","u16":[40903,50598,56692,65535]},"Negative":{"hex":"#eaacb3ff","u16":[60222,44302,45948,65535]},"Neutral":{"hex":"#f5bd86ff","u16":[62984,48622,34500,65535]},"Normal":{"hex":"#a5a6a7ff","u16":[42332,42590,42849,65535]},"Positive":{"hex":"#a6d3b9ff","u16":[42675,54252,47564,65535]},"Visited":{"hex":"#d0b5dcff","u16":[53574,46448,56425,65535]}},"shade":{"Dark":{"hex":"#737373ff","u16":[29444,29444,29444,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#bebebeff","u16":[48753,48753,48753,65535]},"Midlight":{"hex":"#f6f6f6ff","u16":[63124,63124,63124,65535]},"Shadow":{"hex":"#3d3d3dff","u16":[15630,15630,15630,65535]}}},"Inactive":{"background":{"Active":{"hex":"#d9f2fbff","u16":[55650,62136,64606,65535]},"Alternate":{"hex":"#eef0f2ff","u16":[61223,61712,62199,65535]},"Link":{"hex":"#deebf4ff","u16":[56958,60518,62623,65535]},"Negative":{"hex":"#fee3e9ff","u16":[65251,58252,59763,65535]},"Neutral":{"hex":"#fbead6ff","u16":[64538,60186,54973,65535]},"Normal":{"hex":"#f7f7f7ff","u16":[63479,63479,63479,65535]},"Positive":{"hex":"#c1f9deff","u16":[49630,63986,57116,65535]},"Visited":{"hex":"#f3e3f9ff","u16":[62507,58410,63910,65535]}},"decoration":{"Focus":{"hex":"#00b6e6ff","u16":[0,46811,59158,65535]},"Hover":{"hex":"#5fd8feff","u16":[24475,55628,65328,65535]}},"foreground":{"Active":{"hex":"#00b6e6ff","u16":[0,46811,59158,65535]},"Inactive":{"hex":"#76828dff","u16":[30450,33447,36278,65535]},"Link":{"hex":"#3987adff","u16":[14573,34741,44499,65535]},"Negative":{"hex":"#fd004fff","u16":[65086,0,20424,65535]},"Neutral":{"hex":"#dc8c00ff","u16":[56439,35968,0,65535]},"Normal":{"hex":"#343536ff","u16":[13282,13599,13911,65535]},"Positive":{"hex":"#1fb373ff","u16":[7991,45914,29515,65535]},"Visited":{"hex":"#bd3de0ff","u16":[48682,15602,57452,65535]}},"shade":{"Dark":{"hex":"#b2b2b2ff","u16":[45692,45692,45692,65535]},"Light":{"hex":"#ccccccff","u16":[52436,52436,52436,65535]},"Mid":{"hex":"#ccccccff","u16":[52436,52436,52436,65535]},"Midlight":{"hex":"#e3e3e3ff","u16":[58272,58272,58272,65535]},"Shadow":{"hex":"#7b7b7bff","u16":[31695,31695,31695,65535]}}}},"View":{"Active":{"background":{"Active":{"hex":"#fedddcff","u16":[65374,56718,56599,65535]},"Alternate":{"hex":"#aabbccff","u16":[43690,48059,52428,65535]},"Link":{"hex":"#e6e4e3ff","u16":[59132,58674,58224,65535]},"Negative":{"hex":"#f7dedfff","u16":[63418,57074,57345,65535]},"Neutral":{"hex":"#fce2d4ff","u16":[64832,58169,54463,65535]},"Normal":{"hex":"#faf0e6ff","u16":[64250,61680,59110,65535]},"Positive":{"hex":"#faf0e600","u16":[64250,61680,59110,5]},"Visited":{"hex":"#cbc3bbff","u16":[52175,50088,47999,65535]}},"decoration":{"Focus":{"hex":"#3daee980","u16":[15677,44718,59881,32896]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#ff0000ff","u16":[65535,0,0,65535]},"Inactive":{"hex":"#12569aff","u16":[4660,22136,39612,65535]},"Link":{"hex":"#808080ff","u16":[32896,32896,32896,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#124578ff","u16":[4657,17764,30871,65535]},"Positive":{"hex":"#00000000","u16":[0,0,0,0]},"Visited":{"valid":false}},"shade":{"Dark":{"hex":"#8d714bff","u16":[36163,29047,19385,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#e8ba7cff","u16":[59628,47895,31964,65535]},"Midlight":{"hex":"#fefbf8ff","u16":[65151,64404,63683,65535]},"Shadow":{"hex":"#493a27ff","u16":[18684,15007,10015,65535]}}},"Disabled":{"background":{"Active":{"hex":"#fcd6d1ff","u16":[64744,54950,53627,65535]},"Alternate":{"hex":"#9fb3c6ff","u16":[40797,45925,50935,65535]},"Link":{"hex":"#e5ded8ff","u16":[58762,57117,55470,65535]},"Negative":{"hex":"#f6d8d5ff","u16":[63164,55640,54641,65535]},"Neutral":{"hex":"#fadabeff","u16":[64155,56019,48819,65535]},"Normal":{"hex":"#f6e3d0ff","u16":[63220,58439,53409,65535]},"Positive":{"hex":"#f6e3d0a6","u16":[63220,58439,53409,42600]},"Visited":{"hex":"#e2dcd5ff","u16":[58147,56480,54823,65535]}},"decoration":{"Focus":{"hex":"#c2d9dfd3","u16":[49909,55668,57294,54111]},"Hover":{"hex":"#c7dbdfff","u16":[51039,56187,57237,65535]}},"foreground":{"Active":{"hex":"#fb8f87ff","u16":[64625,36758,34723,65535]},"Inactive":{"hex":"#9eb2c6ff","u16":[40507,45717,50805,65535]},"Link":{"hex":"#c6bfb8ff","u16":[50984,49158,47320,65535]},"Negative":{"hex":"#eda8a6ff","u16":[60843,43134,42741,65535]},"Neutral":{"hex":"#f8b979ff","u16":[63609,47433,31011,65535]},"Normal":{"hex":"#9facb9ff","u16":[40904,44209,47470,65535]},"Positive":{"hex":"#f6e3d0a6","u16":[63220,58439,53409,42598]},"Visited":{"hex":"#9b958fff","u16":[39810,38217,36625,65535]}},"shade":{"Dark":{"hex":"#866c48ff","u16":[34473,27688,18477,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#dfb377ff","u16":[57283,46009,30704,65535]},"Midlight":{"hex":"#faefe5ff","u16":[64192,61500,58801,65535]},"Shadow":{"hex":"#493a27ff","u16":[18705,15023,10025,65535]}}},"Inactive":{"background":{"Active":{"hex":"#ffdedaff","u16":[65535,56964,55956,65535]},"Alternate":{"hex":"#9bbddcff","u16":[39872,48547,56423,65535]},"Link":{"hex":"#e9e5e0ff","u16":[59897,58726,57574,65535]},"Negative":{"hex":"#ffdcdfff","u16":[65523,56595,57394,65535]},"Neutral":{"hex":"#fbe4cbff","u16":[64527,58611,52164,65535]},"Normal":{"hex":"#ffefdfff","u16":[65535,61450,57236,65535]},"Positive":{"hex":"#e0caa273","u16":[57489,51807,41733,29623]},"Visited":{"hex":"#d6cabfff","u16":[54974,52015,48996,65535]}},"decoration":{"Focus":{"hex":"#4ab5d5bb","u16":[19063,46465,54708,48044]},"Hover":{"hex":"#90d4e5ff","u16":[37000,54488,58923,65535]}},"foreground":{"Active":{"hex":"#ff300fff","u16":[65535,12463,3770,65535]},"Inactive":{"hex":"#356082ff","u16":[13566,24734,33448,65535]},"Link":{"hex":"#8a847dff","u16":[35549,33906,32214,65535]},"Negative":{"hex":"#ff0032ff","u16":[65470,0,12974,65535]},"Neutral":{"hex":"#dc8b00ff","u16":[56656,35785,0,65535]},"Normal":{"hex":"#354f65ff","u16":[13694,20399,26017,65535]},"Positive":{"hex":"#3224004c","u16":[12773,9215,0,19415]},"Visited":{"hex":"#292623ff","u16":[10494,9731,8930,65535]}},"shade":{"Dark":{"hex":"#996e00ff","u16":[39262,28323,0,65535]},"Light":{"hex":"#ffffffff","u16":[65535,65535,65535,65535]},"Mid":{"hex":"#fcb600ff","u16":[64738,46702,0,65535]},"Midlight":{"hex":"#fffaf6ff","u16":[65535,64338,63175,65535]},"Shadow":{"hex":"#4f3900ff","u16":[20285,14633,0,65535]}}}},"Window":{"Active":{"background":{"Active":{"hex":"#78c3eaff","u16":[30928,50157,60086,65535]},"Alternate":{"hex":"#e3e5e7ff","u16":[58339,58853,59367,65535]},"Link":{"hex":"#88bee2ff","u16":[34959,48892,58027,65535]},"Negative":{"hex":"#e1aaacff","u16":[57701,43666,44286,65535]},"Neutral":{"hex":"#f7a86fff","u16":[63573,43095,28453,65535]},"Normal":{"hex":"#c8beb4ff","u16":[51400,48830,46260,65535]},"Positive":{"hex":"#6dcd8fff","u16":[28078,52627,36812,65535]},"Visited":{"hex":"#c8afcdff","u16":[51300,44976,52731,65535]}},"decoration":{"Focus":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Hover":{"hex":"#93cee9ff","u16":[37779,52942,59881,65535]}},"foreground":{"Active":{"hex":"#3daee9ff","u16":[15677,44718,59881,65535]},"Inactive":{"hex":"#707d8aff","u16":[28784,32125,35466,65535]},"Link":{"hex":"#2980b9ff","u16":[10537,32896,47545,65535]},"Negative":{"hex":"#da4453ff","u16":[56026,17476,21331,65535]},"Neutral":{"hex":"#f67400ff","u16":[63222,29812,0,65535]},"Normal":{"hex":"#232629ff","u16":[8995,9766,10537,65535]},"Positive":{"hex":"#27ae60ff","u16":[10023,44718,24672,65535]},"Visited":{"hex":"#9b59b6ff","u16":[39835,22873,46774,65535]}},"shade":{"Dark":{"hex":"#615c58ff","u16":[25011,23760,22510,65535]},"Light":{"hex":"#eae6e2ff","u16":[60012,59007,58046,65535]},"Mid":{"hex":"#a59d95ff","u16":[42502,40377,38252,65535]},"Midlight":{"hex":"#d4cbc3ff","u16":[54432,52252,50101,65535]},"Shadow":{"hex":"#3c3936ff","u16":[15322,14556,13790,65535]}}},"Disabled":{"background":{"Active":{"hex":"#9db6bfff","u16":[40277,46683,49169,65535]},"Alternate":{"hex":"#d8daddff","u16":[55389,56136,56880,65535]},"Link":{"hex":"#a5b3baff","u16":[42401,46109,47855,65535]},"Negative":{"hex":"#cfa8a5ff","u16":[53190,43151,42377,65535]},"Neutral":{"hex":"#d4aa83ff","u16":[54406,43586,33729,65535]},"Normal":{"hex":"#bfb5acff","u16":[48996,46547,44097,65535]},"Positive":{"hex":"#9cb99dff","u16":[40082,47525,40275,65535]},"Visited":{"hex":"#c0abb9ff","u16":[49430,43977,47646,65535]}},"decoration":{"Focus":{"hex":"#90b0bdff","u16":[37078,45175,48641,65535]},"Hover":{"hex":"#adbabdff","u16":[44452,47918,48641,65535]}},"foreground":{"Active":{"hex":"#90b0bdff","u16":[37078,45175,48641,65535]},"Inactive":{"hex":"#a19f9eff","u16":[41451,40973,40495,65535]},"Link":{"hex":"#8aa0adff","u16":[35363,41230,44526,65535]},"Negative":{"hex":"#cb8a88ff","u16":[52176,35408,35040,65535]},"Neutral":{"hex":"#ce9c70ff","u16":[52941,40202,28663,65535]},"Normal":{"hex":"#88827dff","u16":[34848,33514,32178,65535]},"Positive":{"hex":"#89b090ff","u16":[35192,45175,36894,65535]},"Visited":{"hex":"#b392afff","u16":[45975,37487,44971,65535]}},"shade":{"Dark":{"hex":"#5d5853ff","u16":[23841,22649,21457,65535]},"Light":{"hex":"#e1dbd6ff","u16":[57767,56313,54905,65535]},"Mid":{"hex":"#9e968fff","u16":[40692,38658,36623,65535]},"Midlight":{"hex":"#cdc2b8ff","u16":[52581,49963,47344,65535]},"Shadow":{"hex":"#3a3734ff","u16":[14913,14167,13422,65535]}}},"Inactive":{"background":{"Active":{"hex":"#90c2d0ff","u16":[36953,49846,53514,65535]},"Alternate":{"hex":"#e1e5e9ff","u16":[57937,58917,59888,65535]},"Link":{"hex":"#91bfcfff","u16":[37140,49092,53310,65535]},"Negative":{"hex":"#eda6a6ff","u16":[60927,42537,42661,65535]},"Neutral":{"hex":"#f0ae3fff","u16":[61578,44611,16261,65535]},"Normal":{"hex":"#cfbda9ff","u16":[53278,48483,43395,65535]},"Positive":{"hex":"#82ca8dff","u16":[33284,51902,36153,65535]},"Visited":{"hex":"#ccafc6ff","u16":[52551,44871,50873,65535]}},"decoration":{"Focus":{"hex":"#67b1ccff","u16":[26530,45435,52350,65535]},"Hover":{"hex":"#c2c3bbff","u16":[49844,50177,48043,65535]}},"foreground":{"Active":{"hex":"#67b1ccff","u16":[26530,45435,52350,65535]},"Inactive":{"hex":"#7d7f82ff","u16":[32032,32716,33393,65535]},"Link":{"hex":"#3e85a7ff","u16":[15814,34265,42846,65535]},"Negative":{"hex":"#f42a39ff","u16":[62647,10752,14713,65535]},"Neutral":{"hex":"#da8b00ff","u16":[56057,35621,0,65535]},"Normal":{"hex":"#322f2dff","u16":[12773,12144,11495,65535]},"Positive":{"hex":"#44af67ff","u16":[17432,45070,26418,65535]},"Visited":{"hex":"#a55cacff","u16":[42446,23757,44121,65535]}},"shade":{"Dark":{"hex":"#655c52ff","u16":[25924,23591,21115,65535]},"Light":{"hex":"#ece5deff","u16":[60771,58875,57027,65535]},"Mid":{"hex":"#ab9c8cff","u16":[44055,40090,35883,65535]},"Midlight":{"hex":"#dacabaff","u16":[56041,51960,47744,65535]},"Shadow":{"hex":"#3e3832ff","u16":[15881,14452,12935,65535]}}}}},"sha256":"019747061cd0af87864d100759cbb4c381c86d9e99b444b508fdbeeb12d7ffb1","source_text":"[General]\nColorScheme=SyntheticValueForms\nName=Synthetic Value Forms\n\n[ColorEffects:Inactive]\nEnable=\nChangeSelectionColor=off\n\n[Colors:View]\nBackgroundNormal=+250,240,230\nBackgroundAlternate=#abc\nForegroundNormal=#123456789\nForegroundInactive=#123456789abc\nForegroundActive=Red\nForegroundLink=grey\nForegroundVisited=rebeccapurple\nForegroundNegative=10,20,30,\nForegroundNeutral=0x10,20,30\nForegroundPositive=transparent\nDecorationFocus=#803daee9\n\n[Colors:Window]\nBackgroundNormal=200,190,180\n"} +] +} diff --git a/tools/kde_golden/vectors/sizes.json b/tools/kde_golden/vectors/sizes.json new file mode 100644 index 000000000..7c4160eb4 --- /dev/null +++ b/tools/kde_golden/vectors/sizes.json @@ -0,0 +1,838 @@ +{ +"meta": {"generator":"tools/kde_golden/driver (kde_golden)","image":"invent-registry.kde.org/neon/docker-images/plasma@sha256:f58f9b97f218ee976cf928f6fe00abb929a644aded8c9dfb02f77a9b2a6e1732","kcolorscheme_build":"6.31.0","kguiaddons_build":"6.31.0","kind":"sizes","packages":{"breeze":"4:6.8.0-0zneon+24.04+noble+release+build80","fonts-hack":"3.003-3","fonts-noto-core":"20201225-2","kde-style-breeze":"4:6.8.0-0zneon+24.04+noble+release+build80","kde-style-oxygen":"4:6.8.0-0zneon+24.04+noble+release+build59","kf6-kcolorscheme":"6.31.0-0zneon+24.04+noble+release+build47","kf6-kconfig":"6.31.0-0zneon+24.04+noble+release+build36","kf6-kguiaddons":"6.31.0-0zneon+24.04+noble+release+build59","libkf6colorscheme-dev":"6.31.0-0zneon+24.04+noble+release+build47","plasma-workspace":"4:6.8.0-0zneon+24.04+noble+release+build99","qt6-base":"6.11.1-0zneon+24.04+noble+release+build162"},"qt_build":"6.11.1","qt_runtime":"6.11.1","readme":"tools/kde_golden/README.md documents every field"}, +"environment": {"default_font_before_override":"Sans Serif,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,,0,0","device_pixel_ratio":1,"logical_dpi":96,"physical_dpi":100,"platform":"offscreen","style":"breeze","widgets_parented":"every measured widget except QMenu has a plain QWidget parent"}, +"pixel_metrics": { +"PM_ButtonDefaultIndicator": 0, +"PM_ButtonIconSize": 16, +"PM_ButtonMargin": 6, +"PM_ButtonShiftHorizontal": 0, +"PM_ButtonShiftVertical": 0, +"PM_CheckBoxLabelSpacing": 4, +"PM_ComboBoxFrameWidth": 6, +"PM_DefaultFrameWidth": 0, +"PM_DialogButtonsButtonHeight": 0, +"PM_DialogButtonsButtonWidth": 0, +"PM_DialogButtonsSeparator": 0, +"PM_DockWidgetFrameWidth": 0, +"PM_DockWidgetHandleExtent": 8, +"PM_DockWidgetSeparatorExtent": 1, +"PM_DockWidgetTitleBarButtonMargin": 6, +"PM_DockWidgetTitleMargin": 2, +"PM_ExclusiveIndicatorHeight": 20, +"PM_ExclusiveIndicatorWidth": 20, +"PM_FocusFrameHMargin": 2, +"PM_FocusFrameVMargin": 2, +"PM_HeaderDefaultSectionSizeHorizontal": 100, +"PM_HeaderDefaultSectionSizeVertical": 30, +"PM_HeaderGripMargin": 4, +"PM_HeaderMargin": 6, +"PM_HeaderMarkSize": 10, +"PM_IconViewIconSize": 32, +"PM_IndicatorHeight": 20, +"PM_IndicatorWidth": 20, +"PM_LargeIconSize": 32, +"PM_LayoutBottomMargin": 6, +"PM_LayoutHorizontalSpacing": 6, +"PM_LayoutLeftMargin": 6, +"PM_LayoutRightMargin": 6, +"PM_LayoutTopMargin": 6, +"PM_LayoutVerticalSpacing": 6, +"PM_LineEditIconMargin": 4, +"PM_LineEditIconSize": 16, +"PM_ListViewIconSize": 16, +"PM_MaximumDragDistance": -1, +"PM_MdiSubWindowFrameWidth": 4, +"PM_MdiSubWindowMinimizedWidth": 196, +"PM_MenuBarHMargin": 0, +"PM_MenuBarItemSpacing": 0, +"PM_MenuBarPanelWidth": 0, +"PM_MenuBarVMargin": 0, +"PM_MenuButtonIndicator": 20, +"PM_MenuDesktopFrameWidth": 0, +"PM_MenuHMargin": 4, +"PM_MenuPanelWidth": 0, +"PM_MenuScrollerHeight": 10, +"PM_MenuTearoffHeight": 10, +"PM_MenuVMargin": 4, +"PM_MessageBoxIconSize": 64, +"PM_ProgressBarChunkWidth": 9, +"PM_RadioButtonLabelSpacing": 4, +"PM_ScrollBarExtent": 21, +"PM_ScrollBarSliderMin": 20, +"PM_ScrollView_ScrollBarOverlap": 0, +"PM_ScrollView_ScrollBarSpacing": 0, +"PM_SizeGripSize": 13, +"PM_SliderControlThickness": 20, +"PM_SliderLength": 20, +"PM_SliderSpaceAvailable": 0, +"PM_SliderThickness": 20, +"PM_SliderTickmarkOffset": 0, +"PM_SmallIconSize": 16, +"PM_SpinBoxFrameWidth": 6, +"PM_SpinBoxSliderHeight": 2, +"PM_SplitterWidth": 1, +"PM_SubMenuOverlap": 0, +"PM_TabBarBaseHeight": 0, +"PM_TabBarBaseOverlap": 2, +"PM_TabBarIconSize": 16, +"PM_TabBarScrollButtonWidth": 16, +"PM_TabBarTabHSpace": 16, +"PM_TabBarTabOverlap": 1, +"PM_TabBarTabShiftHorizontal": 0, +"PM_TabBarTabShiftVertical": 0, +"PM_TabBarTabVSpace": 8, +"PM_TabBar_ScrollButtonOverlap": 1, +"PM_TabCloseIndicatorHeight": 16, +"PM_TabCloseIndicatorWidth": 16, +"PM_TextCursorWidth": 1, +"PM_TitleBarButtonIconSize": 16, +"PM_TitleBarButtonSize": 16, +"PM_TitleBarHeight": 24, +"PM_ToolBarExtensionExtent": 28, +"PM_ToolBarFrameWidth": 0, +"PM_ToolBarHandleExtent": 10, +"PM_ToolBarIconSize": 22, +"PM_ToolBarItemMargin": 6, +"PM_ToolBarItemSpacing": 0, +"PM_ToolBarSeparatorExtent": 8, +"PM_ToolTipLabelFrameWidth": 3, +"PM_TreeViewIndentation": 20 +}, +"widget_pixel_metrics": { +"QCheckBox": {}, +"QComboBox": {}, +"QComboBox.editable": {}, +"QFrame.styled_panel": {}, +"QGroupBox": {}, +"QHeaderView.horizontal": {}, +"QLineEdit": {"PM_DefaultFrameWidth":6,"PM_MenuPanelWidth":6,"PM_ScrollView_ScrollBarSpacing":12,"PM_SubMenuOverlap":-6,"PM_TabBarBaseHeight":6}, +"QListView": {}, +"QMenu": {"PM_LayoutBottomMargin":10,"PM_LayoutLeftMargin":10,"PM_LayoutRightMargin":10,"PM_LayoutTopMargin":10}, +"QMenuBar": {}, +"QProgressBar": {}, +"QPushButton": {}, +"QRadioButton": {}, +"QScrollBar": {}, +"QSlider": {}, +"QSpinBox": {}, +"QStatusBar": {}, +"QTabBar": {}, +"QTabWidget": {"PM_DefaultFrameWidth":2,"PM_MenuPanelWidth":2,"PM_ScrollView_ScrollBarSpacing":4,"PM_SubMenuOverlap":-2,"PM_TabBarBaseHeight":2}, +"QTableView": {}, +"QToolBar": {}, +"QToolButton": {}, +"QTreeView": {} +}, +"style_hints": { +"SH_BlinkCursorWhenTextSelected": 1, +"SH_Button_FocusPolicy": 11, +"SH_ComboBox_AllowWheelScrolling": 1, +"SH_ComboBox_LayoutDirection": 0, +"SH_ComboBox_ListMouseTracking": 1, +"SH_ComboBox_ListMouseTracking_Active": 0, +"SH_ComboBox_ListMouseTracking_Current": 1, +"SH_ComboBox_Popup": 0, +"SH_ComboBox_PopupFrameStyle": 22, +"SH_ComboBox_UseNativePopup": 0, +"SH_Dial_BackgroundRole": 10, +"SH_DialogButtonBox_ButtonsHaveIcons": 1, +"SH_DialogButtonLayout": 0, +"SH_DialogButtons_DefaultButton": 0, +"SH_DitherDisabledText": 0, +"SH_DockWidget_ButtonsHaveFrame": 0, +"SH_DrawMenuBarSeparator": 0, +"SH_EtchDisabledText": 0, +"SH_FocusFrame_AboveWidget": 1, +"SH_FocusFrame_Mask": 0, +"SH_FontDialog_SelectAssociatedText": 0, +"SH_FormLayoutFieldGrowthPolicy": 1, +"SH_FormLayoutFormAlignment": 33, +"SH_FormLayoutLabelAlignment": 2, +"SH_FormLayoutWrapPolicy": 0, +"SH_GroupBox_TextLabelColor": 0, +"SH_GroupBox_TextLabelVerticalAlignment": 128, +"SH_Header_ArrowAlignment": 130, +"SH_ItemView_ActivateItemOnSingleClick": 0, +"SH_ItemView_ArrowKeysNavigateIntoChildren": 1, +"SH_ItemView_ChangeHighlightOnFocus": 0, +"SH_ItemView_DrawDelegateFrame": 0, +"SH_ItemView_EllipsisLocation": 2, +"SH_ItemView_MovementWithoutUpdatingSelection": 1, +"SH_ItemView_PaintAlternatingRowColorsForEmptyArea": 0, +"SH_ItemView_ScrollMode": 0, +"SH_ItemView_ShowDecorationSelected": 0, +"SH_LineEdit_PasswordCharacter": 9679, +"SH_LineEdit_PasswordMaskDelay": 0, +"SH_ListViewExpand_SelectMouseType": 2, +"SH_MainWindow_SpaceBelowMenuBar": 0, +"SH_MenuBar_AltKeyNavigation": 0, +"SH_MenuBar_MouseTracking": 1, +"SH_Menu_AllowActiveAndDisabled": 0, +"SH_Menu_FadeOutOnHide": 0, +"SH_Menu_FillScreenWithScroll": 1, +"SH_Menu_FlashTriggeredItem": 0, +"SH_Menu_KeyboardSearch": 0, +"SH_Menu_Mask": 0, +"SH_Menu_MouseTracking": 1, +"SH_Menu_Scrollable": 1, +"SH_Menu_SelectionWrap": 1, +"SH_Menu_SloppySubMenus": 1, +"SH_Menu_SpaceActivatesItem": 0, +"SH_Menu_SubMenuDontStartSloppyOnLeave": 0, +"SH_Menu_SubMenuPopupDelay": 150, +"SH_Menu_SubMenuResetWhenReenteringParent": 0, +"SH_Menu_SubMenuSloppyCloseTimeout": 300, +"SH_Menu_SubMenuSloppySelectOtherActions": 1, +"SH_Menu_SubMenuUniDirection": 0, +"SH_Menu_SubMenuUniDirectionFailCount": 1, +"SH_Menu_SupportsSections": 1, +"SH_MessageBox_CenterButtons": 0, +"SH_MessageBox_TextInteractionFlags": 5, +"SH_MessageBox_UseBorderForButtonSpacing": 0, +"SH_PrintDialog_RightAlignButtons": 0, +"SH_ProgressDialog_CenterCancelButton": 0, +"SH_ProgressDialog_TextLabelAlignment": 132, +"SH_RequestSoftwareInputPanel": 1, +"SH_RichText_FullWidthSelection": 0, +"SH_RubberBand_Mask": 0, +"SH_ScrollBar_ContextMenu": 1, +"SH_ScrollBar_LeftClickAbsolutePosition": 1, +"SH_ScrollBar_MiddleClickAbsolutePosition": 1, +"SH_ScrollBar_RollBetweenButtons": 0, +"SH_ScrollBar_ScrollWhenPointerLeavesControl": 0, +"SH_ScrollBar_Transient": 0, +"SH_ScrollView_FrameOnlyAroundContents": 0, +"SH_Slider_AbsoluteSetButtons": 4, +"SH_Slider_PageSetButtons": 1, +"SH_Slider_SloppyKeyEvents": 0, +"SH_Slider_SnapToValue": 0, +"SH_Slider_StopMouseOverSlider": 0, +"SH_SpinBox_AnimateButton": 0, +"SH_SpinBox_ButtonsInsideFrame": 1, +"SH_SpinBox_ClickAutoRepeatRate": 150, +"SH_SpinBox_ClickAutoRepeatThreshold": 500, +"SH_SpinBox_KeyPressAutoRepeatRate": 75, +"SH_SpinBox_SelectOnStep": 1, +"SH_SpinBox_StepModifier": 67108864, +"SH_SpinControls_DisableOnBounds": 1, +"SH_Splitter_OpaqueResize": 1, +"SH_TabBar_Alignment": 1, +"SH_TabBar_AllowWheelScrolling": 1, +"SH_TabBar_ChangeCurrentDelay": 500, +"SH_TabBar_CloseButtonPosition": 1, +"SH_TabBar_ElideMode": 3, +"SH_TabBar_PreferNoArrows": 0, +"SH_TabBar_SelectMouseType": 2, +"SH_TabWidget_DefaultTabPosition": 0, +"SH_Table_AlwaysDrawLeftTopGridLines": 0, +"SH_Table_GridLineColor": -1, +"SH_TextControl_FocusIndicatorTextCharFormat": 1, +"SH_TitleBar_AutoRaise": 0, +"SH_TitleBar_ModifyNotification": 1, +"SH_TitleBar_NoBorder": 1, +"SH_TitleBar_ShowToolTipsOnButtons": 1, +"SH_ToolBar_Movable": 1, +"SH_ToolBox_SelectedPageTitleBold": 0, +"SH_ToolButtonStyle": 2, +"SH_ToolButton_PopupDelay": 600, +"SH_ToolTipLabel_Opacity": 255, +"SH_ToolTip_FallAsleepDelay": 2000, +"SH_ToolTip_Mask": 0, +"SH_ToolTip_WakeUpDelay": 700, +"SH_UnderlineShortcut": 1, +"SH_Widget_Animate": 1, +"SH_Widget_Animation_Duration": 100, +"SH_Widget_ShareActivation": 0, +"SH_WindowFrame_Mask": 0, +"SH_WizardStyle": 0, +"SH_Workspace_FillSpaceOnMaximize": 0 +}, +"sub_rects": { +"check_box": {"contents":[24,0,37,22],"focus":[21,0,40,22],"indicator":[0,1,20,20],"rect":[0,0,61,22]}, +"combo_box": {"arrow":[128,6,20,20],"edit_field":[6,6,124,20],"frame":[0,0,0,0],"popup":[0,0,150,32],"rect":[0,0,150,32]}, +"combo_box.editable": {"arrow":[128,6,20,20],"edit_field":[6,6,124,20],"rect":[0,0,150,32]}, +"item_view_item": {"check":[7,2,20,20],"decoration":[33,4,16,16],"focus":[48,0,152,24],"rect":[0,0,200,24],"text":[52,0,144,24]}, +"line_edit": {"contents":[6,6,123,20],"rect":[0,0,135,32]}, +"progress_bar": {"contents":[0,10,80,6],"groove":[0,10,160,6],"label":[164,0,34,26],"rect":[0,0,200,26]}, +"push_button": {"contents":[2,2,80,30],"focus":[1,1,82,32],"rect":[0,0,84,34]}, +"radio_button": {"contents":[24,0,35,22],"focus":[21,0,38,22],"indicator":[0,1,20,20],"rect":[0,0,59,22]}, +"scroll_bar.vertical.value_0": {"add_line":[0,197,21,3],"add_page":[0,35,21,162],"groove":[0,3,21,194],"page_step":20,"range":[0,100],"rect":[0,0,21,200],"slider":[0,3,21,32],"sub_line":[0,0,21,3],"sub_page":[0,3,21,0]}, +"scroll_bar.vertical.value_100": {"add_line":[0,197,21,3],"add_page":[0,197,21,0],"groove":[0,3,21,194],"page_step":20,"range":[0,100],"rect":[0,0,21,200],"slider":[0,165,21,32],"sub_line":[0,0,21,3],"sub_page":[0,3,21,162]}, +"scroll_bar.vertical.value_50": {"add_line":[0,197,21,3],"add_page":[0,116,21,81],"groove":[0,3,21,194],"page_step":20,"range":[0,100],"rect":[0,0,21,200],"slider":[0,84,21,32],"sub_line":[0,0,21,3],"sub_page":[0,3,21,81]}, +"slider.horizontal.ticks_0": {"groove":[0,7,200,6],"handle":[54,0,20,20],"rect":[0,0,200,20],"value":30}, +"slider.horizontal.ticks_2": {"groove":[0,5,200,6],"handle":[54,-2,20,20],"rect":[0,0,200,18],"value":30}, +"slider.horizontal.ticks_3": {"groove":[0,5,200,6],"handle":[54,-2,20,20],"rect":[0,0,200,16],"value":30}, +"spin_box": {"down":[78,16,20,10],"edit_field":[6,6,74,20],"frame":[0,0,100,32],"rect":[0,0,100,32],"up":[78,6,20,10]}, +"tab": {"rect":[0,0,80,30],"text":[8,4,64,22]} +}, +"size_from_contents": [ +{"contents":[0,0],"id":"CT_PushButton","option":{"text":"OK"},"out":[84,34]}, +{"contents":[20,16],"id":"CT_PushButton","option":{"text":"OK"},"out":[84,34]}, +{"contents":[60,18],"id":"CT_PushButton","option":{"text":"OK"},"out":[84,34]}, +{"contents":[100,24],"id":"CT_PushButton","option":{"text":"OK"},"out":[84,34]}, +{"contents":[100,32],"id":"CT_PushButton","option":{"text":"OK"},"out":[84,34]}, +{"contents":[0,0],"id":"CT_PushButton.flat","option":{"flat":true,"text":"OK"},"out":[84,34]}, +{"contents":[20,16],"id":"CT_PushButton.flat","option":{"flat":true,"text":"OK"},"out":[84,34]}, +{"contents":[60,18],"id":"CT_PushButton.flat","option":{"flat":true,"text":"OK"},"out":[84,34]}, +{"contents":[100,24],"id":"CT_PushButton.flat","option":{"flat":true,"text":"OK"},"out":[84,34]}, +{"contents":[100,32],"id":"CT_PushButton.flat","option":{"flat":true,"text":"OK"},"out":[84,34]}, +{"contents":[0,0],"id":"CT_ToolButton.auto_raise","option":{"auto_raise":true,"icon_size":16},"out":[12,12]}, +{"contents":[20,16],"id":"CT_ToolButton.auto_raise","option":{"auto_raise":true,"icon_size":16},"out":[32,28]}, +{"contents":[60,18],"id":"CT_ToolButton.auto_raise","option":{"auto_raise":true,"icon_size":16},"out":[72,30]}, +{"contents":[100,24],"id":"CT_ToolButton.auto_raise","option":{"auto_raise":true,"icon_size":16},"out":[112,36]}, +{"contents":[100,32],"id":"CT_ToolButton.auto_raise","option":{"auto_raise":true,"icon_size":16},"out":[112,44]}, +{"contents":[0,0],"id":"CT_ToolButton.framed","option":{"auto_raise":false,"icon_size":16},"out":[16,16]}, +{"contents":[20,16],"id":"CT_ToolButton.framed","option":{"auto_raise":false,"icon_size":16},"out":[36,32]}, +{"contents":[60,18],"id":"CT_ToolButton.framed","option":{"auto_raise":false,"icon_size":16},"out":[76,34]}, +{"contents":[100,24],"id":"CT_ToolButton.framed","option":{"auto_raise":false,"icon_size":16},"out":[116,40]}, +{"contents":[100,32],"id":"CT_ToolButton.framed","option":{"auto_raise":false,"icon_size":16},"out":[116,48]}, +{"contents":[0,0],"id":"CT_LineEdit","option":{"line_width":6},"out":[12,12]}, +{"contents":[20,16],"id":"CT_LineEdit","option":{"line_width":6},"out":[32,28]}, +{"contents":[60,18],"id":"CT_LineEdit","option":{"line_width":6},"out":[72,30]}, +{"contents":[100,24],"id":"CT_LineEdit","option":{"line_width":6},"out":[112,36]}, +{"contents":[100,32],"id":"CT_LineEdit","option":{"line_width":6},"out":[112,44]}, +{"contents":[0,0],"id":"CT_ComboBox","option":{"editable":false,"frame":true},"out":[38,32]}, +{"contents":[20,16],"id":"CT_ComboBox","option":{"editable":false,"frame":true},"out":[58,32]}, +{"contents":[60,18],"id":"CT_ComboBox","option":{"editable":false,"frame":true},"out":[98,32]}, +{"contents":[100,24],"id":"CT_ComboBox","option":{"editable":false,"frame":true},"out":[138,36]}, +{"contents":[100,32],"id":"CT_ComboBox","option":{"editable":false,"frame":true},"out":[138,44]}, +{"contents":[0,0],"id":"CT_ComboBox.editable","option":{"editable":true,"frame":true},"out":[38,32]}, +{"contents":[20,16],"id":"CT_ComboBox.editable","option":{"editable":true,"frame":true},"out":[58,32]}, +{"contents":[60,18],"id":"CT_ComboBox.editable","option":{"editable":true,"frame":true},"out":[98,32]}, +{"contents":[100,24],"id":"CT_ComboBox.editable","option":{"editable":true,"frame":true},"out":[138,36]}, +{"contents":[100,32],"id":"CT_ComboBox.editable","option":{"editable":true,"frame":true},"out":[138,44]}, +{"contents":[0,0],"id":"CT_SpinBox","option":{"frame":true},"out":[32,20]}, +{"contents":[20,16],"id":"CT_SpinBox","option":{"frame":true},"out":[52,28]}, +{"contents":[60,18],"id":"CT_SpinBox","option":{"frame":true},"out":[92,30]}, +{"contents":[100,24],"id":"CT_SpinBox","option":{"frame":true},"out":[132,36]}, +{"contents":[100,32],"id":"CT_SpinBox","option":{"frame":true},"out":[132,44]}, +{"contents":[0,0],"id":"CT_CheckBox","option":{"text":"X"},"out":[24,20]}, +{"contents":[20,16],"id":"CT_CheckBox","option":{"text":"X"},"out":[44,20]}, +{"contents":[60,18],"id":"CT_CheckBox","option":{"text":"X"},"out":[84,22]}, +{"contents":[100,24],"id":"CT_CheckBox","option":{"text":"X"},"out":[124,28]}, +{"contents":[100,32],"id":"CT_CheckBox","option":{"text":"X"},"out":[124,36]}, +{"contents":[0,0],"id":"CT_RadioButton","option":{"text":"X"},"out":[24,20]}, +{"contents":[20,16],"id":"CT_RadioButton","option":{"text":"X"},"out":[44,20]}, +{"contents":[60,18],"id":"CT_RadioButton","option":{"text":"X"},"out":[84,22]}, +{"contents":[100,24],"id":"CT_RadioButton","option":{"text":"X"},"out":[124,28]}, +{"contents":[100,32],"id":"CT_RadioButton","option":{"text":"X"},"out":[124,36]}, +{"contents":[0,0],"id":"CT_Slider","option":{"orientation":1},"out":[0,0]}, +{"contents":[20,16],"id":"CT_Slider","option":{"orientation":1},"out":[20,16]}, +{"contents":[60,18],"id":"CT_Slider","option":{"orientation":1},"out":[60,18]}, +{"contents":[100,24],"id":"CT_Slider","option":{"orientation":1},"out":[100,24]}, +{"contents":[100,32],"id":"CT_Slider","option":{"orientation":1},"out":[100,32]}, +{"contents":[0,0],"id":"CT_Slider.ticks_both","option":{"orientation":1,"ticks":3},"out":[0,-4]}, +{"contents":[20,16],"id":"CT_Slider.ticks_both","option":{"orientation":1,"ticks":3},"out":[20,12]}, +{"contents":[60,18],"id":"CT_Slider.ticks_both","option":{"orientation":1,"ticks":3},"out":[60,14]}, +{"contents":[100,24],"id":"CT_Slider.ticks_both","option":{"orientation":1,"ticks":3},"out":[100,20]}, +{"contents":[100,32],"id":"CT_Slider.ticks_both","option":{"orientation":1,"ticks":3},"out":[100,28]}, +{"contents":[0,0],"id":"CT_ProgressBar","option":{"text_visible":true},"out":[6,18]}, +{"contents":[20,16],"id":"CT_ProgressBar","option":{"text_visible":true},"out":[20,18]}, +{"contents":[60,18],"id":"CT_ProgressBar","option":{"text_visible":true},"out":[60,18]}, +{"contents":[100,24],"id":"CT_ProgressBar","option":{"text_visible":true},"out":[100,24]}, +{"contents":[100,32],"id":"CT_ProgressBar","option":{"text_visible":true},"out":[100,32]}, +{"contents":[0,0],"id":"CT_MenuItem.normal","option":{"check_type":0,"max_icon_width":0,"text":"Item","type":0},"out":[59,29]}, +{"contents":[20,16],"id":"CT_MenuItem.normal","option":{"check_type":0,"max_icon_width":0,"text":"Item","type":0},"out":[59,29]}, +{"contents":[60,18],"id":"CT_MenuItem.normal","option":{"check_type":0,"max_icon_width":0,"text":"Item","type":0},"out":[59,29]}, +{"contents":[100,24],"id":"CT_MenuItem.normal","option":{"check_type":0,"max_icon_width":0,"text":"Item","type":0},"out":[59,29]}, +{"contents":[100,32],"id":"CT_MenuItem.normal","option":{"check_type":0,"max_icon_width":0,"text":"Item","type":0},"out":[59,29]}, +{"contents":[0,0],"id":"CT_MenuItem.normal.icon_column","option":{"check_type":0,"max_icon_width":16,"text":"Item","type":0},"out":[77,29]}, +{"contents":[20,16],"id":"CT_MenuItem.normal.icon_column","option":{"check_type":0,"max_icon_width":16,"text":"Item","type":0},"out":[77,29]}, +{"contents":[60,18],"id":"CT_MenuItem.normal.icon_column","option":{"check_type":0,"max_icon_width":16,"text":"Item","type":0},"out":[77,29]}, +{"contents":[100,24],"id":"CT_MenuItem.normal.icon_column","option":{"check_type":0,"max_icon_width":16,"text":"Item","type":0},"out":[77,29]}, +{"contents":[100,32],"id":"CT_MenuItem.normal.icon_column","option":{"check_type":0,"max_icon_width":16,"text":"Item","type":0},"out":[77,29]}, +{"contents":[0,0],"id":"CT_MenuItem.shortcut","option":{"check_type":0,"max_icon_width":16,"text":"Save\tCtrl+S","type":0},"out":[93,29]}, +{"contents":[20,16],"id":"CT_MenuItem.shortcut","option":{"check_type":0,"max_icon_width":16,"text":"Save\tCtrl+S","type":0},"out":[93,29]}, +{"contents":[60,18],"id":"CT_MenuItem.shortcut","option":{"check_type":0,"max_icon_width":16,"text":"Save\tCtrl+S","type":0},"out":[93,29]}, +{"contents":[100,24],"id":"CT_MenuItem.shortcut","option":{"check_type":0,"max_icon_width":16,"text":"Save\tCtrl+S","type":0},"out":[93,29]}, +{"contents":[100,32],"id":"CT_MenuItem.shortcut","option":{"check_type":0,"max_icon_width":16,"text":"Save\tCtrl+S","type":0},"out":[93,29]}, +{"contents":[0,0],"id":"CT_MenuItem.checkable","option":{"check_type":2,"max_icon_width":16,"text":"Item","type":0},"out":[99,29]}, +{"contents":[20,16],"id":"CT_MenuItem.checkable","option":{"check_type":2,"max_icon_width":16,"text":"Item","type":0},"out":[99,29]}, +{"contents":[60,18],"id":"CT_MenuItem.checkable","option":{"check_type":2,"max_icon_width":16,"text":"Item","type":0},"out":[99,29]}, +{"contents":[100,24],"id":"CT_MenuItem.checkable","option":{"check_type":2,"max_icon_width":16,"text":"Item","type":0},"out":[99,29]}, +{"contents":[100,32],"id":"CT_MenuItem.checkable","option":{"check_type":2,"max_icon_width":16,"text":"Item","type":0},"out":[99,29]}, +{"contents":[0,0],"id":"CT_MenuItem.submenu","option":{"check_type":0,"max_icon_width":16,"text":"Item","type":3},"out":[77,29]}, +{"contents":[20,16],"id":"CT_MenuItem.submenu","option":{"check_type":0,"max_icon_width":16,"text":"Item","type":3},"out":[77,29]}, +{"contents":[60,18],"id":"CT_MenuItem.submenu","option":{"check_type":0,"max_icon_width":16,"text":"Item","type":3},"out":[77,29]}, +{"contents":[100,24],"id":"CT_MenuItem.submenu","option":{"check_type":0,"max_icon_width":16,"text":"Item","type":3},"out":[77,29]}, +{"contents":[100,32],"id":"CT_MenuItem.submenu","option":{"check_type":0,"max_icon_width":16,"text":"Item","type":3},"out":[77,29]}, +{"contents":[0,0],"id":"CT_MenuItem.separator","option":{"check_type":0,"max_icon_width":16,"text":"","type":2},"out":[9,5]}, +{"contents":[20,16],"id":"CT_MenuItem.separator","option":{"check_type":0,"max_icon_width":16,"text":"","type":2},"out":[9,5]}, +{"contents":[60,18],"id":"CT_MenuItem.separator","option":{"check_type":0,"max_icon_width":16,"text":"","type":2},"out":[9,5]}, +{"contents":[100,24],"id":"CT_MenuItem.separator","option":{"check_type":0,"max_icon_width":16,"text":"","type":2},"out":[9,5]}, +{"contents":[100,32],"id":"CT_MenuItem.separator","option":{"check_type":0,"max_icon_width":16,"text":"","type":2},"out":[9,5]}, +{"contents":[0,0],"id":"CT_MenuItem.section","option":{"check_type":0,"max_icon_width":16,"text":"Section","type":2},"out":[56,28]}, +{"contents":[20,16],"id":"CT_MenuItem.section","option":{"check_type":0,"max_icon_width":16,"text":"Section","type":2},"out":[56,28]}, +{"contents":[60,18],"id":"CT_MenuItem.section","option":{"check_type":0,"max_icon_width":16,"text":"Section","type":2},"out":[56,28]}, +{"contents":[100,24],"id":"CT_MenuItem.section","option":{"check_type":0,"max_icon_width":16,"text":"Section","type":2},"out":[56,28]}, +{"contents":[100,32],"id":"CT_MenuItem.section","option":{"check_type":0,"max_icon_width":16,"text":"Section","type":2},"out":[56,28]}, +{"contents":[0,0],"id":"CT_TabBarTab","option":{"shape":0,"text":"Tab"},"out":[80,30]}, +{"contents":[20,16],"id":"CT_TabBarTab","option":{"shape":0,"text":"Tab"},"out":[80,30]}, +{"contents":[60,18],"id":"CT_TabBarTab","option":{"shape":0,"text":"Tab"},"out":[80,30]}, +{"contents":[100,24],"id":"CT_TabBarTab","option":{"shape":0,"text":"Tab"},"out":[100,30]}, +{"contents":[100,32],"id":"CT_TabBarTab","option":{"shape":0,"text":"Tab"},"out":[100,32]}, +{"contents":[0,0],"id":"CT_TabBarTab.document_mode","option":{"document_mode":true,"shape":0,"text":"Tab"},"out":[80,34]}, +{"contents":[20,16],"id":"CT_TabBarTab.document_mode","option":{"document_mode":true,"shape":0,"text":"Tab"},"out":[80,34]}, +{"contents":[60,18],"id":"CT_TabBarTab.document_mode","option":{"document_mode":true,"shape":0,"text":"Tab"},"out":[80,34]}, +{"contents":[100,24],"id":"CT_TabBarTab.document_mode","option":{"document_mode":true,"shape":0,"text":"Tab"},"out":[100,34]}, +{"contents":[100,32],"id":"CT_TabBarTab.document_mode","option":{"document_mode":true,"shape":0,"text":"Tab"},"out":[100,34]}, +{"contents":[0,0],"id":"CT_HeaderSection","option":{"text":"Name"},"out":[49,30]}, +{"contents":[20,16],"id":"CT_HeaderSection","option":{"text":"Name"},"out":[49,30]}, +{"contents":[60,18],"id":"CT_HeaderSection","option":{"text":"Name"},"out":[72,30]}, +{"contents":[100,24],"id":"CT_HeaderSection","option":{"text":"Name"},"out":[112,36]}, +{"contents":[100,32],"id":"CT_HeaderSection","option":{"text":"Name"},"out":[112,44]}, +{"contents":[0,0],"id":"CT_ItemViewItem","option":{"text":"Row"},"out":[41,24]}, +{"contents":[20,16],"id":"CT_ItemViewItem","option":{"text":"Row"},"out":[41,24]}, +{"contents":[60,18],"id":"CT_ItemViewItem","option":{"text":"Row"},"out":[41,24]}, +{"contents":[100,24],"id":"CT_ItemViewItem","option":{"text":"Row"},"out":[41,24]}, +{"contents":[100,32],"id":"CT_ItemViewItem","option":{"text":"Row"},"out":[41,24]} +], +"monospace_fonts": [ +{"advance":{"0":[7,7.21875],"Cancel":[43,43.3125],"M":[7,7.21875],"OK":[14,14.4375],"The quick brown fox":[137,137.15625],"x":[7,7.21875]},"exact_match":true,"metrics":{"ascent":11,"average_char_width":7,"cap_height":9,"descent":3,"height":14,"leading":0,"line_spacing":14,"max_width":7,"x_height":7},"metrics_f":{"ascent":11.125,"average_char_width":7.21875,"cap_height":8.75,"descent":2.828125,"height":13.953125,"leading":0,"line_spacing":13.953125,"max_width":7,"x_height":6.5625},"requested_family":"Hack","requested_point_size":9,"resolved_family":"Hack","resolved_pixel_size":12,"resolved_point_size":9,"resolved_style":"Regular","to_string":"Hack,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,,0,0"}, +{"advance":{"0":[8,7.8125],"Cancel":[47,46.875],"M":[8,7.8125],"OK":[16,15.625],"The quick brown fox":[148,148.4375],"x":[8,7.8125]},"exact_match":false,"metrics":{"ascent":12,"average_char_width":8,"cap_height":9,"descent":3,"height":15,"leading":0,"line_spacing":15,"max_width":8,"x_height":7},"metrics_f":{"ascent":12.0625,"average_char_width":7.828125,"cap_height":9.484375,"descent":3.0625,"height":15.125,"leading":0,"line_spacing":15.125,"max_width":8,"x_height":7.109375},"requested_family":"Hack","requested_point_size":10,"resolved_family":"Hack","resolved_pixel_size":13,"resolved_point_size":9.75,"resolved_style":"Regular","to_string":"Hack,10,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,,0,0"}, +{"advance":{"0":[9,9.015625],"Cancel":[54,54.09375],"M":[9,9.015625],"OK":[18,18.03125],"The quick brown fox":[171,171.296875],"x":[9,9.015625]},"exact_match":false,"metrics":{"ascent":14,"average_char_width":9,"cap_height":11,"descent":4,"height":18,"leading":0,"line_spacing":18,"max_width":9,"x_height":8},"metrics_f":{"ascent":13.921875,"average_char_width":9.03125,"cap_height":10.9375,"descent":3.53125,"height":17.453125,"leading":0,"line_spacing":17.453125,"max_width":9,"x_height":8.203125},"requested_family":"Hack","requested_point_size":11,"resolved_family":"Hack","resolved_pixel_size":15,"resolved_point_size":11.25,"resolved_style":"Regular","to_string":"Hack,11,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,,0,0"} +], +"fonts": [ +{"advance":{"0":[7,7.421875],"Cancel":[40,40.421875],"M":[12,11.78125],"OK":[18,18.1875],"The quick brown fox":[123,123.078125],"x":[7,6.875]},"exact_match":false,"metrics":{"ascent":14,"average_char_width":8,"cap_height":9,"descent":4,"height":18,"leading":0,"line_spacing":18,"max_width":37,"x_height":7},"metrics_f":{"ascent":13.890625,"average_char_width":7.5,"cap_height":9.28125,"descent":3.796875,"height":17.6875,"leading":0,"line_spacing":17.6875,"max_width":37,"x_height":6.96875},"requested_family":"Noto Sans","requested_point_size":10,"resolved_family":"Noto Sans","resolved_pixel_size":13,"resolved_point_size":9.75,"resolved_style":"Regular","to_string":"Noto Sans,10,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,,0,0"}, +{"advance":{"0":[6,6.28125],"Cancel":[34,34.1875],"M":[10,9.96875],"OK":[15,15.375],"The quick brown fox":[104,104.125],"x":[6,5.8125]},"exact_match":false,"metrics":{"ascent":12,"average_char_width":6,"cap_height":8,"descent":3,"height":15,"leading":0,"line_spacing":15,"max_width":31,"x_height":6},"metrics_f":{"ascent":11.75,"average_char_width":6.34375,"cap_height":7.859375,"descent":3.21875,"height":14.96875,"leading":0,"line_spacing":14.96875,"max_width":31,"x_height":5.890625},"requested_family":"Noto Sans","requested_point_size":8,"resolved_family":"Noto Sans","resolved_pixel_size":11,"resolved_point_size":8.25,"resolved_style":"Regular","to_string":"Noto Sans,8,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,,0,0"}, +{"advance":{"0":[7,6.859375],"Cancel":[37,37.3125],"M":[11,10.875],"OK":[17,16.78125],"The quick brown fox":[114,113.625],"x":[6,6.34375]},"exact_match":true,"metrics":{"ascent":13,"average_char_width":7,"cap_height":9,"descent":4,"height":17,"leading":0,"line_spacing":17,"max_width":34,"x_height":6},"metrics_f":{"ascent":12.8125,"average_char_width":6.921875,"cap_height":8.5625,"descent":3.515625,"height":16.328125,"leading":0,"line_spacing":16.328125,"max_width":34,"x_height":6.4375},"requested_family":"Noto Sans","requested_point_size":9,"resolved_family":"Noto Sans","resolved_pixel_size":12,"resolved_point_size":9,"resolved_style":"Regular","to_string":"Noto Sans,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,,0,0"}, +{"advance":{"0":[9,8.578125],"Cancel":[47,46.640625],"M":[14,13.59375],"OK":[21,20.984375],"The quick brown fox":[142,142.015625],"x":[8,7.921875]},"exact_match":false,"metrics":{"ascent":16,"average_char_width":9,"cap_height":11,"descent":4,"height":20,"leading":0,"line_spacing":20,"max_width":43,"x_height":8},"metrics_f":{"ascent":16.03125,"average_char_width":8.65625,"cap_height":10.703125,"descent":4.390625,"height":20.421875,"leading":0,"line_spacing":20.421875,"max_width":43,"x_height":8.046875},"requested_family":"Noto Sans","requested_point_size":11,"resolved_family":"Noto Sans","resolved_pixel_size":15,"resolved_point_size":11.25,"resolved_style":"Regular","to_string":"Noto Sans,11,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,,0,0"}, +{"advance":{"0":[9,9.140625],"Cancel":[50,49.765625],"M":[15,14.5],"OK":[22,22.375],"The quick brown fox":[152,151.5],"x":[8,8.453125]},"exact_match":true,"metrics":{"ascent":17,"average_char_width":9,"cap_height":11,"descent":5,"height":22,"leading":0,"line_spacing":22,"max_width":45,"x_height":9},"metrics_f":{"ascent":17.09375,"average_char_width":9.234375,"cap_height":11.421875,"descent":4.6875,"height":21.78125,"leading":0,"line_spacing":21.78125,"max_width":45,"x_height":8.578125},"requested_family":"Noto Sans","requested_point_size":12,"resolved_family":"Noto Sans","resolved_pixel_size":16,"resolved_point_size":12,"resolved_style":"Regular","to_string":"Noto Sans,12,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,,0,0"}, +{"advance":{"0":[11,10.859375],"Cancel":[59,59.09375],"M":[17,17.21875],"OK":[27,26.578125],"The quick brown fox":[180,179.953125],"x":[10,10.046875]},"exact_match":false,"metrics":{"ascent":20,"average_char_width":11,"cap_height":14,"descent":6,"height":26,"leading":0,"line_spacing":26,"max_width":54,"x_height":10},"metrics_f":{"ascent":20.296875,"average_char_width":10.96875,"cap_height":13.5625,"descent":5.5625,"height":25.859375,"leading":0,"line_spacing":25.859375,"max_width":54,"x_height":10.1875},"requested_family":"Noto Sans","requested_point_size":14,"resolved_family":"Noto Sans","resolved_pixel_size":19,"resolved_point_size":14.25,"resolved_style":"Regular","to_string":"Noto Sans,14,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,,0,0"} +], +"widgets": [ +{"class":"QLabel","config":{"text":"Label"},"font":"Noto Sans 10","id":"label","minimum_size_hint":[33,18],"size_hint":[33,18]}, +{"class":"QPushButton","config":{"text":"OK"},"font":"Noto Sans 10","id":"push_button","minimum_size_hint":[84,34],"size_hint":[84,34]}, +{"class":"QPushButton","config":{"text":"Cancel"},"font":"Noto Sans 10","id":"push_button","minimum_size_hint":[84,34],"size_hint":[84,34]}, +{"class":"QPushButton","config":{"text":"Apply changes"},"font":"Noto Sans 10","id":"push_button","minimum_size_hint":[106,34],"size_hint":[106,34]}, +{"class":"QPushButton","config":{"icon":true,"text":"Save"},"font":"Noto Sans 10","id":"push_button.icon","minimum_size_hint":[84,34],"size_hint":[84,34]}, +{"class":"QPushButton","config":{"default":true,"text":"OK"},"font":"Noto Sans 10","id":"push_button.default","minimum_size_hint":[84,34],"size_hint":[84,34]}, +{"class":"QPushButton","config":{"flat":true,"text":"OK"},"font":"Noto Sans 10","id":"push_button.flat","minimum_size_hint":[84,34],"size_hint":[84,34]}, +{"class":"QPushButton","config":{"icon":true},"font":"Noto Sans 10","id":"push_button.icon_only","minimum_size_hint":[31,32],"size_hint":[31,32]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 10","id":"tool_button.auto_raise.16","minimum_size_hint":[28,28],"size_hint":[28,28]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":22,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 10","id":"tool_button.auto_raise.22","minimum_size_hint":[34,34],"size_hint":[34,34]}, +{"class":"QToolButton","config":{"auto_raise":false,"icon_size":16,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 10","id":"tool_button.framed.16","minimum_size_hint":[32,32],"size_hint":[32,32]}, +{"class":"QToolButton","config":{"auto_raise":false,"icon_size":22,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 10","id":"tool_button.framed.22","minimum_size_hint":[38,38],"size_hint":[38,38]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":-1,"style":2,"text":"Tool"},"font":"Noto Sans 10","id":"tool_button.text_beside_icon.16","minimum_size_hint":[64,30],"size_hint":[64,30]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":22,"popup_mode":-1,"style":3,"text":"Tool"},"font":"Noto Sans 10","id":"tool_button.text_under_icon.22","minimum_size_hint":[44,56],"size_hint":[44,56]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":1,"style":0,"text":"Tool"},"font":"Noto Sans 10","id":"tool_button.menu_button_popup.16","minimum_size_hint":[48,28],"size_hint":[48,28]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":2,"style":0,"text":"Tool"},"font":"Noto Sans 10","id":"tool_button.instant_popup.16","minimum_size_hint":[28,28],"size_hint":[28,28]}, +{"class":"QLineEdit","font":"Noto Sans 10","id":"line_edit","minimum_size_hint":[53,32],"size_hint":[135,32]}, +{"class":"QLineEdit","config":{"clear_button":true},"font":"Noto Sans 10","id":"line_edit.clear_button","minimum_size_hint":[79,32],"size_hint":[161,32]}, +{"class":"QLineEdit","config":{"frame":false},"font":"Noto Sans 10","id":"line_edit.frameless","minimum_size_hint":[41,20],"size_hint":[123,20]}, +{"class":"QComboBox","config":{"items":["Item","Longer item text"]},"font":"Noto Sans 10","id":"combo_box","minimum_size_hint":[139,32],"size_hint":[139,32]}, +{"class":"QComboBox","config":{"editable":true},"font":"Noto Sans 10","id":"combo_box.editable","minimum_size_hint":[139,32],"size_hint":[87,32]}, +{"class":"QComboBox","config":{"icon":true},"font":"Noto Sans 10","id":"combo_box.icon","minimum_size_hint":[87,32],"size_hint":[87,32]}, +{"class":"QSpinBox","config":{"range":[0,99]},"font":"Noto Sans 10","id":"spin_box.0_99","minimum_size_hint":[52,32],"size_hint":[52,32]}, +{"class":"QSpinBox","config":{"range":[0,9999]},"font":"Noto Sans 10","id":"spin_box.0_9999","minimum_size_hint":[67,32],"size_hint":[67,32]}, +{"class":"QDoubleSpinBox","config":{"decimals":2,"range":[0,100]},"font":"Noto Sans 10","id":"double_spin_box","minimum_size_hint":[78,32],"size_hint":[78,32]}, +{"class":"QSpinBox","config":{"buttons":false,"range":[0,99]},"font":"Noto Sans 10","id":"spin_box.no_buttons","minimum_size_hint":[32,32],"size_hint":[32,32]}, +{"class":"QCheckBox","config":{"text":"Check"},"font":"Noto Sans 10","id":"check_box","minimum_size_hint":[61,22],"size_hint":[61,22]}, +{"class":"QCheckBox","font":"Noto Sans 10","id":"check_box.no_text","minimum_size_hint":[20,20],"size_hint":[20,20]}, +{"class":"QRadioButton","config":{"text":"Radio"},"font":"Noto Sans 10","id":"radio_button","minimum_size_hint":[59,22],"size_hint":[59,22]}, +{"class":"QRadioButton","font":"Noto Sans 10","id":"radio_button.no_text","minimum_size_hint":[20,20],"size_hint":[20,20]}, +{"class":"QSlider","config":{"orientation":1,"ticks":0},"font":"Noto Sans 10","id":"slider.horizontal","minimum_size_hint":[20,20],"size_hint":[84,20]}, +{"class":"QSlider","config":{"orientation":1,"ticks":2},"font":"Noto Sans 10","id":"slider.horizontal.ticks_below","minimum_size_hint":[20,23],"size_hint":[84,23]}, +{"class":"QSlider","config":{"orientation":1,"ticks":3},"font":"Noto Sans 10","id":"slider.horizontal.ticks_both","minimum_size_hint":[20,26],"size_hint":[84,26]}, +{"class":"QSlider","config":{"orientation":2,"ticks":0},"font":"Noto Sans 10","id":"slider.vertical","minimum_size_hint":[20,20],"size_hint":[20,84]}, +{"class":"QScrollBar","font":"Noto Sans 10","id":"scroll_bar.horizontal","minimum_size_hint":[-1,-1],"size_hint":[62,21]}, +{"class":"QScrollBar","font":"Noto Sans 10","id":"scroll_bar.vertical","minimum_size_hint":[-1,-1],"size_hint":[21,62]}, +{"class":"QProgressBar","config":{"text_visible":true},"font":"Noto Sans 10","id":"progress_bar","minimum_size_hint":[91,20],"size_hint":[91,26]}, +{"class":"QProgressBar","config":{"text_visible":false},"font":"Noto Sans 10","id":"progress_bar.no_text","minimum_size_hint":[91,20],"size_hint":[91,26]}, +{"class":"QProgressBar","config":{"orientation":2},"font":"Noto Sans 10","id":"progress_bar.vertical","minimum_size_hint":[20,91],"size_hint":[26,91]}, +{"class":"QMenu","config":{"icons":true},"font":"Noto Sans 10","id":"menu.with_icon","minimum_size_hint":[-1,-1],"rows":[{"geometry":[4,4,173,29],"icon":true,"kind":"item","text":"Open"},{"geometry":[4,33,173,29],"icon":false,"kind":"shortcut","text":"Save"},{"geometry":[4,62,173,5],"icon":false,"kind":"separator","text":""},{"geometry":[4,67,173,28],"icon":false,"kind":"section","text":"Section"},{"geometry":[4,95,173,29],"icon":false,"kind":"checkable","text":"Checkable"},{"geometry":[4,124,173,29],"icon":false,"kind":"submenu","text":"Submenu"}],"size_hint":[181,157]}, +{"class":"QMenu","config":{"icons":false},"font":"Noto Sans 10","id":"menu.no_icons","minimum_size_hint":[-1,-1],"rows":[{"geometry":[4,4,151,29],"icon":false,"kind":"item","text":"Open"},{"geometry":[4,33,151,29],"icon":false,"kind":"shortcut","text":"Save"},{"geometry":[4,62,151,5],"icon":false,"kind":"separator","text":""},{"geometry":[4,67,151,28],"icon":false,"kind":"section","text":"Section"},{"geometry":[4,95,151,29],"icon":false,"kind":"checkable","text":"Checkable"},{"geometry":[4,124,151,29],"icon":false,"kind":"submenu","text":"Submenu"}],"size_hint":[159,157]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":false,"shape":0,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 10","id":"tab_bar","minimum_size_hint":[139,30],"size_hint":[244,30],"tab_rects":[[0,0,80,30],[80,0,84,30],[164,0,80,30]]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":true,"shape":0,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 10","id":"tab_bar.document_mode","minimum_size_hint":[139,30],"size_hint":[244,30],"tab_rects":[[0,0,80,30],[80,0,84,30],[164,0,80,30]]}, +{"class":"QTabBar","config":{"closable":true,"document_mode":false,"shape":0,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 10","id":"tab_bar.closable","minimum_size_hint":[139,30],"size_hint":[264,30],"tab_rects":[[0,0,80,30],[80,0,104,30],[184,0,80,30]]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":false,"shape":2,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 10","id":"tab_bar.west","minimum_size_hint":[30,139],"size_hint":[30,244],"tab_rects":[[0,0,30,80],[0,80,30,84],[0,164,30,80]]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":false,"shape":1,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 10","id":"tab_bar.south","minimum_size_hint":[139,30],"size_hint":[244,30],"tab_rects":[[0,0,80,30],[80,0,84,30],[164,0,80,30]]}, +{"class":"QHeaderView","default_section_size":100,"font":"Noto Sans 10","id":"header.horizontal","minimum_section_size":49,"minimum_size_hint":[83,83],"section_size_hint":[51,49],"size_hint":[51,30]}, +{"class":"QHeaderView","default_section_size":30,"font":"Noto Sans 10","id":"header.vertical","minimum_section_size":30,"minimum_size_hint":[83,83],"section_size_hint":[30,30],"size_hint":[20,30]}, +{"class":"QTableView","font":"Noto Sans 10","id":"table_view","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":23}, +{"class":"QHeaderView","config":{"sort_indicator":true},"font":"Noto Sans 10","id":"header.horizontal.sort_indicator","minimum_size_hint":[83,83],"section_size_hint":[65,52],"size_hint":[65,30]}, +{"class":"QListView","config":{"check":false,"icon":false},"font":"Noto Sans 10","id":"list_view","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":24}, +{"class":"QListView","config":{"check":false,"icon":true},"font":"Noto Sans 10","id":"list_view.icon","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":26}, +{"class":"QListView","config":{"check":true,"icon":false},"font":"Noto Sans 10","id":"list_view.check","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":26}, +{"class":"QTreeView","config":{"icon":false},"font":"Noto Sans 10","header_height":30,"id":"tree_view","indentation":20,"minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":24}, +{"class":"QTreeView","config":{"icon":true},"font":"Noto Sans 10","header_height":30,"id":"tree_view.icon","indentation":20,"minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":26}, +{"class":"QLabel","config":{"text":"Label"},"font":"Noto Sans 8","id":"label","minimum_size_hint":[28,15],"size_hint":[28,15]}, +{"class":"QPushButton","config":{"text":"OK"},"font":"Noto Sans 8","id":"push_button","minimum_size_hint":[84,32],"size_hint":[84,32]}, +{"class":"QPushButton","config":{"text":"Cancel"},"font":"Noto Sans 8","id":"push_button","minimum_size_hint":[84,32],"size_hint":[84,32]}, +{"class":"QPushButton","config":{"text":"Apply changes"},"font":"Noto Sans 8","id":"push_button","minimum_size_hint":[92,32],"size_hint":[92,32]}, +{"class":"QPushButton","config":{"icon":true,"text":"Save"},"font":"Noto Sans 8","id":"push_button.icon","minimum_size_hint":[84,32],"size_hint":[84,32]}, +{"class":"QPushButton","config":{"default":true,"text":"OK"},"font":"Noto Sans 8","id":"push_button.default","minimum_size_hint":[84,32],"size_hint":[84,32]}, +{"class":"QPushButton","config":{"flat":true,"text":"OK"},"font":"Noto Sans 8","id":"push_button.flat","minimum_size_hint":[84,32],"size_hint":[84,32]}, +{"class":"QPushButton","config":{"icon":true},"font":"Noto Sans 8","id":"push_button.icon_only","minimum_size_hint":[31,32],"size_hint":[31,32]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 8","id":"tool_button.auto_raise.16","minimum_size_hint":[28,28],"size_hint":[28,28]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":22,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 8","id":"tool_button.auto_raise.22","minimum_size_hint":[34,34],"size_hint":[34,34]}, +{"class":"QToolButton","config":{"auto_raise":false,"icon_size":16,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 8","id":"tool_button.framed.16","minimum_size_hint":[32,32],"size_hint":[32,32]}, +{"class":"QToolButton","config":{"auto_raise":false,"icon_size":22,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 8","id":"tool_button.framed.22","minimum_size_hint":[38,38],"size_hint":[38,38]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":-1,"style":2,"text":"Tool"},"font":"Noto Sans 8","id":"tool_button.text_beside_icon.16","minimum_size_hint":[60,28],"size_hint":[60,28]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":22,"popup_mode":-1,"style":3,"text":"Tool"},"font":"Noto Sans 8","id":"tool_button.text_under_icon.22","minimum_size_hint":[40,53],"size_hint":[40,53]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":1,"style":0,"text":"Tool"},"font":"Noto Sans 8","id":"tool_button.menu_button_popup.16","minimum_size_hint":[48,28],"size_hint":[48,28]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":2,"style":0,"text":"Tool"},"font":"Noto Sans 8","id":"tool_button.instant_popup.16","minimum_size_hint":[28,28],"size_hint":[28,28]}, +{"class":"QLineEdit","font":"Noto Sans 8","id":"line_edit","minimum_size_hint":[47,29],"size_hint":[118,29]}, +{"class":"QLineEdit","config":{"clear_button":true},"font":"Noto Sans 8","id":"line_edit.clear_button","minimum_size_hint":[73,29],"size_hint":[144,29]}, +{"class":"QLineEdit","config":{"frame":false},"font":"Noto Sans 8","id":"line_edit.frameless","minimum_size_hint":[35,17],"size_hint":[106,17]}, +{"class":"QComboBox","config":{"items":["Item","Longer item text"]},"font":"Noto Sans 8","id":"combo_box","minimum_size_hint":[123,32],"size_hint":[123,32]}, +{"class":"QComboBox","config":{"editable":true},"font":"Noto Sans 8","id":"combo_box.editable","minimum_size_hint":[123,32],"size_hint":[80,32]}, +{"class":"QComboBox","config":{"icon":true},"font":"Noto Sans 8","id":"combo_box.icon","minimum_size_hint":[82,32],"size_hint":[82,32]}, +{"class":"QSpinBox","config":{"range":[0,99]},"font":"Noto Sans 8","id":"spin_box.0_99","minimum_size_hint":[49,29],"size_hint":[49,29]}, +{"class":"QSpinBox","config":{"range":[0,9999]},"font":"Noto Sans 8","id":"spin_box.0_9999","minimum_size_hint":[62,29],"size_hint":[62,29]}, +{"class":"QDoubleSpinBox","config":{"decimals":2,"range":[0,100]},"font":"Noto Sans 8","id":"double_spin_box","minimum_size_hint":[71,29],"size_hint":[71,29]}, +{"class":"QSpinBox","config":{"buttons":false,"range":[0,99]},"font":"Noto Sans 8","id":"spin_box.no_buttons","minimum_size_hint":[29,29],"size_hint":[29,29]}, +{"class":"QCheckBox","config":{"text":"Check"},"font":"Noto Sans 8","id":"check_box","minimum_size_hint":[56,20],"size_hint":[56,20]}, +{"class":"QCheckBox","font":"Noto Sans 8","id":"check_box.no_text","minimum_size_hint":[20,20],"size_hint":[20,20]}, +{"class":"QRadioButton","config":{"text":"Radio"},"font":"Noto Sans 8","id":"radio_button","minimum_size_hint":[54,20],"size_hint":[54,20]}, +{"class":"QRadioButton","font":"Noto Sans 8","id":"radio_button.no_text","minimum_size_hint":[20,20],"size_hint":[20,20]}, +{"class":"QSlider","config":{"orientation":1,"ticks":0},"font":"Noto Sans 8","id":"slider.horizontal","minimum_size_hint":[20,20],"size_hint":[84,20]}, +{"class":"QSlider","config":{"orientation":1,"ticks":2},"font":"Noto Sans 8","id":"slider.horizontal.ticks_below","minimum_size_hint":[20,23],"size_hint":[84,23]}, +{"class":"QSlider","config":{"orientation":1,"ticks":3},"font":"Noto Sans 8","id":"slider.horizontal.ticks_both","minimum_size_hint":[20,26],"size_hint":[84,26]}, +{"class":"QSlider","config":{"orientation":2,"ticks":0},"font":"Noto Sans 8","id":"slider.vertical","minimum_size_hint":[20,20],"size_hint":[20,84]}, +{"class":"QScrollBar","font":"Noto Sans 8","id":"scroll_bar.horizontal","minimum_size_hint":[-1,-1],"size_hint":[62,21]}, +{"class":"QScrollBar","font":"Noto Sans 8","id":"scroll_bar.vertical","minimum_size_hint":[-1,-1],"size_hint":[21,62]}, +{"class":"QProgressBar","config":{"text_visible":true},"font":"Noto Sans 8","id":"progress_bar","minimum_size_hint":[87,17],"size_hint":[87,23]}, +{"class":"QProgressBar","config":{"text_visible":false},"font":"Noto Sans 8","id":"progress_bar.no_text","minimum_size_hint":[87,17],"size_hint":[87,23]}, +{"class":"QProgressBar","config":{"orientation":2},"font":"Noto Sans 8","id":"progress_bar.vertical","minimum_size_hint":[17,87],"size_hint":[23,87]}, +{"class":"QMenu","config":{"icons":true},"font":"Noto Sans 8","id":"menu.with_icon","minimum_size_hint":[-1,-1],"rows":[{"geometry":[4,4,158,29],"icon":true,"kind":"item","text":"Open"},{"geometry":[4,33,158,29],"icon":false,"kind":"shortcut","text":"Save"},{"geometry":[4,62,158,5],"icon":false,"kind":"separator","text":""},{"geometry":[4,67,158,28],"icon":false,"kind":"section","text":"Section"},{"geometry":[4,95,158,29],"icon":false,"kind":"checkable","text":"Checkable"},{"geometry":[4,124,158,29],"icon":false,"kind":"submenu","text":"Submenu"}],"size_hint":[166,157]}, +{"class":"QMenu","config":{"icons":false},"font":"Noto Sans 8","id":"menu.no_icons","minimum_size_hint":[-1,-1],"rows":[{"geometry":[4,4,136,29],"icon":false,"kind":"item","text":"Open"},{"geometry":[4,33,136,29],"icon":false,"kind":"shortcut","text":"Save"},{"geometry":[4,62,136,5],"icon":false,"kind":"separator","text":""},{"geometry":[4,67,136,28],"icon":false,"kind":"section","text":"Section"},{"geometry":[4,95,136,29],"icon":false,"kind":"checkable","text":"Checkable"},{"geometry":[4,124,136,29],"icon":false,"kind":"submenu","text":"Submenu"}],"size_hint":[144,157]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":false,"shape":0,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 8","id":"tab_bar","minimum_size_hint":[139,30],"size_hint":[240,30],"tab_rects":[[0,0,80,30],[80,0,80,30],[160,0,80,30]]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":true,"shape":0,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 8","id":"tab_bar.document_mode","minimum_size_hint":[139,30],"size_hint":[240,30],"tab_rects":[[0,0,80,30],[80,0,80,30],[160,0,80,30]]}, +{"class":"QTabBar","config":{"closable":true,"document_mode":false,"shape":0,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 8","id":"tab_bar.closable","minimum_size_hint":[139,30],"size_hint":[254,30],"tab_rects":[[0,0,80,30],[80,0,94,30],[174,0,80,30]]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":false,"shape":2,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 8","id":"tab_bar.west","minimum_size_hint":[30,139],"size_hint":[30,240],"tab_rects":[[0,0,30,80],[0,80,30,80],[0,160,30,80]]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":false,"shape":1,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 8","id":"tab_bar.south","minimum_size_hint":[139,30],"size_hint":[240,30],"tab_rects":[[0,0,80,30],[80,0,80,30],[160,0,80,30]]}, +{"class":"QHeaderView","default_section_size":100,"font":"Noto Sans 8","id":"header.horizontal","minimum_section_size":43,"minimum_size_hint":[83,83],"section_size_hint":[45,43],"size_hint":[45,27]}, +{"class":"QHeaderView","default_section_size":30,"font":"Noto Sans 8","id":"header.vertical","minimum_section_size":27,"minimum_size_hint":[83,83],"section_size_hint":[27,27],"size_hint":[19,27]}, +{"class":"QTableView","font":"Noto Sans 8","id":"table_view","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":20}, +{"class":"QHeaderView","config":{"sort_indicator":true},"font":"Noto Sans 8","id":"header.horizontal.sort_indicator","minimum_size_hint":[83,83],"section_size_hint":[59,48],"size_hint":[59,27]}, +{"class":"QListView","config":{"check":false,"icon":false},"font":"Noto Sans 8","id":"list_view","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":21}, +{"class":"QListView","config":{"check":false,"icon":true},"font":"Noto Sans 8","id":"list_view.icon","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":24}, +{"class":"QListView","config":{"check":true,"icon":false},"font":"Noto Sans 8","id":"list_view.check","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":26}, +{"class":"QTreeView","config":{"icon":false},"font":"Noto Sans 8","header_height":27,"id":"tree_view","indentation":20,"minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":21}, +{"class":"QTreeView","config":{"icon":true},"font":"Noto Sans 8","header_height":27,"id":"tree_view.icon","indentation":20,"minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":24}, +{"class":"QLabel","config":{"text":"Label"},"font":"Noto Sans 9","id":"label","minimum_size_hint":[31,17],"size_hint":[31,17]}, +{"class":"QPushButton","config":{"text":"OK"},"font":"Noto Sans 9","id":"push_button","minimum_size_hint":[84,34],"size_hint":[84,34]}, +{"class":"QPushButton","config":{"text":"Cancel"},"font":"Noto Sans 9","id":"push_button","minimum_size_hint":[84,34],"size_hint":[84,34]}, +{"class":"QPushButton","config":{"text":"Apply changes"},"font":"Noto Sans 9","id":"push_button","minimum_size_hint":[98,34],"size_hint":[98,34]}, +{"class":"QPushButton","config":{"icon":true,"text":"Save"},"font":"Noto Sans 9","id":"push_button.icon","minimum_size_hint":[84,34],"size_hint":[84,34]}, +{"class":"QPushButton","config":{"default":true,"text":"OK"},"font":"Noto Sans 9","id":"push_button.default","minimum_size_hint":[84,34],"size_hint":[84,34]}, +{"class":"QPushButton","config":{"flat":true,"text":"OK"},"font":"Noto Sans 9","id":"push_button.flat","minimum_size_hint":[84,34],"size_hint":[84,34]}, +{"class":"QPushButton","config":{"icon":true},"font":"Noto Sans 9","id":"push_button.icon_only","minimum_size_hint":[31,32],"size_hint":[31,32]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 9","id":"tool_button.auto_raise.16","minimum_size_hint":[28,28],"size_hint":[28,28]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":22,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 9","id":"tool_button.auto_raise.22","minimum_size_hint":[34,34],"size_hint":[34,34]}, +{"class":"QToolButton","config":{"auto_raise":false,"icon_size":16,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 9","id":"tool_button.framed.16","minimum_size_hint":[32,32],"size_hint":[32,32]}, +{"class":"QToolButton","config":{"auto_raise":false,"icon_size":22,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 9","id":"tool_button.framed.22","minimum_size_hint":[38,38],"size_hint":[38,38]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":-1,"style":2,"text":"Tool"},"font":"Noto Sans 9","id":"tool_button.text_beside_icon.16","minimum_size_hint":[62,29],"size_hint":[62,29]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":22,"popup_mode":-1,"style":3,"text":"Tool"},"font":"Noto Sans 9","id":"tool_button.text_under_icon.22","minimum_size_hint":[42,55],"size_hint":[42,55]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":1,"style":0,"text":"Tool"},"font":"Noto Sans 9","id":"tool_button.menu_button_popup.16","minimum_size_hint":[48,28],"size_hint":[48,28]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":2,"style":0,"text":"Tool"},"font":"Noto Sans 9","id":"tool_button.instant_popup.16","minimum_size_hint":[28,28],"size_hint":[28,28]}, +{"class":"QLineEdit","font":"Noto Sans 9","id":"line_edit","minimum_size_hint":[50,31],"size_hint":[118,31]}, +{"class":"QLineEdit","config":{"clear_button":true},"font":"Noto Sans 9","id":"line_edit.clear_button","minimum_size_hint":[76,31],"size_hint":[144,31]}, +{"class":"QLineEdit","config":{"frame":false},"font":"Noto Sans 9","id":"line_edit.frameless","minimum_size_hint":[38,19],"size_hint":[106,19]}, +{"class":"QComboBox","config":{"items":["Item","Longer item text"]},"font":"Noto Sans 9","id":"combo_box","minimum_size_hint":[131,32],"size_hint":[131,32]}, +{"class":"QComboBox","config":{"editable":true},"font":"Noto Sans 9","id":"combo_box.editable","minimum_size_hint":[131,32],"size_hint":[80,32]}, +{"class":"QComboBox","config":{"icon":true},"font":"Noto Sans 9","id":"combo_box.icon","minimum_size_hint":[85,32],"size_hint":[85,32]}, +{"class":"QSpinBox","config":{"range":[0,99]},"font":"Noto Sans 9","id":"spin_box.0_99","minimum_size_hint":[51,31],"size_hint":[51,31]}, +{"class":"QSpinBox","config":{"range":[0,9999]},"font":"Noto Sans 9","id":"spin_box.0_9999","minimum_size_hint":[65,31],"size_hint":[65,31]}, +{"class":"QDoubleSpinBox","config":{"decimals":2,"range":[0,100]},"font":"Noto Sans 9","id":"double_spin_box","minimum_size_hint":[75,31],"size_hint":[75,31]}, +{"class":"QSpinBox","config":{"buttons":false,"range":[0,99]},"font":"Noto Sans 9","id":"spin_box.no_buttons","minimum_size_hint":[31,31],"size_hint":[31,31]}, +{"class":"QCheckBox","config":{"text":"Check"},"font":"Noto Sans 9","id":"check_box","minimum_size_hint":[59,21],"size_hint":[59,21]}, +{"class":"QCheckBox","font":"Noto Sans 9","id":"check_box.no_text","minimum_size_hint":[20,20],"size_hint":[20,20]}, +{"class":"QRadioButton","config":{"text":"Radio"},"font":"Noto Sans 9","id":"radio_button","minimum_size_hint":[56,21],"size_hint":[56,21]}, +{"class":"QRadioButton","font":"Noto Sans 9","id":"radio_button.no_text","minimum_size_hint":[20,20],"size_hint":[20,20]}, +{"class":"QSlider","config":{"orientation":1,"ticks":0},"font":"Noto Sans 9","id":"slider.horizontal","minimum_size_hint":[20,20],"size_hint":[84,20]}, +{"class":"QSlider","config":{"orientation":1,"ticks":2},"font":"Noto Sans 9","id":"slider.horizontal.ticks_below","minimum_size_hint":[20,23],"size_hint":[84,23]}, +{"class":"QSlider","config":{"orientation":1,"ticks":3},"font":"Noto Sans 9","id":"slider.horizontal.ticks_both","minimum_size_hint":[20,26],"size_hint":[84,26]}, +{"class":"QSlider","config":{"orientation":2,"ticks":0},"font":"Noto Sans 9","id":"slider.vertical","minimum_size_hint":[20,20],"size_hint":[20,84]}, +{"class":"QScrollBar","font":"Noto Sans 9","id":"scroll_bar.horizontal","minimum_size_hint":[-1,-1],"size_hint":[62,21]}, +{"class":"QScrollBar","font":"Noto Sans 9","id":"scroll_bar.vertical","minimum_size_hint":[-1,-1],"size_hint":[21,62]}, +{"class":"QProgressBar","config":{"text_visible":true},"font":"Noto Sans 9","id":"progress_bar","minimum_size_hint":[91,19],"size_hint":[91,25]}, +{"class":"QProgressBar","config":{"text_visible":false},"font":"Noto Sans 9","id":"progress_bar.no_text","minimum_size_hint":[91,19],"size_hint":[91,25]}, +{"class":"QProgressBar","config":{"orientation":2},"font":"Noto Sans 9","id":"progress_bar.vertical","minimum_size_hint":[19,91],"size_hint":[25,91]}, +{"class":"QMenu","config":{"icons":true},"font":"Noto Sans 9","id":"menu.with_icon","minimum_size_hint":[-1,-1],"rows":[{"geometry":[4,4,165,29],"icon":true,"kind":"item","text":"Open"},{"geometry":[4,33,165,29],"icon":false,"kind":"shortcut","text":"Save"},{"geometry":[4,62,165,5],"icon":false,"kind":"separator","text":""},{"geometry":[4,67,165,28],"icon":false,"kind":"section","text":"Section"},{"geometry":[4,95,165,29],"icon":false,"kind":"checkable","text":"Checkable"},{"geometry":[4,124,165,29],"icon":false,"kind":"submenu","text":"Submenu"}],"size_hint":[173,157]}, +{"class":"QMenu","config":{"icons":false},"font":"Noto Sans 9","id":"menu.no_icons","minimum_size_hint":[-1,-1],"rows":[{"geometry":[4,4,143,29],"icon":false,"kind":"item","text":"Open"},{"geometry":[4,33,143,29],"icon":false,"kind":"shortcut","text":"Save"},{"geometry":[4,62,143,5],"icon":false,"kind":"separator","text":""},{"geometry":[4,67,143,28],"icon":false,"kind":"section","text":"Section"},{"geometry":[4,95,143,29],"icon":false,"kind":"checkable","text":"Checkable"},{"geometry":[4,124,143,29],"icon":false,"kind":"submenu","text":"Submenu"}],"size_hint":[151,157]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":false,"shape":0,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 9","id":"tab_bar","minimum_size_hint":[139,30],"size_hint":[240,30],"tab_rects":[[0,0,80,30],[80,0,80,30],[160,0,80,30]]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":true,"shape":0,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 9","id":"tab_bar.document_mode","minimum_size_hint":[139,30],"size_hint":[240,30],"tab_rects":[[0,0,80,30],[80,0,80,30],[160,0,80,30]]}, +{"class":"QTabBar","config":{"closable":true,"document_mode":false,"shape":0,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 9","id":"tab_bar.closable","minimum_size_hint":[139,30],"size_hint":[259,30],"tab_rects":[[0,0,80,30],[80,0,99,30],[179,0,80,30]]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":false,"shape":2,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 9","id":"tab_bar.west","minimum_size_hint":[30,139],"size_hint":[30,240],"tab_rects":[[0,0,30,80],[0,80,30,80],[0,160,30,80]]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":false,"shape":1,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 9","id":"tab_bar.south","minimum_size_hint":[139,30],"size_hint":[240,30],"tab_rects":[[0,0,80,30],[80,0,80,30],[160,0,80,30]]}, +{"class":"QHeaderView","default_section_size":100,"font":"Noto Sans 9","id":"header.horizontal","minimum_section_size":46,"minimum_size_hint":[83,83],"section_size_hint":[48,46],"size_hint":[48,29]}, +{"class":"QHeaderView","default_section_size":30,"font":"Noto Sans 9","id":"header.vertical","minimum_section_size":29,"minimum_size_hint":[83,83],"section_size_hint":[29,29],"size_hint":[19,29]}, +{"class":"QTableView","font":"Noto Sans 9","id":"table_view","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":22}, +{"class":"QHeaderView","config":{"sort_indicator":true},"font":"Noto Sans 9","id":"header.horizontal.sort_indicator","minimum_size_hint":[83,83],"section_size_hint":[62,50],"size_hint":[62,29]}, +{"class":"QListView","config":{"check":false,"icon":false},"font":"Noto Sans 9","id":"list_view","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":23}, +{"class":"QListView","config":{"check":false,"icon":true},"font":"Noto Sans 9","id":"list_view.icon","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":25}, +{"class":"QListView","config":{"check":true,"icon":false},"font":"Noto Sans 9","id":"list_view.check","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":26}, +{"class":"QTreeView","config":{"icon":false},"font":"Noto Sans 9","header_height":29,"id":"tree_view","indentation":20,"minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":23}, +{"class":"QTreeView","config":{"icon":true},"font":"Noto Sans 9","header_height":29,"id":"tree_view.icon","indentation":20,"minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":25}, +{"class":"QLabel","config":{"text":"Label"},"font":"Noto Sans 11","id":"label","minimum_size_hint":[38,21],"size_hint":[38,21]}, +{"class":"QPushButton","config":{"text":"OK"},"font":"Noto Sans 11","id":"push_button","minimum_size_hint":[84,38],"size_hint":[84,38]}, +{"class":"QPushButton","config":{"text":"Cancel"},"font":"Noto Sans 11","id":"push_button","minimum_size_hint":[84,38],"size_hint":[84,38]}, +{"class":"QPushButton","config":{"text":"Apply changes"},"font":"Noto Sans 11","id":"push_button","minimum_size_hint":[120,38],"size_hint":[120,38]}, +{"class":"QPushButton","config":{"icon":true,"text":"Save"},"font":"Noto Sans 11","id":"push_button.icon","minimum_size_hint":[84,38],"size_hint":[84,38]}, +{"class":"QPushButton","config":{"default":true,"text":"OK"},"font":"Noto Sans 11","id":"push_button.default","minimum_size_hint":[84,38],"size_hint":[84,38]}, +{"class":"QPushButton","config":{"flat":true,"text":"OK"},"font":"Noto Sans 11","id":"push_button.flat","minimum_size_hint":[84,38],"size_hint":[84,38]}, +{"class":"QPushButton","config":{"icon":true},"font":"Noto Sans 11","id":"push_button.icon_only","minimum_size_hint":[31,32],"size_hint":[31,32]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 11","id":"tool_button.auto_raise.16","minimum_size_hint":[28,28],"size_hint":[28,28]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":22,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 11","id":"tool_button.auto_raise.22","minimum_size_hint":[34,34],"size_hint":[34,34]}, +{"class":"QToolButton","config":{"auto_raise":false,"icon_size":16,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 11","id":"tool_button.framed.16","minimum_size_hint":[32,32],"size_hint":[32,32]}, +{"class":"QToolButton","config":{"auto_raise":false,"icon_size":22,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 11","id":"tool_button.framed.22","minimum_size_hint":[38,38],"size_hint":[38,38]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":-1,"style":2,"text":"Tool"},"font":"Noto Sans 11","id":"tool_button.text_beside_icon.16","minimum_size_hint":[70,33],"size_hint":[70,33]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":22,"popup_mode":-1,"style":3,"text":"Tool"},"font":"Noto Sans 11","id":"tool_button.text_under_icon.22","minimum_size_hint":[50,59],"size_hint":[50,59]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":1,"style":0,"text":"Tool"},"font":"Noto Sans 11","id":"tool_button.menu_button_popup.16","minimum_size_hint":[48,28],"size_hint":[48,28]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":2,"style":0,"text":"Tool"},"font":"Noto Sans 11","id":"tool_button.instant_popup.16","minimum_size_hint":[28,28],"size_hint":[28,28]}, +{"class":"QLineEdit","font":"Noto Sans 11","id":"line_edit","minimum_size_hint":[59,34],"size_hint":[152,34]}, +{"class":"QLineEdit","config":{"clear_button":true},"font":"Noto Sans 11","id":"line_edit.clear_button","minimum_size_hint":[85,34],"size_hint":[178,34]}, +{"class":"QLineEdit","config":{"frame":false},"font":"Noto Sans 11","id":"line_edit.frameless","minimum_size_hint":[47,22],"size_hint":[140,22]}, +{"class":"QComboBox","config":{"items":["Item","Longer item text"]},"font":"Noto Sans 11","id":"combo_box","minimum_size_hint":[155,35],"size_hint":[155,35]}, +{"class":"QComboBox","config":{"editable":true},"font":"Noto Sans 11","id":"combo_box.editable","minimum_size_hint":[155,35],"size_hint":[94,35]}, +{"class":"QComboBox","config":{"icon":true},"font":"Noto Sans 11","id":"combo_box.icon","minimum_size_hint":[90,35],"size_hint":[90,35]}, +{"class":"QSpinBox","config":{"range":[0,99]},"font":"Noto Sans 11","id":"spin_box.0_99","minimum_size_hint":[55,34],"size_hint":[55,34]}, +{"class":"QSpinBox","config":{"range":[0,9999]},"font":"Noto Sans 11","id":"spin_box.0_9999","minimum_size_hint":[72,34],"size_hint":[72,34]}, +{"class":"QDoubleSpinBox","config":{"decimals":2,"range":[0,100]},"font":"Noto Sans 11","id":"double_spin_box","minimum_size_hint":[85,34],"size_hint":[85,34]}, +{"class":"QSpinBox","config":{"buttons":false,"range":[0,99]},"font":"Noto Sans 11","id":"spin_box.no_buttons","minimum_size_hint":[35,34],"size_hint":[35,34]}, +{"class":"QCheckBox","config":{"text":"Check"},"font":"Noto Sans 11","id":"check_box","minimum_size_hint":[67,25],"size_hint":[67,25]}, +{"class":"QCheckBox","font":"Noto Sans 11","id":"check_box.no_text","minimum_size_hint":[20,20],"size_hint":[20,20]}, +{"class":"QRadioButton","config":{"text":"Radio"},"font":"Noto Sans 11","id":"radio_button","minimum_size_hint":[64,25],"size_hint":[64,25]}, +{"class":"QRadioButton","font":"Noto Sans 11","id":"radio_button.no_text","minimum_size_hint":[20,20],"size_hint":[20,20]}, +{"class":"QSlider","config":{"orientation":1,"ticks":0},"font":"Noto Sans 11","id":"slider.horizontal","minimum_size_hint":[20,20],"size_hint":[84,20]}, +{"class":"QSlider","config":{"orientation":1,"ticks":2},"font":"Noto Sans 11","id":"slider.horizontal.ticks_below","minimum_size_hint":[20,23],"size_hint":[84,23]}, +{"class":"QSlider","config":{"orientation":1,"ticks":3},"font":"Noto Sans 11","id":"slider.horizontal.ticks_both","minimum_size_hint":[20,26],"size_hint":[84,26]}, +{"class":"QSlider","config":{"orientation":2,"ticks":0},"font":"Noto Sans 11","id":"slider.vertical","minimum_size_hint":[20,20],"size_hint":[20,84]}, +{"class":"QScrollBar","font":"Noto Sans 11","id":"scroll_bar.horizontal","minimum_size_hint":[-1,-1],"size_hint":[62,21]}, +{"class":"QScrollBar","font":"Noto Sans 11","id":"scroll_bar.vertical","minimum_size_hint":[-1,-1],"size_hint":[21,62]}, +{"class":"QProgressBar","config":{"text_visible":true},"font":"Noto Sans 11","id":"progress_bar","minimum_size_hint":[99,22],"size_hint":[99,28]}, +{"class":"QProgressBar","config":{"text_visible":false},"font":"Noto Sans 11","id":"progress_bar.no_text","minimum_size_hint":[99,22],"size_hint":[99,28]}, +{"class":"QProgressBar","config":{"orientation":2},"font":"Noto Sans 11","id":"progress_bar.vertical","minimum_size_hint":[22,99],"size_hint":[28,99]}, +{"class":"QMenu","config":{"icons":true},"font":"Noto Sans 11","id":"menu.with_icon","minimum_size_hint":[-1,-1],"rows":[{"geometry":[4,4,189,30],"icon":true,"kind":"item","text":"Open"},{"geometry":[4,34,189,30],"icon":false,"kind":"shortcut","text":"Save"},{"geometry":[4,64,189,5],"icon":false,"kind":"separator","text":""},{"geometry":[4,69,189,28],"icon":false,"kind":"section","text":"Section"},{"geometry":[4,97,189,30],"icon":false,"kind":"checkable","text":"Checkable"},{"geometry":[4,127,189,30],"icon":false,"kind":"submenu","text":"Submenu"}],"size_hint":[197,161]}, +{"class":"QMenu","config":{"icons":false},"font":"Noto Sans 11","id":"menu.no_icons","minimum_size_hint":[-1,-1],"rows":[{"geometry":[4,4,167,30],"icon":false,"kind":"item","text":"Open"},{"geometry":[4,34,167,30],"icon":false,"kind":"shortcut","text":"Save"},{"geometry":[4,64,167,5],"icon":false,"kind":"separator","text":""},{"geometry":[4,69,167,28],"icon":false,"kind":"section","text":"Section"},{"geometry":[4,97,167,30],"icon":false,"kind":"checkable","text":"Checkable"},{"geometry":[4,127,167,30],"icon":false,"kind":"submenu","text":"Submenu"}],"size_hint":[175,161]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":false,"shape":0,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 11","id":"tab_bar","minimum_size_hint":[139,30],"size_hint":[255,30],"tab_rects":[[0,0,80,30],[80,0,95,30],[175,0,80,30]]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":true,"shape":0,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 11","id":"tab_bar.document_mode","minimum_size_hint":[139,30],"size_hint":[255,30],"tab_rects":[[0,0,80,30],[80,0,95,30],[175,0,80,30]]}, +{"class":"QTabBar","config":{"closable":true,"document_mode":false,"shape":0,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 11","id":"tab_bar.closable","minimum_size_hint":[139,30],"size_hint":[275,30],"tab_rects":[[0,0,80,30],[80,0,115,30],[195,0,80,30]]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":false,"shape":2,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 11","id":"tab_bar.west","minimum_size_hint":[30,139],"size_hint":[30,255],"tab_rects":[[0,0,30,80],[0,80,30,95],[0,175,30,80]]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":false,"shape":1,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 11","id":"tab_bar.south","minimum_size_hint":[139,30],"size_hint":[255,30],"tab_rects":[[0,0,80,30],[80,0,95,30],[175,0,80,30]]}, +{"class":"QHeaderView","default_section_size":100,"font":"Noto Sans 11","id":"header.horizontal","minimum_section_size":55,"minimum_size_hint":[83,83],"section_size_hint":[57,55],"size_hint":[57,33]}, +{"class":"QHeaderView","default_section_size":32,"font":"Noto Sans 11","id":"header.vertical","minimum_section_size":32,"minimum_size_hint":[83,83],"section_size_hint":[33,33],"size_hint":[21,33]}, +{"class":"QTableView","font":"Noto Sans 11","id":"table_view","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":26}, +{"class":"QHeaderView","config":{"sort_indicator":true},"font":"Noto Sans 11","id":"header.horizontal.sort_indicator","minimum_size_hint":[83,83],"section_size_hint":[71,55],"size_hint":[71,33]}, +{"class":"QListView","config":{"check":false,"icon":false},"font":"Noto Sans 11","id":"list_view","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":27}, +{"class":"QListView","config":{"check":false,"icon":true},"font":"Noto Sans 11","id":"list_view.icon","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":29}, +{"class":"QListView","config":{"check":true,"icon":false},"font":"Noto Sans 11","id":"list_view.check","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":27}, +{"class":"QTreeView","config":{"icon":false},"font":"Noto Sans 11","header_height":33,"id":"tree_view","indentation":20,"minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":27}, +{"class":"QTreeView","config":{"icon":true},"font":"Noto Sans 11","header_height":33,"id":"tree_view.icon","indentation":20,"minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":29}, +{"class":"QLabel","config":{"text":"Label"},"font":"Noto Sans 12","id":"label","minimum_size_hint":[41,22],"size_hint":[41,22]}, +{"class":"QPushButton","config":{"text":"OK"},"font":"Noto Sans 12","id":"push_button","minimum_size_hint":[84,38],"size_hint":[84,38]}, +{"class":"QPushButton","config":{"text":"Cancel"},"font":"Noto Sans 12","id":"push_button","minimum_size_hint":[84,38],"size_hint":[84,38]}, +{"class":"QPushButton","config":{"text":"Apply changes"},"font":"Noto Sans 12","id":"push_button","minimum_size_hint":[126,38],"size_hint":[126,38]}, +{"class":"QPushButton","config":{"icon":true,"text":"Save"},"font":"Noto Sans 12","id":"push_button.icon","minimum_size_hint":[84,38],"size_hint":[84,38]}, +{"class":"QPushButton","config":{"default":true,"text":"OK"},"font":"Noto Sans 12","id":"push_button.default","minimum_size_hint":[84,38],"size_hint":[84,38]}, +{"class":"QPushButton","config":{"flat":true,"text":"OK"},"font":"Noto Sans 12","id":"push_button.flat","minimum_size_hint":[84,38],"size_hint":[84,38]}, +{"class":"QPushButton","config":{"icon":true},"font":"Noto Sans 12","id":"push_button.icon_only","minimum_size_hint":[31,32],"size_hint":[31,32]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 12","id":"tool_button.auto_raise.16","minimum_size_hint":[28,28],"size_hint":[28,28]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":22,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 12","id":"tool_button.auto_raise.22","minimum_size_hint":[34,34],"size_hint":[34,34]}, +{"class":"QToolButton","config":{"auto_raise":false,"icon_size":16,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 12","id":"tool_button.framed.16","minimum_size_hint":[32,32],"size_hint":[32,32]}, +{"class":"QToolButton","config":{"auto_raise":false,"icon_size":22,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 12","id":"tool_button.framed.22","minimum_size_hint":[38,38],"size_hint":[38,38]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":-1,"style":2,"text":"Tool"},"font":"Noto Sans 12","id":"tool_button.text_beside_icon.16","minimum_size_hint":[72,34],"size_hint":[72,34]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":22,"popup_mode":-1,"style":3,"text":"Tool"},"font":"Noto Sans 12","id":"tool_button.text_under_icon.22","minimum_size_hint":[52,60],"size_hint":[52,60]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":1,"style":0,"text":"Tool"},"font":"Noto Sans 12","id":"tool_button.menu_button_popup.16","minimum_size_hint":[48,28],"size_hint":[48,28]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":2,"style":0,"text":"Tool"},"font":"Noto Sans 12","id":"tool_button.instant_popup.16","minimum_size_hint":[28,28],"size_hint":[28,28]}, +{"class":"QLineEdit","font":"Noto Sans 12","id":"line_edit","minimum_size_hint":[61,36],"size_hint":[152,36]}, +{"class":"QLineEdit","config":{"clear_button":true},"font":"Noto Sans 12","id":"line_edit.clear_button","minimum_size_hint":[87,36],"size_hint":[178,36]}, +{"class":"QLineEdit","config":{"frame":false},"font":"Noto Sans 12","id":"line_edit.frameless","minimum_size_hint":[49,24],"size_hint":[140,24]}, +{"class":"QComboBox","config":{"items":["Item","Longer item text"]},"font":"Noto Sans 12","id":"combo_box","minimum_size_hint":[162,36],"size_hint":[162,36]}, +{"class":"QComboBox","config":{"editable":true},"font":"Noto Sans 12","id":"combo_box.editable","minimum_size_hint":[162,36],"size_hint":[94,36]}, +{"class":"QComboBox","config":{"icon":true},"font":"Noto Sans 12","id":"combo_box.icon","minimum_size_hint":[93,36],"size_hint":[93,36]}, +{"class":"QSpinBox","config":{"range":[0,99]},"font":"Noto Sans 12","id":"spin_box.0_99","minimum_size_hint":[56,36],"size_hint":[56,36]}, +{"class":"QSpinBox","config":{"range":[0,9999]},"font":"Noto Sans 12","id":"spin_box.0_9999","minimum_size_hint":[75,36],"size_hint":[75,36]}, +{"class":"QDoubleSpinBox","config":{"decimals":2,"range":[0,100]},"font":"Noto Sans 12","id":"double_spin_box","minimum_size_hint":[88,36],"size_hint":[88,36]}, +{"class":"QSpinBox","config":{"buttons":false,"range":[0,99]},"font":"Noto Sans 12","id":"spin_box.no_buttons","minimum_size_hint":[36,36],"size_hint":[36,36]}, +{"class":"QCheckBox","config":{"text":"Check"},"font":"Noto Sans 12","id":"check_box","minimum_size_hint":[70,26],"size_hint":[70,26]}, +{"class":"QCheckBox","font":"Noto Sans 12","id":"check_box.no_text","minimum_size_hint":[20,20],"size_hint":[20,20]}, +{"class":"QRadioButton","config":{"text":"Radio"},"font":"Noto Sans 12","id":"radio_button","minimum_size_hint":[67,26],"size_hint":[67,26]}, +{"class":"QRadioButton","font":"Noto Sans 12","id":"radio_button.no_text","minimum_size_hint":[20,20],"size_hint":[20,20]}, +{"class":"QSlider","config":{"orientation":1,"ticks":0},"font":"Noto Sans 12","id":"slider.horizontal","minimum_size_hint":[20,20],"size_hint":[84,20]}, +{"class":"QSlider","config":{"orientation":1,"ticks":2},"font":"Noto Sans 12","id":"slider.horizontal.ticks_below","minimum_size_hint":[20,23],"size_hint":[84,23]}, +{"class":"QSlider","config":{"orientation":1,"ticks":3},"font":"Noto Sans 12","id":"slider.horizontal.ticks_both","minimum_size_hint":[20,26],"size_hint":[84,26]}, +{"class":"QSlider","config":{"orientation":2,"ticks":0},"font":"Noto Sans 12","id":"slider.vertical","minimum_size_hint":[20,20],"size_hint":[20,84]}, +{"class":"QScrollBar","font":"Noto Sans 12","id":"scroll_bar.horizontal","minimum_size_hint":[-1,-1],"size_hint":[62,21]}, +{"class":"QScrollBar","font":"Noto Sans 12","id":"scroll_bar.vertical","minimum_size_hint":[-1,-1],"size_hint":[21,62]}, +{"class":"QProgressBar","config":{"text_visible":true},"font":"Noto Sans 12","id":"progress_bar","minimum_size_hint":[99,24],"size_hint":[99,30]}, +{"class":"QProgressBar","config":{"text_visible":false},"font":"Noto Sans 12","id":"progress_bar.no_text","minimum_size_hint":[99,24],"size_hint":[99,30]}, +{"class":"QProgressBar","config":{"orientation":2},"font":"Noto Sans 12","id":"progress_bar.vertical","minimum_size_hint":[24,99],"size_hint":[30,99]}, +{"class":"QMenu","config":{"icons":true},"font":"Noto Sans 12","id":"menu.with_icon","minimum_size_hint":[-1,-1],"rows":[{"geometry":[4,4,197,31],"icon":true,"kind":"item","text":"Open"},{"geometry":[4,35,197,31],"icon":false,"kind":"shortcut","text":"Save"},{"geometry":[4,66,197,5],"icon":false,"kind":"separator","text":""},{"geometry":[4,71,197,30],"icon":false,"kind":"section","text":"Section"},{"geometry":[4,101,197,31],"icon":false,"kind":"checkable","text":"Checkable"},{"geometry":[4,132,197,31],"icon":false,"kind":"submenu","text":"Submenu"}],"size_hint":[205,167]}, +{"class":"QMenu","config":{"icons":false},"font":"Noto Sans 12","id":"menu.no_icons","minimum_size_hint":[-1,-1],"rows":[{"geometry":[4,4,175,31],"icon":false,"kind":"item","text":"Open"},{"geometry":[4,35,175,31],"icon":false,"kind":"shortcut","text":"Save"},{"geometry":[4,66,175,5],"icon":false,"kind":"separator","text":""},{"geometry":[4,71,175,30],"icon":false,"kind":"section","text":"Section"},{"geometry":[4,101,175,31],"icon":false,"kind":"checkable","text":"Checkable"},{"geometry":[4,132,175,31],"icon":false,"kind":"submenu","text":"Submenu"}],"size_hint":[183,167]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":false,"shape":0,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 12","id":"tab_bar","minimum_size_hint":[139,30],"size_hint":[260,30],"tab_rects":[[0,0,80,30],[80,0,100,30],[180,0,80,30]]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":true,"shape":0,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 12","id":"tab_bar.document_mode","minimum_size_hint":[139,30],"size_hint":[260,30],"tab_rects":[[0,0,80,30],[80,0,100,30],[180,0,80,30]]}, +{"class":"QTabBar","config":{"closable":true,"document_mode":false,"shape":0,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 12","id":"tab_bar.closable","minimum_size_hint":[139,30],"size_hint":[280,30],"tab_rects":[[0,0,80,30],[80,0,120,30],[200,0,80,30]]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":false,"shape":2,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 12","id":"tab_bar.west","minimum_size_hint":[30,139],"size_hint":[30,260],"tab_rects":[[0,0,30,80],[0,80,30,100],[0,180,30,80]]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":false,"shape":1,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 12","id":"tab_bar.south","minimum_size_hint":[139,30],"size_hint":[260,30],"tab_rects":[[0,0,80,30],[80,0,100,30],[180,0,80,30]]}, +{"class":"QHeaderView","default_section_size":100,"font":"Noto Sans 12","id":"header.horizontal","minimum_section_size":57,"minimum_size_hint":[83,83],"section_size_hint":[60,57],"size_hint":[60,34]}, +{"class":"QHeaderView","default_section_size":34,"font":"Noto Sans 12","id":"header.vertical","minimum_section_size":34,"minimum_size_hint":[83,83],"section_size_hint":[34,34],"size_hint":[22,34]}, +{"class":"QTableView","font":"Noto Sans 12","id":"table_view","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":27}, +{"class":"QHeaderView","config":{"sort_indicator":true},"font":"Noto Sans 12","id":"header.horizontal.sort_indicator","minimum_size_hint":[83,83],"section_size_hint":[74,57],"size_hint":[74,34]}, +{"class":"QListView","config":{"check":false,"icon":false},"font":"Noto Sans 12","id":"list_view","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":28}, +{"class":"QListView","config":{"check":false,"icon":true},"font":"Noto Sans 12","id":"list_view.icon","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":30}, +{"class":"QListView","config":{"check":true,"icon":false},"font":"Noto Sans 12","id":"list_view.check","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":28}, +{"class":"QTreeView","config":{"icon":false},"font":"Noto Sans 12","header_height":34,"id":"tree_view","indentation":20,"minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":28}, +{"class":"QTreeView","config":{"icon":true},"font":"Noto Sans 12","header_height":34,"id":"tree_view.icon","indentation":20,"minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":30}, +{"class":"QLabel","config":{"text":"Label"},"font":"Noto Sans 14","id":"label","minimum_size_hint":[48,26],"size_hint":[48,26]}, +{"class":"QPushButton","config":{"text":"OK"},"font":"Noto Sans 14","id":"push_button","minimum_size_hint":[84,42],"size_hint":[84,42]}, +{"class":"QPushButton","config":{"text":"Cancel"},"font":"Noto Sans 14","id":"push_button","minimum_size_hint":[84,42],"size_hint":[84,42]}, +{"class":"QPushButton","config":{"text":"Apply changes"},"font":"Noto Sans 14","id":"push_button","minimum_size_hint":[146,42],"size_hint":[146,42]}, +{"class":"QPushButton","config":{"icon":true,"text":"Save"},"font":"Noto Sans 14","id":"push_button.icon","minimum_size_hint":[84,42],"size_hint":[84,42]}, +{"class":"QPushButton","config":{"default":true,"text":"OK"},"font":"Noto Sans 14","id":"push_button.default","minimum_size_hint":[84,42],"size_hint":[84,42]}, +{"class":"QPushButton","config":{"flat":true,"text":"OK"},"font":"Noto Sans 14","id":"push_button.flat","minimum_size_hint":[84,42],"size_hint":[84,42]}, +{"class":"QPushButton","config":{"icon":true},"font":"Noto Sans 14","id":"push_button.icon_only","minimum_size_hint":[31,32],"size_hint":[31,32]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 14","id":"tool_button.auto_raise.16","minimum_size_hint":[28,28],"size_hint":[28,28]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":22,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 14","id":"tool_button.auto_raise.22","minimum_size_hint":[34,34],"size_hint":[34,34]}, +{"class":"QToolButton","config":{"auto_raise":false,"icon_size":16,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 14","id":"tool_button.framed.16","minimum_size_hint":[32,32],"size_hint":[32,32]}, +{"class":"QToolButton","config":{"auto_raise":false,"icon_size":22,"popup_mode":-1,"style":0,"text":"Tool"},"font":"Noto Sans 14","id":"tool_button.framed.22","minimum_size_hint":[38,38],"size_hint":[38,38]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":-1,"style":2,"text":"Tool"},"font":"Noto Sans 14","id":"tool_button.text_beside_icon.16","minimum_size_hint":[80,38],"size_hint":[80,38]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":22,"popup_mode":-1,"style":3,"text":"Tool"},"font":"Noto Sans 14","id":"tool_button.text_under_icon.22","minimum_size_hint":[60,64],"size_hint":[60,64]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":1,"style":0,"text":"Tool"},"font":"Noto Sans 14","id":"tool_button.menu_button_popup.16","minimum_size_hint":[48,28],"size_hint":[48,28]}, +{"class":"QToolButton","config":{"auto_raise":true,"icon_size":16,"popup_mode":2,"style":0,"text":"Tool"},"font":"Noto Sans 14","id":"tool_button.instant_popup.16","minimum_size_hint":[28,28],"size_hint":[28,28]}, +{"class":"QLineEdit","font":"Noto Sans 14","id":"line_edit","minimum_size_hint":[70,40],"size_hint":[186,40]}, +{"class":"QLineEdit","config":{"clear_button":true},"font":"Noto Sans 14","id":"line_edit.clear_button","minimum_size_hint":[96,40],"size_hint":[212,40]}, +{"class":"QLineEdit","config":{"frame":false},"font":"Noto Sans 14","id":"line_edit.frameless","minimum_size_hint":[58,28],"size_hint":[174,28]}, +{"class":"QComboBox","config":{"items":["Item","Longer item text"]},"font":"Noto Sans 14","id":"combo_box","minimum_size_hint":[185,40],"size_hint":[185,40]}, +{"class":"QComboBox","config":{"editable":true},"font":"Noto Sans 14","id":"combo_box.editable","minimum_size_hint":[185,40],"size_hint":[108,40]}, +{"class":"QComboBox","config":{"icon":true},"font":"Noto Sans 14","id":"combo_box.icon","minimum_size_hint":[99,40],"size_hint":[99,40]}, +{"class":"QSpinBox","config":{"range":[0,99]},"font":"Noto Sans 14","id":"spin_box.0_99","minimum_size_hint":[61,40],"size_hint":[61,40]}, +{"class":"QSpinBox","config":{"range":[0,9999]},"font":"Noto Sans 14","id":"spin_box.0_9999","minimum_size_hint":[82,40],"size_hint":[82,40]}, +{"class":"QDoubleSpinBox","config":{"decimals":2,"range":[0,100]},"font":"Noto Sans 14","id":"double_spin_box","minimum_size_hint":[98,40],"size_hint":[98,40]}, +{"class":"QSpinBox","config":{"buttons":false,"range":[0,99]},"font":"Noto Sans 14","id":"spin_box.no_buttons","minimum_size_hint":[41,40],"size_hint":[41,40]}, +{"class":"QCheckBox","config":{"text":"Check"},"font":"Noto Sans 14","id":"check_box","minimum_size_hint":[78,30],"size_hint":[78,30]}, +{"class":"QCheckBox","font":"Noto Sans 14","id":"check_box.no_text","minimum_size_hint":[20,20],"size_hint":[20,20]}, +{"class":"QRadioButton","config":{"text":"Radio"},"font":"Noto Sans 14","id":"radio_button","minimum_size_hint":[75,30],"size_hint":[75,30]}, +{"class":"QRadioButton","font":"Noto Sans 14","id":"radio_button.no_text","minimum_size_hint":[20,20],"size_hint":[20,20]}, +{"class":"QSlider","config":{"orientation":1,"ticks":0},"font":"Noto Sans 14","id":"slider.horizontal","minimum_size_hint":[20,20],"size_hint":[84,20]}, +{"class":"QSlider","config":{"orientation":1,"ticks":2},"font":"Noto Sans 14","id":"slider.horizontal.ticks_below","minimum_size_hint":[20,23],"size_hint":[84,23]}, +{"class":"QSlider","config":{"orientation":1,"ticks":3},"font":"Noto Sans 14","id":"slider.horizontal.ticks_both","minimum_size_hint":[20,26],"size_hint":[84,26]}, +{"class":"QSlider","config":{"orientation":2,"ticks":0},"font":"Noto Sans 14","id":"slider.vertical","minimum_size_hint":[20,20],"size_hint":[20,84]}, +{"class":"QScrollBar","font":"Noto Sans 14","id":"scroll_bar.horizontal","minimum_size_hint":[-1,-1],"size_hint":[62,21]}, +{"class":"QScrollBar","font":"Noto Sans 14","id":"scroll_bar.vertical","minimum_size_hint":[-1,-1],"size_hint":[21,62]}, +{"class":"QProgressBar","config":{"text_visible":true},"font":"Noto Sans 14","id":"progress_bar","minimum_size_hint":[107,28],"size_hint":[107,34]}, +{"class":"QProgressBar","config":{"text_visible":false},"font":"Noto Sans 14","id":"progress_bar.no_text","minimum_size_hint":[107,28],"size_hint":[107,34]}, +{"class":"QProgressBar","config":{"orientation":2},"font":"Noto Sans 14","id":"progress_bar.vertical","minimum_size_hint":[28,107],"size_hint":[34,107]}, +{"class":"QMenu","config":{"icons":true},"font":"Noto Sans 14","id":"menu.with_icon","minimum_size_hint":[-1,-1],"rows":[{"geometry":[4,4,219,35],"icon":true,"kind":"item","text":"Open"},{"geometry":[4,39,219,35],"icon":false,"kind":"shortcut","text":"Save"},{"geometry":[4,74,219,5],"icon":false,"kind":"separator","text":""},{"geometry":[4,79,219,34],"icon":false,"kind":"section","text":"Section"},{"geometry":[4,113,219,35],"icon":false,"kind":"checkable","text":"Checkable"},{"geometry":[4,148,219,35],"icon":false,"kind":"submenu","text":"Submenu"}],"size_hint":[227,187]}, +{"class":"QMenu","config":{"icons":false},"font":"Noto Sans 14","id":"menu.no_icons","minimum_size_hint":[-1,-1],"rows":[{"geometry":[4,4,197,35],"icon":false,"kind":"item","text":"Open"},{"geometry":[4,39,197,35],"icon":false,"kind":"shortcut","text":"Save"},{"geometry":[4,74,197,5],"icon":false,"kind":"separator","text":""},{"geometry":[4,79,197,34],"icon":false,"kind":"section","text":"Section"},{"geometry":[4,113,197,35],"icon":false,"kind":"checkable","text":"Checkable"},{"geometry":[4,148,197,35],"icon":false,"kind":"submenu","text":"Submenu"}],"size_hint":[205,187]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":false,"shape":0,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 14","id":"tab_bar","minimum_size_hint":[139,34],"size_hint":[276,34],"tab_rects":[[0,0,80,34],[80,0,116,34],[196,0,80,34]]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":true,"shape":0,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 14","id":"tab_bar.document_mode","minimum_size_hint":[139,34],"size_hint":[276,34],"tab_rects":[[0,0,80,34],[80,0,116,34],[196,0,80,34]]}, +{"class":"QTabBar","config":{"closable":true,"document_mode":false,"shape":0,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 14","id":"tab_bar.closable","minimum_size_hint":[139,34],"size_hint":[299,34],"tab_rects":[[0,0,80,34],[80,0,136,34],[216,0,83,34]]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":false,"shape":2,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 14","id":"tab_bar.west","minimum_size_hint":[34,139],"size_hint":[34,276],"tab_rects":[[0,0,34,80],[0,80,34,116],[0,196,34,80]]}, +{"class":"QTabBar","config":{"closable":false,"document_mode":false,"shape":1,"tabs":["Tab","Second tab","Third"]},"font":"Noto Sans 14","id":"tab_bar.south","minimum_size_hint":[139,34],"size_hint":[276,34],"tab_rects":[[0,0,80,34],[80,0,116,34],[196,0,80,34]]}, +{"class":"QHeaderView","default_section_size":100,"font":"Noto Sans 14","id":"header.horizontal","minimum_section_size":66,"minimum_size_hint":[83,83],"section_size_hint":[69,66],"size_hint":[69,38]}, +{"class":"QHeaderView","default_section_size":38,"font":"Noto Sans 14","id":"header.vertical","minimum_section_size":38,"minimum_size_hint":[83,83],"section_size_hint":[38,38],"size_hint":[23,38]}, +{"class":"QTableView","font":"Noto Sans 14","id":"table_view","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":31}, +{"class":"QHeaderView","config":{"sort_indicator":true},"font":"Noto Sans 14","id":"header.horizontal.sort_indicator","minimum_size_hint":[83,83],"section_size_hint":[83,66],"size_hint":[83,38]}, +{"class":"QListView","config":{"check":false,"icon":false},"font":"Noto Sans 14","id":"list_view","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":32}, +{"class":"QListView","config":{"check":false,"icon":true},"font":"Noto Sans 14","id":"list_view.icon","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":34}, +{"class":"QListView","config":{"check":true,"icon":false},"font":"Noto Sans 14","id":"list_view.check","minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":32}, +{"class":"QTreeView","config":{"icon":false},"font":"Noto Sans 14","header_height":38,"id":"tree_view","indentation":20,"minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":32}, +{"class":"QTreeView","config":{"icon":true},"font":"Noto Sans 14","header_height":38,"id":"tree_view.icon","indentation":20,"minimum_size_hint":[83,83],"size_hint":[256,192],"size_hint_for_row":34} +], +"legacy_font_weights": [ +{"legacy":0,"weight":100}, +{"legacy":1,"weight":100}, +{"legacy":2,"weight":100}, +{"legacy":3,"weight":100}, +{"legacy":4,"weight":100}, +{"legacy":5,"weight":100}, +{"legacy":6,"weight":100}, +{"legacy":7,"weight":200}, +{"legacy":8,"weight":200}, +{"legacy":9,"weight":200}, +{"legacy":10,"weight":200}, +{"legacy":11,"weight":200}, +{"legacy":12,"weight":200}, +{"legacy":13,"weight":200}, +{"legacy":14,"weight":200}, +{"legacy":15,"weight":200}, +{"legacy":16,"weight":200}, +{"legacy":17,"weight":200}, +{"legacy":18,"weight":200}, +{"legacy":19,"weight":300}, +{"legacy":20,"weight":300}, +{"legacy":21,"weight":300}, +{"legacy":22,"weight":300}, +{"legacy":23,"weight":300}, +{"legacy":24,"weight":300}, +{"legacy":25,"weight":300}, +{"legacy":26,"weight":300}, +{"legacy":27,"weight":300}, +{"legacy":28,"weight":300}, +{"legacy":29,"weight":300}, +{"legacy":30,"weight":300}, +{"legacy":31,"weight":300}, +{"legacy":32,"weight":300}, +{"legacy":33,"weight":300}, +{"legacy":34,"weight":300}, +{"legacy":35,"weight":300}, +{"legacy":36,"weight":300}, +{"legacy":37,"weight":300}, +{"legacy":38,"weight":400}, +{"legacy":39,"weight":400}, +{"legacy":40,"weight":400}, +{"legacy":41,"weight":400}, +{"legacy":42,"weight":400}, +{"legacy":43,"weight":400}, +{"legacy":44,"weight":400}, +{"legacy":45,"weight":400}, +{"legacy":46,"weight":400}, +{"legacy":47,"weight":400}, +{"legacy":48,"weight":400}, +{"legacy":49,"weight":400}, +{"legacy":50,"weight":400}, +{"legacy":51,"weight":400}, +{"legacy":52,"weight":400}, +{"legacy":53,"weight":400}, +{"legacy":54,"weight":500}, +{"legacy":55,"weight":500}, +{"legacy":56,"weight":500}, +{"legacy":57,"weight":500}, +{"legacy":58,"weight":500}, +{"legacy":59,"weight":500}, +{"legacy":60,"weight":500}, +{"legacy":61,"weight":600}, +{"legacy":62,"weight":600}, +{"legacy":63,"weight":600}, +{"legacy":64,"weight":600}, +{"legacy":65,"weight":600}, +{"legacy":66,"weight":600}, +{"legacy":67,"weight":600}, +{"legacy":68,"weight":600}, +{"legacy":69,"weight":600}, +{"legacy":70,"weight":700}, +{"legacy":71,"weight":700}, +{"legacy":72,"weight":700}, +{"legacy":73,"weight":700}, +{"legacy":74,"weight":700}, +{"legacy":75,"weight":700}, +{"legacy":76,"weight":700}, +{"legacy":77,"weight":700}, +{"legacy":78,"weight":700}, +{"legacy":79,"weight":800}, +{"legacy":80,"weight":800}, +{"legacy":81,"weight":800}, +{"legacy":82,"weight":800}, +{"legacy":83,"weight":800}, +{"legacy":84,"weight":800}, +{"legacy":85,"weight":900}, +{"legacy":86,"weight":900}, +{"legacy":87,"weight":900}, +{"legacy":88,"weight":900}, +{"legacy":89,"weight":900}, +{"legacy":90,"weight":900}, +{"legacy":91,"weight":900}, +{"legacy":92,"weight":900}, +{"legacy":93,"weight":900}, +{"legacy":94,"weight":900}, +{"legacy":95,"weight":900}, +{"legacy":96,"weight":900}, +{"legacy":97,"weight":900}, +{"legacy":98,"weight":900}, +{"legacy":99,"weight":900} +], +"tooltip": {"class":"QTipLabel","contents_margins":[0,0,0,0],"font":"Noto Sans 10","margin":4,"size_hint":[78,26],"text":"Tooltip text","text_size":[69,18]} +} diff --git a/tools/kde_golden/vectors/versions.txt b/tools/kde_golden/vectors/versions.txt new file mode 100644 index 000000000..a7abbc42e --- /dev/null +++ b/tools/kde_golden/vectors/versions.txt @@ -0,0 +1,11 @@ +breeze 4:6.8.0-0zneon+24.04+noble+release+build80 +fonts-hack 3.003-3 +fonts-noto-core 20201225-2 +kde-style-breeze 4:6.8.0-0zneon+24.04+noble+release+build80 +kde-style-oxygen 4:6.8.0-0zneon+24.04+noble+release+build59 +kf6-kcolorscheme 6.31.0-0zneon+24.04+noble+release+build47 +kf6-kconfig 6.31.0-0zneon+24.04+noble+release+build36 +kf6-kguiaddons 6.31.0-0zneon+24.04+noble+release+build59 +libkf6colorscheme-dev 6.31.0-0zneon+24.04+noble+release+build47 +plasma-workspace 4:6.8.0-0zneon+24.04+noble+release+build99 +qt6-base 6.11.1-0zneon+24.04+noble+release+build162 From 1717119b1e7838c8cedeba0360355e5e18ae3ca6 Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 01:44:54 +0200 Subject: [PATCH 03/59] refactor(styles): generate the style-slot roster, Debug and PartialEq ComponentStyleSlots::NAMES, the Debug impl and the PartialEq impl now expand the same for_every_slot! roster as installed() and unchanged_against(). Debug and PartialEq destructure Self without a rest pattern, so a slot added to the struct and left out of the roster fails to compile instead of being silently skipped by a hand-written list. Their output is unchanged: Debug prints whether each slot is filled, in declaration order, and equality compares each slot's Rc by pointer. The macOS, Fluent and Material 3 slot tests become set equality: the installed slots and a _UNFILLED list, which gives a reason for every slot the preset leaves to the widget's default, must together be NAMES with nothing in both. Core tests check NAMES for duplicates and against a fully populated value built from a struct literal. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 10 + .../src/styles/component_style_slots.rs | 141 ++++----- .../src/styles/component_style_slots/tests.rs | 272 ++++++++++++++++++ crates/teksilo-theme-fluent/src/lib.rs | 138 ++++++--- crates/teksilo-theme-macos/src/lib.rs | 129 ++++++--- crates/teksilo-theme-material3/src/lib.rs | 102 ++++++- 6 files changed, 627 insertions(+), 165 deletions(-) create mode 100644 crates/teksilo-core/src/styles/component_style_slots/tests.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 864af9ca4..f8c2e0981 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,16 @@ by crate for clarity, not because crates version independently. ## [Unreleased] +### Added + +#### Theming + +- **`ComponentStyleSlots::NAMES`.** The name of every theme-wide style slot, + in declaration order, the same names `installed()` reports. A test can say + which slots a theme fills and which it leaves to the widget's default as set + equality against it, so a slot added to the framework later cannot be + overlooked. + ### Fixed - **Builds without link-time optimisation embed each bundled font once.** A diff --git a/crates/teksilo-core/src/styles/component_style_slots.rs b/crates/teksilo-core/src/styles/component_style_slots.rs index 17050f79c..d73eab1a0 100644 --- a/crates/teksilo-core/src/styles/component_style_slots.rs +++ b/crates/teksilo-core/src/styles/component_style_slots.rs @@ -94,12 +94,13 @@ pub struct ComponentStyleSlots { /// Every slot's name, written **once**, expanded through by each probe below. /// -/// Two hand-maintained copies of a forty-two-name list is how one of them loses -/// a slot, which for [`ComponentStyleSlots::installed`] and -/// [`ComponentStyleSlots::unchanged_against`] means an override that is silently -/// never reported. The `Self { .. }`-less destructure inside each probe still -/// makes a slot added to the struct a compile error; this makes a slot added -/// *here* reach both askers at once. +/// [`ComponentStyleSlots::NAMES`], [`ComponentStyleSlots::installed`], +/// [`ComponentStyleSlots::unchanged_against`] and the `Debug` and `PartialEq` +/// impls all expand this one roster, so none of them can be the copy that fell +/// behind: a hand-written list per asker is how one of them loses a slot, which +/// for `installed` means an override that is silently never reported. Every +/// probe except `NAMES` also destructures `Self` without a `..` rest pattern, so +/// a slot added to the struct and not to this roster is a compile error. macro_rules! for_every_slot { ($probe:ident) => { $probe!( @@ -150,6 +151,22 @@ macro_rules! for_every_slot { } impl ComponentStyleSlots { + /// Every slot's name, in declaration order: the roster that + /// [`installed`](Self::installed) and + /// [`unchanged_against`](Self::unchanged_against) answer from. + /// + /// For a test that wants to say which slots a preset fills and which it + /// deliberately leaves to the widget's default, as set equality against + /// this list rather than against a hand-copied one. + pub const NAMES: &'static [&'static str] = { + macro_rules! probe { + ($($name:ident),* $(,)?) => { + &[$(stringify!($name)),*] + }; + } + for_every_slot!(probe) + }; + /// The names of the slots that carry an override, in declaration order. /// /// The direct "what is installed here" question, kept for diagnostics and @@ -226,52 +243,18 @@ impl ComponentStyleSlots { impl std::fmt::Debug for ComponentStyleSlots { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { // Hand-rolled because `Rc` doesn't impl Debug. - // Show which slots are populated (Some/None) — the actual + // Show which slots are populated (Some/None): the actual // chrome behaviour isn't introspectable. - f.debug_struct("ComponentStyleSlots") - .field("button", &self.button.is_some()) - .field("split_button", &self.split_button.is_some()) - .field("splitter", &self.splitter.is_some()) - .field("icon_button", &self.icon_button.is_some()) - .field("toggle", &self.toggle.is_some()) - .field("checkbox", &self.checkbox.is_some()) - .field("radio", &self.radio.is_some()) - .field("radio_tile", &self.radio_tile.is_some()) - .field("slider", &self.slider.is_some()) - .field("text_input", &self.text_input.is_some()) - .field("combo_box", &self.combo_box.is_some()) - .field("menu_item", &self.menu_item.is_some()) - .field("panel", &self.panel.is_some()) - .field("card", &self.card.is_some()) - .field("chart", &self.chart.is_some()) - .field("popover", &self.popover.is_some()) - .field("tooltip", &self.tooltip.is_some()) - .field("scroll_bar", &self.scroll_bar.is_some()) - .field("standard_item", &self.standard_item.is_some()) - .field("tab", &self.tab.is_some()) - .field("dialog", &self.dialog.is_some()) - .field("snackbar", &self.snackbar.is_some()) - .field("toast", &self.toast.is_some()) - .field("banner", &self.banner.is_some()) - .field("badge", &self.badge.is_some()) - .field("progress_bar", &self.progress_bar.is_some()) - .field("link", &self.link.is_some()) - .field("segmented_control", &self.segmented_control.is_some()) - .field("avatar", &self.avatar.is_some()) - .field("calendar", &self.calendar.is_some()) - .field("color_picker", &self.color_picker.is_some()) - .field("spin_box", &self.spin_box.is_some()) - .field("date_edit", &self.date_edit.is_some()) - .field("search_field", &self.search_field.is_some()) - .field("rich_text_editor", &self.rich_text_editor.is_some()) - .field("table", &self.table.is_some()) - .field("list_container", &self.list_container.is_some()) - .field("drop_zone", &self.drop_zone.is_some()) - .field("drop_target", &self.drop_target.is_some()) - .field("grid_view", &self.grid_view.is_some()) - .field("web_view", &self.web_view.is_some()) - .field("text_selection", &self.text_selection.is_some()) - .finish() + macro_rules! probe { + ($($name:ident),* $(,)?) => {{ + // No `..`: a slot missing from the roster fails to compile. + let Self { $($name),* } = self; + f.debug_struct("ComponentStyleSlots") + $(.field(stringify!($name), &$name.is_some()))* + .finish() + }}; + } + for_every_slot!(probe) } } @@ -287,47 +270,19 @@ impl PartialEq for ComponentStyleSlots { _ => false, } } - rc_eq(&self.button, &other.button) - && rc_eq(&self.radio_tile, &other.radio_tile) - && rc_eq(&self.split_button, &other.split_button) - && rc_eq(&self.splitter, &other.splitter) - && rc_eq(&self.icon_button, &other.icon_button) - && rc_eq(&self.toggle, &other.toggle) - && rc_eq(&self.checkbox, &other.checkbox) - && rc_eq(&self.radio, &other.radio) - && rc_eq(&self.slider, &other.slider) - && rc_eq(&self.text_input, &other.text_input) - && rc_eq(&self.combo_box, &other.combo_box) - && rc_eq(&self.menu_item, &other.menu_item) - && rc_eq(&self.panel, &other.panel) - && rc_eq(&self.card, &other.card) - && rc_eq(&self.chart, &other.chart) - && rc_eq(&self.popover, &other.popover) - && rc_eq(&self.tooltip, &other.tooltip) - && rc_eq(&self.scroll_bar, &other.scroll_bar) - && rc_eq(&self.standard_item, &other.standard_item) - && rc_eq(&self.tab, &other.tab) - && rc_eq(&self.dialog, &other.dialog) - && rc_eq(&self.snackbar, &other.snackbar) - && rc_eq(&self.toast, &other.toast) - && rc_eq(&self.banner, &other.banner) - && rc_eq(&self.badge, &other.badge) - && rc_eq(&self.progress_bar, &other.progress_bar) - && rc_eq(&self.link, &other.link) - && rc_eq(&self.segmented_control, &other.segmented_control) - && rc_eq(&self.avatar, &other.avatar) - && rc_eq(&self.calendar, &other.calendar) - && rc_eq(&self.color_picker, &other.color_picker) - && rc_eq(&self.spin_box, &other.spin_box) - && rc_eq(&self.date_edit, &other.date_edit) - && rc_eq(&self.search_field, &other.search_field) - && rc_eq(&self.rich_text_editor, &other.rich_text_editor) - && rc_eq(&self.table, &other.table) - && rc_eq(&self.list_container, &other.list_container) - && rc_eq(&self.drop_zone, &other.drop_zone) - && rc_eq(&self.drop_target, &other.drop_target) - && rc_eq(&self.grid_view, &other.grid_view) - && rc_eq(&self.web_view, &other.web_view) - && rc_eq(&self.text_selection, &other.text_selection) + macro_rules! probe { + ($($name:ident),* $(,)?) => {{ + // No `..`: a slot missing from the roster fails to compile. + let Self { $($name),* } = self; + true $(&& rc_eq($name, &other.$name))* + }}; + } + for_every_slot!(probe) } } + +// `styles.rs` declares this module with `#[path]`, so a child module resolves +// from `styles/`, not from a directory named after this file. +#[cfg(test)] +#[path = "component_style_slots/tests.rs"] +mod tests; diff --git a/crates/teksilo-core/src/styles/component_style_slots/tests.rs b/crates/teksilo-core/src/styles/component_style_slots/tests.rs new file mode 100644 index 000000000..c79a2dc58 --- /dev/null +++ b/crates/teksilo-core/src/styles/component_style_slots/tests.rs @@ -0,0 +1,272 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The roster [`ComponentStyleSlots::NAMES`] is checked against a value built +//! with a struct literal, which the compiler, not `for_every_slot!`, holds to +//! every field. + +use std::collections::BTreeSet; +use std::rc::Rc; + +use super::ComponentStyleSlots; +use crate::build_context::BuildContext; +use crate::styles::*; +use crate::widget_id::WidgetId; + +/// One type standing in for every Tier-3 style. Nothing here builds a widget: +/// the slots are only counted, compared and printed. +struct Stub; + +macro_rules! stub_make_body { + ($($trait:ident => $config:ident),* $(,)?) => { + $(impl $trait for Stub { + fn make_body(&self, _: &$config, _: &mut BuildContext) -> WidgetId { + unreachable!("the stub style is never built") + } + })* + }; +} + +stub_make_body!( + AvatarStyle => AvatarStyleConfig, + BadgeStyle => BadgeStyleConfig, + BannerStyle => BannerStyleConfig, + ButtonStyle => ButtonStyleConfig, + CardStyle => CardStyleConfig, + CheckboxStyle => CheckboxStyleConfig, + ColorPickerStyle => ColorPickerStyleConfig, + ComboBoxStyle => ComboBoxStyleConfig, + DateEditStyle => DateEditStyleConfig, + DropTargetStyle => DropTargetStyleConfig, + DropZoneStyle => DropZoneStyleConfig, + IconButtonStyle => IconButtonStyleConfig, + LinkStyle => LinkStyleConfig, + MenuItemStyle => MenuItemStyleConfig, + PanelStyle => PanelStyleConfig, + PopoverStyle => PopoverStyleConfig, + ProgressBarStyle => ProgressBarStyleConfig, + RadioStyle => RadioStyleConfig, + RadioTileStyle => RadioTileStyleConfig, + RichTextEditorStyle => RichTextEditorStyleConfig, + ScrollBarStyle => ScrollBarStyleConfig, + SearchFieldStyle => SearchFieldStyleConfig, + SegmentedControlStyle => SegmentedControlStyleConfig, + SliderStyle => SliderStyleConfig, + SnackbarStyle => SnackbarStyleConfig, + SpinBoxStyle => SpinBoxStyleConfig, + SplitButtonStyle => SplitButtonStyleConfig, + StandardItemStyle => StandardItemStyleConfig, + TextInputStyle => TextInputStyleConfig, + ToastStyle => ToastStyleConfig, + ToggleStyle => ToggleStyleConfig, + TooltipStyle => TooltipStyleConfig, + WebViewStyle => WebViewStyleConfig, +); + +impl CalendarStyle for Stub { + fn make_day_cell(&self, _: &CalendarDayConfig, _: &mut BuildContext) -> WidgetId { + unreachable!("the stub style is never built") + } + fn make_zoom_cell(&self, _: &CalendarZoomCellConfig, _: &mut BuildContext) -> WidgetId { + unreachable!("the stub style is never built") + } + fn make_header(&self, _: &CalendarHeaderConfig, _: &mut BuildContext) -> WidgetId { + unreachable!("the stub style is never built") + } +} + +impl ChartStyle for Stub { + fn bar_fill(&self, _: &ChartFillContext) -> FillRecipe { + unreachable!("the stub style is never built") + } + fn area_fill(&self, _: &ChartFillContext, _: f32) -> FillRecipe { + unreachable!("the stub style is never built") + } + fn donut_fill(&self, _: &ChartFillContext) -> FillRecipe { + unreachable!("the stub style is never built") + } + fn gridline(&self, _: &Theme) -> BorderRecipe { + unreachable!("the stub style is never built") + } +} + +impl DialogStyle for Stub { + fn make_panel(&self, _: &DialogStyleConfig, _: &mut BuildContext) -> WidgetId { + unreachable!("the stub style is never built") + } + fn make_scrim(&self, _: &mut BuildContext) -> WidgetId { + unreachable!("the stub style is never built") + } +} + +impl GridViewStyle for Stub {} + +impl ListContainerStyle for Stub { + fn make_insertion_indicator(&self, _: &ListInsertionConfig, _: &mut BuildContext) -> WidgetId { + unreachable!("the stub style is never built") + } + fn insertion(&self) -> ListInsertionRecipe { + unreachable!("the stub style is never built") + } +} + +impl SplitterStyle for Stub { + fn make_handle(&self, _: &SplitterStyleConfig, _: &mut BuildContext) -> WidgetId { + unreachable!("the stub style is never built") + } +} + +impl TabStyle for Stub { + fn make_body(&self, _: &TabStyleConfig, _: &mut BuildContext) -> WidgetId { + unreachable!("the stub style is never built") + } + fn make_bar(&self, _: &TabBarChromeConfig, _: &mut BuildContext) -> WidgetId { + unreachable!("the stub style is never built") + } +} + +impl TableStyle for Stub { + fn make_header_cell(&self, _: &TableHeaderCellConfig, _: &mut BuildContext) -> WidgetId { + unreachable!("the stub style is never built") + } + fn make_sort_indicator(&self, _: SortDirection, _: &mut BuildContext) -> WidgetId { + unreachable!("the stub style is never built") + } + fn make_row_background(&self, _: &TableRowConfig, _: &mut BuildContext) -> WidgetId { + unreachable!("the stub style is never built") + } + fn grid(&self) -> TableGridRecipe { + unreachable!("the stub style is never built") + } +} + +impl TextSelectionStyle for Stub { + fn handle(&self, _: &Theme) -> TextSelectionHandleRecipe { + unreachable!("the stub style is never built") + } + fn magnifier(&self, _: &Theme) -> TextMagnifierRecipe { + unreachable!("the stub style is never built") + } +} + +/// Every slot filled, each with its own allocation. A struct literal with no +/// `..Default::default()`, so a slot added to the struct and not here fails to +/// compile, independently of the roster the code under test expands. +fn fully_populated() -> ComponentStyleSlots { + ComponentStyleSlots { + button: Some(Rc::new(Stub)), + split_button: Some(Rc::new(Stub)), + splitter: Some(Rc::new(Stub)), + icon_button: Some(Rc::new(Stub)), + toggle: Some(Rc::new(Stub)), + checkbox: Some(Rc::new(Stub)), + radio: Some(Rc::new(Stub)), + radio_tile: Some(Rc::new(Stub)), + slider: Some(Rc::new(Stub)), + text_input: Some(Rc::new(Stub)), + combo_box: Some(Rc::new(Stub)), + menu_item: Some(Rc::new(Stub)), + panel: Some(Rc::new(Stub)), + card: Some(Rc::new(Stub)), + chart: Some(Rc::new(Stub)), + popover: Some(Rc::new(Stub)), + tooltip: Some(Rc::new(Stub)), + scroll_bar: Some(Rc::new(Stub)), + standard_item: Some(Rc::new(Stub)), + tab: Some(Rc::new(Stub)), + dialog: Some(Rc::new(Stub)), + snackbar: Some(Rc::new(Stub)), + toast: Some(Rc::new(Stub)), + banner: Some(Rc::new(Stub)), + badge: Some(Rc::new(Stub)), + progress_bar: Some(Rc::new(Stub)), + link: Some(Rc::new(Stub)), + segmented_control: Some(Rc::new(Stub)), + avatar: Some(Rc::new(Stub)), + calendar: Some(Rc::new(Stub)), + color_picker: Some(Rc::new(Stub)), + spin_box: Some(Rc::new(Stub)), + date_edit: Some(Rc::new(Stub)), + search_field: Some(Rc::new(Stub)), + rich_text_editor: Some(Rc::new(Stub)), + table: Some(Rc::new(Stub)), + list_container: Some(Rc::new(Stub)), + drop_zone: Some(Rc::new(Stub)), + drop_target: Some(Rc::new(Stub)), + grid_view: Some(Rc::new(Stub)), + web_view: Some(Rc::new(Stub)), + text_selection: Some(Rc::new(Stub)), + } +} + +#[test] +fn names_has_no_duplicates() { + let unique: BTreeSet<&str> = ComponentStyleSlots::NAMES.iter().copied().collect(); + assert_eq!(unique.len(), ComponentStyleSlots::NAMES.len()); +} + +#[test] +fn names_is_what_a_fully_populated_value_reports_installed() { + assert_eq!(fully_populated().installed(), ComponentStyleSlots::NAMES); + assert!(ComponentStyleSlots::default().installed().is_empty()); +} + +#[test] +fn debug_shows_every_slot_and_whether_it_is_filled() { + let full = format!("{:?}", fully_populated()); + let empty = format!("{:?}", ComponentStyleSlots::default()); + for name in ComponentStyleSlots::NAMES { + assert!(full.contains(&format!("{name}: true")), "{name} in {full}"); + assert!( + empty.contains(&format!("{name}: false")), + "{name} in {empty}" + ); + } + assert!(full.starts_with("ComponentStyleSlots {")); +} + +#[test] +fn equality_is_identity_of_every_slot() { + let full = fully_populated(); + assert_eq!(full, full.clone(), "a clone shares every allocation"); + assert_eq!( + ComponentStyleSlots::default(), + ComponentStyleSlots::default() + ); + assert_ne!(full, ComponentStyleSlots::default()); + // Equal-looking but separately allocated styles are different styles. + assert_ne!(full, fully_populated()); + + // Each slot, on its own, takes part: one slot replaced by another + // allocation, or emptied, while every other slot stays shared, differs. + let mut flipped = Vec::new(); + for (name, flip) in one_slot_flips() { + let mut replaced = full.clone(); + flip(&mut replaced, Some(Rc::new(Stub))); + assert_ne!(full, replaced, "{name} replaced"); + let mut emptied = full.clone(); + flip(&mut emptied, None); + assert_ne!(full, emptied, "{name} emptied"); + flipped.push(name); + } + assert_eq!(flipped, ComponentStyleSlots::NAMES); +} + +/// A slot's name, and a function that puts `Some(Stub)` or nothing in that +/// one slot. Fields cannot be addressed by a string, so the roster writes one +/// function per field; `flipped == NAMES` above holds the list to every slot. +type Flip = fn(&mut ComponentStyleSlots, Option>); + +fn one_slot_flips() -> Vec<(&'static str, Flip)> { + macro_rules! probe { + ($($slot:ident),* $(,)?) => { + vec![$((stringify!($slot), { + fn flip(slots: &mut ComponentStyleSlots, style: Option>) { + slots.$slot = style.map(|style| style as _); + } + flip as Flip + })),*] + }; + } + for_every_slot!(probe) +} diff --git a/crates/teksilo-theme-fluent/src/lib.rs b/crates/teksilo-theme-fluent/src/lib.rs index 8085ef017..7fee09a0b 100644 --- a/crates/teksilo-theme-fluent/src/lib.rs +++ b/crates/teksilo-theme-fluent/src/lib.rs @@ -240,6 +240,8 @@ fn install_styles(theme: &mut Theme) { mod tests { use super::*; use crate::palette::argb; + use std::collections::BTreeSet; + use teksilo_core::styles::ComponentStyleSlots; #[test] fn light_reports_light_appearance() { @@ -329,39 +331,111 @@ mod tests { assert_eq!(d.control_fill_input_active, argb("#B31E1E1E")); } + /// The slots Fluent deliberately leaves to the widget's default + /// `Recipe*Style`, each with the reason it is inherited rather than filled. + const FLUENT_UNFILLED: &[(&str, &str)] = &[ + ( + "split_button", + "WinUI SplitButton is not transcribed; the recipe frame paints from the theme surface and border roles", + ), + ( + "splitter", + "WinUI ships no splitter; the recipe's thin resting divider reads the theme border role", + ), + ( + "radio_tile", + "WinUI ships no selectable card; the recipe surface reads the preset's surface and accent roles", + ), + ( + "chart", + "WinUI ships no chart; the teksilo-charts default reads the series colours and the theme border role", + ), + ( + "color_picker", + "WinUI ColorPicker is not transcribed; the recipe panel reads the theme roles", + ), + ( + "spin_box", + "WinUI NumberBox spin buttons are not transcribed; the recipe frames the widget's field and step buttons in theme roles", + ), + ( + "date_edit", + "the recipe is a passthrough around the TextInput, which the text_input slot already styles", + ), + ( + "rich_text_editor", + "the recipe frames the viewport in theme border and surface roles; the text is document content", + ), + ( + "list_container", + "the recipe is only the drag-insertion line, drawn in the accent role this preset maps", + ), + ( + "drop_zone", + "WinUI ships no drop-zone control; the recipe tints its region from the theme roles", + ), + ( + "drop_target", + "WinUI ships no drop-target control; the recipe border reads the theme roles and its hints are cards, which the card slot styles", + ), + ( + "grid_view", + "the recipe's focus ring, marquee and insertion bar use the focused and accent roles this preset maps", + ), + ( + "web_view", + "the page paints itself; the recipe only tints the overlay shown over it, from theme roles", + ), + ( + "text_selection", + "its geometry is teksilo_core::text_touch's, shared with hit testing, and its colours follow the accent role", + ), + ( + "calendar", + "WinUI CalendarView is not transcribed; the recipe's day cells read the accent and selection roles this preset maps", + ), + ( + "search_field", + "its field is a TextInput, which resolves the text_input slot, and its suggestion popup resolves the popover slot, both filled", + ), + ( + "avatar", + "WinUI PersonPicture is not transcribed; the recipe's initials disc and focus ring read the theme roles", + ), + ]; + + /// Whether the installed slots and [`FLUENT_UNFILLED`] are exactly + /// [`ComponentStyleSlots::NAMES`], with no slot in both: a slot added to the + /// framework must be either filled by this preset or listed with a reason. #[test] - fn every_installed_style_slot_is_populated() { - for t in [light(), dark()] { - let s = &t.style_slots; - for (name, present) in [ - ("button", s.button.is_some()), - ("toggle", s.toggle.is_some()), - ("checkbox", s.checkbox.is_some()), - ("radio", s.radio.is_some()), - ("text_input", s.text_input.is_some()), - ("slider", s.slider.is_some()), - ("menu_item", s.menu_item.is_some()), - ("standard_item", s.standard_item.is_some()), - ("card", s.card.is_some()), - ("panel", s.panel.is_some()), - ("popover", s.popover.is_some()), - ("tooltip", s.tooltip.is_some()), - ("dialog", s.dialog.is_some()), - ("snackbar", s.snackbar.is_some()), - ("toast", s.toast.is_some()), - ("banner", s.banner.is_some()), - ("combo_box", s.combo_box.is_some()), - ("icon_button", s.icon_button.is_some()), - ("link", s.link.is_some()), - ("segmented_control", s.segmented_control.is_some()), - ("badge", s.badge.is_some()), - ("progress_bar", s.progress_bar.is_some()), - ("scroll_bar", s.scroll_bar.is_some()), - ("tab", s.tab.is_some()), - ("table", s.table.is_some()), - ] { - assert!(present, "{name} slot not installed"); - } + fn installed_and_unfilled_slots_partition_the_roster() { + let unfilled: BTreeSet<&str> = FLUENT_UNFILLED.iter().map(|(name, _)| *name).collect(); + assert_eq!( + unfilled.len(), + FLUENT_UNFILLED.len(), + "a slot is listed twice" + ); + for (name, reason) in FLUENT_UNFILLED { + assert!( + !reason.trim().is_empty(), + "{name} is listed without a reason" + ); + } + let names: BTreeSet<&str> = ComponentStyleSlots::NAMES.iter().copied().collect(); + for t in [light(), dark(), light().with_density(TargetDensity::Touch)] { + let installed: BTreeSet<&str> = t.style_slots.installed().into_iter().collect(); + let both: Vec<_> = installed.intersection(&unfilled).collect(); + assert!( + both.is_empty(), + "installed yet listed as unfilled: {both:?}" + ); + let covered: BTreeSet<&str> = installed.union(&unfilled).copied().collect(); + let missing: Vec<_> = names.difference(&covered).collect(); + let unknown: Vec<_> = covered.difference(&names).collect(); + assert!( + missing.is_empty() && unknown.is_empty(), + "neither installed nor listed: {missing:?}; not a slot: {unknown:?}" + ); } } diff --git a/crates/teksilo-theme-macos/src/lib.rs b/crates/teksilo-theme-macos/src/lib.rs index 5ecdfe35f..2e9723d2a 100644 --- a/crates/teksilo-theme-macos/src/lib.rs +++ b/crates/teksilo-theme-macos/src/lib.rs @@ -276,6 +276,8 @@ fn install_styles(theme: &mut Theme) { mod tests { use super::*; use crate::palette::hex; + use std::collections::BTreeSet; + use teksilo_core::styles::ComponentStyleSlots; #[test] fn light_reports_light_appearance() { @@ -368,42 +370,99 @@ mod tests { assert!(d.bezel.inner_light.a() > 0.0); } + /// The slots macOS deliberately leaves to the widget's default + /// `Recipe*Style`, each with the reason it is inherited rather than filled. + const MACOS_UNFILLED: &[(&str, &str)] = &[ + ( + "split_button", + "no AppKit split-button bezel is transcribed; the recipe frame paints from the theme surface and border roles", + ), + ( + "splitter", + "the recipe's thin resting divider in the theme border role already reads as a split-view divider", + ), + ( + "radio_tile", + "AppKit has no selectable card; the recipe surface reads the preset's surface and accent roles", + ), + ( + "chart", + "AppKit has no chart chrome; the teksilo-charts default reads the series colours and the theme border role", + ), + ( + "color_picker", + "NSColorPanel is a system panel with no in-window chrome to transcribe; the recipe reads the theme roles", + ), + ( + "spin_box", + "no NSStepper chrome is transcribed; the recipe frames the widget's field and step buttons in theme roles", + ), + ( + "date_edit", + "the recipe is a passthrough around the TextInput, which the text_input slot already styles", + ), + ( + "rich_text_editor", + "the recipe frames the viewport in theme border and surface roles; the text is document content", + ), + ( + "list_container", + "the recipe is only the drag-insertion line, drawn in the accent role this preset maps", + ), + ( + "drop_zone", + "AppKit has no drop-zone control; the recipe tints its region from the theme roles", + ), + ( + "drop_target", + "AppKit has no drop-target control; the recipe border reads the theme roles and its hints are cards, which the card slot styles", + ), + ( + "grid_view", + "the recipe's focus ring, marquee and insertion bar use the focused and accent roles this preset maps", + ), + ( + "web_view", + "the page paints itself; the recipe only tints the overlay shown over it, from theme roles", + ), + ( + "text_selection", + "touch chrome on a platform without touch; its geometry is teksilo_core::text_touch's, shared with hit testing", + ), + ]; + + /// Whether the installed slots and [`MACOS_UNFILLED`] are exactly + /// [`ComponentStyleSlots::NAMES`], with no slot in both: a slot added to the + /// framework must be either filled by this preset or listed with a reason. #[test] - fn every_installed_style_slot_is_populated() { - for t in [light(), dark()] { - let s = &t.style_slots; - for (name, present) in [ - ("button", s.button.is_some()), - ("toggle", s.toggle.is_some()), - ("checkbox", s.checkbox.is_some()), - ("radio", s.radio.is_some()), - ("text_input", s.text_input.is_some()), - ("slider", s.slider.is_some()), - ("menu_item", s.menu_item.is_some()), - ("standard_item", s.standard_item.is_some()), - ("card", s.card.is_some()), - ("panel", s.panel.is_some()), - ("popover", s.popover.is_some()), - ("tooltip", s.tooltip.is_some()), - ("dialog", s.dialog.is_some()), - ("snackbar", s.snackbar.is_some()), - ("toast", s.toast.is_some()), - ("banner", s.banner.is_some()), - ("combo_box", s.combo_box.is_some()), - ("icon_button", s.icon_button.is_some()), - ("link", s.link.is_some()), - ("segmented_control", s.segmented_control.is_some()), - ("badge", s.badge.is_some()), - ("progress_bar", s.progress_bar.is_some()), - ("scroll_bar", s.scroll_bar.is_some()), - ("tab", s.tab.is_some()), - ("table", s.table.is_some()), - ("calendar", s.calendar.is_some()), - ("search_field", s.search_field.is_some()), - ("avatar", s.avatar.is_some()), - ] { - assert!(present, "{name} slot not installed"); - } + fn installed_and_unfilled_slots_partition_the_roster() { + let unfilled: BTreeSet<&str> = MACOS_UNFILLED.iter().map(|(name, _)| *name).collect(); + assert_eq!( + unfilled.len(), + MACOS_UNFILLED.len(), + "a slot is listed twice" + ); + for (name, reason) in MACOS_UNFILLED { + assert!( + !reason.trim().is_empty(), + "{name} is listed without a reason" + ); + } + let names: BTreeSet<&str> = ComponentStyleSlots::NAMES.iter().copied().collect(); + for t in [light(), dark(), light().with_density(TargetDensity::Touch)] { + let installed: BTreeSet<&str> = t.style_slots.installed().into_iter().collect(); + let both: Vec<_> = installed.intersection(&unfilled).collect(); + assert!( + both.is_empty(), + "installed yet listed as unfilled: {both:?}" + ); + let covered: BTreeSet<&str> = installed.union(&unfilled).copied().collect(); + let missing: Vec<_> = names.difference(&covered).collect(); + let unknown: Vec<_> = covered.difference(&names).collect(); + assert!( + missing.is_empty() && unknown.is_empty(), + "neither installed nor listed: {missing:?}; not a slot: {unknown:?}" + ); } } diff --git a/crates/teksilo-theme-material3/src/lib.rs b/crates/teksilo-theme-material3/src/lib.rs index c341ae0bd..ce87f40e2 100644 --- a/crates/teksilo-theme-material3/src/lib.rs +++ b/crates/teksilo-theme-material3/src/lib.rs @@ -191,6 +191,8 @@ pub fn font_registrar() -> impl teksilo_text::FontRegistrar { #[cfg(test)] mod tests { use super::*; + use std::collections::BTreeSet; + use teksilo_core::styles::ComponentStyleSlots; use teksilo_tokens::Color; #[test] @@ -276,12 +278,102 @@ mod tests { assert_eq!(p.tertiary, Color::from_hex("#EFB8C8")); } + /// A Material 3 component this preset has not transcribed: the widget's + /// default recipe paints it, with the M3-mapped colour roles. + const NOT_TRANSCRIBED: &str = + "the M3 component is not transcribed; the recipe paints with the M3-mapped colour roles"; + /// A slot Material 3 specifies no component for. + const NO_M3_COMPONENT: &str = + "M3 specifies no such component; the recipe paints with the M3-mapped colour roles"; + + /// The slots Material 3 deliberately leaves to the widget's default + /// `Recipe*Style`, each with the reason it is inherited rather than filled. + const MATERIAL3_UNFILLED: &[(&str, &str)] = &[ + ("split_button", NOT_TRANSCRIBED), + ("splitter", NO_M3_COMPONENT), + ("icon_button", NOT_TRANSCRIBED), + ("checkbox", NOT_TRANSCRIBED), + ("radio", NOT_TRANSCRIBED), + ("radio_tile", NO_M3_COMPONENT), + ("slider", NOT_TRANSCRIBED), + ("text_input", NOT_TRANSCRIBED), + ("combo_box", NOT_TRANSCRIBED), + ("menu_item", NOT_TRANSCRIBED), + ("panel", NO_M3_COMPONENT), + ("chart", NO_M3_COMPONENT), + ("popover", NOT_TRANSCRIBED), + ("tooltip", NOT_TRANSCRIBED), + ("scroll_bar", NO_M3_COMPONENT), + ("standard_item", NOT_TRANSCRIBED), + ("tab", NOT_TRANSCRIBED), + ("dialog", NOT_TRANSCRIBED), + ("snackbar", NOT_TRANSCRIBED), + ("toast", NO_M3_COMPONENT), + ("banner", NO_M3_COMPONENT), + ("badge", NOT_TRANSCRIBED), + ("progress_bar", NOT_TRANSCRIBED), + ("link", NO_M3_COMPONENT), + ("segmented_control", NOT_TRANSCRIBED), + ("avatar", NO_M3_COMPONENT), + ("calendar", NOT_TRANSCRIBED), + ("color_picker", NO_M3_COMPONENT), + ("spin_box", NO_M3_COMPONENT), + ( + "date_edit", + "the recipe is a passthrough around the TextInput, so it follows whatever the text_input slot paints", + ), + ("search_field", NOT_TRANSCRIBED), + ("rich_text_editor", NO_M3_COMPONENT), + ("table", NO_M3_COMPONENT), + ( + "list_container", + "the recipe is only the drag-insertion line, drawn in the M3-mapped accent role", + ), + ("drop_zone", NO_M3_COMPONENT), + ("drop_target", NO_M3_COMPONENT), + ("grid_view", NO_M3_COMPONENT), + ( + "web_view", + "the page paints itself; the recipe only tints the overlay shown over it, from theme roles", + ), + ( + "text_selection", + "its geometry is teksilo_core::text_touch's, shared with hit testing, and its colours follow the M3-mapped accent role", + ), + ]; + + /// Whether the installed slots and [`MATERIAL3_UNFILLED`] are exactly + /// [`ComponentStyleSlots::NAMES`], with no slot in both: a slot added to the + /// framework must be either filled by this preset or listed with a reason. #[test] - fn widget_style_slots_installed() { - for t in [light(), dark()] { - assert!(t.style_slots.button.is_some(), "button slot"); - assert!(t.style_slots.toggle.is_some(), "toggle slot"); - assert!(t.style_slots.card.is_some(), "card slot"); + fn installed_and_unfilled_slots_partition_the_roster() { + let unfilled: BTreeSet<&str> = MATERIAL3_UNFILLED.iter().map(|(name, _)| *name).collect(); + assert_eq!( + unfilled.len(), + MATERIAL3_UNFILLED.len(), + "a slot is listed twice" + ); + for (name, reason) in MATERIAL3_UNFILLED { + assert!( + !reason.trim().is_empty(), + "{name} is listed without a reason" + ); + } + let names: BTreeSet<&str> = ComponentStyleSlots::NAMES.iter().copied().collect(); + for t in [light(), dark(), light().with_density(TargetDensity::Touch)] { + let installed: BTreeSet<&str> = t.style_slots.installed().into_iter().collect(); + let both: Vec<_> = installed.intersection(&unfilled).collect(); + assert!( + both.is_empty(), + "installed yet listed as unfilled: {both:?}" + ); + let covered: BTreeSet<&str> = installed.union(&unfilled).copied().collect(); + let missing: Vec<_> = names.difference(&covered).collect(); + let unknown: Vec<_> = covered.difference(&names).collect(); + assert!( + missing.is_empty() && unknown.is_empty(), + "neither installed nor listed: {missing:?}; not a slot: {unknown:?}" + ); } } From 2dfdbd1df1b0e4aeaba5b8f1148ccbbacf53624e Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 02:13:44 +0200 Subject: [PATCH 04/59] feat(styles): one state-aware paint projection hook Add PaintState { window_active, high_contrast } and the PaintProjection theme extension (fn(&Theme, PaintState) -> Theme), following the DensityProjection pattern. Theme::for_paint_state consults the hook and otherwise performs the existing generic chain, inactive projection then high contrast, so a theme without a hook paints exactly as before. Theme::paint_colors is the colours-only form for colours resolved on every paint. The paint walker now asks for_paint_state. The two production bypasses that baked ColorTokens at build time, window_resolution_colors and the gradient fill in RecipeButtonStyle, resolve through paint_colors with the real high-contrast flag: WidgetTree keeps the preference in a Signal, exposed as high_contrast_signal(), and BuildContext gains prefers_high_contrast(), high_contrast_signal() and paint_state(). A Filled button's fill and a button's focus border therefore take the high-contrast palette, as the paint-resolved accent controls did. Signed-off-by: Cyril Jacquet --- .claude/CLAUDE.md | 2 +- CHANGELOG.md | 17 + crates/teksilo-core/src/build_context.rs | 25 ++ crates/teksilo-core/src/styles.rs | 2 +- crates/teksilo-core/src/styles/theme.rs | 291 ++++++++++++++++++ crates/teksilo-core/src/widget_tree.rs | 35 ++- .../src/widget_tree/rendering_impl.rs | 36 +-- crates/teksilo-widgets/src/button.rs | 75 ++++- .../src/primitives/rect_widget.rs | 9 +- crates/teksilo-widgets/src/styles.rs | 40 ++- .../src/styles/recipe_button_style.rs | 13 +- docs/window-activation.md | 45 ++- 12 files changed, 532 insertions(+), 58 deletions(-) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 7dfb39d0e..33744677a 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -953,7 +953,7 @@ When a window loses OS focus, its widgets change appearance — the modern deskt - **The primitive (mirrors the global text-scale plumbing):** `WidgetTree::window_active_signal() -> Signal` (starts `true` — a window must not be born inactive), written by `set_window_active` ([crates/teksilo-core/src/widget_tree.rs](crates/teksilo-core/src/widget_tree.rs)). Surfaced as `ctx.window_active()` / `ctx.window_active_signal()` on `BuildContext`, `ctx.window_active: bool` on `PaintContext`, and `ctx.window_active()` on `EventContext`. App layer feeds it from `WindowEvent::Focused`/`Occluded` ([crates/teksilo-app/src/app.rs](crates/teksilo-app/src/app.rs), already computing `focused && !occluded`). - **Repaint, never relayout:** a focus flip calls `WidgetArena::mark_all_needs_paint_only()` (a new paint-only mark beside `mark_all_dirty`) — geometry never changes (the caret keeps its space). Cheaper than `set_theme`'s `mark_all_dirty`; makes any paint-time `ctx.window_active` reader correct with no per-widget binding. - **Automatic, default-on (correctness, not opt-in).** Two complementary layers — **theme-side** for everything that's a plain accent colour, **per-widget** only where the theme genuinely can't decide: - 1. **Accent desaturation (theme-side — the broad sweep).** When inactive, the paint walker paints against `effective_theme.for_inactive_window()` ([crates/teksilo-core/src/styles/theme.rs](crates/teksilo-core/src/styles/theme.rs) → `ColorTokens::for_inactive_window` in [crates/teksilo-tokens/src/theme.rs](crates/teksilo-tokens/src/theme.rs)), which desaturates the accent family (`accent`/`accent_hover`/`accent_pressed`/`accent_disabled`/`accent_subtle_bg`) + focus indicators (`border_focused`/`focus_ring`) toward graphite — the Qt `QPalette::Inactive` model (swap at [rendering_impl.rs](crates/teksilo-core/src/widget_tree/rendering_impl.rs)). Because every themed control resolves its accent from the live `ColorTokens` *at paint time* (e.g. Toggle reads `colors.accent`), this **one swap greys out every accent control with zero per-widget code**: `Button`(Filled/Destructive), `Toggle`, checked `Checkbox`/`RadioButton`, selected `TabBar` tab + `SegmentedControl` segment, `Slider` fill, `ProgressBar`, `Badge`, focus rings. It applies to **any preset** that populates these tokens — IntUI, **Material 3** (where `accent` = M3 *primary*; covered with no material3-specific code), future presets. Repaint-only (colours, not typography). Don't add per-widget window-active accent checks — they belong here. + 1. **Accent desaturation (theme-side, the broad sweep).** When inactive, the paint walker paints against the inactive projection of `effective_theme` (`Theme::for_inactive_window` in [crates/teksilo-core/src/styles/theme.rs](crates/teksilo-core/src/styles/theme.rs) → `ColorTokens::for_inactive_window` in [crates/teksilo-tokens/src/theme.rs](crates/teksilo-tokens/src/theme.rs)), which desaturates the accent family (`accent`/`accent_hover`/`accent_pressed`/`accent_disabled`/`accent_subtle_bg`) + focus indicators (`border_focused`/`focus_ring`) toward graphite: the Qt `QPalette::Inactive` model (swap at [rendering_impl.rs](crates/teksilo-core/src/widget_tree/rendering_impl.rs)). Because every themed control resolves its accent from the live `ColorTokens` *at paint time* (e.g. Toggle reads `colors.accent`), this **one swap greys out every accent control with zero per-widget code**: `Button`(Filled/Destructive), `Toggle`, checked `Checkbox`/`RadioButton`, selected `TabBar` tab + `SegmentedControl` segment, `Slider` fill, `ProgressBar`, `Badge`, focus rings. It applies to **any preset** that populates these tokens: IntUI, **Material 3** (where `accent` = M3 *primary*; covered with no material3-specific code), future presets. Repaint-only (colours, not typography). Don't add per-widget window-active accent checks: they belong here. **The swap is one call, `Theme::for_paint_state(PaintState { window_active, high_contrast })`** (`WidgetTree::paint_state()`): without a hook it is the generic chain (`for_inactive_window` when inactive, then `for_high_contrast` under the OS increase-contrast preference, byte-identical to before); a theme whose palette defines its own inactive / high-contrast colours registers a **`PaintProjection(fn(&Theme, PaintState) -> Theme)`** extension (`Theme::with_paint_projection`, the `DensityProjection` pattern) and the walker paints the hook's answer instead. `for_inactive_window` / `for_high_contrast` stay the generic transforms and never consult the hook. Recipe colours baked at build time (`ColorProp::Bound`, e.g. a Filled button fill) resolve through `Theme::paint_colors` against `window_active_signal` + `BuildContext::high_contrast_signal()` (`teksilo-widgets` `styles::window_resolution_colors`), so they follow the hook and high contrast too; never call `colors.for_inactive_window()` directly from a widget. 2. **Caret hiding (per-widget — behavioural, a theme can't hide a caret).** The caret hides in an inactive window for every policy, in *both* text stacks (`RichTextEditor` rich_text/, and `TextInputField` primitives/ — base for `TextInput`/`PasswordField`/`SpinBox`/`SearchField`). The frame-loop `tick()` has no context, so `build()` registers an effect on `window_active_signal` that mirrors the value onto the editor state and hides the caret **synchronously** on deactivation (the loop may not tick while parked); blink + paint gates AND-in `state.window_active`. Restored immediately on reactivate. 3. **Selection desaturation (per-widget — needs *view* focus + a dedicated token).** Vivid `SurfaceRole::Selected` only when **view-focused AND window-active**, else the muted `SurfaceRole::SelectedInactive`. Per-widget — *not* theme-side — because it (a) depends on *view* keyboard focus (a per-view runtime state the theme can't know) and (b) uses the hand-tuned `surface_selected_inactive` / `selection_bg_inactive` tokens so view-unfocused and window-inactive show **one** consistent muted colour (a theme desaturation of `surface_selected` would be a *different* computed gray). Composed in `StandardListItem`/`StandardTreeItem` `bg_signal` (`is_focused.and(is_window_active)`), `TableView`/`TreeTableView` selection-band paint (`view_focused.get() && ctx.window_active`), and the text engines (swap to `selection_bg_inactive`). A custom `.selection_color(..)` stays fixed (macOS semantics). `MenuList` excluded (an open menu is always active). - **Opt-in for custom content:** wrap the subtree in `DimWhenInactive::new().factor(f).child(w)` (default factor 70 %) ([crates/teksilo-core/src/dim_when_inactive.rs](crates/teksilo-core/src/dim_when_inactive.rs)), driving a node-level opacity scope from `window_active_signal`. Layout-/a11y-transparent; opacity snaps (reduced-motion-correct). Re-exported in `teksilo::prelude` as `DimWhenInactive`. diff --git a/CHANGELOG.md b/CHANGELOG.md index f8c2e0981..ed00160a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,15 @@ by crate for clarity, not because crates version independently. which slots a theme fills and which it leaves to the widget's default as set equality against it, so a slot added to the framework later cannot be overlooked. +- **`PaintProjection`: a theme's own inactive-window and high-contrast + colours.** A theme registers `with_paint_projection(fn(&Theme, PaintState) + -> Theme)` and every frame of an inactive window, or under the OS increase + contrast preference, paints the colours it returns instead of the generic + accent desaturation and high-contrast swap. `Theme::for_paint_state` and + `Theme::paint_colors` give the theme or palette for a `PaintState`; without + a hook they return what the paint walker painted before. The preference is + readable at build time through `BuildContext::prefers_high_contrast`, + `high_contrast_signal` and `paint_state`. ### Fixed @@ -30,6 +39,14 @@ by crate for clarity, not because crates version independently. input carried Inter and JetBrains Mono three times over, 4.8 MB more than needed. +#### Theming + +- **Accent chrome a recipe builds follows the high-contrast preference.** + **Behaviour change:** under the OS increase contrast preference, a `Filled` + button's fill and a button's focus border now take the high-contrast + palette, as `Toggle`, `Checkbox` and the other accent controls already did; + before, they kept the normal colours. + ## [0.19.0] - 2026-10-16 ### Added diff --git a/crates/teksilo-core/src/build_context.rs b/crates/teksilo-core/src/build_context.rs index b006b56db..56ad1a0cb 100644 --- a/crates/teksilo-core/src/build_context.rs +++ b/crates/teksilo-core/src/build_context.rs @@ -535,6 +535,31 @@ impl<'a> BuildContext<'a> { self.tree.window_active_signal() } + /// Whether the OS "increase contrast" preference is set. One-shot read for + /// build-time use; for a value that follows the preference, bind + /// [`high_contrast_signal`](Self::high_contrast_signal). + pub fn prefers_high_contrast(&self) -> bool { + self.tree.prefers_high_contrast() + } + + /// Reactive handle on the high-contrast preference, the companion of + /// [`window_active_signal`](Self::window_active_signal). A recipe that + /// bakes a colour at build time zips both into a + /// [`PaintState`](crate::styles::PaintState) and resolves against + /// [`Theme::for_paint_state`](crate::styles::Theme::for_paint_state), so + /// it paints what the paint walker paints. Starts `false`. + pub fn high_contrast_signal(&self) -> crate::signal::Signal { + self.tree.high_contrast_signal() + } + + /// The [`PaintState`](crate::styles::PaintState) the host window paints + /// under right now. One-shot read; see + /// [`high_contrast_signal`](Self::high_contrast_signal) for the reactive + /// form. + pub fn paint_state(&self) -> crate::styles::PaintState { + self.tree.paint_state() + } + /// Reactive handle on the current locale. Fires observers when /// `tree.set_locale(...)` is called. pub fn locale_signal(&self) -> crate::signal::Signal> { diff --git a/crates/teksilo-core/src/styles.rs b/crates/teksilo-core/src/styles.rs index be65f1057..0edda49c1 100644 --- a/crates/teksilo-core/src/styles.rs +++ b/crates/teksilo-core/src/styles.rs @@ -203,7 +203,7 @@ pub use text_input_style::{ pub use text_selection_style::{ SharedTextSelectionStyle, TextMagnifierRecipe, TextSelectionHandleRecipe, TextSelectionStyle, }; -pub use theme::{DensityProjection, Theme, ThemeId}; +pub use theme::{DensityProjection, PaintProjection, PaintState, Theme, ThemeId}; pub use theme_appearance::ThemeAppearance; pub use theme_extension::ThemeExtensions; pub use toast_style::{SharedToastStyle, ToastPriority, ToastStyle, ToastStyleConfig}; diff --git a/crates/teksilo-core/src/styles/theme.rs b/crates/teksilo-core/src/styles/theme.rs index e723d6ccf..9a269756a 100644 --- a/crates/teksilo-core/src/styles/theme.rs +++ b/crates/teksilo-core/src/styles/theme.rs @@ -135,6 +135,52 @@ impl std::fmt::Debug for DensityProjection { } } +/// The window and accessibility state a frame is painted under: the inputs of +/// [`Theme::for_paint_state`]. +/// +/// A fresh tree paints with `window_active: true, high_contrast: false`, +/// under which [`Theme::for_paint_state`] returns the theme unchanged when no +/// [`PaintProjection`] is registered. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct PaintState { + /// The host window is focused and not occluded. + pub window_active: bool, + /// The OS "increase contrast" preference is set. + pub high_contrast: bool, +} + +/// How a theme re-colours itself for a [`PaintState`]: registered in the +/// theme's [extension registry](ThemeExtensions) and consulted by +/// [`Theme::for_paint_state`]. +/// +/// Absent, which is the default and what every raw-token theme and the IntUI +/// preset get, means the generic chain: [`Theme::for_inactive_window`] when +/// the window is inactive, then [`Theme::for_high_contrast`] when the +/// high-contrast preference is set. That chain is a fixed transform of the +/// tokens (desaturate the accent family, swap in a high-contrast accent and +/// ring), which is right for a palette that defines no inactive or +/// high-contrast colours of its own. +/// +/// A preset whose source palette **does** define them (a desktop colour +/// scheme with an inactive colour group, say) registers this to paint those +/// colours instead. The function receives the *active* theme and the whole +/// state at once, so it decides how the two flags combine; it replaces the +/// generic chain entirely, and calling [`Theme::for_inactive_window`] or +/// [`Theme::for_high_contrast`] from it is how it keeps a part of that chain. +/// Only colours should change: the paint walker swaps the result in without a +/// relayout, so geometry a hook changes is not honoured. +/// +/// It lives in the extension registry for the reason [`DensityProjection`] +/// does: it is optional, typed, non-serializable state only some themes carry. +#[derive(Clone, Copy)] +pub struct PaintProjection(pub fn(&Theme, PaintState) -> Theme); + +impl std::fmt::Debug for PaintProjection { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str("PaintProjection()") + } +} + impl Theme { /// Build a Theme from raw token data. Most apps go through a /// preset constructor (e.g. `teksilo_core::presets::intui::light`) @@ -169,6 +215,12 @@ impl Theme { self.with_extension(DensityProjection(project)) } + /// Register how this theme re-colours itself for an inactive window and + /// the high-contrast preference; see [`PaintProjection`]. + pub fn with_paint_projection(self, project: fn(&Theme, PaintState) -> Theme) -> Self { + self.with_extension(PaintProjection(project)) + } + /// Set this theme's [`ThemeId`] and return self for chaining. Used by /// preset constructors and apps building custom themes. pub fn with_id(mut self, id: impl Into>) -> Self { @@ -207,6 +259,38 @@ impl Theme { } } + /// The theme a frame is painted with under `state`: what the paint walker + /// swaps in, and what a recipe that bakes a colour at build time must + /// resolve against so it agrees with the paint-resolved controls. + /// + /// A theme that carries a [`PaintProjection`] gets that function's + /// answer. Otherwise this is the generic chain: + /// [`for_inactive_window`](Self::for_inactive_window) when + /// `!state.window_active`, then + /// [`for_high_contrast`](Self::for_high_contrast) when + /// `state.high_contrast` (so the high-contrast accent and ring win over + /// the inactive desaturation), and an unchanged copy when neither applies. + pub fn for_paint_state(&self, state: PaintState) -> Theme { + if let Some(PaintProjection(project)) = self.extension::().copied() { + return project(self, state); + } + Theme { + colors: generic_paint_colors(&self.colors, state), + ..self.clone() + } + } + + /// The colours of [`for_paint_state`](Self::for_paint_state), without + /// cloning the rest of the theme when no [`PaintProjection`] is + /// registered. For a colour resolved on every paint (a recipe's + /// `ColorProp::Bound`), where only the palette is read. + pub fn paint_colors(&self, state: PaintState) -> ColorTokens { + if let Some(PaintProjection(project)) = self.extension::().copied() { + return project(self, state).colors; + } + generic_paint_colors(&self.colors, state) + } + /// A copy of this theme projected onto another [`TargetDensity`]. /// /// This is a **token projection only**: it replaces [`Self::input`] with @@ -255,12 +339,219 @@ impl Theme { } } +/// The generic chain behind [`Theme::for_paint_state`] when no +/// [`PaintProjection`] is registered: the token halves of +/// [`Theme::for_inactive_window`] and [`Theme::for_high_contrast`], which +/// change only the colours. +fn generic_paint_colors(colors: &ColorTokens, state: PaintState) -> ColorTokens { + match (state.window_active, state.high_contrast) { + (true, false) => colors.clone(), + (false, false) => colors.for_inactive_window(), + (true, true) => colors.for_high_contrast(), + (false, true) => colors.for_inactive_window().for_high_contrast(), + } +} + #[cfg(test)] mod tests { use super::*; use crate::presets::intui; use teksilo_tokens::TargetDensity; + const ALL_PAINT_STATES: [PaintState; 4] = [ + PaintState { + window_active: true, + high_contrast: false, + }, + PaintState { + window_active: false, + high_contrast: false, + }, + PaintState { + window_active: true, + high_contrast: true, + }, + PaintState { + window_active: false, + high_contrast: true, + }, + ]; + + /// The paint walker's projection as it was written before + /// `for_paint_state` existed, kept verbatim as the oracle. + fn pre_hook_chain(theme: &Theme, state: PaintState) -> Theme { + let base = if state.window_active { + theme.clone() + } else { + theme.for_inactive_window() + }; + if state.high_contrast { + base.for_high_contrast() + } else { + base + } + } + + const HOOK_INACTIVE: &str = "#FF00FF"; + const HOOK_HIGH_CONTRAST: &str = "#00FF00"; + + /// A projection that marks each state with a colour no generic transform + /// produces, so a test can tell which path painted. + fn marking_projection(theme: &Theme, state: PaintState) -> Theme { + let mut out = theme.clone(); + if !state.window_active { + out.colors.accent = teksilo_tokens::Color::from_hex(HOOK_INACTIVE); + } + if state.high_contrast { + out.colors.accent = teksilo_tokens::Color::from_hex(HOOK_HIGH_CONTRAST); + } + out + } + + /// Without a hook, the default output is the old chain exactly, for every + /// state and both IntUI appearances. + #[test] + fn for_paint_state_without_a_hook_is_the_pre_hook_chain() { + for theme in [intui::light(), intui::dark()] { + assert!(theme.extension::().is_none()); + for state in ALL_PAINT_STATES { + let expected = pre_hook_chain(&theme, state); + assert_eq!(theme.for_paint_state(state), expected, "{state:?}"); + assert_eq!(theme.paint_colors(state), expected.colors, "{state:?}"); + } + // Active and not high-contrast is the identity. + assert_eq!(theme.for_paint_state(ALL_PAINT_STATES[0]), theme); + } + } + + /// A registered hook replaces the generic chain, in both entry points. + #[test] + fn a_paint_projection_replaces_the_generic_chain() { + let theme = intui::light().with_paint_projection(marking_projection); + for state in ALL_PAINT_STATES { + let expected = marking_projection(&theme, state); + assert_eq!(theme.for_paint_state(state), expected, "{state:?}"); + assert_eq!(theme.paint_colors(state), expected.colors, "{state:?}"); + } + assert_eq!( + format!("{:?}", theme.extension::().unwrap()), + "PaintProjection()" + ); + } + + /// `for_inactive_window` and `for_high_contrast` stay the documented + /// generic transforms: colours only, and a hook does not reach them. + #[test] + fn the_named_projections_keep_their_documented_behaviour() { + let plain = intui::light(); + let hooked = plain.clone().with_paint_projection(marking_projection); + for theme in [&plain, &hooked] { + let inactive = theme.for_inactive_window(); + assert_eq!(inactive.colors, theme.colors.for_inactive_window()); + assert_ne!(inactive.colors.accent, theme.colors.accent); + let high = theme.for_high_contrast(); + assert_eq!(high.colors, theme.colors.for_high_contrast()); + for projected in [inactive, high] { + assert_eq!(projected.id, theme.id); + assert_eq!(projected.appearance, theme.appearance); + assert_eq!(projected.layout, theme.layout); + assert_eq!(projected.typography, theme.typography); + assert_eq!(projected.shape, theme.shape); + assert_eq!(projected.motion, theme.motion); + assert_eq!(projected.input, theme.input); + assert_eq!( + projected.extension::().is_some(), + theme.extension::().is_some(), + ); + } + } + } + + /// A leaf painting the theme's accent, read from the paint context the + /// walker hands it. + #[derive(Debug)] + struct AccentProbe; + + impl crate::widget::Widget for AccentProbe { + fn layout_response( + &self, + proposal: teksilo_canvas::SizeProposal, + _ctx: &crate::widget::LayoutContext, + ) -> crate::widget::LayoutResponse { + proposal.resolve(0.0, 0.0).into() + } + + fn paint( + &self, + bounds: teksilo_canvas::Rect, + canvas: &mut teksilo_canvas::Canvas, + ctx: &crate::widget::PaintContext, + ) { + canvas.fill_rounded_rect( + bounds, + teksilo_tokens::CornerRadius::ZERO, + ctx.theme.colors.accent, + ); + } + } + + fn painted_accent(tree: &mut crate::widget_tree::WidgetTree) -> [f32; 4] { + let frame = tree.render(); + assert_eq!(frame.shapes.len(), 1); + frame.shapes[0].color + } + + /// The paint walker asks the theme's hook, for window activation and for + /// the high-contrast preference. + #[test] + fn the_paint_walker_paints_the_hooks_colours() { + let theme = intui::light().with_paint_projection(marking_projection); + let active = theme.colors.accent.to_array(); + let mut tree = crate::widget_tree::WidgetTree::new().with_theme(theme); + tree.add(AccentProbe); + tree.layout(teksilo_canvas::SizeProposal::exact(40.0, 20.0)); + assert_eq!(painted_accent(&mut tree), active); + + tree.set_window_active(false); + assert_eq!( + painted_accent(&mut tree), + teksilo_tokens::Color::from_hex(HOOK_INACTIVE).to_array(), + "an inactive window paints the hook's colours, not the generic desaturation" + ); + + tree.set_window_active(true); + tree.set_accessibility_preferences(true, false, 1.0); + assert_eq!( + painted_accent(&mut tree), + teksilo_tokens::Color::from_hex(HOOK_HIGH_CONTRAST).to_array(), + ); + assert_eq!( + tree.paint_state(), + PaintState { + window_active: true, + high_contrast: true, + } + ); + } + + /// Without a hook the walker paints what it painted before the hook. + #[test] + fn the_paint_walker_without_a_hook_paints_the_generic_chain() { + let theme = intui::dark(); + let mut tree = crate::widget_tree::WidgetTree::new().with_theme(theme.clone()); + tree.add(AccentProbe); + tree.layout(teksilo_canvas::SizeProposal::exact(40.0, 20.0)); + tree.set_window_active(false); + tree.set_accessibility_preferences(true, false, 1.0); + assert_eq!( + painted_accent(&mut tree), + pre_hook_chain(&theme, ALL_PAINT_STATES[3]) + .colors + .accent + .to_array() + ); + } + /// The whole point of `#[serde(default)]` on `input`: a theme serialized /// before the field existed must still load. The fixture is built the only /// way that cannot go stale — serialize a real theme, then delete the key. diff --git a/crates/teksilo-core/src/widget_tree.rs b/crates/teksilo-core/src/widget_tree.rs index e1bf9910e..4df000408 100644 --- a/crates/teksilo-core/src/widget_tree.rs +++ b/crates/teksilo-core/src/widget_tree.rs @@ -570,7 +570,10 @@ pub struct WidgetTree { /// dormant while still holding its handlers). gesture_owners: std::collections::HashSet, /// OS-level accessibility preferences (high contrast, reduced motion, text scale). - prefers_high_contrast: bool, + /// High contrast is a signal so a colour baked at build time (a recipe's + /// `ColorProp::Bound`) can follow it the way it follows window activation; + /// mutated only by `set_accessibility_preferences`. + prefers_high_contrast: crate::signal::Signal, prefers_reduced_motion: bool, text_scale_factor: f64, /// Whether an assistive technology is reading the tree, as reported by the @@ -1048,7 +1051,7 @@ impl WidgetTree { pending_delayed_overlays: Vec::new(), active_ids_scratch: Vec::new(), gesture_owners: std::collections::HashSet::new(), - prefers_high_contrast: false, + prefers_high_contrast: crate::signal::Signal::new(false), prefers_reduced_motion: false, text_scale_factor: 1.0, screen_reader: crate::environment::ScreenReaderState::default(), @@ -3074,12 +3077,14 @@ impl WidgetTree { reduced_motion: bool, text_scale_factor: f64, ) { - let changed = self.prefers_high_contrast != high_contrast + let changed = self.prefers_high_contrast.get() != high_contrast || self.prefers_reduced_motion != reduced_motion || (self.text_scale_factor - text_scale_factor).abs() > f64::EPSILON; if changed { - self.prefers_high_contrast = high_contrast; + if self.prefers_high_contrast.get() != high_contrast { + self.prefers_high_contrast.set(high_contrast); + } self.prefers_reduced_motion = reduced_motion; self.text_scale_factor = text_scale_factor; // The OS factor feeds the effective text scale (multiplied with the @@ -3091,7 +3096,27 @@ impl WidgetTree { /// Whether the OS has requested high-contrast mode. pub fn prefers_high_contrast(&self) -> bool { - self.prefers_high_contrast + self.prefers_high_contrast.get() + } + + /// Reactive handle on the high-contrast preference. Fires when + /// [`set_accessibility_preferences`](Self::set_accessibility_preferences) + /// changes it. Bind at [`BindingLevel::RepaintOnly`]: the preference only + /// changes colours. Starts `false`. + /// + /// [`BindingLevel::RepaintOnly`]: crate::binding::BindingLevel::RepaintOnly + pub fn high_contrast_signal(&self) -> crate::signal::Signal { + self.prefers_high_contrast.clone() + } + + /// The [`PaintState`](crate::styles::PaintState) this tree paints under: + /// its window-active state and the high-contrast preference. The paint + /// walker hands it to [`Theme::for_paint_state`](crate::styles::Theme::for_paint_state). + pub fn paint_state(&self) -> crate::styles::PaintState { + crate::styles::PaintState { + window_active: self.is_window_active(), + high_contrast: self.prefers_high_contrast(), + } } /// Whether the OS has requested reduced motion. diff --git a/crates/teksilo-core/src/widget_tree/rendering_impl.rs b/crates/teksilo-core/src/widget_tree/rendering_impl.rs index 77778395a..68fad64c3 100644 --- a/crates/teksilo-core/src/widget_tree/rendering_impl.rs +++ b/crates/teksilo-core/src/widget_tree/rendering_impl.rs @@ -118,31 +118,21 @@ impl WidgetTree { let mut frame = RenderFrame::new(); // `effective_theme` carries the user/OS text-scale multiplier baked into - // its typography, so painted glyphs match the scaled layout sizes. When - // the window is inactive, paint against the accent-desaturated - // projection so every accent-coloured control (default button, Toggle, - // checked Checkbox/Radio, selected Tab/Segment, Slider fill, - // ProgressBar, focus rings) greys out — the Qt `QPalette::Inactive` - // model, resolved once theme-side instead of per widget. Colours only; - // typography is unchanged, so this is repaint-only (geometry stable). - let base_theme = if self.is_window_active() { - self.effective_theme.clone() - } else { - self.effective_theme.for_inactive_window() - }; - // When the OS "increase contrast" preference is set, project the - // (already active/inactive-adjusted) palette into its high-contrast - // variant (WCAG 1.4.6 Enhanced / EN 301 549 11.7). Colours only, so - // this stays repaint-only like the inactive-window swap; the HC accent - // / focus overrides win over the inactive desaturation while it's on. - let base_theme = if self.prefers_high_contrast { - base_theme.for_high_contrast() - } else { - base_theme - }; + // its typography, so painted glyphs match the scaled layout sizes. The + // palette is then projected for this window's paint state: an inactive + // window greys out every accent-coloured control (default button, + // Toggle, checked Checkbox/Radio, selected Tab/Segment, Slider fill, + // ProgressBar, focus rings), the Qt `QPalette::Inactive` model resolved + // once theme-side instead of per widget, and the OS "increase + // contrast" preference swaps in the high-contrast variant (WCAG 1.4.6 + // Enhanced / EN 301 549 11.7). A theme's own `PaintProjection` decides + // both when it registers one; see `Theme::for_paint_state`. Colours + // only; typography is unchanged, so this is repaint-only (geometry + // stable). + let base_theme = self.effective_theme.for_paint_state(self.paint_state()); let text_backend = self.text_backend.clone(); let a11y_prefs = A11yPaintPrefs { - high_contrast: self.prefers_high_contrast, + high_contrast: self.prefers_high_contrast(), reduced_motion: self.prefers_reduced_motion, large_text: self.text_scale_factor > 1.0, text_scale: self.effective_text_scale, diff --git a/crates/teksilo-widgets/src/button.rs b/crates/teksilo-widgets/src/button.rs index 00d008905..f7adbd5f9 100644 --- a/crates/teksilo-widgets/src/button.rs +++ b/crates/teksilo-widgets/src/button.rs @@ -1413,7 +1413,14 @@ mod tests { // window-active palette to grey out like the paint-resolving controls. let theme = teksilo_core::presets::intui::light(); let accent = theme.colors.accent.to_array(); - let inactive_accent = theme.colors.for_inactive_window().accent.to_array(); + let inactive_accent = theme + .for_paint_state(teksilo_core::styles::PaintState { + window_active: false, + high_contrast: false, + }) + .colors + .accent + .to_array(); assert_ne!(accent, inactive_accent); let mut tree = WidgetTree::new().with_theme(theme); @@ -1443,6 +1450,72 @@ mod tests { assert!(frame_has_color(&tree.render(), accent)); } + #[test] + fn filled_button_fill_follows_the_high_contrast_preference() { + // The baked fill resolves through `Theme::paint_colors`, so it takes + // the high-contrast accent the paint walker gives every + // paint-resolving control. IntUI dark swaps its accent under high + // contrast; light keeps it. + use teksilo_core::styles::PaintState; + let theme = teksilo_core::presets::intui::dark(); + let accent = theme.colors.accent.to_array(); + let hc_accent = theme + .for_paint_state(PaintState { + window_active: true, + high_contrast: true, + }) + .colors + .accent + .to_array(); + assert_ne!(accent, hc_accent); + + let mut tree = WidgetTree::new().with_theme(theme); + tree.add(Button::new(lit!("Save")).variant(ButtonVariant::Filled)); + tree.layout(SizeProposal::exact(200.0, 80.0)); + assert!(frame_has_color(&tree.render(), accent)); + + tree.set_accessibility_preferences(true, false, 1.0); + let frame = tree.render(); + assert!( + frame_has_color(&frame, hc_accent), + "high contrast: the Filled button fill takes the high-contrast accent" + ); + assert!(!frame_has_color(&frame, accent)); + + tree.set_accessibility_preferences(false, false, 1.0); + assert!(frame_has_color(&tree.render(), accent)); + } + + #[test] + fn filled_button_fill_follows_a_themes_paint_projection() { + // A theme's `PaintProjection` reaches the colours a recipe bakes at + // build time, not only the ones resolved at paint. + use teksilo_core::styles::{PaintState, Theme}; + fn project(theme: &Theme, state: PaintState) -> Theme { + let mut out = theme.clone(); + if !state.window_active { + out.colors.accent = teksilo_tokens::Color::from_hex("#FF00FF"); + } + out + } + let theme = teksilo_core::presets::intui::light().with_paint_projection(project); + let accent = theme.colors.accent.to_array(); + let hooked = teksilo_tokens::Color::from_hex("#FF00FF").to_array(); + + let mut tree = WidgetTree::new().with_theme(theme); + tree.add(Button::new(lit!("Save")).variant(ButtonVariant::Filled)); + tree.layout(SizeProposal::exact(200.0, 80.0)); + assert!(frame_has_color(&tree.render(), accent)); + + tree.set_window_active(false); + let frame = tree.render(); + assert!( + frame_has_color(&frame, hooked), + "inactive window: the fill is the hook's colour" + ); + assert!(!frame_has_color(&frame, accent)); + } + #[test] fn keyup_without_keydown_does_not_fire() { // Regression for the MessageBox reopen bug: when a shortcut diff --git a/crates/teksilo-widgets/src/primitives/rect_widget.rs b/crates/teksilo-widgets/src/primitives/rect_widget.rs index c01339b71..2c8f17709 100644 --- a/crates/teksilo-widgets/src/primitives/rect_widget.rs +++ b/crates/teksilo-widgets/src/primitives/rect_widget.rs @@ -270,7 +270,14 @@ mod tests { let theme = teksilo_core::presets::intui::light(); let accent = theme.colors.accent.to_array(); - let inactive_accent = theme.colors.for_inactive_window().accent.to_array(); + let inactive_accent = theme + .for_paint_state(teksilo_core::styles::PaintState { + window_active: false, + high_contrast: false, + }) + .colors + .accent + .to_array(); assert_ne!(accent, inactive_accent); let mut tree = WidgetTree::new().with_theme(theme); diff --git a/crates/teksilo-widgets/src/styles.rs b/crates/teksilo-widgets/src/styles.rs index 5b890dfd4..bc1de45ac 100644 --- a/crates/teksilo-widgets/src/styles.rs +++ b/crates/teksilo-widgets/src/styles.rs @@ -98,32 +98,38 @@ pub use recipe_tooltip_style::{RecipeTooltipStyle, TooltipRecipe}; use teksilo_core::build_context::BuildContext; use teksilo_core::signal::Signal; +use teksilo_core::styles::PaintState; use teksilo_tokens::ColorTokens; -/// Reactive resolution palette for recipe colours: the live theme palette while -/// the host window is active, the accent-desaturated projection -/// ([`ColorTokens::for_inactive_window`]) while it is inactive. +/// Reactive resolution palette for recipe colours: the palette the paint +/// walker paints with, [`Theme::paint_colors`](teksilo_core::styles::Theme::paint_colors) for the host window's +/// current [`PaintState`] (window activation and the high-contrast +/// preference). /// /// A recipe style that **bakes** a colour into a `ColorProp::Bound(Signal)` / /// `PaintProp` at build time (resolving a `RecipeColor` against the theme) must /// resolve against this signal rather than a plain `ctx.theme_signal()`. A /// `Bound` colour is a concrete value that `ColorProp::resolve` returns verbatim -/// — it ignores the paint walker's window-inactive theme projection — so accent -/// chrome baked from `theme_signal` (a Filled button fill, an accent focus -/// border) would stay vivid in a background window while paint-resolving -/// controls (Toggle, Checkbox, which read `colors.accent` in `paint()`) greyed -/// out. Resolving against this greys them out uniformly. +/// and so ignores the paint walker's theme projection: accent chrome baked from +/// `theme_signal` (a Filled button fill, an accent focus border) would stay +/// vivid in a background window, and keep its normal colours under high +/// contrast, while paint-resolving controls (Toggle, Checkbox, which read +/// `colors.accent` in `paint()`) followed the projection. Resolving against +/// this keeps them in step, including a theme's own +/// [`PaintProjection`](teksilo_core::styles::PaintProjection). /// -/// Role-preserving paint paths — passing a `SurfaceRole` / `BorderRole` / +/// Role-preserving paint paths (passing a `SurfaceRole` / `BorderRole` / /// `Signal` straight to a widget so it resolves against `ctx.theme` at -/// paint — already follow the projection and need no change. +/// paint) already follow the projection and need no change. pub(crate) fn window_resolution_colors(ctx: &BuildContext) -> Signal { let wa = ctx.window_active_signal(); - ctx.theme_signal().zip(&wa).map(|(theme, active)| { - if *active { - theme.colors.clone() - } else { - theme.colors.for_inactive_window() - } - }) + let hc = ctx.high_contrast_signal(); + ctx.theme_signal() + .zip3(&wa, &hc) + .map(|(theme, window_active, high_contrast)| { + theme.paint_colors(PaintState { + window_active: *window_active, + high_contrast: *high_contrast, + }) + }) } diff --git a/crates/teksilo-widgets/src/styles/recipe_button_style.rs b/crates/teksilo-widgets/src/styles/recipe_button_style.rs index 99b55619a..cac5e1d9f 100644 --- a/crates/teksilo-widgets/src/styles/recipe_button_style.rs +++ b/crates/teksilo-widgets/src/styles/recipe_button_style.rs @@ -206,14 +206,11 @@ fn bind_fill( || recipe.disabled.as_ref().is_some_and(is_gradient); if any_gradient { // Gradient fills bake to a non-reactive PaintProp. Resolve against the - // window-active palette at build so a window that *starts* inactive is - // already desaturated; live flips of a gradient fill are a known gap - // (no IntUI / Material accent button uses a gradient fill). - let colors = if ctx.window_active() { - ctx.theme().colors.clone() - } else { - ctx.theme().colors.for_inactive_window() - }; + // paint state at build so a window that *starts* inactive, or under + // high contrast, already paints the projected palette; live flips of + // a gradient fill are a known gap (no IntUI / Material accent button + // uses a gradient fill). + let colors = ctx.theme().paint_colors(ctx.paint_state()); return PaintProp::from_fill(&recipe.idle, &colors); } let recipe = recipe.clone(); diff --git a/docs/window-activation.md b/docs/window-activation.md index ed12bf77f..531e25b8f 100644 --- a/docs/window-activation.md +++ b/docs/window-activation.md @@ -43,7 +43,8 @@ These are correctness, not features, so they are **on by default**: - **Accent desaturation (theme-side, covers every control).** When the window is inactive, the paint walker swaps in a theme projection - (`ColorTokens::for_inactive_window`) whose **accent family and focus indicators + (`ColorTokens::for_inactive_window`, unless the theme registers its own + `PaintProjection`, see below) whose **accent family and focus indicators are desaturated toward graphite**, the macOS / Qt `QPalette::Inactive` model. Because every themed control resolves its accent from the live `ColorTokens` at paint time, this single @@ -135,6 +136,48 @@ of that shape comes back. It is layout- and a11y-transparent, and the opacity **snaps** (no tween), correct under `prefers-reduced-motion`, since window activation is an OS state change, not a user-initiated motion. +## A theme's own inactive and high-contrast colours: `PaintProjection` + +The accent desaturation above is a fixed transform of the tokens. It suits a +palette that defines no inactive colours of its own, which is every palette +built from tokens alone. A theme whose source palette does define them (a +desktop colour scheme with an inactive colour group, say) registers a +`PaintProjection` instead, and paints those colours: + +```rust +use teksilo::core::styles::{PaintState, Theme}; + +fn project(theme: &Theme, state: PaintState) -> Theme { + let mut out = theme.clone(); + if !state.window_active { + out.colors = my_inactive_colors(theme); + } + if state.high_contrast { + out = out.for_high_contrast(); // keep the generic part it wants + } + out +} + +let theme = my_theme().with_paint_projection(project); +``` + +The paint walker asks `Theme::for_paint_state(PaintState { window_active, +high_contrast })` for the theme of each frame. With a `PaintProjection` +registered, that is the hook's answer; without one it is the generic chain, +`for_inactive_window` when the window is inactive and then `for_high_contrast` +when the "increase contrast" preference is set, exactly the output of earlier +releases. The hook receives the active theme and both flags at once, so it +decides how they combine, and it replaces the generic chain entirely: +`Theme::for_inactive_window` and `Theme::for_high_contrast` stay the generic +transforms and do not consult it. Only change colours in a hook. The swap is +repaint-only, so geometry a hook changes is not honoured. + +Colours a recipe bakes at build time (a `Filled` button's fill and focus +border, held as a `ColorProp::Bound`) resolve through the same call, +`Theme::paint_colors`, against `BuildContext::window_active_signal` and +`BuildContext::high_contrast_signal`, so they follow the hook, and the +high-contrast preference, like the colours resolved at paint. + ## Keeping a widget vivid when inactive There is no need to opt out of the automatic behaviour for normal apps. If a From 58596649c26ac5a5de879ac521aed8db48b0568a Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 02:37:06 +0200 Subject: [PATCH 05/59] feat(styles): accept a negative focus-ring offset A theme can now draw its focus ring partly or wholly inside the control (KDE Breeze uses offset -1 with width 2). Every consumer of ShapeTokens::focus_ring_offset goes through one geometry: - ShapeTokens::focus_ring_envelope() is offset + width floored at zero, so the space a control reserves outside itself never goes negative. - ShapeTokens::focus_ring_stroke_distance() is the signed distance to the stroke's centre line. - teksilo_core::styles::FocusRingStroke grows or shrinks the control rect around its centre and floors size and radius at zero, so a deep negative offset collapses the ring instead of inverting it. Envelope-model widgets (segmented control, breadcrumb, radio tile group) now place the ring around their visual rather than relative to their bounds, which only agreed with the visual while the envelope was the unclamped offset + width. The tab ring stays inside the tab: its inset is floored at half the stroke so a negative offset cannot spill into the neighbouring tab, and every offset at or below zero draws the same ring, flush with the tab edge. The token doc and the changelog say so. The breadcrumb painter asked is_interactive() after build had moved the action out, so a built crumb never painted its hover and focus state, its ring or its accent colour, and never advertised Click or Focus to assistive technology; paint and accessibility now read the recorded navigates flag. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 17 +++ crates/teksilo-core/src/styles.rs | 3 + crates/teksilo-core/src/styles/focus_ring.rs | 101 +++++++++++++++ .../teksilo-theme-macos/src/styles/chrome.rs | 49 +++++++- .../src/styles/toggle.rs | 49 ++++++-- crates/teksilo-tokens/src/shape.rs | 54 +++++++- crates/teksilo-widgets/src/breadcrumb.rs | 117 ++++++++++++++---- .../src/color_picker/swatch.rs | 19 ++- .../teksilo-widgets/src/color_picker/tests.rs | 35 ++++++ .../teksilo-widgets/src/radio_tile_group.rs | 59 ++++++--- .../teksilo-widgets/src/segmented_control.rs | 11 +- .../src/segmented_control/tests.rs | 49 ++++++++ crates/teksilo-widgets/src/slider.rs | 33 +++++ .../src/styles/recipe_avatar_style.rs | 82 +++++++++--- .../styles/recipe_segmented_control_style.rs | 22 ++-- .../src/styles/recipe_slider_style.rs | 20 ++- .../src/styles/recipe_tab_style.rs | 91 ++++++++++++-- .../src/styles/recipe_toggle_style.rs | 77 +++++++++--- 18 files changed, 739 insertions(+), 149 deletions(-) create mode 100644 crates/teksilo-core/src/styles/focus_ring.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index ed00160a3..d815b83c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,17 @@ by crate for clarity, not because crates version independently. a hook they return what the paint walker painted before. The preference is readable at build time through `BuildContext::prefers_high_contrast`, `high_contrast_signal` and `paint_state`. +- **A negative `ShapeTokens::focus_ring_offset`.** A theme can draw its focus + ring partly or wholly inside the control: an offset of `-1` with a 2 dp + width runs from 1 dp inside the edge to 1 dp outside it. Every stock ring + (sliders, toggles, segmented controls, breadcrumbs, radio tile groups, + avatars, colour swatches, tabs and the Material 3 and macOS presets) follows + it without inverting on a small control, and a control reserves only the + ring's reach outside it. Tabs, which sit flush against each other, keep + their ring inside the tab: any offset at or below zero draws it flush with + the tab edge. `ShapeTokens::focus_ring_envelope` and + `focus_ring_stroke_distance` give those two distances, and + `FocusRingStroke` gives the rectangle and radius a ring is stroked on. ### Fixed @@ -41,6 +52,12 @@ by crate for clarity, not because crates version independently. #### Theming +- **A breadcrumb crumb shows its hover, focus and link colours.** + **Behaviour change:** a navigable crumb now paints its hover and focus + background, its focus ring and its accent link colour, and assistive + technology can activate and focus it again. Before, every built crumb + painted in the secondary text colour with no hover or focus state, and + advertised neither the Click nor the Focus action. - **Accent chrome a recipe builds follows the high-contrast preference.** **Behaviour change:** under the OS increase contrast preference, a `Filled` button's fill and a button's focus border now take the high-contrast diff --git a/crates/teksilo-core/src/styles.rs b/crates/teksilo-core/src/styles.rs index 0edda49c1..96cef01c1 100644 --- a/crates/teksilo-core/src/styles.rs +++ b/crates/teksilo-core/src/styles.rs @@ -39,6 +39,8 @@ mod dialog_style; mod drop_target_style; #[path = "styles/drop_zone_style.rs"] mod drop_zone_style; +#[path = "styles/focus_ring.rs"] +mod focus_ring; #[path = "styles/grid_view_style.rs"] mod grid_view_style; #[path = "styles/icon_button_style.rs"] @@ -139,6 +141,7 @@ pub use drop_target_style::{ pub use drop_zone_style::{ DropZoneStyle, DropZoneStyleConfig, DropZoneVisualState, SharedDropZoneStyle, }; +pub use focus_ring::FocusRingStroke; pub use grid_view_style::{ GridFocusRingRecipe, GridInsertionRecipe, GridMarqueeRecipe, GridViewStyle, SharedGridViewStyle, }; diff --git a/crates/teksilo-core/src/styles/focus_ring.rs b/crates/teksilo-core/src/styles/focus_ring.rs new file mode 100644 index 000000000..53a6b8308 --- /dev/null +++ b/crates/teksilo-core/src/styles/focus_ring.rs @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Focus-ring stroke geometry shared by every painter that reads +//! [`ShapeTokens::focus_ring_offset`]. +//! +//! A ring is a stroke centred on a rounded rectangle at a signed distance +//! from the control edge. The distance is negative when a theme draws the +//! ring partly or wholly inside the control (a negative +//! `focus_ring_offset`), so the arithmetic here floors the two quantities +//! that would otherwise invert: the rectangle's size, which stays centred +//! on the control and never drops below zero, and the corner radius, which +//! never drops below zero either. + +use teksilo_canvas::Rect; +use teksilo_tokens::ShapeTokens; + +/// The rounded rectangle a focus-ring stroke is centred on. +/// +/// Pass [`rect`](Self::rect) and [`corner_radius`](Self::corner_radius) to +/// `Canvas::stroke_rounded_rect` with the ring's width. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct FocusRingStroke { + /// The stroke's centre line. Its width and height are never negative. + pub rect: Rect, + /// Corner radius of the centre line. Never negative. + pub corner_radius: f32, +} + +impl FocusRingStroke { + /// The centre line `distance` outside `control`, whose corners have + /// radius `control_radius`. A negative `distance` lies inside the + /// control. + /// + /// The rectangle grows (or, for a negative distance, shrinks) by + /// `distance` on every side and keeps the control's centre; a shrink + /// past the control's half-size stops at zero rather than inverting. + /// The radius follows the edge at the same distance, floored at zero. + pub fn at_distance(control: Rect, control_radius: f32, distance: f32) -> Self { + let width = (control.width + distance * 2.0).max(0.0); + let height = (control.height + distance * 2.0).max(0.0); + let cx = control.x + control.width * 0.5; + let cy = control.y + control.height * 0.5; + Self { + rect: Rect::new(cx - width * 0.5, cy - height * 0.5, width, height), + corner_radius: (control_radius + distance).max(0.0), + } + } + + /// The theme's ring around `control`: centred + /// [`ShapeTokens::focus_ring_stroke_distance`] outside it, so its inner + /// edge sits `focus_ring_offset` from the control edge. + pub fn around(control: Rect, control_radius: f32, shape: &ShapeTokens) -> Self { + Self::at_distance(control, control_radius, shape.focus_ring_stroke_distance()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn shape_with_offset(offset: f32) -> ShapeTokens { + ShapeTokens { + focus_ring_offset: offset, + focus_ring_width: 2.0, + ..ShapeTokens::default() + } + } + + #[test] + fn a_positive_offset_grows_the_ring_and_its_radius() { + let control = Rect::new(10.0, 10.0, 40.0, 20.0); + let ring = FocusRingStroke::around(control, 4.0, &shape_with_offset(2.0)); + assert_eq!(ring.rect, Rect::new(7.0, 7.0, 46.0, 26.0)); + assert_eq!(ring.corner_radius, 7.0); + } + + #[test] + fn a_negative_offset_straddles_the_edge_and_is_smaller_than_an_outer_ring() { + let control = Rect::new(10.0, 10.0, 40.0, 20.0); + let inner = FocusRingStroke::around(control, 4.0, &shape_with_offset(-1.0)); + let outer = FocusRingStroke::around(control, 4.0, &shape_with_offset(2.0)); + // Offset -1, width 2: centred on the control edge. + assert_eq!(inner.rect, control); + assert_eq!(inner.corner_radius, 4.0); + assert!(inner.rect.width < outer.rect.width); + assert!(inner.rect.height < outer.rect.height); + assert!(inner.corner_radius < outer.corner_radius); + } + + #[test] + fn a_deep_negative_offset_never_inverts() { + let control = Rect::new(10.0, 10.0, 6.0, 4.0); + let ring = FocusRingStroke::at_distance(control, 2.0, -10.0); + assert!(ring.rect.width >= 0.0); + assert!(ring.rect.height >= 0.0); + assert_eq!(ring.corner_radius, 0.0); + // Collapsed onto the control's centre, not thrown off it. + assert_eq!(ring.rect, Rect::new(13.0, 12.0, 0.0, 0.0)); + } +} diff --git a/crates/teksilo-theme-macos/src/styles/chrome.rs b/crates/teksilo-theme-macos/src/styles/chrome.rs index a82c0992a..ebb43c0ae 100644 --- a/crates/teksilo-theme-macos/src/styles/chrome.rs +++ b/crates/teksilo-theme-macos/src/styles/chrome.rs @@ -49,6 +49,7 @@ use teksilo_core::accessibility::AccessNodeBuilder; use teksilo_core::binding::BindingLevel; use teksilo_core::build_context::BuildContext; use teksilo_core::signal::Signal; +use teksilo_core::styles::FocusRingStroke; use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement}; use teksilo_core::widget_id::WidgetId; use teksilo_tokens::{Color, CornerRadius, Shadow}; @@ -350,23 +351,40 @@ pub fn paint_ring( // Halo first, so the solid band lands on top of its inner edge and // the two read as one graded ring rather than two outlines. - let halo_center = offset + solid_w + MACOS_FOCUS_RING_HALO_WIDTH * 0.5; + // A negative offset pulls both bands inward; `FocusRingStroke` keeps + // the rectangles and radii from inverting on a small control. + let (halo, solid) = ring_bands(bounds, radius, offset, solid_w); canvas.stroke_rounded_rect( - inflate(bounds, halo_center), - CornerRadius::uniform(radius + halo_center), + halo.rect, + CornerRadius::uniform(halo.corner_radius), color.with_alpha(color.a() * MACOS_FOCUS_RING_HALO_ALPHA), MACOS_FOCUS_RING_HALO_WIDTH, ); - let solid_center = offset + solid_w * 0.5; canvas.stroke_rounded_rect( - inflate(bounds, solid_center), - CornerRadius::uniform(radius + solid_center), + solid.rect, + CornerRadius::uniform(solid.corner_radius), color, solid_w, ); } +/// The halo and solid-band centre lines of [`paint_ring`]: the solid band's +/// inner edge `offset` from the control, the halo just outside it. +fn ring_bands( + bounds: Rect, + radius: f32, + offset: f32, + solid_w: f32, +) -> (FocusRingStroke, FocusRingStroke) { + let halo_center = offset + solid_w + MACOS_FOCUS_RING_HALO_WIDTH * 0.5; + let solid_center = offset + solid_w * 0.5; + ( + FocusRingStroke::at_distance(bounds, radius, halo_center), + FocusRingStroke::at_distance(bounds, radius, solid_center), + ) +} + /// Paint the macOS focus ring in the accent — the usual case. pub fn paint_focus_ring(canvas: &mut Canvas, bounds: Rect, radius: f32, ctx: &PaintContext) { // `focus_ring` is `controlAccentColor`, already desaturated by the @@ -576,4 +594,23 @@ mod tests { let halo_inner_edge = MACOS_FOCUS_RING_WIDTH; assert!((solid_outer_edge - halo_inner_edge).abs() < 1e-6); } + + #[test] + fn a_negative_offset_pulls_both_bands_in_without_inverting() { + let control = Rect::new(10.0, 10.0, 40.0, 22.0); + let w = MACOS_FOCUS_RING_WIDTH; + let (out_halo, out_solid) = ring_bands(control, 6.0, 0.0, w); + let (in_halo, in_solid) = ring_bands(control, 6.0, -1.0, w); + assert!(in_solid.rect.width < out_solid.rect.width); + assert!(in_solid.rect.height < out_solid.rect.height); + assert!(in_halo.rect.width < out_halo.rect.width); + assert!(in_halo.rect.height < out_halo.rect.height); + + // A tiny control under an offset deeper than it is wide. + let (halo, solid) = ring_bands(Rect::new(0.0, 0.0, 2.0, 2.0), 1.0, -8.0, w); + for band in [halo, solid] { + assert!(band.rect.width >= 0.0 && band.rect.height >= 0.0); + assert!(band.corner_radius >= 0.0); + } + } } diff --git a/crates/teksilo-theme-material3/src/styles/toggle.rs b/crates/teksilo-theme-material3/src/styles/toggle.rs index 316c954a4..c3f6cd8c4 100644 --- a/crates/teksilo-theme-material3/src/styles/toggle.rs +++ b/crates/teksilo-theme-material3/src/styles/toggle.rs @@ -16,10 +16,10 @@ use teksilo_core::binding::BindingLevel; use teksilo_core::build_context::BuildContext; use teksilo_core::focus::FocusOrigin; use teksilo_core::signal::Signal; -use teksilo_core::styles::{ToggleStyle, ToggleStyleConfig}; +use teksilo_core::styles::{FocusRingStroke, ToggleStyle, ToggleStyleConfig}; use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement}; use teksilo_core::widget_id::WidgetId; -use teksilo_tokens::{Color, CornerRadius, lerp}; +use teksilo_tokens::{Color, CornerRadius, ShapeTokens, lerp}; use crate::Material3Palette; @@ -179,16 +179,10 @@ impl Widget for M3SwitchBody { // Keyboard focus ring, drawn outside the track. if self.focus_origin.get() == Some(FocusOrigin::Keyboard) { - let offset = ctx.theme.shape.focus_ring_offset + ctx.theme.shape.focus_ring_width / 2.0; - let ring_rect = Rect::new( - track_rect.x - offset, - track_rect.y - offset, - track_rect.width + offset * 2.0, - track_rect.height + offset * 2.0, - ); + let ring = focus_ring_stroke(track_rect, &ctx.theme.shape); canvas.stroke_rounded_rect( - ring_rect, - CornerRadius::uniform(TRACK_H / 2.0 + offset), + ring.rect, + CornerRadius::uniform(ring.corner_radius), ctx.theme.colors.focus_ring, ctx.theme.shape.focus_ring_width, ); @@ -217,3 +211,36 @@ impl Widget for M3SwitchBody { // The parent Toggle owns accessibility; this body is presentational. } } + +/// The keyboard focus ring's centre line around the pill track. A negative +/// `focus_ring_offset` draws it partly inside the track. +fn focus_ring_stroke(track_rect: Rect, shape: &ShapeTokens) -> FocusRingStroke { + FocusRingStroke::around(track_rect, TRACK_H / 2.0, shape) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn shape(offset: f32) -> ShapeTokens { + ShapeTokens { + focus_ring_offset: offset, + focus_ring_width: 2.0, + ..ShapeTokens::default() + } + } + + #[test] + fn a_negative_focus_ring_offset_shrinks_the_ring_without_inverting() { + let track = Rect::new(0.0, 0.0, TRACK_W, TRACK_H); + let outer = focus_ring_stroke(track, &shape(2.0)); + let inner = focus_ring_stroke(track, &shape(-1.0)); + assert!(inner.rect.width < outer.rect.width); + assert!(inner.rect.height < outer.rect.height); + assert!(inner.rect.width >= 0.0 && inner.rect.height >= 0.0); + + let deep = focus_ring_stroke(track, &shape(-40.0)); + assert!(deep.rect.width >= 0.0 && deep.rect.height >= 0.0); + assert!(deep.corner_radius >= 0.0); + } +} diff --git a/crates/teksilo-tokens/src/shape.rs b/crates/teksilo-tokens/src/shape.rs index 654006268..a8f17fc4b 100644 --- a/crates/teksilo-tokens/src/shape.rs +++ b/crates/teksilo-tokens/src/shape.rs @@ -104,9 +104,24 @@ pub struct ShapeTokens { pub radius_pill: f32, /// 1 dp — universal border width. Int UI has no thicker variant. pub border_width: f32, - /// 2 dp — focus ring outline width, drawn outside the control. + /// 2 dp: focus ring outline width. pub focus_ring_width: f32, - /// 2 dp — gap between control edge and focus ring. + /// 2 dp: signed distance from the control edge to the inner edge of + /// the focus ring. + /// + /// Positive leaves a gap between the control and the ring. Zero puts + /// the ring flush against the control. A negative offset draws the + /// ring partly (or, below `-focus_ring_width`, wholly) inside the + /// control: `-1` with a 2 dp width runs from 1 dp inside the edge to + /// 1 dp outside it. Every focus-ring painter accepts a negative value; + /// the space a control reserves outside itself for the ring is + /// [`focus_ring_envelope`](Self::focus_ring_envelope), which never goes + /// below zero. + /// + /// Tabs are the exception: they sit flush against each other, so a tab + /// draws its ring inside itself, insets it by the offset, and clamps it + /// to the tab edge. Every offset at or below zero gives a tab the same + /// ring, flush with its edge. pub focus_ring_offset: f32, /// Tooltips — outer soft halo. pub shadow_xs: Shadow, @@ -128,6 +143,24 @@ pub struct ShapeTokens { } impl ShapeTokens { + /// How far the focus ring reaches outside the control edge: + /// `focus_ring_offset + focus_ring_width`, floored at zero. + /// + /// This is the space a control reserves around its visual for the + /// ring. A ring drawn wholly inside the control (an offset at or below + /// `-focus_ring_width`) needs none, and a negative envelope would + /// shrink the control's frame instead. + pub fn focus_ring_envelope(&self) -> f32 { + (self.focus_ring_offset + self.focus_ring_width).max(0.0) + } + + /// Signed distance from the control edge to the centre line of the + /// focus-ring stroke: `focus_ring_offset + focus_ring_width / 2`. + /// Negative when the ring's centre line lies inside the control. + pub fn focus_ring_stroke_distance(&self) -> f32 { + self.focus_ring_offset + self.focus_ring_width * 0.5 + } + /// Light-theme shadows. /// Outer alphas: xs 85%, sm 22%, md 28%, lg 36%. /// Inner alphas (density-1.0 max): xs 85%, sm 50%, md 55%, lg 60%. @@ -248,4 +281,21 @@ mod tests { assert!(s.focus_ring_offset > 0.0); assert!(s.focus_ring_width > 0.0); } + + #[test] + fn focus_ring_envelope_follows_a_negative_offset_and_stops_at_zero() { + let mut s = ShapeTokens::default(); + assert_eq!(s.focus_ring_envelope(), 4.0); + assert_eq!(s.focus_ring_stroke_distance(), 3.0); + + // Straddling the edge: 1 dp inside, 1 dp outside. + s.focus_ring_offset = -1.0; + assert_eq!(s.focus_ring_envelope(), 1.0); + assert_eq!(s.focus_ring_stroke_distance(), 0.0); + + // Wholly inside: nothing to reserve outside the control. + s.focus_ring_offset = -5.0; + assert_eq!(s.focus_ring_envelope(), 0.0); + assert_eq!(s.focus_ring_stroke_distance(), -4.0); + } } diff --git a/crates/teksilo-widgets/src/breadcrumb.rs b/crates/teksilo-widgets/src/breadcrumb.rs index e356b5105..0e908544d 100644 --- a/crates/teksilo-widgets/src/breadcrumb.rs +++ b/crates/teksilo-widgets/src/breadcrumb.rs @@ -64,6 +64,7 @@ use crate::menu_item::MenuItem; use crate::menu_list::MenuList; use crate::popover_widget::PopoverButton; use crate::primitives::{HStack, IconWidget, Spacer}; +use teksilo_core::styles::FocusRingStroke; use teksilo_core::styles::density::spacing; use teksilo_i18n::LocalizedString; @@ -285,7 +286,7 @@ impl BreadcrumbSegment { fn estimate_width(&self, ctx: &LayoutContext) -> f32 { let pad_h = breadcrumb_item_padding_horizontal(&ctx.theme.input); - let envelope = ctx.theme.shape.focus_ring_offset + ctx.theme.shape.focus_ring_width; + let envelope = ctx.theme.shape.focus_ring_envelope(); let resolved = self.label.resolve_now(); let text_width = if let Some(backend) = ctx.text_backend { backend @@ -424,7 +425,7 @@ impl Widget for BreadcrumbSegment { proposal: SizeProposal, ctx: &LayoutContext, ) -> teksilo_core::widget::LayoutResponse { - let envelope = ctx.theme.shape.focus_ring_offset + ctx.theme.shape.focus_ring_width; + let envelope = ctx.theme.shape.focus_ring_envelope(); let width = proposal.width.unwrap_or_else(|| self.estimate_width(ctx)); let text_height = if let Some(backend) = ctx.text_backend { backend @@ -462,17 +463,13 @@ impl Widget for BreadcrumbSegment { self.painted_size.set(bounds.size()); let colors = &ctx.theme.colors; let shape = &ctx.theme.shape; - let envelope = shape.focus_ring_offset + shape.focus_ring_width; + let envelope = shape.focus_ring_envelope(); let interaction = self.interaction.get(); - let interactive = self.is_interactive(); + // Not `is_interactive()`: `build` has moved the action out by now. + let interactive = self.navigates.get(); // Visual bounds — inset by the focus-ring envelope. - let visual = Rect::new( - bounds.x + envelope, - bounds.y + envelope, - (bounds.width - envelope * 2.0).max(0.0), - (bounds.height - envelope * 2.0).max(0.0), - ); + let visual = bounds.inset(envelope, envelope, envelope, envelope); if interactive { let background = if interaction == SegmentInteraction::Hovered { @@ -489,19 +486,13 @@ impl Widget for BreadcrumbSegment { background, ); } - // Focus ring — drawn outside the visual, inside the reserved envelope. + // Focus ring: drawn around the visual, inside the reserved + // envelope. A negative offset lays it over the visual's edge. if interaction == SegmentInteraction::Focused { - let half_stroke = shape.focus_ring_width * 0.5; - let ring_rect = Rect::new( - bounds.x + half_stroke, - bounds.y + half_stroke, - (bounds.width - half_stroke * 2.0).max(0.0), - (bounds.height - half_stroke * 2.0).max(0.0), - ); - let ring_radius = BREADCRUMB_CORNER_RADIUS + shape.focus_ring_offset + half_stroke; + let ring = FocusRingStroke::around(visual, BREADCRUMB_CORNER_RADIUS, shape); canvas.stroke_rounded_rect( - ring_rect, - CornerRadius::uniform(ring_radius), + ring.rect, + CornerRadius::uniform(ring.corner_radius), colors.focus_ring, shape.focus_ring_width, ); @@ -544,7 +535,8 @@ impl Widget for BreadcrumbSegment { builder.set_name(self.label.resolve_now()); if self.current { builder.set_aria_current(teksilo_core::accesskit::AriaCurrent::Page); - } else if self.is_interactive() { + } else if self.navigates.get() { + // Not `is_interactive()`: `build` has moved the action out by now. builder.add_action(teksilo_core::accesskit::Action::Click); builder.add_action(teksilo_core::accesskit::Action::Focus); } @@ -1071,6 +1063,57 @@ mod tests { bc } + // ── focus ring ─────────────────────────────────────────────────────────── + + /// The focused crumb's ring and its visual (the focused background + /// fill) under a theme whose `focus_ring_offset` is `offset` (width 2), + /// each as `[x, y, width, height]`. + fn crumb_ring_and_visual(offset: f32) -> ([f32; 4], [f32; 4]) { + let mut theme = teksilo_core::presets::intui::light(); + theme.shape.focus_ring_offset = offset; + theme.shape.focus_ring_width = 2.0; + let ring_color = theme.colors.focus_ring.to_array(); + let fill_color = theme.colors.accent.with_alpha(0.12).to_array(); + let mut tree = WidgetTree::new() + .with_theme(theme) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))); + tree.add(trail(2)); + tree.layout(SizeProposal::exact(400.0, 60.0)); + let crumb = tree + .find_by_label("Crumb 0") + .expect("the first crumb renders"); + tree.focus(crumb); + tree.layout(SizeProposal::exact(400.0, 60.0)); + let frame = tree.render(); + let ring = frame + .shapes + .iter() + .find(|s| s.color == ring_color && s.stroke_width > 0.0) + .expect("a focused crumb strokes its ring") + .screen; + let visual = frame + .shapes + .iter() + .find(|s| s.color == fill_color && s.stroke_width == 0.0) + .expect("a focused crumb fills its visual") + .screen; + (ring, visual) + } + + #[test] + fn a_negative_focus_ring_offset_lays_the_ring_over_the_crumb_edge() { + let (outer, outer_visual) = crumb_ring_and_visual(2.0); + let (inner, inner_visual) = crumb_ring_and_visual(-1.0); + // Offset 2: centre line 3 dp outside the visual. Offset -1, width + // 2: centred on the visual's edge. + assert!((outer[2] - outer_visual[2] - 6.0).abs() < 1e-3); + assert!((inner[2] - inner_visual[2]).abs() < 1e-3); + assert!((inner[3] - inner_visual[3]).abs() < 1e-3); + + let (deep, _) = crumb_ring_and_visual(-100.0); + assert!(deep[2] >= 0.0 && deep[3] >= 0.0, "ring inverted: {deep:?}"); + } + // ── tooltips ───────────────────────────────────────────────────────────── #[test] @@ -1390,6 +1433,36 @@ mod tests { ); } + /// A built crumb that navigates still offers AT a way to activate it, and + /// the current one offers none. Read off the **mounted** crumbs: `build` + /// moves the action out, so a check that asked for it would see none. + #[test] + fn a_built_navigating_crumb_advertises_click_and_focus() { + use teksilo_core::accesskit::Action; + + let mut tree = themed_tree(); + let trail = tree.add(trail(2)); + tree.layout(SizeProposal::exact(300.0, 40.0)); + let _ = tree.render(); + + let crumbs = segment_ids(&tree, trail); + assert_eq!(crumbs.len(), 2, "two crumbs, got {crumbs:?}"); + let navigating = tree.accessibility_node(crumbs[0]); + assert!( + navigating.actions().contains(&Action::Click), + "a navigating crumb must advertise Click, or AT cannot follow it", + ); + assert!( + navigating.actions().contains(&Action::Focus), + "a navigating crumb must advertise Focus", + ); + let current = tree.accessibility_node(crumbs[1]); + assert!( + !current.actions().contains(&Action::Click), + "the current crumb navigates nowhere and must not advertise Click", + ); + } + /// A mouse is exact: the same press lands on the path bar, exactly as it /// did before the touch programme. #[test] diff --git a/crates/teksilo-widgets/src/color_picker/swatch.rs b/crates/teksilo-widgets/src/color_picker/swatch.rs index 713cba2a9..9bbef8556 100644 --- a/crates/teksilo-widgets/src/color_picker/swatch.rs +++ b/crates/teksilo-widgets/src/color_picker/swatch.rs @@ -35,6 +35,7 @@ use teksilo_core::accesskit::{Action, Role}; use teksilo_core::build_context::BuildContext; use teksilo_core::event::{EventResponse, Key, WidgetEvent}; use teksilo_core::focus::FocusOrigin; +use teksilo_core::styles::FocusRingStroke; use teksilo_core::widget::{ CursorIcon, EventContext, LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement, }; @@ -340,20 +341,14 @@ impl Widget for ColorSwatch { // Focus ring (keyboard). if self.focus_origin.get() == Some(FocusOrigin::Keyboard) { - let offset = ctx.theme.shape.focus_ring_offset; - let half = ctx.theme.shape.focus_ring_width * 0.5; - let inset = offset + half; - let ring = Rect::new( - bounds.x - inset, - bounds.y - inset, - bounds.width + inset * 2.0, - bounds.height + inset * 2.0, + let ring = FocusRingStroke::around( + bounds, + self.corner_radius.unwrap_or(cp::SWATCH_CORNER_RADIUS), + &ctx.theme.shape, ); canvas.stroke_rounded_rect( - ring, - CornerRadius::uniform( - self.corner_radius.unwrap_or(cp::SWATCH_CORNER_RADIUS) + inset, - ), + ring.rect, + CornerRadius::uniform(ring.corner_radius), ctx.theme.colors.focus_ring, ctx.theme.shape.focus_ring_width, ); diff --git a/crates/teksilo-widgets/src/color_picker/tests.rs b/crates/teksilo-widgets/src/color_picker/tests.rs index 07f7bb46c..3ca641c38 100644 --- a/crates/teksilo-widgets/src/color_picker/tests.rs +++ b/crates/teksilo-widgets/src/color_picker/tests.rs @@ -1074,3 +1074,38 @@ fn a_mouse_just_outside_a_swatch_lands_on_the_row() { ); assert_eq!(row_taps.get(), 1); } + +/// The keyboard ring of a focused swatch under a theme whose +/// `focus_ring_offset` is `offset` (width 2), plus the swatch bounds. +fn swatch_focus_ring(offset: f32) -> (teksilo_canvas::Rect, [f32; 4]) { + let mut theme = teksilo_core::presets::intui::light(); + theme.shape.focus_ring_offset = offset; + theme.shape.focus_ring_width = 2.0; + let mut tree = WidgetTree::new().with_theme(theme); + let id = tree.add(ColorSwatch::new(Color::RED).on_activate_fn(|_| {})); + tree.layout(SizeProposal::exact(40.0, 40.0)); + tree.focus(id); + tree.press_key(Key::ArrowDown, Modifiers::NONE); + tree.layout(SizeProposal::exact(40.0, 40.0)); + let frame = tree.render(); + // The unselected swatch strokes a 1 dp hairline; the ring is the + // only 2 dp stroke. + let ring = frame + .shapes + .iter() + .find(|s| s.stroke_width == 2.0) + .expect("a focused swatch strokes its focus ring"); + (tree.bounds(id), ring.screen) +} + +#[test] +fn a_negative_focus_ring_offset_draws_the_swatch_ring_on_its_edge() { + let (bounds, inner) = swatch_focus_ring(-1.0); + let (_, outer) = swatch_focus_ring(2.0); + // Offset -1, width 2: the stroke is centred on the swatch edge. + assert_eq!(inner, bounds.to_array()); + assert!(inner[2] < outer[2] && inner[3] < outer[3]); + + let (_, deep) = swatch_focus_ring(-60.0); + assert!(deep[2] >= 0.0 && deep[3] >= 0.0, "ring inverted: {deep:?}"); +} diff --git a/crates/teksilo-widgets/src/radio_tile_group.rs b/crates/teksilo-widgets/src/radio_tile_group.rs index 1db97fe0a..4ec920ce8 100644 --- a/crates/teksilo-widgets/src/radio_tile_group.rs +++ b/crates/teksilo-widgets/src/radio_tile_group.rs @@ -39,11 +39,11 @@ use teksilo_core::binding::BindingLevel; use teksilo_core::build_context::BuildContext; use teksilo_core::event::{EventResponse, Key, WidgetEvent}; use teksilo_core::signal::{Prop, Signal}; -use teksilo_core::styles::SharedRadioTileStyle; +use teksilo_core::styles::{FocusRingStroke, SharedRadioTileStyle}; use teksilo_core::widget::{EventContext, LayoutContext, PaintContext, Widget, WidgetPlacement}; use teksilo_core::widget_builder::HandlerSet; use teksilo_core::widget_id::WidgetId; -use teksilo_tokens::CornerRadius; +use teksilo_tokens::{CornerRadius, ShapeTokens}; use crate::radio_tile::RadioTile; use crate::styles::{RADIO_TILE_CORNER_RADIUS, RADIO_TILE_VERTICAL_ROW_HEIGHT}; @@ -79,7 +79,16 @@ pub enum TileLayout { /// Space (logical px) reserved around the tiles for the whole-group keyboard /// focus ring — the SegmentedControl envelope model. fn focus_ring_envelope(theme: &teksilo_core::Theme) -> f32 { - theme.shape.focus_ring_offset + theme.shape.focus_ring_width + theme.shape.focus_ring_envelope() +} + +/// The whole-group ring's centre line: around the tiles' area (`bounds` +/// inset by the envelope), `focus_ring_offset` from its edge. A negative +/// offset lays the ring over the tiles' outer edge. +fn group_focus_ring(bounds: Rect, shape: &ShapeTokens) -> FocusRingStroke { + let env = shape.focus_ring_envelope(); + let tiles = bounds.inset(env, env, env, env); + FocusRingStroke::around(tiles, RADIO_TILE_CORNER_RADIUS, shape) } /// An N-ary, single-selection group of selectable-card radios. See the @@ -579,20 +588,12 @@ impl Widget for RadioTileGroup { if !self.ring_visible.get() { return; } - let shape = &ctx.theme.shape; - let half = shape.focus_ring_width * 0.5; - let ring_rect = Rect::new( - bounds.x + half, - bounds.y + half, - (bounds.width - half * 2.0).max(0.0), - (bounds.height - half * 2.0).max(0.0), - ); - let ring_radius = RADIO_TILE_CORNER_RADIUS + shape.focus_ring_offset + half; + let ring = group_focus_ring(bounds, &ctx.theme.shape); canvas.stroke_rounded_rect( - ring_rect, - CornerRadius::uniform(ring_radius), + ring.rect, + CornerRadius::uniform(ring.corner_radius), ctx.theme.colors.focus_ring, - shape.focus_ring_width, + ctx.theme.shape.focus_ring_width, ); } @@ -1025,4 +1026,32 @@ mod tests { outer_y.get() ); } + + #[test] + fn a_negative_focus_ring_offset_lays_the_group_ring_over_the_tiles_edge() { + let shape = |offset: f32| ShapeTokens { + focus_ring_offset: offset, + focus_ring_width: 2.0, + ..ShapeTokens::default() + }; + let bounds = Rect::new(0.0, 0.0, 300.0, 120.0); + // Offset 2: envelope 4, ring 3 dp outside the tiles' area. + let outer = group_focus_ring(bounds, &shape(2.0)); + assert_eq!(outer.rect, Rect::new(1.0, 1.0, 298.0, 118.0)); + // Offset -1: envelope 1, ring centred on the tiles' edge. + let inner = group_focus_ring(bounds, &shape(-1.0)); + assert_eq!(inner.rect, Rect::new(1.0, 1.0, 298.0, 118.0)); + assert_eq!(inner.corner_radius, RADIO_TILE_CORNER_RADIUS); + assert!(inner.corner_radius < outer.corner_radius); + + // Against the same tiles' area, the inner ring is the smaller one. + let tiles = Rect::new(4.0, 4.0, 292.0, 112.0); + let around_outer = FocusRingStroke::around(tiles, RADIO_TILE_CORNER_RADIUS, &shape(2.0)); + let around_inner = FocusRingStroke::around(tiles, RADIO_TILE_CORNER_RADIUS, &shape(-1.0)); + assert!(around_inner.rect.width < around_outer.rect.width); + + let deep = group_focus_ring(bounds, &shape(-500.0)); + assert!(deep.rect.width >= 0.0 && deep.rect.height >= 0.0); + assert!(deep.corner_radius >= 0.0); + } } diff --git a/crates/teksilo-widgets/src/segmented_control.rs b/crates/teksilo-widgets/src/segmented_control.rs index a0dd88fb3..586cfee52 100644 --- a/crates/teksilo-widgets/src/segmented_control.rs +++ b/crates/teksilo-widgets/src/segmented_control.rs @@ -636,13 +636,8 @@ impl SegmentedControl { /// `SegmentSlotGeometry::frame`, so children land where the chrome /// paints. fn compute_visual(bounds: Rect, theme: &teksilo_core::Theme) -> Rect { - let envelope = theme.shape.focus_ring_offset + theme.shape.focus_ring_width; - Rect::new( - bounds.x + envelope, - bounds.y + envelope, - (bounds.width - envelope * 2.0).max(0.0), - (bounds.height - envelope * 2.0).max(0.0), - ) + let envelope = theme.shape.focus_ring_envelope(); + bounds.inset(envelope, envelope, envelope, envelope) } /// The grid area inside the frame's stroke. @@ -1193,7 +1188,7 @@ impl Widget for SegmentedControl { proposal: SizeProposal, ctx: &LayoutContext, ) -> teksilo_core::widget::LayoutResponse { - let envelope = ctx.theme.shape.focus_ring_offset + ctx.theme.shape.focus_ring_width; + let envelope = ctx.theme.shape.focus_ring_envelope(); let chrome = envelope * 2.0 + SEGMENTED_CONTROL_BORDER_WIDTH * 2.0; // Real measurement, not a per-character guess: this is what makes diff --git a/crates/teksilo-widgets/src/segmented_control/tests.rs b/crates/teksilo-widgets/src/segmented_control/tests.rs index 64fb70acc..e61859690 100644 --- a/crates/teksilo-widgets/src/segmented_control/tests.rs +++ b/crates/teksilo-widgets/src/segmented_control/tests.rs @@ -1109,6 +1109,55 @@ fn the_focused_selection_paints_with_the_accent() { assert!(frame.shapes.iter().any(|s| s.color == accent)); } +/// The keyboard ring and the outer frame of a focused control under a +/// theme whose `focus_ring_offset` is `offset` (width 2), each as +/// `[x, y, width, height]`. +fn ring_and_frame(offset: f32) -> ([f32; 4], [f32; 4]) { + let mut theme = teksilo_core::presets::intui::light(); + theme.shape.focus_ring_offset = offset; + theme.shape.focus_ring_width = 2.0; + let ring_color = theme.colors.focus_ring.to_array(); + let frame_color = theme.colors.border_strong.to_array(); + let mut t = WidgetTree::new() + .with_theme(theme) + .with_text_backend(std::rc::Rc::new(std::cell::RefCell::new( + teksilo_canvas::MockTextBackend::new(), + ))); + let control = t.add(abc(Signal::new(Some(B)))); + settle(&mut t, 300.0, 60.0); + t.focus(control); + t.press_key(Key::ArrowRight, Modifiers::NONE); + settle(&mut t, 300.0, 60.0); + let frame = t.render(); + let stroke = |color: [f32; 4]| { + frame + .shapes + .iter() + .find(|s| s.color == color && s.stroke_width > 0.0) + .map(|s| s.screen) + }; + ( + stroke(ring_color).expect("the keyboard ring is stroked"), + stroke(frame_color).expect("the outer frame is stroked"), + ) +} + +#[test] +fn a_negative_focus_ring_offset_draws_the_ring_on_the_frame() { + // Offset 2: the ring's centre line is 3 dp outside the frame. + let (outer, outer_frame) = ring_and_frame(2.0); + assert!((outer[2] - outer_frame[2] - 6.0).abs() < 1e-3); + // Offset -1, width 2: centred on the frame edge, so smaller than the + // outer ring around the same frame and never inverted. + let (inner, inner_frame) = ring_and_frame(-1.0); + assert!((inner[2] - inner_frame[2]).abs() < 1e-3); + assert!((inner[3] - inner_frame[3]).abs() < 1e-3); + assert!(inner[2] - inner_frame[2] < outer[2] - outer_frame[2]); + + let (deep, _) = ring_and_frame(-200.0); + assert!(deep[2] >= 0.0 && deep[3] >= 0.0, "ring inverted: {deep:?}"); +} + #[test] fn an_unfocused_selection_uses_the_inactive_surface() { let selected = Signal::new(Some(B)); diff --git a/crates/teksilo-widgets/src/slider.rs b/crates/teksilo-widgets/src/slider.rs index dc3ef82c0..8240acd4d 100644 --- a/crates/teksilo-widgets/src/slider.rs +++ b/crates/teksilo-widgets/src/slider.rs @@ -1449,6 +1449,39 @@ mod tests { || frame.cosmetic_lines.iter().any(|l| l.color == color) } + /// The thumb's keyboard ring under a theme whose `focus_ring_offset` is + /// `offset` (width 2), as `[x, y, width, height]`. + fn thumb_ring(offset: f32) -> [f32; 4] { + let mut theme = teksilo_core::presets::intui::light(); + theme.shape.focus_ring_offset = offset; + theme.shape.focus_ring_width = 2.0; + let ring = theme.colors.focus_ring.to_array(); + let mut tree = WidgetTree::new().with_theme(theme); + let s = tree.add(Slider::new(Signal::new(50.0_f32), 0.0, 100.0)); + tree.layout(SizeProposal::exact(200.0, 60.0)); + tree.focus(s); + tree.press_key(Key::ArrowDown, Modifiers::NONE); + tree.layout(SizeProposal::exact(200.0, 60.0)); + let frame = tree.render(); + frame + .shapes + .iter() + .find(|s| s.color == ring && s.stroke_width > 0.0) + .expect("the keyboard ring is stroked") + .screen + } + + #[test] + fn a_negative_focus_ring_offset_shrinks_the_thumb_ring_without_inverting() { + let outer = thumb_ring(2.0); + let inner = thumb_ring(-1.0); + assert!(inner[2] < outer[2] && inner[3] < outer[3]); + assert!(inner[2] >= 0.0 && inner[3] >= 0.0); + + let deep = thumb_ring(-40.0); + assert!(deep[2] >= 0.0 && deep[3] >= 0.0, "ring inverted: {deep:?}"); + } + #[test] fn keyboard_adjusts_value() { let value = Signal::new(50.0_f32); diff --git a/crates/teksilo-widgets/src/styles/recipe_avatar_style.rs b/crates/teksilo-widgets/src/styles/recipe_avatar_style.rs index 31220d6ad..b0365778e 100644 --- a/crates/teksilo-widgets/src/styles/recipe_avatar_style.rs +++ b/crates/teksilo-widgets/src/styles/recipe_avatar_style.rs @@ -25,6 +25,7 @@ use teksilo_core::signal::Signal; use teksilo_core::styles::density::{dp, spacing}; use teksilo_core::styles::{ AvatarCorner, AvatarPresence, AvatarShape, AvatarSize, AvatarStyle, AvatarStyleConfig, + FocusRingStroke, }; use teksilo_core::widget::{ LayoutContext, LayoutResponse, PaintContext, PendingChild, Widget, WidgetPlacement, @@ -118,15 +119,10 @@ pub fn paint_focus_ring( width: f32, color: Color, ) { - let outset = offset + width / 2.0; - let outer = Rect::new( - bounds.x - outset, - bounds.y - outset, - bounds.width + outset * 2.0, - bounds.height + outset * 2.0, - ); + let ring = focus_ring_stroke(bounds, shape, rounded_radius_ratio, offset, width); match shape { AvatarShape::Circle => { + let outer = ring.rect; let radius = outer.width.min(outer.height) / 2.0; let center = Point::new(outer.x + outer.width / 2.0, outer.y + outer.height / 2.0); canvas.stroke_circle( @@ -136,22 +132,40 @@ pub fn paint_focus_ring( StrokeStyle::solid(width), ); } - AvatarShape::RoundedSquare => { - let r = bounds.width.min(bounds.height) * rounded_radius_ratio + outset; + AvatarShape::RoundedSquare | AvatarShape::Square => { canvas.stroke_rounded_rect( - outer, - CornerRadius::uniform(r), + ring.rect, + CornerRadius::uniform(ring.corner_radius), color, StrokeStyle::solid(width), ); } - AvatarShape::Square => { - canvas.stroke_rounded_rect( - outer, - CornerRadius::uniform(0.0), - color, - StrokeStyle::solid(width), - ); + } +} + +/// The centre line of [`paint_focus_ring`]: `offset + width / 2` outside +/// `bounds`, hugging the avatar's shape. A negative `offset` draws the ring +/// partly inside the avatar; the rectangle and radius never invert. +fn focus_ring_stroke( + bounds: Rect, + shape: AvatarShape, + rounded_radius_ratio: f32, + offset: f32, + width: f32, +) -> FocusRingStroke { + let distance = offset + width / 2.0; + match shape { + // A square ring keeps sharp corners at every distance. + AvatarShape::Square => FocusRingStroke { + corner_radius: 0.0, + ..FocusRingStroke::at_distance(bounds, 0.0, distance) + }, + AvatarShape::RoundedSquare => { + let r = bounds.width.min(bounds.height) * rounded_radius_ratio; + FocusRingStroke::at_distance(bounds, r, distance) + } + AvatarShape::Circle => { + FocusRingStroke::at_distance(bounds, bounds.width.min(bounds.height) / 2.0, distance) } } } @@ -460,3 +474,35 @@ impl Widget for AvatarChromeFrame { self.child_id.into_iter().collect() } } + +#[cfg(test)] +mod focus_ring_tests { + use super::*; + + #[test] + fn a_negative_focus_ring_offset_shrinks_the_ring_without_inverting() { + let bounds = Rect::new(0.0, 0.0, 32.0, 32.0); + for shape in [ + AvatarShape::Circle, + AvatarShape::RoundedSquare, + AvatarShape::Square, + ] { + let outer = focus_ring_stroke(bounds, shape, 0.25, 2.0, 2.0); + let inner = focus_ring_stroke(bounds, shape, 0.25, -1.0, 2.0); + assert!(inner.rect.width < outer.rect.width, "{shape:?}"); + assert!(inner.rect.height < outer.rect.height, "{shape:?}"); + assert!(inner.rect.width >= 0.0 && inner.rect.height >= 0.0); + + let deep = focus_ring_stroke(bounds, shape, 0.25, -40.0, 2.0); + assert!(deep.rect.width >= 0.0 && deep.rect.height >= 0.0); + assert!(deep.corner_radius >= 0.0); + } + } + + #[test] + fn a_square_ring_keeps_sharp_corners() { + let bounds = Rect::new(0.0, 0.0, 32.0, 32.0); + let ring = focus_ring_stroke(bounds, AvatarShape::Square, 0.25, 2.0, 2.0); + assert_eq!(ring.corner_radius, 0.0); + } +} diff --git a/crates/teksilo-widgets/src/styles/recipe_segmented_control_style.rs b/crates/teksilo-widgets/src/styles/recipe_segmented_control_style.rs index 8f86e6108..4b45d9238 100644 --- a/crates/teksilo-widgets/src/styles/recipe_segmented_control_style.rs +++ b/crates/teksilo-widgets/src/styles/recipe_segmented_control_style.rs @@ -19,7 +19,9 @@ use teksilo_core::build_context::BuildContext; use teksilo_core::focus::FocusOrigin; use teksilo_core::signal::Signal; use teksilo_core::styles::density::{dp, spacing}; -use teksilo_core::styles::{SegmentSlots, SegmentedControlStyle, SegmentedControlStyleConfig}; +use teksilo_core::styles::{ + FocusRingStroke, SegmentSlots, SegmentedControlStyle, SegmentedControlStyleConfig, +}; use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget}; use teksilo_core::widget_id::WidgetId; use teksilo_tokens::{CornerRadius, InputTokens, TargetRole}; @@ -248,17 +250,15 @@ impl Widget for SegmentedControlChrome { // envelope. Painted whether or not there are segments, so a // focused empty control still shows where focus is. if keyboard_focused { - let half_stroke = shape.focus_ring_width * 0.5; - let ring_rect = Rect::new( - bounds.x + half_stroke, - bounds.y + half_stroke, - (bounds.width - half_stroke * 2.0).max(0.0), - (bounds.height - half_stroke * 2.0).max(0.0), - ); - let ring_radius = self.recipe.corner_radius + shape.focus_ring_offset + half_stroke; + // Around the visual, not the bounds: under a negative offset + // the ring overlaps the frame, and when the offset is deep + // enough the envelope is zero and the visual fills the bounds. + let envelope = shape.focus_ring_envelope(); + let visual = bounds.inset(envelope, envelope, envelope, envelope); + let ring = FocusRingStroke::around(visual, self.recipe.corner_radius, shape); canvas.stroke_rounded_rect( - ring_rect, - CornerRadius::uniform(ring_radius), + ring.rect, + CornerRadius::uniform(ring.corner_radius), colors.focus_ring, shape.focus_ring_width, ); diff --git a/crates/teksilo-widgets/src/styles/recipe_slider_style.rs b/crates/teksilo-widgets/src/styles/recipe_slider_style.rs index ecb946ea9..acae54c9e 100644 --- a/crates/teksilo-widgets/src/styles/recipe_slider_style.rs +++ b/crates/teksilo-widgets/src/styles/recipe_slider_style.rs @@ -21,7 +21,9 @@ use teksilo_core::build_context::BuildContext; use teksilo_core::environment::LayoutDirection; use teksilo_core::focus::FocusOrigin; use teksilo_core::signal::Signal; -use teksilo_core::styles::{SliderOrientation, SliderStyle, SliderStyleConfig, SliderVariant}; +use teksilo_core::styles::{ + FocusRingStroke, SliderOrientation, SliderStyle, SliderStyleConfig, SliderVariant, +}; use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement}; use teksilo_core::widget_id::WidgetId; use teksilo_tokens::{CornerRadius, InputTokens}; @@ -156,7 +158,7 @@ impl Widget for SliderBody { } fn layout_response(&self, proposal: SizeProposal, ctx: &LayoutContext) -> LayoutResponse { - let envelope = ctx.theme.shape.focus_ring_offset + ctx.theme.shape.focus_ring_width; + let envelope = ctx.theme.shape.focus_ring_envelope(); let cross = (self.recipe.thumb_diameter + envelope * 2.0).max(MIN_CROSS_SIZE); match self.orientation { SliderOrientation::Horizontal => { @@ -325,18 +327,10 @@ impl Widget for SliderBody { // Focus ring — keyboard-only, drawn outside the thumb in the // theme-defined gap. if self.focus_origin.get() == Some(FocusOrigin::Keyboard) { - let offset = shape.focus_ring_offset; - let half_stroke = shape.focus_ring_width * 0.5; - let ring_inset = offset + half_stroke; - let ring_rect = Rect::new( - thumb_rect.x - ring_inset, - thumb_rect.y - ring_inset, - thumb_rect.width + ring_inset * 2.0, - thumb_rect.height + ring_inset * 2.0, - ); + let ring = FocusRingStroke::around(thumb_rect, thumb_radius, shape); canvas.stroke_rounded_rect( - ring_rect, - CornerRadius::uniform(thumb_radius + ring_inset), + ring.rect, + CornerRadius::uniform(ring.corner_radius), colors.focus_ring, shape.focus_ring_width, ); diff --git a/crates/teksilo-widgets/src/styles/recipe_tab_style.rs b/crates/teksilo-widgets/src/styles/recipe_tab_style.rs index 43a6aae6f..3e97d7e11 100644 --- a/crates/teksilo-widgets/src/styles/recipe_tab_style.rs +++ b/crates/teksilo-widgets/src/styles/recipe_tab_style.rs @@ -32,7 +32,8 @@ use teksilo_core::binding::BindingLevel; use teksilo_core::build_context::BuildContext; use teksilo_core::signal::Signal; use teksilo_core::styles::{ - TabBarChromeConfig, TabBarOrientation, TabIndicatorPosition, TabStyle, TabStyleConfig, + FocusRingStroke, TabBarChromeConfig, TabBarOrientation, TabIndicatorPosition, TabStyle, + TabStyleConfig, }; use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement}; use teksilo_core::widget_id::WidgetId; @@ -281,7 +282,7 @@ impl Widget for TabBarChromePainter { // the separator in its own column (the "tab merges into // content pane" effect). let border_width = ctx.theme.shape.border_width; - let envelope = ctx.theme.shape.focus_ring_offset + ctx.theme.shape.focus_ring_width; + let envelope = ctx.theme.shape.focus_ring_envelope(); let separator = match self.orientation { TabBarOrientation::Horizontal => Rect::new( bounds.x, @@ -453,19 +454,11 @@ impl Widget for TabBodyPainter { } // Focus ring — keyboard focus only. Drawn inside `bounds` - // (inset by `focus_ring_width / 2 + focus_ring_offset`) so - // adjacent tabs aren't visually overlapped by the ring. + // (see `focus_ring_rect`) so adjacent tabs aren't visually + // overlapped by the ring. if focused { - let half_stroke = shape.focus_ring_width * 0.5; - let inset = half_stroke + shape.focus_ring_offset; - let ring_rect = Rect::new( - bounds.x + inset, - bounds.y + inset, - (bounds.width - inset * 2.0).max(0.0), - (bounds.height - inset * 2.0).max(0.0), - ); canvas.stroke_rounded_rect( - ring_rect, + focus_ring_rect(bounds, shape), CornerRadius::uniform(shape.radius_control), colors.focus_ring, shape.focus_ring_width, @@ -480,6 +473,19 @@ impl Widget for TabBodyPainter { } } +/// The centre line of a tab's focus ring: `bounds` inset by +/// `focus_ring_width / 2 + focus_ring_offset`. +/// +/// Tabs sit flush against each other, so the ring never leaves `bounds`: +/// a negative `focus_ring_offset` brings it out to the tab's edge and no +/// further (the inset is floored at half the stroke), and the rectangle +/// never inverts on a tab narrower than the inset. +fn focus_ring_rect(bounds: Rect, shape: &teksilo_tokens::ShapeTokens) -> Rect { + let half_stroke = shape.focus_ring_width * 0.5; + let inset = (half_stroke + shape.focus_ring_offset).max(half_stroke); + FocusRingStroke::at_distance(bounds, 0.0, -inset).rect +} + #[cfg(test)] mod tests { use super::*; @@ -560,4 +566,63 @@ mod tests { Rect::new(B.x, B.y, T, B.height) ); } + + fn shape(offset: f32) -> teksilo_tokens::ShapeTokens { + teksilo_tokens::ShapeTokens { + focus_ring_offset: offset, + focus_ring_width: 2.0, + ..teksilo_tokens::ShapeTokens::default() + } + } + + #[test] + fn the_focus_ring_follows_the_offset_inside_the_tab() { + // Offset 2: 3 dp in from the tab edge. + assert_eq!( + focus_ring_rect(B, &shape(2.0)), + Rect::new(13.0, 23.0, 94.0, 34.0) + ); + // Offset 0: flush with the tab edge. + assert_eq!( + focus_ring_rect(B, &shape(0.0)), + Rect::new(11.0, 21.0, 98.0, 38.0) + ); + } + + #[test] + fn a_negative_focus_ring_offset_keeps_the_ring_inside_the_tab() { + for offset in [-1.0, -5.0, -100.0] { + let ring = focus_ring_rect(B, &shape(offset)); + // Outer edge of the 2 dp stroke stays on or inside `bounds`. + assert!( + ring.x - 1.0 >= B.x && ring.y - 1.0 >= B.y, + "{offset}: {ring:?}" + ); + assert!(ring.right() + 1.0 <= B.right(), "{offset}: {ring:?}"); + assert!(ring.bottom() + 1.0 <= B.bottom(), "{offset}: {ring:?}"); + } + } + + /// The clamp is deliberate: below zero the offset no longer moves a + /// tab's ring, which stays flush with the tab edge rather than spilling + /// into the neighbouring tab. + #[test] + fn every_offset_at_or_below_zero_draws_the_same_tab_ring() { + let flush = focus_ring_rect(B, &shape(0.0)); + for offset in [-1.0, -5.0, -100.0] { + assert_eq!(focus_ring_rect(B, &shape(offset)), flush, "{offset}"); + } + } + + #[test] + fn the_focus_ring_never_inverts_on_a_narrow_tab() { + let narrow = Rect::new(0.0, 0.0, 4.0, 3.0); + for offset in [-1.0, 2.0, 50.0] { + let ring = focus_ring_rect(narrow, &shape(offset)); + assert!( + ring.width >= 0.0 && ring.height >= 0.0, + "{offset}: {ring:?}" + ); + } + } } diff --git a/crates/teksilo-widgets/src/styles/recipe_toggle_style.rs b/crates/teksilo-widgets/src/styles/recipe_toggle_style.rs index ddcfa90b3..e163efa8a 100644 --- a/crates/teksilo-widgets/src/styles/recipe_toggle_style.rs +++ b/crates/teksilo-widgets/src/styles/recipe_toggle_style.rs @@ -25,10 +25,10 @@ use teksilo_core::build_context::BuildContext; use teksilo_core::focus::FocusOrigin; use teksilo_core::signal::Signal; use teksilo_core::styles::density::spacing; -use teksilo_core::styles::{ToggleStyle, ToggleStyleConfig, ToggleVariant}; +use teksilo_core::styles::{FocusRingStroke, ToggleStyle, ToggleStyleConfig, ToggleVariant}; use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement}; use teksilo_core::widget_id::WidgetId; -use teksilo_tokens::{Color, CornerRadius, InputTokens}; +use teksilo_tokens::{Color, CornerRadius, InputTokens, ShapeTokens}; // IntUI design tokens for the Toggle chrome — the `Default` source for // [`ToggleRecipe`]. Custom design languages either construct a @@ -234,23 +234,10 @@ impl Widget for ToggleBody { // Focus ring — keyboard-only, drawn outside the track in the // theme-defined gap. if self.focus_origin.get() == Some(FocusOrigin::Keyboard) { - let offset = ctx.theme.shape.focus_ring_offset + ctx.theme.shape.focus_ring_width / 2.0; - let ring_rect = Rect::new( - track_rect.x - offset, - track_rect.y - offset, - track_rect.width + offset * 2.0, - track_rect.height + offset * 2.0, - ); - let ring_corner = match self.variant { - ToggleVariant::Switch | ToggleVariant::Pill => { - CornerRadius::uniform(track_h / 2.0 + offset) - } - ToggleVariant::Square => CornerRadius::uniform(offset), - ToggleVariant::Inset => CornerRadius::uniform(4.0 + offset), - }; + let ring = focus_ring_stroke(self.variant, track_rect, &ctx.theme.shape); canvas.stroke_rounded_rect( - ring_rect, - ring_corner, + ring.rect, + CornerRadius::uniform(ring.corner_radius), colors.focus_ring, ctx.theme.shape.focus_ring_width, ); @@ -283,3 +270,57 @@ impl Widget for ToggleBody { // the Toggle node directly. } } + +/// The keyboard focus ring's centre line around the track, hugging the +/// variant's corner shape. A negative `focus_ring_offset` draws it partly +/// inside the track. +fn focus_ring_stroke( + variant: ToggleVariant, + track_rect: Rect, + shape: &ShapeTokens, +) -> FocusRingStroke { + let track_radius = match variant { + ToggleVariant::Switch | ToggleVariant::Pill => track_rect.height / 2.0, + ToggleVariant::Square => 0.0, + ToggleVariant::Inset => 4.0, + }; + FocusRingStroke::around(track_rect, track_radius, shape) +} + +#[cfg(test)] +mod focus_ring_tests { + use super::*; + + fn shape(offset: f32) -> ShapeTokens { + ShapeTokens { + focus_ring_offset: offset, + focus_ring_width: 2.0, + ..ShapeTokens::default() + } + } + + #[test] + fn a_negative_focus_ring_offset_shrinks_the_ring_without_inverting() { + let track = Rect::new(0.0, 0.0, 40.0, 20.0); + for variant in [ + ToggleVariant::Switch, + ToggleVariant::Pill, + ToggleVariant::Square, + ToggleVariant::Inset, + ] { + let outer = focus_ring_stroke(variant, track, &shape(2.0)); + let inner = focus_ring_stroke(variant, track, &shape(-1.0)); + assert!(inner.rect.width < outer.rect.width, "{variant:?}"); + assert!(inner.rect.height < outer.rect.height, "{variant:?}"); + assert!(inner.rect.width >= 0.0 && inner.rect.height >= 0.0); + // The square variant's ring at offset -1 is centred on the + // track edge, so its corners stay sharp instead of going + // negative. + assert!(inner.corner_radius >= 0.0, "{variant:?}"); + + let deep = focus_ring_stroke(variant, track, &shape(-30.0)); + assert!(deep.rect.width >= 0.0 && deep.rect.height >= 0.0); + assert!(deep.corner_radius >= 0.0); + } + } +} From c4cb5d89cbcb06b86ca2f9305c73a53f43e01dd9 Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 03:12:30 +0200 Subject: [PATCH 06/59] feat(styles): render the StandardItemRecipe row heights StandardListItem and StandardTreeItem floored their height on the STANDARD_ITEM_MIN_HEIGHT_* constants through dp(), whatever the active style declared, so the macOS (24) and Fluent (40) row heights were written on the recipe and never rendered. StandardItemStyle gains two defaulted metrics accessors, min_height_single_line and min_height_two_line, taking the density's InputTokens. The defaults restate today's ladder (dp(28) and dp(44) as targets) and are pinned to the module constants by the_standard_item_trait_defaults_restate_the_module_constants. RecipeStandardItemStyle answers from its recipe, and the macOS and Fluent structural styles answer from their own recipe at the given density. No field is added to StandardItemStyleConfig, which downstream builds as a struct literal. The row parks the style it resolved in build() and asks it in layout_response, so its floor and its chrome come from one style. The notification log's Shrinkable floor (one two-line row) asks the same resolved style. ListView and TreeView need no change: auto-measured rows report the new floor through the row's own layout_response, and a uniform view keeps the item_height the app chose; neither read the StandardItem constants. A view without auto_item_height also keeps its own default row height (ListView 32, TreeView 28, both raised to the density's target size), so a default-height TreeView under macOS stays at 28. Following the style there is a separate follow-up. Tests: macOS and Fluent preset_metrics lay out a single-line and a two-line StandardListItem at every density and assert the preset's heights (macOS 24/32/44 and 40/40/44, Fluent 40/40/44 and 60), with IntUI as the unchanged control, plus the installed slot's accessors. The macOS file also lays out a StandardTreeItem pair (depth 1 and 2) and asserts the same heights, which pins the tree row's delegation to the list row it wraps. The notification log gains the_compressed_list_floors_at_the_styles_two_line_row_height: a style declaring 90 dp two-line rows floors the compressed list at 90 (it measured 44 with the old constant). density_projection pins the trait defaults and checks the recipe style answers from its own recipe. density-projection-gaps.md loses the two StandardItemRecipe rows from section 2: unread 51 -> 49, real gap 49 -> 47, section 2 fourteen -> twelve; the projected total (103) the guard pins is unchanged. Conformance census re-run: totals unchanged (481; per theme and density identical), and no ALLOW_LIST entry moved. A row at 24 dp or more is at or above the conformance floor, so no row enters the census. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 15 ++ .../src/styles/standard_item_style.rs | 30 +++- .../src/styles/standard_item.rs | 12 ++ .../tests/preset_metrics.rs | 70 ++++++++++ .../src/styles/standard_item.rs | 12 ++ .../tests/preset_metrics.rs | 128 ++++++++++++++++++ .../teksilo-widgets/src/notification/log.rs | 58 ++++++-- crates/teksilo-widgets/src/standard_item.rs | 70 +++++----- .../src/styles/recipe_standard_item_style.rs | 29 +++- .../tests/density_projection.rs | 71 +++++++++- docs/widgets/standard_item.md | 12 +- engineering/docs/density-projection-gaps.md | 46 +++---- 12 files changed, 471 insertions(+), 82 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d815b83c2..207735c9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,10 @@ by crate for clarity, not because crates version independently. the tab edge. `ShapeTokens::focus_ring_envelope` and `focus_ring_stroke_distance` give those two distances, and `FocusRingStroke` gives the rectangle and radius a ring is stroked on. +- **`StandardItemStyle::min_height_single_line` and `min_height_two_line`.** + A row style says how tall a `StandardListItem` or `StandardTreeItem` row is + at the active density, with and without a subtitle. Both have defaults, so + an existing style keeps its row heights. ### Fixed @@ -58,6 +62,17 @@ by crate for clarity, not because crates version independently. technology can activate and focus it again. Before, every built crumb painted in the secondary text colour with no hover or focus state, and advertised neither the Click nor the Focus action. +- **List and tree rows are as tall as the active style says.** + **Behaviour change:** a `StandardListItem` or `StandardTreeItem` row laid + out at its own height (on its own, or in a `ListView` or `TreeView` with + `auto_item_height`) now measures the height its style declares: 24 px for a + single-line row under the macOS preset and 40 px under Fluent at the + compact density, rising to the density's target size above it. Before, + every row was at least 28 px (44 px with a subtitle) whatever the theme. + Only a row that measures itself changes: a `ListView` or `TreeView` + without `auto_item_height` keeps its own row height, whether that is its + default or an `item_height` the app set. The notification log's minimum + height follows the same two-line row height. - **Accent chrome a recipe builds follows the high-contrast preference.** **Behaviour change:** under the OS increase contrast preference, a `Filled` button's fill and a button's focus border now take the high-contrast diff --git a/crates/teksilo-core/src/styles/standard_item_style.rs b/crates/teksilo-core/src/styles/standard_item_style.rs index 25bbd92f5..130f35575 100644 --- a/crates/teksilo-core/src/styles/standard_item_style.rs +++ b/crates/teksilo-core/src/styles/standard_item_style.rs @@ -6,10 +6,11 @@ use std::rc::Rc; -use teksilo_tokens::TextRole; +use teksilo_tokens::{InputTokens, TargetRole, TextRole}; use crate::build_context::BuildContext; use crate::signal::Signal; +use crate::styles::density::dp; use crate::widget_id::WidgetId; #[derive(Clone, Debug)] @@ -67,6 +68,33 @@ pub trait StandardItemStyle: 'static { fn selected_label_role(&self) -> Option { None } + + /// The height floor of a row with no subtitle, in logical pixels, at the + /// density `tokens` describe. + /// + /// A metrics accessor rather than a `make_body` concern: the row measures + /// itself in `layout_response`, long after the chrome is built, and holds + /// an `Rc` that cannot reach a recipe field. + /// Without it a preset's row height is written and never rendered. + /// + /// **Defaulted**, so a `StandardItemStyle` implemented outside this + /// workspace keeps compiling and keeps the ladder it had. The default is + /// `teksilo_widgets::styles::recipe_standard_item_style::STANDARD_ITEM_MIN_HEIGHT_SINGLE_LINE` + /// put through [`dp`] as a target, restated as a literal because + /// `teksilo-core` cannot name a `teksilo-widgets` constant, and pinned + /// equal to it by + /// `the_standard_item_trait_defaults_restate_the_module_constants`. + fn min_height_single_line(&self, tokens: &InputTokens) -> f32 { + dp(28.0, TargetRole::Target, tokens) + } + + /// The height floor of a row carrying a subtitle, in logical pixels. + /// Defaulted on the same terms as + /// [`min_height_single_line`](Self::min_height_single_line), from + /// `STANDARD_ITEM_MIN_HEIGHT_TWO_LINE`. + fn min_height_two_line(&self, tokens: &InputTokens) -> f32 { + dp(44.0, TargetRole::Target, tokens) + } } pub type SharedStandardItemStyle = Rc; diff --git a/crates/teksilo-theme-fluent/src/styles/standard_item.rs b/crates/teksilo-theme-fluent/src/styles/standard_item.rs index 9924b5da4..841540f98 100644 --- a/crates/teksilo-theme-fluent/src/styles/standard_item.rs +++ b/crates/teksilo-theme-fluent/src/styles/standard_item.rs @@ -108,6 +108,18 @@ impl StandardItemStyle for FluentStandardItemStyle { ); ctx.add(FluentRowFrame { row, pill }) } + + /// `ListViewItemMinHeight`, 40 dp at Compact, raised to the density's + /// target size above it. The row measures itself against this, so it is + /// the height a Fluent list row renders. + fn min_height_single_line(&self, tokens: &InputTokens) -> f32 { + fluent_standard_item_recipe_for(tokens).min_height_single_line + } + + /// The two-line row height of [`fluent_standard_item_recipe_for`]. + fn min_height_two_line(&self, tokens: &InputTokens) -> f32 { + fluent_standard_item_recipe_for(tokens).min_height_two_line + } } /// Stacks the selection pill over the delegated row, stretching **both** to diff --git a/crates/teksilo-theme-fluent/tests/preset_metrics.rs b/crates/teksilo-theme-fluent/tests/preset_metrics.rs index 362562ad2..bacd936cb 100644 --- a/crates/teksilo-theme-fluent/tests/preset_metrics.rs +++ b/crates/teksilo-theme-fluent/tests/preset_metrics.rs @@ -20,6 +20,7 @@ use teksilo_core::widget_id::WidgetId; use teksilo_core::widget_tree::WidgetTree; use teksilo_data::ListModel; use teksilo_i18n::lit; +use teksilo_tokens::TargetDensity; use teksilo_widgets::TableView; use teksilo_widgets::table_view::{Column, ColumnWidth}; @@ -123,3 +124,72 @@ fn the_installed_table_slot_reports_the_fluent_gutter() { "Fluent takes the shipped vertical gutter", ); } + +// ── StandardListItem row height ──────────────────────────────────────── + +/// The laid-out `(single-line, two-line)` heights of a `StandardListItem` row +/// in a plain column, built at `density` under `theme`. +/// +/// Built *at* the density, never switched into it: a row resolves its style +/// in `build()`, so switching after the fact would measure a mixture. +fn standard_row_heights(theme: &Theme, density: TargetDensity) -> (f32, f32) { + use teksilo_widgets::StandardListItem; + use teksilo_widgets::primitives::VStack; + + let (tree, root) = mounted( + theme.with_density(density), + VStack::new() + .child(StandardListItem::new(lit!("Documents"))) + .child(StandardListItem::new(lit!("Downloads")).subtitle(lit!("12 items"))), + ); + let rows = nodes_named(&tree, root, "StandardListItem"); + assert_eq!(rows.len(), 2, "one single-line row, one two-line row"); + (tree.bounds(rows[0]).height, tree.bounds(rows[1]).height) +} + +/// `ListViewItemMinHeight` is 40 dp, which is what the Fluent recipe writes, +/// and a laid-out row must measure it. The row used to floor itself on the +/// shipped 28 dp constant whatever the style declared. +/// +/// The Fluent heights already clear the Comfortable target, so only Touch +/// raises the single-line row (to 44); the 60 dp two-line row clears every +/// rung. The IntUI arm is the control and must be unchanged; its two-line row +/// at Touch is content-driven (44.4 under the mock text metrics), because a +/// floor only ever raises a row. +#[test] +fn a_standard_list_row_measures_the_fluent_row_height_at_every_density() { + let expected = [ + (TargetDensity::Compact, (40.0, 60.0), (28.0, 44.0)), + (TargetDensity::Comfortable, (40.0, 60.0), (32.0, 44.0)), + (TargetDensity::Touch, (44.0, 60.0), (44.0, 44.4)), + ]; + for (density, fluent, intui) in expected { + assert_eq!( + standard_row_heights(&teksilo_core::presets::intui::light(), density), + intui, + "{density:?}: IntUI must be unchanged", + ); + for theme in [teksilo_theme_fluent::light(), teksilo_theme_fluent::dark()] { + assert_eq!( + standard_row_heights(&theme, density), + fluent, + "{density:?}: the Fluent recipe's row heights must reach the row", + ); + } + // The accessor half: what the installed slot tells a row asking it. + let theme = teksilo_theme_fluent::light().with_density(density); + let slot = theme + .style_slots + .standard_item + .clone() + .expect("the preset installs a standard-item slot"); + assert_eq!( + ( + slot.min_height_single_line(&theme.input), + slot.min_height_two_line(&theme.input), + ), + fluent, + "{density:?}: the installed slot reports the Fluent row heights", + ); + } +} diff --git a/crates/teksilo-theme-macos/src/styles/standard_item.rs b/crates/teksilo-theme-macos/src/styles/standard_item.rs index ac9efc133..a8f3aa08f 100644 --- a/crates/teksilo-theme-macos/src/styles/standard_item.rs +++ b/crates/teksilo-theme-macos/src/styles/standard_item.rs @@ -147,6 +147,18 @@ impl StandardItemStyle for MacOsStandardItemStyle { // done from `make_body`. Some(TextRole::OnAccent) } + + /// `NSTableView.rowHeight`, 24 dp at Compact, raised to the density's + /// target size above it. The row measures itself against this, so it is + /// the height a macOS list row renders. + fn min_height_single_line(&self, tokens: &InputTokens) -> f32 { + macos_standard_item_recipe_for(tokens).min_height_single_line + } + + /// The two-line row height of [`macos_standard_item_recipe_for`]. + fn min_height_two_line(&self, tokens: &InputTokens) -> f32 { + macos_standard_item_recipe_for(tokens).min_height_two_line + } } /// Stacks the selection capsule under the delegated row, stretching diff --git a/crates/teksilo-theme-macos/tests/preset_metrics.rs b/crates/teksilo-theme-macos/tests/preset_metrics.rs index 04d252bac..6af5bee1a 100644 --- a/crates/teksilo-theme-macos/tests/preset_metrics.rs +++ b/crates/teksilo-theme-macos/tests/preset_metrics.rs @@ -518,3 +518,131 @@ fn a_macos_switch_track_is_still_thirty_eight_by_twenty_two() { frame.shapes.iter().map(|s| s.screen).collect::>(), ); } + +// ── StandardListItem row height ──────────────────────────────────────── + +/// The laid-out `(single-line, two-line)` heights of a `StandardListItem` row +/// in a plain column, built at `density` under `theme`. +/// +/// Built *at* the density, never switched into it, for the same reason +/// [`nav_arrow_targets`] is: a row resolves its style in `build()`. +fn standard_row_heights(theme: &Theme, density: TargetDensity) -> (f32, f32) { + use teksilo_i18n::lit; + use teksilo_widgets::StandardListItem; + use teksilo_widgets::primitives::VStack; + + let mut tree = WidgetTree::new() + .with_theme(theme.with_density(density)) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))); + let root = tree.add( + VStack::new() + .child(StandardListItem::new(lit!("Documents"))) + .child(StandardListItem::new(lit!("Downloads")).subtitle(lit!("12 items"))), + ); + tree.layout(SizeProposal::exact(400.0, 300.0)); + let rows = nodes_named(&tree, root, "StandardListItem"); + assert_eq!(rows.len(), 2, "one single-line row, one two-line row"); + (tree.bounds(rows[0]).height, tree.bounds(rows[1]).height) +} + +/// `NSTableView.rowHeight` is 24 dp, which is what the macOS recipe writes, +/// and a laid-out row must measure it. The row used to floor itself on the +/// shipped 28 dp constant whatever the style declared, so every macOS list +/// row rendered 4 dp taller than Apple's. +/// +/// Above Compact the preset's 24 rises to the density's target size (32 at +/// Comfortable, 44 at Touch), so the row tracks the ladder too. The IntUI arm +/// is the control: 28 / 32 / 44 for a single line, 44 for two lines, which is +/// what the row rendered before the style was consulted. The one exception is +/// IntUI's two-line row at Touch, whose content (44.4 under the mock text +/// metrics, with Touch's wider padding) already clears its 44 dp floor: a +/// floor only ever raises a row. +#[test] +fn a_standard_list_row_measures_the_macos_row_height_at_every_density() { + let expected = [ + (TargetDensity::Compact, (24.0, 40.0), (28.0, 44.0)), + (TargetDensity::Comfortable, (32.0, 40.0), (32.0, 44.0)), + (TargetDensity::Touch, (44.0, 44.0), (44.0, 44.4)), + ]; + assert_eq!( + expected.len(), + ALL_DENSITIES.len(), + "every density is listed" + ); + for (density, macos, intui) in expected { + assert_eq!( + standard_row_heights(&teksilo_core::presets::intui::light(), density), + intui, + "{density:?}: IntUI must be unchanged", + ); + for theme in [teksilo_theme_macos::light(), teksilo_theme_macos::dark()] { + assert_eq!( + standard_row_heights(&theme, density), + macos, + "{density:?}: the macOS recipe's row heights must reach the row", + ); + } + // The accessor half: what the installed slot tells a row asking it. + let theme = teksilo_theme_macos::light().with_density(density); + let slot = theme + .style_slots + .standard_item + .clone() + .expect("the preset installs a standard-item slot"); + assert_eq!( + ( + slot.min_height_single_line(&theme.input), + slot.min_height_two_line(&theme.input), + ), + macos, + "{density:?}: the installed slot reports the macOS row heights", + ); + } +} + +/// A `StandardTreeItem` row measures the macOS row height too. The tree row +/// lays out through the `StandardListItem` it wraps, so the floor it reports +/// is the one the list row resolves from the same style: 24 dp for a single +/// line and 40 dp with a subtitle at Compact, rising to the density's target +/// size above it, whatever the row's depth. +#[test] +fn a_standard_tree_row_measures_the_macos_row_height_at_every_density() { + use teksilo_i18n::lit; + use teksilo_widgets::StandardTreeItem; + use teksilo_widgets::primitives::VStack; + + let expected = [ + (TargetDensity::Compact, (24.0, 40.0)), + (TargetDensity::Comfortable, (32.0, 40.0)), + (TargetDensity::Touch, (44.0, 44.0)), + ]; + assert_eq!( + expected.len(), + ALL_DENSITIES.len(), + "every density is listed" + ); + for (density, macos) in expected { + for theme in [teksilo_theme_macos::light(), teksilo_theme_macos::dark()] { + let mut tree = WidgetTree::new() + .with_theme(theme.with_density(density)) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))); + let root = tree.add( + VStack::new() + .child(StandardTreeItem::new(lit!("Documents")).depth(1)) + .child( + StandardTreeItem::new(lit!("Downloads")) + .depth(2) + .subtitle(lit!("12 items")), + ), + ); + tree.layout(SizeProposal::exact(400.0, 300.0)); + let rows = nodes_named(&tree, root, "StandardTreeItem"); + assert_eq!(rows.len(), 2, "one single-line row, one two-line row"); + assert_eq!( + (tree.bounds(rows[0]).height, tree.bounds(rows[1]).height), + macos, + "{density:?}: the macOS recipe's row heights must reach a tree row", + ); + } + } +} diff --git a/crates/teksilo-widgets/src/notification/log.rs b/crates/teksilo-widgets/src/notification/log.rs index ad06c0acc..d4a0ddf80 100644 --- a/crates/teksilo-widgets/src/notification/log.rs +++ b/crates/teksilo-widgets/src/notification/log.rs @@ -518,20 +518,22 @@ impl Widget for NotificationLog { // `shrink = 0`, so on its own the list would keep its full // wanted height and spill out the bottom of a short panel. // `Shrinkable` preserves the inner flex weight and adds the - // compression path, floored at one two-line row. + // compression path, floored at one two-line row: the + // height the active `StandardItemStyle` gives a row with a + // subtitle, which is what every log row is. + let one_row = + si::resolve_standard_item_style(ctx).min_height_two_line(&ctx.theme().input); let scrollable = ScrollArea::new() .preferred_height(self.preferred_height) .child(sections); column = column.child( ctx.add( - Shrinkable::new() - .min_height(si::STANDARD_ITEM_MIN_HEIGHT_TWO_LINE) - .child( - Expand::vertical() - .flex(1.0) - .respect_intrinsic() - .child(scrollable), - ), + Shrinkable::new().min_height(one_row).child( + Expand::vertical() + .flex(1.0) + .respect_intrinsic() + .child(scrollable), + ), ), ); } @@ -924,6 +926,44 @@ mod tests { ); } + /// In a host far too short for it, the list stops compressing at one + /// row: the two-line row height the active `StandardItemStyle` declares, + /// not a constant. A style declaring 90 dp rows floors the list at 90. + #[test] + fn the_compressed_list_floors_at_the_styles_two_line_row_height() { + use teksilo_core::styles::{StandardItemStyle, StandardItemStyleConfig}; + + struct TallRows; + impl StandardItemStyle for TallRows { + fn make_body(&self, cfg: &StandardItemStyleConfig, ctx: &mut BuildContext) -> WidgetId { + si::RecipeStandardItemStyle::default().make_body(cfg, ctx) + } + fn min_height_two_line(&self, _tokens: &InputTokens) -> f32 { + 90.0 + } + } + + let archive = fresh_archive(); + for i in 0..8 { + archive.push(entry(&format!("Notice {i}"), Some("body"), Vec::new())); + } + let mut theme = teksilo_core::presets::intui::light(); + theme.style_slots.standard_item = Some(Rc::new(TallRows)); + let mut tree = WidgetTree::new() + .with_theme(theme) + .with_text_backend(Rc::new(std::cell::RefCell::new( + teksilo_canvas::MockTextBackend::new(), + ))); + let root = tree.add(NotificationLog::new(archive)); + tree.layout(SizeProposal::exact(480.0, 20.0)); + let floor = find_by_type(&tree, root, "Shrinkable").expect("the list is Shrinkable"); + assert!( + (tree.bounds(floor).height - 90.0).abs() < 0.01, + "the list must floor at the style's two-line row height, got {}", + tree.bounds(floor).height + ); + } + /// The readability regression: a title longer than the row is /// elided inside it. With `StandardListItem`'s wrapping default the /// label reported its full one-line intrinsic width, over- diff --git a/crates/teksilo-widgets/src/standard_item.rs b/crates/teksilo-widgets/src/standard_item.rs index 4d7a84035..2a9b35774 100644 --- a/crates/teksilo-widgets/src/standard_item.rs +++ b/crates/teksilo-widgets/src/standard_item.rs @@ -68,13 +68,11 @@ //! //! ## Touch and pen //! -//! A row's **height** is a target floor and follows the density ladder: the row -//! projects the raw module constants through `density::dp` at layout time. It does -//! **not** read `StandardItemRecipe::min_height_single_line` / -//! `min_height_two_line`, which have carried the same projected values since the -//! density sweep and have no reader — so retuning either of those two recipe -//! fields in a preset moves nothing. `layout_response` says the same thing at the -//! site; `docs/touch-and-pen.md` §10.1 carries it as an open finding. +//! A row's **height** is a target floor and follows the density ladder. The row +//! asks the style it was built with for that floor, through +//! [`StandardItemStyle::min_height_single_line`](teksilo_core::styles::StandardItemStyle::min_height_single_line) +//! and its two-line twin. The shipped recipe answers 28 / 44 dp at Compact, and +//! a preset that writes its own (macOS 24, Fluent 40) gets that height. //! //! A row's **press** is not the row's. Inside a `ListView` or a `TreeView` the //! body pane owns the tap, the double tap and the reorder drag, and resolves which @@ -158,6 +156,10 @@ pub struct StandardListItem { /// hover-revealed controls be reachable right now". reveal: Option>, style_override: Option, + /// The style this row was built with, kept so `layout_response` asks the + /// same style for its height floor that painted its chrome. `None` until + /// the first build. + resolved_style: Option, root_child_id: Option, /// Optional plain tooltip text shown after a hover delay. Mutually exclusive /// with the rich / composite slots — every setter clears the other two so @@ -195,6 +197,7 @@ impl StandardListItem { interaction: Signal::new(InteractionState::Idle), reveal: None, style_override: None, + resolved_style: None, root_child_id: None, tooltip_text: None, rich_tooltip_source: None, @@ -534,16 +537,14 @@ struct RowRoles { impl StandardListItem { /// Per-call override > theme slot > the shipped recipe. - fn resolve_roles(&self, ctx: &mut BuildContext) -> RowRoles { - let style: SharedStandardItemStyle = self - .style_override - .clone() - .or_else(|| ctx.theme().style_slots.standard_item.clone()) - .unwrap_or_else(|| { - Rc::new(crate::styles::RecipeStandardItemStyle::for_tokens( - &ctx.theme().input, - )) - }); + /// + /// Also parks the resolved style on the row, so its height floor comes + /// from the style that built its chrome. + fn resolve_roles(&mut self, ctx: &mut BuildContext) -> RowRoles { + let style: SharedStandardItemStyle = self.style_override.clone().unwrap_or_else(|| { + crate::styles::recipe_standard_item_style::resolve_standard_item_style(ctx) + }); + self.resolved_style = Some(style.clone()); let on_selected = style.selected_label_role(); let emphasised = on_selected.map(|_| ctx.view_focus_active().and(&ctx.window_active_signal())); @@ -869,22 +870,25 @@ impl Widget for StandardListItem { } fn layout_response(&self, proposal: SizeProposal, ctx: &LayoutContext) -> LayoutResponse { - use crate::styles::recipe_standard_item_style as si; - // A row is a target, so its floor follows the density ladder — 28 dp at - // Compact (unchanged: the floor only ever raises), 32 at Comfortable, 44 - // at Touch. `StandardItemRecipe` has carried both projected heights - // since the density sweep and nothing read them: the row measured - // itself against the raw Compact constants, so a Touch build laid out - // 28 dp list rows under a theme that had already decided on 44. - let min_height = teksilo_core::styles::density::dp( - if self.subtitle.is_some() { - si::STANDARD_ITEM_MIN_HEIGHT_TWO_LINE - } else { - si::STANDARD_ITEM_MIN_HEIGHT_SINGLE_LINE - }, - teksilo_tokens::TargetRole::Target, - &ctx.theme.input, - ); + // A row is a target, so its floor follows the density ladder. The + // floor is the active style's: the shipped recipe answers 28 dp at + // Compact, 32 at Comfortable and 44 at Touch, and a preset's recipe + // answers its own number (macOS 24, Fluent 40). Before the first build + // there is no resolved style, and the trait's default ladder stands in. + let input = &ctx.theme.input; + let two_line = self.subtitle.is_some(); + let min_height = match self.resolved_style.as_ref() { + Some(style) if two_line => style.min_height_two_line(input), + Some(style) => style.min_height_single_line(input), + None => { + let fallback = crate::styles::RecipeStandardItemStyle::for_tokens(input); + if two_line { + fallback.recipe.min_height_two_line + } else { + fallback.recipe.min_height_single_line + } + } + }; let raw = self .root_child_id .and_then(|id| ctx.child_size(id, proposal)) diff --git a/crates/teksilo-widgets/src/styles/recipe_standard_item_style.rs b/crates/teksilo-widgets/src/styles/recipe_standard_item_style.rs index ee162600a..afc8b3d30 100644 --- a/crates/teksilo-widgets/src/styles/recipe_standard_item_style.rs +++ b/crates/teksilo-widgets/src/styles/recipe_standard_item_style.rs @@ -17,7 +17,7 @@ use teksilo_core::build_context::BuildContext; use teksilo_core::signal::Signal; -use teksilo_core::styles::{StandardItemStyle, StandardItemStyleConfig}; +use teksilo_core::styles::{SharedStandardItemStyle, StandardItemStyle, StandardItemStyleConfig}; use teksilo_core::widget_id::WidgetId; use teksilo_tokens::{BorderRole, CornerRadius, InputTokens, SurfaceRole, TargetRole}; @@ -213,6 +213,33 @@ impl StandardItemStyle for RecipeStandardItemStyle { ctx.add(ZStack::new().child(bg_padded).child(content_padded)) } + + /// This recipe's own floor. The recipe was resolved against a density + /// when the style was built, so `tokens` is not consulted again: a preset + /// that wrote its own `min_height_single_line` gets exactly that number. + fn min_height_single_line(&self, _tokens: &InputTokens) -> f32 { + self.recipe.min_height_single_line + } + + /// This recipe's own floor for a two-line row, on the same terms as + /// [`min_height_single_line`](Self::min_height_single_line). + fn min_height_two_line(&self, _tokens: &InputTokens) -> f32 { + self.recipe.min_height_two_line + } +} + +/// The `StandardItemStyle` a row built here renders with when it carries no +/// per-call override: the theme's slot, else the shipped recipe resolved +/// against the theme's density. +pub(crate) fn resolve_standard_item_style(ctx: &BuildContext) -> SharedStandardItemStyle { + ctx.theme() + .style_slots + .standard_item + .clone() + .unwrap_or_else(|| { + std::rc::Rc::new(RecipeStandardItemStyle::for_tokens(&ctx.theme().input)) + as SharedStandardItemStyle + }) } fn bg_signal( diff --git a/crates/teksilo-widgets/tests/density_projection.rs b/crates/teksilo-widgets/tests/density_projection.rs index e4a228ade..829b192ef 100644 --- a/crates/teksilo-widgets/tests/density_projection.rs +++ b/crates/teksilo-widgets/tests/density_projection.rs @@ -491,11 +491,11 @@ fn every_fixed_row_says_it_is_fixed() { // 5. The style traits' metric defaults restate the module constants // ─────────────────────────────────────────────────────────────────────────── // -// Three style traits carry a defaulted metrics accessor for a dimension the -// widget composes itself and the trait's `make_*` hooks never see — a table +// Four style traits carry a defaulted metrics accessor for a dimension the +// widget composes itself and the trait's `make_*` hooks never see: a table // cell's gutter, a calendar nav arrow's footprint, a search suggestion row's -// gutter. Each default is the module constant put through the same helper -// `for_tokens` uses, restated as a literal because `teksilo-core` sits below +// gutter, a list row's height floor. Each default is the module constant put +// through the same helper `for_tokens` uses, restated as a literal because `teksilo-core` sits below // `teksilo-widgets` and cannot name the constant. A literal in one crate and a // constant in another is exactly the shape that drifts, so it is pinned here — // and the tests are named in the trait doc comments, so a reader who finds the @@ -628,6 +628,59 @@ fn the_search_field_trait_defaults_restate_the_module_constants() { } } +/// The `StandardItemStyle` row-height defaults equal +/// `recipe_standard_item_style::STANDARD_ITEM_MIN_HEIGHT_{SINGLE,TWO}_LINE` at +/// every density. +#[test] +fn the_standard_item_trait_defaults_restate_the_module_constants() { + use teksilo_core::styles::StandardItemStyle; + use teksilo_widgets::styles::recipe_standard_item_style as si; + + /// A `StandardItemStyle` that overrides nothing but `make_body`. + struct BareStandardItemStyle; + impl StandardItemStyle for BareStandardItemStyle { + fn make_body( + &self, + cfg: &teksilo_core::styles::StandardItemStyleConfig, + _ctx: &mut teksilo_core::BuildContext, + ) -> teksilo_core::WidgetId { + cfg.content + } + } + + for t in [compact(), comfortable(), touch()] { + assert_eq!( + BareStandardItemStyle.min_height_single_line(&t), + dp( + si::STANDARD_ITEM_MIN_HEIGHT_SINGLE_LINE, + TargetRole::Target, + &t + ), + "the StandardItemStyle default drifted from STANDARD_ITEM_MIN_HEIGHT_SINGLE_LINE", + ); + assert_eq!( + BareStandardItemStyle.min_height_two_line(&t), + dp( + si::STANDARD_ITEM_MIN_HEIGHT_TWO_LINE, + TargetRole::Target, + &t + ), + "the StandardItemStyle default drifted from STANDARD_ITEM_MIN_HEIGHT_TWO_LINE", + ); + // And the shipped recipe at that density agrees with the default, so + // an out-of-tree style and the shipped one draw the same row. + let shipped = RecipeStandardItemStyle::for_tokens(&t); + assert_eq!( + shipped.min_height_single_line(&t), + BareStandardItemStyle.min_height_single_line(&t), + ); + assert_eq!( + shipped.min_height_two_line(&t), + BareStandardItemStyle.min_height_two_line(&t), + ); + } +} + /// The shipped `Recipe*Style` answers from *its own recipe*, not from the /// trait default — which is the half of the mechanism that lets a preset's /// number reach the screen at all. @@ -637,10 +690,18 @@ fn the_search_field_trait_defaults_restate_the_module_constants() { /// constant carries. #[test] fn a_recipe_style_answers_from_its_own_recipe() { - use teksilo_core::styles::{CalendarStyle, SearchFieldStyle, TableStyle}; + use teksilo_core::styles::{CalendarStyle, SearchFieldStyle, StandardItemStyle, TableStyle}; let t = compact(); + let item = RecipeStandardItemStyle::new(StandardItemRecipe { + min_height_single_line: 23.0, + min_height_two_line: 39.0, + ..StandardItemRecipe::for_tokens(&t) + }); + assert_eq!(item.min_height_single_line(&t), 23.0); + assert_eq!(item.min_height_two_line(&t), 39.0); + let table = RecipeTableStyle::new(TableRecipe { cell_padding_horizontal: 12.0, cell_padding_vertical: 7.0, diff --git a/docs/widgets/standard_item.md b/docs/widgets/standard_item.md index c777c0b4a..2bdfda223 100644 --- a/docs/widgets/standard_item.md +++ b/docs/widgets/standard_item.md @@ -165,13 +165,11 @@ the wrapper. #### Touch and pen -A row's **height** is a target floor and follows the density ladder: the row -projects the raw module constants through `density::dp` at layout time. It does -**not** read `StandardItemRecipe::min_height_single_line` / -`min_height_two_line`, which have carried the same projected values since the -density sweep and have no reader — so retuning either of those two recipe -fields in a preset moves nothing. `layout_response` says the same thing at the -site; `docs/touch-and-pen.md` §10.1 carries it as an open finding. +A row's **height** is a target floor and follows the density ladder. The row +asks the style it was built with for that floor, through +`StandardItemStyle::min_height_single_line` +and its two-line twin. The shipped recipe answers 28 / 44 dp at Compact, and +a preset that writes its own (macOS 24, Fluent 40) gets that height. A row's **press** is not the row's. Inside a `ListView` or a `TreeView` the body pane owns the tap, the double tap and the reorder drag, and resolves which diff --git a/engineering/docs/density-projection-gaps.md b/engineering/docs/density-projection-gaps.md index 8daeb9d7d..1071a4fe0 100644 --- a/engineering/docs/density-projection-gaps.md +++ b/engineering/docs/density-projection-gaps.md @@ -8,7 +8,7 @@ struct, and `for_tokens(&InputTokens)` projects each one onto the active density — `dp` for a target, `spacing` for a gap, `density_min_size` for a minimum box. A theme preset then builds that same struct with its own numbers. -**Forty-nine of those projected fields have no reader.** The widget composes the +**Forty-seven of those projected fields have no reader.** The widget composes the dimension from the raw `pub const` in the recipe's module instead, so the projected field is written by `for_tokens`, written again by every preset, and consulted by nothing. Retuning one changes nothing on screen. @@ -48,13 +48,13 @@ and is therefore inside the scope; the rule finds both its projected fields read | | | |---|---| | projected fields in scope | 103 | -| of those, unread by the rule | 51 | +| of those, unread by the rule | 49 | | false positives of the rule (§4) | 2 | -| **real gap** | **49** | -| — inert even if wired (§1) | 10 | -| — a shipped preset already sets a different value (§2) | 14 | -| — a preset sets the same value the constant carries (§3a) | 3 | -| — density only, no preset (§3b) | 22 | +| **real gap** | **47** | +| of which inert even if wired (§1) | 10 | +| of which a shipped preset already sets a different value (§2) | 12 | +| of which a preset sets the same value the constant carries (§3a) | 3 | +| of which density only, no preset (§3b) | 22 | Only the **denominator** is pinned by the guard. Every other number here falls when someone wires one of these fields, which is what the page is for, so making @@ -62,14 +62,15 @@ those cost a test failure would discourage the one change it invites: the tables are the record, the guard keeps their *membership* honest, and the arithmetic is a snapshot of the day it was taken. -Five further fields were on this list until the metrics-accessor work that -produced this page wired them, and they are the worked examples for what wiring -one looks like: `TableRecipe::cell_padding_horizontal` / `cell_padding_vertical` -(`TableStyle`), `CalendarRecipe::nav_arrow_size` (`CalendarStyle`) and +Seven further fields were on this list until a metrics accessor wired them, +and they are the worked examples for what wiring one looks like: +`TableRecipe::cell_padding_horizontal` / `cell_padding_vertical` +(`TableStyle`), `CalendarRecipe::nav_arrow_size` (`CalendarStyle`), `SearchFieldRecipe::row_padding_horizontal` / `row_padding_vertical` -(`SearchFieldStyle`) — a defaulted metrics accessor on the style trait, defaulted -so an out-of-tree style keeps compiling, overridden by the `Recipe*Style` from -its own recipe so a preset's number takes effect. +(`SearchFieldStyle`) and `StandardItemRecipe::min_height_single_line` / +`min_height_two_line` (`StandardItemStyle`): a defaulted metrics accessor on +the style trait, defaulted so an out-of-tree style keeps compiling, overridden +by the `Recipe*Style` from its own recipe so a preset's number takes effect. **A verdict of "safe to wire" means the mechanism is available and the change is local.** It never means the resulting dimension is right: a preset's number @@ -110,7 +111,7 @@ unwired one. ## 2. A shipped preset already sets a different value -The fourteen that cost something today. Each is written by Fluent or macOS with +The twelve that cost something today. Each is written by Fluent or macOS with a number chosen for that design language, and each renders the IntUI constant instead. The **renders** column is what a user sees under any theme. @@ -123,8 +124,6 @@ instead. The **renders** column is what a user sees under any theme. | `SegmentedControlRecipe` | `height` | 24 | 32 | 22 | `segmented_control.rs` → `layout_response` | | `SegmentedControlRecipe` | `padding_horizontal` | 12 | — | 10 | `segmented_control.rs` → `layout_response`; `segmented_control/cell.rs` → `layout_response` | | `SegmentedControlRecipe` | `padding_vertical` | 6 | — | 3 | `segmented_control.rs` → `layout_response` | -| `StandardItemRecipe` | `min_height_single_line` | 28 | 40 | 24 | `standard_item.rs` → `layout_response` | -| `StandardItemRecipe` | `min_height_two_line` | 44 | 60 | 40 | `standard_item.rs` → `layout_response`; `notification/log.rs` → `build` | | `TabRecipe` | `editor_height` | 50 | 32 | 26 | `tab_widget/bar.rs` → `build`; `tab_widget/header.rs` → `intrinsic_height` | | `TabRecipe` | `padding_horizontal` | 12 | 8 | 12 | `tab_widget/header.rs` → `build`, `estimate_natural_width` | | `TabRecipe` | `tool_window_height` | 28 | 32 | 22 | none — see below | @@ -135,11 +134,11 @@ Ladders, for the ones whose density projection also moves (Compact / Comfortable / Touch): `cell_size` 32/32/44, `CalendarRecipe::header_height` 28/32/44, `min_thumb_length` 24/32/44, `SearchFieldRecipe::row_height` 26/32/44, `SegmentedControlRecipe::height` 24/32/44 and `padding_horizontal` 12/13.8/15.6 -and `padding_vertical` 6/6.9/7.8, `min_height_single_line` 28/32/44, -`TabRecipe::padding_horizontal` 12/13.8/15.6, `tool_window_height` 28/32/44, +and `padding_vertical` 6/6.9/7.8, `TabRecipe::padding_horizontal` +12/13.8/15.6, `tool_window_height` 28/32/44, `TableRecipe::header_height` 32/32/44, `row_height` 28/32/44. -`min_height_two_line` (44) and `TabRecipe::editor_height` (50) are flat — their -cost is the preset alone, not the density. +`TabRecipe::editor_height` (50) is flat: its cost is the preset alone, not the +density. ### Verdicts @@ -156,11 +155,6 @@ accessor. from the constant three lines later, so the value is already in hand. `SearchFieldRecipe::row_height` — the same `SuggestionPanel::build` that now takes its row gutters from `SearchFieldStyle`. -`StandardItemRecipe::min_height_single_line` / `min_height_two_line` — the one -gap already documented at its own site (`standard_item.rs`'s module header says -the row does not read them); `StandardItemStyle` is the trait, and the row's -`layout_response` is the single call site. This is the highest-visibility row in -the table: it is the height of every list and tree row in a Fluent or macOS app. **Needs care — the widget owns a composition the field cannot express.** `SegmentedControlRecipe::height` / `padding_horizontal` / `padding_vertical`: From 400d15b55a7a89f714adbdc2d0cb0fa0ead1885c Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 07:26:25 +0200 Subject: [PATCH 07/59] feat(styles): render the TableRecipe row and header heights TableView and TreeTableView laid out their rows from recipe_table_style::ROW_HEIGHT (28) and their header from HEADER_HEIGHT (32) whatever the active TableStyle declared, at every density, so the macOS (24) and Fluent (40) table heights were written on the recipe and never rendered, and no theme's table followed the density ladder. TableStyle gains two defaulted metrics accessors, row_height and header_height, taking the density's InputTokens. The defaults are the module constants put through dp() as targets, which is exactly what the shipped RecipeTableStyle answers at every density and exactly today's constants at Compact; the_table_trait_defaults_restate_the_module_constants pins both. RecipeTableStyle answers from its recipe. No config struct gains a field. Both views read the style's heights first thing in build() (adopt_style_heights): an app's row_height(..) / header_height(..) still wins, and a uniform view with no row height of its own re-makes its RowMetrics when the style's row height differs, so the virtualization offsets, the visible range and the scroll step all use it. Exact and auto-measured modes are unchanged. A standalone TableHeader given a free height takes the style's header height too. The macOS and Fluent table styles now raise their 24 and 40 dp heights to the density's target size, as the list rows they share a rhythm with already do (macOS 24/32/44, Fluent 40/40/44). IntUI is unchanged at Compact and follows its recipe's ladder above it (rows 28/32/44, header 32/32/44). Tests: macOS and Fluent preset_metrics mount a TableView and a TreeTableView at every density and assert the laid-out header band, the first row's offset under it, the row height and the row pitch, with IntUI as the control, plus the installed slot's accessors; the preset unit tests check the table row and the list row agree at every density. table_view and tree_table_view tests cover a style declaring 37/41 dp, the view's own heights winning over it, the IntUI ladder, and a standalone header taking its style's height. density_projection pins the defaults and checks the recipe style answers from its own recipe. density-projection-gaps.md loses the two TableRecipe rows from section 2: unread 49 -> 47, real gap 47 -> 45, section 2 twelve -> ten. Conformance census re-run: 481 -> 477. The tree table's chevron reaches 22 x 32 at Comfortable (it reached 22 x 28 beside 28 dp rows) and the pin moves with it; at Compact under Fluent it now clears the floor beside 40 dp rows; four Comfortable rows go. One new row: under macOS at Compact the fixture's twelve 24 dp rows overflow the viewport by 12 dp, leaving an 11.5 dp scroll-bar track region below the thumb; it gets an allow-list entry on the Equivalent exception (thumb drag, wheel, PageDown), so the list counts 15 entries, 6 on an exception. The seed floor becomes 7 * 114 (Fluent is the smallest preset). The outset test's table half builds its own fixture with an app's 28 dp rows and 32 dp header: with style-driven 44 dp Touch rows the shared fixture reached 32 dp with and without won_through_outset, so it no longer discriminated; the new fixture still measures 32 with and 18 without. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 16 +++ crates/teksilo-core/src/styles/table_style.rs | 37 ++++- .../tests/conformance.rs | 67 ++++++++- .../src/styles/metrics.rs | 21 ++- .../tests/preset_metrics.rs | 110 +++++++++++++++ .../teksilo-theme-macos/src/styles/metrics.rs | 24 +++- .../tests/preset_metrics.rs | 120 ++++++++++++++++ .../src/styles/recipe_table_style.rs | 23 ++- crates/teksilo-widgets/src/table_view.rs | 48 +++++-- .../src/table_view/table_header.rs | 8 +- .../teksilo-widgets/src/table_view/tests.rs | 133 ++++++++++++++++++ .../src/table_view/widget_impl.rs | 1 + crates/teksilo-widgets/src/tree_table_view.rs | 42 +++++- .../src/tree_table_view/tests.rs | 88 ++++++++++++ .../src/tree_table_view/widget_impl.rs | 1 + .../tests/density_projection.rs | 38 ++++- docs/table-view.md | 14 +- docs/widgets/table_view.md | 11 +- docs/widgets/tree_table_view.md | 11 +- engineering/docs/density-projection-gaps.md | 30 ++-- 20 files changed, 772 insertions(+), 71 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 207735c9e..54b15eb28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,10 @@ by crate for clarity, not because crates version independently. A row style says how tall a `StandardListItem` or `StandardTreeItem` row is at the active density, with and without a subtitle. Both have defaults, so an existing style keeps its row heights. +- **`TableStyle::row_height` and `header_height`.** A table style says how + tall a `TableView` or `TreeTableView` body row and column header row are at + the active density. Both have defaults, the shipped table heights raised to + the density's target size. ### Fixed @@ -73,6 +77,18 @@ by crate for clarity, not because crates version independently. without `auto_item_height` keeps its own row height, whether that is its default or an `item_height` the app set. The notification log's minimum height follows the same two-line row height. +- **Table rows and headers are as tall as the active style says.** + **Behaviour change:** a `TableView` or `TreeTableView` with no row or + header height of its own, and a standalone `TableHeader`, now lay out the + heights their style declares: 24 px rows and headers under the macOS preset + and 40 px under Fluent at the compact density. Above the compact density a + row or header rises to the density's target size where the style's height + is below it: at the comfortable density macOS goes from 24 to 32 px and + Int UI rows from 28 to 32 px, while Fluent stays at 40 px; at the touch + density every theme's rows and headers are 44 px. Before, every table laid + out 28 px rows and a 32 px header whatever the theme and the density. + A `row_height`, `row_height_fn`, `auto_row_height` or `header_height` the + app set still wins. - **Accent chrome a recipe builds follows the high-contrast preference.** **Behaviour change:** under the OS increase contrast preference, a `Filled` button's fill and a button's focus border now take the high-contrast diff --git a/crates/teksilo-core/src/styles/table_style.rs b/crates/teksilo-core/src/styles/table_style.rs index 636c8a45d..fd54fcbe6 100644 --- a/crates/teksilo-core/src/styles/table_style.rs +++ b/crates/teksilo-core/src/styles/table_style.rs @@ -19,7 +19,8 @@ //! `make_header_cell` — the shared `table_view::header::HeaderCell`, //! used by both views — and their gutter comes from //! `cell_padding_horizontal` / `cell_padding_vertical` rather than from -//! the module constants. Wiring `make_row_background` and +//! the module constants, and both views take their default row and header +//! heights from `row_height` / `header_height`. Wiring `make_row_background` and //! `make_sort_indicator` is intentionally deferred: the widgets still //! own their cell / row / grid-line chrome directly, and those //! dimensions live on `teksilo_widgets::styles::recipe_table_style` as @@ -27,11 +28,11 @@ use std::rc::Rc; -use teksilo_tokens::{BorderRole, InputTokens}; +use teksilo_tokens::{BorderRole, InputTokens, TargetRole}; use crate::build_context::BuildContext; use crate::signal::Signal; -use crate::styles::density::spacing; +use crate::styles::density::{dp, spacing}; use crate::widget_id::WidgetId; /// Sort direction for header cells. @@ -125,6 +126,36 @@ pub trait TableStyle: 'static { fn cell_padding_vertical(&self, tokens: &InputTokens) -> f32 { spacing(4.0, tokens) } + + /// The height of a body row in a uniform-height table, in logical pixels, + /// at the density `tokens` describe. + /// + /// A metrics accessor because the views lay their rows out arithmetically + /// (the virtualization offsets, the scroll step, the visible range) from + /// one number, long after the chrome is built, and hold an + /// `Rc` that cannot reach a recipe field. Without it a + /// preset's row height is written and never rendered. A view's own + /// `row_height(..)`, `row_height_fn(..)` or `auto_row_height(..)` wins over + /// it. + /// + /// **Defaulted**, so a `TableStyle` implemented outside this workspace + /// keeps compiling. The default is + /// `teksilo_widgets::styles::recipe_table_style::ROW_HEIGHT` put through + /// [`dp`] as a target, which is the shipped recipe's own answer at every + /// density, restated as a literal because `teksilo-core` cannot name a + /// `teksilo-widgets` constant, and pinned equal to it by + /// `the_table_trait_defaults_restate_the_module_constants`. + fn row_height(&self, tokens: &InputTokens) -> f32 { + dp(28.0, TargetRole::Target, tokens) + } + + /// The height of the column header row, in logical pixels, at the density + /// `tokens` describe. A view's own `header_height(..)` wins over it. + /// Defaulted on the same terms as [`row_height`](Self::row_height), from + /// `teksilo_widgets::styles::recipe_table_style::HEADER_HEIGHT`. + fn header_height(&self, tokens: &InputTokens) -> f32 { + dp(32.0, TargetRole::Target, tokens) + } } pub type SharedTableStyle = Rc; diff --git a/crates/teksilo-target-conformance/tests/conformance.rs b/crates/teksilo-target-conformance/tests/conformance.rs index 1243ebd5b..e28a41741 100644 --- a/crates/teksilo-target-conformance/tests/conformance.rs +++ b/crates/teksilo-target-conformance/tests/conformance.rs @@ -322,7 +322,7 @@ const ALLOW_LIST: &[AllowedViolation] = &[ densities: AT_COMFORTABLE, themes: ALL_THEMES, paints: (Is(12.0), Is(12.0)), - reaches: (Is(22.0), Is(28.0)), + reaches: (Is(22.0), Is(32.0)), }, ], owner: Owner::Named( @@ -619,6 +619,31 @@ const ALLOW_LIST: &[AllowedViolation] = &[ two-row header, or arrows that do not follow the target ladder -- \ and each of them changes what a calendar looks like.", }, + AllowedViolation { + path: "TableView > ScrollBar", + measured: &[PinnedGeometry { + densities: AT_COMPACT, + themes: &[MACOS], + paints: (Is(12.0), Is(11.5)), + reaches: (Is(31.0), Is(11.5)), + }], + owner: Owner::Named("whoever revisits ScrollBar's track regions"), + exception: Some("Equivalent"), + why: "The part of a table's vertical scroll-bar track below the thumb, \ + which `ScrollBar::target_regions` reports as a paging target. It \ + is as tall as the content overflow leaves it: the fixture's twelve \ + rows at macOS's 24 dp `NSTableView` row height overflow the 276 dp \ + viewport by 12 dp, so the thumb fills all but 11.5 dp of the track \ + at the top of the range. Under the other presets the same twelve \ + rows are taller and the remainder clears the floor, which is all \ + that separates them; any scroll bar whose content barely \ + overflows, or whose thumb sits near an end of its range, leaves a \ + remainder this short. The width earns its ring, the height cannot, \ + because the thumb is flush above it. WCAG 2.2 SC 2.5.8 \ + *Equivalent*: the page a tap on the track scrolls is reached by \ + dragging the thumb, which reaches far past the floor, by the \ + wheel, and by PageDown on the focused table.", + }, ]; #[test] @@ -697,12 +722,12 @@ fn the_allow_lists_roster_is_what_it_says_it_is() { let findings = gate::roster_defects(census(), &ROSTER); assert!(findings.is_empty(), "{}", findings.join("\n")); - assert_eq!(ALLOW_LIST.len(), 14, "fourteen written findings"); + assert_eq!(ALLOW_LIST.len(), 15, "fifteen written findings"); let on_an_exception = ALLOW_LIST.iter().filter(|e| e.exception.is_some()).count(); assert_eq!( on_an_exception, - 5, - "five rest on an SC 2.5.8 exception: {:?}", + 6, + "six rest on an SC 2.5.8 exception: {:?}", ALLOW_LIST .iter() .filter(|e| e.exception.is_some()) @@ -862,7 +887,7 @@ fn the_allow_list_excuses_only_the_geometry_it_pinned() { // hide in. It reddens when the census shrinks — re-measure with `zz_census` // (the CENSUS-TOTAL lines), take the smallest preset's total, and multiply // by seven. - let findings = gate::non_narrowing(census(), &ROSTER, 7 * 116); + let findings = gate::non_narrowing(census(), &ROSTER, 7 * 114); assert!(findings.is_empty(), "{}", findings.join("\n")); // And the seed floor above is a floor: it cannot see a census that GREW, @@ -875,7 +900,7 @@ fn the_allow_list_excuses_only_the_geometry_it_pinned() { // region the new rows fall into. assert_eq!( census().len(), - 481, + 477, "the (theme x density) census moved — this test is proving something \ else until the figure, the per-preset seed floor above, and the \ entries covering any new rows are re-derived together", @@ -1660,6 +1685,14 @@ fn the_allow_lists_discriminators_narrow_by_size_and_by_density() { /// because `up_to` 44 turns a 28 dp table row into a candidate that a 24 dp /// `up_to` left inert. A test that measured only one of them would report half /// the mechanism. +/// +/// The table half builds its own fixture with an app-chosen +/// `row_height(28.0)` and `header_height(32.0)`, the geometry every table had +/// before its heights came from its style. The shared `table_view` fixture +/// takes them from the active `TableStyle`, which every shipped preset raises +/// to 44 dp at Touch, and there the bar reaches 32 dp with and without the +/// mechanism (measured), so it would pass the mechanism's deletion. An app +/// that sets its own 28 dp rows is the configuration the mechanism protects. #[test] fn an_outsets_claim_survives_the_slop_pass_in_the_shipped_controls() { let clear = measurements_of("search_field", "HitTarget", TargetDensity::Compact); @@ -1679,7 +1712,27 @@ fn an_outsets_claim_survives_the_slop_pass_in_the_shipped_controls() { assert!(clear[0].sources.outset, "and the outset must be credited"); assert_eq!(clear[0].rule, None, "so it carries no verdict"); - let bar = measurements_of("table_view", "ScrollBar", TargetDensity::Touch); + let rows_28 = TargetFixture::sized("table_view_28dp_rows", 500.0, 300.0, |t| { + let model = teksilo_data::ListModel::from_vec( + (0..12) + .map(|i| format!("Item {i}")) + .collect::>(), + ); + t.add( + TableView::new(model) + .add_column(teksilo_widgets::table_view::Column::new( + "name", + lit!("Name"), + |item: &String, _cx| Box::new(TextWidget::new(lit!(item.clone()))), + )) + .row_height(28.0) + .header_height(32.0), + ) + }); + let bar: Vec<_> = measure_fixtures(&[rows_28], TargetDensity::Touch) + .into_iter() + .filter(|m| measured_leaf(&m.path) == "ScrollBar") + .collect(); let node = bar .iter() .find(|m| m.part.is_none() && m.size.width > 0.0) diff --git a/crates/teksilo-theme-fluent/src/styles/metrics.rs b/crates/teksilo-theme-fluent/src/styles/metrics.rs index 8ee888a20..9f7bc91e2 100644 --- a/crates/teksilo-theme-fluent/src/styles/metrics.rs +++ b/crates/teksilo-theme-fluent/src/styles/metrics.rs @@ -241,11 +241,13 @@ pub fn fluent_tab_style_for(tokens: &InputTokens) -> RecipeTabStyle { } /// `TableView` / `TreeTableView` — rows and header on the `ListViewItem` -/// 40 dp rhythm, 12 dp cell gutters, 4 dp corners. +/// 40 dp rhythm, 12 dp cell gutters, 4 dp corners. Both heights are raised +/// to the density's target size, as the list row they share a rhythm with +/// is. pub fn fluent_table_style_for(tokens: &InputTokens) -> RecipeTableStyle { RecipeTableStyle::new(TableRecipe { - row_height: 40.0, - header_height: 40.0, + row_height: dp(40.0, TargetRole::Target, tokens), + header_height: dp(40.0, TargetRole::Target, tokens), cell_padding_horizontal: 12.0, corner_radius: R_CONTROL, tree_indent_per_level: 16.0, @@ -378,5 +380,18 @@ mod tests { let t = fluent_table_style().recipe; assert_eq!(t.row_height, 40.0); assert_eq!(t.header_height, t.row_height); + for density in [ + teksilo_tokens::TargetDensity::Compact, + teksilo_tokens::TargetDensity::Comfortable, + teksilo_tokens::TargetDensity::Touch, + ] { + let tokens = InputTokens::for_density(density); + assert_eq!( + fluent_table_style_for(&tokens).recipe.row_height, + crate::styles::standard_item::fluent_standard_item_recipe_for(&tokens) + .min_height_single_line, + "{density:?}: a TableView row and a ListView row must share one rhythm" + ); + } } } diff --git a/crates/teksilo-theme-fluent/tests/preset_metrics.rs b/crates/teksilo-theme-fluent/tests/preset_metrics.rs index bacd936cb..6baf9ac2d 100644 --- a/crates/teksilo-theme-fluent/tests/preset_metrics.rs +++ b/crates/teksilo-theme-fluent/tests/preset_metrics.rs @@ -193,3 +193,113 @@ fn a_standard_list_row_measures_the_fluent_row_height_at_every_density() { ); } } + +// ── TableView / TreeTableView row and header heights ─────────────────── + +/// The laid-out `(header height, row height)` of a `TableView` and of a +/// `TreeTableView` over the same three rows, built at `density` under `theme` +/// with no row or header height of their own. Each pair is measured on the +/// hosted `TableHeader` and on the first realized `BodyRow`, and the first +/// row must start where the header ends, so the band the virtualization +/// arithmetic steps by is the one painted. +/// +/// Built *at* the density, never switched into it: a view reads its style's +/// heights in `build()`. +fn table_bands(theme: &Theme, density: TargetDensity) -> [(f32, f32); 2] { + use teksilo_data::TreeModel; + use teksilo_widgets::TreeTableView; + + fn bands(tree: &WidgetTree, root: WidgetId) -> (f32, f32) { + let header = nodes_named(tree, root, "TableHeader"); + assert_eq!(header.len(), 1, "one hosted header"); + let mut rows = nodes_named(tree, root, "BodyRow"); + rows.sort_by(|a, b| tree.bounds(*a).y.total_cmp(&tree.bounds(*b).y)); + assert!(rows.len() >= 2, "at least two realized rows"); + let h = tree.bounds(header[0]); + let first = tree.bounds(rows[0]); + assert_eq!( + first.y, + h.y + h.height, + "the first row starts under the header" + ); + assert_eq!( + tree.bounds(rows[1]).y - first.y, + first.height, + "the row pitch is the row height", + ); + (h.height, first.height) + } + fn column(label: fn(&T) -> String) -> Column { + Column::new("name", lit!("Name"), move |row: &T, _| { + Box::new(teksilo_widgets::primitives::TextWidget::new(lit!(label( + row + )))) + }) + .width(ColumnWidth::Fixed(200.0)) + } + let theme = theme.with_density(density); + + let model = ListModel::from_vec(vec!["alpha".to_string(), "beta".into(), "gamma".into()]); + let (tree, root) = mounted( + theme.clone(), + TableView::new(model).add_column(column(|s: &String| s.clone())), + ); + let flat = bands(&tree, root); + + let model: TreeModel = TreeModel::new(); + for (i, name) in ["alpha", "beta", "gamma"].into_iter().enumerate() { + model.insert_root(i, name.to_string()); + } + let (tree, root) = mounted( + theme, + TreeTableView::new(model).add_column(column(|s: &String| s.clone())), + ); + [flat, bands(&tree, root)] +} + +/// Fluent's `ListViewItem` rhythm is 40 dp, which is what the Fluent recipe +/// writes for a table row and its header, and a laid-out `TableView` and +/// `TreeTableView` must measure it. Both views used to read the shipped 28 dp +/// row and 32 dp header constants whatever the style declared. +/// +/// Above Compact the 40 rises to the density's target size (44 at Touch), as +/// the list row does. The IntUI arm is the control: 32 / 28 at Compact, which +/// is what the views laid out before the style was consulted, then the +/// recipe's own ladder. +#[test] +fn a_table_measures_the_fluent_row_and_header_heights_at_every_density() { + let expected = [ + (TargetDensity::Compact, (40.0, 40.0), (32.0, 28.0)), + (TargetDensity::Comfortable, (40.0, 40.0), (32.0, 32.0)), + (TargetDensity::Touch, (44.0, 44.0), (44.0, 44.0)), + ]; + for (density, fluent, intui) in expected { + assert_eq!( + table_bands(&teksilo_core::presets::intui::light(), density), + [intui; 2], + "{density:?}: IntUI follows its recipe", + ); + for theme in [teksilo_theme_fluent::light(), teksilo_theme_fluent::dark()] { + assert_eq!( + table_bands(&theme, density), + [fluent; 2], + "{density:?}: the Fluent recipe's heights must reach both views", + ); + } + // The accessor half: what the installed slot tells a view asking it. + let theme = teksilo_theme_fluent::light().with_density(density); + let slot = theme + .style_slots + .table + .clone() + .expect("the preset installs a table slot"); + assert_eq!( + ( + slot.header_height(&theme.input), + slot.row_height(&theme.input) + ), + fluent, + "{density:?}: the installed slot reports the Fluent heights", + ); + } +} diff --git a/crates/teksilo-theme-macos/src/styles/metrics.rs b/crates/teksilo-theme-macos/src/styles/metrics.rs index f2ff6acdf..edd5c83a4 100644 --- a/crates/teksilo-theme-macos/src/styles/metrics.rs +++ b/crates/teksilo-theme-macos/src/styles/metrics.rs @@ -276,10 +276,12 @@ pub fn macos_tab_style_for(tokens: &InputTokens) -> RecipeTabStyle { /// `TableView` / `TreeTableView` — rows and header on the 24 dp /// `NSTableView` rhythm, with the same 8 dp cell gutter the row styles use. +/// Both heights are raised to the density's target size, as the list row +/// they share a rhythm with is. pub fn macos_table_style_for(tokens: &InputTokens) -> RecipeTableStyle { RecipeTableStyle::new(TableRecipe { - row_height: MACOS_ROW_HEIGHT, - header_height: MACOS_ROW_HEIGHT, + row_height: dp(MACOS_ROW_HEIGHT, TargetRole::Target, tokens), + header_height: dp(MACOS_ROW_HEIGHT, TargetRole::Target, tokens), cell_padding_horizontal: 8.0, corner_radius: R_CONTROL, tree_indent_per_level: 16.0, @@ -513,11 +515,19 @@ mod tests { let t = macos_table_style().recipe; assert_eq!(t.row_height, MACOS_ROW_HEIGHT); assert_eq!(t.header_height, t.row_height); - assert_eq!( - t.row_height, - crate::styles::standard_item::macos_standard_item_recipe().min_height_single_line, - "a TableView row and a ListView row must share one rhythm" - ); + for density in [ + teksilo_tokens::TargetDensity::Compact, + teksilo_tokens::TargetDensity::Comfortable, + teksilo_tokens::TargetDensity::Touch, + ] { + let tokens = InputTokens::for_density(density); + assert_eq!( + macos_table_style_for(&tokens).recipe.row_height, + crate::styles::standard_item::macos_standard_item_recipe_for(&tokens) + .min_height_single_line, + "{density:?}: a TableView row and a ListView row must share one rhythm" + ); + } assert_eq!( t.tree_indent_per_level, crate::styles::standard_item::macos_standard_item_recipe().tree_indent_step, diff --git a/crates/teksilo-theme-macos/tests/preset_metrics.rs b/crates/teksilo-theme-macos/tests/preset_metrics.rs index 6af5bee1a..02bd6a8fd 100644 --- a/crates/teksilo-theme-macos/tests/preset_metrics.rs +++ b/crates/teksilo-theme-macos/tests/preset_metrics.rs @@ -646,3 +646,123 @@ fn a_standard_tree_row_measures_the_macos_row_height_at_every_density() { } } } + +// ── TableView / TreeTableView row and header heights ─────────────────── + +/// The laid-out `(header height, row height)` of a `TableView` and of a +/// `TreeTableView` over the same three rows, built at `density` under `theme` +/// with no row or header height of their own. Each pair is measured on the +/// hosted `TableHeader` and on the first realized `BodyRow`, and the first +/// row must start where the header ends, so the band the virtualization +/// arithmetic steps by is the one painted. +/// +/// Built *at* the density, never switched into it: a view reads its style's +/// heights in `build()`. +fn table_bands(theme: &Theme, density: TargetDensity) -> [(f32, f32); 2] { + use teksilo_data::{ListModel, TreeModel}; + use teksilo_i18n::lit; + use teksilo_widgets::TableView; + use teksilo_widgets::TreeTableView; + use teksilo_widgets::table_view::{Column, ColumnWidth}; + + fn bands(tree: &WidgetTree, root: WidgetId) -> (f32, f32) { + let header = nodes_named(tree, root, "TableHeader"); + assert_eq!(header.len(), 1, "one hosted header"); + let mut rows = nodes_named(tree, root, "BodyRow"); + rows.sort_by(|a, b| tree.bounds(*a).y.total_cmp(&tree.bounds(*b).y)); + assert!(rows.len() >= 2, "at least two realized rows"); + let h = tree.bounds(header[0]); + let first = tree.bounds(rows[0]); + assert_eq!( + first.y, + h.y + h.height, + "the first row starts under the header" + ); + assert_eq!( + tree.bounds(rows[1]).y - first.y, + first.height, + "the row pitch is the row height", + ); + (h.height, first.height) + } + fn column(label: fn(&T) -> String) -> Column { + Column::new("name", lit!("Name"), move |row: &T, _| { + Box::new(teksilo_widgets::primitives::TextWidget::new(lit!(label( + row + )))) + }) + .width(ColumnWidth::Fixed(200.0)) + } + let theme = theme.with_density(density); + + let model = ListModel::from_vec(vec!["alpha".to_string(), "beta".into(), "gamma".into()]); + let (tree, root) = mounted( + theme.clone(), + TableView::new(model).add_column(column(|s: &String| s.clone())), + (400.0, 300.0), + ); + let flat = bands(&tree, root); + + let model: TreeModel = TreeModel::new(); + for (i, name) in ["alpha", "beta", "gamma"].into_iter().enumerate() { + model.insert_root(i, name.to_string()); + } + let (tree, root) = mounted( + theme, + TreeTableView::new(model).add_column(column(|s: &String| s.clone())), + (400.0, 300.0), + ); + [flat, bands(&tree, root)] +} + +/// `NSTableView.rowHeight` is 24 dp, and the macOS recipe writes it for a +/// table row and its header; a laid-out `TableView` and `TreeTableView` must +/// measure it. Both views used to read the shipped 28 dp row and 32 dp header +/// constants whatever the style declared. +/// +/// Above Compact the 24 rises to the density's target size (32 at +/// Comfortable, 44 at Touch), as the list row it shares a rhythm with does. +/// The IntUI arm is the control: 32 / 28 at Compact, which is what the views +/// laid out before the style was consulted, then the recipe's own ladder. +#[test] +fn a_table_measures_the_macos_row_and_header_heights_at_every_density() { + let expected = [ + (TargetDensity::Compact, (24.0, 24.0), (32.0, 28.0)), + (TargetDensity::Comfortable, (32.0, 32.0), (32.0, 32.0)), + (TargetDensity::Touch, (44.0, 44.0), (44.0, 44.0)), + ]; + assert_eq!( + expected.len(), + ALL_DENSITIES.len(), + "every density is listed" + ); + for (density, macos, intui) in expected { + assert_eq!( + table_bands(&teksilo_core::presets::intui::light(), density), + [intui; 2], + "{density:?}: IntUI follows its recipe", + ); + for theme in [teksilo_theme_macos::light(), teksilo_theme_macos::dark()] { + assert_eq!( + table_bands(&theme, density), + [macos; 2], + "{density:?}: the macOS recipe's heights must reach both views", + ); + } + // The accessor half: what the installed slot tells a view asking it. + let theme = teksilo_theme_macos::light().with_density(density); + let slot = theme + .style_slots + .table + .clone() + .expect("the preset installs a table slot"); + assert_eq!( + ( + slot.header_height(&theme.input), + slot.row_height(&theme.input) + ), + macos, + "{density:?}: the installed slot reports the macOS heights", + ); + } +} diff --git a/crates/teksilo-widgets/src/styles/recipe_table_style.rs b/crates/teksilo-widgets/src/styles/recipe_table_style.rs index dd03dda57..c3f000a2b 100644 --- a/crates/teksilo-widgets/src/styles/recipe_table_style.rs +++ b/crates/teksilo-widgets/src/styles/recipe_table_style.rs @@ -274,15 +274,32 @@ impl TableStyle for RecipeTableStyle { fn cell_padding_vertical(&self, _tokens: &InputTokens) -> f32 { self.recipe.cell_padding_vertical } + + /// This style's own body row height, so a preset's row (macOS's 24 dp + /// `NSTableView` row, Fluent's 40 dp `ListViewItem`) is the one a + /// uniform-height table lays out. See + /// [`cell_padding_horizontal`](Self::cell_padding_horizontal) for why + /// `tokens` is unused. + fn row_height(&self, _tokens: &InputTokens) -> f32 { + self.recipe.row_height + } + + /// This style's own column header height. See + /// [`row_height`](Self::row_height). + fn header_height(&self, _tokens: &InputTokens) -> f32 { + self.recipe.header_height + } } /// The `TableStyle` a `TableView` / `TreeTableView` builds against: the /// theme-wide `style_slots.table` if an app or a preset installed one, else /// this module's default resolved against the active density. /// -/// Shared by the three sites that need it — the header cell's chrome and its -/// gutter, and the two views' filter-zone arithmetic — so the gutter the cell -/// pads by and the gutter the hit zone is measured from cannot disagree. +/// Shared by every site that needs it (the header cell's chrome and its +/// gutter, the two views' filter-zone arithmetic, and the row and header +/// heights the views and a standalone `TableHeader` lay out), so the gutter +/// the cell pads by and the gutter the hit zone is measured from cannot +/// disagree. pub fn resolve_table_style(ctx: &BuildContext) -> SharedTableStyle { ctx.theme().style_slots.table.clone().unwrap_or_else(|| { std::rc::Rc::new(RecipeTableStyle::for_tokens(&ctx.theme().input)) as SharedTableStyle diff --git a/crates/teksilo-widgets/src/table_view.rs b/crates/teksilo-widgets/src/table_view.rs index 817a616d8..d0e33fb86 100644 --- a/crates/teksilo-widgets/src/table_view.rs +++ b/crates/teksilo-widgets/src/table_view.rs @@ -303,6 +303,11 @@ pub struct TableView { /// Row geometry — shared with `BodyPane` and the keyboard handler. row_metrics: SharedRowMetrics, header_height: Option, + /// The active `TableStyle`'s row and header heights at the density + /// in force, read at build by `adopt_style_heights`. Until then they + /// hold IntUI's Compact values, the module constants. + style_row_height: f32, + style_header_height: f32, show_header: bool, selection_mode: TableSelectionMode, /// Row selection — index-based `SelectionModel` or keyed @@ -646,6 +651,8 @@ impl TableView { height_source: HeightSource::Uniform, row_metrics: Rc::new(RefCell::new(RowMetrics::uniform(cp::ROW_HEIGHT, 0.0))), header_height: None, + style_row_height: cp::ROW_HEIGHT, + style_header_height: cp::HEADER_HEIGHT, show_header: true, selection_mode: TableSelectionMode::default(), row_selection: None, @@ -802,8 +809,30 @@ impl TableView { .make_metrics(self.effective_row_height(), 0.0); } - /// Fixed row height (default: the table style's 28 px) — the - /// uniform fast path. Mutually exclusive with + /// Read the active `TableStyle`'s row and header heights at the density + /// in force. Called first thing in `build`, so every height the build and + /// the later layout passes read is the style's, unless the app set its + /// own through [`row_height`](Self::row_height) / + /// [`header_height`](Self::header_height), which win. A uniform-height + /// view with no row height of its own re-materializes its metrics when + /// the style's row height differs from the one they were made with. + fn adopt_style_heights(&mut self, ctx: &BuildContext) { + let style = crate::styles::recipe_table_style::resolve_table_style(ctx); + let tokens = &ctx.theme().input; + self.style_header_height = style.header_height(tokens); + let row = style.row_height(tokens); + if row != self.style_row_height { + self.style_row_height = row; + if self.row_height.is_none() && matches!(self.height_source, HeightSource::Uniform) { + self.remake_metrics(); + } + } + } + + /// Fixed row height, the uniform fast path. Default: the active + /// `TableStyle`'s + /// [`row_height`](teksilo_core::styles::TableStyle::row_height), 28 px + /// under IntUI at the Compact density. Mutually exclusive with /// [`row_height_fn`](Self::row_height_fn) and /// [`auto_row_height`](Self::auto_row_height); the last mode setter /// wins. @@ -838,7 +867,10 @@ impl TableView { self } - /// Override the column header row height in logical pixels. Default: the table style's `HEADER_HEIGHT`. + /// Override the column header row height in logical pixels. Default: the + /// active `TableStyle`'s + /// [`header_height`](teksilo_core::styles::TableStyle::header_height), + /// 32 px under IntUI at the Compact density. pub fn header_height(mut self, height: f32) -> Self { self.header_height = Some(height); self @@ -1505,18 +1537,18 @@ impl TableView { }); } - /// The configured row height (override) or the table style's 28 px - /// fallback. In the non-uniform modes this is the seed estimate; - /// real geometry lives in `row_metrics`. + /// The configured row height (override) or the active table style's + /// (see `adopt_style_heights`). In the non-uniform modes this is only the + /// scroll step; real geometry lives in `row_metrics`. fn effective_row_height(&self) -> f32 { - self.row_height.unwrap_or(cp::ROW_HEIGHT) + self.row_height.unwrap_or(self.style_row_height) } fn effective_header_height(&self) -> f32 { if !self.show_header { 0.0 } else { - self.header_height.unwrap_or(cp::HEADER_HEIGHT) + self.header_height.unwrap_or(self.style_header_height) } } diff --git a/crates/teksilo-widgets/src/table_view/table_header.rs b/crates/teksilo-widgets/src/table_view/table_header.rs index a3f1b8c15..c38ad8077 100644 --- a/crates/teksilo-widgets/src/table_view/table_header.rs +++ b/crates/teksilo-widgets/src/table_view/table_header.rs @@ -170,6 +170,9 @@ pub struct TableHeader { /// module docs for why the split exists). bands: Option<[Option; 3]>, boundaries: PaneBoundaries, + /// The active `TableStyle`'s header height, read at build: the height a + /// standalone header takes when its parent leaves the height free. + style_height: f32, } impl TableHeader { @@ -192,6 +195,7 @@ impl TableHeader { cells: Vec::new(), bands: None, boundaries: PaneBoundaries::default(), + style_height: cp::HEADER_HEIGHT, } } @@ -503,6 +507,8 @@ impl std::fmt::Debug for TableHeader { impl Widget for TableHeader { fn build(&mut self, ctx: &mut BuildContext) -> Vec { let self_id = ctx.self_id(); + self.style_height = crate::styles::recipe_table_style::resolve_table_style(ctx) + .header_height(&ctx.theme().input); // `paint` draws the column separators from the widths and `scroll_x`, // but neither a column resize nor a horizontal scroll changes the // strip's own bounds — and the render walker replays a clean node's @@ -689,7 +695,7 @@ impl Widget for TableHeader { self.resolve_widths(0.0).iter().sum() } }); - let height = proposal.height.unwrap_or(cp::HEADER_HEIGHT); + let height = proposal.height.unwrap_or(self.style_height); Size::new(width, height).into() } diff --git a/crates/teksilo-widgets/src/table_view/tests.rs b/crates/teksilo-widgets/src/table_view/tests.rs index 97f62f9a5..91cf06b90 100644 --- a/crates/teksilo-widgets/src/table_view/tests.rs +++ b/crates/teksilo-widgets/src/table_view/tests.rs @@ -6538,6 +6538,26 @@ mod standalone_header { ); } + /// A standalone header given a free height takes the one the active + /// `TableStyle` declares, not the IntUI constant. + #[test] + fn a_standalone_header_takes_its_styles_header_height_in_a_stack() { + use crate::styles::recipe_table_style::{RecipeTableStyle, TableRecipe}; + let mut theme = teksilo_core::presets::intui::light(); + theme.style_slots.table = Some(std::rc::Rc::new(RecipeTableStyle::new(TableRecipe { + header_height: 41.0, + ..TableRecipe::default() + }))); + let mut tree = WidgetTree::new().with_theme(theme); + let header = tree.add(TableHeader::new(vec![fixed("a", 100.0), fixed("b", 100.0)])); + let _root = tree.add(VStack::new().child(header)); + tree.layout(SizeProposal { + width: Some(400.0), + height: Some(300.0), + }); + assert_eq!(tree.bounds(header).height, 41.0); + } + #[test] fn a_click_on_a_sortable_header_cycles_the_headers_own_sort() { // No `.sort(..)`: the header owns the signal, and the getter hands it @@ -6894,3 +6914,116 @@ mod standalone_header { ); } } + +// -- Row and header heights come from the style ------------------------------- + +/// Every node under `root` whose type name ends in `name`, sorted top to +/// bottom. +fn nodes_typed_by_y(tree: &WidgetTree, root: WidgetId, name: &str) -> Vec { + let mut out = Vec::new(); + let mut walker = vec![root]; + while let Some(id) = walker.pop() { + if tree + .widget_type_name(id) + .is_some_and(|t| t.rsplit("::").next() == Some(name)) + { + out.push(id); + } + walker.extend(tree.children(id)); + } + out.sort_by(|a, b| tree.bounds(*a).y.total_cmp(&tree.bounds(*b).y)); + out +} + +/// `(header height, first row's offset below the table's top, the first +/// three row heights, the pitch between the first two rows)`, as laid out. +fn table_band_geometry(tree: &WidgetTree, table: WidgetId) -> (f32, f32, Vec, f32) { + let top = tree.bounds(table).y; + let headers = nodes_typed_by_y(tree, table, "TableHeader"); + assert_eq!(headers.len(), 1, "one hosted header"); + let rows = nodes_typed_by_y(tree, table, "BodyRow"); + assert!(rows.len() >= 3, "at least three realized rows"); + let heights = rows[..3].iter().map(|r| tree.bounds(*r).height).collect(); + ( + tree.bounds(headers[0]).height, + tree.bounds(rows[0]).y - top, + heights, + tree.bounds(rows[1]).y - tree.bounds(rows[0]).y, + ) +} + +/// A theme whose table style declares heights no constant carries. +fn theme_with_table_heights(row: f32, header: f32) -> teksilo_core::styles::Theme { + use crate::styles::recipe_table_style::{RecipeTableStyle, TableRecipe}; + let mut theme = teksilo_core::presets::intui::light(); + theme.style_slots.table = Some(std::rc::Rc::new(RecipeTableStyle::new(TableRecipe { + row_height: row, + header_height: header, + ..TableRecipe::default() + }))); + theme +} + +/// A table with no row or header height of its own lays out the ones its +/// style declares: the header band, the first row's offset below it, every +/// row's height and the pitch the virtualization arithmetic steps by. +#[test] +fn a_table_lays_out_the_row_and_header_heights_its_style_declares() { + let mut tree = WidgetTree::new().with_theme(theme_with_table_heights(37.0, 41.0)); + let table = tree.add( + TableView::new(rows(20)) + .add_column(id_col()) + .add_column(name_col()), + ); + tree.layout(SizeProposal::exact(400.0, 300.0)); + assert_eq!( + table_band_geometry(&tree, table), + (41.0, 41.0, vec![37.0; 3], 37.0) + ); +} + +/// The view's own `row_height(..)` and `header_height(..)` win over the +/// style. +#[test] +fn a_tables_own_row_and_header_heights_win_over_the_style() { + let mut tree = WidgetTree::new().with_theme(theme_with_table_heights(37.0, 41.0)); + let table = tree.add( + TableView::new(rows(20)) + .add_column(id_col()) + .add_column(name_col()) + .row_height(20.0) + .header_height(30.0), + ); + tree.layout(SizeProposal::exact(400.0, 300.0)); + assert_eq!( + table_band_geometry(&tree, table), + (30.0, 30.0, vec![20.0; 3], 20.0) + ); +} + +/// Under IntUI the default table follows the recipe's density ladder: 28 / 32 +/// / 44 for a row and 32 / 32 / 44 for the header. Compact is what the table +/// laid out before its style was consulted. +#[test] +fn an_int_ui_table_follows_the_density_ladder() { + use teksilo_tokens::TargetDensity; + for (density, row, header) in [ + (TargetDensity::Compact, 28.0, 32.0), + (TargetDensity::Comfortable, 32.0, 32.0), + (TargetDensity::Touch, 44.0, 44.0), + ] { + let theme = teksilo_core::presets::intui::light().with_density(density); + let mut tree = WidgetTree::new().with_theme(theme); + let table = tree.add( + TableView::new(rows(20)) + .add_column(id_col()) + .add_column(name_col()), + ); + tree.layout(SizeProposal::exact(400.0, 400.0)); + assert_eq!( + table_band_geometry(&tree, table), + (header, header, vec![row; 3], row), + "{density:?}", + ); + } +} diff --git a/crates/teksilo-widgets/src/table_view/widget_impl.rs b/crates/teksilo-widgets/src/table_view/widget_impl.rs index c79b4a1ff..c68720170 100644 --- a/crates/teksilo-widgets/src/table_view/widget_impl.rs +++ b/crates/teksilo-widgets/src/table_view/widget_impl.rs @@ -11,6 +11,7 @@ impl Widget for TableView { let self_id = ctx.self_id(); ctx.enabled_when(self_id, self.enabled.clone()); + self.adopt_style_heights(ctx); let row_h = self.effective_row_height(); let header_h = self.effective_header_height(); diff --git a/crates/teksilo-widgets/src/tree_table_view.rs b/crates/teksilo-widgets/src/tree_table_view.rs index d65f348ba..2da9f8574 100644 --- a/crates/teksilo-widgets/src/tree_table_view.rs +++ b/crates/teksilo-widgets/src/tree_table_view.rs @@ -279,6 +279,11 @@ pub struct TreeTableView { /// pane. row_metrics: SharedRowMetrics, header_height: Option, + /// The active `TableStyle`'s row and header heights at the density + /// in force, read at build by `adopt_style_heights`. Until then they + /// hold IntUI's Compact values, the module constants. + style_row_height: f32, + style_header_height: f32, show_header: bool, selection_mode: TableSelectionMode, /// Row selection — index-based `SelectionModel` or keyed @@ -579,6 +584,8 @@ impl TreeTableView { height_source: HeightSource::Uniform, row_metrics: Rc::new(RefCell::new(RowMetrics::uniform(cp::ROW_HEIGHT, 0.0))), header_height: None, + style_row_height: cp::ROW_HEIGHT, + style_header_height: cp::HEADER_HEIGHT, show_header: true, selection_mode: TableSelectionMode::default(), row_selection: None, @@ -990,8 +997,30 @@ impl TreeTableView { .make_metrics(self.effective_row_height(), 0.0); } - /// Fixed row height (default: the table style's 28 px) — the - /// uniform fast path. Mutually exclusive with + /// Read the active `TableStyle`'s row and header heights at the density + /// in force. Called first thing in `build`, so every height the build and + /// the later layout passes read is the style's, unless the app set its + /// own through [`row_height`](Self::row_height) / + /// [`header_height`](Self::header_height), which win. A uniform-height + /// view with no row height of its own re-materializes its metrics when + /// the style's row height differs from the one they were made with. + fn adopt_style_heights(&mut self, ctx: &BuildContext) { + let style = crate::styles::recipe_table_style::resolve_table_style(ctx); + let tokens = &ctx.theme().input; + self.style_header_height = style.header_height(tokens); + let row = style.row_height(tokens); + if row != self.style_row_height { + self.style_row_height = row; + if self.row_height.is_none() && matches!(self.height_source, HeightSource::Uniform) { + self.remake_metrics(); + } + } + } + + /// Fixed row height, the uniform fast path. Default: the active + /// `TableStyle`'s + /// [`row_height`](teksilo_core::styles::TableStyle::row_height), 28 px + /// under IntUI at the Compact density. Mutually exclusive with /// [`row_height_fn`](Self::row_height_fn) and /// [`auto_row_height`](Self::auto_row_height); the last mode setter /// wins. @@ -1026,7 +1055,10 @@ impl TreeTableView { self } - /// Override the header row height in logical pixels. + /// Override the header row height in logical pixels. Default: the active + /// `TableStyle`'s + /// [`header_height`](teksilo_core::styles::TableStyle::header_height), + /// 32 px under IntUI at the Compact density. pub fn header_height(mut self, height: f32) -> Self { self.header_height = Some(height); self @@ -1729,7 +1761,7 @@ impl TreeTableView { // ── Internals ────────────────────────────────────────────────────── fn effective_row_height(&self) -> f32 { - self.row_height.unwrap_or(cp::ROW_HEIGHT) + self.row_height.unwrap_or(self.style_row_height) } /// The full-width rows and the delegate that draws them, or `None` when @@ -1766,7 +1798,7 @@ impl TreeTableView { fn effective_header_height(&self) -> f32 { if self.show_header { - self.header_height.unwrap_or(cp::HEADER_HEIGHT) + self.header_height.unwrap_or(self.style_header_height) } else { 0.0 } diff --git a/crates/teksilo-widgets/src/tree_table_view/tests.rs b/crates/teksilo-widgets/src/tree_table_view/tests.rs index c9a3ca9cb..285fafde9 100644 --- a/crates/teksilo-widgets/src/tree_table_view/tests.rs +++ b/crates/teksilo-widgets/src/tree_table_view/tests.rs @@ -6516,3 +6516,91 @@ mod full_width_and_pinned { ); } } + +// -- Row and header heights come from the style ------------------------------- + +/// `(header height, first row's offset below the view's top, the first three +/// row heights)`, as laid out, for a tree table over [`sample_tree`] with every +/// row expanded. +fn tree_table_band_geometry( + theme: teksilo_core::styles::Theme, + explicit: bool, +) -> (f32, f32, Vec) { + fn typed_by_y(tree: &WidgetTree, root: WidgetId, name: &str) -> Vec { + let mut out = Vec::new(); + let mut walker = vec![root]; + while let Some(id) = walker.pop() { + if tree + .widget_type_name(id) + .is_some_and(|t| t.rsplit("::").next() == Some(name)) + { + out.push(id); + } + walker.extend(tree.children(id)); + } + out.sort_by(|a, b| tree.bounds(*a).y.total_cmp(&tree.bounds(*b).y)); + out + } + let mut tree = WidgetTree::new().with_theme(theme); + let mut view = TreeTableView::new(sample_tree()) + .add_column(name_col()) + .add_column(size_col()); + if explicit { + view = view.row_height(20.0).header_height(30.0); + } + let view = tree.add(view); + tree.layout(SizeProposal::exact(400.0, 400.0)); + let top = tree.bounds(view).y; + let headers = typed_by_y(&tree, view, "TableHeader"); + assert_eq!(headers.len(), 1, "one hosted header"); + let rows = typed_by_y(&tree, view, "BodyRow"); + assert!(rows.len() >= 2, "at least the two roots are realized"); + ( + tree.bounds(headers[0]).height, + tree.bounds(rows[0]).y - top, + rows[..2].iter().map(|r| tree.bounds(*r).height).collect(), + ) +} + +/// A tree table with no row or header height of its own lays out the ones +/// its style declares, and its own `row_height(..)` / `header_height(..)` win +/// over them. +#[test] +fn a_tree_table_lays_out_the_row_and_header_heights_its_style_declares() { + use crate::styles::recipe_table_style::{RecipeTableStyle, TableRecipe}; + let mut theme = teksilo_core::presets::intui::light(); + theme.style_slots.table = Some(std::rc::Rc::new(RecipeTableStyle::new(TableRecipe { + row_height: 37.0, + header_height: 41.0, + ..TableRecipe::default() + }))); + assert_eq!( + tree_table_band_geometry(theme.clone(), false), + (41.0, 41.0, vec![37.0; 2]), + "the style's heights", + ); + assert_eq!( + tree_table_band_geometry(theme, true), + (30.0, 30.0, vec![20.0; 2]), + "the view's own heights win", + ); +} + +/// Under IntUI the default tree table follows the recipe's density ladder, +/// unchanged at Compact. +#[test] +fn an_int_ui_tree_table_follows_the_density_ladder() { + use teksilo_tokens::TargetDensity; + for (density, row, header) in [ + (TargetDensity::Compact, 28.0, 32.0), + (TargetDensity::Comfortable, 32.0, 32.0), + (TargetDensity::Touch, 44.0, 44.0), + ] { + let theme = teksilo_core::presets::intui::light().with_density(density); + assert_eq!( + tree_table_band_geometry(theme, false), + (header, header, vec![row; 2]), + "{density:?}", + ); + } +} diff --git a/crates/teksilo-widgets/src/tree_table_view/widget_impl.rs b/crates/teksilo-widgets/src/tree_table_view/widget_impl.rs index 1f26418b5..f2fbe8dee 100644 --- a/crates/teksilo-widgets/src/tree_table_view/widget_impl.rs +++ b/crates/teksilo-widgets/src/tree_table_view/widget_impl.rs @@ -11,6 +11,7 @@ impl Widget for TreeTableView { let self_id = ctx.self_id(); ctx.enabled_when(self_id, self.enabled.clone()); + self.adopt_style_heights(ctx); let row_h = self.effective_row_height(); let header_h = self.effective_header_height(); let indent_per_level = self.effective_indent(); diff --git a/crates/teksilo-widgets/tests/density_projection.rs b/crates/teksilo-widgets/tests/density_projection.rs index 829b192ef..f7476b47e 100644 --- a/crates/teksilo-widgets/tests/density_projection.rs +++ b/crates/teksilo-widgets/tests/density_projection.rs @@ -494,15 +494,17 @@ fn every_fixed_row_says_it_is_fixed() { // Four style traits carry a defaulted metrics accessor for a dimension the // widget composes itself and the trait's `make_*` hooks never see: a table // cell's gutter, a calendar nav arrow's footprint, a search suggestion row's -// gutter, a list row's height floor. Each default is the module constant put -// through the same helper `for_tokens` uses, restated as a literal because `teksilo-core` sits below +// gutter, a list row's height floor, a table's row and header heights. Each +// default is the module constant put through the same helper `for_tokens` +// uses, restated as a literal because `teksilo-core` sits below // `teksilo-widgets` and cannot name the constant. A literal in one crate and a // constant in another is exactly the shape that drifts, so it is pinned here — // and the tests are named in the trait doc comments, so a reader who finds the // literal finds the pin. -/// The `TableStyle` gutter defaults equal -/// `recipe_table_style::CELL_PADDING_{HORIZONTAL,VERTICAL}` at every density. +/// The `TableStyle` gutter and height defaults equal +/// `recipe_table_style::CELL_PADDING_{HORIZONTAL,VERTICAL}` and +/// `ROW_HEIGHT` / `HEADER_HEIGHT` at every density. #[test] fn the_table_trait_defaults_restate_the_module_constants() { use teksilo_core::styles::TableStyle; @@ -549,7 +551,27 @@ fn the_table_trait_defaults_restate_the_module_constants() { spacing(cp::CELL_PADDING_VERTICAL, &t), "the TableStyle default drifted from CELL_PADDING_VERTICAL", ); + assert_eq!( + BareTableStyle.row_height(&t), + dp(cp::ROW_HEIGHT, TargetRole::Target, &t), + "the TableStyle default drifted from ROW_HEIGHT", + ); + assert_eq!( + BareTableStyle.header_height(&t), + dp(cp::HEADER_HEIGHT, TargetRole::Target, &t), + "the TableStyle default drifted from HEADER_HEIGHT", + ); + // And the shipped recipe at that density agrees with the default, so + // an out-of-tree style and the shipped one lay out the same rows. + let shipped = RecipeTableStyle::for_tokens(&t); + assert_eq!(shipped.row_height(&t), BareTableStyle.row_height(&t)); + assert_eq!(shipped.header_height(&t), BareTableStyle.header_height(&t)); } + // At Compact the defaults are the module constants themselves, so a + // Compact table lays out exactly what it did before the accessors existed. + let t = compact(); + assert_eq!(BareTableStyle.row_height(&t), cp::ROW_HEIGHT); + assert_eq!(BareTableStyle.header_height(&t), cp::HEADER_HEIGHT); } /// The `CalendarStyle` arrow default equals @@ -710,6 +732,14 @@ fn a_recipe_style_answers_from_its_own_recipe() { assert_eq!(table.cell_padding_horizontal(&t), 12.0); assert_eq!(table.cell_padding_vertical(&t), 7.0); + let table = RecipeTableStyle::new(TableRecipe { + row_height: 23.0, + header_height: 27.0, + ..TableRecipe::for_tokens(&t) + }); + assert_eq!(table.row_height(&t), 23.0); + assert_eq!(table.header_height(&t), 27.0); + let calendar = RecipeCalendarStyle::new(CalendarRecipe { nav_arrow_size: 20.0, ..CalendarRecipe::for_tokens(&t) diff --git a/docs/table-view.md b/docs/table-view.md index b03c89be4..4819a8765 100644 --- a/docs/table-view.md +++ b/docs/table-view.md @@ -92,7 +92,10 @@ Three mutually exclusive modes (the last builder call wins), identical on - **Uniform** (`row_height`), every row is the same height. Pure arithmetic, no allocation; this is the historical behavior and stays - the default (28 px from the table style). + the default, at the active `TableStyle`'s `row_height` (28 px under + IntUI at Compact, raised to the density's target size above it; 24 px + under macOS and 40 px under Fluent at Compact). A `row_height(..)` the + app sets wins over the style. - **Exact** (`row_height_fn`), a pure callback `fn(visible_index) -> f32` seeds a prefix-sum offset table (O(log n) row↔y lookups). No measurement pass, exact scrollbar, zero jitter. The callback is @@ -541,8 +544,8 @@ header by a frame, and a headless test needs a second `layout()` before it lines up. On its own the header resolves its widths -against its own bounds, clips its cells to them, takes `HEADER_HEIGHT` when its -parent leaves the height free, and paints the `ColumnResizePolicy::OnRelease` +against its own bounds, clips its cells to them, takes the active +`TableStyle`'s `header_height` when its parent leaves the height free, and paints the `ColumnResizePolicy::OnRelease` guide line within the strip only. **Accessibility.** The strip is the `Role::Row` with row index 1 and its cells @@ -1021,7 +1024,10 @@ PgDn handler uses. Static numbers (`ROW_HEIGHT`, `HEADER_HEIGHT`, `RESIZE_HANDLE_WIDTH`, `GRID_LINE_THICKNESS`, `TREE_INDENT_PER_LEVEL`, …) are `pub const`s in [`recipe_table_style`](../crates/teksilo-widgets/src/styles/recipe_table_style.rs) -They are snapshot at build time, like every other widget. +They are snapshot at build time, like every other widget. The row and header +heights a view lays out come from the active `TableStyle`'s `row_height` and +`header_height`, which `RecipeTableStyle` answers from its `TableRecipe`; +`ROW_HEIGHT` and `HEADER_HEIGHT` are the IntUI values that recipe starts from. --- diff --git a/docs/widgets/table_view.md b/docs/widgets/table_view.md index e3874eb24..924c05cc1 100644 --- a/docs/widgets/table_view.md +++ b/docs/widgets/table_view.md @@ -463,8 +463,10 @@ Append multiple `Column` definitions from an iterator. #### `pub fn row_height(mut self, height: f32) -> Self` -Fixed row height (default: the table style's 28 px) — the -uniform fast path. Mutually exclusive with +Fixed row height, the uniform fast path. Default: the active +`TableStyle`'s +`row_height`, 28 px +under IntUI at the Compact density. Mutually exclusive with `row_height_fn` and `auto_row_height`; the last mode setter wins. @@ -495,7 +497,10 @@ measurement change. #### `pub fn header_height(mut self, height: f32) -> Self` -Override the column header row height in logical pixels. Default: the table style's `HEADER_HEIGHT`. +Override the column header row height in logical pixels. Default: the +active `TableStyle`'s +`header_height`, +32 px under IntUI at the Compact density. diff --git a/docs/widgets/tree_table_view.md b/docs/widgets/tree_table_view.md index d8caf3686..a4e49edba 100644 --- a/docs/widgets/tree_table_view.md +++ b/docs/widgets/tree_table_view.md @@ -609,8 +609,10 @@ inside it shows on the next frame. #### `pub fn row_height(mut self, height: f32) -> Self` -Fixed row height (default: the table style's 28 px) — the -uniform fast path. Mutually exclusive with +Fixed row height, the uniform fast path. Default: the active +`TableStyle`'s +`row_height`, 28 px +under IntUI at the Compact density. Mutually exclusive with `row_height_fn` and `auto_row_height`; the last mode setter wins. @@ -641,7 +643,10 @@ frame after a measurement change. #### `pub fn header_height(mut self, height: f32) -> Self` -Override the header row height in logical pixels. +Override the header row height in logical pixels. Default: the active +`TableStyle`'s +`header_height`, +32 px under IntUI at the Compact density. diff --git a/engineering/docs/density-projection-gaps.md b/engineering/docs/density-projection-gaps.md index 1071a4fe0..770a96298 100644 --- a/engineering/docs/density-projection-gaps.md +++ b/engineering/docs/density-projection-gaps.md @@ -8,7 +8,7 @@ struct, and `for_tokens(&InputTokens)` projects each one onto the active density — `dp` for a target, `spacing` for a gap, `density_min_size` for a minimum box. A theme preset then builds that same struct with its own numbers. -**Forty-seven of those projected fields have no reader.** The widget composes the +**Forty-five of those projected fields have no reader.** The widget composes the dimension from the raw `pub const` in the recipe's module instead, so the projected field is written by `for_tokens`, written again by every preset, and consulted by nothing. Retuning one changes nothing on screen. @@ -48,11 +48,11 @@ and is therefore inside the scope; the rule finds both its projected fields read | | | |---|---| | projected fields in scope | 103 | -| of those, unread by the rule | 49 | +| of those, unread by the rule | 47 | | false positives of the rule (§4) | 2 | -| **real gap** | **47** | +| **real gap** | **45** | | of which inert even if wired (§1) | 10 | -| of which a shipped preset already sets a different value (§2) | 12 | +| of which a shipped preset already sets a different value (§2) | 10 | | of which a preset sets the same value the constant carries (§3a) | 3 | | of which density only, no preset (§3b) | 22 | @@ -62,13 +62,14 @@ those cost a test failure would discourage the one change it invites: the tables are the record, the guard keeps their *membership* honest, and the arithmetic is a snapshot of the day it was taken. -Seven further fields were on this list until a metrics accessor wired them, +Nine further fields were on this list until a metrics accessor wired them, and they are the worked examples for what wiring one looks like: `TableRecipe::cell_padding_horizontal` / `cell_padding_vertical` (`TableStyle`), `CalendarRecipe::nav_arrow_size` (`CalendarStyle`), `SearchFieldRecipe::row_padding_horizontal` / `row_padding_vertical` -(`SearchFieldStyle`) and `StandardItemRecipe::min_height_single_line` / -`min_height_two_line` (`StandardItemStyle`): a defaulted metrics accessor on +(`SearchFieldStyle`), `StandardItemRecipe::min_height_single_line` / +`min_height_two_line` (`StandardItemStyle`) and `TableRecipe::row_height` / +`header_height` (`TableStyle`): a defaulted metrics accessor on the style trait, defaulted so an out-of-tree style keeps compiling, overridden by the `Recipe*Style` from its own recipe so a preset's number takes effect. @@ -111,7 +112,7 @@ unwired one. ## 2. A shipped preset already sets a different value -The twelve that cost something today. Each is written by Fluent or macOS with +The ten that cost something today. Each is written by Fluent or macOS with a number chosen for that design language, and each renders the IntUI constant instead. The **renders** column is what a user sees under any theme. @@ -127,29 +128,18 @@ instead. The **renders** column is what a user sees under any theme. | `TabRecipe` | `editor_height` | 50 | 32 | 26 | `tab_widget/bar.rs` → `build`; `tab_widget/header.rs` → `intrinsic_height` | | `TabRecipe` | `padding_horizontal` | 12 | 8 | 12 | `tab_widget/header.rs` → `build`, `estimate_natural_width` | | `TabRecipe` | `tool_window_height` | 28 | 32 | 22 | none — see below | -| `TableRecipe` | `header_height` | 32 | 40 | 24 | `table_view.rs` → `effective_header_height`; `tree_table_view.rs` → `effective_header_height` | -| `TableRecipe` | `row_height` | 28 | 40 | 24 | `table_view.rs` → `effective_row_height`; `tree_table_view.rs` → `effective_row_height` | Ladders, for the ones whose density projection also moves (Compact / Comfortable / Touch): `cell_size` 32/32/44, `CalendarRecipe::header_height` 28/32/44, `min_thumb_length` 24/32/44, `SearchFieldRecipe::row_height` 26/32/44, `SegmentedControlRecipe::height` 24/32/44 and `padding_horizontal` 12/13.8/15.6 and `padding_vertical` 6/6.9/7.8, `TabRecipe::padding_horizontal` -12/13.8/15.6, `tool_window_height` 28/32/44, -`TableRecipe::header_height` 32/32/44, `row_height` 28/32/44. +12/13.8/15.6, `tool_window_height` 28/32/44. `TabRecipe::editor_height` (50) is flat: its cost is the preset alone, not the density. ### Verdicts -**Safe to wire, `TableStyle` already has the seam.** `TableRecipe::row_height` -and `header_height` — both already flow through an `Option` override -(`effective_row_height` / `effective_header_height`), so the change is swapping -the `unwrap_or` default for a style accessor at one site each, in the same shape -`cell_padding_horizontal` just took. Note they feed the virtualization -arithmetic, so a test should assert a laid-out row band and not only the -accessor. - **Safe to wire, one accessor each.** `ScrollBarRecipe::min_thumb_length` — `ScrollBar::build` already resolves the style and then *recomputes* the floor from the constant three lines later, so the value is already in hand. From b12d4c6c488e1c967f6ab88cd5865cca16f93909 Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 08:05:00 +0200 Subject: [PATCH 08/59] feat(styles): render the TabRecipe tab height and header padding TabBar laid out its strip from recipe_tab_style::TAB_EDITOR_HEIGHT (50) and every TabHeader padded its content by TAB_PADDING_HORIZONTAL (12) whatever the active TabStyle declared, at every density, so the macOS (26 dp, 12 dp) and Fluent (32 dp, 8 dp) tab metrics were written on the recipe and never rendered. TabStyle gains two defaulted metrics accessors, editor_height and padding_horizontal, taking the density's InputTokens. The defaults are the module constants put through dp() as a target and spacing(), which is exactly what the shipped RecipeTabStyle answers at every density and exactly today's constants at Compact; the_tab_trait_defaults_restate_the_module_constants pins both. RecipeTabStyle answers from its recipe. No config struct gains a field. The bar resolves its style once at the top of build() (per-call override, then theme slot, then the shipped recipe, through one resolve_tab_style helper) and uses it for the scroll viewport's height, the header row's per-tab extent and the bar chrome. Each header resolves the same style, parks it, and asks it for its height and its padding in layout_response and for its padding in build(), so a header's natural width and the Padding it builds agree. An app's tab_bar_height(..) still wins. TabWidget reaches the style through its bar. The Fluent tab height is raised to the density's target size, as the macOS one already was (Fluent 32/32/44, macOS 26/32/44). Int UI keeps its 50 dp tabs at every density; its header padding now follows its recipe's spacing ladder (12/13.8/15.6), so Int UI tabs are wider above Compact. TabRecipe::tool_window_height and TAB_TOOL_WINDOW_HEIGHT had no reader anywhere and are deleted; the macOS and Fluent factories stop setting the field, and the macOS unit tests that compared it now compare the tab height. No downstream repository names either. Tests: macOS and Fluent preset_metrics mount a two-tab TabBar at every density and assert the strip height, the tab height and the header padding (the content row's inset inside its Padding, on both edges), with Int UI as the control, plus the installed slot's accessors. tab_widget tests cover a style declaring 37 dp tabs and 30 dp padding reaching a horizontal bar and a vertical bar's pills, tab_bar_height winning over the style, a TabWidget taking the theme slot's height, and the Int UI padding ladder. density_projection pins the defaults and checks the recipe style answers from its own recipe. density-projection-gaps.md loses the three TabRecipe rows from section 2: projected 103 -> 102, unread 47 -> 44, real gap 45 -> 42, section 2 ten -> seven. density-inventory.md marks the TAB_TOOL_WINDOW_HEIGHT row deleted in place. The tab_widget and bar catalog pages are regenerated. Conformance census re-run: totals unchanged (477; per theme and density identical), and no ALLOW_LIST entry moved. Every fixture tab is at or above the floor (macOS 26 at Compact, Fluent 32); the docking fixture's 38 dp compact strip is unchanged, its headers only change width. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 22 ++ crates/teksilo-core/src/styles/tab_style.rs | 43 ++++ .../src/styles/metrics.rs | 6 +- .../tests/preset_metrics.rs | 121 ++++++++++ .../teksilo-theme-macos/src/styles/metrics.rs | 4 +- .../tests/preset_metrics.rs | 126 +++++++++++ .../src/styles/recipe_tab_style.rs | 64 +++++- crates/teksilo-widgets/src/tab_widget.rs | 4 +- crates/teksilo-widgets/src/tab_widget/bar.rs | 66 +++--- .../src/tab_widget/delegate.rs | 2 +- .../teksilo-widgets/src/tab_widget/header.rs | 69 +++--- .../teksilo-widgets/src/tab_widget/tests.rs | 206 +++++++++++++++++- .../tests/density_projection.rs | 74 ++++++- docs/tab-widget.md | 34 +-- docs/widgets/bar.md | 4 +- docs/widgets/tab_widget.md | 2 +- engineering/docs/density-inventory.md | 4 +- engineering/docs/density-projection-gaps.md | 43 ++-- 18 files changed, 776 insertions(+), 118 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54b15eb28..5a2b97513 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,19 @@ by crate for clarity, not because crates version independently. tall a `TableView` or `TreeTableView` body row and column header row are at the active density. Both have defaults, the shipped table heights raised to the density's target size. +- **`TabStyle::editor_height` and `padding_horizontal`.** A tab style says how + tall a `TabBar` or `TabWidget` tab is and how far its title sits from the + tab's edges at the active density. Both have defaults, so an existing style + keeps Int UI's 50 px tabs. + +### Removed + +#### Theming + +- **Breaking.** **`TabRecipe::tool_window_height` and + `recipe_tab_style::TAB_TOOL_WINDOW_HEIGHT`.** Nothing read either, so + setting them changed nothing. A `TabRecipe` struct literal that names + `tool_window_height` must drop it. ### Fixed @@ -89,6 +102,15 @@ by crate for clarity, not because crates version independently. out 28 px rows and a 32 px header whatever the theme and the density. A `row_height`, `row_height_fn`, `auto_row_height` or `header_height` the app set still wins. +- **Tabs are as tall and as padded as the active style says.** + **Behaviour change:** a `TabBar` or `TabWidget` with no `tab_bar_height` of + its own now lays out the tab height its style declares, and each tab pads + its title by the style's padding: 26 px tabs under the macOS preset and + 32 px under Fluent at the compact density (44 px at the touch density for + both), and 8 px of padding under Fluent. Before, every tab was 50 px tall + with 12 px of padding whatever the theme. Under Int UI tabs stay 50 px tall, + and their padding now grows with the density: 13.8 px at the comfortable + density and 15.6 px at the touch density, so tabs there are wider. - **Accent chrome a recipe builds follows the high-contrast preference.** **Behaviour change:** under the OS increase contrast preference, a `Filled` button's fill and a button's focus border now take the high-contrast diff --git a/crates/teksilo-core/src/styles/tab_style.rs b/crates/teksilo-core/src/styles/tab_style.rs index 1337ebf16..5a0febe3d 100644 --- a/crates/teksilo-core/src/styles/tab_style.rs +++ b/crates/teksilo-core/src/styles/tab_style.rs @@ -8,14 +8,22 @@ //! indicator, focus ring, …) and [`TabStyle::make_bar`] wraps the //! whole strip (backdrop fill, content-pane separator, drag-reorder //! drop indicator). A custom `impl TabStyle` provides both. +//! +//! Two defaulted metrics accessors, [`TabStyle::editor_height`] and +//! [`TabStyle::padding_horizontal`], say how tall a tab header is and how far +//! its content sits from its leading and trailing edges. The bar and its +//! headers measure themselves from them, so a preset's tab geometry is the one +//! laid out. use std::rc::Rc; use serde::{Deserialize, Serialize}; +use teksilo_tokens::{InputTokens, TargetRole}; use crate::build_context::BuildContext; use crate::color_prop::ColorProp; use crate::signal::Signal; +use crate::styles::density::{dp, spacing}; use crate::widget_id::WidgetId; #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Default, Serialize, Deserialize)] @@ -84,6 +92,41 @@ pub trait TabStyle: 'static { fn make_body(&self, cfg: &TabStyleConfig, ctx: &mut BuildContext) -> WidgetId; /// Chrome for the whole bar strip — wraps [`TabBarChromeConfig::content`]. fn make_bar(&self, cfg: &TabBarChromeConfig, ctx: &mut BuildContext) -> WidgetId; + + /// The outer height of one tab header, in logical pixels, at the density + /// `tokens` describe: the strip height of a horizontal bar, and the pill + /// height of a vertical one. The focus-ring envelope is reserved inside it, + /// never added on top. + /// + /// A metrics accessor because the bar sizes its scroll viewport and its + /// header row from one number, and each header measures itself in + /// `layout_response`, where the chrome `make_body` built is out of reach. + /// Without it a preset's tab height is written and never rendered. A bar's + /// own `tab_bar_height(..)` wins over it. + /// + /// **Defaulted**, so a `TabStyle` implemented outside this workspace keeps + /// compiling. The default is + /// `teksilo_widgets::styles::recipe_tab_style::TAB_EDITOR_HEIGHT` put + /// through [`dp`] as a target, which is the shipped recipe's own answer at + /// every density, restated as a literal because `teksilo-core` cannot name + /// a `teksilo-widgets` constant, and pinned equal to it by + /// `the_tab_trait_defaults_restate_the_module_constants`. + fn editor_height(&self, tokens: &InputTokens) -> f32 { + dp(50.0, TargetRole::Target, tokens) + } + + /// The gap between a tab header's edges and its content (icon, label, + /// slots, close button) along the bar's main axis, in logical pixels, at + /// the density `tokens` describe. It counts twice in a header's natural + /// width. A pinned tab, which centres its icon in a fixed width, ignores + /// it. + /// + /// Defaulted on the same terms as [`editor_height`](Self::editor_height), + /// from `teksilo_widgets::styles::recipe_tab_style::TAB_PADDING_HORIZONTAL` + /// put through [`spacing`]. + fn padding_horizontal(&self, tokens: &InputTokens) -> f32 { + spacing(12.0, tokens) + } } pub type SharedTabStyle = Rc; diff --git a/crates/teksilo-theme-fluent/src/styles/metrics.rs b/crates/teksilo-theme-fluent/src/styles/metrics.rs index 9f7bc91e2..d917db3ce 100644 --- a/crates/teksilo-theme-fluent/src/styles/metrics.rs +++ b/crates/teksilo-theme-fluent/src/styles/metrics.rs @@ -228,11 +228,11 @@ pub fn fluent_scroll_bar_style_for(tokens: &InputTokens) -> RecipeScrollBarStyle /// `TabBar` — `TabViewItemMinHeight` 32, `TabViewItemHeaderPadding` 8, and /// a 3 dp active indicator (the `NavigationViewSelectionIndicator` -/// thickness Fluent uses wherever a selection underline appears). +/// thickness Fluent uses wherever a selection underline appears). The +/// height is raised to the density's target size, as macOS's tab strip is. pub fn fluent_tab_style_for(tokens: &InputTokens) -> RecipeTabStyle { RecipeTabStyle::new(TabRecipe { - editor_height: FLUENT_CONTROL_HEIGHT, - tool_window_height: FLUENT_CONTROL_HEIGHT, + editor_height: dp(FLUENT_CONTROL_HEIGHT, TargetRole::Target, tokens), padding_horizontal: 8.0, underline_active: 3.0, close_button_size: 16.0, diff --git a/crates/teksilo-theme-fluent/tests/preset_metrics.rs b/crates/teksilo-theme-fluent/tests/preset_metrics.rs index 6baf9ac2d..20bd7d976 100644 --- a/crates/teksilo-theme-fluent/tests/preset_metrics.rs +++ b/crates/teksilo-theme-fluent/tests/preset_metrics.rs @@ -303,3 +303,124 @@ fn a_table_measures_the_fluent_row_and_header_heights_at_every_density() { ); } } + +// ── TabBar tab height and header padding ─────────────────────────────── + +/// The laid-out `(strip height, tab height, header padding)` of a horizontal +/// two-tab `TabBar` built at `density` under `theme`, with no tab height of +/// its own. The padding is the inset of each header's content row inside the +/// `Padding` that wraps it, and it must be the same on both edges and on both +/// headers, so the number measured is the one the header's natural width was +/// sized from. +/// +/// Built *at* the density, never switched into it: a bar reads its style's +/// metrics when it builds. +fn tab_metrics(theme: &Theme, density: TargetDensity) -> (f32, f32, f32) { + use teksilo_core::signal::Signal; + use teksilo_data::ListModel; + use teksilo_i18n::lit; + use teksilo_widgets::tab_widget::{TabBar, TabDelegate, TabId, TabSizing}; + + let model = ListModel::from_vec(vec![ + (TabId::fresh(), "Documents"), + (TabId::fresh(), "Downloads"), + ]); + let delegate = TabDelegate::new(|_, t: &(TabId, &'static str)| lit!(t.1)); + let selected: Signal> = Signal::new(None); + let mut tree = WidgetTree::new() + .with_theme(theme.with_density(density)) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))); + let bar = tree.add( + TabBar::horizontal(model, delegate, selected, |_, t| t.0) + .tab_sizing(TabSizing::Independent) + .show_scroll_arrows(false) + .show_overflow_dropdown(false), + ); + tree.layout(SizeProposal { + width: Some(800.0), + height: None, + }); + + let headers = nodes_named(&tree, bar, "TabHeader"); + assert_eq!(headers.len(), 2, "two tab headers"); + let tab_h = tree.bounds(headers[0]).height; + let mut pads = Vec::new(); + for header in headers { + assert_eq!(tree.bounds(header).height, tab_h, "one tab height"); + let padding = nodes_named(&tree, header, "Padding"); + assert_eq!(padding.len(), 1, "one padded content row per header"); + let outer = tree.bounds(padding[0]); + let row = tree.bounds(tree.children(padding[0])[0]); + let leading = row.x - outer.x; + let trailing = (outer.x + outer.width) - (row.x + row.width); + assert!( + (leading - trailing).abs() < 1e-3, + "{density:?}: the padding is symmetric ({leading} / {trailing})", + ); + pads.push(leading); + } + assert!((pads[0] - pads[1]).abs() < 1e-3, "one padding: {pads:?}"); + (tree.bounds(bar).height, tab_h, pads[0]) +} + +/// Assert `(strip, tab, padding)` measures `want` within float tolerance. +fn assert_tab_metrics(got: (f32, f32, f32), want: (f32, f32, f32), what: &str) { + assert!( + (got.0 - want.0).abs() < 1e-3 && (got.1 - want.1).abs() < 1e-3, + "{what}: strip and tab heights {got:?}, want {want:?}", + ); + assert!( + (got.2 - want.2).abs() < 1e-3, + "{what}: header padding {got:?}, want {want:?}", + ); +} + +/// `TabViewItemMinHeight` is 32 dp and `TabViewItemHeaderPadding` 8 dp in the +/// Fluent recipe, and a laid-out bar must measure both. The bar used to +/// reserve the shipped 50 dp strip and pad by the shipped 12 dp whatever the +/// style declared, so every Fluent tab strip rendered 18 dp taller and each +/// tab 8 dp wider than its recipe. +/// +/// Above Compact the 32 rises to the density's target size (44 at Touch); the +/// padding is WinUI's fixed 8 dp at every density. The IntUI arm is the +/// control: its 50 dp tab clears every target, and its padding walks the +/// spacing ladder. +#[test] +fn a_tab_bar_measures_the_fluent_tab_height_and_padding_at_every_density() { + let expected = [ + ( + TargetDensity::Compact, + (32.0, 32.0, 8.0), + (50.0, 50.0, 12.0), + ), + ( + TargetDensity::Comfortable, + (32.0, 32.0, 8.0), + (50.0, 50.0, 13.8), + ), + (TargetDensity::Touch, (44.0, 44.0, 8.0), (50.0, 50.0, 15.6)), + ]; + for (density, fluent, intui) in expected { + assert_tab_metrics( + tab_metrics(&teksilo_core::presets::intui::light(), density), + intui, + &format!("{density:?}: IntUI"), + ); + for theme in [teksilo_theme_fluent::light(), teksilo_theme_fluent::dark()] { + assert_tab_metrics( + tab_metrics(&theme, density), + fluent, + &format!("{density:?}: the Fluent recipe's tab metrics must reach the bar"), + ); + } + // The accessor half: what the installed slot tells a bar asking it. + let theme = teksilo_theme_fluent::light().with_density(density); + let slot = theme + .style_slots + .tab + .clone() + .expect("the preset installs a tab slot"); + assert!((slot.editor_height(&theme.input) - fluent.1).abs() < 1e-3); + assert!((slot.padding_horizontal(&theme.input) - fluent.2).abs() < 1e-3); + } +} diff --git a/crates/teksilo-theme-macos/src/styles/metrics.rs b/crates/teksilo-theme-macos/src/styles/metrics.rs index edd5c83a4..1e7e1fcd7 100644 --- a/crates/teksilo-theme-macos/src/styles/metrics.rs +++ b/crates/teksilo-theme-macos/src/styles/metrics.rs @@ -266,7 +266,6 @@ pub fn macos_scroll_bar_style_for(tokens: &InputTokens) -> RecipeScrollBarStyle pub fn macos_tab_style_for(tokens: &InputTokens) -> RecipeTabStyle { RecipeTabStyle::new(TabRecipe { editor_height: dp(26.0, TargetRole::Target, tokens), - tool_window_height: H_CONTROL, padding_horizontal: spacing(12.0, tokens), underline_active: 2.0, underline_hover: 2.0, @@ -459,7 +458,6 @@ mod tests { assert_eq!(macos_icon_button_style().recipe.size_default, H_CONTROL); assert_eq!(macos_segmented_control_style().recipe.height, H_CONTROL); assert_eq!(macos_search_field_style().recipe.row_height, H_CONTROL); - assert_eq!(macos_tab_style().recipe.tool_window_height, H_CONTROL); } /// The density claim, pinned against the sibling preset. @@ -470,7 +468,7 @@ mod tests { macos_combo_box_style().recipe.height, macos_icon_button_style().recipe.size_default, macos_segmented_control_style().recipe.height, - macos_tab_style().recipe.tool_window_height, + macos_tab_style().recipe.editor_height, macos_table_style().recipe.row_height, ] { assert!(h < FLUENT_CONTROL_HEIGHT, "{h} is not denser than Fluent"); diff --git a/crates/teksilo-theme-macos/tests/preset_metrics.rs b/crates/teksilo-theme-macos/tests/preset_metrics.rs index 02bd6a8fd..33f8be115 100644 --- a/crates/teksilo-theme-macos/tests/preset_metrics.rs +++ b/crates/teksilo-theme-macos/tests/preset_metrics.rs @@ -766,3 +766,129 @@ fn a_table_measures_the_macos_row_and_header_heights_at_every_density() { ); } } + +// ── TabBar tab height and header padding ─────────────────────────────── + +/// The laid-out `(strip height, tab height, header padding)` of a horizontal +/// two-tab `TabBar` built at `density` under `theme`, with no tab height of +/// its own. The padding is the inset of each header's content row inside the +/// `Padding` that wraps it, and it must be the same on both edges and on both +/// headers, so the number measured is the one the header's natural width was +/// sized from. +/// +/// Built *at* the density, never switched into it: a bar reads its style's +/// metrics when it builds. +fn tab_metrics(theme: &Theme, density: TargetDensity) -> (f32, f32, f32) { + use teksilo_core::signal::Signal; + use teksilo_data::ListModel; + use teksilo_i18n::lit; + use teksilo_widgets::tab_widget::{TabBar, TabDelegate, TabId, TabSizing}; + + let model = ListModel::from_vec(vec![ + (TabId::fresh(), "Documents"), + (TabId::fresh(), "Downloads"), + ]); + let delegate = TabDelegate::new(|_, t: &(TabId, &'static str)| lit!(t.1)); + let selected: Signal> = Signal::new(None); + let mut tree = WidgetTree::new() + .with_theme(theme.with_density(density)) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))); + let bar = tree.add( + TabBar::horizontal(model, delegate, selected, |_, t| t.0) + .tab_sizing(TabSizing::Independent) + .show_scroll_arrows(false) + .show_overflow_dropdown(false), + ); + tree.layout(SizeProposal { + width: Some(800.0), + height: None, + }); + + let headers = nodes_named(&tree, bar, "TabHeader"); + assert_eq!(headers.len(), 2, "two tab headers"); + let tab_h = tree.bounds(headers[0]).height; + let mut pads = Vec::new(); + for header in headers { + assert_eq!(tree.bounds(header).height, tab_h, "one tab height"); + let padding = nodes_named(&tree, header, "Padding"); + assert_eq!(padding.len(), 1, "one padded content row per header"); + let outer = tree.bounds(padding[0]); + let row = tree.bounds(tree.children(padding[0])[0]); + let leading = row.x - outer.x; + let trailing = (outer.x + outer.width) - (row.x + row.width); + assert!( + (leading - trailing).abs() < 1e-3, + "{density:?}: the padding is symmetric ({leading} / {trailing})", + ); + pads.push(leading); + } + assert!((pads[0] - pads[1]).abs() < 1e-3, "one padding: {pads:?}"); + (tree.bounds(bar).height, tab_h, pads[0]) +} + +/// Assert `(strip, tab, padding)` measures `want` within float tolerance. +fn assert_tab_metrics(got: (f32, f32, f32), want: (f32, f32, f32), what: &str) { + assert!( + (got.0 - want.0).abs() < 1e-3 && (got.1 - want.1).abs() < 1e-3, + "{what}: strip and tab heights {got:?}, want {want:?}", + ); + assert!( + (got.2 - want.2).abs() < 1e-3, + "{what}: header padding {got:?}, want {want:?}", + ); +} + +/// `NSTabView`'s header strip is 26 dp in the macOS recipe and its titles sit +/// 12 dp in from each edge, and a laid-out bar must measure both. The bar used +/// to reserve the shipped 50 dp strip and pad by the shipped 12 dp whatever +/// the style declared, so every macOS tab strip rendered 24 dp taller than +/// its recipe. +/// +/// Above Compact the 26 rises to the density's target size (32 at +/// Comfortable, 44 at Touch) and the padding scales by the spacing factor +/// (13.8, 15.6). The IntUI arm is the control: its 50 dp tab clears every +/// target, and its padding walks the same spacing ladder. +#[test] +fn a_tab_bar_measures_the_macos_tab_height_and_padding_at_every_density() { + let expected = [ + ( + TargetDensity::Compact, + (26.0, 26.0, 12.0), + (50.0, 50.0, 12.0), + ), + ( + TargetDensity::Comfortable, + (32.0, 32.0, 13.8), + (50.0, 50.0, 13.8), + ), + (TargetDensity::Touch, (44.0, 44.0, 15.6), (50.0, 50.0, 15.6)), + ]; + assert_eq!( + expected.len(), + ALL_DENSITIES.len(), + "every density is listed" + ); + for (density, macos, intui) in expected { + assert_tab_metrics( + tab_metrics(&teksilo_core::presets::intui::light(), density), + intui, + &format!("{density:?}: IntUI"), + ); + for theme in [teksilo_theme_macos::light(), teksilo_theme_macos::dark()] { + assert_tab_metrics( + tab_metrics(&theme, density), + macos, + &format!("{density:?}: the macOS recipe's tab metrics must reach the bar"), + ); + } + // The accessor half: what the installed slot tells a bar asking it. + let theme = teksilo_theme_macos::light().with_density(density); + let slot = theme + .style_slots + .tab + .clone() + .expect("the preset installs a tab slot"); + assert!((slot.editor_height(&theme.input) - macos.1).abs() < 1e-3); + assert!((slot.padding_horizontal(&theme.input) - macos.2).abs() < 1e-3); + } +} diff --git a/crates/teksilo-widgets/src/styles/recipe_tab_style.rs b/crates/teksilo-widgets/src/styles/recipe_tab_style.rs index 3e97d7e11..d6a349398 100644 --- a/crates/teksilo-widgets/src/styles/recipe_tab_style.rs +++ b/crates/teksilo-widgets/src/styles/recipe_tab_style.rs @@ -32,8 +32,8 @@ use teksilo_core::binding::BindingLevel; use teksilo_core::build_context::BuildContext; use teksilo_core::signal::Signal; use teksilo_core::styles::{ - FocusRingStroke, TabBarChromeConfig, TabBarOrientation, TabIndicatorPosition, TabStyle, - TabStyleConfig, + FocusRingStroke, SharedTabStyle, TabBarChromeConfig, TabBarOrientation, TabIndicatorPosition, + TabStyle, TabStyleConfig, }; use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement}; use teksilo_core::widget_id::WidgetId; @@ -45,7 +45,6 @@ use teksilo_core::styles::density::{dp, spacing}; // IntUI design tokens for Tab. The recipe and parent TabHeader own // their own dimensions. pub const TAB_EDITOR_HEIGHT: f32 = 50.0; -pub const TAB_TOOL_WINDOW_HEIGHT: f32 = 28.0; pub const TAB_PADDING_HORIZONTAL: f32 = 12.0; pub const TAB_UNDERLINE_ACTIVE: f32 = 2.0; pub const TAB_UNDERLINE_HOVER: f32 = 2.0; @@ -59,8 +58,12 @@ const DROP_INDICATOR_WIDTH: f32 = 2.0; /// [`RecipeTabStyle::default()`] reproduces the built-in IntUI look. #[derive(Debug, Clone, Copy, PartialEq)] pub struct TabRecipe { + /// The outer height of one tab header: the strip height of a horizontal + /// bar, the pill height of a vertical one. Read through + /// [`TabStyle::editor_height`]. pub editor_height: f32, - pub tool_window_height: f32, + /// The gap between a tab header's edges and its content along the bar's + /// main axis. Read through [`TabStyle::padding_horizontal`]. pub padding_horizontal: f32, pub underline_active: f32, pub underline_hover: f32, @@ -76,7 +79,6 @@ impl TabRecipe { pub fn for_tokens(tokens: &InputTokens) -> Self { Self { editor_height: dp(TAB_EDITOR_HEIGHT, TargetRole::Target, tokens), - tool_window_height: dp(TAB_TOOL_WINDOW_HEIGHT, TargetRole::Target, tokens), padding_horizontal: spacing(TAB_PADDING_HORIZONTAL, tokens), underline_active: TAB_UNDERLINE_ACTIVE, underline_hover: TAB_UNDERLINE_HOVER, @@ -178,6 +180,58 @@ impl TabStyle for RecipeTabStyle { content: cfg.content, }) } + + /// This style's own tab height, so a preset's header (macOS's 26 dp + /// `NSTabView` strip, Fluent's 32 dp `TabViewItem`) is the one a bar lays + /// out. `tokens` is unused: the recipe was already resolved against a + /// density when the style was made (`for_tokens`, or a preset's own + /// factory), and a second projection would apply the ladder twice. + fn editor_height(&self, _tokens: &InputTokens) -> f32 { + self.recipe.editor_height + } + + /// This style's own header padding. See + /// [`editor_height`](Self::editor_height) for why `tokens` is unused. + fn padding_horizontal(&self, _tokens: &InputTokens) -> f32 { + self.recipe.padding_horizontal + } +} + +/// The `TabStyle` a `TabBar` and its headers build against: the bar's +/// per-call `.style(..)` if it has one, else the theme-wide `style_slots.tab` +/// an app or a preset installed, else this module's default resolved against +/// the active density. +/// +/// Shared by the bar and every header it hosts, so the strip height the bar +/// reserves and the height each header measures come from one style. +pub(crate) fn resolve_tab_style( + style_override: Option<&SharedTabStyle>, + ctx: &BuildContext, +) -> SharedTabStyle { + style_override + .cloned() + .or_else(|| ctx.theme().style_slots.tab.clone()) + .unwrap_or_else(|| { + std::rc::Rc::new(RecipeTabStyle::for_tokens(&ctx.theme().input)) as SharedTabStyle + }) +} + +/// The tab height `style` declares at `tokens`, or the shipped recipe's when +/// no style has been resolved yet (a header measured before its first build). +pub(crate) fn tab_editor_height(style: Option<&SharedTabStyle>, tokens: &InputTokens) -> f32 { + match style { + Some(style) => style.editor_height(tokens), + None => TabRecipe::for_tokens(tokens).editor_height, + } +} + +/// The header padding `style` declares at `tokens`, or the shipped recipe's +/// when no style has been resolved yet. +pub(crate) fn tab_padding_horizontal(style: Option<&SharedTabStyle>, tokens: &InputTokens) -> f32 { + match style { + Some(style) => style.padding_horizontal(tokens), + None => TabRecipe::for_tokens(tokens).padding_horizontal, + } } /// Bar-chrome container produced by [`RecipeTabStyle::make_bar`]. diff --git a/crates/teksilo-widgets/src/tab_widget.rs b/crates/teksilo-widgets/src/tab_widget.rs index a3c366b81..c5d5e7908 100644 --- a/crates/teksilo-widgets/src/tab_widget.rs +++ b/crates/teksilo-widgets/src/tab_widget.rs @@ -247,7 +247,7 @@ pub struct TabWidget { // Bar configuration — forwarded to the inner TabBar. /// Optional tab-strip height override (the strip's cross-axis extent). - /// `None` keeps the style's `editor_tab_height`. Set via + /// `None` keeps the style's `editor_height`. Set via /// [`Self::tab_bar_height`] / [`Self::compact_bar`]. tab_bar_height: Option, /// Reactive sizing strategy. `None` until `.tab_sizing(...)` @@ -444,7 +444,7 @@ impl TabWidget { } /// Override the tab-strip height (its cross-axis extent). `None` / - /// unset keeps the style's `editor_tab_height` (50 dp). Use for a denser + /// unset keeps the style's `editor_height` (50 dp under Int UI). Use for a denser /// strip — e.g. dock side panels. pub fn tab_bar_height(mut self, dp: f32) -> Self { self.tab_bar_height = Some(dp.max(0.0)); diff --git a/crates/teksilo-widgets/src/tab_widget/bar.rs b/crates/teksilo-widgets/src/tab_widget/bar.rs index 3712a951e..d1ea3d928 100644 --- a/crates/teksilo-widgets/src/tab_widget/bar.rs +++ b/crates/teksilo-widgets/src/tab_widget/bar.rs @@ -663,7 +663,7 @@ impl TabBar { /// cross-axis width, so the same knob defines the bar's minimum /// width — the sidebar adapts to the widest piece of bar content /// (tab labels or a slot widget) and never shrinks below this floor. - /// Vertical pill heights stay at the tab style's `editor_tab_height` + /// Vertical pill heights stay at the tab style's `editor_height` /// regardless of this knob. /// /// Under [`TabSizing::Fill`] a **vertical** bar takes the width it is @@ -677,7 +677,7 @@ impl TabBar { /// Override the tab-strip cross-axis extent (the strip height for a /// horizontal bar; the per-tab pill height for a vertical one). `None` - /// keeps the style's `editor_tab_height`. Use for a compact bar. + /// keeps the style's `editor_height`. Use for a compact bar. pub fn tab_bar_height(mut self, dp: f32) -> Self { self.tab_height = Some(dp.max(0.0)); self @@ -1539,16 +1539,24 @@ impl Widget for TabBar { // headers reserve. Snapshot the theme values up front — we // don't want to hold a borrow on `ctx` while later code // mutates the arena. + // + // The active `TabStyle`: per-call override > theme slot > + // built-in `RecipeTabStyle`. Resolved here, once, because the + // strip height below, the header row's per-tab extent and the + // bar chrome further down all come from it; each header resolves + // the same style from the same override and theme. + let tab_style = + crate::styles::recipe_tab_style::resolve_tab_style(self.style_override.as_ref(), ctx); let (header_min_height, motion_duration_normal, motion_easing_standard) = { let theme = ctx.theme(); - // `editor_tab_height` is the outer bounds height of a - // tab header — the focus-ring envelope is reserved - // inside (see `TabHeader::intrinsic_height`), so the - // bar's preferred row height is exactly the token (or the - // `tab_bar_height` override for a compact strip). + // The style's `editor_height` is the outer bounds height of + // a tab header (the focus-ring envelope is reserved inside, + // see `TabHeader::intrinsic_height`), so the bar's preferred + // row height is exactly the style's (or the `tab_bar_height` + // override for a compact strip). ( self.tab_height - .unwrap_or(crate::styles::recipe_tab_style::TAB_EDITOR_HEIGHT), + .unwrap_or_else(|| tab_style.editor_height(&theme.input)), theme.motion.duration_normal, theme.motion.easing_standard, ) @@ -1579,6 +1587,7 @@ impl Widget for TabBar { max_extent: self.max_tab_width, spacing: self.spacing, tab_height: self.tab_height, + style: RowTabStyle(tab_style.clone()), header_bounds_buf: header_bounds_buf.clone(), row_bounds_buf: row_bounds_buf.clone(), divider: divider_prop.clone().map(|c| (c, self.spacing)), @@ -1801,20 +1810,11 @@ impl Widget for TabBar { } }; self.outer_stack_id = Some(root_id); - // Resolve the active `TabStyle` and let it wrap the bar + // Let the active `TabStyle` (resolved above) wrap the bar // content with the strip chrome — backdrop fill, content-pane - // separator, drag-reorder drop indicator. Per-call override > - // theme slot > built-in `RecipeTabStyle`. This replaces the + // separator, drag-reorder drop indicator. This replaces the // old `TabBar::paint`: the bar is now pure composition. - let style: teksilo_core::styles::SharedTabStyle = self - .style_override - .clone() - .or_else(|| ctx.theme().style_slots.tab.clone()) - .unwrap_or_else(|| { - Rc::new(crate::styles::RecipeTabStyle::for_tokens( - &ctx.theme().input, - )) - }); + let style = tab_style; let chrome_cfg = teksilo_core::styles::TabBarChromeConfig { content: root_id, orientation: self.orientation.into(), @@ -2224,6 +2224,17 @@ impl Widget for TabBar { // ─── Internal: the headers row / column ───────────────────────────── +/// The bar's resolved `TabStyle`, held by [`TabHeaderRow`]. A newtype only +/// so the row can keep deriving `Debug`, which `dyn TabStyle` does not +/// implement. +struct RowTabStyle(teksilo_core::styles::SharedTabStyle); + +impl std::fmt::Debug for RowTabStyle { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str("RowTabStyle(..)") + } +} + /// The headers run — a horizontal row in [`TabBarOrientation::Horizontal`] /// mode, a vertical column in [`TabBarOrientation::Vertical`] mode. /// Owns the `Shared`/`Independent` sizing math and exposes per-tab @@ -2236,15 +2247,18 @@ struct TabHeaderRow { /// Min extent, in whichever sense the axis gives it: the per-tab /// width for a horizontal bar, and the *bar's own* minimum width /// for a vertical one (vertical pill extents come from the style's - /// `editor_tab_height`, never from this knob). Reuses the bar's + /// `editor_height`, never from this knob). Reuses the bar's /// `min_tab_width` in both cases. min_extent: f32, max_extent: f32, spacing: f32, /// Optional per-tab extent override along the bar's cross axis (the tab /// strip height for a horizontal bar; the per-tab pill height for a - /// vertical one). `None` → the style's `editor_tab_height`. + /// vertical one). `None` → the style's `editor_height`. tab_height: Option, + /// The bar's resolved `TabStyle`, asked for the per-tab extent when + /// `tab_height` is `None`. + style: RowTabStyle, /// Per-tab bounds in world coords, populated by `place_children`. /// Shared with the bar's drop handlers via `Rc>`; /// the bar reads this to compute drop-insertion position for an @@ -2268,10 +2282,10 @@ struct TabHeaderRow { impl TabHeaderRow { /// The per-tab cross-axis extent: the explicit override (compact bars) or - /// the style's `editor_tab_height`. + /// the style's `editor_height`. fn tab_extent(&self, ctx: &LayoutContext) -> f32 { self.tab_height - .unwrap_or_else(|| TabHeader::intrinsic_height(ctx)) + .unwrap_or_else(|| self.style.0.editor_height(&ctx.theme.input)) } fn compute_extents(&self, viewport_main: Option, ctx: &LayoutContext) -> Vec { @@ -2306,7 +2320,7 @@ impl TabHeaderRow { // tab bands, which neither Firefox / Chrome // (no native vertical mode) nor VS Code / // IntelliJ do. Use the intrinsic per-tab - // height (`editor_tab_height`) so vertical + // height (`editor_height`) so vertical // tabs match horizontal tabs in size. `Fill` // is no different here: in a vertical bar it // stretches the pill *width* (see @@ -2451,7 +2465,7 @@ impl Widget for TabHeaderRow { match self.axis { TabBarOrientation::Horizontal => { // Cap the row's height at one tab header's intrinsic - // height (= `editor_tab_height`). If the surrounding + // height (= `editor_height`). If the surrounding // outer HStack proposes a taller height because a // sibling (toolbar button, dropdown trigger) wants // more room, the row should NOT stretch — it would diff --git a/crates/teksilo-widgets/src/tab_widget/delegate.rs b/crates/teksilo-widgets/src/tab_widget/delegate.rs index 8a452ec76..7b468c443 100644 --- a/crates/teksilo-widgets/src/tab_widget/delegate.rs +++ b/crates/teksilo-widgets/src/tab_widget/delegate.rs @@ -103,7 +103,7 @@ pub enum TabSizing { /// - **Vertical:** every pill takes the bar's full proposed width /// (the widest-label clamp is bypassed), so the tabs span the /// sidebar. Pill height is unchanged (the intrinsic - /// `editor_tab_height`, or the `tab_bar_height` override). + /// `editor_height`, or the `tab_bar_height` override). /// /// With no width proposed at all (an unbounded measure — a /// `Center`, an `HStack` asking for the natural size), there is diff --git a/crates/teksilo-widgets/src/tab_widget/header.rs b/crates/teksilo-widgets/src/tab_widget/header.rs index 14c09ac14..443b3c5fb 100644 --- a/crates/teksilo-widgets/src/tab_widget/header.rs +++ b/crates/teksilo-widgets/src/tab_widget/header.rs @@ -12,10 +12,14 @@ //! row forces a width (Shared-sizing path). When the parent leaves //! width unspecified, the header reports its natural content width //! clamped to `[min_tab_width, max_tab_width]` (Independent path). -//! - Height is the tab style's `editor_tab_height` — the **outer** -//! measurement, with the focus-ring envelope reserved *inside* it -//! rather than added on top — and the row's place_children -//! uniforms the height across all headers. +//! - Height is the tab style's +//! [`editor_height`](teksilo_core::styles::TabStyle::editor_height), the +//! **outer** measurement, with the focus-ring envelope reserved *inside* +//! it rather than added on top, and the row's place_children uniforms +//! the height across all headers. The content sits +//! [`padding_horizontal`](teksilo_core::styles::TabStyle::padding_horizontal) +//! in from both main-axis edges. Both come from the style the header +//! built its chrome with. //! //! Paint contract (Int UI / IntelliJ): //! - Selected: `text_primary` label, 2 dp accent bar at the top @@ -259,6 +263,10 @@ pub(crate) struct TabHeader { /// `.style(impl TabStyle)` builder. `None` means "use the theme /// slot or the bundled `RecipeTabStyle`". pub(crate) style_override: Option, + /// The style this header was built with, kept so `layout_response` asks + /// the same style for its height and padding that built its chrome. + /// `None` until the first build, when the shipped recipe stands in. + resolved_style: Option, inner_root_id: Option, } @@ -359,6 +367,7 @@ impl TabHeader { idle_text_role: cfg.idle_text_role, active_indicator: cfg.active_indicator, style_override: cfg.style_override, + resolved_style: None, inner_root_id: None, } } @@ -378,7 +387,10 @@ impl TabHeader { } fn estimate_natural_width(&self, ctx: &LayoutContext) -> f32 { - let pad_h = crate::styles::recipe_tab_style::TAB_PADDING_HORIZONTAL; + let pad_h = crate::styles::recipe_tab_style::tab_padding_horizontal( + self.resolved_style.as_ref(), + &ctx.theme.input, + ); use crate::styles::recipe_button_style as btn; // Icon-only: a square-ish tab — the glyph + horizontal padding only (no @@ -446,15 +458,16 @@ impl TabHeader { content.max(natural_min_width(&ctx.theme.input)) } - pub(crate) fn intrinsic_height(_ctx: &LayoutContext) -> f32 { - // `editor_tab_height` is the **outer** measurement (the + fn intrinsic_height(&self, ctx: &LayoutContext) -> f32 { + // The style's `editor_height` is the **outer** measurement (the // total bounds height of one tab header). The focus-ring - // envelope is reserved *inside* this — not added on top — - // so the tab strip sits at exactly the token's value - // regardless of focus-ring tokens. The visible pill rect - // inside the bounds is `editor_tab_height - envelope*2`, - // which `place_children` and `paint` shrink to. - crate::styles::recipe_tab_style::TAB_EDITOR_HEIGHT + // envelope is reserved *inside* this, not added on top, so the + // tab strip sits at exactly the style's value regardless of + // focus-ring tokens. + crate::styles::recipe_tab_style::tab_editor_height( + self.resolved_style.as_ref(), + &ctx.theme.input, + ) } } @@ -645,7 +658,14 @@ impl Widget for TabHeader { // The tab sizes to `icon + 2·pad_h`, so the lone icon fills the padded // box exactly and the symmetric padding centres it (no extra `Center` // wrapper — that layer broke the icon's paint). - let pad_h = crate::styles::recipe_tab_style::TAB_PADDING_HORIZONTAL; + // Resolve the active style: per-call override > theme slot > + // built-in `RecipeTabStyle` default. Resolved before the padding, + // which is the style's, and parked so `layout_response` measures + // the header with the style that builds its chrome below. + let style: SharedTabStyle = + crate::styles::recipe_tab_style::resolve_tab_style(self.style_override.as_ref(), ctx); + self.resolved_style = Some(style.clone()); + let pad_h = style.padding_horizontal(&ctx.theme().input); let inner_id = if self.pinned { let centered = crate::primitives::Center::new().child(row); let padded = crate::Padding::symmetric(header_padding_v(&ctx.theme().input), 0.0) @@ -683,21 +703,10 @@ impl Widget for TabHeader { } }; - // Resolve the active style: per-call override > theme slot > - // built-in `RecipeTabStyle` default. The style wraps `inner_id` - // with the accent indicator + focus ring chrome; the - // per-state tab background (which the trait config doesn't - // carry through) stays as a RectWidget sibling underneath. - let style: SharedTabStyle = self - .style_override - .clone() - .or_else(|| ctx.theme().style_slots.tab.clone()) - .unwrap_or_else(|| { - Rc::new(crate::styles::RecipeTabStyle::for_tokens( - &ctx.theme().input, - )) - }); - + // The style resolved above wraps `inner_id` with the accent + // indicator + focus ring chrome; the per-state tab background + // (which the trait config doesn't carry through) stays as a + // RectWidget sibling underneath. let cfg = TabStyleConfig { label: inner_id, leading: None, @@ -1151,7 +1160,7 @@ impl Widget for TabHeader { fn layout_response(&self, proposal: SizeProposal, ctx: &LayoutContext) -> LayoutResponse { let height = proposal .height - .unwrap_or_else(|| Self::intrinsic_height(ctx)); + .unwrap_or_else(|| self.intrinsic_height(ctx)); // Pinned tabs are always rendered at exactly `min_width` // (the bar's `pinned_tab_width`), regardless of any width // proposal — they're icon-only squares and shouldn't stretch. diff --git a/crates/teksilo-widgets/src/tab_widget/tests.rs b/crates/teksilo-widgets/src/tab_widget/tests.rs index fa02b23e4..769ff07fd 100644 --- a/crates/teksilo-widgets/src/tab_widget/tests.rs +++ b/crates/teksilo-widgets/src/tab_widget/tests.rs @@ -1960,12 +1960,12 @@ fn vertical_shared_sizing_uses_intrinsic_pill_height() { ); } // Vertical Shared does NOT divide the viewport — sidebar pills - // stay at the intrinsic per-tab height (`editor_tab_height`) + // stay at the intrinsic per-tab height (`editor_height`) // regardless of bar height. A 800 dp bar with 4 tabs gives 4 // pills of ~50 dp each, not 4 × ~200 dp bands. assert!( (target - intrinsic).abs() < 0.5, - "expected ~{intrinsic} dp per tab (editor_tab_height), got {target}" + "expected ~{intrinsic} dp per tab (editor_height), got {target}" ); } @@ -3309,3 +3309,205 @@ fn the_content_of_the_tab_on_show_reaches_a_screen_reader() { "the button inside it: {found:?}" ); } + +// ─── The tab style's height and padding reach the layout ───────────── + +/// A tab style declaring a 37 dp tab and a 30 dp header padding, numbers no +/// shipped constant carries, so a header that still read a constant would be +/// told apart. +fn tall_padded_tab_style() -> crate::styles::RecipeTabStyle { + crate::styles::RecipeTabStyle::new(crate::styles::TabRecipe { + editor_height: 37.0, + padding_horizontal: 30.0, + ..crate::styles::TabRecipe::default() + }) +} + +fn two_tab_model() -> ListModel { + ListModel::from_vec(vec![ + TabHandle::dynamic( + TabId::fresh(), + "doc", + TabInfo::new().title(label("Documents")), + (), + ), + TabHandle::dynamic( + TabId::fresh(), + "doc", + TabInfo::new().title(label("Downloads")), + (), + ), + ]) +} + +fn title_delegate() -> TabDelegate { + TabDelegate::new(|_, h: &TabHandle| h.info.title.clone().unwrap_or_else(|| label(""))) +} + +/// `(bar height, per-header (width, height))` of a horizontal, independently +/// sized two-tab bar laid out at its natural height under `theme`, with +/// `style` as its per-call style when given. +fn horizontal_bar_geometry( + theme: teksilo_core::styles::Theme, + style: Option, + tab_bar_height: Option, +) -> (f32, Vec<(f32, f32)>) { + let selected: Signal> = Signal::new(None); + let mut bar = TabBar::horizontal(two_tab_model(), title_delegate(), selected, |_, h| h.id) + .tab_sizing(TabSizing::Independent) + .tab_spacing(0.0) + .show_scroll_arrows(false) + .show_overflow_dropdown(false); + if let Some(style) = style { + bar = bar.style(style); + } + if let Some(h) = tab_bar_height { + bar = bar.tab_bar_height(h); + } + let mut tree = WidgetTree::new().with_theme(theme); + let bar_id = tree.add(bar); + tree.layout(SizeProposal { + width: Some(600.0), + height: None, + }); + let row = data_source_header_row(&tree, bar_id); + let headers = tree + .children(row) + .into_iter() + .map(|h| { + let b = tree.bounds(h); + (b.width, b.height) + }) + .collect(); + (tree.bounds(bar_id).height, headers) +} + +/// A bar with no tab height of its own lays out the height its style +/// declares, and each header pads its content by the style's padding: a +/// "Documents" header measures 9 × 8 dp of mock text, one 6 dp gap before the +/// trailing spacer and twice the padding. +#[test] +fn a_tab_style_sets_the_strip_height_and_the_header_padding() { + let theme = teksilo_core::presets::intui::light(); + + let (bar_h, headers) = horizontal_bar_geometry(theme.clone(), None, None); + assert!( + (bar_h - 50.0).abs() < 0.5, + "Int UI strip is 50 dp, got {bar_h}" + ); + for (w, h) in &headers { + assert!((h - 50.0).abs() < 0.5, "Int UI tab is 50 dp, got {h}"); + assert!((w - (72.0 + 6.0 + 24.0)).abs() < 0.5, "got {w}"); + } + + let (bar_h, headers) = horizontal_bar_geometry(theme, Some(tall_padded_tab_style()), None); + assert!((bar_h - 37.0).abs() < 0.5, "the style's strip, got {bar_h}"); + assert_eq!(headers.len(), 2); + for (w, h) in &headers { + assert!((h - 37.0).abs() < 0.5, "the style's tab height, got {h}"); + assert!( + (w - (72.0 + 6.0 + 60.0)).abs() < 0.5, + "the style's padding, got {w}" + ); + } +} + +/// `tab_bar_height(..)` is the app's, and it still wins over the style's. +#[test] +fn a_bars_own_tab_height_wins_over_its_styles() { + let (bar_h, headers) = horizontal_bar_geometry( + teksilo_core::presets::intui::light(), + Some(tall_padded_tab_style()), + Some(44.0), + ); + assert!((bar_h - 44.0).abs() < 0.5, "got {bar_h}"); + for (_, h) in &headers { + assert!((h - 44.0).abs() < 0.5, "got {h}"); + } +} + +/// A vertical bar's pills take the style's tab height too. +#[test] +fn a_vertical_bars_pills_take_the_styles_tab_height() { + let selected: Signal> = Signal::new(None); + let mut tree = WidgetTree::new().with_theme(teksilo_core::presets::intui::light()); + let bar_id = tree.add( + TabBar::vertical(two_tab_model(), title_delegate(), selected, |_, h| h.id) + .tab_sizing(TabSizing::Shared) + .tab_spacing(0.0) + .show_scroll_arrows(false) + .show_overflow_dropdown(false) + .style(tall_padded_tab_style()), + ); + tree.layout(SizeProposal::exact(200.0, 800.0)); + let row = data_source_header_row(&tree, bar_id); + let heights: Vec = tree + .children(row) + .iter() + .map(|&h| tree.bounds(h).height) + .collect(); + assert_eq!(heights.len(), 2); + for h in &heights { + assert!((h - 37.0).abs() < 0.5, "got {heights:?}"); + } +} + +/// A `TabWidget` reaches its style through the theme slot: the bar it hosts +/// lays out the slot's tab height. +#[test] +fn a_tab_widget_takes_its_tab_height_from_the_theme_slot() { + let mut theme = teksilo_core::presets::intui::light(); + theme.style_slots.tab = Some(Rc::new(tall_padded_tab_style())); + let selected: Signal> = Signal::new(None); + let mut tree = WidgetTree::new().with_theme(theme); + let widget_id = tree.add( + TabWidget::new(selected) + .static_tab(TabInfo::new().title(label("A")), FixedLeaf(120.0, 48.0)) + .static_tab(TabInfo::new().title(label("B")), FixedLeaf(120.0, 48.0)) + .show_scroll_arrows(false) + .show_overflow_dropdown(false), + ); + tree.layout(SizeProposal::exact(800.0, 600.0)); + + fn tab_heights(tree: &WidgetTree, id: WidgetId, out: &mut Vec) { + if tree + .widget_type_name(id) + .is_some_and(|t| t.rsplit("::").next() == Some("TabHeader")) + { + out.push(tree.bounds(id).height); + } + for c in tree.children(id) { + tab_heights(tree, c, out); + } + } + let mut heights = Vec::new(); + tab_heights(&tree, widget_id, &mut heights); + assert_eq!(heights.len(), 2, "two tab headers"); + for h in &heights { + assert!((h - 37.0).abs() < 0.5, "got {heights:?}"); + } +} + +/// The shipped recipe's header padding follows the density ladder (12 / 13.8 +/// / 15.6 dp), and so does the inner gap, while the 50 dp tab clears every +/// target already: a "Documents" header measures `72 + gap + 2 · padding`. +#[test] +fn the_int_ui_header_padding_follows_the_density_ladder() { + use teksilo_tokens::TargetDensity; + let expected = [ + (TargetDensity::Compact, 72.0 + 6.0 + 24.0), + (TargetDensity::Comfortable, 72.0 + 6.9 + 27.6), + (TargetDensity::Touch, 72.0 + 7.8 + 31.2), + ]; + for (density, width) in expected { + let theme = teksilo_core::presets::intui::light().with_density(density); + let (bar_h, headers) = horizontal_bar_geometry(theme, None, None); + assert!((bar_h - 50.0).abs() < 0.5, "{density:?}: got {bar_h}"); + for (w, _) in &headers { + assert!( + (w - width).abs() < 0.01, + "{density:?}: got {w}, want {width}" + ); + } + } +} diff --git a/crates/teksilo-widgets/tests/density_projection.rs b/crates/teksilo-widgets/tests/density_projection.rs index f7476b47e..2993ffe8a 100644 --- a/crates/teksilo-widgets/tests/density_projection.rs +++ b/crates/teksilo-widgets/tests/density_projection.rs @@ -491,10 +491,11 @@ fn every_fixed_row_says_it_is_fixed() { // 5. The style traits' metric defaults restate the module constants // ─────────────────────────────────────────────────────────────────────────── // -// Four style traits carry a defaulted metrics accessor for a dimension the +// Five style traits carry a defaulted metrics accessor for a dimension the // widget composes itself and the trait's `make_*` hooks never see: a table // cell's gutter, a calendar nav arrow's footprint, a search suggestion row's -// gutter, a list row's height floor, a table's row and header heights. Each +// gutter, a list row's height floor, a table's row and header heights, a +// tab's height and its header padding. Each // default is the module constant put through the same helper `for_tokens` // uses, restated as a literal because `teksilo-core` sits below // `teksilo-widgets` and cannot name the constant. A literal in one crate and a @@ -703,6 +704,63 @@ fn the_standard_item_trait_defaults_restate_the_module_constants() { } } +/// The `TabStyle` height and padding defaults equal +/// `recipe_tab_style::TAB_EDITOR_HEIGHT` and `TAB_PADDING_HORIZONTAL` at every +/// density. +#[test] +fn the_tab_trait_defaults_restate_the_module_constants() { + use teksilo_core::styles::TabStyle; + use teksilo_widgets::styles::recipe_tab_style as tab; + + /// A `TabStyle` that overrides nothing but its two `make_*` hooks. + struct BareTabStyle; + impl TabStyle for BareTabStyle { + fn make_body( + &self, + cfg: &teksilo_core::styles::TabStyleConfig, + _ctx: &mut teksilo_core::BuildContext, + ) -> teksilo_core::WidgetId { + cfg.label + } + fn make_bar( + &self, + cfg: &teksilo_core::styles::TabBarChromeConfig, + _ctx: &mut teksilo_core::BuildContext, + ) -> teksilo_core::WidgetId { + cfg.content + } + } + + for t in [compact(), comfortable(), touch()] { + assert_eq!( + BareTabStyle.editor_height(&t), + dp(tab::TAB_EDITOR_HEIGHT, TargetRole::Target, &t), + "the TabStyle default drifted from TAB_EDITOR_HEIGHT", + ); + assert_eq!( + BareTabStyle.padding_horizontal(&t), + spacing(tab::TAB_PADDING_HORIZONTAL, &t), + "the TabStyle default drifted from TAB_PADDING_HORIZONTAL", + ); + // And the shipped recipe at that density agrees with the default, so + // an out-of-tree style and the shipped one lay out the same tabs. + let shipped = RecipeTabStyle::for_tokens(&t); + assert_eq!(shipped.editor_height(&t), BareTabStyle.editor_height(&t)); + assert_eq!( + shipped.padding_horizontal(&t), + BareTabStyle.padding_horizontal(&t) + ); + } + // At Compact the defaults are the module constants themselves, so a + // Compact bar lays out exactly what it did before the accessors existed. + let t = compact(); + assert_eq!(BareTabStyle.editor_height(&t), tab::TAB_EDITOR_HEIGHT); + assert_eq!( + BareTabStyle.padding_horizontal(&t), + tab::TAB_PADDING_HORIZONTAL + ); +} + /// The shipped `Recipe*Style` answers from *its own recipe*, not from the /// trait default — which is the half of the mechanism that lets a preset's /// number reach the screen at all. @@ -712,7 +770,9 @@ fn the_standard_item_trait_defaults_restate_the_module_constants() { /// constant carries. #[test] fn a_recipe_style_answers_from_its_own_recipe() { - use teksilo_core::styles::{CalendarStyle, SearchFieldStyle, StandardItemStyle, TableStyle}; + use teksilo_core::styles::{ + CalendarStyle, SearchFieldStyle, StandardItemStyle, TabStyle, TableStyle, + }; let t = compact(); @@ -740,6 +800,14 @@ fn a_recipe_style_answers_from_its_own_recipe() { assert_eq!(table.row_height(&t), 23.0); assert_eq!(table.header_height(&t), 27.0); + let tab = RecipeTabStyle::new(TabRecipe { + editor_height: 31.0, + padding_horizontal: 9.0, + ..TabRecipe::for_tokens(&t) + }); + assert_eq!(tab.editor_height(&t), 31.0); + assert_eq!(tab.padding_horizontal(&t), 9.0); + let calendar = RecipeCalendarStyle::new(CalendarRecipe { nav_arrow_size: 20.0, ..CalendarRecipe::for_tokens(&t) diff --git a/docs/tab-widget.md b/docs/tab-widget.md index 7f785dfb8..a204faebd 100644 --- a/docs/tab-widget.md +++ b/docs/tab-widget.md @@ -329,7 +329,7 @@ pub enum TabSizing { | Orientation | "Layout axis" | Default | Meaning | |--------------|---------------|---------------|-------------------------------------------------------------------| | `Horizontal` | width | `Shared` | Uniform tab widths (Firefox / Chrome convention). | -| `Vertical` | height | `Shared` | Uniform pill heights, fixed at `editor_tab_height`. | +| `Vertical` | height | `Shared` | Uniform pill heights, fixed at the style's `editor_height`. | Pinned tabs are **always fixed-extent** (`pinned_tab_width`) regardless of `TabSizing`, that's what "pinned" means visually. @@ -353,8 +353,8 @@ The two orientations apply Shared sizing differently: wheel remap, dropdown engage normally). - **Vertical does NOT divide the viewport.** Sidebar pills stay at - the intrinsic per-tab height (`TAB_EDITOR_HEIGHT`, default 50 dp) - regardless of how tall the bar is. A 800 dp bar with + the intrinsic per-tab height (the tab style's `editor_height`, 50 dp + under Int UI) regardless of how tall the bar is. A 800 dp bar with 4 tabs gives 4 pills of 50 dp at the top, not 4 × 200 dp bands. This matches VS Code, IntelliJ tool-window tabs, and the user expectation of sidebar tabs being short pills. The `min_tab_width` @@ -907,14 +907,24 @@ editor-strip convention); `idle_text_role` defaults to the default cascade reads with insufficient contrast. Disabled tabs always render at `TextRole::Disabled`. -Static numbers are `pub const`s in +The tab geometry comes from the active `TabStyle`, through two +defaulted accessors a bar and its headers read at layout time: + +- `TabStyle::editor_height(tokens)`, the outer height of one tab: the + strip height of a horizontal bar and the pill height of a vertical one. + Int UI's `RecipeTabStyle` answers `TAB_EDITOR_HEIGHT` (50 dp at every + density); the macOS preset answers 26 dp and the Fluent preset 32 dp at + the compact density, both raised to the density's target size above it. + `TabWidget::tab_bar_height(dp)` / `compact_bar()` (38 dp) override it. +- `TabStyle::padding_horizontal(tokens)`, the gap between a tab's edges + and its content along the bar. Int UI answers `TAB_PADDING_HORIZONTAL` + (12 dp at the compact density, scaled by the spacing factor above it); + Fluent answers 8 dp. Pinned tabs centre their icon and ignore it. + +A custom `impl TabStyle` that overrides neither gets the Int UI numbers. +The remaining static number is a `pub const` in [`recipe_tab_style`](../crates/teksilo-widgets/src/styles/recipe_tab_style.rs): -- `TAB_EDITOR_HEIGHT` (default 50 dp), height of horizontal bar tabs. -- `TAB_TOOL_WINDOW_HEIGHT` (default 28 dp), reserved for future - tool-window tab variant; not currently consumed by vertical bars. - `TabWidget::tab_bar_height(dp)` / `compact_bar()` (38 dp) override the - 50 dp strip height instead. - `TAB_UNDERLINE_ACTIVE` (default 2 dp), thickness of the selection indicator. The indicator's color comes from `theme.colors.accent`. @@ -975,10 +985,8 @@ TabWidget::new(selected) hit the existing `ScrollDelta::Pixels` path with `Easing::EaseOut` animation; touch flicks would need `ScrollArea` ↔ `SwipeRecognizer` wiring, ~150 LOC, separate task) -- `TabRecipe::tool_window_height` (`TAB_TOOL_WINDOW_HEIGHT`, 28 dp) is - reserved on the default `RecipeTabStyle` but not yet consumed by - vertical bars, they currently pick up the editor-tab height - (`TAB_EDITOR_HEIGHT`) like horizontal bars +- a separate tool-window tab height: vertical bars use the same + `editor_height` as horizontal ones --- diff --git a/docs/widgets/bar.md b/docs/widgets/bar.md index 70260635e..cfa0410ae 100644 --- a/docs/widgets/bar.md +++ b/docs/widgets/bar.md @@ -350,7 +350,7 @@ In **vertical** orientation every tab is forced to the bar's cross-axis width, so the same knob defines the bar's minimum width — the sidebar adapts to the widest piece of bar content (tab labels or a slot widget) and never shrinks below this floor. -Vertical pill heights stay at the tab style's `editor_tab_height` +Vertical pill heights stay at the tab style's `editor_height` regardless of this knob. Under `TabSizing::Fill` a **vertical** bar takes the width it is @@ -364,7 +364,7 @@ scroll rather than squeeze below it). Override the tab-strip cross-axis extent (the strip height for a horizontal bar; the per-tab pill height for a vertical one). `None` -keeps the style's `editor_tab_height`. Use for a compact bar. +keeps the style's `editor_height`. Use for a compact bar. diff --git a/docs/widgets/tab_widget.md b/docs/widgets/tab_widget.md index e5c7d1e16..3a464bbb1 100644 --- a/docs/widgets/tab_widget.md +++ b/docs/widgets/tab_widget.md @@ -291,7 +291,7 @@ resolves through to the mutable roots and never calls `observe`. #### `pub fn tab_bar_height(mut self, dp: f32) -> Self` Override the tab-strip height (its cross-axis extent). `None` / -unset keeps the style's `editor_tab_height` (50 dp). Use for a denser +unset keeps the style's `editor_height` (50 dp under Int UI). Use for a denser strip — e.g. dock side panels. diff --git a/engineering/docs/density-inventory.md b/engineering/docs/density-inventory.md index 7f462403a..4f6c3a191 100644 --- a/engineering/docs/density-inventory.md +++ b/engineering/docs/density-inventory.md @@ -396,7 +396,7 @@ alone. | `recipe_split_button_style.rs` | *(none — see §2.1)* | 0 | | `recipe_splitter_style.rs` | `SPLITTER_DIVIDER_LINE_THICKNESS`, `HOVER_DWELL_DELAY_FRAC` | 2 | | `recipe_standard_item_style.rs` | `STANDARD_ITEM_ICON_SIZE`, `STANDARD_ITEM_SUBTITLE_ICON_SIZE`, `STANDARD_ITEM_SLOT_GAP`, `STANDARD_ITEM_SUBTITLE_SLOT_GAP`, `STANDARD_ITEM_LABEL_SUBTITLE_GAP`, `STANDARD_ITEM_PADDING_HORIZONTAL`, `STANDARD_ITEM_PADDING_VERTICAL`, `STANDARD_ITEM_MIN_HEIGHT_SINGLE_LINE`, `STANDARD_ITEM_MIN_HEIGHT_TWO_LINE`, `STANDARD_ITEM_LABEL_COLUMN_MIN_WIDTH`, `STANDARD_ITEM_CHEVRON_COLUMN_WIDTH`, `STANDARD_ITEM_TREE_INDENT_STEP`, `STANDARD_ITEM_ITEM_CORNER_RADIUS`, `STANDARD_ITEM_BG_HORIZONTAL_INSET`, `STANDARD_ITEM_FOCUS_RING_WIDTH`, `STANDARD_ITEM_SELECTION_EDGE_WIDTH` | 16 | -| `recipe_tab_style.rs` | `TAB_EDITOR_HEIGHT`, `TAB_TOOL_WINDOW_HEIGHT`, `TAB_PADDING_HORIZONTAL`, `TAB_UNDERLINE_ACTIVE`, `TAB_UNDERLINE_HOVER`, `TAB_CLOSE_BUTTON_SIZE`, `DROP_INDICATOR_WIDTH` | 7 | +| `recipe_tab_style.rs` | `TAB_EDITOR_HEIGHT`, `TAB_TOOL_WINDOW_HEIGHT` (**deleted**, see §2.2), `TAB_PADDING_HORIZONTAL`, `TAB_UNDERLINE_ACTIVE`, `TAB_UNDERLINE_HOVER`, `TAB_CLOSE_BUTTON_SIZE`, `DROP_INDICATOR_WIDTH` | 7 | | `recipe_table_style.rs` | `ROW_HEIGHT`, `HEADER_HEIGHT`, `CELL_PADDING_HORIZONTAL`, `CELL_PADDING_VERTICAL`, `RESIZE_HANDLE_WIDTH`, `COLUMN_RESIZE_STEP`, `GRID_LINE_THICKNESS`, `CORNER_RADIUS`, `SORT_INDICATOR_SIZE`, `FILTER_INDICATOR_SIZE`, `HEADER_INTER_CELL_SPACING`, `FOCUS_RING_INSET`, `MIN_COLUMN_WIDTH_DEFAULT`, `TREE_INDENT_PER_LEVEL`, `TREE_TWIST_SIZE`, `TREE_TWIST_LABEL_GAP` | 16 | | `recipe_text_input_style.rs` | `TEXT_FIELD_HEIGHT`, `TEXT_FIELD_PADDING_HORIZONTAL`, `TEXT_FIELD_PADDING_VERTICAL`, `TEXT_FIELD_BORDER_WIDTH`, `TEXT_FIELD_CORNER_RADIUS`, `TEXT_FIELD_CARET_WIDTH`, `TEXT_FIELD_VALIDATION_STRIP_GAP` | 7 | | `recipe_toast_style.rs` | `TOAST_PADDING_HORIZONTAL`, `TOAST_PADDING_VERTICAL`, `TOAST_CORNER_RADIUS`, `TOAST_GLYPH_SIZE`, `TOAST_CONTENT_GAP`, `TOAST_TITLE_BODY_GAP`, `TOAST_BODY_ACTIONS_GAP` | 7 | @@ -596,7 +596,7 @@ Five recipes carry no dimension constant of their own: | `crates/teksilo-widgets/src/styles/recipe_standard_item_style.rs` | 47 | `STANDARD_ITEM_FOCUS_RING_WIDTH` | `1.5` | Decoration | fixed — decorative geometry, no hit consequence | | `crates/teksilo-widgets/src/styles/recipe_standard_item_style.rs` | 54 | `STANDARD_ITEM_SELECTION_EDGE_WIDTH` | `1.0` | Decoration | fixed — decorative geometry, no hit consequence | | `crates/teksilo-widgets/src/styles/recipe_tab_style.rs` | 45 | `TAB_EDITOR_HEIGHT` | `50.0` | Target | scales with `target_size` — `TabRecipe::for_tokens` | -| `crates/teksilo-widgets/src/styles/recipe_tab_style.rs` | 46 | `TAB_TOOL_WINDOW_HEIGHT` | `28.0` | Target | scales with `target_size` — `TabRecipe::for_tokens` | +| `crates/teksilo-widgets/src/styles/recipe_tab_style.rs` | 46 | `TAB_TOOL_WINDOW_HEIGHT` | `28.0` | Target | **deleted**, with `TabRecipe::tool_window_height`: nothing read either, and no tab strip has a tool-window height to give them | | `crates/teksilo-widgets/src/styles/recipe_tab_style.rs` | 47 | `TAB_PADDING_HORIZONTAL` | `12.0` | Spacing | scales with `spacing_factor` — `TabRecipe::for_tokens` | | `crates/teksilo-widgets/src/styles/recipe_tab_style.rs` | 48 | `TAB_UNDERLINE_ACTIVE` | `2.0` | Decoration | fixed — decorative geometry, no hit consequence | | `crates/teksilo-widgets/src/styles/recipe_tab_style.rs` | 49 | `TAB_UNDERLINE_HOVER` | `2.0` | Decoration | fixed — decorative geometry, no hit consequence | diff --git a/engineering/docs/density-projection-gaps.md b/engineering/docs/density-projection-gaps.md index 770a96298..b868f9cb5 100644 --- a/engineering/docs/density-projection-gaps.md +++ b/engineering/docs/density-projection-gaps.md @@ -8,7 +8,7 @@ struct, and `for_tokens(&InputTokens)` projects each one onto the active density — `dp` for a target, `spacing` for a gap, `density_min_size` for a minimum box. A theme preset then builds that same struct with its own numbers. -**Forty-five of those projected fields have no reader.** The widget composes the +**Forty-two of those projected fields have no reader.** The widget composes the dimension from the raw `pub const` in the recipe's module instead, so the projected field is written by `for_tokens`, written again by every preset, and consulted by nothing. Retuning one changes nothing on screen. @@ -47,12 +47,12 @@ and is therefore inside the scope; the rule finds both its projected fields read | | | |---|---| -| projected fields in scope | 103 | -| of those, unread by the rule | 47 | +| projected fields in scope | 102 | +| of those, unread by the rule | 44 | | false positives of the rule (§4) | 2 | -| **real gap** | **45** | +| **real gap** | **42** | | of which inert even if wired (§1) | 10 | -| of which a shipped preset already sets a different value (§2) | 10 | +| of which a shipped preset already sets a different value (§2) | 7 | | of which a preset sets the same value the constant carries (§3a) | 3 | | of which density only, no preset (§3b) | 22 | @@ -62,16 +62,19 @@ those cost a test failure would discourage the one change it invites: the tables are the record, the guard keeps their *membership* honest, and the arithmetic is a snapshot of the day it was taken. -Nine further fields were on this list until a metrics accessor wired them, +Eleven further fields were on this list until a metrics accessor wired them, and they are the worked examples for what wiring one looks like: `TableRecipe::cell_padding_horizontal` / `cell_padding_vertical` (`TableStyle`), `CalendarRecipe::nav_arrow_size` (`CalendarStyle`), `SearchFieldRecipe::row_padding_horizontal` / `row_padding_vertical` (`SearchFieldStyle`), `StandardItemRecipe::min_height_single_line` / -`min_height_two_line` (`StandardItemStyle`) and `TableRecipe::row_height` / -`header_height` (`TableStyle`): a defaulted metrics accessor on +`min_height_two_line` (`StandardItemStyle`), `TableRecipe::row_height` / +`header_height` (`TableStyle`) and `TabRecipe::editor_height` / +`padding_horizontal` (`TabStyle`): a defaulted metrics accessor on the style trait, defaulted so an out-of-tree style keeps compiling, overridden by the `Recipe*Style` from its own recipe so a preset's number takes effect. +A twelfth, `TabRecipe::tool_window_height`, was deleted instead: neither it nor +its constant had a reader, and no tab strip has a tool-window height to give it. **A verdict of "safe to wire" means the mechanism is available and the change is local.** It never means the resulting dimension is right: a preset's number @@ -112,7 +115,7 @@ unwired one. ## 2. A shipped preset already sets a different value -The ten that cost something today. Each is written by Fluent or macOS with +The seven that cost something today. Each is written by Fluent or macOS with a number chosen for that design language, and each renders the IntUI constant instead. The **renders** column is what a user sees under any theme. @@ -125,18 +128,12 @@ instead. The **renders** column is what a user sees under any theme. | `SegmentedControlRecipe` | `height` | 24 | 32 | 22 | `segmented_control.rs` → `layout_response` | | `SegmentedControlRecipe` | `padding_horizontal` | 12 | — | 10 | `segmented_control.rs` → `layout_response`; `segmented_control/cell.rs` → `layout_response` | | `SegmentedControlRecipe` | `padding_vertical` | 6 | — | 3 | `segmented_control.rs` → `layout_response` | -| `TabRecipe` | `editor_height` | 50 | 32 | 26 | `tab_widget/bar.rs` → `build`; `tab_widget/header.rs` → `intrinsic_height` | -| `TabRecipe` | `padding_horizontal` | 12 | 8 | 12 | `tab_widget/header.rs` → `build`, `estimate_natural_width` | -| `TabRecipe` | `tool_window_height` | 28 | 32 | 22 | none — see below | Ladders, for the ones whose density projection also moves (Compact / Comfortable / Touch): `cell_size` 32/32/44, `CalendarRecipe::header_height` 28/32/44, `min_thumb_length` 24/32/44, `SearchFieldRecipe::row_height` 26/32/44, `SegmentedControlRecipe::height` 24/32/44 and `padding_horizontal` 12/13.8/15.6 -and `padding_vertical` 6/6.9/7.8, `TabRecipe::padding_horizontal` -12/13.8/15.6, `tool_window_height` 28/32/44. -`TabRecipe::editor_height` (50) is flat: its cost is the preset alone, not the -density. +and `padding_vertical` 6/6.9/7.8. ### Verdicts @@ -152,14 +149,10 @@ the segmented control's `layout_response` and its overflow planner compute cell extents from these three together, and the planner is also fed by `measure_intrinsic` on dormant cells. Wiring them means threading the style into the planner, not just into a `Padding`. -`TabRecipe::editor_height` / `padding_horizontal`: the tab bar's header widths -come from `estimate_natural_width`, which runs before a style is resolved in the -bar's own build; the seam has to be chosen before the numbers can move. **Needs care — nothing applies the dimension at all.** -`CalendarRecipe::header_height` and `TabRecipe::tool_window_height`: their -constants have no reader either, so the calendar's header row and the -tool-window tab strip take their height from their content. Wiring the field is +`CalendarRecipe::header_height`: its constant has no reader either, so the +calendar's header row takes its height from its content. Wiring the field is therefore not "read the style instead of the constant" but "give this row a fixed height", which is a design decision and not a mechanical one. @@ -234,9 +227,9 @@ to — moving it at Touch changes what a drag can do, not only what is painted, so it wants a resize test rather than a layout one. **Nothing to wire.** `DateEditRecipe::calendar_button_width` and `segment_gap`, -`SearchFieldRecipe::input_panel_gap`: like the two in §2, their constants have -no reader either. The dimension is not applied anywhere, so there is nothing to -route through a style. +`SearchFieldRecipe::input_panel_gap`: like `CalendarRecipe::header_height` in +§2, their constants have no reader either. The dimension is not applied +anywhere, so there is nothing to route through a style. ## 4. The rule's false positives From 26aed9e02dd93a55590fafd4d745b9c0bd8d8fb7 Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 08:39:18 +0200 Subject: [PATCH 09/59] feat(styles): render the ScrollBarRecipe minimum thumb length ScrollBar::build resolved its style and then recomputed the thumb floor from scroll_bar::SCROLLBAR_MIN_THUMB_LENGTH (24) put through dp(), whatever the active ScrollBarStyle declared, so the macOS (28 dp) and Fluent (30 dp, WinUI's ScrollBarHorizontalThumbMinWidth) floors were written on the recipe and never rendered. ScrollBarStyle gains one defaulted metrics accessor, min_thumb_length, taking the density's InputTokens. The default is the module constant put through dp() as a target, which is exactly what the shipped RecipeScrollBarStyle answers at every density and exactly today's 24 dp at Compact; the_scroll_bar_trait_default_restates_the_module_constant pins it, and also pins the recipe module's constant equal to the widget module's (the floor a bar uses before its first build). RecipeScrollBarStyle answers from its recipe. No config struct gains a field: ScrollBarStyleConfig::min_thumb_length already carried the resolved floor to make_body. The bar now asks the style it resolved for the floor (an app's min_thumb_length(..) still wins) and stores it where its geometry helpers and event closures read it, so the painted thumb, the hit test, the drag and the reported target region all use the style's number. The macOS and Fluent floors were already raised to the density's target size, so only Compact moves: macOS 24 -> 28, Fluent 24 -> 30; both are 32 at Comfortable and 44 at Touch, as Int UI is. Tests: macOS and Fluent preset_metrics mount a long document's bar (viewport ratio 0.02) at every density and assert the reported thumb length (macOS 28/32/44, Fluent 30/32/44), with Int UI (24/32/44) as the control, plus the installed slot's accessor. scroll_bar touch tests cover a style declaring a 37 dp floor reaching both the config and the mounted thumb at every density, per call and from the theme slot, an explicit floor winning over the style, and a style floor longer than the track clamped to it. density_projection pins the default and checks the recipe style answers from its own recipe. density-projection-gaps.md loses the ScrollBarRecipe row from section 2: unread 44 -> 43, real gap 42 -> 41, section 2 seven -> six; the projected total (102) the guard pins is unchanged. docs/scroll-area.md describes the accessor; the scroll_bar catalog page is regenerated. Conformance census re-run: totals unchanged (477; output identical to the run with the old floor), and no ALLOW_LIST entry moved. No fixture bar's thumb sits at its floor at Compact, and the one scroll-bar row (the macOS table track remainder, 11.5 dp) is unaffected. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 11 ++ .../src/styles/scroll_bar_style.rs | 39 +++- .../tests/preset_metrics.rs | 75 ++++++++ .../tests/preset_metrics.rs | 75 ++++++++ crates/teksilo-widgets/src/scroll_bar.rs | 170 +++++++++++++++--- .../src/styles/recipe_scroll_bar_style.rs | 22 ++- .../tests/density_projection.rs | 60 ++++++- docs/scroll-area.md | 9 + docs/widgets/scroll_bar.md | 29 ++- engineering/docs/density-projection-gaps.md | 34 ++-- 10 files changed, 457 insertions(+), 67 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a2b97513..ce3275728 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,9 @@ by crate for clarity, not because crates version independently. tall a `TabBar` or `TabWidget` tab is and how far its title sits from the tab's edges at the active density. Both have defaults, so an existing style keeps Int UI's 50 px tabs. +- **`ScrollBarStyle::min_thumb_length`.** A scroll-bar style says how short a + `ScrollBar` thumb may get on a long document at the active density. It has + a default, so an existing style keeps the shipped floor. ### Removed @@ -111,6 +114,14 @@ by crate for clarity, not because crates version independently. with 12 px of padding whatever the theme. Under Int UI tabs stay 50 px tall, and their padding now grows with the density: 13.8 px at the comfortable density and 15.6 px at the touch density, so tabs there are wider. +- **Scroll-bar thumbs are as long as the active style says.** + **Behaviour change:** on a long document, a `ScrollBar` (and every scroll + bar a `ScrollArea`, a list, a table or a text editor shows) with no + `min_thumb_length` of its own now keeps its thumb at the minimum length its + style declares: 28 px under the macOS preset and 30 px under Fluent at the + compact density. Before, every thumb was held at 24 px whatever the theme. + Above the compact density nothing changes: the floor is 32 px at the + comfortable density and 44 px at the touch density under every theme. - **Accent chrome a recipe builds follows the high-contrast preference.** **Behaviour change:** under the OS increase contrast preference, a `Filled` button's fill and a button's focus border now take the high-contrast diff --git a/crates/teksilo-core/src/styles/scroll_bar_style.rs b/crates/teksilo-core/src/styles/scroll_bar_style.rs index 3633ca190..a1a8f1814 100644 --- a/crates/teksilo-core/src/styles/scroll_bar_style.rs +++ b/crates/teksilo-core/src/styles/scroll_bar_style.rs @@ -2,13 +2,20 @@ // SPDX-FileCopyrightText: 2026 FernTech //! Tier-3 style protocol for `ScrollBar`. See `docs/styling-system.md`. +//! +//! One defaulted metrics accessor, [`ScrollBarStyle::min_thumb_length`], says +//! how short the thumb may get. The bar sizes its thumb, and decides whether a +//! press lands on it, from that one number, so a preset's floor is the one laid +//! out. use std::rc::Rc; use serde::{Deserialize, Serialize}; +use teksilo_tokens::{InputTokens, TargetRole}; use crate::build_context::BuildContext; use crate::signal::Signal; +use crate::styles::density::dp; use crate::widget_id::WidgetId; #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Default, Serialize, Deserialize)] @@ -53,9 +60,11 @@ pub struct ScrollBarStyleConfig { pub is_idle: Signal, pub orientation: ScrollBarOrientation, pub variant: ScrollBarVariant, - /// Minimum thumb length in logical pixels. Sourced from - /// `teksilo_widgets::styles::recipe_scroll_bar_style` constants by - /// default; apps override per-instance via `ScrollBar::min_thumb_length(...)`. + /// Minimum thumb length in logical pixels: the active style's + /// [`ScrollBarStyle::min_thumb_length`] at the tree's density, unless the + /// app named one per instance via `ScrollBar::min_thumb_length(...)`. The + /// widget resolves it before `make_body` runs and sizes its own thumb + /// geometry (hit test, drag, reported target) from the same value. pub min_thumb_length: f32, /// Optional thumb tint override (`ScrollBar::thumb_color` / /// `ScrollArea::scroll_bar_thumb_color`). `None` (the default) means the @@ -86,6 +95,30 @@ pub trait ScrollBarStyle: 'static { /// an RTL locale — the same obligation /// [`SliderStyle::make_body`](super::SliderStyle::make_body) carries. fn make_body(&self, cfg: &ScrollBarStyleConfig, ctx: &mut BuildContext) -> WidgetId; + + /// The shortest the thumb may get along the scroll axis, in logical + /// pixels, at the density `tokens` describe. A long document's thumb is + /// held at this length rather than shrinking with the viewport ratio, so it + /// stays something a pointer can land on. + /// + /// A metrics accessor because the bar, not the chrome, owns the thumb's + /// geometry: its hit test, its drag and the target it reports all need the + /// floor outside `make_body`. The widget resolves it once per build and + /// hands the answer to `make_body` as + /// [`ScrollBarStyleConfig::min_thumb_length`]. A bar's own + /// `min_thumb_length(..)` wins over it. + /// + /// **Defaulted**, so a `ScrollBarStyle` implemented outside this workspace + /// keeps compiling. The default is + /// `teksilo_widgets::styles::recipe_scroll_bar_style::SCROLLBAR_MIN_THUMB_LENGTH` + /// put through [`dp`] as a target (24 at Compact, 32 at Comfortable, 44 at + /// Touch), which is the shipped recipe's own answer at every density, + /// restated as a literal because `teksilo-core` cannot name a + /// `teksilo-widgets` constant, and pinned equal to it by + /// `the_scroll_bar_trait_default_restates_the_module_constant`. + fn min_thumb_length(&self, tokens: &InputTokens) -> f32 { + dp(24.0, TargetRole::Target, tokens) + } } pub type SharedScrollBarStyle = Rc; diff --git a/crates/teksilo-theme-fluent/tests/preset_metrics.rs b/crates/teksilo-theme-fluent/tests/preset_metrics.rs index 20bd7d976..4beb32ed7 100644 --- a/crates/teksilo-theme-fluent/tests/preset_metrics.rs +++ b/crates/teksilo-theme-fluent/tests/preset_metrics.rs @@ -424,3 +424,78 @@ fn a_tab_bar_measures_the_fluent_tab_height_and_padding_at_every_density() { assert!((slot.padding_horizontal(&theme.input) - fluent.2).abs() < 1e-3); } } + +// ── ScrollBar minimum thumb length ───────────────────────────────────── + +/// The laid-out thumb length of a vertical `ScrollBar` over a 400 dp track +/// built at `density` under `theme`, with no floor of its own. The content is +/// fifty viewports long (viewport ratio 0.02), so the unfloored thumb would be +/// 8 dp and the length measured is the floor alone. Read from the mounted bar's +/// reported thumb, which is the rectangle its hit test and its drag use. +/// +/// Built *at* the density, never switched into it: a bar reads its style's +/// floor when it builds. +fn scroll_thumb_length(theme: &Theme, density: TargetDensity) -> f32 { + use teksilo_core::signal::Signal; + use teksilo_widgets::scroll_bar::{SCROLLBAR_PART_THUMB, ScrollBar, ScrollBarOrientation}; + + let mut tree = WidgetTree::new() + .with_theme(theme.with_density(density)) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))); + let bar = tree.add( + ScrollBar::new( + ScrollBarOrientation::Vertical, + Signal::new(0.0), + Signal::new(500.0), + Signal::new(0.02), + ) + .thickness(12.0), + ); + tree.layout(SizeProposal::exact(12.0, 400.0)); + tree.widget_target_regions(bar) + .into_iter() + .find(|r| r.part == SCROLLBAR_PART_THUMB) + .expect("the bar reports its thumb") + .rect + .height +} + +/// WinUI's `ScrollBarHorizontalThumbMinWidth` is 30 dp in the Fluent recipe, +/// and a laid-out bar must measure it. The bar used to recompute the shipped +/// 24 dp floor whatever the style declared, so every Fluent thumb on a long +/// document rendered 6 dp shorter than its recipe. +/// +/// Above Compact the 30 rises to the density's target size (32 at +/// Comfortable, 44 at Touch). The IntUI arm is the control: its 24 dp floor +/// walks the same ladder. +#[test] +fn a_scroll_bar_floors_its_thumb_at_the_fluent_minimum_at_every_density() { + let expected = [ + (TargetDensity::Compact, 30.0, 24.0), + (TargetDensity::Comfortable, 32.0, 32.0), + (TargetDensity::Touch, 44.0, 44.0), + ]; + for (density, preset, intui) in expected { + let got = scroll_thumb_length(&teksilo_core::presets::intui::light(), density); + assert!( + (got - intui).abs() < 1e-3, + "{density:?}: IntUI thumb {got}, want {intui}", + ); + for theme in [teksilo_theme_fluent::light(), teksilo_theme_fluent::dark()] { + let got = scroll_thumb_length(&theme, density); + assert!( + (got - preset).abs() < 1e-3, + "{density:?}: the Fluent recipe's thumb floor must reach the bar: \ + {got}, want {preset}", + ); + } + // The accessor half: what the installed slot tells a bar asking it. + let theme = teksilo_theme_fluent::light().with_density(density); + let slot = theme + .style_slots + .scroll_bar + .clone() + .expect("the preset installs a scroll bar slot"); + assert!((slot.min_thumb_length(&theme.input) - preset).abs() < 1e-3); + } +} diff --git a/crates/teksilo-theme-macos/tests/preset_metrics.rs b/crates/teksilo-theme-macos/tests/preset_metrics.rs index 33f8be115..3357cc5d8 100644 --- a/crates/teksilo-theme-macos/tests/preset_metrics.rs +++ b/crates/teksilo-theme-macos/tests/preset_metrics.rs @@ -892,3 +892,78 @@ fn a_tab_bar_measures_the_macos_tab_height_and_padding_at_every_density() { assert!((slot.padding_horizontal(&theme.input) - macos.2).abs() < 1e-3); } } + +// ── ScrollBar minimum thumb length ───────────────────────────────────── + +/// The laid-out thumb length of a vertical `ScrollBar` over a 400 dp track +/// built at `density` under `theme`, with no floor of its own. The content is +/// fifty viewports long (viewport ratio 0.02), so the unfloored thumb would be +/// 8 dp and the length measured is the floor alone. Read from the mounted bar's +/// reported thumb, which is the rectangle its hit test and its drag use. +/// +/// Built *at* the density, never switched into it: a bar reads its style's +/// floor when it builds. +fn scroll_thumb_length(theme: &Theme, density: TargetDensity) -> f32 { + use teksilo_core::signal::Signal; + use teksilo_widgets::scroll_bar::{SCROLLBAR_PART_THUMB, ScrollBar, ScrollBarOrientation}; + + let mut tree = WidgetTree::new() + .with_theme(theme.with_density(density)) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))); + let bar = tree.add( + ScrollBar::new( + ScrollBarOrientation::Vertical, + Signal::new(0.0), + Signal::new(500.0), + Signal::new(0.02), + ) + .thickness(12.0), + ); + tree.layout(SizeProposal::exact(12.0, 400.0)); + tree.widget_target_regions(bar) + .into_iter() + .find(|r| r.part == SCROLLBAR_PART_THUMB) + .expect("the bar reports its thumb") + .rect + .height +} + +/// The macOS recipe floors a scroller's thumb at 28 dp, and a laid-out bar +/// must measure it. The bar used to recompute the shipped 24 dp floor whatever +/// the style declared, so every macOS thumb on a long document rendered 4 dp +/// shorter than its recipe. +/// +/// Above Compact the 28 rises to the density's target size (32 at +/// Comfortable, 44 at Touch). The IntUI arm is the control: its 24 dp floor +/// walks the same ladder. +#[test] +fn a_scroll_bar_floors_its_thumb_at_the_macos_minimum_at_every_density() { + let expected = [ + (TargetDensity::Compact, 28.0, 24.0), + (TargetDensity::Comfortable, 32.0, 32.0), + (TargetDensity::Touch, 44.0, 44.0), + ]; + for (density, preset, intui) in expected { + let got = scroll_thumb_length(&teksilo_core::presets::intui::light(), density); + assert!( + (got - intui).abs() < 1e-3, + "{density:?}: IntUI thumb {got}, want {intui}", + ); + for theme in [teksilo_theme_macos::light(), teksilo_theme_macos::dark()] { + let got = scroll_thumb_length(&theme, density); + assert!( + (got - preset).abs() < 1e-3, + "{density:?}: the macOS recipe's thumb floor must reach the bar: \ + {got}, want {preset}", + ); + } + // The accessor half: what the installed slot tells a bar asking it. + let theme = teksilo_theme_macos::light().with_density(density); + let slot = theme + .style_slots + .scroll_bar + .clone() + .expect("the preset installs a scroll bar slot"); + assert!((slot.min_thumb_length(&theme.input) - preset).abs() < 1e-3); + } +} diff --git a/crates/teksilo-widgets/src/scroll_bar.rs b/crates/teksilo-widgets/src/scroll_bar.rs index a466d0abe..9d9577418 100644 --- a/crates/teksilo-widgets/src/scroll_bar.rs +++ b/crates/teksilo-widgets/src/scroll_bar.rs @@ -30,8 +30,10 @@ //! about whether a press is on the thumb is taken **along the axis only** — a //! finger 15 dp inboard of an 8 dp bar is beside the thumb, not past it. //! -//! The minimum thumb length follows the density (24 dp Compact, 44 dp Touch), -//! so a short thumb on a long document is still something a finger can land on. +//! The minimum thumb length is the active style's +//! [`ScrollBarStyle::min_thumb_length`], which follows the density (24 dp +//! Compact, 44 dp Touch under the shipped style), so a short thumb on a long +//! document is still something a finger can land on. //! //! ## Accessibility //! @@ -65,12 +67,11 @@ use teksilo_core::event::{EventResponse, PointerButton, WidgetEvent}; use teksilo_core::gesture::DragPhase; use teksilo_core::partition::TargetRegion; use teksilo_core::signal::Signal; -use teksilo_core::styles::density::dp; use teksilo_core::styles::{ScrollBarStyle, ScrollBarStyleConfig, SharedScrollBarStyle}; use teksilo_core::widget::{LayoutContext, LayoutResponse, Widget, WidgetPlacement}; use teksilo_core::widget_builder::HandlerSet; use teksilo_core::widget_id::WidgetId; -use teksilo_tokens::{RevealPolicy, TargetRole}; +use teksilo_tokens::RevealPolicy; use crate::common::range_nav::{self, RangeAxis, RangeKind, RangeMove}; @@ -89,9 +90,16 @@ pub use teksilo_core::styles::ScrollBarVariant as ScrollBarVisual; /// [`Widget::hit_outset`], which moves nothing and repaints nothing. pub const SCROLLBAR_COARSE_TARGET: f32 = 48.0; -/// The shipped minimum thumb length, at Compact. Raised to the density's -/// `target_size` (44 dp at Touch) at build time; a -/// [`min_thumb_length`](ScrollBar::min_thumb_length) override wins over both. +/// The shipped minimum thumb length, at Compact. +/// +/// A bar takes its floor from the active style's +/// [`ScrollBarStyle::min_thumb_length`] at build time: the shipped style and +/// the trait default both answer this value raised to the density's +/// `target_size` (32 dp at Comfortable, 44 dp at Touch), and a preset answers +/// its own (28 dp under macOS, 30 dp under Fluent, at Compact). Before its +/// first build a bar uses this value. A +/// [`min_thumb_length`](ScrollBar::min_thumb_length) override wins over all of +/// them. pub const SCROLLBAR_MIN_THUMB_LENGTH: f32 = 24.0; /// Which part of the bar a [`TargetRegion`] describes. @@ -140,10 +148,11 @@ pub struct ScrollBar { // --- visual tuning --- /// Thickness of the scroll bar (width for vertical, height for horizontal). thickness: f32, - /// Minimum thumb length in pixels, or `None` to follow the density. + /// Minimum thumb length in pixels, or `None` to follow the active style. min_thumb_length: Option, - /// The density floor [`Self::min_thumb_length`] falls back to, resolved at - /// the last `build`. Shared with the event closures and read by the + /// The style's floor [`Self::min_thumb_length`] falls back to, resolved at + /// the last `build` from [`ScrollBarStyle::min_thumb_length`] at the tree's + /// density. Shared with the event closures and read by the /// geometry helpers, which run outside a build and have no tokens in scope. /// An explicit floor does not go through it — it is known from the moment /// it is set, so the geometry is right before the first build too. @@ -219,11 +228,13 @@ impl ScrollBar { self } - /// Set the minimum thumb length in pixels, overriding the density. + /// Set the minimum thumb length in pixels, overriding the active style. /// - /// Left unset the floor is [`SCROLLBAR_MIN_THUMB_LENGTH`] raised to the - /// density's target size — 24 dp at Compact, 44 dp at Touch — so a short - /// thumb on a long document stays something a finger can land on. + /// Left unset the floor is the active style's + /// [`ScrollBarStyle::min_thumb_length`] at the tree's density: under the + /// shipped style [`SCROLLBAR_MIN_THUMB_LENGTH`] raised to the density's + /// target size (24 dp at Compact, 44 dp at Touch), so a short thumb on a + /// long document stays something a finger can land on. pub fn min_thumb_length(mut self, len: f32) -> Self { self.min_thumb_length = Some(len); self @@ -349,18 +360,14 @@ impl Widget for ScrollBar { )) }); - // The minimum thumb length follows the density unless the caller named - // one. 24 dp at Compact is exactly today's constant, so `dp` here - // raises nothing at the density CI runs at — the P20 rule that a - // dimension may go through `dp` only when its Compact value already - // clears the conformance floor, which 24 dp does by being it. - let min_thumb_length = self.min_thumb_length.unwrap_or_else(|| { - dp( - SCROLLBAR_MIN_THUMB_LENGTH, - TargetRole::Target, - &ctx.theme().input, - ) - }); + // The minimum thumb length is the one the resolved style declares at + // the tree's density, unless the caller named one. The same number + // sizes the painted thumb (through the config) and this widget's own + // thumb geometry (hit test, drag, reported target), so the thumb drawn + // and the thumb a press lands on cannot disagree. + let min_thumb_length = self + .min_thumb_length + .unwrap_or_else(|| style.min_thumb_length(&ctx.theme().input)); self.resolved_min_thumb_length.set(min_thumb_length); // A density that reveals every affordance (Touch) shows the bar without @@ -1521,7 +1528,7 @@ mod touch_tests { use teksilo_core::event::{Modifiers, WidgetEvent}; use teksilo_core::widget::{LayoutContext, Widget}; use teksilo_core::widget_tree::WidgetTree; - use teksilo_tokens::{InputTokens, PenKind, PointerKind, TargetDensity}; + use teksilo_tokens::{InputTokens, PenKind, PointerKind, TargetDensity, TargetRole}; /// A 12 dp vertical bar over 400 dp of track, content twice the viewport — /// so the thumb is half the track and starts at the top. @@ -1784,6 +1791,115 @@ mod touch_tests { assert_eq!(thumb.rect.height, 44.0); } + /// A style that declares its own floor, records the floor `make_body` was + /// handed, and paints nothing. + struct FloorStyle { + floor: f32, + seen: std::rc::Rc>, + } + + impl ScrollBarStyle for FloorStyle { + fn make_body( + &self, + cfg: &ScrollBarStyleConfig, + ctx: &mut teksilo_core::build_context::BuildContext, + ) -> WidgetId { + self.seen.set(cfg.min_thumb_length); + ctx.add(crate::primitives::Spacer::new()) + } + + fn min_thumb_length(&self, _tokens: &InputTokens) -> f32 { + self.floor + } + } + + /// A long document's bar (viewport ratio 0.02, so the unfloored thumb is + /// 8 dp of a 400 dp track) mounted at `density`, with `style` installed + /// either per call or in the theme slot, and an optional explicit floor. + /// Returns the floor `make_body` saw and the height of the thumb the + /// mounted bar reports, which is the rectangle its hit test and drag use. + fn floor_and_thumb( + density: TargetDensity, + floor: f32, + in_theme_slot: bool, + explicit: Option, + ) -> (f32, f32) { + let seen = Rc::new(Cell::new(f32::NAN)); + let style = FloorStyle { + floor, + seen: seen.clone(), + }; + let mut bar = ScrollBar::new( + ScrollBarOrientation::Vertical, + Signal::new(0.0), + Signal::new(500.0), + Signal::new(0.02), + ); + let mut theme = teksilo_core::presets::intui::light().with_density(density); + if in_theme_slot { + theme.style_slots.scroll_bar = Some(Rc::new(style)); + } else { + bar = bar.style(style); + } + if let Some(explicit) = explicit { + bar = bar.min_thumb_length(explicit); + } + let mut tree = WidgetTree::new().with_theme(theme); + let id = tree.add(bar); + tree.layout(SizeProposal::exact(12.0, 400.0)); + let thumb = tree + .widget_target_regions(id) + .into_iter() + .find(|r| r.part == SCROLLBAR_PART_THUMB) + .expect("the thumb is reported"); + (seen.get(), thumb.rect.height) + } + + /// The floor is the one the active style declares, per call or from the + /// theme slot, at every density: the style's answer reaches the painters + /// through the config and the bar's own thumb geometry alike. A style that + /// declares 37 dp gets a 37 dp thumb, where the bar used to recompute the + /// shipped 24 dp ladder whatever the style said. + #[test] + fn the_minimum_thumb_is_the_one_the_style_declares() { + for density in [ + TargetDensity::Compact, + TargetDensity::Comfortable, + TargetDensity::Touch, + ] { + for in_theme_slot in [false, true] { + assert_eq!( + floor_and_thumb(density, 37.0, in_theme_slot, None), + (37.0, 37.0), + "{density:?}, theme slot: {in_theme_slot}", + ); + } + } + } + + /// An app's own floor still wins over the style's, in the config and in + /// the geometry. + #[test] + fn an_explicit_minimum_thumb_wins_over_the_style() { + assert_eq!( + floor_and_thumb(TargetDensity::Compact, 37.0, false, Some(60.0)), + (60.0, 60.0), + ); + assert_eq!( + floor_and_thumb(TargetDensity::Touch, 37.0, true, Some(20.0)), + (20.0, 20.0), + ); + } + + /// The floor still never makes the thumb longer than its track. + #[test] + fn a_style_floor_longer_than_the_track_is_clamped_to_it() { + assert_eq!( + floor_and_thumb(TargetDensity::Compact, 900.0, false, None), + (900.0, 400.0), + ); + } + // -- grabbing and paging ---------------------------------------------- /// A press inside the thumb's own paint rectangle grabs it. The bar is diff --git a/crates/teksilo-widgets/src/styles/recipe_scroll_bar_style.rs b/crates/teksilo-widgets/src/styles/recipe_scroll_bar_style.rs index 14453d367..68638d3b8 100644 --- a/crates/teksilo-widgets/src/styles/recipe_scroll_bar_style.rs +++ b/crates/teksilo-widgets/src/styles/recipe_scroll_bar_style.rs @@ -90,14 +90,13 @@ fn resolve_thumb_color( pub struct ScrollBarRecipe { pub thickness_idle: f32, pub thickness_hover: f32, - /// The density-resolved floor a thumb may not be shorter than. + /// The density-resolved floor a thumb may not be shorter than. Read + /// through [`ScrollBarStyle::min_thumb_length`]. /// - /// The **widget** decides the number the painters actually use — it resolves - /// the same `dp(SCROLLBAR_MIN_THUMB_LENGTH, Target, ..)` unless the caller - /// named a floor of their own, and passes the answer down as - /// `ScrollBarStyleConfig::min_thumb_length`. This field is the same value, - /// kept here so a custom style building its own painters has it in hand - /// without reaching for the tokens again. + /// The **widget** decides the number the painters actually use: it asks + /// the active style for this floor unless the caller named one of their + /// own, sizes its thumb geometry from the answer, and passes the same + /// answer down as `ScrollBarStyleConfig::min_thumb_length`. pub min_thumb_length: f32, pub corner_radius: f32, } @@ -251,6 +250,15 @@ impl ScrollBarStyle for RecipeScrollBarStyle { } } } + + /// This style's own thumb floor, so a preset's (macOS's 28 dp, Fluent's + /// 30 dp `ScrollBarHorizontalThumbMinWidth`) is the one a bar lays out. + /// `tokens` is unused: the recipe was already resolved against a density + /// when the style was made (`for_tokens`, or a preset's own factory), and + /// a second projection would apply the ladder twice. + fn min_thumb_length(&self, _tokens: &InputTokens) -> f32 { + self.recipe.min_thumb_length + } } /// Paints the thin resting indicator. Used as the only body in `Thin` diff --git a/crates/teksilo-widgets/tests/density_projection.rs b/crates/teksilo-widgets/tests/density_projection.rs index 2993ffe8a..870b3ed56 100644 --- a/crates/teksilo-widgets/tests/density_projection.rs +++ b/crates/teksilo-widgets/tests/density_projection.rs @@ -491,11 +491,12 @@ fn every_fixed_row_says_it_is_fixed() { // 5. The style traits' metric defaults restate the module constants // ─────────────────────────────────────────────────────────────────────────── // -// Five style traits carry a defaulted metrics accessor for a dimension the +// Six style traits carry a defaulted metrics accessor for a dimension the // widget composes itself and the trait's `make_*` hooks never see: a table // cell's gutter, a calendar nav arrow's footprint, a search suggestion row's // gutter, a list row's height floor, a table's row and header heights, a -// tab's height and its header padding. Each +// tab's height and its header padding, a scroll-bar thumb's minimum length. +// Each // default is the module constant put through the same helper `for_tokens` // uses, restated as a literal because `teksilo-core` sits below // `teksilo-widgets` and cannot name the constant. A literal in one crate and a @@ -761,6 +762,53 @@ fn the_tab_trait_defaults_restate_the_module_constants() { ); } +/// The `ScrollBarStyle` thumb-floor default equals +/// `recipe_scroll_bar_style::SCROLLBAR_MIN_THUMB_LENGTH`, and the widget's own +/// `scroll_bar::SCROLLBAR_MIN_THUMB_LENGTH` (the floor before a first build), +/// at every density. +#[test] +fn the_scroll_bar_trait_default_restates_the_module_constant() { + use teksilo_core::styles::ScrollBarStyle; + use teksilo_widgets::styles::recipe_scroll_bar_style as bar; + + /// A `ScrollBarStyle` that overrides nothing but its `make_body` hook. + struct BareScrollBarStyle; + impl ScrollBarStyle for BareScrollBarStyle { + fn make_body( + &self, + _cfg: &teksilo_core::styles::ScrollBarStyleConfig, + ctx: &mut teksilo_core::BuildContext, + ) -> teksilo_core::WidgetId { + ctx.add(teksilo_widgets::primitives::Spacer::new()) + } + } + + assert_eq!( + bar::SCROLLBAR_MIN_THUMB_LENGTH, + teksilo_widgets::scroll_bar::SCROLLBAR_MIN_THUMB_LENGTH, + "the recipe's constant and the widget's pre-build floor drifted apart", + ); + for t in [compact(), comfortable(), touch()] { + assert_eq!( + BareScrollBarStyle.min_thumb_length(&t), + dp(bar::SCROLLBAR_MIN_THUMB_LENGTH, TargetRole::Target, &t), + "the ScrollBarStyle default drifted from SCROLLBAR_MIN_THUMB_LENGTH", + ); + // And the shipped recipe at that density agrees with the default, so + // an out-of-tree style and the shipped one floor the same thumb. + assert_eq!( + RecipeScrollBarStyle::for_tokens(&t).min_thumb_length(&t), + BareScrollBarStyle.min_thumb_length(&t), + ); + } + // At Compact the default is the module constant itself, so a Compact bar + // floors its thumb exactly where it did before the accessor existed. + assert_eq!( + BareScrollBarStyle.min_thumb_length(&compact()), + bar::SCROLLBAR_MIN_THUMB_LENGTH + ); +} + /// The shipped `Recipe*Style` answers from *its own recipe*, not from the /// trait default — which is the half of the mechanism that lets a preset's /// number reach the screen at all. @@ -771,7 +819,7 @@ fn the_tab_trait_defaults_restate_the_module_constants() { #[test] fn a_recipe_style_answers_from_its_own_recipe() { use teksilo_core::styles::{ - CalendarStyle, SearchFieldStyle, StandardItemStyle, TabStyle, TableStyle, + CalendarStyle, ScrollBarStyle, SearchFieldStyle, StandardItemStyle, TabStyle, TableStyle, }; let t = compact(); @@ -808,6 +856,12 @@ fn a_recipe_style_answers_from_its_own_recipe() { assert_eq!(tab.editor_height(&t), 31.0); assert_eq!(tab.padding_horizontal(&t), 9.0); + let bar = RecipeScrollBarStyle::new(ScrollBarRecipe { + min_thumb_length: 19.0, + ..ScrollBarRecipe::for_tokens(&t) + }); + assert_eq!(bar.min_thumb_length(&t), 19.0); + let calendar = RecipeCalendarStyle::new(CalendarRecipe { nav_arrow_size: 20.0, ..CalendarRecipe::for_tokens(&t) diff --git a/docs/scroll-area.md b/docs/scroll-area.md index e2c03e5ee..a4b2501ce 100644 --- a/docs/scroll-area.md +++ b/docs/scroll-area.md @@ -483,6 +483,8 @@ Scroll-bar chrome is a Tier-3 style protocol, ```rust pub trait ScrollBarStyle: 'static { fn make_body(&self, cfg: &ScrollBarStyleConfig, ctx: &mut BuildContext) -> WidgetId; + // Defaulted: 24 at the compact density, 32 comfortable, 44 touch. + fn min_thumb_length(&self, tokens: &InputTokens) -> f32 { /* ... */ } } ``` @@ -493,6 +495,13 @@ override. The default `RecipeScrollBarStyle` ([recipe](../crates/teksilo-widgets/src/styles/recipe_scroll_bar_style.rs)) paints all three variants from IntUI tokens. +`min_thumb_length` is the shortest the thumb may get on a long document. The +bar asks its style for it at build time, sizes its thumb from the answer, and +takes its hit test and its drag from the same thumb, so the config's +`min_thumb_length` is that answer. The macOS preset floors the thumb at 28 and +Fluent at 30 at the compact density, both raised to the density's target size +above it. A bar's own `.min_thumb_length(..)` wins over the style. + Install it theme-wide: ```rust diff --git a/docs/widgets/scroll_bar.md b/docs/widgets/scroll_bar.md index 05ff27aa0..879a1aa35 100644 --- a/docs/widgets/scroll_bar.md +++ b/docs/widgets/scroll_bar.md @@ -64,8 +64,10 @@ Because the outset widens the bar *across* the scroll axis, every decision about whether a press is on the thumb is taken **along the axis only** — a finger 15 dp inboard of an 8 dp bar is beside the thumb, not past it. -The minimum thumb length follows the density (24 dp Compact, 44 dp Touch), -so a short thumb on a long document is still something a finger can land on. +The minimum thumb length is the active style's +`ScrollBarStyle::min_thumb_length`, which follows the density (24 dp +Compact, 44 dp Touch under the shipped style), so a short thumb on a long +document is still something a finger can land on. #### Accessibility @@ -123,9 +125,16 @@ pub const SCROLLBAR_COARSE_TARGET: f32 = 48.0; **Import:** `use teksilo::widgets::scroll_bar::SCROLLBAR_MIN_THUMB_LENGTH;` -The shipped minimum thumb length, at Compact. Raised to the density's -`target_size` (44 dp at Touch) at build time; a -`min_thumb_length` override wins over both. +The shipped minimum thumb length, at Compact. + +A bar takes its floor from the active style's +`ScrollBarStyle::min_thumb_length` at build time: the shipped style and +the trait default both answer this value raised to the density's +`target_size` (32 dp at Comfortable, 44 dp at Touch), and a preset answers +its own (28 dp under macOS, 30 dp under Fluent, at Compact). Before its +first build a bar uses this value. A +`min_thumb_length` override wins over all of +them. ```rust pub const SCROLLBAR_MIN_THUMB_LENGTH: f32 = 24.0; @@ -195,11 +204,13 @@ Set the bar thickness (width for vertical, height for horizontal). #### `pub fn min_thumb_length(mut self, len: f32) -> Self` (default: `None`) -Set the minimum thumb length in pixels, overriding the density. +Set the minimum thumb length in pixels, overriding the active style. -Left unset the floor is `SCROLLBAR_MIN_THUMB_LENGTH` raised to the -density's target size — 24 dp at Compact, 44 dp at Touch — so a short -thumb on a long document stays something a finger can land on. +Left unset the floor is the active style's +`ScrollBarStyle::min_thumb_length` at the tree's density: under the +shipped style `SCROLLBAR_MIN_THUMB_LENGTH` raised to the density's +target size (24 dp at Compact, 44 dp at Touch), so a short thumb on a +long document stays something a finger can land on. diff --git a/engineering/docs/density-projection-gaps.md b/engineering/docs/density-projection-gaps.md index b868f9cb5..1bccc523b 100644 --- a/engineering/docs/density-projection-gaps.md +++ b/engineering/docs/density-projection-gaps.md @@ -8,7 +8,7 @@ struct, and `for_tokens(&InputTokens)` projects each one onto the active density — `dp` for a target, `spacing` for a gap, `density_min_size` for a minimum box. A theme preset then builds that same struct with its own numbers. -**Forty-two of those projected fields have no reader.** The widget composes the +**Forty-one of those projected fields have no reader.** The widget composes the dimension from the raw `pub const` in the recipe's module instead, so the projected field is written by `for_tokens`, written again by every preset, and consulted by nothing. Retuning one changes nothing on screen. @@ -48,11 +48,11 @@ and is therefore inside the scope; the rule finds both its projected fields read | | | |---|---| | projected fields in scope | 102 | -| of those, unread by the rule | 44 | +| of those, unread by the rule | 43 | | false positives of the rule (§4) | 2 | -| **real gap** | **42** | +| **real gap** | **41** | | of which inert even if wired (§1) | 10 | -| of which a shipped preset already sets a different value (§2) | 7 | +| of which a shipped preset already sets a different value (§2) | 6 | | of which a preset sets the same value the constant carries (§3a) | 3 | | of which density only, no preset (§3b) | 22 | @@ -62,18 +62,19 @@ those cost a test failure would discourage the one change it invites: the tables are the record, the guard keeps their *membership* honest, and the arithmetic is a snapshot of the day it was taken. -Eleven further fields were on this list until a metrics accessor wired them, +Twelve further fields were on this list until a metrics accessor wired them, and they are the worked examples for what wiring one looks like: `TableRecipe::cell_padding_horizontal` / `cell_padding_vertical` (`TableStyle`), `CalendarRecipe::nav_arrow_size` (`CalendarStyle`), `SearchFieldRecipe::row_padding_horizontal` / `row_padding_vertical` (`SearchFieldStyle`), `StandardItemRecipe::min_height_single_line` / `min_height_two_line` (`StandardItemStyle`), `TableRecipe::row_height` / -`header_height` (`TableStyle`) and `TabRecipe::editor_height` / -`padding_horizontal` (`TabStyle`): a defaulted metrics accessor on +`header_height` (`TableStyle`), `TabRecipe::editor_height` / +`padding_horizontal` (`TabStyle`) and `ScrollBarRecipe::min_thumb_length` +(`ScrollBarStyle`): a defaulted metrics accessor on the style trait, defaulted so an out-of-tree style keeps compiling, overridden by the `Recipe*Style` from its own recipe so a preset's number takes effect. -A twelfth, `TabRecipe::tool_window_height`, was deleted instead: neither it nor +A thirteenth, `TabRecipe::tool_window_height`, was deleted instead: neither it nor its constant had a reader, and no tab strip has a tool-window height to give it. **A verdict of "safe to wire" means the mechanism is available and the change is @@ -115,7 +116,7 @@ unwired one. ## 2. A shipped preset already sets a different value -The seven that cost something today. Each is written by Fluent or macOS with +The six that cost something today. Each is written by Fluent or macOS with a number chosen for that design language, and each renders the IntUI constant instead. The **renders** column is what a user sees under any theme. @@ -123,7 +124,6 @@ instead. The **renders** column is what a user sees under any theme. |---|---|---|---|---|---| | `CalendarRecipe` | `cell_size` | 32 | — | 28 | `calendar.rs` → `Calendar::build`, `build_weekday_row` | | `CalendarRecipe` | `header_height` | 28 | — | 26 | none — see below | -| `ScrollBarRecipe` | `min_thumb_length` | 24 | 30 | 28 | `scroll_bar.rs` → `ScrollBar::build` | | `SearchFieldRecipe` | `row_height` | 26 | — | 22 | `search_field.rs` → `SuggestionPanel::build` | | `SegmentedControlRecipe` | `height` | 24 | 32 | 22 | `segmented_control.rs` → `layout_response` | | `SegmentedControlRecipe` | `padding_horizontal` | 12 | — | 10 | `segmented_control.rs` → `layout_response`; `segmented_control/cell.rs` → `layout_response` | @@ -131,17 +131,15 @@ instead. The **renders** column is what a user sees under any theme. Ladders, for the ones whose density projection also moves (Compact / Comfortable / Touch): `cell_size` 32/32/44, `CalendarRecipe::header_height` 28/32/44, -`min_thumb_length` 24/32/44, `SearchFieldRecipe::row_height` 26/32/44, -`SegmentedControlRecipe::height` 24/32/44 and `padding_horizontal` 12/13.8/15.6 -and `padding_vertical` 6/6.9/7.8. +`SearchFieldRecipe::row_height` 26/32/44, `SegmentedControlRecipe::height` +24/32/44 and `padding_horizontal` 12/13.8/15.6 and `padding_vertical` +6/6.9/7.8. ### Verdicts -**Safe to wire, one accessor each.** `ScrollBarRecipe::min_thumb_length` — -`ScrollBar::build` already resolves the style and then *recomputes* the floor -from the constant three lines later, so the value is already in hand. -`SearchFieldRecipe::row_height` — the same `SuggestionPanel::build` that now -takes its row gutters from `SearchFieldStyle`. +**Safe to wire, one accessor.** `SearchFieldRecipe::row_height`, read by the +same `SuggestionPanel::build` that now takes its row gutters from +`SearchFieldStyle`. **Needs care — the widget owns a composition the field cannot express.** `SegmentedControlRecipe::height` / `padding_horizontal` / `padding_vertical`: From 344a0e5d644a3269751c3b917ccbbd22628ed27a Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 09:11:30 +0200 Subject: [PATCH 10/59] feat(styles): add selection-emphasis and pressed-label style hooks StandardItemStyle::selection_emphasis() returns a SelectionEmphasis: ViewFocusedAndWindowActive (the default, the rule every row followed before) or WindowActive, which mutes a selected row only when its window goes inactive, as Qt's per-window colour groups do. The row composes the emphasis signal for its label, subtitle and chevron from the hook, and the shipped recipe and the macOS style build their chrome condition through SelectionEmphasis::emphasised, so fill and text agree. MenuItemStyle::pressed_label_role() gives the role a menu row's label and shortcut take while pressed. It wins over highlighted_label_role on a pressed row and defaults to None, so existing styles are unchanged. Both hooks are defaulted trait methods; no config struct gains a field. Documented on the traits, in docs/window-activation.md and in the agent reference. Signed-off-by: Cyril Jacquet --- .claude/CLAUDE.md | 2 +- CHANGELOG.md | 19 ++ crates/teksilo-core/src/styles.rs | 2 +- .../src/styles/menu_item_style.rs | 22 +++ .../src/styles/standard_item_style.rs | 67 +++++++ .../src/styles/standard_item.rs | 4 +- crates/teksilo-widgets/src/menu_item/tests.rs | 181 ++++++++++++++++++ .../src/menu_item/widget_impl.rs | 73 +++++-- crates/teksilo-widgets/src/standard_item.rs | 138 ++++++++++++- .../src/styles/recipe_standard_item_style.rs | 59 ++++-- docs/window-activation.md | 27 +++ 11 files changed, 561 insertions(+), 33 deletions(-) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 33744677a..d2ca8e9f1 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -955,7 +955,7 @@ When a window loses OS focus, its widgets change appearance — the modern deskt - **Automatic, default-on (correctness, not opt-in).** Two complementary layers — **theme-side** for everything that's a plain accent colour, **per-widget** only where the theme genuinely can't decide: 1. **Accent desaturation (theme-side, the broad sweep).** When inactive, the paint walker paints against the inactive projection of `effective_theme` (`Theme::for_inactive_window` in [crates/teksilo-core/src/styles/theme.rs](crates/teksilo-core/src/styles/theme.rs) → `ColorTokens::for_inactive_window` in [crates/teksilo-tokens/src/theme.rs](crates/teksilo-tokens/src/theme.rs)), which desaturates the accent family (`accent`/`accent_hover`/`accent_pressed`/`accent_disabled`/`accent_subtle_bg`) + focus indicators (`border_focused`/`focus_ring`) toward graphite: the Qt `QPalette::Inactive` model (swap at [rendering_impl.rs](crates/teksilo-core/src/widget_tree/rendering_impl.rs)). Because every themed control resolves its accent from the live `ColorTokens` *at paint time* (e.g. Toggle reads `colors.accent`), this **one swap greys out every accent control with zero per-widget code**: `Button`(Filled/Destructive), `Toggle`, checked `Checkbox`/`RadioButton`, selected `TabBar` tab + `SegmentedControl` segment, `Slider` fill, `ProgressBar`, `Badge`, focus rings. It applies to **any preset** that populates these tokens: IntUI, **Material 3** (where `accent` = M3 *primary*; covered with no material3-specific code), future presets. Repaint-only (colours, not typography). Don't add per-widget window-active accent checks: they belong here. **The swap is one call, `Theme::for_paint_state(PaintState { window_active, high_contrast })`** (`WidgetTree::paint_state()`): without a hook it is the generic chain (`for_inactive_window` when inactive, then `for_high_contrast` under the OS increase-contrast preference, byte-identical to before); a theme whose palette defines its own inactive / high-contrast colours registers a **`PaintProjection(fn(&Theme, PaintState) -> Theme)`** extension (`Theme::with_paint_projection`, the `DensityProjection` pattern) and the walker paints the hook's answer instead. `for_inactive_window` / `for_high_contrast` stay the generic transforms and never consult the hook. Recipe colours baked at build time (`ColorProp::Bound`, e.g. a Filled button fill) resolve through `Theme::paint_colors` against `window_active_signal` + `BuildContext::high_contrast_signal()` (`teksilo-widgets` `styles::window_resolution_colors`), so they follow the hook and high contrast too; never call `colors.for_inactive_window()` directly from a widget. 2. **Caret hiding (per-widget — behavioural, a theme can't hide a caret).** The caret hides in an inactive window for every policy, in *both* text stacks (`RichTextEditor` rich_text/, and `TextInputField` primitives/ — base for `TextInput`/`PasswordField`/`SpinBox`/`SearchField`). The frame-loop `tick()` has no context, so `build()` registers an effect on `window_active_signal` that mirrors the value onto the editor state and hides the caret **synchronously** on deactivation (the loop may not tick while parked); blink + paint gates AND-in `state.window_active`. Restored immediately on reactivate. - 3. **Selection desaturation (per-widget — needs *view* focus + a dedicated token).** Vivid `SurfaceRole::Selected` only when **view-focused AND window-active**, else the muted `SurfaceRole::SelectedInactive`. Per-widget — *not* theme-side — because it (a) depends on *view* keyboard focus (a per-view runtime state the theme can't know) and (b) uses the hand-tuned `surface_selected_inactive` / `selection_bg_inactive` tokens so view-unfocused and window-inactive show **one** consistent muted colour (a theme desaturation of `surface_selected` would be a *different* computed gray). Composed in `StandardListItem`/`StandardTreeItem` `bg_signal` (`is_focused.and(is_window_active)`), `TableView`/`TreeTableView` selection-band paint (`view_focused.get() && ctx.window_active`), and the text engines (swap to `selection_bg_inactive`). A custom `.selection_color(..)` stays fixed (macOS semantics). `MenuList` excluded (an open menu is always active). + 3. **Selection desaturation (per-widget: needs *view* focus + a dedicated token).** Vivid `SurfaceRole::Selected` only when **view-focused AND window-active** (by default, see below), else the muted `SurfaceRole::SelectedInactive`. Per-widget, *not* theme-side, because it (a) depends on *view* keyboard focus (a per-view runtime state the theme can't know) and (b) uses the hand-tuned `surface_selected_inactive` / `selection_bg_inactive` tokens so view-unfocused and window-inactive show **one** consistent muted colour (a theme desaturation of `surface_selected` would be a *different* computed gray). Composed in `StandardListItem`/`StandardTreeItem` `bg_signal` from the style's `StandardItemStyle::selection_emphasis()` (default `SelectionEmphasis::ViewFocusedAndWindowActive`; `WindowActive` mutes only on window blur, Qt's per-window colour groups; build it with `SelectionEmphasis::emphasised(&cfg.is_focused, &cfg.is_window_active)` so chrome and label agree), `TableView`/`TreeTableView` selection-band paint (`view_focused.get() && ctx.window_active`), and the text engines (swap to `selection_bg_inactive`). A custom `.selection_color(..)` stays fixed (macOS semantics). `MenuList` excluded (an open menu is always active). - **Opt-in for custom content:** wrap the subtree in `DimWhenInactive::new().factor(f).child(w)` (default factor 70 %) ([crates/teksilo-core/src/dim_when_inactive.rs](crates/teksilo-core/src/dim_when_inactive.rs)), driving a node-level opacity scope from `window_active_signal`. Layout-/a11y-transparent; opacity snaps (reduced-motion-correct). Re-exported in `teksilo::prelude` as `DimWhenInactive`. - **a11y unaffected** (caret/selection/accent are all paint-only). **Test** with `WidgetTree::set_window_active(bool)` (a fresh tree is active). diff --git a/CHANGELOG.md b/CHANGELOG.md index ce3275728..34ecbbd82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,18 @@ by crate for clarity, not because crates version independently. - **`ScrollBarStyle::min_thumb_length`.** A scroll-bar style says how short a `ScrollBar` thumb may get on a long document at the active density. It has a default, so an existing style keeps the shipped floor. +- **`StandardItemStyle::selection_emphasis` and `SelectionEmphasis`.** A row + style says what mutes a selected `StandardListItem` or `StandardTreeItem`: + the view losing keyboard focus or the window going inactive + (`ViewFocusedAndWindowActive`, the default and the rule every row followed + before), or the window going inactive only (`WindowActive`, Qt's per-window + colour groups). The row's label, subtitle and chevron follow it, and + `SelectionEmphasis::emphasised` gives a style the same condition for its + own selection fill. +- **`MenuItemStyle::pressed_label_role`.** A menu style gives the text role a + `MenuItem`'s label and shortcut take while the row is pressed, for a design + whose pressed row is a solid fill while its hover is a pale wash. It + defaults to `None`, so an existing style keeps its pressed labels. ### Removed @@ -76,6 +88,13 @@ by crate for clarity, not because crates version independently. #### Theming +- **A menu row shows its pressed state while the pointer holds it.** + **Behaviour change:** pressing a `MenuItem` with the mouse, a pen or a + finger now paints the style's pressed row (the pressed surface under Int UI + and Fluent, the deeper accent under macOS) from the pointer-down until the + release, and a style's `pressed_label_role` applies over the same span. + Before, a menu row showed its pressed state only after an Enter or Space + activation, so a pointer never saw it. - **A breadcrumb crumb shows its hover, focus and link colours.** **Behaviour change:** a navigable crumb now paints its hover and focus background, its focus ring and its accent link colour, and assistive diff --git a/crates/teksilo-core/src/styles.rs b/crates/teksilo-core/src/styles.rs index 96cef01c1..0451baadf 100644 --- a/crates/teksilo-core/src/styles.rs +++ b/crates/teksilo-core/src/styles.rs @@ -189,7 +189,7 @@ pub use spin_box_style::{ButtonLayout, SharedSpinBoxStyle, SpinBoxStyle, SpinBox pub use split_button_style::{SharedSplitButtonStyle, SplitButtonStyle, SplitButtonStyleConfig}; pub use splitter_style::{SharedSplitterStyle, SplitterStyle, SplitterStyleConfig}; pub use standard_item_style::{ - SharedStandardItemStyle, StandardItemStyle, StandardItemStyleConfig, + SelectionEmphasis, SharedStandardItemStyle, StandardItemStyle, StandardItemStyleConfig, }; pub use tab_style::{ SharedTabStyle, TabBarChromeConfig, TabBarOrientation, TabIndicatorPosition, TabStyle, diff --git a/crates/teksilo-core/src/styles/menu_item_style.rs b/crates/teksilo-core/src/styles/menu_item_style.rs index 0872dc05a..c14004387 100644 --- a/crates/teksilo-core/src/styles/menu_item_style.rs +++ b/crates/teksilo-core/src/styles/menu_item_style.rs @@ -19,6 +19,9 @@ pub struct MenuItemStyleConfig { /// Optional trailing slot (shortcut chip, submenu chevron). pub trailing: Option, pub is_hovered: Signal, + /// `true` while a pointer holds the row down (the framework press, from + /// the pointer-down until the release or until the press slides off), and + /// after an Enter or Space activation of a row that stays open. pub is_pressed: Signal, pub is_focused: Signal, pub is_disabled: Signal, @@ -98,6 +101,25 @@ pub trait MenuItemStyle: 'static { fn highlighted_label_role(&self) -> Option { None } + + /// The text role a menu row's label and shortcut take while the row is + /// **pressed**: held under the pointer, from the pointer-down until the + /// release, or activated from the keyboard. + /// `None` (the default) keeps whatever the row would read otherwise, + /// which for a pressed row is + /// [`highlighted_label_role`](Self::highlighted_label_role), since a + /// pressed row is still highlighted underneath the press. + /// + /// For a design language whose *pressed* row is a solid fill while its + /// hover is a pale wash: the style returns `None` from + /// `highlighted_label_role` and, say, [`TextRole::OnAccent`] here, so the + /// label keeps its contrast against the wash and flips only under the + /// press. + /// + /// Defaulted, so an existing style needs no change. + fn pressed_label_role(&self) -> Option { + None + } } pub type SharedMenuItemStyle = Rc; diff --git a/crates/teksilo-core/src/styles/standard_item_style.rs b/crates/teksilo-core/src/styles/standard_item_style.rs index 130f35575..c2ae67611 100644 --- a/crates/teksilo-core/src/styles/standard_item_style.rs +++ b/crates/teksilo-core/src/styles/standard_item_style.rs @@ -42,9 +42,57 @@ pub struct StandardItemStyleConfig { /// same desaturation a view-focus loss produces (macOS "unemphasized" /// selection serves both states). Populated from /// `BuildContext::window_active_signal`. + /// + /// Which of the two signals a style composes is its + /// [`StandardItemStyle::selection_emphasis`]; build the condition with + /// [`SelectionEmphasis::emphasised`] rather than by hand, so the chrome + /// and the row's label (which the row composes from the same hook) agree. pub is_window_active: Signal, } +/// When a selected row is drawn **emphasised**: the vivid `Selected` +/// surface (and [`StandardItemStyle::selected_label_role`] on its +/// foregrounds) rather than the muted `SelectedInactive` one. +/// +/// Design languages disagree on what mutes a selection. macOS, IntUI and +/// Fluent mute it whenever the view loses keyboard focus, as well as when +/// the window does. Qt picks a palette colour group per *window*: every +/// view in an active window paints its selection with the active +/// `Highlight`, whichever of them holds focus, so KDE's Breeze mutes a +/// selection only when the window goes inactive. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)] +#[non_exhaustive] +pub enum SelectionEmphasis { + /// Emphasised while the row's view holds keyboard focus **and** its + /// window is active. The default, and the rule every shipped style + /// followed before the choice existed. + #[default] + ViewFocusedAndWindowActive, + /// Emphasised while the window is active, whether or not the view holds + /// keyboard focus: Qt's per-window colour groups. + WindowActive, +} + +impl SelectionEmphasis { + /// The emphasis condition as a signal, from the view-focus signal (a + /// row's [`StandardItemStyleConfig::is_focused`]) and the window-active + /// signal ([`StandardItemStyleConfig::is_window_active`]). + /// + /// A selected row is emphasised while this reads `true`. Selection + /// itself is not part of it: the caller combines that, since the chrome + /// and the label each already hold it. + pub fn emphasised( + self, + view_focused: &Signal, + window_active: &Signal, + ) -> Signal { + match self { + Self::ViewFocusedAndWindowActive => view_focused.and(window_active), + Self::WindowActive => window_active.clone(), + } + } +} + pub trait StandardItemStyle: 'static { fn make_body(&self, cfg: &StandardItemStyleConfig, ctx: &mut BuildContext) -> WidgetId; @@ -69,6 +117,25 @@ pub trait StandardItemStyle: 'static { None } + /// When a selected row is drawn emphasised; see [`SelectionEmphasis`]. + /// + /// The row reads this for its foregrounds (the label, the subtitle and + /// the tree chevron take [`selected_label_role`](Self::selected_label_role) + /// only while the row is emphasised), and a style reads it for its own + /// chrome through [`SelectionEmphasis::emphasised`], so a solid + /// selection fill and the text on it stay in step. + /// + /// **Defaulted** to [`SelectionEmphasis::ViewFocusedAndWindowActive`], + /// the rule every style followed before this existed, so an existing + /// style needs no change. The shipped `RecipeStandardItemStyle` consults + /// its own value, which is always the default: a style that returns + /// another value and delegates its chrome to the recipe gets the + /// recipe's muting, and has to paint its selection itself to follow its + /// own rule. + fn selection_emphasis(&self) -> SelectionEmphasis { + SelectionEmphasis::ViewFocusedAndWindowActive + } + /// The height floor of a row with no subtitle, in logical pixels, at the /// density `tokens` describe. /// diff --git a/crates/teksilo-theme-macos/src/styles/standard_item.rs b/crates/teksilo-theme-macos/src/styles/standard_item.rs index a8f3aa08f..d1c98455a 100644 --- a/crates/teksilo-theme-macos/src/styles/standard_item.rs +++ b/crates/teksilo-theme-macos/src/styles/standard_item.rs @@ -115,7 +115,9 @@ impl StandardItemStyle for MacOsStandardItemStyle { is_hovered: cfg.is_hovered.clone(), is_pressed: cfg.is_pressed.clone(), is_disabled: cfg.is_disabled.clone(), - emphasised: cfg.is_focused.and(&cfg.is_window_active), + emphasised: self + .selection_emphasis() + .emphasised(&cfg.is_focused, &cfg.is_window_active), show_ring: cfg .is_selected .zip3(&cfg.is_focused, &cfg.is_focus_visible) diff --git a/crates/teksilo-widgets/src/menu_item/tests.rs b/crates/teksilo-widgets/src/menu_item/tests.rs index 09a48f53e..93c0a5288 100644 --- a/crates/teksilo-widgets/src/menu_item/tests.rs +++ b/crates/teksilo-widgets/src/menu_item/tests.rs @@ -122,6 +122,187 @@ fn the_hook_does_not_touch_an_idle_row() { assert!(!colors.contains(&on_accent)); } +// --- `MenuItemStyle::pressed_label_role` --- + +/// A style whose hover is a pale wash (no highlighted role) but whose press +/// is a solid fill, so only the press flips the label. +#[derive(Debug, Default, Clone, Copy)] +struct OnAccentPressStyle; + +impl teksilo_core::styles::MenuItemStyle for OnAccentPressStyle { + fn make_body( + &self, + cfg: &MenuItemStyleConfig, + ctx: &mut teksilo_core::build_context::BuildContext, + ) -> WidgetId { + crate::styles::RecipeMenuItemStyle::for_tokens(&ctx.theme().input).make_body(cfg, ctx) + } + + fn pressed_label_role(&self) -> Option { + Some(TextRole::OnAccent) + } +} + +/// How a row is driven before its glyph colours are read. +#[derive(Clone, Copy)] +enum Drive { + Idle, + Hover, + /// Enter on the focused row: a plain row with no action stays pressed. + Press, + /// The primary button held down over the row, not yet released. + PointerHold, + /// The primary button pressed over the row and released over it. + PointerClick, +} + +/// Build a menu row with a shortcut chip under `style`, drive it, and +/// report the glyph colours it paints. +fn driven_row_glyph_colors(styled: bool, drive: Drive) -> Vec<[u8; 4]> { + let mut t = WidgetTree::new() + .with_theme(discriminating_theme()) + .with_text_backend(std::rc::Rc::new(std::cell::RefCell::new( + teksilo_canvas::MockTextBackend::new(), + ))); + let mut item = MenuItem::new(lit!("Open")).shortcut_label("Ctrl+O"); + if styled { + item = item.style(OnAccentPressStyle); + } + let id = t.add(item); + layout(&mut t); + match drive { + Drive::Idle => {} + Drive::Hover => { + t.pointer_move(t.bounds(id).center()); + layout(&mut t); + } + Drive::Press => { + t.focus(id); + t.press_key(Key::Enter, Modifiers::NONE); + layout(&mut t); + } + Drive::PointerHold | Drive::PointerClick => { + let at = t.bounds(id).center(); + t.pointer_move(at); + layout(&mut t); + t.pointer_down_button(at, teksilo_core::event::PointerButton::Primary); + layout(&mut t); + if matches!(drive, Drive::PointerClick) { + t.pointer_up_button(at, teksilo_core::event::PointerButton::Primary); + layout(&mut t); + } + } + } + glyph_colors(&mut t) +} + +/// The default is `None`: a pressed row under a style without the hook +/// keeps its own mapping. +#[test] +fn a_style_without_the_pressed_hook_leaves_the_pressed_label_alone() { + let on_accent = rgba8(discriminating_theme().colors.text_on_accent); + let colors = driven_row_glyph_colors(false, Drive::Press); + assert!(!colors.is_empty()); + assert!(!colors.contains(&on_accent), "painted {colors:?}"); +} + +/// A style that declares the hook flips the label and the shortcut of a +/// pressed row. +#[test] +fn the_pressed_hook_flips_the_label_of_a_pressed_row() { + let theme = discriminating_theme(); + let primary = rgba8(theme.colors.text_primary); + let on_accent = rgba8(theme.colors.text_on_accent); + let colors = driven_row_glyph_colors(true, Drive::Press); + assert!(colors.contains(&on_accent), "painted {colors:?}"); + assert!( + !colors.contains(&primary), + "the label kept its idle colour under the press; painted {colors:?}" + ); +} + +/// A row held under the pointer is pressed too: the press shows from the +/// pointer-down, not only from the keyboard, so the hook reaches a mouse. +#[test] +fn the_pressed_hook_flips_the_label_of_a_row_held_under_the_pointer() { + let theme = discriminating_theme(); + let primary = rgba8(theme.colors.text_primary); + let on_accent = rgba8(theme.colors.text_on_accent); + let colors = driven_row_glyph_colors(true, Drive::PointerHold); + assert!(colors.contains(&on_accent), "painted {colors:?}"); + assert!( + !colors.contains(&primary), + "the label kept its idle colour under the pointer press; painted {colors:?}" + ); + // A style without the hook keeps its own label under the same press. + let colors = driven_row_glyph_colors(false, Drive::PointerHold); + assert!(!colors.is_empty()); + assert!(!colors.contains(&on_accent), "painted {colors:?}"); +} + +/// The pointer press ends with the release: a clicked row no longer reads +/// as pressed. +#[test] +fn the_pressed_hook_lets_go_of_the_label_on_the_release() { + let theme = discriminating_theme(); + let primary = rgba8(theme.colors.text_primary); + let on_accent = rgba8(theme.colors.text_on_accent); + let colors = driven_row_glyph_colors(true, Drive::PointerClick); + assert!(colors.contains(&primary), "painted {colors:?}"); + assert!(!colors.contains(&on_accent), "painted {colors:?}"); +} + +/// The pressed role applies only while pressed: an idle row and a hovered +/// one keep their normal label. +#[test] +fn the_pressed_hook_does_not_touch_an_idle_or_hovered_row() { + let theme = discriminating_theme(); + let primary = rgba8(theme.colors.text_primary); + let on_accent = rgba8(theme.colors.text_on_accent); + for drive in [Drive::Idle, Drive::Hover] { + let colors = driven_row_glyph_colors(true, drive); + assert!(colors.contains(&primary), "painted {colors:?}"); + assert!(!colors.contains(&on_accent), "painted {colors:?}"); + } +} + +/// The pressed role wins over the highlighted one on a pressed row, and the +/// highlighted one still applies to a hovered row. +#[test] +fn the_pressed_role_takes_precedence_over_the_highlighted_role() { + let rest = TextRole::Primary; + use super::widget_impl::StateRoles; + let roles = StateRoles { + highlighted: Some(TextRole::Secondary), + pressed: Some(TextRole::OnAccent), + }; + assert_eq!( + roles.resolve(MenuItemState::Pressed, rest), + TextRole::OnAccent + ); + assert_eq!( + roles.resolve(MenuItemState::Hovered, rest), + TextRole::Secondary + ); + assert_eq!(roles.resolve(MenuItemState::Idle, rest), rest); + + let highlight_only = StateRoles { + highlighted: Some(TextRole::Secondary), + pressed: None, + }; + assert_eq!( + highlight_only.resolve(MenuItemState::Pressed, rest), + TextRole::Secondary + ); +} + +/// The trait default is `None`. +#[test] +fn the_pressed_label_role_defaults_to_none() { + use teksilo_core::styles::MenuItemStyle as _; + assert_eq!(OnAccentHighlightStyle.pressed_label_role(), None); +} + // --- Role coverage --- fn a11y_node( diff --git a/crates/teksilo-widgets/src/menu_item/widget_impl.rs b/crates/teksilo-widgets/src/menu_item/widget_impl.rs index 052bdb3c8..cf7d39b4a 100644 --- a/crates/teksilo-widgets/src/menu_item/widget_impl.rs +++ b/crates/teksilo-widgets/src/menu_item/widget_impl.rs @@ -30,6 +30,28 @@ fn is_highlight(state: MenuItemState) -> bool { matches!(state, MenuItemState::Hovered | MenuItemState::Pressed) } +/// The roles a style asks a row's foregrounds to take in its interaction +/// states, read once per build. +#[derive(Clone, Copy)] +pub(super) struct StateRoles { + /// [`MenuItemStyle::highlighted_label_role`](teksilo_core::styles::MenuItemStyle::highlighted_label_role). + pub(super) highlighted: Option, + /// [`MenuItemStyle::pressed_label_role`](teksilo_core::styles::MenuItemStyle::pressed_label_role). + pub(super) pressed: Option, +} + +impl StateRoles { + /// The role a foreground reads in `state`: the pressed role while + /// pressed, else the highlighted role while highlighted (a pressed row + /// included), else `rest`, the row's own mapping for the state. + pub(super) fn resolve(self, state: MenuItemState, rest: TextRole) -> TextRole { + self.pressed + .filter(|_| state == MenuItemState::Pressed) + .or_else(|| self.highlighted.filter(|_| is_highlight(state))) + .unwrap_or(rest) + } +} + impl Widget for MenuItem { fn build(&mut self, ctx: &mut BuildContext) -> Vec { let self_id = ctx.self_id(); @@ -45,6 +67,30 @@ impl Widget for MenuItem { // leaves' role substitution. let interaction = ctx.signal(MenuItemState::Idle); self.interaction = interaction.clone(); + // The row's pressed state, driven by the router's press record while + // a pointer holds the row. It was previously written by the keyboard + // path alone (and by `on_tap`, which runs on the release and resets + // to `Idle` in the same handler), so a style's pressed chrome and its + // `pressed_label_role` were unreachable for a mouse and for a finger. + // `hovered` is where the hover truth lives while `interaction` holds + // `Pressed`, so a press that ends without activating (it slid off) + // returns the row to where the pointer is. + let hovered = Rc::new(std::cell::Cell::new(false)); + { + let hovered = hovered.clone(); + crate::common::interaction::bind_press_state( + ctx, + interaction.clone(), + MenuItemState::Pressed, + move || { + if hovered.get() { + MenuItemState::Hovered + } else { + MenuItemState::Idle + } + }, + ); + } // Resolved here rather than at `make_body` because the label is // built long before the chrome, and a style whose highlight is a @@ -59,7 +105,10 @@ impl Widget for MenuItem { &ctx.theme().input, )) }); - let highlighted_role = style.highlighted_label_role(); + let state_roles = StateRoles { + highlighted: style.highlighted_label_role(), + pressed: style.pressed_label_role(), + }; // The slot sizes the active style owns. `MenuItem` builds the leading // icon/check column and the trailing chevron column itself — they are // slot *contents*, handed to `make_body` already sized — so they have @@ -77,9 +126,7 @@ impl Widget for MenuItem { if !*on { TextRole::Disabled } else { - highlighted_role - .filter(|_| is_highlight(*s)) - .unwrap_or_else(|| resolve_text_role(*s)) + state_roles.resolve(*s, resolve_text_role(*s)) } }); @@ -278,11 +325,8 @@ impl Widget for MenuItem { }; let has_shortcut = shortcut.is_some(); if let Some(shortcut) = shortcut { - let shortcut_role = interaction.map(move |s| { - highlighted_role - .filter(|_| is_highlight(*s)) - .unwrap_or_else(|| resolve_shortcut_role(*s)) - }); + let shortcut_role = + interaction.map(move |s| state_roles.resolve(*s, resolve_shortcut_role(*s))); trailing_row = trailing_row.child( shortcut .style(TextStyleRole::Body) @@ -304,11 +348,8 @@ impl Widget for MenuItem { crate::primitives::FixedSize::new().width(metrics.trailing_column_width), ); } - let hint_role = interaction.map(move |s| { - highlighted_role - .filter(|_| is_highlight(*s)) - .unwrap_or_else(|| resolve_shortcut_role(*s)) - }); + let hint_role = + interaction.map(move |s| state_roles.resolve(*s, resolve_shortcut_role(*s))); trailing_row = trailing_row.child( TextWidget::new(hint) .style(TextStyleRole::Body) @@ -622,7 +663,9 @@ impl Widget for MenuItem { }) .on_hover({ let int_hover = int_hover.clone(); + let hovered = hovered.clone(); move |entered: bool, ctx: &mut EventContext| { + hovered.set(entered); if entered { int_hover.set(MenuItemState::Hovered); open_for_hover.set(true); @@ -723,7 +766,9 @@ impl Widget for MenuItem { }) .on_hover({ let safe_triangle_sibling = self.safe_triangle.clone(); + let hovered = hovered.clone(); move |entered: bool, ctx: &mut EventContext| { + hovered.set(entered); if entered { // Safe-triangle gate: while a traversal // toward an open submenu in this list is diff --git a/crates/teksilo-widgets/src/standard_item.rs b/crates/teksilo-widgets/src/standard_item.rs index 2a9b35774..479508988 100644 --- a/crates/teksilo-widgets/src/standard_item.rs +++ b/crates/teksilo-widgets/src/standard_item.rs @@ -529,9 +529,11 @@ struct RowRoles { /// language whose selection is a pale wash (IntUI, Fluent), which is /// also what keeps `emphasised` unbuilt. on_selected: Option, - /// Selected **and** view-focused **and** window-active — the same - /// condition the chrome uses to pick `SurfaceRole::Selected` over - /// `SelectedInactive`. `None` when no style asked for the flip. + /// The style's [`SelectionEmphasis`](teksilo_core::styles::SelectionEmphasis) + /// condition (view-focused and window-active by default, window-active + /// alone for a style that asks for it), the same condition the chrome + /// uses to pick `SurfaceRole::Selected` over `SelectedInactive`. `None` + /// when no style asked for the flip. emphasised: Option>, } @@ -546,8 +548,9 @@ impl StandardListItem { }); self.resolved_style = Some(style.clone()); let on_selected = style.selected_label_role(); - let emphasised = - on_selected.map(|_| ctx.view_focus_active().and(&ctx.window_active_signal())); + let emphasis = style.selection_emphasis(); + let emphasised = on_selected + .map(|_| emphasis.emphasised(&ctx.view_focus_active(), &ctx.window_active_signal())); RowRoles { style, on_selected, @@ -1645,6 +1648,131 @@ mod tests { assert!(!colors.contains(&on_accent)); } + /// A solid-selection style that follows Qt's per-window colour groups: + /// only the window mutes its selection. + #[derive(Debug, Default, Clone, Copy)] + struct WindowActiveEmphasisStyle; + + impl StandardItemStyle for WindowActiveEmphasisStyle { + fn make_body( + &self, + cfg: &StandardItemStyleConfig, + ctx: &mut teksilo_core::build_context::BuildContext, + ) -> WidgetId { + crate::styles::RecipeStandardItemStyle::for_tokens(&ctx.theme().input) + .make_body(cfg, ctx) + } + + fn selected_label_role(&self) -> Option { + Some(TextRole::OnAccent) + } + + fn selection_emphasis(&self) -> teksilo_core::styles::SelectionEmphasis { + teksilo_core::styles::SelectionEmphasis::WindowActive + } + } + + /// A focus scope that never takes focus, standing in for a data view + /// (a `ListView` opens its scope the same way around its rows). + #[derive(Debug)] + struct UnfocusedView { + row: Option, + child: Option, + } + + impl Widget for UnfocusedView { + fn build(&mut self, ctx: &mut teksilo_core::build_context::BuildContext) -> Vec { + ctx.begin_view_focus(); + let id = ctx.add(self.row.take().expect("built once")); + ctx.end_view_focus(); + self.child = Some(id); + vec![id] + } + + fn layout_response(&self, proposal: SizeProposal, ctx: &LayoutContext) -> LayoutResponse { + self.child + .and_then(|id| ctx.child_size(id, proposal)) + .unwrap_or_else(|| proposal.resolve(0.0, 0.0)) + .into() + } + + fn children(&self) -> Vec { + self.child.into_iter().collect() + } + } + + /// The glyph colours of one selected row in a view that does not hold + /// focus, in a window that is active unless `window_active` says + /// otherwise. + fn unfocused_view_row_colors( + style: impl StandardItemStyle, + window_active: bool, + ) -> Vec<[u8; 4]> { + let mut tree = WidgetTree::new() + .with_theme(discriminating_theme()) + .with_text_backend(std::rc::Rc::new(std::cell::RefCell::new( + teksilo_canvas::MockTextBackend::new(), + ))); + tree.add(UnfocusedView { + row: Some( + StandardListItem::new(lit!("Row")) + .selected(Signal::new(true)) + .style(style), + ), + child: None, + }); + tree.layout(SizeProposal::exact(300.0, 40.0)); + if !window_active { + tree.set_window_active(false); + tree.layout(SizeProposal::exact(300.0, 40.0)); + } + glyph_colors(&mut tree) + } + + /// The default emphasis is unchanged: a selected row in a view that does + /// not hold focus is not emphasised, even in an active window. This also + /// proves the fixture's view really is unfocused. + #[test] + fn the_default_emphasis_mutes_a_selected_row_in_an_unfocused_view() { + let t = discriminating_theme(); + let primary = rgba8(t.colors.text_primary); + let on_accent = rgba8(t.colors.text_on_accent); + + let colors = unfocused_view_row_colors(OnAccentSelectionStyle, true); + assert!(colors.contains(&primary), "painted {colors:?}"); + assert!(!colors.contains(&on_accent)); + } + + /// A style returning `SelectionEmphasis::WindowActive` emphasises the same + /// row: the view is unfocused, but its window is active. + #[test] + fn window_active_emphasis_emphasises_a_selected_row_in_an_unfocused_view() { + let on_accent = rgba8(discriminating_theme().colors.text_on_accent); + let colors = unfocused_view_row_colors(WindowActiveEmphasisStyle, true); + assert!(colors.contains(&on_accent), "painted {colors:?}"); + } + + /// …and still mutes it once the window goes inactive. + #[test] + fn window_active_emphasis_mutes_a_selected_row_in_an_inactive_window() { + let t = discriminating_theme(); + let primary = rgba8(t.colors.text_primary); + let on_accent = rgba8(t.colors.text_on_accent); + + let colors = unfocused_view_row_colors(WindowActiveEmphasisStyle, false); + assert!(colors.contains(&primary), "painted {colors:?}"); + assert!(!colors.contains(&on_accent)); + } + + /// A style that does not override the hook keeps the rule it had. + #[test] + fn the_selection_emphasis_hook_defaults_to_view_focus_and_window_active() { + assert_eq!( + OnAccentSelectionStyle.selection_emphasis(), + teksilo_core::styles::SelectionEmphasis::ViewFocusedAndWindowActive + ); + } + #[test] fn list_item_layout_single_line() { let mut tree = WidgetTree::new().with_theme(theme()); diff --git a/crates/teksilo-widgets/src/styles/recipe_standard_item_style.rs b/crates/teksilo-widgets/src/styles/recipe_standard_item_style.rs index afc8b3d30..e626327bc 100644 --- a/crates/teksilo-widgets/src/styles/recipe_standard_item_style.rs +++ b/crates/teksilo-widgets/src/styles/recipe_standard_item_style.rs @@ -152,8 +152,9 @@ impl StandardItemStyle for RecipeStandardItemStyle { &cfg.is_pressed, &cfg.is_hovered, &cfg.is_disabled, - &cfg.is_focused, - &cfg.is_window_active, + &self + .selection_emphasis() + .emphasised(&cfg.is_focused, &cfg.is_window_active), ); // Keyboard-focus ring: drawn on the *current* item (selected, in a @@ -247,15 +248,14 @@ fn bg_signal( is_pressed: &Signal, is_hovered: &Signal, is_disabled: &Signal, - is_focused: &Signal, - is_window_active: &Signal, + emphasised: &Signal, ) -> Signal { - // Effective focus = the view holds keyboard focus AND the host window is - // active. A selected row in an inactive window desaturates exactly as it - // does when focus moves elsewhere in the same window. - let effective_focus = is_focused.and(is_window_active); + // `emphasised` is the style's `SelectionEmphasis` condition; by default + // the view holds keyboard focus AND the host window is active, so a + // selected row in an inactive window desaturates exactly as it does when + // focus moves elsewhere in the same window. let combined = is_selected.zip3(is_pressed, is_hovered); - combined.zip3(is_disabled, &effective_focus).map( + combined.zip3(is_disabled, emphasised).map( |((selected, pressed, hovered), disabled, focused)| { if *disabled { SurfaceRole::Transparent @@ -281,6 +281,7 @@ fn bg_signal( #[cfg(test)] mod tests { use super::*; + use teksilo_core::styles::SelectionEmphasis; use teksilo_tokens::SurfaceRole; #[test] @@ -297,8 +298,7 @@ mod tests { &pressed, &hovered, &disabled, - &focused, - &window_active, + &SelectionEmphasis::default().emphasised(&focused, &window_active), ); // Selected, view-focused, window-active → vivid. @@ -317,4 +317,41 @@ mod tests { focused.set(true); assert_eq!(role.get(), SurfaceRole::Selected); } + + /// The default style keeps the rule it had before the hook existed. + #[test] + fn the_recipe_keeps_the_default_selection_emphasis() { + assert_eq!( + RecipeStandardItemStyle::default().selection_emphasis(), + SelectionEmphasis::ViewFocusedAndWindowActive + ); + } + + /// Under `WindowActive` only the window mutes a selection: a view that + /// loses keyboard focus inside an active window stays vivid. + #[test] + fn window_active_emphasis_ignores_view_focus() { + let selected = Signal::new(true); + let pressed = Signal::new(false); + let hovered = Signal::new(false); + let disabled = Signal::new(false); + let focused = Signal::new(false); + let window_active = Signal::new(true); + + let role = bg_signal( + &selected, + &pressed, + &hovered, + &disabled, + &SelectionEmphasis::WindowActive.emphasised(&focused, &window_active), + ); + + assert_eq!(role.get(), SurfaceRole::Selected); + window_active.set(false); + assert_eq!(role.get(), SurfaceRole::SelectedInactive); + focused.set(true); + assert_eq!(role.get(), SurfaceRole::SelectedInactive); + window_active.set(true); + assert_eq!(role.get(), SurfaceRole::Selected); + } } diff --git a/docs/window-activation.md b/docs/window-activation.md index 531e25b8f..062954fa9 100644 --- a/docs/window-activation.md +++ b/docs/window-activation.md @@ -77,6 +77,33 @@ Keyboard focus rings grey out (not hide) in an inactive window, uniformly, via the theme-side accent projection above, no per-widget check. `MenuList` is excluded by design, an open menu is always active. +### A style chooses what mutes a list row's selection + +For `StandardListItem` / `StandardTreeItem` the "view focused **and** window +active" rule above is the default of a style hook, +`StandardItemStyle::selection_emphasis() -> SelectionEmphasis`: + +| `SelectionEmphasis` | A selected row is emphasised while | Used by | +| --- | --- | --- | +| `ViewFocusedAndWindowActive` (default) | its view holds keyboard focus and its window is active | IntUI, Fluent, macOS, Material 3 | +| `WindowActive` | its window is active, whichever view holds focus | styles following Qt's per-window colour groups (KDE's Breeze) | + +Qt picks a palette colour group per *window*: in an active window every view +paints its selection with the active `Highlight`, focused or not, so only the +window going inactive mutes it. A style that returns `WindowActive` gets that. + +The row reads the hook for its foregrounds: the label, the subtitle and a tree +row's chevron take `selected_label_role` only while the row is emphasised. A +style reads the same hook for its chrome through +`SelectionEmphasis::emphasised(&cfg.is_focused, &cfg.is_window_active)`, so a +solid selection fill and the text on it change together. The shipped +`RecipeStandardItemStyle` keeps the default, so a style that delegates its chrome +to it and returns `WindowActive` has to paint its own selection to follow its +rule. + +Tests that assume a selected row mutes when its view loses focus therefore hold +for the presets on the default only; scope them per preset. + ### Single-line fields hide their selection when *they* lose focus The table above is the **window** axis. On the **view-focus** axis the From 2c148768e7838bdf492ca66186852c0ec43c419c Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 09:40:52 +0200 Subject: [PATCH 11/59] feat(tokens): carry view and semantic colours in OsThemeColors OsThemeColors gains ten optional colours a desktop can report (view background and text, alternate row, inactive text, links, error, warning, success and focus), a `new(scheme)` constructor and PartialEq, and is now non_exhaustive so a reader can learn a new colour without breaking anyone. ColorTokens::from_os_colors maps each one when present and lifts a supplied foreground to WCAG's floor (4.5:1 text, 3:1 focus and status) on the surfaces it sits on; a report without them gives the same tokens. The lift and its measurement live in the new teksilo_tokens::contrast module (composite_contrast, lift_until_readable). MotionTokens::scaled applies a desktop animation-speed factor to every animation duration but leaves the tooltip dwell delays alone. The three platform constructions move to OsThemeColors::new, and the GTK path fills the new fields from the CSS names it already parses (theme_base_color, theme_text_color, link_color, error_color, ...). GTK has no alternate-row or secondary-text name, so those stay None there; the KDE reader is left as it was, since K5 replaces it. BREAKING CHANGE: OsThemeColors is #[non_exhaustive]; build it with OsThemeColors::new or Default outside teksilo-tokens. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 35 ++ crates/teksilo-platform/src/os_theme.rs | 91 ++++- crates/teksilo-tokens/src/contrast.rs | 232 +++++++++++++ crates/teksilo-tokens/src/lib.rs | 1 + crates/teksilo-tokens/src/motion.rs | 124 +++++++ crates/teksilo-tokens/src/os_theme_colors.rs | 78 ++++- crates/teksilo-tokens/src/theme.rs | 341 +++++++++++++++++++ 7 files changed, 887 insertions(+), 15 deletions(-) create mode 100644 crates/teksilo-tokens/src/contrast.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 34ecbbd82..4ac96e2ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,6 +69,41 @@ by crate for clarity, not because crates version independently. `MenuItem`'s label and shortcut take while the row is pressed, for a design whose pressed row is a solid fill while its hover is a pale wash. It defaults to `None`, so an existing style keeps its pressed labels. +- **Content-view and semantic colours in `OsThemeColors`.** A desktop report + can carry ten more colours: `view_bg`, `view_fg`, `alternate_bg`, + `inactive_fg`, `link`, `link_visited`, `error`, `warning`, `success` and + `focus`. `ColorTokens::from_os_colors` uses each one it is given (the + content surface and editor colours, the alternate row, secondary text, + links, the error, warning and success text and status colours, and the + focus ring), raising a supplied text colour to 4.5:1 and a focus or status + colour to 3:1 against the surfaces it sits on. A report without them gives + the same tokens as before. `OsThemeColors::new` builds a report from the + light or dark preference, and `OsThemeColors` now implements `PartialEq`. +- **`teksilo_tokens::contrast`.** `composite_contrast` gives the WCAG contrast + of a translucent colour as painted over its backdrop, and + `lift_until_readable` moves a colour toward black or white just far enough + to reach a contrast floor against every backdrop it is given. +- **`MotionTokens::scaled`.** The same motion tokens with every animation + duration multiplied by a factor, as a desktop's animation-speed setting + asks; the tooltip delays are kept, and a factor of 0 turns animation off. + +### Changed + +#### Theming + +- **Breaking.** **`OsThemeColors` is `#[non_exhaustive]`.** Outside + `teksilo-tokens` it can no longer be built with a struct literal: start from + `OsThemeColors::new(scheme)` or `OsThemeColors::default()` and assign the + fields the desktop reports. +- **The native theme takes more of a GTK theme's colours.** + **Behaviour change:** under `ThemeMode::Native` on a GNOME, Cinnamon or + other GTK desktop whose GTK theme ships its CSS (Breeze GTK, for example), + the content surface, editor text, links, error, warning and success colours + and, for Breeze GTK, the focus ring now follow the theme's + `theme_base_color`, `theme_text_color`, `link_color`, `error_color`, + `warning_color`, `success_color` and focus colour, raised to a readable + contrast where they fall short. Before, only the window, selection, button + and tooltip colours were read. ### Removed diff --git a/crates/teksilo-platform/src/os_theme.rs b/crates/teksilo-platform/src/os_theme.rs index 9d2c7ba29..db0a7d11e 100644 --- a/crates/teksilo-platform/src/os_theme.rs +++ b/crates/teksilo-platform/src/os_theme.rs @@ -90,10 +90,7 @@ mod platform { } pub(super) fn query_os_theme_colors() -> OsThemeColors { - let mut colors = OsThemeColors { - color_scheme: query_color_scheme(), - ..Default::default() - }; + let mut colors = OsThemeColors::new(query_color_scheme()); match detect_desktop() { Desktop::Kde => query_kde(&mut colors), @@ -310,6 +307,7 @@ mod platform { if colors.tooltip_fg.is_none() { colors.tooltip_fg = resolve(&["tooltip_fg_color"]); } + fill_gtk_view_colors(colors, resolve); // Derive accent from selection color if not already set if colors.accent.is_none() @@ -319,6 +317,35 @@ mod platform { } } + /// Fill the content-view and semantic colours from the GTK names that + /// carry them, leaving any a desktop reader already set. GTK themes + /// publish no alternate-row or secondary-text colour (its + /// `insensitive_fg_color` is disabled text, not secondary), so + /// `alternate_bg` and `inactive_fg` stay `None` here. Breeze GTK names its + /// links and its focus decoration only with a `_breeze` suffix, hence the + /// second name in those lists. + fn fill_gtk_view_colors( + colors: &mut OsThemeColors, + resolve: impl Fn(&[&str]) -> Option, + ) { + let fill = |slot: &mut Option, names: &[&str]| { + if slot.is_none() { + *slot = resolve(names); + } + }; + fill(&mut colors.view_bg, &["theme_base_color", "view_bg_color"]); + fill(&mut colors.view_fg, &["theme_text_color", "view_fg_color"]); + fill(&mut colors.link, &["link_color", "link_color_breeze"]); + fill( + &mut colors.link_visited, + &["link_visited_color", "link_visited_color_breeze"], + ); + fill(&mut colors.error, &["error_color"]); + fill(&mut colors.warning, &["warning_color"]); + fill(&mut colors.success, &["success_color"]); + fill(&mut colors.focus, &["theme_button_decoration_focus_breeze"]); + } + /// Load GTK CSS for a theme. Tries gtk-4.0 first, falls back to gtk-3.0. /// Also checks user override directories. fn load_gtk_css(theme_name: &str) -> String { @@ -476,6 +503,52 @@ mod platform { assert!((c.r() - 0x35 as f32 / 255.0).abs() < 0.01); } + #[test] + fn gtk_view_colors_come_from_their_css_names() { + // A cut-down Breeze GTK theme: the bare names reference the + // `_breeze` ones, and links and focus exist only suffixed. + let css = r#" +@define-color theme_base_color_breeze #ffffff; +@define-color theme_text_color_breeze #232629; +@define-color link_color_breeze #2980b9; +@define-color link_visited_color_breeze #9b59b6; +@define-color error_color_breeze #da4453; +@define-color warning_color_breeze #f67400; +@define-color success_color_breeze #27ae60; +@define-color theme_button_decoration_focus_breeze #3daee9; +@define-color theme_base_color @theme_base_color_breeze; +@define-color theme_text_color @theme_text_color_breeze; +@define-color error_color @error_color_breeze; +@define-color warning_color @warning_color_breeze; +@define-color success_color @success_color_breeze; +"#; + let defined = parse_define_colors(css); + let resolve = |names: &[&str]| names.iter().find_map(|n| resolve_color(&defined, n)); + let mut colors = OsThemeColors::new(ColorSchemePreference::Light); + // A colour a desktop reader already set is kept. + colors.success = Some(Color::BLACK); + fill_gtk_view_colors(&mut colors, resolve); + assert_eq!(colors.view_bg, Some(Color::from_hex("#ffffff"))); + assert_eq!(colors.view_fg, Some(Color::from_hex("#232629"))); + assert_eq!(colors.link, Some(Color::from_hex("#2980b9"))); + assert_eq!(colors.link_visited, Some(Color::from_hex("#9b59b6"))); + assert_eq!(colors.error, Some(Color::from_hex("#da4453"))); + assert_eq!(colors.warning, Some(Color::from_hex("#f67400"))); + assert_eq!(colors.success, Some(Color::BLACK)); + assert_eq!(colors.focus, Some(Color::from_hex("#3daee9"))); + // GTK carries neither of these. + assert_eq!(colors.alternate_bg, None); + assert_eq!(colors.inactive_fg, None); + + // A theme without the names leaves every field absent. + let empty = std::collections::HashMap::new(); + let mut colors = OsThemeColors::new(ColorSchemePreference::Dark); + fill_gtk_view_colors(&mut colors, |names: &[&str]| { + names.iter().find_map(|n| resolve_color(&empty, n)) + }); + assert_eq!(colors, OsThemeColors::new(ColorSchemePreference::Dark)); + } + #[test] fn parse_css_color_hex() { let c = parse_css_color("#3584e4").unwrap(); @@ -561,10 +634,7 @@ mod platform { } pub(super) fn query_os_theme_colors() -> OsThemeColors { - OsThemeColors { - color_scheme: query_color_scheme(), - ..Default::default() - } + OsThemeColors::new(query_color_scheme()) } } @@ -596,10 +666,7 @@ mod platform { } pub(super) fn query_os_theme_colors() -> OsThemeColors { - OsThemeColors { - color_scheme: query_color_scheme(), - ..Default::default() - } + OsThemeColors::new(query_color_scheme()) } } diff --git a/crates/teksilo-tokens/src/contrast.rs b/crates/teksilo-tokens/src/contrast.rs new file mode 100644 index 000000000..0662e7f4e --- /dev/null +++ b/crates/teksilo-tokens/src/contrast.rs @@ -0,0 +1,232 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! WCAG contrast helpers for colours a theme does not choose itself. +//! +//! A palette read from the desktop, or derived from a user's accent, can put +//! a foreground on a backdrop it was never checked against. These helpers +//! measure such a pair the way it is painted ([`composite_contrast`]) and, +//! when it falls short, move the foreground just far enough to read +//! ([`lift_until_readable`]). +//! +//! The usual floors are WCAG 2.x's: 4.5:1 for normal text (SC 1.4.3) and +//! 3:1 for the boundary of a control or a graphical object (SC 1.4.11). + +use crate::color::Color; + +/// The number of equal steps [`lift_until_readable`] takes between the +/// foreground and black or white. A step of 1 % moves an 8-bit channel by at +/// most 2.55 levels, so the lift overshoots its floor by very little. +const LIFT_STEPS: u32 = 100; + +/// The WCAG 2.x contrast ratio of `fg` painted over `bg`, in `1.0..=21.0`. +/// +/// Unlike [`Color::contrast_ratio`], which assumes both colours are already +/// opaque, this composites a translucent `fg` over `bg` first (straight +/// alpha, in sRGB, as the renderer blends), so a 40 % ink is measured as the +/// lighter colour it actually paints. `bg` is the backdrop and is treated as +/// opaque: its alpha is ignored. +pub fn composite_contrast(fg: Color, bg: Color) -> f32 { + composite_over(fg, bg).contrast_ratio(bg.with_alpha(1.0)) +} + +/// `fg`, moved toward black or toward white until it reaches `floor` against +/// every colour in `on`. +/// +/// Contrast is measured with [`composite_contrast`], so `fg`'s alpha is +/// honoured and kept: only its red, green and blue move. The direction is +/// whichever of black or white gives the higher minimum contrast over `on`, +/// so a colour on a light backdrop darkens and one on a dark backdrop +/// lightens. The colour moves in small steps and stops at the first that +/// passes, so it changes no more than it has to. +/// +/// Returns `fg` unchanged when it already passes, or when `on` is empty. When +/// no step passes (a floor above what black or white can reach on these +/// backdrops, a very translucent `fg`, or backdrops on both sides of the +/// midpoint), returns the step with the highest minimum contrast, which for a +/// single backdrop is the saturated end: black or white. +pub fn lift_until_readable(fg: Color, on: &[Color], floor: f32) -> Color { + let worst = |c: Color| -> f32 { + on.iter() + .map(|&bg| composite_contrast(c, bg)) + .fold(f32::INFINITY, f32::min) + }; + if on.is_empty() || worst(fg) >= floor { + return fg; + } + let toward = |target: Color, t: f32| -> Color { + let inv = 1.0 - t; + Color::new( + fg.r() * inv + target.r() * t, + fg.g() * inv + target.g() * t, + fg.b() * inv + target.b() * t, + fg.a(), + ) + }; + let target = if worst(toward(Color::BLACK, 1.0)) >= worst(toward(Color::WHITE, 1.0)) { + Color::BLACK + } else { + Color::WHITE + }; + let mut best = (worst(fg), fg); + for step in 1..=LIFT_STEPS { + let candidate = toward(target, step as f32 / LIFT_STEPS as f32); + let score = worst(candidate); + if score >= floor { + return candidate; + } + if score > best.0 { + best = (score, candidate); + } + } + best.1 +} + +/// `fg` composited over an opaque `bg`. +fn composite_over(fg: Color, bg: Color) -> Color { + // A NaN alpha would poison every channel; read it as opaque, the safest + // meaning of an undefined alpha for a colour meant to be read. + let a = if fg.a().is_nan() { + 1.0 + } else { + fg.a().clamp(0.0, 1.0) + }; + let inv = 1.0 - a; + Color::new( + fg.r() * a + bg.r() * inv, + fg.g() * a + bg.g() * inv, + fg.b() * a + bg.b() * inv, + 1.0, + ) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn hex(s: &str) -> Color { + Color::from_hex(s) + } + + #[test] + fn an_opaque_foreground_measures_as_contrast_ratio() { + for (fg, bg) in [ + ("#000000", "#FFFFFF"), + ("#3DAEE9", "#EFF0F1"), + ("#DA4453", "#232629"), + ] { + let (fg, bg) = (hex(fg), hex(bg)); + assert!((composite_contrast(fg, bg) - fg.contrast_ratio(bg)).abs() < 1e-5); + } + assert!((composite_contrast(Color::BLACK, Color::WHITE) - 21.0).abs() < 1e-3); + } + + #[test] + fn a_translucent_foreground_is_composited_first() { + let fg = Color::BLACK.with_alpha(0.5); + let bg = Color::WHITE; + let painted = Color::new(0.5, 0.5, 0.5, 1.0); + assert!((composite_contrast(fg, bg) - painted.contrast_ratio(bg)).abs() < 1e-5); + // `contrast_ratio` alone ignores the alpha and overstates it. + assert!(composite_contrast(fg, bg) < fg.contrast_ratio(bg)); + // A fully transparent ink is invisible. + assert!((composite_contrast(Color::BLACK.with_alpha(0.0), bg) - 1.0).abs() < 1e-5); + } + + #[test] + fn the_backdrop_alpha_is_ignored() { + let fg = hex("#336699"); + let bg = hex("#EEEEEE"); + assert_eq!( + composite_contrast(fg, bg), + composite_contrast(fg, bg.with_alpha(0.2)) + ); + } + + #[test] + fn a_readable_colour_is_returned_unchanged() { + let fg = hex("#232629"); + assert_eq!(lift_until_readable(fg, &[hex("#FFFFFF")], 4.5), fg); + assert_eq!(lift_until_readable(fg, &[], 21.0), fg); + } + + #[test] + fn a_colour_on_a_light_backdrop_darkens_just_enough() { + // Breeze's light negative text, #DA4453, is about 4.0:1 on white. + let fg = hex("#DA4453"); + let bg = Color::WHITE; + assert!(composite_contrast(fg, bg) < 4.5); + let lifted = lift_until_readable(fg, &[bg], 4.5); + let ratio = composite_contrast(lifted, bg); + assert!(ratio >= 4.5, "{ratio}"); + assert!(ratio < 4.8, "lifted further than it had to: {ratio}"); + assert!(lifted.relative_luminance() < fg.relative_luminance()); + // The hue survives: red stays the dominant channel. + assert!(lifted.r() > lifted.g() && lifted.r() > lifted.b()); + } + + #[test] + fn a_colour_on_a_dark_backdrop_lightens() { + let fg = hex("#2980B9"); + let bg = hex("#1B1E20"); + assert!(composite_contrast(fg, bg) < 4.5); + let lifted = lift_until_readable(fg, &[bg], 4.5); + assert!(composite_contrast(lifted, bg) >= 4.5); + assert!(lifted.relative_luminance() > fg.relative_luminance()); + } + + #[test] + fn every_backdrop_must_pass() { + let fg = hex("#7F8C8D"); + let on = [hex("#FFFFFF"), hex("#EFF0F1"), hex("#DEE0E2")]; + let lifted = lift_until_readable(fg, &on, 4.5); + for bg in on { + assert!(composite_contrast(lifted, bg) >= 4.5); + } + } + + #[test] + fn the_alpha_is_kept_and_counted() { + let fg = hex("#000000").with_alpha(0.35); + let bg = Color::WHITE; + let lifted = lift_until_readable(fg, &[bg], 3.0); + assert_eq!(lifted.a(), fg.a()); + // Already black: no step can darken it further, so it saturates. + assert_eq!(lifted, fg); + let grey = hex("#888888").with_alpha(0.8); + let lifted = lift_until_readable(grey, &[bg], 4.5); + assert_eq!(lifted.a(), 0.8); + assert!(composite_contrast(lifted, bg) >= 4.5); + } + + #[test] + fn an_unreachable_floor_saturates() { + let fg = hex("#808080"); + let bg = Color::WHITE; + // Nothing reaches 25:1; the lift ends at black. + assert_eq!(lift_until_readable(fg, &[bg], 25.0), Color::BLACK); + let dark = hex("#000000"); + assert_eq!(lift_until_readable(fg, &[dark], 25.0), Color::WHITE); + } + + #[test] + fn backdrops_on_both_sides_keep_the_best_step() { + // Mid grey between white and black can never reach 4.5:1 on both; + // the result is the best compromise and never worse than the input. + let fg = hex("#606060"); + let on = [Color::WHITE, Color::BLACK]; + let worst = |c: Color| { + on.iter() + .map(|&bg| composite_contrast(c, bg)) + .fold(f32::INFINITY, f32::min) + }; + let lifted = lift_until_readable(fg, &on, 4.5); + assert!(worst(lifted) >= worst(fg)); + } + + #[test] + fn a_nan_alpha_reads_as_opaque() { + let fg = Color::new(0.0, 0.0, 0.0, f32::NAN); + assert!((composite_contrast(fg, Color::WHITE) - 21.0).abs() < 1e-3); + } +} diff --git a/crates/teksilo-tokens/src/lib.rs b/crates/teksilo-tokens/src/lib.rs index 8bf80703d..c23a6a251 100644 --- a/crates/teksilo-tokens/src/lib.rs +++ b/crates/teksilo-tokens/src/lib.rs @@ -3,6 +3,7 @@ pub mod alignment; pub mod color; +pub mod contrast; pub mod input; pub mod layout; pub mod motion; diff --git a/crates/teksilo-tokens/src/motion.rs b/crates/teksilo-tokens/src/motion.rs index 4060ac93f..508dde0d1 100644 --- a/crates/teksilo-tokens/src/motion.rs +++ b/crates/teksilo-tokens/src/motion.rs @@ -188,6 +188,58 @@ impl Default for MotionTokens { } } +impl MotionTokens { + /// These tokens with every animation duration multiplied by `factor`: + /// the shape of a desktop's global animation-speed setting (KDE's + /// `AnimationDurationFactor`, where 2 is twice as slow and 0.5 twice as + /// fast). + /// + /// Scales `duration_instant`, `duration_fast`, `duration_normal`, + /// `duration_slow`, `duration_collapse` and + /// `duration_indeterminate_sweep`. The three tooltip delays are **not** + /// scaled: they are how long the pointer must rest before a tip shows, a + /// dwell rather than an animation, and slowing animations must not make + /// tooltips harder to summon. The easing is kept. + /// + /// A scaled duration is rounded to the millisecond, and a duration that + /// was not zero stays at least 1 ms, so a fast factor never turns a + /// tween into a snap by rounding. A zero duration stays zero. + /// + /// `factor` 0 (or a negative one) makes every scaled duration zero, + /// which is how the framework already reads "no animation": a + /// zero-duration tween snaps to its target, and the looping consumers + /// of `duration_indeterminate_sweep` clamp a zero period rather than + /// divide by it. A factor that is not finite (NaN or infinity) leaves + /// the tokens unchanged. Durations are capped at `u32::MAX` ms. + pub fn scaled(&self, factor: f32) -> MotionTokens { + if !factor.is_finite() { + return self.clone(); + } + let factor = f64::from(factor.max(0.0)); + let scale = |d: Duration| -> Duration { + if factor == 0.0 || d.is_zero() { + return Duration::ZERO; + } + let ms = (d.as_secs_f64() * 1000.0 * factor) + .round() + .clamp(1.0, f64::from(u32::MAX)); + Duration::from_millis(ms as u64) + }; + MotionTokens { + duration_instant: scale(self.duration_instant), + duration_fast: scale(self.duration_fast), + duration_normal: scale(self.duration_normal), + duration_slow: scale(self.duration_slow), + duration_collapse: scale(self.duration_collapse), + duration_indeterminate_sweep: scale(self.duration_indeterminate_sweep), + tooltip_delay: self.tooltip_delay, + tooltip_delay_heavy: self.tooltip_delay_heavy, + tooltip_reshow_delay: self.tooltip_reshow_delay, + easing_standard: self.easing_standard, + } + } +} + mod duration_millis { use std::time::Duration; @@ -228,6 +280,78 @@ mod tests { assert_eq!(m.tooltip_reshow_delay, Duration::from_millis(100)); } + #[test] + fn scaled_by_one_is_identity() { + let m = MotionTokens::default(); + assert_eq!(m.scaled(1.0), m); + } + + #[test] + fn scaled_multiplies_every_animation_duration() { + let m = MotionTokens::default(); + let s = m.scaled(2.0); + assert_eq!(s.duration_fast, Duration::from_millis(240)); + assert_eq!(s.duration_normal, Duration::from_millis(400)); + assert_eq!(s.duration_slow, Duration::from_millis(600)); + assert_eq!(s.duration_collapse, Duration::from_millis(400)); + assert_eq!(s.duration_indeterminate_sweep, Duration::from_millis(1800)); + let h = m.scaled(0.5); + assert_eq!(h.duration_fast, Duration::from_millis(60)); + assert_eq!(h.duration_indeterminate_sweep, Duration::from_millis(450)); + assert_eq!(h.easing_standard, m.easing_standard); + } + + #[test] + fn scaled_leaves_the_tooltip_delays_alone() { + let m = MotionTokens::default(); + for f in [0.0, 0.25, 2.0, 10.0] { + let s = m.scaled(f); + assert_eq!(s.tooltip_delay, m.tooltip_delay); + assert_eq!(s.tooltip_delay_heavy, m.tooltip_delay_heavy); + assert_eq!(s.tooltip_reshow_delay, m.tooltip_reshow_delay); + } + } + + #[test] + fn scaled_rounds_and_keeps_a_non_zero_duration_non_zero() { + let m = MotionTokens { + duration_fast: Duration::from_millis(3), + duration_normal: Duration::from_micros(2500), + ..MotionTokens::default() + }; + let s = m.scaled(0.01); + assert_eq!(s.duration_fast, Duration::from_millis(1)); + assert_eq!(s.duration_slow, Duration::from_millis(3)); + // Rounded to the millisecond, half away from zero: 2.5 ms gives 3. + assert_eq!(m.scaled(1.0).duration_normal, Duration::from_millis(3)); + // A zero duration stays zero at any factor. + assert_eq!(m.scaled(4.0).duration_instant, Duration::ZERO); + } + + #[test] + fn scaled_by_zero_disables_animation() { + let s = MotionTokens::default().scaled(0.0); + for d in [ + s.duration_instant, + s.duration_fast, + s.duration_normal, + s.duration_slow, + s.duration_collapse, + s.duration_indeterminate_sweep, + ] { + assert_eq!(d, Duration::ZERO); + } + assert_eq!(MotionTokens::default().scaled(-3.0), s); + } + + #[test] + fn scaled_by_a_non_finite_factor_is_identity() { + let m = MotionTokens::default(); + assert_eq!(m.scaled(f32::NAN), m); + assert_eq!(m.scaled(f32::INFINITY), m); + assert_eq!(m.scaled(f32::NEG_INFINITY), m); + } + #[test] fn easing_boundaries() { for easing in [ diff --git a/crates/teksilo-tokens/src/os_theme_colors.rs b/crates/teksilo-tokens/src/os_theme_colors.rs index d7ec61d1a..a9fd66d7c 100644 --- a/crates/teksilo-tokens/src/os_theme_colors.rs +++ b/crates/teksilo-tokens/src/os_theme_colors.rs @@ -29,10 +29,20 @@ impl ColorSchemePreference { /// Colors read from the OS desktop environment. /// -/// All fields except `color_scheme` are `Option` — the factory method +/// All fields except `color_scheme` are `Option`: the factory method /// `ColorTokens::from_os_colors()` fills missing values from the matching -/// built-in light or dark theme. -#[derive(Debug, Clone, Default)] +/// built-in light or dark theme, and an absent field leaves its tokens +/// exactly as that theme has them. +/// +/// The struct is `#[non_exhaustive]` so a desktop reader can learn to report +/// a new colour without breaking anyone: outside this crate, start from +/// [`OsThemeColors::new`] (or `Default`) and assign the fields you have. +/// +/// Each field names where it comes from: the KDE colour-scheme key +/// (`[Colors:] ` in `kdeglobals`) and, where one exists, the GTK +/// CSS `@define-color` name a GTK theme publishes for it. +#[derive(Debug, Clone, Default, PartialEq)] +#[non_exhaustive] pub struct OsThemeColors { /// Light or dark preference. pub color_scheme: ColorSchemePreference, @@ -54,6 +64,51 @@ pub struct OsThemeColors { pub tooltip_bg: Option, /// Tooltip foreground. pub tooltip_fg: Option, + /// Background of a content view: a list, a tree, a text field, an + /// editor. KDE `[Colors:View] BackgroundNormal`; GTK `theme_base_color` + /// (libadwaita `view_bg_color`). + pub view_bg: Option, + /// Text of a content view. KDE `[Colors:View] ForegroundNormal`; GTK + /// `theme_text_color` (libadwaita `view_fg_color`). + pub view_fg: Option, + /// The alternate background of a striped list or table row. KDE + /// `[Colors:View] BackgroundAlternate`; GTK publishes no equivalent. + pub alternate_bg: Option, + /// Secondary text: less important labels, comments, placeholder-like + /// hints. Not disabled text. KDE `[Colors:View] ForegroundInactive`; GTK + /// publishes no equivalent (its `insensitive_fg_color` is disabled text). + pub inactive_fg: Option, + /// An unvisited link. KDE `[Colors:View] ForegroundLink`; GTK + /// `link_color`. + pub link: Option, + /// A visited link. KDE `[Colors:View] ForegroundVisited`; GTK + /// `link_visited_color`. + pub link_visited: Option, + /// Error text and indicators. KDE `[Colors:View] ForegroundNegative`; + /// GTK `error_color`. + pub error: Option, + /// Warning text and indicators. KDE `[Colors:View] ForegroundNeutral`; + /// GTK `warning_color`. + pub warning: Option, + /// Success text and indicators. KDE `[Colors:View] ForegroundPositive`; + /// GTK `success_color`. + pub success: Option, + /// The keyboard focus indicator. KDE `[Colors:View] DecorationFocus`; + /// GTK publishes no standard name (the Breeze GTK theme calls it + /// `theme_button_decoration_focus_breeze`). + pub focus: Option, +} + +impl OsThemeColors { + /// A report carrying only the light or dark preference, every colour + /// absent. The way to build one outside this crate, since the struct is + /// `#[non_exhaustive]`; assign the colours the desktop reports afterwards. + pub fn new(color_scheme: ColorSchemePreference) -> Self { + Self { + color_scheme, + ..Self::default() + } + } } #[cfg(test)] @@ -66,4 +121,21 @@ mod tests { assert!(!ColorSchemePreference::Light.is_dark()); assert!(!ColorSchemePreference::NoPreference.is_dark()); } + + #[test] + fn new_carries_the_scheme_and_no_colours() { + let os = OsThemeColors::new(ColorSchemePreference::Dark); + assert_eq!(os.color_scheme, ColorSchemePreference::Dark); + assert_eq!( + os, + OsThemeColors { + color_scheme: ColorSchemePreference::Dark, + ..OsThemeColors::default() + } + ); + assert_eq!( + OsThemeColors::new(ColorSchemePreference::NoPreference), + OsThemeColors::default() + ); + } } diff --git a/crates/teksilo-tokens/src/theme.rs b/crates/teksilo-tokens/src/theme.rs index 02002a0f4..d1e9e51de 100644 --- a/crates/teksilo-tokens/src/theme.rs +++ b/crates/teksilo-tokens/src/theme.rs @@ -559,6 +559,21 @@ impl ColorTokens { /// Starts from the matching built-in theme (light or dark) based on /// `color_scheme`, then overlays any color fields actually reported by /// the OS. Missing fields keep their built-in default values. + /// + /// The content-view and semantic fields map as follows, each lifted to + /// WCAG's floor on `surface_main` and `surface_content` when the OS + /// colour falls short: + /// + /// | Field | Tokens | + /// |---|---| + /// | `view_bg` | `surface_content`, `editor_bg` (and the editor's current-line and code-block tints) | + /// | `view_fg` | `editor_fg`, `editor_caret` | + /// | `alternate_bg` | `surface_alt_row` | + /// | `inactive_fg` | `text_secondary` (4.5:1) | + /// | `link` | `text_link`, `text_link_hover` (4.5:1) | + /// | `link_visited` | `text_link_visited` (4.5:1) | + /// | `error`, `warning`, `success` | `text_error` / `_warning` / `_success` (4.5:1), and `status_*_fg` (3:1, also on its `status_*_bg`) | + /// | `focus` | `focus_ring`, `border_focused` (3:1) | pub fn from_os_colors(os: &OsThemeColors) -> Self { let is_dark = os.color_scheme.is_dark(); let mut tokens = if is_dark { @@ -724,8 +739,113 @@ impl ColorTokens { tokens.scrim = Color::new(0.0, 0.0, 0.0, if is_dark { 0.64 } else { 0.32 }); } + tokens.apply_os_view_colors(os, is_dark); tokens } + + /// Overlay the content-view and semantic colours of an OS report, after + /// the window, selection and accent families are in place (they win + /// over the derivations above, which they refine). + /// + /// Each field is used only when present, so a report without them leaves + /// the tokens exactly as before. A foreground the desktop supplies is + /// checked against the surfaces it is painted on and lifted to WCAG's + /// floor when it falls short (4.5:1 for text, 3:1 for the focus ring and + /// the status glyphs): a desktop scheme was tuned for its own widgets, + /// not for every Teksilo surface. + fn apply_os_view_colors(&mut self, os: &OsThemeColors, is_dark: bool) { + use crate::contrast::lift_until_readable; + const TEXT: f32 = 4.5; + const NON_TEXT: f32 = 3.0; + + if let Some(bg) = os.view_bg { + self.surface_content = bg; + self.editor_bg = bg; + // The current-line and code-block tints follow the editor + // surface, as they do from the window background. + self.editor_current_line_bg = if is_dark { + bg.lighten(0.06) + } else { + bg.darken(0.03) + }; + self.editor_code_block_bg = if is_dark { + bg.lighten(0.08) + } else { + bg.darken(0.05) + }; + } + if let Some(fg) = os.view_fg { + self.editor_fg = fg; + self.editor_caret = fg; + } + if let Some(alt) = os.alternate_bg { + self.surface_alt_row = alt; + } + + let surfaces = [self.surface_main, self.surface_content]; + if let Some(fg) = os.inactive_fg { + self.text_secondary = lift_until_readable(fg, &surfaces, TEXT); + } + if let Some(link) = os.link { + let link = lift_until_readable(link, &surfaces, TEXT); + self.text_link = link; + // Hover moves away from the surface, so it reads at least as + // well as the link itself. + self.text_link_hover = lift_until_readable( + if is_dark { + link.lighten(0.10) + } else { + link.darken(0.10) + }, + &surfaces, + TEXT, + ); + } + if let Some(visited) = os.link_visited { + self.text_link_visited = lift_until_readable(visited, &surfaces, TEXT); + } + if let Some(error) = os.error { + self.text_error = lift_until_readable(error, &surfaces, TEXT); + self.status_error_fg = lift_until_readable( + error, + &[ + self.status_error_bg, + self.surface_main, + self.surface_content, + ], + NON_TEXT, + ); + } + if let Some(warning) = os.warning { + self.text_warning = lift_until_readable(warning, &surfaces, TEXT); + self.status_warning_fg = lift_until_readable( + warning, + &[ + self.status_warning_bg, + self.surface_main, + self.surface_content, + ], + NON_TEXT, + ); + } + if let Some(success) = os.success { + self.text_success = lift_until_readable(success, &surfaces, TEXT); + self.status_success_fg = lift_until_readable( + success, + &[ + self.status_success_bg, + self.surface_main, + self.surface_content, + ], + NON_TEXT, + ); + } + if let Some(focus) = os.focus { + let ring = lift_until_readable(focus, &surfaces, NON_TEXT); + self.focus_ring = ring; + self.border_focused = ring; + } + } } /// Okabe-Ito 8-color colorblind-safe palette (Okabe & Ito 2008). @@ -1053,6 +1173,227 @@ mod tests { assert_eq!(ColorTokens::dark_default().chart_palette.len(), 8); } + use crate::contrast::composite_contrast; + use crate::os_theme_colors::ColorSchemePreference as Scheme; + + fn os(color_scheme: Scheme) -> OsThemeColors { + OsThemeColors::new(color_scheme) + } + + /// The names of the tokens that differ between `a` and `b`, sorted, so + /// a test pins both what a field changes and that it changes nothing + /// else. + fn changed_fields(a: &ColorTokens, b: &ColorTokens) -> Vec { + let a = serde_json::to_value(a).unwrap(); + let b = serde_json::to_value(b).unwrap(); + let (a, b) = (a.as_object().unwrap(), b.as_object().unwrap()); + let mut out: Vec = a + .iter() + .filter(|(k, v)| b.get(k.as_str()) != Some(v)) + .map(|(k, _)| k.clone()) + .collect(); + out.sort_unstable(); + out + } + + #[test] + fn from_os_colors_view_bg_overrides_the_content_surface() { + for scheme in [Scheme::Light, Scheme::Dark] { + let base = ColorTokens::from_os_colors(&os(scheme)); + let bg = Color::from_hex("#FCFCFC"); + let mut report = os(scheme); + report.view_bg = Some(bg); + let t = ColorTokens::from_os_colors(&report); + assert_eq!(t.surface_content, bg); + assert_eq!(t.editor_bg, bg); + assert_ne!(t.editor_current_line_bg, bg); + assert_eq!( + changed_fields(&t, &base), + [ + "editor_bg", + "editor_code_block_bg", + "editor_current_line_bg", + "surface_content" + ] + ); + } + } + + #[test] + fn from_os_colors_view_bg_wins_over_the_window_derivation() { + let mut report = os(Scheme::Light); + report.window_bg = Some(Color::from_hex("#EFF0F1")); + report.view_bg = Some(Color::from_hex("#FFFFFF")); + let t = ColorTokens::from_os_colors(&report); + assert_eq!(t.surface_main, Color::from_hex("#EFF0F1")); + assert_eq!(t.surface_content, Color::from_hex("#FFFFFF")); + assert_eq!(t.editor_bg, Color::from_hex("#FFFFFF")); + } + + #[test] + fn from_os_colors_view_fg_overrides_the_editor_text() { + let base = ColorTokens::from_os_colors(&os(Scheme::Dark)); + let fg = Color::from_hex("#FCFCFC"); + let mut report = os(Scheme::Dark); + report.view_fg = Some(fg); + let t = ColorTokens::from_os_colors(&report); + assert_eq!(t.editor_fg, fg); + assert_eq!(t.editor_caret, fg); + assert_eq!(changed_fields(&t, &base), ["editor_caret", "editor_fg"]); + } + + #[test] + fn from_os_colors_alternate_bg_overrides_the_alt_row() { + let base = ColorTokens::from_os_colors(&os(Scheme::Light)); + let alt = Color::from_hex("#F7F7F7"); + let mut report = os(Scheme::Light); + report.alternate_bg = Some(alt); + let t = ColorTokens::from_os_colors(&report); + assert_eq!(t.surface_alt_row, alt); + assert_eq!(changed_fields(&t, &base), ["surface_alt_row"]); + } + + #[test] + fn from_os_colors_inactive_fg_overrides_secondary_text_and_is_lifted() { + let base = ColorTokens::from_os_colors(&os(Scheme::Light)); + // Readable already: taken as is. + let mut report = os(Scheme::Light); + report.inactive_fg = Some(Color::from_hex("#4D4F52")); + let t = ColorTokens::from_os_colors(&report); + assert_eq!(t.text_secondary, Color::from_hex("#4D4F52")); + assert_eq!(changed_fields(&t, &base), ["text_secondary"]); + // Breeze's #707D8A on a white view is about 4.3:1: lifted. + report.view_bg = Some(Color::WHITE); + report.inactive_fg = Some(Color::from_hex("#707D8A")); + let t = ColorTokens::from_os_colors(&report); + assert_ne!(t.text_secondary, Color::from_hex("#707D8A")); + for bg in [t.surface_main, t.surface_content] { + assert!(composite_contrast(t.text_secondary, bg) >= 4.5); + } + } + + #[test] + fn from_os_colors_links_override_and_are_lifted() { + for scheme in [Scheme::Light, Scheme::Dark] { + let base = ColorTokens::from_os_colors(&os(scheme)); + let mut report = os(scheme); + report.link = Some(Color::from_hex("#2980B9")); + report.link_visited = Some(Color::from_hex("#9B59B6")); + let t = ColorTokens::from_os_colors(&report); + assert_eq!( + changed_fields(&t, &base), + ["text_link", "text_link_hover", "text_link_visited"] + ); + for c in [t.text_link, t.text_link_hover, t.text_link_visited] { + for bg in [t.surface_main, t.surface_content] { + assert!(composite_contrast(c, bg) >= 4.5, "{scheme:?} {c:?}"); + } + } + assert_ne!(t.text_link, t.text_link_hover); + } + // A readable link is taken exactly. + let mut report = os(Scheme::Light); + report.link = Some(Color::from_hex("#1D5E8A")); + let t = ColorTokens::from_os_colors(&report); + assert_eq!(t.text_link, Color::from_hex("#1D5E8A")); + } + + #[test] + fn from_os_colors_semantic_colours_override_text_and_status() { + for scheme in [Scheme::Light, Scheme::Dark] { + let base = ColorTokens::from_os_colors(&os(scheme)); + let mut report = os(scheme); + report.error = Some(Color::from_hex("#DA4453")); + report.warning = Some(Color::from_hex("#F67400")); + report.success = Some(Color::from_hex("#27AE60")); + let t = ColorTokens::from_os_colors(&report); + assert_eq!( + changed_fields(&t, &base), + [ + "status_error_fg", + "status_success_fg", + "status_warning_fg", + "text_error", + "text_success", + "text_warning" + ] + ); + for (text, status, status_bg) in [ + (t.text_error, t.status_error_fg, t.status_error_bg), + (t.text_warning, t.status_warning_fg, t.status_warning_bg), + (t.text_success, t.status_success_fg, t.status_success_bg), + ] { + for bg in [t.surface_main, t.surface_content] { + assert!(composite_contrast(text, bg) >= 4.5, "{scheme:?} {text:?}"); + assert!( + composite_contrast(status, bg) >= 3.0, + "{scheme:?} {status:?}" + ); + } + assert!(composite_contrast(status, status_bg) >= 3.0); + } + } + // Readable values are taken exactly. + let mut report = os(Scheme::Light); + report.error = Some(Color::from_hex("#A0202C")); + let t = ColorTokens::from_os_colors(&report); + assert_eq!(t.text_error, Color::from_hex("#A0202C")); + assert_eq!(t.status_error_fg, Color::from_hex("#A0202C")); + } + + #[test] + fn from_os_colors_focus_overrides_the_ring_and_is_lifted() { + for scheme in [Scheme::Light, Scheme::Dark] { + let base = ColorTokens::from_os_colors(&os(scheme)); + let mut report = os(scheme); + report.focus = Some(Color::from_hex("#3DAEE9")); + let t = ColorTokens::from_os_colors(&report); + assert_eq!(changed_fields(&t, &base), ["border_focused", "focus_ring"]); + assert_eq!(t.focus_ring, t.border_focused); + for bg in [t.surface_main, t.surface_content] { + assert!(composite_contrast(t.focus_ring, bg) >= 3.0); + } + } + // The focus field wins over the accent's ring. + let mut report = os(Scheme::Dark); + report.accent = Some(Color::from_hex("#FF5500")); + report.focus = Some(Color::from_hex("#3DAEE9")); + let t = ColorTokens::from_os_colors(&report); + assert_eq!(t.accent, Color::from_hex("#FF5500")); + assert_eq!(t.focus_ring, Color::from_hex("#3DAEE9")); + } + + #[test] + fn from_os_colors_without_the_new_fields_is_unchanged() { + // The pre-existing fields alone give the same tokens whether the + // report is built with `new` or as a literal: no new field leaks in. + let mut report = os(Scheme::Dark); + report.window_bg = Some(Color::from_hex("#202326")); + report.window_fg = Some(Color::from_hex("#FCFCFC")); + report.selection_bg = Some(Color::from_hex("#3DAEE9")); + report.accent = Some(Color::from_hex("#3DAEE9")); + let literal = OsThemeColors { + color_scheme: Scheme::Dark, + accent: Some(Color::from_hex("#3DAEE9")), + window_bg: Some(Color::from_hex("#202326")), + window_fg: Some(Color::from_hex("#FCFCFC")), + selection_bg: Some(Color::from_hex("#3DAEE9")), + ..Default::default() + }; + assert_eq!( + ColorTokens::from_os_colors(&report), + ColorTokens::from_os_colors(&literal) + ); + assert_eq!( + ColorTokens::from_os_colors(&os(Scheme::Light)), + ColorTokens::light_default() + ); + assert_eq!( + ColorTokens::from_os_colors(&os(Scheme::Dark)), + ColorTokens::dark_default() + ); + } + #[test] fn from_os_colors_accent_takes_precedence_over_selection() { let accent = Color::from_hex("#FF0000"); From 3cad640ceb86a233387cab5b3549bec4376972d3 Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 10:43:37 +0200 Subject: [PATCH 12/59] feat(kde-scheme): add the KDE configuration and colour-scheme reader New crate teksilo-kde-scheme, MPL-2.0, depending on teksilo-tokens and thiserror only. It does no I/O: the environment comes in as a getter and files as text. Everything is implemented from the prose of engineering/docs/kde-breeze-spec.md (sections a, b, c and j). config: KConfig::parse never fails and reports ParseDiagnostics. It covers nested groups, [$i] on a key, a group or a whole file, [$d], [$e] (expanded on string reads through an injected ExpansionEnv; $(cmd) reads back as (cmd) and nothing is executed), ignored locale keys, escapes, comments, CRLF, a byte order mark kept in the first line and reported, lossy UTF-8, the 1.5 MiB line and 100-error limits, and the last duplicate winning unless an earlier one was immutable. KConfig::cascade merges layers lowest priority first with the immutable-entry, immutable-group (default and user layer) and file-immutable rules. locations: KdeConfigLocations::from_env resolves the XDG homes and directory lists with their defaults, prepends kdedefaults in a KDE session, and lists the kdeglobals and breezerc cascades, data-file candidates and the b.8 scheme-file fallback. No KDE_COLOR_SCHEME_PATH variable is read. is_kde_session follows b.10. color: KdeColor keeps 16-bit channels and converts to Color at the boundary; it parses r,g,b[,a], the 3, 6, 8, 9 and 12 digit hex forms and the SVG 1.1 keywords, with empty, invalid and malformed values absent. scheme: ColorSet, ColorState, ColorRole, SetColors, StateEffect, WmColors and KdeColorScheme, with the c.3 defaults, the per-key Header fallback to Window, [Inactive] subgroups replacing their set, contrast 7 and frameContrast 0.2 clamped. breeze_light, breeze_dark, breeze_classic and kcolorscheme_defaults are Rust constants; to_kconfig_text round-trips through parse. A parsed scheme keeps its source configuration, outside equality, for operations that need the text as written. fonts: KdeFont::parse_qfont reads the 2, 10/11 and 16/17 field forms, cutting longer strings to 17 fields and mapping legacy weights. desktop: KdeDesktop gathers the scheme and its origin, the user accent, five fonts, AnimationDurationFactor, widgetStyle and the breezerc style settings from already-read layers. forceFontDPI is not read. The three breeze v6.8.0 .colors files are vendored verbatim as test fixtures (sha256 as in spec o.11) with the LGPL-2.0 text beside them. They and tests/breeze_files.rs, the one test that reads them, are excluded from the package, so the published tests still compile. NOTICE gains section 1.5, and TRADEMARKS.md lists KDE, Plasma and Breeze. Tests: grammar and malformed-input fixtures, cascade and location fixtures (this machine's kdedefaults layout, Kiosk immutability, an injected environment), scheme defaults, Header fallback, [Inactive] replacement, constants equal to the fixtures, Qt 5 and Qt 6 font strings, legacy weights at the ends of the i32 range, AnimationDurationFactor absent, 0 and 2, and three proptests (parse never panics; every reader survives and the scheme text round trips; font strings with extreme numeric fields never panic). Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 17 + Cargo.lock | 9 + Cargo.toml | 1 + NOTICE | 65 + TRADEMARKS.md | 1 + crates/teksilo-kde-scheme/Cargo.toml | 33 + crates/teksilo-kde-scheme/src/color.rs | 438 ++++++ crates/teksilo-kde-scheme/src/config.rs | 775 +++++++++++ crates/teksilo-kde-scheme/src/desktop.rs | 442 ++++++ crates/teksilo-kde-scheme/src/fonts.rs | 232 +++ crates/teksilo-kde-scheme/src/lib.rs | 64 + crates/teksilo-kde-scheme/src/locations.rs | 243 ++++ crates/teksilo-kde-scheme/src/scheme.rs | 1238 +++++++++++++++++ .../teksilo-kde-scheme/tests/breeze_files.rs | 65 + crates/teksilo-kde-scheme/tests/cascade.rs | 503 +++++++ crates/teksilo-kde-scheme/tests/desktop.rs | 216 +++ .../breeze-v6.8.0/BreezeClassic.colors | 170 +++ .../fixtures/breeze-v6.8.0/BreezeDark.colors | 210 +++ .../fixtures/breeze-v6.8.0/BreezeLight.colors | 207 +++ .../tests/fixtures/breeze-v6.8.0/LICENSE.txt | 481 +++++++ crates/teksilo-kde-scheme/tests/grammar.rs | 333 +++++ .../tests/prop_config.proptest-regressions | 7 + .../teksilo-kde-scheme/tests/prop_config.rs | 199 +++ crates/teksilo-kde-scheme/tests/scheme.rs | 340 +++++ crates/teksilo-kde-scheme/tests/values.rs | 215 +++ engineering/docs/property-testing.md | 1 + 26 files changed, 6505 insertions(+) create mode 100644 crates/teksilo-kde-scheme/Cargo.toml create mode 100644 crates/teksilo-kde-scheme/src/color.rs create mode 100644 crates/teksilo-kde-scheme/src/config.rs create mode 100644 crates/teksilo-kde-scheme/src/desktop.rs create mode 100644 crates/teksilo-kde-scheme/src/fonts.rs create mode 100644 crates/teksilo-kde-scheme/src/lib.rs create mode 100644 crates/teksilo-kde-scheme/src/locations.rs create mode 100644 crates/teksilo-kde-scheme/src/scheme.rs create mode 100644 crates/teksilo-kde-scheme/tests/breeze_files.rs create mode 100644 crates/teksilo-kde-scheme/tests/cascade.rs create mode 100644 crates/teksilo-kde-scheme/tests/desktop.rs create mode 100644 crates/teksilo-kde-scheme/tests/fixtures/breeze-v6.8.0/BreezeClassic.colors create mode 100644 crates/teksilo-kde-scheme/tests/fixtures/breeze-v6.8.0/BreezeDark.colors create mode 100644 crates/teksilo-kde-scheme/tests/fixtures/breeze-v6.8.0/BreezeLight.colors create mode 100644 crates/teksilo-kde-scheme/tests/fixtures/breeze-v6.8.0/LICENSE.txt create mode 100644 crates/teksilo-kde-scheme/tests/grammar.rs create mode 100644 crates/teksilo-kde-scheme/tests/prop_config.proptest-regressions create mode 100644 crates/teksilo-kde-scheme/tests/prop_config.rs create mode 100644 crates/teksilo-kde-scheme/tests/scheme.rs create mode 100644 crates/teksilo-kde-scheme/tests/values.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ac96e2ac..395503063 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -87,6 +87,23 @@ by crate for clarity, not because crates version independently. duration multiplied by a factor, as a desktop's animation-speed setting asks; the tooltip delays are kept, and a factor of 0 turns animation off. +#### KDE Plasma + +- **New crate `teksilo-kde-scheme`.** Reads a KDE Plasma desktop's look + without touching the file system or the environment: the caller hands it + the environment and the file contents. `KConfig` parses KDE's + configuration format, with nested groups, immutable (Kiosk) entries, + groups and files, deleted entries, `[$e]` environment expansion that never + runs a command, and diagnostics instead of failures, and merges system + and user files into one cascade. `KdeConfigLocations` lists the files KDE + reads, `kdedefaults` included, from the XDG variables. `KdeColorScheme` + holds a `.colors` file or the colour groups of `kdeglobals`, every + missing key filled from KDE's defaults, and writes it back as text; + `breeze_light`, `breeze_dark` and `breeze_classic` are the stock Breeze + schemes. `KdeFont` reads Qt 5 and Qt 6 font strings, and `KdeDesktop` + gathers the scheme, the user's accent, the five desktop fonts, the + animation speed, the widget style and the Breeze style settings. + ### Changed #### Theming diff --git a/Cargo.lock b/Cargo.lock index 3e1f007bb..c404776bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11984,6 +11984,15 @@ dependencies = [ "teksilo-widgets", ] +[[package]] +name = "teksilo-kde-scheme" +version = "0.19.0" +dependencies = [ + "proptest", + "teksilo-tokens", + "thiserror 2.0.21", +] + [[package]] name = "teksilo-macros" version = "0.19.0" diff --git a/Cargo.toml b/Cargo.toml index 264498a01..1c14ab0aa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -207,6 +207,7 @@ teksilo-preview-ui = { path = "crates/teksilo-preview-ui", version = "0.19.0" } teksilo-theme-material3 = { path = "crates/teksilo-theme-material3", version = "0.19.0" } teksilo-theme-macos = { path = "crates/teksilo-theme-macos", version = "0.19.0" } teksilo-theme-fluent = { path = "crates/teksilo-theme-fluent", version = "0.19.0" } +teksilo-kde-scheme = { path = "crates/teksilo-kde-scheme", version = "0.19.0" } # Path only, no `version`: this crate is `publish = false`, so a versioned # dependency on it would have to resolve from crates.io the moment a diff --git a/NOTICE b/NOTICE index f1ee347b7..39512b7d7 100644 --- a/NOTICE +++ b/NOTICE @@ -98,6 +98,71 @@ resource file, or artwork is included, and no token value is transcribed from one. +1.5 KDE Plasma / Breeze -- crates/teksilo-kde-scheme +--------------------------------------------------------------------------- + +teksilo-kde-scheme reads the files a KDE Plasma desktop keeps its look in: +the KConfig text format and its cascade, the KDE colour-scheme model, Qt's +font descriptions and the related desktop settings. Its behaviour is +re-implemented from Teksilo's own written specification, +engineering/docs/kde-breeze-spec.md, which describes KDE's formats, rules +and values in prose. No KDE or Qt source code is included in Teksilo, and +none was copied or translated: the specification was written from the +upstream sources by one author, and the code is written from the +specification alone. Values such as default colours and numeric constants +are facts; the specification's ledger records, for each one, the upstream +file and line it was observed in. + +The specification describes these upstream releases: + + plasma/breeze v6.8.0 + plasma/plasma-workspace v6.8.0 + plasma/plasma-integration v6.8.0 + plasma/xdg-desktop-portal-kde v6.8.0 + frameworks/kconfig v6.31.0 + frameworks/kcolorscheme v6.31.0 + frameworks/kguiaddons v6.31.0 + frameworks/kirigami v6.31.0 + frameworks/qqc2-desktop-style v6.31.0 + qt/qtbase v6.11.1 (the Qt runtime observed) + + Source: https://invent.kde.org/ + +KDE publishes its colour and configuration libraries under the GNU Lesser +General Public License (Plasma's colour-scheme settings under version 2.0 +only) and the Breeze widget style under the GNU General Public License, +as stated in each upstream file. Teksilo takes no code under either +licence. + +Test fixtures. Three stock Breeze colour schemes from plasma/breeze v6.8.0 +are vendored verbatim, so the tests can compare Teksilo's constants +against them: + + crates/teksilo-kde-scheme/tests/fixtures/breeze-v6.8.0/ + BreezeLight.colors c46470b75e7df3e1ebff344748b92347f8d5adfa306aef9c91c4d2edae2cd6df + BreezeDark.colors 11fce1d8ab97b529162e50eb200d1a93fab65c7612f9bebd0230a6a348d0cc21 + BreezeClassic.colors 19dcbd1883c03d2d9e0176a39e3ec9df6c18d6e22f0474e6c886aa20aff76508 + +BreezeLight.colors and BreezeDark.colors carry their own copyright and +LGPL-2.0-or-later headers; BreezeClassic.colors carries none and comes from +the same release. The GNU Library General Public License, version 2, sits +beside them as LICENSE.txt. The fixtures, and tests/breeze_files.rs, the +one test that reads them, are excluded from the published +teksilo-kde-scheme crate (the "exclude" list in its Cargo.toml) and are +never compiled into a library or binary. + +The specification describes Plasma's accent tint in OKLab, the colour space +Björn Ottosson published at https://bottosson.github.io/posts/oklab/ with +reference code under the MIT License. The space and its published matrices +are credited to him. + +KDE(R) and the K Desktop Environment(R) logo are registered trademarks of +KDE e.V. Teksilo is not affiliated with, endorsed by or sponsored by KDE +e.V.; the names KDE, Plasma and Breeze are used only to say which desktop's +files the crate reads and which design language the specification +describes. See TRADEMARKS.md. + + =========================================================================== 2. BUNDLED FONTS =========================================================================== diff --git a/TRADEMARKS.md b/TRADEMARKS.md index 0afece457..b64d2b2f5 100644 --- a/TRADEMARKS.md +++ b/TRADEMARKS.md @@ -48,6 +48,7 @@ The marks belong to their owners: - **Fluent**, **WinUI**, **Windows**, **Segoe UI**, **Consolas** — Microsoft Corporation. - **Material Design**, **Noto**, **Roboto** — Google LLC. - **Int UI**, **JetBrains**, **JetBrains Mono** — JetBrains s.r.o. +- **KDE**, **KDE Plasma**, **Plasma**, **Breeze**: KDE e.V. (KDE is a registered trademark of KDE e.V.). The `teksilo-kde-scheme` crate uses these names only to say which desktop's configuration files it reads and which design language they describe. Teksilo is not affiliated with, endorsed by, sponsored by, or certified by any of them. The presets are independent implementations by FernTech, built from published specifications and — where a vendor publishes nothing — from measurement. They are not vendor-supplied, not vendor-reviewed, and not guaranteed to match any vendor's current design. diff --git a/crates/teksilo-kde-scheme/Cargo.toml b/crates/teksilo-kde-scheme/Cargo.toml new file mode 100644 index 000000000..aebb04888 --- /dev/null +++ b/crates/teksilo-kde-scheme/Cargo.toml @@ -0,0 +1,33 @@ +# SPDX-License-Identifier: MPL-2.0 +# SPDX-FileCopyrightText: 2026 FernTech + +[package] +name = "teksilo-kde-scheme" +edition.workspace = true +version.workspace = true +license.workspace = true +publish.workspace = true +authors.workspace = true +repository.workspace = true +homepage.workspace = true +description = "KDE Plasma colour schemes, configuration cascade and desktop settings for Teksilo, with no I/O." +documentation = "https://docs.rs/teksilo-kde-scheme" +keywords = ["kde", "plasma", "breeze", "color-scheme", "kconfig"] +categories = ["gui", "config", "parser-implementations"] +# The stock Breeze `.colors` files are LGPL-2.0-or-later test fixtures, +# vendored verbatim so the tests can compare against them. They are not part +# of the published crate, and neither is `tests/breeze_files.rs`, the one +# test target that reads them: left in, it would not compile from the +# package and `cargo test` there would fail. +exclude = ["tests/fixtures/**", "tests/breeze_files.rs"] + +[dependencies] +teksilo-tokens = { workspace = true } +thiserror = { workspace = true } + +[dev-dependencies] +# Property-based testing: `tests/prop_config.rs` checks that the parser never +# panics on arbitrary bytes. `cargo-fuzz` needs a nightly toolchain, which is +# not a guaranteed CI dependency; proptest gives the same coverage plus +# shrinking on stable (see the workspace `Cargo.toml`). +proptest = { workspace = true } diff --git a/crates/teksilo-kde-scheme/src/color.rs b/crates/teksilo-kde-scheme/src/color.rs new file mode 100644 index 000000000..122cf879a --- /dev/null +++ b/crates/teksilo-kde-scheme/src/color.rs @@ -0,0 +1,438 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Colour values as KDE configuration files store them. +//! +//! A colour is held as four 16-bit channels, the precision KDE's own colour +//! arithmetic works in, so that a value read from a file and written back +//! is the same bytes. [`KdeColor::to_color`] converts to Teksilo's +//! [`Color`] at the crate boundary. +//! +//! The accepted text forms (all trimmed and escape-decoded by the +//! configuration parser first): +//! +//! | Text | Result | +//! |---|---| +//! | `r,g,b` or `r,g,b,a` | 8-bit channels, each a base-10 integer in 0..=255, optional sign and surrounding ASCII whitespace | +//! | `#rgb`, `#rrggbb`, `#aarrggbb` | 8-bit channels (a single digit `d` is `17 d`) | +//! | `#rrrgggbbb` | 12-bit channels | +//! | `#rrrrggggbbbb` | 16-bit channels, as written | +//! | an SVG 1.1 colour keyword, or `transparent` | that colour, ignoring ASCII case | +//! +//! Anything else (an empty value, `invalid`, a wrong component count, an +//! out-of-range component, another digit count after `#`, an unknown name) +//! is treated as absent, so the reader falls back to its default. KDE keeps +//! an empty or `invalid` value as an "invalid colour" that paints as black; +//! Teksilo treats it as absent instead, which is the one deliberate +//! difference. + +use std::fmt; + +use teksilo_tokens::Color; + +/// A colour with four 16-bit channels, red, green, blue and alpha, each in +/// `0..=65535`. +/// +/// An 8-bit channel `v` is stored as `257 v`, so every 8-bit colour is +/// represented exactly and [`KdeColor::to_rgba8`] gives it back. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct KdeColor { + /// Red, 0..=65535. + pub r: u16, + /// Green, 0..=65535. + pub g: u16, + /// Blue, 0..=65535. + pub b: u16, + /// Alpha, 0..=65535 (65535 is opaque). + pub a: u16, +} + +impl KdeColor { + /// Opaque black. + pub const BLACK: KdeColor = KdeColor::rgb8(0, 0, 0); + /// Opaque white. + pub const WHITE: KdeColor = KdeColor::rgb8(255, 255, 255); + /// Fully transparent black, the `transparent` keyword. + pub const TRANSPARENT: KdeColor = KdeColor::rgba8(0, 0, 0, 0); + + /// An opaque colour from 8-bit channels. + pub const fn rgb8(r: u8, g: u8, b: u8) -> KdeColor { + KdeColor::rgba8(r, g, b, 255) + } + + /// A colour from 8-bit channels, alpha included. + pub const fn rgba8(r: u8, g: u8, b: u8, a: u8) -> KdeColor { + KdeColor { + r: widen8(r), + g: widen8(g), + b: widen8(b), + a: widen8(a), + } + } + + /// A colour from 16-bit channels. + pub const fn rgba16(r: u16, g: u16, b: u16, a: u16) -> KdeColor { + KdeColor { r, g, b, a } + } + + /// The four channels reduced to 8 bits, red, green, blue, alpha. + /// + /// Each channel `q` becomes `floor((q + 128) / 257)`, which is + /// `round(q / 257)` and never ties. + pub const fn to_rgba8(self) -> [u8; 4] { + [ + narrow16(self.r), + narrow16(self.g), + narrow16(self.b), + narrow16(self.a), + ] + } + + /// Whether every 8-bit channel, alpha included, is zero: the + /// `transparent` keyword, which KDE treats as "no colour" where a key + /// may name one. + pub const fn is_transparent_black(self) -> bool { + let [r, g, b, a] = self.to_rgba8(); + r == 0 && g == 0 && b == 0 && a == 0 + } + + /// Converts to Teksilo's [`Color`], each channel `q` becoming + /// `q / 65535`. + pub fn to_color(self) -> Color { + Color::new( + f32::from(self.r) / 65535.0, + f32::from(self.g) / 65535.0, + f32::from(self.b) / 65535.0, + f32::from(self.a) / 65535.0, + ) + } + + /// Converts from Teksilo's [`Color`], each channel `c` becoming + /// `round(65535 c)` after clamping to `0..=1`. A NaN channel becomes 0. + pub fn from_color(color: Color) -> KdeColor { + KdeColor { + r: quantise(color.r()), + g: quantise(color.g()), + b: quantise(color.b()), + a: quantise(color.a()), + } + } + + /// Parses a colour value as stored in a KDE configuration file. + /// + /// Returns `None` for every value the module documentation lists as + /// absent. + pub fn parse(text: &str) -> Option { + let text = text.trim_matches(is_ascii_space); + if text.is_empty() || text == "invalid" { + return None; + } + if let Some(digits) = text.strip_prefix('#') { + return parse_hex(digits); + } + if text.contains(',') { + return parse_components(text); + } + named_color(text) + } + + /// The text KDE writes for this colour: `r,g,b` when the 8-bit alpha + /// is 255, `r,g,b,a` otherwise, each component the 8-bit channel in + /// decimal. + pub fn to_kconfig_text(self) -> String { + let [r, g, b, a] = self.to_rgba8(); + if a == 255 { + format!("{r},{g},{b}") + } else { + format!("{r},{g},{b},{a}") + } + } +} + +impl From for Color { + fn from(color: KdeColor) -> Color { + color.to_color() + } +} + +impl fmt::Display for KdeColor { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(&self.to_kconfig_text()) + } +} + +const fn widen8(v: u8) -> u16 { + // 257 * 255 = 65535, so the product never overflows. + (v as u16) * 257 +} + +const fn narrow16(q: u16) -> u8 { + // (65535 + 128) / 257 = 255, so the quotient always fits. + ((q as u32 + 128) / 257) as u8 +} + +fn quantise(c: f32) -> u16 { + if c.is_nan() { + return 0; + } + (c.clamp(0.0, 1.0) * 65535.0).round() as u16 +} + +fn is_ascii_space(c: char) -> bool { + matches!(c, ' ' | '\t' | '\n' | '\r' | '\x0b' | '\x0c') +} + +fn parse_hex(digits: &str) -> Option { + if !digits.bytes().all(|b| b.is_ascii_hexdigit()) { + return None; + } + let field = + |start: usize, len: usize| u16::from_str_radix(&digits[start..start + len], 16).ok(); + match digits.len() { + 3 => { + let r = field(0, 1)? * 17; + let g = field(1, 1)? * 17; + let b = field(2, 1)? * 17; + Some(KdeColor::rgba16(r * 257, g * 257, b * 257, u16::MAX)) + } + 6 => Some(KdeColor::rgba16( + field(0, 2)? * 257, + field(2, 2)? * 257, + field(4, 2)? * 257, + u16::MAX, + )), + 8 => Some(KdeColor::rgba16( + field(2, 2)? * 257, + field(4, 2)? * 257, + field(6, 2)? * 257, + field(0, 2)? * 257, + )), + 9 => { + let wide = |v: u16| 16 * v + v / 256; + Some(KdeColor::rgba16( + wide(field(0, 3)?), + wide(field(3, 3)?), + wide(field(6, 3)?), + u16::MAX, + )) + } + 12 => Some(KdeColor::rgba16( + field(0, 4)?, + field(4, 4)?, + field(8, 4)?, + u16::MAX, + )), + _ => None, + } +} + +fn parse_components(text: &str) -> Option { + let mut channels = [255_u8; 4]; + let mut count = 0; + for part in text.split(',') { + if count == 4 { + return None; + } + let part = part.trim_matches(is_ascii_space); + let value: i64 = part.parse().ok()?; + channels[count] = u8::try_from(value).ok()?; + count += 1; + } + if count < 3 { + return None; + } + let [r, g, b, a] = channels; + Some(KdeColor::rgba8(r, g, b, a)) +} + +fn named_color(text: &str) -> Option { + let lower = text.to_ascii_lowercase(); + if lower == "transparent" { + return Some(KdeColor::TRANSPARENT); + } + SVG_COLOR_KEYWORDS + .binary_search_by(|(name, _)| name.cmp(&lower.as_str())) + .ok() + .map(|i| { + let [r, g, b] = SVG_COLOR_KEYWORDS[i].1; + KdeColor::rgb8(r, g, b) + }) +} + +/// The SVG 1.1 colour keywords, sorted by name for binary search. +pub(crate) const SVG_COLOR_KEYWORDS: [(&str, [u8; 3]); 147] = [ + ("aliceblue", [240, 248, 255]), + ("antiquewhite", [250, 235, 215]), + ("aqua", [0, 255, 255]), + ("aquamarine", [127, 255, 212]), + ("azure", [240, 255, 255]), + ("beige", [245, 245, 220]), + ("bisque", [255, 228, 196]), + ("black", [0, 0, 0]), + ("blanchedalmond", [255, 235, 205]), + ("blue", [0, 0, 255]), + ("blueviolet", [138, 43, 226]), + ("brown", [165, 42, 42]), + ("burlywood", [222, 184, 135]), + ("cadetblue", [95, 158, 160]), + ("chartreuse", [127, 255, 0]), + ("chocolate", [210, 105, 30]), + ("coral", [255, 127, 80]), + ("cornflowerblue", [100, 149, 237]), + ("cornsilk", [255, 248, 220]), + ("crimson", [220, 20, 60]), + ("cyan", [0, 255, 255]), + ("darkblue", [0, 0, 139]), + ("darkcyan", [0, 139, 139]), + ("darkgoldenrod", [184, 134, 11]), + ("darkgray", [169, 169, 169]), + ("darkgreen", [0, 100, 0]), + ("darkgrey", [169, 169, 169]), + ("darkkhaki", [189, 183, 107]), + ("darkmagenta", [139, 0, 139]), + ("darkolivegreen", [85, 107, 47]), + ("darkorange", [255, 140, 0]), + ("darkorchid", [153, 50, 204]), + ("darkred", [139, 0, 0]), + ("darksalmon", [233, 150, 122]), + ("darkseagreen", [143, 188, 143]), + ("darkslateblue", [72, 61, 139]), + ("darkslategray", [47, 79, 79]), + ("darkslategrey", [47, 79, 79]), + ("darkturquoise", [0, 206, 209]), + ("darkviolet", [148, 0, 211]), + ("deeppink", [255, 20, 147]), + ("deepskyblue", [0, 191, 255]), + ("dimgray", [105, 105, 105]), + ("dimgrey", [105, 105, 105]), + ("dodgerblue", [30, 144, 255]), + ("firebrick", [178, 34, 34]), + ("floralwhite", [255, 250, 240]), + ("forestgreen", [34, 139, 34]), + ("fuchsia", [255, 0, 255]), + ("gainsboro", [220, 220, 220]), + ("ghostwhite", [248, 248, 255]), + ("gold", [255, 215, 0]), + ("goldenrod", [218, 165, 32]), + ("gray", [128, 128, 128]), + ("green", [0, 128, 0]), + ("greenyellow", [173, 255, 47]), + ("grey", [128, 128, 128]), + ("honeydew", [240, 255, 240]), + ("hotpink", [255, 105, 180]), + ("indianred", [205, 92, 92]), + ("indigo", [75, 0, 130]), + ("ivory", [255, 255, 240]), + ("khaki", [240, 230, 140]), + ("lavender", [230, 230, 250]), + ("lavenderblush", [255, 240, 245]), + ("lawngreen", [124, 252, 0]), + ("lemonchiffon", [255, 250, 205]), + ("lightblue", [173, 216, 230]), + ("lightcoral", [240, 128, 128]), + ("lightcyan", [224, 255, 255]), + ("lightgoldenrodyellow", [250, 250, 210]), + ("lightgray", [211, 211, 211]), + ("lightgreen", [144, 238, 144]), + ("lightgrey", [211, 211, 211]), + ("lightpink", [255, 182, 193]), + ("lightsalmon", [255, 160, 122]), + ("lightseagreen", [32, 178, 170]), + ("lightskyblue", [135, 206, 250]), + ("lightslategray", [119, 136, 153]), + ("lightslategrey", [119, 136, 153]), + ("lightsteelblue", [176, 196, 222]), + ("lightyellow", [255, 255, 224]), + ("lime", [0, 255, 0]), + ("limegreen", [50, 205, 50]), + ("linen", [250, 240, 230]), + ("magenta", [255, 0, 255]), + ("maroon", [128, 0, 0]), + ("mediumaquamarine", [102, 205, 170]), + ("mediumblue", [0, 0, 205]), + ("mediumorchid", [186, 85, 211]), + ("mediumpurple", [147, 112, 219]), + ("mediumseagreen", [60, 179, 113]), + ("mediumslateblue", [123, 104, 238]), + ("mediumspringgreen", [0, 250, 154]), + ("mediumturquoise", [72, 209, 204]), + ("mediumvioletred", [199, 21, 133]), + ("midnightblue", [25, 25, 112]), + ("mintcream", [245, 255, 250]), + ("mistyrose", [255, 228, 225]), + ("moccasin", [255, 228, 181]), + ("navajowhite", [255, 222, 173]), + ("navy", [0, 0, 128]), + ("oldlace", [253, 245, 230]), + ("olive", [128, 128, 0]), + ("olivedrab", [107, 142, 35]), + ("orange", [255, 165, 0]), + ("orangered", [255, 69, 0]), + ("orchid", [218, 112, 214]), + ("palegoldenrod", [238, 232, 170]), + ("palegreen", [152, 251, 152]), + ("paleturquoise", [175, 238, 238]), + ("palevioletred", [219, 112, 147]), + ("papayawhip", [255, 239, 213]), + ("peachpuff", [255, 218, 185]), + ("peru", [205, 133, 63]), + ("pink", [255, 192, 203]), + ("plum", [221, 160, 221]), + ("powderblue", [176, 224, 230]), + ("purple", [128, 0, 128]), + ("red", [255, 0, 0]), + ("rosybrown", [188, 143, 143]), + ("royalblue", [65, 105, 225]), + ("saddlebrown", [139, 69, 19]), + ("salmon", [250, 128, 114]), + ("sandybrown", [244, 164, 96]), + ("seagreen", [46, 139, 87]), + ("seashell", [255, 245, 238]), + ("sienna", [160, 82, 45]), + ("silver", [192, 192, 192]), + ("skyblue", [135, 206, 235]), + ("slateblue", [106, 90, 205]), + ("slategray", [112, 128, 144]), + ("slategrey", [112, 128, 144]), + ("snow", [255, 250, 250]), + ("springgreen", [0, 255, 127]), + ("steelblue", [70, 130, 180]), + ("tan", [210, 180, 140]), + ("teal", [0, 128, 128]), + ("thistle", [216, 191, 216]), + ("tomato", [255, 99, 71]), + ("turquoise", [64, 224, 208]), + ("violet", [238, 130, 238]), + ("wheat", [245, 222, 179]), + ("white", [255, 255, 255]), + ("whitesmoke", [245, 245, 245]), + ("yellow", [255, 255, 0]), + ("yellowgreen", [154, 205, 50]), +]; + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn the_keyword_table_is_sorted_and_unique_for_binary_search() { + for pair in SVG_COLOR_KEYWORDS.windows(2) { + assert!(pair[0].0 < pair[1].0, "{} before {}", pair[0].0, pair[1].0); + } + } + + #[test] + fn every_eight_bit_value_round_trips_through_sixteen_bits() { + for v in 0..=255_u8 { + assert_eq!(narrow16(widen8(v)), v); + } + } + + #[test] + fn narrowing_rounds_to_the_nearest_eight_bit_value() { + assert_eq!(narrow16(7067), 27); + assert_eq!(narrow16(128), 0); + assert_eq!(narrow16(129), 1); + assert_eq!(narrow16(u16::MAX), 255); + } +} diff --git a/crates/teksilo-kde-scheme/src/config.rs b/crates/teksilo-kde-scheme/src/config.rs new file mode 100644 index 000000000..67cc015ea --- /dev/null +++ b/crates/teksilo-kde-scheme/src/config.rs @@ -0,0 +1,775 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The KDE configuration text format and its cascade. +//! +//! [`KConfig::parse`] reads one file (one *layer*) and never fails: every +//! malformed line is skipped and reported as a [`ParseDiagnostic`]. +//! [`KConfig::cascade`] merges layers, lowest priority first, the way KDE +//! reads `kdeglobals` from the system directories and then the user's own +//! file. +//! +//! # Grammar +//! +//! - The file is split into lines at byte `0x0A` only, and each line is +//! trimmed of ASCII whitespace, so a CR before the LF goes away. +//! - An empty line, or one whose first byte is `#`, is ignored. `;` is not a +//! comment. +//! - A line starting with `[` is a group header: `[a][b]` names the group +//! `b` nested inside `a`. A nested group is a separate group; it inherits +//! nothing from its parent. A header with an unclosed segment is skipped +//! and the current group does not change. +//! - A trailing `[$i]` segment makes the group immutable; a `[$i]` line on +//! its own makes the rest of the file immutable, and no higher layer is +//! read at all. +//! - Any other line is `key=value`, both trimmed. The key may carry +//! bracketed suffixes: `[$i]` (immutable entry), `[$e]` (environment +//! expansion on string reads), `[$d]` (deleted entry, which hides the key +//! from lower layers), and a locale tag such as `[de]`. Locale-tagged +//! entries are ignored. +//! - `\s`, `\t`, `\n`, `\r`, `\\` and `\xHH` are decoded in keys, values and +//! group names. +//! - A UTF-8 byte order mark is not recognised: it stays part of the first +//! line, as KDE does, and a diagnostic names it. +//! - Text is decoded as UTF-8 with invalid sequences replaced by U+FFFD. +//! - Within one file the last occurrence of a key wins, unless an earlier +//! occurrence was immutable. +//! +//! `[$e]` expansion never runs a command: `$(cmd)` reads back as `(cmd)`. + +use std::collections::BTreeMap; +use std::fmt; + +use crate::color::KdeColor; + +/// A line longer than this many bytes is skipped. +const MAX_LINE_BYTES: usize = 1536 * 1024; + +/// After this many counted errors the rest of the file is not read. +const MAX_ERRORS: usize = 100; + +/// The UTF-8 byte order mark. +const BOM: &[u8] = b"\xEF\xBB\xBF"; + +/// Where a layer sits in a cascade, which changes how immutable groups +/// treat it. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)] +pub enum LayerKind { + /// A system file, or the user's own `system.kdeglobals`. + #[default] + Default, + /// The user's own file, the one a KDE program writes (`kdeglobals`, + /// `breezerc`). A group a lower layer made immutable ignores every + /// entry of this layer. + User, +} + +/// What a [`ParseDiagnostic`] reports. +#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)] +#[non_exhaustive] +pub enum DiagnosticKind { + /// The file starts with a UTF-8 byte order mark, which is kept as part + /// of the first line, so a group header there is not recognised. + #[error("the file starts with a UTF-8 byte order mark, which is part of the first line")] + ByteOrderMark, + /// A line longer than 1.5 MiB, skipped. + #[error("the line is longer than 1.5 MiB and was skipped")] + LineTooLong, + /// A group header segment has no closing `]`; the line was skipped and + /// the current group kept. + #[error("a group header segment has no closing `]`")] + UnclosedGroupHeader, + /// A key has a `[` with no `]` after it; the line was skipped. + #[error("a key has a `[` with no closing `]`")] + UnclosedKeyBracket, + /// A key has two locale tags; the line was skipped. + #[error("a key has more than one locale tag")] + SecondLocale, + /// An entry line has no `=` and is not a deletion; it was skipped. + #[error("the line has no `=`")] + MissingEquals, + /// An escape sequence that is not one of the recognised ones; the + /// backslash and the character after it were kept. + #[error("unknown escape sequence `\\{0}`")] + InvalidEscape(char), + /// The file reached the error limit; the rest of it was not read. + #[error("too many errors, the rest of the file was not read")] + TooManyErrors, +} + +impl DiagnosticKind { + /// Whether the diagnostic counts toward the error limit. + fn is_counted(&self) -> bool { + matches!( + self, + DiagnosticKind::UnclosedGroupHeader + | DiagnosticKind::UnclosedKeyBracket + | DiagnosticKind::SecondLocale + | DiagnosticKind::MissingEquals + | DiagnosticKind::InvalidEscape(_) + ) + } +} + +/// One problem found while parsing, with the 1-based line it is on. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ParseDiagnostic { + /// The 1-based line number. + pub line: usize, + /// What was wrong. + pub kind: DiagnosticKind, +} + +impl fmt::Display for ParseDiagnostic { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "line {}: {}", self.line, self.kind) + } +} + +/// One stored entry. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Entry { + value: Option, + immutable: bool, + expand: bool, +} + +impl Entry { + /// The decoded value, or `None` for a deleted entry. + pub fn value(&self) -> Option<&str> { + self.value.as_deref() + } + + /// Whether the entry was deleted with `[$d]`. + pub fn is_deleted(&self) -> bool { + self.value.is_none() + } + + /// Whether the entry is immutable: no later occurrence and no higher + /// layer can change it. + pub fn is_immutable(&self) -> bool { + self.immutable + } + + /// Whether the entry carries `[$e]`, so a string read expands its + /// environment variables. + pub fn expands(&self) -> bool { + self.expand + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Default)] +struct Group { + entries: BTreeMap, + immutable: bool, +} + +/// One parsed configuration file, or the merge of several. +/// +/// Groups are addressed by their path: `&[]` is the root group (entries +/// before any header), `&["General"]` is `[General]`, and +/// `&["Colors:Header", "Inactive"]` is `[Colors:Header][Inactive]`. +#[derive(Debug, Clone, PartialEq, Eq, Default)] +pub struct KConfig { + groups: BTreeMap, Group>, + file_immutable: bool, + kind: LayerKind, +} + +/// The variables a `[$e]` string read may expand. +/// +/// [`KdeConfigLocations::expansion_env`](crate::KdeConfigLocations::expansion_env) +/// builds one from the same environment the locations were read from. +pub struct ExpansionEnv<'a> { + var: &'a dyn Fn(&str) -> Option, + data_home: String, + config_home: String, + cache_home: String, +} + +impl<'a> ExpansionEnv<'a> { + /// An expansion environment that reads variables through `var` and + /// replaces an unset `QT_DATA_HOME`, `QT_CONFIG_HOME` or + /// `QT_CACHE_HOME` with the given directories. + pub fn new( + var: &'a dyn Fn(&str) -> Option, + data_home: impl Into, + config_home: impl Into, + cache_home: impl Into, + ) -> Self { + ExpansionEnv { + var, + data_home: data_home.into(), + config_home: config_home.into(), + cache_home: cache_home.into(), + } + } + + fn lookup(&self, name: &str) -> String { + match (self.var)(name) { + Some(value) => value, + None => match name { + "QT_DATA_HOME" => self.data_home.clone(), + "QT_CONFIG_HOME" => self.config_home.clone(), + "QT_CACHE_HOME" => self.cache_home.clone(), + _ => String::new(), + }, + } + } + + /// Expands the environment references in `value`. + /// + /// `$$` is a literal `$`; `${NAME}` and `$NAME` (the longest run of + /// letters, digits and `_`) are replaced by the variable's value, or by + /// nothing when it is unset or empty; a `$` followed by anything else is + /// removed, so `$(cmd)` becomes `(cmd)` and nothing is executed; a + /// trailing `$` is kept. + pub fn expand(&self, value: &str) -> String { + let mut out = String::with_capacity(value.len()); + let mut rest = value; + while let Some(at) = rest.find('$') { + out.push_str(&rest[..at]); + let after = &rest[at + 1..]; + let mut chars = after.chars(); + match chars.next() { + None => { + out.push('$'); + rest = after; + } + Some('$') => { + out.push('$'); + rest = &after[1..]; + } + Some('{') => { + let inner = &after[1..]; + let (name, next) = match inner.find('}') { + Some(end) => (&inner[..end], &inner[end + 1..]), + None => (inner, ""), + }; + if !name.is_empty() { + out.push_str(&self.lookup(name)); + } + rest = next; + } + Some(c) if is_name_char(c) => { + let end = after + .char_indices() + .find(|&(_, c)| !is_name_char(c)) + .map_or(after.len(), |(i, _)| i); + out.push_str(&self.lookup(&after[..end])); + rest = &after[end..]; + } + Some(_) => { + rest = after; + } + } + } + out.push_str(rest); + out + } +} + +impl fmt::Debug for ExpansionEnv<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("ExpansionEnv") + .field("data_home", &self.data_home) + .field("config_home", &self.config_home) + .field("cache_home", &self.cache_home) + .finish_non_exhaustive() + } +} + +fn is_name_char(c: char) -> bool { + c.is_alphanumeric() || c == '_' +} + +impl KConfig { + /// Parses one file's text. Never fails; every problem is reported in + /// the returned diagnostics and the offending line is skipped. + pub fn parse(text: &str) -> (KConfig, Vec) { + KConfig::parse_bytes(text.as_bytes()) + } + + /// Parses one file's bytes, decoding text as UTF-8 with invalid + /// sequences replaced by U+FFFD. + pub fn parse_bytes(bytes: &[u8]) -> (KConfig, Vec) { + Parser::default().run(bytes) + } + + /// The same layer, marked as the given [`LayerKind`]. + pub fn with_kind(mut self, kind: LayerKind) -> KConfig { + self.kind = kind; + self + } + + /// This layer's kind ([`LayerKind::Default`] unless set). + pub fn kind(&self) -> LayerKind { + self.kind + } + + /// Whether the layer contains a bare `[$i]` line, so no higher layer is + /// read on top of it. + pub fn is_file_immutable(&self) -> bool { + self.file_immutable + } + + /// Merges `layers`, lowest priority first. + /// + /// For each entry of each layer, in order: + /// + /// 1. an entry the merge already holds as immutable is kept; + /// 2. a key the merge does not hold yet, in a group a lower layer made + /// immutable, is ignored; + /// 3. in a [`LayerKind::User`] layer, every entry of a group a lower + /// layer made immutable is ignored; + /// 4. otherwise the entry replaces the one held (a deleted entry hides + /// the key). + /// + /// A layer that is file-immutable stops the merge: no higher layer is + /// read. The result is a [`LayerKind::Default`] layer that can itself be + /// cascaded under another file. + pub fn cascade(layers: &[KConfig]) -> KConfig { + let mut merged = KConfig::default(); + for layer in layers { + if merged.file_immutable { + break; + } + for (path, group) in &layer.groups { + let target = merged.groups.entry(path.clone()).or_default(); + let locked_by_lower = target.immutable; + if locked_by_lower && layer.kind == LayerKind::User { + continue; + } + for (key, entry) in &group.entries { + match target.entries.get(key) { + Some(held) if held.immutable => {} + None if locked_by_lower => {} + _ => { + target.entries.insert(key.clone(), entry.clone()); + } + } + } + } + for (path, group) in &layer.groups { + if group.immutable { + merged.groups.entry(path.clone()).or_default().immutable = true; + } + } + if layer.file_immutable { + merged.file_immutable = true; + } + } + merged + .groups + .retain(|_, g| !g.entries.is_empty() || g.immutable); + merged + } + + /// The stored entry for `key` in `group`, deleted entries included. + pub fn entry(&self, group: &[&str], key: &str) -> Option<&Entry> { + self.groups.get(&owned_path(group))?.entries.get(key) + } + + /// The decoded value of `key` in `group`, or `None` when it is absent + /// or deleted. Not expanded, even when the entry carries `[$e]`. + pub fn get(&self, group: &[&str], key: &str) -> Option<&str> { + self.entry(group, key)?.value() + } + + /// Whether `key` is present (and not deleted) in `group`. + pub fn has_key(&self, group: &[&str], key: &str) -> bool { + self.get(group, key).is_some() + } + + /// Whether `group` was made immutable by a `[$i]` header. + pub fn is_group_immutable(&self, group: &[&str]) -> bool { + self.groups + .get(&owned_path(group)) + .is_some_and(|g| g.immutable) + } + + /// Whether `group` exists: it, or a group nested inside it, holds at + /// least one entry that is not deleted. + pub fn group_exists(&self, group: &[&str]) -> bool { + self.groups.iter().any(|(path, g)| { + path.len() >= group.len() + && path.iter().zip(group).all(|(a, b)| a == b) + && g.entries.values().any(|e| !e.is_deleted()) + }) + } + + /// Every group path that holds an entry, in sorted order. + pub fn groups(&self) -> impl Iterator> { + self.groups + .iter() + .filter(|(_, g)| !g.entries.is_empty()) + .map(|(path, _)| path.iter().map(String::as_str).collect()) + } + + /// The present (not deleted) keys of `group`, in sorted order. + pub fn keys(&self, group: &[&str]) -> Vec<&str> { + self.groups + .get(&owned_path(group)) + .map(|g| { + g.entries + .iter() + .filter(|(_, e)| !e.is_deleted()) + .map(|(k, _)| k.as_str()) + .collect() + }) + .unwrap_or_default() + } + + /// The value of `key` in `group` read as a string: expanded through + /// `env` when the entry carries `[$e]`, as it is otherwise. + pub fn read_string(&self, group: &[&str], key: &str, env: &ExpansionEnv<'_>) -> Option { + let entry = self.entry(group, key)?; + let value = entry.value()?; + Some(if entry.expand { + env.expand(value) + } else { + value.to_owned() + }) + } + + /// The value read as a boolean: `false`, `no`, `off` and `0` (ignoring + /// ASCII case) are false and every other value, an empty one included, + /// is true. `None` when the key is absent. + pub fn read_bool(&self, group: &[&str], key: &str) -> Option { + self.get(group, key).map(parse_bool) + } + + /// The value read as a base-10 integer, or `default` when the key is + /// absent or the value does not parse. + pub fn read_int(&self, group: &[&str], key: &str, default: i64) -> i64 { + self.get(group, key) + .and_then(|v| v.parse().ok()) + .unwrap_or(default) + } + + /// The value read as a finite real number in the C locale, or `default` + /// when the key is absent or the value does not parse (a non-finite + /// value does not parse). + pub fn read_real(&self, group: &[&str], key: &str, default: f64) -> f64 { + self.get(group, key).and_then(parse_real).unwrap_or(default) + } + + /// The value read as a colour, or `None` when the key is absent or the + /// value is not a colour (see [`KdeColor::parse`]). + pub fn read_color(&self, group: &[&str], key: &str) -> Option { + self.get(group, key).and_then(KdeColor::parse) + } +} + +pub(crate) fn parse_bool(value: &str) -> bool { + !["false", "no", "off", "0"] + .iter() + .any(|f| value.eq_ignore_ascii_case(f)) +} + +pub(crate) fn parse_real(value: &str) -> Option { + value.parse::().ok().filter(|v| v.is_finite()) +} + +fn owned_path(group: &[&str]) -> Vec { + group.iter().map(|s| (*s).to_owned()).collect() +} + +fn is_trim_byte(b: u8) -> bool { + matches!(b, b' ' | b'\t' | b'\r' | b'\n' | 0x0b | 0x0c) +} + +fn trim_bytes(mut s: &[u8]) -> &[u8] { + while let [first, rest @ ..] = s { + if is_trim_byte(*first) { + s = rest; + } else { + break; + } + } + while let [rest @ .., last] = s { + if is_trim_byte(*last) { + s = rest; + } else { + break; + } + } + s +} + +/// The state of one file's parse. +#[derive(Default)] +struct Parser { + config: KConfig, + diagnostics: Vec, + errors: usize, + line: usize, + group: Vec, + /// Entries of the current group are immutable: its header carried + /// `[$i]`, or the file became immutable before it. + group_locked: bool, +} + +/// What one line asked for, so the parser can decide whether to stop. +enum Flow { + Continue, + Stop, +} + +impl Parser { + fn run(mut self, bytes: &[u8]) -> (KConfig, Vec) { + for (index, raw) in bytes.split(|&b| b == b'\n').enumerate() { + self.line = index + 1; + if index == 0 && raw.starts_with(BOM) { + self.note(DiagnosticKind::ByteOrderMark); + } + if raw.len() > MAX_LINE_BYTES { + self.note(DiagnosticKind::LineTooLong); + continue; + } + if let Flow::Stop = self.line_bytes(trim_bytes(raw)) { + break; + } + } + (self.config, self.diagnostics) + } + + /// Records a diagnostic; returns `Stop` once the error limit is hit. + fn note(&mut self, kind: DiagnosticKind) -> Flow { + let counted = kind.is_counted(); + self.diagnostics.push(ParseDiagnostic { + line: self.line, + kind, + }); + if counted { + self.errors += 1; + if self.errors >= MAX_ERRORS { + self.diagnostics.push(ParseDiagnostic { + line: self.line, + kind: DiagnosticKind::TooManyErrors, + }); + return Flow::Stop; + } + } + Flow::Continue + } + + fn line_bytes(&mut self, line: &[u8]) -> Flow { + match line.first() { + None | Some(b'#') => Flow::Continue, + Some(b'[') => self.header(line), + Some(_) => self.entry(line), + } + } + + fn header(&mut self, line: &[u8]) -> Flow { + // Split into segments `[..]`: each starts after a `[`, ends at the + // next `]`, and another follows only when the byte after `]` is `[`. + let mut segments: Vec<&[u8]> = Vec::new(); + let mut pos = 0; + let mut ends_at_line_end = false; + loop { + debug_assert_eq!(line[pos], b'['); + let start = pos + 1; + let Some(len) = line[start..].iter().position(|&b| b == b']') else { + return self.note(DiagnosticKind::UnclosedGroupHeader); + }; + segments.push(&line[start..start + len]); + let next = start + len + 1; + if next == line.len() { + ends_at_line_end = true; + break; + } + if line[next] != b'[' { + break; + } + pos = next; + } + + let mut lock_group = false; + if ends_at_line_end && segments.last() == Some(&&b"$i"[..]) { + segments.pop(); + if segments.is_empty() { + // A bare `[$i]`: the rest of the file is immutable, and the + // entries before the next header go to the empty-named group. + self.config.file_immutable = true; + self.group = vec![String::new()]; + self.group_locked = true; + return Flow::Continue; + } + lock_group = true; + } + + let mut path = Vec::with_capacity(segments.len()); + for segment in segments { + let (name, flow) = self.decode(segment); + if let Flow::Stop = flow { + return Flow::Stop; + } + path.push(name); + } + if lock_group { + self.config + .groups + .entry(path.clone()) + .or_default() + .immutable = true; + } + self.group = path; + self.group_locked = lock_group || self.config.file_immutable; + Flow::Continue + } + + fn entry(&mut self, line: &[u8]) -> Flow { + let (key_part, value_part) = match line.iter().position(|&b| b == b'=') { + Some(eq) => (trim_bytes(&line[..eq]), Some(trim_bytes(&line[eq + 1..]))), + None => (line, None), + }; + if key_part.is_empty() { + return Flow::Continue; + } + + // Peel the bracketed suffixes off the key, from the right. + let mut key = key_part; + let mut immutable = false; + let mut expand = false; + let mut delete = false; + let mut locale: Option<&[u8]> = None; + while key.last() == Some(&b']') { + let Some(open) = key.iter().rposition(|&b| b == b'[') else { + break; + }; + let inside = &key[open + 1..key.len() - 1]; + if let Some(options) = inside.strip_prefix(b"$") { + for &letter in options { + match letter { + b'i' => immutable = true, + b'e' => expand = true, + b'd' => delete = true, + _ => {} + } + } + } else if locale.is_some() { + return self.note(DiagnosticKind::SecondLocale); + } else { + locale = Some(inside); + } + key = trim_bytes(&key[..open]); + } + if let Some(open) = key.iter().rposition(|&b| b == b'[') + && !key[open..].contains(&b']') + { + return self.note(DiagnosticKind::UnclosedKeyBracket); + } + if value_part.is_none() && !delete { + return self.note(DiagnosticKind::MissingEquals); + } + + let (key, flow) = self.decode(key); + if let Flow::Stop = flow { + return Flow::Stop; + } + let value = if delete { + None + } else { + let (value, flow) = self.decode(value_part.unwrap_or_default()); + if let Flow::Stop = flow { + return Flow::Stop; + } + Some(value) + }; + if locale.is_some() || key.is_empty() { + return Flow::Continue; + } + + let entry = Entry { + value, + immutable: immutable || self.group_locked, + expand, + }; + let group = self.config.groups.entry(self.group.clone()).or_default(); + match group.entries.get(&key) { + Some(held) if held.immutable => {} + _ => { + group.entries.insert(key, entry); + } + } + Flow::Continue + } + + /// Decodes escape sequences in a key, value or group-name segment and + /// turns the bytes into text. + fn decode(&mut self, text: &[u8]) -> (String, Flow) { + if !text.contains(&b'\\') { + return (String::from_utf8_lossy(text).into_owned(), Flow::Continue); + } + let text = trim_bytes(text); + let mut out = Vec::with_capacity(text.len()); + let mut flow = Flow::Continue; + let mut i = 0; + while i < text.len() { + let b = text[i]; + if b != b'\\' { + out.push(b); + i += 1; + continue; + } + let Some(&next) = text.get(i + 1) else { + out.push(b'\\'); + break; + }; + i += 2; + match next { + b's' => out.push(b' '), + b't' => out.push(b'\t'), + b'n' => out.push(b'\n'), + b'r' => out.push(b'\r'), + b'\\' => out.push(b'\\'), + b';' | b',' => out.extend_from_slice(&[b'\\', next]), + b'x' => { + if text.len() - i < 2 { + out.push(b'x'); + break; + } + let pair = &text[i..i + 2]; + i += 2; + match std::str::from_utf8(pair) + .ok() + .and_then(|p| u8::from_str_radix(p, 16).ok()) + { + Some(byte) if pair.iter().all(u8::is_ascii_hexdigit) => out.push(byte), + _ => out.push(b'x'), + } + } + other => { + out.extend_from_slice(&[b'\\', other]); + let shown = char::from_u32(u32::from(other)).unwrap_or('\u{FFFD}'); + if let Flow::Stop = self.note(DiagnosticKind::InvalidEscape(shown)) { + flow = Flow::Stop; + } + } + } + } + (String::from_utf8_lossy(&out).into_owned(), flow) + } +} + +/// Escapes `value` so that [`KConfig::parse`] reads it back unchanged: +/// backslash, line feed, carriage return and tab are escaped, as are a +/// leading or trailing space and every other ASCII control character. +pub(crate) fn escape_value(value: &str) -> String { + let mut out = String::with_capacity(value.len()); + let last = value.chars().count().saturating_sub(1); + for (i, c) in value.chars().enumerate() { + match c { + '\\' => out.push_str("\\\\"), + '\n' => out.push_str("\\n"), + '\r' => out.push_str("\\r"), + '\t' => out.push_str("\\t"), + ' ' if i == 0 || i == last => out.push_str("\\s"), + c if c.is_ascii_control() => out.push_str(&format!("\\x{:02x}", c as u32)), + c => out.push(c), + } + } + out +} diff --git a/crates/teksilo-kde-scheme/src/desktop.rs b/crates/teksilo-kde-scheme/src/desktop.rs new file mode 100644 index 000000000..af856cde8 --- /dev/null +++ b/crates/teksilo-kde-scheme/src/desktop.rs @@ -0,0 +1,442 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The desktop settings a KDE session gives an application, read from +//! configuration layers the caller has already loaded. +//! +//! [`KdeDesktop::from_layers`] is pure: the caller finds the files with +//! [`KdeConfigLocations`](crate::KdeConfigLocations), parses the ones that +//! exist, and hands the layers over. + +use crate::color::KdeColor; +use crate::config::{ExpansionEnv, KConfig, LayerKind}; +use crate::fonts::{KdeFont, STYLE_HINT_MONOSPACE}; +use crate::scheme::KdeColorScheme; + +/// Where a desktop's colour scheme came from. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum SchemeOrigin { + /// The colour groups of `kdeglobals` itself, which has a + /// `[Colors:View]` group. Any accent the user chose is already in them. + Kdeglobals, + /// A scheme file read because `kdeglobals` has no `[Colors:View]` + /// group: the look-and-feel package's colours or the named scheme. + SchemeFile, + /// Neither: `kdeglobals` has no colours and no scheme file was found, + /// so the built-in Breeze Light scheme was used. + BuiltIn, +} + +/// The five fonts a KDE desktop configures. +#[derive(Debug, Clone, PartialEq)] +#[non_exhaustive] +pub struct KdeFonts { + /// `[General] font`, default Noto Sans 10 pt. + pub general: KdeFont, + /// `[General] fixed`, default Hack 10 pt with the monospace hint. + pub fixed: KdeFont, + /// `[General] smallestReadableFont`, default Noto Sans 8 pt. + pub small: KdeFont, + /// `[General] menuFont`, default Noto Sans 10 pt. + pub menu: KdeFont, + /// `[General] toolBarFont`, default Noto Sans 10 pt. + pub toolbar: KdeFont, +} + +impl Default for KdeFonts { + fn default() -> Self { + let regular = |family: &str, points: f64| { + let mut font = KdeFont::new(family, points); + font.style_name = Some("Regular".to_owned()); + font + }; + let mut fixed = regular("Hack", 10.0); + fixed.style_hint = STYLE_HINT_MONOSPACE; + KdeFonts { + general: regular("Noto Sans", 10.0), + fixed, + small: regular("Noto Sans", 8.0), + menu: regular("Noto Sans", 10.0), + toolbar: regular("Noto Sans", 10.0), + } + } +} + +impl KdeFonts { + fn read(config: &KConfig, env: &ExpansionEnv<'_>) -> KdeFonts { + let defaults = KdeFonts::default(); + let font = |key: &str, default: KdeFont| { + config + .read_string(&["General"], key, env) + .filter(|v| !v.is_empty()) + .and_then(|v| KdeFont::parse_qfont(&v)) + .unwrap_or(default) + }; + KdeFonts { + general: font("font", defaults.general), + fixed: font("fixed", defaults.fixed), + small: font("smallestReadableFont", defaults.small), + menu: font("menuFont", defaults.menu), + toolbar: font("toolBarFont", defaults.toolbar), + } + } +} + +/// How large a Breeze window shadow is (`[Common] ShadowSize`). +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)] +pub enum ShadowSize { + /// `ShadowNone`, 0. + None, + /// `ShadowSmall`, 1. + Small, + /// `ShadowMedium`, 2. + Medium, + /// `ShadowLarge`, 3, the default. + #[default] + Large, + /// `ShadowVeryLarge`, 4. + VeryLarge, +} + +/// When Breeze underlines mnemonics (`[Style] MnemonicsMode`). +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)] +pub enum MnemonicsMode { + /// `MN_NEVER`, 0. + Never, + /// `MN_AUTO`, 1, the default: while Alt is held. + #[default] + Auto, + /// `MN_ALWAYS`, 2. + Always, +} + +/// How many arrow buttons a Breeze scroll bar has at one end. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)] +pub enum ScrollBarButtons { + /// 0, the default. + #[default] + None, + /// 1. + Single, + /// Any other value. + Double, +} + +impl ScrollBarButtons { + fn from_code(code: i64) -> ScrollBarButtons { + match code { + 0 => ScrollBarButtons::None, + 1 => ScrollBarButtons::Single, + _ => ScrollBarButtons::Double, + } + } +} + +/// The Breeze widget-style settings of `breezerc` that change how widgets +/// look. Keys that only concern the window decoration, window dragging, +/// splitter proxies or debugging are not read. +#[derive(Debug, Clone, Copy, PartialEq)] +#[non_exhaustive] +pub struct BreezeSettings { + /// `[Common] ShadowStrength`, clamped to 25..=255 (the strength is the + /// value divided by 255). Default 255. + pub shadow_strength: u8, + /// `[Common] ShadowSize`. Default large. + pub shadow_size: ShadowSize, + /// `[Common] ShadowColor`. Default black. + pub shadow_color: KdeColor, + /// `[Style] AnimationsEnabled`. Default true. + pub animations_enabled: bool, + /// `[Style] AnimationSteps`: animation progress is quantised to + /// multiples of one over this many steps. Default 10. + pub animation_steps: i64, + /// `[Style] AnimationsDuration` in milliseconds. Default 100. A + /// `kdeglobals [KDE] AnimationDurationFactor` overrides it. + pub animations_duration_ms: i64, + /// `[Style] StackedWidgetTransitionsEnabled`. Default false. + pub stacked_widget_transitions_enabled: bool, + /// `[Style] ProgressBarAnimated`: the busy animation. Default true. + pub progress_bar_animated: bool, + /// `[Style] ProgressBarBusyStepDuration` in milliseconds. Default 800. + pub progress_bar_busy_step_duration_ms: i64, + /// `[Style] ScrollBarAddLineButtons`. Default none. + pub scroll_bar_add_line_buttons: ScrollBarButtons, + /// `[Style] ScrollBarSubLineButtons`. Default none. + pub scroll_bar_sub_line_buttons: ScrollBarButtons, + /// `[Style] MnemonicsMode`. Default automatic. + pub mnemonics_mode: MnemonicsMode, + /// `[Style] ToolBarDrawItemSeparator`. Default true. + pub tool_bar_draw_item_separator: bool, + /// `[Style] ViewDrawFocusIndicator`: the item-view focus rectangle. + /// Default true. + pub view_draw_focus_indicator: bool, + /// `[Style] SliderDrawTickMarks`. Default true. + pub slider_draw_tick_marks: bool, + /// `[Style] ViewDrawTreeBranchLines`. Default true. + pub view_draw_tree_branch_lines: bool, + /// `[Style] ViewInvertSortIndicator`. Default true. + pub view_invert_sort_indicator: bool, + /// `[Style] TabBarDrawCenteredTabs`. Default false. + pub tab_bar_draw_centered_tabs: bool, + /// `[Style] DockWidgetDrawFrame`. Default false. + pub dock_widget_draw_frame: bool, + /// `[Style] SidePanelDrawFrame`. Default false. + pub side_panel_draw_frame: bool, + /// `[Style] MenuItemDrawStrongFocus`. Default true. + pub menu_item_draw_strong_focus: bool, + /// `[Style] MenuOpacity` in percent, clamped to 0..=100. Default 100. + pub menu_opacity: u8, +} + +impl Default for BreezeSettings { + fn default() -> Self { + BreezeSettings { + shadow_strength: 255, + shadow_size: ShadowSize::Large, + shadow_color: KdeColor::BLACK, + animations_enabled: true, + animation_steps: 10, + animations_duration_ms: 100, + stacked_widget_transitions_enabled: false, + progress_bar_animated: true, + progress_bar_busy_step_duration_ms: 800, + scroll_bar_add_line_buttons: ScrollBarButtons::None, + scroll_bar_sub_line_buttons: ScrollBarButtons::None, + mnemonics_mode: MnemonicsMode::Auto, + tool_bar_draw_item_separator: true, + view_draw_focus_indicator: true, + slider_draw_tick_marks: true, + view_draw_tree_branch_lines: true, + view_invert_sort_indicator: true, + tab_bar_draw_centered_tabs: false, + dock_widget_draw_frame: false, + side_panel_draw_frame: false, + menu_item_draw_strong_focus: true, + menu_opacity: 100, + } + } +} + +impl BreezeSettings { + /// Reads the settings from a merged `breezerc`. + pub fn from_config(config: &KConfig) -> BreezeSettings { + let d = BreezeSettings::default(); + let common = &["Common"]; + let style = &["Style"]; + let flag = |key: &str, default: bool| config.read_bool(style, key).unwrap_or(default); + let int = |key: &str, default: i64| config.read_int(style, key, default); + BreezeSettings { + shadow_strength: config + .read_int(common, "ShadowStrength", i64::from(d.shadow_strength)) + .clamp(25, 255) as u8, + shadow_size: config + .get(common, "ShadowSize") + .and_then(|v| { + enum_value( + v, + &[ + "ShadowNone", + "ShadowSmall", + "ShadowMedium", + "ShadowLarge", + "ShadowVeryLarge", + ], + ) + }) + .map_or(d.shadow_size, |i| { + [ + ShadowSize::None, + ShadowSize::Small, + ShadowSize::Medium, + ShadowSize::Large, + ShadowSize::VeryLarge, + ][i] + }), + shadow_color: config + .read_color(common, "ShadowColor") + .unwrap_or(d.shadow_color), + animations_enabled: flag("AnimationsEnabled", d.animations_enabled), + animation_steps: int("AnimationSteps", d.animation_steps), + animations_duration_ms: int("AnimationsDuration", d.animations_duration_ms), + stacked_widget_transitions_enabled: flag( + "StackedWidgetTransitionsEnabled", + d.stacked_widget_transitions_enabled, + ), + progress_bar_animated: flag("ProgressBarAnimated", d.progress_bar_animated), + progress_bar_busy_step_duration_ms: int( + "ProgressBarBusyStepDuration", + d.progress_bar_busy_step_duration_ms, + ), + scroll_bar_add_line_buttons: ScrollBarButtons::from_code(int( + "ScrollBarAddLineButtons", + 0, + )), + scroll_bar_sub_line_buttons: ScrollBarButtons::from_code(int( + "ScrollBarSubLineButtons", + 0, + )), + mnemonics_mode: config + .get(style, "MnemonicsMode") + .and_then(|v| enum_value(v, &["MN_NEVER", "MN_AUTO", "MN_ALWAYS"])) + .map_or(d.mnemonics_mode, |i| { + [ + MnemonicsMode::Never, + MnemonicsMode::Auto, + MnemonicsMode::Always, + ][i] + }), + tool_bar_draw_item_separator: flag( + "ToolBarDrawItemSeparator", + d.tool_bar_draw_item_separator, + ), + view_draw_focus_indicator: flag("ViewDrawFocusIndicator", d.view_draw_focus_indicator), + slider_draw_tick_marks: flag("SliderDrawTickMarks", d.slider_draw_tick_marks), + view_draw_tree_branch_lines: flag( + "ViewDrawTreeBranchLines", + d.view_draw_tree_branch_lines, + ), + view_invert_sort_indicator: flag( + "ViewInvertSortIndicator", + d.view_invert_sort_indicator, + ), + tab_bar_draw_centered_tabs: flag( + "TabBarDrawCenteredTabs", + d.tab_bar_draw_centered_tabs, + ), + dock_widget_draw_frame: flag("DockWidgetDrawFrame", d.dock_widget_draw_frame), + side_panel_draw_frame: flag("SidePanelDrawFrame", d.side_panel_draw_frame), + menu_item_draw_strong_focus: flag( + "MenuItemDrawStrongFocus", + d.menu_item_draw_strong_focus, + ), + menu_opacity: int("MenuOpacity", i64::from(d.menu_opacity)).clamp(0, 100) as u8, + } + } +} + +/// An enumeration value stored as one of `names` (ignoring ASCII case) or +/// as its index. +fn enum_value(value: &str, names: &[&str]) -> Option { + names + .iter() + .position(|n| n.eq_ignore_ascii_case(value)) + .or_else(|| value.parse::().ok().filter(|&i| i < names.len())) +} + +/// The configuration layers a [`KdeDesktop`] is built from, each list +/// lowest priority first, as +/// [`KdeConfigLocations`](crate::KdeConfigLocations) orders them. +#[derive(Debug, Clone, Copy, Default)] +pub struct KdeDesktopLayers<'a> { + /// The `kdeglobals` cascade. + pub kdeglobals: &'a [KConfig], + /// The `breezerc` cascade. + pub breezerc: &'a [KConfig], + /// The colour-scheme file to read when `kdeglobals` has no + /// `[Colors:View]` group: the first existing candidate of + /// [`KdeConfigLocations::scheme_fallback_candidates`](crate::KdeConfigLocations::scheme_fallback_candidates). + pub scheme_file: Option<&'a KConfig>, +} + +/// What a KDE desktop configures for an application. +#[derive(Debug, Clone, PartialEq)] +#[non_exhaustive] +pub struct KdeDesktop { + /// The colour scheme in effect. + pub scheme: KdeColorScheme, + /// Where the scheme came from. + pub scheme_origin: SchemeOrigin, + /// `kdeglobals [General] AccentColor`, the accent the user chose, when + /// present, a colour, and not fully transparent black. + pub user_accent: Option, + /// The configured fonts. + pub fonts: KdeFonts, + /// `kdeglobals [KDE] AnimationDurationFactor`, `None` when absent (a + /// present value that does not parse reads as 1.0). + pub animation_duration_factor: Option, + /// `kdeglobals [KDE] widgetStyle` as stored, `None` when absent. + pub widget_style: Option, + /// The Breeze widget-style settings. + pub breeze: BreezeSettings, +} + +impl KdeDesktop { + /// A desktop with `scheme` and every other setting at its default, as a + /// KDE session with empty configuration files gives. + pub fn new(scheme: KdeColorScheme) -> KdeDesktop { + KdeDesktop { + scheme, + scheme_origin: SchemeOrigin::Kdeglobals, + user_accent: None, + fonts: KdeFonts::default(), + animation_duration_factor: None, + widget_style: None, + breeze: BreezeSettings::default(), + } + } + + /// Builds the desktop from already-read layers. + /// + /// When the merged `kdeglobals` has a `[Colors:View]` group the scheme + /// is read from it. Otherwise it is read from `layers.scheme_file`, or + /// from the built-in Breeze Light when there is none, with the + /// `kdeglobals` cascade below it, so a key the scheme file lacks still + /// comes from `kdeglobals`. String settings expand `[$e]` entries + /// through `env`. + pub fn from_layers(layers: &KdeDesktopLayers<'_>, env: &ExpansionEnv<'_>) -> KdeDesktop { + let globals = KConfig::cascade(layers.kdeglobals); + let (scheme, scheme_origin) = if globals.group_exists(&["Colors:View"]) { + ( + KdeColorScheme::from_config(&globals), + SchemeOrigin::Kdeglobals, + ) + } else { + let (file, origin) = match layers.scheme_file { + Some(file) => (file.clone(), SchemeOrigin::SchemeFile), + None => ( + KConfig::parse(&KdeColorScheme::breeze_light().to_kconfig_text()).0, + SchemeOrigin::BuiltIn, + ), + }; + let merged = KConfig::cascade(&[globals.clone(), file.with_kind(LayerKind::Default)]); + (KdeColorScheme::from_config(&merged), origin) + }; + + let kde = &["KDE"]; + let animation_duration_factor = globals + .has_key(kde, "AnimationDurationFactor") + .then(|| globals.read_real(kde, "AnimationDurationFactor", 1.0)); + + KdeDesktop { + scheme, + scheme_origin, + user_accent: globals + .read_color(&["General"], "AccentColor") + .filter(|c| !c.is_transparent_black()), + fonts: KdeFonts::read(&globals, env), + animation_duration_factor, + widget_style: globals.read_string(kde, "widgetStyle", env), + breeze: BreezeSettings::from_config(&KConfig::cascade(layers.breezerc)), + } + } + + /// The animation duration factor, 1.0 when `kdeglobals` does not set + /// one. + pub fn animation_factor(&self) -> f64 { + self.animation_duration_factor.unwrap_or(1.0) + } + + /// Whether the desktop asks for reduced motion: the animation duration + /// factor is exactly 0, as the KDE desktop portal reports it. + pub fn prefers_reduced_motion(&self) -> bool { + self.animation_duration_factor == Some(0.0) + } + + /// Whether the widget style is Breeze: `widgetStyle` absent, empty, or + /// `breeze` ignoring ASCII case. + pub fn uses_breeze_style(&self) -> bool { + self.widget_style + .as_deref() + .is_none_or(|s| s.is_empty() || s.eq_ignore_ascii_case("breeze")) + } +} diff --git a/crates/teksilo-kde-scheme/src/fonts.rs b/crates/teksilo-kde-scheme/src/fonts.rs new file mode 100644 index 000000000..f95d61205 --- /dev/null +++ b/crates/teksilo-kde-scheme/src/fonts.rs @@ -0,0 +1,232 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Fonts as KDE stores them: Qt's comma-separated font description. +//! +//! The fields, in order: family, point size, pixel size, style hint, +//! weight, style, underline, strike out, fixed pitch, a field that is +//! always 0, then either a style name (the Qt 5 form) or capitalisation, +//! letter-spacing type, letter spacing, word spacing, stretch, style +//! strategy and an optional style name (the Qt 6 form). +//! +//! [`KdeFont::parse_qfont`] accepts 2 fields (family and point size), 10 +//! or 11 (Qt 5) and 16 or 17 (Qt 6). Newer Qt versions append further +//! fields; only the first 17 are read. The weight is on the OpenType scale +//! (1 to 1000) in the Qt 6 form and on Qt 5's legacy 0 to 99 scale in the +//! Qt 5 form, which is mapped to the nearest named OpenType weight. + +/// A font's slant (field 5). +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)] +pub enum FontStyle { + /// Upright, 0 (and any value without a meaning). + #[default] + Normal, + /// Italic, 1. + Italic, + /// Oblique, 2. + Oblique, +} + +/// The style hint Qt stores for a monospace font. +pub const STYLE_HINT_MONOSPACE: i32 = 7; + +/// The style hint Qt stores when no hint was asked for. +pub const STYLE_HINT_ANY: i32 = 5; + +/// The OpenType weight of normal text. +pub const WEIGHT_NORMAL: u16 = 400; + +/// A font read from a KDE configuration key. +#[derive(Debug, Clone, PartialEq)] +#[non_exhaustive] +pub struct KdeFont { + /// The family name. + pub family: String, + /// The size in points, when set (a stored value at or below zero means + /// unset). + pub point_size: Option, + /// The size in pixels, when set (a stored value at or below zero means + /// unset). + pub pixel_size: Option, + /// Qt's style hint ([`STYLE_HINT_ANY`], [`STYLE_HINT_MONOSPACE`], ...). + pub style_hint: i32, + /// The OpenType weight, 1 to 1000 (400 is normal, 700 bold). + pub weight: u16, + /// The slant. + pub style: FontStyle, + /// Underlined. + pub underline: bool, + /// Struck out. + pub strike_out: bool, + /// Fixed pitch. + pub fixed_pitch: bool, + /// Qt's capitalisation mode (0 when absent). + pub capitalization: i32, + /// Qt's letter-spacing type (0 when absent). + pub letter_spacing_type: i32, + /// The letter spacing (0 when absent). + pub letter_spacing: f64, + /// The word spacing (0 when absent). + pub word_spacing: f64, + /// The stretch (0, "any", when absent). + pub stretch: i32, + /// Qt's style strategy (1, the default, when absent). + pub style_strategy: i32, + /// The style name, such as `Regular` or `Bold Italic`, when stored. + pub style_name: Option, +} + +/// The legacy (Qt 5) weights of the named weights, with their OpenType +/// values, lightest first. +const LEGACY_WEIGHTS: [(i32, u16); 9] = [ + (0, 100), + (12, 200), + (25, 300), + (50, 400), + (57, 500), + (63, 600), + (75, 700), + (81, 800), + (87, 900), +]; + +impl KdeFont { + /// A regular, upright font of `family` at `point_size` points, every + /// other field at its default. + pub fn new(family: impl Into, point_size: f64) -> KdeFont { + KdeFont { + family: family.into(), + point_size: Some(point_size), + pixel_size: None, + style_hint: STYLE_HINT_ANY, + weight: WEIGHT_NORMAL, + style: FontStyle::Normal, + underline: false, + strike_out: false, + fixed_pitch: false, + capitalization: 0, + letter_spacing_type: 0, + letter_spacing: 0.0, + word_spacing: 0.0, + stretch: 0, + style_strategy: 1, + style_name: None, + } + } + + /// Parses Qt's font description. Returns `None` for a field count + /// other than 2, 10, 11, 16, 17 or more, or when a numeric field does + /// not parse. + pub fn parse_qfont(text: &str) -> Option { + let fields: Vec<&str> = text.split(',').collect(); + let count = fields.len(); + let fields = &fields[..count.min(17)]; + let qt6 = match fields.len() { + 2 => None, + 10 | 11 => Some(false), + 16 | 17 => Some(true), + _ => return None, + }; + + let mut font = KdeFont::new(fields[0], 0.0); + font.point_size = Some(parse_f64(fields[1])?).filter(|&p| p > 0.0); + let Some(qt6) = qt6 else { + return Some(font); + }; + + font.pixel_size = Some(parse_i32(fields[2])?).filter(|&p| p > 0); + font.style_hint = parse_i32(fields[3])?; + let weight = parse_i32(fields[4])?; + font.weight = if qt6 { + weight.clamp(1, 1000) as u16 + } else { + legacy_weight(weight) + }; + font.style = match parse_i32(fields[5])? { + 1 => FontStyle::Italic, + 2 => FontStyle::Oblique, + _ => FontStyle::Normal, + }; + font.underline = parse_i32(fields[6])? != 0; + font.strike_out = parse_i32(fields[7])? != 0; + font.fixed_pitch = parse_i32(fields[8])? != 0; + parse_i32(fields[9])?; + + let style_name_field = if qt6 { + font.capitalization = parse_i32(fields[10])?; + font.letter_spacing_type = parse_i32(fields[11])?; + font.letter_spacing = parse_f64(fields[12])?; + font.word_spacing = parse_f64(fields[13])?; + font.stretch = parse_i32(fields[14])?; + font.style_strategy = parse_i32(fields[15])?; + fields.get(16) + } else { + fields.get(10) + }; + font.style_name = style_name_field + .filter(|name| !name.is_empty()) + .map(|name| (*name).to_owned()); + Some(font) + } + + /// The size in logical pixels: the pixel size when one is set, + /// otherwise the point size at 96 logical pixels per 72 points. `None` + /// when neither is set. + pub fn size_px(&self) -> Option { + match (self.pixel_size, self.point_size) { + (Some(px), _) => Some(f64::from(px)), + (None, Some(pt)) => Some(pt * 96.0 / 72.0), + (None, None) => None, + } + } +} + +/// Maps a Qt 5 legacy weight to the OpenType weight of the nearest named +/// weight, a tie going to the lighter one. Any `i32` is accepted: the +/// distances are taken in `i64`, so a weight a user wrote near `i32::MIN` +/// or `i32::MAX` maps to the lightest or the heaviest weight instead of +/// overflowing. +pub fn legacy_weight(weight: i32) -> u16 { + let distance = |named: i32| (i64::from(weight) - i64::from(named)).abs(); + let mut best = LEGACY_WEIGHTS[0]; + for candidate in LEGACY_WEIGHTS { + if distance(candidate.0) < distance(best.0) { + best = candidate; + } + } + best.1 +} + +fn parse_i32(field: &str) -> Option { + field.trim().parse().ok() +} + +fn parse_f64(field: &str) -> Option { + field.trim().parse::().ok().filter(|v| v.is_finite()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn legacy_weights_go_to_the_nearest_named_weight_and_ties_to_the_lighter() { + assert_eq!(legacy_weight(50), 400); + assert_eq!(legacy_weight(60), 500); + assert_eq!(legacy_weight(70), 700); + assert_eq!(legacy_weight(0), 100); + assert_eq!(legacy_weight(99), 900); + assert_eq!(legacy_weight(-5), 100); + // 6 is halfway between 0 and 12. + assert_eq!(legacy_weight(6), 100); + assert_eq!(legacy_weight(7), 200); + } + + #[test] + fn legacy_weights_at_the_ends_of_the_integer_range_do_not_overflow() { + assert_eq!(legacy_weight(i32::MIN), 100); + assert_eq!(legacy_weight(i32::MIN + 1), 100); + assert_eq!(legacy_weight(i32::MAX), 900); + assert_eq!(legacy_weight(i32::MAX - 1), 900); + } +} diff --git a/crates/teksilo-kde-scheme/src/lib.rs b/crates/teksilo-kde-scheme/src/lib.rs new file mode 100644 index 000000000..259005c40 --- /dev/null +++ b/crates/teksilo-kde-scheme/src/lib.rs @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Reading KDE Plasma's colour schemes and desktop settings. +//! +//! This crate understands the files a KDE Plasma desktop keeps its look +//! in: the configuration text format and its system-to-user cascade +//! ([`config`]), where those files live ([`locations`]), the colour values +//! they store ([`color`]), the colour-scheme model of a `.colors` file or of +//! `kdeglobals` ([`scheme`]), Qt's font descriptions ([`fonts`]) and the +//! desktop settings built from all of them ([`desktop`]). +//! +//! It does no I/O. The environment is passed in as a getter and files are +//! passed in as text, so everything here runs the same in a test as on a +//! desktop: +//! +//! ``` +//! use teksilo_kde_scheme::{KConfig, KdeColorScheme, KdeConfigLocations}; +//! +//! let env = |name: &str| match name { +//! "HOME" => Some("/home/ada".to_owned()), +//! "XDG_CURRENT_DESKTOP" => Some("KDE".to_owned()), +//! _ => None, +//! }; +//! let locations = KdeConfigLocations::from_env(env); +//! // The caller reads each existing file of the cascade. +//! let layers: Vec = locations +//! .kdeglobals_cascade() +//! .into_iter() +//! .filter(|layer| layer.path.ends_with("kdedefaults/kdeglobals")) +//! .map(|layer| KConfig::parse("[General]\nColorScheme=BreezeDark\n").0.with_kind(layer.kind)) +//! .collect(); +//! let globals = KConfig::cascade(&layers); +//! assert_eq!(globals.get(&["General"], "ColorScheme"), Some("BreezeDark")); +//! +//! let scheme = KdeColorScheme::breeze_dark(); +//! assert_eq!(scheme.contrast, 4); +//! ``` +//! +//! The behaviour is implemented from Teksilo's written specification of +//! KDE's formats (`engineering/docs/kde-breeze-spec.md` in the Teksilo +//! repository), not from KDE's code. The stock Breeze `.colors` files the +//! tests compare against are vendored as test fixtures only and are not +//! part of the published crate. + +pub mod color; +pub mod config; +pub mod desktop; +pub mod fonts; +pub mod locations; +pub mod scheme; + +pub use color::KdeColor; +pub use config::{DiagnosticKind, Entry, ExpansionEnv, KConfig, LayerKind, ParseDiagnostic}; +pub use desktop::{ + BreezeSettings, KdeDesktop, KdeDesktopLayers, KdeFonts, MnemonicsMode, SchemeOrigin, + ScrollBarButtons, ShadowSize, +}; +pub use fonts::{FontStyle, KdeFont}; +pub use locations::{ConfigLayerPath, KdeConfigLocations, is_kde_session}; +pub use scheme::{ + ColorEffect, ColorRole, ColorSet, ColorState, ContrastEffect, IntensityEffect, KdeColorScheme, + SetColors, StateEffect, WmColors, +}; diff --git a/crates/teksilo-kde-scheme/src/locations.rs b/crates/teksilo-kde-scheme/src/locations.rs new file mode 100644 index 000000000..2dec23757 --- /dev/null +++ b/crates/teksilo-kde-scheme/src/locations.rs @@ -0,0 +1,243 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Where KDE keeps its configuration and colour schemes. +//! +//! Everything here is a pure function of an environment getter: nothing +//! reads the process environment and nothing touches the file system. The +//! caller decides which candidate files exist and reads them. + +use std::path::{Path, PathBuf}; + +use crate::config::{ExpansionEnv, KConfig, LayerKind}; + +/// One file of a cascade, with the kind of layer it is. +/// +/// A cascade lists its layers lowest priority first; only files that exist +/// count, and the caller skips the others. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ConfigLayerPath { + /// The file. + pub path: PathBuf, + /// How the layer takes part in the cascade. + pub kind: LayerKind, +} + +/// The configuration and data directories KDE reads, resolved from the XDG +/// environment. +#[derive(Debug, Clone, PartialEq, Eq)] +#[non_exhaustive] +pub struct KdeConfigLocations { + /// `$HOME`, when set to an absolute path. + pub home: Option, + /// `$XDG_CONFIG_HOME`, default `$HOME/.config`. + pub config_home: Option, + /// `$XDG_CONFIG_DIRS` in the order listed (default `/etc/xdg`), with + /// `$XDG_CONFIG_HOME/kdedefaults` prepended in a KDE session when it is + /// not already listed. + pub config_dirs: Vec, + /// `$XDG_DATA_HOME`, default `$HOME/.local/share`. + pub data_home: Option, + /// `$XDG_DATA_DIRS` in the order listed, default `/usr/local/share` + /// then `/usr/share`. + pub data_dirs: Vec, + /// `$XDG_CACHE_HOME`, default `$HOME/.cache`. + pub cache_home: Option, + /// Whether the session is a KDE session ([`is_kde_session`]). + pub kde_session: bool, + /// Whether `KDE_SKIP_KDERC` is set, which leaves `/etc/kde5rc` out of + /// the `kdeglobals` cascade. + pub skip_kderc: bool, +} + +/// Whether the environment describes a KDE session: `XDG_CURRENT_DESKTOP`, +/// split at `:`, contains `KDE`, or `KDE_FULL_SESSION` is `true`. +pub fn is_kde_session(get: impl Fn(&str) -> Option) -> bool { + let desktop = get("XDG_CURRENT_DESKTOP").is_some_and(|v| v.split(':').any(|d| d == "KDE")); + desktop || get("KDE_FULL_SESSION").as_deref() == Some("true") +} + +impl KdeConfigLocations { + /// Resolves the locations from `get`, which returns an environment + /// variable's value (`None` when unset). + /// + /// An empty or relative home variable is ignored in favour of its + /// default; empty and relative entries of a directory list are dropped, + /// and a list left empty takes its default. + pub fn from_env(get: impl Fn(&str) -> Option) -> KdeConfigLocations { + let home = absolute(get("HOME")); + let under_home = |rel: &str| home.as_ref().map(|h| h.join(rel)); + let config_home = absolute(get("XDG_CONFIG_HOME")).or_else(|| under_home(".config")); + let data_home = absolute(get("XDG_DATA_HOME")).or_else(|| under_home(".local/share")); + let cache_home = absolute(get("XDG_CACHE_HOME")).or_else(|| under_home(".cache")); + let kde_session = is_kde_session(&get); + + let mut config_dirs = dir_list(get("XDG_CONFIG_DIRS"), &["/etc/xdg"]); + if kde_session && let Some(home) = &config_home { + let kdedefaults = home.join("kdedefaults"); + if !config_dirs.contains(&kdedefaults) { + config_dirs.insert(0, kdedefaults); + } + } + let data_dirs = dir_list(get("XDG_DATA_DIRS"), &["/usr/local/share", "/usr/share"]); + + KdeConfigLocations { + home, + config_home, + config_dirs, + data_home, + data_dirs, + cache_home, + kde_session, + skip_kderc: get("KDE_SKIP_KDERC").is_some(), + } + } + + /// The `kdeglobals` cascade, lowest priority first: + /// + /// 1. `/etc/kde5rc`, unless `KDE_SKIP_KDERC` is set; + /// 2. `system.kdeglobals` in each configuration directory, the last + /// listed first; + /// 3. `kdeglobals` in each configuration directory, the last listed + /// first (so `kdedefaults`, listed first in a KDE session, is the + /// highest system layer); + /// 4. the user's `system.kdeglobals`, a default layer; + /// 5. the user's `kdeglobals`, the user layer. + pub fn kdeglobals_cascade(&self) -> Vec { + let mut layers = Vec::new(); + if !self.skip_kderc { + layers.push(default_layer(PathBuf::from("/etc/kde5rc"))); + } + for name in ["system.kdeglobals", "kdeglobals"] { + for dir in self.config_dirs.iter().rev() { + layers.push(default_layer(dir.join(name))); + } + } + if let Some(home) = &self.config_home { + layers.push(default_layer(home.join("system.kdeglobals"))); + layers.push(ConfigLayerPath { + path: home.join("kdeglobals"), + kind: LayerKind::User, + }); + } + layers + } + + /// The `breezerc` cascade, lowest priority first: `breezerc` in each + /// configuration directory, the last listed first, then the user's + /// `breezerc` as the user layer. + pub fn breezerc_cascade(&self) -> Vec { + let mut layers: Vec = self + .config_dirs + .iter() + .rev() + .map(|dir| default_layer(dir.join("breezerc"))) + .collect(); + if let Some(home) = &self.config_home { + layers.push(ConfigLayerPath { + path: home.join("breezerc"), + kind: LayerKind::User, + }); + } + layers + } + + /// The candidates for a relative data path, in order of preference: + /// the data home, then each data directory as listed. The first one + /// that exists is the file. + pub fn data_file_candidates(&self, relative: impl AsRef) -> Vec { + let relative = relative.as_ref(); + self.data_home + .iter() + .chain(&self.data_dirs) + .map(|dir| dir.join(relative)) + .collect() + } + + /// The candidates for the colour scheme named `name` + /// (`color-schemes/.colors`), in order of preference. + pub fn color_scheme_file(&self, name: &str) -> Vec { + self.data_file_candidates(format!("color-schemes/{name}.colors")) + } + + /// The candidate files a palette is read from when `kdeglobals` does + /// not carry the colours itself, in order of preference; `None` when + /// the merged `kdeglobals` has a `[Colors:View]` group, which means it + /// does. + /// + /// The candidates are, each through [`Self::data_file_candidates`]: + /// the colours of the look-and-feel package (`[KDE] + /// LookAndFeelPackage`, default `org.kde.breeze.desktop`), the scheme + /// named by `[General] ColorScheme` (default `BreezeLight`), then + /// `BreezeLight`. The first that exists is read with the `kdeglobals` + /// cascade below it. + pub fn scheme_fallback_candidates( + &self, + kdeglobals: &KConfig, + env: &ExpansionEnv<'_>, + ) -> Option> { + if kdeglobals.group_exists(&["Colors:View"]) { + return None; + } + let package = kdeglobals + .read_string(&["KDE"], "LookAndFeelPackage", env) + .unwrap_or_else(|| "org.kde.breeze.desktop".to_owned()); + let scheme = kdeglobals + .read_string(&["General"], "ColorScheme", env) + .unwrap_or_else(|| "BreezeLight".to_owned()); + let mut candidates = + self.data_file_candidates(format!("plasma/look-and-feel/{package}/contents/colors")); + candidates.extend(self.color_scheme_file(&scheme)); + candidates.extend(self.color_scheme_file("BreezeLight")); + Some(candidates) + } + + /// The environment `[$e]` entries expand in: variables come from `var`, + /// and an unset `QT_DATA_HOME`, `QT_CONFIG_HOME` or `QT_CACHE_HOME` + /// reads as the matching XDG home directory. + pub fn expansion_env<'a>(&self, var: &'a dyn Fn(&str) -> Option) -> ExpansionEnv<'a> { + let text = |p: &Option| { + p.as_ref() + .map(|p| p.to_string_lossy().into_owned()) + .unwrap_or_default() + }; + ExpansionEnv::new( + var, + text(&self.data_home), + text(&self.config_home), + text(&self.cache_home), + ) + } +} + +fn default_layer(path: PathBuf) -> ConfigLayerPath { + ConfigLayerPath { + path, + kind: LayerKind::Default, + } +} + +/// XDG paths are POSIX paths and must be absolute: a value that does not +/// start with `/` is ignored, on every host. +fn is_absolute(value: &str) -> bool { + value.starts_with('/') +} + +fn absolute(value: Option) -> Option { + value.filter(|v| is_absolute(v)).map(PathBuf::from) +} + +fn dir_list(value: Option, default: &[&str]) -> Vec { + let dirs: Vec = value + .as_deref() + .unwrap_or_default() + .split(':') + .filter(|d| is_absolute(d)) + .map(PathBuf::from) + .collect(); + if dirs.is_empty() { + default.iter().map(PathBuf::from).collect() + } else { + dirs + } +} diff --git a/crates/teksilo-kde-scheme/src/scheme.rs b/crates/teksilo-kde-scheme/src/scheme.rs new file mode 100644 index 000000000..03ab9cf65 --- /dev/null +++ b/crates/teksilo-kde-scheme/src/scheme.rs @@ -0,0 +1,1238 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The KDE colour-scheme model: what a `.colors` file, or the colour groups +//! of `kdeglobals`, says. +//! +//! A scheme has seven colour sets ([`ColorSet`]), each with twelve stored +//! roles ([`ColorRole`], gathered in [`SetColors`]), an optional +//! replacement of each set for inactive windows (an `[Inactive]` subgroup), +//! the settings of the Disabled and Inactive state effects +//! ([`StateEffect`]), the title-bar colours ([`WmColors`]) and a few +//! scalars. +//! +//! [`KdeColorScheme::from_config`] fills every key a configuration lacks +//! from KDE's compiled defaults, so a scheme is always complete: +//! +//! - every set falls back to its own default table; +//! - the Header set falls back, key by key, to the same key of the Window +//! group when that group has it, and to the Header table otherwise; +//! - an `[Inactive]` subgroup replaces its set as a whole: a key it lacks +//! takes the same default the set would, never the parent group's value; +//! - `[KDE] contrast` defaults to 7 and `[KDE] frameContrast` to 0.2, +//! clamped to `0..=1`. + +use std::fmt; +use std::sync::Arc; + +use crate::color::KdeColor; +use crate::config::{KConfig, ParseDiagnostic, escape_value}; + +/// One of the seven colour sets of a scheme. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum ColorSet { + /// Content views: lists, text fields, documents. + View, + /// Window backgrounds and the controls drawn on them. + Window, + /// Push buttons. + Button, + /// Selected items and the highlight. + Selection, + /// Tooltips. + Tooltip, + /// Areas drawn in the opposite light/dark sense, such as a dark panel + /// in a light scheme. + Complementary, + /// Headers: title bars, toolbars, column headers. + Header, +} + +impl ColorSet { + /// Every set, in the order the model stores them. + pub const ALL: [ColorSet; 7] = [ + ColorSet::View, + ColorSet::Window, + ColorSet::Button, + ColorSet::Selection, + ColorSet::Tooltip, + ColorSet::Complementary, + ColorSet::Header, + ]; + + /// The configuration group the set is stored in, such as + /// `Colors:View`. + pub const fn group_name(self) -> &'static str { + match self { + ColorSet::View => "Colors:View", + ColorSet::Window => "Colors:Window", + ColorSet::Button => "Colors:Button", + ColorSet::Selection => "Colors:Selection", + ColorSet::Tooltip => "Colors:Tooltip", + ColorSet::Complementary => "Colors:Complementary", + ColorSet::Header => "Colors:Header", + } + } + + /// The set's position in [`ColorSet::ALL`]. + pub const fn index(self) -> usize { + self as usize + } +} + +/// One of the three states (colour groups) a palette is resolved for. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum ColorState { + /// A focused window's normal controls. + Active, + /// Controls in a window that does not have focus. + Inactive, + /// Disabled controls. + Disabled, +} + +impl ColorState { + /// Every state. + pub const ALL: [ColorState; 3] = [ + ColorState::Active, + ColorState::Inactive, + ColorState::Disabled, + ]; + + /// The state's position in [`ColorState::ALL`]. + pub const fn index(self) -> usize { + self as usize + } +} + +/// One of the twelve colours a set stores. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum ColorRole { + /// `BackgroundNormal`. + BackgroundNormal, + /// `BackgroundAlternate`, alternate rows. + BackgroundAlternate, + /// `ForegroundNormal`, ordinary text. + ForegroundNormal, + /// `ForegroundInactive`, secondary text. + ForegroundInactive, + /// `ForegroundActive`. + ForegroundActive, + /// `ForegroundLink`. + ForegroundLink, + /// `ForegroundVisited`. + ForegroundVisited, + /// `ForegroundNegative`, errors. + ForegroundNegative, + /// `ForegroundNeutral`, warnings. + ForegroundNeutral, + /// `ForegroundPositive`, success. + ForegroundPositive, + /// `DecorationFocus`, the focus indicator. + DecorationFocus, + /// `DecorationHover`, the hover indicator. + DecorationHover, +} + +impl ColorRole { + /// Every role, in the order [`SetColors`] declares them. + pub const ALL: [ColorRole; 12] = [ + ColorRole::BackgroundNormal, + ColorRole::BackgroundAlternate, + ColorRole::ForegroundNormal, + ColorRole::ForegroundInactive, + ColorRole::ForegroundActive, + ColorRole::ForegroundLink, + ColorRole::ForegroundVisited, + ColorRole::ForegroundNegative, + ColorRole::ForegroundNeutral, + ColorRole::ForegroundPositive, + ColorRole::DecorationFocus, + ColorRole::DecorationHover, + ]; + + /// The configuration key, such as `BackgroundNormal`. + pub const fn key(self) -> &'static str { + match self { + ColorRole::BackgroundNormal => "BackgroundNormal", + ColorRole::BackgroundAlternate => "BackgroundAlternate", + ColorRole::ForegroundNormal => "ForegroundNormal", + ColorRole::ForegroundInactive => "ForegroundInactive", + ColorRole::ForegroundActive => "ForegroundActive", + ColorRole::ForegroundLink => "ForegroundLink", + ColorRole::ForegroundVisited => "ForegroundVisited", + ColorRole::ForegroundNegative => "ForegroundNegative", + ColorRole::ForegroundNeutral => "ForegroundNeutral", + ColorRole::ForegroundPositive => "ForegroundPositive", + ColorRole::DecorationFocus => "DecorationFocus", + ColorRole::DecorationHover => "DecorationHover", + } + } +} + +/// The twelve stored colours of one set. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct SetColors { + /// `BackgroundNormal`. + pub background_normal: KdeColor, + /// `BackgroundAlternate`. + pub background_alternate: KdeColor, + /// `ForegroundNormal`. + pub foreground_normal: KdeColor, + /// `ForegroundInactive`. + pub foreground_inactive: KdeColor, + /// `ForegroundActive`. + pub foreground_active: KdeColor, + /// `ForegroundLink`. + pub foreground_link: KdeColor, + /// `ForegroundVisited`. + pub foreground_visited: KdeColor, + /// `ForegroundNegative`. + pub foreground_negative: KdeColor, + /// `ForegroundNeutral`. + pub foreground_neutral: KdeColor, + /// `ForegroundPositive`. + pub foreground_positive: KdeColor, + /// `DecorationFocus`. + pub decoration_focus: KdeColor, + /// `DecorationHover`. + pub decoration_hover: KdeColor, +} + +impl SetColors { + /// A set from its twelve colours as 8-bit triples, in + /// [`ColorRole::ALL`] order. + pub const fn from_rgb8(rows: [[u8; 3]; 12]) -> SetColors { + const fn c(rgb: [u8; 3]) -> KdeColor { + KdeColor::rgb8(rgb[0], rgb[1], rgb[2]) + } + SetColors { + background_normal: c(rows[0]), + background_alternate: c(rows[1]), + foreground_normal: c(rows[2]), + foreground_inactive: c(rows[3]), + foreground_active: c(rows[4]), + foreground_link: c(rows[5]), + foreground_visited: c(rows[6]), + foreground_negative: c(rows[7]), + foreground_neutral: c(rows[8]), + foreground_positive: c(rows[9]), + decoration_focus: c(rows[10]), + decoration_hover: c(rows[11]), + } + } + + /// The colour of `role`. + pub const fn get(&self, role: ColorRole) -> KdeColor { + match role { + ColorRole::BackgroundNormal => self.background_normal, + ColorRole::BackgroundAlternate => self.background_alternate, + ColorRole::ForegroundNormal => self.foreground_normal, + ColorRole::ForegroundInactive => self.foreground_inactive, + ColorRole::ForegroundActive => self.foreground_active, + ColorRole::ForegroundLink => self.foreground_link, + ColorRole::ForegroundVisited => self.foreground_visited, + ColorRole::ForegroundNegative => self.foreground_negative, + ColorRole::ForegroundNeutral => self.foreground_neutral, + ColorRole::ForegroundPositive => self.foreground_positive, + ColorRole::DecorationFocus => self.decoration_focus, + ColorRole::DecorationHover => self.decoration_hover, + } + } + + /// Replaces the colour of `role`. + pub fn set(&mut self, role: ColorRole, color: KdeColor) { + let slot = match role { + ColorRole::BackgroundNormal => &mut self.background_normal, + ColorRole::BackgroundAlternate => &mut self.background_alternate, + ColorRole::ForegroundNormal => &mut self.foreground_normal, + ColorRole::ForegroundInactive => &mut self.foreground_inactive, + ColorRole::ForegroundActive => &mut self.foreground_active, + ColorRole::ForegroundLink => &mut self.foreground_link, + ColorRole::ForegroundVisited => &mut self.foreground_visited, + ColorRole::ForegroundNegative => &mut self.foreground_negative, + ColorRole::ForegroundNeutral => &mut self.foreground_neutral, + ColorRole::ForegroundPositive => &mut self.foreground_positive, + ColorRole::DecorationFocus => &mut self.decoration_focus, + ColorRole::DecorationHover => &mut self.decoration_hover, + }; + *slot = color; + } + + /// The same set with both decoration colours replaced. + const fn with_decorations(mut self, focus: KdeColor, hover: KdeColor) -> SetColors { + self.decoration_focus = focus; + self.decoration_hover = hover; + self + } +} + +/// The intensity part of a state effect (`IntensityEffect`). +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum IntensityEffect { + /// 0, or any value without a meaning. + None, + /// 1. + Shade, + /// 2. + Darken, + /// 3. + Lighten, +} + +impl IntensityEffect { + /// The effect a stored integer selects; an unknown value is `None`. + pub const fn from_code(code: i64) -> IntensityEffect { + match code { + 1 => IntensityEffect::Shade, + 2 => IntensityEffect::Darken, + 3 => IntensityEffect::Lighten, + _ => IntensityEffect::None, + } + } + + /// The integer stored for the effect. + pub const fn code(self) -> i64 { + match self { + IntensityEffect::None => 0, + IntensityEffect::Shade => 1, + IntensityEffect::Darken => 2, + IntensityEffect::Lighten => 3, + } + } +} + +/// The colour part of a state effect (`ColorEffect`). +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum ColorEffect { + /// 0, or any value without a meaning. + None, + /// 1. + Desaturate, + /// 2. + Fade, + /// 3. + Tint, +} + +impl ColorEffect { + /// The effect a stored integer selects; an unknown value is `None`. + pub const fn from_code(code: i64) -> ColorEffect { + match code { + 1 => ColorEffect::Desaturate, + 2 => ColorEffect::Fade, + 3 => ColorEffect::Tint, + _ => ColorEffect::None, + } + } + + /// The integer stored for the effect. + pub const fn code(self) -> i64 { + match self { + ColorEffect::None => 0, + ColorEffect::Desaturate => 1, + ColorEffect::Fade => 2, + ColorEffect::Tint => 3, + } + } +} + +/// The contrast part of a state effect (`ContrastEffect`). +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum ContrastEffect { + /// 0, or any value without a meaning. + None, + /// 1. + Fade, + /// 2. + Tint, +} + +impl ContrastEffect { + /// The effect a stored integer selects; an unknown value is `None`. + pub const fn from_code(code: i64) -> ContrastEffect { + match code { + 1 => ContrastEffect::Fade, + 2 => ContrastEffect::Tint, + _ => ContrastEffect::None, + } + } + + /// The integer stored for the effect. + pub const fn code(self) -> i64 { + match self { + ContrastEffect::None => 0, + ContrastEffect::Fade => 1, + ContrastEffect::Tint => 2, + } + } +} + +/// The settings of one state's effects, `[ColorEffects:Disabled]` or +/// `[ColorEffects:Inactive]`. +/// +/// When `enabled` is false the other fields are kept as read but have no +/// effect. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct StateEffect { + /// `Enable`. + pub enabled: bool, + /// `IntensityEffect`. + pub intensity_effect: IntensityEffect, + /// `IntensityAmount`. + pub intensity_amount: f64, + /// `ColorEffect`. + pub color_effect: ColorEffect, + /// `ColorAmount`. + pub color_amount: f64, + /// `Color`, the colour the colour effect uses. KDE reads it only when + /// a colour effect is set, so with [`ColorEffect::None`] it is the + /// state's default colour. + pub color: KdeColor, + /// `ContrastEffect`. + pub contrast_effect: ContrastEffect, + /// `ContrastAmount`. + pub contrast_amount: f64, +} + +impl StateEffect { + /// The Disabled state's settings when its group is absent: enabled, + /// darken by 0.1, no colour effect, contrast fade 0.65, colour + /// 56,56,56. + pub const DISABLED_DEFAULT: StateEffect = StateEffect { + enabled: true, + intensity_effect: IntensityEffect::Darken, + intensity_amount: 0.1, + color_effect: ColorEffect::None, + color_amount: 0.0, + color: KdeColor::rgb8(56, 56, 56), + contrast_effect: ContrastEffect::Fade, + contrast_amount: 0.65, + }; + + /// The Inactive state's settings when its group is absent: disabled, + /// no intensity effect, desaturate by -0.9, contrast tint 0.25, colour + /// 112,111,110. + pub const INACTIVE_DEFAULT: StateEffect = StateEffect { + enabled: false, + intensity_effect: IntensityEffect::None, + intensity_amount: 0.0, + color_effect: ColorEffect::Desaturate, + color_amount: -0.9, + color: KdeColor::rgb8(112, 111, 110), + contrast_effect: ContrastEffect::Tint, + contrast_amount: 0.25, + }; + + fn read(config: &KConfig, group: &str, default: StateEffect) -> StateEffect { + let g = &[group]; + let color_effect = + ColorEffect::from_code(config.read_int(g, "ColorEffect", default.color_effect.code())); + let color = if color_effect == ColorEffect::None { + default.color + } else { + config.read_color(g, "Color").unwrap_or(default.color) + }; + StateEffect { + enabled: config.read_bool(g, "Enable").unwrap_or(default.enabled), + intensity_effect: IntensityEffect::from_code(config.read_int( + g, + "IntensityEffect", + default.intensity_effect.code(), + )), + intensity_amount: config.read_real(g, "IntensityAmount", default.intensity_amount), + color_effect, + color_amount: config.read_real(g, "ColorAmount", default.color_amount), + color, + contrast_effect: ContrastEffect::from_code(config.read_int( + g, + "ContrastEffect", + default.contrast_effect.code(), + )), + contrast_amount: config.read_real(g, "ContrastAmount", default.contrast_amount), + } + } + + fn write(&self, out: &mut String) { + push_entry(out, "Color", &self.color.to_kconfig_text()); + push_entry(out, "ColorAmount", &self.color_amount.to_string()); + push_entry(out, "ColorEffect", &self.color_effect.code().to_string()); + push_entry(out, "ContrastAmount", &self.contrast_amount.to_string()); + push_entry( + out, + "ContrastEffect", + &self.contrast_effect.code().to_string(), + ); + push_entry(out, "Enable", bool_text(self.enabled)); + push_entry(out, "IntensityAmount", &self.intensity_amount.to_string()); + push_entry( + out, + "IntensityEffect", + &self.intensity_effect.code().to_string(), + ); + } +} + +/// The title-bar colours of `[WM]`. Each is `None` when the scheme does not +/// set it. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)] +pub struct WmColors { + /// `activeBackground`. + pub active_background: Option, + /// `activeForeground`. + pub active_foreground: Option, + /// `inactiveBackground`. + pub inactive_background: Option, + /// `inactiveForeground`. + pub inactive_foreground: Option, + /// `activeBlend`. + pub active_blend: Option, + /// `inactiveBlend`. + pub inactive_blend: Option, +} + +impl WmColors { + /// The six keys with a reference to their field, in key order. + fn fields(&self) -> [(&'static str, Option); 6] { + [ + ("activeBackground", self.active_background), + ("activeBlend", self.active_blend), + ("activeForeground", self.active_foreground), + ("inactiveBackground", self.inactive_background), + ("inactiveBlend", self.inactive_blend), + ("inactiveForeground", self.inactive_foreground), + ] + } + + fn read(config: &KConfig) -> WmColors { + let c = |key| config.read_color(&["WM"], key); + WmColors { + active_background: c("activeBackground"), + active_foreground: c("activeForeground"), + inactive_background: c("inactiveBackground"), + inactive_foreground: c("inactiveForeground"), + active_blend: c("activeBlend"), + inactive_blend: c("inactiveBlend"), + } + } +} + +/// The default `[KDE] contrast`. +pub const DEFAULT_CONTRAST: i32 = 7; + +/// The default `[KDE] frameContrast`. +pub const DEFAULT_FRAME_CONTRAST: f64 = 0.2; + +/// The default value of `[General] TintFactor` when the key is present but +/// does not parse. +pub const DEFAULT_TINT_FACTOR: f64 = 0.15; + +/// A complete KDE colour scheme. +/// +/// Every field holds a value: keys a configuration lacks take KDE's +/// compiled defaults (see the module documentation). +/// +/// A scheme read with [`KdeColorScheme::from_config`] also keeps the +/// configuration it was read from ([`KdeColorScheme::source`]), for an +/// operation that must reproduce what the file said rather than what it +/// means. Equality compares the scheme's fields only, never that source. +#[derive(Debug, Clone, PartialEq)] +#[non_exhaustive] +pub struct KdeColorScheme { + /// `[General] Name`, the display name (localised variants are + /// ignored). + pub name: Option, + /// `[General] ColorScheme`, the scheme's file name without extension. + pub scheme_id: Option, + /// The seven sets, indexed by [`ColorSet::index`]. + pub sets: [SetColors; 7], + /// The `[Inactive]` subgroup of each set when it has one, indexed by + /// [`ColorSet::index`]. It replaces the set for inactive windows. + pub inactive_sets: [Option; 7], + /// Whether the configuration has a `[Colors:Header]` group (or a group + /// nested in it). Without one, the Header set is the Window group's + /// keys, each falling back to the Header table where Window lacks it. + pub header_group_present: bool, + /// `[ColorEffects:Disabled]`. + pub disabled_effect: StateEffect, + /// `[ColorEffects:Inactive]`. + pub inactive_effect: StateEffect, + /// `[ColorEffects:Inactive] ChangeSelectionColor`: whether the + /// selection of an inactive window is drawn from the Window set tinted + /// toward the selection colour. Defaults to the Inactive group's + /// `Enable`, itself read with a default of true here. + pub change_selection_color: bool, + /// `[WM]`. + pub wm: WmColors, + /// `[KDE] contrast`, not clamped. + pub contrast: i32, + /// `[KDE] frameContrast`, clamped to `0..=1`. + pub frame_contrast: f64, + /// `[General] AccentColor`, when present and a colour. + pub accent: Option, + /// `[General] TintFactor`: `Some` when the key is present (0.15 when it + /// does not parse), which turns accent tinting on. + pub tint_factor: Option, + /// `[General] TitlebarIsAccentColored`, falling back to the legacy + /// `accentActiveTitlebar`, then false. + pub titlebar_is_accent_colored: bool, + source: SchemeSource, +} + +/// The configuration a scheme was read from. It takes no part in equality: +/// two schemes with the same fields are equal whatever text they came from. +#[derive(Clone, Default)] +struct SchemeSource(Option>); + +impl PartialEq for SchemeSource { + fn eq(&self, _: &SchemeSource) -> bool { + true + } +} + +impl fmt::Debug for SchemeSource { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match &self.0 { + Some(config) => write!(f, "SchemeSource({} groups)", config.groups().count()), + None => f.write_str("SchemeSource(none)"), + } + } +} + +const FOCUS: KdeColor = KdeColor::rgb8(61, 174, 233); + +/// The compiled default tables, in [`ColorSet::ALL`] order. The last one is +/// the Header table, used only where `[Colors:Window]` lacks the key. +const DEFAULT_SETS: [SetColors; 7] = [ + // View + SetColors::from_rgb8([ + [255, 255, 255], + [247, 247, 247], + [35, 38, 41], + [112, 125, 138], + [61, 174, 233], + [41, 128, 185], + [155, 89, 182], + [218, 68, 83], + [246, 116, 0], + [39, 174, 96], + [61, 174, 233], + [147, 206, 233], + ]), + // Window + SetColors::from_rgb8([ + [239, 240, 241], + [227, 229, 231], + [35, 38, 41], + [112, 125, 138], + [61, 174, 233], + [41, 128, 185], + [155, 89, 182], + [218, 68, 83], + [246, 116, 0], + [39, 174, 96], + [61, 174, 233], + [147, 206, 233], + ]), + // Button + SetColors::from_rgb8([ + [252, 252, 252], + [163, 212, 250], + [35, 38, 41], + [112, 125, 138], + [61, 174, 233], + [41, 128, 185], + [155, 89, 182], + [218, 68, 83], + [246, 116, 0], + [39, 174, 96], + [61, 174, 233], + [147, 206, 233], + ]), + // Selection + SetColors::from_rgb8([ + [61, 174, 233], + [163, 212, 250], + [255, 255, 255], + [112, 125, 138], + [255, 255, 255], + [253, 188, 75], + [155, 89, 182], + [176, 55, 69], + [198, 92, 0], + [23, 104, 57], + [61, 174, 233], + [147, 206, 233], + ]), + // Tooltip + SetColors::from_rgb8([ + [247, 247, 247], + [239, 240, 241], + [35, 38, 41], + [112, 125, 138], + [61, 174, 233], + [41, 128, 185], + [155, 89, 182], + [218, 68, 83], + [246, 116, 0], + [39, 174, 96], + [61, 174, 233], + [147, 206, 233], + ]), + // Complementary + SetColors::from_rgb8([ + [42, 46, 50], + [27, 30, 32], + [252, 252, 252], + [161, 169, 177], + [61, 174, 233], + [29, 153, 243], + [155, 89, 182], + [218, 68, 83], + [246, 116, 0], + [39, 174, 96], + [61, 174, 233], + [147, 206, 233], + ]), + // Header + SetColors::from_rgb8([ + [222, 224, 226], + [239, 240, 241], + [35, 38, 41], + [112, 125, 138], + [61, 174, 233], + [41, 128, 185], + [155, 89, 182], + [218, 68, 83], + [246, 116, 0], + [39, 174, 96], + [61, 174, 233], + [147, 206, 233], + ]), +]; + +/// Breeze Light's sets: the compiled defaults with every hover decoration +/// set to the focus colour. +const BREEZE_LIGHT_SETS: [SetColors; 7] = [ + DEFAULT_SETS[0].with_decorations(FOCUS, FOCUS), + DEFAULT_SETS[1].with_decorations(FOCUS, FOCUS), + DEFAULT_SETS[2].with_decorations(FOCUS, FOCUS), + DEFAULT_SETS[3].with_decorations(FOCUS, FOCUS), + DEFAULT_SETS[4].with_decorations(FOCUS, FOCUS), + DEFAULT_SETS[5].with_decorations(FOCUS, FOCUS), + DEFAULT_SETS[6].with_decorations(FOCUS, FOCUS), +]; + +/// Breeze Light's `[Colors:Header][Inactive]`. +const BREEZE_LIGHT_HEADER_INACTIVE: SetColors = SetColors::from_rgb8([ + [239, 240, 241], + [227, 229, 231], + [35, 38, 41], + [112, 125, 138], + [61, 174, 233], + [41, 128, 185], + [155, 89, 182], + [218, 68, 83], + [246, 116, 0], + [39, 174, 96], + [61, 174, 233], + [61, 174, 233], +]); + +/// A Breeze Dark set from its two backgrounds; every Breeze Dark set except +/// Selection shares the same foregrounds and decorations. +const fn dark_set(normal: [u8; 3], alternate: [u8; 3]) -> SetColors { + SetColors::from_rgb8([ + normal, + alternate, + [252, 252, 252], + [161, 169, 177], + [61, 174, 233], + [29, 153, 243], + [155, 89, 182], + [218, 68, 83], + [246, 116, 0], + [39, 174, 96], + [61, 174, 233], + [61, 174, 233], + ]) +} + +const BREEZE_DARK_SETS: [SetColors; 7] = [ + dark_set([20, 22, 24], [29, 31, 34]), + dark_set([32, 35, 38], [41, 44, 48]), + dark_set([41, 44, 48], [30, 87, 116]), + SetColors::from_rgb8([ + [61, 174, 233], + [30, 87, 116], + [252, 252, 252], + [161, 169, 177], + [252, 252, 252], + [253, 188, 75], + [155, 89, 182], + [176, 55, 69], + [198, 92, 0], + [23, 104, 57], + [61, 174, 233], + [61, 174, 233], + ]), + dark_set([41, 44, 48], [32, 35, 38]), + dark_set([32, 35, 38], [30, 87, 116]), + dark_set([41, 44, 48], [32, 35, 38]), +]; + +const BREEZE_DARK_HEADER_INACTIVE: SetColors = dark_set([32, 35, 38], [41, 44, 48]); + +/// Breeze Classic's Window set, which its Header set follows key by key. +const BREEZE_CLASSIC_WINDOW: SetColors = SetColors::from_rgb8([ + [239, 240, 241], + [189, 195, 199], + [35, 38, 39], + [127, 140, 141], + [61, 174, 233], + [41, 128, 185], + [127, 140, 141], + [218, 68, 83], + [246, 116, 0], + [39, 174, 96], + [61, 174, 233], + [147, 206, 233], +]); + +const BREEZE_CLASSIC_SETS: [SetColors; 7] = [ + SetColors::from_rgb8([ + [252, 252, 252], + [239, 240, 241], + [35, 38, 39], + [127, 140, 141], + [61, 174, 233], + [41, 128, 185], + [127, 140, 141], + [218, 68, 83], + [246, 116, 0], + [39, 174, 96], + [61, 174, 233], + [147, 206, 233], + ]), + BREEZE_CLASSIC_WINDOW, + SetColors::from_rgb8([ + [239, 240, 241], + [189, 195, 199], + [35, 38, 39], + [127, 140, 141], + [61, 174, 233], + [41, 128, 185], + [127, 140, 141], + [218, 68, 83], + [198, 92, 0], + [39, 174, 96], + [61, 174, 233], + [147, 206, 233], + ]), + SetColors::from_rgb8([ + [61, 174, 233], + [29, 153, 243], + [252, 252, 252], + [239, 240, 241], + [252, 252, 252], + [253, 188, 75], + [189, 195, 199], + [176, 55, 69], + [246, 116, 0], + [23, 104, 57], + [61, 174, 233], + [147, 206, 233], + ]), + SetColors::from_rgb8([ + [35, 38, 39], + [77, 77, 77], + [252, 252, 252], + [189, 195, 199], + [61, 174, 233], + [41, 128, 185], + [127, 140, 141], + [218, 68, 83], + [246, 116, 0], + [39, 174, 96], + [61, 174, 233], + [147, 206, 233], + ]), + SetColors::from_rgb8([ + [49, 54, 59], + [59, 64, 69], + [239, 240, 241], + [175, 176, 179], + [147, 206, 233], + [61, 174, 230], + [61, 174, 230], + [231, 76, 60], + [253, 188, 75], + [46, 204, 113], + [30, 146, 255], + [61, 174, 230], + ]), + BREEZE_CLASSIC_WINDOW, +]; + +/// The `[ColorEffects:Inactive]` group all three stock Breeze schemes +/// share. Their `[ColorEffects:Disabled]` group equals +/// [`StateEffect::DISABLED_DEFAULT`]. +const BREEZE_INACTIVE_EFFECT: StateEffect = StateEffect { + enabled: false, + intensity_effect: IntensityEffect::None, + intensity_amount: 0.0, + color_effect: ColorEffect::Fade, + color_amount: 0.025, + color: KdeColor::rgb8(112, 111, 110), + contrast_effect: ContrastEffect::Tint, + contrast_amount: 0.1, +}; + +const fn wm(colors: [[u8; 3]; 6]) -> WmColors { + const fn c(rgb: [u8; 3]) -> Option { + Some(KdeColor::rgb8(rgb[0], rgb[1], rgb[2])) + } + WmColors { + active_background: c(colors[0]), + active_blend: c(colors[1]), + active_foreground: c(colors[2]), + inactive_background: c(colors[3]), + inactive_blend: c(colors[4]), + inactive_foreground: c(colors[5]), + } +} + +impl Default for KdeColorScheme { + fn default() -> Self { + KdeColorScheme::kcolorscheme_defaults() + } +} + +impl KdeColorScheme { + /// The scheme a configuration with no colour keys at all describes: + /// KDE's compiled defaults. They equal Breeze Light except that every + /// `DecorationHover` is 147,206,233, there is no `[Inactive]` subgroup, + /// `contrast` is 7 and there is no `[WM]` colour. + pub fn kcolorscheme_defaults() -> KdeColorScheme { + KdeColorScheme { + name: None, + scheme_id: None, + sets: DEFAULT_SETS, + inactive_sets: [None; 7], + header_group_present: false, + disabled_effect: StateEffect::DISABLED_DEFAULT, + inactive_effect: StateEffect::INACTIVE_DEFAULT, + change_selection_color: true, + wm: WmColors::default(), + contrast: DEFAULT_CONTRAST, + frame_contrast: DEFAULT_FRAME_CONTRAST, + accent: None, + tint_factor: None, + titlebar_is_accent_colored: false, + source: SchemeSource::default(), + } + } + + /// The stock Breeze Light scheme (`BreezeLight.colors`, breeze 6.8.0). + pub fn breeze_light() -> KdeColorScheme { + let mut inactive_sets = [None; 7]; + inactive_sets[ColorSet::Header.index()] = Some(BREEZE_LIGHT_HEADER_INACTIVE); + KdeColorScheme { + name: Some("Breeze Light".to_owned()), + scheme_id: Some("BreezeLight".to_owned()), + sets: BREEZE_LIGHT_SETS, + inactive_sets, + header_group_present: true, + inactive_effect: BREEZE_INACTIVE_EFFECT, + wm: wm([ + [227, 229, 231], + [227, 229, 231], + [35, 38, 41], + [239, 240, 241], + [239, 240, 241], + [112, 125, 138], + ]), + contrast: 4, + ..KdeColorScheme::kcolorscheme_defaults() + } + } + + /// The stock Breeze Dark scheme (`BreezeDark.colors`, breeze 6.8.0). + pub fn breeze_dark() -> KdeColorScheme { + let mut inactive_sets = [None; 7]; + inactive_sets[ColorSet::Header.index()] = Some(BREEZE_DARK_HEADER_INACTIVE); + KdeColorScheme { + name: Some("Breeze Dark".to_owned()), + scheme_id: Some("BreezeDark".to_owned()), + sets: BREEZE_DARK_SETS, + inactive_sets, + header_group_present: true, + inactive_effect: BREEZE_INACTIVE_EFFECT, + wm: wm([ + [39, 44, 49], + [252, 252, 252], + [252, 252, 252], + [32, 36, 40], + [161, 169, 177], + [161, 169, 177], + ]), + contrast: 4, + ..KdeColorScheme::kcolorscheme_defaults() + } + } + + /// The stock Breeze Classic scheme (`BreezeClassic.colors`, breeze + /// 6.8.0). It has no Header group, so its Header set is its Window set, + /// and it colours the active title bar with the accent. + pub fn breeze_classic() -> KdeColorScheme { + KdeColorScheme { + name: Some("Breeze Classic".to_owned()), + scheme_id: Some("BreezeClassic".to_owned()), + sets: BREEZE_CLASSIC_SETS, + inactive_effect: BREEZE_INACTIVE_EFFECT, + wm: wm([ + [71, 80, 87], + [252, 252, 252], + [252, 252, 252], + [239, 240, 241], + [75, 71, 67], + [189, 195, 199], + ]), + contrast: 4, + titlebar_is_accent_colored: true, + ..KdeColorScheme::kcolorscheme_defaults() + } + } + + /// The stored colours of `set`. + pub fn set(&self, set: ColorSet) -> &SetColors { + &self.sets[set.index()] + } + + /// The `[Inactive]` replacement of `set`, when the scheme has one. + pub fn inactive_set(&self, set: ColorSet) -> Option<&SetColors> { + self.inactive_sets[set.index()].as_ref() + } + + /// Parses a `.colors` file (or any configuration text) and reads the + /// scheme from it. + pub fn parse(text: &str) -> (KdeColorScheme, Vec) { + let (config, diagnostics) = KConfig::parse(text); + (KdeColorScheme::from_config(&config), diagnostics) + } + + /// Reads the scheme a configuration describes, a single file or a + /// merged cascade. Names are read as stored, without `[$e]` expansion. + pub fn from_config(config: &KConfig) -> KdeColorScheme { + let header_defaults = { + let mut defaults = DEFAULT_SETS[ColorSet::Header.index()]; + for role in ColorRole::ALL { + if let Some(c) = config.read_color(&[ColorSet::Window.group_name()], role.key()) { + defaults.set(role, c); + } + } + defaults + }; + + let mut sets = DEFAULT_SETS; + let mut inactive_sets = [None; 7]; + for set in ColorSet::ALL { + let defaults = if set == ColorSet::Header { + header_defaults + } else { + DEFAULT_SETS[set.index()] + }; + let group = set.group_name(); + sets[set.index()] = read_set(config, &[group], defaults); + if config.group_exists(&[group, "Inactive"]) { + inactive_sets[set.index()] = Some(read_set(config, &[group, "Inactive"], defaults)); + } + } + + let inactive = "ColorEffects:Inactive"; + let change_selection_color = config + .read_bool(&[inactive], "ChangeSelectionColor") + .unwrap_or_else(|| config.read_bool(&[inactive], "Enable").unwrap_or(true)); + + let general = &["General"]; + let titlebar_is_accent_colored = config + .read_bool(general, "TitlebarIsAccentColored") + .or_else(|| config.read_bool(general, "accentActiveTitlebar")) + .unwrap_or(false); + let tint_factor = config + .has_key(general, "TintFactor") + .then(|| config.read_real(general, "TintFactor", DEFAULT_TINT_FACTOR)); + + let contrast = config.read_int(&["KDE"], "contrast", i64::from(DEFAULT_CONTRAST)); + + KdeColorScheme { + name: config.get(general, "Name").map(str::to_owned), + scheme_id: config.get(general, "ColorScheme").map(str::to_owned), + sets, + inactive_sets, + header_group_present: config.group_exists(&[ColorSet::Header.group_name()]), + disabled_effect: StateEffect::read( + config, + "ColorEffects:Disabled", + StateEffect::DISABLED_DEFAULT, + ), + inactive_effect: StateEffect::read(config, inactive, StateEffect::INACTIVE_DEFAULT), + change_selection_color, + wm: WmColors::read(config), + contrast: i32::try_from(contrast).unwrap_or(DEFAULT_CONTRAST), + frame_contrast: config + .read_real(&["KDE"], "frameContrast", DEFAULT_FRAME_CONTRAST) + .clamp(0.0, 1.0), + accent: config.read_color(general, "AccentColor"), + tint_factor, + titlebar_is_accent_colored, + source: SchemeSource(Some(Arc::new(config.clone()))), + } + } + + /// The configuration the scheme was read from, `None` for a built-in + /// scheme. It holds what the fields do not: which keys were present, + /// each value as written, `frameContrast` before clamping. + pub fn source(&self) -> Option<&KConfig> { + self.source.0.as_deref() + } + + /// The scheme as configuration text that [`KdeColorScheme::parse`] + /// reads back to an equal scheme. + /// + /// Groups and keys are written in sorted order, colours as KDE writes + /// them, `r,g,b` (`r,g,b,a` when translucent) in 8 bits, so a colour + /// read from a 9- or 12-digit `#` form comes back rounded to 8 bits. `[KDE] contrast` and `frameContrast` + /// are written only when they differ from their defaults, so a key the + /// scheme leaves at its default still falls back to `kdeglobals` when + /// the text is cascaded over it, as a stock `.colors` file does. + /// + /// A scheme without a Header group is written without one. Its Header + /// colours follow the Window group key by key, falling back to the + /// Header table where Window lacks a key; to keep that, a Window key + /// whose Header colour differs from the Window colour is left out, so it + /// reads back as absent from both. + pub fn to_kconfig_text(&self) -> String { + let mut out = String::new(); + + push_group(&mut out, &["ColorEffects:Disabled"]); + self.disabled_effect.write(&mut out); + push_group(&mut out, &["ColorEffects:Inactive"]); + push_entry( + &mut out, + "ChangeSelectionColor", + bool_text(self.change_selection_color), + ); + self.inactive_effect.write(&mut out); + + let mut ordered = ColorSet::ALL; + ordered.sort_by_key(|s| s.group_name()); + for set in ordered { + if set == ColorSet::Header && !self.header_group_present { + continue; + } + let colors = self.set(set); + push_group(&mut out, &[set.group_name()]); + for (key, role) in sorted_roles() { + let follows_window_default = set == ColorSet::Window + && !self.header_group_present + && self.set(ColorSet::Header).get(role) != colors.get(role); + if !follows_window_default { + push_entry(&mut out, key, &colors.get(role).to_kconfig_text()); + } + } + if let Some(inactive) = self.inactive_set(set) { + push_group(&mut out, &[set.group_name(), "Inactive"]); + for (key, role) in sorted_roles() { + push_entry(&mut out, key, &inactive.get(role).to_kconfig_text()); + } + } + } + + let general: Vec<(&str, String)> = [ + ("AccentColor", self.accent.map(KdeColor::to_kconfig_text)), + ("ColorScheme", self.scheme_id.as_deref().map(escape_value)), + ("Name", self.name.as_deref().map(escape_value)), + ("TintFactor", self.tint_factor.map(|f| f.to_string())), + ( + "TitlebarIsAccentColored", + self.titlebar_is_accent_colored.then(|| "true".to_owned()), + ), + ] + .into_iter() + .filter_map(|(k, v)| v.map(|v| (k, v))) + .collect(); + if !general.is_empty() { + push_group(&mut out, &["General"]); + for (key, value) in &general { + push_entry(&mut out, key, value); + } + } + + let contrast = (self.contrast != DEFAULT_CONTRAST).then(|| self.contrast.to_string()); + let frame = (self.frame_contrast != DEFAULT_FRAME_CONTRAST) + .then(|| self.frame_contrast.to_string()); + if contrast.is_some() || frame.is_some() { + push_group(&mut out, &["KDE"]); + if let Some(contrast) = contrast { + push_entry(&mut out, "contrast", &contrast); + } + if let Some(frame) = frame { + push_entry(&mut out, "frameContrast", &frame); + } + } + + let wm: Vec<_> = self + .wm + .fields() + .into_iter() + .filter_map(|(k, v)| v.map(|v| (k, v))) + .collect(); + if !wm.is_empty() { + push_group(&mut out, &["WM"]); + for (key, color) in wm { + push_entry(&mut out, key, &color.to_kconfig_text()); + } + } + out + } +} + +fn read_set(config: &KConfig, group: &[&str], defaults: SetColors) -> SetColors { + let mut colors = defaults; + for role in ColorRole::ALL { + if let Some(c) = config.read_color(group, role.key()) { + colors.set(role, c); + } + } + colors +} + +fn sorted_roles() -> impl Iterator { + let mut roles: Vec<_> = ColorRole::ALL.iter().map(|r| (r.key(), *r)).collect(); + roles.sort_by_key(|(k, _)| *k); + roles.into_iter() +} + +fn push_group(out: &mut String, path: &[&str]) { + if !out.is_empty() { + out.push('\n'); + } + for segment in path { + out.push('['); + out.push_str(segment); + out.push(']'); + } + out.push('\n'); +} + +fn push_entry(out: &mut String, key: &str, value: &str) { + out.push_str(key); + out.push('='); + out.push_str(value); + out.push('\n'); +} + +fn bool_text(value: bool) -> &'static str { + if value { "true" } else { "false" } +} diff --git a/crates/teksilo-kde-scheme/tests/breeze_files.rs b/crates/teksilo-kde-scheme/tests/breeze_files.rs new file mode 100644 index 000000000..16ec9c15d --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/breeze_files.rs @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The stock Breeze constants against the vendored breeze 6.8.0 `.colors` +//! files, and the source a parsed file keeps. +//! +//! The fixtures are LGPL-2.0-or-later and are left out of the published +//! crate, and so is this file (the `exclude` list in `Cargo.toml`): a test +//! target that reads them could not compile from the package. Every test +//! that needs no fixture lives in `scheme.rs`, which is published. + +use teksilo_kde_scheme::KdeColorScheme; + +const BREEZE_LIGHT: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/tests/fixtures/breeze-v6.8.0/BreezeLight.colors" +)); +const BREEZE_DARK: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/tests/fixtures/breeze-v6.8.0/BreezeDark.colors" +)); +const BREEZE_CLASSIC: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/tests/fixtures/breeze-v6.8.0/BreezeClassic.colors" +)); + +fn parse_clean(text: &str) -> KdeColorScheme { + let (scheme, diagnostics) = KdeColorScheme::parse(text); + assert!(diagnostics.is_empty(), "{diagnostics:?}"); + scheme +} + +#[test] +fn the_breeze_light_constant_equals_the_breeze_light_file() { + assert_eq!(parse_clean(BREEZE_LIGHT), KdeColorScheme::breeze_light()); +} + +#[test] +fn the_breeze_dark_constant_equals_the_breeze_dark_file() { + assert_eq!(parse_clean(BREEZE_DARK), KdeColorScheme::breeze_dark()); +} + +#[test] +fn the_breeze_classic_constant_equals_the_breeze_classic_file() { + assert_eq!( + parse_clean(BREEZE_CLASSIC), + KdeColorScheme::breeze_classic() + ); +} + +// ---- Source --------------------------------------------------------------- + +#[test] +fn a_parsed_scheme_keeps_its_source_and_equality_ignores_it() { + let scheme = parse_clean(BREEZE_LIGHT); + let source = scheme.source().unwrap(); + assert_eq!( + source.get(&["Colors:View"], "BackgroundNormal"), + Some("255,255,255") + ); + assert!(!source.has_key(&["KDE"], "frameContrast")); + assert!(!source.has_key(&["ColorEffects:Disabled"], "Enable")); + assert!(KdeColorScheme::breeze_light().source().is_none()); + assert_eq!(scheme, KdeColorScheme::breeze_light()); +} diff --git a/crates/teksilo-kde-scheme/tests/cascade.rs b/crates/teksilo-kde-scheme/tests/cascade.rs new file mode 100644 index 000000000..661c00f06 --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/cascade.rs @@ -0,0 +1,503 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The cascade, the file locations and `[$e]` expansion. The environment +//! is always injected as a closure; nothing here reads or changes the +//! process environment. + +use std::collections::HashMap; +use std::path::PathBuf; + +use teksilo_kde_scheme::{ + ConfigLayerPath, KConfig, KdeConfigLocations, KdeDesktop, KdeDesktopLayers, LayerKind, + SchemeOrigin, is_kde_session, +}; + +/// An environment getter over a fixed table. +fn env(vars: &[(&str, &str)]) -> impl Fn(&str) -> Option + use<> { + let table: HashMap = vars + .iter() + .map(|(k, v)| ((*k).to_owned(), (*v).to_owned())) + .collect(); + move |name| table.get(name).cloned() +} + +fn layer(text: &str) -> KConfig { + let (config, diagnostics) = KConfig::parse(text); + assert!(diagnostics.is_empty(), "{diagnostics:?}"); + config +} + +fn user(text: &str) -> KConfig { + layer(text).with_kind(LayerKind::User) +} + +fn paths(layers: &[ConfigLayerPath]) -> Vec<(String, LayerKind)> { + layers + .iter() + .map(|l| (l.path.to_string_lossy().replace('\\', "/"), l.kind)) + .collect() +} + +// ---- Precedence ------------------------------------------------------- + +#[test] +fn a_higher_layer_wins_over_a_lower_one() { + let merged = KConfig::cascade(&[layer("[G]\nA=low\nB=low\n"), user("[G]\nA=high\n")]); + assert_eq!(merged.get(&["G"], "A"), Some("high")); + assert_eq!(merged.get(&["G"], "B"), Some("low")); +} + +#[test] +fn a_deleted_entry_hides_the_lower_value_until_a_higher_layer_sets_it_again() { + let hidden = KConfig::cascade(&[layer("[G]\nA=low\n"), layer("[G]\nA[$d]\n")]); + assert_eq!(hidden.get(&["G"], "A"), None); + let back = KConfig::cascade(&[ + layer("[G]\nA=low\n"), + layer("[G]\nA[$d]\n"), + user("[G]\nA=again\n"), + ]); + assert_eq!(back.get(&["G"], "A"), Some("again")); +} + +#[test] +fn an_immutable_entry_blocks_every_higher_layer() { + let merged = KConfig::cascade(&[ + layer("[KDE]\nwidgetStyle[$i]=Breeze\n"), + layer("[KDE]\nwidgetStyle=Fusion\n"), + user("[KDE]\nwidgetStyle=Oxygen\n"), + ]); + assert_eq!(merged.get(&["KDE"], "widgetStyle"), Some("Breeze")); +} + +#[test] +fn an_immutable_group_ignores_every_entry_of_the_user_layer() { + let merged = KConfig::cascade(&[ + layer("[General][$i]\nColorScheme=BreezeLight\n"), + user("[General]\nColorScheme=BreezeDark\nNew=1\n"), + ]); + assert_eq!(merged.get(&["General"], "ColorScheme"), Some("BreezeLight")); + assert_eq!(merged.get(&["General"], "New"), None); +} + +#[test] +fn an_immutable_group_takes_no_new_keys_from_a_higher_default_layer() { + let merged = KConfig::cascade(&[ + layer("[General][$i]\nColorScheme=BreezeLight\n"), + layer("[General]\nNew=1\n"), + ]); + assert_eq!(merged.get(&["General"], "New"), None); + assert_eq!(merged.get(&["General"], "ColorScheme"), Some("BreezeLight")); +} + +#[test] +fn a_lower_immutable_group_does_not_lock_its_nested_groups() { + let merged = KConfig::cascade(&[ + layer("[Colors:Header][$i]\nA=1\n[Colors:Header][Inactive]\nB=1\n"), + user("[Colors:Header][Inactive]\nB=2\n"), + ]); + assert_eq!(merged.get(&["Colors:Header", "Inactive"], "B"), Some("2")); +} + +#[test] +fn a_file_immutable_layer_stops_every_higher_layer() { + let merged = KConfig::cascade(&[ + layer("[General]\nA=1\n[$i]\n[KDE]\nB=1\n"), + layer("[General]\nA=2\nC=2\n"), + user("[Other]\nD=3\n"), + ]); + assert_eq!(merged.get(&["General"], "A"), Some("1")); + assert_eq!(merged.get(&["General"], "C"), None); + assert_eq!(merged.get(&["Other"], "D"), None); + assert!(merged.is_file_immutable()); + // The merge stays a lower layer that blocks anything cascaded on it. + let again = KConfig::cascade(&[merged, user("[General]\nC=3\n")]); + assert_eq!(again.get(&["General"], "C"), None); +} + +#[test] +fn a_file_can_add_to_its_own_immutable_group_later() { + let merged = KConfig::cascade(&[layer("[G][$i]\nA=1\n[Other]\nX=1\n[G]\nB=2\n")]); + assert_eq!(merged.get(&["G"], "B"), Some("2")); + assert!(merged.is_group_immutable(&["G"])); +} + +// ---- This machine's layout ------------------------------------------- + +/// A Plasma session where `ColorScheme` lives only in +/// `~/.config/kdedefaults/kdeglobals`, `/etc/xdg/kdeglobals` names the +/// look-and-feel package, and the user's own `kdeglobals` holds the colour +/// groups but no `ColorScheme`. +#[test] +fn the_kdedefaults_layer_supplies_the_scheme_name_under_the_user_file() { + let locations = KdeConfigLocations::from_env(env(&[ + ("HOME", "/home/ada"), + ("XDG_CONFIG_DIRS", "/home/ada/.config/kdedefaults:/etc/xdg"), + ("XDG_CURRENT_DESKTOP", "KDE"), + ("KDE_FULL_SESSION", "true"), + ])); + assert_eq!( + paths(&locations.kdeglobals_cascade()), + vec![ + ("/etc/kde5rc".to_owned(), LayerKind::Default), + ("/etc/xdg/system.kdeglobals".to_owned(), LayerKind::Default), + ( + "/home/ada/.config/kdedefaults/system.kdeglobals".to_owned(), + LayerKind::Default + ), + ("/etc/xdg/kdeglobals".to_owned(), LayerKind::Default), + ( + "/home/ada/.config/kdedefaults/kdeglobals".to_owned(), + LayerKind::Default + ), + ( + "/home/ada/.config/system.kdeglobals".to_owned(), + LayerKind::Default + ), + ("/home/ada/.config/kdeglobals".to_owned(), LayerKind::User), + ] + ); + + // Only three of those files exist. + let files: HashMap<&str, &str> = [ + ( + "/etc/xdg/kdeglobals", + "[General]\nXftHintStyle=hintslight\n\n[KDE]\nLookAndFeelPackage=org.example.desktop\nSingleClick=false\n", + ), + ( + "/home/ada/.config/kdedefaults/kdeglobals", + "[General]\nColorScheme=BreezeLight\n\n[Icons]\nTheme=breeze\n\n[KDE]\nwidgetStyle=Breeze\n", + ), + ( + "/home/ada/.config/kdeglobals", + "[Colors:View]\nBackgroundNormal=255,255,255\n\n[KDE]\nLookAndFeelPackage=org.kde.breeze.desktop\ncontrast=4\nframeContrast=0.2\n", + ), + ] + .into_iter() + .collect(); + let layers: Vec = locations + .kdeglobals_cascade() + .into_iter() + .filter_map(|l| { + let key = l.path.to_string_lossy().replace('\\', "/"); + files + .get(key.as_str()) + .map(|text| layer(text).with_kind(l.kind)) + }) + .collect(); + assert_eq!(layers.len(), 3); + + let merged = KConfig::cascade(&layers); + assert_eq!(merged.get(&["General"], "ColorScheme"), Some("BreezeLight")); + assert_eq!( + merged.get(&["KDE"], "LookAndFeelPackage"), + Some("org.kde.breeze.desktop") + ); + assert_eq!(merged.get(&["KDE"], "widgetStyle"), Some("Breeze")); + assert_eq!(merged.get(&["General"], "XftHintStyle"), Some("hintslight")); + assert!(merged.group_exists(&["Colors:View"])); +} + +#[test] +fn a_kde_session_prepends_kdedefaults_when_the_environment_lacks_it() { + let locations = KdeConfigLocations::from_env(env(&[ + ("HOME", "/home/ada"), + ("XDG_CURRENT_DESKTOP", "KDE"), + ])); + assert_eq!( + locations.config_dirs, + vec![ + PathBuf::from("/home/ada/.config/kdedefaults"), + PathBuf::from("/etc/xdg") + ] + ); +} + +#[test] +fn outside_a_kde_session_kdedefaults_is_not_added() { + let locations = KdeConfigLocations::from_env(env(&[ + ("HOME", "/home/ada"), + ("XDG_CURRENT_DESKTOP", "GNOME"), + ])); + assert_eq!(locations.config_dirs, vec![PathBuf::from("/etc/xdg")]); +} + +#[test] +fn kdedefaults_is_not_listed_twice() { + let locations = KdeConfigLocations::from_env(env(&[ + ("HOME", "/home/ada"), + ("XDG_CONFIG_DIRS", "/etc/xdg:/home/ada/.config/kdedefaults/"), + ("KDE_FULL_SESSION", "true"), + ])); + assert_eq!(locations.config_dirs.len(), 2); + assert_eq!(locations.config_dirs[0], PathBuf::from("/etc/xdg")); +} + +// ---- Locations ------------------------------------------------------- + +#[test] +fn xdg_defaults_apply_when_the_variables_are_unset_empty_or_relative() { + let locations = KdeConfigLocations::from_env(env(&[ + ("HOME", "/home/ada"), + ("XDG_CONFIG_HOME", ""), + ("XDG_DATA_HOME", "relative/data"), + ("XDG_CONFIG_DIRS", "relative:"), + ])); + assert_eq!( + locations.config_home, + Some(PathBuf::from("/home/ada/.config")) + ); + assert_eq!( + locations.data_home, + Some(PathBuf::from("/home/ada/.local/share")) + ); + assert_eq!( + locations.cache_home, + Some(PathBuf::from("/home/ada/.cache")) + ); + assert_eq!(locations.config_dirs, vec![PathBuf::from("/etc/xdg")]); + assert_eq!( + locations.data_dirs, + vec![ + PathBuf::from("/usr/local/share"), + PathBuf::from("/usr/share") + ] + ); + assert!(!locations.kde_session); +} + +#[test] +fn explicit_xdg_variables_are_used_in_the_order_listed() { + let locations = KdeConfigLocations::from_env(env(&[ + ("XDG_CONFIG_HOME", "/cfg"), + ("XDG_CONFIG_DIRS", "/a::relative:/b"), + ("XDG_DATA_HOME", "/data"), + ("XDG_DATA_DIRS", "/d1:/d2"), + ])); + assert_eq!(locations.home, None); + assert_eq!( + locations.config_dirs, + vec![PathBuf::from("/a"), PathBuf::from("/b")] + ); + assert_eq!( + paths(&locations.breezerc_cascade()), + vec![ + ("/b/breezerc".to_owned(), LayerKind::Default), + ("/a/breezerc".to_owned(), LayerKind::Default), + ("/cfg/breezerc".to_owned(), LayerKind::User), + ] + ); + let candidates: Vec = locations + .color_scheme_file("BreezeDark") + .iter() + .map(|p| p.to_string_lossy().replace('\\', "/")) + .collect(); + assert_eq!( + candidates, + vec![ + "/data/color-schemes/BreezeDark.colors", + "/d1/color-schemes/BreezeDark.colors", + "/d2/color-schemes/BreezeDark.colors", + ] + ); +} + +#[test] +fn kde_skip_kderc_leaves_out_etc_kde5rc() { + let locations = KdeConfigLocations::from_env(env(&[("HOME", "/h"), ("KDE_SKIP_KDERC", "1")])); + assert!( + !paths(&locations.kdeglobals_cascade()) + .iter() + .any(|(p, _)| p == "/etc/kde5rc") + ); +} + +#[test] +fn without_a_home_there_is_no_user_layer() { + let locations = KdeConfigLocations::from_env(env(&[])); + assert!( + locations + .kdeglobals_cascade() + .iter() + .all(|l| l.kind == LayerKind::Default) + ); + assert_eq!(locations.data_file_candidates("x").len(), 2); +} + +#[test] +fn a_kde_color_scheme_path_variable_is_not_read() { + let with = KdeConfigLocations::from_env(env(&[ + ("HOME", "/home/ada"), + ("KDE_COLOR_SCHEME_PATH", "/tmp/Evil.colors"), + ])); + let without = KdeConfigLocations::from_env(env(&[("HOME", "/home/ada")])); + assert_eq!(with, without); + assert!( + with.color_scheme_file("BreezeLight") + .iter() + .all(|p| !p.to_string_lossy().contains("Evil")) + ); +} + +#[test] +fn kde_session_detection_reads_the_desktop_list_and_the_full_session_flag() { + assert!(is_kde_session(env(&[("XDG_CURRENT_DESKTOP", "KDE")]))); + assert!(is_kde_session(env(&[( + "XDG_CURRENT_DESKTOP", + "ubuntu:KDE" + )]))); + assert!(is_kde_session(env(&[("KDE_FULL_SESSION", "true")]))); + assert!(!is_kde_session(env(&[("XDG_CURRENT_DESKTOP", "KDEx")]))); + assert!(!is_kde_session(env(&[("XDG_CURRENT_DESKTOP", "kde")]))); + assert!(!is_kde_session(env(&[("KDE_FULL_SESSION", "1")]))); + assert!(!is_kde_session(env(&[]))); +} + +#[test] +fn the_scheme_fallback_is_needed_only_without_a_view_group() { + let locations = + KdeConfigLocations::from_env(env(&[("HOME", "/h"), ("XDG_DATA_DIRS", "/usr/share")])); + let var = env(&[]); + let expansion = locations.expansion_env(&var); + + let with_colors = layer("[Colors:View]\nBackgroundNormal=1,2,3\n"); + assert_eq!( + locations.scheme_fallback_candidates(&with_colors, &expansion), + None + ); + + let named = + layer("[General]\nColorScheme=BreezeDark\n[KDE]\nLookAndFeelPackage=org.example.desktop\n"); + let candidates: Vec = locations + .scheme_fallback_candidates(&named, &expansion) + .unwrap() + .iter() + .map(|p| p.to_string_lossy().replace('\\', "/")) + .collect(); + assert_eq!( + candidates, + vec![ + "/h/.local/share/plasma/look-and-feel/org.example.desktop/contents/colors", + "/usr/share/plasma/look-and-feel/org.example.desktop/contents/colors", + "/h/.local/share/color-schemes/BreezeDark.colors", + "/usr/share/color-schemes/BreezeDark.colors", + "/h/.local/share/color-schemes/BreezeLight.colors", + "/usr/share/color-schemes/BreezeLight.colors", + ] + ); + + let defaults: Vec = locations + .scheme_fallback_candidates(&KConfig::default(), &expansion) + .unwrap() + .iter() + .map(|p| p.to_string_lossy().replace('\\', "/")) + .collect(); + assert_eq!( + defaults[0], + "/h/.local/share/plasma/look-and-feel/org.kde.breeze.desktop/contents/colors" + ); + assert_eq!( + defaults[2], + "/h/.local/share/color-schemes/BreezeLight.colors" + ); +} + +// ---- [$e] expansion ---------------------------------------------------- + +#[test] +fn dollar_e_entries_expand_only_through_the_injected_environment() { + let locations = KdeConfigLocations::from_env(env(&[("HOME", "/home/ada")])); + let var = env(&[("HOME", "/home/ada"), ("FONT", "Hack"), ("EMPTY", "")]); + let expansion = locations.expansion_env(&var); + let config = layer( + "[G]\nPlain=$HOME/x\nHome[$e]=$HOME/x\nBraced[$e]=${FONT},10\nDollars[$e]=a$$b\nUnset[$e]=[$NOPE]\n\ + Empty[$e]=[$EMPTY]\nEmptyBraces[$e]=a${}b\nUnclosed[$e]=a${FONT\nTrailing[$e]=cost 5$\n\ + Qt[$e]=$QT_DATA_HOME/x\nUnicode[$e]=$FONTé\n", + ); + let g = &["G"]; + let read = |key| config.read_string(g, key, &expansion); + assert_eq!(read("Plain").as_deref(), Some("$HOME/x")); + assert_eq!(read("Home").as_deref(), Some("/home/ada/x")); + assert_eq!(read("Braced").as_deref(), Some("Hack,10")); + assert_eq!(read("Dollars").as_deref(), Some("a$b")); + assert_eq!(read("Unset").as_deref(), Some("[]")); + assert_eq!(read("Empty").as_deref(), Some("[]")); + assert_eq!(read("EmptyBraces").as_deref(), Some("ab")); + assert_eq!(read("Unclosed").as_deref(), Some("aHack")); + assert_eq!(read("Trailing").as_deref(), Some("cost 5$")); + assert_eq!(read("Qt").as_deref(), Some("/home/ada/.local/share/x")); + // Letters in the Unicode sense continue the name. + assert_eq!(read("Unicode").as_deref(), Some("")); + // The raw value is never expanded. + assert_eq!(config.get(g, "Home"), Some("$HOME/x")); +} + +#[test] +fn a_command_substitution_is_never_executed() { + let locations = KdeConfigLocations::from_env(env(&[])); + let asked = std::cell::RefCell::new(Vec::new()); + let var = |name: &str| { + asked.borrow_mut().push(name.to_owned()); + None + }; + let expansion = locations.expansion_env(&var); + let config = layer("[G]\nCmd[$e]=$(touch /tmp/pwned)x\nBack[$e]=`id`\n"); + assert_eq!( + config.read_string(&["G"], "Cmd", &expansion).as_deref(), + Some("(touch /tmp/pwned)x") + ); + assert_eq!( + config.read_string(&["G"], "Back", &expansion).as_deref(), + Some("`id`") + ); + // Only variable names are looked up, and `(` starts none. + assert!(asked.borrow().is_empty(), "{:?}", asked.borrow()); +} + +// ---- A desktop built from these layers -------------------------------- + +#[test] +fn a_desktop_without_colour_groups_reads_the_scheme_file_over_kdeglobals() { + let var = env(&[]); + let locations = KdeConfigLocations::from_env(env(&[])); + let expansion = locations.expansion_env(&var); + let kdeglobals = [user( + "[KDE]\nframeContrast=0.5\n[General]\nAccentColor=233,61,61\n", + )]; + let scheme_file = layer("[Colors:Window]\nBackgroundNormal=10,20,30\n[KDE]\ncontrast=4\n"); + let desktop = KdeDesktop::from_layers( + &KdeDesktopLayers { + kdeglobals: &kdeglobals, + breezerc: &[], + scheme_file: Some(&scheme_file), + }, + &expansion, + ); + assert_eq!(desktop.scheme_origin, SchemeOrigin::SchemeFile); + assert_eq!(desktop.scheme.contrast, 4); + // frameContrast is not in the scheme file, so kdeglobals supplies it. + assert_eq!(desktop.scheme.frame_contrast, 0.5); + assert_eq!( + desktop.scheme.sets[1].background_normal, + teksilo_kde_scheme::KdeColor::rgb8(10, 20, 30) + ); + assert_eq!( + desktop.user_accent, + Some(teksilo_kde_scheme::KdeColor::rgb8(233, 61, 61)) + ); + + let builtin = KdeDesktop::from_layers( + &KdeDesktopLayers { + kdeglobals: &kdeglobals, + breezerc: &[], + scheme_file: None, + }, + &expansion, + ); + assert_eq!(builtin.scheme_origin, SchemeOrigin::BuiltIn); + assert_eq!( + builtin.scheme.sets, + teksilo_kde_scheme::KdeColorScheme::breeze_light().sets + ); + assert_eq!(builtin.scheme.frame_contrast, 0.5); +} diff --git a/crates/teksilo-kde-scheme/tests/desktop.rs b/crates/teksilo-kde-scheme/tests/desktop.rs new file mode 100644 index 000000000..ee87f5c7b --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/desktop.rs @@ -0,0 +1,216 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Desktop settings built from already-read layers. + +use teksilo_kde_scheme::{ + BreezeSettings, ColorSet, KConfig, KdeColor, KdeColorScheme, KdeConfigLocations, KdeDesktop, + KdeDesktopLayers, KdeFont, KdeFonts, LayerKind, MnemonicsMode, SchemeOrigin, ScrollBarButtons, + ShadowSize, +}; + +fn no_env(_: &str) -> Option { + None +} + +fn desktop(kdeglobals: &str, breezerc: &str) -> KdeDesktop { + desktop_with_env(kdeglobals, breezerc, &no_env) +} + +fn desktop_with_env( + kdeglobals: &str, + breezerc: &str, + var: &dyn Fn(&str) -> Option, +) -> KdeDesktop { + let locations = KdeConfigLocations::from_env(|name: &str| match name { + "HOME" => Some("/home/ada".to_owned()), + _ => None, + }); + let expansion = locations.expansion_env(var); + let globals = [KConfig::parse(kdeglobals).0.with_kind(LayerKind::User)]; + let breeze = [KConfig::parse(breezerc).0.with_kind(LayerKind::User)]; + KdeDesktop::from_layers( + &KdeDesktopLayers { + kdeglobals: &globals, + breezerc: &breeze, + scheme_file: None, + }, + &expansion, + ) +} + +#[test] +fn an_empty_session_gives_breeze_light_and_every_default() { + let d = desktop("", ""); + assert_eq!(d.scheme_origin, SchemeOrigin::BuiltIn); + assert_eq!(d.scheme, KdeColorScheme::breeze_light()); + assert_eq!(d.user_accent, None); + assert_eq!(d.fonts, KdeFonts::default()); + assert_eq!(d.animation_duration_factor, None); + assert_eq!(d.widget_style, None); + assert_eq!(d.breeze, BreezeSettings::default()); + assert!(d.uses_breeze_style()); + assert!(!d.prefers_reduced_motion()); + + let mut expected = KdeDesktop::new(KdeColorScheme::breeze_light()); + expected.scheme_origin = SchemeOrigin::BuiltIn; + assert_eq!(d, expected); +} + +#[test] +fn the_default_fonts_are_noto_sans_and_hack() { + let fonts = KdeFonts::default(); + assert_eq!(fonts.general.family, "Noto Sans"); + assert_eq!(fonts.general.point_size, Some(10.0)); + assert_eq!(fonts.small.point_size, Some(8.0)); + assert_eq!(fonts.fixed.family, "Hack"); + assert_eq!(fonts.fixed.style_hint, 7); + assert_eq!(fonts.menu.style_name.as_deref(), Some("Regular")); +} + +#[test] +fn colour_groups_in_kdeglobals_are_the_scheme() { + let d = desktop( + "[Colors:View]\nBackgroundNormal=1,2,3\n[General]\nAccentColor=233,61,61\n[KDE]\ncontrast=2\n", + "", + ); + assert_eq!(d.scheme_origin, SchemeOrigin::Kdeglobals); + assert_eq!( + d.scheme.set(ColorSet::View).background_normal, + KdeColor::rgb8(1, 2, 3) + ); + assert_eq!(d.scheme.contrast, 2); + assert_eq!(d.user_accent, Some(KdeColor::rgb8(233, 61, 61))); + assert_eq!(d.scheme.accent, Some(KdeColor::rgb8(233, 61, 61))); +} + +#[test] +fn a_transparent_accent_is_no_accent() { + assert_eq!( + desktop("[General]\nAccentColor=0,0,0,0\n", "").user_accent, + None + ); + assert_eq!( + desktop("[General]\nAccentColor=transparent\n", "").user_accent, + None + ); + assert_eq!( + desktop("[General]\nAccentColor=nonsense\n", "").user_accent, + None + ); +} + +#[test] +fn animation_duration_factor_absent() { + let d = desktop("[KDE]\nwidgetStyle=breeze\n", ""); + assert_eq!(d.animation_duration_factor, None); + assert_eq!(d.animation_factor(), 1.0); + assert!(!d.prefers_reduced_motion()); +} + +#[test] +fn animation_duration_factor_zero_asks_for_reduced_motion() { + let d = desktop("[KDE]\nAnimationDurationFactor=0\n", ""); + assert_eq!(d.animation_duration_factor, Some(0.0)); + assert_eq!(d.animation_factor(), 0.0); + assert!(d.prefers_reduced_motion()); +} + +#[test] +fn animation_duration_factor_two_doubles_the_durations() { + let d = desktop("[KDE]\nAnimationDurationFactor=2\n", ""); + assert_eq!(d.animation_duration_factor, Some(2.0)); + assert_eq!(d.animation_factor(), 2.0); + assert!(!d.prefers_reduced_motion()); +} + +#[test] +fn an_unparseable_animation_duration_factor_is_present_and_reads_as_one() { + let d = desktop("[KDE]\nAnimationDurationFactor=fast\n", ""); + assert_eq!(d.animation_duration_factor, Some(1.0)); +} + +#[test] +fn the_widget_style_is_breeze_only_when_absent_empty_or_named_breeze() { + assert!(desktop("[KDE]\nwidgetStyle=\n", "").uses_breeze_style()); + assert!(desktop("[KDE]\nwidgetStyle=BREEZE\n", "").uses_breeze_style()); + let fusion = desktop("[KDE]\nwidgetStyle=Fusion\n", ""); + assert_eq!(fusion.widget_style.as_deref(), Some("Fusion")); + assert!(!fusion.uses_breeze_style()); +} + +#[test] +fn fonts_are_read_as_strings_expanded_and_unparseable_ones_keep_the_default() { + let var = |name: &str| (name == "MONO").then(|| "Fira Mono".to_owned()); + let d = desktop_with_env( + "[General]\nfont=Inter,11,-1,5,400,0,0,0,0,0,0,0,0,0,0,1\nfixed[$e]=$MONO,9,-1,7,50,0,0,0,1,0\n\ + menuFont=garbage\ntoolBarFont=\nsmallestReadableFont=Noto Sans,7\n", + "", + &var, + ); + assert_eq!(d.fonts.general.family, "Inter"); + assert_eq!(d.fonts.general.point_size, Some(11.0)); + assert_eq!(d.fonts.fixed.family, "Fira Mono"); + assert_eq!(d.fonts.fixed.weight, 400); + assert!(d.fonts.fixed.fixed_pitch); + assert_eq!(d.fonts.menu, KdeFonts::default().menu); + assert_eq!(d.fonts.toolbar, KdeFonts::default().toolbar); + assert_eq!(d.fonts.small, KdeFont::parse_qfont("Noto Sans,7").unwrap()); +} + +#[test] +fn breezerc_settings_are_read_with_their_ranges_and_enumerations() { + let d = desktop( + "", + "[Common]\nShadowStrength=10\nShadowSize=ShadowSmall\nShadowColor=10,0,0\n\ + [Style]\nAnimationsEnabled=false\nAnimationsDuration=250\nScrollBarAddLineButtons=1\n\ + ScrollBarSubLineButtons=5\nMnemonicsMode=MN_ALWAYS\nMenuOpacity=140\nMenuItemDrawStrongFocus=false\n\ + ViewDrawFocusIndicator=0\n", + ); + let b = d.breeze; + assert_eq!(b.shadow_strength, 25); + assert_eq!(b.shadow_size, ShadowSize::Small); + assert_eq!(b.shadow_color, KdeColor::rgb8(10, 0, 0)); + assert!(!b.animations_enabled); + assert_eq!(b.animations_duration_ms, 250); + assert_eq!(b.scroll_bar_add_line_buttons, ScrollBarButtons::Single); + assert_eq!(b.scroll_bar_sub_line_buttons, ScrollBarButtons::Double); + assert_eq!(b.mnemonics_mode, MnemonicsMode::Always); + assert_eq!(b.menu_opacity, 100); + assert!(!b.menu_item_draw_strong_focus); + assert!(!b.view_draw_focus_indicator); + assert_eq!(b.progress_bar_busy_step_duration_ms, 800); +} + +#[test] +fn breezerc_enumerations_accept_indices_and_fall_back_on_unknown_names() { + let d = desktop( + "", + "[Common]\nShadowSize=4\n[Style]\nMnemonicsMode=sometimes\n", + ); + assert_eq!(d.breeze.shadow_size, ShadowSize::VeryLarge); + assert_eq!(d.breeze.mnemonics_mode, MnemonicsMode::Auto); + let unknown = desktop("", "[Common]\nShadowSize=ShadowHuge\n"); + assert_eq!(unknown.breeze.shadow_size, ShadowSize::Large); +} + +#[test] +fn an_immutable_system_breezerc_wins_over_the_user_file() { + let locations = KdeConfigLocations::from_env(|_: &str| None); + let expansion = locations.expansion_env(&no_env); + let breezerc = [ + KConfig::parse("[Style][$i]\nMenuOpacity=80\n").0, + KConfig::parse("[Style]\nMenuOpacity=50\n") + .0 + .with_kind(LayerKind::User), + ]; + let d = KdeDesktop::from_layers( + &KdeDesktopLayers { + kdeglobals: &[], + breezerc: &breezerc, + scheme_file: None, + }, + &expansion, + ); + assert_eq!(d.breeze.menu_opacity, 80); +} diff --git a/crates/teksilo-kde-scheme/tests/fixtures/breeze-v6.8.0/BreezeClassic.colors b/crates/teksilo-kde-scheme/tests/fixtures/breeze-v6.8.0/BreezeClassic.colors new file mode 100644 index 000000000..881f8c16c --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/fixtures/breeze-v6.8.0/BreezeClassic.colors @@ -0,0 +1,170 @@ +[ColorEffects:Disabled] +Color=56,56,56 +ColorAmount=0 +ColorEffect=0 +ContrastAmount=0.65 +ContrastEffect=1 +IntensityAmount=0.1 +IntensityEffect=2 + +[ColorEffects:Inactive] +ChangeSelectionColor=true +Color=112,111,110 +ColorAmount=0.025 +ColorEffect=2 +ContrastAmount=0.1 +ContrastEffect=2 +Enable=false +IntensityAmount=0 +IntensityEffect=0 + +[Colors:Button] +BackgroundAlternate=189,195,199 +BackgroundNormal=239,240,241 +DecorationFocus=61,174,233 +DecorationHover=147,206,233 +ForegroundActive=61,174,233 +ForegroundInactive=127,140,141 +ForegroundLink=41,128,185 +ForegroundNegative=218,68,83 +ForegroundNeutral=198,92,0 +ForegroundNormal=35,38,39 +ForegroundPositive=39,174,96 +ForegroundVisited=127,140,141 + +[Colors:Selection] +BackgroundAlternate=29,153,243 +BackgroundNormal=61,174,233 +DecorationFocus=61,174,233 +DecorationHover=147,206,233 +ForegroundActive=252,252,252 +ForegroundInactive=239,240,241 +ForegroundLink=253,188,75 +ForegroundNegative=176,55,69 +ForegroundNeutral=246,116,0 +ForegroundNormal=252,252,252 +ForegroundPositive=23,104,57 +ForegroundVisited=189,195,199 + +[Colors:Tooltip] +BackgroundAlternate=77,77,77 +BackgroundNormal=35,38,39 +DecorationFocus=61,174,233 +DecorationHover=147,206,233 +ForegroundActive=61,174,233 +ForegroundInactive=189,195,199 +ForegroundLink=41,128,185 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=252,252,252 +ForegroundPositive=39,174,96 +ForegroundVisited=127,140,141 + +[Colors:View] +BackgroundAlternate=239,240,241 +BackgroundNormal=252,252,252 +DecorationFocus=61,174,233 +DecorationHover=147,206,233 +ForegroundActive=61,174,233 +ForegroundInactive=127,140,141 +ForegroundLink=41,128,185 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=35,38,39 +ForegroundPositive=39,174,96 +ForegroundVisited=127,140,141 + +[Colors:Window] +BackgroundAlternate=189,195,199 +BackgroundNormal=239,240,241 +DecorationFocus=61,174,233 +DecorationHover=147,206,233 +ForegroundActive=61,174,233 +ForegroundInactive=127,140,141 +ForegroundLink=41,128,185 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=35,38,39 +ForegroundPositive=39,174,96 +ForegroundVisited=127,140,141 + +[Colors:Complementary] +BackgroundAlternate=59,64,69 +BackgroundNormal=49,54,59 +DecorationFocus=30,146,255 +DecorationHover=61,174,230 +ForegroundActive=147,206,233 +ForegroundInactive=175,176,179 +ForegroundLink=61,174,230 +ForegroundNegative=231,76,60 +ForegroundNeutral=253,188,75 +ForegroundNormal=239,240,241 +ForegroundPositive=46,204,113 +ForegroundVisited=61,174,230 + +[General] +ColorScheme=BreezeClassic +Name=Breeze Classic +Name[ar]=نسيم التقليدي +Name[az]=Breeze klassik +Name[bg]=Breeze Класически +Name[ca]=Brisa clàssica +Name[ca@valencia]=Brisa clàssica +Name[cs]=Breeze Classic +Name[da]=Breeze Classic +Name[de]=Breeze Klassisch +Name[el]=Breeze κλασικό +Name[en_GB]=Breeze Classic +Name[eo]=Breeze Classic +Name[es]=Brisa clásico +Name[eu]=Breeze klasikoa +Name[fi]=Perinteinen Breeze +Name[fr]=Breeze classique +Name[gl]=Brisa clásica +Name[he]=בריזה קלסית +Name[hi]=ब्रीज़ क्लासिक +Name[hu]=Breeze Classic +Name[ia]=Brisa Classic +Name[id]=Breeze Klasik +Name[is]=Breeze klassík +Name[it]=Brezza classico +Name[ja]=Breeze クラシック +Name[ka]=Breeze კლასიკური +Name[ko]=Breeze 고전 +Name[lt]=Breeze klasikinis +Name[lv]=„Breeze“ klasiskais +Name[nl]=Breeze Classic +Name[nn]=Breeze klassisk +Name[pa]=ਬਰੀਜ਼ ਟਕਸਾਲੀ +Name[pl]=Klasyczna Bryza +Name[pt]=Brisa Clássico +Name[pt_BR]=Breeze Classic +Name[ro]=Briză, clasic +Name[ru]=Breeze, классический вариант +Name[sa]=हवा क्लासिक +Name[sk]=Klasický vánok +Name[sl]=Sapica, klasična +Name[sr]=Поветарац класични +Name[sr@ijekavian]=Поветарац класични +Name[sr@ijekavianlatin]=Povetarac klasični +Name[sr@latin]=Povetarac klasični +Name[sv]=Breeze klassisk +Name[ta]=செந்தர பிரீஸ் +Name[tr]=Esinti Klasik +Name[uk]=Класична Breeze +Name[zh_CN]=Breeze 微风经典 +Name[zh_TW]=Breeze Classic +accentActiveTitlebar=true +accentInactiveTitlebar=false +shadeSortColumn=true + +[KDE] +contrast=4 + +[WM] +activeBackground=71,80,87 +activeBlend=252,252,252 +activeForeground=252,252,252 +inactiveBackground=239,240,241 +inactiveBlend=75,71,67 +inactiveForeground=189,195,199 diff --git a/crates/teksilo-kde-scheme/tests/fixtures/breeze-v6.8.0/BreezeDark.colors b/crates/teksilo-kde-scheme/tests/fixtures/breeze-v6.8.0/BreezeDark.colors new file mode 100644 index 000000000..a759d5459 --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/fixtures/breeze-v6.8.0/BreezeDark.colors @@ -0,0 +1,210 @@ +# SPDX-FileCopyrightText: Andrew Lake +# SPDX-FileCopyrightText: Marco Martin +# SPDX-FileCopyrightText: Nate Graham +# SPDX-FileCopyrightText: Noah Davis +# SPDX-FileCopyrightText: Neal Gompa +# SPDX-FileCopyrightText: David Redondo +# SPDX-FileCopyrightText: Thomas Duckworth +# SPDX-License-Identifier: LGPL-2.0-or-later + +[ColorEffects:Disabled] +Color=56,56,56 +ColorAmount=0 +ColorEffect=0 +ContrastAmount=0.65 +ContrastEffect=1 +IntensityAmount=0.1 +IntensityEffect=2 + +[ColorEffects:Inactive] +ChangeSelectionColor=true +Color=112,111,110 +ColorAmount=0.025 +ColorEffect=2 +ContrastAmount=0.1 +ContrastEffect=2 +Enable=false +IntensityAmount=0 +IntensityEffect=0 + +[Colors:Button] +BackgroundAlternate=30,87,116 +BackgroundNormal=41,44,48 +DecorationFocus=61,174,233 +DecorationHover=61,174,233 +ForegroundActive=61,174,233 +ForegroundInactive=161,169,177 +ForegroundLink=29,153,243 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=252,252,252 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[Colors:Complementary] +BackgroundAlternate=30,87,116 +BackgroundNormal=32,35,38 +DecorationFocus=61,174,233 +DecorationHover=61,174,233 +ForegroundActive=61,174,233 +ForegroundInactive=161,169,177 +ForegroundLink=29,153,243 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=252,252,252 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[Colors:Header] +BackgroundAlternate=32,35,38 +BackgroundNormal=41,44,48 +DecorationFocus=61,174,233 +DecorationHover=61,174,233 +ForegroundActive=61,174,233 +ForegroundInactive=161,169,177 +ForegroundLink=29,153,243 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=252,252,252 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[Colors:Header][Inactive] +BackgroundAlternate=41,44,48 +BackgroundNormal=32,35,38 +DecorationFocus=61,174,233 +DecorationHover=61,174,233 +ForegroundActive=61,174,233 +ForegroundInactive=161,169,177 +ForegroundLink=29,153,243 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=252,252,252 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[Colors:Selection] +BackgroundAlternate=30,87,116 +BackgroundNormal=61,174,233 +DecorationFocus=61,174,233 +DecorationHover=61,174,233 +ForegroundActive=252,252,252 +ForegroundInactive=161,169,177 +ForegroundLink=253,188,75 +ForegroundNegative=176,55,69 +ForegroundNeutral=198,92,0 +ForegroundNormal=252,252,252 +ForegroundPositive=23,104,57 +ForegroundVisited=155,89,182 + +[Colors:Tooltip] +BackgroundAlternate=32,35,38 +BackgroundNormal=41,44,48 +DecorationFocus=61,174,233 +DecorationHover=61,174,233 +ForegroundActive=61,174,233 +ForegroundInactive=161,169,177 +ForegroundLink=29,153,243 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=252,252,252 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[Colors:View] +BackgroundAlternate=29,31,34 +BackgroundNormal=20,22,24 +DecorationFocus=61,174,233 +DecorationHover=61,174,233 +ForegroundActive=61,174,233 +ForegroundInactive=161,169,177 +ForegroundLink=29,153,243 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=252,252,252 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[Colors:Window] +BackgroundAlternate=41,44,48 +BackgroundNormal=32,35,38 +DecorationFocus=61,174,233 +DecorationHover=61,174,233 +ForegroundActive=61,174,233 +ForegroundInactive=161,169,177 +ForegroundLink=29,153,243 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=252,252,252 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[General] +ColorScheme=BreezeDark +Name=Breeze Dark +Name[ar]=نسيم داكن +Name[az]=Breeze - Tünd +Name[bg]=Breeze Тъмен +Name[bs]=Breeze tamna +Name[ca]=Brisa fosca +Name[ca@valencia]=Brisa fosca +Name[cs]=Breeze Tmavé +Name[da]=Breeze Dark +Name[de]=Breeze Dunkel +Name[el]=Breeze σκούρο +Name[en_GB]=Breeze Dark +Name[eo]=Breeze Dark +Name[es]=Brisa oscuro +Name[et]=Breeze tume +Name[eu]=Breeze iluna +Name[fi]=Tumma Breeze +Name[fr]=Brise sombre +Name[gl]=Brisa escura +Name[he]=בריזה כהה +Name[hi]=ब्रीज़ गहरा +Name[hu]=Breeze Dark +Name[ia]=Brisa obscure +Name[id]=Breeze Gelap +Name[is]=Breeze dökkt +Name[it]=Brezza scuro +Name[ja]=Breeze Dark +Name[ka]=Breeze მუქი +Name[ko]=어두운 Breeze +Name[lt]=Breeze tamsus +Name[lv]=„Breeze“ tumšais +Name[nb]=Breeze mørk +Name[nl]=Breeze Dark +Name[nn]=Breeze mørk +Name[pa]=ਬਰੀਜ਼ ਗੂੜ੍ਹਾ +Name[pl]=Ciemna Bryza +Name[pt]=Brisa Escuro +Name[pt_BR]=Breeze Dark +Name[ro]=Briză, întunecat +Name[ru]=Breeze, тёмный вариант +Name[sa]=वायुः अन्धकारः +Name[sk]=Tmavý vánok +Name[sl]=Sapica, temna +Name[sr]=Поветарац тамни +Name[sr@ijekavian]=Поветарац тамни +Name[sr@ijekavianlatin]=Povetarac tamni +Name[sr@latin]=Povetarac tamni +Name[sv]=Breeze mörk +Name[ta]=கரும் பிரீஸ் +Name[tg]=Насими торик +Name[tr]=Esinti Koyu +Name[ug]=مەيىن شامال قاراڭغۇ +Name[uk]=Темна Breeze +Name[zh_CN]=Breeze 微风深色 +Name[zh_TW]=Breeze Dark +shadeSortColumn=true + +[KDE] +contrast=4 + +[WM] +activeBackground=39,44,49 +activeBlend=252,252,252 +activeForeground=252,252,252 +inactiveBackground=32,36,40 +inactiveBlend=161,169,177 +inactiveForeground=161,169,177 diff --git a/crates/teksilo-kde-scheme/tests/fixtures/breeze-v6.8.0/BreezeLight.colors b/crates/teksilo-kde-scheme/tests/fixtures/breeze-v6.8.0/BreezeLight.colors new file mode 100644 index 000000000..b3c2fca60 --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/fixtures/breeze-v6.8.0/BreezeLight.colors @@ -0,0 +1,207 @@ +# SPDX-FileCopyrightText: Andrew Lake +# SPDX-FileCopyrightText: Marco Martin +# SPDX-FileCopyrightText: Nate Graham +# SPDX-FileCopyrightText: Noah Davis +# SPDX-FileCopyrightText: Neal Gompa +# SPDX-FileCopyrightText: David Redondo +# SPDX-License-Identifier: LGPL-2.0-or-later + +[ColorEffects:Disabled] +Color=56,56,56 +ColorAmount=0 +ColorEffect=0 +ContrastAmount=0.65 +ContrastEffect=1 +IntensityAmount=0.1 +IntensityEffect=2 + +[ColorEffects:Inactive] +ChangeSelectionColor=true +Color=112,111,110 +ColorAmount=0.025 +ColorEffect=2 +ContrastAmount=0.1 +ContrastEffect=2 +Enable=false +IntensityAmount=0 +IntensityEffect=0 + +[Colors:Button] +BackgroundAlternate=163,212,250 +BackgroundNormal=252,252,252 +DecorationFocus=61,174,233 +DecorationHover=61,174,233 +ForegroundActive=61,174,233 +ForegroundInactive=112,125,138 +ForegroundLink=41,128,185 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=35,38,41 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[Colors:Complementary] +BackgroundAlternate=27,30,32 +BackgroundNormal=42,46,50 +DecorationFocus=61,174,233 +DecorationHover=61,174,233 +ForegroundActive=61,174,233 +ForegroundInactive=161,169,177 +ForegroundLink=29,153,243 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=252,252,252 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[Colors:Header] +BackgroundAlternate=239,240,241 +BackgroundNormal=222,224,226 +DecorationFocus=61,174,233 +DecorationHover=61,174,233 +ForegroundActive=61,174,233 +ForegroundInactive=112,125,138 +ForegroundLink=41,128,185 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=35,38,41 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[Colors:Header][Inactive] +BackgroundAlternate=227,229,231 +BackgroundNormal=239,240,241 +DecorationFocus=61,174,233 +DecorationHover=61,174,233 +ForegroundActive=61,174,233 +ForegroundInactive=112,125,138 +ForegroundLink=41,128,185 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=35,38,41 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[Colors:Selection] +BackgroundAlternate=163,212,250 +BackgroundNormal=61,174,233 +DecorationFocus=61,174,233 +DecorationHover=61,174,233 +ForegroundActive=255,255,255 +ForegroundInactive=112,125,138 +ForegroundLink=253,188,75 +ForegroundNegative=176,55,69 +ForegroundNeutral=198,92,0 +ForegroundNormal=255,255,255 +ForegroundPositive=23,104,57 +ForegroundVisited=155,89,182 + +[Colors:Tooltip] +BackgroundAlternate=239,240,241 +BackgroundNormal=247,247,247 +DecorationFocus=61,174,233 +DecorationHover=61,174,233 +ForegroundActive=61,174,233 +ForegroundInactive=112,125,138 +ForegroundLink=41,128,185 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=35,38,41 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[Colors:View] +BackgroundAlternate=247,247,247 +BackgroundNormal=255,255,255 +DecorationFocus=61,174,233 +DecorationHover=61,174,233 +ForegroundActive=61,174,233 +ForegroundInactive=112,125,138 +ForegroundLink=41,128,185 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=35,38,41 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[Colors:Window] +BackgroundAlternate=227,229,231 +BackgroundNormal=239,240,241 +DecorationFocus=61,174,233 +DecorationHover=61,174,233 +ForegroundActive=61,174,233 +ForegroundInactive=112,125,138 +ForegroundLink=41,128,185 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=35,38,41 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[General] +ColorScheme=BreezeLight +Name=Breeze Light +Name[ar]=نسيم فاتح +Name[az]=Breeze - İşıqlı +Name[bg]=Breeze Светъл +Name[ca]=Brisa clara +Name[ca@valencia]=Brisa clara +Name[cs]=Breeze Světlé +Name[da]=Breeze Light +Name[de]=Breeze Hell +Name[el]=Breeze φωτεινό +Name[en_GB]=Breeze Light +Name[eo]=Breeze Light +Name[es]=Brisa claro +Name[et]=Breeze hele +Name[eu]=Breeze argia +Name[fi]=Vaalea Breeze +Name[fr]=Brise clair +Name[gl]=Brisa clara +Name[he]=בריזה בהירה +Name[hi]=ब्रीज़ हलका +Name[hu]=Breeze Light +Name[ia]=Brisa Ligier +Name[id]=Breeze Terang +Name[is]=Breeze ljóst +Name[it]=Brezza chiaro +Name[ja]=Breeze Light +Name[ka]=Breeze ღია +Name[ko]=밝은 Breeze +Name[lt]=Breeze šviesus +Name[lv]=„Breeze“ gaišais +Name[nl]=Breeze Light +Name[nn]=Breeze lys +Name[pa]=ਬਰੀਜ਼ ਹਲਕਾ +Name[pl]=Jasna Bryza +Name[pt]=Brisa Claro +Name[pt_BR]=Breeze Light +Name[ro]=Briză, luminos +Name[ru]=Breeze, светлый вариант +Name[sa]=वायु प्रकाश +Name[sk]=Svetlý vánok +Name[sl]=Sapica, svetla +Name[sr]=Поветарац светли +Name[sr@ijekavian]=Поветарац свијетли +Name[sr@ijekavianlatin]=Povetarac svijetli +Name[sr@latin]=Povetarac svetli +Name[sv]=Breeze ljus +Name[ta]=வெளிர் பிரீஸ் +Name[tg]=Насими сабук +Name[tr]=Esinti Açık +Name[ug]=مەيىن شامال يورۇق +Name[uk]=Світла Breeze +Name[zh_CN]=Breeze 微风浅色 +Name[zh_TW]=Breeze Light +shadeSortColumn=true + +[KDE] +contrast=4 + +[WM] +activeBackground=227,229,231 +activeBlend=227,229,231 +activeForeground=35,38,41 +inactiveBackground=239,240,241 +inactiveBlend=239,240,241 +inactiveForeground=112,125,138 diff --git a/crates/teksilo-kde-scheme/tests/fixtures/breeze-v6.8.0/LICENSE.txt b/crates/teksilo-kde-scheme/tests/fixtures/breeze-v6.8.0/LICENSE.txt new file mode 100644 index 000000000..12735e6c2 --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/fixtures/breeze-v6.8.0/LICENSE.txt @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/crates/teksilo-kde-scheme/tests/grammar.rs b/crates/teksilo-kde-scheme/tests/grammar.rs new file mode 100644 index 000000000..ea7be96d2 --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/grammar.rs @@ -0,0 +1,333 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The configuration grammar, one rule per test, including the malformed +//! inputs the parser must survive without failing. + +use teksilo_kde_scheme::{DiagnosticKind, KConfig, ParseDiagnostic}; + +fn parse(text: &str) -> (KConfig, Vec) { + KConfig::parse(text) +} + +fn kinds(diagnostics: &[ParseDiagnostic]) -> Vec { + diagnostics.iter().map(|d| d.kind.clone()).collect() +} + +#[test] +fn an_empty_file_contributes_nothing() { + let (config, diagnostics) = parse(""); + assert_eq!(config, KConfig::default()); + assert!(diagnostics.is_empty()); +} + +#[test] +fn entries_before_any_header_belong_to_the_root_group() { + let (config, _) = parse("Key=Value\n[G]\nOther=1\n"); + assert_eq!(config.get(&[], "Key"), Some("Value")); + assert_eq!(config.get(&["G"], "Other"), Some("1")); + assert_eq!(config.get(&["G"], "Key"), None); +} + +#[test] +fn keys_and_values_are_trimmed_and_the_value_may_contain_equals_signs() { + let (config, _) = parse("[G]\n Key = a=b = c \n"); + assert_eq!(config.get(&["G"], "Key"), Some("a=b = c")); +} + +#[test] +fn hash_lines_and_blank_lines_are_comments_but_semicolons_are_not() { + let (config, diagnostics) = + parse("# comment\n\n \n # indented comment\n[G]\n;Key=1\nValue=has # inside\n"); + assert!(diagnostics.is_empty(), "{diagnostics:?}"); + assert_eq!(config.get(&["G"], ";Key"), Some("1")); + assert_eq!(config.get(&["G"], "Value"), Some("has # inside")); +} + +#[test] +fn crlf_line_endings_read_like_lf() { + let (crlf, d1) = parse("[G]\r\nKey=Value\r\n"); + let (lf, d2) = parse("[G]\nKey=Value\n"); + assert_eq!(crlf, lf); + assert!(d1.is_empty() && d2.is_empty()); +} + +#[test] +fn a_file_with_lone_cr_separators_is_a_single_line() { + let (config, _) = parse("[G]\rKey=Value\r"); + // The whole file is one header line: `[G]` followed by ignored text. + assert_eq!(config.get(&["G"], "Key"), None); + assert!(config.groups().next().is_none()); +} + +#[test] +fn a_byte_order_mark_hides_the_first_header_and_is_reported() { + let (config, diagnostics) = parse("\u{FEFF}[General]\nColorScheme=BreezeDark\n"); + assert_eq!( + kinds(&diagnostics), + vec![DiagnosticKind::ByteOrderMark, DiagnosticKind::MissingEquals] + ); + assert_eq!(config.get(&["General"], "ColorScheme"), None); + assert_eq!(config.get(&[], "ColorScheme"), Some("BreezeDark")); +} + +#[test] +fn nested_groups_are_separate_from_their_parent() { + let (config, _) = parse("[Colors:Header]\nA=1\n[Colors:Header][Inactive]\nB=2\n"); + assert_eq!(config.get(&["Colors:Header"], "A"), Some("1")); + assert_eq!(config.get(&["Colors:Header", "Inactive"], "B"), Some("2")); + assert_eq!(config.get(&["Colors:Header", "Inactive"], "A"), None); + assert_eq!(config.get(&["Colors:Header"], "B"), None); +} + +#[test] +fn text_after_the_last_closing_bracket_of_a_header_is_ignored() { + let (config, _) = parse("[G] trailing\nKey=1\n[A][B]x[C]\nOther=2\n"); + assert_eq!(config.get(&["G"], "Key"), Some("1")); + assert_eq!(config.get(&["A", "B"], "Other"), Some("2")); +} + +#[test] +fn an_unclosed_header_is_skipped_and_the_current_group_is_kept() { + let (config, diagnostics) = parse("[G]\nA=1\n[Broken\nB=2\n"); + assert_eq!( + kinds(&diagnostics), + vec![DiagnosticKind::UnclosedGroupHeader] + ); + assert_eq!(diagnostics[0].line, 3); + assert_eq!(config.get(&["G"], "B"), Some("2")); +} + +#[test] +fn a_line_without_equals_is_an_error_and_skipped() { + let (config, diagnostics) = parse("[G]\nJustText\nKey=1\n"); + assert_eq!(kinds(&diagnostics), vec![DiagnosticKind::MissingEquals]); + assert_eq!(config.keys(&["G"]), vec!["Key"]); +} + +#[test] +fn a_line_with_an_empty_key_is_ignored_without_an_error() { + let (config, diagnostics) = parse("[G]\n=value\n = other\n"); + assert!(diagnostics.is_empty(), "{diagnostics:?}"); + assert!(config.keys(&["G"]).is_empty()); +} + +#[test] +fn the_last_occurrence_of_a_key_in_a_file_wins() { + let (config, _) = parse("[G]\nKey=first\nKey=second\n[Other]\n[G]\nKey=third\n"); + assert_eq!(config.get(&["G"], "Key"), Some("third")); +} + +#[test] +fn an_immutable_occurrence_freezes_the_key_for_the_rest_of_the_file() { + let (config, _) = parse("[G]\nKey=first\nKey[$i]=frozen\nKey=ignored\n"); + let entry = config.entry(&["G"], "Key").unwrap(); + assert_eq!(entry.value(), Some("frozen")); + assert!(entry.is_immutable()); +} + +#[test] +fn inside_an_immutable_group_the_first_occurrence_wins() { + let (config, _) = parse("[G][$i]\nKey=first\nKey=second\n"); + assert_eq!(config.get(&["G"], "Key"), Some("first")); + assert!(config.is_group_immutable(&["G"])); + assert!(config.entry(&["G"], "Key").unwrap().is_immutable()); +} + +#[test] +fn group_immutability_applies_to_that_group_only() { + let (config, _) = parse("[G][$i]\nA=1\n[G][Sub]\nB=2\n"); + assert!(config.is_group_immutable(&["G"])); + assert!(!config.is_group_immutable(&["G", "Sub"])); + assert!(!config.entry(&["G", "Sub"], "B").unwrap().is_immutable()); +} + +#[test] +fn a_dollar_i_segment_that_is_not_last_is_part_of_the_name() { + let (config, _) = parse("[G][$i][H]\nA=1\n[K][$i]x\nB=2\n"); + assert_eq!(config.get(&["G", "$i", "H"], "A"), Some("1")); + assert_eq!(config.get(&["K", "$i"], "B"), Some("2")); + assert!(!config.is_group_immutable(&["K"])); +} + +#[test] +fn a_bare_dollar_i_line_makes_the_rest_of_the_file_immutable() { + let (config, _) = parse("[Before]\nA=1\n[$i]\nB=2\n[After]\nC=3\n"); + assert!(config.is_file_immutable()); + assert!(!config.entry(&["Before"], "A").unwrap().is_immutable()); + // Entries right after the bare line go to the empty-named group. + assert_eq!(config.get(&[""], "B"), Some("2")); + assert!(config.entry(&[""], "B").unwrap().is_immutable()); + assert!(config.entry(&["After"], "C").unwrap().is_immutable()); +} + +#[test] +fn key_options_are_read_from_trailing_brackets_in_either_order_with_a_locale() { + let (config, diagnostics) = parse("[G]\nA[$ie]=1\nB[$i][de]=2\nC[de][$i]=3\nD[$xz]=4\n"); + assert!(diagnostics.is_empty(), "{diagnostics:?}"); + let a = config.entry(&["G"], "A").unwrap(); + assert!(a.is_immutable() && a.expands()); + // Locale-tagged entries are ignored, whatever their options. + assert_eq!(config.get(&["G"], "B"), None); + assert_eq!(config.get(&["G"], "C"), None); + // Unknown option letters are ignored. + let d = config.entry(&["G"], "D").unwrap(); + assert!(!d.is_immutable() && !d.expands()); +} + +#[test] +fn locale_tagged_entries_are_ignored() { + let (config, _) = parse("[General]\nName=Breeze Light\nName[fr]=Breeze clair\n"); + assert_eq!(config.get(&["General"], "Name"), Some("Breeze Light")); + assert_eq!(config.keys(&["General"]), vec!["Name"]); +} + +#[test] +fn a_second_locale_tag_is_an_error() { + let (config, diagnostics) = parse("[G]\nName[fr][de]=x\nOk=1\n"); + assert_eq!(kinds(&diagnostics), vec![DiagnosticKind::SecondLocale]); + assert_eq!(config.keys(&["G"]), vec!["Ok"]); +} + +#[test] +fn an_unclosed_key_bracket_is_an_error() { + let (config, diagnostics) = parse("[G]\nKey[de=x\nKe[y]x=literal\n"); + assert_eq!( + kinds(&diagnostics), + vec![DiagnosticKind::UnclosedKeyBracket] + ); + assert_eq!(config.get(&["G"], "Ke[y]x"), Some("literal")); +} + +#[test] +fn a_deleted_entry_needs_no_equals_and_reads_as_absent() { + let (config, diagnostics) = parse("[G]\nKey[$d]\nOther[$d]=ignored\n"); + assert!(diagnostics.is_empty(), "{diagnostics:?}"); + assert!(config.entry(&["G"], "Key").unwrap().is_deleted()); + assert_eq!(config.get(&["G"], "Key"), None); + assert_eq!(config.get(&["G"], "Other"), None); + assert!(!config.has_key(&["G"], "Other")); + assert!(!config.group_exists(&["G"])); +} + +#[test] +fn escapes_are_decoded_in_values_keys_and_group_names() { + let (config, diagnostics) = + parse("[Sp\\sace]\nTab\\tKey=\\sa\\tb\\nc\\rd\\\\e\\x41\\x6a\\s\nList=a\\,b\\;c\n"); + assert!(diagnostics.is_empty(), "{diagnostics:?}"); + assert_eq!( + config.get(&["Sp ace"], "Tab\tKey"), + Some(" a\tb\nc\rd\\eAj ") + ); + assert_eq!(config.get(&["Sp ace"], "List"), Some("a\\,b\\;c")); +} + +#[test] +fn a_trailing_backslash_is_kept() { + let (config, _) = parse("[G]\nKey=path\\\n"); + assert_eq!(config.get(&["G"], "Key"), Some("path\\")); +} + +#[test] +fn hex_escapes_with_too_few_or_non_hex_digits_yield_x() { + let (config, diagnostics) = parse("[G]\nShort=ab\\x4\nBad=a\\xzzb\nEnd=a\\x\n"); + assert!(diagnostics.is_empty(), "{diagnostics:?}"); + assert_eq!(config.get(&["G"], "Short"), Some("abx")); + assert_eq!(config.get(&["G"], "Bad"), Some("axb")); + assert_eq!(config.get(&["G"], "End"), Some("ax")); +} + +#[test] +fn an_unknown_escape_is_kept_verbatim_and_reported() { + let (config, diagnostics) = parse("[G]\nKey=a\\qb\\sc\n"); + assert_eq!( + kinds(&diagnostics), + vec![DiagnosticKind::InvalidEscape('q')] + ); + assert_eq!(config.get(&["G"], "Key"), Some("a\\qb c")); +} + +#[test] +fn invalid_utf8_is_replaced_and_hex_escapes_can_produce_it_too() { + let (config, diagnostics) = KConfig::parse_bytes(b"[G]\nKey=a\xffb\nEsc=\\xc3\\xa9\\xff\n"); + assert!(diagnostics.is_empty(), "{diagnostics:?}"); + assert_eq!(config.get(&["G"], "Key"), Some("a\u{FFFD}b")); + assert_eq!(config.get(&["G"], "Esc"), Some("\u{e9}\u{FFFD}")); +} + +#[test] +fn a_line_longer_than_one_and_a_half_mebibytes_is_skipped() { + let long = format!("[G]\nLong={}\nShort=1\n", "x".repeat(1536 * 1024)); + let (config, diagnostics) = parse(&long); + assert_eq!(kinds(&diagnostics), vec![DiagnosticKind::LineTooLong]); + assert_eq!(config.get(&["G"], "Long"), None); + assert_eq!(config.get(&["G"], "Short"), Some("1")); +} + +#[test] +fn reading_stops_after_the_hundredth_counted_error() { + let mut text = String::from("[G]\nBefore=1\n"); + for _ in 0..100 { + text.push_str("broken\n"); + } + text.push_str("After=2\n"); + let (config, diagnostics) = parse(&text); + assert_eq!(config.get(&["G"], "Before"), Some("1")); + assert_eq!(config.get(&["G"], "After"), None); + assert_eq!(diagnostics.len(), 101); + assert_eq!( + diagnostics.last().unwrap().kind, + DiagnosticKind::TooManyErrors + ); +} + +#[test] +fn ninety_nine_errors_do_not_stop_the_file() { + let mut text = String::from("[G]\n"); + for _ in 0..99 { + text.push_str("broken\n"); + } + text.push_str("After=2\n"); + let (config, diagnostics) = parse(&text); + assert_eq!(config.get(&["G"], "After"), Some("2")); + assert_eq!(diagnostics.len(), 99); +} + +#[test] +fn a_group_exists_only_with_a_live_entry_in_it_or_below_it() { + let (config, _) = parse("[Empty]\n[Gone]\nK[$d]\n[Parent][Child]\nK=1\n"); + assert!(!config.group_exists(&["Empty"])); + assert!(!config.group_exists(&["Gone"])); + assert!(config.group_exists(&["Parent"])); + assert!(config.group_exists(&["Parent", "Child"])); + assert!(!config.group_exists(&["Parent", "Other"])); +} + +#[test] +fn typed_reads_follow_kde_rules() { + let (config, _) = parse( + "[G]\nT=yes\nF=Off\nZero=0\nEmpty=\nInt= 12\nBadInt=1.5\nReal=0.15\nBadReal=abc\nInf=inf\n", + ); + let g = &["G"]; + assert_eq!(config.read_bool(g, "T"), Some(true)); + assert_eq!(config.read_bool(g, "F"), Some(false)); + assert_eq!(config.read_bool(g, "Zero"), Some(false)); + // An empty value is present, and every value but the four false words + // reads as true. + assert_eq!(config.read_bool(g, "Empty"), Some(true)); + assert_eq!(config.read_bool(g, "Missing"), None); + // Values are trimmed when the entry is read, so " 12" is "12". + assert_eq!(config.read_int(g, "Int", 7), 12); + assert_eq!(config.read_int(g, "BadInt", 7), 7); + assert_eq!(config.read_int(g, "Empty", 7), 7); + assert_eq!(config.read_real(g, "Real", 0.2), 0.15); + assert_eq!(config.read_real(g, "BadReal", 0.2), 0.2); + assert_eq!(config.read_real(g, "Inf", 0.2), 0.2); +} + +#[test] +fn diagnostics_carry_one_based_line_numbers_and_display_them() { + let (_, diagnostics) = parse("[G]\nok=1\n\nbroken\n"); + assert_eq!(diagnostics[0].line, 4); + assert_eq!(diagnostics[0].to_string(), "line 4: the line has no `=`"); +} diff --git a/crates/teksilo-kde-scheme/tests/prop_config.proptest-regressions b/crates/teksilo-kde-scheme/tests/prop_config.proptest-regressions new file mode 100644 index 000000000..a14afbf86 --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/prop_config.proptest-regressions @@ -0,0 +1,7 @@ +# Seeds for failure cases proptest has generated in the past. It is +# automatically read and these particular cases re-run before any +# novel cases are generated. +# +# It is recommended to check this file in to source control so that +# everyone who runs the test benefits from these saved cases. +cc 8e347f92a35f5399869f64e9dcd1e4e35014ca47f0bd6cd44e61516e2e37d082 # shrinks to count = 10, ints = ["-2147483648", "-2147483648", "-2147483648", "-2147483648", "-2147483648", "-2147483648", "-2147483648", "-2147483648", "-2147483648", "-2147483648", "-2147483648", "-2147483648", "-2147483648", "-2147483648", "-2147483648", "-2147483648", "-2147483648", "-2147483648"], floats = ["10", "10", "10", "10", "10", "10", "10", "10", "10", "10", "10", "10", "10", "10", "10", "10", "10", "10"] diff --git a/crates/teksilo-kde-scheme/tests/prop_config.rs b/crates/teksilo-kde-scheme/tests/prop_config.rs new file mode 100644 index 000000000..97174e832 --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/prop_config.rs @@ -0,0 +1,199 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Property tests for the configuration parser and the readers built on it +//! (crates/teksilo-kde-scheme/src/config.rs, color.rs, fonts.rs and +//! scheme.rs). +//! +//! The parser reads files a user, a distribution or a theme package wrote, +//! so it must return rather than unwind on any input at all. `cargo-fuzz` +//! needs nightly and libfuzzer-sys, which is not assumed here; proptest +//! with 1024 cases per property gives the "never panics on weird input" +//! coverage a fuzz corpus would, plus shrinking to a minimal +//! counterexample. Manual override knob: `PROPTEST_CASES=N cargo test -p +//! teksilo-kde-scheme --test prop_config`. +//! +//! Safe run (engineering/docs/property-testing.md): +//! +//! ```text +//! cargo test -p teksilo-kde-scheme --test prop_config --no-run +//! BIN=$(cargo test -p teksilo-kde-scheme --test prop_config --no-run --message-format=json 2>/dev/null \ +//! | jq -r 'select(.executable != null) | .executable' | tail -1) +//! ( ulimit -v 6000000 -t 300; "$BIN" --test-threads=1 ) +//! ``` + +use proptest::prelude::*; +use teksilo_kde_scheme::{KConfig, KdeColor, KdeColorScheme, KdeFont}; + +/// Bytes biased toward the characters the grammar gives a meaning to, so +/// most cases exercise headers, suffixes and escapes rather than plain +/// text. Cost: at most 400 bytes per case, parsed once (linear), so the +/// worst case is a few microseconds and a few kilobytes. +fn arb_config_bytes() -> impl Strategy> { + let byte = prop_oneof![ + 4 => prop::sample::select(b"[]$=\\\n\r#ideftxs0123456789abcdefABCDEF,;: \t".to_vec()), + 1 => any::(), + ]; + prop::collection::vec(byte, 0..400) +} + +/// Lines assembled from grammar fragments and the keys a scheme reads, so +/// headers, nested groups, key suffixes and colour keys appear far more +/// often than random bytes would make them. Cost: at most 40 lines of up to +/// 5 fragments each, well under 4 KB, parsed, cascaded, written and parsed +/// again: a few hundred microseconds per case. +fn arb_config_text() -> impl Strategy { + let fragment = prop::sample::select(vec![ + "[", + "]", + "[$i]", + "[$d]", + "[$e]", + "[$ie]", + "[de]", + "[Colors:View]", + "[Colors:Window]", + "[Colors:Header]", + "[Inactive]", + "[General]", + "[KDE]", + "[ColorEffects:Inactive]", + "Key", + "BackgroundNormal", + "BackgroundAlternate", + "AccentColor", + "Name", + "contrast", + "TitlebarIsAccentColored", + "ColorEffect", + "Color", + "Enable", + "true", + "2", + "=", + "\\", + "\\s", + "\\x4", + "\\xzz", + "\\q", + "$", + "${HOME}", + "$(echo)", + "#", + " ", + "\r", + "\t", + "61,174,233", + "#3daee9", + "\u{FEFF}", + "é", + ]); + let line = prop::collection::vec(fragment, 0..6).prop_map(|parts| parts.concat()); + prop::collection::vec(line, 0..40).prop_map(|lines| lines.join("\n")) +} + +// ── 1. parsing arbitrary bytes never panics, every diagnostic is on a line +// the input has, and the error limit is respected ── +proptest! { + // 1024 cases: cheap per case, and a panic-freedom sweep over input a + // user or package controls is worth the extra depth. + #![proptest_config(ProptestConfig { cases: 1024, ..ProptestConfig::default() })] + #[test] + fn parse_never_panics_on_arbitrary_bytes(bytes in arb_config_bytes()) { + let (_, diagnostics) = KConfig::parse_bytes(&bytes); + let lines = bytes.split(|&b| b == b'\n').count(); + for d in &diagnostics { + prop_assert!(d.line >= 1 && d.line <= lines, "diagnostic {d:?} outside 1..={lines} for {bytes:?}"); + } + prop_assert!(diagnostics.len() <= 101 + lines, "{} diagnostics for {} lines", diagnostics.len(), lines); + } +} + +// ── 2. parsing, cascading and reading a scheme, fonts and colours from +// grammar-shaped text never panics ── +proptest! { + #![proptest_config(ProptestConfig { cases: 1024, ..ProptestConfig::default() })] + #[test] + fn every_reader_survives_grammar_shaped_text(a in arb_config_text(), b in arb_config_text()) { + let (low, _) = KConfig::parse(&a); + let (high, _) = KConfig::parse(&b); + let merged = KConfig::cascade(&[low, high.with_kind(teksilo_kde_scheme::LayerKind::User)]); + let scheme = KdeColorScheme::from_config(&merged); + let text = scheme.to_kconfig_text(); + let (again, diagnostics) = KdeColorScheme::parse(&text); + prop_assert!(diagnostics.is_empty(), "written text has diagnostics {diagnostics:?}:\n{text}"); + prop_assert_eq!(&again, &scheme, "round trip changed the scheme read from {:?} over {:?}", a, b); + for line in a.lines().chain(b.lines()) { + let _ = KdeColor::parse(line); + let _ = KdeFont::parse_qfont(line); + } + } +} + +/// An integer field of a font string: mostly the ends of the `i32` range +/// and their neighbours, where arithmetic on a field overflows, plus the +/// small values Qt writes and an arbitrary `i32`. +fn arb_font_int() -> impl Strategy { + prop_oneof![ + 2 => prop::sample::select(vec![ + i32::MIN, + i32::MIN + 1, + i32::MIN / 2, + -1, + 0, + 1, + 50, + 400, + 1000, + i32::MAX / 2, + i32::MAX - 1, + i32::MAX, + ]) + .prop_map(|v| v.to_string()), + 1 => any::().prop_map(|v| v.to_string()), + 1 => prop::sample::select(vec![ + "2147483648".to_owned(), + "-2147483649".to_owned(), + "99999999999999999999".to_owned(), + String::new(), + "x".to_owned(), + ]), + ] +} + +/// A floating-point field of a font string: the extremes of `f64`, values +/// that do not parse as finite, and ordinary sizes. +fn arb_font_float() -> impl Strategy { + prop_oneof![ + 2 => prop::sample::select(vec![ + "10", "9.5", "-1", "0", "1e308", "-1e308", "1e309", "inf", "NaN", "", + ]) + .prop_map(str::to_owned), + 1 => any::().prop_map(|v| v.to_string()), + ] +} + +// ── 3. a font string of any accepted length with extreme numeric fields +// parses without panicking, and its weight is on the OpenType scale ── +proptest! { + // 1024 cases: a string of at most 18 short fields, parsed once, costs + // a few microseconds; the extra depth goes into the integer extremes. + #![proptest_config(ProptestConfig { cases: 1024, ..ProptestConfig::default() })] + #[test] + fn font_strings_with_extreme_numbers_never_panic( + count in prop::sample::select(vec![2usize, 10, 11, 16, 17, 18]), + ints in prop::collection::vec(arb_font_int(), 18), + floats in prop::collection::vec(arb_font_float(), 18), + ) { + let mut fields = vec!["Noto Sans".to_owned()]; + for index in 1..count { + let float_field = matches!(index, 1 | 12 | 13); + fields.push(if float_field { floats[index].clone() } else { ints[index].clone() }); + } + let text = fields.join(","); + if let Some(font) = KdeFont::parse_qfont(&text) { + prop_assert!((1..=1000).contains(&font.weight), "weight {} from {text:?}", font.weight); + let _ = font.size_px(); + } + } +} diff --git a/crates/teksilo-kde-scheme/tests/scheme.rs b/crates/teksilo-kde-scheme/tests/scheme.rs new file mode 100644 index 000000000..b8d8956bf --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/scheme.rs @@ -0,0 +1,340 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The colour-scheme model: compiled defaults, the Header fallback, the +//! `[Inactive]` replacement, the stock Breeze constants and the text round +//! trip. The comparisons against the vendored breeze 6.8.0 files are in +//! `breeze_files.rs`, which is not published with the crate. + +use teksilo_kde_scheme::{ + ColorEffect, ColorRole, ColorSet, ContrastEffect, IntensityEffect, KdeColor, KdeColorScheme, + SetColors, StateEffect, +}; + +fn parse_clean(text: &str) -> KdeColorScheme { + let (scheme, diagnostics) = KdeColorScheme::parse(text); + assert!(diagnostics.is_empty(), "{diagnostics:?}"); + scheme +} + +fn rgb(r: u8, g: u8, b: u8) -> KdeColor { + KdeColor::rgb8(r, g, b) +} + +// ---- The stock schemes ------------------------------------------------- + +#[test] +fn the_stock_schemes_carry_the_values_the_specification_lists() { + let light = KdeColorScheme::breeze_light(); + assert_eq!(light.name.as_deref(), Some("Breeze Light")); + assert_eq!( + light.set(ColorSet::Window).background_normal, + rgb(239, 240, 241) + ); + assert_eq!( + light.set(ColorSet::Selection).background_normal, + rgb(61, 174, 233) + ); + assert_eq!( + light.set(ColorSet::View).decoration_hover, + rgb(61, 174, 233) + ); + assert_eq!( + light + .inactive_set(ColorSet::Header) + .unwrap() + .background_normal, + rgb(239, 240, 241) + ); + assert_eq!(light.contrast, 4); + assert_eq!(light.frame_contrast, 0.2); + assert_eq!(light.disabled_effect, StateEffect::DISABLED_DEFAULT); + assert!(!light.inactive_effect.enabled); + assert_eq!(light.inactive_effect.color_effect, ColorEffect::Fade); + assert_eq!(light.inactive_effect.color_amount, 0.025); + assert!(light.change_selection_color); + assert_eq!(light.wm.active_background, Some(rgb(227, 229, 231))); + + let dark = KdeColorScheme::breeze_dark(); + assert_eq!( + dark.set(ColorSet::Window).background_normal, + rgb(32, 35, 38) + ); + assert_eq!(dark.set(ColorSet::View).background_normal, rgb(20, 22, 24)); + assert_eq!(dark.wm.inactive_background, Some(rgb(32, 36, 40))); + + let classic = KdeColorScheme::breeze_classic(); + assert!(!classic.header_group_present); + assert_eq!(classic.set(ColorSet::Header), classic.set(ColorSet::Window)); + assert!(classic.titlebar_is_accent_colored); + assert_eq!( + classic.set(ColorSet::Complementary).decoration_focus, + rgb(30, 146, 255) + ); +} + +#[test] +fn the_stock_schemes_and_the_defaults_round_trip_through_text() { + for scheme in [ + KdeColorScheme::breeze_light(), + KdeColorScheme::breeze_dark(), + KdeColorScheme::breeze_classic(), + KdeColorScheme::kcolorscheme_defaults(), + ] { + let text = scheme.to_kconfig_text(); + assert_eq!(parse_clean(&text), scheme, "round trip of:\n{text}"); + } +} + +#[test] +fn a_stock_scheme_is_written_like_the_file_it_came_from() { + let text = KdeColorScheme::breeze_dark().to_kconfig_text(); + assert!( + text.starts_with("[ColorEffects:Disabled]\nColor=56,56,56\n"), + "{text}" + ); + assert!(text.contains("\n[Colors:Header][Inactive]\nBackgroundAlternate=41,44,48\n")); + assert!(text.contains("\n[KDE]\ncontrast=4\n")); + assert!(!text.contains("frameContrast")); + assert!(text.ends_with("inactiveForeground=161,169,177\n")); +} + +// ---- Defaults ---------------------------------------------------------- + +#[test] +fn an_empty_configuration_gives_the_compiled_defaults() { + let scheme = parse_clean(""); + assert_eq!(scheme, KdeColorScheme::kcolorscheme_defaults()); + assert_eq!(scheme, KdeColorScheme::default()); + // The defaults equal Breeze Light except for the hover decoration. + let light = KdeColorScheme::breeze_light(); + for set in ColorSet::ALL { + let mut expected = *light.set(set); + expected.decoration_hover = rgb(147, 206, 233); + assert_eq!(*scheme.set(set), expected, "{set:?}"); + } + assert_eq!(scheme.contrast, 7); + assert_eq!(scheme.frame_contrast, 0.2); + assert_eq!(scheme.disabled_effect, StateEffect::DISABLED_DEFAULT); + assert_eq!(scheme.inactive_effect, StateEffect::INACTIVE_DEFAULT); + // No [ColorEffects:Inactive] at all: effects off, selection change on. + assert!(scheme.change_selection_color); + assert_eq!(scheme.wm, Default::default()); + assert_eq!(scheme.accent, None); + assert_eq!(scheme.tint_factor, None); + assert!(!scheme.titlebar_is_accent_colored); + assert!(scheme.inactive_sets.iter().all(Option::is_none)); +} + +#[test] +fn absent_and_unreadable_keys_take_the_default_of_their_own_set() { + let scheme = parse_clean( + "[Colors:Button]\nBackgroundNormal=1,2,3\nForegroundNormal=invalid\nForegroundLink=\nForegroundActive=300,0,0\n", + ); + let button = scheme.set(ColorSet::Button); + assert_eq!(button.background_normal, rgb(1, 2, 3)); + assert_eq!(button.background_alternate, rgb(163, 212, 250)); + assert_eq!(button.foreground_normal, rgb(35, 38, 41)); + assert_eq!(button.foreground_link, rgb(41, 128, 185)); + assert_eq!(button.foreground_active, rgb(61, 174, 233)); +} + +#[test] +fn contrast_defaults_to_seven_and_is_not_clamped() { + assert_eq!(parse_clean("[KDE]\ncontrast=abc\n").contrast, 7); + assert_eq!(parse_clean("[KDE]\ncontrast=15\n").contrast, 15); + assert_eq!(parse_clean("[KDE]\ncontrast=-3\n").contrast, -3); +} + +#[test] +fn frame_contrast_defaults_to_one_fifth_and_is_clamped_to_the_unit_interval() { + assert_eq!( + parse_clean("[KDE]\nframeContrast=junk\n").frame_contrast, + 0.2 + ); + assert_eq!( + parse_clean("[KDE]\nframeContrast=0.35\n").frame_contrast, + 0.35 + ); + assert_eq!(parse_clean("[KDE]\nframeContrast=4\n").frame_contrast, 1.0); + assert_eq!(parse_clean("[KDE]\nframeContrast=-1\n").frame_contrast, 0.0); +} + +// ---- Header ----------------------------------------------------------- + +#[test] +fn without_a_header_group_the_header_set_is_the_window_group_key_by_key() { + let scheme = + parse_clean("[Colors:Window]\nBackgroundNormal=10,10,10\nForegroundNormal=20,20,20\n"); + assert!(!scheme.header_group_present); + let header = scheme.set(ColorSet::Header); + assert_eq!(header.background_normal, rgb(10, 10, 10)); + assert_eq!(header.foreground_normal, rgb(20, 20, 20)); + // Window lacks BackgroundAlternate, so the Header table applies, not + // the Window table. + assert_eq!(header.background_alternate, rgb(239, 240, 241)); + assert_eq!( + scheme.set(ColorSet::Window).background_alternate, + rgb(227, 229, 231) + ); +} + +#[test] +fn a_partial_header_group_takes_its_other_keys_from_window() { + let scheme = parse_clean( + "[Colors:Window]\nBackgroundNormal=10,10,10\nDecorationHover=5,5,5\n[Colors:Header]\nForegroundNormal=1,1,1\n", + ); + assert!(scheme.header_group_present); + let header = scheme.set(ColorSet::Header); + assert_eq!(header.foreground_normal, rgb(1, 1, 1)); + assert_eq!(header.background_normal, rgb(10, 10, 10)); + assert_eq!(header.decoration_hover, rgb(5, 5, 5)); + assert_eq!(header.decoration_focus, rgb(61, 174, 233)); + assert_eq!(header.background_alternate, rgb(239, 240, 241)); +} + +#[test] +fn a_header_without_its_own_group_keeps_its_table_fallback_through_text() { + let scheme = parse_clean("[Colors:Window]\nBackgroundNormal=10,10,10\n"); + let text = scheme.to_kconfig_text(); + assert!(!text.contains("[Colors:Header]"), "{text}"); + assert_eq!(parse_clean(&text), scheme, "{text}"); +} + +// ---- [Inactive] -------------------------------------------------------- + +#[test] +fn an_inactive_subgroup_replaces_its_set_and_falls_back_to_the_defaults_not_the_parent() { + let scheme = parse_clean( + "[Colors:View]\nBackgroundNormal=1,1,1\nForegroundNormal=2,2,2\n[Colors:View][Inactive]\nBackgroundNormal=9,9,9\n", + ); + let inactive = scheme.inactive_set(ColorSet::View).unwrap(); + assert_eq!(inactive.background_normal, rgb(9, 9, 9)); + // Not the parent's 2,2,2: the View table. + assert_eq!(inactive.foreground_normal, rgb(35, 38, 41)); + assert_eq!(scheme.set(ColorSet::View).foreground_normal, rgb(2, 2, 2)); + assert_eq!(scheme.inactive_set(ColorSet::Window), None); +} + +#[test] +fn a_header_inactive_subgroup_falls_back_to_window_then_the_header_table() { + let scheme = parse_clean( + "[Colors:Window]\nForegroundNormal=3,3,3\n[Colors:Header][Inactive]\nBackgroundNormal=9,9,9\n", + ); + // A nested group alone makes the Header group exist. + assert!(scheme.header_group_present); + let inactive = scheme.inactive_set(ColorSet::Header).unwrap(); + assert_eq!(inactive.background_normal, rgb(9, 9, 9)); + assert_eq!(inactive.foreground_normal, rgb(3, 3, 3)); + assert_eq!(inactive.background_alternate, rgb(239, 240, 241)); +} + +#[test] +fn an_inactive_subgroup_with_only_deleted_keys_does_not_exist() { + let scheme = parse_clean("[Colors:View][Inactive]\nBackgroundNormal[$d]\n"); + assert_eq!(scheme.inactive_set(ColorSet::View), None); +} + +#[test] +fn schemes_with_inactive_subgroups_round_trip() { + let scheme = parse_clean( + "[Colors:Selection][Inactive]\nBackgroundNormal=1,2,3,128\n[Colors:Window][Inactive]\nForegroundNormal=#102030\n", + ); + let text = scheme.to_kconfig_text(); + assert_eq!(parse_clean(&text), scheme, "{text}"); +} + +// ---- Effects ------------------------------------------------------------ + +#[test] +fn effects_read_every_key_and_unknown_codes_mean_none() { + let scheme = parse_clean( + "[ColorEffects:Disabled]\nEnable=false\nIntensityEffect=3\nIntensityAmount=0.5\nColorEffect=3\n\ + ColorAmount=0.4\nColor=10,20,30\nContrastEffect=9\nContrastAmount=0.3\n", + ); + assert_eq!( + scheme.disabled_effect, + StateEffect { + enabled: false, + intensity_effect: IntensityEffect::Lighten, + intensity_amount: 0.5, + color_effect: ColorEffect::Tint, + color_amount: 0.4, + color: rgb(10, 20, 30), + contrast_effect: ContrastEffect::None, + contrast_amount: 0.3, + } + ); +} + +#[test] +fn the_effect_colour_is_read_only_when_a_colour_effect_is_set() { + let none = parse_clean("[ColorEffects:Disabled]\nColorEffect=0\nColor=1,2,3\n"); + assert_eq!(none.disabled_effect.color, rgb(56, 56, 56)); + let unknown = parse_clean("[ColorEffects:Inactive]\nColorEffect=7\nColor=1,2,3\n"); + assert_eq!(unknown.inactive_effect.color_effect, ColorEffect::None); + assert_eq!(unknown.inactive_effect.color, rgb(112, 111, 110)); +} + +#[test] +fn change_selection_color_defaults_to_the_inactive_enable_flag() { + assert!(!parse_clean("[ColorEffects:Inactive]\nEnable=false\n").change_selection_color); + assert!(parse_clean("[ColorEffects:Inactive]\nEnable=true\n").change_selection_color); + assert!( + parse_clean("[ColorEffects:Inactive]\nEnable=false\nChangeSelectionColor=true\n") + .change_selection_color + ); + // An empty value is present and reads as true. + assert!( + parse_clean("[ColorEffects:Inactive]\nEnable=\n") + .inactive_effect + .enabled + ); +} + +// ---- [General] and [WM] ------------------------------------------------- + +#[test] +fn general_keys_follow_their_fallbacks() { + let scheme = + parse_clean("[General]\nTintFactor=oops\naccentActiveTitlebar=true\nAccentColor=#3daee9\n"); + assert_eq!(scheme.tint_factor, Some(0.15)); + assert!(scheme.titlebar_is_accent_colored); + assert_eq!(scheme.accent, Some(rgb(61, 174, 233))); + + let newer = parse_clean( + "[General]\nTitlebarIsAccentColored=false\naccentActiveTitlebar=true\nTintFactor=0.3\n", + ); + assert!(!newer.titlebar_is_accent_colored); + assert_eq!(newer.tint_factor, Some(0.3)); +} + +#[test] +fn every_written_field_round_trips() { + let mut scheme = KdeColorScheme::breeze_dark(); + scheme.name = Some(" Odd \\ name\twith=signs ".to_owned()); + scheme.accent = Some(KdeColor::rgba8(1, 2, 3, 4)); + scheme.tint_factor = Some(0.125); + scheme.titlebar_is_accent_colored = true; + scheme.frame_contrast = 0.75; + scheme.contrast = 7; + scheme.wm.active_blend = None; + scheme.change_selection_color = false; + let mut set = SetColors::from_rgb8([[7, 7, 7]; 12]); + set.set(ColorRole::DecorationHover, KdeColor::rgba8(9, 9, 9, 0)); + scheme.inactive_sets[ColorSet::Tooltip.index()] = Some(set); + let text = scheme.to_kconfig_text(); + assert_eq!(parse_clean(&text), scheme, "{text}"); +} + +// ---- Source --------------------------------------------------------------- + +#[test] +fn a_parsed_scheme_keeps_a_value_as_written_even_when_it_reads_it_clamped() { + let raw = parse_clean("[KDE]\nframeContrast=4\n"); + assert_eq!(raw.frame_contrast, 1.0); + assert_eq!( + raw.source().unwrap().get(&["KDE"], "frameContrast"), + Some("4") + ); +} diff --git a/crates/teksilo-kde-scheme/tests/values.rs b/crates/teksilo-kde-scheme/tests/values.rs new file mode 100644 index 000000000..97409dace --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/values.rs @@ -0,0 +1,215 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Colour values and Qt font descriptions. + +use teksilo_kde_scheme::{FontStyle, KdeColor, KdeFont}; +use teksilo_tokens::Color; + +// ---- Colours ------------------------------------------------------------- + +#[test] +fn comma_forms_give_eight_bit_channels_with_optional_alpha_signs_and_spaces() { + assert_eq!( + KdeColor::parse("61,174,233"), + Some(KdeColor::rgb8(61, 174, 233)) + ); + assert_eq!( + KdeColor::parse(" 61 , 174 ,233 "), + Some(KdeColor::rgb8(61, 174, 233)) + ); + assert_eq!( + KdeColor::parse("+1,-0,2,128"), + Some(KdeColor::rgba8(1, 0, 2, 128)) + ); + assert_eq!(KdeColor::parse("1,2,3").unwrap().a, u16::MAX); +} + +#[test] +fn malformed_comma_forms_are_absent() { + for text in [ + "1,2", + "1,2,3,4,5", + "256,0,0", + "-1,0,0", + "1.5,2,3", + "a,b,c", + "1,,3", + "1,2,3,", + ] { + assert_eq!(KdeColor::parse(text), None, "{text}"); + } +} + +#[test] +fn hex_forms_follow_the_documented_widths() { + assert_eq!( + KdeColor::parse("#3daee9"), + Some(KdeColor::rgb8(61, 174, 233)) + ); + assert_eq!( + KdeColor::parse("#3DAEE9"), + Some(KdeColor::rgb8(61, 174, 233)) + ); + assert_eq!(KdeColor::parse("#fa0"), Some(KdeColor::rgb8(255, 170, 0))); + assert_eq!( + KdeColor::parse("#803daee9"), + Some(KdeColor::rgba8(61, 174, 233, 128)) + ); + // 12-bit channels: v becomes 16 v + floor(v / 256). + assert_eq!( + KdeColor::parse("#fff800000"), + Some(KdeColor::rgba16(65535, 32776, 0, u16::MAX)) + ); + assert_eq!( + KdeColor::parse("#123456789abc"), + Some(KdeColor::rgba16(0x1234, 0x5678, 0x9abc, u16::MAX)) + ); + for text in ["#", "#12", "#12345", "#1234567", "#12345g", "# 3daee9"] { + assert_eq!(KdeColor::parse(text), None, "{text}"); + } +} + +#[test] +fn svg_names_and_transparent_are_recognised_ignoring_case() { + assert_eq!(KdeColor::parse("red"), Some(KdeColor::rgb8(255, 0, 0))); + assert_eq!( + KdeColor::parse("CornflowerBlue"), + Some(KdeColor::rgb8(100, 149, 237)) + ); + assert_eq!(KdeColor::parse("grey"), KdeColor::parse("gray")); + assert_eq!(KdeColor::parse("Transparent"), Some(KdeColor::TRANSPARENT)); + assert!(KdeColor::TRANSPARENT.is_transparent_black()); + // CSS-only, not SVG 1.1. + assert_eq!(KdeColor::parse("rebeccapurple"), None); + assert_eq!(KdeColor::parse("notacolour"), None); +} + +#[test] +fn empty_and_invalid_values_are_absent() { + assert_eq!(KdeColor::parse(""), None); + assert_eq!(KdeColor::parse("invalid"), None); +} + +#[test] +fn colours_are_written_as_kde_writes_them() { + assert_eq!(KdeColor::rgb8(61, 174, 233).to_kconfig_text(), "61,174,233"); + assert_eq!( + KdeColor::rgba8(61, 174, 233, 178).to_string(), + "61,174,233,178" + ); + assert_eq!( + KdeColor::rgba16(7067, 0, 65535, 65535).to_kconfig_text(), + "27,0,255" + ); +} + +#[test] +fn colours_cross_the_boundary_to_teksilo_colors_channel_by_channel() { + let c = KdeColor::rgba8(255, 0, 51, 255).to_color(); + assert_eq!(c, Color::new(1.0, 0.0, 0.2, 1.0)); + let back = KdeColor::from_color(c); + assert_eq!(back, KdeColor::rgba8(255, 0, 51, 255)); + assert_eq!( + KdeColor::from_color(Color::new(f32::NAN, 2.0, -1.0, 0.5)).to_rgba8(), + [0, 255, 0, 128] + ); + let converted: Color = KdeColor::WHITE.into(); + assert_eq!(converted, Color::new(1.0, 1.0, 1.0, 1.0)); +} + +// ---- Fonts -------------------------------------------------------------- + +#[test] +fn a_plasma_six_font_string_reads_the_opentype_weight() { + let font = KdeFont::parse_qfont("Noto Sans,10,-1,5,400,0,0,0,0,0,0,0,0,0,0,1").unwrap(); + assert_eq!(font.family, "Noto Sans"); + assert_eq!(font.point_size, Some(10.0)); + assert_eq!(font.pixel_size, None); + assert_eq!(font.style_hint, 5); + assert_eq!(font.weight, 400); + assert_eq!(font.style, FontStyle::Normal); + assert_eq!(font.style_strategy, 1); + assert_eq!(font.style_name, None); + assert_eq!(font.size_px(), Some(10.0 * 96.0 / 72.0)); +} + +#[test] +fn a_qt_six_string_with_a_style_name_and_spacing() { + let font = + KdeFont::parse_qfont("Hack,9.5,-1,7,700,1,1,1,1,0,2,1,1.5,2.5,100,1,Bold Italic").unwrap(); + assert_eq!(font.weight, 700); + assert_eq!(font.style, FontStyle::Italic); + assert!(font.underline && font.strike_out && font.fixed_pitch); + assert_eq!(font.capitalization, 2); + assert_eq!(font.letter_spacing_type, 1); + assert_eq!(font.letter_spacing, 1.5); + assert_eq!(font.word_spacing, 2.5); + assert_eq!(font.stretch, 100); + assert_eq!(font.style_name.as_deref(), Some("Bold Italic")); +} + +#[test] +fn a_newer_qt_string_is_cut_to_its_first_seventeen_fields() { + let font = KdeFont::parse_qfont( + "Noto Sans,10,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,Regular,feature=1,axis=2", + ) + .unwrap(); + assert_eq!(font.style_name.as_deref(), Some("Regular")); +} + +#[test] +fn a_plasma_five_font_string_maps_the_legacy_weight() { + let font = KdeFont::parse_qfont("Noto Sans,10,-1,5,50,0,0,0,0,0").unwrap(); + assert_eq!(font.weight, 400); + let bold = KdeFont::parse_qfont("Noto Sans,10,-1,5,75,2,0,0,0,0,Bold Oblique").unwrap(); + assert_eq!(bold.weight, 700); + assert_eq!(bold.style, FontStyle::Oblique); + assert_eq!(bold.style_name.as_deref(), Some("Bold Oblique")); + assert_eq!( + KdeFont::parse_qfont("X,10,-1,5,60,0,0,0,0,0") + .unwrap() + .weight, + 500 + ); + assert_eq!( + KdeFont::parse_qfont("X,10,-1,5,70,0,0,0,0,0") + .unwrap() + .weight, + 700 + ); +} + +#[test] +fn extreme_weights_in_a_font_string_are_read_without_overflow() { + let weight = |text: &str| KdeFont::parse_qfont(text).unwrap().weight; + assert_eq!(weight("A,10,-1,5,-2147483648,0,0,0,0,0"), 100); + assert_eq!(weight("A,10,-1,5,2147483647,0,0,0,0,0"), 900); + assert_eq!(weight("A,10,-1,5,-2147483648,0,0,0,0,0,0,0,0,0,0,1"), 1); + assert_eq!(weight("A,10,-1,5,2147483647,0,0,0,0,0,0,0,0,0,0,1"), 1000); +} + +#[test] +fn a_two_field_string_and_a_pixel_size() { + let short = KdeFont::parse_qfont("Hack,11").unwrap(); + assert_eq!(short.point_size, Some(11.0)); + assert_eq!(short.weight, 400); + let pixels = KdeFont::parse_qfont("Noto Sans,-1,14,5,400,0,0,0,0,0,0,0,0,0,0,1").unwrap(); + assert_eq!(pixels.point_size, None); + assert_eq!(pixels.pixel_size, Some(14)); + assert_eq!(pixels.size_px(), Some(14.0)); +} + +#[test] +fn other_field_counts_and_unparseable_fields_are_rejected() { + for text in [ + "", + "Noto Sans", + "Noto Sans,10,-1", + "Noto Sans,10,-1,5,400,0,0,0,0,0,0,0", + "Noto Sans,ten", + "Noto Sans,10,-1,5,heavy,0,0,0,0,0", + ] { + assert_eq!(KdeFont::parse_qfont(text), None, "{text}"); + } +} diff --git a/engineering/docs/property-testing.md b/engineering/docs/property-testing.md index f62330bcb..c14449c9f 100644 --- a/engineering/docs/property-testing.md +++ b/engineering/docs/property-testing.md @@ -411,6 +411,7 @@ being wrong. |---|---| | `teksilo-core` | [`tests/pointer_invariants.rs`](../../crates/teksilo-core/tests/pointer_invariants.rs), [`tests/prop_kinetic.rs`](../../crates/teksilo-core/tests/prop_kinetic.rs), [`tests/text_run_invariants.rs`](../../crates/teksilo-core/tests/text_run_invariants.rs) | | `teksilo-tokens` | [`tests/prop_color.rs`](../../crates/teksilo-tokens/tests/prop_color.rs) | +| `teksilo-kde-scheme` | [`tests/prop_config.rs`](../../crates/teksilo-kde-scheme/tests/prop_config.rs) | | `teksilo-data` | [`tests/prop_list_and_selection.rs`](../../crates/teksilo-data/tests/prop_list_and_selection.rs), [`tests/prop_tree_slice.rs`](../../crates/teksilo-data/tests/prop_tree_slice.rs), [`tests/prop_tree_checked.rs`](../../crates/teksilo-data/tests/prop_tree_checked.rs), [`tests/prop_sort_filter.rs`](../../crates/teksilo-data/tests/prop_sort_filter.rs) | | `teksilo-scene` | [`src/index.rs`](../../crates/teksilo-scene/src/index.rs) (`mod proptests`, inline), [`tests/prop_selection_modes.rs`](../../crates/teksilo-scene/tests/prop_selection_modes.rs) | | `teksilo-widgets` | [`src/common/row_offsets.rs`](../../crates/teksilo-widgets/src/common/row_offsets.rs), [`src/common/row_metrics.rs`](../../crates/teksilo-widgets/src/common/row_metrics.rs), [`src/primitives/column_flow.rs`](../../crates/teksilo-widgets/src/primitives/column_flow.rs), [`src/common/column_geometry.rs`](../../crates/teksilo-widgets/src/common/column_geometry.rs), [`src/splitter/distribute.rs`](../../crates/teksilo-widgets/src/splitter/distribute.rs) (all `mod proptests`, inline) | From 091a5a10b860bfc8aad96d08ee8f45e60579c666 Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 11:13:59 +0200 Subject: [PATCH 13/59] feat(kde-scheme): add KDE's colour arithmetic and the clean-room guard New module math, implemented from section d (and the a.3 conventions) of engineering/docs/kde-breeze-spec.md, in f64 with the specified single-precision steps and 16-bit storage: the HCY space (gamma 2.2, Rec. 709 weights) with an unwrapped forward hue and a wrapping inverse, luma and KDE's luma contrast ratio (kept apart from WCAG's), the premultiplied mix, lighten, darken and shade, the luma-preserving tint with its twelve bisection steps, the five shade roles, Qt's HSV lighter and darker on 16-bit integers, the 8-bit alpha blend with its truncation and translucent-background alpha, black or white text on a background, an accent laid over a background, and the OKLab tint with Qt's single-precision sRGB curve, its near-identity matrix and the half-precision storage of out-of-gamut results (FloatColor). lift_luma_until is Teksilo's own helper, not KDE's: it keeps a colour's HCY hue, chroma and alpha and steps its luma toward black or white until the WCAG contrast from teksilo_tokens::contrast reaches a floor on every backdrop, returning the first passing step or the best one reachable. Tests: every record of tools/kde_golden/vectors/math.json except overlay (a painter composition the specification does not describe), reals within 1e-6 and colours equal in all 16-bit channels and the hex; the OKLab tint against every tinted colour of the KdeGoldenTintLight accent cases; the specification's worked examples and the ten swatch selections; unit tests for the lift; and two proptests (the HCY round trip on every 8-bit colour, and the lift never lowering the worst contrast). Where d.10 fixes the chroma amount at 0, shade_role takes it as a parameter applied to every shade, which math.json's scheme_shade records with chroma 0.5 confirm. tests/clean_room_vocabulary.rs fails, naming file and line, on upstream identifiers in an extensible list of scanned directories, skipping the fixtures, its own word list and comment lines citing doc.qt.io. It also fails when a scanned directory holds no file, when math.rs or the test itself is not among the files read, or when a file cannot be read. It and golden_math.rs read files outside the crate and are excluded from the package. .claude/CLAUDE.review.md gains the matching checklist item. Signed-off-by: Cyril Jacquet --- .claude/CLAUDE.review.md | 5 + CHANGELOG.md | 7 + Cargo.lock | 1 + crates/teksilo-kde-scheme/Cargo.toml | 13 +- crates/teksilo-kde-scheme/src/lib.rs | 6 +- crates/teksilo-kde-scheme/src/math.rs | 1023 +++++++++++++++++ .../tests/clean_room_vocabulary.rs | 199 ++++ .../teksilo-kde-scheme/tests/golden_math.rs | 399 +++++++ crates/teksilo-kde-scheme/tests/math.rs | 268 +++++ crates/teksilo-kde-scheme/tests/prop_math.rs | 81 ++ engineering/docs/property-testing.md | 2 +- 11 files changed, 2000 insertions(+), 4 deletions(-) create mode 100644 crates/teksilo-kde-scheme/src/math.rs create mode 100644 crates/teksilo-kde-scheme/tests/clean_room_vocabulary.rs create mode 100644 crates/teksilo-kde-scheme/tests/golden_math.rs create mode 100644 crates/teksilo-kde-scheme/tests/math.rs create mode 100644 crates/teksilo-kde-scheme/tests/prop_math.rs diff --git a/.claude/CLAUDE.review.md b/.claude/CLAUDE.review.md index ecf83b030..a40d6942b 100644 --- a/.claude/CLAUDE.review.md +++ b/.claude/CLAUDE.review.md @@ -86,6 +86,11 @@ These are the explicit rules the codebase is meant to follow. Flag deviations. - **Error types:** `thiserror` (`#[derive(thiserror::Error)]` with `#[error("...")]` per variant; `#[from]` for transparent conversions, `#[source]` for nested chains). Do not hand-roll `Display` / `std::error::Error` / `From`. +- **Clean-room KDE code:** `teksilo-kde-scheme` is written from + `engineering/docs/kde-breeze-spec.md` only, never from KDE or Qt source. + `crates/teksilo-kde-scheme/tests/clean_room_vocabulary.rs` fails on upstream identifiers in + the scanned directories; flag a new KDE crate missing from its `SCANNED` list, a word removed + from its list, and code whose structure mirrors upstream rather than the specification. --- diff --git a/CHANGELOG.md b/CHANGELOG.md index 395503063..2aa8a2729 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -103,6 +103,13 @@ by crate for clarity, not because crates version independently. schemes. `KdeFont` reads Qt 5 and Qt 6 font strings, and `KdeDesktop` gathers the scheme, the user's accent, the five desktop fonts, the animation speed, the widget style and the Breeze style settings. + `teksilo_kde_scheme::math` is KDE's colour arithmetic, giving the same + 8-bit values KDE writes: the HCY colour space, luma and KDE's luma + contrast, mix, tint, lighten, darken and shade, the five 3D shades of a + palette, Qt's `lighter` and `darker`, the selection fill and black or + white text KDE derives from an accent, and Plasma's OKLab accent tint. + `lift_luma_until` moves a colour's luma, keeping its hue, until it meets a + WCAG contrast floor on the given backgrounds. ### Changed diff --git a/Cargo.lock b/Cargo.lock index c404776bf..cdbe1a19d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11989,6 +11989,7 @@ name = "teksilo-kde-scheme" version = "0.19.0" dependencies = [ "proptest", + "serde_json", "teksilo-tokens", "thiserror 2.0.21", ] diff --git a/crates/teksilo-kde-scheme/Cargo.toml b/crates/teksilo-kde-scheme/Cargo.toml index aebb04888..cc4cc6d85 100644 --- a/crates/teksilo-kde-scheme/Cargo.toml +++ b/crates/teksilo-kde-scheme/Cargo.toml @@ -18,8 +18,15 @@ categories = ["gui", "config", "parser-implementations"] # vendored verbatim so the tests can compare against them. They are not part # of the published crate, and neither is `tests/breeze_files.rs`, the one # test target that reads them: left in, it would not compile from the -# package and `cargo test` there would fail. -exclude = ["tests/fixtures/**", "tests/breeze_files.rs"] +# package and `cargo test` there would fail. The same holds for the tests +# that read the golden vectors under `tools/kde_golden` and the clean-room +# vocabulary scan, which reads the repository's source tree. +exclude = [ + "tests/fixtures/**", + "tests/breeze_files.rs", + "tests/golden_math.rs", + "tests/clean_room_vocabulary.rs", +] [dependencies] teksilo-tokens = { workspace = true } @@ -31,3 +38,5 @@ thiserror = { workspace = true } # not a guaranteed CI dependency; proptest gives the same coverage plus # shrinking on stable (see the workspace `Cargo.toml`). proptest = { workspace = true } +# Reads the golden vectors in `tools/kde_golden/vectors`. +serde_json = { workspace = true } diff --git a/crates/teksilo-kde-scheme/src/lib.rs b/crates/teksilo-kde-scheme/src/lib.rs index 259005c40..0d448b1b6 100644 --- a/crates/teksilo-kde-scheme/src/lib.rs +++ b/crates/teksilo-kde-scheme/src/lib.rs @@ -8,7 +8,9 @@ //! ([`config`]), where those files live ([`locations`]), the colour values //! they store ([`color`]), the colour-scheme model of a `.colors` file or of //! `kdeglobals` ([`scheme`]), Qt's font descriptions ([`fonts`]) and the -//! desktop settings built from all of them ([`desktop`]). +//! desktop settings built from all of them ([`desktop`]). [`math`] holds +//! the colour arithmetic KDE derives its palettes with, reproduced to the +//! byte KDE writes. //! //! It does no I/O. The environment is passed in as a getter and files are //! passed in as text, so everything here runs the same in a test as on a @@ -48,6 +50,7 @@ pub mod config; pub mod desktop; pub mod fonts; pub mod locations; +pub mod math; pub mod scheme; pub use color::KdeColor; @@ -58,6 +61,7 @@ pub use desktop::{ }; pub use fonts::{FontStyle, KdeFont}; pub use locations::{ConfigLayerPath, KdeConfigLocations, is_kde_session}; +pub use math::{FloatColor, Hcy, ShadeRole}; pub use scheme::{ ColorEffect, ColorRole, ColorSet, ColorState, ContrastEffect, IntensityEffect, KdeColorScheme, SetColors, StateEffect, WmColors, diff --git a/crates/teksilo-kde-scheme/src/math.rs b/crates/teksilo-kde-scheme/src/math.rs new file mode 100644 index 000000000..e0b692e55 --- /dev/null +++ b/crates/teksilo-kde-scheme/src/math.rs @@ -0,0 +1,1023 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The colour arithmetic KDE Plasma derives its palettes with. +//! +//! Every operation takes and returns [`KdeColor`]s, four 16-bit channels, +//! and follows the precision rules of section a.3 of Teksilo's +//! specification (`engineering/docs/kde-breeze-spec.md`) so that a result +//! reduced to 8 bits is the byte KDE itself writes: +//! +//! - a channel `q` is read as the single-precision quotient `q / 65535`, +//! then widened to `f64` ([`read_channel`]); +//! - a real result `v` is stored by rounding it to single precision, +//! forming the single-precision product `v x 65535`, and rounding that +//! half up ([`store_channel`]); +//! - everything in between is `f64`, evaluated in the order the +//! specification writes it, except where a step says single precision. +//! +//! The operations, in the specification's order (section d): +//! +//! | Operation | Function | +//! |---|---| +//! | HCY colour space (gamma 2.2, Rec. 709 weights) | [`Hcy::from_color`], [`Hcy::to_color`] | +//! | luma, and the luma contrast ratio | [`luma`], [`luma_ratio`], [`color_luma_ratio`] | +//! | lighten, darken, shade in HCY | [`lighten`], [`darken`], [`shade`] | +//! | premultiplied mix | [`mix`] | +//! | luma-preserving tint | [`tint`] | +//! | the five shade roles of a palette | [`shade_role`] | +//! | Qt's HSV lighter and darker | [`hsv_lighter`], [`hsv_darker`] | +//! | the 8-bit alpha blend | [`blend8`] | +//! | black or white on a background | [`black_or_white_on`] | +//! | an accent laid over a background | [`accent_over`] | +//! | the OKLab tint, and the sRGB curve under it | [`oklab_tint`], [`srgb_to_linear`], [`linear_to_srgb`] | +//! +//! The luma contrast ratio is KDE's own measure, built on a pure 2.2 power; +//! it is **not** WCAG contrast and must never be used to check +//! readability. [`lift_luma_until`] is Teksilo's helper for that: it keeps a +//! colour's HCY hue and chroma and moves its luma until the WCAG 2.x ratio +//! reaches a floor, measured with [`teksilo_tokens::contrast`]. + +use teksilo_tokens::contrast::composite_contrast; + +use crate::color::KdeColor; + +/// The red weight of the luma, ITU-R BT.709. +pub const LUMA_RED: f64 = 0.2126; +/// The green weight of the luma, ITU-R BT.709. +pub const LUMA_GREEN: f64 = 0.7152; +/// The blue weight of the luma, ITU-R BT.709. +pub const LUMA_BLUE: f64 = 0.0722; +/// The gamma exponent the HCY space linearises channels with. +pub const GAMMA: f64 = 2.2; + +// --------------------------------------------------------------------------- +// Channel conventions (section a.3) +// --------------------------------------------------------------------------- + +/// The real value of a stored channel: `q / 65535` in single precision, +/// widened to `f64`. +pub fn read_channel(q: u16) -> f64 { + f64::from(f32::from(q) / 65535.0_f32) +} + +/// Stores a real channel value in `0..=1` as a 16-bit channel. +/// +/// The value is rounded to single precision, multiplied by 65535 in single +/// precision, and the product rounded half up. A value below 0 stores 0 +/// and one above 1 stores 65535; a NaN stores 0. (Every operation of this +/// module clamps before it stores, so the last two cases are only reached +/// through a direct call.) +pub fn store_channel(v: f64) -> u16 { + let product = (v as f32) * 65535.0_f32; + let rounded = (f64::from(product) + 0.5).floor(); + if rounded.is_nan() || rounded <= 0.0 { + 0 + } else if rounded >= 65535.0 { + u16::MAX + } else { + rounded as u16 + } +} + +/// `N(x)` of the specification: `x` inside `(0, 1)`, 0 at or below 0, and 1 +/// at or above 1 **or for a NaN**. +fn unit(x: f64) -> f64 { + if x > 0.0 && x < 1.0 { + x + } else if x <= 0.0 { + 0.0 + } else { + 1.0 + } +} + +/// `L(a, b, t) = a + (b - a) t`, in this form. +fn lerp(a: f64, b: f64, t: f64) -> f64 { + a + (b - a) * t +} + +/// A channel read made linear: `N(x)^2.2`. +fn linearise(x: f64) -> f64 { + unit(x).powf(GAMMA) +} + +/// A linear value back to a channel: `N(x)^(1/2.2)`. +fn delinearise(x: f64) -> f64 { + unit(x).powf(1.0 / GAMMA) +} + +fn reads(c: KdeColor) -> [f64; 4] { + [ + read_channel(c.r), + read_channel(c.g), + read_channel(c.b), + read_channel(c.a), + ] +} + +// --------------------------------------------------------------------------- +// HCY and luma (sections d.2 to d.5) +// --------------------------------------------------------------------------- + +/// A colour in KDE's HCY space: hue, chroma, luma and alpha, each a real +/// number. +/// +/// The luma `y` is the Rec. 709 weighted sum of the gamma-2.2 linear +/// channels ([`luma`]). The hue `h` is in turns; [`Hcy::from_color`] does +/// **not** wrap it, so a colour whose red channel is the largest and whose +/// blue exceeds its green has a hue in `(-1/6, 0)`. [`Hcy::to_color`] +/// wraps any hue, and [`Hcy::wrapped_hue`] gives it in `[0, 1)`. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct Hcy { + /// Hue in turns, possibly negative (see the type documentation). + pub h: f64, + /// Chroma, 0 for a grey and 1 at the edge of the gamut. + pub c: f64, + /// Luma, 0 for black and 1 for white. + pub y: f64, + /// Alpha, the channel read of the colour's alpha. + pub a: f64, +} + +impl Hcy { + /// Converts a stored colour to HCY. + pub fn from_color(color: KdeColor) -> Hcy { + let [rr, gr, br, a] = reads(color); + let r = linearise(rr); + let g = linearise(gr); + let b = linearise(br); + let y = r * LUMA_RED + g * LUMA_GREEN + b * LUMA_BLUE; + let p = r.max(g).max(b); + let n = r.min(g).min(b); + let d = 6.0 * (p - n); + let h = if n == p { + 0.0 + } else if r == p { + (g - b) / d + } else if g == p { + (b - r) / d + 1.0 / 3.0 + } else { + (r - g) / d + 2.0 / 3.0 + }; + let c = if r == g && g == b { + 0.0 + } else { + ((y - n) / y).max((p - y) / (1.0 - y)) + }; + Hcy { h, c, y, a } + } + + /// The hue in `[0, 1)`: [`Hcy::h`] plus 1 when it is negative. + pub fn wrapped_hue(self) -> f64 { + if self.h < 0.0 { self.h + 1.0 } else { self.h } + } + + /// Converts back to a stored colour. + /// + /// The hue is wrapped into `[0, 1)` and the chroma and luma clamped to + /// `0..=1`; each linear component is clamped, raised to `1/2.2` and + /// stored, and so is the alpha. Converting an 8-bit colour to HCY and + /// back gives the same colour. + pub fn to_color(self) -> KdeColor { + let h = wrap_hue(self.h); + let c = unit(self.c); + let y = unit(self.y); + let s = 6.0 * h; + let (sector, t, m) = if s < 1.0 { + (0, s, LUMA_RED + LUMA_GREEN * s) + } else if s < 2.0 { + let t = 2.0 - s; + (1, t, LUMA_GREEN + LUMA_RED * t) + } else if s < 3.0 { + let t = s - 2.0; + (2, t, LUMA_GREEN + LUMA_BLUE * t) + } else if s < 4.0 { + let t = 4.0 - s; + (3, t, LUMA_BLUE + LUMA_GREEN * t) + } else if s < 5.0 { + let t = s - 4.0; + (4, t, LUMA_BLUE + LUMA_RED * t) + } else { + let t = 6.0 - s; + (5, t, LUMA_RED + LUMA_BLUE * t) + }; + let (top, middle, bottom) = if m >= y { + ( + y + y * c * (1.0 - m) / m, + y + y * c * (t - m) / m, + y - y * c, + ) + } else { + ( + y + (1.0 - y) * c, + y + (1.0 - y) * c * (t - m) / (1.0 - m), + y - (1.0 - y) * c * m / (1.0 - m), + ) + }; + let (r, g, b) = match sector { + 0 => (top, middle, bottom), + 1 => (middle, top, bottom), + 2 => (bottom, top, middle), + 3 => (bottom, middle, top), + 4 => (middle, bottom, top), + _ => (top, bottom, middle), + }; + KdeColor::rgba16( + store_channel(delinearise(r)), + store_channel(delinearise(g)), + store_channel(delinearise(b)), + store_channel(self.a), + ) + } +} + +/// The remainder of `h` by 1 with `h`'s sign, plus 1 when negative; a zero +/// or NaN remainder gives 0. +fn wrap_hue(h: f64) -> f64 { + let r = h % 1.0; + if r.is_nan() || r == 0.0 { + 0.0 + } else if r < 0.0 { + r + 1.0 + } else { + r + } +} + +/// The luma of a colour, in `0..=1`: the Rec. 709 weighted sum of its +/// channels raised to the power 2.2. Alpha is ignored. +/// +/// This is not WCAG relative luminance, which uses the sRGB transfer curve. +pub fn luma(color: KdeColor) -> f64 { + let [r, g, b, _] = reads(color); + linearise(r) * LUMA_RED + linearise(g) * LUMA_GREEN + linearise(b) * LUMA_BLUE +} + +/// KDE's contrast ratio between two lumas: `(Y1 + 0.05) / (Y2 + 0.05)` with +/// the larger luma on top, so the result is at least 1. +/// +/// It has the shape of WCAG's ratio but is computed on [`luma`], so its +/// values differ from WCAG contrast. Use it only to reproduce KDE's +/// decisions, never to judge readability. +pub fn luma_ratio(y1: f64, y2: f64) -> f64 { + if y1 > y2 { + (y1 + 0.05) / (y2 + 0.05) + } else { + (y2 + 0.05) / (y1 + 0.05) + } +} + +/// [`luma_ratio`] of the lumas of two colours. +pub fn color_luma_ratio(a: KdeColor, b: KdeColor) -> f64 { + luma_ratio(luma(a), luma(b)) +} + +// --------------------------------------------------------------------------- +// Luma operations, mix and tint (sections d.6 to d.9) +// --------------------------------------------------------------------------- + +/// Moves a colour's luma toward white, keeping its hue and alpha. +/// +/// `amount` 1 gives white, 0.5 halves the distance to white and 0 keeps +/// the luma: `y' = 1 - N((1 - y)(1 - amount))`. The chroma becomes +/// `1 - N((1 - c) chroma_factor)`, so the usual factor 1 keeps it. KDE's +/// defaults are `amount` 0.5 and `chroma_factor` 1. +/// +/// The colour is converted through HCY even when nothing changes, so the +/// result may differ from the input by one 16-bit step. +pub fn lighten(color: KdeColor, amount: f64, chroma_factor: f64) -> KdeColor { + let mut hcy = Hcy::from_color(color); + hcy.y = 1.0 - unit((1.0 - hcy.y) * (1.0 - amount)); + hcy.c = 1.0 - unit((1.0 - hcy.c) * chroma_factor); + hcy.to_color() +} + +/// Moves a colour's luma toward black, keeping its hue and alpha. +/// +/// `y' = N(y (1 - amount))` and `c' = N(c chroma_factor)`; KDE's defaults +/// are `amount` 0.5 and `chroma_factor` 1. An `amount` of 0 with a +/// `chroma_factor` below 1 desaturates. +pub fn darken(color: KdeColor, amount: f64, chroma_factor: f64) -> KdeColor { + let mut hcy = Hcy::from_color(color); + hcy.y = unit(hcy.y * (1.0 - amount)); + hcy.c = unit(hcy.c * chroma_factor); + hcy.to_color() +} + +/// Adds `luma_amount` to a colour's luma and `chroma_amount` to its +/// chroma, each clamped to `0..=1`, keeping its hue and alpha. A negative +/// amount darkens or desaturates. +pub fn shade(color: KdeColor, luma_amount: f64, chroma_amount: f64) -> KdeColor { + let mut hcy = Hcy::from_color(color); + hcy.y = unit(hcy.y + luma_amount); + hcy.c = unit(hcy.c + chroma_amount); + hcy.to_color() +} + +/// Interpolates from `a` (at `t` 0) to `b` (at `t` 1) with premultiplied +/// alpha. +/// +/// At or below 0 the result is `a` exactly, at or above 1 it is `b` +/// exactly, and a NaN `t` gives `a`. Otherwise the alpha is interpolated +/// and each channel is interpolated premultiplied (the products in single +/// precision) and divided back by that alpha; a result with no alpha left +/// is transparent black. +pub fn mix(a: KdeColor, b: KdeColor, t: f64) -> KdeColor { + if t <= 0.0 { + return a; + } + if t >= 1.0 { + return b; + } + if t.is_nan() { + return a; + } + let ra = reads(a); + let rb = reads(b); + let alpha = lerp(ra[3], rb[3], t); + if alpha <= 0.0 { + return KdeColor::TRANSPARENT; + } + let channel = |i: usize| { + let pa = f64::from((ra[i] as f32) * (ra[3] as f32)); + let pb = f64::from((rb[i] as f32) * (rb[3] as f32)); + store_channel(lerp(pa, pb, t).clamp(0.0, 1.0) / alpha) + }; + KdeColor::rgba16(channel(0), channel(1), channel(2), store_channel(alpha)) +} + +/// Tints `base` toward `color` by `amount` while keeping `base`'s luma +/// within a bounded contrast of where it was. +/// +/// At or below 0 the result is `base`, at or above 1 it is `color`, and a +/// NaN amount gives `base`. Otherwise the mix factor is found by twelve +/// bisection steps against a luma-ratio budget that grows with the cube of +/// `amount`, and the result is that mix with its luma pulled back toward +/// `base`'s. KDE's default amount is 0.3. +pub fn tint(base: KdeColor, color: KdeColor, amount: f64) -> KdeColor { + if amount <= 0.0 { + return base; + } + if amount >= 1.0 { + return color; + } + if amount.is_nan() { + return base; + } + let base_luma = luma(base); + let initial_ratio = luma_ratio(base_luma, luma(color)); + let budget = 1.0 + (initial_ratio + 1.0) * amount * amount * amount; + let mut low = 0.0_f64; + let mut high = 1.0_f64; + let mut s = 0.5; + for _ in 0..12 { + s = (low + high) / 2.0; + let mixed = mix(base, color, s.powf(0.3)); + let mixed_luma = lerp(base_luma, luma(mixed), s); + if luma_ratio(base_luma, mixed_luma) > budget { + high = s; + } else { + low = s; + } + } + let mut hcy = Hcy::from_color(mix(base, color, s.powf(0.3))); + hcy.y = lerp(base_luma, hcy.y, s); + hcy.to_color() +} + +// --------------------------------------------------------------------------- +// Shade roles (section d.10) +// --------------------------------------------------------------------------- + +/// The five 3D shades a palette derives from its window background. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum ShadeRole { + /// The lightest shade, a bevel's lit edge. + Light, + /// Between the background and [`ShadeRole::Light`]. + Midlight, + /// Between the background and [`ShadeRole::Dark`]. + Mid, + /// A bevel's shadowed edge. + Dark, + /// The darkest shade, a drop shadow. + Shadow, +} + +impl ShadeRole { + /// The five roles, lightest first. + pub const ALL: [ShadeRole; 5] = [ + ShadeRole::Light, + ShadeRole::Midlight, + ShadeRole::Mid, + ShadeRole::Dark, + ShadeRole::Shadow, + ]; +} + +/// The shade of `color` for `role`, at contrast value `contrast`. +/// +/// `contrast` is the scheme's `[KDE] contrast` divided by 10 (0.4 for +/// Breeze), clamped to `-1..=1` (a NaN counts as 1). Very dark colours +/// (luma below 0.006) shade upward and very light ones (above 0.93) +/// downward; anything between gets a lighter Light and Midlight and a +/// darker Mid, Dark and Shadow, scaled by its luma. `chroma_amount` is +/// added to the chroma of every shade (KDE's default is 0). +pub fn shade_role(color: KdeColor, role: ShadeRole, contrast: f64, chroma_amount: f64) -> KdeColor { + let k = if contrast >= 1.0 || contrast.is_nan() { + 1.0 + } else if contrast <= -1.0 { + -1.0 + } else { + contrast + }; + let y = luma(color); + let yi = 1.0 - y; + let shaded = |amount: f64| shade(color, amount, chroma_amount); + if y < 0.006 { + match role { + ShadeRole::Light => shaded(0.05 + 0.95 * k), + ShadeRole::Mid => shaded(0.01 + 0.20 * k), + ShadeRole::Dark => shaded(0.02 + 0.40 * k), + ShadeRole::Midlight | ShadeRole::Shadow => shaded(0.03 + 0.60 * k), + } + } else if y > 0.93 { + match role { + ShadeRole::Midlight => shaded(-0.02 - 0.20 * k), + ShadeRole::Dark => shaded(-0.06 - 0.60 * k), + ShadeRole::Shadow => shaded(-0.10 - 0.90 * k), + ShadeRole::Light | ShadeRole::Mid => shaded(-0.04 - 0.40 * k), + } + } else { + let light_amount = (0.05 + 0.55 * y) * (0.25 + 0.75 * k); + let dark_amount = (-y) * (0.55 + 0.35 * k); + match role { + ShadeRole::Light => shaded(light_amount), + ShadeRole::Midlight => shaded((0.15 + 0.35 * yi) * light_amount), + ShadeRole::Mid => shaded((0.35 + 0.15 * y) * dark_amount), + ShadeRole::Dark => shaded(dark_amount), + ShadeRole::Shadow => darken(shaded(dark_amount), 0.5 + 0.3 * y, 1.0), + } + } +} + +// --------------------------------------------------------------------------- +// HSV lighter and darker (section d.11) +// --------------------------------------------------------------------------- + +/// A colour in Qt's integer HSV form: hue in hundredths of a degree +/// (`None` for a grey), saturation and value in `0..=65535`. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +struct Hsv16 { + hue: Option, + saturation: u32, + value: u32, +} + +/// `R(x) = floor(x + 1/2)` of a non-negative single-precision value. +fn round_half_up(x: f32) -> u32 { + (f64::from(x) + 0.5).floor() as u32 +} + +fn to_hsv16(color: KdeColor) -> Hsv16 { + let (r, g, b) = (u32::from(color.r), u32::from(color.g), u32::from(color.b)); + let max = r.max(g).max(b); + let min = r.min(g).min(b); + if max == min { + return Hsv16 { + hue: None, + saturation: 0, + value: max, + }; + } + let k = (max - min) as f32; + let saturation = round_half_up((k / max as f32) * 65535.0_f32); + let diff = |a: u32, b: u32| (i64::from(a) - i64::from(b)) as f32; + let position = if max == r { + let p = diff(g, b) / k; + if p < 0.0 { p + 6.0_f32 } else { p } + } else if max == g { + 2.0_f32 + diff(b, r) / k + } else { + 4.0_f32 + diff(r, g) / k + }; + Hsv16 { + hue: Some(round_half_up(position * 6000.0_f32)), + saturation, + value: max, + } +} + +fn from_hsv16(hsv: Hsv16, alpha: u16) -> KdeColor { + let v16 = hsv.value as u16; + let Some(hue) = hsv.hue.filter(|_| hsv.saturation != 0) else { + return KdeColor::rgba16(v16, v16, v16, alpha); + }; + let h = if hue == 36000 { + 0.0_f32 + } else { + hue as f32 / 6000.0_f32 + }; + let s = hsv.saturation as f32 / 65535.0_f32; + let v = hsv.value as f32 / 65535.0_f32; + let i = h.trunc(); + let f = h - i; + let p = v * (1.0_f32 - s); + let q = v * (1.0_f32 - s * f); + let t = v * (1.0_f32 - s * (1.0_f32 - f)); + let (r, g, b) = match i as u32 { + 0 => (v, t, p), + 1 => (q, v, p), + 2 => (p, v, t), + 3 => (p, q, v), + 4 => (t, p, v), + _ => (v, p, q), + }; + let store = |x: f32| round_half_up(x * 65535.0_f32).min(65535) as u16; + KdeColor::rgba16(store(r), store(g), store(b), alpha) +} + +/// Qt's documented `lighter(factor)`: the colour with its HSV value +/// multiplied by `factor / 100`. +/// +/// A factor of 0 or less returns the colour unchanged, and a factor below +/// 100 is [`hsv_darker`] by `10000 / factor`. When the value would pass the +/// top of the range, the excess is taken off the saturation instead, so a +/// strong factor moves toward white. The colour goes through Qt's 16-bit +/// HSV form even at factor 100, and keeps its alpha. +pub fn hsv_lighter(color: KdeColor, factor: i32) -> KdeColor { + if factor <= 0 { + return color; + } + if factor < 100 { + return hsv_darker(color, 10000 / factor); + } + let mut hsv = to_hsv16(color); + let value = i64::from(factor) * i64::from(hsv.value) / 100; + if value > 65535 { + let excess = value - 65535; + hsv.saturation = (i64::from(hsv.saturation) - excess).max(0) as u32; + hsv.value = 65535; + } else { + hsv.value = value as u32; + } + from_hsv16(hsv, color.a) +} + +/// Qt's documented `darker(factor)`: the colour with its HSV value divided +/// by `factor / 100`. +/// +/// A factor of 0 or less returns the colour unchanged, and a factor below +/// 100 is [`hsv_lighter`] by `10000 / factor`. The saturation and alpha are +/// kept. +pub fn hsv_darker(color: KdeColor, factor: i32) -> KdeColor { + if factor <= 0 { + return color; + } + if factor < 100 { + return hsv_lighter(color, 10000 / factor); + } + let mut hsv = to_hsv16(color); + hsv.value = (i64::from(hsv.value) * 100 / i64::from(factor)) as u32; + from_hsv16(hsv, color.a) +} + +// --------------------------------------------------------------------------- +// 8-bit blending (sections d.12 to d.14) +// --------------------------------------------------------------------------- + +/// `foreground` composited over `background` the way KDE's accent code +/// does it, in 8-bit channels. +/// +/// A fully transparent foreground returns `background` unchanged. Over an +/// opaque background each channel is `trunc(af f + (1 - af) g)`, with `af` +/// the foreground's alpha, `f` and `g` the 8-bit channels, and the first +/// product in single precision; the result is opaque. Over a translucent +/// background the colour channels are weighted by the background's alpha +/// as well, without un-premultiplying, and the alpha is the integer part +/// of the summed coverages (so 0, or 1 out of 255): KDE writes that nearly +/// transparent value and this function reproduces it. +pub fn blend8(foreground: KdeColor, background: KdeColor) -> KdeColor { + let af = f32::from(foreground.a) / 65535.0_f32; + if af == 0.0 { + return background; + } + let inverse = 1.0 - f64::from(af); + let [fr, fg, fb, _] = foreground.to_rgba8(); + let [gr, gg, gb, _] = background.to_rgba8(); + let background_alpha = read_channel(background.a); + let weight = if background_alpha == 1.0 { + inverse + } else { + background_alpha * inverse + }; + let channel = |f: u8, g: u8| { + let painted = f64::from(af * f32::from(f)); + (painted + weight * f64::from(g)).trunc().clamp(0.0, 255.0) as u8 + }; + let alpha = if background_alpha == 1.0 { + 255 + } else { + (f64::from(af) + weight).trunc().clamp(0.0, 255.0) as u8 + }; + KdeColor::rgba8(channel(fr, gr), channel(fg, gg), channel(fb, gb), alpha) +} + +/// Black or white text for `background`, as KDE picks it for an accent +/// colour. +/// +/// Black when white would reach less than 4.5 in [`luma_ratio`] (KDE's +/// measure, not WCAG's: black exactly when the luma is above about +/// 0.183), white otherwise. An active colour is that colour, opaque; an +/// inactive one is it at alpha 0.6 laid over `background` with +/// [`blend8`]. +pub fn black_or_white_on(background: KdeColor, active: bool) -> KdeColor { + let chosen = if color_luma_ratio(background, KdeColor::WHITE) < 4.5 { + KdeColor::BLACK + } else { + KdeColor::WHITE + }; + let alpha = if active { 1.0 } else { 0.6 }; + blend8(with_alpha(chosen, alpha), background) +} + +/// An accent laid over a background at alpha 0.7 with [`blend8`]: the +/// selection fill KDE derives from an accent. Only the accent's 8-bit +/// channels are used; its own alpha is replaced. +pub fn accent_over(accent: KdeColor, background: KdeColor) -> KdeColor { + let [r, g, b, _] = accent.to_rgba8(); + blend8(with_alpha(KdeColor::rgb8(r, g, b), 0.7), background) +} + +/// `color` with its alpha set to the fraction `alpha`, stored like any +/// channel. +fn with_alpha(color: KdeColor, alpha: f64) -> KdeColor { + KdeColor { + a: store_channel(alpha), + ..color + } +} + +// --------------------------------------------------------------------------- +// sRGB curve and OKLab tint (section d.15) +// --------------------------------------------------------------------------- + +/// A colour held as floating-point channels, the way Qt keeps the result +/// of a colour-space conversion. +/// +/// A result whose three colour channels all lie in `0..=1` is stored in 16 +/// bits like any colour. One with a channel outside that range is held in +/// half precision instead: each channel, alpha included, is rounded to the +/// nearest IEEE 754 binary16 value (ties to even), so it can carry the +/// out-of-gamut value into the next step. +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum FloatColor { + /// Every colour channel in range: 16-bit storage. + Rgb16(KdeColor), + /// Some colour channel out of range: red, green, blue and alpha, each + /// an exact binary16 value written as an `f32`. + Half([f32; 4]), +} + +impl FloatColor { + /// Stores single-precision channels by the rule of the type + /// documentation. The range test is made on these `f32` values. + pub fn from_f32(rgb: [f32; 3], alpha: f32) -> FloatColor { + if rgb.iter().all(|c| (0.0..=1.0).contains(c)) { + FloatColor::Rgb16(KdeColor::rgba16( + store_channel(f64::from(rgb[0])), + store_channel(f64::from(rgb[1])), + store_channel(f64::from(rgb[2])), + store_channel(f64::from(alpha)), + )) + } else { + FloatColor::Half([ + round_to_half(rgb[0]), + round_to_half(rgb[1]), + round_to_half(rgb[2]), + round_to_half(alpha), + ]) + } + } + + /// The channel reads: `q / 65535` in single precision for a 16-bit + /// colour, the binary16 values for a half-precision one. + pub fn channels(self) -> [f32; 4] { + match self { + FloatColor::Rgb16(c) => [c.r, c.g, c.b, c.a].map(|q| f32::from(q) / 65535.0_f32), + FloatColor::Half(channels) => channels, + } + } + + /// The colour in 16-bit channels: a half-precision colour has each + /// channel clamped to `0..=1` and stored. + pub fn to_rgb16(self) -> KdeColor { + match self { + FloatColor::Rgb16(c) => c, + FloatColor::Half([r, g, b, a]) => { + let store = |x: f32| store_channel(f64::from(x.clamp(0.0, 1.0))); + KdeColor::rgba16(store(r), store(g), store(b), store(a)) + } + } + } +} + +/// Rounds a single-precision value to the nearest binary16 value, ties to +/// even, overflowing to infinity past the largest finite one. +fn round_to_half(x: f32) -> f32 { + if x.is_nan() || x == 0.0 || x.is_infinite() { + return x; + } + let magnitude = f64::from(x.abs()); + // 65520 is halfway between 65504, the largest finite binary16 value, + // and 65536; the tie goes to the even neighbour, which is infinity. + let rounded = if magnitude >= 65520.0 { + f64::INFINITY + } else { + // Below 2^-14 the binary16 values are the subnormals, multiples of + // 2^-24; above, ten fraction bits under the leading one. + let exponent = ((magnitude.to_bits() >> 52) & 0x7ff) as i32 - 1023; + let quantum = 2.0_f64.powi(exponent.max(-14) - 10); + (magnitude / quantum).round_ties_even() * quantum + }; + (rounded as f32).copysign(x) +} + +/// The constants of Qt's sRGB transfer curve, each computed in single +/// precision exactly as section d.15 writes it. +struct SrgbCurve { + a: f32, + b: f32, + k: f32, + d: f32, + g: f32, + inv_d: f32, + inv_k: f32, + inv_a: f32, + inv_e: f32, + inv_g: f32, +} + +/// A single-precision power, correctly rounded: computed in `f64` and +/// rounded once. +fn powf32(x: f32, y: f32) -> f32 { + f64::from(x).powf(f64::from(y)) as f32 +} + +impl SrgbCurve { + fn new() -> SrgbCurve { + let a = 1.0_f32 / 1.055_f32; + let b = 0.055_f32 / 1.055_f32; + let k = 1.0_f32 / 12.92_f32; + let d = 0.04045_f32; + let g = 2.4_f32; + SrgbCurve { + a, + b, + k, + d, + g, + inv_d: k * d, + inv_k: 1.0_f32 / k, + inv_a: powf32(1.0_f32 / a, g), + inv_e: -b / a, + inv_g: 1.0_f32 / g, + } + } + + /// The sRGB curve, channel to linear light, sign kept. + fn forward(&self, x: f32) -> f32 { + let u = x.abs(); + let t = if u < self.d { + self.k * u + } else { + powf32(self.a * u + self.b, self.g) + }; + t.copysign(x) + } + + /// The inverse curve, linear light to channel, sign kept. + fn inverse(&self, y: f32) -> f32 { + let u = y.abs(); + let t = if u < self.inv_d { + self.inv_k * u + } else { + powf32(self.inv_a * u, self.inv_g) + self.inv_e + }; + t.copysign(y) + } +} + +/// The matrix Qt applies between its sRGB and linear sRGB spaces: the +/// identity up to single-precision rounding. Rows are red, green, blue; +/// the values are binary32 numbers given by their bit patterns. +const SRGB_MATRIX: [[u32; 3]; 3] = [ + // 0x1.fffffep-1, 0x1.4p-25, -0x1p-25 + [0x3f7f_ffff, 0x3320_0000, 0xb300_0000], + // 0x1.928p-26, 1, 0 + [0x32c9_4000, 0x3f80_0000, 0x0000_0000], + // 0, 0, 0x1.fffffcp-1 + [0x0000_0000, 0x0000_0000, 0x3f7f_fffe], +]; + +fn apply_srgb_matrix([r, g, b]: [f32; 3]) -> [f32; 3] { + SRGB_MATRIX.map(|[m1, m2, m3]| { + (r * f32::from_bits(m1) + g * f32::from_bits(m2)) + b * f32::from_bits(m3) + }) +} + +/// Converts a colour from sRGB to linear sRGB as Qt's colour-space +/// transform does: the sRGB curve on each channel read, then the +/// near-identity matrix, all in single precision, stored as a +/// [`FloatColor`]. Alpha is carried through. +pub fn srgb_to_linear(color: FloatColor) -> FloatColor { + let curve = SrgbCurve::new(); + let [r, g, b, a] = color.channels(); + let linear = apply_srgb_matrix([curve.forward(r), curve.forward(g), curve.forward(b)]); + FloatColor::from_f32(linear, a) +} + +/// Converts a colour from linear sRGB to sRGB as Qt's colour-space +/// transform does: the near-identity matrix, then the inverse sRGB curve +/// on each channel, all in single precision, stored as a [`FloatColor`]. +/// Alpha is carried through. +pub fn linear_to_srgb(color: FloatColor) -> FloatColor { + let curve = SrgbCurve::new(); + let [r, g, b, a] = color.channels(); + let [lr, lg, lb] = apply_srgb_matrix([r, g, b]); + FloatColor::from_f32([curve.inverse(lr), curve.inverse(lg), curve.inverse(lb)], a) +} + +/// Linear sRGB to OKLab with Ottosson's published matrices, in `f64`. +fn linear_to_oklab([r, g, b]: [f64; 3]) -> [f64; 3] { + let l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b; + let m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b; + let s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b; + let (l, m, s) = (l.powf(1.0 / 3.0), m.powf(1.0 / 3.0), s.powf(1.0 / 3.0)); + [ + 0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s, + 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s, + 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s, + ] +} + +/// OKLab back to linear sRGB with Ottosson's published matrices, in `f64`. +fn oklab_to_linear([lightness, a, b]: [f64; 3]) -> [f64; 3] { + let l = lightness + 0.3963377774 * a + 0.2158037573 * b; + let m = lightness - 0.1055613458 * a - 0.0638541728 * b; + let s = lightness - 0.0894841775 * a - 1.2914855480 * b; + let (l, m, s) = (l * l * l, m * m * m, s * s * s); + [ + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s, + ] +} + +/// `x (1 - f) + y f` with the mixed precision of section d.15 step 3: the +/// inputs rounded to single precision, `y f` in single precision, the rest +/// in double, the result rounded to single precision. +fn tint_lerp(x: f64, y: f64, f: f64) -> f32 { + let (x, y, f) = (x as f32, y as f32, f as f32); + let kept = f64::from(x) * (1.0 - f64::from(f)); + (kept + f64::from(y * f)) as f32 +} + +/// Tints `base` toward `color` in OKLab by `factor`, keeping `base`'s +/// perceptual lightness: the accent tint Plasma applies to every colour of +/// a scheme that sets a tint factor. +/// +/// Both colours are taken to linear sRGB ([`srgb_to_linear`]) and to +/// OKLab; the result has `base`'s lightness and its `a` and `b` moved +/// `factor` of the way toward `color`'s. It is taken back to linear sRGB, +/// stored, reduced to 16 bits and converted to sRGB ([`linear_to_srgb`]); +/// a result outside the gamut is clamped. The result is opaque. +pub fn oklab_tint(base: KdeColor, color: KdeColor, factor: f64) -> KdeColor { + let oklab_of = |c: KdeColor| { + let [r, g, b, _] = srgb_to_linear(FloatColor::Rgb16(c)).channels(); + linear_to_oklab([f64::from(r), f64::from(g), f64::from(b)]) + }; + let [lightness, base_a, base_b] = oklab_of(base); + let [_, color_a, color_b] = oklab_of(color); + let a = f64::from(tint_lerp(base_a, color_a, factor)); + let b = f64::from(tint_lerp(base_b, color_b, factor)); + let linear = oklab_to_linear([lightness, a, b]).map(|c| c as f32); + let stored = FloatColor::from_f32(linear, 1.0).to_rgb16(); + let srgb = linear_to_srgb(FloatColor::Rgb16(KdeColor { + a: u16::MAX, + ..stored + })); + KdeColor { + a: u16::MAX, + ..srgb.to_rgb16() + } +} + +// --------------------------------------------------------------------------- +// Teksilo's WCAG lift +// --------------------------------------------------------------------------- + +/// The number of equal luma steps [`lift_luma_until`] tries between the +/// colour and black or white. A step of 1/256 of the way moves an 8-bit +/// channel by about one level, so the lift overshoots its floor by very +/// little. +const LUMA_LIFT_STEPS: u32 = 256; + +/// `color` with its HCY luma moved toward more contrast until its WCAG 2.x +/// contrast ratio reaches `floor` against every colour in `backdrops`. +/// +/// This is Teksilo's helper, not KDE's: KDE never lifts a colour for +/// readability. The hue, chroma and alpha are kept, so a lifted accent +/// stays recognisably the same hue; only its luma moves, toward black or +/// toward white, whichever reaches the higher minimum contrast over +/// `backdrops`. Contrast is measured with +/// [`teksilo_tokens::contrast::composite_contrast`], so a translucent +/// `color` is measured as painted, and each backdrop is taken as opaque. +/// +/// Returns `color` unchanged when it already passes, or when `backdrops` is +/// empty. Otherwise returns the first luma step that passes, or, when no +/// step does (a floor above what black or white can reach, a very +/// translucent `color`, or backdrops on both sides of the middle), the step +/// with the highest minimum contrast. +pub fn lift_luma_until(color: KdeColor, backdrops: &[KdeColor], floor: f32) -> KdeColor { + let worst = |c: KdeColor| -> f32 { + let fg = c.to_color(); + backdrops + .iter() + .map(|bg| composite_contrast(fg, bg.to_color())) + .fold(f32::INFINITY, f32::min) + }; + if backdrops.is_empty() || worst(color) >= floor { + return color; + } + let hcy = Hcy::from_color(color); + let at_luma = |y: f64| Hcy { y, ..hcy }.to_color(); + let target = if worst(at_luma(0.0)) >= worst(at_luma(1.0)) { + 0.0 + } else { + 1.0 + }; + let mut best = (worst(color), color); + for step in 1..=LUMA_LIFT_STEPS { + let candidate = at_luma(lerp( + hcy.y, + target, + f64::from(step) / f64::from(LUMA_LIFT_STEPS), + )); + let score = worst(candidate); + if score >= floor { + return candidate; + } + if score > best.0 { + best = (score, candidate); + } + } + best.1 +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn the_matrix_bit_patterns_are_the_published_values() { + // 0x1.fffffep-1, 0x1.4p-25, -0x1p-25 / 0x1.928p-26, 1, 0 / + // 0, 0, 0x1.fffffcp-1, written as exact powers of two. + let p = |e: i32| 2.0_f64.powi(e); + let expected = [ + [1.0 - p(-24), 1.25 * p(-25), -p(-25)], + [(1.0 + 2344.0 / 4096.0) * p(-26), 1.0, 0.0], + [0.0, 0.0, 1.0 - p(-23)], + ]; + for (row, expected) in SRGB_MATRIX.iter().zip(expected) { + for (&bits, value) in row.iter().zip(expected) { + assert_eq!(f64::from(f32::from_bits(bits)), value); + } + } + } + + #[test] + fn half_precision_rounding_keeps_ties_even_and_subnormals() { + let p = |e: i32| 2.0_f32.powi(e); + assert_eq!(round_to_half(1.0), 1.0); + // Ten fraction bits: 1.05 becomes 1075 / 1024. + assert_eq!(round_to_half(1.05), 1075.0 * p(-10)); + // Below 2^-14 the step is the subnormal 2^-24. + assert_eq!(round_to_half(-1e-7), -2.0 * p(-24)); + // Exactly half the smallest subnormal ties to zero, keeping the sign. + assert_eq!(round_to_half(-p(-25)).to_bits(), (-0.0_f32).to_bits()); + // A tie between two normal values goes to the even one. + assert_eq!(round_to_half(1.0 + p(-11)), 1.0); + assert_eq!(round_to_half(1.0 + 3.0 * p(-11)), 1.0 + p(-9)); + assert_eq!(round_to_half(65504.0), 65504.0); + assert_eq!(round_to_half(65520.0), f32::INFINITY); + } + + #[test] + fn channel_storage_round_trips_every_16_bit_value() { + for q in 0..=u16::MAX { + assert_eq!(store_channel(read_channel(q)), q); + } + } +} diff --git a/crates/teksilo-kde-scheme/tests/clean_room_vocabulary.rs b/crates/teksilo-kde-scheme/tests/clean_room_vocabulary.rs new file mode 100644 index 000000000..343b29ab6 --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/clean_room_vocabulary.rs @@ -0,0 +1,199 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The clean-room vocabulary guard. +//! +//! The KDE crates are written from Teksilo's specification +//! (`engineering/docs/kde-breeze-spec.md`), never from KDE's or Qt's code. +//! An identifier that only exists upstream (a KDE function or class name, a +//! Qt type) appearing in the source is a sign that the code was shaped +//! after upstream rather than after the specification, so this test fails +//! on any of them, naming the file and line. +//! +//! The words are matched whole and case-sensitively. A comment line that +//! cites `doc.qt.io`, Qt's public documentation, may name what it cites. +//! Test fixtures (verbatim upstream files) are not scanned, and neither is +//! the word list below. +//! +//! To guard another crate, add its directories to [`SCANNED`]. The paths are +//! relative to the repository root, and a missing directory fails the test +//! rather than passing it unscanned, as does a directory with no file in it +//! or a scan that misses `src/math.rs` or this file. Every file found is +//! read, a non-UTF-8 one through a lossy decoding. This file reads the +//! repository tree, so it is left out of the published package. + +use std::fs; +use std::path::{Path, PathBuf}; + +/// The directories scanned, recursively, relative to the repository root. +const SCANNED: &[&str] = &[ + "crates/teksilo-kde-scheme/src", + "crates/teksilo-kde-scheme/tests", +]; + +/// Directories inside [`SCANNED`] that hold verbatim upstream files. +const SKIPPED: &[&str] = &["crates/teksilo-kde-scheme/tests/fixtures"]; + +const LIST_BEGIN: &str = "// clean-room word list: begin"; +const LIST_END: &str = "// clean-room word list: end"; + +// clean-room word list: begin +const FORBIDDEN: &[&str] = &[ + "KHCY", + "lumag", + "igamma", + "mixQreal", + "mix_qreal", + "tintHelper", + "tint_helper", + "contrastRatioForLuma", + "SerializedColors", + "StateEffects", + "applyScheme", + "accentForeground", + "accentBackground", + "QColor", + "KColorScheme", + "qreal", +]; +// clean-room word list: end + +fn repository_root() -> PathBuf { + Path::new(env!("CARGO_MANIFEST_DIR")).join("../..") +} + +fn is_word_byte(b: u8) -> bool { + b.is_ascii_alphanumeric() || b == b'_' +} + +/// The forbidden words that appear whole in `line`. +fn whole_words_in(line: &str) -> Vec<&'static str> { + let bytes = line.as_bytes(); + FORBIDDEN + .iter() + .copied() + .filter(|word| { + line.match_indices(word).any(|(start, _)| { + let end = start + word.len(); + let before = start == 0 || !is_word_byte(bytes[start - 1]); + let after = end == bytes.len() || !is_word_byte(bytes[end]); + before && after + }) + }) + .collect() +} + +fn cites_qt_documentation(line: &str) -> bool { + let trimmed = line.trim_start(); + (trimmed.starts_with("//") || trimmed.starts_with('#')) && line.contains("doc.qt.io") +} + +fn collect_files(dir: &Path, root: &Path, out: &mut Vec) { + let entries = + fs::read_dir(dir).unwrap_or_else(|e| panic!("cannot read {}: {e}", dir.display())); + for entry in entries { + let path = entry.expect("a directory entry").path(); + let relative = path.strip_prefix(root).unwrap_or(&path); + if SKIPPED.iter().any(|skip| relative == Path::new(skip)) { + continue; + } + if path.is_dir() { + collect_files(&path, root, out); + } else { + out.push(path); + } + } +} + +#[test] +fn no_upstream_identifier_appears_in_the_kde_crates() { + let root = repository_root(); + let this_file = Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/clean_room_vocabulary.rs"); + let mut files = Vec::new(); + for dir in SCANNED { + let path = root.join(dir); + assert!( + path.is_dir(), + "{dir} is listed in SCANNED but does not exist" + ); + let before = files.len(); + collect_files(&path, &root, &mut files); + assert!( + files.len() > before, + "{dir} is listed in SCANNED but holds no file to scan" + ); + } + let canonical: Vec = files + .iter() + .map(|file| { + fs::canonicalize(file) + .unwrap_or_else(|e| panic!("cannot resolve {}: {e}", file.display())) + }) + .collect(); + let this_file = fs::canonicalize(&this_file).expect("this test file resolves"); + let math = fs::canonicalize(root.join("crates/teksilo-kde-scheme/src/math.rs")) + .expect("the colour arithmetic module resolves"); + assert!( + canonical.contains(&math), + "the scan did not reach crates/teksilo-kde-scheme/src/math.rs" + ); + assert!( + canonical.contains(&this_file), + "the scan did not reach this test file" + ); + let mut findings = Vec::new(); + let mut lines_read = 0usize; + for (file, resolved) in files.iter().zip(&canonical) { + // Every file is read: one that is not UTF-8 is scanned through a + // lossy decoding, so an identifier in it is still found. + let bytes = + fs::read(file).unwrap_or_else(|e| panic!("cannot read {}: {e}", file.display())); + let text = String::from_utf8_lossy(&bytes); + let is_this_file = *resolved == this_file; + let mut in_list = false; + for (index, line) in text.lines().enumerate() { + lines_read += 1; + if is_this_file && line.trim() == LIST_BEGIN { + in_list = true; + } + if is_this_file && line.trim() == LIST_END { + in_list = false; + continue; + } + if in_list || cites_qt_documentation(line) { + continue; + } + for word in whole_words_in(line) { + let shown = file.strip_prefix(&root).unwrap_or(file); + findings.push(format!("{}:{}: {word}", shown.display(), index + 1)); + } + } + } + assert!( + lines_read > files.len(), + "the scan read {lines_read} lines from {} files", + files.len() + ); + assert!( + findings.is_empty(), + "upstream identifiers in clean-room code:\n{}", + findings.join("\n") + ); +} + +#[test] +fn words_match_whole_and_case_sensitively() { + let word = FORBIDDEN[0]; + assert_eq!(whole_words_in(&format!("let x = {word};")), vec![word]); + assert!(whole_words_in(&format!("{word}x")).is_empty()); + assert!(whole_words_in(&format!("x{word}")).is_empty()); + assert!(whole_words_in(&format!("_{word}")).is_empty()); + assert_ne!(word, word.to_lowercase()); + assert!(whole_words_in(&word.to_lowercase()).is_empty()); + assert!(cites_qt_documentation(&format!( + " // {word}: see https://doc.qt.io/qt-6/" + ))); + assert!(!cites_qt_documentation(&format!( + "let {word} = 1; // https://doc.qt.io/" + ))); +} diff --git a/crates/teksilo-kde-scheme/tests/golden_math.rs b/crates/teksilo-kde-scheme/tests/golden_math.rs new file mode 100644 index 000000000..a0c6b3a36 --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/golden_math.rs @@ -0,0 +1,399 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The colour arithmetic of `teksilo_kde_scheme::math` against the golden +//! vectors `tools/kde_golden/vectors/math.json`, measured from KDE's own +//! libraries and Qt 6.11.1. +//! +//! Every record is checked: real results within 1e-6, stored colours equal +//! in all four 16-bit channels and in the 8-bit hex. The one member left +//! out is `overlay`, which records a painter composition that Teksilo's +//! specification does not describe and no Teksilo code performs. +//! +//! The vectors live outside the crate, so this file is left out of the +//! published package (the `exclude` list in `Cargo.toml`). + +use serde_json::Value; +use teksilo_kde_scheme::KdeColor; +use teksilo_kde_scheme::math::{ + self, FloatColor, Hcy, ShadeRole, color_luma_ratio, darken, hsv_darker, hsv_lighter, lighten, + luma, mix, shade, shade_role, tint, +}; + +const MATH_JSON: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../tools/kde_golden/vectors/math.json" +)); + +fn vectors() -> Value { + serde_json::from_str(MATH_JSON).expect("math.json parses") +} + +fn records<'a>(all: &'a Value, member: &str) -> &'a [Value] { + let list = all[member] + .as_array() + .unwrap_or_else(|| panic!("math.json member {member} is a list")); + assert!(!list.is_empty(), "math.json member {member} is empty"); + list +} + +/// A `#rrggbbaa` golden colour, entering the model from 8 bits. +fn color(value: &Value) -> KdeColor { + let text = value.as_str().expect("a colour is a string"); + let digits = text.strip_prefix('#').expect("a colour starts with #"); + assert_eq!(digits.len(), 8, "{text} is #rrggbbaa"); + let byte = |i: usize| u8::from_str_radix(&digits[2 * i..2 * i + 2], 16).expect("hex digits"); + KdeColor::rgba8(byte(0), byte(1), byte(2), byte(3)) +} + +fn hex(c: KdeColor) -> String { + let [r, g, b, a] = c.to_rgba8(); + format!("#{r:02x}{g:02x}{b:02x}{a:02x}") +} + +fn real(value: &Value) -> f64 { + value.as_f64().expect("a number") +} + +fn int(value: &Value) -> i32 { + i32::try_from(value.as_i64().expect("an integer")).expect("in range") +} + +/// Records a mismatch between a stored colour and a golden `{hex, u16}`. +fn check_color(failures: &mut Vec, what: String, got: KdeColor, expected: &Value) { + let channels: Vec = expected["u16"] + .as_array() + .expect("a u16 list") + .iter() + .map(|v| u16::try_from(v.as_u64().expect("an integer")).expect("16 bits")) + .collect(); + let want = KdeColor::rgba16(channels[0], channels[1], channels[2], channels[3]); + let want_hex = expected["hex"].as_str().expect("a hex string"); + if got != want || hex(got) != want_hex { + failures.push(format!( + "{what}: got {got:?} {}, expected {want:?} {want_hex}", + hex(got) + )); + } +} + +fn check_real(failures: &mut Vec, what: String, got: f64, expected: f64) { + if (got - expected).abs() > 1e-6 { + failures.push(format!("{what}: got {got}, expected {expected}")); + } +} + +fn assert_none(member: &str, failures: Vec) { + assert!( + failures.is_empty(), + "{} of math.json {member} differ; first ones:\n{}", + failures.len(), + failures + .iter() + .take(20) + .cloned() + .collect::>() + .join("\n") + ); +} + +#[test] +fn single_colours_have_the_golden_luma_hue_chroma_and_round_trip() { + let all = vectors(); + let mut failures = Vec::new(); + for r in records(&all, "single") { + let c = color(&r["in"]); + let hcy = Hcy::from_color(c); + let name = r["in"].as_str().unwrap_or_default(); + check_real( + &mut failures, + format!("{name} luma"), + luma(c), + real(&r["luma"]), + ); + check_real( + &mut failures, + format!("{name} hue"), + hcy.wrapped_hue(), + real(&r["hue"]), + ); + check_real( + &mut failures, + format!("{name} chroma"), + hcy.c, + real(&r["chroma"]), + ); + let expected = r["hcy"].as_array().expect("hcy is a list"); + for (i, got) in [hcy.wrapped_hue(), hcy.c, hcy.y, hcy.a] + .into_iter() + .enumerate() + { + check_real( + &mut failures, + format!("{name} hcy[{i}]"), + got, + real(&expected[i]), + ); + } + check_color( + &mut failures, + format!("{name} round trip"), + hcy.to_color(), + &r["roundtrip"], + ); + } + assert_none("single", failures); +} + +#[test] +fn luma_contrast_ratios_match() { + let all = vectors(); + let mut failures = Vec::new(); + for r in records(&all, "contrast_ratio") { + let got = color_luma_ratio(color(&r["a"]), color(&r["b"])); + check_real(&mut failures, format!("{r}"), got, real(&r["out"])); + } + assert_none("contrast_ratio", failures); +} + +#[test] +fn lighten_darken_and_shade_match() { + let all = vectors(); + let mut failures = Vec::new(); + for r in records(&all, "lighten") { + let got = lighten(color(&r["in"]), real(&r["amount"]), real(&r["gain"])); + check_color(&mut failures, format!("lighten {r}"), got, &r["out"]); + } + for r in records(&all, "darken") { + let got = darken(color(&r["in"]), real(&r["amount"]), real(&r["gain"])); + check_color(&mut failures, format!("darken {r}"), got, &r["out"]); + } + for r in records(&all, "shade") { + let got = shade(color(&r["in"]), real(&r["luma"]), real(&r["chroma"])); + check_color(&mut failures, format!("shade {r}"), got, &r["out"]); + } + assert_none("lighten, darken and shade", failures); +} + +#[test] +fn mix_and_tint_match() { + let all = vectors(); + let mut failures = Vec::new(); + for r in records(&all, "mix") { + let got = mix(color(&r["c1"]), color(&r["c2"]), real(&r["bias"])); + check_color(&mut failures, format!("mix {r}"), got, &r["out"]); + } + for r in records(&all, "tint") { + let got = tint(color(&r["base"]), color(&r["color"]), real(&r["amount"])); + check_color(&mut failures, format!("tint {r}"), got, &r["out"]); + } + assert_none("mix and tint", failures); +} + +#[test] +fn hcy_values_convert_to_the_golden_colours() { + let all = vectors(); + let mut failures = Vec::new(); + for r in records(&all, "hcy_color") { + let hcy = Hcy { + h: real(&r["h"]), + c: real(&r["c"]), + y: real(&r["y"]), + a: real(&r["a"]), + }; + check_color(&mut failures, format!("{r}"), hcy.to_color(), &r["out"]); + } + assert_none("hcy_color", failures); +} + +#[test] +fn shade_roles_match() { + let all = vectors(); + let mut failures = Vec::new(); + for r in records(&all, "scheme_shade") { + let role = match r["role"].as_str() { + Some("Light") => ShadeRole::Light, + Some("Midlight") => ShadeRole::Midlight, + Some("Mid") => ShadeRole::Mid, + Some("Dark") => ShadeRole::Dark, + Some("Shadow") => ShadeRole::Shadow, + other => panic!("unknown shade role {other:?}"), + }; + let got = shade_role( + color(&r["in"]), + role, + real(&r["contrast"]), + real(&r["chroma"]), + ); + check_color(&mut failures, format!("{r}"), got, &r["out"]); + } + assert_none("scheme_shade", failures); +} + +#[test] +fn hsv_lighter_and_darker_match() { + let all = vectors(); + let mut failures = Vec::new(); + for r in records(&all, "qt_lighter_darker") { + let c = color(&r["in"]); + let factor = int(&r["factor"]); + let got = match r["op"].as_str() { + Some("lighter") => hsv_lighter(c, factor), + Some("darker") => hsv_darker(c, factor), + other => panic!("unknown operation {other:?}"), + }; + check_color(&mut failures, format!("{r}"), got, &r["out"]); + } + assert_none("qt_lighter_darker", failures); +} + +/// Checks a float colour against a golden `{hex, u16}`, which also carries +/// `f` exactly when the colour is held in half precision. +fn check_float(failures: &mut Vec, what: String, got: FloatColor, expected: &Value) { + match (&expected["f"], got) { + (Value::Array(f), FloatColor::Half(channels)) => { + // Each value is a binary16 number, so exactly an `f32`; reading + // it as `f32` absorbs the last-digit error of the JSON decimal. + let want: Vec = f.iter().map(|v| real(v) as f32).collect(); + if want != channels { + let have = channels; + failures.push(format!("{what}: half channels {have:?}, expected {want:?}")); + } + } + (Value::Null, FloatColor::Rgb16(_)) => {} + (_, got) => failures.push(format!("{what}: storage {got:?} disagrees with {expected}")), + } + check_color(failures, what, got.to_rgb16(), expected); +} + +#[test] +fn srgb_and_linear_conversions_match() { + let all = vectors(); + let mut failures = Vec::new(); + for r in records(&all, "qt_colorspace") { + let c = FloatColor::Rgb16(color(&r["in"])); + check_float( + &mut failures, + format!("to linear {r}"), + math::srgb_to_linear(c), + &r["to_linear"], + ); + check_float( + &mut failures, + format!("from linear {r}"), + math::linear_to_srgb(c), + &r["from_linear"], + ); + } + assert_none("qt_colorspace", failures); +} + +#[test] +fn out_of_range_float_colours_are_held_in_half_precision() { + let all = vectors(); + let mut failures = Vec::new(); + for r in records(&all, "qt_extended") { + let input: Vec = r["in"] + .as_array() + .expect("a channel list") + .iter() + .map(|v| real(v) as f32) + .collect(); + let stored = FloatColor::from_f32([input[0], input[1], input[2]], 1.0); + check_float(&mut failures, format!("stored {r}"), stored, &r["stored"]); + check_color( + &mut failures, + format!("to rgb {r}"), + stored.to_rgb16(), + &r["to_rgb"], + ); + } + assert_none("qt_extended", failures); +} + +#[test] +fn colour_text_parses_as_qt_reads_it() { + let all = vectors(); + let mut failures = Vec::new(); + for r in records(&all, "qt_color_text") { + let text = r["in"].as_str().expect("a string"); + // Section b.9: a configuration value is trimmed before it is read + // as a colour, so the reader accepts the surrounding whitespace Qt's + // own parser rejects. Every other text must agree. + if text != text.trim() { + continue; + } + let got = KdeColor::parse(text); + match (got, r["out"]["valid"].as_bool()) { + (None, Some(false)) => {} + (Some(c), None) => check_color(&mut failures, format!("{text:?}"), c, &r["out"]), + (got, _) => failures.push(format!("{text:?}: got {got:?}, expected {}", r["out"])), + } + } + assert_none("qt_color_text", failures); +} + +const ACCENT_JSON: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../tools/kde_golden/vectors/accent.json" +)); + +/// The OKLab tint on its own, through the accent oracle's tinting scheme: +/// every colour Plasma tinted (section g.3 step 3: not an accent key, not +/// one the selection or button accent overwrites) must be +/// `oklab_tint(scheme value, accent, TintFactor)`. +#[test] +fn oklab_tint_reproduces_the_tinted_scheme_colours() { + let all: Value = serde_json::from_str(ACCENT_JSON).expect("accent.json parses"); + let scheme = &all["schemes"]["KdeGoldenTintLight"]; + let factor: f64 = scheme["changes"]["General"]["TintFactor"] + .as_str() + .expect("the scheme sets a tint factor") + .parse() + .expect("a real tint factor"); + let accent_keys = [ + "ForegroundActive", + "ForegroundLink", + "DecorationFocus", + "DecorationHover", + ]; + let parse = + |v: &Value| KdeColor::parse(v.as_str().expect("a colour string")).expect("a colour"); + let mut failures = Vec::new(); + let mut checked = 0; + let cases = all["cases"].as_array().expect("a case list"); + for case in cases.iter().filter(|c| c["scheme"] == "KdeGoldenTintLight") { + let accent = parse(&case["accent"]); + for group in [ + "View", + "Window", + "Button", + "Tooltip", + "Complementary", + "Header", + ] { + let name = format!("Colors:{group}"); + let Some(input) = scheme["input"][&name].as_object() else { + continue; + }; + for (key, value) in input { + if accent_keys.contains(&key.as_str()) + || (group == "Button" && key == "BackgroundAlternate") + { + continue; + } + let written = &case["kdeglobals"][&name][key]; + let got = math::oklab_tint(parse(value), accent, factor); + checked += 1; + if got.to_rgba8() != parse(written).to_rgba8() { + failures.push(format!( + "accent {} [{name}] {key}: {value} tinted to {got}, Plasma wrote {written}", + case["accent"] + )); + } + } + } + } + assert!(checked > 0, "no tinted colour was checked"); + assert_none("accent.json tinted colours", failures); +} diff --git a/crates/teksilo-kde-scheme/tests/math.rs b/crates/teksilo-kde-scheme/tests/math.rs new file mode 100644 index 000000000..bee025e13 --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/math.rs @@ -0,0 +1,268 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The worked examples of section d of Teksilo's KDE specification, the +//! 8-bit blends the golden vectors reach only through the accent oracle, +//! and Teksilo's own WCAG lift, [`lift_luma_until`]. +//! +//! `tests/golden_math.rs` checks the same functions against every measured +//! record; this file needs no vector and is published with the crate. + +use teksilo_kde_scheme::KdeColor; +use teksilo_kde_scheme::math::{ + self, Hcy, ShadeRole, accent_over, black_or_white_on, blend8, darken, lift_luma_until, luma, + shade_role, tint, +}; +use teksilo_tokens::contrast::composite_contrast; + +fn rgb(r: u8, g: u8, b: u8) -> KdeColor { + KdeColor::rgb8(r, g, b) +} + +fn rgb8(c: KdeColor) -> [u8; 3] { + let [r, g, b, _] = c.to_rgba8(); + [r, g, b] +} + +fn wcag(fg: KdeColor, bg: KdeColor) -> f32 { + composite_contrast(fg.to_color(), bg.to_color()) +} + +#[test] +fn the_breeze_accent_has_the_specified_hcy_coordinates_and_returns() { + let accent = rgb(61, 174, 233); + let hcy = Hcy::from_color(accent); + assert!((hcy.h - 0.583_362_32).abs() < 1e-8, "{hcy:?}"); + assert!((hcy.c - 0.885_926_16).abs() < 1e-8, "{hcy:?}"); + assert!((hcy.y - 0.376_834_96).abs() < 1e-8, "{hcy:?}"); + assert_eq!(hcy.to_color(), accent); +} + +#[test] +fn a_red_dominant_colour_with_more_blue_than_green_has_a_negative_raw_hue() { + let hcy = Hcy::from_color(rgb(233, 58, 154)); + assert!(hcy.h < 0.0 && hcy.h > -1.0 / 6.0, "{hcy:?}"); + assert!((hcy.wrapped_hue() - (hcy.h + 1.0)).abs() < 1e-15); + assert_eq!(hcy.to_color(), rgb(233, 58, 154)); +} + +#[test] +fn breeze_light_window_shades_match_the_worked_example() { + let window = rgb(239, 240, 241); + let expected = [ + (ShadeRole::Light, [255, 255, 255]), + (ShadeRole::Midlight, [246, 247, 247]), + (ShadeRole::Mid, [196, 200, 204]), + (ShadeRole::Dark, [136, 142, 147]), + (ShadeRole::Shadow, [71, 74, 76]), + ]; + for (role, want) in expected { + assert_eq!(rgb8(shade_role(window, role, 0.4, 0.0)), want, "{role:?}"); + } +} + +#[test] +fn the_selection_tints_of_breeze_light_match_the_worked_examples() { + let accent = rgb(61, 174, 233); + assert_eq!(rgb8(tint(rgb(239, 240, 241), accent, 0.4)), [194, 224, 245]); + assert_eq!(rgb8(tint(rgb(227, 229, 231), accent, 0.4)), [176, 216, 243]); +} + +#[test] +fn the_link_darkening_matches_the_worked_example() { + let accent = rgb(61, 174, 233); + assert!(math::color_luma_ratio(accent, KdeColor::WHITE) < 5.0); + assert_eq!(rgb8(darken(accent, 0.5, 1.0)), [45, 127, 170]); +} + +#[test] +fn blend8_truncates_rather_than_rounds() { + // Section d.12: white at 0.6 over white paints 254, not 255. + let white_at_06 = KdeColor { + a: math::store_channel(0.6), + ..KdeColor::WHITE + }; + assert_eq!(white_at_06.a, 39321); + assert_eq!( + blend8(white_at_06, KdeColor::WHITE).to_rgba8(), + [254, 254, 254, 255] + ); +} + +#[test] +fn blend8_returns_the_background_for_a_transparent_foreground() { + let background = KdeColor::rgba16(1000, 2000, 3000, 40000); + assert_eq!(blend8(KdeColor::TRANSPARENT, background), background); +} + +#[test] +fn blend8_over_a_translucent_background_keeps_kde_s_nearly_transparent_alpha() { + let fg = KdeColor::rgba8(200, 100, 50, 128); + let bg = KdeColor::rgba8(10, 20, 30, 128); + let out = blend8(fg, bg); + let [_, _, _, a] = out.to_rgba8(); + assert!(a <= 1, "alpha {a} of {out:?}"); +} + +#[test] +fn the_accent_over_a_background_matches_the_worked_examples() { + let accent = rgb(61, 174, 233); + assert_eq!(rgb8(accent_over(accent, KdeColor::WHITE)), [119, 198, 239]); + assert_eq!(rgb8(accent_over(accent, rgb(20, 22, 24))), [48, 128, 170]); + assert_eq!( + rgb8(accent_over(accent, rgb(252, 252, 252))), + [118, 197, 238] + ); + // Only the accent's 8-bit channels count: its own alpha is replaced. + let translucent = KdeColor::rgba8(61, 174, 233, 10); + assert_eq!( + accent_over(translucent, KdeColor::WHITE), + accent_over(accent, KdeColor::WHITE) + ); +} + +#[test] +fn the_ten_swatches_give_the_specified_selection_and_text() { + let light = KdeColor::WHITE; + let dark = rgb(20, 22, 24); + // (swatch, light selection, black text on it, dark selection, black text on it) + let table = [ + ([233, 58, 154], [239, 117, 184], true, [169, 47, 115], false), + ([233, 61, 88], [239, 119, 138], true, [169, 49, 68], false), + ([233, 100, 58], [239, 146, 117], true, [169, 76, 47], false), + ([232, 203, 45], [238, 218, 107], true, [168, 148, 38], true), + ([61, 212, 37], [119, 224, 102], true, [48, 155, 33], true), + ([0, 211, 184], [76, 224, 205], true, [5, 154, 136], true), + ([61, 174, 233], [119, 198, 239], true, [48, 128, 170], true), + ( + [184, 117, 220], + [205, 158, 230], + true, + [134, 88, 161], + false, + ), + ( + [146, 110, 228], + [178, 153, 236], + true, + [108, 83, 166], + false, + ), + ([104, 107, 111], [149, 151, 154], true, [78, 81, 84], false), + ]; + for ([r, g, b], on_light, light_black, on_dark, dark_black) in table { + let swatch = rgb(r, g, b); + for (backdrop, selection, black) in + [(light, on_light, light_black), (dark, on_dark, dark_black)] + { + let fill = accent_over(swatch, backdrop); + assert_eq!(rgb8(fill), selection, "swatch {swatch}"); + let text = black_or_white_on(fill, true); + let want = if black { + KdeColor::BLACK + } else { + KdeColor::WHITE + }; + assert_eq!(text, want, "text on {fill} for swatch {swatch}"); + } + } +} + +#[test] +fn inactive_text_is_the_chosen_colour_at_60_percent_over_the_background() { + let fill = rgb(119, 198, 239); + let text = black_or_white_on(fill, false); + // Black at 0.6 over the fill: each channel truncated to 40 % of it. + assert_eq!(rgb8(text), [47, 79, 95]); + assert_eq!(text.to_rgba8()[3], 255); +} + +#[test] +fn black_text_starts_just_above_the_luma_threshold() { + let threshold = 1.05 / 4.5 - 0.05; + for v in 0..=255_u8 { + let grey = rgb(v, v, v); + let black = black_or_white_on(grey, true) == KdeColor::BLACK; + assert_eq!(black, luma(grey) > threshold, "grey {v}"); + } +} + +#[test] +fn an_identical_tint_target_returns_the_base_colour_s_luma() { + let base = rgb(35, 38, 41); + assert_eq!(rgb8(math::oklab_tint(base, base, 0.25)), [35, 38, 41]); +} + +// Teksilo's WCAG lift. + +#[test] +fn a_colour_that_already_passes_is_unchanged() { + let fg = rgb(35, 38, 41); + assert_eq!(lift_luma_until(fg, &[KdeColor::WHITE], 4.5), fg); +} + +#[test] +fn no_backdrop_means_no_change() { + let fg = rgb(200, 200, 200); + assert_eq!(lift_luma_until(fg, &[], 4.5), fg); +} + +#[test] +fn a_light_accent_on_white_darkens_to_the_floor_and_keeps_its_hue() { + let accent = rgb(61, 174, 233); + assert!(wcag(accent, KdeColor::WHITE) < 4.5); + let lifted = lift_luma_until(accent, &[KdeColor::WHITE], 4.5); + let contrast = wcag(lifted, KdeColor::WHITE); + assert!(contrast >= 4.5, "{lifted} reaches {contrast}"); + // The first passing step, so not much past the floor. + assert!(contrast < 4.7, "{lifted} overshoots to {contrast}"); + assert!(luma(lifted) < luma(accent)); + let (before, after) = (Hcy::from_color(accent), Hcy::from_color(lifted)); + assert!( + (before.wrapped_hue() - after.wrapped_hue()).abs() < 0.01, + "{before:?} {after:?}" + ); + assert!((before.c - after.c).abs() < 0.02, "{before:?} {after:?}"); +} + +#[test] +fn a_dark_colour_on_a_dark_backdrop_lightens() { + let fg = rgb(41, 128, 185); + let bg = rgb(20, 22, 24); + let lifted = lift_luma_until(fg, &[bg], 7.0); + assert!(wcag(lifted, bg) >= 7.0, "{lifted}"); + assert!(luma(lifted) > luma(fg)); +} + +#[test] +fn the_floor_holds_against_every_backdrop() { + let fg = rgb(150, 150, 150); + let backdrops = [KdeColor::WHITE, rgb(239, 240, 241), rgb(222, 224, 226)]; + let lifted = lift_luma_until(fg, &backdrops, 4.5); + for bg in backdrops { + assert!(wcag(lifted, bg) >= 4.5, "{lifted} on {bg}"); + } +} + +#[test] +fn an_unreachable_floor_returns_the_best_reachable_colour() { + let fg = rgb(61, 174, 233); + let grey = rgb(119, 119, 119); + let lifted = lift_luma_until(fg, &[grey], 21.0); + let best = wcag(lifted, grey); + assert!(best < 21.0); + // Black is the strongest the lift can reach on this grey, and it gets + // there: its luma end is black whatever the chroma. + assert!( + (best - wcag(KdeColor::BLACK, grey)).abs() < 1e-4, + "{lifted} reaches {best}" + ); +} + +#[test] +fn the_lift_keeps_alpha() { + let fg = KdeColor::rgba8(61, 174, 233, 200); + let lifted = lift_luma_until(fg, &[KdeColor::WHITE], 3.0); + assert_eq!(lifted.a, fg.a); + assert!(wcag(lifted, KdeColor::WHITE) >= 3.0, "{lifted}"); +} diff --git a/crates/teksilo-kde-scheme/tests/prop_math.rs b/crates/teksilo-kde-scheme/tests/prop_math.rs new file mode 100644 index 000000000..3f52511bc --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/prop_math.rs @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Property tests for the colour arithmetic +//! (crates/teksilo-kde-scheme/src/math.rs). +//! +//! Section d.5 of Teksilo's KDE specification requires the HCY conversion +//! to give back every 8-bit colour exactly; the golden vectors pin 62 +//! colours, and this suite covers the rest of the space. Each case is a +//! handful of floating-point operations, so 1024 cases per property cost +//! well under a second. Manual override knob: `PROPTEST_CASES=N cargo test +//! -p teksilo-kde-scheme --test prop_math`. +//! +//! Safe run (engineering/docs/property-testing.md): +//! +//! ```text +//! cargo test -p teksilo-kde-scheme --test prop_math --no-run +//! BIN=$(cargo test -p teksilo-kde-scheme --test prop_math --no-run --message-format=json 2>/dev/null \ +//! | jq -r 'select(.executable != null) | .executable' | tail -1) +//! ( ulimit -v 6000000 -t 300; "$BIN" --test-threads=1 ) +//! ``` + +use proptest::prelude::*; +use teksilo_kde_scheme::KdeColor; +use teksilo_kde_scheme::math::{Hcy, lift_luma_until}; +use teksilo_tokens::contrast::composite_contrast; + +/// Any 8-bit colour, alpha included. Cost: four bytes, no allocation. +fn arb_color8() -> impl Strategy { + any::<[u8; 4]>().prop_map(|[r, g, b, a]| KdeColor::rgba8(r, g, b, a)) +} + +/// Up to four opaque 8-bit backdrops. Cost: at most four colours, each +/// measured once per lift step (256 steps), so about a thousand contrast +/// computations per case. +fn arb_backdrops() -> impl Strategy> { + prop::collection::vec( + any::<[u8; 3]>().prop_map(|[r, g, b]| KdeColor::rgb8(r, g, b)), + 0..4, + ) +} + +fn worst(fg: KdeColor, backdrops: &[KdeColor]) -> f32 { + backdrops + .iter() + .map(|bg| composite_contrast(fg.to_color(), bg.to_color())) + .fold(f32::INFINITY, f32::min) +} + +// ── 1. converting an 8-bit colour to HCY and back gives the same colour, +// in all four 16-bit channels ── +proptest! { + #![proptest_config(ProptestConfig { cases: 1024, ..ProptestConfig::default() })] + + #[test] + fn every_eight_bit_colour_survives_the_hcy_round_trip(color in arb_color8()) { + let hcy = Hcy::from_color(color); + let back = hcy.to_color(); + prop_assert_eq!(back, color, "{:?} went to {:?} and came back as {:?}", color, hcy, back); + } +} + +// ── 2. the WCAG lift never makes the worst contrast over the backdrops +// lower than it was, and keeps the alpha ── +proptest! { + #[test] + fn the_luma_lift_never_lowers_the_worst_contrast( + color in arb_color8(), + backdrops in arb_backdrops(), + floor in 1.0_f32..21.0, + ) { + let lifted = lift_luma_until(color, &backdrops, floor); + let (before, after) = (worst(color, &backdrops), worst(lifted, &backdrops)); + prop_assert!( + after >= before, + "{:?} on {:?} at floor {}: worst contrast {} fell to {} ({:?})", + color, backdrops, floor, before, after, lifted, + ); + prop_assert_eq!(lifted.a, color.a, "alpha changed: {:?} became {:?}", color, lifted); + } +} diff --git a/engineering/docs/property-testing.md b/engineering/docs/property-testing.md index c14449c9f..2fec37fb3 100644 --- a/engineering/docs/property-testing.md +++ b/engineering/docs/property-testing.md @@ -411,7 +411,7 @@ being wrong. |---|---| | `teksilo-core` | [`tests/pointer_invariants.rs`](../../crates/teksilo-core/tests/pointer_invariants.rs), [`tests/prop_kinetic.rs`](../../crates/teksilo-core/tests/prop_kinetic.rs), [`tests/text_run_invariants.rs`](../../crates/teksilo-core/tests/text_run_invariants.rs) | | `teksilo-tokens` | [`tests/prop_color.rs`](../../crates/teksilo-tokens/tests/prop_color.rs) | -| `teksilo-kde-scheme` | [`tests/prop_config.rs`](../../crates/teksilo-kde-scheme/tests/prop_config.rs) | +| `teksilo-kde-scheme` | [`tests/prop_config.rs`](../../crates/teksilo-kde-scheme/tests/prop_config.rs), [`tests/prop_math.rs`](../../crates/teksilo-kde-scheme/tests/prop_math.rs) | | `teksilo-data` | [`tests/prop_list_and_selection.rs`](../../crates/teksilo-data/tests/prop_list_and_selection.rs), [`tests/prop_tree_slice.rs`](../../crates/teksilo-data/tests/prop_tree_slice.rs), [`tests/prop_tree_checked.rs`](../../crates/teksilo-data/tests/prop_tree_checked.rs), [`tests/prop_sort_filter.rs`](../../crates/teksilo-data/tests/prop_sort_filter.rs) | | `teksilo-scene` | [`src/index.rs`](../../crates/teksilo-scene/src/index.rs) (`mod proptests`, inline), [`tests/prop_selection_modes.rs`](../../crates/teksilo-scene/tests/prop_selection_modes.rs) | | `teksilo-widgets` | [`src/common/row_offsets.rs`](../../crates/teksilo-widgets/src/common/row_offsets.rs), [`src/common/row_metrics.rs`](../../crates/teksilo-widgets/src/common/row_metrics.rs), [`src/primitives/column_flow.rs`](../../crates/teksilo-widgets/src/primitives/column_flow.rs), [`src/common/column_geometry.rs`](../../crates/teksilo-widgets/src/common/column_geometry.rs), [`src/splitter/distribute.rs`](../../crates/teksilo-widgets/src/splitter/distribute.rs) (all `mod proptests`, inline) | From fa3c679bae1c71151409a776d9ae18112fa4cd5f Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 11:35:33 +0200 Subject: [PATCH 14/59] feat(kde-scheme): resolve a scheme into its palette and report it New modules effects and palette, implemented from sections c.2, c.5, e, f and i of engineering/docs/kde-breeze-spec.md, on top of the scheme model and math. effects: background_chain (intensity, then colour) and foreground_chain (contrast toward the set's background before any effect, then the background chain), apply_state_effect over a set's twelve colours, and tint_toward_selection. A disabled effect returns its inputs untouched, so nothing is re-quantised. KdeColorScheme::state_colors picks each (state, set)'s source: the stored set for Active; the [Inactive] subgroup or the set, then the Inactive effects; with ChangeSelectionColor, the Window set (its [Inactive] subgroup when present) with both backgrounds tinted 0.4 toward the stored Selection background; and for Disabled the set, the Selection set being the Window set without a tint. palette: ResolvedSet holds 8 foregrounds, 8 backgrounds (the six computed ones tinted 0.3 toward their foreground), 2 decorations and 5 shades of BackgroundNormal at the contrast value (contrast x 0.1). ResolvedPalette (PartialEq) holds 3 states by 7 sets and reads the twenty PaletteRoles, the tooltip roles always from the Active state. KdeColorScheme gains contrast_value, resolve, is_dark (the 8-bit grey (11 r + 16 g + 5 b) / 32 of the window background below 192) and os_theme_colors (accent and selection from Selection BackgroundNormal, focus from View DecorationFocus, the view, link and status colours from the View set, the window, button and tooltip colours from theirs, the scheme preference from is_dark). Tests: tests/golden_resolve.rs reads every scheme of tools/kde_golden/vectors/resolve.json from its embedded input, resolves it and compares every state, set and role, and every palette role, at 8 bits (7041 colours), failing on an empty list. The one documented divergence (b.9: an empty or unknown colour is the key's default, where KDE keeps an invalid colour) is pinned to its two occurrences, checked to give the default, and only what derives from it is skipped. It also checks the recorded contrast values, the stock constants against their vector inputs, is_dark on all thirteen schemes, and a Twilight-like scheme composed from the Breeze vectors (Breeze Dark's window over Breeze Light's views) being dark. tests/palette.rs checks the Disabled chain, the inactive selection tint and its subgroup and switch, the computed backgrounds, the shades, is_dark at the threshold, and os_theme_colors on Breeze Light and Dark against the specification's worked examples. The golden test reads files outside the crate and is excluded from the package. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 10 + crates/teksilo-kde-scheme/Cargo.toml | 1 + crates/teksilo-kde-scheme/src/effects.rs | 172 ++++++ crates/teksilo-kde-scheme/src/lib.rs | 18 +- crates/teksilo-kde-scheme/src/palette.rs | 443 +++++++++++++++ .../tests/golden_resolve.rs | 513 ++++++++++++++++++ crates/teksilo-kde-scheme/tests/palette.rs | 384 +++++++++++++ crates/teksilo-tokens/src/os_theme_colors.rs | 4 +- 8 files changed, 1542 insertions(+), 3 deletions(-) create mode 100644 crates/teksilo-kde-scheme/src/effects.rs create mode 100644 crates/teksilo-kde-scheme/src/palette.rs create mode 100644 crates/teksilo-kde-scheme/tests/golden_resolve.rs create mode 100644 crates/teksilo-kde-scheme/tests/palette.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 2aa8a2729..968a05c97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -110,6 +110,16 @@ by crate for clarity, not because crates version independently. white text KDE derives from an accent, and Plasma's OKLab accent tint. `lift_luma_until` moves a colour's luma, keeping its hue, until it meets a WCAG contrast floor on the given backgrounds. + `KdeColorScheme::resolve` gives the scheme's full palette, as KDE + applications draw it: every colour set in the active, inactive and + disabled states, with the disabled and inactive effects the scheme + configures, the inactive selection drawn from the window colours, the + six tinted backgrounds (active, link, visited, negative, neutral and + positive) and the five 3D shades, and the twenty application palette + colours (`PaletteRole`). `is_dark` tells a dark scheme from a light one by + its window background, the way KDE reports it to applications, and + `os_theme_colors` gives the colour report Teksilo's native theme is built + from. ### Changed diff --git a/crates/teksilo-kde-scheme/Cargo.toml b/crates/teksilo-kde-scheme/Cargo.toml index cc4cc6d85..f8f7eaa3f 100644 --- a/crates/teksilo-kde-scheme/Cargo.toml +++ b/crates/teksilo-kde-scheme/Cargo.toml @@ -25,6 +25,7 @@ exclude = [ "tests/fixtures/**", "tests/breeze_files.rs", "tests/golden_math.rs", + "tests/golden_resolve.rs", "tests/clean_room_vocabulary.rs", ] diff --git a/crates/teksilo-kde-scheme/src/effects.rs b/crates/teksilo-kde-scheme/src/effects.rs new file mode 100644 index 000000000..62ffb7046 --- /dev/null +++ b/crates/teksilo-kde-scheme/src/effects.rs @@ -0,0 +1,172 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Disabled and Inactive state effects: how a scheme's stored colours +//! become the colours of a disabled control or of a window without focus. +//! +//! Implemented from sections c.2, c.5 and e of Teksilo's specification +//! (`engineering/docs/kde-breeze-spec.md`). +//! +//! A state's effects ([`StateEffect`]) are three optional transformations: +//! an *intensity* change (shade, darken or lighten the luma), a *colour* +//! change (desaturate, fade toward a colour, or tint toward it) and, for +//! foregrounds only, a *contrast* change (fade or tint toward the +//! background the colour is drawn on). They run in this order: +//! +//! - a foreground or a decoration gets the contrast change first, against +//! the set's background as it was before any effect, then the intensity +//! change, then the colour change ([`foreground_chain`]); +//! - a stored background gets the intensity change, then the colour change +//! ([`background_chain`]). +//! +//! The Active state never has effects. When a state's effects are disabled +//! (`Enable=false`), every colour passes through untouched, with no colour +//! operation run on it, so it is not even re-quantised. +//! +//! [`KdeColorScheme::state_colors`] also chooses where each (state, set) +//! takes its colours from: a set's `[Inactive]` subgroup replaces it for the +//! Inactive state, and the Selection set of an inactive window is, by +//! default, the Window set with both backgrounds tinted toward the +//! selection colour ([`tint_toward_selection`]). The six computed +//! backgrounds and the palette are derived from the result in +//! [`crate::palette`]. + +use crate::color::KdeColor; +use crate::math::{darken, lighten, mix, shade, tint}; +use crate::scheme::{ + ColorEffect, ColorRole, ColorSet, ColorState, ContrastEffect, IntensityEffect, KdeColorScheme, + SetColors, StateEffect, +}; + +/// How far the backgrounds of an inactive window's selection are tinted +/// toward the selection colour when `ChangeSelectionColor` is on. +pub const SELECTION_TINT_AMOUNT: f64 = 0.4; + +/// The effects a stored background gets: the intensity change, then the +/// colour change on its result. +/// +/// - intensity: shade adds `intensity_amount` to the luma (chroma amount 0), +/// darken and lighten move the luma by `intensity_amount` toward black or +/// white (chroma factor 1); +/// - colour: desaturate scales the chroma by `1 - color_amount` (luma +/// amount 0), fade mixes toward `color` by `color_amount`, tint tints +/// toward it by `color_amount`. +/// +/// A disabled effect returns `color` unchanged. +pub fn background_chain(color: KdeColor, effect: &StateEffect) -> KdeColor { + if !effect.enabled { + return color; + } + let intensified = match effect.intensity_effect { + IntensityEffect::None => color, + IntensityEffect::Shade => shade(color, effect.intensity_amount, 0.0), + IntensityEffect::Darken => darken(color, effect.intensity_amount, 1.0), + IntensityEffect::Lighten => lighten(color, effect.intensity_amount, 1.0), + }; + match effect.color_effect { + ColorEffect::None => intensified, + ColorEffect::Desaturate => darken(intensified, 0.0, 1.0 - effect.color_amount), + ColorEffect::Fade => mix(intensified, effect.color, effect.color_amount), + ColorEffect::Tint => tint(intensified, effect.color, effect.color_amount), + } +} + +/// The effects a foreground or a decoration drawn on `background` gets: the +/// contrast change toward `background` (fade mixes, tint tints, each by +/// `contrast_amount`), then [`background_chain`] on its result. +/// +/// A disabled effect returns `color` unchanged. +pub fn foreground_chain(color: KdeColor, background: KdeColor, effect: &StateEffect) -> KdeColor { + if !effect.enabled { + return color; + } + let contrasted = match effect.contrast_effect { + ContrastEffect::None => color, + ContrastEffect::Fade => mix(color, background, effect.contrast_amount), + ContrastEffect::Tint => tint(color, background, effect.contrast_amount), + }; + background_chain(contrasted, effect) +} + +/// A set's twelve colours after `effect`. +/// +/// The eight foregrounds and two decorations each get [`foreground_chain`] +/// against the set's `BackgroundNormal` as given (before any effect); the +/// two backgrounds each get [`background_chain`]. A disabled effect returns +/// the set unchanged. +pub fn apply_state_effect(colors: &SetColors, effect: &StateEffect) -> SetColors { + if !effect.enabled { + return *colors; + } + let background = colors.background_normal; + let mut out = *colors; + for role in ColorRole::ALL { + let color = colors.get(role); + let changed = match role { + ColorRole::BackgroundNormal | ColorRole::BackgroundAlternate => { + background_chain(color, effect) + } + _ => foreground_chain(color, background, effect), + }; + out.set(role, changed); + } + out +} + +/// The Selection set of an inactive window when `ChangeSelectionColor` is +/// on: `window` with its two backgrounds tinted toward +/// `selection_background` by [`SELECTION_TINT_AMOUNT`], its foregrounds and +/// decorations kept. +pub fn tint_toward_selection(window: &SetColors, selection_background: KdeColor) -> SetColors { + let mut out = *window; + out.background_normal = tint( + window.background_normal, + selection_background, + SELECTION_TINT_AMOUNT, + ); + out.background_alternate = tint( + window.background_alternate, + selection_background, + SELECTION_TINT_AMOUNT, + ); + out +} + +impl KdeColorScheme { + /// The twelve colours of `set` in `state`, after the state's effects + /// and before the computed backgrounds. + /// + /// - Active: the stored set, unchanged. + /// - Inactive: the set's `[Inactive]` subgroup when it has one, else the + /// stored set, then the Inactive effects. The Selection set with + /// [`KdeColorScheme::change_selection_color`] on is instead the Window + /// set (its `[Inactive]` subgroup when present) passed through + /// [`tint_toward_selection`] with the stored Selection + /// `BackgroundNormal`, then the Inactive effects. + /// - Disabled: the stored set, the Selection set being the stored + /// Window set (with no tint), then the Disabled effects. + pub fn state_colors(&self, state: ColorState, set: ColorSet) -> SetColors { + match state { + ColorState::Active => *self.set(set), + ColorState::Inactive => { + let source = if set == ColorSet::Selection && self.change_selection_color { + let window = self + .inactive_set(ColorSet::Window) + .unwrap_or_else(|| self.set(ColorSet::Window)); + tint_toward_selection(window, self.set(ColorSet::Selection).background_normal) + } else { + *self.inactive_set(set).unwrap_or_else(|| self.set(set)) + }; + apply_state_effect(&source, &self.inactive_effect) + } + ColorState::Disabled => { + let source = if set == ColorSet::Selection { + self.set(ColorSet::Window) + } else { + self.set(set) + }; + apply_state_effect(source, &self.disabled_effect) + } + } + } +} diff --git a/crates/teksilo-kde-scheme/src/lib.rs b/crates/teksilo-kde-scheme/src/lib.rs index 0d448b1b6..63a726eb9 100644 --- a/crates/teksilo-kde-scheme/src/lib.rs +++ b/crates/teksilo-kde-scheme/src/lib.rs @@ -10,14 +10,18 @@ //! `kdeglobals` ([`scheme`]), Qt's font descriptions ([`fonts`]) and the //! desktop settings built from all of them ([`desktop`]). [`math`] holds //! the colour arithmetic KDE derives its palettes with, reproduced to the -//! byte KDE writes. +//! byte KDE writes; [`effects`] the Disabled and Inactive state effects +//! built on it, and [`palette`] the resolved palette of every state and set +//! ([`KdeColorScheme::resolve`]), the light or dark decision +//! ([`KdeColorScheme::is_dark`]) and the colour report Teksilo's native +//! theme reads ([`KdeColorScheme::os_theme_colors`]). //! //! It does no I/O. The environment is passed in as a getter and files are //! passed in as text, so everything here runs the same in a test as on a //! desktop: //! //! ``` -//! use teksilo_kde_scheme::{KConfig, KdeColorScheme, KdeConfigLocations}; +//! use teksilo_kde_scheme::{ColorState, KConfig, KdeColorScheme, KdeConfigLocations, PaletteRole}; //! //! let env = |name: &str| match name { //! "HOME" => Some("/home/ada".to_owned()), @@ -37,6 +41,11 @@ //! //! let scheme = KdeColorScheme::breeze_dark(); //! assert_eq!(scheme.contrast, 4); +//! assert!(scheme.is_dark()); +//! +//! let palette = scheme.resolve(); +//! let window = palette.role(ColorState::Active, PaletteRole::Window); +//! assert_eq!(window.to_rgba8(), [32, 35, 38, 255]); //! ``` //! //! The behaviour is implemented from Teksilo's written specification of @@ -48,9 +57,11 @@ pub mod color; pub mod config; pub mod desktop; +pub mod effects; pub mod fonts; pub mod locations; pub mod math; +pub mod palette; pub mod scheme; pub use color::KdeColor; @@ -62,6 +73,9 @@ pub use desktop::{ pub use fonts::{FontStyle, KdeFont}; pub use locations::{ConfigLayerPath, KdeConfigLocations, is_kde_session}; pub use math::{FloatColor, Hcy, ShadeRole}; +pub use palette::{ + BackgroundRole, DecorationRole, ForegroundRole, PaletteRole, ResolvedPalette, ResolvedSet, +}; pub use scheme::{ ColorEffect, ColorRole, ColorSet, ColorState, ContrastEffect, IntensityEffect, KdeColorScheme, SetColors, StateEffect, WmColors, diff --git a/crates/teksilo-kde-scheme/src/palette.rs b/crates/teksilo-kde-scheme/src/palette.rs new file mode 100644 index 000000000..124657ed7 --- /dev/null +++ b/crates/teksilo-kde-scheme/src/palette.rs @@ -0,0 +1,443 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! A scheme resolved into the colours an application draws with. +//! +//! Implemented from sections f and i of Teksilo's specification +//! (`engineering/docs/kde-breeze-spec.md`). +//! +//! [`KdeColorScheme::resolve`] gives a [`ResolvedPalette`]: for each of the +//! three states and seven sets, a [`ResolvedSet`] of +//! +//! - 8 foregrounds ([`ForegroundRole`]), as stored and after the state's +//! effects ([`crate::effects`]); +//! - 8 backgrounds ([`BackgroundRole`]): the two stored ones after the +//! effects, and six computed ones, each the `Normal` background tinted +//! toward one of the foregrounds by [`COMPUTED_BACKGROUND_TINT`]; +//! - 2 decorations ([`DecorationRole`]); +//! - 5 shades ([`ShadeRole`]) of the `Normal` background, at the scheme's +//! contrast value ([`KdeColorScheme::contrast_value`]). +//! +//! [`PaletteRole`] names the twenty colours an application palette takes +//! from those sets, read with [`ResolvedPalette::role`]. +//! +//! [`KdeColorScheme::is_dark`] is the light or dark decision KDE reports to +//! applications and portals, and [`KdeColorScheme::os_theme_colors`] the +//! report Teksilo's native theme builds its tokens from. + +use teksilo_tokens::{ColorSchemePreference, OsThemeColors}; + +use crate::color::KdeColor; +use crate::math::{ShadeRole, shade_role, tint}; +use crate::scheme::{ColorRole, ColorSet, ColorState, KdeColorScheme, SetColors}; + +/// How far each computed background is tinted from the `Normal` background +/// toward its foreground. +pub const COMPUTED_BACKGROUND_TINT: f64 = 0.3; + +/// One of the eight foregrounds of a resolved set. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum ForegroundRole { + /// Ordinary text, `ForegroundNormal`. + Normal, + /// Secondary text, `ForegroundInactive`. + Inactive, + /// Active or hot text, `ForegroundActive`. + Active, + /// An unvisited link, `ForegroundLink`. + Link, + /// A visited link, `ForegroundVisited`. + Visited, + /// Errors, `ForegroundNegative`. + Negative, + /// Warnings, `ForegroundNeutral`. + Neutral, + /// Success, `ForegroundPositive`. + Positive, +} + +impl ForegroundRole { + /// The eight foregrounds, in declaration order. + pub const ALL: [ForegroundRole; 8] = [ + ForegroundRole::Normal, + ForegroundRole::Inactive, + ForegroundRole::Active, + ForegroundRole::Link, + ForegroundRole::Visited, + ForegroundRole::Negative, + ForegroundRole::Neutral, + ForegroundRole::Positive, + ]; + + /// The stored key the foreground comes from. + pub const fn stored_role(self) -> ColorRole { + match self { + ForegroundRole::Normal => ColorRole::ForegroundNormal, + ForegroundRole::Inactive => ColorRole::ForegroundInactive, + ForegroundRole::Active => ColorRole::ForegroundActive, + ForegroundRole::Link => ColorRole::ForegroundLink, + ForegroundRole::Visited => ColorRole::ForegroundVisited, + ForegroundRole::Negative => ColorRole::ForegroundNegative, + ForegroundRole::Neutral => ColorRole::ForegroundNeutral, + ForegroundRole::Positive => ColorRole::ForegroundPositive, + } + } + + const fn index(self) -> usize { + self as usize + } +} + +/// One of the eight backgrounds of a resolved set. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum BackgroundRole { + /// The ordinary background, `BackgroundNormal`. + Normal, + /// Alternate rows, `BackgroundAlternate`. + Alternate, + /// Computed: `Normal` tinted toward [`ForegroundRole::Active`]. + Active, + /// Computed: `Normal` tinted toward [`ForegroundRole::Link`]. + Link, + /// Computed: `Normal` tinted toward [`ForegroundRole::Visited`]. + Visited, + /// Computed: `Normal` tinted toward [`ForegroundRole::Negative`]. + Negative, + /// Computed: `Normal` tinted toward [`ForegroundRole::Neutral`]. + Neutral, + /// Computed: `Normal` tinted toward [`ForegroundRole::Positive`]. + Positive, +} + +impl BackgroundRole { + /// The eight backgrounds, in declaration order. + pub const ALL: [BackgroundRole; 8] = [ + BackgroundRole::Normal, + BackgroundRole::Alternate, + BackgroundRole::Active, + BackgroundRole::Link, + BackgroundRole::Visited, + BackgroundRole::Negative, + BackgroundRole::Neutral, + BackgroundRole::Positive, + ]; + + /// The foreground a computed background is tinted toward, `None` for + /// the two stored backgrounds. + pub const fn tinted_toward(self) -> Option { + match self { + BackgroundRole::Normal | BackgroundRole::Alternate => None, + BackgroundRole::Active => Some(ForegroundRole::Active), + BackgroundRole::Link => Some(ForegroundRole::Link), + BackgroundRole::Visited => Some(ForegroundRole::Visited), + BackgroundRole::Negative => Some(ForegroundRole::Negative), + BackgroundRole::Neutral => Some(ForegroundRole::Neutral), + BackgroundRole::Positive => Some(ForegroundRole::Positive), + } + } + + const fn index(self) -> usize { + self as usize + } +} + +/// One of the two decorations of a resolved set. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum DecorationRole { + /// The keyboard focus indicator, `DecorationFocus`. + Focus, + /// The hover indicator, `DecorationHover`. + Hover, +} + +impl DecorationRole { + /// Both decorations. + pub const ALL: [DecorationRole; 2] = [DecorationRole::Focus, DecorationRole::Hover]; + + const fn index(self) -> usize { + self as usize + } +} + +const fn shade_index(role: ShadeRole) -> usize { + match role { + ShadeRole::Light => 0, + ShadeRole::Midlight => 1, + ShadeRole::Mid => 2, + ShadeRole::Dark => 3, + ShadeRole::Shadow => 4, + } +} + +/// The colours of one set in one state, every effect applied and every +/// derived colour computed. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct ResolvedSet { + foregrounds: [KdeColor; 8], + backgrounds: [KdeColor; 8], + decorations: [KdeColor; 2], + shades: [KdeColor; 5], +} + +impl ResolvedSet { + /// Completes a set's twelve colours, already through the state's + /// effects ([`KdeColorScheme::state_colors`]): the six computed + /// backgrounds and the five shades of `BackgroundNormal` at + /// `contrast_value` (the scheme's `contrast` divided by 10). + pub fn from_state_colors(colors: &SetColors, contrast_value: f64) -> ResolvedSet { + let foregrounds = ForegroundRole::ALL.map(|role| colors.get(role.stored_role())); + let normal = colors.background_normal; + let backgrounds = BackgroundRole::ALL.map(|role| match (role, role.tinted_toward()) { + (BackgroundRole::Normal, _) => normal, + (_, Some(foreground)) => tint( + normal, + foregrounds[foreground.index()], + COMPUTED_BACKGROUND_TINT, + ), + (_, None) => colors.background_alternate, + }); + ResolvedSet { + foregrounds, + backgrounds, + decorations: [colors.decoration_focus, colors.decoration_hover], + shades: ShadeRole::ALL.map(|role| shade_role(normal, role, contrast_value, 0.0)), + } + } + + /// The foreground of `role`. + pub const fn foreground(&self, role: ForegroundRole) -> KdeColor { + self.foregrounds[role.index()] + } + + /// The background of `role`. + pub const fn background(&self, role: BackgroundRole) -> KdeColor { + self.backgrounds[role.index()] + } + + /// The decoration of `role`. + pub const fn decoration(&self, role: DecorationRole) -> KdeColor { + self.decorations[role.index()] + } + + /// The shade of `BackgroundNormal` for `role`. + pub const fn shade(&self, role: ShadeRole) -> KdeColor { + self.shades[shade_index(role)] + } +} + +/// A colour of an application palette, and the resolved set it is read +/// from. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum PaletteRole { + /// Window background: Window `BackgroundNormal`. + Window, + /// Text on the window: Window `ForegroundNormal`. + WindowText, + /// Content-view background: View `BackgroundNormal`. + Base, + /// Content-view text: View `ForegroundNormal`. + Text, + /// Alternate rows: View `BackgroundAlternate`. + AlternateBase, + /// Unvisited links: View `ForegroundLink`. + Link, + /// Visited links: View `ForegroundVisited`. + LinkVisited, + /// Placeholder text in an empty field: View `ForegroundInactive`. + PlaceholderText, + /// Button background: Button `BackgroundNormal`. + Button, + /// Button text: Button `ForegroundNormal`. + ButtonText, + /// Selection background: Selection `BackgroundNormal`. + Highlight, + /// Selected text: Selection `ForegroundNormal`. + HighlightedText, + /// The accent colour, the same as [`PaletteRole::Highlight`]. + Accent, + /// Tooltip background: Tooltip `BackgroundNormal` of the Active state, + /// whatever state is asked for. + TooltipBase, + /// Tooltip text: Tooltip `ForegroundNormal` of the Active state, + /// whatever state is asked for. + TooltipText, + /// The light shade of the Window `BackgroundNormal`. + Light, + /// The midlight shade of the Window `BackgroundNormal`. + Midlight, + /// The mid shade of the Window `BackgroundNormal`. + Mid, + /// The dark shade of the Window `BackgroundNormal`. + Dark, + /// The shadow shade of the Window `BackgroundNormal`. + Shadow, +} + +impl PaletteRole { + /// Every palette role, in declaration order. + pub const ALL: [PaletteRole; 20] = [ + PaletteRole::Window, + PaletteRole::WindowText, + PaletteRole::Base, + PaletteRole::Text, + PaletteRole::AlternateBase, + PaletteRole::Link, + PaletteRole::LinkVisited, + PaletteRole::PlaceholderText, + PaletteRole::Button, + PaletteRole::ButtonText, + PaletteRole::Highlight, + PaletteRole::HighlightedText, + PaletteRole::Accent, + PaletteRole::TooltipBase, + PaletteRole::TooltipText, + PaletteRole::Light, + PaletteRole::Midlight, + PaletteRole::Mid, + PaletteRole::Dark, + PaletteRole::Shadow, + ]; +} + +/// Every colour of a scheme, resolved for the three states and seven sets. +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ResolvedPalette { + /// Indexed by [`ColorState::index`], then [`ColorSet::index`]. + sets: [[ResolvedSet; 7]; 3], +} + +impl ResolvedPalette { + /// The resolved colours of `set` in `state`. + pub const fn set(&self, state: ColorState, set: ColorSet) -> &ResolvedSet { + &self.sets[state.index()][set.index()] + } + + /// The palette colour of `role` in `state`. + pub const fn role(&self, state: ColorState, role: PaletteRole) -> KdeColor { + let window = self.set(state, ColorSet::Window); + let view = self.set(state, ColorSet::View); + let button = self.set(state, ColorSet::Button); + let selection = self.set(state, ColorSet::Selection); + let tooltip = self.set(ColorState::Active, ColorSet::Tooltip); + match role { + PaletteRole::Window => window.background(BackgroundRole::Normal), + PaletteRole::WindowText => window.foreground(ForegroundRole::Normal), + PaletteRole::Base => view.background(BackgroundRole::Normal), + PaletteRole::Text => view.foreground(ForegroundRole::Normal), + PaletteRole::AlternateBase => view.background(BackgroundRole::Alternate), + PaletteRole::Link => view.foreground(ForegroundRole::Link), + PaletteRole::LinkVisited => view.foreground(ForegroundRole::Visited), + PaletteRole::PlaceholderText => view.foreground(ForegroundRole::Inactive), + PaletteRole::Button => button.background(BackgroundRole::Normal), + PaletteRole::ButtonText => button.foreground(ForegroundRole::Normal), + PaletteRole::Highlight | PaletteRole::Accent => { + selection.background(BackgroundRole::Normal) + } + PaletteRole::HighlightedText => selection.foreground(ForegroundRole::Normal), + PaletteRole::TooltipBase => tooltip.background(BackgroundRole::Normal), + PaletteRole::TooltipText => tooltip.foreground(ForegroundRole::Normal), + PaletteRole::Light => window.shade(ShadeRole::Light), + PaletteRole::Midlight => window.shade(ShadeRole::Midlight), + PaletteRole::Mid => window.shade(ShadeRole::Mid), + PaletteRole::Dark => window.shade(ShadeRole::Dark), + PaletteRole::Shadow => window.shade(ShadeRole::Shadow), + } + } +} + +/// The 8-bit grey level below which a window background counts as dark. +pub const DARK_GRAY_THRESHOLD: u32 = 192; + +impl KdeColorScheme { + /// The contrast value the shades are computed with: `[KDE] contrast` + /// times 0.1, unclamped here (0.4 for Breeze, 0.7 by default). + pub fn contrast_value(&self) -> f64 { + 0.1 * f64::from(self.contrast) + } + + /// Resolves every set in every state: the state's colour source and + /// effects ([`KdeColorScheme::state_colors`]), then the computed + /// backgrounds and shades ([`ResolvedSet::from_state_colors`]). + /// + /// The Tooltip set is resolved in every state too, although the palette + /// roles read only its Active colours. + pub fn resolve(&self) -> ResolvedPalette { + let k = self.contrast_value(); + ResolvedPalette { + sets: ColorState::ALL.map(|state| { + ColorSet::ALL + .map(|set| ResolvedSet::from_state_colors(&self.state_colors(state, set), k)) + }), + } + } + + /// Whether the scheme is dark, as KDE reports it to applications and + /// to the desktop portal. + /// + /// The Window `BackgroundNormal` of the Active state (which no effect + /// changes) is reduced to 8-bit channels `r`, `g`, `b`, and its grey + /// level `(11 r + 16 g + 5 b) / 32` (integer division) is compared with + /// [`DARK_GRAY_THRESHOLD`]: below it, the scheme is dark. Only the + /// window decides: a dark window with light content views is dark. + pub fn is_dark(&self) -> bool { + let [r, g, b, _] = self.set(ColorSet::Window).background_normal.to_rgba8(); + let gray = (11 * u32::from(r) + 16 * u32::from(g) + 5 * u32::from(b)) / 32; + gray < DARK_GRAY_THRESHOLD + } + + /// The scheme as the colour report Teksilo's native theme is built + /// from, every colour taken from the Active state: + /// + /// | Field | Source | + /// |---|---| + /// | `color_scheme` | [`KdeColorScheme::is_dark`] | + /// | `accent`, `selection_bg` | Selection `BackgroundNormal` | + /// | `selection_fg` | Selection `ForegroundNormal` | + /// | `window_bg`, `window_fg` | Window `BackgroundNormal`, `ForegroundNormal` | + /// | `button_bg`, `button_fg` | Button `BackgroundNormal`, `ForegroundNormal` | + /// | `tooltip_bg`, `tooltip_fg` | Tooltip `BackgroundNormal`, `ForegroundNormal` | + /// | `view_bg`, `view_fg` | View `BackgroundNormal`, `ForegroundNormal` | + /// | `alternate_bg` | View `BackgroundAlternate` | + /// | `inactive_fg` | View `ForegroundInactive` | + /// | `link`, `link_visited` | View `ForegroundLink`, `ForegroundVisited` | + /// | `error`, `warning`, `success` | View `ForegroundNegative`, `ForegroundNeutral`, `ForegroundPositive` | + /// | `focus` | View `DecorationFocus` | + /// + /// The accent is the selection colour, as KDE's application palette + /// and the portal's accent colour both report it. + pub fn os_theme_colors(&self) -> OsThemeColors { + let scheme = if self.is_dark() { + ColorSchemePreference::Dark + } else { + ColorSchemePreference::Light + }; + let some = |color: KdeColor| Some(color.to_color()); + let view = self.set(ColorSet::View); + let window = self.set(ColorSet::Window); + let button = self.set(ColorSet::Button); + let selection = self.set(ColorSet::Selection); + let tooltip = self.set(ColorSet::Tooltip); + + let mut os = OsThemeColors::new(scheme); + os.accent = some(selection.background_normal); + os.window_bg = some(window.background_normal); + os.window_fg = some(window.foreground_normal); + os.button_bg = some(button.background_normal); + os.button_fg = some(button.foreground_normal); + os.selection_bg = some(selection.background_normal); + os.selection_fg = some(selection.foreground_normal); + os.tooltip_bg = some(tooltip.background_normal); + os.tooltip_fg = some(tooltip.foreground_normal); + os.view_bg = some(view.background_normal); + os.view_fg = some(view.foreground_normal); + os.alternate_bg = some(view.background_alternate); + os.inactive_fg = some(view.foreground_inactive); + os.link = some(view.foreground_link); + os.link_visited = some(view.foreground_visited); + os.error = some(view.foreground_negative); + os.warning = some(view.foreground_neutral); + os.success = some(view.foreground_positive); + os.focus = some(view.decoration_focus); + os + } +} diff --git a/crates/teksilo-kde-scheme/tests/golden_resolve.rs b/crates/teksilo-kde-scheme/tests/golden_resolve.rs new file mode 100644 index 000000000..032300b16 --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/golden_resolve.rs @@ -0,0 +1,513 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Resolved palettes against the golden vectors +//! `tools/kde_golden/vectors/resolve.json`, measured from KDE's own +//! libraries and Qt 6.11.1. +//! +//! Each scheme of the vectors carries its input (the configuration text of +//! a synthetic scheme, the parsed groups of an installed one), so the +//! scheme is read from that input here and resolved, and every colour is +//! compared at 8 bits: for every state and set, the 8 foregrounds, the 8 +//! backgrounds, the 2 decorations and the 5 shades, and for every state +//! the 20 palette roles. +//! +//! One documented divergence is left out of the comparison: where a scheme +//! stores an empty or unknown colour, KDE resolves an invalid colour and +//! Teksilo uses the key's default instead (section b.9 of the +//! specification). The vectors record such a colour as `{"valid": false}`. +//! The test pins the exact list of those stored colours, checks that +//! Teksilo gives their default, and skips only what derives from them: that +//! foreground in each state, the background tinted toward it and the +//! palette role read from it. +//! +//! The vectors live outside the crate, so this file is left out of the +//! published package (the `exclude` list in `Cargo.toml`). + +use serde_json::Value; +use teksilo_kde_scheme::{ + BackgroundRole, ColorSet, ColorState, DecorationRole, ForegroundRole, KdeColor, KdeColorScheme, + PaletteRole, ShadeRole, +}; + +const RESOLVE_JSON: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../tools/kde_golden/vectors/resolve.json" +)); + +fn vectors() -> Value { + serde_json::from_str(RESOLVE_JSON).expect("resolve.json parses") +} + +fn schemes(all: &Value) -> &[Value] { + let list = all["schemes"] + .as_array() + .expect("resolve.json has a list of schemes"); + assert!(!list.is_empty(), "resolve.json lists no scheme"); + list +} + +fn name(scheme: &Value) -> &str { + scheme["name"].as_str().expect("a scheme has a name") +} + +fn find<'a>(all: &'a Value, wanted: &str) -> &'a Value { + schemes(all) + .iter() + .find(|s| name(s) == wanted) + .unwrap_or_else(|| panic!("resolve.json has no scheme {wanted}")) +} + +/// The configuration text of a scheme's input: the verbatim text of a +/// synthetic scheme, or the groups of an installed one written back as +/// text. A nested group is recorded with its path joined by `][`, so +/// bracketing the recorded name gives the header line. +fn input_text(scheme: &Value) -> String { + if let Some(text) = scheme["source_text"].as_str() { + return text.to_owned(); + } + let groups = scheme["input"].as_object().expect("an input object"); + assert!(!groups.is_empty(), "{} has an empty input", name(scheme)); + let mut out = String::new(); + for (group, entries) in groups { + out.push('['); + out.push_str(group); + out.push_str("]\n"); + for (key, value) in entries.as_object().expect("a group object") { + out.push_str(key); + out.push('='); + out.push_str(value.as_str().expect("a value is a string")); + out.push('\n'); + } + out.push('\n'); + } + out +} + +fn read_scheme(scheme: &Value) -> KdeColorScheme { + KdeColorScheme::parse(&input_text(scheme)).0 +} + +fn hex(c: KdeColor) -> String { + let [r, g, b, a] = c.to_rgba8(); + format!("#{r:02x}{g:02x}{b:02x}{a:02x}") +} + +/// A golden `{hex, u16}` colour's 8-bit hex, checked to be the 8-bit +/// projection of its 16-bit channels. +fn golden_hex(value: &Value) -> String { + let want = value["hex"].as_str().expect("a hex string").to_owned(); + let channels: Vec = value["u16"] + .as_array() + .expect("a u16 list") + .iter() + .map(|v| u16::try_from(v.as_u64().expect("an integer")).expect("16 bits")) + .collect(); + let from_u16 = KdeColor::rgba16(channels[0], channels[1], channels[2], channels[3]); + assert_eq!(hex(from_u16), want, "golden hex and u16 disagree"); + want +} + +fn state_key(state: ColorState) -> &'static str { + match state { + ColorState::Active => "Active", + ColorState::Inactive => "Inactive", + ColorState::Disabled => "Disabled", + } +} + +fn set_key(set: ColorSet) -> &'static str { + match set { + ColorSet::View => "View", + ColorSet::Window => "Window", + ColorSet::Button => "Button", + ColorSet::Selection => "Selection", + ColorSet::Tooltip => "Tooltip", + ColorSet::Complementary => "Complementary", + ColorSet::Header => "Header", + } +} + +fn foreground_key(role: ForegroundRole) -> &'static str { + match role { + ForegroundRole::Normal => "Normal", + ForegroundRole::Inactive => "Inactive", + ForegroundRole::Active => "Active", + ForegroundRole::Link => "Link", + ForegroundRole::Visited => "Visited", + ForegroundRole::Negative => "Negative", + ForegroundRole::Neutral => "Neutral", + ForegroundRole::Positive => "Positive", + } +} + +fn background_key(role: BackgroundRole) -> &'static str { + match role { + BackgroundRole::Normal => "Normal", + BackgroundRole::Alternate => "Alternate", + BackgroundRole::Active => "Active", + BackgroundRole::Link => "Link", + BackgroundRole::Visited => "Visited", + BackgroundRole::Negative => "Negative", + BackgroundRole::Neutral => "Neutral", + BackgroundRole::Positive => "Positive", + } +} + +fn decoration_key(role: DecorationRole) -> &'static str { + match role { + DecorationRole::Focus => "Focus", + DecorationRole::Hover => "Hover", + } +} + +fn shade_key(role: ShadeRole) -> &'static str { + match role { + ShadeRole::Light => "Light", + ShadeRole::Midlight => "Midlight", + ShadeRole::Mid => "Mid", + ShadeRole::Dark => "Dark", + ShadeRole::Shadow => "Shadow", + } +} + +fn palette_key(role: PaletteRole) -> &'static str { + match role { + PaletteRole::Window => "Window", + PaletteRole::WindowText => "WindowText", + PaletteRole::Base => "Base", + PaletteRole::Text => "Text", + PaletteRole::AlternateBase => "AlternateBase", + PaletteRole::Link => "Link", + PaletteRole::LinkVisited => "LinkVisited", + PaletteRole::PlaceholderText => "PlaceholderText", + PaletteRole::Button => "Button", + PaletteRole::ButtonText => "ButtonText", + PaletteRole::Highlight => "Highlight", + PaletteRole::HighlightedText => "HighlightedText", + PaletteRole::Accent => "Accent", + PaletteRole::TooltipBase => "ToolTipBase", + PaletteRole::TooltipText => "ToolTipText", + PaletteRole::Light => "Light", + PaletteRole::Midlight => "Midlight", + PaletteRole::Mid => "Mid", + PaletteRole::Dark => "Dark", + PaletteRole::Shadow => "Shadow", + } +} + +fn check(failures: &mut Vec, what: String, got: KdeColor, expected: &Value) { + let want = golden_hex(expected); + if hex(got) != want { + failures.push(format!("{what}: got {}, expected {want}", hex(got))); + } +} + +fn is_invalid(value: &Value) -> bool { + value["valid"] == Value::Bool(false) +} + +/// The stored foregrounds KDE resolves as an invalid colour, as (set, +/// foreground) pairs: the Active colour of the set is recorded invalid. +/// Any other invalid Active colour (a background or a decoration) fails, +/// since the skipping rule below would not cover what derives from it. +fn divergent_foregrounds(scheme: &Value) -> Vec<(ColorSet, ForegroundRole)> { + let mut out = Vec::new(); + for set in ColorSet::ALL { + let active = &scheme["sets"][set_key(set)]["Active"]; + for role in ForegroundRole::ALL { + if is_invalid(&active["foreground"][foreground_key(role)]) { + out.push((set, role)); + } + } + for role in BackgroundRole::ALL { + assert!( + !is_invalid(&active["background"][background_key(role)]), + "{} {} background {} is invalid", + name(scheme), + set_key(set), + background_key(role) + ); + } + for role in DecorationRole::ALL { + assert!( + !is_invalid(&active["decoration"][decoration_key(role)]), + "{} {} decoration {} is invalid", + name(scheme), + set_key(set), + decoration_key(role) + ); + } + } + out +} + +/// The set and foreground a palette role reads, for the roles read from a +/// foreground. +fn palette_foreground(role: PaletteRole) -> Option<(ColorSet, ForegroundRole)> { + match role { + PaletteRole::WindowText => Some((ColorSet::Window, ForegroundRole::Normal)), + PaletteRole::Text => Some((ColorSet::View, ForegroundRole::Normal)), + PaletteRole::Link => Some((ColorSet::View, ForegroundRole::Link)), + PaletteRole::LinkVisited => Some((ColorSet::View, ForegroundRole::Visited)), + PaletteRole::PlaceholderText => Some((ColorSet::View, ForegroundRole::Inactive)), + PaletteRole::ButtonText => Some((ColorSet::Button, ForegroundRole::Normal)), + PaletteRole::HighlightedText => Some((ColorSet::Selection, ForegroundRole::Normal)), + PaletteRole::TooltipText => Some((ColorSet::Tooltip, ForegroundRole::Normal)), + _ => None, + } +} + +#[test] +fn the_invalid_colours_are_exactly_the_known_ones_and_take_their_default() { + let all = vectors(); + let mut found = Vec::new(); + for scheme in schemes(&all) { + for (set, role) in divergent_foregrounds(scheme) { + found.push((name(scheme).to_owned(), set, role)); + } + } + assert_eq!( + found, + vec![ + // `ForegroundLink=` (an empty value). + ( + "SyntheticMalformed".to_owned(), + ColorSet::View, + ForegroundRole::Link + ), + // `ForegroundVisited=rebeccapurple`, not an SVG 1.1 keyword. + ( + "SyntheticValueForms".to_owned(), + ColorSet::View, + ForegroundRole::Visited + ), + ] + ); + let view_default = KdeColorScheme::kcolorscheme_defaults(); + let view_default = view_default.set(ColorSet::View); + let malformed = read_scheme(find(&all, "SyntheticMalformed")); + assert_eq!( + malformed.set(ColorSet::View).foreground_link, + view_default.foreground_link + ); + let forms = read_scheme(find(&all, "SyntheticValueForms")); + assert_eq!( + forms.set(ColorSet::View).foreground_visited, + view_default.foreground_visited + ); +} + +#[test] +fn every_scheme_resolves_to_the_golden_colours() { + let all = vectors(); + let mut failures = Vec::new(); + let mut compared = 0_usize; + for scheme in schemes(&all) { + let n = name(scheme); + let palette = read_scheme(scheme).resolve(); + let divergent = divergent_foregrounds(scheme); + for state in ColorState::ALL { + let sk = state_key(state); + for set in ColorSet::ALL { + let golden = &scheme["sets"][set_key(set)][sk]; + assert!(golden.is_object(), "{n} has no {} {sk} set", set_key(set)); + let got = palette.set(state, set); + let at = |kind: &str, key: &str| format!("{n} {sk} {} {kind} {key}", set_key(set)); + for role in ForegroundRole::ALL { + if divergent.contains(&(set, role)) { + continue; + } + let key = foreground_key(role); + check( + &mut failures, + at("foreground", key), + got.foreground(role), + &golden["foreground"][key], + ); + compared += 1; + } + for role in BackgroundRole::ALL { + if role + .tinted_toward() + .is_some_and(|f| divergent.contains(&(set, f))) + { + continue; + } + let key = background_key(role); + check( + &mut failures, + at("background", key), + got.background(role), + &golden["background"][key], + ); + compared += 1; + } + for role in DecorationRole::ALL { + let key = decoration_key(role); + check( + &mut failures, + at("decoration", key), + got.decoration(role), + &golden["decoration"][key], + ); + compared += 1; + } + for role in ShadeRole::ALL { + let key = shade_key(role); + check( + &mut failures, + at("shade", key), + got.shade(role), + &golden["shade"][key], + ); + compared += 1; + } + } + let golden = &scheme["palette"][sk]; + for role in PaletteRole::ALL { + if palette_foreground(role).is_some_and(|pair| divergent.contains(&pair)) { + continue; + } + let key = palette_key(role); + check( + &mut failures, + format!("{n} {sk} palette {key}"), + palette.role(state, role), + &golden[key], + ); + compared += 1; + } + // The one role the palette does not take from the scheme: KDE + // leaves it at the toolkit's opaque white. + assert_eq!(golden_hex(&golden["BrightText"]), "#ffffffff"); + } + } + assert!(compared > 0, "nothing was compared"); + assert!( + failures.is_empty(), + "{} of {compared} colours differ:\n{}", + failures.len(), + failures.join("\n") + ); +} + +#[test] +fn every_golden_set_and_palette_role_is_compared() { + let all = vectors(); + let scheme = &schemes(&all)[0]; + let set = &scheme["sets"]["Window"]["Active"]; + let count = |v: &Value| v.as_object().expect("an object").len(); + assert_eq!(count(&scheme["sets"]), ColorSet::ALL.len()); + assert_eq!(count(&scheme["sets"]["Window"]), ColorState::ALL.len()); + assert_eq!(count(&set["foreground"]), ForegroundRole::ALL.len()); + assert_eq!(count(&set["background"]), BackgroundRole::ALL.len()); + assert_eq!(count(&set["decoration"]), DecorationRole::ALL.len()); + assert_eq!(count(&set["shade"]), ShadeRole::ALL.len()); + // The twenty roles and the white BrightText. + assert_eq!( + count(&scheme["palette"]["Active"]), + PaletteRole::ALL.len() + 1 + ); +} + +#[test] +fn the_contrast_value_is_the_recorded_one() { + let all = vectors(); + for scheme in schemes(&all) { + let want = scheme["contrastF"].as_f64().expect("contrastF is a number"); + let got = read_scheme(scheme).contrast_value(); + assert_eq!(got, want, "{}", name(scheme)); + } +} + +#[test] +fn the_stock_constants_resolve_like_the_vectors() { + let all = vectors(); + for (wanted, constant) in [ + ("BreezeLight", KdeColorScheme::breeze_light()), + ("BreezeDark", KdeColorScheme::breeze_dark()), + ("BreezeClassic", KdeColorScheme::breeze_classic()), + ] { + assert_eq!( + constant.resolve(), + read_scheme(find(&all, wanted)).resolve(), + "{wanted}" + ); + } + assert_eq!( + KdeColorScheme::kcolorscheme_defaults().resolve(), + read_scheme(find(&all, "SyntheticEmpty")).resolve() + ); +} + +/// Whether each scheme is dark. Only the Active window background decides. +#[test] +fn is_dark_follows_the_window_background() { + let all = vectors(); + let expected = [ + ("BreezeLight", false), + ("BreezeDark", true), + ("BreezeClassic", false), + ("Oxygen", false), + ("OxygenCold", false), + ("OxygenDark", true), + ("SyntheticNoHeader", false), + ("SyntheticInactiveEffects", true), + ("SyntheticInactiveSubgroups", false), + ("SyntheticAccentKeys", false), + ("SyntheticEmpty", false), + ("SyntheticMalformed", false), + // Window 200,190,180: grey (2200 + 3040 + 900) / 32 = 191, just + // below the threshold. + ("SyntheticValueForms", true), + ]; + assert_eq!(expected.len(), schemes(&all).len(), "a scheme is unlisted"); + for (wanted, dark) in expected { + assert_eq!(read_scheme(find(&all, wanted)).is_dark(), dark, "{wanted}"); + } +} + +/// The input of `base` with one group replaced by the same group of +/// `donor`. +fn with_group_from(base: &Value, donor: &Value, group: &str) -> KdeColorScheme { + let mut mixed = base.clone(); + mixed["input"][group] = donor["input"][group].clone(); + read_scheme(&mixed) +} + +/// A Twilight-like scheme (Breeze Light with Breeze Dark's window) is dark +/// although its content views are light, and the reverse is light. +#[test] +fn is_dark_ignores_the_content_views() { + let all = vectors(); + let light = find(&all, "BreezeLight"); + let dark = find(&all, "BreezeDark"); + + let twilight = with_group_from(light, dark, "Colors:Window"); + assert_eq!( + twilight.set(ColorSet::Window).background_normal.to_rgba8(), + [32, 35, 38, 255] + ); + assert_eq!( + twilight.set(ColorSet::View).background_normal.to_rgba8(), + [255, 255, 255, 255] + ); + assert!(twilight.is_dark()); + + let reverse = with_group_from(dark, light, "Colors:Window"); + assert_eq!( + reverse.set(ColorSet::View).background_normal.to_rgba8(), + [20, 22, 24, 255] + ); + assert!(!reverse.is_dark()); + + // SyntheticMalformed's window is a light grey under a saturated orange + // view. + let malformed = read_scheme(find(&all, "SyntheticMalformed")); + assert_eq!( + malformed.set(ColorSet::View).background_normal.to_rgba8(), + [255, 136, 0, 255] + ); + assert!(!malformed.is_dark()); +} diff --git a/crates/teksilo-kde-scheme/tests/palette.rs b/crates/teksilo-kde-scheme/tests/palette.rs new file mode 100644 index 000000000..6911d8417 --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/palette.rs @@ -0,0 +1,384 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! State effects, the resolved palette, the dark predicate and the colour +//! report, on the stock Breeze schemes and on schemes built to exercise one +//! rule each. The expected 8-bit values are the specification's worked +//! examples (sections e.4, f.1 and d.10); `golden_resolve.rs` checks every +//! colour against the measured vectors. + +use teksilo_kde_scheme::effects::{ + SELECTION_TINT_AMOUNT, apply_state_effect, background_chain, foreground_chain, + tint_toward_selection, +}; +use teksilo_kde_scheme::math::{darken, lighten, mix, tint}; +use teksilo_kde_scheme::{ + BackgroundRole, ColorEffect, ColorRole, ColorSet, ColorState, ContrastEffect, ForegroundRole, + IntensityEffect, KdeColor, KdeColorScheme, PaletteRole, StateEffect, +}; +use teksilo_tokens::ColorSchemePreference; + +fn rgb(c: KdeColor) -> [u8; 3] { + let [r, g, b, _] = c.to_rgba8(); + [r, g, b] +} + +#[test] +fn breeze_disabled_darkens_a_fade_toward_the_background() { + let scheme = KdeColorScheme::breeze_light(); + let disabled = scheme.state_colors(ColorState::Disabled, ColorSet::Window); + assert_eq!(rgb(disabled.foreground_normal), [160, 161, 163]); + assert_eq!(rgb(disabled.background_normal), [227, 229, 231]); + + // Every foreground and decoration is the chain darken(mix(X, BG0, 0.65), + // 0.1) against the background as it was before the effect; every + // background is darken(X, 0.1). + let window = scheme.set(ColorSet::Window); + let background = window.background_normal; + for role in ColorRole::ALL { + let stored = window.get(role); + let expected = match role { + ColorRole::BackgroundNormal | ColorRole::BackgroundAlternate => { + darken(stored, 0.1, 1.0) + } + _ => darken(mix(stored, background, 0.65), 0.1, 1.0), + }; + assert_eq!(disabled.get(role), expected, "{role:?}"); + } +} + +#[test] +fn the_chains_apply_contrast_then_intensity_then_colour() { + let effect = StateEffect { + enabled: true, + intensity_effect: IntensityEffect::Lighten, + intensity_amount: 0.2, + color_effect: ColorEffect::Tint, + color_amount: 0.5, + color: KdeColor::rgb8(56, 56, 56), + contrast_effect: ContrastEffect::Tint, + contrast_amount: 0.6, + }; + let x = KdeColor::rgb8(200, 60, 40); + let bg = KdeColor::rgb8(20, 30, 40); + let lightened = lighten(x, 0.2, 1.0); + assert_eq!( + background_chain(x, &effect), + tint(lightened, effect.color, 0.5) + ); + let contrasted = tint(x, bg, 0.6); + assert_eq!( + foreground_chain(x, bg, &effect), + background_chain(contrasted, &effect) + ); +} + +#[test] +fn a_disabled_effect_passes_colours_through_without_requantising() { + // A 16-bit colour that an HCY round trip would move. + let odd = KdeColor::rgba16(12345, 23456, 34567, 65535); + let mut effect = StateEffect::DISABLED_DEFAULT; + effect.enabled = false; + assert_eq!(background_chain(odd, &effect), odd); + assert_eq!(foreground_chain(odd, KdeColor::WHITE, &effect), odd); + let mut set = *KdeColorScheme::breeze_light().set(ColorSet::View); + set.foreground_normal = odd; + assert_eq!(apply_state_effect(&set, &effect), set); +} + +#[test] +fn breeze_inactive_selection_is_the_window_tinted_toward_the_selection() { + let scheme = KdeColorScheme::breeze_light(); + let inactive = scheme.state_colors(ColorState::Inactive, ColorSet::Selection); + assert_eq!(rgb(inactive.background_normal), [194, 224, 245]); + assert_eq!(rgb(inactive.background_alternate), [176, 216, 243]); + assert_eq!(rgb(inactive.foreground_normal), [35, 38, 41]); + assert_eq!( + inactive, + tint_toward_selection( + scheme.set(ColorSet::Window), + scheme.set(ColorSet::Selection).background_normal + ) + ); + assert_eq!(SELECTION_TINT_AMOUNT, 0.4); + + let palette = scheme.resolve(); + assert_eq!( + rgb(palette.role(ColorState::Inactive, PaletteRole::Highlight)), + [194, 224, 245] + ); + assert_eq!( + rgb(palette.role(ColorState::Inactive, PaletteRole::HighlightedText)), + [35, 38, 41] + ); + assert_eq!( + palette.role(ColorState::Inactive, PaletteRole::Accent), + palette.role(ColorState::Inactive, PaletteRole::Highlight) + ); +} + +#[test] +fn the_selection_tint_follows_the_inactive_window_subgroup() { + let (scheme, _) = KdeColorScheme::parse( + "[Colors:Window]\nBackgroundNormal=239,240,241\n\ + [Colors:Window][Inactive]\nBackgroundNormal=200,200,200\n\ + [Colors:Selection]\nBackgroundNormal=200,40,120\n", + ); + let inactive = scheme.state_colors(ColorState::Inactive, ColorSet::Selection); + let window = scheme.inactive_set(ColorSet::Window).expect("a subgroup"); + assert_eq!( + inactive.background_normal, + tint(window.background_normal, KdeColor::rgb8(200, 40, 120), 0.4) + ); +} + +#[test] +fn without_the_selection_change_an_inactive_selection_keeps_its_colours() { + let mut scheme = KdeColorScheme::breeze_light(); + scheme.change_selection_color = false; + assert_eq!( + scheme.state_colors(ColorState::Inactive, ColorSet::Selection), + *scheme.set(ColorSet::Selection) + ); +} + +#[test] +fn a_disabled_selection_is_the_disabled_window() { + let scheme = KdeColorScheme::breeze_dark(); + assert_eq!( + scheme.state_colors(ColorState::Disabled, ColorSet::Selection), + scheme.state_colors(ColorState::Disabled, ColorSet::Window) + ); +} + +#[test] +fn an_inactive_subgroup_replaces_the_set_and_the_effects_still_run() { + let (scheme, _) = KdeColorScheme::parse( + "[ColorEffects:Inactive]\nEnable=true\nIntensityEffect=2\nIntensityAmount=0.2\n\ + ColorEffect=0\nContrastEffect=0\n\ + [Colors:View][Inactive]\nBackgroundNormal=250,250,250\n", + ); + let inactive = scheme.state_colors(ColorState::Inactive, ColorSet::View); + let source = scheme.inactive_set(ColorSet::View).expect("a subgroup"); + assert_eq!( + inactive.background_normal, + darken(KdeColor::rgb8(250, 250, 250), 0.2, 1.0) + ); + assert_eq!( + inactive.foreground_normal, + darken(source.foreground_normal, 0.2, 1.0) + ); +} + +#[test] +fn breeze_inactive_colours_pass_through() { + let scheme = KdeColorScheme::breeze_light(); + for set in ColorSet::ALL { + if set == ColorSet::Selection { + continue; + } + let expected = *scheme.inactive_set(set).unwrap_or_else(|| scheme.set(set)); + assert_eq!( + scheme.state_colors(ColorState::Inactive, set), + expected, + "{set:?}" + ); + } +} + +#[test] +fn breeze_light_computed_backgrounds() { + let palette = KdeColorScheme::breeze_light().resolve(); + let view = palette.set(ColorState::Active, ColorSet::View); + assert_eq!( + rgb(view.background(BackgroundRole::Active)), + [236, 246, 252] + ); + assert_eq!( + rgb(view.background(BackgroundRole::Negative)), + [250, 236, 237] + ); + assert_eq!( + rgb(view.background(BackgroundRole::Neutral)), + [254, 241, 234] + ); + assert_eq!( + rgb(view.background(BackgroundRole::Positive)), + [221, 251, 232] + ); + // Each computed background tints Normal toward its foreground by 0.3. + let normal = view.background(BackgroundRole::Normal); + for role in BackgroundRole::ALL { + if let Some(foreground) = role.tinted_toward() { + assert_eq!( + view.background(role), + tint(normal, view.foreground(foreground), 0.3), + "{role:?}" + ); + } + } + assert_eq!( + rgb(view.background(BackgroundRole::Alternate)), + [247, 247, 247] + ); + assert_eq!(rgb(view.foreground(ForegroundRole::Link)), [41, 128, 185]); +} + +#[test] +fn computed_backgrounds_follow_the_effects() { + let scheme = KdeColorScheme::breeze_light(); + let palette = scheme.resolve(); + let disabled = palette.set(ColorState::Disabled, ColorSet::View); + let colors = scheme.state_colors(ColorState::Disabled, ColorSet::View); + assert_eq!( + disabled.background(BackgroundRole::Link), + tint(colors.background_normal, colors.foreground_link, 0.3) + ); +} + +#[test] +fn breeze_light_palette_roles() { + let palette = KdeColorScheme::breeze_light().resolve(); + let active = |role| rgb(palette.role(ColorState::Active, role)); + assert_eq!(active(PaletteRole::Window), [239, 240, 241]); + assert_eq!(active(PaletteRole::WindowText), [35, 38, 41]); + assert_eq!(active(PaletteRole::Base), [255, 255, 255]); + assert_eq!(active(PaletteRole::AlternateBase), [247, 247, 247]); + assert_eq!(active(PaletteRole::PlaceholderText), [112, 125, 138]); + assert_eq!(active(PaletteRole::Button), [252, 252, 252]); + assert_eq!(active(PaletteRole::Highlight), [61, 174, 233]); + assert_eq!(active(PaletteRole::HighlightedText), [255, 255, 255]); + assert_eq!(active(PaletteRole::LinkVisited), [155, 89, 182]); + // The shades of the window at contrast 4 (k = 0.4). + assert_eq!(active(PaletteRole::Light), [255, 255, 255]); + assert_eq!(active(PaletteRole::Midlight), [246, 247, 247]); + assert_eq!(active(PaletteRole::Mid), [196, 200, 204]); + assert_eq!(active(PaletteRole::Dark), [136, 142, 147]); + assert_eq!(active(PaletteRole::Shadow), [71, 74, 76]); + // Tooltips use the Active colours in every state. + for state in ColorState::ALL { + assert_eq!( + rgb(palette.role(state, PaletteRole::TooltipBase)), + [247, 247, 247] + ); + assert_eq!( + rgb(palette.role(state, PaletteRole::TooltipText)), + [35, 38, 41] + ); + } + assert_eq!( + rgb(palette.role(ColorState::Disabled, PaletteRole::WindowText)), + [160, 161, 163] + ); +} + +#[test] +fn the_contrast_value_is_a_tenth_of_the_contrast() { + assert_eq!(KdeColorScheme::breeze_light().contrast_value(), 0.1 * 4.0); + assert_eq!( + KdeColorScheme::kcolorscheme_defaults().contrast_value(), + 0.1 * 7.0 + ); +} + +#[test] +fn breeze_light_and_classic_are_light_and_breeze_dark_is_dark() { + assert!(!KdeColorScheme::breeze_light().is_dark()); + assert!(!KdeColorScheme::breeze_classic().is_dark()); + assert!(KdeColorScheme::breeze_dark().is_dark()); + assert!(!KdeColorScheme::kcolorscheme_defaults().is_dark()); +} + +#[test] +fn is_dark_is_the_grey_level_below_192() { + let with_window = |r: u8, g: u8, b: u8| { + KdeColorScheme::parse(&format!("[Colors:Window]\nBackgroundNormal={r},{g},{b}\n")) + .0 + .is_dark() + }; + // (11 r + 16 g + 5 b) / 32 with integer division. + assert!(with_window(191, 191, 191)); + assert!(!with_window(192, 192, 192)); + // 11 x 200 + 16 x 190 + 5 x 180 = 6140, / 32 = 191.875 -> 191: dark, + // although a rounded grey would be 192. + assert!(with_window(200, 190, 180)); + // A dark window under light content views is dark. + let (twilight, _) = KdeColorScheme::parse( + "[Colors:Window]\nBackgroundNormal=49,54,59\n\ + [Colors:View]\nBackgroundNormal=252,252,252\n", + ); + assert!(twilight.is_dark()); +} + +#[test] +fn breeze_light_colour_report() { + let os = KdeColorScheme::breeze_light().os_theme_colors(); + let c = |r, g, b| Some(KdeColor::rgb8(r, g, b).to_color()); + assert_eq!(os.color_scheme, ColorSchemePreference::Light); + assert_eq!(os.accent, c(61, 174, 233)); + assert_eq!(os.window_bg, c(239, 240, 241)); + assert_eq!(os.window_fg, c(35, 38, 41)); + assert_eq!(os.button_bg, c(252, 252, 252)); + assert_eq!(os.button_fg, c(35, 38, 41)); + assert_eq!(os.selection_bg, c(61, 174, 233)); + assert_eq!(os.selection_fg, c(255, 255, 255)); + assert_eq!(os.tooltip_bg, c(247, 247, 247)); + assert_eq!(os.tooltip_fg, c(35, 38, 41)); + assert_eq!(os.view_bg, c(255, 255, 255)); + assert_eq!(os.view_fg, c(35, 38, 41)); + assert_eq!(os.alternate_bg, c(247, 247, 247)); + assert_eq!(os.inactive_fg, c(112, 125, 138)); + assert_eq!(os.link, c(41, 128, 185)); + assert_eq!(os.link_visited, c(155, 89, 182)); + assert_eq!(os.error, c(218, 68, 83)); + assert_eq!(os.warning, c(246, 116, 0)); + assert_eq!(os.success, c(39, 174, 96)); + assert_eq!(os.focus, c(61, 174, 233)); +} + +#[test] +fn breeze_dark_colour_report() { + let os = KdeColorScheme::breeze_dark().os_theme_colors(); + let c = |r, g, b| Some(KdeColor::rgb8(r, g, b).to_color()); + assert_eq!(os.color_scheme, ColorSchemePreference::Dark); + assert_eq!(os.accent, c(61, 174, 233)); + assert_eq!(os.window_bg, c(32, 35, 38)); + assert_eq!(os.window_fg, c(252, 252, 252)); + assert_eq!(os.button_bg, c(41, 44, 48)); + assert_eq!(os.button_fg, c(252, 252, 252)); + assert_eq!(os.selection_bg, c(61, 174, 233)); + assert_eq!(os.selection_fg, c(252, 252, 252)); + assert_eq!(os.tooltip_bg, c(41, 44, 48)); + assert_eq!(os.tooltip_fg, c(252, 252, 252)); + assert_eq!(os.view_bg, c(20, 22, 24)); + assert_eq!(os.view_fg, c(252, 252, 252)); + assert_eq!(os.alternate_bg, c(29, 31, 34)); + assert_eq!(os.inactive_fg, c(161, 169, 177)); + assert_eq!(os.link, c(29, 153, 243)); + assert_eq!(os.link_visited, c(155, 89, 182)); + assert_eq!(os.error, c(218, 68, 83)); + assert_eq!(os.warning, c(246, 116, 0)); + assert_eq!(os.success, c(39, 174, 96)); + assert_eq!(os.focus, c(61, 174, 233)); +} + +#[test] +fn the_colour_report_reads_the_active_palette() { + // The report and the resolved Active palette agree on every shared + // colour, for a scheme whose sets all differ. + let (scheme, _) = KdeColorScheme::parse( + "[Colors:Window]\nBackgroundNormal=10,20,30\nForegroundNormal=200,201,202\n\ + [Colors:View]\nBackgroundNormal=240,241,242\nDecorationFocus=1,2,3\n\ + [Colors:Selection]\nBackgroundNormal=90,10,200\n", + ); + let os = scheme.os_theme_colors(); + let palette = scheme.resolve(); + let role = |r| Some(palette.role(ColorState::Active, r).to_color()); + assert_eq!(os.color_scheme, ColorSchemePreference::Dark); + assert_eq!(os.window_bg, role(PaletteRole::Window)); + assert_eq!(os.window_fg, role(PaletteRole::WindowText)); + assert_eq!(os.view_bg, role(PaletteRole::Base)); + assert_eq!(os.accent, role(PaletteRole::Accent)); + assert_eq!(os.selection_bg, role(PaletteRole::Highlight)); + assert_eq!(os.focus, Some(KdeColor::rgb8(1, 2, 3).to_color())); +} diff --git a/crates/teksilo-tokens/src/os_theme_colors.rs b/crates/teksilo-tokens/src/os_theme_colors.rs index a9fd66d7c..811d40840 100644 --- a/crates/teksilo-tokens/src/os_theme_colors.rs +++ b/crates/teksilo-tokens/src/os_theme_colors.rs @@ -46,7 +46,9 @@ impl ColorSchemePreference { pub struct OsThemeColors { /// Light or dark preference. pub color_scheme: ColorSchemePreference, - /// Desktop accent / primary color (e.g., GNOME accent, KDE DecorationFocus). + /// Desktop accent / primary color. KDE `[Colors:Selection] + /// BackgroundNormal` (the colour the portal reports as `accent-color`); + /// GNOME's accent colour. pub accent: Option, /// Window background color. pub window_bg: Option, From 9d133c98e7c27f88bfdfdd6fc81287c5255bae27 Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 12:06:56 +0200 Subject: [PATCH 15/59] feat(kde-scheme): apply an accent colour to a scheme as Plasma does New module accent, implemented from sections g and h and answer n.13 of engineering/docs/kde-breeze-spec.md, on top of the scheme model and math. KdeColorScheme::with_accent builds the configuration Plasma writes for a scheme and an accent and reads the result from it, so the accented scheme's source() is that configuration. The seven colour groups are processed in the specified order: ForegroundActive and both decorations take the accent, ForegroundLink the accent made readable against the group's own background (readable_link, ratio 5, one lighten or darken step); every other key is tinted in OKLab when the scheme has a TintFactor and copied as text otherwise. The Selection backgrounds become the accent at 0.7 over the View background with black or white text, the Button alternate background the accent at 0.7 over the Button background. [Inactive] subgroups are tinted or copied, the Header one from the Window group, and an accent title bar recolours the Header group. [WM] is the scheme's own or its resolved Header colours, then the tinted or accented window background; [KDE] contrast and frameContrast are written as read or with 7 and 0.2; every [ColorEffects:*] key is copied, empty when absent. ColorSchemeHash is not written; Name and ColorScheme are copied so the result keeps its identity. Decisions where the specification is silent: a colour the procedure reads from the scheme (a background for the link, the selection, the button or the title bar) is black when the scheme lacks it, as g.4 says for the link; a written colour uses the b.9 form (r,g,b, or r,g,b,a when translucent). A built-in scheme, which has no source, is accented as the configuration its to_kconfig_text writes; to_kconfig_text now leaves out [ColorEffects:Disabled] Enable when it is true, as the stock files do, so accenting breeze_light or breeze_dark is exactly accenting its vendored file. Applying an accent twice is not idempotent, since the second pass reads the accented scheme; this is documented and tested. ACCENT_SWATCHES holds the ten swatches of section h in order. KdeColor gains From, so with_accent takes either colour type. KdeDesktop applies a user AccentColor that is not transparent to the scheme file (or built-in Breeze Light) it reads when kdeglobals has no [Colors:View] group (n.13), the accented configuration taking the file's place over kdeglobals. Tests: tests/golden_accent.rs reproduces all 40 cases of tools/kde_golden/vectors/accent.json key by key in both directions, [General] aside, failing on an empty case list; checks the cases cover every swatch on every scheme and that the vector inputs of the stock schemes are the vendored files; and checks breeze_light and breeze_dark accented equal their stock files accented, configuration included. tests/accent.rs covers the g.10 worked examples, the ten swatches through the selection rule of g.11, non-idempotence, a transparent accent, text copies, untinted absent keys, Breeze Classic's title bar without a Header group, [WM] defaults and tinting, [KDE] and the effect groups. tests/cascade.rs covers the accent in the no-colours fallback. The golden test reads files outside the crate and is excluded from the package. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 10 +- crates/teksilo-kde-scheme/Cargo.toml | 1 + crates/teksilo-kde-scheme/src/accent.rs | 390 +++++++++++++++++ crates/teksilo-kde-scheme/src/color.rs | 7 + crates/teksilo-kde-scheme/src/config.rs | 18 + crates/teksilo-kde-scheme/src/desktop.rs | 37 +- crates/teksilo-kde-scheme/src/lib.rs | 7 +- crates/teksilo-kde-scheme/src/scheme.rs | 20 +- crates/teksilo-kde-scheme/tests/accent.rs | 411 ++++++++++++++++++ crates/teksilo-kde-scheme/tests/cascade.rs | 105 ++++- .../teksilo-kde-scheme/tests/golden_accent.rs | 198 +++++++++ 11 files changed, 1180 insertions(+), 24 deletions(-) create mode 100644 crates/teksilo-kde-scheme/src/accent.rs create mode 100644 crates/teksilo-kde-scheme/tests/accent.rs create mode 100644 crates/teksilo-kde-scheme/tests/golden_accent.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 968a05c97..df6ef8eb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -119,7 +119,15 @@ by crate for clarity, not because crates version independently. colours (`PaletteRole`). `is_dark` tells a dark scheme from a light one by its window background, the way KDE reports it to applications, and `os_theme_colors` gives the colour report Teksilo's native theme is built - from. + from. `KdeColorScheme::with_accent` applies an accent colour to a scheme + the way Plasma's colour settings do, writing the same values Plasma + writes: the accent on links, focus and hover, a selection and button fill + blended from it with black or white text, the scheme's colours tinted + toward it when the scheme asks for tinting, and an accent-coloured title + bar when the scheme asks for one. `ACCENT_SWATCHES` are Plasma's ten + accent swatches. When `kdeglobals` holds no colours of its own, + `KdeDesktop` applies the user's chosen accent to the scheme it reads in + their place, which KDE itself does not. ### Changed diff --git a/crates/teksilo-kde-scheme/Cargo.toml b/crates/teksilo-kde-scheme/Cargo.toml index f8f7eaa3f..fab5ae848 100644 --- a/crates/teksilo-kde-scheme/Cargo.toml +++ b/crates/teksilo-kde-scheme/Cargo.toml @@ -26,6 +26,7 @@ exclude = [ "tests/breeze_files.rs", "tests/golden_math.rs", "tests/golden_resolve.rs", + "tests/golden_accent.rs", "tests/clean_room_vocabulary.rs", ] diff --git a/crates/teksilo-kde-scheme/src/accent.rs b/crates/teksilo-kde-scheme/src/accent.rs new file mode 100644 index 000000000..41b6fa5af --- /dev/null +++ b/crates/teksilo-kde-scheme/src/accent.rs @@ -0,0 +1,390 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Applying an accent colour to a scheme, as Plasma's colour settings do. +//! +//! [`KdeColorScheme::with_accent`] writes, for one scheme and one accent, +//! every key Plasma writes into `kdeglobals` when the user picks an accent: +//! the seven colour groups and their `[Inactive]` subgroups, `[WM]`, +//! `[KDE] contrast` and `frameContrast`, and the two `[ColorEffects:*]` +//! groups. Colours are computed with [`crate::math`] and written as KDE +//! writes them, so each key reads back to the same 8-bit value; the keys +//! the procedure copies keep the scheme's own text. +//! +//! [`ACCENT_SWATCHES`] are the ten colours Plasma's settings page offers. + +use crate::color::KdeColor; +use crate::config::KConfig; +use crate::math::{accent_over, black_or_white_on, darken, lighten, luma, luma_ratio, oklab_tint}; +use crate::scheme::{ + ColorRole, ColorSet, ColorState, DEFAULT_CONTRAST, DEFAULT_FRAME_CONTRAST, DEFAULT_TINT_FACTOR, + KdeColorScheme, +}; + +/// The ten accent colours Plasma's colour settings page offers, in the +/// order it shows them: pink, red, orange, yellow, green, teal, blue, +/// purple, violet and gray. KDE gives them no names. The first is also the +/// page's custom colour until the user saves one, and the seventh, +/// 61,174,233, is Breeze's own accent. +pub const ACCENT_SWATCHES: [KdeColor; 10] = [ + KdeColor::rgb8(233, 58, 154), + KdeColor::rgb8(233, 61, 88), + KdeColor::rgb8(233, 100, 58), + KdeColor::rgb8(232, 203, 45), + KdeColor::rgb8(61, 212, 37), + KdeColor::rgb8(0, 211, 184), + KdeColor::rgb8(61, 174, 233), + KdeColor::rgb8(184, 117, 220), + KdeColor::rgb8(146, 110, 228), + KdeColor::rgb8(104, 107, 111), +]; + +/// The contrast against its background that keeps a link the plain +/// accent, in [`luma_ratio`]. +const READABLE_LINK_RATIO: f64 = 5.0; + +/// The roles that take the accent itself (the link made readable first). +const ACCENT_ROLES: [ColorRole; 4] = [ + ColorRole::ForegroundActive, + ColorRole::ForegroundLink, + ColorRole::DecorationFocus, + ColorRole::DecorationHover, +]; + +/// The keys of each `[ColorEffects:*]` group, in the order they are written. +const EFFECT_KEYS: [&str; 9] = [ + "Enable", + "ChangeSelectionColor", + "IntensityEffect", + "IntensityAmount", + "ColorEffect", + "ColorAmount", + "Color", + "ContrastEffect", + "ContrastAmount", +]; + +/// The accent as a link colour on `background`. +/// +/// The accent itself when its [`luma_ratio`] against `background` is at +/// least 5. Otherwise it is lightened (amount 0.5, chroma factor 1) when it +/// is lighter than the background and darkened by the same amounts when it +/// is not, once, without checking the result again. Breeze's accent +/// 61,174,233 on white becomes 45,127,170. +pub fn readable_link(accent: KdeColor, background: KdeColor) -> KdeColor { + let (accent_luma, background_luma) = (luma(accent), luma(background)); + if luma_ratio(background_luma, accent_luma) >= READABLE_LINK_RATIO { + accent + } else if accent_luma > background_luma { + lighten(accent, 0.5, 1.0) + } else { + darken(accent, 0.5, 1.0) + } +} + +impl KdeColorScheme { + /// The scheme with `accent` applied the way Plasma applies an accent + /// colour to it. + /// + /// The result is read from the configuration the application writes, + /// which is also its [`KdeColorScheme::source`]: what KDE writes into + /// `kdeglobals`, key for key and value for value, with three + /// differences. `[General] ColorSchemeHash` is not written (KDE writes + /// a digest of the scheme file's bytes); the scheme's `[General] Name` + /// and `ColorScheme` are copied, so the result keeps its identity; and, + /// as a documented Teksilo divergence, a colour the scheme does not set + /// is not tinted (KDE writes the tint of an undefined colour). Nothing + /// else of `[General]` is written, so the result has no `TintFactor`, + /// no accent title bar and no `AccentColor`. + /// + /// In outline, with tinting on when the scheme has a `[General] + /// TintFactor` key (its value, or 0.15 when it does not parse): + /// + /// - every colour group takes the accent for `ForegroundActive`, + /// `DecorationFocus` and `DecorationHover`, and for `ForegroundLink` + /// the accent made readable against the group's own `BackgroundNormal` + /// ([`readable_link`]); every other colour is tinted toward the + /// accent in OKLab when tinting is on, and copied as written + /// otherwise; + /// - the selection background (normal and alternate) becomes the accent + /// at 0.7 over the View background, with black or white text on it, + /// and the Button alternate background the accent at 0.7 over the + /// Button background; + /// - an `[Inactive]` subgroup is tinted when tinting is on and copied + /// otherwise, the Header one from the Window group; with an accent + /// title bar the Header backgrounds and text follow the accent; + /// - `[WM]` is the scheme's own or the resolved Header colours, then the + /// tinted or accented window background when tinting or the accent + /// title bar is on; + /// - `[KDE] contrast` and `frameContrast` are written with their + /// defaults (7 and 0.2) when the scheme lacks them, and each + /// `[ColorEffects:*]` key is copied, empty when the scheme lacks it + /// (an empty `Enable` reads as true, so effects the scheme left + /// unset are on). + /// + /// A fully transparent accent (all four 8-bit channels 0) is no accent: + /// the colour groups are copied, except that `[Inactive]` subgroups are + /// still tinted toward it when tinting is on. Where the procedure needs + /// a scheme colour the scheme does not set (a group's + /// `BackgroundNormal`), it uses black. + /// + /// **Which configuration is accented.** A scheme read with + /// [`KdeColorScheme::from_config`] or [`KdeColorScheme::parse`] is + /// accented from its source configuration, so copied keys keep their + /// text and a key the file lacks stays absent; fields changed after + /// reading are not seen. A built-in scheme ([`KdeColorScheme::breeze_light`] + /// and the others) has no source and is accented as the configuration + /// [`KdeColorScheme::to_kconfig_text`] writes for it. For the three + /// stock Breeze schemes that text holds the same keys with the same + /// values as the stock `.colors` file, as far as the accent + /// application reads it, so accenting the constant gives exactly what + /// accenting the file gives. + /// + /// **Applying it twice is not the same as applying it once.** The + /// procedure reads the scheme it is given: on an accented scheme the + /// Header `[Inactive]` group copies the already accented Window + /// colours, the selection link is checked against the accented + /// selection background, and a tinting scheme, whose result has no + /// tint factor, is not tinted the second time. KDE reads the scheme + /// file afresh for every accent, so to change the accent, apply the new + /// one to the original scheme. + pub fn with_accent(&self, accent: impl Into) -> KdeColorScheme { + KdeColorScheme::from_config(&self.accented_config(accent.into())) + } + + /// The configuration [`KdeColorScheme::with_accent`] writes. + pub(crate) fn accented_config(&self, accent: KdeColor) -> KConfig { + let written; + let source = match self.source() { + Some(source) => source, + None => { + written = KConfig::parse(&self.to_kconfig_text()).0; + &written + } + }; + Application::new(source, accent).run() + } +} + +/// One application of an accent to one scheme configuration. +struct Application<'a> { + /// The scheme configuration, read on its own. + source: &'a KConfig, + /// The same scheme with every default filled in. + scheme: KdeColorScheme, + accent: KdeColor, + /// Whether there is an accent: it is not fully transparent black. + present: bool, + /// The tint factor when tinting is on. + tint: Option, + /// The tint factor, 0.15 when the scheme has none. + factor: f64, + /// Whether the title bar is accent coloured. + titlebar: bool, + out: KConfig, +} + +impl<'a> Application<'a> { + fn new(source: &'a KConfig, accent: KdeColor) -> Application<'a> { + let scheme = KdeColorScheme::from_config(source); + Application { + source, + present: !accent.is_transparent_black(), + tint: scheme.tint_factor, + factor: scheme.tint_factor.unwrap_or(DEFAULT_TINT_FACTOR), + titlebar: scheme.titlebar_is_accent_colored, + scheme, + accent, + out: KConfig::default(), + } + } + + fn run(mut self) -> KConfig { + // ColorSet::ALL is the order the groups are processed in: View, + // Window, Button, Selection, Tooltip, Complementary, Header. + for set in ColorSet::ALL { + self.color_group(set); + } + self.window_manager(); + self.kde(); + self.effects(); + for key in ["Name", "ColorScheme"] { + self.copy(&["General"], &["General"], key); + } + self.out + } + + /// A colour of the scheme as written, black when the scheme lacks it + /// or it is not a colour. + fn scheme_color(&self, group: &[&str], key: &str) -> KdeColor { + self.source + .read_color(group, key) + .unwrap_or(KdeColor::BLACK) + } + + fn write(&mut self, group: &[&str], key: &str, color: KdeColor) { + self.out.set(group, key, color.to_kconfig_text()); + } + + /// Copies `key` as text from the scheme's `from` group to the output's + /// `to` group, when the scheme has it. + fn copy(&mut self, from: &[&str], to: &[&str], key: &str) { + if let Some(value) = self.source.get(from, key) { + self.out.set(to, key, value); + } + } + + /// Writes the tint of the scheme's `key` in `group`, when the scheme + /// has that colour. + fn tint_key(&mut self, group: &[&str], key: &str, factor: f64) { + if let Some(color) = self.source.read_color(group, key) { + self.write(group, key, oklab_tint(color, self.accent, factor)); + } + } + + fn color_group(&mut self, set: ColorSet) { + let name = set.group_name(); + let group: &[&str] = &[name]; + let inactive: &[&str] = &[name, "Inactive"]; + if set == ColorSet::Header && !self.source.group_exists(group) { + return; + } + + for role in ColorRole::ALL { + let key = role.key(); + if self.present && ACCENT_ROLES.contains(&role) { + let color = if role == ColorRole::ForegroundLink { + readable_link(self.accent, self.scheme_color(group, "BackgroundNormal")) + } else { + self.accent + }; + self.write(group, key, color); + } else if let (true, Some(factor)) = (self.present, self.tint) { + self.tint_key(group, key, factor); + } else { + self.copy(group, group, key); + } + } + + if self.present && set == ColorSet::Selection { + let view = self.scheme_color(&[ColorSet::View.group_name()], "BackgroundNormal"); + let fill = accent_over(self.accent, view); + let text = black_or_white_on(fill, true); + self.write(group, "BackgroundNormal", fill); + self.write(group, "BackgroundAlternate", fill); + self.write(group, "ForegroundNormal", text); + self.write(group, "ForegroundInactive", text); + } + if self.present && set == ColorSet::Button { + let button = self.scheme_color(group, "BackgroundNormal"); + self.write( + group, + "BackgroundAlternate", + accent_over(self.accent, button), + ); + } + + if self.source.group_exists(inactive) { + for role in ColorRole::ALL { + let key = role.key(); + if let Some(factor) = self.tint { + self.tint_key(inactive, key, factor); + } else if set == ColorSet::Header { + self.copy(&[ColorSet::Window.group_name()], inactive, key); + } else { + self.copy(inactive, inactive, key); + } + } + } + + if self.present && set == ColorSet::Header && self.titlebar { + let window = self.window_background(); + let accented = accent_over(self.accent, window); + let tinted = oklab_tint(window, self.accent, self.factor); + self.write(group, "BackgroundNormal", accented); + self.write(group, "ForegroundNormal", black_or_white_on(accented, true)); + self.write(inactive, "BackgroundNormal", tinted); + self.write( + inactive, + "ForegroundNormal", + black_or_white_on(tinted, false), + ); + } + } + + fn window_background(&self) -> KdeColor { + self.scheme_color(&[ColorSet::Window.group_name()], "BackgroundNormal") + } + + /// `[WM]`: the scheme's own colours, else the Header colours it + /// resolves to before the accent, then the title-bar override. + fn window_manager(&mut self) { + let group: &[&str] = &["WM"]; + let active = self + .scheme + .state_colors(ColorState::Active, ColorSet::Header); + let inactive = self + .scheme + .state_colors(ColorState::Inactive, ColorSet::Header); + for (key, default) in [ + ("activeBackground", active.background_normal), + ("activeForeground", active.foreground_normal), + ("inactiveBackground", inactive.background_normal), + ("inactiveForeground", inactive.foreground_normal), + ("activeBlend", active.background_normal), + ("inactiveBlend", inactive.background_normal), + ] { + let color = self.source.read_color(group, key).unwrap_or(default); + self.write(group, key, color); + } + + if !self.present { + return; + } + let window = self.window_background(); + if let Some(factor) = self.tint { + let tinted = oklab_tint(window, self.accent, factor); + if !self.titlebar { + self.write(group, "activeBackground", tinted); + self.write(group, "activeForeground", black_or_white_on(tinted, true)); + } + self.write(group, "inactiveBackground", tinted); + self.write( + group, + "inactiveForeground", + black_or_white_on(tinted, false), + ); + } + if self.titlebar { + let accented = accent_over(self.accent, window); + self.write(group, "activeBackground", accented); + self.write(group, "activeForeground", black_or_white_on(accented, true)); + } + } + + /// `[KDE]`: `frameContrast` as the scheme writes it (not clamped) or + /// 0.2, and `contrast` or 7, both written as numbers. + fn kde(&mut self) { + let group: &[&str] = &["KDE"]; + let frame = self + .source + .read_real(group, "frameContrast", DEFAULT_FRAME_CONTRAST); + let contrast = self + .source + .read_int(group, "contrast", i64::from(DEFAULT_CONTRAST)); + self.out.set(group, "frameContrast", frame.to_string()); + self.out.set(group, "contrast", contrast.to_string()); + } + + /// The effect groups, each key copied as text, empty when the scheme + /// lacks it. + fn effects(&mut self) { + for name in ["ColorEffects:Inactive", "ColorEffects:Disabled"] { + let group: &[&str] = &[name]; + for key in EFFECT_KEYS { + let value = self.source.get(group, key).unwrap_or_default(); + self.out.set(group, key, value); + } + } + } +} diff --git a/crates/teksilo-kde-scheme/src/color.rs b/crates/teksilo-kde-scheme/src/color.rs index 122cf879a..5144458ff 100644 --- a/crates/teksilo-kde-scheme/src/color.rs +++ b/crates/teksilo-kde-scheme/src/color.rs @@ -155,6 +155,13 @@ impl From for Color { } } +impl From for KdeColor { + /// The same as [`KdeColor::from_color`]. + fn from(color: Color) -> KdeColor { + KdeColor::from_color(color) + } +} + impl fmt::Display for KdeColor { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str(&self.to_kconfig_text()) diff --git a/crates/teksilo-kde-scheme/src/config.rs b/crates/teksilo-kde-scheme/src/config.rs index 67cc015ea..e2adda220 100644 --- a/crates/teksilo-kde-scheme/src/config.rs +++ b/crates/teksilo-kde-scheme/src/config.rs @@ -459,6 +459,24 @@ impl KConfig { pub fn read_color(&self, group: &[&str], key: &str) -> Option { self.get(group, key).and_then(KdeColor::parse) } + + /// Stores `value` for `key` in `group` as a plain entry (neither + /// immutable nor expanding), replacing whatever the group held for the + /// key. The group is created when it does not exist. + pub(crate) fn set(&mut self, group: &[&str], key: &str, value: impl Into) { + self.groups + .entry(owned_path(group)) + .or_default() + .entries + .insert( + key.to_owned(), + Entry { + value: Some(value.into()), + immutable: false, + expand: false, + }, + ); + } } pub(crate) fn parse_bool(value: &str) -> bool { diff --git a/crates/teksilo-kde-scheme/src/desktop.rs b/crates/teksilo-kde-scheme/src/desktop.rs index af856cde8..c5cf8dc4d 100644 --- a/crates/teksilo-kde-scheme/src/desktop.rs +++ b/crates/teksilo-kde-scheme/src/desktop.rs @@ -20,10 +20,12 @@ pub enum SchemeOrigin { /// `[Colors:View]` group. Any accent the user chose is already in them. Kdeglobals, /// A scheme file read because `kdeglobals` has no `[Colors:View]` - /// group: the look-and-feel package's colours or the named scheme. + /// group: the look-and-feel package's colours or the named scheme, with + /// the user's accent applied to it when there is one. SchemeFile, /// Neither: `kdeglobals` has no colours and no scheme file was found, - /// so the built-in Breeze Light scheme was used. + /// so the built-in Breeze Light scheme was used, with the user's accent + /// applied to it when there is one. BuiltIn, } @@ -378,13 +380,26 @@ impl KdeDesktop { /// Builds the desktop from already-read layers. /// /// When the merged `kdeglobals` has a `[Colors:View]` group the scheme - /// is read from it. Otherwise it is read from `layers.scheme_file`, or - /// from the built-in Breeze Light when there is none, with the - /// `kdeglobals` cascade below it, so a key the scheme file lacks still - /// comes from `kdeglobals`. String settings expand `[$e]` entries - /// through `env`. + /// is read from it, and any accent the user chose is already in its + /// colours. Otherwise it is read from `layers.scheme_file`, or from the + /// built-in Breeze Light when there is none, with the `kdeglobals` + /// cascade below it, so a key the scheme file lacks still comes from + /// `kdeglobals`. String settings expand `[$e]` entries through `env`. + /// + /// In that fallback, a `[General] AccentColor` that is a colour and not + /// fully transparent is applied to the scheme file with + /// [`KdeColorScheme::with_accent`], and what that application writes + /// takes the scheme file's place over `kdeglobals`. It writes `[KDE] + /// contrast` and `frameContrast` (7 and 0.2 when the scheme file lacks + /// them), so those then come from the scheme rather than from + /// `kdeglobals`. KDE itself ignores the accent in this fallback; Teksilo + /// honours it so that the accent the user chose still shows on a profile + /// whose colour groups were never written. pub fn from_layers(layers: &KdeDesktopLayers<'_>, env: &ExpansionEnv<'_>) -> KdeDesktop { let globals = KConfig::cascade(layers.kdeglobals); + let user_accent = globals + .read_color(&["General"], "AccentColor") + .filter(|c| !c.is_transparent_black()); let (scheme, scheme_origin) = if globals.group_exists(&["Colors:View"]) { ( KdeColorScheme::from_config(&globals), @@ -398,6 +413,10 @@ impl KdeDesktop { SchemeOrigin::BuiltIn, ), }; + let file = match user_accent { + Some(accent) => KdeColorScheme::from_config(&file).accented_config(accent), + None => file, + }; let merged = KConfig::cascade(&[globals.clone(), file.with_kind(LayerKind::Default)]); (KdeColorScheme::from_config(&merged), origin) }; @@ -410,9 +429,7 @@ impl KdeDesktop { KdeDesktop { scheme, scheme_origin, - user_accent: globals - .read_color(&["General"], "AccentColor") - .filter(|c| !c.is_transparent_black()), + user_accent, fonts: KdeFonts::read(&globals, env), animation_duration_factor, widget_style: globals.read_string(kde, "widgetStyle", env), diff --git a/crates/teksilo-kde-scheme/src/lib.rs b/crates/teksilo-kde-scheme/src/lib.rs index 63a726eb9..fdcca3f57 100644 --- a/crates/teksilo-kde-scheme/src/lib.rs +++ b/crates/teksilo-kde-scheme/src/lib.rs @@ -14,7 +14,10 @@ //! built on it, and [`palette`] the resolved palette of every state and set //! ([`KdeColorScheme::resolve`]), the light or dark decision //! ([`KdeColorScheme::is_dark`]) and the colour report Teksilo's native -//! theme reads ([`KdeColorScheme::os_theme_colors`]). +//! theme reads ([`KdeColorScheme::os_theme_colors`]). [`accent`] applies +//! an accent colour to a scheme the way Plasma's colour settings do +//! ([`KdeColorScheme::with_accent`]) and lists Plasma's ten accent +//! swatches ([`ACCENT_SWATCHES`]). //! //! It does no I/O. The environment is passed in as a getter and files are //! passed in as text, so everything here runs the same in a test as on a @@ -54,6 +57,7 @@ //! tests compare against are vendored as test fixtures only and are not //! part of the published crate. +pub mod accent; pub mod color; pub mod config; pub mod desktop; @@ -64,6 +68,7 @@ pub mod math; pub mod palette; pub mod scheme; +pub use accent::ACCENT_SWATCHES; pub use color::KdeColor; pub use config::{DiagnosticKind, Entry, ExpansionEnv, KConfig, LayerKind, ParseDiagnostic}; pub use desktop::{ diff --git a/crates/teksilo-kde-scheme/src/scheme.rs b/crates/teksilo-kde-scheme/src/scheme.rs index 03ab9cf65..dfaef8f5e 100644 --- a/crates/teksilo-kde-scheme/src/scheme.rs +++ b/crates/teksilo-kde-scheme/src/scheme.rs @@ -453,7 +453,10 @@ impl StateEffect { } } - fn write(&self, out: &mut String) { + /// Writes the group's keys in sorted order. `Enable` is left out when + /// it equals `omitted_enable`, the value a reader assumes for an absent + /// key that the stock files rely on. + fn write(&self, out: &mut String, omitted_enable: Option) { push_entry(out, "Color", &self.color.to_kconfig_text()); push_entry(out, "ColorAmount", &self.color_amount.to_string()); push_entry(out, "ColorEffect", &self.color_effect.code().to_string()); @@ -463,7 +466,9 @@ impl StateEffect { "ContrastEffect", &self.contrast_effect.code().to_string(), ); - push_entry(out, "Enable", bool_text(self.enabled)); + if omitted_enable != Some(self.enabled) { + push_entry(out, "Enable", bool_text(self.enabled)); + } push_entry(out, "IntensityAmount", &self.intensity_amount.to_string()); push_entry( out, @@ -1105,7 +1110,11 @@ impl KdeColorScheme { /// read from a 9- or 12-digit `#` form comes back rounded to 8 bits. `[KDE] contrast` and `frameContrast` /// are written only when they differ from their defaults, so a key the /// scheme leaves at its default still falls back to `kdeglobals` when - /// the text is cascaded over it, as a stock `.colors` file does. + /// the text is cascaded over it, as a stock `.colors` file does. For the + /// same reason `[ColorEffects:Disabled] Enable` is written only when it + /// is false: the stock files leave it out, and it reads as true when + /// absent. (`[ColorEffects:Inactive] Enable` is always written, as the + /// stock files write it.) /// /// A scheme without a Header group is written without one. Its Header /// colours follow the Window group key by key, falling back to the @@ -1116,14 +1125,15 @@ impl KdeColorScheme { let mut out = String::new(); push_group(&mut out, &["ColorEffects:Disabled"]); - self.disabled_effect.write(&mut out); + self.disabled_effect + .write(&mut out, Some(StateEffect::DISABLED_DEFAULT.enabled)); push_group(&mut out, &["ColorEffects:Inactive"]); push_entry( &mut out, "ChangeSelectionColor", bool_text(self.change_selection_color), ); - self.inactive_effect.write(&mut out); + self.inactive_effect.write(&mut out, None); let mut ordered = ColorSet::ALL; ordered.sort_by_key(|s| s.group_name()); diff --git a/crates/teksilo-kde-scheme/tests/accent.rs b/crates/teksilo-kde-scheme/tests/accent.rs new file mode 100644 index 000000000..af35e2171 --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/accent.rs @@ -0,0 +1,411 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Accent application: the specification's worked examples (g.10), the ten +//! swatches through the selection rule (g.11), and the rules of section g +//! that the golden schemes do not exercise. + +use teksilo_kde_scheme::accent::readable_link; +use teksilo_kde_scheme::math::{accent_over, black_or_white_on, luma, oklab_tint}; +use teksilo_kde_scheme::{ + ACCENT_SWATCHES, ColorSet, ColorState, KConfig, KdeColor, KdeColorScheme, +}; + +fn rgb(r: u8, g: u8, b: u8) -> KdeColor { + KdeColor::rgb8(r, g, b) +} + +fn rgb8(c: KdeColor) -> [u8; 3] { + let [r, g, b, _] = c.to_rgba8(); + [r, g, b] +} + +fn parse_clean(text: &str) -> KdeColorScheme { + let (scheme, diagnostics) = KdeColorScheme::parse(text); + assert!(diagnostics.is_empty(), "{diagnostics:?}"); + scheme +} + +fn written(scheme: &KdeColorScheme) -> &KConfig { + scheme.source().expect("an accented scheme has a source") +} + +const BREEZE_BLUE: KdeColor = KdeColor::rgb8(61, 174, 233); + +// ---- Swatches (section h) ------------------------------------------------- + +#[test] +fn the_swatches_are_plasma_s_ten_in_order() { + let hex: Vec = ACCENT_SWATCHES + .iter() + .map(|c| { + let [r, g, b] = rgb8(*c); + format!("#{r:02x}{g:02x}{b:02x}") + }) + .collect(); + assert_eq!( + hex, + [ + "#e93a9a", "#e93d58", "#e9643a", "#e8cb2d", "#3dd425", "#00d3b8", "#3daee9", "#b875dc", + "#926ee4", "#686b6f", + ] + ); + assert!(ACCENT_SWATCHES.iter().all(|c| c.to_rgba8()[3] == 255)); +} + +#[test] +fn the_ten_swatches_give_the_specified_selection_through_with_accent() { + // (light selection, black text, dark selection, black text), spec g.11. + let table: [([u8; 3], bool, [u8; 3], bool); 10] = [ + ([239, 117, 184], true, [169, 47, 115], false), + ([239, 119, 138], true, [169, 49, 68], false), + ([239, 146, 117], true, [169, 76, 47], false), + ([238, 218, 107], true, [168, 148, 38], true), + ([119, 224, 102], true, [48, 155, 33], true), + ([76, 224, 205], true, [5, 154, 136], true), + ([119, 198, 239], true, [48, 128, 170], true), + ([205, 158, 230], true, [134, 88, 161], false), + ([178, 153, 236], true, [108, 83, 166], false), + ([149, 151, 154], true, [78, 81, 84], false), + ]; + let text = |black: bool| if black { [0, 0, 0] } else { [255, 255, 255] }; + for (swatch, (light, light_black, dark, dark_black)) in ACCENT_SWATCHES.into_iter().zip(table) { + for (scheme, fill, black) in [ + (KdeColorScheme::breeze_light(), light, light_black), + (KdeColorScheme::breeze_dark(), dark, dark_black), + ] { + let selection = *scheme.with_accent(swatch).set(ColorSet::Selection); + assert_eq!(rgb8(selection.background_normal), fill, "swatch {swatch}"); + assert_eq!( + rgb8(selection.background_alternate), + fill, + "swatch {swatch}" + ); + assert_eq!( + rgb8(selection.foreground_normal), + text(black), + "swatch {swatch}" + ); + assert_eq!( + rgb8(selection.foreground_inactive), + text(black), + "swatch {swatch}" + ); + } + } +} + +// ---- Worked examples (section g.10) --------------------------------------- + +#[test] +fn breeze_light_with_breeze_blue_matches_the_worked_example() { + let accented = KdeColorScheme::breeze_light().with_accent(BREEZE_BLUE); + let selection = accented.set(ColorSet::Selection); + assert_eq!(selection.background_normal, rgb(119, 198, 239)); + assert_eq!(selection.background_alternate, rgb(119, 198, 239)); + assert_eq!(selection.foreground_normal, rgb(0, 0, 0)); + assert_eq!(selection.foreground_inactive, rgb(0, 0, 0)); + assert_eq!(selection.foreground_active, BREEZE_BLUE); + assert_eq!(selection.decoration_focus, BREEZE_BLUE); + assert_eq!(selection.decoration_hover, BREEZE_BLUE); + + for set in [ + ColorSet::View, + ColorSet::Window, + ColorSet::Button, + ColorSet::Tooltip, + ColorSet::Header, + // Checked against its own 61,174,233: ratio 1, so darkened too. + ColorSet::Selection, + ] { + assert_eq!( + accented.set(set).foreground_link, + rgb(45, 127, 170), + "{set:?}" + ); + } + // 5.88 against 42,46,50: the accent itself. + assert_eq!( + accented.set(ColorSet::Complementary).foreground_link, + BREEZE_BLUE + ); + assert_eq!( + accented.set(ColorSet::Button).background_alternate, + rgb(118, 197, 238) + ); +} + +#[test] +fn breeze_dark_with_breeze_blue_matches_the_worked_example() { + let accented = KdeColorScheme::breeze_dark().with_accent(BREEZE_BLUE); + let selection = accented.set(ColorSet::Selection); + assert_eq!(selection.background_normal, rgb(48, 128, 170)); + assert_eq!(selection.foreground_normal, rgb(0, 0, 0)); + for set in [ + ColorSet::View, + ColorSet::Window, + ColorSet::Button, + ColorSet::Tooltip, + ColorSet::Header, + ] { + assert_eq!(accented.set(set).foreground_link, BREEZE_BLUE, "{set:?}"); + } + assert_eq!( + accented.set(ColorSet::Button).background_alternate, + rgb(55, 135, 177) + ); +} + +#[test] +fn breeze_light_with_its_own_accent_is_not_breeze_light() { + let light = KdeColorScheme::breeze_light(); + let accented = light.with_accent(BREEZE_BLUE); + assert_ne!(accented, light); + assert_ne!( + accented.set(ColorSet::Selection).background_normal, + light.set(ColorSet::Selection).background_normal + ); +} + +#[test] +fn the_link_is_made_readable_in_one_step() { + assert_eq!( + rgb8(readable_link(BREEZE_BLUE, rgb(255, 255, 255))), + [45, 127, 170] + ); + assert_eq!(readable_link(BREEZE_BLUE, rgb(20, 22, 24)), BREEZE_BLUE); + // A light accent on a lighter-than-black but darker background is + // lightened. + let lightened = readable_link(rgb(120, 120, 200), rgb(90, 90, 90)); + assert!(luma(lightened) > luma(rgb(120, 120, 200))); +} + +// ---- Rules of section g -------------------------------------------------- + +#[test] +fn applying_an_accent_twice_is_not_applying_it_once() { + let accent = ACCENT_SWATCHES[0]; + let once = KdeColorScheme::breeze_light().with_accent(accent); + let twice = once.with_accent(accent); + assert_ne!(once, twice); + // The first pass copies the stock Window colours into the Header + // [Inactive] group; the second copies the accented ones. + let inactive_focus = + |s: &KdeColorScheme| s.inactive_set(ColorSet::Header).unwrap().decoration_focus; + assert_eq!(inactive_focus(&once), BREEZE_BLUE); + assert_eq!(inactive_focus(&twice), accent); + // Applying to the original scheme again gives the same result. + assert_eq!(KdeColorScheme::breeze_light().with_accent(accent), once); +} + +#[test] +fn a_transparent_accent_copies_the_scheme() { + let light = KdeColorScheme::breeze_light(); + let same = light.with_accent(KdeColor::TRANSPARENT); + assert_eq!(same, light); + let out = written(&same); + assert_eq!( + out.get(&["Colors:Selection"], "BackgroundNormal"), + Some("61,174,233") + ); + // The effect groups are still written, with empty values where the + // scheme has no key. + assert_eq!(out.get(&["ColorEffects:Disabled"], "Enable"), Some("")); +} + +#[test] +fn a_transparent_accent_still_tints_inactive_subgroups_when_tinting_is_on() { + let scheme = parse_clean( + "[General]\nTintFactor=0.5\n[Colors:View]\nBackgroundNormal=200,40,40\n\ + [Colors:View][Inactive]\nBackgroundNormal=200,40,40\n", + ); + let out = scheme.with_accent(KdeColor::TRANSPARENT); + let out = written(&out); + // Not tinted outside [Inactive]: there is no accent. + assert_eq!( + out.get(&["Colors:View"], "BackgroundNormal"), + Some("200,40,40") + ); + let tinted = oklab_tint(rgb(200, 40, 40), KdeColor::TRANSPARENT, 0.5).to_kconfig_text(); + assert_ne!(tinted, "200,40,40"); + assert_eq!( + out.get(&["Colors:View", "Inactive"], "BackgroundNormal"), + Some(tinted.as_str()) + ); +} + +#[test] +fn copied_keys_keep_their_text_and_missing_ones_stay_missing() { + let scheme = parse_clean( + "[Colors:View]\nBackgroundNormal=#ffffff\nForegroundNormal=#232629\n[Colors:Window]\nForegroundVisited=#9b59b6\n", + ); + let out = scheme.with_accent(BREEZE_BLUE); + let out = written(&out); + assert_eq!( + out.get(&["Colors:View"], "ForegroundNormal"), + Some("#232629") + ); + assert_eq!(out.get(&["Colors:View"], "BackgroundAlternate"), None); + assert_eq!( + out.get(&["Colors:Window"], "ForegroundVisited"), + Some("#9b59b6") + ); + // The accent keys are written in every group, missing or not. + assert_eq!( + out.get(&["Colors:Tooltip"], "DecorationHover"), + Some("61,174,233") + ); + // A group without BackgroundNormal checks the link against black. + assert_eq!( + out.get(&["Colors:Tooltip"], "ForegroundLink"), + Some( + readable_link(BREEZE_BLUE, KdeColor::BLACK) + .to_kconfig_text() + .as_str() + ) + ); + // No Header group in the scheme: none written. + assert!(!out.group_exists(&["Colors:Header"])); +} + +#[test] +fn tinting_skips_keys_the_scheme_lacks() { + let scheme = parse_clean( + "[General]\nTintFactor=0.3\n[Colors:View]\nBackgroundNormal=255,255,255\nForegroundNormal=35,38,41\n", + ); + let accent = ACCENT_SWATCHES[4]; + let out = scheme.with_accent(accent); + let out = written(&out); + let tinted = |c: KdeColor| oklab_tint(c, accent, 0.3).to_kconfig_text(); + assert_eq!( + out.get(&["Colors:View"], "BackgroundNormal"), + Some(tinted(rgb(255, 255, 255)).as_str()) + ); + assert_eq!( + out.get(&["Colors:View"], "ForegroundNormal"), + Some(tinted(rgb(35, 38, 41)).as_str()) + ); + assert_eq!(out.get(&["Colors:View"], "BackgroundAlternate"), None); + assert_eq!(out.get(&["Colors:Window"], "BackgroundNormal"), None); + // The result carries no tint factor. + assert!(!out.has_key(&["General"], "TintFactor")); +} + +#[test] +fn breeze_classic_has_no_header_and_an_accent_title_bar() { + let classic = KdeColorScheme::breeze_classic(); + let accent = ACCENT_SWATCHES[1]; + let accented = classic.with_accent(accent); + let out = written(&accented); + assert!(!out.group_exists(&["Colors:Header"])); + assert!(!accented.header_group_present); + // The accent title bar without tinting: only the active title bar. + let window = rgb(239, 240, 241); + let fill = accent_over(accent, window); + assert_eq!(accented.wm.active_background, Some(fill)); + assert_eq!( + accented.wm.active_foreground, + Some(black_or_white_on(fill, true)) + ); + assert_eq!(accented.wm.inactive_background, Some(rgb(239, 240, 241))); + assert_eq!(accented.wm.active_blend, Some(rgb(252, 252, 252))); + assert!(!accented.titlebar_is_accent_colored); +} + +#[test] +fn a_scheme_without_wm_colours_gets_its_resolved_header_colours() { + let scheme = parse_clean( + "[Colors:Window]\nBackgroundNormal=200,201,202\nForegroundNormal=1,2,3\n\ + [ColorEffects:Inactive]\nEnable=true\nIntensityEffect=2\nIntensityAmount=0.5\n", + ); + let accented = scheme.with_accent(BREEZE_BLUE); + let active = scheme.state_colors(ColorState::Active, ColorSet::Header); + let inactive = scheme.state_colors(ColorState::Inactive, ColorSet::Header); + assert_eq!(active.background_normal, rgb(200, 201, 202)); + assert_ne!(inactive.background_normal, active.background_normal); + // Written as text, so compared in 8 bits. + let wm = accented.wm; + let eight = |c: Option| c.map(KdeColor::to_rgba8); + let want = |c: KdeColor| Some(c.to_rgba8()); + assert_eq!(eight(wm.active_background), want(active.background_normal)); + assert_eq!(eight(wm.active_foreground), want(active.foreground_normal)); + assert_eq!( + eight(wm.inactive_background), + want(inactive.background_normal) + ); + assert_eq!( + eight(wm.inactive_foreground), + want(inactive.foreground_normal) + ); + assert_eq!(eight(wm.active_blend), want(active.background_normal)); + assert_eq!(eight(wm.inactive_blend), want(inactive.background_normal)); +} + +#[test] +fn tinting_without_an_accent_title_bar_tints_both_title_bars() { + let scheme = parse_clean( + "[General]\nTintFactor=0.2\n[Colors:Window]\nBackgroundNormal=239,240,241\n[WM]\nactiveBackground=1,1,1\n", + ); + let accent = ACCENT_SWATCHES[2]; + let wm = scheme.with_accent(accent).wm; + // Written as text, so compared in 8 bits. + let eight = |c: Option| c.map(KdeColor::to_rgba8); + let tinted = oklab_tint(rgb(239, 240, 241), accent, 0.2); + let want = |c: KdeColor| Some(c.to_rgba8()); + assert_eq!(eight(wm.active_background), want(tinted)); + assert_eq!( + eight(wm.active_foreground), + want(black_or_white_on(tinted, true)) + ); + assert_eq!(eight(wm.inactive_background), want(tinted)); + assert_eq!( + eight(wm.inactive_foreground), + want(black_or_white_on(tinted, false)) + ); +} + +#[test] +fn the_kde_group_is_written_as_read_or_with_its_defaults() { + let out = parse_clean("").with_accent(BREEZE_BLUE); + let out = written(&out); + assert_eq!(out.get(&["KDE"], "contrast"), Some("7")); + assert_eq!(out.get(&["KDE"], "frameContrast"), Some("0.2")); + + let raw = parse_clean("[KDE]\ncontrast=3\nframeContrast=1.5\n"); + let out = raw.with_accent(BREEZE_BLUE); + assert_eq!(written(&out).get(&["KDE"], "contrast"), Some("3")); + // Not clamped when written; clamped when read back. + assert_eq!(written(&out).get(&["KDE"], "frameContrast"), Some("1.5")); + assert_eq!(out.frame_contrast, 1.0); +} + +#[test] +fn every_effect_key_is_written_and_empty_ones_read_as_enabled() { + let accented = parse_clean("").with_accent(BREEZE_BLUE); + let out = written(&accented); + for group in ["ColorEffects:Inactive", "ColorEffects:Disabled"] { + assert_eq!(out.keys(&[group]).len(), 9, "{group}"); + assert_eq!(out.get(&[group], "Enable"), Some(""), "{group}"); + } + // A scheme with no Inactive effects group gets them switched on, as + // KDE's empty Enable= reads. + assert!(accented.inactive_effect.enabled); + assert!(accented.disabled_effect.enabled); +} + +#[test] +fn the_accented_scheme_keeps_its_name() { + let accented = KdeColorScheme::breeze_dark().with_accent(BREEZE_BLUE); + assert_eq!(accented.name.as_deref(), Some("Breeze Dark")); + assert_eq!(accented.scheme_id.as_deref(), Some("BreezeDark")); + assert_eq!(accented.accent, None); +} + +#[test] +fn a_teksilo_color_is_accepted() { + let from_tokens = KdeColorScheme::breeze_light().with_accent(BREEZE_BLUE.to_color()); + assert_eq!( + from_tokens, + KdeColorScheme::breeze_light().with_accent(BREEZE_BLUE) + ); +} diff --git a/crates/teksilo-kde-scheme/tests/cascade.rs b/crates/teksilo-kde-scheme/tests/cascade.rs index 661c00f06..7d9c50d29 100644 --- a/crates/teksilo-kde-scheme/tests/cascade.rs +++ b/crates/teksilo-kde-scheme/tests/cascade.rs @@ -461,9 +461,9 @@ fn a_desktop_without_colour_groups_reads_the_scheme_file_over_kdeglobals() { let var = env(&[]); let locations = KdeConfigLocations::from_env(env(&[])); let expansion = locations.expansion_env(&var); - let kdeglobals = [user( - "[KDE]\nframeContrast=0.5\n[General]\nAccentColor=233,61,61\n", - )]; + // No accent: an accent would be applied to the scheme file, and the + // application writes its own frameContrast (see the next test). + let kdeglobals = [user("[KDE]\nframeContrast=0.5\n")]; let scheme_file = layer("[Colors:Window]\nBackgroundNormal=10,20,30\n[KDE]\ncontrast=4\n"); let desktop = KdeDesktop::from_layers( &KdeDesktopLayers { @@ -481,10 +481,7 @@ fn a_desktop_without_colour_groups_reads_the_scheme_file_over_kdeglobals() { desktop.scheme.sets[1].background_normal, teksilo_kde_scheme::KdeColor::rgb8(10, 20, 30) ); - assert_eq!( - desktop.user_accent, - Some(teksilo_kde_scheme::KdeColor::rgb8(233, 61, 61)) - ); + assert_eq!(desktop.user_accent, None); let builtin = KdeDesktop::from_layers( &KdeDesktopLayers { @@ -501,3 +498,97 @@ fn a_desktop_without_colour_groups_reads_the_scheme_file_over_kdeglobals() { ); assert_eq!(builtin.scheme.frame_contrast, 0.5); } + +#[test] +fn a_desktop_without_colour_groups_applies_the_user_accent_to_the_scheme_file() { + use teksilo_kde_scheme::{ColorSet, KdeColor, KdeColorScheme}; + + let var = env(&[]); + let locations = KdeConfigLocations::from_env(env(&[])); + let expansion = locations.expansion_env(&var); + let accent = KdeColor::rgb8(233, 61, 61); + let kdeglobals = [user( + "[KDE]\nframeContrast=0.5\n[General]\nAccentColor=233,61,61\n", + )]; + let file_text = "[Colors:Window]\nBackgroundNormal=10,20,30\n[KDE]\ncontrast=4\n"; + let scheme_file = layer(file_text); + let desktop = KdeDesktop::from_layers( + &KdeDesktopLayers { + kdeglobals: &kdeglobals, + breezerc: &[], + scheme_file: Some(&scheme_file), + }, + &expansion, + ); + assert_eq!(desktop.scheme_origin, SchemeOrigin::SchemeFile); + assert_eq!(desktop.user_accent, Some(accent)); + let accented = KdeColorScheme::parse(file_text).0.with_accent(accent); + assert_eq!(desktop.scheme.sets, accented.sets); + assert_eq!( + desktop.scheme.set(ColorSet::Window).decoration_focus, + accent + ); + assert_eq!(desktop.scheme.contrast, 4); + // The accent application writes frameContrast, 0.2 when the scheme file + // has none, over kdeglobals' 0.5. + assert_eq!(desktop.scheme.frame_contrast, 0.2); + + let builtin = KdeDesktop::from_layers( + &KdeDesktopLayers { + kdeglobals: &kdeglobals, + breezerc: &[], + scheme_file: None, + }, + &expansion, + ); + assert_eq!(builtin.scheme_origin, SchemeOrigin::BuiltIn); + let light = KdeColorScheme::breeze_light().with_accent(accent); + assert_eq!(builtin.scheme.sets, light.sets); + assert_eq!(builtin.scheme.inactive_sets, light.inactive_sets); + assert_eq!(builtin.scheme.wm, light.wm); +} + +#[test] +fn colour_groups_in_kdeglobals_are_not_accented_again() { + use teksilo_kde_scheme::{ColorSet, KdeColor}; + + let var = env(&[]); + let locations = KdeConfigLocations::from_env(env(&[])); + let expansion = locations.expansion_env(&var); + let kdeglobals = [user( + "[Colors:View]\nDecorationFocus=1,2,3\n[General]\nAccentColor=233,61,61\n", + )]; + let desktop = KdeDesktop::from_layers( + &KdeDesktopLayers { + kdeglobals: &kdeglobals, + breezerc: &[], + scheme_file: None, + }, + &expansion, + ); + assert_eq!(desktop.scheme_origin, SchemeOrigin::Kdeglobals); + assert_eq!( + desktop.scheme.set(ColorSet::View).decoration_focus, + KdeColor::rgb8(1, 2, 3) + ); +} + +#[test] +fn a_transparent_user_accent_is_not_applied_in_the_fallback() { + let var = env(&[]); + let locations = KdeConfigLocations::from_env(env(&[])); + let expansion = locations.expansion_env(&var); + let kdeglobals = [user("[General]\nAccentColor=transparent\n")]; + let desktop = KdeDesktop::from_layers( + &KdeDesktopLayers { + kdeglobals: &kdeglobals, + breezerc: &[], + scheme_file: None, + }, + &expansion, + ); + assert_eq!(desktop.user_accent, None); + let light = teksilo_kde_scheme::KdeColorScheme::breeze_light(); + assert_eq!(desktop.scheme.sets, light.sets); + assert_eq!(desktop.scheme.wm, light.wm); +} diff --git a/crates/teksilo-kde-scheme/tests/golden_accent.rs b/crates/teksilo-kde-scheme/tests/golden_accent.rs new file mode 100644 index 000000000..9829c2b2e --- /dev/null +++ b/crates/teksilo-kde-scheme/tests/golden_accent.rs @@ -0,0 +1,198 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! `KdeColorScheme::with_accent` against the golden vectors +//! `tools/kde_golden/vectors/accent.json`: the `kdeglobals` Plasma 6.8 +//! wrote for four schemes and the ten swatches, read back key by key. +//! +//! It also checks that accenting a built-in Breeze constant gives exactly +//! what accenting the vendored stock file gives. The vectors and the +//! fixtures live outside the published crate, so this file is left out of +//! the package (the `exclude` list in `Cargo.toml`). + +use std::collections::BTreeSet; + +use serde_json::{Map, Value}; +use teksilo_kde_scheme::{ACCENT_SWATCHES, KConfig, KdeColor, KdeColorScheme}; + +const ACCENT_JSON: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../tools/kde_golden/vectors/accent.json" +)); +const BREEZE_LIGHT: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/tests/fixtures/breeze-v6.8.0/BreezeLight.colors" +)); +const BREEZE_DARK: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/tests/fixtures/breeze-v6.8.0/BreezeDark.colors" +)); + +fn vectors() -> Value { + serde_json::from_str(ACCENT_JSON).expect("accent.json parses") +} + +fn cases(all: &Value) -> &[Value] { + let list = all["cases"] + .as_array() + .expect("accent.json has a case list"); + assert!(!list.is_empty(), "accent.json has no case"); + list +} + +/// A group name as the vectors write it (`Colors:Header][Inactive`) as a +/// group path. +fn path(name: &str) -> Vec<&str> { + name.split("][").collect() +} + +fn object<'a>(value: &'a Value, what: &str) -> &'a Map { + value + .as_object() + .unwrap_or_else(|| panic!("{what} is an object")) +} + +fn text(value: &Value) -> &str { + value.as_str().expect("a configuration value is a string") +} + +/// The scheme file the vectors record as the input of a scheme, as +/// configuration text. +fn scheme_text(input: &Value) -> String { + let mut out = String::new(); + for (group, keys) in object(input, "a scheme input") { + out.push('['); + out.push_str(group); + out.push_str("]\n"); + for (key, value) in object(keys, "a group") { + out.push_str(key); + out.push('='); + out.push_str(text(value)); + out.push('\n'); + } + } + out +} + +fn parse_clean(text: &str) -> KdeColorScheme { + let (scheme, diagnostics) = KdeColorScheme::parse(text); + assert!(diagnostics.is_empty(), "{diagnostics:?}"); + scheme +} + +fn accent_of(case: &Value) -> KdeColor { + KdeColor::parse(text(&case["accent"])).expect("the accent is a colour") +} + +/// The groups `[General]` aside: the accent procedure writes only a digest +/// there, which Teksilo leaves out (spec g.2), and the scheme name the +/// vectors hold comes from applying the scheme, not from the accent. +fn compared(group: &[&str]) -> bool { + group != ["General"] +} + +#[test] +fn every_accent_case_writes_exactly_what_plasma_wrote() { + let all = vectors(); + let mut failures = Vec::new(); + let mut checked = 0; + for case in cases(&all) { + let name = text(&case["scheme"]); + let input = &all["schemes"][name]["input"]; + let label = format!("{name} {}", text(&case["accent"])); + let accented = parse_clean(&scheme_text(input)).with_accent(accent_of(case)); + let written = accented.source().expect("an accented scheme has a source"); + + let mut expected_keys = BTreeSet::new(); + for (group, keys) in object(&case["kdeglobals"], "kdeglobals") { + let group = path(group); + if !compared(&group) { + continue; + } + for (key, value) in object(keys, "a group") { + expected_keys.insert((group.join("]["), key.clone())); + checked += 1; + let got = written.get(&group, key); + if got != Some(text(value)) { + failures.push(format!( + "{label} [{}] {key}: wrote {got:?}, Plasma wrote {value}", + group.join("][") + )); + } + } + } + for group in written.groups() { + if !compared(&group) { + continue; + } + for key in written.keys(&group) { + if !expected_keys.contains(&(group.join("]["), key.to_owned())) { + failures.push(format!( + "{label} [{}] {key}: written, but Plasma did not write it", + group.join("][") + )); + } + } + } + // The accent option writes no AccentColor (spec g.2). + if written.has_key(&["General"], "AccentColor") { + failures.push(format!("{label}: AccentColor written")); + } + } + assert!(checked > 0, "no key was checked"); + assert!( + failures.is_empty(), + "{} differences:\n{}", + failures.len(), + failures.join("\n") + ); +} + +#[test] +fn the_cases_cover_every_swatch_on_every_scheme() { + let all = vectors(); + let schemes = object(&all["schemes"], "schemes"); + for name in schemes.keys() { + let accents: Vec = cases(&all) + .iter() + .filter(|c| c["scheme"] == name.as_str()) + .map(accent_of) + .collect(); + assert_eq!(accents, ACCENT_SWATCHES, "the swatches accented on {name}"); + } +} + +#[test] +fn the_vector_inputs_of_the_stock_schemes_are_the_vendored_files() { + let all = vectors(); + for (name, file) in [("BreezeLight", BREEZE_LIGHT), ("BreezeDark", BREEZE_DARK)] { + let from_vectors = KConfig::parse(&scheme_text(&all["schemes"][name]["input"])).0; + let from_file = KConfig::parse(file).0; + assert_eq!(from_vectors, from_file, "{name}"); + } +} + +#[test] +fn accenting_a_breeze_constant_is_accenting_its_stock_file() { + for (constant, file) in [ + (KdeColorScheme::breeze_light(), BREEZE_LIGHT), + (KdeColorScheme::breeze_dark(), BREEZE_DARK), + ] { + let file = parse_clean(file); + for accent in ACCENT_SWATCHES.into_iter().chain([ + KdeColor::rgb8(0, 0, 0), + KdeColor::rgb8(255, 255, 255), + KdeColor::rgba8(10, 200, 90, 128), + KdeColor::TRANSPARENT, + ]) { + let from_constant = constant.with_accent(accent); + let from_file = file.with_accent(accent); + assert_eq!(from_constant, from_file, "accent {accent}"); + assert_eq!( + from_constant.source(), + from_file.source(), + "the written configuration for accent {accent}" + ); + } + } +} From 0a360610bded65151f9d6789373a9da95b99331f Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 12:33:25 +0200 Subject: [PATCH 16/59] feat(platform): read the desktop portal and AT-SPI flag over zbus New module linux_portal reads org.freedesktop.portal.Settings on org.freedesktop.portal.Desktop /org/freedesktop/portal/desktop with ReadOne, and falls back to the deprecated Read, whose reply wraps the value in one more variant, when the portal answers UnknownMethod. It decodes a u32 (color-scheme, contrast, reduced-motion) and the (ddd) accent-color tuple, which is rejected when a component is outside 0..=1 or NaN, as the portal specification says. A boolean property is read with org.freedesktop.DBus.Properties.Get, which the AT-SPI ScreenReaderEnabled read now uses on the same bus name, path, interface and property. The reads are blocking and answer None on any failure. One session connection per process is made on the first read and reused; a connection that fails at the socket level is dropped and made again on the next read. Connecting (socket, authentication, Hello) and every reply are bounded by 500 ms: a running portal answers in milliseconds and a cold D-Bus activation usually within a few hundred, a missed value falls back to the desktop's configuration, and busctl waited up to sd-bus's 25 s default. A destination that let a read time out, or a bus that could not be connected to, is left alone for 5 s, so the burst of startup reads pays a hung portal once rather than once per setting, while a later re-query tries again. os_theme and accessibility_prefs call the new reads. read_portal_u32, read_portal_rgb, read_dbus_bool_property, parse_busctl_bool and their tests are deleted from linux_helpers, which no longer starts busctl; read_gsettings stays a subprocess. The module has the cfg of linux_helpers (target_os = "linux"), whose callers are Linux-only. zbus keeps its one feature, async-io (its executor and reactor); blocking-api is not enabled since the reads drive the async API with async_io::block_on. async-io 2.6 becomes a direct dependency for the timer that bounds connecting, which zbus's method timeout does not cover. Both are the versions already in Cargo.lock, so no crate is added and zbus stays a single version. Tests: pure decode tests (u32, the nested Read reply, accent tuples in and out of range, wrong types and shapes, booleans) and the quiet period. A real-bus test, run only with TEKSILO_DBUS_TESTS=1 and otherwise skipped with a message, starts a private dbus-daemon on a configuration that activates no service, serves a fake portal and AT-SPI status object with zbus, and checks the reads, error and wrong-type replies, a timeout and the quiet period after it, the ReadOne-to-Read fallback on a portal with only Read, and an absent bus. The bus address is passed to the reader explicitly. Checked with cargo check on x86_64-pc-windows-gnu and aarch64-apple-darwin. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 11 + Cargo.lock | 1 + crates/teksilo-platform/Cargo.toml | 13 +- .../src/accessibility_prefs.rs | 20 +- crates/teksilo-platform/src/lib.rs | 2 + crates/teksilo-platform/src/linux_helpers.rs | 159 +------ crates/teksilo-platform/src/linux_portal.rs | 369 ++++++++++++++++ .../src/linux_portal/tests.rs | 413 ++++++++++++++++++ crates/teksilo-platform/src/os_theme.rs | 5 +- 9 files changed, 824 insertions(+), 169 deletions(-) create mode 100644 crates/teksilo-platform/src/linux_portal.rs create mode 100644 crates/teksilo-platform/src/linux_portal/tests.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index df6ef8eb0..525dfbe66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -147,6 +147,17 @@ by crate for clarity, not because crates version independently. contrast where they fall short. Before, only the window, selection, button and tooltip colours were read. +#### Platform + +- **Reading the desktop's settings on Linux no longer starts a `busctl` + process.** The XDG desktop portal's colour scheme, accent colour, contrast + and reduced-motion settings, and the screen reader's on/off flag, are read + over the session bus directly. A portal or bus that does not answer now + holds up startup by at most a second in all, where each read used to wait + up to 25 seconds. The settings are now also read on systems without + `busctl` installed, and from portals older than version 2 of the settings + interface. + ### Removed #### Theming diff --git a/Cargo.lock b/Cargo.lock index cdbe1a19d..179363667 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12019,6 +12019,7 @@ dependencies = [ "accesskit 0.25.1", "accesskit_winit", "arboard", + "async-io", "async-std", "dispatch2", "libc", diff --git a/crates/teksilo-platform/Cargo.toml b/crates/teksilo-platform/Cargo.toml index 91c6fd022..504cda454 100644 --- a/crates/teksilo-platform/Cargo.toml +++ b/crates/teksilo-platform/Cargo.toml @@ -210,9 +210,18 @@ libc = "0.2" # the CI job of the same name) fails the build if it ever forks. x11rb = "0.14" # Reporting each key to the AT-SPI registry (`key_report/atspi.rs`), which is -# how Orca's legacy keyboard device hears keys. The same zbus, with the same -# features, that `accesskit_unix` already links, so it adds no crate. +# how Orca's legacy keyboard device hears keys, and reading the XDG desktop +# portal's settings and the AT-SPI screen-reader flag (`linux_portal.rs`). +# The same zbus, with the same features, that `accesskit_unix` already links, +# so it adds no crate. `async-io` is the one feature needed: it is zbus's +# executor and reactor (zbus runs nothing without one, and tokio would add a +# runtime). `blocking-api` is not enabled: the reads drive the async API with +# `async_io::block_on`, so the blocking proxies would be dead code. zbus = { version = "5.19", default-features = false, features = ["async-io"] } +# The timer that bounds connecting to the session bus (`linux_portal.rs`), +# which zbus's method timeout does not cover, and `block_on` for its reads. +# The async-io zbus already links, so it adds no crate. +async-io = "2.6" [target.'cfg(all(unix, not(target_os = "macos")))'.dev-dependencies] # The X keysym constants, to check `key_report`'s hand-written keysym table diff --git a/crates/teksilo-platform/src/accessibility_prefs.rs b/crates/teksilo-platform/src/accessibility_prefs.rs index 33b40858c..edcfed18c 100644 --- a/crates/teksilo-platform/src/accessibility_prefs.rs +++ b/crates/teksilo-platform/src/accessibility_prefs.rs @@ -73,15 +73,16 @@ impl AccessibilityPreferences { } } -// ── Linux: XDG Desktop Portal via busctl + gsettings subprocess ───────────── +// ── Linux: XDG Desktop Portal and AT-SPI over zbus, gsettings subprocess ─── // -// Uses subprocess calls (`busctl`, `gsettings`) which are present on all major -// Linux desktops. This runs once at startup so subprocess overhead is negligible, -// and it avoids adding zbus as a direct dependency. +// The portal settings and the AT-SPI status flag are read over the session +// bus (`linux_portal`), each read bounded by a timeout. The GNOME fallbacks +// still run the `gsettings` tool. #[cfg(target_os = "linux")] mod platform { use super::{AccessibilityPreferences, ScreenReaderState}; - use crate::linux_helpers::{read_dbus_bool_property, read_gsettings, read_portal_u32}; + use crate::linux_helpers::read_gsettings; + use crate::linux_portal::{read_bool_property, read_portal_u32}; pub(super) fn query() -> AccessibilityPreferences { let mut prefs = AccessibilityPreferences::default(); @@ -135,11 +136,12 @@ mod platform { /// tree; this is the narrower question.) /// /// Advisory: Orca sets it, and an assistive technology that never touches - /// the status object will not. A machine with no a11y bus at all — no - /// `busctl`, a sandbox with no session bus, a desktop that does not run - /// one — answers `Unknown`, which behaves as "no". + /// the status object will not. A machine with no a11y bus at all (a + /// sandbox with no session bus, a desktop that does not run one), or a + /// bus that does not answer within `linux_portal::CALL_TIMEOUT`, answers + /// `Unknown`, which behaves as "no". fn query_screen_reader() -> ScreenReaderState { - match read_dbus_bool_property( + match read_bool_property( "org.a11y.Bus", "/org/a11y/bus", "org.a11y.Status", diff --git a/crates/teksilo-platform/src/lib.rs b/crates/teksilo-platform/src/lib.rs index 1a3e00fad..aa942bed6 100644 --- a/crates/teksilo-platform/src/lib.rs +++ b/crates/teksilo-platform/src/lib.rs @@ -12,6 +12,8 @@ pub mod file_dialog; pub mod key_report; #[cfg(target_os = "linux")] pub(crate) mod linux_helpers; +#[cfg(target_os = "linux")] +pub(crate) mod linux_portal; #[cfg(feature = "native-menu")] pub mod native_menu; pub mod os_theme; diff --git a/crates/teksilo-platform/src/linux_helpers.rs b/crates/teksilo-platform/src/linux_helpers.rs index 7744ac2da..840e08a5e 100644 --- a/crates/teksilo-platform/src/linux_helpers.rs +++ b/crates/teksilo-platform/src/linux_helpers.rs @@ -1,39 +1,12 @@ // SPDX-License-Identifier: MPL-2.0 // SPDX-FileCopyrightText: 2026 FernTech -//! Shared helpers for querying Linux desktop settings via subprocess calls. +//! Shared helpers for querying Linux desktop settings: the desktop in use, +//! and GNOME's settings through the `gsettings` tool. //! //! Used by both `accessibility_prefs` and `os_theme` modules. -//! These are `pub(crate)` — internal to teksilo-platform. - -/// Read a u32 value from the XDG Desktop Portal Settings via `busctl`. -/// -/// The portal method `org.freedesktop.portal.Settings.ReadOne` returns -/// a `Variant>`. `busctl` prints this as e.g. `v u 1`. -pub(crate) fn read_portal_u32(namespace: &str, key: &str) -> Option { - let output = std::process::Command::new("busctl") - .args([ - "--user", - "call", - "org.freedesktop.portal.Desktop", - "/org/freedesktop/portal/desktop", - "org.freedesktop.portal.Settings", - "ReadOne", - "ss", - namespace, - key, - ]) - .output() - .ok()?; - - if !output.status.success() { - return None; - } - - // Output format: "v u \n" — extract the last whitespace-separated token - let stdout = String::from_utf8_lossy(&output.stdout); - stdout.split_whitespace().last()?.parse::().ok() -} +//! These are `pub(crate)`, internal to teksilo-platform. The D-Bus reads (the +//! XDG desktop portal and AT-SPI) are in `linux_portal`. /// Read a gsettings value via the `gsettings` CLI tool. /// @@ -53,50 +26,6 @@ pub(crate) fn read_gsettings(schema: &str, key: &str) -> Option { Some(value.trim_matches('\'').to_string()) } -/// Read an RGB tuple from the XDG Desktop Portal via `busctl`. -/// -/// The portal `accent-color` key returns `(ddd)` — a struct of three doubles. -/// `busctl` prints this as e.g. `v "(ddd)" 0.2078 0.5176 0.8941`. -pub(crate) fn read_portal_rgb(namespace: &str, key: &str) -> Option<(f64, f64, f64)> { - let output = std::process::Command::new("busctl") - .args([ - "--user", - "call", - "org.freedesktop.portal.Desktop", - "/org/freedesktop/portal/desktop", - "org.freedesktop.portal.Settings", - "ReadOne", - "ss", - namespace, - key, - ]) - .output() - .ok()?; - - if !output.status.success() { - return None; - } - - let stdout = String::from_utf8_lossy(&output.stdout); - // Parse the three doubles from the output. - // busctl wraps in variant layers: could be `v "(ddd)" R G B` - // or `v v "(ddd)" R G B`. Parse from the end to be robust. - let parts: Vec<&str> = stdout.split_whitespace().collect(); - if parts.len() >= 3 { - let b = parts[parts.len() - 1].parse::().ok()?; - let g = parts[parts.len() - 2].parse::().ok()?; - let r = parts[parts.len() - 3].parse::().ok()?; - // Sanity check: RGB doubles should be in 0.0..=1.0 - if (0.0..=1.0).contains(&r) && (0.0..=1.0).contains(&g) && (0.0..=1.0).contains(&b) { - Some((r, g, b)) - } else { - None - } - } else { - None - } -} - /// Detect the current desktop environment from `$XDG_CURRENT_DESKTOP`. #[allow(dead_code)] pub(crate) enum Desktop { @@ -120,83 +49,3 @@ pub(crate) fn detect_desktop() -> Desktop { Desktop::Other(xdg) } } - -/// Parse the stdout of `busctl get-property` for a `b` (boolean) property. -/// -/// `busctl` prints a boolean property as the type code and the value on one -/// line: `b true` or `b false`. Anything else — a different type code, an error -/// string, an empty read — is `None` rather than a guess, because every caller -/// treats "cannot tell" and "no" differently. -/// -/// Split out from [`read_dbus_bool_property`] so the format this depends on can -/// be pinned by a test without a session bus. -pub(crate) fn parse_busctl_bool(stdout: &str) -> Option { - let mut tokens = stdout.split_whitespace(); - if tokens.next()? != "b" { - return None; - } - let value = match tokens.next()? { - "true" => true, - "false" => false, - _ => return None, - }; - // A well-formed boolean reply is exactly two tokens. More means the reply - // was something else that happens to start `b true`. - if tokens.next().is_some() { - return None; - } - Some(value) -} - -/// Read a boolean D-Bus property from the session bus via `busctl`. -/// -/// A different verb from [`read_portal_u32`], which *calls* -/// `org.freedesktop.portal.Settings.ReadOne`; this reads a property directly -/// off an interface, which is how the AT-SPI status object exposes its flags. -/// -/// `None` when `busctl` is absent, the service is not running, the sandbox -/// cannot reach the session bus, or the reply is not a boolean. Never panics. -pub(crate) fn read_dbus_bool_property( - service: &str, - path: &str, - interface: &str, - property: &str, -) -> Option { - let output = std::process::Command::new("busctl") - .args(["--user", "get-property", service, path, interface, property]) - .output() - .ok()?; - - if !output.status.success() { - return None; - } - - parse_busctl_bool(&String::from_utf8_lossy(&output.stdout)) -} - -#[cfg(test)] -mod tests { - use super::parse_busctl_bool; - - #[test] - fn busctl_bool_replies_parse() { - assert_eq!(parse_busctl_bool("b true\n"), Some(true)); - assert_eq!(parse_busctl_bool("b false\n"), Some(false)); - // Leading/trailing whitespace is `busctl`'s, not ours. - assert_eq!(parse_busctl_bool(" b true "), Some(true)); - } - - #[test] - fn non_boolean_replies_are_unknown_not_false() { - // A different type code: the property exists but is not a boolean. - assert_eq!(parse_busctl_bool("u 1\n"), None); - assert_eq!(parse_busctl_bool("s \"true\"\n"), None); - // An empty or truncated read. - assert_eq!(parse_busctl_bool(""), None); - assert_eq!(parse_busctl_bool("b\n"), None); - // A value that is neither of D-Bus's two boolean spellings. - assert_eq!(parse_busctl_bool("b 1\n"), None); - // A longer reply that merely begins like a boolean one. - assert_eq!(parse_busctl_bool("b true extra\n"), None); - } -} diff --git a/crates/teksilo-platform/src/linux_portal.rs b/crates/teksilo-platform/src/linux_portal.rs new file mode 100644 index 000000000..c1e3a57a4 --- /dev/null +++ b/crates/teksilo-platform/src/linux_portal.rs @@ -0,0 +1,369 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Desktop settings read over the D-Bus session bus with zbus: the XDG +//! desktop portal's `org.freedesktop.portal.Settings` and a boolean property +//! such as the AT-SPI `ScreenReaderEnabled` flag. +//! +//! Every read is blocking, bounded by [`CALL_TIMEOUT`], and answers `None` +//! on any failure: no bus, no portal, an error reply, a reply of the wrong +//! type, or no reply in time. Callers treat `None` as "cannot tell" and fall +//! back to the desktop's own configuration. +//! +//! One session connection per process is made on the first read and reused +//! by every later one. A connection that breaks is dropped and made again on +//! the next read. +//! +//! The decoding is pure ([`decode_u32`], [`decode_rgb`], [`decode_bool`], +//! [`read_reply_value`]) so its rules are tested without a bus. + +use std::future::{Future, poll_fn}; +use std::pin::pin; +use std::sync::{Mutex, PoisonError}; +use std::task::Poll; +use std::time::{Duration, Instant}; + +use zbus::zvariant::{OwnedValue, Value}; + +/// The portal's bus name, object path and settings interface. +const PORTAL: &str = "org.freedesktop.portal.Desktop"; +const PORTAL_PATH: &str = "/org/freedesktop/portal/desktop"; +const SETTINGS_INTERFACE: &str = "org.freedesktop.portal.Settings"; +const PROPERTIES_INTERFACE: &str = "org.freedesktop.DBus.Properties"; +/// The error a service answers for a method its interface does not have: a +/// portal older than version 2 of the settings interface, which has `Read` +/// and not `ReadOne`. +const UNKNOWN_METHOD: &str = "org.freedesktop.DBus.Error.UnknownMethod"; + +/// How long one read waits: for the connection to the bus (socket, the +/// authentication handshake and `Hello`) and then for each reply. +/// +/// A running portal answers a settings read in a few milliseconds. The slow +/// case is the first read of a session, when the bus starts the portal by +/// D-Bus activation; that usually completes within a few hundred +/// milliseconds. A read that misses its reply costs one value, which the +/// caller then reads from the desktop's configuration instead, whereas +/// waiting longer would hold up the first window: the `busctl` process this +/// replaces waited up to sd-bus's 25 s default on a hung portal. 500 ms +/// keeps a cold activation inside the bound on an ordinary machine and caps +/// what a hung bus can cost. +pub(crate) const CALL_TIMEOUT: Duration = Duration::from_millis(500); + +/// How long a destination that let a read time out, or a bus that could not +/// be connected to, is left alone. Startup reads several settings within a +/// few milliseconds of each other; without this, a hung portal would cost +/// [`CALL_TIMEOUT`] once per setting instead of once. A read made after the +/// quiet period (a re-query when the desktop's settings change) tries again. +const QUIET_PERIOD: Duration = Duration::from_secs(5); + +/// The session bus named by the environment, shared by every read in the +/// process. +static SESSION: Bus = Bus::session(); + +/// A `u32` setting of the portal (`color-scheme`, `contrast`, +/// `reduced-motion` in `org.freedesktop.appearance`). +pub(crate) fn read_portal_u32(namespace: &str, key: &str) -> Option { + SESSION.read_portal_u32(namespace, key) +} + +/// A `(ddd)` colour setting of the portal (`accent-color` in +/// `org.freedesktop.appearance`), as red, green and blue in `0.0..=1.0`. +pub(crate) fn read_portal_rgb(namespace: &str, key: &str) -> Option<(f64, f64, f64)> { + SESSION.read_portal_rgb(namespace, key) +} + +/// A boolean property read with `org.freedesktop.DBus.Properties.Get`. +pub(crate) fn read_bool_property( + service: &str, + path: &str, + interface: &str, + property: &str, +) -> Option { + SESSION.read_bool_property(service, path, interface, property) +} + +// ── Decoding ──────────────────────────────────────────────────────────────── + +/// A `u32` value, and nothing else: a portal that answered with another +/// integer type is not guessed at. +pub(crate) fn decode_u32(value: &Value<'_>) -> Option { + match value { + Value::U32(v) => Some(*v), + _ => None, + } +} + +/// A `(ddd)` structure whose three components are in `0.0..=1.0`. The portal +/// specification says an accent colour out of that range is to be treated as +/// unset, so one component outside it (or NaN) rejects the whole colour. +pub(crate) fn decode_rgb(value: &Value<'_>) -> Option<(f64, f64, f64)> { + let Value::Structure(structure) = value else { + return None; + }; + let [Value::F64(r), Value::F64(g), Value::F64(b)] = structure.fields() else { + return None; + }; + let in_range = |c: f64| (0.0..=1.0).contains(&c); + (in_range(*r) && in_range(*g) && in_range(*b)).then_some((*r, *g, *b)) +} + +/// A `b` value. +pub(crate) fn decode_bool(value: &Value<'_>) -> Option { + match value { + Value::Bool(v) => Some(*v), + _ => None, + } +} + +/// The setting inside a reply of the deprecated `Read`, which wraps the +/// value in one more variant than `ReadOne` does. A reply without that layer +/// is not a `Read` reply and gives `None`. +pub(crate) fn read_reply_value<'v>(value: &'v Value<'v>) -> Option<&'v Value<'v>> { + match value { + Value::Value(inner) => Some(inner), + _ => None, + } +} + +// ── Quiet periods ─────────────────────────────────────────────────────────── + +/// Destinations (and the bus itself, under the empty name) that are not to +/// be called before an instant. +#[derive(Debug, Default)] +struct QuietList { + entries: Vec<(String, Instant)>, +} + +impl QuietList { + const fn new() -> Self { + Self { + entries: Vec::new(), + } + } + + fn is_quiet(&self, name: &str, now: Instant) -> bool { + self.entries + .iter() + .any(|(entry, until)| entry == name && now < *until) + } + + fn silence(&mut self, name: &str, until: Instant) { + match self.entries.iter_mut().find(|(entry, _)| entry == name) { + Some((_, entry_until)) => *entry_until = until, + None => self.entries.push((name.to_owned(), until)), + } + } +} + +/// The key under which a failed connection is recorded. +const BUS_ITSELF: &str = ""; + +// ── The bus ───────────────────────────────────────────────────────────────── + +/// A session bus and its lazily made connection. +pub(crate) struct Bus { + /// `None` for the session bus the environment names; an address for a + /// bus named explicitly (the tests' private bus). + address: Option, + state: Mutex, +} + +struct BusState { + connection: Option, + quiet: QuietList, +} + +/// Why a call gave no value. +#[derive(Debug, PartialEq, Eq)] +enum CallError { + /// The service has the interface but not the method. + UnknownMethod, + /// Anything else: no bus, no service, another error, a timeout. + Failed, +} + +impl Bus { + const fn session() -> Self { + Self::with_address(None) + } + + /// A bus at an explicit address, so a test passes its private bus in + /// rather than through the environment. + #[cfg(test)] + pub(crate) fn at(address: String) -> Self { + Self::with_address(Some(address)) + } + + const fn with_address(address: Option) -> Self { + Self { + address, + state: Mutex::new(BusState { + connection: None, + quiet: QuietList::new(), + }), + } + } + + pub(crate) fn read_portal_u32(&self, namespace: &str, key: &str) -> Option { + self.read_setting(namespace, key, decode_u32) + } + + pub(crate) fn read_portal_rgb(&self, namespace: &str, key: &str) -> Option<(f64, f64, f64)> { + self.read_setting(namespace, key, decode_rgb) + } + + pub(crate) fn read_bool_property( + &self, + service: &str, + path: &str, + interface: &str, + property: &str, + ) -> Option { + let value = self + .call( + service, + path, + PROPERTIES_INTERFACE, + "Get", + &(interface, property), + ) + .ok()?; + decode_bool(&value) + } + + /// `ReadOne`, or `Read` when the portal does not have `ReadOne`. + fn read_setting( + &self, + namespace: &str, + key: &str, + decode: impl Fn(&Value<'_>) -> Option, + ) -> Option { + let body = (namespace, key); + match self.call(PORTAL, PORTAL_PATH, SETTINGS_INTERFACE, "ReadOne", &body) { + Ok(value) => decode(&value), + Err(CallError::UnknownMethod) => { + let value = self + .call(PORTAL, PORTAL_PATH, SETTINGS_INTERFACE, "Read", &body) + .ok()?; + decode(read_reply_value(&value)?) + } + Err(CallError::Failed) => None, + } + } + + fn lock(&self) -> std::sync::MutexGuard<'_, BusState> { + self.state.lock().unwrap_or_else(PoisonError::into_inner) + } + + /// The shared connection, made on first use. The lock is held while + /// connecting, so concurrent first reads make one connection; the wait + /// is bounded by [`CALL_TIMEOUT`]. + fn connection(&self) -> Option { + let mut state = self.lock(); + if let Some(connection) = &state.connection { + return Some(connection.clone()); + } + let now = Instant::now(); + if state.quiet.is_quiet(BUS_ITSELF, now) { + return None; + } + let address = self.address.as_deref(); + let connected = async_io::block_on(within(CALL_TIMEOUT, async move { + let builder = match address { + Some(address) => zbus::connection::Builder::address(address), + None => zbus::connection::Builder::session(), + }; + builder + .ok()? + .method_timeout(CALL_TIMEOUT) + .build() + .await + .ok() + })) + .flatten(); + match connected { + Some(connection) => { + state.connection = Some(connection.clone()); + Some(connection) + } + None => { + state + .quiet + .silence(BUS_ITSELF, Instant::now() + QUIET_PERIOD); + None + } + } + } + + /// One method call whose reply body is a single variant. + fn call( + &self, + destination: &str, + path: &str, + interface: &str, + method: &str, + body: &B, + ) -> Result + where + B: zbus::export::serde::Serialize + zbus::zvariant::DynamicType, + { + if self.lock().quiet.is_quiet(destination, Instant::now()) { + return Err(CallError::Failed); + } + let connection = self.connection().ok_or(CallError::Failed)?; + // The connection carries the method timeout, so a reply that does + // not come back in time is a `TimedOut` error rather than a wait. + let reply = async_io::block_on(connection.call_method( + Some(destination), + path, + Some(interface), + method, + body, + )); + match reply { + Ok(message) => message + .body() + .deserialize::() + .map_err(|_| CallError::Failed), + Err(zbus::Error::MethodError(name, _, _)) if name.as_str() == UNKNOWN_METHOD => { + Err(CallError::UnknownMethod) + } + Err(zbus::Error::MethodError(..) | zbus::Error::FDO(_)) => Err(CallError::Failed), + Err(zbus::Error::InputOutput(error)) + if error.kind() == std::io::ErrorKind::TimedOut => + { + self.lock() + .quiet + .silence(destination, Instant::now() + QUIET_PERIOD); + Err(CallError::Failed) + } + Err(zbus::Error::InputOutput(_)) => { + // The connection itself failed: make a new one next time. + self.lock().connection = None; + Err(CallError::Failed) + } + // A name or body zbus refused before sending, or a reply it + // could not read: the connection is still good. + Err(_) => Err(CallError::Failed), + } + } +} + +/// `future`'s output, or `None` when `limit` passes first. +async fn within(limit: Duration, future: impl Future) -> Option { + let mut future = pin!(future); + let mut timer = pin!(async_io::Timer::after(limit)); + poll_fn(|cx| { + if let Poll::Ready(output) = future.as_mut().poll(cx) { + return Poll::Ready(Some(output)); + } + if timer.as_mut().poll(cx).is_ready() { + return Poll::Ready(None); + } + Poll::Pending + }) + .await +} + +#[cfg(test)] +mod tests; diff --git a/crates/teksilo-platform/src/linux_portal/tests.rs b/crates/teksilo-platform/src/linux_portal/tests.rs new file mode 100644 index 000000000..f8641aeac --- /dev/null +++ b/crates/teksilo-platform/src/linux_portal/tests.rs @@ -0,0 +1,413 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +use std::time::{Duration, Instant}; + +use zbus::zvariant::Value; + +use super::{QuietList, decode_bool, decode_rgb, decode_u32, read_reply_value}; + +fn rgb(r: f64, g: f64, b: f64) -> Value<'static> { + Value::from((r, g, b)) +} + +#[test] +fn a_u32_setting_decodes() { + assert_eq!(decode_u32(&Value::U32(0)), Some(0)); + assert_eq!(decode_u32(&Value::U32(1)), Some(1)); + assert_eq!(decode_u32(&Value::U32(2)), Some(2)); +} + +#[test] +fn a_u32_setting_of_another_type_is_unknown() { + assert_eq!(decode_u32(&Value::I32(1)), None); + assert_eq!(decode_u32(&Value::U8(1)), None); + assert_eq!(decode_u32(&Value::Bool(true)), None); + assert_eq!(decode_u32(&Value::from("1")), None); + // A `Read` reply handed to the decoder without its extra layer removed. + assert_eq!(decode_u32(&Value::Value(Box::new(Value::U32(1)))), None); +} + +#[test] +fn a_read_reply_loses_exactly_one_variant() { + let reply = Value::Value(Box::new(Value::U32(1))); + let inner = read_reply_value(&reply).expect("one variant layer"); + assert_eq!(decode_u32(inner), Some(1)); + + let colour = Value::Value(Box::new(rgb(0.25, 0.5, 1.0))); + assert_eq!( + decode_rgb(read_reply_value(&colour).expect("one variant layer")), + Some((0.25, 0.5, 1.0)) + ); + + // Two extra layers leave one, which no decoder accepts. + let doubled = Value::Value(Box::new(Value::Value(Box::new(Value::U32(1))))); + assert_eq!(read_reply_value(&doubled).and_then(decode_u32), None); +} + +#[test] +fn a_read_reply_without_its_extra_variant_is_unknown() { + assert!(read_reply_value(&Value::U32(1)).is_none()); + assert!(read_reply_value(&rgb(0.0, 0.0, 0.0)).is_none()); +} + +#[test] +fn an_accent_colour_in_range_decodes() { + assert_eq!( + decode_rgb(&rgb(0.2078, 0.5176, 0.8941)), + Some((0.2078, 0.5176, 0.8941)) + ); + // Both ends of the range are in it. + assert_eq!(decode_rgb(&rgb(0.0, 0.0, 0.0)), Some((0.0, 0.0, 0.0))); + assert_eq!(decode_rgb(&rgb(1.0, 1.0, 1.0)), Some((1.0, 1.0, 1.0))); +} + +#[test] +fn an_accent_colour_out_of_range_is_unset() { + assert_eq!(decode_rgb(&rgb(-0.01, 0.5, 0.5)), None); + assert_eq!(decode_rgb(&rgb(0.5, 1.01, 0.5)), None); + assert_eq!(decode_rgb(&rgb(0.5, 0.5, 255.0)), None); + assert_eq!(decode_rgb(&rgb(f64::NAN, 0.5, 0.5)), None); + assert_eq!(decode_rgb(&rgb(0.5, f64::INFINITY, 0.5)), None); +} + +#[test] +fn an_accent_colour_of_another_shape_is_unknown() { + // Two or four components. + assert_eq!(decode_rgb(&Value::from((0.5, 0.5))), None); + assert_eq!(decode_rgb(&Value::from((0.5, 0.5, 0.5, 1.0))), None); + // Integers where doubles belong. + assert_eq!(decode_rgb(&Value::from((128_u32, 128_u32, 128_u32))), None); + assert_eq!(decode_rgb(&Value::from((0.5, 0.5, 1_u32))), None); + // Not a structure at all. + assert_eq!(decode_rgb(&Value::F64(0.5)), None); + assert_eq!(decode_rgb(&Value::U32(1)), None); + assert_eq!(decode_rgb(&Value::from(vec![0.5, 0.5, 0.5])), None); +} + +#[test] +fn a_boolean_property_decodes_and_nothing_else_does() { + assert_eq!(decode_bool(&Value::Bool(true)), Some(true)); + assert_eq!(decode_bool(&Value::Bool(false)), Some(false)); + assert_eq!(decode_bool(&Value::U32(1)), None); + assert_eq!(decode_bool(&Value::from("true")), None); + assert_eq!( + decode_bool(&Value::Value(Box::new(Value::Bool(true)))), + None + ); +} + +#[test] +fn a_silenced_name_is_quiet_until_its_instant_and_no_other_is() { + let start = Instant::now(); + let mut quiet = QuietList::new(); + assert!(!quiet.is_quiet("org.freedesktop.portal.Desktop", start)); + + quiet.silence( + "org.freedesktop.portal.Desktop", + start + Duration::from_secs(5), + ); + assert!(quiet.is_quiet("org.freedesktop.portal.Desktop", start)); + assert!(quiet.is_quiet( + "org.freedesktop.portal.Desktop", + start + Duration::from_millis(4999) + )); + assert!(!quiet.is_quiet( + "org.freedesktop.portal.Desktop", + start + Duration::from_secs(5) + )); + assert!(!quiet.is_quiet("org.a11y.Bus", start)); + + // Silencing again moves the instant rather than adding a second entry. + quiet.silence( + "org.freedesktop.portal.Desktop", + start + Duration::from_secs(1), + ); + assert!(!quiet.is_quiet( + "org.freedesktop.portal.Desktop", + start + Duration::from_secs(2) + )); + assert_eq!(quiet.entries.len(), 1); +} + +/// Reads against a private `dbus-daemon` serving a fake portal and a fake +/// AT-SPI status object. Opt-in, since it needs `dbus-daemon` installed: +/// run with `TEKSILO_DBUS_TESTS=1`. +mod real_bus { + use std::io::{BufRead, BufReader}; + use std::path::PathBuf; + use std::process::{Child, Command, Stdio}; + use std::sync::atomic::{AtomicUsize, Ordering}; + use std::time::{Duration, Instant}; + + use zbus::zvariant::{OwnedValue, Value}; + + use super::super::{Bus, CALL_TIMEOUT, PORTAL, PORTAL_PATH}; + + const APPEARANCE: &str = "org.freedesktop.appearance"; + /// A namespace whose reads the fake portal never answers in time. + const HANG: &str = "test.hang"; + + fn enabled() -> bool { + if std::env::var("TEKSILO_DBUS_TESTS").as_deref() == Ok("1") { + return true; + } + println!("skipped: set TEKSILO_DBUS_TESTS=1 to run the private dbus-daemon tests"); + false + } + + /// A `dbus-daemon` of our own, on a configuration that activates no + /// service (so nothing on the machine is started on it) and listens in + /// a directory of its own. Killed and cleaned up on drop. + struct PrivateBus { + child: Child, + dir: PathBuf, + address: String, + } + + impl PrivateBus { + fn start() -> Self { + static NEXT: AtomicUsize = AtomicUsize::new(0); + let dir = std::env::temp_dir().join(format!( + "teksilo-dbus-test-{}-{}", + std::process::id(), + NEXT.fetch_add(1, Ordering::Relaxed) + )); + std::fs::create_dir_all(&dir).expect("create the bus directory"); + let config = dir.join("bus.conf"); + std::fs::write( + &config, + format!( + r#" + + session + unix:dir={} + EXTERNAL + + + + + + +"#, + dir.display() + ), + ) + .expect("write the bus configuration"); + let mut child = Command::new("dbus-daemon") + .arg(format!("--config-file={}", config.display())) + .args(["--nofork", "--print-address"]) + .env_clear() + .stdin(Stdio::null()) + .stdout(Stdio::piped()) + .stderr(Stdio::inherit()) + .spawn() + .expect("start dbus-daemon (is it installed?)"); + let mut address = String::new(); + BufReader::new(child.stdout.take().expect("piped stdout")) + .read_line(&mut address) + .expect("read the bus address"); + let address = address.trim().to_owned(); + assert!(!address.is_empty(), "dbus-daemon printed no address"); + Self { + child, + dir, + address, + } + } + } + + impl Drop for PrivateBus { + fn drop(&mut self) { + let _ = self.child.kill(); + let _ = self.child.wait(); + let _ = std::fs::remove_dir_all(&self.dir); + } + } + + fn setting(namespace: &str, key: &str) -> Option> { + match (namespace, key) { + (APPEARANCE, "color-scheme") => Some(Value::U32(1)), + (APPEARANCE, "contrast") => Some(Value::U32(0)), + (APPEARANCE, "reduced-motion") => Some(Value::U32(1)), + (APPEARANCE, "accent-color") => Some(Value::from((0.25, 0.5, 0.75))), + ("test.wrong", "type") => Some(Value::from("dark")), + ("test.out-of-range", "accent-color") => Some(Value::from((0.25, 1.5, 0.75))), + _ => None, + } + } + + fn owned(value: Value<'static>) -> OwnedValue { + OwnedValue::try_from(value).expect("no file descriptors") + } + + fn not_found(namespace: &str, key: &str) -> zbus::fdo::Error { + zbus::fdo::Error::Failed(format!("{namespace} {key} not found")) + } + + /// A version 2 portal: `ReadOne` and `Read`. + struct CurrentPortal; + + #[zbus::interface(name = "org.freedesktop.portal.Settings")] + impl CurrentPortal { + async fn read_one(&self, namespace: &str, key: &str) -> zbus::fdo::Result { + if namespace == HANG { + async_io::Timer::after(CALL_TIMEOUT * 6).await; + } + setting(namespace, key) + .map(owned) + .ok_or_else(|| not_found(namespace, key)) + } + + /// Present, so a test can tell a reader that wrongly fell back from + /// one that read `ReadOne`: this answers a different value. + async fn read(&self, _namespace: &str, _key: &str) -> zbus::fdo::Result { + Ok(owned(Value::Value(Box::new(Value::U32(7))))) + } + } + + /// A portal older than version 2: only `Read`, whose reply wraps the + /// value in one more variant. + struct LegacyPortal; + + #[zbus::interface(name = "org.freedesktop.portal.Settings")] + impl LegacyPortal { + async fn read(&self, namespace: &str, key: &str) -> zbus::fdo::Result { + setting(namespace, key) + .map(|value| owned(Value::Value(Box::new(value)))) + .ok_or_else(|| not_found(namespace, key)) + } + } + + struct FakeStatus; + + #[zbus::interface(name = "org.a11y.Status")] + impl FakeStatus { + #[zbus(property)] + fn screen_reader_enabled(&self) -> bool { + true + } + + #[zbus(property)] + fn is_enabled(&self) -> u32 { + 1 + } + } + + fn serve(bus: &PrivateBus, portal: I) -> zbus::Connection { + async_io::block_on(async { + zbus::connection::Builder::address(bus.address.as_str())? + .name(PORTAL)? + .serve_at(PORTAL_PATH, portal)? + .name("org.a11y.Bus")? + .serve_at("/org/a11y/bus", FakeStatus)? + .build() + .await + }) + .expect("serve the fake portal") + } + + fn screen_reader(reader: &Bus) -> Option { + reader.read_bool_property( + "org.a11y.Bus", + "/org/a11y/bus", + "org.a11y.Status", + "ScreenReaderEnabled", + ) + } + + #[test] + fn reads_a_current_portal_with_read_one() { + if !enabled() { + return; + } + let bus = PrivateBus::start(); + let _server = serve(&bus, CurrentPortal); + let reader = Bus::at(bus.address.clone()); + + assert_eq!(reader.read_portal_u32(APPEARANCE, "color-scheme"), Some(1)); + assert_eq!(reader.read_portal_u32(APPEARANCE, "contrast"), Some(0)); + assert_eq!( + reader.read_portal_u32(APPEARANCE, "reduced-motion"), + Some(1) + ); + assert_eq!( + reader.read_portal_rgb(APPEARANCE, "accent-color"), + Some((0.25, 0.5, 0.75)) + ); + // An error reply and a reply of the wrong type or range are unknown, + // and none of them falls back to `Read`. + assert_eq!(reader.read_portal_u32(APPEARANCE, "no-such-key"), None); + assert_eq!(reader.read_portal_u32("test.wrong", "type"), None); + assert_eq!(reader.read_portal_rgb(APPEARANCE, "color-scheme"), None); + assert_eq!( + reader.read_portal_rgb("test.out-of-range", "accent-color"), + None + ); + + assert_eq!(screen_reader(&reader), Some(true)); + // A property of another type. + assert_eq!( + reader.read_bool_property( + "org.a11y.Bus", + "/org/a11y/bus", + "org.a11y.Status", + "IsEnabled" + ), + None + ); + // A service nobody owns on this bus. + assert_eq!( + reader.read_bool_property("org.example.Absent", "/", "org.example.Absent", "Flag"), + None + ); + + // A portal that does not answer costs one timeout, and the reads made + // during the quiet period after it do not wait at all. + let started = Instant::now(); + assert_eq!(reader.read_portal_u32(HANG, "anything"), None); + let waited = started.elapsed(); + assert!( + waited >= CALL_TIMEOUT && waited < CALL_TIMEOUT * 4, + "the hung read took {waited:?}" + ); + let started = Instant::now(); + assert_eq!(reader.read_portal_u32(APPEARANCE, "color-scheme"), None); + assert!(started.elapsed() < CALL_TIMEOUT / 2); + // Another destination on the same bus is still read. + assert_eq!(screen_reader(&reader), Some(true)); + } + + #[test] + fn falls_back_to_read_on_a_legacy_portal() { + if !enabled() { + return; + } + let bus = PrivateBus::start(); + let _server = serve(&bus, LegacyPortal); + let reader = Bus::at(bus.address.clone()); + + assert_eq!(reader.read_portal_u32(APPEARANCE, "color-scheme"), Some(1)); + assert_eq!(reader.read_portal_u32(APPEARANCE, "contrast"), Some(0)); + assert_eq!( + reader.read_portal_rgb(APPEARANCE, "accent-color"), + Some((0.25, 0.5, 0.75)) + ); + assert_eq!(reader.read_portal_u32(APPEARANCE, "no-such-key"), None); + assert_eq!(reader.read_portal_u32("test.wrong", "type"), None); + } + + #[test] + fn a_bus_that_is_not_there_reads_nothing_promptly() { + if !enabled() { + return; + } + let dir = std::env::temp_dir().join(format!("teksilo-dbus-absent-{}", std::process::id())); + let reader = Bus::at(format!("unix:path={}", dir.join("no-bus").display())); + let started = Instant::now(); + assert_eq!(reader.read_portal_u32(APPEARANCE, "color-scheme"), None); + assert_eq!(screen_reader(&reader), None); + assert!(started.elapsed() < Duration::from_secs(1)); + } +} diff --git a/crates/teksilo-platform/src/os_theme.rs b/crates/teksilo-platform/src/os_theme.rs index db0a7d11e..4256ec0ca 100644 --- a/crates/teksilo-platform/src/os_theme.rs +++ b/crates/teksilo-platform/src/os_theme.rs @@ -27,9 +27,8 @@ pub fn query_os_theme_colors() -> OsThemeColors { #[cfg(target_os = "linux")] mod platform { use super::*; - use crate::linux_helpers::{ - Desktop, detect_desktop, read_gsettings, read_portal_rgb, read_portal_u32, - }; + use crate::linux_helpers::{Desktop, detect_desktop, read_gsettings}; + use crate::linux_portal::{read_portal_rgb, read_portal_u32}; pub(super) fn query_color_scheme() -> ColorSchemePreference { // XDG portal: 0 = no preference, 1 = dark, 2 = light. From 433376319375a1534a5f6ce6cd1ba435d9462146 Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 12:59:43 +0200 Subject: [PATCH 17/59] feat(platform): read the KDE desktop through teksilo-kde-scheme New module os_theme/kde (Linux) reads a KDE Plasma desktop through the shared model of teksilo-kde-scheme, implemented from sections b, i and j and answer n.13 of engineering/docs/kde-breeze-spec.md. discover_kde reads every readable file of the kdeglobals and breezerc cascades and the first readable scheme-file candidate, all through an injected read closure, and hands them to KdeDesktop::from_layers, which already chooses the colours (the [Colors:*] groups when kdeglobals has a [Colors:View] group, else the look-and-feel colours, the scheme named by [General] ColorScheme or Breeze Light, with a valid, non-transparent [General] AccentColor applied) and reads the fonts, AnimationDurationFactor, the widget style and breezerc. It answers None when no file of the kdeglobals cascade can be read. kde_prefers_dark reads only the kdeglobals cascade and the scheme file and answers KdeColorScheme::is_dark; kde_prefers_reduced_motion reads only the kdeglobals cascade. forceFontDPI is not read (j.3). Both readers also take an environment getter, which [$e] entries expand in, so nothing reads the process environment but the two helpers the real queries pass in. os_theme gains query_native_desktop and NativeDesktop { os, kde } (non_exhaustive, Debug, Clone, PartialEq, new). On a KDE session the colour report is the discovered scheme's os_theme_colors, accent and light or dark preference included; the portal's preference and accent are used only when no kdeglobals can be read. Elsewhere the report is unchanged. query_os_theme_colors returns its os field. query_color_scheme keeps the portal first; its KDE fallback asks kde_prefers_dark instead of looking for "dark" in the scheme name. query_kde, ini_value, ini_color, dirs_kdeglobals and their test are deleted; the colours that test read are pinned by a discover_kde test. detect_desktop recognises a KDE session first, by teksilo_kde_scheme::is_kde_session, which now compares the XDG_CURRENT_DESKTOP names ignoring ASCII case, as the platform's detection always did; spec b.10 says so. A desktop name that only contains KDE (X-KDE-Other) is no longer KDE. accessibility_prefs: reduced motion is on when any source asks for it, read in order and each only while no earlier one asked: the portal's reduced-motion of 1, a KDE session's AnimationDurationFactor of exactly 0, GNOME's enable-animations of false. That is how the portal and gsettings sources were already combined. Text scale is unchanged. teksilo-platform depends on teksilo-kde-scheme on every target, since the crate is pure, and re-exports nothing of it; NativeDesktop carries its KdeDesktop. Tests over in-memory fixture trees and environments, never the real home or process environment: a full kdeglobals (colours, fonts, factor, widget style, breezerc, the stored accent not applied again); the window colours of the deleted test; this machine's layout (ColorScheme only in kdedefaults and /etc/xdg), outside a KDE session and with a listed XDG_CONFIG_DIRS; the data home before the data dirs; look-and-feel colours before the named scheme; built-in Breeze Light; an immutable group in /etc/xdg; AccentColor valid (scheme file and built-in, decimal and hex), transparent, invalid and absent; kdeglobals over the portal accent; kde_prefers_dark on light, dark, a light scheme named dark and a Twilight-like scheme; reduced motion from factor 0, 1, 0.25 and absent and the combination of the three sources; the KDE session predicate. Checked with cargo check and clippy on x86_64-pc-windows-gnu and aarch64-apple-darwin. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 54 ++ Cargo.lock | 1 + crates/teksilo-kde-scheme/src/locations.rs | 6 +- crates/teksilo-kde-scheme/tests/cascade.rs | 7 +- crates/teksilo-platform/Cargo.toml | 6 + .../src/accessibility_prefs.rs | 86 ++- crates/teksilo-platform/src/linux_helpers.rs | 72 ++- crates/teksilo-platform/src/os_theme.rs | 235 +++---- crates/teksilo-platform/src/os_theme/kde.rs | 611 ++++++++++++++++++ engineering/docs/kde-breeze-spec.md | 4 +- 10 files changed, 925 insertions(+), 157 deletions(-) create mode 100644 crates/teksilo-platform/src/os_theme/kde.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 525dfbe66..6c1631ce6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -129,6 +129,17 @@ by crate for clarity, not because crates version independently. `KdeDesktop` applies the user's chosen accent to the scheme it reads in their place, which KDE itself does not. +#### Platform + +- **`os_theme::query_native_desktop` and `NativeDesktop`.** What the desktop + reports for `ThemeMode::Native`, in one value: its colour report (`os`, + what `query_os_theme_colors` returns) and, on a KDE Plasma session, the KDE + desktop itself (`kde`, a `teksilo_kde_scheme::KdeDesktop`: the colour + scheme in effect, the accent the user chose, the five desktop fonts, the + animation speed, the widget style and the Breeze style settings). + `NativeDesktop::new` builds one from a colour report alone, and it + implements `PartialEq`, so a caller can tell whether the desktop changed. + ### Changed #### Theming @@ -157,6 +168,15 @@ by crate for clarity, not because crates version independently. up to 25 seconds. The settings are now also read on systems without `busctl` installed, and from portals older than version 2 of the settings interface. +- **A Linux session is KDE Plasma only when it says so.** + **Behaviour change:** a session counts as KDE when `KDE` is one of the + colon-separated names of `XDG_CURRENT_DESKTOP` (ignoring case) or when + `KDE_FULL_SESSION` is `true`, the rule KDE itself uses, and this is now + checked before GNOME. A desktop name that only contains KDE, such as + `X-KDE-Other`, is no longer KDE, so under `ThemeMode::Native` it is read + like any other desktop and its `kdeglobals` is no longer read. A session + that lists both GNOME and KDE, or sets `KDE_FULL_SESSION=true` under GNOME, + is now KDE. ### Removed @@ -235,6 +255,40 @@ by crate for clarity, not because crates version independently. palette, as `Toggle`, `Checkbox` and the other accent controls already did; before, they kept the normal colours. +#### Platform + +- **The native theme on KDE Plasma reads all of KDE's configuration.** + **Behaviour change:** under `ThemeMode::Native` on a KDE Plasma session the + colours now come from every `kdeglobals` file KDE reads, the system files + of `XDG_CONFIG_DIRS` and the session's `kdedefaults` included, and a + setting an administrator locked with `[$i]` is no longer overridden by the + user's own file. When `kdeglobals` holds no colours of its own, they come + from the look-and-feel package, else the colour scheme it names, else + Breeze Light, as in KDE. Before, only the user's own `kdeglobals` was read, + so a profile whose colour scheme is set only in `kdedefaults` or + `/etc/xdg` got the generic theme. +- **The native theme on KDE Plasma takes the accent colour the user chose.** + **Behaviour change:** the accent is now KDE's selection colour, the one KDE + applications and the desktop portal report, instead of the window's focus + decoration, and on a profile whose colour groups were never written the + `AccentColor` the user picked is applied to the colour scheme. A + transparent or unreadable `AccentColor` is ignored, and the portal's accent + colour is used only when no `kdeglobals` can be read. The content view, + link, error, warning, success and focus colours are now read from the + scheme too. +- **Light or dark on KDE Plasma follows the colours, not the scheme's name.** + **Behaviour change:** on a KDE Plasma session the `ThemeMode::Native` + theme is dark when the colour scheme's window background is dark, the rule + KDE reports to applications, and `query_color_scheme` answers by the same + rule when the desktop portal does not answer. Before, a scheme counted as + dark when its name contained "dark", so a scheme with a dark window and + another name, such as Breeze Twilight, was taken for light. +- **Reduced motion follows KDE's animation speed.** **Behaviour change:** on + a KDE Plasma session, an animation speed of instant (`[KDE] + AnimationDurationFactor=0` in `kdeglobals`) now turns on + `AccessibilityPreferences::reduced_motion`, even when the desktop portal + does not report it. + ## [0.19.0] - 2026-10-16 ### Added diff --git a/Cargo.lock b/Cargo.lock index 179363667..6b7374606 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12034,6 +12034,7 @@ dependencies = [ "teksilo-automation", "teksilo-canvas", "teksilo-core", + "teksilo-kde-scheme", "teksilo-render", "teksilo-tokens", "thiserror 2.0.21", diff --git a/crates/teksilo-kde-scheme/src/locations.rs b/crates/teksilo-kde-scheme/src/locations.rs index 2dec23757..4cc8c4b67 100644 --- a/crates/teksilo-kde-scheme/src/locations.rs +++ b/crates/teksilo-kde-scheme/src/locations.rs @@ -51,9 +51,11 @@ pub struct KdeConfigLocations { } /// Whether the environment describes a KDE session: `XDG_CURRENT_DESKTOP`, -/// split at `:`, contains `KDE`, or `KDE_FULL_SESSION` is `true`. +/// split at `:`, contains `KDE` (ignoring ASCII case), or `KDE_FULL_SESSION` +/// is `true`. pub fn is_kde_session(get: impl Fn(&str) -> Option) -> bool { - let desktop = get("XDG_CURRENT_DESKTOP").is_some_and(|v| v.split(':').any(|d| d == "KDE")); + let desktop = get("XDG_CURRENT_DESKTOP") + .is_some_and(|v| v.split(':').any(|d| d.eq_ignore_ascii_case("KDE"))); desktop || get("KDE_FULL_SESSION").as_deref() == Some("true") } diff --git a/crates/teksilo-kde-scheme/tests/cascade.rs b/crates/teksilo-kde-scheme/tests/cascade.rs index 7d9c50d29..0edff488f 100644 --- a/crates/teksilo-kde-scheme/tests/cascade.rs +++ b/crates/teksilo-kde-scheme/tests/cascade.rs @@ -348,7 +348,12 @@ fn kde_session_detection_reads_the_desktop_list_and_the_full_session_flag() { )]))); assert!(is_kde_session(env(&[("KDE_FULL_SESSION", "true")]))); assert!(!is_kde_session(env(&[("XDG_CURRENT_DESKTOP", "KDEx")]))); - assert!(!is_kde_session(env(&[("XDG_CURRENT_DESKTOP", "kde")]))); + assert!(is_kde_session(env(&[("XDG_CURRENT_DESKTOP", "kde")]))); + assert!(is_kde_session(env(&[( + "XDG_CURRENT_DESKTOP", + "X-Generic:Kde" + )]))); + assert!(!is_kde_session(env(&[("XDG_CURRENT_DESKTOP", "X-KDE")]))); assert!(!is_kde_session(env(&[("KDE_FULL_SESSION", "1")]))); assert!(!is_kde_session(env(&[]))); } diff --git a/crates/teksilo-platform/Cargo.toml b/crates/teksilo-platform/Cargo.toml index 504cda454..26e432c9f 100644 --- a/crates/teksilo-platform/Cargo.toml +++ b/crates/teksilo-platform/Cargo.toml @@ -17,6 +17,12 @@ categories = ["gui", "os", "accessibility"] [dependencies] teksilo-tokens = { workspace = true } +# The KDE configuration cascade, colour schemes and desktop settings the KDE +# reader in `os_theme/kde.rs` hands its file contents to. Pure (no I/O, no +# environment), so it is a dependency on every target; nothing of it is +# re-exported at the crate root, though `os_theme::NativeDesktop` carries its +# `KdeDesktop`. +teksilo-kde-scheme = { workspace = true } teksilo-core = { workspace = true } teksilo-canvas = { workspace = true } teksilo-render = { workspace = true } diff --git a/crates/teksilo-platform/src/accessibility_prefs.rs b/crates/teksilo-platform/src/accessibility_prefs.rs index edcfed18c..7ef7a4218 100644 --- a/crates/teksilo-platform/src/accessibility_prefs.rs +++ b/crates/teksilo-platform/src/accessibility_prefs.rs @@ -12,7 +12,7 @@ //! | Preference | Linux (XDG portal / gsettings) | macOS (NSWorkspace) | Windows (SystemParametersInfo / UISettings) | //! |------------------|-------------------------------|-------------------------|---------------------------------------------| //! | High contrast | portal `contrast` key + GTK theme check | `accessibilityDisplayShouldIncreaseContrast` | `SPI_GETHIGHCONTRAST` | -//! | Reduced motion | portal `reduced-motion` key + `enable-animations` | `accessibilityDisplayShouldReduceMotion` | `UISettings.AnimationsEnabled` | +//! | Reduced motion | portal `reduced-motion` key + KDE `AnimationDurationFactor` + `enable-animations` | `accessibilityDisplayShouldReduceMotion` | `UISettings.AnimationsEnabled` | //! | Text scale | gsettings `text-scaling-factor` | N/A (uses DPI scaling) | `UISettings.TextScaleFactor` | //! | Screen reader | AT-SPI `org.a11y.Status.ScreenReaderEnabled` | `NSWorkspace.isVoiceOverEnabled` | `SPI_GETSCREENREADER` | //! @@ -81,8 +81,10 @@ impl AccessibilityPreferences { #[cfg(target_os = "linux")] mod platform { use super::{AccessibilityPreferences, ScreenReaderState}; - use crate::linux_helpers::read_gsettings; + use crate::linux_helpers::{Desktop, detect_desktop, read_gsettings}; use crate::linux_portal::{read_bool_property, read_portal_u32}; + use crate::os_theme::kde; + use teksilo_kde_scheme::KdeConfigLocations; pub(super) fn query() -> AccessibilityPreferences { let mut prefs = AccessibilityPreferences::default(); @@ -92,9 +94,11 @@ mod platform { if let Some(v) = read_portal_u32("org.freedesktop.appearance", "contrast") { prefs.high_contrast = v == 1; } - if let Some(v) = read_portal_u32("org.freedesktop.appearance", "reduced-motion") { - prefs.reduced_motion = v == 1; - } + prefs.reduced_motion = reduced_motion( + read_portal_u32("org.freedesktop.appearance", "reduced-motion"), + kde_reduced_motion, + || read_gsettings("org.gnome.desktop.interface", "enable-animations"), + ); // High contrast fallback: check GTK theme name for "HighContrast" if !prefs.high_contrast @@ -110,13 +114,6 @@ mod platform { prefs.high_contrast = val == "true"; } - // Reduced motion fallback: GNOME enable-animations (false → reduced motion) - if !prefs.reduced_motion - && let Some(val) = read_gsettings("org.gnome.desktop.interface", "enable-animations") - { - prefs.reduced_motion = val == "false"; - } - // Text scaling (not in the portal, must use gsettings) if let Some(val) = read_gsettings("org.gnome.desktop.interface", "text-scaling-factor") && let Ok(scale) = val.parse::() @@ -129,6 +126,36 @@ mod platform { prefs } + /// Whether reduced motion is asked for. Any one source asking is + /// enough, read in this order and each read only while no earlier one + /// has asked: + /// + /// 1. the desktop portal's `reduced-motion`, when it is 1; + /// 2. on a KDE session, `kdeglobals [KDE] AnimationDurationFactor` of + /// exactly 0, the value KDE's portal reports as reduced motion + /// (`kde`, `None` when the session is not KDE or its `kdeglobals` + /// cannot be read); + /// 3. GNOME's `enable-animations`, when it is `false`. + /// + /// A source that answers "no", or does not answer, leaves the next one + /// to decide. + pub(super) fn reduced_motion( + portal: Option, + kde: impl FnOnce() -> Option, + enable_animations: impl FnOnce() -> Option, + ) -> bool { + portal == Some(1) || kde() == Some(true) || enable_animations().as_deref() == Some("false") + } + + /// The KDE desktop's reduced-motion answer, on a KDE session only. + fn kde_reduced_motion() -> Option { + if !matches!(detect_desktop(), Desktop::Kde) { + return None; + } + let locations = KdeConfigLocations::from_env(kde::process_env); + kde::kde_prefers_reduced_motion(&locations, &kde::process_env, kde::read_file) + } + /// The AT-SPI status object's `ScreenReaderEnabled` flag, read off the /// same object `accesskit_unix` watches — `atspi-proxies`' `StatusProxy` /// on `org.a11y.Bus` at `/org/a11y/bus`. (AccessKit itself watches the @@ -346,6 +373,41 @@ mod tests { )); } + #[cfg(target_os = "linux")] + #[test] + fn reduced_motion_is_asked_for_by_any_one_source() { + use platform::reduced_motion; + // No KDE session, KDE asking, KDE not asking; GNOME not answering. + let no_kde = || None; + let yes = || Some(true); + let kde_no = || Some(false); + let no_gnome = || None; + let animations = |value: &'static str| move || Some(value.to_owned()); + + // The portal alone. + assert!(reduced_motion(Some(1), no_kde, no_gnome)); + assert!(!reduced_motion(Some(0), no_kde, no_gnome)); + assert!(!reduced_motion(None, no_kde, no_gnome)); + // A KDE animation factor of 0, whatever the portal said. + assert!(reduced_motion(None, yes, no_gnome)); + assert!(reduced_motion(Some(0), yes, animations("true"))); + assert!(!reduced_motion(None, kde_no, no_gnome)); + // GNOME's switch, when nothing earlier asked. + assert!(reduced_motion(None, kde_no, animations("false"))); + assert!(reduced_motion(Some(0), no_kde, animations("false"))); + assert!(!reduced_motion(None, kde_no, animations("true"))); + + // A source that already asked stops the later reads. + assert!(reduced_motion( + Some(1), + || panic!("KDE is not read once the portal asked"), + || panic!("GNOME is not read once the portal asked"), + )); + assert!(reduced_motion(None, yes, || panic!( + "GNOME is not read once KDE asked" + ))); + } + #[test] fn preferences_compare_on_the_screen_reader_too() { // `refresh_accessibility_preferences` early-returns on `==`, so a diff --git a/crates/teksilo-platform/src/linux_helpers.rs b/crates/teksilo-platform/src/linux_helpers.rs index 840e08a5e..d49f76520 100644 --- a/crates/teksilo-platform/src/linux_helpers.rs +++ b/crates/teksilo-platform/src/linux_helpers.rs @@ -36,16 +36,82 @@ pub(crate) enum Desktop { } pub(crate) fn detect_desktop() -> Desktop { - let xdg = std::env::var("XDG_CURRENT_DESKTOP").unwrap_or_default(); + detect_desktop_in(|name| std::env::var(name).ok()) +} + +/// The desktop the environment `var` describes. A KDE session is +/// recognised first, by KDE's own rule +/// ([`teksilo_kde_scheme::is_kde_session`]: `KDE` among the +/// colon-separated `XDG_CURRENT_DESKTOP` names, ignoring ASCII case, or +/// `KDE_FULL_SESSION=true`); the other desktops by a case-insensitive +/// substring of `XDG_CURRENT_DESKTOP`. +pub(crate) fn detect_desktop_in(var: impl Fn(&str) -> Option) -> Desktop { + if teksilo_kde_scheme::is_kde_session(&var) { + return Desktop::Kde; + } + let xdg = var("XDG_CURRENT_DESKTOP").unwrap_or_default(); // XDG_CURRENT_DESKTOP can contain colon-separated values, e.g. "ubuntu:GNOME" let upper = xdg.to_uppercase(); if upper.contains("GNOME") { Desktop::Gnome - } else if upper.contains("KDE") { - Desktop::Kde } else if upper.contains("CINNAMON") || upper.contains("X-CINNAMON") { Desktop::Cinnamon } else { Desktop::Other(xdg) } } + +#[cfg(test)] +mod tests { + use super::*; + + fn desktop(vars: &[(&str, &str)]) -> Desktop { + detect_desktop_in(|name| { + vars.iter() + .find(|(k, _)| *k == name) + .map(|(_, v)| (*v).to_owned()) + }) + } + + #[test] + fn a_kde_session_is_kde_in_the_desktop_list_or_a_full_session() { + for vars in [ + &[("XDG_CURRENT_DESKTOP", "KDE")][..], + &[("XDG_CURRENT_DESKTOP", "kde")], + &[("XDG_CURRENT_DESKTOP", "neon:KDE")], + &[("XDG_CURRENT_DESKTOP", "Kde:Plasma")], + &[("KDE_FULL_SESSION", "true")], + &[ + ("XDG_CURRENT_DESKTOP", "GNOME"), + ("KDE_FULL_SESSION", "true"), + ], + ] { + assert!(matches!(desktop(vars), Desktop::Kde), "{vars:?}"); + } + for vars in [ + &[("XDG_CURRENT_DESKTOP", "X-KDE-Other")][..], + &[("XDG_CURRENT_DESKTOP", "KDEx")], + &[("KDE_FULL_SESSION", "1")], + &[("KDE_FULL_SESSION", "false")], + &[], + ] { + assert!(!matches!(desktop(vars), Desktop::Kde), "{vars:?}"); + } + } + + #[test] + fn the_other_desktops_are_read_from_the_desktop_list() { + assert!(matches!( + desktop(&[("XDG_CURRENT_DESKTOP", "ubuntu:GNOME")]), + Desktop::Gnome + )); + assert!(matches!( + desktop(&[("XDG_CURRENT_DESKTOP", "X-Cinnamon")]), + Desktop::Cinnamon + )); + assert!(matches!( + desktop(&[("XDG_CURRENT_DESKTOP", "XFCE")]), + Desktop::Other(name) if name == "XFCE" + )); + } +} diff --git a/crates/teksilo-platform/src/os_theme.rs b/crates/teksilo-platform/src/os_theme.rs index 4256ec0ca..3d803f1a7 100644 --- a/crates/teksilo-platform/src/os_theme.rs +++ b/crates/teksilo-platform/src/os_theme.rs @@ -6,21 +6,74 @@ //! //! Supports GNOME, KDE, and Cinnamon on Linux. macOS and Windows return //! only the light/dark preference (via winit), with no color reading. +//! +//! On a KDE Plasma session ([`teksilo_kde_scheme::is_kde_session`]) the +//! colours are KDE's own: the `kdeglobals` cascade, with its system layers +//! and `kdedefaults`, and the colour scheme in effect with the user's +//! accent, read through `teksilo-kde-scheme`. [`query_native_desktop`] +//! also hands over the KDE desktop's settings (fonts, animation speed, +//! widget style, Breeze style settings) as a [`KdeDesktop`]. + +#[cfg(target_os = "linux")] +pub(crate) mod kde; +use teksilo_kde_scheme::KdeDesktop; #[cfg(target_os = "linux")] use teksilo_tokens::Color; use teksilo_tokens::{ColorSchemePreference, OsThemeColors}; +/// What the desktop reports for `ThemeMode::Native`: its colours, and on a +/// KDE Plasma session its desktop settings. +#[derive(Debug, Clone, PartialEq)] +#[non_exhaustive] +pub struct NativeDesktop { + /// The desktop's colour report. + pub os: OsThemeColors, + /// The KDE desktop's colour scheme and settings, on a KDE session whose + /// `kdeglobals` could be read; `None` elsewhere. + /// + /// When present, `os` is its scheme's colour report + /// ([`KdeColorScheme::os_theme_colors`](teksilo_kde_scheme::KdeColorScheme::os_theme_colors)). + pub kde: Option, +} + +impl NativeDesktop { + /// A desktop reporting `os` and no KDE settings. + pub fn new(os: OsThemeColors) -> Self { + NativeDesktop { os, kde: None } + } +} + /// Query only the OS light/dark preference (lightweight). /// Used by `ThemeMode::FollowSystem`. +/// +/// On Linux the desktop portal is asked first. When it does not answer, a +/// KDE session answers from its colour scheme (dark when the window +/// background is dark, the rule KDE reports to applications), and GNOME and +/// Cinnamon from their GTK theme's name. pub fn query_color_scheme() -> ColorSchemePreference { platform::query_color_scheme() } +/// Query the desktop's colours and, on a KDE Plasma session, its settings. +/// Used by `ThemeMode::Native`. +/// +/// On a KDE session the colours are the KDE colour scheme's +/// ([`KdeColorScheme::os_theme_colors`](teksilo_kde_scheme::KdeColorScheme::os_theme_colors)), +/// accent and light or dark preference included; only when no +/// `kdeglobals` file can be read does the report fall back to the desktop +/// portal's preference and accent colour, with no [`KdeDesktop`]. Elsewhere +/// the report is the one [`query_os_theme_colors`] has always given. +pub fn query_native_desktop() -> NativeDesktop { + platform::query_native_desktop() +} + /// Query full OS theme colors from desktop config files. /// Used by `ThemeMode::Native`. +/// +/// The colour report of [`query_native_desktop`]. pub fn query_os_theme_colors() -> OsThemeColors { - platform::query_os_theme_colors() + query_native_desktop().os } // ── Linux ─────────────────────────────────────────────────────────────────── @@ -29,6 +82,7 @@ mod platform { use super::*; use crate::linux_helpers::{Desktop, detect_desktop, read_gsettings}; use crate::linux_portal::{read_portal_rgb, read_portal_u32}; + use teksilo_kde_scheme::KdeConfigLocations; pub(super) fn query_color_scheme() -> ColorSchemePreference { // XDG portal: 0 = no preference, 1 = dark, 2 = light. @@ -51,20 +105,17 @@ mod platform { // dark-mode KDE users to a light theme). match detect_desktop() { Desktop::Kde => { - // KDE stores the active scheme in `kdeglobals` — - // `[General] ColorScheme=BreezeDark` for dark, - // `BreezeLight` (or any name without "dark") for - // light. Reading the file is cheap; we already - // do it under `ThemeMode::Native` for the full - // colour palette. - let path = dirs_kdeglobals(); - if let Ok(content) = std::fs::read_to_string(&path) - && let Some(scheme) = ini_value(&content, "General", "ColorScheme") + // The scheme in effect decides, by its window background, + // as KDE reports it to applications and to the portal. + let locations = KdeConfigLocations::from_env(kde::process_env); + if let Some(dark) = + kde::kde_prefers_dark(&locations, &kde::process_env, kde::read_file) { - if scheme.to_lowercase().contains("dark") { - return ColorSchemePreference::Dark; - } - return ColorSchemePreference::Light; + return if dark { + ColorSchemePreference::Dark + } else { + ColorSchemePreference::Light + }; } } Desktop::Cinnamon => { @@ -88,25 +139,41 @@ mod platform { ColorSchemePreference::NoPreference } - pub(super) fn query_os_theme_colors() -> OsThemeColors { - let mut colors = OsThemeColors::new(query_color_scheme()); - + pub(super) fn query_native_desktop() -> NativeDesktop { match detect_desktop() { - Desktop::Kde => query_kde(&mut colors), - Desktop::Cinnamon => query_cinnamon(&mut colors), - Desktop::Gnome | Desktop::Other(_) => query_gnome(&mut colors), + Desktop::Kde => { + let locations = KdeConfigLocations::from_env(kde::process_env); + let desktop = kde::discover_kde(&locations, &kde::process_env, kde::read_file); + kde::native_desktop(desktop, || { + let mut colors = OsThemeColors::new(query_color_scheme()); + colors.accent = portal_accent(); + colors + }) + } + Desktop::Cinnamon => { + let mut colors = OsThemeColors::new(query_color_scheme()); + query_cinnamon(&mut colors); + NativeDesktop::new(colors) + } + Desktop::Gnome | Desktop::Other(_) => { + let mut colors = OsThemeColors::new(query_color_scheme()); + query_gnome(&mut colors); + NativeDesktop::new(colors) + } } + } - colors + /// The desktop portal's accent colour (RGB doubles). + fn portal_accent() -> Option { + read_portal_rgb("org.freedesktop.appearance", "accent-color") + .map(|(r, g, b)| Color::from_rgb(r as f32, g as f32, b as f32)) } // ── GNOME ──────────────────────────────────────────────────────────── fn query_gnome(colors: &mut OsThemeColors) { // Accent color from XDG portal (RGB doubles) - if let Some((r, g, b)) = read_portal_rgb("org.freedesktop.appearance", "accent-color") { - colors.accent = Some(Color::from_rgb(r as f32, g as f32, b as f32)); - } + colors.accent = portal_accent(); // Fallback: GNOME 47 named accent if colors.accent.is_none() @@ -138,93 +205,6 @@ mod platform { Some(Color::from_hex(hex)) } - // ── KDE ────────────────────────────────────────────────────────────── - - fn query_kde(colors: &mut OsThemeColors) { - let path = dirs_kdeglobals(); - let content = match std::fs::read_to_string(&path) { - Ok(c) => c, - Err(_) => return, - }; - - // Infer dark/light from color scheme name if portal didn't provide it - if colors.color_scheme == ColorSchemePreference::NoPreference - && let Some(scheme) = ini_value(&content, "General", "ColorScheme") - { - if scheme.to_lowercase().contains("dark") { - colors.color_scheme = ColorSchemePreference::Dark; - } else { - colors.color_scheme = ColorSchemePreference::Light; - } - } - - // Window colors - colors.window_bg = ini_color(&content, "Colors:Window", "BackgroundNormal"); - colors.window_fg = ini_color(&content, "Colors:Window", "ForegroundNormal"); - colors.accent = ini_color(&content, "Colors:Window", "DecorationFocus"); - - // Button colors - colors.button_bg = ini_color(&content, "Colors:Button", "BackgroundNormal"); - colors.button_fg = ini_color(&content, "Colors:Button", "ForegroundNormal"); - - // Selection colors - colors.selection_bg = ini_color(&content, "Colors:Selection", "BackgroundNormal"); - colors.selection_fg = ini_color(&content, "Colors:Selection", "ForegroundNormal"); - - // Tooltip colors - colors.tooltip_bg = ini_color(&content, "Colors:Tooltip", "BackgroundNormal"); - colors.tooltip_fg = ini_color(&content, "Colors:Tooltip", "ForegroundNormal"); - } - - fn dirs_kdeglobals() -> std::path::PathBuf { - if let Ok(config_home) = std::env::var("XDG_CONFIG_HOME") { - std::path::PathBuf::from(config_home).join("kdeglobals") - } else if let Ok(home) = std::env::var("HOME") { - std::path::PathBuf::from(home).join(".config/kdeglobals") - } else { - std::path::PathBuf::from("/dev/null") - } - } - - /// Read a value from a simple INI file (section + key). - fn ini_value<'a>(content: &'a str, section: &str, key: &str) -> Option<&'a str> { - let section_header = format!("[{}]", section); - let mut in_section = false; - - for line in content.lines() { - let trimmed = line.trim(); - if trimmed.starts_with('[') { - in_section = trimmed == section_header; - continue; - } - if in_section - && let Some((k, v)) = trimmed.split_once('=') - && k.trim() == key - { - return Some(v.trim()); - } - } - None - } - - /// Parse a KDE "R,G,B" color value (0-255 integers). - fn ini_color(content: &str, section: &str, key: &str) -> Option { - let value = ini_value(content, section, key)?; - let parts: Vec<&str> = value.split(',').collect(); - if parts.len() >= 3 { - let r = parts[0].trim().parse::().ok()?; - let g = parts[1].trim().parse::().ok()?; - let b = parts[2].trim().parse::().ok()?; - Some(Color::from_rgb( - r as f32 / 255.0, - g as f32 / 255.0, - b as f32 / 255.0, - )) - } else { - None - } - } - // ── Cinnamon ───────────────────────────────────────────────────────── fn query_cinnamon(colors: &mut OsThemeColors) { @@ -568,27 +548,6 @@ mod platform { assert_eq!(parse_css_color("black").unwrap(), Color::BLACK); } - #[test] - fn kde_ini_parsing() { - let content = r#" -[General] -ColorScheme=Breeze-Dark - -[Colors:Window] -BackgroundNormal=49,54,59 -ForegroundNormal=239,240,241 -DecorationFocus=61,174,233 -"#; - let bg = ini_color(content, "Colors:Window", "BackgroundNormal").unwrap(); - assert!((bg.r() - 49.0 / 255.0).abs() < 0.01); - - let fg = ini_color(content, "Colors:Window", "ForegroundNormal").unwrap(); - assert!((fg.r() - 239.0 / 255.0).abs() < 0.01); - - let scheme = ini_value(content, "General", "ColorScheme").unwrap(); - assert!(scheme.contains("Dark")); - } - #[test] fn gnome_named_accent_mapping() { assert!(gnome_named_accent("blue").is_some()); @@ -632,8 +591,8 @@ mod platform { ColorSchemePreference::NoPreference } - pub(super) fn query_os_theme_colors() -> OsThemeColors { - OsThemeColors::new(query_color_scheme()) + pub(super) fn query_native_desktop() -> NativeDesktop { + NativeDesktop::new(OsThemeColors::new(query_color_scheme())) } } @@ -664,8 +623,8 @@ mod platform { ColorSchemePreference::NoPreference } - pub(super) fn query_os_theme_colors() -> OsThemeColors { - OsThemeColors::new(query_color_scheme()) + pub(super) fn query_native_desktop() -> NativeDesktop { + NativeDesktop::new(OsThemeColors::new(query_color_scheme())) } } @@ -678,7 +637,7 @@ mod platform { ColorSchemePreference::NoPreference } - pub(super) fn query_os_theme_colors() -> OsThemeColors { - OsThemeColors::default() + pub(super) fn query_native_desktop() -> NativeDesktop { + NativeDesktop::new(OsThemeColors::default()) } } diff --git a/crates/teksilo-platform/src/os_theme/kde.rs b/crates/teksilo-platform/src/os_theme/kde.rs new file mode 100644 index 000000000..ad04957be --- /dev/null +++ b/crates/teksilo-platform/src/os_theme/kde.rs @@ -0,0 +1,611 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The KDE Plasma reader behind `ThemeMode::Native` and the light or dark +//! preference. +//! +//! Everything KDE-specific is in `teksilo-kde-scheme`: where the files are +//! ([`KdeConfigLocations`]), how they cascade ([`KConfig::cascade`]), which +//! colour scheme is in effect and how the user's accent applies to it +//! ([`KdeDesktop::from_layers`]). This module only finds which of the +//! listed files exist, reads them through the `read` closure it is given, +//! and hands their contents over. +//! +//! The readers are pure: the environment arrives as a getter and the files +//! through `read`, so the tests run over fixture trees held in memory. The +//! two impure helpers at the end ([`process_env`], [`read_file`]) are what +//! the real queries pass in. +//! +//! What is read, per `engineering/docs/kde-breeze-spec.md`: +//! +//! - the `kdeglobals` cascade (b.7): `/etc/kde5rc`, every `system.kdeglobals` +//! then every `kdeglobals` of `$XDG_CONFIG_DIRS` (with +//! `$XDG_CONFIG_HOME/kdedefaults` first in a KDE session), then the user's +//! own files, with Kiosk immutability (b.6); +//! - the colours: the `[Colors:*]` groups of `kdeglobals` when it has a +//! `[Colors:View]` group, which already carry any accent the user chose; +//! otherwise the look-and-feel package's colours, else the scheme named +//! by `[General] ColorScheme`, else Breeze Light (b.8), with `[General] +//! AccentColor` then applied to it when it is a colour and not +//! transparent (n.13); +//! - the fonts, `[KDE] AnimationDurationFactor` and `[KDE] widgetStyle` +//! (j.1, j.2, j.4), and the `breezerc` cascade (j.6). +//! +//! `forceFontDPI` is not read: no Plasma 6.8 component reads it (j.3). + +use std::path::Path; + +use teksilo_kde_scheme::{ + ConfigLayerPath, KConfig, KdeConfigLocations, KdeDesktop, KdeDesktopLayers, +}; +use teksilo_tokens::OsThemeColors; + +use super::NativeDesktop; + +/// An environment getter: a variable's value, `None` when unset. +pub(crate) type EnvVar<'a> = &'a dyn Fn(&str) -> Option; + +/// The KDE desktop's settings, or `None` when no file of the `kdeglobals` +/// cascade can be read. +/// +/// `var` gives the environment `[$e]` entries expand in; `read` returns a +/// file's bytes, `None` for a file that does not exist or cannot be read. +pub(crate) fn discover_kde( + locations: &KdeConfigLocations, + var: EnvVar<'_>, + read: impl Fn(&Path) -> Option>, +) -> Option { + let colours = ColourFiles::read(locations, var, &read)?; + let breezerc = read_cascade(&locations.breezerc_cascade(), &read); + Some(KdeDesktop::from_layers( + &KdeDesktopLayers { + kdeglobals: &colours.kdeglobals, + breezerc: &breezerc, + scheme_file: colours.scheme_file.as_ref(), + }, + &locations.expansion_env(var), + )) +} + +/// Whether the KDE colour scheme in effect is dark +/// ([`KdeColorScheme::is_dark`](teksilo_kde_scheme::KdeColorScheme::is_dark)), +/// reading only the `kdeglobals` cascade and the scheme file; `None` when no +/// file of the `kdeglobals` cascade can be read. +/// +/// The scheme is the one [`discover_kde`] finds, accent included, so the +/// two never disagree. +pub(crate) fn kde_prefers_dark( + locations: &KdeConfigLocations, + var: EnvVar<'_>, + read: impl Fn(&Path) -> Option>, +) -> Option { + let colours = ColourFiles::read(locations, var, &read)?; + let desktop = KdeDesktop::from_layers( + &KdeDesktopLayers { + kdeglobals: &colours.kdeglobals, + breezerc: &[], + scheme_file: colours.scheme_file.as_ref(), + }, + &locations.expansion_env(var), + ); + Some(desktop.scheme.is_dark()) +} + +/// Whether `kdeglobals [KDE] AnimationDurationFactor` is 0, which KDE +/// reports as reduced motion +/// ([`KdeDesktop::prefers_reduced_motion`]), reading only the `kdeglobals` +/// cascade; `None` when no file of it can be read. +pub(crate) fn kde_prefers_reduced_motion( + locations: &KdeConfigLocations, + var: EnvVar<'_>, + read: impl Fn(&Path) -> Option>, +) -> Option { + let kdeglobals = read_cascade(&locations.kdeglobals_cascade(), &read); + if kdeglobals.is_empty() { + return None; + } + let desktop = KdeDesktop::from_layers( + &KdeDesktopLayers { + kdeglobals: &kdeglobals, + ..KdeDesktopLayers::default() + }, + &locations.expansion_env(var), + ); + Some(desktop.prefers_reduced_motion()) +} + +/// The native desktop of a KDE session. +/// +/// With a readable `kdeglobals` the colour report is the scheme's own +/// ([`KdeColorScheme::os_theme_colors`](teksilo_kde_scheme::KdeColorScheme::os_theme_colors)), +/// accent included, and `without_kdeglobals` is not called. Without one, +/// the report is whatever `without_kdeglobals` gives (the portal's light or +/// dark preference and accent colour), and the desktop carries no +/// [`KdeDesktop`]. +pub(crate) fn native_desktop( + kde: Option, + without_kdeglobals: impl FnOnce() -> OsThemeColors, +) -> NativeDesktop { + match kde { + Some(desktop) => NativeDesktop { + os: desktop.scheme.os_theme_colors(), + kde: Some(desktop), + }, + None => NativeDesktop::new(without_kdeglobals()), + } +} + +/// The files a colour scheme is read from: the `kdeglobals` cascade, and +/// the scheme file when `kdeglobals` does not carry the colours itself. +struct ColourFiles { + kdeglobals: Vec, + scheme_file: Option, +} + +impl ColourFiles { + /// `None` when no file of the `kdeglobals` cascade can be read. + fn read( + locations: &KdeConfigLocations, + var: EnvVar<'_>, + read: &impl Fn(&Path) -> Option>, + ) -> Option { + let kdeglobals = read_cascade(&locations.kdeglobals_cascade(), read); + if kdeglobals.is_empty() { + return None; + } + let merged = KConfig::cascade(&kdeglobals); + // The first candidate that can be read is the scheme file. + let scheme_file = locations + .scheme_fallback_candidates(&merged, &locations.expansion_env(var)) + .and_then(|candidates| candidates.iter().find_map(|path| read(path))) + .map(|bytes| KConfig::parse_bytes(&bytes).0); + Some(ColourFiles { + kdeglobals, + scheme_file, + }) + } +} + +/// Every readable file of a cascade, parsed and marked with its layer +/// kind, lowest priority first. A file that cannot be read is skipped, as +/// KDE skips a file that does not exist; parse diagnostics are dropped, the +/// offending lines having been skipped. +fn read_cascade( + layers: &[ConfigLayerPath], + read: &impl Fn(&Path) -> Option>, +) -> Vec { + layers + .iter() + .filter_map(|layer| { + read(&layer.path).map(|bytes| KConfig::parse_bytes(&bytes).0.with_kind(layer.kind)) + }) + .collect() +} + +/// The process environment, for the real queries. +pub(crate) fn process_env(name: &str) -> Option { + std::env::var(name).ok() +} + +/// Reads a file of the real file system; any failure reads as absent. +pub(crate) fn read_file(path: &Path) -> Option> { + std::fs::read(path).ok() +} + +#[cfg(test)] +mod tests { + //! Fixture trees held in memory: no test reads the real home, the real + //! `/etc/xdg` or the process environment. + + use std::collections::HashMap; + use std::path::PathBuf; + + use teksilo_kde_scheme::{KdeColor, KdeColorScheme, SchemeOrigin}; + use teksilo_tokens::{Color, ColorSchemePreference}; + + use super::*; + + /// A file tree in memory. + #[derive(Default)] + struct Tree(HashMap>); + + impl Tree { + fn file(mut self, path: &str, text: &str) -> Tree { + self.0.insert(PathBuf::from(path), text.as_bytes().to_vec()); + self + } + + fn read(&self) -> impl Fn(&Path) -> Option> + '_ { + |path| self.0.get(path).cloned() + } + } + + /// An environment getter over a fixed table. + fn env(vars: &[(&str, &str)]) -> impl Fn(&str) -> Option + use<> { + let table: HashMap = vars + .iter() + .map(|(k, v)| ((*k).to_owned(), (*v).to_owned())) + .collect(); + move |name| table.get(name).cloned() + } + + /// A KDE session of user ada, with the default XDG directories. + fn kde_env() -> impl Fn(&str) -> Option + use<> { + env(&[("HOME", "/home/ada"), ("XDG_CURRENT_DESKTOP", "KDE")]) + } + + fn discover(tree: &Tree, var: EnvVar<'_>) -> Option { + discover_kde(&KdeConfigLocations::from_env(var), var, tree.read()) + } + + fn prefers_dark(tree: &Tree) -> Option { + let var = kde_env(); + kde_prefers_dark(&KdeConfigLocations::from_env(&var), &var, tree.read()) + } + + fn reduced_motion(tree: &Tree) -> Option { + let var = kde_env(); + kde_prefers_reduced_motion(&KdeConfigLocations::from_env(&var), &var, tree.read()) + } + + const USER_KDEGLOBALS: &str = "/home/ada/.config/kdeglobals"; + const KDEDEFAULTS: &str = "/home/ada/.config/kdedefaults/kdeglobals"; + const ETC_KDEGLOBALS: &str = "/etc/xdg/kdeglobals"; + const LIGHT_FILE: &str = "/usr/share/color-schemes/BreezeLight.colors"; + const DARK_FILE: &str = "/usr/share/color-schemes/BreezeDark.colors"; + const LOOK_AND_FEEL: &str = + "/usr/share/plasma/look-and-feel/org.kde.breeze.desktop/contents/colors"; + + fn light_text() -> String { + KdeColorScheme::breeze_light().to_kconfig_text() + } + + fn dark_text() -> String { + KdeColorScheme::breeze_dark().to_kconfig_text() + } + + fn rgb(r: u8, g: u8, b: u8) -> Option { + Some(KdeColor::rgb8(r, g, b).to_color()) + } + + // ---- kdeglobals carries the colours -------------------------------- + + #[test] + fn a_full_kdeglobals_gives_its_colours_fonts_and_settings() { + let kdeglobals = format!( + "{}\n[General]\nColorScheme=BreezeDark\nAccentColor=233,61,0\n\ + font=Inter,11,-1,5,400,0,0,0,0,0,0,0,0,0,0,1\n\ + fixed=JetBrains Mono,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1\n\ + [KDE]\nAnimationDurationFactor=0.5\nwidgetStyle=Breeze\nforceFontDPI=144\n", + dark_text() + ); + let tree = Tree::default() + .file(USER_KDEGLOBALS, &kdeglobals) + .file("/home/ada/.config/breezerc", "[Style]\nMenuOpacity=80\n") + // A scheme file is not read when kdeglobals has the colours. + .file(DARK_FILE, &light_text()); + let desktop = discover(&tree, &kde_env()).expect("a readable kdeglobals"); + + assert_eq!(desktop.scheme_origin, SchemeOrigin::Kdeglobals); + let os = desktop.scheme.os_theme_colors(); + assert_eq!(os, KdeColorScheme::breeze_dark().os_theme_colors()); + assert_eq!(os.color_scheme, ColorSchemePreference::Dark); + // The accent is the selection colour already in the groups; the + // stored AccentColor is recorded but not applied again. + assert_eq!(os.accent, rgb(61, 174, 233)); + assert_eq!(desktop.user_accent, Some(KdeColor::rgb8(233, 61, 0))); + + assert_eq!(desktop.fonts.general.family, "Inter"); + assert_eq!(desktop.fonts.general.point_size, Some(11.0)); + assert_eq!(desktop.fonts.fixed.family, "JetBrains Mono"); + assert_eq!(desktop.fonts.small.family, "Noto Sans"); + assert_eq!(desktop.animation_duration_factor, Some(0.5)); + assert_eq!(desktop.widget_style.as_deref(), Some("Breeze")); + assert!(desktop.uses_breeze_style()); + assert_eq!(desktop.breeze.menu_opacity, 80); + } + + #[test] + fn kdeglobals_colours_are_read_as_written_and_decide_dark() { + // The fixture of the reader this one replaced: a scheme name that + // says dark, and the colours to go with it. + let tree = Tree::default().file( + USER_KDEGLOBALS, + "[General]\nColorScheme=Breeze-Dark\n\n\ + [Colors:View]\nBackgroundNormal=35,38,41\n\n\ + [Colors:Window]\nBackgroundNormal=49,54,59\nForegroundNormal=239,240,241\n\ + DecorationFocus=61,174,233\n", + ); + let os = discover(&tree, &kde_env()) + .unwrap() + .scheme + .os_theme_colors(); + assert_eq!(os.window_bg, rgb(49, 54, 59)); + assert_eq!(os.window_fg, rgb(239, 240, 241)); + assert_eq!(os.view_bg, rgb(35, 38, 41)); + assert_eq!(os.color_scheme, ColorSchemePreference::Dark); + // The accent is the selection colour, not the window's focus + // decoration: the Selection set is absent, so KDE's default. + let defaults = KdeColorScheme::kcolorscheme_defaults(); + let selection = defaults.set(teksilo_kde_scheme::ColorSet::Selection); + assert_eq!(os.accent, Some(selection.background_normal.to_color())); + assert_eq!(prefers_dark(&tree), Some(true)); + } + + #[test] + fn no_kdeglobals_at_all_is_no_kde_desktop() { + let tree = Tree::default().file(LIGHT_FILE, &light_text()); + assert_eq!(discover(&tree, &kde_env()), None); + assert_eq!(prefers_dark(&tree), None); + assert_eq!(reduced_motion(&tree), None); + } + + // ---- The cascade --------------------------------------------------- + + #[test] + fn this_machines_layout_reads_kdedefaults_over_etc_xdg() { + // The scheme is named only in kdedefaults and /etc/xdg; the user's + // kdeglobals has fonts but no colours. + let tree = Tree::default() + .file(KDEDEFAULTS, "[General]\nColorScheme=BreezeDark\n") + .file( + ETC_KDEGLOBALS, + "[General]\nColorScheme=BreezeLight\n[KDE]\nwidgetStyle=Breeze\n", + ) + .file( + USER_KDEGLOBALS, + "[General]\nfont=Noto Sans,12,-1,5,400,0,0,0,0,0,0,0,0,0,0,1\n", + ) + .file(LIGHT_FILE, &light_text()) + .file(DARK_FILE, &dark_text()); + + let desktop = discover(&tree, &kde_env()).unwrap(); + assert_eq!(desktop.scheme_origin, SchemeOrigin::SchemeFile); + assert!(desktop.scheme.is_dark()); + assert_eq!( + desktop.scheme.os_theme_colors(), + KdeColorScheme::breeze_dark().os_theme_colors() + ); + assert_eq!(desktop.fonts.general.point_size, Some(12.0)); + assert_eq!(desktop.widget_style.as_deref(), Some("Breeze")); + assert_eq!(prefers_dark(&tree), Some(true)); + + // Outside a KDE session kdedefaults is not prepended, so /etc/xdg + // names the scheme. + let outside = env(&[("HOME", "/home/ada")]); + let desktop = discover(&tree, &outside).unwrap(); + assert!(!desktop.scheme.is_dark()); + + // A session that lists XDG_CONFIG_DIRS itself is followed exactly, + // kdedefaults still first. + let listed = env(&[ + ("HOME", "/home/ada"), + ("XDG_CURRENT_DESKTOP", "KDE"), + ("XDG_CONFIG_DIRS", "/opt/xdg:/etc/xdg"), + ]); + let tree = tree.file( + "/opt/xdg/kdeglobals", + "[General]\nColorScheme=BreezeLight\n", + ); + assert!(discover(&tree, &listed).unwrap().scheme.is_dark()); + } + + #[test] + fn the_scheme_file_is_looked_for_in_the_data_home_first() { + let mine = dark_text().replace("BackgroundNormal=32,35,38", "BackgroundNormal=10,20,30"); + let tree = Tree::default() + .file(USER_KDEGLOBALS, "[General]\nColorScheme=BreezeDark\n") + .file(DARK_FILE, &dark_text()) + .file( + "/home/ada/.local/share/color-schemes/BreezeDark.colors", + &mine, + ); + let os = discover(&tree, &kde_env()) + .unwrap() + .scheme + .os_theme_colors(); + assert_eq!(os.window_bg, rgb(10, 20, 30)); + } + + #[test] + fn the_look_and_feel_colours_come_before_the_named_scheme() { + let tree = Tree::default() + .file(USER_KDEGLOBALS, "[General]\nColorScheme=BreezeLight\n") + .file(LIGHT_FILE, &light_text()) + .file(LOOK_AND_FEEL, &dark_text()); + let desktop = discover(&tree, &kde_env()).unwrap(); + assert_eq!(desktop.scheme_origin, SchemeOrigin::SchemeFile); + assert!(desktop.scheme.is_dark()); + } + + #[test] + fn without_any_scheme_file_breeze_light_is_built_in() { + let tree = Tree::default().file(USER_KDEGLOBALS, "[General]\nColorScheme=Missing\n"); + let desktop = discover(&tree, &kde_env()).unwrap(); + assert_eq!(desktop.scheme_origin, SchemeOrigin::BuiltIn); + assert_eq!( + desktop.scheme.os_theme_colors(), + KdeColorScheme::breeze_light().os_theme_colors() + ); + assert_eq!(prefers_dark(&tree), Some(false)); + } + + #[test] + fn an_immutable_group_in_a_lower_layer_freezes_it_for_the_user() { + let tree = Tree::default() + .file( + ETC_KDEGLOBALS, + "[KDE][$i]\nwidgetStyle=Fusion\n\n[General]\nColorScheme[$i]=BreezeLight\n", + ) + .file( + USER_KDEGLOBALS, + "[KDE]\nwidgetStyle=Oxygen\nAnimationDurationFactor=0\n\n\ + [General]\nColorScheme=BreezeDark\nfixed=Hack,12,-1,5,400,0,0,0,0,0,0,0,0,0,0,1\n", + ) + .file(LIGHT_FILE, &light_text()) + .file(DARK_FILE, &dark_text()); + let desktop = discover(&tree, &kde_env()).unwrap(); + // The user's whole [KDE] group is ignored, keys the lower layer did + // not set included. + assert_eq!(desktop.widget_style.as_deref(), Some("Fusion")); + assert!(!desktop.uses_breeze_style()); + assert_eq!(desktop.animation_duration_factor, None); + assert!(!desktop.prefers_reduced_motion()); + // Only the immutable ColorScheme entry is frozen in [General]. + assert!(!desktop.scheme.is_dark()); + assert_eq!(desktop.fonts.fixed.point_size, Some(12.0)); + assert_eq!(prefers_dark(&tree), Some(false)); + assert_eq!(reduced_motion(&tree), Some(false)); + } + + // ---- The accent when kdeglobals has no colours ---------------------- + + fn accent_tree(accent_line: &str) -> Tree { + Tree::default() + .file( + USER_KDEGLOBALS, + &format!("[General]\nColorScheme=BreezeLight\n{accent_line}\n"), + ) + .file(LIGHT_FILE, &light_text()) + } + + #[test] + fn a_valid_accent_colour_is_applied_to_the_scheme_file() { + let accent = KdeColor::rgb8(233, 61, 0); + let desktop = discover(&accent_tree("AccentColor=233,61,0"), &kde_env()).unwrap(); + assert_eq!(desktop.scheme_origin, SchemeOrigin::SchemeFile); + assert_eq!(desktop.user_accent, Some(accent)); + let os = desktop.scheme.os_theme_colors(); + assert_eq!( + os, + KdeColorScheme::breeze_light() + .with_accent(accent) + .os_theme_colors() + ); + assert_ne!(os, KdeColorScheme::breeze_light().os_theme_colors()); + // Focus decorations take the accent itself. + assert_eq!(os.focus, Some(accent.to_color())); + + // The hex form is the same colour. + let hex = discover(&accent_tree("AccentColor=#e93d00"), &kde_env()).unwrap(); + assert_eq!(hex.scheme.os_theme_colors(), os); + } + + #[test] + fn a_valid_accent_colour_is_applied_to_built_in_breeze_light() { + let accent = KdeColor::rgb8(146, 110, 228); + let tree = Tree::default().file(USER_KDEGLOBALS, "[General]\nAccentColor=146,110,228\n"); + let desktop = discover(&tree, &kde_env()).unwrap(); + assert_eq!(desktop.scheme_origin, SchemeOrigin::BuiltIn); + assert_eq!( + desktop.scheme.os_theme_colors(), + KdeColorScheme::breeze_light() + .with_accent(accent) + .os_theme_colors() + ); + } + + #[test] + fn a_transparent_invalid_or_absent_accent_colour_is_no_accent() { + let plain = KdeColorScheme::breeze_light().os_theme_colors(); + for line in [ + "AccentColor=transparent", + "AccentColor=0,0,0,0", + "AccentColor=invalid", + "AccentColor=", + "AccentColor=12,34", + "AccentColor=300,0,0", + "AccentColor=notacolour", + "", + ] { + let desktop = discover(&accent_tree(line), &kde_env()).unwrap(); + assert_eq!(desktop.user_accent, None, "{line:?}"); + assert_eq!(desktop.scheme.os_theme_colors(), plain, "{line:?}"); + } + } + + // ---- Accent precedence --------------------------------------------- + + #[test] + fn kdeglobals_wins_over_the_portal_accent() { + let portal = || { + let mut os = OsThemeColors::new(ColorSchemePreference::Dark); + os.accent = Some(Color::from_rgb(1.0, 0.0, 0.0)); + os + }; + + let desktop = discover(&accent_tree(""), &kde_env()); + let native = native_desktop(desktop.clone(), || { + panic!("the portal is not asked when kdeglobals can be read") + }); + assert_eq!(native.kde, desktop); + assert_eq!(native.os, KdeColorScheme::breeze_light().os_theme_colors()); + assert_eq!(native.os.accent, rgb(61, 174, 233)); + + // Without a readable kdeglobals the portal's report is the one. + let native = native_desktop(None, portal); + assert_eq!(native.kde, None); + assert_eq!(native.os, portal()); + } + + // ---- Dark detection -------------------------------------------------- + + #[test] + fn dark_is_decided_by_the_colours_not_the_scheme_name() { + let light = accent_tree(""); + assert_eq!(prefers_dark(&light), Some(false)); + + let dark = Tree::default() + .file(USER_KDEGLOBALS, "[General]\nColorScheme=BreezeDark\n") + .file(DARK_FILE, &dark_text()); + assert_eq!(prefers_dark(&dark), Some(true)); + + // A light scheme whose name says dark is light. + let misnamed = Tree::default() + .file(USER_KDEGLOBALS, "[General]\nColorScheme=MyDarkScheme\n") + .file( + "/usr/share/color-schemes/MyDarkScheme.colors", + &light_text(), + ); + assert_eq!(prefers_dark(&misnamed), Some(false)); + + // Twilight-like: Breeze Light's views under Breeze Dark's window. The + // window decides, so it is dark. + let twilight = format!( + "{}\n[General]\nColorScheme=BreezeTwilight\n\n\ + [Colors:Window]\nBackgroundNormal=32,35,38\nForegroundNormal=252,252,252\n", + light_text() + ); + let twilight = Tree::default().file(USER_KDEGLOBALS, &twilight); + assert_eq!(prefers_dark(&twilight), Some(true)); + let os = discover(&twilight, &kde_env()) + .unwrap() + .scheme + .os_theme_colors(); + assert_eq!(os.color_scheme, ColorSchemePreference::Dark); + assert_eq!(os.view_bg, rgb(255, 255, 255)); + } + + // ---- Reduced motion -------------------------------------------------- + + #[test] + fn reduced_motion_follows_an_animation_factor_of_zero() { + let with = |factor: &str| { + Tree::default().file( + USER_KDEGLOBALS, + &format!("[KDE]\nAnimationDurationFactor={factor}\n"), + ) + }; + assert_eq!(reduced_motion(&with("0")), Some(true)); + assert_eq!(reduced_motion(&with("0.0")), Some(true)); + assert_eq!(reduced_motion(&with("1")), Some(false)); + assert_eq!(reduced_motion(&with("0.25")), Some(false)); + let absent = Tree::default().file(USER_KDEGLOBALS, "[KDE]\nwidgetStyle=Breeze\n"); + assert_eq!(reduced_motion(&absent), Some(false)); + + // The same answer as the full reader's. + let var = kde_env(); + let desktop = discover(&with("0"), &var).unwrap(); + assert!(desktop.prefers_reduced_motion()); + } +} diff --git a/engineering/docs/kde-breeze-spec.md b/engineering/docs/kde-breeze-spec.md index 5c2e7557f..8c6f333fb 100644 --- a/engineering/docs/kde-breeze-spec.md +++ b/engineering/docs/kde-breeze-spec.md @@ -422,7 +422,9 @@ copied and which are re-formatted. A session is KDE when `XDG_CURRENT_DESKTOP`, split at `:`, contains `KDE`, or when `KDE_FULL_SESSION` equals `true`. (The Plasma session start sets -both, plus `KDE_SESSION_VERSION=6`.) +both, plus `KDE_SESSION_VERSION=6`.) Teksilo compares the desktop names +ignoring ASCII case **[derived]**: the session start writes `KDE`, and +Teksilo's desktop detection has always ignored case. ### b.11 `[$e]` expansion From 0e9c28c4e84f55479637c98dae2428a00f4465c3 Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 13:32:06 +0200 Subject: [PATCH 18/59] refactor(app): resolve every Native-mode theme through one function ThemeMode::Native built its theme in three places, each laying ColorTokens::from_os_colors over IntUI: the window manager's apply_os_theme and its window-creation path, and the widget previewer's Native canvas theme. They now share one resolution, and every caller produces the theme it produced before for every desktop report. presets::intui::from_os(os, dark) is the IntUI light or dark preset with the colours of the report. New module teksilo-app native_theme: NativeThemeRequest (non_exhaustive, with new) carries the NativeDesktop, whether the theme is to be dark and the density wanted; NativeThemeFactory is an app's own answer to one; resolve_native_theme asks the factory and falls back to presets::intui::from_os when there is none or it answers None. It sets no id and applies no density, which the callers keep doing as before. TeksiloAppBuilder::native_theme stores a factory, which the window manager owns. The three types and the function are re-exported from teksilo-app's root and the umbrella prelude. The callers read query_native_desktop and keep their own rules. On an appearance change a desktop stating a light or dark preference decides dark; one stating none is answered from the winit hint (light without one) with a report of that preference alone, so its colours are still not used. A new window is dark exactly when the desktop states dark, and still ignores the hint. Both are stamped "system" and asked at Compact, the density every preset carries and these themes always had. The previewer passes no factory and asks at the density it applies afterwards; its unused CanvasTheme::theme is folded into a private resolve. Tests keep the three old computations as reference functions and compare them, by Theme's PartialEq plus colours, input tokens and id, with the new paths over Light, Dark and NoPreference reports, bare, accent only, with the window, button, selection and tooltip colours, and with the view and semantic colours too, for no hint and both hint values, and in the previewer at every density. A factory answering Some wins (the window manager still stamps "system"), one answering None falls back to the same themes, and a desktop with no preference is asked for with the hint's preference. intui::from_os keeps the preset and takes the report's colours. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 13 + crates/teksilo-app/src/app.rs | 31 ++ crates/teksilo-app/src/lib.rs | 2 + crates/teksilo-app/src/native_theme.rs | 359 +++++++++++++++++++++ crates/teksilo-app/src/window_manager.rs | 69 ++-- crates/teksilo-core/src/presets/intui.rs | 45 ++- crates/teksilo-preview-ui/src/app_state.rs | 100 +++++- crates/teksilo/src/lib.rs | 4 +- 8 files changed, 566 insertions(+), 57 deletions(-) create mode 100644 crates/teksilo-app/src/native_theme.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c1631ce6..995ba632d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -140,6 +140,19 @@ by crate for clarity, not because crates version independently. `NativeDesktop::new` builds one from a colour report alone, and it implements `PartialEq`, so a caller can tell whether the desktop changed. +#### App + +- **`TeksiloAppBuilder::native_theme`.** An app can give `ThemeMode::Native` + a theme of its own: the closure is asked with a `NativeThemeRequest` (what + the desktop reports, whether the theme is to be dark, the density wanted) + whenever Native mode needs a theme, and answers with a theme, for example a + design-language preset rebuilt over the desktop's colours so Native mode + keeps that preset's geometry and chrome, or with `None` to keep IntUI in + the desktop's colours. `resolve_native_theme` gives the theme Native mode + uses for a request, and `presets::intui::from_os` is the IntUI default on + its own. The window manager and the widget previewer's Native canvas theme + now resolve through it, with the same themes as before. + ### Changed #### Theming diff --git a/crates/teksilo-app/src/app.rs b/crates/teksilo-app/src/app.rs index a14780951..673e97050 100644 --- a/crates/teksilo-app/src/app.rs +++ b/crates/teksilo-app/src/app.rs @@ -3981,6 +3981,10 @@ impl AppEventPoster for AppEventProxy { pub struct TeksiloAppBuilder { theme: Theme, theme_mode: ThemeMode, + /// The app's own `ThemeMode::Native` theme, set via + /// [`native_theme`](Self::native_theme) and handed to the window manager + /// at `run`. + native_theme: Option, pen_batching: teksilo_platform::PenBatching, typesetter: Option, font_registrars: Vec>, @@ -4044,6 +4048,7 @@ impl TeksiloAppBuilder { Self { theme: teksilo_core::presets::intui::light(), theme_mode: ThemeMode::Manual, + native_theme: None, pen_batching: teksilo_platform::PenBatching::default(), typesetter: None, font_registrars: Vec::new(), @@ -4420,6 +4425,31 @@ impl TeksiloAppBuilder { self } + /// Give `ThemeMode::Native` a theme of the app's own. + /// + /// Whenever Native mode needs a theme (a window opening, the desktop's + /// light or dark state changing, a switch to Native mode at runtime), `f` + /// is asked first with a [`NativeThemeRequest`](crate::NativeThemeRequest) + /// carrying what the desktop reports, whether the theme is to be dark and + /// the density wanted. Answer `Some(theme)` to use it, for example a + /// design-language preset rebuilt over the desktop's colours so Native + /// mode brings that preset's geometry and chrome; answer `None` to keep + /// the default, IntUI coloured by the desktop + /// ([`presets::intui::from_os`](teksilo_core::presets::intui::from_os)). + /// + /// The theme the app answers with is given the id `"system"`, like every + /// theme that follows the OS, so a `ThemeSwitcher` shows it as "follow + /// OS". Setting a factory does not select Native mode; combine it with + /// [`theme_mode`](Self::theme_mode). See + /// [`resolve_native_theme`](crate::resolve_native_theme). + pub fn native_theme( + mut self, + f: impl Fn(&crate::NativeThemeRequest<'_>) -> Option + 'static, + ) -> Self { + self.native_theme = Some(Box::new(f)); + self + } + /// Choose how a drained pen batch reaches the tree. /// /// A digitizer outruns the window's message rate, so one poll routinely @@ -5003,6 +5033,7 @@ impl TeksiloAppBuilder { // rather than threaded through `TeksiloAppHandler::new`'s already long // parameter list. app.wm.set_pen_batching(self.pen_batching); + app.wm.set_native_theme(self.native_theme); app.wm.set_records_announcements(self.records_announcements); app.external_ctx_handler = self.external_ctx_handler; // Hand over any registered loop-tick hook (e.g. the `teksilo-async` diff --git a/crates/teksilo-app/src/lib.rs b/crates/teksilo-app/src/lib.rs index 7a58c00e8..e0d9bc5d5 100644 --- a/crates/teksilo-app/src/lib.rs +++ b/crates/teksilo-app/src/lib.rs @@ -9,6 +9,7 @@ pub mod automation_bridge; pub mod default_post_root; pub(crate) mod input_loop; pub(crate) mod input_routing; +pub mod native_theme; pub(crate) mod redraw_gate; pub mod window_config; pub mod window_manager; @@ -22,6 +23,7 @@ pub use app_event_observers::AppEventObservers; #[cfg(feature = "automation")] pub use automation_bridge::TeksiloAppBuilderAutomationExt; pub use default_post_root::DefaultPostRoot; +pub use native_theme::{NativeThemeFactory, NativeThemeRequest, resolve_native_theme}; pub use window_config::{ ModalConfig, PostRootBuilder, RootBuilder, TeksiloWindowId, WindowConfig, WindowRemovedCallback, WindowRemovedEvent, diff --git a/crates/teksilo-app/src/native_theme.rs b/crates/teksilo-app/src/native_theme.rs new file mode 100644 index 000000000..8631bfcf9 --- /dev/null +++ b/crates/teksilo-app/src/native_theme.rs @@ -0,0 +1,359 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The one place [`ThemeMode::Native`](crate::ThemeMode::Native) turns what +//! the desktop reports into a [`Theme`]. +//! +//! An app can hand the window manager a [`NativeThemeFactory`] through +//! [`TeksiloAppBuilder::native_theme`](crate::TeksiloAppBuilder::native_theme): +//! asked with a [`NativeThemeRequest`] whenever Native mode needs a theme (a +//! window opening, the desktop's light or dark state changing, a switch to +//! Native mode), it can answer with a theme of its own, for example a preset +//! that brings its own geometry and chrome along with the desktop's colours. +//! When there is no factory, or it answers `None`, the theme is IntUI +//! coloured by the desktop ([`presets::intui::from_os`]). +//! +//! The callers stamp the result with the id `"system"` (the window manager) +//! or a density (the previewer) themselves; [`resolve_native_theme`] does +//! neither. + +use teksilo_core::Theme; +use teksilo_core::presets; +use teksilo_platform::os_theme::NativeDesktop; +use teksilo_tokens::{ColorSchemePreference, OsThemeColors, TargetDensity}; + +/// What [`ThemeMode::Native`](crate::ThemeMode::Native) asks a +/// [`NativeThemeFactory`] for a theme with. +#[derive(Debug, Clone, Copy)] +#[non_exhaustive] +pub struct NativeThemeRequest<'a> { + /// What the desktop reports: its colours and, on a KDE Plasma session, + /// its settings. + pub desktop: &'a NativeDesktop, + /// Whether the theme is to be dark. + pub dark: bool, + /// The target density the theme is wanted at. + pub density: TargetDensity, +} + +impl<'a> NativeThemeRequest<'a> { + /// A request for a theme over `desktop`, dark or light, at `density`. + pub fn new(desktop: &'a NativeDesktop, dark: bool, density: TargetDensity) -> Self { + NativeThemeRequest { + desktop, + dark, + density, + } + } +} + +/// An app's own answer to a [`NativeThemeRequest`]: `Some` theme to use, or +/// `None` to keep the default, IntUI coloured by the desktop. +/// +/// Installed with +/// [`TeksiloAppBuilder::native_theme`](crate::TeksiloAppBuilder::native_theme). +pub type NativeThemeFactory = Box) -> Option>; + +/// The theme [`ThemeMode::Native`](crate::ThemeMode::Native) uses for +/// `request`: the `factory`'s answer when there is a factory and it answers +/// `Some`, otherwise [`presets::intui::from_os`] over the desktop's colour +/// report with `request.dark`. +/// +/// The theme is returned as the factory or the preset built it: no id is set +/// and no density applied. +pub fn resolve_native_theme( + factory: Option<&NativeThemeFactory>, + request: &NativeThemeRequest<'_>, +) -> Theme { + factory + .and_then(|factory| factory(request)) + .unwrap_or_else(|| presets::intui::from_os(&request.desktop.os, request.dark)) +} + +/// The density the window manager asks Native-mode themes at: the one every +/// preset is built with, which is also the density its Native themes have +/// always had. +const WINDOW_MANAGER_DENSITY: TargetDensity = TargetDensity::Compact; + +/// The Native-mode theme the window manager applies when the desktop's +/// appearance is re-read (a light or dark change, a switch to Native mode), +/// with the id `"system"`. +/// +/// A desktop that states a light or dark preference decides `dark` itself. +/// One that states none is answered from `hint` (the winit light or dark +/// state; light when there is none) with a report of that preference alone: +/// its colours are not used. +pub(crate) fn theme_for_appearance_change( + factory: Option<&NativeThemeFactory>, + desktop: &NativeDesktop, + hint: Option, +) -> Theme { + let theme = match desktop.os.color_scheme { + ColorSchemePreference::Dark | ColorSchemePreference::Light => resolve_native_theme( + factory, + &NativeThemeRequest::new( + desktop, + desktop.os.color_scheme.is_dark(), + WINDOW_MANAGER_DENSITY, + ), + ), + ColorSchemePreference::NoPreference => { + let dark = hint.unwrap_or(false); + let stated = NativeDesktop::new(OsThemeColors::new(if dark { + ColorSchemePreference::Dark + } else { + ColorSchemePreference::Light + })); + resolve_native_theme( + factory, + &NativeThemeRequest::new(&stated, dark, WINDOW_MANAGER_DENSITY), + ) + } + }; + theme.with_id("system") +} + +/// The Native-mode theme the window manager builds a new window with, with +/// the id `"system"`: dark exactly when the desktop states a dark +/// preference. +pub(crate) fn theme_for_new_window( + factory: Option<&NativeThemeFactory>, + desktop: &NativeDesktop, +) -> Theme { + resolve_native_theme( + factory, + &NativeThemeRequest::new( + desktop, + desktop.os.color_scheme.is_dark(), + WINDOW_MANAGER_DENSITY, + ), + ) + .with_id("system") +} + +#[cfg(test)] +mod tests { + use super::*; + use std::cell::RefCell; + use std::rc::Rc; + use teksilo_tokens::{Color, ColorTokens}; + + /// `apply_os_theme`'s Native arm as it was before this module, given the + /// already-resolved winit hint. + fn old_appearance_change(os: &OsThemeColors, hint: Option) -> Theme { + match os.color_scheme { + ColorSchemePreference::Dark => Theme { + colors: ColorTokens::from_os_colors(os), + ..presets::intui::dark() + }, + ColorSchemePreference::Light => Theme { + colors: ColorTokens::from_os_colors(os), + ..presets::intui::light() + }, + ColorSchemePreference::NoPreference => { + if hint.unwrap_or(false) { + presets::intui::dark() + } else { + presets::intui::light() + } + } + } + .with_id("system") + } + + /// The window-creation Native arm as it was before this module. + fn old_new_window(os: &OsThemeColors) -> Theme { + let base = if os.color_scheme.is_dark() { + presets::intui::dark() + } else { + presets::intui::light() + }; + Theme { + colors: ColorTokens::from_os_colors(os), + ..base + } + .with_id("system") + } + + /// Reports for every preference, with no colours, with the colours every + /// desktop reader fills, and with the view and semantic colours as well. + fn reports() -> Vec { + let mut out = Vec::new(); + for scheme in [ + ColorSchemePreference::Light, + ColorSchemePreference::Dark, + ColorSchemePreference::NoPreference, + ] { + let bare = OsThemeColors::new(scheme); + + let mut accent_only = OsThemeColors::new(scheme); + accent_only.accent = Some(Color::from_rgb(0.24, 0.68, 0.91)); + + let mut legacy = OsThemeColors::new(scheme); + legacy.accent = Some(Color::from_rgb(0.24, 0.68, 0.91)); + legacy.window_bg = Some(Color::from_rgb(0.94, 0.94, 0.95)); + legacy.window_fg = Some(Color::from_rgb(0.14, 0.15, 0.16)); + legacy.button_bg = Some(Color::from_rgb(0.99, 0.99, 0.99)); + legacy.button_fg = Some(Color::from_rgb(0.14, 0.15, 0.16)); + legacy.selection_bg = Some(Color::from_rgb(0.24, 0.68, 0.91)); + legacy.selection_fg = Some(Color::WHITE); + legacy.tooltip_bg = Some(Color::from_rgb(0.97, 0.97, 0.97)); + legacy.tooltip_fg = Some(Color::from_rgb(0.14, 0.15, 0.16)); + + let mut full = legacy.clone(); + full.view_bg = Some(Color::WHITE); + full.view_fg = Some(Color::from_rgb(0.12, 0.12, 0.12)); + full.alternate_bg = Some(Color::from_rgb(0.97, 0.97, 0.97)); + full.inactive_fg = Some(Color::from_rgb(0.44, 0.45, 0.46)); + full.link = Some(Color::from_rgb(0.16, 0.5, 0.73)); + full.link_visited = Some(Color::from_rgb(0.61, 0.35, 0.71)); + full.error = Some(Color::from_rgb(0.85, 0.27, 0.33)); + full.warning = Some(Color::from_rgb(0.96, 0.45, 0.0)); + full.success = Some(Color::from_rgb(0.15, 0.68, 0.38)); + full.focus = Some(Color::from_rgb(0.24, 0.68, 0.91)); + + out.extend([bare, accent_only, legacy, full]); + } + out + } + + fn assert_same(new: &Theme, old: &Theme, what: &str) { + assert_eq!(new.id, old.id, "{what}: id"); + assert_eq!(new.colors, old.colors, "{what}: colours"); + assert_eq!(new.input, old.input, "{what}: input tokens"); + assert_eq!(new, old, "{what}: theme"); + } + + #[test] + fn an_appearance_change_resolves_as_before() { + for os in reports() { + for hint in [None, Some(false), Some(true)] { + let desktop = NativeDesktop::new(os.clone()); + let new = theme_for_appearance_change(None, &desktop, hint); + let old = old_appearance_change(&os, hint); + assert_same(&new, &old, &format!("{os:?} with hint {hint:?}")); + } + } + } + + #[test] + fn a_new_window_resolves_as_before() { + for os in reports() { + let desktop = NativeDesktop::new(os.clone()); + assert_same( + &theme_for_new_window(None, &desktop), + &old_new_window(&os), + &format!("{os:?}"), + ); + } + } + + #[test] + fn without_a_factory_the_theme_is_intui_from_the_report() { + for os in reports() { + for dark in [false, true] { + let desktop = NativeDesktop::new(os.clone()); + let request = NativeThemeRequest::new(&desktop, dark, TargetDensity::Touch); + assert_eq!( + resolve_native_theme(None, &request), + presets::intui::from_os(&os, dark), + "{os:?}, dark {dark}" + ); + } + } + } + + #[test] + fn a_factory_answering_some_wins() { + let seen = Rc::new(RefCell::new(Vec::new())); + let log = seen.clone(); + let factory: NativeThemeFactory = Box::new(move |request: &NativeThemeRequest<'_>| { + log.borrow_mut() + .push((request.desktop.clone(), request.dark, request.density)); + Some(presets::intui::dark().with_id("app.native")) + }); + + let mut os = OsThemeColors::new(ColorSchemePreference::Light); + os.accent = Some(Color::from_rgb(0.9, 0.2, 0.1)); + let desktop = NativeDesktop::new(os); + let request = NativeThemeRequest::new(&desktop, false, TargetDensity::Comfortable); + assert_eq!( + resolve_native_theme(Some(&factory), &request), + presets::intui::dark().with_id("app.native") + ); + assert_eq!( + *seen.borrow(), + vec![(desktop.clone(), false, TargetDensity::Comfortable)] + ); + + // The window manager stamps its id over the factory's. + let theme = theme_for_new_window(Some(&factory), &desktop); + assert_eq!(theme, presets::intui::dark().with_id("system")); + let theme = theme_for_appearance_change(Some(&factory), &desktop, Some(true)); + assert_eq!(theme, presets::intui::dark().with_id("system")); + assert_eq!(seen.borrow().len(), 3); + assert!(!seen.borrow()[1].1); + assert_eq!(seen.borrow()[1].2, TargetDensity::Compact); + // A desktop stating a light preference is light whatever the hint. + assert!(!seen.borrow()[2].1); + } + + #[test] + fn a_factory_answering_none_falls_back() { + let calls = Rc::new(RefCell::new(0)); + let count = calls.clone(); + let factory: NativeThemeFactory = Box::new(move |_: &NativeThemeRequest<'_>| { + *count.borrow_mut() += 1; + None + }); + + for os in reports() { + let desktop = NativeDesktop::new(os.clone()); + for dark in [false, true] { + let request = NativeThemeRequest::new(&desktop, dark, TargetDensity::Compact); + assert_eq!( + resolve_native_theme(Some(&factory), &request), + resolve_native_theme(None, &request), + "{os:?}, dark {dark}" + ); + } + for hint in [None, Some(false), Some(true)] { + assert_eq!( + theme_for_appearance_change(Some(&factory), &desktop, hint), + old_appearance_change(&os, hint), + "{os:?} with hint {hint:?}" + ); + } + assert_eq!( + theme_for_new_window(Some(&factory), &desktop), + old_new_window(&os), + "{os:?}" + ); + } + assert_eq!(*calls.borrow(), reports().len() * (2 + 3 + 1)); + } + + #[test] + fn a_desktop_with_no_preference_is_asked_for_by_the_hint() { + let seen = Rc::new(RefCell::new(Vec::new())); + let log = seen.clone(); + let factory: NativeThemeFactory = Box::new(move |request: &NativeThemeRequest<'_>| { + log.borrow_mut() + .push((request.desktop.os.clone(), request.dark)); + None + }); + let mut os = OsThemeColors::new(ColorSchemePreference::NoPreference); + os.accent = Some(Color::from_rgb(0.9, 0.2, 0.1)); + let desktop = NativeDesktop::new(os); + + theme_for_appearance_change(Some(&factory), &desktop, Some(true)); + theme_for_appearance_change(Some(&factory), &desktop, None); + assert_eq!( + *seen.borrow(), + vec![ + (OsThemeColors::new(ColorSchemePreference::Dark), true), + (OsThemeColors::new(ColorSchemePreference::Light), false), + ] + ); + } +} diff --git a/crates/teksilo-app/src/window_manager.rs b/crates/teksilo-app/src/window_manager.rs index 744d2b1ed..035da5ac3 100644 --- a/crates/teksilo-app/src/window_manager.rs +++ b/crates/teksilo-app/src/window_manager.rs @@ -23,12 +23,13 @@ use teksilo_platform::AccessibilityPreferences; use teksilo_platform::PlatformWindow; use teksilo_platform::create_title_bar_host; use teksilo_platform::event_translation::TranslationState; -use teksilo_tokens::{ColorSchemePreference, ColorTokens}; +use teksilo_tokens::ColorSchemePreference; #[allow(unused_imports)] use winit::raw_window_handle::HasWindowHandle; use winit::window::WindowLevel; use crate::app::{AppEventProxy, CloseWindowRequest, ThemeMode}; +use crate::native_theme::NativeThemeFactory; use crate::window_config::{TeksiloWindowId, WindowConfig}; @@ -490,6 +491,10 @@ pub struct WindowManager { /// How the app resolves its theme (Manual, FollowSystem, Native). theme_mode: ThemeMode, pen_batching: teksilo_platform::PenBatching, + /// The app's own [`ThemeMode::Native`] theme, asked before the default + /// (IntUI coloured by the desktop). See + /// [`TeksiloAppBuilder::native_theme`](crate::TeksiloAppBuilder::native_theme). + native_theme: Option, /// Whether each window's tree records what the platform adapters /// announce ([`WidgetTree::set_records_announcements`]). Off unless the /// automation bridge is installed: nothing else in a running application @@ -557,6 +562,7 @@ impl WindowManager { user_text_scale: 1.0, theme_mode: ThemeMode::Manual, pen_batching: teksilo_platform::PenBatching::default(), + native_theme: None, records_announcements: false, app_context_template: None, event_proxy: None, @@ -592,6 +598,13 @@ impl WindowManager { self.pen_batching = mode; } + /// The app's own [`ThemeMode::Native`] theme, asked before the default + /// whenever Native mode resolves a theme. See + /// [`resolve_native_theme`](crate::resolve_native_theme). + pub(crate) fn set_native_theme(&mut self, factory: Option) { + self.native_theme = factory; + } + /// Whether the windows opened from now on record announcements. See /// [`WidgetTree::set_records_announcements`]. pub(crate) fn set_records_announcements(&mut self, record: bool) { @@ -714,9 +727,11 @@ impl WindowManager { /// Recompute and broadcast the theme from the **current OS appearance**, /// per the active theme mode. A no-op under `Manual`. Under `Native` it - /// adopts the OS's actual colours (GNOME/KDE/Cinnamon on Linux); under - /// `FollowSystem` it picks the built-in light/dark preset. Both results - /// carry the id `"system"`. + /// resolves the desktop's report through + /// [`resolve_native_theme`](crate::resolve_native_theme): the app's own + /// native theme, else IntUI in the OS's actual colours (GNOME/KDE/Cinnamon + /// on Linux); under `FollowSystem` it picks the built-in light/dark + /// preset. Both results carry the id `"system"`. /// /// `os_dark_hint` is the OS light/dark state as reported by winit (e.g. /// from a `WindowEvent::ThemeChanged`), used as the authoritative source on @@ -753,28 +768,13 @@ impl WindowManager { .with_id("system") } ThemeMode::Native => { - let os = teksilo_platform::os_theme::query_os_theme_colors(); - match os.color_scheme { - // Real OS scheme (Linux): adopt the OS's actual colours. - ColorSchemePreference::Dark => Theme { - colors: ColorTokens::from_os_colors(&os), - ..teksilo_core::presets::intui::dark() - }, - ColorSchemePreference::Light => Theme { - colors: ColorTokens::from_os_colors(&os), - ..teksilo_core::presets::intui::light() - }, - // No OS-colour support (macOS/Windows): follow the winit - // light/dark hint using the built-in presets. - ColorSchemePreference::NoPreference => { - if hint.unwrap_or(false) { - teksilo_core::presets::intui::dark() - } else { - teksilo_core::presets::intui::light() - } - } - } - .with_id("system") + // A desktop stating a light or dark preference decides; one + // stating none (macOS, Windows) follows the winit hint. + crate::native_theme::theme_for_appearance_change( + self.native_theme.as_ref(), + &teksilo_platform::os_theme::query_native_desktop(), + hint, + ) } }; self.set_theme(theme); @@ -1082,19 +1082,10 @@ impl WindowManager { _ => teksilo_core::presets::intui::light(), } .with_id("system"), - ThemeMode::Native => { - let os = teksilo_platform::os_theme::query_os_theme_colors(); - let base = if os.color_scheme.is_dark() { - teksilo_core::presets::intui::dark() - } else { - teksilo_core::presets::intui::light() - }; - Theme { - colors: ColorTokens::from_os_colors(&os), - ..base - } - .with_id("system") - } + ThemeMode::Native => crate::native_theme::theme_for_new_window( + self.native_theme.as_ref(), + &teksilo_platform::os_theme::query_native_desktop(), + ), }; // Update the shared theme so all subsequent windows use the same base if self.theme_mode != ThemeMode::Manual { diff --git a/crates/teksilo-core/src/presets/intui.rs b/crates/teksilo-core/src/presets/intui.rs index 102bd77cf..41d094e0b 100644 --- a/crates/teksilo-core/src/presets/intui.rs +++ b/crates/teksilo-core/src/presets/intui.rs @@ -16,7 +16,8 @@ //! `style_slots: ComponentStyleSlots`. use teksilo_tokens::{ - ColorTokens, InputTokens, LayoutTokens, MotionTokens, ShapeTokens, TypographyTokens, + ColorTokens, InputTokens, LayoutTokens, MotionTokens, OsThemeColors, ShapeTokens, + TypographyTokens, }; use crate::styles::{ComponentStyleSlots, Theme, ThemeAppearance, ThemeExtensions, ThemeId}; @@ -54,6 +55,27 @@ pub fn dark() -> Theme { } } +/// IntUI coloured by the desktop: the [`light`] or [`dark`] theme, chosen by +/// `dark`, with its colours replaced by +/// [`ColorTokens::from_os_colors`] over `os`. +/// +/// This is the theme `ThemeMode::Native` falls back to when the app gives it +/// no theme of its own. Everything but the colours (geometry, typography, +/// motion, input, style slots, extensions, id) is the chosen preset's, so the +/// id stays `intui.light` or `intui.dark` until the caller sets another. +/// +/// `dark` picks only the preset under the colours. The colours follow +/// `os.color_scheme`: [`ColorTokens::from_os_colors`] starts from the light +/// or dark defaults that preference names (light when it states none), so a +/// caller normally passes `dark` as `os.color_scheme.is_dark()`. +pub fn from_os(os: &OsThemeColors, dark: bool) -> Theme { + let base = if dark { self::dark() } else { light() }; + Theme { + colors: ColorTokens::from_os_colors(os), + ..base + } +} + #[cfg(test)] mod tests { use super::*; @@ -84,4 +106,25 @@ mod tests { let d = dark(); assert!(d.shape.shadow_lg.color.a() > l.shape.shadow_lg.color.a()); } + + #[test] + fn from_os_keeps_the_preset_and_takes_the_report_colours() { + use teksilo_tokens::{Color, ColorSchemePreference}; + + let mut os = OsThemeColors::new(ColorSchemePreference::Dark); + os.window_bg = Some(Color::from_rgb(0.1, 0.2, 0.3)); + let theme = from_os(&os, true); + assert_eq!(theme.colors, ColorTokens::from_os_colors(&os)); + assert_eq!( + Theme { + colors: dark().colors, + ..theme + }, + dark() + ); + + // A report with no colours is the preset itself. + let plain = OsThemeColors::new(ColorSchemePreference::Light); + assert_eq!(from_os(&plain, false), light()); + } } diff --git a/crates/teksilo-preview-ui/src/app_state.rs b/crates/teksilo-preview-ui/src/app_state.rs index 0589a0d7e..48009c0ae 100644 --- a/crates/teksilo-preview-ui/src/app_state.rs +++ b/crates/teksilo-preview-ui/src/app_state.rs @@ -109,26 +109,19 @@ impl CanvasTheme { /// pickers used to — silently drops the previewer back to `Compact` on the /// next theme click. pub fn theme_at(self, density: teksilo_tokens::TargetDensity) -> teksilo_core::Theme { - self.theme().with_density(density) + self.resolve(density).with_density(density) } - /// Resolve to a concrete theme. For `Native`, builds a theme that - /// *adopts* the OS palette rather than picking between Teksilo's - /// built-in Int UI light/dark — this is what gives a visibly - /// distinct result from clicking Light/Dark on most desktops. - pub fn theme(self) -> teksilo_core::Theme { + /// Resolve to a concrete theme, before `density` is applied. For + /// `Native`, builds a theme that *adopts* the OS palette rather than + /// picking between Teksilo's built-in Int UI light/dark, which is what + /// gives a visibly distinct result from clicking Light/Dark on most + /// desktops. It goes through the framework's one Native-mode resolution, + /// with no app factory, asking at `density`. + fn resolve(self, density: teksilo_tokens::TargetDensity) -> teksilo_core::Theme { match self { CanvasTheme::Native => { - let os = teksilo_platform::os_theme::query_os_theme_colors(); - let base = if os.color_scheme.is_dark() { - teksilo_core::presets::intui::dark() - } else { - teksilo_core::presets::intui::light() - }; - teksilo_core::Theme { - colors: teksilo_tokens::ColorTokens::from_os_colors(&os), - ..base - } + native_canvas_theme(&teksilo_platform::os_theme::query_native_desktop(), density) } CanvasTheme::Light => teksilo_core::presets::intui::light(), CanvasTheme::Dark => teksilo_core::presets::intui::dark(), @@ -136,6 +129,18 @@ impl CanvasTheme { } } +/// The `Native` canvas theme over `desktop`: dark exactly when the desktop +/// states a dark preference, with no id or density applied. +fn native_canvas_theme( + desktop: &teksilo_platform::os_theme::NativeDesktop, + density: teksilo_tokens::TargetDensity, +) -> teksilo_core::Theme { + teksilo_app::resolve_native_theme( + None, + &teksilo_app::NativeThemeRequest::new(desktop, desktop.os.color_scheme.is_dark(), density), + ) +} + /// Cache key — `(widget_id, variant_name)`. pub type CacheKey = (&'static str, &'static str); @@ -475,3 +480,66 @@ impl Widget for PreviewerRoot { builder.set_name("Teksilo Widget Previewer"); } } + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_platform::os_theme::NativeDesktop; + use teksilo_tokens::{Color, ColorSchemePreference, ColorTokens, OsThemeColors, TargetDensity}; + + /// `CanvasTheme::Native` as it was resolved before the framework's + /// Native-mode resolution existed. + fn old_native(os: &OsThemeColors) -> teksilo_core::Theme { + let base = if os.color_scheme.is_dark() { + teksilo_core::presets::intui::dark() + } else { + teksilo_core::presets::intui::light() + }; + teksilo_core::Theme { + colors: ColorTokens::from_os_colors(os), + ..base + } + } + + #[test] + fn the_native_canvas_theme_resolves_as_before() { + for scheme in [ + ColorSchemePreference::Light, + ColorSchemePreference::Dark, + ColorSchemePreference::NoPreference, + ] { + let bare = OsThemeColors::new(scheme); + let mut legacy = OsThemeColors::new(scheme); + legacy.accent = Some(Color::from_rgb(0.24, 0.68, 0.91)); + legacy.window_bg = Some(Color::from_rgb(0.94, 0.94, 0.95)); + legacy.window_fg = Some(Color::from_rgb(0.14, 0.15, 0.16)); + legacy.selection_bg = Some(Color::from_rgb(0.24, 0.68, 0.91)); + let mut full = legacy.clone(); + full.view_bg = Some(Color::WHITE); + full.view_fg = Some(Color::from_rgb(0.12, 0.12, 0.12)); + full.link = Some(Color::from_rgb(0.16, 0.5, 0.73)); + full.error = Some(Color::from_rgb(0.85, 0.27, 0.33)); + full.focus = Some(Color::from_rgb(0.24, 0.68, 0.91)); + + for os in [bare, legacy, full] { + let desktop = NativeDesktop::new(os.clone()); + for density in [ + TargetDensity::Compact, + TargetDensity::Comfortable, + TargetDensity::Touch, + ] { + let new = native_canvas_theme(&desktop, density).with_density(density); + let old = old_native(&os).with_density(density); + assert_eq!(new.id, old.id, "{os:?} at {density:?}: id"); + assert_eq!(new.colors, old.colors, "{os:?} at {density:?}: colours"); + assert_eq!(new, old, "{os:?} at {density:?}"); + } + assert_eq!( + native_canvas_theme(&desktop, TargetDensity::default()), + old_native(&os), + "{os:?}" + ); + } + } + } +} diff --git a/crates/teksilo/src/lib.rs b/crates/teksilo/src/lib.rs index faecf55f6..adb5ed93c 100644 --- a/crates/teksilo/src/lib.rs +++ b/crates/teksilo/src/lib.rs @@ -198,7 +198,9 @@ pub mod prelude { pub use teksilo_core::color_prop::{ColorProp, TextStyleProp}; // App - pub use teksilo_app::{TeksiloAppBuilder, ThemeMode}; + pub use teksilo_app::{ + NativeThemeFactory, NativeThemeRequest, TeksiloAppBuilder, ThemeMode, resolve_native_theme, + }; // Settings (persistence layer) pub use teksilo_settings::{ From b99a91b3b6497a5c99cb34e337d756fdb5543dd1 Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 13:58:38 +0200 Subject: [PATCH 19/59] fix(app): keep the density and the hint in themes that follow the OS Every theme the window manager made under ThemeMode::Native or ThemeMode::FollowSystem was at the Compact density the presets carry, so an app at the comfortable or touch density had its input tokens reset when a window opened, on an OS light or dark change and on follow_system_theme, the last two without a rebuild. A window opening in Native mode on a desktop stating no preference was always light, while an appearance change followed the winit hint. And every re-read set the theme on every window, changed or not. native_theme now carries the one resolution all of these paths use. OsThemeSource is the mode's reading of the OS: FollowSystem with dark, or Native with the desktop as read and dark, which a desktop stating a light or dark preference decides and one stating none takes from the hint (light without one). OsThemeInputs adds the density. resolve_os_theme gives the IntUI preset, or resolve_native_theme's theme asked at that density, projected with Theme::with_density and stamped "system". A desktop stating no preference is asked for with its report stating the hint's preference and keeping its colours: on macOS and Windows the report has none, so the themes are those of before, and on a Linux desktop with accent or GTK colours and no preference a window opening keeps the theme it had, and the live paths now keep those colours too instead of dropping them. The window manager and each ManagedWindow remember the OsThemeInputs their theme was last resolved from; WindowManager::set_theme forgets them. OsThemeUpdate brings one reading to every window at its own tree's density and to the manager's theme at its density, resolving each density once, and gives no theme where the inputs are unchanged, so nothing is set. apply_os_theme, follow_system_theme and the winit ThemeChanged FollowSystem arm all go through it; the window-creation path resolves at the manager's density with the window's hint and records what it used, so the next identical reading sets nothing. The desktop reads are taken through OsQueries, the platform's by default, so the paths are tested on fixed answers. Tests: every source at Compact, Comfortable and Touch equals the Compact theme given to with_density, and a factory theme's own density projection is used; a desktop stating a preference resolves as before at Compact; FollowSystem gives the IntUI presets; no preference follows the hint with and without colours. The window manager keeps Compact and Touch on a window opening, an OS change and follow_system_theme, a new window on no preference follows both hint values, and a window opening and a live change give the same theme and inputs. With headless trees at two densities, a reading sets each tree's theme once per change of desktop, light or dark state or density, sets nothing when unchanged (the theme signal's generation), and asks the factory once per density. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 33 ++ crates/teksilo-app/src/app.rs | 20 +- crates/teksilo-app/src/native_theme.rs | 611 ++++++++++++++++++----- crates/teksilo-app/src/window_manager.rs | 385 ++++++++++++-- 4 files changed, 873 insertions(+), 176 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 995ba632d..2b309d8de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -302,6 +302,39 @@ by crate for clarity, not because crates version independently. `AccessibilityPreferences::reduced_motion`, even when the desktop portal does not report it. +#### App + +- **A theme that follows the OS keeps the app's density.** + **Behaviour change:** under `ThemeMode::Native` and + `ThemeMode::FollowSystem`, the theme a window opens with, the theme an OS + light or dark change brings and the theme `follow_system_theme` switches to + are now at the density the app is at (the density of the window's tree, or + of the app's theme for a window opening), as `Theme::with_density` gives + it. Before, each of them reset the theme's input tokens to the compact + density, so an app at the comfortable or touch density opened its windows + with compact targets, hit slop and gesture thresholds, and after an OS + theme change kept widgets built for its own density under compact input + tokens. +- **A window opening under `ThemeMode::Native` follows the window system's + light or dark state when the desktop states neither.** + **Behaviour change:** on macOS, on Windows and on a Linux desktop whose + portal reports no preference, a window now opens dark when the window + system says it is dark, as an OS theme change already made it. Before, it + always opened light. +- **A Native theme keeps the desktop's colours when the desktop states no + light or dark preference.** **Behaviour change:** on a Linux desktop whose + portal reports no preference but whose accent or GTK colours can be read, + such as GNOME in its default style, an OS theme change and + `follow_system_theme` now keep those colours under the light or dark state + the window system reports, as a window opening already did. Before, they + dropped them for the plain IntUI preset. +- **An OS theme re-read that changes nothing sets no theme.** When the + desktop's report, its light or dark state and a window's density are what + that window's theme was last made from, the window's theme is not set + again, so an OS theme event that changes none of them no longer relays out + and repaints every window. A theme the app set in between is replaced as + before. + ## [0.19.0] - 2026-10-16 ### Added diff --git a/crates/teksilo-app/src/app.rs b/crates/teksilo-app/src/app.rs index 673e97050..3b7c7cf81 100644 --- a/crates/teksilo-app/src/app.rs +++ b/crates/teksilo-app/src/app.rs @@ -3431,15 +3431,15 @@ impl TeksiloAppHandler { // is honoured here too. OS-following results carry the id "system". match self.wm.theme_mode() { ThemeMode::Manual => {} // ignore OS theme changes + // Trust winit's per-window signal (authoritative on + // macOS/Windows where OS-colour querying is unimplemented). Each + // window keeps its density, and an unchanged state sets nothing. ThemeMode::FollowSystem => { - // Trust winit's per-window signal (authoritative on - // macOS/Windows where OS-colour querying is unimplemented). - let theme = match winit_theme { - winit::window::Theme::Dark => teksilo_core::presets::intui::dark(), - winit::window::Theme::Light => teksilo_core::presets::intui::light(), - } - .with_id("system"); - self.wm.set_theme(theme); + self.wm + .apply_os_source(crate::native_theme::OsThemeSource::follow_system(matches!( + winit_theme, + winit::window::Theme::Dark + ))) } // Native adopts the OS's actual colours on Linux; on macOS/Windows // (no OS-colour query) it follows winit's authoritative light/dark @@ -4439,7 +4439,9 @@ impl TeksiloAppBuilder { /// /// The theme the app answers with is given the id `"system"`, like every /// theme that follows the OS, so a `ThemeSwitcher` shows it as "follow - /// OS". Setting a factory does not select Native mode; combine it with + /// OS", and is projected onto the density it was asked at with + /// [`Theme::with_density`], which is the density of the window it is + /// for. Setting a factory does not select Native mode; combine it with /// [`theme_mode`](Self::theme_mode). See /// [`resolve_native_theme`](crate::resolve_native_theme). pub fn native_theme( diff --git a/crates/teksilo-app/src/native_theme.rs b/crates/teksilo-app/src/native_theme.rs index 8631bfcf9..f1213be18 100644 --- a/crates/teksilo-app/src/native_theme.rs +++ b/crates/teksilo-app/src/native_theme.rs @@ -13,14 +13,18 @@ //! When there is no factory, or it answers `None`, the theme is IntUI //! coloured by the desktop ([`presets::intui::from_os`]). //! -//! The callers stamp the result with the id `"system"` (the window manager) -//! or a density (the previewer) themselves; [`resolve_native_theme`] does -//! neither. +//! [`resolve_native_theme`] sets no id and applies no density. The window +//! manager resolves every theme that follows the OS, under +//! [`ThemeMode::FollowSystem`](crate::ThemeMode::FollowSystem) as under Native +//! mode, through one function too: it gives the theme the id `"system"` and +//! the density of the window it is for, and a re-read of the desktop that +//! changes nothing a theme was resolved from sets no theme. The previewer +//! applies its own density. use teksilo_core::Theme; use teksilo_core::presets; use teksilo_platform::os_theme::NativeDesktop; -use teksilo_tokens::{ColorSchemePreference, OsThemeColors, TargetDensity}; +use teksilo_tokens::{ColorSchemePreference, TargetDensity}; /// What [`ThemeMode::Native`](crate::ThemeMode::Native) asks a /// [`NativeThemeFactory`] for a theme with. @@ -70,65 +74,182 @@ pub fn resolve_native_theme( .unwrap_or_else(|| presets::intui::from_os(&request.desktop.os, request.dark)) } -/// The density the window manager asks Native-mode themes at: the one every -/// preset is built with, which is also the density its Native themes have -/// always had. -const WINDOW_MANAGER_DENSITY: TargetDensity = TargetDensity::Compact; +/// The two desktop reads a theme that follows the OS is made from. The +/// window manager reads the platform's own ([`OsQueries::PLATFORM`]); its +/// tests hand it fixed answers. +#[derive(Clone, Copy)] +pub(crate) struct OsQueries { + /// What the desktop reports for [`ThemeMode::Native`](crate::ThemeMode::Native). + pub(crate) native_desktop: fn() -> NativeDesktop, + /// The desktop's light or dark preference, for + /// [`ThemeMode::FollowSystem`](crate::ThemeMode::FollowSystem). + pub(crate) color_scheme: fn() -> ColorSchemePreference, +} + +impl OsQueries { + /// The platform's reads, + /// [`query_native_desktop`](teksilo_platform::os_theme::query_native_desktop) + /// and + /// [`query_color_scheme`](teksilo_platform::os_theme::query_color_scheme). + pub(crate) const PLATFORM: OsQueries = OsQueries { + native_desktop: teksilo_platform::os_theme::query_native_desktop, + color_scheme: teksilo_platform::os_theme::query_color_scheme, + }; +} + +/// What a theme that follows the OS is resolved from, apart from the density +/// it is wanted at. +#[derive(Debug, Clone, PartialEq)] +pub(crate) enum OsThemeSource { + /// [`ThemeMode::FollowSystem`](crate::ThemeMode::FollowSystem): the IntUI + /// light or dark preset. + FollowSystem { + /// Whether the theme is dark. + dark: bool, + }, + /// [`ThemeMode::Native`](crate::ThemeMode::Native): the desktop as it was + /// read, and whether the theme is dark. + Native { + /// What the desktop reported, boxed: a KDE desktop carries its whole + /// colour scheme. + desktop: Box, + /// Whether the theme is dark. + dark: bool, + }, +} + +impl OsThemeSource { + /// The IntUI light or dark preset. + pub(crate) fn follow_system(dark: bool) -> Self { + OsThemeSource::FollowSystem { dark } + } + + /// The theme Native mode makes of `desktop`. A desktop that states a + /// light or dark preference decides `dark` itself; one that states none + /// (macOS, Windows, a Linux desktop the portal answers for with no + /// preference) follows `hint`, the window system's light or dark state, + /// and is light when there is none. + pub(crate) fn native(desktop: NativeDesktop, hint: Option) -> Self { + let dark = match desktop.os.color_scheme { + ColorSchemePreference::Dark => true, + ColorSchemePreference::Light => false, + ColorSchemePreference::NoPreference => hint.unwrap_or(false), + }; + OsThemeSource::Native { + desktop: Box::new(desktop), + dark, + } + } + + /// This source asked for at `density`. + pub(crate) fn at(self, density: TargetDensity) -> OsThemeInputs { + OsThemeInputs { + source: self, + density, + } + } +} -/// The Native-mode theme the window manager applies when the desktop's -/// appearance is re-read (a light or dark change, a switch to Native mode), -/// with the id `"system"`. +/// Everything a theme that follows the OS is resolved from: equal inputs +/// resolve to equal themes, so a re-read that gives the inputs a theme was +/// last resolved from needs no new theme. +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct OsThemeInputs { + /// The mode's reading of the desktop. + pub(crate) source: OsThemeSource, + /// The density the theme is wanted at. + pub(crate) density: TargetDensity, +} + +/// The theme that follows the OS for `inputs`, with the id `"system"`: the +/// theme the source resolves to, projected onto `inputs.density` by +/// [`Theme::with_density`]. /// -/// A desktop that states a light or dark preference decides `dark` itself. -/// One that states none is answered from `hint` (the winit light or dark -/// state; light when there is none) with a report of that preference alone: -/// its colours are not used. -pub(crate) fn theme_for_appearance_change( +/// Under [`OsThemeSource::Native`] the theme is [`resolve_native_theme`]'s. +/// A desktop that states no preference is asked for with its report +/// stating the light or dark preference `dark` chose, so the factory and the +/// colours of [`presets::intui::from_os`] are those of a light or dark +/// desktop. +pub(crate) fn resolve_os_theme( factory: Option<&NativeThemeFactory>, - desktop: &NativeDesktop, - hint: Option, + inputs: &OsThemeInputs, ) -> Theme { - let theme = match desktop.os.color_scheme { - ColorSchemePreference::Dark | ColorSchemePreference::Light => resolve_native_theme( - factory, - &NativeThemeRequest::new( - desktop, - desktop.os.color_scheme.is_dark(), - WINDOW_MANAGER_DENSITY, - ), - ), - ColorSchemePreference::NoPreference => { - let dark = hint.unwrap_or(false); - let stated = NativeDesktop::new(OsThemeColors::new(if dark { - ColorSchemePreference::Dark + let theme = match &inputs.source { + OsThemeSource::FollowSystem { dark: true } => presets::intui::dark(), + OsThemeSource::FollowSystem { dark: false } => presets::intui::light(), + OsThemeSource::Native { desktop, dark } => { + if desktop.os.color_scheme == ColorSchemePreference::NoPreference { + let mut stated = NativeDesktop::clone(desktop); + stated.os.color_scheme = if *dark { + ColorSchemePreference::Dark + } else { + ColorSchemePreference::Light + }; + resolve_native_theme( + factory, + &NativeThemeRequest::new(&stated, *dark, inputs.density), + ) } else { - ColorSchemePreference::Light - })); - resolve_native_theme( - factory, - &NativeThemeRequest::new(&stated, dark, WINDOW_MANAGER_DENSITY), - ) + resolve_native_theme( + factory, + &NativeThemeRequest::new(desktop, *dark, inputs.density), + ) + } } }; - theme.with_id("system") + theme.with_density(inputs.density).with_id("system") } -/// The Native-mode theme the window manager builds a new window with, with -/// the id `"system"`: dark exactly when the desktop states a dark -/// preference. -pub(crate) fn theme_for_new_window( - factory: Option<&NativeThemeFactory>, - desktop: &NativeDesktop, -) -> Theme { - resolve_native_theme( - factory, - &NativeThemeRequest::new( - desktop, - desktop.os.color_scheme.is_dark(), - WINDOW_MANAGER_DENSITY, - ), - ) - .with_id("system") +/// One re-read of the OS appearance, brought to every theme that follows it: +/// each window's and the window manager's own. +/// +/// Each of those remembers the [`OsThemeInputs`] its theme was last resolved +/// from. [`theme_for`](Self::theme_for) answers `None` for one whose inputs, +/// at its own density, are unchanged, so it is not set again, and resolves +/// each density once however many windows share it. +pub(crate) struct OsThemeUpdate<'a> { + /// The app's own Native-mode theme, if any. + factory: Option<&'a NativeThemeFactory>, + /// What the OS was read as. + source: OsThemeSource, + /// The themes resolved so far, by density. + resolved: Vec<(TargetDensity, Theme)>, +} + +impl<'a> OsThemeUpdate<'a> { + /// An update to the themes `source` resolves to. + pub(crate) fn new(factory: Option<&'a NativeThemeFactory>, source: OsThemeSource) -> Self { + OsThemeUpdate { + factory, + source, + resolved: Vec::new(), + } + } + + /// The theme to set on a target whose theme is at `density` and was last + /// resolved from `applied` (`None` when it does not follow the OS), or + /// `None` when `applied` is already this update's inputs at `density`. + /// `applied` becomes those inputs. + pub(crate) fn theme_for( + &mut self, + applied: &mut Option, + density: TargetDensity, + ) -> Option { + let inputs = self.source.clone().at(density); + if applied.as_ref() == Some(&inputs) { + return None; + } + let theme = match self.resolved.iter().find(|(at, _)| *at == density) { + Some((_, theme)) => theme.clone(), + None => { + let theme = resolve_os_theme(self.factory, &inputs); + self.resolved.push((density, theme.clone())); + theme + } + }; + *applied = Some(inputs); + Some(theme) + } } #[cfg(test)] @@ -136,33 +257,19 @@ mod tests { use super::*; use std::cell::RefCell; use std::rc::Rc; - use teksilo_tokens::{Color, ColorTokens}; - - /// `apply_os_theme`'s Native arm as it was before this module, given the - /// already-resolved winit hint. - fn old_appearance_change(os: &OsThemeColors, hint: Option) -> Theme { - match os.color_scheme { - ColorSchemePreference::Dark => Theme { - colors: ColorTokens::from_os_colors(os), - ..presets::intui::dark() - }, - ColorSchemePreference::Light => Theme { - colors: ColorTokens::from_os_colors(os), - ..presets::intui::light() - }, - ColorSchemePreference::NoPreference => { - if hint.unwrap_or(false) { - presets::intui::dark() - } else { - presets::intui::light() - } - } - } - .with_id("system") - } + use teksilo_core::WidgetTree; + use teksilo_tokens::{Color, ColorTokens, InputTokens, OsThemeColors}; - /// The window-creation Native arm as it was before this module. - fn old_new_window(os: &OsThemeColors) -> Theme { + const DENSITIES: [TargetDensity; 3] = [ + TargetDensity::Compact, + TargetDensity::Comfortable, + TargetDensity::Touch, + ]; + + /// The Native-mode theme the window manager made of a desktop stating a + /// light or dark preference before densities were kept: IntUI light or + /// dark under the report's colours, at the presets' Compact density. + fn old_stated(os: &OsThemeColors) -> Theme { let base = if os.color_scheme.is_dark() { presets::intui::dark() } else { @@ -217,6 +324,21 @@ mod tests { out } + /// Every source the window manager can read: both FollowSystem presets, + /// and Native over every report with no hint and both hint values. + fn sources() -> Vec { + let mut out = vec![ + OsThemeSource::follow_system(false), + OsThemeSource::follow_system(true), + ]; + for os in reports() { + for hint in [None, Some(false), Some(true)] { + out.push(OsThemeSource::native(NativeDesktop::new(os.clone()), hint)); + } + } + out + } + fn assert_same(new: &Theme, old: &Theme, what: &str) { assert_eq!(new.id, old.id, "{what}: id"); assert_eq!(new.colors, old.colors, "{what}: colours"); @@ -225,27 +347,142 @@ mod tests { } #[test] - fn an_appearance_change_resolves_as_before() { + fn a_desktop_stating_a_preference_resolves_as_before_at_compact() { for os in reports() { + if os.color_scheme == ColorSchemePreference::NoPreference { + continue; + } for hint in [None, Some(false), Some(true)] { - let desktop = NativeDesktop::new(os.clone()); - let new = theme_for_appearance_change(None, &desktop, hint); - let old = old_appearance_change(&os, hint); - assert_same(&new, &old, &format!("{os:?} with hint {hint:?}")); + let inputs = OsThemeSource::native(NativeDesktop::new(os.clone()), hint) + .at(TargetDensity::Compact); + assert_same( + &resolve_os_theme(None, &inputs), + &old_stated(&os), + &format!("{os:?} with hint {hint:?}"), + ); } } } #[test] - fn a_new_window_resolves_as_before() { - for os in reports() { - let desktop = NativeDesktop::new(os.clone()); - assert_same( - &theme_for_new_window(None, &desktop), - &old_new_window(&os), - &format!("{os:?}"), + fn follow_system_resolves_to_the_intui_presets() { + for dark in [false, true] { + let preset = if dark { + presets::intui::dark() + } else { + presets::intui::light() + }; + for density in DENSITIES { + assert_same( + &resolve_os_theme(None, &OsThemeSource::follow_system(dark).at(density)), + &preset.with_density(density).with_id("system"), + &format!("dark {dark} at {density:?}"), + ); + } + } + } + + #[test] + fn the_density_asked_for_is_the_density_given() { + for source in sources() { + let compact = resolve_os_theme(None, &source.clone().at(TargetDensity::Compact)); + assert_eq!( + compact.input, + InputTokens::for_density(TargetDensity::Compact) + ); + for density in DENSITIES { + let theme = resolve_os_theme(None, &source.clone().at(density)); + assert_eq!(theme.input.density, density, "{source:?} at {density:?}"); + assert_same( + &theme, + &compact.with_density(density), + &format!("{source:?} at {density:?}"), + ); + } + } + } + + /// A density projection that marks the theme it projects, so a test can + /// tell that it ran. + fn marking_projection(theme: &Theme, density: TargetDensity) -> Theme { + let mut colors = theme.colors.clone(); + colors.accent = match density { + TargetDensity::Compact => Color::from_rgb(1.0, 0.0, 0.0), + TargetDensity::Comfortable => Color::from_rgb(0.0, 1.0, 0.0), + TargetDensity::Touch => Color::from_rgb(0.0, 0.0, 1.0), + }; + Theme { + input: InputTokens::for_density(density), + colors, + ..theme.clone() + } + } + + #[test] + fn a_factory_theme_is_projected_by_its_own_density_projection() { + let asked = Rc::new(RefCell::new(Vec::new())); + let log = asked.clone(); + let factory: NativeThemeFactory = Box::new(move |request: &NativeThemeRequest<'_>| { + log.borrow_mut().push(request.density); + Some( + presets::intui::dark() + .with_id("app.native") + .with_density_projection(marking_projection), + ) + }); + let desktop = NativeDesktop::new(OsThemeColors::new(ColorSchemePreference::Dark)); + for density in DENSITIES { + let theme = resolve_os_theme( + Some(&factory), + &OsThemeSource::native(desktop.clone(), None).at(density), ); + let want = presets::intui::dark() + .with_id("app.native") + .with_density_projection(marking_projection) + .with_density(density) + .with_id("system"); + assert_eq!(theme.colors, want.colors, "{density:?}"); + assert_eq!(theme, want, "{density:?}"); + } + assert_eq!(*asked.borrow(), DENSITIES.to_vec()); + } + + #[test] + fn a_desktop_with_no_preference_follows_the_hint() { + for os in reports() { + if os.color_scheme != ColorSchemePreference::NoPreference { + continue; + } + for hint in [None, Some(false), Some(true)] { + let dark = hint == Some(true); + let mut stated = os.clone(); + stated.color_scheme = if dark { + ColorSchemePreference::Dark + } else { + ColorSchemePreference::Light + }; + let inputs = OsThemeSource::native(NativeDesktop::new(os.clone()), hint) + .at(TargetDensity::Compact); + let theme = resolve_os_theme(None, &inputs); + assert_eq!(theme.is_dark(), dark, "{os:?} with hint {hint:?}"); + assert_same( + &theme, + &old_stated(&stated), + &format!("{os:?} with hint {hint:?}"), + ); + } } + // With no colours, the bare presets. + let bare = NativeDesktop::new(OsThemeColors::new(ColorSchemePreference::NoPreference)); + let at = |hint| { + resolve_os_theme( + None, + &OsThemeSource::native(bare.clone(), hint).at(TargetDensity::Compact), + ) + }; + assert_eq!(at(Some(true)), presets::intui::dark().with_id("system")); + assert_eq!(at(Some(false)), presets::intui::light().with_id("system")); + assert_eq!(at(None), presets::intui::light().with_id("system")); } #[test] @@ -286,16 +523,21 @@ mod tests { vec![(desktop.clone(), false, TargetDensity::Comfortable)] ); - // The window manager stamps its id over the factory's. - let theme = theme_for_new_window(Some(&factory), &desktop); - assert_eq!(theme, presets::intui::dark().with_id("system")); - let theme = theme_for_appearance_change(Some(&factory), &desktop, Some(true)); - assert_eq!(theme, presets::intui::dark().with_id("system")); - assert_eq!(seen.borrow().len(), 3); - assert!(!seen.borrow()[1].1); - assert_eq!(seen.borrow()[1].2, TargetDensity::Compact); + // The window manager stamps its id over the factory's, and gives the + // theme the density it asked for. + let theme = resolve_os_theme( + Some(&factory), + &OsThemeSource::native(desktop.clone(), Some(true)).at(TargetDensity::Touch), + ); + assert_eq!( + theme, + presets::intui::dark() + .with_density(TargetDensity::Touch) + .with_id("system") + ); + assert_eq!(seen.borrow().len(), 2); // A desktop stating a light preference is light whatever the hint. - assert!(!seen.borrow()[2].1); + assert_eq!(seen.borrow()[1], (desktop, false, TargetDensity::Touch)); } #[test] @@ -318,19 +560,15 @@ mod tests { ); } for hint in [None, Some(false), Some(true)] { + let inputs = OsThemeSource::native(desktop.clone(), hint).at(TargetDensity::Touch); assert_eq!( - theme_for_appearance_change(Some(&factory), &desktop, hint), - old_appearance_change(&os, hint), + resolve_os_theme(Some(&factory), &inputs), + resolve_os_theme(None, &inputs), "{os:?} with hint {hint:?}" ); } - assert_eq!( - theme_for_new_window(Some(&factory), &desktop), - old_new_window(&os), - "{os:?}" - ); } - assert_eq!(*calls.borrow(), reports().len() * (2 + 3 + 1)); + assert_eq!(*calls.borrow(), reports().len() * (2 + 3)); } #[test] @@ -344,16 +582,155 @@ mod tests { }); let mut os = OsThemeColors::new(ColorSchemePreference::NoPreference); os.accent = Some(Color::from_rgb(0.9, 0.2, 0.1)); - let desktop = NativeDesktop::new(os); + let desktop = NativeDesktop::new(os.clone()); + + for hint in [Some(true), None] { + resolve_os_theme( + Some(&factory), + &OsThemeSource::native(desktop.clone(), hint).at(TargetDensity::Compact), + ); + } + let mut dark = os.clone(); + dark.color_scheme = ColorSchemePreference::Dark; + let mut light = os; + light.color_scheme = ColorSchemePreference::Light; + assert_eq!(*seen.borrow(), vec![(dark, true), (light, false)]); + } + + /// A window's tree and what its theme was last resolved from. + struct Target { + tree: WidgetTree, + applied: Option, + } + + impl Target { + fn at(density: TargetDensity) -> Self { + let mut tree = WidgetTree::new(); + tree.set_input_density(density); + Target { + tree, + applied: None, + } + } + + /// How many times the tree's theme has been set. + fn sets(&self) -> u64 { + self.tree.theme_signal().generation() + } + } + + /// Bring `targets` to `source` as the window manager does, and say how + /// many times the factory was asked. + fn apply(source: &OsThemeSource, targets: &mut [&mut Target]) -> usize { + let calls = Rc::new(RefCell::new(0)); + let count = calls.clone(); + let factory: NativeThemeFactory = Box::new(move |_: &NativeThemeRequest<'_>| { + *count.borrow_mut() += 1; + None + }); + let mut update = OsThemeUpdate::new(Some(&factory), source.clone()); + for target in targets.iter_mut() { + if let Some(theme) = update.theme_for(&mut target.applied, target.tree.input_density()) + { + target.tree.set_theme(theme); + } + } + *calls.borrow() + } + + #[test] + fn each_target_keeps_its_density() { + let mut desk = OsThemeColors::new(ColorSchemePreference::Dark); + desk.accent = Some(Color::from_rgb(0.9, 0.2, 0.1)); + let source = OsThemeSource::native(NativeDesktop::new(desk), None); + for density in DENSITIES { + let mut target = Target::at(density); + apply(&source, &mut [&mut target]); + assert_eq!(target.tree.input_density(), density); + assert_eq!( + *target.tree.theme(), + resolve_os_theme(None, &source.clone().at(TargetDensity::Compact)) + .with_density(density), + "{density:?}" + ); + } + } - theme_for_appearance_change(Some(&factory), &desktop, Some(true)); - theme_for_appearance_change(Some(&factory), &desktop, None); + #[test] + fn an_unchanged_reading_sets_no_theme() { + let light = OsThemeSource::native( + NativeDesktop::new(OsThemeColors::new(ColorSchemePreference::Light)), + None, + ); + let mut compact = Target::at(TargetDensity::Compact); + let mut touch = Target::at(TargetDensity::Touch); + let mut touch_too = Target::at(TargetDensity::Touch); + + // The first reading sets every theme, resolving each density once. + let before = [compact.sets(), touch.sets(), touch_too.sets()]; assert_eq!( - *seen.borrow(), - vec![ - (OsThemeColors::new(ColorSchemePreference::Dark), true), - (OsThemeColors::new(ColorSchemePreference::Light), false), - ] + apply(&light, &mut [&mut compact, &mut touch, &mut touch_too]), + 2 + ); + assert_eq!( + [compact.sets(), touch.sets(), touch_too.sets()], + before.map(|sets| sets + 1) + ); + + // The same reading again sets nothing and asks the factory nothing. + let before = [compact.sets(), touch.sets(), touch_too.sets()]; + assert_eq!( + apply(&light, &mut [&mut compact, &mut touch, &mut touch_too]), + 0 ); + assert_eq!([compact.sets(), touch.sets(), touch_too.sets()], before); + + // A changed desktop sets every theme. + let mut accented = OsThemeColors::new(ColorSchemePreference::Light); + accented.accent = Some(Color::from_rgb(0.9, 0.2, 0.1)); + let changed = OsThemeSource::native(NativeDesktop::new(accented), None); + apply(&changed, &mut [&mut compact, &mut touch]); + assert_eq!( + [compact.sets(), touch.sets()], + [before[0] + 1, before[1] + 1] + ); + + // A changed light or dark state sets every theme. + let no_preference = + NativeDesktop::new(OsThemeColors::new(ColorSchemePreference::NoPreference)); + let mut target = Target::at(TargetDensity::Compact); + apply( + &OsThemeSource::native(no_preference.clone(), Some(false)), + &mut [&mut target], + ); + let sets = target.sets(); + apply( + &OsThemeSource::native(no_preference.clone(), None), + &mut [&mut target], + ); + assert_eq!(target.sets(), sets, "no hint reads as light"); + apply( + &OsThemeSource::native(no_preference, Some(true)), + &mut [&mut target], + ); + assert_eq!(target.sets(), sets + 1); + assert!(target.tree.theme().is_dark()); + + let mut follow = Target::at(TargetDensity::Compact); + apply(&OsThemeSource::follow_system(false), &mut [&mut follow]); + let sets = follow.sets(); + apply(&OsThemeSource::follow_system(false), &mut [&mut follow]); + assert_eq!(follow.sets(), sets); + apply(&OsThemeSource::follow_system(true), &mut [&mut follow]); + assert_eq!(follow.sets(), sets + 1); + + // A changed density sets that target's theme alone, at its density. + let before = [compact.sets(), touch.sets()]; + compact.tree.set_input_density(TargetDensity::Comfortable); + let switched = compact.sets(); + assert_eq!(switched, before[0] + 1); + apply(&changed, &mut [&mut compact, &mut touch]); + assert_eq!([compact.sets(), touch.sets()], [switched + 1, before[1]]); + assert_eq!(compact.tree.input_density(), TargetDensity::Comfortable); } } diff --git a/crates/teksilo-app/src/window_manager.rs b/crates/teksilo-app/src/window_manager.rs index 035da5ac3..d21a3ef10 100644 --- a/crates/teksilo-app/src/window_manager.rs +++ b/crates/teksilo-app/src/window_manager.rs @@ -29,7 +29,9 @@ use winit::raw_window_handle::HasWindowHandle; use winit::window::WindowLevel; use crate::app::{AppEventProxy, CloseWindowRequest, ThemeMode}; -use crate::native_theme::NativeThemeFactory; +use crate::native_theme::{ + NativeThemeFactory, OsQueries, OsThemeInputs, OsThemeSource, OsThemeUpdate, resolve_os_theme, +}; use crate::window_config::{TeksiloWindowId, WindowConfig}; @@ -221,6 +223,11 @@ pub(crate) struct ManagedWindow { /// observable on winit 0.30, so it can desync if Caps Lock was /// already on before the app gained focus. pub caps_lock_active: bool, + /// What the tree's theme was last resolved from while it followed the + /// OS ([`ThemeMode::FollowSystem`] or [`ThemeMode::Native`]); `None` + /// once any other theme was set. A re-read of the OS that gives the + /// same inputs at the tree's density sets no theme. + pub(crate) os_theme: Option, /// Last OS-IME enablement applied to the winit window (`None` = never /// set, forces the first apply). The post-dispatch reconcile compares /// the focused node's IME descriptor against this and calls @@ -495,6 +502,10 @@ pub struct WindowManager { /// (IntUI coloured by the desktop). See /// [`TeksiloAppBuilder::native_theme`](crate::TeksiloAppBuilder::native_theme). native_theme: Option, + /// What [`theme`](Self::theme) was last resolved from while it followed + /// the OS; `None` once any other theme was set. See + /// [`ManagedWindow::os_theme`]. + os_theme: Option, /// Whether each window's tree records what the platform adapters /// announce ([`WidgetTree::set_records_announcements`]). Off unless the /// automation bridge is installed: nothing else in a running application @@ -563,6 +574,7 @@ impl WindowManager { theme_mode: ThemeMode::Manual, pen_batching: teksilo_platform::PenBatching::default(), native_theme: None, + os_theme: None, records_announcements: false, app_context_template: None, event_proxy: None, @@ -733,15 +745,27 @@ impl WindowManager { /// on Linux); under `FollowSystem` it picks the built-in light/dark /// preset. Both results carry the id `"system"`. /// + /// Each window keeps its target density: its theme is resolved at the + /// density its tree is at, and the theme new windows are built with at + /// the density of the manager's current theme. A window whose desktop + /// report, light or dark state and density are those its theme was last + /// resolved from is not given its theme again. + /// /// `os_dark_hint` is the OS light/dark state as reported by winit (e.g. - /// from a `WindowEvent::ThemeChanged`), used as the authoritative source on - /// platforms where Teksilo's own OS-colour query is unimplemented - /// (macOS / Windows, where `query_os_theme_colors()` returns - /// `NoPreference`). On Linux the query reports a real scheme and the hint - /// is unused. Pass `None` when no winit signal is available (e.g. a runtime - /// "follow system" request) — the current window's reported theme is used - /// where possible, otherwise it resolves to light. + /// from a `WindowEvent::ThemeChanged`), used where the desktop states no + /// light or dark preference itself (macOS / Windows, where + /// `query_os_theme_colors()` returns `NoPreference`). On a Linux desktop + /// that states one the hint is unused. Pass `None` when no winit signal is + /// available (e.g. a runtime "follow system" request): the current + /// window's reported theme is used where possible, otherwise it resolves + /// to light. pub fn apply_os_theme(&mut self, os_dark_hint: Option) { + self.apply_os_theme_from(os_dark_hint, OsQueries::PLATFORM); + } + + /// [`apply_os_theme`](Self::apply_os_theme), reading the desktop through + /// `queries`. + fn apply_os_theme_from(&mut self, os_dark_hint: Option, queries: OsQueries) { // Fall back to a window's currently-reported winit theme when the // caller didn't supply a hint (so picking "System" on macOS/Windows // adopts the right light/dark immediately, not just on the next toggle). @@ -752,32 +776,66 @@ impl WindowManager { .and_then(|m| m.platform_window.window().theme()) .map(|t| matches!(t, winit::window::Theme::Dark)) }); - let theme = match self.theme_mode { + let source = match self.theme_mode { ThemeMode::Manual => return, ThemeMode::FollowSystem => { - let dark = match teksilo_platform::os_theme::query_color_scheme() { + OsThemeSource::follow_system(match (queries.color_scheme)() { ColorSchemePreference::Dark => true, ColorSchemePreference::Light => false, ColorSchemePreference::NoPreference => hint.unwrap_or(false), - }; - if dark { - teksilo_core::presets::intui::dark() - } else { - teksilo_core::presets::intui::light() - } - .with_id("system") + }) } - ThemeMode::Native => { - // A desktop stating a light or dark preference decides; one - // stating none (macOS, Windows) follows the winit hint. - crate::native_theme::theme_for_appearance_change( - self.native_theme.as_ref(), - &teksilo_platform::os_theme::query_native_desktop(), - hint, - ) + // A desktop stating a light or dark preference decides; one + // stating none (macOS, Windows) follows the winit hint. + ThemeMode::Native => OsThemeSource::native((queries.native_desktop)(), hint), + }; + self.apply_os_source(source); + } + + /// Give every window, and the manager's own theme, the theme `source` + /// resolves to at its density, except where that is the theme it was + /// last given. Does not look at the theme mode: the caller has. + pub(crate) fn apply_os_source(&mut self, source: OsThemeSource) { + let mut update = OsThemeUpdate::new(self.native_theme.as_ref(), source); + for managed in self.windows.values_mut() { + if let Some(theme) = + update.theme_for(&mut managed.os_theme, managed.tree.input_density()) + { + // As in `set_theme`: the translator holds the input tokens. + managed.translation_state.set_input_tokens(theme.input); + managed.tree.set_theme(theme); } + } + if let Some(theme) = update.theme_for(&mut self.os_theme, self.theme.input.density) { + self.theme = theme; + } + } + + /// The theme a window created now is built with, and, while the theme + /// follows the OS, what it was resolved from. `window_hint` is the new + /// window's winit light or dark state. + /// + /// Under `Manual` it is the manager's theme. Under `FollowSystem` it is + /// the IntUI preset the hint names, and under `Native` the theme the + /// desktop resolves to, with a desktop that states no preference + /// following the hint, as [`apply_os_theme`](Self::apply_os_theme) does. + /// Either is resolved at the density of the manager's theme and becomes + /// the manager's theme, which later windows start from. + fn new_window_theme( + &mut self, + window_hint: Option, + queries: OsQueries, + ) -> (Theme, Option) { + let source = match self.theme_mode { + ThemeMode::Manual => return (self.theme.clone(), None), + ThemeMode::FollowSystem => OsThemeSource::follow_system(window_hint.unwrap_or(false)), + ThemeMode::Native => OsThemeSource::native((queries.native_desktop)(), window_hint), }; - self.set_theme(theme); + let inputs = source.at(self.theme.input.density); + let theme = resolve_os_theme(self.native_theme.as_ref(), &inputs); + self.theme = theme.clone(); + self.os_theme = Some(inputs.clone()); + (theme, Some(inputs)) } /// Install the shared typesetter every window's tree will shape text @@ -1072,25 +1130,15 @@ impl WindowManager { translation_state.set_scale_factor(scale_factor); translation_state.set_pen_batching(self.pen_batching); - // Resolve the initial theme from ThemeMode before building the tree - let initial_theme = match self.theme_mode { - ThemeMode::Manual => self.theme.clone(), - // OS-following modes carry the id "system" so a `ThemeSwitcher` - // recognizes the active theme as "follow OS", not a fixed pick. - ThemeMode::FollowSystem => match window.theme() { - Some(winit::window::Theme::Dark) => teksilo_core::presets::intui::dark(), - _ => teksilo_core::presets::intui::light(), - } - .with_id("system"), - ThemeMode::Native => crate::native_theme::theme_for_new_window( - self.native_theme.as_ref(), - &teksilo_platform::os_theme::query_native_desktop(), - ), - }; - // Update the shared theme so all subsequent windows use the same base - if self.theme_mode != ThemeMode::Manual { - self.theme = initial_theme.clone(); - } + // Resolve the initial theme from ThemeMode before building the tree. + // OS-following modes carry the id "system" so a `ThemeSwitcher` + // recognizes the active theme as "follow OS", not a fixed pick, and + // update the shared theme so all subsequent windows use the same base. + let window_hint = window + .theme() + .map(|theme| matches!(theme, winit::window::Theme::Dark)); + let (initial_theme, initial_os_theme) = + self.new_window_theme(window_hint, OsQueries::PLATFORM); // Create with AccessKit adapter (shows window after adapter is ready) let mut pw = pollster::block_on(PlatformWindow::new_with_a11y(window, target)); @@ -1364,6 +1412,7 @@ impl WindowManager { occlusion_probed_at: None, session_away: self.session_away, caps_lock_active: false, + os_theme: initial_os_theme, ime_allowed: None, ime_purpose: None, last_ime_preedit_empty: false, @@ -1894,7 +1943,9 @@ impl WindowManager { /// `Manual` (the default). pub fn set_theme(&mut self, theme: Theme) { self.theme = theme.clone(); + self.os_theme = None; for managed in self.windows.values_mut() { + managed.os_theme = None; managed.tree.set_theme(theme.clone()); // The translator holds the input tokens, not the theme, so a // theme swap has to re-install them or the touch kill switch and @@ -2339,7 +2390,7 @@ impl WindowManager { if had_requests { // An explicit theme pick disables OS-following so a later OS // light/dark change won't override the chosen theme. (The - // internal `apply_os_theme` path calls `set_theme` directly, not + // internal `apply_os_theme` path sets its themes directly, not // through this drain, so it is unaffected.) self.theme_mode = ThemeMode::Manual; } @@ -2359,14 +2410,20 @@ impl WindowManager { } } if requested { - self.theme_mode = ThemeMode::Native; - // No winit hint at request time; apply_os_theme falls back to the - // current window's reported theme. - self.apply_os_theme(None); + self.follow_system_theme(OsQueries::PLATFORM); } requested } + /// Switch the app to [`ThemeMode::Native`] and apply the theme the + /// desktop, read through `queries`, resolves to. + fn follow_system_theme(&mut self, queries: OsQueries) { + self.theme_mode = ThemeMode::Native; + // No winit hint at request time; the current window's reported theme + // stands in for it. + self.apply_os_theme_from(None, queries); + } + /// Drain per-tree text-scale requests raised by handlers via /// [`EventContext::set_text_scale`](teksilo_core::widget::EventContext::set_text_scale) /// and route each through [`WindowManager::set_text_scale`] so the new @@ -3122,3 +3179,231 @@ mod announcement_recording_tests { assert!(wm.new_window_tree(theme).records_announcements()); } } + +#[cfg(test)] +mod os_theme_tests { + use super::*; + use crate::native_theme::NativeThemeRequest; + use std::cell::Cell; + use teksilo_core::presets::intui; + use teksilo_platform::os_theme::NativeDesktop; + use teksilo_tokens::{Color, OsThemeColors, TargetDensity}; + + const DENSITIES: [TargetDensity; 2] = [TargetDensity::Compact, TargetDensity::Touch]; + + fn accented(scheme: ColorSchemePreference) -> NativeDesktop { + let mut os = OsThemeColors::new(scheme); + os.accent = Some(Color::from_rgb(0.9, 0.2, 0.1)); + os.window_bg = Some(Color::from_rgb(0.94, 0.94, 0.95)); + NativeDesktop::new(os) + } + fn light_desktop() -> NativeDesktop { + accented(ColorSchemePreference::Light) + } + fn dark_desktop() -> NativeDesktop { + accented(ColorSchemePreference::Dark) + } + fn silent_desktop() -> NativeDesktop { + NativeDesktop::new(OsThemeColors::new(ColorSchemePreference::NoPreference)) + } + fn says_light() -> ColorSchemePreference { + ColorSchemePreference::Light + } + fn says_dark() -> ColorSchemePreference { + ColorSchemePreference::Dark + } + fn says_nothing() -> ColorSchemePreference { + ColorSchemePreference::NoPreference + } + + fn queries( + native_desktop: fn() -> NativeDesktop, + color_scheme: fn() -> ColorSchemePreference, + ) -> OsQueries { + OsQueries { + native_desktop, + color_scheme, + } + } + + /// Every pair of readings: each desktop with each light or dark answer. + fn all_queries() -> Vec { + let mut out = Vec::new(); + for desktop in [light_desktop, dark_desktop, silent_desktop] { + for scheme in [says_light, says_dark, says_nothing] { + out.push(queries(desktop, scheme)); + } + } + out + } + + /// A manager in `mode` whose theme is at `density`. + fn manager(mode: ThemeMode, density: TargetDensity) -> WindowManager { + let mut wm = WindowManager::new(intui::light().with_density(density)); + wm.set_theme_mode(mode); + wm + } + + /// The theme `source` resolves to at the presets' density, projected + /// onto `density`. + fn projected(source: OsThemeSource, density: TargetDensity) -> Theme { + resolve_os_theme(None, &source.at(TargetDensity::Compact)).with_density(density) + } + + #[test] + fn a_window_opened_keeps_the_density() { + for density in DENSITIES { + for hint in [None, Some(false), Some(true)] { + let mut wm = manager(ThemeMode::Native, density); + let (theme, inputs) = + wm.new_window_theme(hint, queries(dark_desktop, says_nothing)); + assert_eq!(theme.input.density, density); + assert_eq!( + theme, + projected(OsThemeSource::native(dark_desktop(), hint), density) + ); + assert_eq!(wm.theme, theme); + assert_eq!(inputs.as_ref().map(|i| i.density), Some(density)); + + let mut wm = manager(ThemeMode::FollowSystem, density); + let (theme, _) = wm.new_window_theme(hint, queries(dark_desktop, says_dark)); + assert_eq!(theme.input.density, density); + assert_eq!( + theme, + projected(OsThemeSource::follow_system(hint.unwrap_or(false)), density) + ); + } + } + } + + #[test] + fn an_os_theme_change_keeps_the_density() { + for density in DENSITIES { + let mut wm = manager(ThemeMode::Native, density); + wm.apply_os_theme_from(Some(true), queries(light_desktop, says_light)); + assert_eq!(wm.theme.input.density, density); + assert_eq!( + wm.theme, + projected(OsThemeSource::native(light_desktop(), Some(true)), density) + ); + + let mut wm = manager(ThemeMode::FollowSystem, density); + wm.apply_os_theme_from(None, queries(light_desktop, says_dark)); + assert_eq!(wm.theme.input.density, density); + assert_eq!( + wm.theme, + projected(OsThemeSource::follow_system(true), density) + ); + } + } + + #[test] + fn following_the_system_theme_keeps_the_density() { + for density in DENSITIES { + let mut wm = manager(ThemeMode::Manual, density); + wm.follow_system_theme(queries(dark_desktop, says_light)); + assert_eq!(wm.theme_mode(), ThemeMode::Native); + assert_eq!(wm.theme.input.density, density); + assert_eq!( + wm.theme, + projected(OsThemeSource::native(dark_desktop(), None), density) + ); + assert!(wm.theme.is_dark()); + } + } + + #[test] + fn a_manual_theme_ignores_the_os() { + let theme = intui::dark().with_density(TargetDensity::Touch); + let mut wm = WindowManager::new(theme.clone()); + wm.apply_os_theme_from(None, queries(light_desktop, says_light)); + assert_eq!(wm.theme, theme); + assert_eq!( + wm.new_window_theme(Some(false), queries(light_desktop, says_light)), + (theme, None) + ); + } + + #[test] + fn a_window_opened_on_a_desktop_with_no_preference_follows_its_hint() { + for density in DENSITIES { + for (hint, dark) in [(Some(true), true), (Some(false), false), (None, false)] { + let mut wm = manager(ThemeMode::Native, density); + let (theme, _) = wm.new_window_theme(hint, queries(silent_desktop, says_nothing)); + assert_eq!(theme.is_dark(), dark, "hint {hint:?}"); + let preset = if dark { intui::dark() } else { intui::light() }; + assert_eq!(theme, preset.with_density(density).with_id("system")); + } + } + } + + #[test] + fn a_window_opened_and_a_live_change_agree() { + for mode in [ThemeMode::FollowSystem, ThemeMode::Native] { + for q in all_queries() { + // FollowSystem reads the light or dark answer only on a live + // change; a window opens on the hint alone. They read the same + // when the desktop gives no answer. + if mode == ThemeMode::FollowSystem + && (q.color_scheme)() != ColorSchemePreference::NoPreference + { + continue; + } + for hint in [None, Some(false), Some(true)] { + for density in DENSITIES { + let mut opened = manager(mode, density); + let (theme, inputs) = opened.new_window_theme(hint, q); + let mut live = manager(mode, density); + live.apply_os_theme_from(hint, q); + assert_eq!(theme, live.theme, "{mode:?}, hint {hint:?}, {density:?}"); + assert_eq!(inputs, live.os_theme); + } + } + } + } + } + + #[test] + fn an_unchanged_reading_resolves_and_sets_nothing() { + let calls = Rc::new(Cell::new(0)); + let count = calls.clone(); + let mut wm = manager(ThemeMode::Native, TargetDensity::Touch); + wm.set_native_theme(Some(Box::new(move |_: &NativeThemeRequest<'_>| { + count.set(count.get() + 1); + None + }))); + + // A window opens, then the OS reports what it was built from. + let (opened, _) = wm.new_window_theme(None, queries(silent_desktop, says_nothing)); + assert_eq!(calls.get(), 1); + wm.apply_os_theme_from(None, queries(silent_desktop, says_nothing)); + wm.apply_os_theme_from(Some(false), queries(silent_desktop, says_nothing)); + assert_eq!(calls.get(), 1, "the same desktop, state and density"); + assert_eq!(wm.theme, opened); + + // A changed light or dark state. + wm.apply_os_theme_from(Some(true), queries(silent_desktop, says_nothing)); + assert_eq!(calls.get(), 2); + assert!(wm.theme.is_dark()); + wm.apply_os_theme_from(Some(true), queries(silent_desktop, says_nothing)); + assert_eq!(calls.get(), 2); + + // A changed desktop. + wm.apply_os_theme_from(Some(true), queries(dark_desktop, says_nothing)); + assert_eq!(calls.get(), 3); + wm.apply_os_theme_from(None, queries(dark_desktop, says_nothing)); + assert_eq!(calls.get(), 3, "a stated preference ignores the hint"); + + // A changed density: a theme the app set at another density. + wm.set_theme(intui::light().with_density(TargetDensity::Comfortable)); + wm.apply_os_theme_from(None, queries(dark_desktop, says_nothing)); + assert_eq!(calls.get(), 4); + assert_eq!(wm.theme.input.density, TargetDensity::Comfortable); + + // Any theme set in between is replaced, even at the same density. + wm.set_theme(intui::light().with_density(TargetDensity::Comfortable)); + wm.apply_os_theme_from(None, queries(dark_desktop, says_nothing)); + assert_eq!(calls.get(), 5); + assert!(wm.theme.is_dark()); + } +} From 534e0e274b342b3db5588d9a5d205a773896c6c7 Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 14:34:55 +0200 Subject: [PATCH 20/59] feat(platform): follow live desktop appearance changes with OsThemeWatch Under ThemeMode::Native and ThemeMode::FollowSystem the theme was read when a window opened and again only on winit's light or dark signal, so a new accent, colour scheme or animation speed on the desktop reached the application only after a restart. os_theme::OsThemeWatch listens on the session bus, on a thread of its own with its own zbus connection, to the portal's SettingChanged for the org.freedesktop.appearance and org.kde.kdeglobals. namespaces, to org.kde.KGlobalSettings notifyChange, and to org.kde.kconfig.notify ConfigChanged on /kdeglobals and /breezerc, matched on interface, member and path from any sender. What a KDE signal says changed is not decoded. The first signal opens a 150 ms window, and at its end one os_theme::OsThemeChanged is posted through AppEventPoster::post_external, so every signal is followed by a payload posted no earlier than it. Dropping the watch stops its thread and joins it, and nothing is posted after the drop returns. Elsewhere than on Linux OsThemeWatch::new gives None. files_changed compares the modification times of the kdeglobals and breezerc cascade files with those last seen. The window manager starts the watch while the mode follows the OS (from resumed, set_theme_mode and follow_system_theme, once the event proxy is installed) and drops it when a theme request makes the mode Manual. The loop answers the payload ahead of the app's handlers: the desktop is read again, the existing apply path sets a theme only where the inputs changed (apply_os_source now says whether it set one), the accessibility preferences are refreshed, among them reduced motion from the animation factor, and every window is redrawn when anything changed. When a window takes focus, a changed cascade file prompts the same reading, for a session with no bus or a missed signal. Tests: the signal filter; the debounce on injected instants (a burst gives one payload, separate bursts one each, a change at the end of a window is covered by it, every change of a pseudo-random sequence is followed by a payload within the window); the thread over a fake channel source (one payload per burst, nothing after drop, a source that cannot open ends the thread); the file times in a tempfile directory (written, made and removed files of both cascades, nothing for another file); the payload routed to a re-query that applies a new accent, a dark scheme and a dark preference, sets nothing when unchanged, leaves a manual theme alone and hands any other payload back. On a private dbus-daemon, gated on TEKSILO_DBUS_TESTS=1 and run here, each listened signal gives one payload, a burst of all of them one, ignored namespaces, paths and interfaces none, and nothing after drop. Checked with cargo check and clippy on x86_64-pc-windows-gnu; on aarch64-apple-darwin teksilo-platform with its tests (teksilo-app needs a macOS C toolchain for zstd-sys, absent here). Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 18 + Cargo.lock | 1 + crates/teksilo-app/src/app.rs | 41 +- crates/teksilo-app/src/window_manager.rs | 205 +++++- crates/teksilo-platform/Cargo.toml | 4 + crates/teksilo-platform/src/linux_portal.rs | 4 +- .../src/linux_portal/tests.rs | 13 +- crates/teksilo-platform/src/os_theme.rs | 6 + crates/teksilo-platform/src/os_theme/watch.rs | 428 +++++++++++ .../src/os_theme/watch/bus.rs | 152 ++++ .../src/os_theme/watch/tests.rs | 664 ++++++++++++++++++ 11 files changed, 1510 insertions(+), 26 deletions(-) create mode 100644 crates/teksilo-platform/src/os_theme/watch.rs create mode 100644 crates/teksilo-platform/src/os_theme/watch/bus.rs create mode 100644 crates/teksilo-platform/src/os_theme/watch/tests.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b309d8de..149650fc4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -139,9 +139,27 @@ by crate for clarity, not because crates version independently. animation speed, the widget style and the Breeze style settings). `NativeDesktop::new` builds one from a colour report alone, and it implements `PartialEq`, so a caller can tell whether the desktop changed. +- **`os_theme::OsThemeWatch`.** Hears the desktop's appearance change while + the application runs: on Linux, the desktop portal's appearance and KDE + settings, KDE's global settings notification, and KDE writing + `kdeglobals` or `breezerc`. A change that arrives as several signals is + reported once, as an `os_theme::OsThemeChanged` posted through the + application's event poster 150 ms after the first. `files_changed` says + whether a KDE configuration file changed since it last looked, for a + session with no bus. On macOS and Windows there is nothing to watch, and + `OsThemeWatch::new` gives `None`. #### App +- **Native and follow-system themes update live.** Under `ThemeMode::Native` + or `ThemeMode::FollowSystem`, every window takes the new theme when the + desktop's accent, colour scheme or light or dark setting changes, without + a restart, and the reduced-motion preference follows a change of the + desktop's animation speed. On a KDE Plasma session whose change signals + do not reach the application, such as one with no session bus, a change + to `kdeglobals` or `breezerc` is picked up the next time a window takes + focus. Under `ThemeMode::Manual` nothing is watched. + - **`TeksiloAppBuilder::native_theme`.** An app can give `ThemeMode::Native` a theme of its own: the closure is asked with a `NativeThemeRequest` (what the desktop reports, whether the theme is to be dark, the density wanted) diff --git a/Cargo.lock b/Cargo.lock index 6b7374606..388ae3fd2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12037,6 +12037,7 @@ dependencies = [ "teksilo-kde-scheme", "teksilo-render", "teksilo-tokens", + "tempfile", "thiserror 2.0.21", "wayland-backend", "wayland-client", diff --git a/crates/teksilo-app/src/app.rs b/crates/teksilo-app/src/app.rs index 3b7c7cf81..78039617a 100644 --- a/crates/teksilo-app/src/app.rs +++ b/crates/teksilo-app/src/app.rs @@ -3353,6 +3353,12 @@ impl TeksiloAppHandler { // back. `refresh_accessibility_preferences` applies any change // to every window (marking them dirty for repaint). if focused { + // The same moment backstops the desktop watch: a + // configuration file written while no signal reached us + // (no bus, or a signal missed) is caught here. + if self.wm.recheck_os_theme_files() { + self.wm.request_redraw_all(); + } self.wm.refresh_accessibility_preferences(); } // The global native menu (macOS) follows window focus: make the @@ -3439,7 +3445,7 @@ impl TeksiloAppHandler { .apply_os_source(crate::native_theme::OsThemeSource::follow_system(matches!( winit_theme, winit::window::Theme::Dark - ))) + ))); } // Native adopts the OS's actual colours on Linux; on macOS/Windows // (no OS-colour query) it follows winit's authoritative light/dark @@ -3461,6 +3467,8 @@ impl ApplicationHandler for TeksiloAppHandler { // Before the first window, so that it is born knowing whether anything // on screen can be seen. A no-op once watching. self.wm.watch_session(); + // Likewise for the desktop's appearance, while the theme follows it. + self.wm.sync_os_theme_watch(); if !self.initial_created && let Some(config) = self.initial_window.take() @@ -3511,18 +3519,29 @@ impl ApplicationHandler for TeksiloAppHandler { self.wm.apply_session(Instant::now()); return; } - Err(payload) => { - // A web-view engine asking to run. Answered here, with - // no redraw: the frames it commits wake their windows - // through their pictures, and the events it posts - // arrive as payloads of their own. - #[cfg(feature = "web-view")] - if payload.is::() { - self.pump_web_views(); + // The desktop's appearance changed: read it again, and + // redraw every window when that set a theme or changed a + // preference. + Err(payload) => match self.wm.route_os_theme_payload(payload) { + Ok(changed) => { + if changed { + self.wm.request_redraw_all(); + } return; } - AppEvent::External(payload) - } + Err(payload) => { + // A web-view engine asking to run. Answered here, with + // no redraw: the frames it commits wake their windows + // through their pictures, and the events it posts + // arrive as payloads of their own. + #[cfg(feature = "web-view")] + if payload.is::() { + self.pump_web_views(); + return; + } + AppEvent::External(payload) + } + }, }, }, event => event, diff --git a/crates/teksilo-app/src/window_manager.rs b/crates/teksilo-app/src/window_manager.rs index d21a3ef10..3fa53e10f 100644 --- a/crates/teksilo-app/src/window_manager.rs +++ b/crates/teksilo-app/src/window_manager.rs @@ -538,6 +538,11 @@ pub struct WindowManager { session_away: bool, /// While away, when the watch last reread the system's state. session_rechecked_at: Option, + /// Hears the desktop's appearance change while the theme follows the + /// OS; `None` under [`ThemeMode::Manual`], before + /// [`sync_os_theme_watch`](Self::sync_os_theme_watch) has run with the + /// event proxy installed, and on every platform but Linux. + os_theme_watch: Option, } // Doc comments on **every** method here are enforced, not hoped for: a new item @@ -582,6 +587,7 @@ impl WindowManager { session: None, session_away: false, session_rechecked_at: None, + os_theme_watch: None, } } @@ -636,8 +642,86 @@ impl WindowManager { } /// Set the theme mode (called by TeksiloAppHandler during initialization). + /// Once the event loop runs, the desktop's appearance is watched while + /// the mode follows the OS. pub fn set_theme_mode(&mut self, mode: ThemeMode) { self.theme_mode = mode; + self.sync_os_theme_watch(); + } + + /// Start the desktop's appearance watch while the theme follows the OS + /// ([`ThemeMode::Native`] or [`ThemeMode::FollowSystem`]), and stop it + /// under [`ThemeMode::Manual`]. Each change it hears posts an + /// [`OsThemeChanged`](teksilo_platform::os_theme::OsThemeChanged), which + /// the loop answers with + /// [`route_os_theme_payload`](Self::route_os_theme_payload). A no-op + /// before the event proxy is installed, and while already in step. + pub(crate) fn sync_os_theme_watch(&mut self) { + if self.theme_mode == ThemeMode::Manual { + self.os_theme_watch = None; + return; + } + if self.os_theme_watch.is_some() { + return; + } + if let Some(proxy) = self.event_proxy.clone() { + self.os_theme_watch = teksilo_platform::os_theme::OsThemeWatch::new(proxy); + } + } + + /// Answer `payload` when it is an + /// [`OsThemeChanged`](teksilo_platform::os_theme::OsThemeChanged): read + /// the desktop again and give each window the theme it now resolves to + /// ([`reapply_os_theme_from`](Self::reapply_os_theme_from)), and refresh + /// the accessibility preferences, among them reduced motion from KDE's + /// animation speed. `Ok` with whether anything changed, so the caller + /// redraws; any other payload is handed back. + pub(crate) fn route_os_theme_payload( + &mut self, + payload: Box, + ) -> Result> { + let themed = self.route_os_theme_payload_from(payload, OsQueries::PLATFORM)?; + let preferences = self.refresh_accessibility_preferences(); + Ok(themed || preferences) + } + + /// The theme half of + /// [`route_os_theme_payload`](Self::route_os_theme_payload), reading the + /// desktop through `queries`. + fn route_os_theme_payload_from( + &mut self, + payload: Box, + queries: OsQueries, + ) -> Result> { + payload.downcast::()?; + Ok(self.reapply_os_theme_from(queries)) + } + + /// Read the desktop again through `queries` and give each window the + /// theme it now resolves to, as [`apply_os_theme`](Self::apply_os_theme) + /// does with no winit hint; whether any theme was set. The watch's + /// file times are taken first, so the change that prompted this is not + /// found again when a window next takes focus. + fn reapply_os_theme_from(&mut self, queries: OsQueries) -> bool { + if let Some(watch) = &mut self.os_theme_watch { + watch.files_changed(); + } + self.apply_os_theme_from(None, queries) + } + + /// The backstop for a session with no bus or a change signal that never + /// came, for when a window takes focus: when a file of the `kdeglobals` + /// or `breezerc` cascade changed since the watch last looked, read the + /// desktop again and apply what it resolves to. Whether any theme was + /// set; `false` with no watch. + pub(crate) fn recheck_os_theme_files(&mut self) -> bool { + let Some(watch) = &mut self.os_theme_watch else { + return false; + }; + if !watch.files_changed() { + return false; + } + self.apply_os_theme_from(None, OsQueries::PLATFORM) } /// Install the event-loop proxy (called by TeksiloAppHandler once the @@ -764,8 +848,8 @@ impl WindowManager { } /// [`apply_os_theme`](Self::apply_os_theme), reading the desktop through - /// `queries`. - fn apply_os_theme_from(&mut self, os_dark_hint: Option, queries: OsQueries) { + /// `queries`; whether any theme was set. + fn apply_os_theme_from(&mut self, os_dark_hint: Option, queries: OsQueries) -> bool { // Fall back to a window's currently-reported winit theme when the // caller didn't supply a hint (so picking "System" on macOS/Windows // adopts the right light/dark immediately, not just on the next toggle). @@ -777,7 +861,7 @@ impl WindowManager { .map(|t| matches!(t, winit::window::Theme::Dark)) }); let source = match self.theme_mode { - ThemeMode::Manual => return, + ThemeMode::Manual => return false, ThemeMode::FollowSystem => { OsThemeSource::follow_system(match (queries.color_scheme)() { ColorSchemePreference::Dark => true, @@ -789,14 +873,16 @@ impl WindowManager { // stating none (macOS, Windows) follows the winit hint. ThemeMode::Native => OsThemeSource::native((queries.native_desktop)(), hint), }; - self.apply_os_source(source); + self.apply_os_source(source) } /// Give every window, and the manager's own theme, the theme `source` /// resolves to at its density, except where that is the theme it was - /// last given. Does not look at the theme mode: the caller has. - pub(crate) fn apply_os_source(&mut self, source: OsThemeSource) { + /// last given; whether any theme was set. Does not look at the theme + /// mode: the caller has. + pub(crate) fn apply_os_source(&mut self, source: OsThemeSource) -> bool { let mut update = OsThemeUpdate::new(self.native_theme.as_ref(), source); + let mut changed = false; for managed in self.windows.values_mut() { if let Some(theme) = update.theme_for(&mut managed.os_theme, managed.tree.input_density()) @@ -804,11 +890,14 @@ impl WindowManager { // As in `set_theme`: the translator holds the input tokens. managed.translation_state.set_input_tokens(theme.input); managed.tree.set_theme(theme); + changed = true; } } if let Some(theme) = update.theme_for(&mut self.os_theme, self.theme.input.density) { self.theme = theme; + changed = true; } + changed } /// The theme a window created now is built with, and, while the theme @@ -2391,8 +2480,10 @@ impl WindowManager { // An explicit theme pick disables OS-following so a later OS // light/dark change won't override the chosen theme. (The // internal `apply_os_theme` path sets its themes directly, not - // through this drain, so it is unaffected.) + // through this drain, so it is unaffected.) Nothing is left to + // listen to the desktop for. self.theme_mode = ThemeMode::Manual; + self.sync_os_theme_watch(); } had_requests } @@ -2419,6 +2510,8 @@ impl WindowManager { /// desktop, read through `queries`, resolves to. fn follow_system_theme(&mut self, queries: OsQueries) { self.theme_mode = ThemeMode::Native; + // From now on the desktop's changes are heard as they happen. + self.sync_os_theme_watch(); // No winit hint at request time; the current window's reported theme // stands in for it. self.apply_os_theme_from(None, queries); @@ -3406,4 +3499,102 @@ mod os_theme_tests { assert_eq!(calls.get(), 5); assert!(wm.theme.is_dark()); } + /// The light desktop with another accent. + fn reaccented_desktop() -> NativeDesktop { + let mut desktop = light_desktop(); + desktop.os.accent = Some(Color::from_rgb(0.1, 0.5, 0.3)); + desktop + } + + /// A change the watch posts once. + fn changed() -> Box { + Box::new(teksilo_platform::os_theme::OsThemeChanged) + } + + #[test] + fn a_desktop_change_rereads_the_desktop_and_applies_what_changed() { + let mut wm = manager(ThemeMode::Native, TargetDensity::Touch); + let route = |wm: &mut WindowManager, desktop: fn() -> NativeDesktop| { + wm.route_os_theme_payload_from(changed(), queries(desktop, says_nothing)) + .expect("the watch's payload is taken") + }; + assert!(route(&mut wm, light_desktop), "the first reading sets"); + assert_eq!( + wm.theme, + projected( + OsThemeSource::native(light_desktop(), None), + TargetDensity::Touch + ) + ); + assert!( + !route(&mut wm, light_desktop), + "an unchanged desktop sets nothing" + ); + + let before = wm.theme.clone(); + assert!(route(&mut wm, reaccented_desktop), "a new accent"); + assert_eq!( + wm.theme, + projected( + OsThemeSource::native(reaccented_desktop(), None), + TargetDensity::Touch + ) + ); + assert_ne!(wm.theme.colors, before.colors); + assert!(!wm.theme.is_dark()); + + assert!(route(&mut wm, dark_desktop), "a dark scheme"); + assert!(wm.theme.is_dark()); + assert_eq!(wm.theme.input.density, TargetDensity::Touch); + } + + #[test] + fn a_desktop_change_follows_the_light_or_dark_preference() { + let mut wm = manager(ThemeMode::FollowSystem, TargetDensity::Compact); + let route = |wm: &mut WindowManager, scheme: fn() -> ColorSchemePreference| { + wm.route_os_theme_payload_from(changed(), queries(light_desktop, scheme)) + .expect("the watch's payload is taken") + }; + assert!(route(&mut wm, says_light)); + assert!(!wm.theme.is_dark()); + assert!(route(&mut wm, says_dark)); + assert!(wm.theme.is_dark()); + assert!( + !route(&mut wm, says_dark), + "the same preference sets nothing" + ); + } + + #[test] + fn a_desktop_change_leaves_a_manual_theme_alone() { + let theme = intui::dark().with_density(TargetDensity::Touch); + let mut wm = WindowManager::new(theme.clone()); + assert_eq!( + wm.route_os_theme_payload_from(changed(), queries(light_desktop, says_light)) + .ok(), + Some(false) + ); + assert_eq!(wm.theme, theme); + assert!(!wm.recheck_os_theme_files(), "no watch, nothing to check"); + } + + #[test] + fn any_other_payload_is_handed_back_untouched() { + let mut wm = manager(ThemeMode::Native, TargetDensity::Compact); + let theme = wm.theme.clone(); + let back = wm + .route_os_theme_payload_from(Box::new(7_u8), queries(dark_desktop, says_dark)) + .expect_err("not the watch's payload"); + assert_eq!(back.downcast_ref::(), Some(&7)); + assert_eq!(wm.theme, theme, "and the desktop was not read"); + } + + #[test] + fn the_watch_waits_for_the_event_proxy_and_stops_under_manual() { + let mut wm = manager(ThemeMode::Native, TargetDensity::Compact); + wm.sync_os_theme_watch(); + assert!(wm.os_theme_watch.is_none(), "no proxy, no watch"); + wm.set_theme_mode(ThemeMode::Manual); + assert!(wm.os_theme_watch.is_none()); + } } diff --git a/crates/teksilo-platform/Cargo.toml b/crates/teksilo-platform/Cargo.toml index 26e432c9f..d29678063 100644 --- a/crates/teksilo-platform/Cargo.toml +++ b/crates/teksilo-platform/Cargo.toml @@ -229,6 +229,10 @@ zbus = { version = "5.19", default-features = false, features = ["async-io"] } # The async-io zbus already links, so it adds no crate. async-io = "2.6" +[dev-dependencies] +# A scratch configuration directory for the theme watch's file-time check. +tempfile = { workspace = true } + [target.'cfg(all(unix, not(target_os = "macos")))'.dev-dependencies] # The X keysym constants, to check `key_report`'s hand-written keysym table # against. Already in the tree through winit's xkbcommon. diff --git a/crates/teksilo-platform/src/linux_portal.rs b/crates/teksilo-platform/src/linux_portal.rs index c1e3a57a4..1b82ae8f0 100644 --- a/crates/teksilo-platform/src/linux_portal.rs +++ b/crates/teksilo-platform/src/linux_portal.rs @@ -350,7 +350,7 @@ impl Bus { } /// `future`'s output, or `None` when `limit` passes first. -async fn within(limit: Duration, future: impl Future) -> Option { +pub(crate) async fn within(limit: Duration, future: impl Future) -> Option { let mut future = pin!(future); let mut timer = pin!(async_io::Timer::after(limit)); poll_fn(|cx| { @@ -366,4 +366,4 @@ async fn within(limit: Duration, future: impl Future) -> Option bool { + pub(crate) fn enabled() -> bool { if std::env::var("TEKSILO_DBUS_TESTS").as_deref() == Ok("1") { return true; } @@ -159,14 +160,14 @@ mod real_bus { /// A `dbus-daemon` of our own, on a configuration that activates no /// service (so nothing on the machine is started on it) and listens in /// a directory of its own. Killed and cleaned up on drop. - struct PrivateBus { + pub(crate) struct PrivateBus { child: Child, dir: PathBuf, - address: String, + pub(crate) address: String, } impl PrivateBus { - fn start() -> Self { + pub(crate) fn start() -> Self { static NEXT: AtomicUsize = AtomicUsize::new(0); let dir = std::env::temp_dir().join(format!( "teksilo-dbus-test-{}-{}", diff --git a/crates/teksilo-platform/src/os_theme.rs b/crates/teksilo-platform/src/os_theme.rs index 3d803f1a7..660ad71dd 100644 --- a/crates/teksilo-platform/src/os_theme.rs +++ b/crates/teksilo-platform/src/os_theme.rs @@ -13,9 +13,15 @@ //! accent, read through `teksilo-kde-scheme`. [`query_native_desktop`] //! also hands over the KDE desktop's settings (fonts, animation speed, //! widget style, Breeze style settings) as a [`KdeDesktop`]. +//! +//! An [`OsThemeWatch`] hears these change while the application runs; see +//! [`watch`]. #[cfg(target_os = "linux")] pub(crate) mod kde; +pub mod watch; + +pub use watch::{OsThemeChanged, OsThemeWatch}; use teksilo_kde_scheme::KdeDesktop; #[cfg(target_os = "linux")] diff --git a/crates/teksilo-platform/src/os_theme/watch.rs b/crates/teksilo-platform/src/os_theme/watch.rs new file mode 100644 index 000000000..fe28c4884 --- /dev/null +++ b/crates/teksilo-platform/src/os_theme/watch.rs @@ -0,0 +1,428 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Hearing the desktop's appearance change while the application runs: its +//! accent, its colour scheme, its light or dark preference, its fonts and +//! its animation speed. +//! +//! An [`OsThemeWatch`] listens on the D-Bus session bus, on a thread of its +//! own with a connection of its own, for the four signals a Linux desktop +//! sends when one of those changes: +//! +//! - the desktop portal's `org.freedesktop.portal.Settings.SettingChanged` +//! on `/org/freedesktop/portal/desktop`, for a setting of the +//! `org.freedesktop.appearance` namespace (colour scheme, accent colour, +//! contrast, reduced motion) or of an `org.kde.kdeglobals.` +//! namespace (KDE's palette, font and widget style); a setting of any +//! other namespace is not heard; +//! - KDE's `org.kde.KGlobalSettings.notifyChange` on `/KGlobalSettings`; +//! - KDE's `org.kde.kconfig.notify.ConfigChanged` on `/kdeglobals` and on +//! `/breezerc`, sent when either file is written. +//! +//! A signal is matched on its interface, member and path, from whichever +//! sender sends it. What a KDE signal says changed is not decoded: any one +//! of them means everything is read again. +//! +//! One change on the desktop usually arrives as several signals within a +//! few milliseconds (a new colour scheme is a `ConfigChanged`, a +//! `notifyChange` and several `SettingChanged`). The watch therefore +//! debounces: the first signal opens a window of [`DEBOUNCE`], and when the +//! window ends one [`OsThemeChanged`] is posted through +//! [`AppEventPoster::post_external`], whatever was heard during it. A signal +//! heard after the window ended opens another. Every signal is thus +//! followed by a payload posted no earlier than it, so the reading the +//! payload prompts sees every change signalled before it. +//! +//! The watch reads nothing itself; the payload's receiver queries the +//! desktop again ([`query_native_desktop`](super::query_native_desktop), +//! [`query_color_scheme`](super::query_color_scheme)). +//! +//! A session with no bus, or a signal that never came, is covered by +//! [`OsThemeWatch::files_changed`]: it compares the modification times of +//! the files of the `kdeglobals` and `breezerc` cascades with those it last +//! saw, for a caller to ask when a window takes focus. +//! +//! There is no watch elsewhere than on Linux: [`OsThemeWatch::new`] answers +//! `None`, and the window system's own light or dark notification is all +//! there is. + +// Elsewhere than on Linux nothing starts a watch; the machinery is still +// compiled there, so its tests run on every platform. +#![cfg_attr(not(target_os = "linux"), allow(dead_code))] + +#[cfg(target_os = "linux")] +mod bus; +#[cfg(test)] +mod tests; + +use std::path::{Path, PathBuf}; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::{Arc, Mutex, PoisonError}; +use std::task::{Context, Waker}; +use std::thread::JoinHandle; +use std::time::{Duration, Instant, SystemTime}; + +use teksilo_core::AppEventPoster; +use teksilo_kde_scheme::KdeConfigLocations; + +/// How long after the first signal of a change the watch posts its payload. +pub const DEBOUNCE: Duration = Duration::from_millis(150); + +/// The portal's settings interface and object path, and its change signal. +const PORTAL_SETTINGS: &str = "org.freedesktop.portal.Settings"; +const PORTAL_PATH: &str = "/org/freedesktop/portal/desktop"; +const SETTING_CHANGED: &str = "SettingChanged"; +/// KDE's global settings change signal. +const GLOBAL_SETTINGS: &str = "org.kde.KGlobalSettings"; +const GLOBAL_SETTINGS_PATH: &str = "/KGlobalSettings"; +const NOTIFY_CHANGE: &str = "notifyChange"; +/// KDE's configuration-file change signal, and the files it is heard for. +const KCONFIG_NOTIFY: &str = "org.kde.kconfig.notify"; +const CONFIG_CHANGED: &str = "ConfigChanged"; +const KDEGLOBALS_PATH: &str = "/kdeglobals"; +const BREEZERC_PATH: &str = "/breezerc"; + +/// Every signal the watch listens to: interface, member and object path. +const LISTENED: [(&str, &str, &str); 4] = [ + (PORTAL_SETTINGS, SETTING_CHANGED, PORTAL_PATH), + (GLOBAL_SETTINGS, NOTIFY_CHANGE, GLOBAL_SETTINGS_PATH), + (KCONFIG_NOTIFY, CONFIG_CHANGED, KDEGLOBALS_PATH), + (KCONFIG_NOTIFY, CONFIG_CHANGED, BREEZERC_PATH), +]; + +/// What an [`OsThemeWatch`] posts through +/// [`AppEventPoster::post_external`] once a change on the desktop has been +/// heard and its debounce window has ended. It carries nothing: the +/// receiver reads the desktop again, so posting one by any other means asks +/// for the same reading. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct OsThemeChanged; + +/// Watches the desktop's appearance; see the [module](self). Dropping it +/// stops the watch: its thread is told to stop and joined, and nothing is +/// posted once the drop has returned. +pub struct OsThemeWatch { + /// The listening thread. + _running: Running, + /// The configuration files [`files_changed`](Self::files_changed) + /// compares, as last seen. + files: ConfigStamps, +} + +impl std::fmt::Debug for OsThemeWatch { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("OsThemeWatch") + .field("files", &self.files.files.len()) + .finish() + } +} + +impl OsThemeWatch { + /// Start watching, posting each [`OsThemeChanged`] through `poster` + /// from the watch's own thread. `None` on every platform but Linux, and + /// when the thread cannot be started. + /// + /// The bus is connected to on the watch's thread, so this returns at + /// once. A session with no bus leaves a watch that hears nothing, whose + /// [`files_changed`](Self::files_changed) still answers. + pub fn new(poster: impl AppEventPoster) -> Option { + #[cfg(target_os = "linux")] + { + Self::on_bus(None, poster, |_| {}) + } + #[cfg(not(target_os = "linux"))] + { + let _ = poster; + None + } + } + + /// [`new`](Self::new) on the bus at `address` (`None`: the session bus + /// the environment names). `opened` is told on the watch's thread + /// whether the bus was reached and every signal subscribed to, before + /// any is heard. + #[cfg(target_os = "linux")] + fn on_bus( + address: Option, + poster: impl AppEventPoster, + opened: impl FnOnce(bool) + Send + 'static, + ) -> Option { + let locations = KdeConfigLocations::from_env(super::kde::process_env); + let files = ConfigStamps::read(config_files(&locations), modified); + let running = Running::start( + DEBOUNCE, + move |stop| { + let source = bus::BusSource::connect(address.as_deref(), stop); + opened(source.is_some()); + source + }, + move || poster.post_external(Box::new(OsThemeChanged)), + )?; + Some(Self { + _running: running, + files, + }) + } + + /// Whether a file of the `kdeglobals` or `breezerc` cascade was + /// written, made or removed since the watch started or since the last + /// call, by its modification time; the times read become the ones the + /// next call compares with. For the main thread, when a window takes + /// focus, and after an [`OsThemeChanged`] so that the change it was + /// posted for is not counted twice. + pub fn files_changed(&mut self) -> bool { + self.files.refresh(modified) + } +} + +// ── Signals ───────────────────────────────────────────────────────────────── + +/// Whether a signal with this interface, member and object path is one the +/// watch acts on. `namespace` is the first argument of a portal +/// `SettingChanged`, `None` when it could not be read. +fn signal_matters(interface: &str, member: &str, path: &str, namespace: Option<&str>) -> bool { + match (interface, member, path) { + (PORTAL_SETTINGS, SETTING_CHANGED, PORTAL_PATH) => { + namespace.is_some_and(portal_namespace_matters) + } + (GLOBAL_SETTINGS, NOTIFY_CHANGE, GLOBAL_SETTINGS_PATH) => true, + (KCONFIG_NOTIFY, CONFIG_CHANGED, KDEGLOBALS_PATH | BREEZERC_PATH) => true, + _ => false, + } +} + +/// Whether a portal setting of `namespace` can change the theme or the +/// animation speed: `org.freedesktop.appearance`, and the +/// `org.kde.kdeglobals.` namespaces KDE's portal serves `kdeglobals` +/// under. +fn portal_namespace_matters(namespace: &str) -> bool { + namespace == "org.freedesktop.appearance" + || namespace + .strip_prefix("org.kde.kdeglobals.") + .is_some_and(|group| !group.is_empty()) +} + +// ── Debounce ──────────────────────────────────────────────────────────────── + +/// The debounce, on instants it is given: the first change opens a window +/// of `window`, later changes inside it do not move its end, and the window +/// is due once its end is reached. +#[derive(Debug, Clone, PartialEq, Eq)] +struct Debounce { + window: Duration, + due: Option, +} + +impl Debounce { + fn new(window: Duration) -> Self { + Self { window, due: None } + } + + /// A change heard at `now`. + fn heard(&mut self, now: Instant) { + if self.due.is_none() { + self.due = Some(now + self.window); + } + } + + /// When the open window ends; `None` while none is open. + fn deadline(&self) -> Option { + self.due + } + + /// Whether the open window has ended by `now`. A window that has is + /// closed, so it is due once. + fn take_due(&mut self, now: Instant) -> bool { + match self.due { + Some(due) if now >= due => { + self.due = None; + true + } + _ => false, + } + } +} + +/// What waiting on a [`ChangeSource`] ended with. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum Heard { + /// A change was heard. + Change, + /// The deadline passed first. + Deadline, + /// The source has closed, or the watch is stopping. + Closed, +} + +/// Where changes are heard from: the session bus, or a test's fake. +trait ChangeSource { + /// Wait for the next change, until `deadline` (`None`: for as long as + /// it takes), or until the source closes or the watch stops. + fn wait(&mut self, deadline: Option) -> Heard; +} + +/// Hear changes from `source` and call `post` once at the end of each +/// debounce window, reading the time from `clock`, until the source closes +/// or `stop` is set. Nothing is posted once `stop` is set. +fn run( + source: &mut impl ChangeSource, + stop: &Stop, + debounce: &mut Debounce, + clock: &impl Fn() -> Instant, + post: &impl Fn(), +) { + loop { + match source.wait(debounce.deadline()) { + Heard::Change => debounce.heard(clock()), + Heard::Deadline => {} + Heard::Closed => return, + } + if stop.is_stopped() { + return; + } + if debounce.take_due(clock()) { + post(); + } + } +} + +// ── The thread ────────────────────────────────────────────────────────────── + +/// The flag a watch is stopped by, with the waker of the future waiting on +/// it. +#[derive(Debug, Default)] +struct Stop { + stopped: AtomicBool, + waker: Mutex>, +} + +impl Stop { + /// Set the flag and wake whatever waits on it. + fn stop(&self) { + self.stopped.store(true, Ordering::SeqCst); + let waker = self + .waker + .lock() + .unwrap_or_else(PoisonError::into_inner) + .take(); + if let Some(waker) = waker { + waker.wake(); + } + } + + fn is_stopped(&self) -> bool { + self.stopped.load(Ordering::SeqCst) + } + + /// Whether the flag is set, registering `cx`'s waker to be woken when it + /// is. The waker is stored before the flag is read, so a stop between + /// the two is either seen here or wakes it. + fn poll_stopped(&self, cx: &Context<'_>) -> bool { + *self.waker.lock().unwrap_or_else(PoisonError::into_inner) = Some(cx.waker().clone()); + self.is_stopped() + } +} + +/// The watch's thread; dropping it stops the thread and joins it. +struct Running { + stop: Arc, + thread: Option>, +} + +impl Running { + /// Start the thread: it opens its source with `open` (`None`: nothing + /// to listen to, and the thread ends), then [`run`]s it with a debounce + /// window of `window`, calling `post` at the end of each. + fn start( + window: Duration, + open: impl FnOnce(Arc) -> Option + Send + 'static, + post: impl Fn() + Send + 'static, + ) -> Option { + let stop = Arc::new(Stop::default()); + let thread_stop = Arc::clone(&stop); + let thread = std::thread::Builder::new() + .name("teksilo-os-theme-watch".to_owned()) + .spawn(move || { + let Some(mut source) = open(Arc::clone(&thread_stop)) else { + return; + }; + run( + &mut source, + &thread_stop, + &mut Debounce::new(window), + &Instant::now, + &post, + ); + }) + .ok()?; + Some(Running { + stop, + thread: Some(thread), + }) + } +} + +impl Drop for Running { + fn drop(&mut self) { + self.stop.stop(); + if let Some(thread) = self.thread.take() { + let _ = thread.join(); + } + } +} + +// ── The configuration files ───────────────────────────────────────────────── + +/// Files and their modification times as last read, `None` for a file +/// that did not exist or could not be read. +#[derive(Debug, Clone, PartialEq, Eq)] +struct ConfigStamps { + files: Vec<(PathBuf, Option)>, +} + +impl ConfigStamps { + /// The times of `paths`, read with `modified`. + fn read( + paths: impl IntoIterator, + modified: impl Fn(&Path) -> Option, + ) -> Self { + let files = paths + .into_iter() + .map(|path| { + let stamp = modified(&path); + (path, stamp) + }) + .collect(); + Self { files } + } + + /// Read every time again with `modified`; whether any differs from the + /// one read before, a file made or removed included. + fn refresh(&mut self, modified: impl Fn(&Path) -> Option) -> bool { + let mut changed = false; + for (path, stamp) in &mut self.files { + let now = modified(path); + if now != *stamp { + *stamp = now; + changed = true; + } + } + changed + } +} + +/// Every file of the `kdeglobals` and `breezerc` cascades, existing or not. +fn config_files(locations: &KdeConfigLocations) -> Vec { + locations + .kdeglobals_cascade() + .into_iter() + .chain(locations.breezerc_cascade()) + .map(|layer| layer.path) + .collect() +} + +/// A file's modification time; `None` when it does not exist or the time +/// cannot be read. +fn modified(path: &Path) -> Option { + std::fs::metadata(path).and_then(|m| m.modified()).ok() +} diff --git a/crates/teksilo-platform/src/os_theme/watch/bus.rs b/crates/teksilo-platform/src/os_theme/watch/bus.rs new file mode 100644 index 000000000..326aa964d --- /dev/null +++ b/crates/teksilo-platform/src/os_theme/watch/bus.rs @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The watch's source on Linux: its own connection to the session bus, with +//! one match rule per listened signal. + +use std::future::{Future, poll_fn}; +use std::pin::{Pin, pin}; +use std::sync::Arc; +use std::task::Poll; +use std::time::Instant; + +use zbus::export::futures_core::Stream; +use zbus::zvariant::OwnedValue; +use zbus::{MatchRule, Message, MessageStream}; + +use super::{ChangeSource, Heard, LISTENED, PORTAL_SETTINGS, Stop, signal_matters}; +use crate::linux_portal::{CALL_TIMEOUT, within}; + +/// How many signals of one rule may wait unread before the oldest is +/// dropped. The watch reads them as they come; one is enough to act on. +const QUEUED: usize = 64; + +/// The session bus, as a [`ChangeSource`]. +pub(crate) struct BusSource { + /// Held so the streams' connection stays open. + _connection: zbus::Connection, + streams: Vec, + stop: Arc, +} + +impl BusSource { + /// Connect to the bus at `address` (`None`: the session bus the + /// environment names) and subscribe to every listened signal. `None` + /// when the bus cannot be reached within + /// [`CALL_TIMEOUT`], refuses a match + /// rule, or the watch stops meanwhile. + pub(crate) fn connect(address: Option<&str>, stop: Arc) -> Option { + let subscribed = async_io::block_on(until_stopped(&stop, async { + let builder = match address { + Some(address) => zbus::connection::Builder::address(address), + None => zbus::connection::Builder::session(), + }; + let connection = within( + CALL_TIMEOUT, + builder.ok()?.method_timeout(CALL_TIMEOUT).build(), + ) + .await? + .ok()?; + let mut streams = Vec::with_capacity(LISTENED.len()); + for (interface, member, path) in LISTENED { + let rule = MatchRule::builder() + .msg_type(zbus::message::Type::Signal) + .interface(interface) + .ok()? + .member(member) + .ok()? + .path(path) + .ok()? + .build(); + streams.push( + MessageStream::for_match_rule(rule, &connection, Some(QUEUED)) + .await + .ok()?, + ); + } + Some((connection, streams)) + })) + .flatten(); + let (connection, streams) = subscribed?; + Some(BusSource { + _connection: connection, + streams, + stop, + }) + } +} + +impl ChangeSource for BusSource { + fn wait(&mut self, deadline: Option) -> Heard { + let mut timer = deadline.map(async_io::Timer::at); + let stop = &self.stop; + let streams = &mut self.streams; + async_io::block_on(poll_fn(|cx| { + if stop.poll_stopped(cx) { + return Poll::Ready(Heard::Closed); + } + for stream in streams.iter_mut() { + loop { + match Pin::new(&mut *stream).poll_next(cx) { + Poll::Ready(Some(Ok(message))) => { + if message_matters(&message) { + return Poll::Ready(Heard::Change); + } + } + // A message zbus could not read: the next one may + // be fine. + Poll::Ready(Some(Err(_))) => {} + // The connection is gone. + Poll::Ready(None) => return Poll::Ready(Heard::Closed), + Poll::Pending => break, + } + } + } + if let Some(timer) = timer.as_mut() + && Pin::new(timer).poll(cx).is_ready() + { + return Poll::Ready(Heard::Deadline); + } + Poll::Pending + })) + } +} + +/// Whether `message` is a signal the watch acts on +/// ([`signal_matters`]), reading a portal +/// `SettingChanged`'s namespace from its body. +fn message_matters(message: &Message) -> bool { + let header = message.header(); + let (Some(interface), Some(member), Some(path)) = + (header.interface(), header.member(), header.path()) + else { + return false; + }; + let namespace = if interface.as_str() == PORTAL_SETTINGS { + message + .body() + .deserialize::<(String, String, OwnedValue)>() + .ok() + .map(|(namespace, _, _)| namespace) + } else { + None + }; + signal_matters( + interface.as_str(), + member.as_str(), + path.as_str(), + namespace.as_deref(), + ) +} + +/// `future`'s output, or `None` once `stop` is set. +async fn until_stopped(stop: &Stop, future: impl Future) -> Option { + let mut future = pin!(future); + poll_fn(|cx| { + if stop.poll_stopped(cx) { + return Poll::Ready(None); + } + future.as_mut().poll(cx).map(Some) + }) + .await +} diff --git a/crates/teksilo-platform/src/os_theme/watch/tests.rs b/crates/teksilo-platform/src/os_theme/watch/tests.rs new file mode 100644 index 000000000..4d197ac26 --- /dev/null +++ b/crates/teksilo-platform/src/os_theme/watch/tests.rs @@ -0,0 +1,664 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +use std::cell::Cell; +use std::collections::VecDeque; +use std::path::{Path, PathBuf}; +use std::rc::Rc; +use std::sync::Arc; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::mpsc::{self, Receiver, RecvTimeoutError}; +use std::time::{Duration, Instant, SystemTime}; + +use teksilo_kde_scheme::KdeConfigLocations; + +use super::{ + BREEZERC_PATH, CONFIG_CHANGED, ChangeSource, ConfigStamps, Debounce, GLOBAL_SETTINGS, + GLOBAL_SETTINGS_PATH, Heard, KCONFIG_NOTIFY, KDEGLOBALS_PATH, LISTENED, NOTIFY_CHANGE, + PORTAL_PATH, PORTAL_SETTINGS, Running, SETTING_CHANGED, Stop, config_files, modified, run, + signal_matters, +}; + +const MS: Duration = Duration::from_millis(1); + +// ── Signals ───────────────────────────────────────────────────────────────── + +#[test] +fn a_portal_setting_matters_by_its_namespace() { + let portal = + |namespace| signal_matters(PORTAL_SETTINGS, SETTING_CHANGED, PORTAL_PATH, namespace); + assert!(portal(Some("org.freedesktop.appearance"))); + assert!(portal(Some("org.kde.kdeglobals.General"))); + assert!(portal(Some("org.kde.kdeglobals.KDE"))); + assert!(portal(Some("org.kde.kdeglobals.Colors:View"))); + // KDE's other namespaces, GNOME's, a bare prefix and an unreadable body. + assert!(!portal(Some("org.kde.VirtualKeyboard"))); + assert!(!portal(Some("org.kde.TabletMode"))); + assert!(!portal(Some("org.gnome.desktop.interface"))); + assert!(!portal(Some("org.kde.kdeglobals."))); + assert!(!portal(Some("org.kde.kdeglobals"))); + assert!(!portal(Some("org.freedesktop.appearance.extra"))); + assert!(!portal(None)); +} + +#[test] +fn the_kde_signals_matter_on_their_paths_only() { + assert!(signal_matters( + GLOBAL_SETTINGS, + NOTIFY_CHANGE, + GLOBAL_SETTINGS_PATH, + None + )); + assert!(signal_matters( + KCONFIG_NOTIFY, + CONFIG_CHANGED, + KDEGLOBALS_PATH, + None + )); + assert!(signal_matters( + KCONFIG_NOTIFY, + CONFIG_CHANGED, + BREEZERC_PATH, + None + )); + // Another configuration file, another path, another member. + assert!(!signal_matters( + KCONFIG_NOTIFY, + CONFIG_CHANGED, + "/kwinrc", + None + )); + assert!(!signal_matters( + GLOBAL_SETTINGS, + NOTIFY_CHANGE, + "/KGlobalSettings/other", + None + )); + assert!(!signal_matters( + GLOBAL_SETTINGS, + "slotNotifyChange", + GLOBAL_SETTINGS_PATH, + None + )); + // The right member and path under another interface. + assert!(!signal_matters( + "org.example.Other", + CONFIG_CHANGED, + KDEGLOBALS_PATH, + None + )); + assert!(!signal_matters( + "org.example.Other", + SETTING_CHANGED, + PORTAL_PATH, + Some("org.freedesktop.appearance") + )); +} + +#[test] +fn every_listened_signal_matters() { + for (interface, member, path) in LISTENED { + assert!( + signal_matters(interface, member, path, Some("org.freedesktop.appearance")), + "{interface}.{member} on {path}" + ); + } +} + +// ── Debounce ──────────────────────────────────────────────────────────────── + +#[test] +fn a_window_opens_on_the_first_change_and_is_due_once() { + let start = Instant::now(); + let mut debounce = Debounce::new(150 * MS); + assert_eq!(debounce.deadline(), None); + assert!(!debounce.take_due(start + 1000 * MS), "nothing heard"); + + debounce.heard(start); + debounce.heard(start + 100 * MS); + assert_eq!( + debounce.deadline(), + Some(start + 150 * MS), + "a later change does not move the end" + ); + assert!(!debounce.take_due(start + 149 * MS)); + assert!(debounce.take_due(start + 150 * MS)); + assert!(!debounce.take_due(start + 151 * MS), "due once"); + assert_eq!(debounce.deadline(), None); + + debounce.heard(start + 200 * MS); + assert_eq!(debounce.deadline(), Some(start + 350 * MS)); +} + +/// A source whose changes come at fixed instants, on a clock it moves +/// itself: to each change it reports, and to the deadline when that comes +/// first. It closes when its changes are spent and no window is open. +struct Scripted { + now: Rc>, + changes: VecDeque, +} + +impl ChangeSource for Scripted { + fn wait(&mut self, deadline: Option) -> Heard { + match (self.changes.front().copied(), deadline) { + (Some(at), Some(due)) if at > due => { + self.now.set(due); + Heard::Deadline + } + (Some(at), _) => { + self.changes.pop_front(); + self.now.set(at); + Heard::Change + } + (None, Some(due)) => { + self.now.set(due); + Heard::Deadline + } + (None, None) => Heard::Closed, + } + } +} + +/// The milliseconds after the start at which [`run`] posts, for changes +/// at `changes` milliseconds with a window of `window` milliseconds. +fn posts_for(window: u64, changes: &[u64]) -> Vec { + let start = Instant::now(); + let now = Rc::new(Cell::new(start)); + let mut source = Scripted { + now: Rc::clone(&now), + changes: changes.iter().map(|ms| start + *ms as u32 * MS).collect(), + }; + let posted = std::cell::RefCell::new(Vec::new()); + run( + &mut source, + &Stop::default(), + &mut Debounce::new(window as u32 * MS), + &|| now.get(), + &|| { + posted + .borrow_mut() + .push((now.get() - start).as_millis() as u64) + }, + ); + posted.into_inner() +} + +#[test] +fn a_burst_collapses_to_one_payload() { + assert_eq!(posts_for(150, &[0, 5, 10, 60, 149]), vec![150]); +} + +#[test] +fn separate_bursts_give_one_payload_each() { + assert_eq!(posts_for(150, &[0, 10, 500, 510, 520]), vec![150, 650]); +} + +#[test] +fn a_change_after_its_window_ends_opens_another() { + // A change at the very end of a window is covered by its payload; one + // just after opens the next window. + assert_eq!(posts_for(150, &[0, 150, 151]), vec![150, 301]); +} + +#[test] +fn nothing_heard_posts_nothing() { + assert_eq!(posts_for(150, &[]), Vec::::new()); +} + +#[test] +fn every_change_is_followed_by_a_payload_no_earlier_than_it() { + // A fixed pseudo-random sequence of gaps, from 0 to 400 ms. + let mut state: u64 = 0x2545_f491_4f6c_dd1d; + let mut at = 0; + let mut changes = Vec::new(); + for _ in 0..200 { + state ^= state << 13; + state ^= state >> 7; + state ^= state << 17; + at += state % 401; + changes.push(at); + } + let posts = posts_for(150, &changes); + for change in &changes { + assert!( + posts + .iter() + .any(|post| post >= change && post - change <= 150), + "the change at {change} ms is followed by a payload within the window" + ); + } + for pair in posts.windows(2) { + assert!( + pair[1] - pair[0] >= 150, + "payloads {pair:?} closer than a window" + ); + } + assert!( + posts.len() < changes.len(), + "nearby changes share a payload" + ); +} + +#[test] +fn a_stopped_watch_posts_nothing() { + let start = Instant::now(); + let now = Rc::new(Cell::new(start)); + let mut source = Scripted { + now: Rc::clone(&now), + changes: [start, start + 10 * MS].into(), + }; + let stop = Stop::default(); + stop.stop(); + let posted = Cell::new(0); + run( + &mut source, + &stop, + &mut Debounce::new(150 * MS), + &|| now.get(), + &|| posted.set(posted.get() + 1), + ); + assert_eq!(posted.get(), 0); +} + +// ── The thread ────────────────────────────────────────────────────────────── + +/// A source fed through a channel, watching the stop flag between short +/// waits. +struct Channel { + changes: Receiver<()>, + stop: Arc, +} + +impl ChangeSource for Channel { + fn wait(&mut self, deadline: Option) -> Heard { + loop { + if self.stop.is_stopped() { + return Heard::Closed; + } + let slice = deadline.map_or(5 * MS, |due| { + due.saturating_duration_since(Instant::now()).min(5 * MS) + }); + match self.changes.recv_timeout(slice) { + Ok(()) => return Heard::Change, + Err(RecvTimeoutError::Timeout) => { + if deadline.is_some_and(|due| Instant::now() >= due) { + return Heard::Deadline; + } + } + Err(RecvTimeoutError::Disconnected) => return Heard::Closed, + } + } + } +} + +/// A running watch over a [`Channel`] with a window of `window`, the +/// sender feeding it, and how many times it has posted. +fn channel_watch(window: Duration) -> (Running, mpsc::Sender<()>, Arc) { + let (send, changes) = mpsc::channel(); + let posted = Arc::new(AtomicUsize::new(0)); + let counter = Arc::clone(&posted); + let running = Running::start( + window, + move |stop| Some(Channel { changes, stop }), + move || { + counter.fetch_add(1, Ordering::SeqCst); + }, + ) + .expect("start the watch thread"); + (running, send, posted) +} + +/// Wait until `count` reaches `at_least`, for at most two seconds. +fn wait_for(count: &AtomicUsize, at_least: usize) { + let until = Instant::now() + Duration::from_secs(2); + while count.load(Ordering::SeqCst) < at_least && Instant::now() < until { + std::thread::sleep(5 * MS); + } +} + +#[test] +fn the_thread_posts_once_per_burst() { + let window = 40 * MS; + let (_running, send, posted) = channel_watch(window); + for _ in 0..5 { + send.send(()).unwrap(); + } + wait_for(&posted, 1); + std::thread::sleep(window * 3); + assert_eq!(posted.load(Ordering::SeqCst), 1, "one burst, one payload"); + + send.send(()).unwrap(); + wait_for(&posted, 2); + std::thread::sleep(window * 3); + assert_eq!(posted.load(Ordering::SeqCst), 2, "a second burst, a second"); +} + +#[test] +fn nothing_is_posted_after_drop() { + let window = 40 * MS; + let (running, send, posted) = channel_watch(window); + send.send(()).unwrap(); + let dropped = Instant::now(); + drop(running); + assert!( + dropped.elapsed() < Duration::from_secs(1), + "the drop joins promptly" + ); + let _ = send.send(()); + std::thread::sleep(window * 4); + assert_eq!( + posted.load(Ordering::SeqCst), + 0, + "the window still open at the drop posts nothing" + ); +} + +#[test] +fn a_source_that_cannot_open_ends_the_thread() { + let running = Running::start( + 10 * MS, + |_stop| None::, + || panic!("nothing to hear"), + ) + .expect("start the watch thread"); + let dropped = Instant::now(); + drop(running); + assert!(dropped.elapsed() < Duration::from_secs(1)); +} + +// ── The configuration files ───────────────────────────────────────────────── + +fn set_modified(path: &Path, time: SystemTime) { + std::fs::File::options() + .write(true) + .open(path) + .expect("open the file") + .set_modified(time) + .expect("set its modification time"); +} + +#[test] +fn a_file_of_either_cascade_written_made_or_removed_is_a_change() { + let dir = tempfile::tempdir().expect("make a scratch directory"); + let root = dir.path().to_owned(); + let config = root.join("config"); + let etc = root.join("etc"); + for d in [&config, &etc, &config.join("kdedefaults")] { + std::fs::create_dir_all(d).expect("make a configuration directory"); + } + let vars: Vec<(&str, String)> = vec![ + ("HOME", root.display().to_string()), + ("XDG_CONFIG_HOME", config.display().to_string()), + ("XDG_CONFIG_DIRS", etc.display().to_string()), + ("XDG_CURRENT_DESKTOP", "KDE".to_owned()), + ("KDE_SKIP_KDERC", "1".to_owned()), + ]; + let locations = KdeConfigLocations::from_env(|name: &str| { + vars.iter() + .find(|(key, _)| *key == name) + .map(|(_, value)| value.clone()) + }); + let paths = config_files(&locations); + assert!( + paths.iter().all(|path| path.starts_with(&root)), + "every file is in the scratch directory: {paths:?}" + ); + let has = |path: PathBuf| assert!(paths.contains(&path), "{} is watched", path.display()); + has(config.join("kdeglobals")); + has(config.join("breezerc")); + has(config.join("kdedefaults").join("kdeglobals")); + has(etc.join("kdeglobals")); + has(etc.join("breezerc")); + + let user = config.join("kdeglobals"); + let system_breezerc = etc.join("breezerc"); + std::fs::write(&user, "[General]\nColorScheme=BreezeLight\n").unwrap(); + std::fs::write(&system_breezerc, "[Style]\n").unwrap(); + let base = SystemTime::now() - Duration::from_secs(3600); + set_modified(&user, base); + set_modified(&system_breezerc, base); + + let mut stamps = ConfigStamps::read(paths, modified); + assert!(!stamps.refresh(modified), "nothing changed"); + + set_modified(&user, base + Duration::from_secs(10)); + assert!( + stamps.refresh(modified), + "the user's kdeglobals was written" + ); + assert!(!stamps.refresh(modified), "and is counted once"); + + std::fs::write(config.join("breezerc"), "[Common]\n").unwrap(); + assert!(stamps.refresh(modified), "the user's breezerc was made"); + + std::fs::write(config.join("kdedefaults").join("kdeglobals"), "[KDE]\n").unwrap(); + assert!(stamps.refresh(modified), "the kdedefaults layer was made"); + + std::fs::remove_file(&system_breezerc).unwrap(); + assert!(stamps.refresh(modified), "the system breezerc was removed"); + assert!(!stamps.refresh(modified)); + + // A file outside both cascades is not watched. + std::fs::write(config.join("kwinrc"), "[Windows]\n").unwrap(); + assert!(!stamps.refresh(modified)); +} + +// ── The real bus ──────────────────────────────────────────────────────────── + +/// The watch on a private `dbus-daemon`, posting through a recording +/// poster. Opt-in: run with `TEKSILO_DBUS_TESTS=1`. +#[cfg(target_os = "linux")] +mod real_bus { + use std::collections::HashMap; + use std::sync::atomic::{AtomicUsize, Ordering}; + use std::sync::{Arc, mpsc}; + use std::time::{Duration, Instant}; + + use teksilo_core::{AppEventPoster, SubscriptionId}; + use zbus::zvariant::Value; + + use super::super::{DEBOUNCE, OsThemeChanged, OsThemeWatch}; + use crate::linux_portal::tests::real_bus::{PrivateBus, enabled}; + + /// Counts the [`OsThemeChanged`] payloads posted to it, and every other + /// payload apart. + #[derive(Clone, Default)] + struct Recorder { + changes: Arc, + others: Arc, + } + + impl AppEventPoster for Recorder { + fn post_subscription_event(&self, _: SubscriptionId, _: Box) { + self.others.fetch_add(1, Ordering::SeqCst); + } + + fn post_external(&self, payload: Box) { + if payload.is::() { + self.changes.fetch_add(1, Ordering::SeqCst); + } else { + self.others.fetch_add(1, Ordering::SeqCst); + } + } + } + + impl Recorder { + fn changes(&self) -> usize { + self.changes.load(Ordering::SeqCst) + } + + /// Wait for `expected` payloads, then a little more to see that no + /// further one comes, and return the count. + fn settle(&self, expected: usize) -> usize { + let until = Instant::now() + Duration::from_secs(3); + while self.changes() < expected && Instant::now() < until { + std::thread::sleep(Duration::from_millis(5)); + } + std::thread::sleep(DEBOUNCE * 2); + self.changes() + } + } + + /// Something that sends one signal. + type Sender = Box zbus::Result<()>>; + + fn emit( + connection: &zbus::Connection, + path: &str, + interface: &str, + member: &str, + body: &B, + ) -> zbus::Result<()> + where + B: zbus::export::serde::Serialize + zbus::zvariant::DynamicType, + { + async_io::block_on(connection.emit_signal( + None::>, + path, + interface, + member, + body, + )) + } + + fn portal( + namespace: &'static str, + key: &'static str, + ) -> impl Fn(&zbus::Connection) -> zbus::Result<()> { + move |c| { + emit( + c, + "/org/freedesktop/portal/desktop", + "org.freedesktop.portal.Settings", + "SettingChanged", + &(namespace, key, Value::U32(1)), + ) + } + } + + fn config_changed(c: &zbus::Connection, path: &str) -> zbus::Result<()> { + let groups: HashMap>> = + HashMap::from([("General".to_owned(), vec![b"ColorScheme".to_vec()])]); + emit(c, path, "org.kde.kconfig.notify", "ConfigChanged", &groups) + } + + fn notify_change(c: &zbus::Connection) -> zbus::Result<()> { + emit( + c, + "/KGlobalSettings", + "org.kde.KGlobalSettings", + "notifyChange", + &(0_i32, 0_i32), + ) + } + + #[test] + fn hears_each_listened_signal_once_per_debounce_window() { + if !enabled() { + return; + } + let bus = PrivateBus::start(); + let recorder = Recorder::default(); + let (opened, is_open) = mpsc::channel(); + let watch = OsThemeWatch::on_bus(Some(bus.address.clone()), recorder.clone(), move |ok| { + let _ = opened.send(ok); + }) + .expect("start the watch"); + assert_eq!( + is_open.recv_timeout(Duration::from_secs(5)), + Ok(true), + "the watch reached the bus and subscribed" + ); + let sender = async_io::block_on( + zbus::connection::Builder::address(bus.address.as_str()) + .expect("the bus address") + .build(), + ) + .expect("connect the sender"); + + // Each listened signal alone: one payload each. + let listened: Vec<(&str, Sender)> = vec![ + ( + "appearance color-scheme", + Box::new(portal("org.freedesktop.appearance", "color-scheme")), + ), + ( + "kdeglobals General ColorScheme", + Box::new(portal("org.kde.kdeglobals.General", "ColorScheme")), + ), + ("notifyChange", Box::new(notify_change)), + ( + "ConfigChanged /kdeglobals", + Box::new(|c| config_changed(c, "/kdeglobals")), + ), + ( + "ConfigChanged /breezerc", + Box::new(|c| config_changed(c, "/breezerc")), + ), + ]; + let mut expected = 0; + for (name, send) in &listened { + send(&sender).expect("send the signal"); + expected += 1; + assert_eq!(recorder.settle(expected), expected, "{name}"); + } + + // A burst of every one of them: one payload. + for _ in 0..3 { + for (_, send) in &listened { + send(&sender).expect("send the signal"); + } + } + expected += 1; + assert_eq!(recorder.settle(expected), expected, "a burst"); + + // Signals the watch does not listen to, or ignores. + let ignored: Vec = vec![ + Box::new(portal("org.kde.VirtualKeyboard", "active")), + Box::new(portal("org.gnome.desktop.interface", "gtk-theme")), + Box::new(|c| config_changed(c, "/kwinrc")), + Box::new(|c| { + emit( + c, + "/kdeglobals", + "org.example.Other", + "ConfigChanged", + &(0_i32,), + ) + }), + ]; + for send in &ignored { + send(&sender).expect("send the signal"); + } + assert_eq!(recorder.settle(expected), expected, "nothing it ignores"); + + // Nothing once the watch is dropped. + drop(watch); + for (_, send) in &listened { + send(&sender).expect("send the signal"); + } + assert_eq!(recorder.settle(expected), expected, "nothing after drop"); + assert_eq!(recorder.others.load(Ordering::SeqCst), 0); + } + + #[test] + fn a_bus_that_is_not_there_leaves_a_silent_watch() { + if !enabled() { + return; + } + let dir = std::env::temp_dir().join(format!("teksilo-watch-absent-{}", std::process::id())); + let (opened, is_open) = mpsc::channel(); + let recorder = Recorder::default(); + let watch = OsThemeWatch::on_bus( + Some(format!("unix:path={}", dir.join("no-bus").display())), + recorder.clone(), + move |ok| { + let _ = opened.send(ok); + }, + ) + .expect("start the watch"); + assert_eq!(is_open.recv_timeout(Duration::from_secs(5)), Ok(false)); + drop(watch); + assert_eq!(recorder.changes(), 0); + } +} From 4704f2ce89aa24028775a180f70c4d274ea07425 Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 15:19:54 +0200 Subject: [PATCH 21/59] feat(theme-kde): add the KDE Plasma preset's tokens, palette and accents New crate teksilo-theme-kde, MPL-2.0, on teksilo-core, teksilo-tokens, teksilo-canvas, teksilo-widgets and teksilo-kde-scheme (re-exported as scheme). It builds a Teksilo theme from any KDE colour scheme in the Breeze design language of Plasma 6.8 (BREEZE_VERSION). It installs no widget style yet: every slot keeps its recipe default, and KDE_UNFILLED gives the reason for each. light() and dark() are from_scheme of Breeze Light and Breeze Dark; light_with_accent and dark_with_accent pass the accent through KdeColorScheme::with_accent, so Breeze's own blue still gives Plasma's lighter selection (119,198,239). The id is kde.light or kde.dark by the scheme's is_dark. build, reproject and install_styles follow the macOS crate: reproject swaps in the generic density ladder ([unpublished]). palette: KdePalette, a ThemeExtension (Any + Send + Sync, PartialEq by content), holds Arc, the frame contrast clamped to 0..1, BreezeColors per state (frame outline, separator, frame background, focus and hover with their outlines, button and slider outlines, shadow) and four precomputed ColorTokens: active, inactive, high contrast and both. PlasmaAccent lists the ten swatches with [derived] ids, color(), as_str() and FromStr. color (private): every ColorTokens field assigned in one struct literal with its source tag. Lifts, each a rule through lift_luma_until, with a module-doc entry, a comment at the assignment and premise and pass tests: D1 text on the accent (the scheme's text when it passes, else Plasma's black-or-white rule; selection fills and accent washes move in luma for the primary text, so Breeze Dark's selection darkens), D2 inactive text, D3 links, D4 status colours, D5 the focus decoration, D6 the strong outline, D9 the scroll-bar thumbs, which follow spec k.5.11 (no track, 0.175 idle, hover colour at 0.5). Text is lifted against every surface including the hover and press washes of the state's and the active accent, so an inactive Breeze window keeps its text colours. search_match_*, scrim and chart_palette keep Int UI's. Projections, through PaintProjection: an inactive window paints the scheme's Inactive state (for Breeze, the window tinted 0.4 toward the selection; the focus ring unchanged; a scheme with inactive effects on gets them); high contrast rebuilds the scheme at frame contrast 1 and contrast 10 with 7:1 text, 4.5:1 non-text, secondary grades equal to the primary ones and the highlight moved in HCY, white text on it in a light scheme. The selection fill is held to its text: carrying the window's text at 7:1, it cannot also reach 4.5:1 on the window in any scheme, which the module doc, a premise test and a known limitation record. A theme whose colours the app changed gets the generic projection instead. shape, typography, motion, geometry: radius 5, pen 1, focus ring 2 at -1, the k.6 shadows; Qt's 13 px and 11 px faces with Qt's line heights (18, 15, Hack 15) from spec l.2; spec m durations with Linear easing; BreezeGeometry::for_line_height with every k.4 height. Where the specification changes the plan: the separator mixes by the frame contrast, not 0.2; the small line box is 15. The switch colour curve is the exact cubic Bezier of t cubed, (1/3, 0, 2/3, 0), rather than the common approximation (0.55, 0.055, 0.675, 0.19), which strays 0.03 from it; spec m now says so. Tests: the macOS unit list adapted; assert_same_theme (Theme destructured without a rest pattern) with from_scheme(breeze_light()) equal to light(); a table pinning every ColorTokens field; slot partition; inactive and high-contrast projections; the bezier bounds; geometry exact at 10 pt and at most 3 px short of Qt's sizes at 8 to 14 pt; no_unverified_tags. tests/contrast.rs sweeps every declared pair over Breeze Light, Dark and Classic, Oxygen, Oxygen Cold and Oxygen Dark (read from the golden vectors, so the file is excluded from the package), the ten accents on both and nine adversarial schemes, each shown to defeat its target colour without the lifts, plus a proptest over random coherent schemes in all four paint states; tests/high_contrast.rs checks 7:1 and 4.5:1 for every swatch, appearance and window state. The clean-room scan now covers this crate. NOTICE 1.5 and TRADEMARKS.md name the preset. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 19 + Cargo.lock | 14 + Cargo.toml | 1 + NOTICE | 17 +- TRADEMARKS.md | 4 +- .../tests/clean_room_vocabulary.rs | 2 + crates/teksilo-theme-kde/Cargo.toml | 46 + crates/teksilo-theme-kde/src/color.rs | 747 +++++++++++ crates/teksilo-theme-kde/src/geometry.rs | 387 ++++++ crates/teksilo-theme-kde/src/lib.rs | 1136 +++++++++++++++++ crates/teksilo-theme-kde/src/motion.rs | 192 +++ crates/teksilo-theme-kde/src/palette.rs | 441 +++++++ crates/teksilo-theme-kde/src/shape.rs | 251 ++++ crates/teksilo-theme-kde/src/typography.rs | 238 ++++ crates/teksilo-theme-kde/tests/contrast.rs | 912 +++++++++++++ .../teksilo-theme-kde/tests/high_contrast.rs | 313 +++++ engineering/docs/kde-breeze-spec.md | 9 +- engineering/docs/property-testing.md | 1 + 18 files changed, 4723 insertions(+), 7 deletions(-) create mode 100644 crates/teksilo-theme-kde/Cargo.toml create mode 100644 crates/teksilo-theme-kde/src/color.rs create mode 100644 crates/teksilo-theme-kde/src/geometry.rs create mode 100644 crates/teksilo-theme-kde/src/lib.rs create mode 100644 crates/teksilo-theme-kde/src/motion.rs create mode 100644 crates/teksilo-theme-kde/src/palette.rs create mode 100644 crates/teksilo-theme-kde/src/shape.rs create mode 100644 crates/teksilo-theme-kde/src/typography.rs create mode 100644 crates/teksilo-theme-kde/tests/contrast.rs create mode 100644 crates/teksilo-theme-kde/tests/high_contrast.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 149650fc4..b7a7e8df8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -128,6 +128,25 @@ by crate for clarity, not because crates version independently. accent swatches. When `kdeglobals` holds no colours of its own, `KdeDesktop` applies the user's chosen accent to the scheme it reads in their place, which KDE itself does not. +- **New crate `teksilo-theme-kde`, the KDE Plasma theme preset.** `light()` + and `dark()` are Breeze Light and Breeze Dark; `light_with_accent` and + `dark_with_accent` apply an accent colour the way Plasma's colour settings + do, and `PlasmaAccent` lists Plasma's ten accent swatches with stable names + for saving a choice; `from_scheme` gives the theme of any KDE colour + scheme, light or dark as KDE judges it. The themes carry the ids + `kde.light` and `kde.dark`. Each has Breeze's colours, its 5 px corner + radius, the geometry of its 2 px focus ring drawn half inside the control, + Plasma's default text sizes and line heights (13 px text on an 18 px line), + its spacing and its 100 ms linear transitions. An inactive window shows the + scheme's muted selection and accent, as Plasma does, and the OS increase + contrast preference gets the preset's own colours, with 7:1 text. Stock + Breeze colours that fall short of WCAG (secondary text, links, status + colours, the focus colour, strong outlines, the scroll-bar thumb and the + text on the accent) are made readable, keeping their hue. Every theme + carries a `KdePalette` with the whole resolved scheme and the colours + Breeze combines from it, and `geometry::BreezeGeometry` gives the Breeze + control heights for any font size. Widgets draw Teksilo's own chrome in + these colours and shapes: no Breeze widget style is installed. #### Platform diff --git a/Cargo.lock b/Cargo.lock index 388ae3fd2..b2cf15dd6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12229,6 +12229,20 @@ dependencies = [ "teksilo-widgets", ] +[[package]] +name = "teksilo-theme-kde" +version = "0.19.0" +dependencies = [ + "proptest", + "serde_json", + "teksilo-canvas", + "teksilo-core", + "teksilo-kde-scheme", + "teksilo-tokens", + "teksilo-widgets", + "thiserror 2.0.21", +] + [[package]] name = "teksilo-theme-macos" version = "0.19.0" diff --git a/Cargo.toml b/Cargo.toml index 1c14ab0aa..25c1ae908 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -208,6 +208,7 @@ teksilo-theme-material3 = { path = "crates/teksilo-theme-material3", version = " teksilo-theme-macos = { path = "crates/teksilo-theme-macos", version = "0.19.0" } teksilo-theme-fluent = { path = "crates/teksilo-theme-fluent", version = "0.19.0" } teksilo-kde-scheme = { path = "crates/teksilo-kde-scheme", version = "0.19.0" } +teksilo-theme-kde = { path = "crates/teksilo-theme-kde", version = "0.19.0" } # Path only, no `version`: this crate is `publish = false`, so a versioned # dependency on it would have to resolve from crates.io the moment a diff --git a/NOTICE b/NOTICE index 39512b7d7..01348995a 100644 --- a/NOTICE +++ b/NOTICE @@ -98,7 +98,7 @@ resource file, or artwork is included, and no token value is transcribed from one. -1.5 KDE Plasma / Breeze -- crates/teksilo-kde-scheme +1.5 KDE Plasma / Breeze -- crates/teksilo-kde-scheme, crates/teksilo-theme-kde --------------------------------------------------------------------------- teksilo-kde-scheme reads the files a KDE Plasma desktop keeps its look in: @@ -113,6 +113,17 @@ specification alone. Values such as default colours and numeric constants are facts; the specification's ledger records, for each one, the upstream file and line it was observed in. +teksilo-theme-kde, the KDE Plasma theme preset, builds Teksilo themes from +those colour schemes and transcribes the Breeze design language from the +same specification: the widget style's metrics, painting rules and motion, +and the Kirigami units it relies on. Each value is tagged at its definition +with where it was observed ([M], [S] and [Hp] for the Breeze widget style, +[K] for Kirigami, [Qd] for the desktop QtQuick style, [qt] for Qt's public +documentation, [measured-qt] for the Qt runtime) or how Teksilo derived it +([derived], [wcag], [unpublished]). Where a stock Breeze colour falls short +of WCAG, the theme lifts it by a stated rule and says so. No KDE or Qt +source code, artwork, icon or font is included in it. + The specification describes these upstream releases: plasma/breeze v6.8.0 @@ -159,8 +170,8 @@ are credited to him. KDE(R) and the K Desktop Environment(R) logo are registered trademarks of KDE e.V. Teksilo is not affiliated with, endorsed by or sponsored by KDE e.V.; the names KDE, Plasma and Breeze are used only to say which desktop's -files the crate reads and which design language the specification -describes. See TRADEMARKS.md. +files teksilo-kde-scheme reads and which design language the specification +describes and teksilo-theme-kde reproduces. See TRADEMARKS.md. =========================================================================== diff --git a/TRADEMARKS.md b/TRADEMARKS.md index b64d2b2f5..b85728724 100644 --- a/TRADEMARKS.md +++ b/TRADEMARKS.md @@ -40,7 +40,7 @@ More generally, don't do anything with the name or FernTech's branding that woul ## Third-party trademarks -Teksilo ships theme presets that reproduce the look of design languages published by other vendors, and each is named for what it reproduces: `macos`, `fluent`, `material3`, and the `intui` default. The name is there to say which design language a preset imitates — a theme reproducing Apple's Aqua cannot be identified without naming it. We use the word and nothing else: no logo, no wordmark, no icon set, and no proprietary font is redistributed. See [NOTICE](NOTICE) for what each preset actually derives from and on what terms. +Teksilo ships theme presets that reproduce the look of design languages published by other vendors, and each is named for what it reproduces: `macos`, `fluent`, `material3`, `kde`, and the `intui` default. The name is there to say which design language a preset imitates: a theme reproducing Apple's Aqua cannot be identified without naming it. We use the word and nothing else: no logo, no wordmark, no icon set, and no proprietary font is redistributed. See [NOTICE](NOTICE) for what each preset actually derives from and on what terms. The marks belong to their owners: @@ -48,7 +48,7 @@ The marks belong to their owners: - **Fluent**, **WinUI**, **Windows**, **Segoe UI**, **Consolas** — Microsoft Corporation. - **Material Design**, **Noto**, **Roboto** — Google LLC. - **Int UI**, **JetBrains**, **JetBrains Mono** — JetBrains s.r.o. -- **KDE**, **KDE Plasma**, **Plasma**, **Breeze**: KDE e.V. (KDE is a registered trademark of KDE e.V.). The `teksilo-kde-scheme` crate uses these names only to say which desktop's configuration files it reads and which design language they describe. +- **KDE**, **KDE Plasma**, **Plasma**, **Breeze**: KDE e.V. (KDE is a registered trademark of KDE e.V.). The `teksilo-kde-scheme` crate uses these names only to say which desktop's configuration files it reads and which design language they describe, and the `teksilo-theme-kde` preset only to say which design language it reproduces. Teksilo is not affiliated with, endorsed by, sponsored by, or certified by any of them. The presets are independent implementations by FernTech, built from published specifications and — where a vendor publishes nothing — from measurement. They are not vendor-supplied, not vendor-reviewed, and not guaranteed to match any vendor's current design. diff --git a/crates/teksilo-kde-scheme/tests/clean_room_vocabulary.rs b/crates/teksilo-kde-scheme/tests/clean_room_vocabulary.rs index 343b29ab6..95f6337d0 100644 --- a/crates/teksilo-kde-scheme/tests/clean_room_vocabulary.rs +++ b/crates/teksilo-kde-scheme/tests/clean_room_vocabulary.rs @@ -29,6 +29,8 @@ use std::path::{Path, PathBuf}; const SCANNED: &[&str] = &[ "crates/teksilo-kde-scheme/src", "crates/teksilo-kde-scheme/tests", + "crates/teksilo-theme-kde/src", + "crates/teksilo-theme-kde/tests", ]; /// Directories inside [`SCANNED`] that hold verbatim upstream files. diff --git a/crates/teksilo-theme-kde/Cargo.toml b/crates/teksilo-theme-kde/Cargo.toml new file mode 100644 index 000000000..44b7d9792 --- /dev/null +++ b/crates/teksilo-theme-kde/Cargo.toml @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: MPL-2.0 +# SPDX-FileCopyrightText: 2026 FernTech + +[package] +name = "teksilo-theme-kde" +edition.workspace = true +version.workspace = true +license.workspace = true +publish.workspace = true +authors.workspace = true +repository.workspace = true +homepage.workspace = true +description = "KDE Plasma theme preset for Teksilo: the Breeze design language and its colour schemes and accents, as tokens. Not affiliated with or endorsed by KDE e.V." +documentation = "https://docs.rs/teksilo-theme-kde" +keywords = ["kde", "plasma", "breeze", "theme", "gui"] +categories = ["gui"] +# `tests/contrast.rs` reads the golden vectors under `tools/kde_golden` for +# the Oxygen schemes; left in, it would not compile from the package and +# `cargo test` there would fail. +exclude = ["tests/contrast.rs"] + +[dependencies] +teksilo-core = { workspace = true } +teksilo-tokens = { workspace = true } +# The Tier-3 widget styles this preset installs in `style_slots` are built +# from the `Recipe*Style` defaults and layout primitives of teksilo-widgets, +# drawing through teksilo-canvas. teksilo-widgets does not depend on the +# theme crates, so this is acyclic. +teksilo-canvas = { workspace = true } +teksilo-widgets = { workspace = true } +# The KDE colour-scheme model: the stock Breeze schemes, the resolved +# palette, Plasma's accent application and the colour arithmetic. +teksilo-kde-scheme = { workspace = true } +thiserror = { workspace = true } + +[dev-dependencies] +# Property-based testing: `tests/contrast.rs` checks every declared text and +# backdrop pair over random coherent schemes. `cargo-fuzz` needs a nightly +# toolchain, which is not a guaranteed CI dependency; proptest gives the same +# coverage plus shrinking on stable (see the workspace `Cargo.toml`). +proptest = { workspace = true } +# Reads the Oxygen schemes in `tools/kde_golden/vectors/resolve.json`. +serde_json = { workspace = true } + +[package.metadata.docs.rs] +all-features = true diff --git a/crates/teksilo-theme-kde/src/color.rs b/crates/teksilo-theme-kde/src/color.rs new file mode 100644 index 000000000..2c0269d99 --- /dev/null +++ b/crates/teksilo-theme-kde/src/color.rs @@ -0,0 +1,747 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! A resolved KDE palette projected onto Teksilo's [`ColorTokens`]. +//! +//! The source is the scheme's [`ResolvedPalette`]: Qt's palette roles +//! (Window, Base, Text, Highlight, ...) and the seven colour sets with their +//! decorations and computed backgrounds. This module chooses one source per +//! token, applies the Breeze painting rules that combine two of them (a frame +//! outline is the window colour moved toward the window text by the frame +//! contrast), and lifts the colours that would otherwise fail WCAG. +//! +//! `X over Y at a` below means `X` at alpha `a` composited on the opaque +//! `Y`; with both opaque that is KDE's mix from `Y` toward `X` by `a`, which +//! is how it is computed. `fc` is the scheme's frame contrast (0.2 for +//! Breeze). Every token is computed from one colour state: the Active one +//! for an active window, the Inactive one for an inactive window +//! ([`crate::palette::KdePalette`] keeps both), except the disabled tokens, +//! which always read the Disabled state, and the tooltip, which always reads +//! the Active one, as Qt's palette does. +//! +//! ## Where this preset departs from the scheme +//! +//! KDE never adjusts a colour for readability, and several stock Breeze +//! colours fall short of WCAG 2.x. Each departure below is a rule, applied +//! to whatever scheme the theme is built from, so a scheme whose colours +//! already pass keeps them exactly. Each one is marked at its assignment +//! and covered by a test that the lifted colour passes and a test that the +//! vendor colour fails. The palette extension keeps the vendor colours. +//! +//! - **D1, text on the accent.** Breeze Light's selection text is white on +//! its 61,174,233 highlight, 2.5:1 against SC 1.4.3's 4.5:1. The scheme's +//! selection text is kept when it reaches the floor on the fill it sits +//! on; otherwise the text is black or white by Plasma's own rule for text +//! on an accent (the one it writes when it applies an accent colour), +//! and the other of the two when that one still falls short. Where +//! Teksilo paints text it does not choose on a selection (a table cell, +//! a selected menu row, selected text in a field, all in the primary text +//! colour), the selection fill keeps its hue and moves in HCY luma until +//! that text reaches the floor; for Breeze Light nothing moves, and in +//! Breeze Dark the fill darkens, as Plasma's own accent application +//! darkens it. The accent's hover and press shades move the same way if +//! the accent text falls short on them, and so do the hover and press +//! washes made from the accent if the primary text falls short on them. +//! - **D2, inactive text.** The inactive foreground (secondary text, +//! placeholders, line numbers, a tooltip's shortcut) is 3.7:1 on the +//! Breeze Light window. It moves in luma to 4.5:1 on every surface text +//! sits on, the hover and press washes included. +//! - **D3, links.** Breeze Light's link colour is 3.8:1 on the window; the +//! unvisited, visited and hover links move to 4.5:1 the same way. +//! - **D4, status colours.** The negative, neutral and positive foregrounds +//! (4.3:1, 2.8:1 and 2.9:1 on Breeze Light's view) move to 4.5:1 on every +//! surface and on their own status background; as borders they move to +//! SC 1.4.11's 3:1. +//! - **D5, the focus decoration.** The focus colour, 61,174,233, is 2.5:1 +//! on the Breeze Light view; the focus ring moves to 3:1 on every control +//! surface. It stays opaque. +//! - **D6, frame outlines.** At the frame contrast 0.2 the frame outline is +//! 1.5:1 on the window. `border` keeps that outline, which Breeze draws +//! around passive frames; `border_strong` and `divider_strong`, which +//! Teksilo draws where a boundary must be seen, move to 3:1. +//! - **D9, the scroll-bar thumb.** Breeze paints the idle thumb in the +//! window text at an effective 17.5 % over the window, 1.4:1; the hovered +//! one in the hover colour at 50 %. Both move to 3:1. +//! +//! D7 and D8 are row heights, not colours, and live with the styles. +//! +//! ## The high-contrast projection +//! +//! Under the OS "increase contrast" preference the tokens are rebuilt from +//! the scheme with a frame contrast of 1 and a contrast of 10, every text +//! floor raised to 7:1 (SC 1.4.6) and every non-text floor to 4.5:1, and the +//! secondary text grades made the primary ones. The accent moves in luma +//! until its text reaches 7:1 on it and it reaches 4.5:1 on the control +//! surfaces. In a light scheme no single colour lets black text reach 7:1 +//! (the fill must be light) while the fill reaches 4.5:1 on a near-white +//! window (the fill must be dark), so there the accent darkens and its text +//! is white: the one place this preset overrides Plasma's black-text rule +//! of D1. +//! +//! The selection fill does not move with the accent: it carries the +//! window's primary text, which must reach 7:1 on it, so where that text +//! falls short it moves toward the window until the text reaches 7:1 +//! (Breeze Light's highlight lightens, +//! Breeze Dark's darkens). That leaves it closer to the window than in the +//! normal projection, whose text floor is 4.5:1: 1.9:1 on Breeze Light's +//! window and 2.2:1 on Breeze Dark's, against 2.2:1 and 3.4:1. No colour +//! can do better, in any scheme: the text is at 7:1 on the window too, so +//! a fill at 7:1 under the text and 4.5:1 on the window would put the +//! darkest and the lightest of the three colours at least 31.5:1 apart, +//! whatever their order, beyond the 21:1 of black on white. The fill is a +//! backdrop for text, not a boundary; a style that must show a selection's +//! extent at 4.5:1 outlines it in a colour that reaches it, such as +//! `focus_ring`. +//! +//! ## Kept from Int UI +//! +//! KDE has no colours for four tokens, which keep Teksilo's Int UI values +//! for the scheme's appearance: `search_match_bg` and +//! `search_match_current_bg` (KDE has no find-match role), `scrim` (KDE +//! dims nothing behind a dialog) and `chart_palette` (KDE has no +//! data-visualisation sequence; Int UI's is the colour-blind-safe Okabe-Ito +//! one). +//! +//! ## Known limitations +//! +//! - `surface_selected` serves two kinds of text: cells and rows Teksilo +//! paints in the primary text colour, and rows whose style paints the +//! on-accent text. In Breeze Dark those are white and black, and no fill +//! carries both, so the token is the D1 fill for the primary text, and a +//! style that paints on-accent text on a selection draws on `accent`. +//! - Under high contrast the selection fill stays below 4.5:1 on the +//! window, which no fill carrying the window's text at 7:1 can reach (see +//! the high-contrast projection above). + +use teksilo_kde_scheme::math::{ + black_or_white_on, hsv_darker, hsv_lighter, lift_luma_until, luma, mix, +}; +use teksilo_kde_scheme::{ + BackgroundRole, ColorSet, ColorState, DecorationRole, ForegroundRole, KdeColor, PaletteRole, + ResolvedPalette, +}; +use teksilo_tokens::contrast::composite_contrast; +use teksilo_tokens::{Color, ColorTokens}; + +/// The contrast floors a projection lifts colours to. +#[derive(Debug, Clone, Copy, PartialEq)] +pub(crate) struct Floors { + /// Text on its backdrop. + pub text: f32, + /// A control boundary, focus ring or other graphical object on its + /// backdrop. + pub non_text: f32, +} + +/// `[wcag]` SC 1.4.3 (text, 4.5:1) and SC 1.4.11 (non-text, 3:1). +pub(crate) const AA: Floors = Floors { + text: 4.5, + non_text: 3.0, +}; + +/// `[wcag]` SC 1.4.6 (text, 7:1), with non-text raised to 4.5:1, the +/// targets of Teksilo's high-contrast projection. +pub(crate) const ENHANCED: Floors = Floors { + text: 7.0, + non_text: 4.5, +}; + +/// `[Hp]` The alpha of Breeze's hover wash on an item and of its press +/// blend on a button: the style's blend value. +const BLEND: f64 = 0.3; + +/// `[Hp]` The idle scroll-bar thumb: the window text with alpha times 0.5, +/// times 0.7 while the pointer is away from the bar, painted at alpha times +/// 0.5 over the window. +const THUMB_ALPHA: f64 = 0.5 * 0.7 * 0.5; + +/// `[Hp]` The hovered scroll-bar thumb: the hover colour painted at 0.5 +/// over the window. +const THUMB_HOVER_ALPHA: f64 = 0.5; + +/// `[qt]` `[Hp]` Qt's `lighter` and `darker` factor Breeze uses for a +/// hovered or pressed highlight. +const FOCUS_LIGHTEN_FACTOR: i32 = 110; + +/// `[Hp]` The `darker` factor of an unselected tab's fill, the recessed +/// surface Breeze paints. +const RECESSED_FACTOR: i32 = 120; + +/// Everything a projection is computed from. +pub(crate) struct Mapping<'a> { + /// The resolved scheme. + pub palette: &'a ResolvedPalette, + /// The colour state the window paints in: Active or Inactive. + pub state: ColorState, + /// The frame contrast `fc`, in `0..=1`. + pub frame_contrast: f64, + /// Whether this is the high-contrast projection. + pub high_contrast: bool, + /// Whether the scheme is dark, which picks the Int UI values kept. + pub dark: bool, +} + +/// `top` at alpha `alpha` over the opaque `bottom`. +fn over(top: KdeColor, alpha: f64, bottom: KdeColor) -> KdeColor { + mix(bottom, top, alpha) +} + +/// The lowest WCAG contrast `fg` reaches, painted over each of `on`. +pub(crate) fn worst_contrast(fg: KdeColor, on: &[KdeColor]) -> f32 { + let fg = fg.to_color(); + on.iter() + .map(|bg| composite_contrast(fg, bg.to_color())) + .fold(f32::INFINITY, f32::min) +} + +fn passes(fg: KdeColor, on: &[KdeColor], floor: f32) -> bool { + worst_contrast(fg, on) >= floor +} + +/// `[wcag]` `color` with its HCY luma moved toward more contrast until it +/// reaches `floor` on every one of `on`; unchanged when it already does. +fn lift(color: KdeColor, on: &[KdeColor], floor: f32) -> KdeColor { + lift_luma_until(color, on, floor) +} + +/// `[wcag]` D1: the text to paint on `fills`. +/// +/// `vendor` when it reaches `floor` on every fill; otherwise black or white +/// by Plasma's rule for text on an accent, judged on the first fill, or the +/// other of the two when the rule's choice still falls short (black and +/// white cannot both fall below 4.58:1 on one opaque fill). +pub(crate) fn text_on(vendor: KdeColor, fills: &[KdeColor], floor: f32) -> KdeColor { + if passes(vendor, fills, floor) { + return vendor; + } + let plasma = black_or_white_on(fills[0], true); + let other = if plasma == KdeColor::BLACK { + KdeColor::WHITE + } else { + KdeColor::BLACK + }; + if passes(plasma, fills, floor) || worst_contrast(plasma, fills) >= worst_contrast(other, fills) + { + plasma + } else { + other + } +} + +/// `[wcag]` D1: `fill` with its luma moved away from `text` until `text` +/// reaches `floor` on it; unchanged when it already does. +fn fill_under(fill: KdeColor, text: &[KdeColor], floor: f32) -> KdeColor { + lift(fill, text, floor) +} + +/// The high-contrast accent and its text. +/// +/// For each text candidate (D1's choice first, then the other of black and +/// white), the highlight moves until the text reaches `floors.text` on it +/// and then until it reaches `floors.non_text` on the control surfaces. The +/// first candidate that satisfies both wins. A light scheme ends on the +/// second candidate, white text on a darkened accent; see the module doc. +fn high_contrast_accent( + highlight: KdeColor, + vendor_text: KdeColor, + surfaces: &[KdeColor], + floors: Floors, +) -> (KdeColor, KdeColor) { + let first = text_on(vendor_text, &[highlight], floors.text); + // The other end of the scale from the first candidate: white for a dark + // text, black for a light one. + let second = + if worst_contrast(KdeColor::WHITE, &[first]) >= worst_contrast(KdeColor::BLACK, &[first]) { + KdeColor::WHITE + } else { + KdeColor::BLACK + }; + // How far a candidate falls short of either floor, as the smaller of + // its two margins: at least zero when it reaches both. + let attempt = |text: KdeColor| { + let fill = lift(highlight, &[text], floors.text); + let fill = lift(fill, surfaces, floors.non_text); + let margin = (worst_contrast(text, &[fill]) - floors.text) + .min(worst_contrast(fill, surfaces) - floors.non_text); + (fill, text, margin) + }; + let (fill, text, margin) = attempt(first); + if margin >= 0.0 { + return (fill, text); + } + let (fill2, text2, margin2) = attempt(second); + if margin2 > margin { + (fill2, text2) + } else { + (fill, text) + } +} + +/// The colour tokens of `m`. +pub(crate) fn tokens(m: &Mapping<'_>) -> ColorTokens { + let p = m.palette; + let s = m.state; + let d = ColorState::Disabled; + let fc = m.frame_contrast; + let floors = if m.high_contrast { ENHANCED } else { AA }; + // Int UI's palette for the appearance, for the four tokens KDE has no + // colours for (see the module doc). + let kept = if m.dark { + ColorTokens::dark_default() + } else { + ColorTokens::light_default() + }; + + let role = |state: ColorState, r: PaletteRole| p.role(state, r); + let window = role(s, PaletteRole::Window); + let window_text = role(s, PaletteRole::WindowText); + let base = role(s, PaletteRole::Base); + let alternate = role(s, PaletteRole::AlternateBase); + let button = role(s, PaletteRole::Button); + let highlight = role(s, PaletteRole::Highlight); + let highlighted_text = role(s, PaletteRole::HighlightedText); + let view = p.set(s, ColorSet::View); + let window_set = p.set(s, ColorSet::Window); + // `[qt]` Qt's palette takes the tooltip from the Active state whatever + // state is painted. + let tooltip_set = p.set(ColorState::Active, ColorSet::Tooltip); + let focus = view.decoration(DecorationRole::Focus); + let hover = view.decoration(DecorationRole::Hover); + + // `[Hp]` Breeze's frame background (menus, popups, group boxes): the + // window colour 30 % of the way to the view's. + let frame_background = mix(window, base, BLEND); + // `[Hp]` The frame outline and the separator: the window colour moved + // toward the window text by the frame contrast. + let frame_outline = mix(window, window_text, fc); + // `[derived]` A recessed surface: the window's alternate background when + // it is darker than the window, otherwise `[Hp]` the window darkened as + // Breeze darkens an unselected tab. + let window_alternate = window_set.background(BackgroundRole::Alternate); + let sunken = if luma(window_alternate) < luma(window) { + window_alternate + } else { + hsv_darker(window, RECESSED_FACTOR) + }; + // `[Hp]` What a control stands on. + let control_surfaces = [window, base, frame_background, button]; + + // ── Accent ────────────────────────────────────────────────────────── + // `[qt]` Highlight is the accent. D1 and, for high contrast, the HCY + // move of the module doc. + let accent_of = |highlight: KdeColor, highlighted_text: KdeColor| { + if m.high_contrast { + high_contrast_accent(highlight, highlighted_text, &control_surfaces, floors) + } else { + ( + highlight, + // `[wcag]` D1: the scheme's selection text, or Plasma's black + // or white where it falls short. + text_on(highlighted_text, &[highlight], floors.text), + ) + } + }; + let (accent, text_on_accent) = accent_of(highlight, highlighted_text); + // `[Hp]` Breeze lightens a hovered highlight and darkens a pressed one + // by Qt's 110 % factor; `[wcag]` D1 moves either if the accent text + // falls short on it. + let accent_hover = fill_under( + hsv_lighter(accent, FOCUS_LIGHTEN_FACTOR), + &[text_on_accent], + floors.text, + ); + let accent_pressed = fill_under( + hsv_darker(accent, FOCUS_LIGHTEN_FACTOR), + &[text_on_accent], + floors.text, + ); + + // `[wcag]` D1: an accent wash carries the primary text, so it moves away + // from that text if the text falls short on it. + let wash = |fill: KdeColor| fill_under(fill, &[window_text], floors.text); + // `[Hp]` The item-view hover: Highlight over the view at the blend + // value. Also the subtle accent wash. + let surface_hover = wash(over(accent, BLEND, base)); + // `[Hp]` A pressed push button's fill: the button colour 30 % of the way + // to the highlight. + let surface_pressed = wash(mix(button, accent, BLEND)); + // The same two washes in the Active state's accent. An inactive + // window's text is lifted against both, so a text colour does not + // change when the window loses focus while the scheme's surfaces do not. + let (active_accent, _) = accent_of( + role(ColorState::Active, PaletteRole::Highlight), + role(ColorState::Active, PaletteRole::HighlightedText), + ); + let active_hover = wash(over(active_accent, BLEND, base)); + let active_pressed = wash(mix(button, active_accent, BLEND)); + + // Every opaque surface text is set on, the washes included. + let text_surfaces = [ + window, + base, + frame_background, + alternate, + button, + sunken, + surface_hover, + surface_pressed, + active_hover, + active_pressed, + ]; + + // ── Text ──────────────────────────────────────────────────────────── + // `[qt]` WindowText is the text of the window. The high-contrast + // projection lifts it to its 7:1. + let text_primary = if m.high_contrast { + lift(window_text, &text_surfaces, floors.text) + } else { + window_text + }; + // `[wcag]` D2: the window set's inactive foreground, lifted to the text + // floor on every surface. The high-contrast projection uses the primary + // text instead. + let text_secondary = if m.high_contrast { + text_primary + } else { + lift( + window_set.foreground(ForegroundRole::Inactive), + &text_surfaces, + floors.text, + ) + }; + + // `[qt]` Text is the view's text. The editor surfaces it is set on. + let editor_current_line = alternate; + // `[derived]` A code block sits half-way between the view and the + // window: a step below the view in a light scheme, above it in a dark + // one. + let editor_code_block = mix(base, window, 0.5); + let editor_surfaces = [base, editor_current_line, editor_code_block]; + let editor_fg = if m.high_contrast { + lift( + view.foreground(ForegroundRole::Normal), + &editor_surfaces, + floors.text, + ) + } else { + view.foreground(ForegroundRole::Normal) + }; + + // `[wcag]` D3: links on every text surface. + let link = |r: ForegroundRole| lift(view.foreground(r), &text_surfaces, floors.text); + // `[qt]` The view's link colours. KDE has no hovered-link colour: the + // active foreground, KDE's "hot" text, stands in for it. + let text_link = link(ForegroundRole::Link); + let text_link_visited = link(ForegroundRole::Visited); + let text_link_hover = link(ForegroundRole::Active); + + // `[wcag]` D4: each status colour on every text surface and on its own + // computed background (`[Hp]` the view's background tinted 30 % toward + // the foreground, KDE's negative, neutral, positive and active + // backgrounds). + let status = |fg: ForegroundRole, bg: BackgroundRole| { + let background = view.background(bg); + let mut on = text_surfaces.to_vec(); + on.push(background); + (lift(view.foreground(fg), &on, floors.text), background) + }; + let (error, error_bg) = status(ForegroundRole::Negative, BackgroundRole::Negative); + let (warning, warning_bg) = status(ForegroundRole::Neutral, BackgroundRole::Neutral); + let (success, success_bg) = status(ForegroundRole::Positive, BackgroundRole::Positive); + let (info, info_bg) = status(ForegroundRole::Active, BackgroundRole::Active); + // `[wcag]` D4 as a boundary: the status colours lifted to the non-text + // floor on the control surfaces. + let status_border = + |fg: ForegroundRole| lift(view.foreground(fg), &control_surfaces, floors.non_text); + let border_error = status_border(ForegroundRole::Negative); + let border_warning = status_border(ForegroundRole::Neutral); + + // ── Selection ─────────────────────────────────────────────────────── + // `[qt]` Highlight is the selection. `[wcag]` D1: the fill moves until + // the primary text Teksilo paints on it reaches the floor. + let selection_fill = |fill: KdeColor| fill_under(fill, &[text_primary, editor_fg], floors.text); + let surface_selected = selection_fill(highlight); + // `[qt]` The Inactive state's highlight: KDE tints the window colour 40 % + // toward the selection colour, the muted selection of a backdrop window. + let inactive_highlight = role(ColorState::Inactive, PaletteRole::Highlight); + let surface_selected_inactive = selection_fill(inactive_highlight); + let selection_text_active = text_on(highlighted_text, &[surface_selected], floors.text); + let selection_text_inactive = text_on( + role(ColorState::Inactive, PaletteRole::HighlightedText), + &[surface_selected_inactive], + floors.text, + ); + + // ── Borders and focus ─────────────────────────────────────────────── + // `[wcag]` D6: the frame outline lifted to the non-text floor where a + // boundary must be seen. + let border_strong = lift(frame_outline, &control_surfaces, floors.non_text); + // `[Hp]` The separator is the frame outline's colour. + let divider = frame_outline; + let divider_strong = border_strong; + // `[wcag]` D5: the view's focus decoration lifted to the non-text floor. + let focus_ring = lift(focus, &control_surfaces, floors.non_text); + + // ── Scroll bar ────────────────────────────────────────────────────── + // `[wcag]` D9: Breeze's thumbs lifted to the non-text floor on the window + // and the view. + let thumb_backdrops = [window, base]; + let scrollbar_thumb = lift( + over(window_text, THUMB_ALPHA, window), + &thumb_backdrops, + floors.non_text, + ); + let scrollbar_thumb_hover = lift( + over(hover, THUMB_HOVER_ALPHA, window), + &thumb_backdrops, + floors.non_text, + ); + + // ── Tooltip ───────────────────────────────────────────────────────── + let tooltip_bg = tooltip_set.background(BackgroundRole::Normal); + let tooltip_fg = tooltip_set.foreground(ForegroundRole::Normal); + let tooltip_text = if m.high_contrast { + lift(tooltip_fg, &[tooltip_bg], floors.text) + } else { + tooltip_fg + }; + // `[wcag]` D2: the tooltip's inactive text, the shortcut's. + let tooltip_shortcut = if m.high_contrast { + tooltip_text + } else { + lift( + tooltip_set.foreground(ForegroundRole::Inactive), + &[tooltip_bg], + floors.text, + ) + }; + + // ── Editor gutter ─────────────────────────────────────────────────── + // `[wcag]` D2: the view's inactive text, for line numbers. + let editor_gutter_fg = if m.high_contrast { + editor_fg + } else { + lift( + view.foreground(ForegroundRole::Inactive), + &editor_surfaces, + floors.text, + ) + }; + + let c = |k: KdeColor| k.to_color(); + ColorTokens { + // ── Surfaces ── + // `[qt]` Window: the window's background. + surface_main: c(window), + // `[qt]` Base: the background of views and fields. + surface_content: c(base), + // `[Hp]` The frame background. + surface_raised: c(frame_background), + surface_sunken: c(sunken), + surface_hover: c(surface_hover), + surface_pressed: c(surface_pressed), + surface_selected: c(surface_selected), + surface_selected_inactive: c(surface_selected_inactive), + // `[qt]` AlternateBase: alternate rows. + surface_alt_row: c(alternate), + // `[qt]` A disabled control: the Disabled state's Button. + surface_disabled: c(role(d, PaletteRole::Button)), + + // ── Text ── + text_primary: c(text_primary), + text_secondary: c(text_secondary), + // `[qt]` The Disabled state's WindowText. Disabled text is exempt + // from SC 1.4.3 and is not lifted. + text_disabled: c(role(d, PaletteRole::WindowText)), + text_on_accent: c(text_on_accent), + text_link: c(text_link), + text_link_hover: c(text_link_hover), + text_link_visited: c(text_link_visited), + text_error: c(error), + text_warning: c(warning), + text_success: c(success), + + // ── Accent ── + accent: c(accent), + accent_hover: c(accent_hover), + accent_pressed: c(accent_pressed), + // `[qt]` The Disabled state's Highlight. + accent_disabled: c(role(d, PaletteRole::Highlight)), + // `[Hp]` The item hover wash. + accent_subtle_bg: c(surface_hover), + + // ── Borders ── + // `[Hp]` The frame outline, as Breeze draws it. + border: c(frame_outline), + border_strong: c(border_strong), + // `[Hp]` Focus is shown in the focus decoration, lifted by D5. + border_focused: c(focus_ring), + border_error: c(border_error), + border_warning: c(border_warning), + // `[Hp]` The Disabled state's frame outline. + border_disabled: c(mix( + role(d, PaletteRole::Window), + role(d, PaletteRole::WindowText), + fc, + )), + divider: c(divider), + divider_strong: c(divider_strong), + + // ── Status ── + status_info_fg: c(info), + status_info_bg: c(info_bg), + status_success_fg: c(success), + status_success_bg: c(success_bg), + status_warning_fg: c(warning), + status_warning_bg: c(warning_bg), + status_error_fg: c(error), + status_error_bg: c(error_bg), + + // ── Selection ── + selection_bg_active: c(surface_selected), + selection_text_active: c(selection_text_active), + selection_bg_inactive: c(surface_selected_inactive), + selection_text_inactive: c(selection_text_inactive), + // Kept from Int UI: KDE has no find-match colour. + search_match_bg: kept.search_match_bg, + search_match_current_bg: kept.search_match_current_bg, + + // ── Scroll bar ── + // `[Hp]` Breeze paints no scroll-bar track, idle or hovered. + scrollbar_track: Color::TRANSPARENT, + scrollbar_track_hover: Color::TRANSPARENT, + scrollbar_thumb: c(scrollbar_thumb), + scrollbar_thumb_hover: c(scrollbar_thumb_hover), + // `[Hp]` Breeze has no pressed handle colour: a grabbed handle is + // under the pointer and stays the hovered one. + scrollbar_thumb_pressed: c(scrollbar_thumb_hover), + + // ── Tooltip ── + // `[qt]` ToolTipBase and ToolTipText. + tooltip_bg: c(tooltip_bg), + tooltip_text: c(tooltip_text), + // `[Hp]` The tooltip outline: its background moved toward its text + // by the frame contrast. + tooltip_border: c(mix(tooltip_bg, tooltip_fg, fc)), + tooltip_shortcut: c(tooltip_shortcut), + + // ── Editor ── + // `[qt]` Base and Text. + editor_bg: c(base), + editor_fg: c(editor_fg), + // `[qt]` Qt draws the text cursor in the text colour. + editor_caret: c(editor_fg), + // `[derived]` KDE has no current-line colour: the view's alternate + // background, its subtlest step. + editor_current_line_bg: c(editor_current_line), + editor_gutter_fg: c(editor_gutter_fg), + // `[qt]` The selection, D1's fill. + editor_selection_bg: c(surface_selected), + editor_code_block_bg: c(editor_code_block), + // `[derived]` KDE has no code register: the view's text. + editor_code_block_fg: c(editor_fg), + + // ── Misc ── + focus_ring: c(focus_ring), + // `[wcag]` D4: the negative colour as a boundary. + focus_ring_error: c(border_error), + // Kept from Int UI: KDE dims nothing behind a dialog. + scrim: kept.scrim, + + // ── Cross-design-language roles ── + // `[derived]` White on the error fill, unless it falls short; then + // D1's black-or-white rule. + text_on_error: c(text_on(KdeColor::WHITE, &[error], floors.text)), + text_on_error_container: c(error), + // `[Hp]` The view's negative background. + surface_error_container: c(error_bg), + // `[Hp]` A group box is drawn on the frame background. + surface_container: c(frame_background), + // `[derived]` One step above the frame background: the view's. + surface_container_raised: c(base), + surface_container_sunken: c(sunken), + + // Kept from Int UI: KDE has no data-visualisation sequence. + chart_palette: kept.chart_palette, + } +} + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_kde_scheme::KdeColorScheme; + + fn active(scheme: &KdeColorScheme) -> ColorTokens { + let palette = scheme.resolve(); + tokens(&Mapping { + palette: &palette, + state: ColorState::Active, + frame_contrast: scheme.frame_contrast, + high_contrast: false, + dark: scheme.is_dark(), + }) + } + + #[test] + fn d1_keeps_a_passing_vendor_text_and_otherwise_follows_plasmas_rule() { + let blue = KdeColor::rgb8(61, 174, 233); + // White on the Breeze highlight fails, black is Plasma's choice. + assert_eq!(text_on(KdeColor::WHITE, &[blue], 4.5), KdeColor::BLACK); + // A vendor text that already passes is kept. + let navy = KdeColor::rgb8(0, 0, 80); + assert_eq!(text_on(navy, &[blue], 4.5), navy); + // On a dark fill Plasma's rule is white. + let dark = KdeColor::rgb8(30, 60, 90); + assert_eq!(text_on(KdeColor::BLACK, &[dark], 4.5), KdeColor::WHITE); + } + + #[test] + fn the_high_contrast_accent_is_white_on_a_darkened_accent_in_a_light_scheme() { + let window = KdeColor::rgb8(239, 240, 241); + let (fill, text) = high_contrast_accent( + KdeColor::rgb8(61, 174, 233), + KdeColor::WHITE, + &[window, KdeColor::WHITE], + ENHANCED, + ); + assert_eq!(text, KdeColor::WHITE); + assert!(worst_contrast(text, &[fill]) >= 7.0); + assert!(worst_contrast(fill, &[window, KdeColor::WHITE]) >= 4.5); + } + + #[test] + fn the_high_contrast_accent_keeps_black_text_in_a_dark_scheme() { + let window = KdeColor::rgb8(32, 35, 38); + let (fill, text) = high_contrast_accent( + KdeColor::rgb8(61, 174, 233), + KdeColor::rgb8(252, 252, 252), + &[window, KdeColor::rgb8(20, 22, 24)], + ENHANCED, + ); + assert_eq!(text, KdeColor::BLACK); + assert!(worst_contrast(text, &[fill]) >= 7.0); + } + + #[test] + fn the_light_selection_carries_dark_text_unmoved_and_the_dark_one_darkens() { + let light = active(&KdeColorScheme::breeze_light()); + assert_eq!(light.surface_selected, light.accent); + let dark = active(&KdeColorScheme::breeze_dark()); + assert_ne!(dark.surface_selected, dark.accent); + assert!(dark.surface_selected.relative_luminance() < dark.accent.relative_luminance()); + assert!(composite_contrast(dark.text_primary, dark.surface_selected) >= 4.5); + } + + #[test] + fn the_recessed_surface_is_the_window_alternate_or_the_darkened_window() { + // Breeze Light's window alternate (227,229,231) is darker than its + // window; Breeze Dark's (41,44,48) is lighter, so it darkens. + let light = active(&KdeColorScheme::breeze_light()); + assert_eq!( + light.surface_sunken, + KdeColor::rgb8(227, 229, 231).to_color() + ); + let dark = active(&KdeColorScheme::breeze_dark()); + assert!(dark.surface_sunken.relative_luminance() < dark.surface_main.relative_luminance()); + } +} diff --git a/crates/teksilo-theme-kde/src/geometry.rs b/crates/teksilo-theme-kde/src/geometry.rs new file mode 100644 index 000000000..87cd8333e --- /dev/null +++ b/crates/teksilo-theme-kde/src/geometry.rs @@ -0,0 +1,387 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Breeze geometry: the widget style's metric constants, and the control +//! sizes they give for a font. +//! +//! Most Breeze control heights are not constants: the style adds fixed +//! margins to the height of a line of text, so a larger desktop font makes +//! larger controls. [`BreezeGeometry::for_line_height`] holds every such +//! height for a body line height `H` (18 px for Plasma's default Noto Sans +//! 10 pt, [`crate::typography::breeze_body_line_height`]). The rules are +//! exact at that default. At other sizes Qt measures some controls by a +//! text box that can be one to three pixels taller than `H`, so a rule can +//! fall short of what Qt reports by that much; Teksilo keeps the +//! deterministic rule, and the tests bound the difference. +//! +//! These are Breeze's own numbers, in logical pixels at the Compact +//! density. Where Teksilo raises a height for its touch target or +//! accessibility floors, the widget styles do it, on top of these. + +/// `[M]` The margin of a frame drawn around a control. +pub const FRAME_WIDTH: f32 = 2.0; +/// `[M]` The top-level layout margin, a dialog's content margin. +pub const LAYOUT_TOP_LEVEL_MARGIN: f32 = 10.0; +/// `[M]` The margin of a nested layout. +pub const LAYOUT_CHILD_MARGIN: f32 = 6.0; +/// `[M]` The spacing between the items of a layout. +pub const LAYOUT_SPACING: f32 = 6.0; +/// `[M]` The frame width of a line edit. +pub const LINE_EDIT_FRAME_WIDTH: f32 = 6.0; +/// `[M]` The frame width of a combo box. +pub const COMBO_BOX_FRAME_WIDTH: f32 = 6.0; +/// `[M]` The frame width of a spin box. +pub const SPIN_BOX_FRAME_WIDTH: f32 = 6.0; +/// `[M]` The width of a spin box's arrow column. +pub const SPIN_BOX_ARROW_BUTTON_WIDTH: f32 = 20.0; +/// `[M]` A push button's minimum width before its margins. +pub const BUTTON_MIN_WIDTH: f32 = 80.0; +/// `[M]` A push button's horizontal margin. +pub const BUTTON_MARGIN_WIDTH: f32 = 6.0; +/// `[M]` The spacing between a button's icon, text and menu arrow. +pub const BUTTON_ITEM_SPACING: f32 = 4.0; +/// `[M]` A tool button's margin. +pub const TOOL_BUTTON_MARGIN_WIDTH: f32 = 6.0; +/// `[M]` The width of a button's menu indicator. +pub const MENU_BUTTON_INDICATOR_WIDTH: f32 = 20.0; +/// `[M]` The check box and radio button indicator, square. +pub const CHECKBOX_SIZE: f32 = 20.0; +/// `[M]` The spacing between a check box indicator and its label. +pub const CHECKBOX_ITEM_SPACING: f32 = 4.0; +/// `[M]` The margin a check box's focus frame takes. +pub const CHECKBOX_FOCUS_MARGIN: f32 = 2.0; +/// `[M]` The margin around a menu item, horizontally and vertically. +pub const MENU_ITEM_MARGIN: f32 = 4.0; +/// `[M]` How far a menu item's text starts from its contents' leading edge. +pub const MENU_ITEM_TEXT_LEFT_MARGIN: f32 = 8.0; +/// `[M]` The extra leading margin of a menu without an icon column. +pub const MENU_ITEM_EXTRA_LEFT_MARGIN: f32 = 4.0; +/// `[M]` The gap before a menu item's shortcut. +pub const MENU_ITEM_ACCELERATOR_SPACE: f32 = 16.0; +/// `[M]` A menu bar item's horizontal margin. +pub const MENU_BAR_ITEM_MARGIN_WIDTH: f32 = 10.0; +/// `[M]` A menu bar item's vertical margin. +pub const MENU_BAR_ITEM_MARGIN_HEIGHT: f32 = 6.0; +/// `[M]` The scroll bar's extent, including its 1 px separator line. +pub const SCROLL_BAR_EXTENT: f32 = 21.0; +/// `[M]` The width of the scroll bar's handle. +pub const SCROLL_BAR_HANDLE_WIDTH: f32 = 8.0; +/// `[M]` The shortest the scroll bar's handle gets. +pub const SCROLL_BAR_MIN_HANDLE_LENGTH: f32 = 20.0; +/// `[M]` The thickness of the progress bar's groove. +pub const PROGRESS_BAR_THICKNESS: f32 = 6.0; +/// `[M]` The progress bar's busy indicator size. +pub const PROGRESS_BAR_BUSY_INDICATOR_SIZE: f32 = 14.0; +/// `[Hp]` The period of the busy progress bar's stripes. +pub const PROGRESS_BAR_BUSY_PERIOD: f32 = 28.0; +/// `[M]` The thickness of a slider's groove. +pub const SLIDER_GROOVE_THICKNESS: f32 = 6.0; +/// `[M]` The thickness of a slider, the size of its handle box. +pub const SLIDER_CONTROL_THICKNESS: f32 = 20.0; +/// `[M]` The length of a slider's tick mark. +pub const SLIDER_TICK_LENGTH: f32 = 8.0; +/// `[M]` The gap between a slider's groove and its tick marks. +pub const SLIDER_TICK_MARGIN: f32 = 2.0; +/// `[Hp]` The diameter a slider handle is painted at: the handle box inset +/// by one, then stroked. +pub const SLIDER_HANDLE_PAINTED: f32 = 17.0; +/// `[M]` A tab's vertical margin. +pub const TAB_MARGIN_HEIGHT: f32 = 4.0; +/// `[M]` A tab's horizontal margin. +pub const TAB_MARGIN_WIDTH: f32 = 8.0; +/// `[M]` A tab's minimum width. +pub const TAB_MIN_WIDTH: f32 = 80.0; +/// `[M]` A tab's minimum height. +pub const TAB_MIN_HEIGHT: f32 = 30.0; +/// `[M]` A static tab's minimum height (document mode, not closable, not +/// movable, expanding or vertical). +pub const STATIC_TAB_MIN_HEIGHT: f32 = 34.0; +/// `[M]` The spacing between a tab's icon, text and buttons. +pub const TAB_ITEM_SPACING: f32 = 8.0; +/// `[M]` The thickness of the active tab's Highlight bar. +pub const TAB_ACTIVE_INDICATOR: f32 = 3.0; +/// `[M]` The margin of a table or tree header section. +pub const HEADER_MARGIN: f32 = 6.0; +/// `[M]` The size of a header's sort arrow. +pub const HEADER_ARROW_SIZE: f32 = 10.0; +/// `[M]` The size of an arrow (chevron). +pub const ARROW_SIZE: f32 = 10.0; +/// `[M]` An item-view item's left and right margins. +pub const ITEM_VIEW_MARGIN_WIDTH: f32 = 2.0; +/// `[M]` An item-view item's top and bottom margins. +pub const ITEM_VIEW_MARGIN_HEIGHT: f32 = 1.0; +/// `[M]` The extra top margin of an item view's first row. +pub const ITEM_VIEW_FIRST_ITEM_TOP_MARGIN: f32 = 2.0; +/// `[M]` An item-view item's padding, horizontally and vertically. +pub const ITEM_VIEW_PADDING: f32 = 2.0; +/// `[M]` The tooltip's frame width; Qt adds one more pixel of padding. +pub const TOOLTIP_FRAME_WIDTH: f32 = 3.0; +/// `[M]` The splitter handle's visual width. +pub const SPLITTER_WIDTH: f32 = 1.0; +/// `[M]` A group box title's margin. +pub const GROUP_BOX_TITLE_MARGIN: f32 = 4.0; +/// `[K]` The small icon size, used by buttons, menus and rows. +pub const SMALL_ICON_SIZE: f32 = 16.0; +/// `[K]` The small-medium icon size, used by larger tool buttons. +pub const SMALL_MEDIUM_ICON_SIZE: f32 = 22.0; + +/// Every Breeze control height that follows the font, for one body line +/// height. +/// +/// Built by [`BreezeGeometry::for_line_height`]. The values are in logical +/// pixels at the Compact density, and each field says the rule it comes +/// from; `H` is the line height and icons are [`SMALL_ICON_SIZE`] unless a +/// field says otherwise. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeGeometry { + /// `H`, the body line height everything below is derived from. + pub line_height: f32, + /// `[S]` A push button with text: `H + 2 x 6 + 2 x 2`. 34 at H = 18. + pub push_button_height: f32, + /// `[S]` A push button's minimum width: `max(content + 12, 80) + 4`. + pub push_button_min_width: f32, + /// `[S]` A push button with only an icon: `I + 16`. 32 with a 16 px + /// icon. + pub icon_button_height: f32, + /// `[measured-qt]` The width of that icon-only button: 31. + pub icon_button_width: f32, + /// `[S]` A tool button without a frame (auto-raise): the icon plus 12. + /// 28 with a 16 px icon. + pub tool_button_height: f32, + /// `[S]` The same with a 22 px icon: 34. + pub tool_button_height_medium: f32, + /// `[S]` A tool button with a frame: the icon plus 16. 32 with a 16 px + /// icon. + pub framed_tool_button_height: f32, + /// `[S]` The same with a 22 px icon: 38. + pub framed_tool_button_height_medium: f32, + /// `[S]` `[qt]` A line edit: Qt's inner height `max(H, 14) + 2`, plus + /// the 6 px frame on each side. 32 at H = 18. + pub line_edit_height: f32, + /// `[S]` A combo box: `max(H, 20) + 2 x 6`. 32 at H = 18. + pub combo_box_height: f32, + /// `[S]` A spin box: the line edit's inner height plus its frame, at + /// least 20. 32 at H = 18. + pub spin_box_height: f32, + /// `[S]` A check box or radio button row: `max(H + 2 x 2, 20)`. 22 at + /// H = 18. + pub check_row_height: f32, + /// `[qt]` `[measured-qt]` A progress bar: Qt's hint, `H + 8`. 26 at + /// H = 18. + pub progress_bar_height: f32, + /// `[S]` A menu item: `max(H, 20, icon) + 1 + 2 x 4`. 29 at H = 18. + pub menu_item_height: f32, + /// `[S]` A menu section (a separator with a title): `max(H, 20, icon) + /// + 4 + 4`. 28 at H = 18. + pub menu_section_height: f32, + /// `[S]` A menu separator: `1 + 4`. + pub menu_separator_height: f32, + /// `[S]` A menu bar item: `H + 2 x 6`. 30 at H = 18. + pub menu_bar_item_height: f32, + /// `[S]` A tab: `max(H + 2 x 4, 30)`. 30 at H = 18. + pub tab_height: f32, + /// `[S]` A static tab: `max(H + 2 x 4, 34)`. 34 at H = 18. + pub static_tab_height: f32, + /// `[S]` A header section with a sort arrow: `max(H, 10) + 2 x 6`. 30 + /// at H = 18. + pub header_height: f32, + /// `[S]` A header section with an icon: `max(H, 22) + 2 x 6`. + pub header_height_with_icon: f32, + /// `[S]` A list or tree row of text: `H + 1 + 1 + 2 x 2`. 24 at H = 18. + pub list_row_height: f32, + /// `[measured-qt]` A row with a 16 px icon: `max(H, 16) + 2 + 1 + 1 + + /// 2 x 2` (Qt adds 2 for a decoration). 26 at H = 18. + pub list_row_height_with_icon: f32, + /// `[measured-qt]` A row with a check box: `max(H, 20) + 1 + 1 + 2 x 2`. + /// 26 at H = 18. + pub list_row_height_with_check: f32, + /// `[S]` The first row of a view without a frame is one taller: its top + /// margin is 2, not 1. + pub first_row_extra: f32, + /// `[measured-qt]` A table row: `H + 2 x (1 + 1)`, plus the 1 px grid + /// line the table view adds. 23 at H = 18. + pub table_row_height: f32, + /// `[measured-qt]` A one-line tooltip: `H` inside a 4 px inset. 26 at + /// H = 18. + pub tooltip_height: f32, + /// `[measured-qt]` The tooltip's content inset on every side: the 3 px + /// frame and Qt's 1. + pub tooltip_padding: f32, +} + +impl BreezeGeometry { + /// Every font-driven height for a body line height of `h` pixels. + pub fn for_line_height(h: f32) -> BreezeGeometry { + let icon = SMALL_ICON_SIZE; + let line_edit_inner = h.max(14.0) + 2.0; + BreezeGeometry { + line_height: h, + push_button_height: h + 2.0 * BUTTON_MARGIN_WIDTH + 2.0 * FRAME_WIDTH, + push_button_min_width: BUTTON_MIN_WIDTH + 2.0 * FRAME_WIDTH, + icon_button_height: icon + 2.0 * BUTTON_MARGIN_WIDTH + 2.0 * FRAME_WIDTH, + icon_button_width: 31.0, + tool_button_height: icon + 2.0 * TOOL_BUTTON_MARGIN_WIDTH, + tool_button_height_medium: SMALL_MEDIUM_ICON_SIZE + 2.0 * TOOL_BUTTON_MARGIN_WIDTH, + framed_tool_button_height: icon + 2.0 * TOOL_BUTTON_MARGIN_WIDTH + 2.0 * FRAME_WIDTH, + framed_tool_button_height_medium: SMALL_MEDIUM_ICON_SIZE + + 2.0 * TOOL_BUTTON_MARGIN_WIDTH + + 2.0 * FRAME_WIDTH, + line_edit_height: line_edit_inner + 2.0 * LINE_EDIT_FRAME_WIDTH, + combo_box_height: h.max(20.0) + 2.0 * COMBO_BOX_FRAME_WIDTH, + spin_box_height: (line_edit_inner + 2.0 * SPIN_BOX_FRAME_WIDTH).max(20.0), + check_row_height: (h + 2.0 * CHECKBOX_FOCUS_MARGIN).max(CHECKBOX_SIZE), + progress_bar_height: h + 8.0, + menu_item_height: h.max(20.0).max(icon) + 1.0 + 2.0 * MENU_ITEM_MARGIN, + menu_section_height: h.max(20.0).max(icon) + 2.0 * MENU_ITEM_MARGIN, + menu_separator_height: 1.0 + MENU_ITEM_MARGIN, + menu_bar_item_height: h + 2.0 * MENU_BAR_ITEM_MARGIN_HEIGHT, + tab_height: (h + 2.0 * TAB_MARGIN_HEIGHT).max(TAB_MIN_HEIGHT), + static_tab_height: (h + 2.0 * TAB_MARGIN_HEIGHT).max(STATIC_TAB_MIN_HEIGHT), + header_height: h.max(HEADER_ARROW_SIZE) + 2.0 * HEADER_MARGIN, + header_height_with_icon: h.max(SMALL_MEDIUM_ICON_SIZE) + 2.0 * HEADER_MARGIN, + list_row_height: h + 2.0 * ITEM_VIEW_MARGIN_HEIGHT + 2.0 * ITEM_VIEW_PADDING, + list_row_height_with_icon: h.max(icon) + + 2.0 + + 2.0 * ITEM_VIEW_MARGIN_HEIGHT + + 2.0 * ITEM_VIEW_PADDING, + list_row_height_with_check: h.max(CHECKBOX_SIZE) + + 2.0 * ITEM_VIEW_MARGIN_HEIGHT + + 2.0 * ITEM_VIEW_PADDING, + first_row_extra: ITEM_VIEW_FIRST_ITEM_TOP_MARGIN - ITEM_VIEW_MARGIN_HEIGHT, + table_row_height: h + 2.0 * (ITEM_VIEW_MARGIN_HEIGHT + 1.0) + 1.0, + tooltip_height: h + 2.0 * (TOOLTIP_FRAME_WIDTH + 1.0), + tooltip_padding: TOOLTIP_FRAME_WIDTH + 1.0, + } + } + + /// The geometry of Plasma's default fonts, `H` = 18. + pub fn breeze_default() -> BreezeGeometry { + BreezeGeometry::for_line_height(crate::typography::breeze_body_line_height()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::typography::{NOTO_SANS_METRICS, face_px, qt_line_height}; + + #[test] + fn the_default_font_gives_the_breeze_sizes() { + let g = BreezeGeometry::breeze_default(); + assert_eq!(g.line_height, 18.0); + assert_eq!(g.push_button_height, 34.0); + assert_eq!(g.push_button_min_width, 84.0); + assert_eq!(g.icon_button_height, 32.0); + assert_eq!(g.icon_button_width, 31.0); + assert_eq!(g.tool_button_height, 28.0); + assert_eq!(g.tool_button_height_medium, 34.0); + assert_eq!(g.framed_tool_button_height, 32.0); + assert_eq!(g.framed_tool_button_height_medium, 38.0); + assert_eq!(g.line_edit_height, 32.0); + assert_eq!(g.combo_box_height, 32.0); + assert_eq!(g.spin_box_height, 32.0); + assert_eq!(g.check_row_height, 22.0); + assert_eq!(g.progress_bar_height, 26.0); + assert_eq!(g.menu_item_height, 29.0); + assert_eq!(g.menu_section_height, 28.0); + assert_eq!(g.menu_separator_height, 5.0); + assert_eq!(g.menu_bar_item_height, 30.0); + assert_eq!(g.tab_height, 30.0); + assert_eq!(g.static_tab_height, 34.0); + assert_eq!(g.header_height, 30.0); + assert_eq!(g.list_row_height, 24.0); + assert_eq!(g.list_row_height_with_icon, 26.0); + assert_eq!(g.list_row_height_with_check, 26.0); + assert_eq!(g.list_row_height + g.first_row_extra, 25.0); + assert_eq!(g.table_row_height, 23.0); + assert_eq!(g.tooltip_height, 26.0); + assert_eq!(g.tooltip_padding, 4.0); + } + + /// The heights Qt reported for Plasma's Breeze at each font size: push + /// button, line edit, combo box, spin box, check box row, menu item, + /// menu section, tab, header, list row, list row with an icon, table + /// row (with its grid line) and progress bar. + const MEASURED: [(f32, [f32; 13]); 6] = [ + ( + 8.0, + [ + 32., 29., 32., 29., 20., 29., 28., 30., 27., 21., 24., 20., 23., + ], + ), + ( + 9.0, + [ + 34., 31., 32., 31., 21., 29., 28., 30., 29., 23., 25., 22., 25., + ], + ), + ( + 10.0, + [ + 34., 32., 32., 32., 22., 29., 28., 30., 30., 24., 26., 23., 26., + ], + ), + ( + 11.0, + [ + 38., 34., 35., 34., 25., 30., 28., 30., 33., 27., 29., 26., 28., + ], + ), + ( + 12.0, + [ + 38., 36., 36., 36., 26., 31., 30., 30., 34., 28., 30., 27., 30., + ], + ), + ( + 14.0, + [ + 42., 40., 40., 40., 30., 35., 34., 34., 38., 32., 34., 31., 34., + ], + ), + ]; + + fn rules(g: &BreezeGeometry) -> [f32; 13] { + [ + g.push_button_height, + g.line_edit_height, + g.combo_box_height, + g.spin_box_height, + g.check_row_height, + g.menu_item_height, + g.menu_section_height, + g.tab_height, + g.header_height, + g.list_row_height, + g.list_row_height_with_icon, + g.table_row_height, + g.progress_bar_height, + ] + } + + #[test] + fn the_rules_are_exact_at_ten_points_and_never_more_than_three_pixels_short() { + for (pt, measured) in MEASURED { + let h = qt_line_height(face_px(pt), NOTO_SANS_METRICS) as f32; + let derived = rules(&BreezeGeometry::for_line_height(h)); + for (i, (rule, qt)) in derived.iter().zip(measured).enumerate() { + if pt == 10.0 { + assert_eq!(*rule, qt, "column {i} at {pt} pt"); + } + assert!( + *rule <= qt && qt - *rule <= 3.0, + "column {i} at {pt} pt: the rule gives {rule}, Qt {qt}" + ); + } + } + } + + #[test] + fn a_larger_font_never_makes_a_control_smaller() { + let small = rules(&BreezeGeometry::for_line_height(15.0)); + let large = rules(&BreezeGeometry::for_line_height(26.0)); + for (a, b) in small.iter().zip(large) { + assert!(b >= *a); + } + } +} diff --git a/crates/teksilo-theme-kde/src/lib.rs b/crates/teksilo-theme-kde/src/lib.rs new file mode 100644 index 000000000..2f602328f --- /dev/null +++ b/crates/teksilo-theme-kde/src/lib.rs @@ -0,0 +1,1136 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! KDE Plasma theme preset for Teksilo: the Breeze design language. +//! +//! The colours come from a KDE colour scheme, the stock Breeze Light or +//! Breeze Dark or any other, read and resolved by [`scheme`] +//! (`teksilo-kde-scheme`) exactly as KDE resolves it, including Plasma's +//! accent colours. The geometry, typography and motion are Breeze's, as +//! Plasma 6.8 ships it ([`BREEZE_VERSION`]). +//! +//! ``` +//! use teksilo_theme_kde::{self as kde, PlasmaAccent}; +//! +//! let light = kde::light(); +//! let dark = kde::dark(); +//! let purple = kde::light_with_accent(PlasmaAccent::Purple.color()); +//! assert_eq!(light.id.as_str(), "kde.light"); +//! assert_eq!(dark.id.as_str(), "kde.dark"); +//! assert_ne!(purple.colors.accent, light.colors.accent); +//! ``` +//! +//! A scheme of the user's own, read from its `.colors` file, gives its own +//! theme, light or dark as KDE judges it: +//! +//! ``` +//! use teksilo_theme_kde::{self as kde, scheme::KdeColorScheme}; +//! +//! let scheme = KdeColorScheme::breeze_dark(); +//! let theme = kde::from_scheme(&scheme); +//! assert!(theme.is_dark()); +//! ``` +//! +//! ## What makes it read as Breeze +//! +//! - **One radius.** Controls and floating surfaces share Breeze's 5 px +//! frame radius (4.5 where a 1 px outline is stroked), between Fluent's 4 +//! and macOS's 6 and 10. +//! - **Breeze's outline colours.** A Breeze control is outlined in the +//! window colour moved a fifth of the way to the text (the frame +//! contrast), the `border` token. The highlight-based outlines Breeze +//! turns to under the pointer or keyboard focus are in [`BreezeColors`]; +//! the recipe styles this version keeps draw the plain outline only. +//! - **Breeze's focus ring geometry.** Keyboard focus is a 2 px band, half +//! inside the control and half outside, in the scheme's focus colour. +//! Breeze paints it at 30 % ([`shape::BREEZE_FOCUS_RING_ALPHA`]); the +//! `focus_ring` token is opaque, lifted to 3:1, and the recipe styles +//! draw it as it is. +//! - **Linear, quick motion.** Style transitions run 100 ms, linearly. +//! - **Text-driven heights.** A push button is the text line plus 16 px, a +//! field the line plus 14: 34 and 32 px at Plasma's default font, and +//! they grow with it ([`geometry`]). +//! +//! ## Accent colour +//! +//! [`light_with_accent`] and [`dark_with_accent`] apply an accent the way +//! Plasma's colour settings apply it to the stock scheme: links, focus and +//! hover take the accent (a link darkened or lightened once when it would be +//! hard to read), and the selection becomes the accent at 70 % over the +//! view with black or white text. So even Breeze's own blue, +//! [`PlasmaAccent::Blue`], gives a lighter selection than [`light`], as it +//! does on a Plasma desktop. [`PlasmaAccent`] lists the ten swatches Plasma +//! offers. +//! +//! ## Colours and WCAG +//! +//! KDE never adjusts a colour for readability, and some stock Breeze colours +//! fall short of WCAG 2.x (the light theme's secondary text, links, status +//! colours, focus colour, frame outlines, scroll-bar thumb and selection +//! text). The theme's colour tokens lift each of them by rule, for any +//! scheme, keeping its hue; the [`KdePalette`] extension keeps the scheme's +//! own colours. The rules, the inactive-window and high-contrast colours and +//! the tokens kept from Int UI are listed in the colour mapping's +//! documentation (the private `color` module); every lift is tested to pass +//! and its premise, that the scheme's colour fails, is tested too. +//! +//! An inactive window paints the scheme's Inactive colours: for Breeze, a +//! selection and accent muted to the window colour tinted toward the +//! selection colour, as Plasma paints a backdrop window, with the focus ring +//! unchanged. Under the OS high-contrast preference the theme paints its own +//! high-contrast colours, with 7:1 text and 4.5:1 boundaries. +//! +//! ## Trademarks +//! +//! KDE® and the K Desktop Environment® logo are registered trademarks of +//! KDE e.V. This preset is not affiliated with, endorsed by or sponsored by +//! KDE e.V.; the names KDE, Plasma and Breeze are used only to say which +//! design language it reproduces. It contains no KDE code, artwork, icon or +//! font. See `NOTICE` and `TRADEMARKS.md` in the Teksilo repository. +//! +//! ## Known limitations +//! +//! - **Widget chrome is the framework's.** This version installs no Breeze +//! widget styles: every widget keeps Teksilo's recipe style, painted in +//! the Breeze colours, radii, focus ring, typography and motion. +//! - **The fonts are not Plasma's.** The text sizes and line boxes are Noto +//! Sans and Hack's at Plasma's default sizes, drawn in Teksilo's bundled +//! Inter and JetBrains Mono. +//! - **The high-contrast selection is light on a light window.** Under the +//! OS high-contrast preference the selection fill carries the window's +//! text at 7:1, which keeps it below 4.5:1 on the window (about 1.9:1 for +//! Breeze Light, 2.2:1 for Breeze Dark): no colour reaches both. +//! - **Widget shapes are chosen at build time.** Switching between this and +//! another preset at runtime re-tints instantly but keeps the shapes the +//! tree was built with, a property of the styling system. + +mod color; +pub mod geometry; +pub mod motion; +pub mod palette; +pub mod shape; +pub mod typography; + +pub use palette::{BreezeColors, KdePalette, PlasmaAccent, UnknownPlasmaAccent}; +pub use teksilo_kde_scheme as scheme; + +use teksilo_core::presets::intui; +use teksilo_core::styles::{DensityProjection, PaintProjection, PaintState, Theme}; +use teksilo_kde_scheme::KdeColorScheme; +use teksilo_tokens::{Color, InputTokens, LayoutTokens, TargetDensity}; + +/// The Plasma release whose Breeze style this preset transcribes. +pub const BREEZE_VERSION: &str = "6.8.0"; + +/// `[M]` The spacing between sibling controls: Breeze's layout spacing. +pub const BREEZE_CONTROL_GAP: f32 = 6.0; +/// `[K]` The spacing between sections: Kirigami's large spacing. +pub const BREEZE_SECTION_GAP: f32 = 8.0; + +/// **Breeze Light**, Plasma's default scheme. +pub fn light() -> Theme { + from_scheme(&KdeColorScheme::breeze_light()) +} + +/// **Breeze Dark**. +pub fn dark() -> Theme { + from_scheme(&KdeColorScheme::breeze_dark()) +} + +/// Breeze Light with `accent` applied as Plasma's colour settings apply it. +/// +/// ``` +/// use teksilo_theme_kde::{self as kde, PlasmaAccent}; +/// let theme = kde::light_with_accent(PlasmaAccent::Green.color()); +/// assert!(!theme.is_dark()); +/// ``` +pub fn light_with_accent(accent: Color) -> Theme { + from_scheme(&KdeColorScheme::breeze_light().with_accent(accent)) +} + +/// Breeze Dark with `accent` applied as Plasma's colour settings apply it. +pub fn dark_with_accent(accent: Color) -> Theme { + from_scheme(&KdeColorScheme::breeze_dark().with_accent(accent)) +} + +/// The Breeze theme of any KDE colour scheme. +/// +/// Light or dark, and the id `kde.light` or `kde.dark`, as KDE judges the +/// scheme ([`KdeColorScheme::is_dark`]). The scheme's colours, frame +/// contrast and inactive and disabled effects all come through; geometry, +/// typography and motion are Breeze's. +pub fn from_scheme(scheme: &KdeColorScheme) -> Theme { + build(KdePalette::from_scheme(scheme)) +} + +fn build(palette: KdePalette) -> Theme { + // Starting from Int UI keeps the input tokens, the density ladder, at + // the framework's Compact baseline; every other token group is replaced. + let mut theme = if palette.is_dark() { + intui::dark().with_id("kde.dark") + } else { + intui::light().with_id("kde.light") + }; + theme.colors = palette.tokens(ACTIVE).clone(); + theme.layout = LayoutTokens { + control_gap: BREEZE_CONTROL_GAP, + section_gap: BREEZE_SECTION_GAP, + }; + theme.typography = typography::breeze_typography(); + theme.shape = shape::breeze_shape(); + theme.motion = motion::breeze_motion(); + theme.extensions.insert(palette); + install_styles(&mut theme); + theme.extensions.insert(DensityProjection(reproject)); + theme.extensions.insert(PaintProjection(project)); + theme +} + +/// The paint state of an active window without the high-contrast +/// preference. +const ACTIVE: PaintState = PaintState { + window_active: true, + high_contrast: false, +}; + +/// Re-derive a Breeze theme for another density. +/// +/// Registered as the theme's [`DensityProjection`]. `[unpublished]` KDE +/// publishes no touch ladder, so the input tokens are the framework's +/// generic [`InputTokens::for_density`] ladder; colours, id, the +/// [`KdePalette`] and both projections ride across untouched, and the +/// slots this preset installs are rebuilt for the new tokens. +fn reproject(base: &Theme, density: TargetDensity) -> Theme { + let mut theme = base.clone(); + theme.input = InputTokens::for_density(density); + install_styles(&mut theme); + theme +} + +/// Re-colour a Breeze theme for a window state and the high-contrast +/// preference. +/// +/// Registered as the theme's [`PaintProjection`]. While the theme's colours +/// are still the active tokens of its [`KdePalette`], the state's own tokens +/// are painted ([`KdePalette::tokens`]). A theme whose colours an app has +/// changed since, or one without the palette, gets the framework's generic +/// inactive and high-contrast projection of its own colours instead, so a +/// change the app made is never painted over. +fn project(theme: &Theme, state: PaintState) -> Theme { + if state == ACTIVE { + return theme.clone(); + } + match theme.extension::() { + Some(palette) if theme.colors == *palette.tokens(ACTIVE) => Theme { + colors: palette.tokens(state).clone(), + ..theme.clone() + }, + _ => { + let mut colors = theme.colors.clone(); + if !state.window_active { + colors = colors.for_inactive_window(); + } + if state.high_contrast { + colors = colors.for_high_contrast(); + } + Theme { + colors, + ..theme.clone() + } + } + } +} + +/// Install the Breeze Tier-3 chrome. +/// +/// This version installs none: every slot is left to the widget's recipe +/// style, which paints from the Breeze tokens, and the crate's tests list +/// the reason for each slot. Every slot this installs reads its metrics +/// from `theme.input`, so [`reproject`] can rerun it alone. +fn install_styles(_theme: &mut Theme) {} + +#[cfg(test)] +mod tests { + use super::*; + use std::collections::BTreeSet; + use std::path::Path; + use std::time::Duration; + use teksilo_core::styles::{ComponentStyleSlots, ThemeAppearance}; + use teksilo_kde_scheme::math::{hsv_darker, hsv_lighter, mix}; + use teksilo_kde_scheme::{ + BackgroundRole, ColorSet, ColorState, DecorationRole, ForegroundRole, KdeColor, PaletteRole, + }; + use teksilo_tokens::contrast::composite_contrast; + use teksilo_tokens::{ColorTokens, Easing}; + + /// Whether two themes are the same by content. + /// + /// `Theme`'s own equality compares style slots by pointer and extensions + /// by type only, so it cannot tell two independently built themes + /// apart. The destructuring has no `..`: a field added to `Theme` must + /// be compared here before this compiles. + fn assert_same_theme(a: &Theme, b: &Theme) { + let Theme { + id, + appearance, + colors, + layout, + typography, + shape, + motion, + input, + style_slots, + extensions, + } = a; + assert_eq!(*id, b.id, "id"); + assert_eq!(*appearance, b.appearance, "appearance"); + assert_eq!(*colors, b.colors, "colors"); + assert_eq!(*layout, b.layout, "layout"); + assert_eq!(*typography, b.typography, "typography"); + assert_eq!(*shape, b.shape, "shape"); + assert_eq!(*motion, b.motion, "motion"); + assert_eq!(*input, b.input, "input"); + assert_eq!( + style_slots.installed(), + b.style_slots.installed(), + "installed slots" + ); + assert_eq!( + extensions.get::(), + b.extension::(), + "KDE palette" + ); + } + + fn paint(theme: &Theme, window_active: bool, high_contrast: bool) -> Theme { + theme.for_paint_state(PaintState { + window_active, + high_contrast, + }) + } + + fn hex8(c: Color) -> [u8; 4] { + KdeColor::from_color(c).to_rgba8() + } + + #[test] + fn light_reports_light_appearance() { + assert_eq!(light().appearance, ThemeAppearance::Light); + assert!(!light().is_dark()); + } + + #[test] + fn dark_reports_dark_appearance() { + assert_eq!(dark().appearance, ThemeAppearance::Dark); + assert!(dark().is_dark()); + } + + #[test] + fn ids_are_namespaced_and_follow_the_appearance() { + assert_eq!(light().id.as_str(), "kde.light"); + assert_eq!(dark().id.as_str(), "kde.dark"); + // The widget catalog persists themes by this id. + assert_eq!( + light_with_accent(PlasmaAccent::Red.color()).id.as_str(), + "kde.light" + ); + assert_eq!( + dark_with_accent(PlasmaAccent::Red.color()).id.as_str(), + "kde.dark" + ); + assert_eq!( + from_scheme(&KdeColorScheme::breeze_classic()).id.as_str(), + "kde.light" + ); + } + + #[test] + fn from_scheme_of_breeze_light_is_light() { + assert_same_theme(&from_scheme(&KdeColorScheme::breeze_light()), &light()); + assert_same_theme(&from_scheme(&KdeColorScheme::breeze_dark()), &dark()); + } + + #[test] + fn breezes_own_blue_as_an_accent_still_changes_the_colours() { + // Plasma's accent application blends the selection from the accent + // over the view, so applying Breeze's own blue lightens it. + let accented = light_with_accent(Color::from_hex("#3daee9")); + let base = light(); + assert_ne!(accented.colors, base.colors); + assert_eq!(hex8(accented.colors.accent), [119, 198, 239, 255]); + assert_eq!(hex8(base.colors.accent), [61, 174, 233, 255]); + // Everything that is not a colour is the same. + let Theme { + id, + appearance, + layout, + typography, + shape, + motion, + input, + .. + } = &accented; + assert_eq!(*id, base.id); + assert_eq!(*appearance, base.appearance); + assert_eq!(*layout, base.layout); + assert_eq!(*typography, base.typography); + assert_eq!(*shape, base.shape); + assert_eq!(*motion, base.motion); + assert_eq!(*input, base.input); + } + + #[test] + fn surfaces_are_the_breeze_window_backgrounds() { + assert_eq!(hex8(light().colors.surface_main), [239, 240, 241, 255]); + assert_eq!(hex8(dark().colors.surface_main), [32, 35, 38, 255]); + assert_eq!(hex8(light().colors.surface_content), [255, 255, 255, 255]); + assert_eq!(hex8(dark().colors.surface_content), [20, 22, 24, 255]); + } + + #[test] + fn the_accent_is_the_highlight_with_plasmas_black_text() { + for t in [light(), dark()] { + assert_eq!(hex8(t.colors.accent), [61, 174, 233, 255]); + assert_eq!(t.colors.text_on_accent, Color::BLACK); + } + } + + #[test] + fn geometry_is_the_breeze_frame_radius_and_ring() { + for t in [light(), dark()] { + assert_eq!(t.shape.radius_control, 5.0); + assert_eq!(t.shape.radius_popup, 5.0); + assert_eq!(t.shape.focus_ring_width, 2.0); + assert_eq!(t.shape.focus_ring_offset, -1.0); + assert_eq!(t.layout.control_gap, 6.0); + assert_eq!(t.layout.section_gap, 8.0); + } + } + + #[test] + fn body_is_qts_thirteen_pixel_face_on_an_eighteen_pixel_line() { + let t = light(); + assert_eq!(t.typography.body.size, 13.0); + assert!((t.typography.body.size * t.typography.body.line_height - 18.0).abs() < 1e-4); + assert_eq!(t.typography.body.letter_spacing, 0.0); + } + + #[test] + fn motion_is_breezes_linear_hundred_milliseconds() { + for t in [light(), dark()] { + assert_eq!(t.motion.duration_fast, Duration::from_millis(100)); + assert_eq!(t.motion.duration_normal, Duration::from_millis(200)); + assert_eq!(t.motion.easing_standard, Easing::Linear); + } + } + + #[test] + fn the_palette_extension_is_present_and_matches_the_appearance() { + let l = light(); + let d = dark(); + let lp = l.extension::().expect("light palette"); + let dp = d.extension::().expect("dark palette"); + assert!(!lp.is_dark()); + assert!(dp.is_dark()); + assert_eq!( + lp.role(ColorState::Active, PaletteRole::Window), + l.colors.surface_main + ); + assert!((lp.frame_contrast() - 0.2).abs() < 1e-12); + } + + /// Every slot this commit leaves to the widget's own recipe style, with + /// the reason it is inherited rather than filled. + const KDE_UNFILLED: &[(&str, &str)] = &[ + ( + "button", + "no Breeze push-button frame is installed; the recipe button paints from the Breeze accent, surface and border tokens", + ), + ( + "split_button", + "no Breeze split-button frame is installed; the recipe frame paints from the Breeze surface and border roles", + ), + ( + "splitter", + "the recipe's thin divider in the border role reads as Breeze's 1 px splitter handle", + ), + ( + "icon_button", + "no Breeze tool-button frame is installed; the recipe paints its hover and press from the Breeze surface tokens", + ), + ( + "toggle", + "no Breeze switch is installed; the recipe switch reads the Breeze accent and border tokens", + ), + ( + "checkbox", + "no Breeze check box is installed; the recipe box reads the Breeze accent and strong border tokens", + ), + ( + "radio", + "no Breeze radio button is installed; the recipe ring reads the Breeze accent and strong border tokens", + ), + ( + "radio_tile", + "Breeze has no selectable card; the recipe surface reads the preset's surface and accent roles", + ), + ( + "slider", + "no Breeze slider is installed; the recipe track and knob read the Breeze accent and border tokens", + ), + ( + "text_input", + "no Breeze line-edit frame is installed; the recipe field reads the Breeze content, border and focus tokens", + ), + ( + "combo_box", + "no Breeze combo box is installed; the recipe paints from the Breeze field and border tokens", + ), + ( + "menu_item", + "no Breeze menu row is installed; the recipe row paints its highlight from the Breeze selection tokens", + ), + ( + "panel", + "the recipe panel paints the Breeze surface and border tokens with the Breeze radius", + ), + ( + "card", + "Breeze has no card; the recipe card paints the Breeze raised surface and border tokens", + ), + ( + "chart", + "Breeze has no chart chrome; the teksilo-charts default reads the series colours and the Breeze border role", + ), + ( + "popover", + "no Breeze popup frame is installed; the recipe popover paints the Breeze raised surface, outline and shadow tokens", + ), + ( + "tooltip", + "no Breeze tooltip frame is installed; the recipe tooltip paints the Breeze tooltip tokens", + ), + ( + "scroll_bar", + "no Breeze scroll bar is installed; the recipe paints the Breeze thumb tokens over no track", + ), + ( + "standard_item", + "no Breeze row highlight is installed; the recipe row paints the Breeze hover and selection tokens", + ), + ( + "tab", + "no Breeze tab is installed; the recipe tab paints the Breeze surface and accent tokens", + ), + ( + "dialog", + "the recipe dialog paints the Breeze surfaces, radius and shadow tokens", + ), + ( + "snackbar", + "Breeze has no snackbar; the recipe paints the Breeze raised surface and text tokens", + ), + ( + "toast", + "Breeze has no toast; the recipe paints the Breeze raised surface and status tokens", + ), + ( + "banner", + "the recipe banner paints the Breeze status foregrounds and their computed backgrounds", + ), + ( + "badge", + "Breeze has no badge; the recipe badge paints the Breeze accent and status tokens", + ), + ( + "progress_bar", + "no Breeze progress groove is installed; the recipe bar paints the Breeze accent token", + ), + ( + "link", + "the recipe link paints the Breeze link tokens, lifted to the text floor", + ), + ( + "segmented_control", + "Breeze has no segmented control; the recipe paints the Breeze surface, accent and border tokens", + ), + ( + "avatar", + "Breeze has no avatar; the recipe paints the Breeze accent and surface tokens", + ), + ( + "calendar", + "the recipe calendar paints the Breeze selection, hover and text tokens", + ), + ( + "color_picker", + "Breeze has no in-window colour picker chrome; the recipe reads the theme roles", + ), + ( + "spin_box", + "no Breeze spin box is installed; the recipe frames the field and step buttons in the Breeze roles", + ), + ( + "date_edit", + "the recipe is a passthrough around the TextInput, whose slot this preset leaves to its recipe", + ), + ( + "rich_text_editor", + "the recipe frames the viewport in the Breeze border and surface roles; the text is document content", + ), + ( + "table", + "no Breeze table rows are installed; the recipe paints the Breeze selection, alternate-row and divider tokens", + ), + ( + "list_container", + "the recipe is only the drag-insertion line, drawn in the Breeze accent", + ), + ( + "drop_zone", + "Breeze has no drop-zone control; the recipe tints its region from the theme roles", + ), + ( + "drop_target", + "Breeze has no drop-target control; the recipe border reads the theme roles", + ), + ( + "grid_view", + "the recipe's focus ring, marquee and insertion bar use the focus and accent roles this preset maps", + ), + ( + "web_view", + "the page paints itself; the recipe only tints the overlay shown over it, from theme roles", + ), + ( + "text_selection", + "touch chrome Breeze does not define; its geometry is teksilo_core::text_touch's, shared with hit testing", + ), + ( + "search_field", + "the recipe field reads the Breeze content, border and focus tokens", + ), + ]; + + /// Whether the installed slots and [`KDE_UNFILLED`] are exactly + /// [`ComponentStyleSlots::NAMES`], with no slot in both. + #[test] + fn installed_and_unfilled_slots_partition_the_roster() { + let unfilled: BTreeSet<&str> = KDE_UNFILLED.iter().map(|(name, _)| *name).collect(); + assert_eq!(unfilled.len(), KDE_UNFILLED.len(), "a slot is listed twice"); + for (name, reason) in KDE_UNFILLED { + assert!( + !reason.trim().is_empty(), + "{name} is listed without a reason" + ); + } + let names: BTreeSet<&str> = ComponentStyleSlots::NAMES.iter().copied().collect(); + for t in [light(), dark(), light().with_density(TargetDensity::Touch)] { + let installed: BTreeSet<&str> = t.style_slots.installed().into_iter().collect(); + let both: Vec<_> = installed.intersection(&unfilled).collect(); + assert!( + both.is_empty(), + "installed yet listed as unfilled: {both:?}" + ); + let covered: BTreeSet<&str> = installed.union(&unfilled).copied().collect(); + let missing: Vec<_> = names.difference(&covered).collect(); + let unknown: Vec<_> = covered.difference(&names).collect(); + assert!( + missing.is_empty() && unknown.is_empty(), + "neither installed nor listed: {missing:?}; not a slot: {unknown:?}" + ); + } + } + + #[test] + fn an_accent_moves_the_accent_family_and_the_links_but_no_neutral() { + let t = light_with_accent(PlasmaAccent::Purple.color()); + let base = light(); + assert_ne!(t.colors.accent, base.colors.accent); + assert_ne!(t.colors.focus_ring, base.colors.focus_ring); + assert_ne!(t.colors.surface_selected, base.colors.surface_selected); + // Plasma writes the accent into the link colour too, unlike macOS. + assert_ne!(t.colors.text_link, base.colors.text_link); + assert_eq!(t.colors.surface_main, base.colors.surface_main); + assert_eq!(t.colors.surface_content, base.colors.surface_content); + assert_eq!(t.colors.text_primary, base.colors.text_primary); + let palette = t.extension::().unwrap(); + let [r, g, b, _] = palette + .resolved() + .set(ColorState::Active, ColorSet::View) + .decoration(DecorationRole::Focus) + .to_rgba8(); + assert_eq!([r, g, b], [184, 117, 220]); + } + + #[test] + fn every_swatch_builds_a_usable_theme() { + for accent in PlasmaAccent::ALL { + for t in [ + light_with_accent(accent.color()), + dark_with_accent(accent.color()), + ] { + let c = &t.colors; + for fill in [c.accent, c.accent_hover, c.accent_pressed] { + assert!( + composite_contrast(c.text_on_accent, fill) >= 4.5, + "{accent:?}: the accent label is {:.2}:1", + composite_contrast(c.text_on_accent, fill) + ); + } + assert!(t.extension::().is_some()); + } + } + } + + #[test] + fn the_inactive_projection_paints_the_schemes_muted_selection() { + for t in [light(), dark()] { + let palette = t.extension::().unwrap(); + let inactive = paint(&t, false, false); + let pi = palette.role(ColorState::Inactive, PaletteRole::Highlight); + // KDE's Inactive state: the window colour tinted toward the + // selection colour. + assert_eq!(inactive.colors.accent, pi); + assert_ne!(inactive.colors.accent, t.colors.accent); + let chroma = |c: Color| { + let (_, s, _) = c.to_hsv(); + s + }; + assert!(chroma(inactive.colors.accent) < chroma(t.colors.accent)); + // Breeze's inactive effects are off: the neutrals pass through + // and the focus ring keeps the focus decoration. + assert_eq!(inactive.colors.surface_main, t.colors.surface_main); + assert_eq!(inactive.colors.text_primary, t.colors.text_primary); + assert_eq!(inactive.colors.focus_ring, t.colors.focus_ring); + assert_eq!( + inactive.colors, + *palette.tokens(PaintState { + window_active: false, + high_contrast: false, + }) + ); + } + // The Breeze Light example of the specification: 194,224,245. + assert_eq!( + hex8(paint(&light(), false, false).colors.accent), + [194, 224, 245, 255] + ); + } + + #[test] + fn a_scheme_with_inactive_effects_is_honoured() { + let mut scheme = KdeColorScheme::breeze_light(); + scheme.inactive_effect.enabled = true; + scheme.inactive_effect.intensity_effect = teksilo_kde_scheme::IntensityEffect::Darken; + scheme.inactive_effect.intensity_amount = 0.2; + let t = from_scheme(&scheme); + let inactive = paint(&t, false, false); + assert_ne!(inactive.colors.surface_main, t.colors.surface_main); + let palette = t.extension::().unwrap(); + assert_eq!( + inactive.colors.surface_main, + palette.role(ColorState::Inactive, PaletteRole::Window) + ); + } + + #[test] + fn a_colour_the_app_changed_is_never_painted_over() { + let mut t = light(); + t.colors.accent = Color::from_hex("#FF0000"); + let inactive = paint(&t, false, false); + assert_eq!(inactive.colors, t.colors.for_inactive_window()); + assert_eq!(paint(&t, true, false).colors, t.colors); + let mut bare = light(); + bare.extensions.remove::(); + assert_eq!( + paint(&bare, true, true).colors, + bare.colors.for_high_contrast() + ); + } + + #[test] + fn the_active_paint_state_is_the_theme_itself() { + let t = light(); + assert_same_theme(&paint(&t, true, false), &t); + } + + #[test] + fn a_density_switch_keeps_the_colours_and_both_projections() { + let base = light(); + let touch = base.with_density(TargetDensity::Touch); + assert_eq!(touch.input, InputTokens::for_density(TargetDensity::Touch)); + assert_eq!(touch.input.density, TargetDensity::Touch); + assert_eq!(touch.id, base.id); + assert_eq!(touch.colors, base.colors); + assert_eq!( + touch.extension::(), + base.extension::() + ); + assert!(touch.extension::().is_some()); + assert!(touch.extension::().is_some()); + // The projection still works on the re-derived theme. + assert_eq!( + paint(&touch, false, false).colors, + paint(&base, false, false).colors + ); + } + + /// Every colour token, pinned to its source in Breeze Light's resolved + /// palette. The destructuring has no `..`: a field added to + /// `ColorTokens` must be pinned here before this compiles. + /// + /// A lifted token is pinned by its rule: it keeps its source's hue, + /// reaches its floor, and equals the source where the source already + /// does (checked in Breeze Dark, where most of them pass). + #[test] + fn every_colour_token_comes_from_its_documented_source() { + let t = light(); + let p = t.extension::().unwrap().clone(); + let r = |role| p.resolved().role(ColorState::Active, role); + let d = |role| p.resolved().role(ColorState::Disabled, role); + let i = |role| p.resolved().role(ColorState::Inactive, role); + let view = *p.resolved().set(ColorState::Active, ColorSet::View); + let win = *p.resolved().set(ColorState::Active, ColorSet::Window); + let tip = *p.resolved().set(ColorState::Active, ColorSet::Tooltip); + let c = |k: KdeColor| k.to_color(); + let window = r(PaletteRole::Window); + let base = r(PaletteRole::Base); + let frame_background = mix(window, base, 0.3); + let outline = mix(window, r(PaletteRole::WindowText), 0.2); + let hover_wash = mix(base, r(PaletteRole::Highlight), 0.3); + let readable = |token: Color, source: KdeColor, floor: f32, on: &[Color]| { + let (h1, s1, _) = token.to_hsv(); + let (h2, s2, _) = c(source).to_hsv(); + if s1 > 0.05 && s2 > 0.05 { + let dh = (h1 - h2).abs().min(360.0 - (h1 - h2).abs()); + assert!(dh < 6.0, "{token:?} lost the hue of {source:?}"); + } + for bg in on { + assert!( + composite_contrast(token, *bg) >= floor, + "{token:?} from {source:?} is {:.2}:1 on {bg:?}", + composite_contrast(token, *bg) + ); + } + }; + let surfaces = [t.colors.surface_main, t.colors.surface_content]; + let kept = ColorTokens::light_default(); + + let ColorTokens { + surface_main, + surface_content, + surface_raised, + surface_sunken, + surface_hover, + surface_pressed, + surface_selected, + surface_selected_inactive, + surface_alt_row, + surface_disabled, + text_primary, + text_secondary, + text_disabled, + text_on_accent, + text_link, + text_link_hover, + text_link_visited, + text_error, + text_warning, + text_success, + accent, + accent_hover, + accent_pressed, + accent_disabled, + accent_subtle_bg, + border, + border_strong, + border_focused, + border_error, + border_warning, + border_disabled, + divider, + divider_strong, + status_info_fg, + status_info_bg, + status_success_fg, + status_success_bg, + status_warning_fg, + status_warning_bg, + status_error_fg, + status_error_bg, + selection_bg_active, + selection_text_active, + selection_bg_inactive, + selection_text_inactive, + search_match_bg, + search_match_current_bg, + scrollbar_track, + scrollbar_track_hover, + scrollbar_thumb, + scrollbar_thumb_hover, + scrollbar_thumb_pressed, + tooltip_bg, + tooltip_text, + tooltip_border, + tooltip_shortcut, + editor_bg, + editor_fg, + editor_caret, + editor_current_line_bg, + editor_gutter_fg, + editor_selection_bg, + editor_code_block_bg, + editor_code_block_fg, + focus_ring, + focus_ring_error, + scrim, + text_on_error, + text_on_error_container, + surface_error_container, + surface_container, + surface_container_raised, + surface_container_sunken, + chart_palette, + } = t.colors.clone(); + + // Surfaces. + assert_eq!(surface_main, c(window)); + assert_eq!(surface_content, c(base)); + assert_eq!(surface_raised, c(frame_background)); + assert_eq!(surface_sunken, c(win.background(BackgroundRole::Alternate))); + assert_eq!(surface_hover, c(hover_wash)); + assert_eq!( + surface_pressed, + c(mix(r(PaletteRole::Button), r(PaletteRole::Highlight), 0.3)) + ); + assert_eq!(surface_selected, c(r(PaletteRole::Highlight))); + assert_eq!(surface_selected_inactive, c(i(PaletteRole::Highlight))); + assert_eq!(surface_alt_row, c(r(PaletteRole::AlternateBase))); + assert_eq!(surface_disabled, c(d(PaletteRole::Button))); + assert_eq!(surface_container, c(frame_background)); + assert_eq!(surface_container_raised, c(base)); + assert_eq!(surface_container_sunken, surface_sunken); + assert_eq!( + surface_error_container, + c(view.background(BackgroundRole::Negative)) + ); + + // Text. + assert_eq!(text_primary, c(r(PaletteRole::WindowText))); + readable( + text_secondary, + win.foreground(ForegroundRole::Inactive), + 4.5, + &surfaces, + ); + assert_eq!(text_disabled, c(d(PaletteRole::WindowText))); + assert_eq!(text_on_accent, Color::BLACK); + readable( + text_link, + view.foreground(ForegroundRole::Link), + 4.5, + &surfaces, + ); + readable( + text_link_hover, + view.foreground(ForegroundRole::Active), + 4.5, + &surfaces, + ); + readable( + text_link_visited, + view.foreground(ForegroundRole::Visited), + 4.5, + &surfaces, + ); + readable( + text_error, + view.foreground(ForegroundRole::Negative), + 4.5, + &surfaces, + ); + readable( + text_warning, + view.foreground(ForegroundRole::Neutral), + 4.5, + &surfaces, + ); + readable( + text_success, + view.foreground(ForegroundRole::Positive), + 4.5, + &surfaces, + ); + assert_eq!(text_on_error, Color::WHITE); + assert_eq!(text_on_error_container, text_error); + + // Accent. + assert_eq!(accent, c(r(PaletteRole::Highlight))); + assert_eq!(accent_hover, c(hsv_lighter(r(PaletteRole::Highlight), 110))); + assert_eq!( + accent_pressed, + c(hsv_darker(r(PaletteRole::Highlight), 110)) + ); + assert_eq!(accent_disabled, c(d(PaletteRole::Highlight))); + assert_eq!(accent_subtle_bg, c(hover_wash)); + + // Borders. + assert_eq!(border, c(outline)); + readable(border_strong, outline, 3.0, &surfaces); + assert_eq!(divider, c(outline)); + assert_eq!(divider_strong, border_strong); + readable( + focus_ring, + view.decoration(DecorationRole::Focus), + 3.0, + &surfaces, + ); + assert_eq!(border_focused, focus_ring); + readable( + border_error, + view.foreground(ForegroundRole::Negative), + 3.0, + &surfaces, + ); + readable( + border_warning, + view.foreground(ForegroundRole::Neutral), + 3.0, + &surfaces, + ); + assert_eq!(focus_ring_error, border_error); + assert_eq!( + border_disabled, + c(mix(d(PaletteRole::Window), d(PaletteRole::WindowText), 0.2)) + ); + + // Status. + assert_eq!(status_error_fg, text_error); + assert_eq!(status_warning_fg, text_warning); + assert_eq!(status_success_fg, text_success); + readable( + status_info_fg, + view.foreground(ForegroundRole::Active), + 4.5, + &surfaces, + ); + assert_eq!(status_info_bg, c(view.background(BackgroundRole::Active))); + assert_eq!( + status_success_bg, + c(view.background(BackgroundRole::Positive)) + ); + assert_eq!( + status_warning_bg, + c(view.background(BackgroundRole::Neutral)) + ); + assert_eq!( + status_error_bg, + c(view.background(BackgroundRole::Negative)) + ); + + // Selection. + assert_eq!(selection_bg_active, surface_selected); + assert_eq!(selection_text_active, Color::BLACK); + assert_eq!(selection_bg_inactive, surface_selected_inactive); + assert_eq!(selection_text_inactive, c(i(PaletteRole::HighlightedText))); + assert_eq!(search_match_bg, kept.search_match_bg); + assert_eq!(search_match_current_bg, kept.search_match_current_bg); + + // Scroll bar. + assert_eq!(scrollbar_track, Color::TRANSPARENT); + assert_eq!(scrollbar_track_hover, Color::TRANSPARENT); + readable( + scrollbar_thumb, + mix(window, r(PaletteRole::WindowText), 0.175), + 3.0, + &surfaces, + ); + readable( + scrollbar_thumb_hover, + mix(window, view.decoration(DecorationRole::Hover), 0.5), + 3.0, + &surfaces, + ); + assert_eq!(scrollbar_thumb_pressed, scrollbar_thumb_hover); + + // Tooltip. + let tip_bg = tip.background(BackgroundRole::Normal); + let tip_fg = tip.foreground(ForegroundRole::Normal); + assert_eq!(tooltip_bg, c(tip_bg)); + assert_eq!(tooltip_text, c(tip_fg)); + assert_eq!(tooltip_border, c(mix(tip_bg, tip_fg, 0.2))); + readable( + tooltip_shortcut, + tip.foreground(ForegroundRole::Inactive), + 4.5, + &[tooltip_bg], + ); + + // Editor. + assert_eq!(editor_bg, c(base)); + assert_eq!(editor_fg, c(r(PaletteRole::Text))); + assert_eq!(editor_caret, editor_fg); + assert_eq!(editor_current_line_bg, c(r(PaletteRole::AlternateBase))); + readable( + editor_gutter_fg, + view.foreground(ForegroundRole::Inactive), + 4.5, + &[editor_bg, editor_current_line_bg], + ); + assert_eq!(editor_selection_bg, surface_selected); + assert_eq!(editor_code_block_bg, c(mix(base, window, 0.5))); + assert_eq!(editor_code_block_fg, editor_fg); + + // Kept from Int UI. + assert_eq!(scrim, kept.scrim); + assert_eq!(chart_palette, kept.chart_palette); + + // Where the source already reaches its floor the lift leaves it + // alone: Breeze Dark's tooltip shortcut text is readable as it is. + let dark = super::dark(); + let dp = dark.extension::().unwrap(); + let dark_shortcut = dp + .resolved() + .set(ColorState::Active, ColorSet::Tooltip) + .foreground(ForegroundRole::Inactive); + assert!(composite_contrast(dark_shortcut.to_color(), dark.colors.tooltip_bg) >= 4.5); + assert_eq!(dark.colors.tooltip_shortcut, dark_shortcut.to_color()); + } + + /// No assignment may stay tagged as unverified: the tag means a value + /// the specification has not settled. + #[test] + fn no_unverified_tags() { + let needle = concat!("[", "unverified", "]"); + let root = Path::new(env!("CARGO_MANIFEST_DIR")); + let mut found = Vec::new(); + let mut scanned = 0; + let mut stack = vec![root.join("src"), root.join("tests")]; + while let Some(dir) = stack.pop() { + let Ok(entries) = std::fs::read_dir(&dir) else { + continue; + }; + for entry in entries { + let path = entry.expect("a directory entry").path(); + if path.is_dir() { + stack.push(path); + } else if path.extension().is_some_and(|e| e == "rs") { + scanned += 1; + let text = std::fs::read_to_string(&path).expect("readable source"); + for (n, line) in text.lines().enumerate() { + if line.contains(needle) { + found.push(format!("{}:{}", path.display(), n + 1)); + } + } + } + } + } + assert!(scanned > 5, "only {scanned} source files were scanned"); + assert!( + found.is_empty(), + "unverified values remain:\n{}", + found.join("\n") + ); + } +} diff --git a/crates/teksilo-theme-kde/src/motion.rs b/crates/teksilo-theme-kde/src/motion.rs new file mode 100644 index 000000000..1e7578ff5 --- /dev/null +++ b/crates/teksilo-theme-kde/src/motion.rs @@ -0,0 +1,192 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Breeze motion tokens. +//! +//! Two upstream clocks drive a Plasma application's motion, and the tokens +//! take each step from the one that owns it: +//! +//! - **The Breeze widget style** animates hover, press, focus and toggle +//! transitions over its `AnimationsDuration`, 100 ms, linearly. Its +//! progress is quantised to ten steps, which at 60 Hz is about six frames +//! per transition, so the steps cannot be seen and the curve is +//! [`Easing::Linear`]. +//! - **Kirigami** (and the desktop QtQuick style built on it) derives its +//! units from one long duration, 200 ms: short is half of it, very long +//! twice it. Those give the normal, slow and collapse steps. +//! +//! | Token | ms | Source | +//! | --- | --- | --- | +//! | `duration_fast` | 100 | Breeze `AnimationsDuration`; Kirigami short duration | +//! | `duration_normal` | 200 | Kirigami long duration | +//! | `duration_slow` | 400 | Kirigami very long duration | +//! | `duration_collapse` | 200 | Kirigami long duration | +//! | `duration_indeterminate_sweep` | 800 | Breeze busy progress step | +//! | `tooltip_delay`, `tooltip_delay_heavy` | 700 | Kirigami tooltip delay | +//! +//! The desktop's animation speed (`AnimationDurationFactor`) is applied by +//! the desktop reader, not here: these are the factor-1 values. +//! +//! ## The switch curves +//! +//! The one Breeze control whose motion is not linear is the switch of the +//! desktop QtQuick style. Its handle moves on Qt's smoothed animation, which +//! Qt documents as a quadratic ease-in-out, and its colour changes on an +//! ease-in cubic. Both are given as cubic Bézier curves for the switch style +//! to use, [`BREEZE_SWITCH_HANDLE_EASING`] and [`BREEZE_SWITCH_COLOR_EASING`]. +//! The quadratic ease-in-out is two parabolas joined at the middle, which no +//! single cubic Bézier curve is, so the handle's curve is its usual +//! approximation; the ease-in cubic is itself a cubic Bézier curve, so the +//! colour's is exact. The tests bound how far each strays from the curve it +//! stands for. + +use std::time::Duration; + +use teksilo_tokens::{Easing, MotionTokens}; + +/// Hover, press and toggle transitions. `[S]` Breeze's `AnimationsDuration` +/// default, which is also `[K]` Kirigami's short duration. +pub const BREEZE_FAST_MS: u64 = 100; +/// `[K]` Kirigami's long duration. +pub const BREEZE_NORMAL_MS: u64 = 200; +/// `[K]` Kirigami's very long duration, twice the long one. +pub const BREEZE_SLOW_MS: u64 = 400; +/// `[K]` A disclosure opening or closing: Kirigami's long duration. +pub const BREEZE_COLLAPSE_MS: u64 = 200; +/// `[S]` One period of the busy progress bar's stripes. The desktop's +/// animation speed does not scale it. +pub const BREEZE_BUSY_STEP_MS: u64 = 800; +/// `[K]` Kirigami's tooltip delay. The desktop's animation speed does not +/// scale it. +pub const BREEZE_TOOLTIP_DELAY_MS: u64 = 700; + +/// `[S]` Breeze's widget-style transitions are linear. +pub const BREEZE_STANDARD_EASING: Easing = Easing::Linear; + +/// `[derived]` The switch handle's motion. Qt documents its smoothed +/// animation as a quadratic ease-in-out (`[qt]`); this cubic Bézier is that +/// curve's usual approximation, within 0.02 of it everywhere (see the +/// tests). +pub const BREEZE_SWITCH_HANDLE_EASING: Easing = Easing::CubicBezier { + x1: 0.455, + y1: 0.03, + x2: 0.515, + y2: 0.955, +}; + +/// `[derived]` The switch handle's colour change. The desktop QtQuick style +/// runs it on an ease-in cubic (`[Qd]`), `t` cubed. With its control points +/// at one and two thirds of the way along and none of the way up, a cubic +/// Bézier's horizontal coordinate is its parameter and its vertical one the +/// parameter cubed, so this curve is that ease-in exactly. (The common +/// approximation `(0.55, 0.055, 0.675, 0.19)` strays 0.03 from it.) +pub const BREEZE_SWITCH_COLOR_EASING: Easing = Easing::CubicBezier { + x1: 1.0 / 3.0, + y1: 0.0, + x2: 2.0 / 3.0, + y2: 0.0, +}; + +/// Breeze motion tokens at the desktop's default animation speed. +pub fn breeze_motion() -> MotionTokens { + MotionTokens { + duration_instant: Duration::ZERO, + duration_fast: Duration::from_millis(BREEZE_FAST_MS), + duration_normal: Duration::from_millis(BREEZE_NORMAL_MS), + duration_slow: Duration::from_millis(BREEZE_SLOW_MS), + duration_collapse: Duration::from_millis(BREEZE_COLLAPSE_MS), + duration_indeterminate_sweep: Duration::from_millis(BREEZE_BUSY_STEP_MS), + tooltip_delay: Duration::from_millis(BREEZE_TOOLTIP_DELAY_MS), + tooltip_delay_heavy: Duration::from_millis(BREEZE_TOOLTIP_DELAY_MS), + // `[unpublished]` KDE states no reshow delay: the framework's + // desktop baseline. + tooltip_reshow_delay: MotionTokens::default().tooltip_reshow_delay, + easing_standard: BREEZE_STANDARD_EASING, + } +} + +#[cfg(test)] +mod tests { + use super::*; + + /// The largest distance between two curves, sampled every 1/1000. + fn max_deviation(a: impl Fn(f32) -> f32, b: impl Fn(f32) -> f32) -> f32 { + (0..=1000) + .map(|i| { + let t = i as f32 / 1000.0; + (a(t) - b(t)).abs() + }) + .fold(0.0, f32::max) + } + + #[test] + fn durations_are_the_breeze_and_kirigami_values() { + let m = breeze_motion(); + assert_eq!(m.duration_instant, Duration::ZERO); + assert_eq!(m.duration_fast, Duration::from_millis(100)); + assert_eq!(m.duration_normal, Duration::from_millis(200)); + assert_eq!(m.duration_slow, Duration::from_millis(400)); + assert_eq!(m.duration_collapse, Duration::from_millis(200)); + assert_eq!(m.duration_indeterminate_sweep, Duration::from_millis(800)); + assert_eq!(m.tooltip_delay, Duration::from_millis(700)); + assert_eq!(m.tooltip_delay_heavy, Duration::from_millis(700)); + } + + #[test] + fn the_kirigami_steps_derive_from_the_long_duration() { + // Short is half the long duration and very long is twice it. + assert_eq!(BREEZE_FAST_MS * 2, BREEZE_NORMAL_MS); + assert_eq!(BREEZE_NORMAL_MS * 2, BREEZE_SLOW_MS); + assert_eq!(BREEZE_COLLAPSE_MS, BREEZE_NORMAL_MS); + } + + #[test] + fn the_standard_curve_is_linear() { + let e = breeze_motion().easing_standard; + assert_eq!(e, Easing::Linear); + for t in [0.0, 0.25, 0.5, 0.75, 1.0] { + assert!((e.apply(t) - t).abs() < 1e-6); + } + } + + #[test] + fn the_handle_curve_stays_within_two_hundredths_of_the_quadratic_ease_in_out() { + let deviation = max_deviation( + |t| BREEZE_SWITCH_HANDLE_EASING.apply(t), + |t| Easing::EaseInOut.apply(t), + ); + assert!( + deviation <= 0.02, + "the handle curve strays {deviation} from the quadratic ease-in-out" + ); + } + + #[test] + fn the_colour_curve_stays_within_two_hundredths_of_the_cubic_ease_in() { + let deviation = max_deviation(|t| BREEZE_SWITCH_COLOR_EASING.apply(t), |t| t * t * t); + assert!( + deviation <= 0.02, + "the colour curve strays {deviation} from the cubic ease-in" + ); + } + + #[test] + fn the_common_ease_in_cubic_approximation_would_stray_too_far() { + // Pins why the colour curve is the exact one. + let common = Easing::CubicBezier { + x1: 0.55, + y1: 0.055, + x2: 0.675, + y2: 0.19, + }; + assert!(max_deviation(|t| common.apply(t), |t| t * t * t) > 0.02); + } + + #[test] + fn the_reshow_delay_keeps_the_desktop_baseline() { + assert_eq!( + breeze_motion().tooltip_reshow_delay, + MotionTokens::default().tooltip_reshow_delay + ); + } +} diff --git a/crates/teksilo-theme-kde/src/palette.rs b/crates/teksilo-theme-kde/src/palette.rs new file mode 100644 index 000000000..c774065ba --- /dev/null +++ b/crates/teksilo-theme-kde/src/palette.rs @@ -0,0 +1,441 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The KDE palette a Breeze theme is built from, attached to the theme as a +//! typed extension, and Plasma's ten accent swatches. +//! +//! [`ColorTokens`] carries one colour per Teksilo role. A KDE scheme carries +//! more: three colour states of seven colour sets, each with its own +//! foregrounds, backgrounds and decorations, and Breeze paints controls from +//! combinations of them (an outline is the window colour moved toward the +//! window text by the frame contrast). [`KdePalette`] holds the whole +//! resolved scheme, those combinations for each state ([`BreezeColors`]), +//! and the four sets of colour tokens a window paints with, so a Breeze +//! style or KDE-aware app code can read the exact colour it needs: +//! +//! ``` +//! use teksilo_theme_kde::{self as kde, KdePalette}; +//! use teksilo_theme_kde::scheme::ColorState; +//! +//! let theme = kde::light(); +//! let palette = theme.extension::().expect("a KDE theme carries its palette"); +//! let outline = palette.colors(ColorState::Active).frame_outline; +//! assert!(outline.a() > 0.0); +//! ``` +//! +//! The palette keeps the scheme's own colours. Where the theme's tokens lift +//! one to meet WCAG (see the colour mapping's deviations in the crate +//! documentation), the token carries the lifted colour and the palette the +//! vendor one. + +use std::fmt; +use std::str::FromStr; +use std::sync::Arc; + +use teksilo_core::styles::PaintState; +use teksilo_kde_scheme::math::mix; +use teksilo_kde_scheme::{ + ACCENT_SWATCHES, ColorSet, ColorState, DecorationRole, KdeColor, KdeColorScheme, PaletteRole, + ResolvedPalette, +}; +use teksilo_tokens::{Color, ColorTokens}; + +use crate::color::{self, Mapping}; + +/// `[Hp]` How far a focus or hover outline is moved toward the window text. +const OUTLINE_TOWARD_TEXT: f64 = 0.15; + +/// `[Hp]` The alpha of a control's 1 px shadow. +const CONTROL_SHADOW_ALPHA: f32 = 0.125; + +/// The colours Breeze combines from a scheme's palette for one colour state. +/// +/// `fc` is the scheme's frame contrast. Every colour is opaque except +/// [`shadow`](Self::shadow). +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeColors { + /// `[Hp]` The outline of a frame, field or menu: the window colour moved + /// toward the window text by `fc`. + pub frame_outline: Color, + /// `[Hp]` A separator line: the same mix as the frame outline. + pub separator: Color, + /// `[Hp]` The fill of a menu, popup or group box: the window colour 30 % + /// of the way to the view's. + pub frame_background: Color, + /// `[Hp]` The view set's focus decoration, the keyboard-focus colour. + pub focus: Color, + /// `[Hp]` The view set's hover decoration. + pub hover: Color, + /// `[Hp]` The focus colour moved 15 % toward the window text. + pub focus_outline: Color, + /// `[Hp]` The hover colour moved 15 % toward the window text. + pub hover_outline: Color, + /// `[Hp]` A push button's outline: the button colour moved toward the + /// button text by `fc`. + pub button_outline: Color, + /// `[Hp]` A slider handle's outline: the same mix as the button outline. + pub slider_outline: Color, + /// `[Hp]` A control's shadow: black at 12.5 %. + pub shadow: Color, +} + +impl BreezeColors { + /// The combinations for `state` of `palette` at frame contrast `fc`. + pub fn compute(palette: &ResolvedPalette, state: ColorState, fc: f64) -> BreezeColors { + let role = |r: PaletteRole| palette.role(state, r); + let window = role(PaletteRole::Window); + let window_text = role(PaletteRole::WindowText); + let button = role(PaletteRole::Button); + let button_text = role(PaletteRole::ButtonText); + let view = palette.set(state, ColorSet::View); + let focus = view.decoration(DecorationRole::Focus); + let hover = view.decoration(DecorationRole::Hover); + let outline = mix(window, window_text, fc).to_color(); + let button_outline = mix(button, button_text, fc).to_color(); + BreezeColors { + frame_outline: outline, + separator: outline, + frame_background: mix(window, role(PaletteRole::Base), 0.3).to_color(), + focus: focus.to_color(), + hover: hover.to_color(), + focus_outline: mix(focus, window_text, OUTLINE_TOWARD_TEXT).to_color(), + hover_outline: mix(hover, window_text, OUTLINE_TOWARD_TEXT).to_color(), + button_outline, + slider_outline: button_outline, + shadow: Color::BLACK.with_alpha(CONTROL_SHADOW_ALPHA), + } + } +} + +/// A resolved KDE scheme and everything a Breeze theme paints from it. +/// +/// Installed on a theme by [`crate::from_scheme`] and every constructor +/// built on it, and read back with `theme.extension::()`. Two +/// palettes are equal when their contents are. +/// +/// It also carries the four sets of colour tokens a window paints with: the +/// active and inactive ones, and each under the high-contrast preference. +/// The theme's paint projection swaps them in (see [`KdePalette::tokens`]). +#[derive(Debug, Clone, PartialEq)] +pub struct KdePalette { + resolved: Arc, + frame_contrast: f64, + dark: bool, + /// Indexed by [`ColorState::index`]. + colors: [BreezeColors; 3], + active: ColorTokens, + inactive: ColorTokens, + high_contrast: ColorTokens, + inactive_high_contrast: ColorTokens, +} + +impl KdePalette { + /// The palette of `scheme`. + /// + /// The scheme's frame contrast is read clamped to `0..=1`, its default + /// 0.2 when it is not a number, as KDE reads the key. The high-contrast + /// tokens come from the same scheme with a frame contrast of 1 and a + /// contrast of 10. + pub fn from_scheme(scheme: &KdeColorScheme) -> KdePalette { + let frame_contrast = if scheme.frame_contrast.is_nan() { + teksilo_kde_scheme::scheme::DEFAULT_FRAME_CONTRAST + } else { + scheme.frame_contrast.clamp(0.0, 1.0) + }; + let dark = scheme.is_dark(); + let resolved = scheme.resolve(); + + let mut enhanced = scheme.clone(); + enhanced.frame_contrast = 1.0; + enhanced.contrast = 10; + let enhanced_resolved = enhanced.resolve(); + + let project = |palette: &ResolvedPalette, state, fc, high_contrast| { + color::tokens(&Mapping { + palette, + state, + frame_contrast: fc, + high_contrast, + dark, + }) + }; + let active = project(&resolved, ColorState::Active, frame_contrast, false); + let mut inactive = project(&resolved, ColorState::Inactive, frame_contrast, false); + let high_contrast = project(&enhanced_resolved, ColorState::Active, 1.0, true); + let mut inactive_high_contrast = + project(&enhanced_resolved, ColorState::Inactive, 1.0, true); + // The chart series keep the framework's inactive desaturation: KDE's + // inactive state has nothing to say about them. + inactive.chart_palette = active.for_inactive_window().chart_palette; + inactive_high_contrast.chart_palette = high_contrast.for_inactive_window().chart_palette; + + KdePalette { + colors: ColorState::ALL + .map(|state| BreezeColors::compute(&resolved, state, frame_contrast)), + resolved: Arc::new(resolved), + frame_contrast, + dark, + active, + inactive, + high_contrast, + inactive_high_contrast, + } + } + + /// The resolved scheme: every colour of every set in every state. + pub fn resolved(&self) -> &ResolvedPalette { + &self.resolved + } + + /// The palette colour of `role` in `state`, as a Teksilo colour. + pub fn role(&self, state: ColorState, role: PaletteRole) -> Color { + self.resolved.role(state, role).to_color() + } + + /// The scheme's frame contrast, in `0..=1`. + pub fn frame_contrast(&self) -> f64 { + self.frame_contrast + } + + /// Whether the scheme is dark, as KDE reports it. + pub fn is_dark(&self) -> bool { + self.dark + } + + /// Breeze's colour combinations for `state`. + pub fn colors(&self, state: ColorState) -> &BreezeColors { + &self.colors[state.index()] + } + + /// The colour tokens a window paints with in `state`. + /// + /// An active window paints the active tokens. An inactive one paints the + /// tokens of the scheme's Inactive state: for Breeze, whose inactive + /// effects are off, they differ only in the selection and the accent, + /// which KDE mutes to the window colour tinted 40 % toward the selection + /// colour, while the focus ring keeps the focus decoration. A scheme + /// that turns its inactive effects on gets them everywhere. Under the + /// high-contrast preference the same choice is made between the + /// high-contrast tokens. + pub fn tokens(&self, state: PaintState) -> &ColorTokens { + match (state.window_active, state.high_contrast) { + (true, false) => &self.active, + (false, false) => &self.inactive, + (true, true) => &self.high_contrast, + (false, true) => &self.inactive_high_contrast, + } + } +} + +/// One of the ten accent swatches Plasma's colour settings page offers, in +/// the order it shows them. +/// +/// KDE gives the swatches no names; the identifiers here are Teksilo's, +/// chosen by hue (`[derived]`), and are stable, for persisting a choice +/// ([`as_str`](Self::as_str) and [`FromStr`]). +/// +/// ``` +/// use teksilo_theme_kde::{self as kde, PlasmaAccent}; +/// let theme = kde::dark_with_accent(PlasmaAccent::Purple.color()); +/// assert_eq!(theme.id.as_str(), "kde.dark"); +/// ``` +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum PlasmaAccent { + /// 233,58,154. + Pink, + /// 233,61,88. + Red, + /// 233,100,58. + Orange, + /// 232,203,45. + Yellow, + /// 61,212,37. + Green, + /// 0,211,184. + Teal, + /// 61,174,233, Breeze's own accent. + Blue, + /// 184,117,220. + Purple, + /// 146,110,228. + Violet, + /// 104,107,111. + Gray, +} + +impl PlasmaAccent { + /// Every swatch, in the order Plasma shows them. + pub const ALL: [PlasmaAccent; 10] = [ + PlasmaAccent::Pink, + PlasmaAccent::Red, + PlasmaAccent::Orange, + PlasmaAccent::Yellow, + PlasmaAccent::Green, + PlasmaAccent::Teal, + PlasmaAccent::Blue, + PlasmaAccent::Purple, + PlasmaAccent::Violet, + PlasmaAccent::Gray, + ]; + + /// The swatch's colour in KDE's 16-bit form. + pub fn kde_color(self) -> KdeColor { + ACCENT_SWATCHES[self as usize] + } + + /// The swatch's colour. + pub fn color(self) -> Color { + self.kde_color().to_color() + } + + /// The stable lowercase identifier of the swatch. + pub fn as_str(self) -> &'static str { + match self { + PlasmaAccent::Pink => "pink", + PlasmaAccent::Red => "red", + PlasmaAccent::Orange => "orange", + PlasmaAccent::Yellow => "yellow", + PlasmaAccent::Green => "green", + PlasmaAccent::Teal => "teal", + PlasmaAccent::Blue => "blue", + PlasmaAccent::Purple => "purple", + PlasmaAccent::Violet => "violet", + PlasmaAccent::Gray => "gray", + } + } +} + +impl fmt::Display for PlasmaAccent { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(self.as_str()) + } +} + +/// An identifier that names no [`PlasmaAccent`]. +#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)] +#[error("{0:?} is not a Plasma accent swatch")] +pub struct UnknownPlasmaAccent(pub String); + +impl FromStr for PlasmaAccent { + type Err = UnknownPlasmaAccent; + + /// The swatch whose [`as_str`](PlasmaAccent::as_str) is `s`, exactly. + fn from_str(s: &str) -> Result { + PlasmaAccent::ALL + .into_iter() + .find(|accent| accent.as_str() == s) + .ok_or_else(|| UnknownPlasmaAccent(s.to_owned())) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::collections::BTreeSet; + + #[test] + fn the_swatches_are_plasmas_in_order() { + let rgb: Vec<[u8; 3]> = PlasmaAccent::ALL + .iter() + .map(|a| { + let [r, g, b, _] = a.kde_color().to_rgba8(); + [r, g, b] + }) + .collect(); + assert_eq!( + rgb, + vec![ + [233, 58, 154], + [233, 61, 88], + [233, 100, 58], + [232, 203, 45], + [61, 212, 37], + [0, 211, 184], + [61, 174, 233], + [184, 117, 220], + [146, 110, 228], + [104, 107, 111], + ] + ); + } + + #[test] + fn identifiers_are_unique_and_read_back() { + let ids: BTreeSet<&str> = PlasmaAccent::ALL.iter().map(|a| a.as_str()).collect(); + assert_eq!(ids.len(), PlasmaAccent::ALL.len()); + for accent in PlasmaAccent::ALL { + assert_eq!(accent.as_str().parse::(), Ok(accent)); + assert_eq!(accent.to_string(), accent.as_str()); + } + assert_eq!( + "Blue".parse::(), + Err(UnknownPlasmaAccent("Blue".to_owned())) + ); + assert!("".parse::().is_err()); + } + + #[test] + fn breeze_blue_is_the_seventh_swatch() { + assert_eq!(PlasmaAccent::ALL[6], PlasmaAccent::Blue); + assert_eq!(PlasmaAccent::Blue.kde_color(), KdeColor::rgb8(61, 174, 233)); + } + + #[test] + fn the_combinations_follow_the_breeze_rules() { + let scheme = KdeColorScheme::breeze_light(); + let resolved = scheme.resolve(); + let c = BreezeColors::compute(&resolved, ColorState::Active, 0.2); + let r = |role| resolved.role(ColorState::Active, role); + assert_eq!( + c.frame_outline, + mix(r(PaletteRole::Window), r(PaletteRole::WindowText), 0.2).to_color() + ); + assert_eq!(c.separator, c.frame_outline); + assert_eq!( + c.frame_background, + mix(r(PaletteRole::Window), r(PaletteRole::Base), 0.3).to_color() + ); + assert_eq!(c.focus, KdeColor::rgb8(61, 174, 233).to_color()); + assert_eq!(c.hover, KdeColor::rgb8(61, 174, 233).to_color()); + assert_eq!( + c.button_outline, + mix(r(PaletteRole::Button), r(PaletteRole::ButtonText), 0.2).to_color() + ); + assert_eq!(c.slider_outline, c.button_outline); + assert!((c.shadow.a() - 0.125).abs() < 1e-6); + } + + #[test] + fn palettes_compare_by_content() { + let a = KdePalette::from_scheme(&KdeColorScheme::breeze_light()); + let b = KdePalette::from_scheme(&KdeColorScheme::breeze_light()); + assert_eq!(a, b); + let c = KdePalette::from_scheme(&KdeColorScheme::breeze_dark()); + assert_ne!(a, c); + assert!(!a.is_dark() && c.is_dark()); + } + + #[test] + fn a_frame_contrast_out_of_range_is_clamped() { + let mut scheme = KdeColorScheme::breeze_light(); + scheme.frame_contrast = 3.0; + assert_eq!(KdePalette::from_scheme(&scheme).frame_contrast(), 1.0); + scheme.frame_contrast = f64::NAN; + assert_eq!(KdePalette::from_scheme(&scheme).frame_contrast(), 0.2); + } + + #[test] + fn the_four_token_sets_are_chosen_by_the_paint_state() { + let p = KdePalette::from_scheme(&KdeColorScheme::breeze_light()); + let state = |window_active, high_contrast| PaintState { + window_active, + high_contrast, + }; + assert_eq!(p.tokens(state(true, false)), &p.active); + assert_eq!(p.tokens(state(false, false)), &p.inactive); + assert_eq!(p.tokens(state(true, true)), &p.high_contrast); + assert_eq!(p.tokens(state(false, true)), &p.inactive_high_contrast); + assert_ne!(p.active, p.inactive); + assert_ne!(p.active, p.high_contrast); + } +} diff --git a/crates/teksilo-theme-kde/src/shape.rs b/crates/teksilo-theme-kde/src/shape.rs new file mode 100644 index 000000000..ceadd7fbc --- /dev/null +++ b/crates/teksilo-theme-kde/src/shape.rs @@ -0,0 +1,251 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Breeze shape tokens: corner radii, stroke widths, the focus ring and the +//! shadows. +//! +//! ## Radii +//! +//! Breeze has one frame radius, 5 px, for controls and for floating +//! surfaces alike, which Kirigami repeats as its corner radius. A stroked +//! frame is drawn on a rectangle inset by half the 1 px pen, so the outline +//! a user sees has a radius of 4.5; the token carries the 5 and the styles +//! inset their own strokes. Smaller radii belong to individual parts and are +//! the constants below: the check box (4), the progress and slider grooves +//! (3) and the scroll-bar handle (4). +//! +//! ## The focus ring +//! +//! Breeze marks keyboard focus with a ring 2 px wide of the Highlight colour +//! at 30 % alpha, running from 1 px inside the control's edge to 1 px +//! outside it. That is a width of 2 and an offset of -1, which is what the +//! tokens say; the colour is the theme's `focus_ring`. +//! +//! ## Shadows +//! +//! A Breeze window shadow (menus, tooltips, combo-box popups) has two +//! layers, and its size is the `breezerc` `ShadowSize` setting, Large by +//! default. The tokens carry the Small, Medium and Large shadows, first +//! layer in `shadow_sm` / `shadow_md` / `shadow_lg` and second layer in the +//! matching `shadow_inner_*`; the styles paint both. `shadow_xs` is the push +//! button's own 1 px shadow, which has no second layer. Every offset in the +//! table is the size's offset plus the layer's, and the blur is Breeze's +//! radius, a CSS blur radius. The colour is black, at each layer's opacity. +//! Breeze's shadows do not change with the colour scheme, so light and dark +//! share one set of shape tokens. + +use teksilo_kde_scheme::ShadowSize; +use teksilo_tokens::{Color, Shadow, ShapeTokens}; + +/// `[M]` The frame radius of a control: push button, field, combo box, menu +/// item, tab, row highlight. Also `[K]` Kirigami's corner radius. +pub const BREEZE_CONTROL_RADIUS: f32 = 5.0; +/// `[M]` The radius of a floating surface: menu, tooltip, popup, dialog +/// frame. Breeze uses the frame radius here too. +pub const BREEZE_POPUP_RADIUS: f32 = 5.0; +/// `[Hp]` The radius a 1 px stroked frame is drawn with: the frame radius +/// less half the pen, because the stroke lies on the rectangle inset by +/// half the pen. +pub const BREEZE_STROKED_FRAME_RADIUS: f32 = 4.5; +/// `[M]` The check box's radius: the frame radius less one. +pub const BREEZE_CHECKBOX_RADIUS: f32 = 4.0; +/// `[Hp]` The radius of the progress-bar and slider grooves. +pub const BREEZE_GROOVE_RADIUS: f32 = 3.0; +/// `[Hp]` The radius of the scroll-bar handle: half its 8 px width. +pub const BREEZE_SCROLL_HANDLE_RADIUS: f32 = 4.0; +/// `[M]` The pen every frame, separator and symbol is drawn with. Breeze +/// writes 1.001, an antialiasing workaround; Teksilo draws 1. +pub const BREEZE_PEN_WIDTH: f32 = 1.0; +/// `[Hp]` The focus ring's width. +pub const BREEZE_FOCUS_RING_WIDTH: f32 = 2.0; +/// `[Hp]` The focus ring's offset from the control edge: it starts 1 px +/// inside the edge. +pub const BREEZE_FOCUS_RING_OFFSET: f32 = -1.0; +/// `[Hp]` The alpha the focus ring's Highlight is painted at. +pub const BREEZE_FOCUS_RING_ALPHA: f32 = 0.3; +/// `[Hp]` The focus ring's outer radius: the inner edge has the frame +/// radius and the ring grows it by its width. +pub const BREEZE_FOCUS_RING_OUTER_RADIUS: f32 = 7.0; + +/// `[Hp]` The push button's shadow: a 1 px line of black at 12.5 % below the +/// button, which is an offset of (0, 1) with no blur. +pub const BREEZE_BUTTON_SHADOW_ALPHA: f32 = 0.125; + +/// `[Hp]` The overlap of a window and its shadow. +pub const BREEZE_SHADOW_OVERLAP: f32 = 2.0; + +/// One layer of a window shadow: vertical offset, blur and opacity, the +/// size's offset already added in. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct ShadowLayer { + /// Downward offset in logical pixels. + pub offset_y: f32, + /// Blur radius in logical pixels. + pub blur: f32, + /// Opacity of the shadow colour, before `ShadowStrength`. + pub opacity: f32, +} + +/// `[Hp]` The two layers of a Breeze window shadow of `size`, `None` for +/// [`ShadowSize::None`]. +/// +/// | Size | Layer 1 (offset, blur, opacity) | Layer 2 | +/// | --- | --- | --- | +/// | Small | 3, 12, 0.26 | 1, 6, 0.16 | +/// | Medium | 4, 16, 0.24 | 2, 8, 0.14 | +/// | Large | 5, 20, 0.22 | 2, 10, 0.12 | +/// | Very large | 6, 24, 0.20 | 3, 12, 0.10 | +pub const fn window_shadow_layers(size: ShadowSize) -> Option<[ShadowLayer; 2]> { + const fn layer(offset_y: f32, blur: f32, opacity: f32) -> ShadowLayer { + ShadowLayer { + offset_y, + blur, + opacity, + } + } + match size { + ShadowSize::None => None, + ShadowSize::Small => Some([layer(3.0, 12.0, 0.26), layer(1.0, 6.0, 0.16)]), + ShadowSize::Medium => Some([layer(4.0, 16.0, 0.24), layer(2.0, 8.0, 0.14)]), + ShadowSize::Large => Some([layer(5.0, 20.0, 0.22), layer(2.0, 10.0, 0.12)]), + ShadowSize::VeryLarge => Some([layer(6.0, 24.0, 0.20), layer(3.0, 12.0, 0.10)]), + } +} + +/// A shadow token for `layer` in `color`, at the layer's opacity times +/// `strength` (`breezerc` `ShadowStrength / 255`, 1 by default). +pub fn shadow_token(layer: ShadowLayer, color: Color, strength: f32) -> Shadow { + Shadow { + offset_x: 0.0, + offset_y: layer.offset_y, + blur: layer.blur, + spread: 0.0, + color: color.with_alpha(layer.opacity * strength.clamp(0.0, 1.0)), + } +} + +/// Breeze shape tokens, for both colour schemes. +pub fn breeze_shape() -> ShapeTokens { + let pair = |size: ShadowSize| -> (Shadow, Shadow) { + let [outer, inner] = window_shadow_layers(size).expect("a sized shadow has two layers"); + ( + shadow_token(outer, Color::BLACK, 1.0), + shadow_token(inner, Color::BLACK, 1.0), + ) + }; + let (sm, inner_sm) = pair(ShadowSize::Small); + let (md, inner_md) = pair(ShadowSize::Medium); + let (lg, inner_lg) = pair(ShadowSize::Large); + ShapeTokens { + radius_control: BREEZE_CONTROL_RADIUS, + radius_popup: BREEZE_POPUP_RADIUS, + // `[unpublished]` Breeze has no pill shape; the framework's fully + // rounded value, for the widgets that ask for one. + radius_pill: ShapeTokens::light_default().radius_pill, + border_width: BREEZE_PEN_WIDTH, + focus_ring_width: BREEZE_FOCUS_RING_WIDTH, + focus_ring_offset: BREEZE_FOCUS_RING_OFFSET, + shadow_xs: Shadow { + offset_x: 0.0, + offset_y: 1.0, + blur: 0.0, + spread: 0.0, + color: Color::BLACK.with_alpha(BREEZE_BUTTON_SHADOW_ALPHA), + }, + // `[Hp]` The button shadow has one layer: the second is empty. + shadow_inner_xs: Shadow { + offset_x: 0.0, + offset_y: 0.0, + blur: 0.0, + spread: 0.0, + color: Color::TRANSPARENT, + }, + shadow_sm: sm, + shadow_inner_sm: inner_sm, + shadow_md: md, + shadow_inner_md: inner_md, + shadow_lg: lg, + shadow_inner_lg: inner_lg, + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn controls_and_popups_share_the_frame_radius() { + let s = breeze_shape(); + assert_eq!(s.radius_control, 5.0); + assert_eq!(s.radius_popup, 5.0); + assert_eq!(s.border_width, 1.0); + assert_eq!( + BREEZE_STROKED_FRAME_RADIUS, + BREEZE_CONTROL_RADIUS - BREEZE_PEN_WIDTH / 2.0 + ); + assert_eq!(BREEZE_CHECKBOX_RADIUS, BREEZE_CONTROL_RADIUS - 1.0); + } + + #[test] + fn the_focus_ring_runs_from_one_pixel_inside_to_one_pixel_outside() { + let s = breeze_shape(); + assert_eq!(s.focus_ring_width, 2.0); + assert_eq!(s.focus_ring_offset, -1.0); + // One pixel of the ring lies outside the control and is all it + // reserves; the stroke's centre line is on the edge itself. + assert_eq!(s.focus_ring_envelope(), 1.0); + assert_eq!(s.focus_ring_stroke_distance(), 0.0); + assert_eq!( + BREEZE_FOCUS_RING_OUTER_RADIUS, + BREEZE_CONTROL_RADIUS + BREEZE_FOCUS_RING_WIDTH + ); + } + + #[test] + fn the_window_shadows_are_the_breeze_table() { + let s = breeze_shape(); + let check = |shadow: Shadow, offset_y: f32, blur: f32, alpha: f32| { + assert_eq!(shadow.offset_x, 0.0); + assert_eq!(shadow.offset_y, offset_y); + assert_eq!(shadow.blur, blur); + assert_eq!(shadow.spread, 0.0); + assert!((shadow.color.a() - alpha).abs() < 1e-6); + assert_eq!(shadow.color.with_alpha(1.0), Color::BLACK); + }; + check(s.shadow_sm, 3.0, 12.0, 0.26); + check(s.shadow_inner_sm, 1.0, 6.0, 0.16); + check(s.shadow_md, 4.0, 16.0, 0.24); + check(s.shadow_inner_md, 2.0, 8.0, 0.14); + check(s.shadow_lg, 5.0, 20.0, 0.22); + check(s.shadow_inner_lg, 2.0, 10.0, 0.12); + check(s.shadow_xs, 1.0, 0.0, 0.125); + assert_eq!(s.shadow_inner_xs.color.a(), 0.0); + } + + #[test] + fn no_shadow_has_no_layers_and_strength_scales_the_opacity() { + assert_eq!(window_shadow_layers(ShadowSize::None), None); + let [outer, _] = window_shadow_layers(ShadowSize::VeryLarge).unwrap(); + assert_eq!((outer.offset_y, outer.blur), (6.0, 24.0)); + let half = shadow_token(outer, Color::BLACK, 0.5); + assert!((half.color.a() - 0.10).abs() < 1e-6); + // A strength outside 0..=1 is clamped rather than amplifying. + assert!((shadow_token(outer, Color::BLACK, 3.0).color.a() - 0.20).abs() < 1e-6); + } + + #[test] + fn larger_shadows_reach_further_and_fade_more() { + let sizes = [ + ShadowSize::Small, + ShadowSize::Medium, + ShadowSize::Large, + ShadowSize::VeryLarge, + ]; + for pair in sizes.windows(2) { + let [a, _] = window_shadow_layers(pair[0]).unwrap(); + let [b, _] = window_shadow_layers(pair[1]).unwrap(); + assert!(b.blur > a.blur && b.offset_y > a.offset_y); + assert!(b.opacity < a.opacity); + } + } +} diff --git a/crates/teksilo-theme-kde/src/typography.rs b/crates/teksilo-theme-kde/src/typography.rs new file mode 100644 index 000000000..ab473d408 --- /dev/null +++ b/crates/teksilo-theme-kde/src/typography.rs @@ -0,0 +1,238 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Breeze typography: Plasma's default fonts mapped onto Teksilo's six +//! [`TextStyle`](teksilo_tokens::TextStyle) slots. +//! +//! | Slot | Plasma font | Glyph size | Line box | Weight | +//! | --- | --- | --- | --- | --- | +//! | `body` | general font, Noto Sans 10 pt | 13 px | 18 px | 400 | +//! | `body_bold` | the same, Kirigami's heading weight | 13 px | 18 px | 600 | +//! | `small` | smallest readable font, Noto Sans 8 pt | 11 px | 15 px | 400 | +//! | `small_bold` | the same, bold | 11 px | 15 px | 600 | +//! | `tiny` | the smallest readable font again: KDE has no smaller role | 11 px | 15 px | 400 | +//! | `mono` | fixed font, Hack 10 pt | 13 px | 15 px | 400 | +//! +//! Nothing is tracked: letter spacing is 0 everywhere. +//! +//! ## Sizes are Qt's, not the point size's +//! +//! A 10 pt font at 96 dpi is 13⅓ px, but Qt resolves a font at a whole +//! pixel size and draws that face: 13 px. Teksilo uses the same 13 px +//! ([`face_px`]), so a label is the size it is in a Qt application next to +//! it rather than a third of a pixel larger. +//! +//! The line box follows Qt's measurement too ([`qt_line_height`]): the +//! face's ascent and descent at that pixel size, each truncated to 1/64 px +//! and rounded to a whole pixel separately, then added. For Noto Sans that +//! gives 15, 17, 18, 20, 22 and 26 px at 8, 9, 10, 11, 12 and 14 pt, the +//! heights Qt reports; a rule such as "1.35 times the size" is a pixel short +//! at several of them. The line-height ratio each style carries is that +//! whole line box over the glyph size, so the box Teksilo lays out is the +//! integer one. The control heights in [`crate::geometry`] are all derived +//! from the body line box. +//! +//! ## Families +//! +//! Plasma's faces are Noto Sans and Hack. This preset does not ship or name +//! them: it keeps Teksilo's bundled Inter and JetBrains Mono at the sizes and +//! line boxes above, which are computed from the Noto Sans and Hack metrics +//! whichever family draws them. + +use teksilo_tokens::{FontWeight, TypographyTokens}; + +/// The vertical metrics of a font face that its line height is computed +/// from: the `hhea` ascender and the absolute descender, in font units. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct FaceMetrics { + /// Units per em. + pub units_per_em: u32, + /// The `hhea` ascender. + pub ascender: u32, + /// The `hhea` descender, as a positive number. + pub descender: u32, +} + +/// `[measured-qt]` Noto Sans v2.015: 1000 units per em, ascender 1069, +/// descender 293, no line gap. The values Qt's line heights reproduce. +pub const NOTO_SANS_METRICS: FaceMetrics = FaceMetrics { + units_per_em: 1000, + ascender: 1069, + descender: 293, +}; + +/// `[measured-qt]` Hack v3.003: 2048 units per em, ascender 1901, descender +/// 483, no line gap. +pub const HACK_METRICS: FaceMetrics = FaceMetrics { + units_per_em: 2048, + ascender: 1901, + descender: 483, +}; + +/// `[measured-qt]` Plasma's general font size, in points. +pub const BREEZE_BODY_PT: f32 = 10.0; +/// `[measured-qt]` Plasma's smallest readable font size, in points. +pub const BREEZE_SMALL_PT: f32 = 8.0; +/// `[measured-qt]` Plasma's fixed font size, in points. +pub const BREEZE_MONO_PT: f32 = 10.0; + +/// `[K]` The weight Kirigami gives a heading, used for the bold styles. +pub const BREEZE_BOLD_WEIGHT: FontWeight = FontWeight::SEMI_BOLD; + +/// `[measured-qt]` The whole pixel size Qt resolves a font of `pt` points +/// to at 96 dpi: `pt x 96 / 72`, rounded half up. 13 for 10 pt, 11 for +/// 8 pt. +pub fn face_px(pt: f32) -> u32 { + let px = f64::from(pt) * 96.0 / 72.0; + (px + 0.5).floor().max(0.0) as u32 +} + +/// `[measured-qt]` The line height Qt reports for a face of `face_px` +/// pixels with `metrics`: the ascent `floor(64 P asc / upm) / 64` and the +/// descent likewise, each rounded half up to a whole pixel, then added. +pub fn qt_line_height(face_px: u32, metrics: FaceMetrics) -> u32 { + let sixty_fourths = |units: u32| -> u64 { + 64 * u64::from(face_px) * u64::from(units) / u64::from(metrics.units_per_em.max(1)) + }; + let round = |v: u64| -> u64 { (v + 32) / 64 }; + (round(sixty_fourths(metrics.ascender)) + round(sixty_fourths(metrics.descender))) as u32 +} + +/// The body line height `H` of Plasma's default general font, 18 px: what +/// every text-driven control height in [`crate::geometry`] starts from. +pub fn breeze_body_line_height() -> f32 { + qt_line_height(face_px(BREEZE_BODY_PT), NOTO_SANS_METRICS) as f32 +} + +/// Breeze typography tokens at Plasma's default fonts. +pub fn breeze_typography() -> TypographyTokens { + // `[unpublished]` Without bundled Noto Sans and Hack, the faces are + // Teksilo's bundled defaults, at the sizes Plasma uses. + let mut t = TypographyTokens::default(); + + let body_px = face_px(BREEZE_BODY_PT); + let body_line = qt_line_height(body_px, NOTO_SANS_METRICS); + let small_px = face_px(BREEZE_SMALL_PT); + let small_line = qt_line_height(small_px, NOTO_SANS_METRICS); + let mono_px = face_px(BREEZE_MONO_PT); + let mono_line = qt_line_height(mono_px, HACK_METRICS); + + let set = |style: &mut teksilo_tokens::TextStyle, px: u32, line: u32, weight: FontWeight| { + style.size = px as f32; + style.line_height = line as f32 / px as f32; + style.weight = weight; + style.letter_spacing = 0.0; + }; + set(&mut t.body, body_px, body_line, FontWeight::REGULAR); + set(&mut t.body_bold, body_px, body_line, BREEZE_BOLD_WEIGHT); + set(&mut t.small, small_px, small_line, FontWeight::REGULAR); + set(&mut t.small_bold, small_px, small_line, BREEZE_BOLD_WEIGHT); + // `[derived]` KDE has no role below the smallest readable font. + set(&mut t.tiny, small_px, small_line, FontWeight::REGULAR); + set(&mut t.mono, mono_px, mono_line, FontWeight::REGULAR); + t +} + +#[cfg(test)] +mod tests { + use super::*; + + fn line_box(style: &teksilo_tokens::TextStyle) -> f32 { + style.size * style.line_height + } + + #[test] + fn the_face_size_is_the_whole_pixel_size_qt_resolves() { + assert_eq!(face_px(10.0), 13); + assert_eq!(face_px(8.0), 11); + assert_eq!(face_px(9.0), 12); + assert_eq!(face_px(11.0), 15); + assert_eq!(face_px(12.0), 16); + assert_eq!(face_px(14.0), 19); + } + + #[test] + fn the_line_height_reproduces_every_size_qt_reported() { + for (pt, expected) in [ + (8.0, 15), + (9.0, 17), + (10.0, 18), + (11.0, 20), + (12.0, 22), + (14.0, 26), + ] { + assert_eq!( + qt_line_height(face_px(pt), NOTO_SANS_METRICS), + expected, + "Noto Sans {pt} pt" + ); + } + for (pt, expected) in [(9.0, 14), (10.0, 15), (11.0, 18)] { + assert_eq!( + qt_line_height(face_px(pt), HACK_METRICS), + expected, + "Hack {pt} pt" + ); + } + } + + #[test] + fn rounding_ascent_and_descent_together_would_be_a_pixel_short() { + // The reason the two are rounded separately: at 9 pt the ascent + // 12.81 and the descent 3.52 round to 13 and 4, 17 in all, while + // their sum 16.33 rounds to 16. Qt reports 17. + let together = |pt: f32| { + let p = f64::from(face_px(pt)); + let m = NOTO_SANS_METRICS; + let a = (64.0 * p * f64::from(m.ascender) / f64::from(m.units_per_em)).floor() / 64.0; + let d = (64.0 * p * f64::from(m.descender) / f64::from(m.units_per_em)).floor() / 64.0; + (a + d).round() as u32 + }; + assert_eq!(together(9.0), 16); + assert_eq!(qt_line_height(face_px(9.0), NOTO_SANS_METRICS), 17); + } + + #[test] + fn the_styles_carry_the_whole_line_boxes() { + let t = breeze_typography(); + assert_eq!(t.body.size, 13.0); + assert!((line_box(&t.body) - 18.0).abs() < 1e-4); + assert_eq!(t.body_bold.size, 13.0); + assert!((line_box(&t.body_bold) - 18.0).abs() < 1e-4); + for small in [&t.small, &t.small_bold, &t.tiny] { + assert_eq!(small.size, 11.0); + assert!((line_box(small) - 15.0).abs() < 1e-4); + } + assert_eq!(t.mono.size, 13.0); + assert!((line_box(&t.mono) - 15.0).abs() < 1e-4); + assert_eq!(breeze_body_line_height(), 18.0); + } + + #[test] + fn weights_and_tracking() { + let t = breeze_typography(); + assert_eq!(t.body.weight, FontWeight::REGULAR); + assert_eq!(t.body_bold.weight, FontWeight::SEMI_BOLD); + assert_eq!(t.small_bold.weight, FontWeight::SEMI_BOLD); + assert_eq!(t.tiny.weight, FontWeight::REGULAR); + for s in [ + &t.body, + &t.body_bold, + &t.small, + &t.small_bold, + &t.tiny, + &t.mono, + ] { + assert_eq!(s.letter_spacing, 0.0); + } + } + + #[test] + fn the_families_are_the_bundled_defaults() { + let t = breeze_typography(); + let base = TypographyTokens::default(); + assert_eq!(t.body.family, base.body.family); + assert_eq!(t.small.family, base.small.family); + assert_eq!(t.mono.family, base.mono.family); + } +} diff --git a/crates/teksilo-theme-kde/tests/contrast.rs b/crates/teksilo-theme-kde/tests/contrast.rs new file mode 100644 index 000000000..8f0b028e8 --- /dev/null +++ b/crates/teksilo-theme-kde/tests/contrast.rs @@ -0,0 +1,912 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The WCAG lifts of the Breeze colour mapping, and a sweep of every text +//! and backdrop pair the tokens declare. +//! +//! Each lift (D1 to D6 and D9 of the colour mapping's documentation) has a +//! premise test, that the scheme's own colour fails in stock Breeze, and a +//! test that the token passes. The sweep then checks every declared pair +//! for an active and an inactive window, over Breeze Light, Dark and +//! Classic, Oxygen, Oxygen Cold and Oxygen Dark (whose inputs the golden +//! vectors record; Oxygen and Oxygen Dark turn inactive effects on), the +//! ten Plasma accents on Light and on Dark, and schemes built to defeat the +//! lifts, each shown to need them; the property at the end does the same +//! over random coherent schemes, the high-contrast states included. +//! +//! This file reads `tools/kde_golden/vectors/resolve.json` from the +//! repository, so it is left out of the published package (the `exclude` +//! list in `Cargo.toml`). +//! +//! The property builds four complete token sets per case, each lifting some +//! thirty colours by up to 256 luma steps against up to eleven backdrops: +//! about 5 ms a case in a debug build, so it keeps proptest's default 256 +//! cases. Manual override knob: `PROPTEST_CASES=N cargo test -p +//! teksilo-theme-kde --test contrast`. +//! +//! Safe run (engineering/docs/property-testing.md): +//! +//! ```text +//! cargo test -p teksilo-theme-kde --test contrast --no-run +//! BIN=$(cargo test -p teksilo-theme-kde --test contrast --no-run --message-format=json 2>/dev/null \ +//! | jq -r 'select(.executable != null) | .executable' | tail -1) +//! ( ulimit -v 6000000 -t 300; "$BIN" --test-threads=1 ) +//! ``` + +use proptest::prelude::*; +use serde_json::Value; +use teksilo_core::styles::{PaintState, Theme}; +use teksilo_theme_kde::scheme::math::mix; +use teksilo_theme_kde::scheme::{ + ColorSet, ColorState, DecorationRole, ForegroundRole, KdeColor, KdeColorScheme, PaletteRole, + SetColors, StateEffect, +}; +use teksilo_theme_kde::{self as kde, KdePalette, PlasmaAccent}; +use teksilo_tokens::contrast::composite_contrast; +use teksilo_tokens::{Color, ColorTokens}; + +/// `[wcag]` SC 1.4.3 and SC 1.4.11. +const TEXT: f32 = 4.5; +const NON_TEXT: f32 = 3.0; + +fn ratio(fg: Color, bg: Color) -> f32 { + composite_contrast(fg, bg) +} + +fn palette(theme: &Theme) -> &KdePalette { + theme + .extension::() + .expect("a KDE theme carries its palette") +} + +fn role(theme: &Theme, r: PaletteRole) -> Color { + palette(theme).role(ColorState::Active, r) +} + +fn view_foreground(theme: &Theme, r: ForegroundRole) -> Color { + palette(theme) + .resolved() + .set(ColorState::Active, ColorSet::View) + .foreground(r) + .to_color() +} + +fn paint(theme: &Theme, window_active: bool, high_contrast: bool) -> ColorTokens { + theme + .for_paint_state(PaintState { + window_active, + high_contrast, + }) + .colors +} + +/// Every surface the tokens set text on, the hover and press washes +/// included. +fn text_surfaces(c: &ColorTokens) -> Vec<(&'static str, Color)> { + vec![ + ("surface_main", c.surface_main), + ("surface_content", c.surface_content), + ("surface_raised", c.surface_raised), + ("surface_container", c.surface_container), + ("surface_container_raised", c.surface_container_raised), + ("surface_container_sunken", c.surface_container_sunken), + ("surface_sunken", c.surface_sunken), + ("surface_alt_row", c.surface_alt_row), + ("surface_hover", c.surface_hover), + ("surface_pressed", c.surface_pressed), + ("accent_subtle_bg", c.accent_subtle_bg), + ] +} + +/// Every declared pair of `c` that falls short of its floor, by name. +fn failures(c: &ColorTokens, text: f32, non_text: f32) -> Vec { + let mut pairs: Vec<(String, Color, Color, f32)> = Vec::new(); + let mut add = |fg_name: &str, fg: Color, bg_name: &str, bg: Color, floor: f32| { + pairs.push((format!("{fg_name} on {bg_name}"), fg, bg, floor)); + }; + let surfaces = text_surfaces(c); + for (name, fg) in [ + ("text_primary", c.text_primary), + ("text_secondary", c.text_secondary), + ("text_link", c.text_link), + ("text_link_hover", c.text_link_hover), + ("text_link_visited", c.text_link_visited), + ("text_error", c.text_error), + ("text_warning", c.text_warning), + ("text_success", c.text_success), + ("status_info_fg", c.status_info_fg), + ] { + for (bg_name, bg) in &surfaces { + add(name, fg, bg_name, *bg, text); + } + } + for (bg_name, bg) in [ + ("accent", c.accent), + ("accent_hover", c.accent_hover), + ("accent_pressed", c.accent_pressed), + ] { + add("text_on_accent", c.text_on_accent, bg_name, bg, text); + } + for (bg_name, bg) in [ + ("surface_selected", c.surface_selected), + ("surface_selected_inactive", c.surface_selected_inactive), + ("selection_bg_active", c.selection_bg_active), + ("selection_bg_inactive", c.selection_bg_inactive), + ] { + add("text_primary", c.text_primary, bg_name, bg, text); + } + add( + "selection_text_active", + c.selection_text_active, + "selection_bg_active", + c.selection_bg_active, + text, + ); + add( + "selection_text_inactive", + c.selection_text_inactive, + "selection_bg_inactive", + c.selection_bg_inactive, + text, + ); + for (bg_name, bg) in [ + ("editor_bg", c.editor_bg), + ("editor_current_line_bg", c.editor_current_line_bg), + ("editor_selection_bg", c.editor_selection_bg), + ("editor_code_block_bg", c.editor_code_block_bg), + ] { + add("editor_fg", c.editor_fg, bg_name, bg, text); + add("editor_caret", c.editor_caret, bg_name, bg, text); + } + for (bg_name, bg) in [ + ("editor_bg", c.editor_bg), + ("editor_current_line_bg", c.editor_current_line_bg), + ] { + add("editor_gutter_fg", c.editor_gutter_fg, bg_name, bg, text); + } + add( + "editor_code_block_fg", + c.editor_code_block_fg, + "editor_code_block_bg", + c.editor_code_block_bg, + text, + ); + add( + "tooltip_text", + c.tooltip_text, + "tooltip_bg", + c.tooltip_bg, + text, + ); + add( + "tooltip_shortcut", + c.tooltip_shortcut, + "tooltip_bg", + c.tooltip_bg, + text, + ); + for (name, fg, bg) in [ + ("status_info", c.status_info_fg, c.status_info_bg), + ("status_success", c.status_success_fg, c.status_success_bg), + ("status_warning", c.status_warning_fg, c.status_warning_bg), + ("status_error", c.status_error_fg, c.status_error_bg), + ] { + add(name, fg, "its background", bg, text); + } + add( + "text_on_error", + c.text_on_error, + "text_error", + c.text_error, + text, + ); + add( + "text_on_error_container", + c.text_on_error_container, + "surface_error_container", + c.surface_error_container, + text, + ); + for (name, fg) in [ + ("focus_ring", c.focus_ring), + ("border_focused", c.border_focused), + ("border_strong", c.border_strong), + ("divider_strong", c.divider_strong), + ("border_error", c.border_error), + ("border_warning", c.border_warning), + ("focus_ring_error", c.focus_ring_error), + ] { + for (bg_name, bg) in [ + ("surface_main", c.surface_main), + ("surface_content", c.surface_content), + ("surface_raised", c.surface_raised), + ] { + add(name, fg, bg_name, bg, non_text); + } + } + for (name, fg) in [ + ("scrollbar_thumb", c.scrollbar_thumb), + ("scrollbar_thumb_hover", c.scrollbar_thumb_hover), + ("scrollbar_thumb_pressed", c.scrollbar_thumb_pressed), + ] { + for (bg_name, bg) in [ + ("surface_main", c.surface_main), + ("surface_content", c.surface_content), + ] { + add(name, fg, bg_name, bg, non_text); + } + } + pairs + .into_iter() + .filter(|(_, fg, bg, floor)| ratio(*fg, *bg) < *floor) + .map(|(name, fg, bg, floor)| { + format!( + "{name}: {:.2}:1 < {floor} ({fg:?} on {bg:?})", + ratio(fg, bg) + ) + }) + .collect() +} + +// ── D1, text on the accent ────────────────────────────────────────────── + +#[test] +fn d1_premise_breezes_selection_text_fails_on_its_highlight() { + for t in [kde::light(), kde::dark()] { + let text = role(&t, PaletteRole::HighlightedText); + let fill = role(&t, PaletteRole::Highlight); + assert!(ratio(text, fill) < TEXT, "{:.2}:1", ratio(text, fill)); + } +} + +#[test] +fn d1_the_accent_text_is_plasmas_black_and_passes() { + for t in [kde::light(), kde::dark()] { + let c = &t.colors; + assert_eq!(c.text_on_accent, Color::BLACK); + for fill in [c.accent, c.accent_hover, c.accent_pressed] { + assert!(ratio(c.text_on_accent, fill) >= TEXT); + } + } + // The selected text: black on Breeze Light's highlight, and the + // scheme's own text on Breeze Dark's darkened selection, where it + // passes. + assert_eq!(kde::light().colors.selection_text_active, Color::BLACK); + let dark = kde::dark(); + assert_eq!( + dark.colors.selection_text_active, + role(&dark, PaletteRole::HighlightedText) + ); + assert!( + ratio( + dark.colors.selection_text_active, + dark.colors.selection_bg_active + ) >= TEXT + ); +} + +#[test] +fn d1_premise_breeze_darks_primary_text_fails_on_its_highlight() { + let t = kde::dark(); + let fill = role(&t, PaletteRole::Highlight); + assert!(ratio(t.colors.text_primary, fill) < TEXT); +} + +#[test] +fn d1_the_selection_fill_carries_the_primary_text() { + for t in [kde::light(), kde::dark()] { + let c = &t.colors; + assert!(ratio(c.text_primary, c.surface_selected) >= TEXT); + assert!(ratio(c.editor_fg, c.editor_selection_bg) >= TEXT); + // The fill keeps the highlight's hue. + let (h1, _, _) = c.surface_selected.to_hsv(); + let (h2, _, _) = role(&t, PaletteRole::Highlight).to_hsv(); + assert!((h1 - h2).abs() < 6.0, "hue {h1} strays from {h2}"); + } +} + +// ── D2, inactive text ─────────────────────────────────────────────────── + +#[test] +fn d2_premise_breeze_lights_inactive_text_fails_on_its_window() { + let t = kde::light(); + let inactive = palette(&t) + .resolved() + .set(ColorState::Active, ColorSet::Window) + .foreground(ForegroundRole::Inactive) + .to_color(); + assert!(ratio(inactive, role(&t, PaletteRole::Window)) < TEXT); +} + +#[test] +fn d2_secondary_text_passes_on_every_surface() { + for t in [kde::light(), kde::dark()] { + let c = &t.colors; + for (name, bg) in text_surfaces(c) { + assert!( + ratio(c.text_secondary, bg) >= TEXT, + "secondary text on {name}: {:.2}:1", + ratio(c.text_secondary, bg) + ); + } + assert!(ratio(c.tooltip_shortcut, c.tooltip_bg) >= TEXT); + assert!(ratio(c.editor_gutter_fg, c.editor_bg) >= TEXT); + } +} + +// ── D3, links ─────────────────────────────────────────────────────────── + +#[test] +fn d3_premise_breeze_lights_link_fails_on_its_window() { + let t = kde::light(); + let link = view_foreground(&t, ForegroundRole::Link); + assert!(ratio(link, role(&t, PaletteRole::Window)) < TEXT); +} + +#[test] +fn d3_links_pass_on_every_surface() { + for t in [kde::light(), kde::dark()] { + let c = &t.colors; + for (name, bg) in text_surfaces(c) { + for (link, fg) in [ + ("text_link", c.text_link), + ("text_link_hover", c.text_link_hover), + ("text_link_visited", c.text_link_visited), + ] { + assert!(ratio(fg, bg) >= TEXT, "{link} on {name}"); + } + } + } +} + +// ── D4, status colours ────────────────────────────────────────────────── + +#[test] +fn d4_premise_breeze_lights_status_colours_fail_on_its_view() { + let t = kde::light(); + let base = role(&t, PaletteRole::Base); + for r in [ + ForegroundRole::Negative, + ForegroundRole::Neutral, + ForegroundRole::Positive, + ] { + assert!(ratio(view_foreground(&t, r), base) < TEXT, "{r:?}"); + } +} + +#[test] +fn d4_status_colours_pass_as_text_and_as_borders() { + for t in [kde::light(), kde::dark()] { + let c = &t.colors; + for fg in [ + c.text_error, + c.text_warning, + c.text_success, + c.status_info_fg, + ] { + for (name, bg) in text_surfaces(c) { + assert!(ratio(fg, bg) >= TEXT, "{fg:?} on {name}"); + } + } + for fg in [c.border_error, c.border_warning, c.focus_ring_error] { + assert!(ratio(fg, c.surface_main) >= NON_TEXT); + assert!(ratio(fg, c.surface_content) >= NON_TEXT); + } + } +} + +// ── D5, the focus decoration ──────────────────────────────────────────── + +#[test] +fn d5_premise_breeze_lights_focus_colour_fails_on_its_view() { + let t = kde::light(); + let focus = palette(&t) + .resolved() + .set(ColorState::Active, ColorSet::View) + .decoration(DecorationRole::Focus) + .to_color(); + assert!(ratio(focus, role(&t, PaletteRole::Base)) < NON_TEXT); +} + +#[test] +fn d5_the_focus_ring_passes_and_stays_opaque() { + for t in [kde::light(), kde::dark()] { + let c = &t.colors; + assert_eq!(c.focus_ring.a(), 1.0); + assert_eq!(c.focus_ring, c.border_focused); + for bg in [c.surface_main, c.surface_content, c.surface_raised] { + assert!(ratio(c.focus_ring, bg) >= NON_TEXT); + } + } +} + +// ── D6, frame outlines ────────────────────────────────────────────────── + +#[test] +fn d6_premise_the_frame_outline_fails_on_its_window() { + let t = kde::light(); + let outline = palette(&t).colors(ColorState::Active).frame_outline; + assert!(ratio(outline, role(&t, PaletteRole::Window)) < NON_TEXT); +} + +#[test] +fn d6_the_strong_outline_passes_and_the_plain_one_is_breezes() { + for t in [kde::light(), kde::dark()] { + let c = &t.colors; + assert_eq!( + c.border, + palette(&t).colors(ColorState::Active).frame_outline + ); + for bg in [c.surface_main, c.surface_content, c.surface_raised] { + assert!(ratio(c.border_strong, bg) >= NON_TEXT); + assert!(ratio(c.divider_strong, bg) >= NON_TEXT); + } + } +} + +// ── D9, the scroll-bar thumb ──────────────────────────────────────────── + +#[test] +fn d9_premise_breezes_thumbs_fail_on_the_window() { + let t = kde::light(); + let window = palette(&t) + .resolved() + .role(ColorState::Active, PaletteRole::Window); + let text = palette(&t) + .resolved() + .role(ColorState::Active, PaletteRole::WindowText); + let hover = palette(&t) + .resolved() + .set(ColorState::Active, ColorSet::View) + .decoration(DecorationRole::Hover); + let idle = mix(window, text, 0.5 * 0.7 * 0.5).to_color(); + let hovered = mix(window, hover, 0.5).to_color(); + assert!(ratio(idle, window.to_color()) < NON_TEXT); + assert!(ratio(hovered, window.to_color()) < NON_TEXT); +} + +#[test] +fn d9_the_thumbs_pass_and_no_track_is_painted() { + for t in [kde::light(), kde::dark()] { + let c = &t.colors; + for fg in [ + c.scrollbar_thumb, + c.scrollbar_thumb_hover, + c.scrollbar_thumb_pressed, + ] { + assert!(ratio(fg, c.surface_main) >= NON_TEXT); + assert!(ratio(fg, c.surface_content) >= NON_TEXT); + } + assert_eq!(c.scrollbar_track.a(), 0.0); + assert_eq!(c.scrollbar_track_hover.a(), 0.0); + } +} + +// ── The sweep ─────────────────────────────────────────────────────────── + +/// `scheme` with `edit` applied to each of `sets`. +fn with( + mut scheme: KdeColorScheme, + sets: &[ColorSet], + edit: impl Fn(&mut SetColors), +) -> KdeColorScheme { + for set in sets { + edit(&mut scheme.sets[set.index()]); + } + scheme +} + +const TEXT_SETS: [ColorSet; 4] = [ + ColorSet::View, + ColorSet::Window, + ColorSet::Button, + ColorSet::Tooltip, +]; + +/// Schemes built to defeat the lifts: secondary, link, status and focus +/// colours that nearly vanish into their backgrounds, frame contrast at +/// both ends, a highlight that is the window colour or a mid grey, inactive +/// effects turned on, and a scheme tinted toward its accent. +fn adversarial() -> Vec<(&'static str, KdeColorScheme)> { + let rgb = KdeColor::rgb8; + let faint_light = { + let mut s = with(KdeColorScheme::breeze_light(), &TEXT_SETS, |set| { + set.foreground_inactive = rgb(220, 222, 224); + set.foreground_active = rgb(210, 230, 250); + set.foreground_link = rgb(200, 220, 250); + set.foreground_visited = rgb(225, 205, 235); + set.foreground_negative = rgb(250, 200, 200); + set.foreground_neutral = rgb(250, 230, 200); + set.foreground_positive = rgb(200, 240, 210); + set.decoration_focus = rgb(239, 240, 241); + set.decoration_hover = rgb(239, 240, 241); + }); + s.frame_contrast = 0.0; + s + }; + let faint_dark = { + let mut s = with(KdeColorScheme::breeze_dark(), &TEXT_SETS, |set| { + set.foreground_inactive = rgb(45, 47, 50); + set.foreground_active = rgb(20, 50, 80); + set.foreground_link = rgb(20, 40, 90); + set.foreground_visited = rgb(60, 30, 70); + set.foreground_negative = rgb(90, 20, 20); + set.foreground_neutral = rgb(90, 50, 0); + set.foreground_positive = rgb(10, 60, 30); + set.decoration_focus = rgb(32, 35, 38); + set.decoration_hover = rgb(32, 35, 38); + }); + s.frame_contrast = 0.0; + s + }; + let window_highlight = { + let mut s = with( + KdeColorScheme::breeze_light(), + &[ColorSet::Selection], + |set| { + set.background_normal = rgb(239, 240, 241); + set.foreground_normal = rgb(255, 255, 255); + }, + ); + s.frame_contrast = 1.0; + s + }; + let grey = |scheme: KdeColorScheme| { + with(scheme, &[ColorSet::Selection], |set| { + set.background_normal = rgb(128, 128, 128); + set.foreground_normal = rgb(128, 128, 128); + }) + }; + let effects_on = { + let mut s = KdeColorScheme::breeze_light(); + s.inactive_effect = StateEffect { + enabled: true, + ..StateEffect::INACTIVE_DEFAULT + }; + s + }; + let effects_on_dark = { + let mut s = KdeColorScheme::breeze_dark(); + s.inactive_effect = StateEffect { + enabled: true, + ..StateEffect::INACTIVE_DEFAULT + }; + s + }; + let tinted = { + let mut s = KdeColorScheme::breeze_light(); + s.tint_factor = Some(0.4); + s.with_accent(PlasmaAccent::Pink.kde_color()) + }; + let tinted_dark = { + let mut s = KdeColorScheme::breeze_dark(); + s.tint_factor = Some(0.4); + s.with_accent(PlasmaAccent::Yellow.kde_color()) + }; + vec![ + ("faint light", faint_light), + ("faint dark", faint_dark), + ("highlight is the window", window_highlight), + ( + "grey highlight, light", + grey(KdeColorScheme::breeze_light()), + ), + ("grey highlight, dark", grey(KdeColorScheme::breeze_dark())), + ("inactive effects on, light", effects_on), + ("inactive effects on, dark", effects_on_dark), + ("tinted pink", tinted), + ("tinted yellow, dark", tinted_dark), + ] +} + +const RESOLVE_JSON: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../tools/kde_golden/vectors/resolve.json" +)); + +/// An installed scheme the golden vectors record, parsed from its groups +/// written back as configuration text (a nested group is recorded with its +/// path joined by `][`, so bracketing the name gives the header line). +fn golden_scheme(wanted: &str) -> KdeColorScheme { + let all: Value = serde_json::from_str(RESOLVE_JSON).expect("resolve.json parses"); + let scheme = all["schemes"] + .as_array() + .expect("resolve.json has a list of schemes") + .iter() + .find(|s| s["name"].as_str() == Some(wanted)) + .unwrap_or_else(|| panic!("resolve.json has no scheme {wanted}")); + let mut text = String::new(); + for (group, entries) in scheme["input"].as_object().expect("an input object") { + text.push('['); + text.push_str(group); + text.push_str("]\n"); + for (key, value) in entries.as_object().expect("a group object") { + text.push_str(key); + text.push('='); + text.push_str(value.as_str().expect("a value is a string")); + text.push('\n'); + } + text.push('\n'); + } + KdeColorScheme::parse(&text).0 +} + +/// Oxygen's three schemes, the installed schemes with inactive effects. +fn oxygen() -> Vec<(&'static str, KdeColorScheme)> { + vec![ + ("Oxygen", golden_scheme("Oxygen")), + ("Oxygen Cold", golden_scheme("OxygenCold")), + ("Oxygen Dark", golden_scheme("OxygenDark")), + ] +} + +#[test] +fn oxygen_and_oxygen_dark_turn_inactive_effects_on() { + let schemes = oxygen(); + let enabled: Vec = schemes + .iter() + .map(|(_, s)| s.inactive_effect.enabled) + .collect(); + assert_eq!(enabled, [true, false, true]); + assert!(!schemes[0].1.is_dark()); + assert!(schemes[2].1.is_dark()); +} + +fn sweep_schemes() -> Vec<(String, KdeColorScheme)> { + let mut out = vec![ + ("Breeze Light".to_owned(), KdeColorScheme::breeze_light()), + ("Breeze Dark".to_owned(), KdeColorScheme::breeze_dark()), + ( + "Breeze Classic".to_owned(), + KdeColorScheme::breeze_classic(), + ), + ]; + for (name, scheme) in oxygen() { + out.push((name.to_owned(), scheme)); + } + for accent in PlasmaAccent::ALL { + out.push(( + format!("Breeze Light, {accent}"), + KdeColorScheme::breeze_light().with_accent(accent.kde_color()), + )); + out.push(( + format!("Breeze Dark, {accent}"), + KdeColorScheme::breeze_dark().with_accent(accent.kde_color()), + )); + } + for (name, scheme) in adversarial() { + out.push((name.to_owned(), scheme)); + } + out +} + +#[test] +fn every_declared_pair_passes_for_every_scheme_in_both_window_states() { + let mut all = Vec::new(); + for (name, scheme) in sweep_schemes() { + let theme = kde::from_scheme(&scheme); + for (state, active) in [("active", true), ("inactive", false)] { + for failure in failures(&paint(&theme, active, false), TEXT, NON_TEXT) { + all.push(format!("{name}, {state}: {failure}")); + } + } + } + assert!( + all.is_empty(), + "{} failures:\n{}", + all.len(), + all.join("\n") + ); +} + +/// A colour pair a scheme itself gives, read from the palette the theme +/// keeps, with the floor its token is lifted to. +#[derive(Debug, Clone, Copy)] +enum Vendor { + /// A view foreground on the view (Base): D2, D3 and D4. + OnView(ForegroundRole), + /// The view's focus decoration on the view, a non-text pair: D5. + FocusOnView, + /// The selection text on the selection: D1's text. + SelectionText, + /// The window text on the selection: D1's fill. + WindowTextOnSelection, +} + +impl Vendor { + /// The pair's contrast in `state`, and its floor. + fn contrast(self, p: &KdePalette, state: ColorState) -> (f32, f32) { + let view = p.resolved().set(state, ColorSet::View); + let base = p.role(state, PaletteRole::Base); + let highlight = p.role(state, PaletteRole::Highlight); + match self { + Vendor::OnView(r) => (ratio(view.foreground(r).to_color(), base), TEXT), + Vendor::FocusOnView => ( + ratio(view.decoration(DecorationRole::Focus).to_color(), base), + NON_TEXT, + ), + Vendor::SelectionText => ( + ratio(p.role(state, PaletteRole::HighlightedText), highlight), + TEXT, + ), + Vendor::WindowTextOnSelection => ( + ratio(p.role(state, PaletteRole::WindowText), highlight), + TEXT, + ), + } + } +} + +/// For each adversarial scheme, the state it targets and the vendor pairs +/// in that state that fall short, so its passing the sweep is the lifts' +/// doing. +fn what_each_adversarial_scheme_defeats() -> Vec<(&'static str, ColorState, Vec)> { + use ColorState::{Active, Inactive}; + use ForegroundRole::{Inactive as Secondary, Link, Negative, Neutral}; + use Vendor::*; + let faint = vec![ + OnView(Secondary), + OnView(Link), + OnView(Negative), + FocusOnView, + ]; + vec![ + ("faint light", Active, faint.clone()), + ("faint dark", Active, faint), + ("highlight is the window", Active, vec![SelectionText]), + ( + "grey highlight, light", + Active, + vec![SelectionText, WindowTextOnSelection], + ), + ( + "grey highlight, dark", + Active, + vec![SelectionText, WindowTextOnSelection], + ), + ( + "inactive effects on, light", + Inactive, + vec![OnView(Negative), OnView(Neutral), FocusOnView], + ), + ( + "inactive effects on, dark", + Inactive, + vec![OnView(Negative)], + ), + ( + "tinted pink", + Active, + vec![OnView(Secondary), OnView(Neutral)], + ), + ( + "tinted yellow, dark", + Active, + vec![WindowTextOnSelection, OnView(Negative)], + ), + ] +} + +#[test] +fn the_adversarial_schemes_do_need_the_lifts() { + // A scheme meant to defeat the lifts that every pair passed without + // them would test nothing: its own colours must fail. + let schemes = adversarial(); + let needs = what_each_adversarial_scheme_defeats(); + let names: Vec<&str> = schemes.iter().map(|(n, _)| *n).collect(); + let listed: Vec<&str> = needs.iter().map(|(n, _, _)| *n).collect(); + assert_eq!(names, listed, "an adversarial scheme is unlisted"); + for ((name, scheme), (_, state, pairs)) in schemes.into_iter().zip(needs) { + let theme = kde::from_scheme(&scheme); + let p = palette(&theme); + for pair in pairs { + let (got, floor) = pair.contrast(p, state); + assert!(got < floor, "{name}: {pair:?} already passes, {got:.2}:1"); + // An inactive-effects scheme earns its place by the effect: the + // Inactive colour falls further short than the Active one. + if state == ColorState::Inactive { + let (active, _) = pair.contrast(p, ColorState::Active); + assert!( + got < active, + "{name}: {pair:?} is no worse inactive ({got:.2}:1) than active ({active:.2}:1)" + ); + } + } + } +} + +// ── Random coherent schemes ───────────────────────────────────────────── + +/// One 8-bit triple with every channel in `range`. Cost: three bytes. +fn arb_triple(range: std::ops::RangeInclusive) -> impl Strategy { + [range.clone(), range.clone(), range] +} + +/// A set of twelve colours: both backgrounds on the scheme's side, the +/// normal text on the other, the other nine free. Cost: twelve triples. +fn arb_set(dark: bool) -> impl Strategy { + let (side, text) = if dark { + (0..=45, 200..=255) + } else { + (210..=255, 0..=60) + }; + ( + arb_triple(side.clone()), + arb_triple(side), + arb_triple(text), + prop::collection::vec(any::<[u8; 3]>(), 9), + ) + .prop_map(|(bg, alt, fg, free)| { + let mut rows = [[0u8; 3]; 12]; + rows[0] = bg; + rows[1] = alt; + rows[2] = fg; + rows[3..].copy_from_slice(&free); + SetColors::from_rgb8(rows) + }) +} + +/// A coherent random scheme. +/// +/// Coherent means its surfaces are on one side, every window, view, button +/// and tooltip background light (channels 210 to 255) or dark (0 to 45), +/// and its normal texts on the other (0 to 60, or 200 to 255): the primary +/// text then reads on every plain surface, which no lift adjusts. Every +/// colour a lift or a rule derives (inactive text, links, status colours, +/// decorations, the whole selection set) is free, as are the frame contrast +/// and the contrast. +/// +/// Cost: four sets of twelve colours plus twelve free ones, two numbers and +/// a flag. Building the theme is the expensive part (see the module doc); +/// the scheme itself is about 60 triples. +fn arb_scheme() -> impl Strategy { + any::().prop_flat_map(|dark| { + ( + arb_set(dark), + arb_set(dark), + arb_set(dark), + arb_set(dark), + prop::collection::vec(any::<[u8; 3]>(), 12), + 0.0_f64..=1.0, + 0_i32..=10, + ) + .prop_map( + move |(view, window, button, tooltip, selection, fc, contrast)| { + let mut scheme = if dark { + KdeColorScheme::breeze_dark() + } else { + KdeColorScheme::breeze_light() + }; + scheme.sets[ColorSet::View.index()] = view; + scheme.sets[ColorSet::Window.index()] = window; + scheme.sets[ColorSet::Button.index()] = button; + scheme.sets[ColorSet::Tooltip.index()] = tooltip; + let mut rows = [[0u8; 3]; 12]; + rows.copy_from_slice(&selection); + scheme.sets[ColorSet::Selection.index()] = SetColors::from_rgb8(rows); + scheme.frame_contrast = fc; + scheme.contrast = contrast; + scheme + }, + ) + }) +} + +// ── 1. every declared pair of every coherent scheme reaches its floor in +// all four paint states: 4.5:1 text and 3:1 non-text for an active +// and an inactive window, 7:1 and 4.5:1 under high contrast ── +proptest! { + #[test] + fn every_coherent_scheme_meets_its_floors_in_every_paint_state(scheme in arb_scheme()) { + let theme = kde::from_scheme(&scheme); + for (active, high_contrast) in [(true, false), (false, false), (true, true), (false, true)] { + let (text, non_text) = if high_contrast { (7.0, 4.5) } else { (TEXT, NON_TEXT) }; + let f = failures(&paint(&theme, active, high_contrast), text, non_text); + prop_assert!( + f.is_empty(), + "active {} high contrast {}: {:?}\nscheme {:?}", + active, high_contrast, f, scheme.sets, + ); + } + } +} diff --git a/crates/teksilo-theme-kde/tests/high_contrast.rs b/crates/teksilo-theme-kde/tests/high_contrast.rs new file mode 100644 index 000000000..82e846100 --- /dev/null +++ b/crates/teksilo-theme-kde/tests/high_contrast.rs @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze preset's own high-contrast projection. +//! +//! Under the OS "increase contrast" preference every text must reach 7:1 on +//! what it is set on (WCAG SC 1.4.6) and every boundary, focus ring and the +//! accent 4.5:1, for Breeze Light and Dark, each of Plasma's ten accents on +//! both, and an active and an inactive window. +//! +//! The selection fill is the one fill held to its text only. It carries the +//! window's text at 7:1, and the window's text is at 7:1 on the window, so +//! no fill can also reach 4.5:1 on the window: the last tests check that +//! premise and that the fill keeps its text. + +use teksilo_core::styles::{PaintState, Theme}; +use teksilo_theme_kde::{self as kde, PlasmaAccent}; +use teksilo_tokens::contrast::composite_contrast; +use teksilo_tokens::{Color, ColorTokens}; + +/// `[wcag]` SC 1.4.6 for text, and Teksilo's 4.5:1 for everything else. +const TEXT: f32 = 7.0; +const NON_TEXT: f32 = 4.5; + +fn high_contrast(theme: &Theme, window_active: bool) -> ColorTokens { + theme + .for_paint_state(PaintState { + window_active, + high_contrast: true, + }) + .colors +} + +fn themes() -> Vec<(String, Theme)> { + let mut out = vec![ + ("Breeze Light".to_owned(), kde::light()), + ("Breeze Dark".to_owned(), kde::dark()), + ]; + for accent in PlasmaAccent::ALL { + out.push(( + format!("Breeze Light, {accent}"), + kde::light_with_accent(accent.color()), + )); + out.push(( + format!("Breeze Dark, {accent}"), + kde::dark_with_accent(accent.color()), + )); + } + out +} + +/// Every pair of `c` below its high-contrast floor. +fn failures(c: &ColorTokens) -> Vec { + let surfaces = [ + ("surface_main", c.surface_main), + ("surface_content", c.surface_content), + ("surface_raised", c.surface_raised), + ("surface_container", c.surface_container), + ("surface_container_raised", c.surface_container_raised), + ("surface_sunken", c.surface_sunken), + ("surface_alt_row", c.surface_alt_row), + ("surface_hover", c.surface_hover), + ("surface_pressed", c.surface_pressed), + ]; + let mut pairs: Vec<(String, Color, Color, f32)> = Vec::new(); + for (name, fg) in [ + ("text_primary", c.text_primary), + ("text_secondary", c.text_secondary), + ("text_link", c.text_link), + ("text_link_hover", c.text_link_hover), + ("text_link_visited", c.text_link_visited), + ("text_error", c.text_error), + ("text_warning", c.text_warning), + ("text_success", c.text_success), + ("status_info_fg", c.status_info_fg), + ] { + for (bg_name, bg) in surfaces { + pairs.push((format!("{name} on {bg_name}"), fg, bg, TEXT)); + } + } + for (bg_name, bg) in [ + ("accent", c.accent), + ("accent_hover", c.accent_hover), + ("accent_pressed", c.accent_pressed), + ] { + pairs.push(( + format!("text_on_accent on {bg_name}"), + c.text_on_accent, + bg, + TEXT, + )); + } + for (name, fg, bg) in [ + ( + "text_primary on surface_selected", + c.text_primary, + c.surface_selected, + ), + ( + "selection_text_active on selection_bg_active", + c.selection_text_active, + c.selection_bg_active, + ), + ( + "selection_text_inactive on selection_bg_inactive", + c.selection_text_inactive, + c.selection_bg_inactive, + ), + ("editor_fg on editor_bg", c.editor_fg, c.editor_bg), + ( + "editor_fg on editor_selection_bg", + c.editor_fg, + c.editor_selection_bg, + ), + ( + "editor_gutter_fg on editor_bg", + c.editor_gutter_fg, + c.editor_bg, + ), + ("tooltip_text on tooltip_bg", c.tooltip_text, c.tooltip_bg), + ( + "tooltip_shortcut on tooltip_bg", + c.tooltip_shortcut, + c.tooltip_bg, + ), + ( + "status_error_fg on status_error_bg", + c.status_error_fg, + c.status_error_bg, + ), + ("text_on_error on text_error", c.text_on_error, c.text_error), + ] { + pairs.push((name.to_owned(), fg, bg, TEXT)); + } + for (name, fg) in [ + ("accent", c.accent), + ("focus_ring", c.focus_ring), + ("border_focused", c.border_focused), + ("border_strong", c.border_strong), + ("divider_strong", c.divider_strong), + ("border_error", c.border_error), + ("border_warning", c.border_warning), + ] { + for (bg_name, bg) in [ + ("surface_main", c.surface_main), + ("surface_content", c.surface_content), + ("surface_raised", c.surface_raised), + ] { + pairs.push((format!("{name} on {bg_name}"), fg, bg, NON_TEXT)); + } + } + for (name, fg) in [ + ("scrollbar_thumb", c.scrollbar_thumb), + ("scrollbar_thumb_hover", c.scrollbar_thumb_hover), + ] { + for (bg_name, bg) in [ + ("surface_main", c.surface_main), + ("surface_content", c.surface_content), + ] { + pairs.push((format!("{name} on {bg_name}"), fg, bg, NON_TEXT)); + } + } + pairs + .into_iter() + .filter(|(_, fg, bg, floor)| composite_contrast(*fg, *bg) < *floor) + .map(|(name, fg, bg, floor)| { + format!("{name}: {:.2}:1 < {floor}", composite_contrast(fg, bg)) + }) + .collect() +} + +#[test] +fn every_swatch_meets_the_enhanced_floors_in_both_window_states() { + let mut all = Vec::new(); + for (name, theme) in themes() { + for (state, active) in [("active", true), ("inactive", false)] { + for failure in failures(&high_contrast(&theme, active)) { + all.push(format!("{name}, {state}: {failure}")); + } + } + } + assert!( + all.is_empty(), + "{} failures:\n{}", + all.len(), + all.join("\n") + ); +} + +#[test] +fn secondary_text_is_the_primary_text() { + for (name, theme) in themes() { + for active in [true, false] { + let c = high_contrast(&theme, active); + assert_eq!(c.text_secondary, c.text_primary, "{name}"); + assert_eq!(c.tooltip_shortcut, c.tooltip_text, "{name}"); + assert_eq!(c.editor_gutter_fg, c.editor_fg, "{name}"); + } + } +} + +#[test] +fn the_frame_outline_is_the_text_at_full_frame_contrast() { + for theme in [kde::light(), kde::dark()] { + let c = high_contrast(&theme, true); + assert_eq!(c.border, c.text_primary); + assert_eq!(c.divider, c.text_primary); + } +} + +/// The documented exception to Plasma's black text on the accent: in a +/// light scheme the accent darkens and its text is white. +#[test] +fn a_light_scheme_puts_white_text_on_a_darkened_accent() { + let normal = kde::light(); + let c = high_contrast(&normal, true); + assert_eq!(normal.colors.text_on_accent, Color::BLACK); + assert_eq!(c.text_on_accent, Color::WHITE); + assert!(c.accent.relative_luminance() < normal.colors.accent.relative_luminance()); + let dark = high_contrast(&kde::dark(), true); + assert_eq!(dark.text_on_accent, Color::BLACK); +} + +/// The premise of that exception: no colour lets black text reach 7:1 on +/// it while it reaches 4.5:1 on Breeze Light's window. +#[test] +fn no_accent_carries_black_text_and_clears_a_light_window() { + let window = kde::light().colors.surface_main; + let mut found = None; + for v in 0..=255u8 { + let grey = Color::new( + f32::from(v) / 255.0, + f32::from(v) / 255.0, + f32::from(v) / 255.0, + 1.0, + ); + if composite_contrast(Color::BLACK, grey) >= TEXT + && composite_contrast(grey, window) >= NON_TEXT + { + found = Some(v); + } + } + // Luminance decides both ratios, and a grey reaches every luminance. + assert_eq!(found, None); +} + +#[test] +fn the_high_contrast_tokens_differ_from_the_normal_ones() { + for theme in [kde::light(), kde::dark()] { + assert_ne!(high_contrast(&theme, true), theme.colors); + assert_ne!(high_contrast(&theme, false), high_contrast(&theme, true)); + } +} + +/// The contrast of two relative luminances. +fn luminance_ratio(a: f32, b: f32) -> f32 { + (a.max(b) + 0.05) / (a.min(b) + 0.05) +} + +/// The premise of the high-contrast selection's limitation: for every +/// swatch and window state, no luminance a fill could have puts the +/// primary text at 7:1 on it and the fill at 4.5:1 on the window. Both +/// ratios depend on luminance alone, so a sweep of it covers every colour. +#[test] +fn no_selection_fill_carries_the_text_and_clears_the_window() { + for (name, theme) in themes() { + for active in [true, false] { + let c = high_contrast(&theme, active); + let text = c.text_primary.relative_luminance(); + let window = c.surface_main.relative_luminance(); + assert!(luminance_ratio(text, window) >= TEXT, "{name}"); + let found = (0..=100_000u32) + .map(|i| i as f32 / 100_000.0) + .find(|&fill| { + luminance_ratio(text, fill) >= TEXT && luminance_ratio(fill, window) >= NON_TEXT + }); + assert_eq!(found, None, "{name}, active {active}"); + } + } +} + +/// What the projection does instead: the selection fill keeps the primary +/// and the editor text at 7:1, and stays below 4.5:1 on the window, as the +/// premise above forces. +#[test] +fn the_selection_fill_is_held_to_its_text() { + for (name, theme) in themes() { + for active in [true, false] { + let c = high_contrast(&theme, active); + for fill in [ + c.surface_selected, + c.selection_bg_active, + c.editor_selection_bg, + ] { + assert!(composite_contrast(c.text_primary, fill) >= TEXT, "{name}"); + assert!(composite_contrast(c.editor_fg, fill) >= TEXT, "{name}"); + assert!( + composite_contrast(fill, c.surface_main) < NON_TEXT, + "{name}" + ); + } + } + } + // The figures the colour mapping's documentation gives. + for (theme, normal, high) in [(kde::light(), 2.18, 1.90), (kde::dark(), 3.40, 2.19)] { + let n = &theme.colors; + let h = high_contrast(&theme, true); + let normal_ratio = composite_contrast(n.surface_selected, n.surface_main); + let high_ratio = composite_contrast(h.surface_selected, h.surface_main); + assert!((normal_ratio - normal).abs() < 0.01, "{normal_ratio}"); + assert!((high_ratio - high).abs() < 0.01, "{high_ratio}"); + } +} diff --git a/engineering/docs/kde-breeze-spec.md b/engineering/docs/kde-breeze-spec.md index 8c6f333fb..cae010c2f 100644 --- a/engineering/docs/kde-breeze-spec.md +++ b/engineering/docs/kde-breeze-spec.md @@ -2293,8 +2293,13 @@ Easing facts: out quadratic; the preset approximates it by `CubicBezier(0.455, 0.03, 0.515, 0.955)` **[derived]** with a test bounding the maximum deviation from the quadratic ease-in-out at 0.02. -- The switch handle colour uses an ease-in cubic; approximated by - `CubicBezier(0.55, 0.055, 0.675, 0.19)` **[derived]**. +- The switch handle colour uses an ease-in cubic, `t` cubed. The preset + writes it exactly as `CubicBezier(1/3, 0, 2/3, 0)` **[derived]**: with + its control points at one and two thirds along and none of the way up, + a cubic Bezier's horizontal coordinate is its parameter and its vertical + one the parameter cubed. The common approximation + `CubicBezier(0.55, 0.055, 0.675, 0.19)` strays 0.03 from it and is not + used. - An ease-out cubic appears in the QtQuick **Breeze** style (a different style package) for its switch border colour; the desktop style that Kirigami desktop apps use does not use it. Teksilo does not use diff --git a/engineering/docs/property-testing.md b/engineering/docs/property-testing.md index 2fec37fb3..921915e0d 100644 --- a/engineering/docs/property-testing.md +++ b/engineering/docs/property-testing.md @@ -412,6 +412,7 @@ being wrong. | `teksilo-core` | [`tests/pointer_invariants.rs`](../../crates/teksilo-core/tests/pointer_invariants.rs), [`tests/prop_kinetic.rs`](../../crates/teksilo-core/tests/prop_kinetic.rs), [`tests/text_run_invariants.rs`](../../crates/teksilo-core/tests/text_run_invariants.rs) | | `teksilo-tokens` | [`tests/prop_color.rs`](../../crates/teksilo-tokens/tests/prop_color.rs) | | `teksilo-kde-scheme` | [`tests/prop_config.rs`](../../crates/teksilo-kde-scheme/tests/prop_config.rs), [`tests/prop_math.rs`](../../crates/teksilo-kde-scheme/tests/prop_math.rs) | +| `teksilo-theme-kde` | [`tests/contrast.rs`](../../crates/teksilo-theme-kde/tests/contrast.rs) | | `teksilo-data` | [`tests/prop_list_and_selection.rs`](../../crates/teksilo-data/tests/prop_list_and_selection.rs), [`tests/prop_tree_slice.rs`](../../crates/teksilo-data/tests/prop_tree_slice.rs), [`tests/prop_tree_checked.rs`](../../crates/teksilo-data/tests/prop_tree_checked.rs), [`tests/prop_sort_filter.rs`](../../crates/teksilo-data/tests/prop_sort_filter.rs) | | `teksilo-scene` | [`src/index.rs`](../../crates/teksilo-scene/src/index.rs) (`mod proptests`, inline), [`tests/prop_selection_modes.rs`](../../crates/teksilo-scene/tests/prop_selection_modes.rs) | | `teksilo-widgets` | [`src/common/row_offsets.rs`](../../crates/teksilo-widgets/src/common/row_offsets.rs), [`src/common/row_metrics.rs`](../../crates/teksilo-widgets/src/common/row_metrics.rs), [`src/primitives/column_flow.rs`](../../crates/teksilo-widgets/src/primitives/column_flow.rs), [`src/common/column_geometry.rs`](../../crates/teksilo-widgets/src/common/column_geometry.rs), [`src/splitter/distribute.rs`](../../crates/teksilo-widgets/src/splitter/distribute.rs) (all `mod proptests`, inline) | From 7821b2039be9157119f012ce3d64e8da0f52282b Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 16:03:36 +0200 Subject: [PATCH 22/59] feat(theme-kde): paint Button, IconButton and SplitButton as Breeze does The preset now installs three structural styles, in a styles module laid out like the macOS preset's: button, icon_button and split_button, built on one painter, chrome::BreezeButtonChrome, with their dimensions in styles::metrics. The three slots leave KDE_UNFILLED. The painter follows spec k.5.1 and k.5.2. A frame is the node inset by 1 (room for the shadow) and stroked with the 1 px pen at radius 4.5. The push button is a flat Button-colour fill in the button outline, the outline turning to the highlight on hover or keyboard focus and the fill moving 30 % toward it while pressed. The default button, in an active window only, fills Mix(Button, Highlight, 0.2) and outlines Mix(Highlight, button outline, 0.5). The flat button paints nothing at rest, the highlight outline with no fill under the pointer, the highlight at 0.3 pressed and the button text at 0.125 checked. The 1 px shadow is shadow_xs, black at 0.125 one pixel down, only in an active window and never on a flat, pressed, checked or disabled button. Keyboard focus adds the 2 px focus frame from 1 px inside to 1 px outside the node in the focus_ring token (D5, opaque). Colours are resolved at paint time from the theme the walker hands the widget, so the inactive and high-contrast projections apply. Where the specification and the plan differ, the specification is followed: Breeze outlines and fills with the active window's Highlight whatever the window state, so while the theme paints its KdePalette's own accent the highlight and pressed fill come from the palette's active tokens for the same contrast preference; a theme whose accent the app changed paints its own. The neutral colours come from KdePalette: BreezeColors gains button and button_text, and KdePalette::breeze_colors gives the combinations of the high-contrast scheme too (frame contrast 1, so the outline is the button text). Without the palette the frame paints the content surface, primary text and border roles. Variants: Filled is the default button, Plain, Tinted, Outlined and Destructive the push button, Ghost and Link the flat button; Filled and Destructive label in the primary text. IconButton is the auto-raise tool button at 24 (the density's target size, [unpublished]), 28, 34, 44 and 60 for its five sizes, through dp(.., Target); every rung clears the conformance floor, so no conformance box is built. The framed tool button (32, 38) has no IconButton form and stays geometry data. A SplitButton has the push button's frame; its Filled and Destructive variants are filled with the accent ([unpublished]), because the widget labels them in the on-accent text with no style hook and Breeze Dark's default-button fill would not carry it. A push button and a split button are the body line box plus 8 px above and below, at least 84 wide, 34 at Compact and Comfortable and 44 at Touch, the horizontal gutter scaled by the density's spacing. Tests: chrome rules per kind and state, the Breeze Light and Dark values of every rule against Plasma's pixel samples, the backdrop-window highlight, high contrast, the palette-less fallback, the frame and focus geometry; tests/mount.rs mounts every variant, size and swatch, light and dark, swaps light, dark, Int UI and back, drops KdePalette, and checks the face, outline, shadow, default blend, hover outline, pressed fill, inactive window, flat and tool-button states and the focus frame against tools/kde_golden/vectors/pixels.json; tests/preset_metrics.rs measures Button, IconButton and SplitButton in a tappable row at all three densities against sizes.json, with the conformance gate. Both read the vectors, so they are excluded from the package. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 16 +- Cargo.lock | 2 + crates/teksilo-theme-kde/Cargo.toml | 20 +- crates/teksilo-theme-kde/src/geometry.rs | 4 + crates/teksilo-theme-kde/src/lib.rs | 61 +- crates/teksilo-theme-kde/src/palette.rs | 40 + crates/teksilo-theme-kde/src/styles.rs | 20 + crates/teksilo-theme-kde/src/styles/button.rs | 155 ++++ crates/teksilo-theme-kde/src/styles/chrome.rs | 826 ++++++++++++++++++ .../src/styles/icon_button.rs | 97 ++ .../teksilo-theme-kde/src/styles/metrics.rs | 212 +++++ .../src/styles/split_button.rs | 112 +++ crates/teksilo-theme-kde/tests/mount.rs | 638 ++++++++++++++ .../teksilo-theme-kde/tests/preset_metrics.rs | 305 +++++++ 14 files changed, 2473 insertions(+), 35 deletions(-) create mode 100644 crates/teksilo-theme-kde/src/styles.rs create mode 100644 crates/teksilo-theme-kde/src/styles/button.rs create mode 100644 crates/teksilo-theme-kde/src/styles/chrome.rs create mode 100644 crates/teksilo-theme-kde/src/styles/icon_button.rs create mode 100644 crates/teksilo-theme-kde/src/styles/metrics.rs create mode 100644 crates/teksilo-theme-kde/src/styles/split_button.rs create mode 100644 crates/teksilo-theme-kde/tests/mount.rs create mode 100644 crates/teksilo-theme-kde/tests/preset_metrics.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index b7a7e8df8..c83dab1d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -144,9 +144,19 @@ by crate for clarity, not because crates version independently. colours, the focus colour, strong outlines, the scroll-bar thumb and the text on the accent) are made readable, keeping their hue. Every theme carries a `KdePalette` with the whole resolved scheme and the colours - Breeze combines from it, and `geometry::BreezeGeometry` gives the Breeze - control heights for any font size. Widgets draw Teksilo's own chrome in - these colours and shapes: no Breeze widget style is installed. + Breeze combines from it (`breeze_colors` gives them for the high-contrast + colours too), and `geometry::BreezeGeometry` gives the Breeze control + heights for any font size. Buttons are Breeze's: a `Button` is the push + button, 34 px tall and at least 84 px wide at Plasma's default font, its + outline turning to the highlight under the pointer or keyboard focus and a + 1 px shadow below it in an active window; its `Filled` variant is the + default button, tinted toward the highlight, and `Ghost` and `Link` are + the flat button, which shows nothing until hovered. An `IconButton` is the + toolbar's tool button, 28 px around a 16 px icon and 34 px around a + toolbar one, and a `SplitButton` has the push button's frame, its `Filled` + and `Destructive` variants filled with the accent so their label stays + readable. All three grow to the density's target size. Other widgets draw + Teksilo's own chrome in these colours and shapes. #### Platform diff --git a/Cargo.lock b/Cargo.lock index b2cf15dd6..e74427cbb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12237,7 +12237,9 @@ dependencies = [ "serde_json", "teksilo-canvas", "teksilo-core", + "teksilo-i18n", "teksilo-kde-scheme", + "teksilo-target-conformance", "teksilo-tokens", "teksilo-widgets", "thiserror 2.0.21", diff --git a/crates/teksilo-theme-kde/Cargo.toml b/crates/teksilo-theme-kde/Cargo.toml index 44b7d9792..6c35ac92b 100644 --- a/crates/teksilo-theme-kde/Cargo.toml +++ b/crates/teksilo-theme-kde/Cargo.toml @@ -14,10 +14,11 @@ description = "KDE Plasma theme preset for Teksilo: the Breeze design language a documentation = "https://docs.rs/teksilo-theme-kde" keywords = ["kde", "plasma", "breeze", "theme", "gui"] categories = ["gui"] -# `tests/contrast.rs` reads the golden vectors under `tools/kde_golden` for -# the Oxygen schemes; left in, it would not compile from the package and -# `cargo test` there would fail. -exclude = ["tests/contrast.rs"] +# `tests/contrast.rs`, `tests/mount.rs` and `tests/preset_metrics.rs` read +# the golden vectors under `tools/kde_golden` (the Oxygen schemes, Plasma's +# painted pixels and its control sizes); left in, they would not compile +# from the package and `cargo test` there would fail. +exclude = ["tests/contrast.rs", "tests/mount.rs", "tests/preset_metrics.rs"] [dependencies] teksilo-core = { workspace = true } @@ -39,8 +40,17 @@ thiserror = { workspace = true } # toolchain, which is not a guaranteed CI dependency; proptest gives the same # coverage plus shrinking on stable (see the workspace `Cargo.toml`). proptest = { workspace = true } -# Reads the Oxygen schemes in `tools/kde_golden/vectors/resolve.json`. +# Reads the golden vectors in `tools/kde_golden/vectors`. serde_json = { workspace = true } +# `tests/mount.rs` and `tests/preset_metrics.rs` build real widget trees; +# `lit!` supplies the untranslated labels those constructors take. +teksilo-i18n = { workspace = true } +# `tests/preset_metrics.rs` reuses the conformance harness's +# `in_tappable_row`, the row geometry that denies the miss-only slop pass, +# rather than a copy that could drift from the gate's. Path-only (no +# version): the crate is `publish = false`, and cargo strips versionless +# path dev-dependencies at publish time. +teksilo-target-conformance = { path = "../teksilo-target-conformance" } [package.metadata.docs.rs] all-features = true diff --git a/crates/teksilo-theme-kde/src/geometry.rs b/crates/teksilo-theme-kde/src/geometry.rs index 87cd8333e..7f0b196f4 100644 --- a/crates/teksilo-theme-kde/src/geometry.rs +++ b/crates/teksilo-theme-kde/src/geometry.rs @@ -124,6 +124,10 @@ pub const GROUP_BOX_TITLE_MARGIN: f32 = 4.0; pub const SMALL_ICON_SIZE: f32 = 16.0; /// `[K]` The small-medium icon size, used by larger tool buttons. pub const SMALL_MEDIUM_ICON_SIZE: f32 = 22.0; +/// `[K]` The medium icon size. +pub const MEDIUM_ICON_SIZE: f32 = 32.0; +/// `[K]` The large icon size. +pub const LARGE_ICON_SIZE: f32 = 48.0; /// Every Breeze control height that follows the font, for one body line /// height. diff --git a/crates/teksilo-theme-kde/src/lib.rs b/crates/teksilo-theme-kde/src/lib.rs index 2f602328f..9a5043606 100644 --- a/crates/teksilo-theme-kde/src/lib.rs +++ b/crates/teksilo-theme-kde/src/lib.rs @@ -36,16 +36,20 @@ //! - **One radius.** Controls and floating surfaces share Breeze's 5 px //! frame radius (4.5 where a 1 px outline is stroked), between Fluent's 4 //! and macOS's 6 and 10. -//! - **Breeze's outline colours.** A Breeze control is outlined in the -//! window colour moved a fifth of the way to the text (the frame -//! contrast), the `border` token. The highlight-based outlines Breeze -//! turns to under the pointer or keyboard focus are in [`BreezeColors`]; -//! the recipe styles this version keeps draw the plain outline only. +//! - **Breeze's buttons.** A push button is a flat fill outlined in the +//! button colour moved a fifth of the way to its text (the frame +//! contrast), with an outline that turns to the highlight under the +//! pointer or keyboard focus and a 1 px shadow below it in an active +//! window; the default button's fill moves toward the highlight, and a +//! tool button shows nothing until it is hovered ([`styles`]). Other +//! controls are outlined in the window colour moved the same way toward +//! the text, the `border` token; the highlight-based outlines are in +//! [`BreezeColors`]. //! - **Breeze's focus ring geometry.** Keyboard focus is a 2 px band, half //! inside the control and half outside, in the scheme's focus colour. //! Breeze paints it at 30 % ([`shape::BREEZE_FOCUS_RING_ALPHA`]); the -//! `focus_ring` token is opaque, lifted to 3:1, and the recipe styles -//! draw it as it is. +//! `focus_ring` token is opaque, lifted to 3:1, and the styles draw it as +//! it is. //! - **Linear, quick motion.** Style transitions run 100 ms, linearly. //! - **Text-driven heights.** A push button is the text line plus 16 px, a //! field the line plus 14: 34 and 32 px at Plasma's default font, and @@ -90,9 +94,15 @@ //! //! ## Known limitations //! -//! - **Widget chrome is the framework's.** This version installs no Breeze -//! widget styles: every widget keeps Teksilo's recipe style, painted in -//! the Breeze colours, radii, focus ring, typography and motion. +//! - **Most widget chrome is the framework's.** This version installs +//! Breeze styles for `Button`, `IconButton` and `SplitButton` only: every +//! other widget keeps Teksilo's recipe style, painted in the Breeze +//! colours, radii, focus ring, typography and motion. +//! - **A filled `SplitButton` is filled with the accent.** The widget labels +//! its `Filled` and `Destructive` variants in the on-accent text and gives +//! its style no say, so they are framed in the accent rather than as +//! Breeze's default button, whose light fill would not carry that text in +//! a dark scheme ([`styles::split_button`]). //! - **The fonts are not Plasma's.** The text sizes and line boxes are Noto //! Sans and Hack's at Plasma's default sizes, drawn in Teksilo's bundled //! Inter and JetBrains Mono. @@ -109,11 +119,14 @@ pub mod geometry; pub mod motion; pub mod palette; pub mod shape; +pub mod styles; pub mod typography; pub use palette::{BreezeColors, KdePalette, PlasmaAccent, UnknownPlasmaAccent}; pub use teksilo_kde_scheme as scheme; +use std::rc::Rc; + use teksilo_core::presets::intui; use teksilo_core::styles::{DensityProjection, PaintProjection, PaintState, Theme}; use teksilo_kde_scheme::KdeColorScheme; @@ -243,11 +256,17 @@ fn project(theme: &Theme, state: PaintState) -> Theme { /// Install the Breeze Tier-3 chrome. /// -/// This version installs none: every slot is left to the widget's recipe -/// style, which paints from the Breeze tokens, and the crate's tests list -/// the reason for each slot. Every slot this installs reads its metrics -/// from `theme.input`, so [`reproject`] can rerun it alone. -fn install_styles(_theme: &mut Theme) {} +/// The buttons are Breeze's own ([`styles`]); every other slot is left to +/// the widget's recipe style, which paints from the Breeze tokens, and the +/// crate's tests list the reason for each. Every style installed here reads +/// its metrics from the theme it builds under, `theme.input` included, so +/// [`reproject`] can rerun this alone. +fn install_styles(theme: &mut Theme) { + let slots = &mut theme.style_slots; + slots.button = Some(Rc::new(styles::button::BreezeButtonStyle)); + slots.icon_button = Some(Rc::new(styles::icon_button::BreezeIconButtonStyle)); + slots.split_button = Some(Rc::new(styles::split_button::BreezeSplitButtonStyle)); +} #[cfg(test)] mod tests { @@ -442,22 +461,10 @@ mod tests { /// Every slot this commit leaves to the widget's own recipe style, with /// the reason it is inherited rather than filled. const KDE_UNFILLED: &[(&str, &str)] = &[ - ( - "button", - "no Breeze push-button frame is installed; the recipe button paints from the Breeze accent, surface and border tokens", - ), - ( - "split_button", - "no Breeze split-button frame is installed; the recipe frame paints from the Breeze surface and border roles", - ), ( "splitter", "the recipe's thin divider in the border role reads as Breeze's 1 px splitter handle", ), - ( - "icon_button", - "no Breeze tool-button frame is installed; the recipe paints its hover and press from the Breeze surface tokens", - ), ( "toggle", "no Breeze switch is installed; the recipe switch reads the Breeze accent and border tokens", diff --git a/crates/teksilo-theme-kde/src/palette.rs b/crates/teksilo-theme-kde/src/palette.rs index c774065ba..87d984051 100644 --- a/crates/teksilo-theme-kde/src/palette.rs +++ b/crates/teksilo-theme-kde/src/palette.rs @@ -70,6 +70,10 @@ pub struct BreezeColors { pub focus_outline: Color, /// `[Hp]` The hover colour moved 15 % toward the window text. pub hover_outline: Color, + /// `[qt]` The button colour, a push button's face. + pub button: Color, + /// `[qt]` The text of a button. + pub button_text: Color, /// `[Hp]` A push button's outline: the button colour moved toward the /// button text by `fc`. pub button_outline: Color, @@ -100,6 +104,8 @@ impl BreezeColors { hover: hover.to_color(), focus_outline: mix(focus, window_text, OUTLINE_TOWARD_TEXT).to_color(), hover_outline: mix(hover, window_text, OUTLINE_TOWARD_TEXT).to_color(), + button: button.to_color(), + button_text: button_text.to_color(), button_outline, slider_outline: button_outline, shadow: Color::BLACK.with_alpha(CONTROL_SHADOW_ALPHA), @@ -123,6 +129,8 @@ pub struct KdePalette { dark: bool, /// Indexed by [`ColorState::index`]. colors: [BreezeColors; 3], + /// The same for the high-contrast scheme, indexed alike. + high_contrast_colors: [BreezeColors; 3], active: ColorTokens, inactive: ColorTokens, high_contrast: ColorTokens, @@ -172,6 +180,8 @@ impl KdePalette { KdePalette { colors: ColorState::ALL .map(|state| BreezeColors::compute(&resolved, state, frame_contrast)), + high_contrast_colors: ColorState::ALL + .map(|state| BreezeColors::compute(&enhanced_resolved, state, 1.0)), resolved: Arc::new(resolved), frame_contrast, dark, @@ -207,6 +217,18 @@ impl KdePalette { &self.colors[state.index()] } + /// Breeze's colour combinations for `state`, from the high-contrast + /// scheme when `high_contrast` is set: the scheme at a frame contrast of + /// 1 and a contrast of 10, the one the high-contrast tokens come from, + /// where an outline is the text colour itself. + pub fn breeze_colors(&self, state: ColorState, high_contrast: bool) -> &BreezeColors { + if high_contrast { + &self.high_contrast_colors[state.index()] + } else { + &self.colors[state.index()] + } + } + /// The colour tokens a window paints with in `state`. /// /// An active window paints the active tokens. An inactive one paints the @@ -402,9 +424,27 @@ mod tests { mix(r(PaletteRole::Button), r(PaletteRole::ButtonText), 0.2).to_color() ); assert_eq!(c.slider_outline, c.button_outline); + assert_eq!(c.button, r(PaletteRole::Button).to_color()); + assert_eq!(c.button_text, r(PaletteRole::ButtonText).to_color()); assert!((c.shadow.a() - 0.125).abs() < 1e-6); } + #[test] + fn the_high_contrast_combinations_outline_in_the_text_colour() { + let p = KdePalette::from_scheme(&KdeColorScheme::breeze_light()); + for state in ColorState::ALL { + assert_eq!(p.breeze_colors(state, false), p.colors(state)); + let hc = p.breeze_colors(state, true); + // At a frame contrast of 1 the outline is the text itself. + assert_eq!(hc.button_outline, hc.button_text); + assert_eq!(hc.frame_outline, p.role(state, PaletteRole::WindowText)); + } + assert_ne!( + p.breeze_colors(ColorState::Active, true).button_outline, + p.colors(ColorState::Active).button_outline + ); + } + #[test] fn palettes_compare_by_content() { let a = KdePalette::from_scheme(&KdeColorScheme::breeze_light()); diff --git a/crates/teksilo-theme-kde/src/styles.rs b/crates/teksilo-theme-kde/src/styles.rs new file mode 100644 index 000000000..6c4efc8e9 --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles.rs @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Breeze Tier-3 widget styles, installed into the theme's `style_slots` by +//! [`crate::light`], [`crate::dark`] and every constructor built on +//! [`crate::from_scheme`]. +//! +//! Widgets whose Breeze counterpart differs in **structure** get a real +//! `impl FooStyle` here: the push button, the default button and the flat +//! tool button, with their outline that turns to the highlight under the +//! pointer and their one-pixel shadow. They share one painter, +//! [`chrome::BreezeButtonChrome`]. The dimensions they are built with, all +//! derived from [`crate::geometry`] and the density ladder, are collected in +//! [`metrics`]. + +pub mod button; +pub mod chrome; +pub mod icon_button; +pub mod metrics; +pub mod split_button; diff --git a/crates/teksilo-theme-kde/src/styles/button.rs b/crates/teksilo-theme-kde/src/styles/button.rs new file mode 100644 index 000000000..e7a4d9286 --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/button.rs @@ -0,0 +1,155 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze push button. +//! +//! Breeze has three buttons, and the seven `ButtonVariant`s map onto them: +//! +//! | `ButtonVariant` | Breeze button | +//! | --- | --- | +//! | `Filled` | the default button (the dialog's default action) | +//! | `Plain` (default) / `Tinted` / `Outlined` | the push button | +//! | `Destructive` | the push button | +//! | `Ghost` / `Link` | the flat button | +//! +//! Breeze has no tonal or outlined emphasis tier: its push button is +//! already outlined, so `Tinted` and `Outlined` are the push button rather +//! than an invented fourth look. It has no destructive button either: a KDE +//! application says an action is destructive in its text and icon, so +//! `Destructive` is the push button too. The default button is Breeze's +//! one emphasised button, a fill moved a fifth of the way to the highlight, +//! and only in an active window; its label stays the button text. +//! [`crate::styles::chrome`] paints all three. +//! +//! ## Labels +//! +//! Every Breeze button labels in the button text, a flat one in the window +//! text: both are the primary text role. The Button gives its `Filled` and +//! `Destructive` labels the on-accent role by default, for an accent fill +//! Breeze does not paint, so this style asks for the primary role there. +//! `Link` keeps the link colour. +//! +//! ## Metrics +//! +//! A push button is the label's line box plus 8 px above and below (the 6 px +//! button margin and the 2 px frame margin), 34 px at Plasma's default +//! font, and at least 84 px wide: Breeze's `max(text + 12, 80) + 4`. A flat +//! push button keeps those dimensions. See [`crate::styles::metrics`]. + +use teksilo_core::build_context::BuildContext; +use teksilo_core::styles::{ButtonStyle, ButtonStyleConfig, ButtonVariant}; +use teksilo_core::widget_id::WidgetId; +use teksilo_tokens::TextRole; +use teksilo_widgets::primitives::{MinSize, Padding, ZStack}; + +use crate::styles::chrome::{BreezeButtonChrome, BreezeButtonKind, BreezeButtonState}; +use crate::styles::metrics::breeze_button_metrics_for; + +/// Breeze `ButtonStyle`. +#[derive(Debug, Default, Clone, Copy)] +pub struct BreezeButtonStyle; + +impl BreezeButtonStyle { + /// The Breeze button `variant` is painted as. + pub fn kind(variant: ButtonVariant) -> BreezeButtonKind { + match variant { + ButtonVariant::Filled => BreezeButtonKind::Default, + ButtonVariant::Plain + | ButtonVariant::Tinted + | ButtonVariant::Outlined + | ButtonVariant::Destructive => BreezeButtonKind::Push, + ButtonVariant::Ghost | ButtonVariant::Link => BreezeButtonKind::Flat, + } + } +} + +impl ButtonStyle for BreezeButtonStyle { + fn make_body(&self, cfg: &ButtonStyleConfig, ctx: &mut BuildContext) -> WidgetId { + let theme = ctx.theme(); + let m = breeze_button_metrics_for(&theme.input, &theme.typography); + let state = BreezeButtonState::derive( + &cfg.is_disabled, + &cfg.is_pressed, + &cfg.is_hovered, + &cfg.is_focused, + ); + // The Button's focus signal is already its `:focus-visible` one. + let show_focus_frame = cfg + .is_focused + .zip(&cfg.is_disabled) + .map(|(focused, disabled)| *focused && !*disabled); + let chrome = ctx.add(BreezeButtonChrome::new( + Self::kind(cfg.variant), + state, + show_focus_frame, + )); + let padded = ctx.add( + Padding::new( + m.padding_vertical, + m.padding_horizontal, + m.padding_vertical, + m.padding_horizontal, + ) + .child(cfg.label), + ); + let stack = ctx.add(ZStack::new().child(chrome).child(padded)); + ctx.add(MinSize::new(m.min_width, m.height).child(stack)) + } + + fn label_text_role(&self, variant: ButtonVariant) -> Option { + match variant { + // The default button's fill is the button colour moved toward + // the highlight, not the accent: its label is the button text. + ButtonVariant::Filled | ButtonVariant::Destructive => Some(TextRole::Primary), + // The push and flat buttons already label in the primary text, + // and `Link` in the link colour: the Button's own mapping. + _ => None, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn the_variants_map_onto_breezes_three_buttons() { + assert_eq!( + BreezeButtonStyle::kind(ButtonVariant::Filled), + BreezeButtonKind::Default + ); + for v in [ + ButtonVariant::Plain, + ButtonVariant::Tinted, + ButtonVariant::Outlined, + ButtonVariant::Destructive, + ] { + assert_eq!(BreezeButtonStyle::kind(v), BreezeButtonKind::Push, "{v:?}"); + } + for v in [ButtonVariant::Ghost, ButtonVariant::Link] { + assert_eq!(BreezeButtonStyle::kind(v), BreezeButtonKind::Flat, "{v:?}"); + } + } + + #[test] + fn no_variant_labels_in_the_on_accent_colour() { + let s = BreezeButtonStyle; + assert_eq!( + s.label_text_role(ButtonVariant::Filled), + Some(TextRole::Primary) + ); + assert_eq!( + s.label_text_role(ButtonVariant::Destructive), + Some(TextRole::Primary) + ); + for v in [ + ButtonVariant::Plain, + ButtonVariant::Tinted, + ButtonVariant::Outlined, + ButtonVariant::Ghost, + ButtonVariant::Link, + ] { + assert_eq!(s.label_text_role(v), None, "{v:?}"); + } + } +} diff --git a/crates/teksilo-theme-kde/src/styles/chrome.rs b/crates/teksilo-theme-kde/src/styles/chrome.rs new file mode 100644 index 000000000..25d5ca775 --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/chrome.rs @@ -0,0 +1,826 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The paint vocabulary the Breeze button styles share: the button frame, +//! its one-pixel shadow and the keyboard focus frame. +//! +//! All three are painted by [`BreezeButtonChrome`], a leaf widget that +//! resolves every colour from [`PaintContext::theme`] at paint time, so a +//! live theme swap repaints with the new palette and the theme's inactive +//! and high-contrast projections reach the frame with no code here. +//! +//! ## The frame +//! +//! A Breeze button is a rounded rectangle on the node inset by one pixel on +//! every side (room for the shadow), stroked with a 1 px pen on that +//! rectangle inset by half the pen, so the outline lies inside it and its +//! radius is 4.5 ([`BREEZE_STROKED_FRAME_RADIUS`](crate::shape::BREEZE_STROKED_FRAME_RADIUS)). +//! Three buttons share it: +//! +//! - the **push button**: a flat fill of the button colour, outlined in the +//! button colour moved toward the button text by the frame contrast, the +//! outline turning to the highlight under the pointer or keyboard focus, +//! and the fill moving 30 % toward the highlight while pressed; +//! - the **default button**, in an active window only: the button colour +//! moved 20 % toward the highlight, outlined half-way between the +//! highlight and the button outline; +//! - the **flat button** (a tool button or a flat push button): nothing at +//! rest, a highlight outline with no fill under the pointer, the highlight +//! at 30 % while pressed and the button text at 12.5 % while checked. +//! +//! The push and default buttons cast a 1 px shadow, black at 12.5 % one +//! pixel below the frame (`shadow_xs`), only in an active window and never +//! while pressed, checked or disabled; a flat button never casts one. +//! +//! ## Which highlight +//! +//! Breeze outlines and fills a button with the **active** window's +//! highlight whatever the window state, so a button hovered in a backdrop +//! window still lights up in the accent, not in the muted selection colour +//! an inactive Breeze window paints its selections with. While the theme +//! paints its [`KdePalette`]'s own accent, that highlight comes from the +//! palette's active tokens for the same contrast preference; a theme whose +//! accent the app changed paints its own accent, as projected. A disabled +//! button uses the disabled highlight. +//! +//! ## Without the palette +//! +//! The neutral button colours come from the [`KdePalette`] extension, which +//! carries the button colour, its text and its outline, three colours +//! `ColorTokens` has no slot for. A theme without the extension paints the +//! frame from its own roles instead: the content surface, the primary text +//! and the border, so a Breeze button dropped into another theme still +//! paints a sane frame. +//! +//! ## The focus frame +//! +//! Keyboard focus adds Breeze's 2 px focus frame, from 1 px inside the node +//! to 1 px outside it, its inner edge at the control radius, which is what +//! the shape tokens say (`focus_ring_width` 2, `focus_ring_offset` -1). +//! Breeze paints it in the highlight at 30 %; this paints the `focus_ring` +//! token, the focus colour lifted to 3:1 and opaque (D5 of the colour +//! mapping), so the indicator meets WCAG SC 1.4.11 on its own. + +use teksilo_canvas::{Canvas, Rect, SizeProposal}; +use teksilo_core::accessibility::AccessNodeBuilder; +use teksilo_core::binding::BindingLevel; +use teksilo_core::build_context::BuildContext; +use teksilo_core::signal::Signal; +use teksilo_core::styles::{FocusRingStroke, PaintState, Theme}; +use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement}; +use teksilo_core::widget_id::WidgetId; +use teksilo_kde_scheme::ColorState; +use teksilo_kde_scheme::KdeColor; +use teksilo_kde_scheme::math::mix; +use teksilo_tokens::{Color, CornerRadius, ShapeTokens}; + +use crate::palette::KdePalette; + +/// `[Hp]` How far a default button's fill moves from the button colour +/// toward the highlight. +pub const DEFAULT_BUTTON_FILL: f64 = 0.2; +/// `[Hp]` How far a default button's outline moves from the highlight toward +/// the button outline. +pub const DEFAULT_BUTTON_OUTLINE: f64 = 0.5; +/// `[Hp]` The alpha of a pressed flat button's highlight fill. +pub const FLAT_PRESSED_ALPHA: f32 = 0.3; +/// `[Hp]` How far a checked button's fill moves toward the button text, and +/// the alpha of a checked flat button's button-text fill. +pub const CHECKED_FILL: f32 = 0.125; +/// `[Hp]` The inset of a button's frame inside its node, which leaves room +/// for the 1 px shadow below it. +pub const SHADOW_INSET: f32 = 1.0; + +/// Which Breeze button a surface is painted as. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum BreezeButtonKind { + /// The push button: button-colour fill, outline, shadow. + Push, + /// The default button: the push button with a fill moved toward the + /// highlight, in an active window. In an inactive window it is a push + /// button. + Default, + /// The flat button, a tool button or a flat push button: nothing at + /// rest and never a shadow. + Flat, + /// `[unpublished]` A push button filled with the accent and its hover + /// and press shades, for a control whose label is the on-accent text and + /// whose style has no say over it (a `SplitButton`'s filled variants). + /// Breeze has no accent-filled button; see + /// [`crate::styles::split_button`]. Its frame is outlined in its own + /// face colour, so it covers the push button's band, from 1 px inside + /// the node, and hides the shadow's sides as the push button's outline + /// does. + Accent, +} + +impl BreezeButtonKind { + /// Whether this kind can cast the 1 px shadow. + pub fn casts_shadow(self) -> bool { + !matches!(self, BreezeButtonKind::Flat) + } +} + +/// A button's interaction state, in Breeze's precedence order. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub enum BreezeButtonState { + /// At rest. + #[default] + Rest, + /// Hovered or showing keyboard focus: Breeze paints both the same. + Highlighted, + /// Pressed. + Pressed, + /// Disabled. + Disabled, +} + +impl BreezeButtonState { + /// Collapse the style configuration's four booleans into a state: + /// disabled first, then pressed, then hovered or focused. + /// + /// Each input may be a derived signal, so this only composes with `zip` + /// and `map`. + pub fn derive( + is_disabled: &Signal, + is_pressed: &Signal, + is_hovered: &Signal, + is_focused: &Signal, + ) -> Signal { + is_disabled + .zip3(is_pressed, is_hovered) + .zip(is_focused) + .map(|((disabled, pressed, hovered), focused)| { + if *disabled { + BreezeButtonState::Disabled + } else if *pressed { + BreezeButtonState::Pressed + } else if *hovered || *focused { + BreezeButtonState::Highlighted + } else { + BreezeButtonState::Rest + } + }) + } +} + +/// The colours a Breeze button is painted from, in one paint state. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeButtonColors { + /// The button colour, a push button's face. + pub button: Color, + /// The button text, which a checked button's fill moves toward. + pub button_text: Color, + /// The push button's outline. + pub button_outline: Color, + /// The highlight a hovered, focused or pressed button is outlined in: + /// the active window's (see the module documentation), or the disabled + /// one for a disabled button. + pub highlight: Color, + /// A pressed push button's face: the button colour 30 % of the way to + /// the highlight, the theme's `surface_pressed`. + pub pressed: Color, + /// The accent family, for [`BreezeButtonKind::Accent`]. + pub accent: Color, + /// The hovered accent. + pub accent_hover: Color, + /// The pressed accent. + pub accent_pressed: Color, + /// The disabled accent. + pub accent_disabled: Color, +} + +impl BreezeButtonColors { + /// The colours of `theme` as it paints in a window that is or is not + /// active, with or without the high-contrast preference, for an enabled + /// or a disabled button. + /// + /// `theme` is the theme the paint walker hands a widget, already + /// projected for that state; see the module documentation for where each + /// colour comes from. + pub fn resolve( + theme: &Theme, + window_active: bool, + high_contrast: bool, + disabled: bool, + ) -> BreezeButtonColors { + let c = &theme.colors; + let accent_family = + |button: Color, button_text: Color, outline: Color| BreezeButtonColors { + button, + button_text, + button_outline: outline, + highlight: if disabled { + c.accent_disabled + } else { + c.accent + }, + pressed: c.surface_pressed, + accent: c.accent, + accent_hover: c.accent_hover, + accent_pressed: c.accent_pressed, + accent_disabled: c.accent_disabled, + }; + let Some(palette) = theme.extension::() else { + // No KDE palette: the theme's own roles stand in for the button + // colours it has no slot for. + return if disabled { + accent_family(c.surface_disabled, c.text_primary, c.border_disabled) + } else { + accent_family(c.surface_content, c.text_primary, c.border) + }; + }; + let state = if disabled { + ColorState::Disabled + } else if window_active { + ColorState::Active + } else { + ColorState::Inactive + }; + let b = palette.breeze_colors(state, high_contrast); + let mut colors = accent_family(b.button, b.button_text, b.button_outline); + // `[Hp]` The active window's highlight, while the theme paints the + // palette's own accent for this state. + let painted = PaintState { + window_active, + high_contrast, + }; + if c.accent == palette.tokens(painted).accent { + let active = palette.tokens(PaintState { + window_active: true, + high_contrast, + }); + if !disabled { + colors.highlight = active.accent; + } + colors.pressed = active.surface_pressed; + } + colors + } + + /// The default button's face: the button colour moved toward the + /// highlight. + pub fn default_face(&self) -> Color { + kde_mix(self.button, self.highlight, DEFAULT_BUTTON_FILL) + } + + /// The default button's outline: half-way from the highlight to the + /// button outline. + pub fn default_outline(&self) -> Color { + kde_mix(self.highlight, self.button_outline, DEFAULT_BUTTON_OUTLINE) + } + + /// A checked push button's face: the button colour moved toward the + /// button text. + pub fn checked_face(&self) -> Color { + kde_mix(self.button, self.button_text, f64::from(CHECKED_FILL)) + } +} + +/// KDE's mix of two colours, in its 16-bit arithmetic. +fn kde_mix(a: Color, b: Color, t: f64) -> Color { + mix(KdeColor::from_color(a), KdeColor::from_color(b), t).to_color() +} + +/// What a button paints in one state: a face, an outline, a shadow, each +/// optional. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct ButtonPaint { + /// The fill of the frame, or nothing. + pub face: Option, + /// The 1 px outline of the frame, or nothing. + pub outline: Option, + /// Whether the 1 px shadow is cast below the frame. + pub shadow: bool, +} + +impl ButtonPaint { + const NOTHING: ButtonPaint = ButtonPaint { + face: None, + outline: None, + shadow: false, + }; +} + +/// `[Hp]` What a `kind` button paints in `state`, checked or not, in a +/// window that is or is not active, from `c`. +/// +/// The rules of the module documentation. Pressing wins over checking, +/// which wins over hover and focus; a checked button keeps its plain outline +/// under the pointer. +pub fn button_paint( + kind: BreezeButtonKind, + state: BreezeButtonState, + checked: bool, + window_active: bool, + c: &BreezeButtonColors, +) -> ButtonPaint { + use BreezeButtonState::{Disabled, Highlighted, Pressed, Rest}; + // The default button is one only in an active window. + let kind = match kind { + BreezeButtonKind::Default if !window_active => BreezeButtonKind::Push, + other => other, + }; + let shadow = + kind.casts_shadow() && window_active && !checked && matches!(state, Rest | Highlighted); + let paint = |face: Option, outline: Option| ButtonPaint { + face, + outline, + shadow, + }; + match kind { + BreezeButtonKind::Push | BreezeButtonKind::Default => { + let (rest_face, rest_outline) = if kind == BreezeButtonKind::Default { + (c.default_face(), c.default_outline()) + } else { + (c.button, c.button_outline) + }; + match state { + Pressed => paint(Some(c.pressed), Some(c.highlight)), + _ if checked => paint(Some(c.checked_face()), Some(c.button_outline)), + Highlighted => paint(Some(rest_face), Some(c.highlight)), + Rest | Disabled => paint(Some(rest_face), Some(rest_outline)), + } + } + BreezeButtonKind::Flat => match state { + Pressed => paint( + Some(c.highlight.with_alpha(FLAT_PRESSED_ALPHA)), + Some(c.highlight), + ), + _ if checked => paint( + Some(c.button_text.with_alpha(CHECKED_FILL)), + Some(c.button_outline), + ), + Highlighted => paint(None, Some(c.highlight)), + Rest | Disabled => ButtonPaint::NOTHING, + }, + BreezeButtonKind::Accent => { + let face = match state { + Rest => c.accent, + Highlighted => c.accent_hover, + Pressed => c.accent_pressed, + Disabled => c.accent_disabled, + }; + paint(Some(face), Some(face)) + } + } +} + +/// `[Hp]` The rectangle a button's frame is filled and stroked on: the node +/// inset by [`SHADOW_INSET`], then by half the pen, so the outline lies +/// inside the inset rectangle. +pub fn frame_rect(bounds: Rect, pen: f32) -> Rect { + let d = SHADOW_INSET + pen * 0.5; + Rect::new( + bounds.x + d, + bounds.y + d, + (bounds.width - d * 2.0).max(0.0), + (bounds.height - d * 2.0).max(0.0), + ) +} + +/// The radius the frame of a theme's controls is stroked with: the control +/// radius less half the pen, 4.5 for Breeze. +pub fn frame_radius(shape: &ShapeTokens) -> f32 { + (shape.radius_control - shape.border_width * 0.5).max(0.0) +} + +/// Paint `paint` into the node `bounds`: the shadow, then the face, then the +/// outline, all on [`frame_rect`]. +pub fn paint_button(canvas: &mut Canvas, bounds: Rect, paint: &ButtonPaint, theme: &Theme) { + let shape = &theme.shape; + let pen = shape.border_width; + let rect = frame_rect(bounds, pen); + let corner = CornerRadius::uniform(frame_radius(shape)); + if paint.shadow { + // `[Hp]` The frame's outline in the shadow colour, moved down by the + // shadow's offset: the face covers all of it but the line below. + let s = &shape.shadow_xs; + let moved = Rect::new( + rect.x + s.offset_x, + rect.y + s.offset_y, + rect.width, + rect.height, + ); + canvas.stroke_rounded_rect(moved, corner, s.color, pen); + } + if let Some(face) = paint.face + && face.a() > 0.0 + { + canvas.fill_rounded_rect(rect, corner, face); + } + if let Some(outline) = paint.outline + && outline.a() > 0.0 + && pen > 0.0 + { + canvas.stroke_rounded_rect(rect, corner, outline, pen); + } +} + +/// The stroke of the focus frame around the node `bounds`: its inner edge +/// `focus_ring_offset` from the node edge with the control radius, the +/// stroke as wide as `focus_ring_width`. +pub fn focus_frame(bounds: Rect, shape: &ShapeTokens) -> FocusRingStroke { + // At its inner edge the ring has the control radius, so at the node edge + // it has that radius less the (signed) offset. + let edge_radius = (shape.radius_control - shape.focus_ring_offset).max(0.0); + FocusRingStroke::around(bounds, edge_radius, shape) +} + +/// Paint the focus frame around the node `bounds` in the theme's +/// `focus_ring` colour. +pub fn paint_focus_frame(canvas: &mut Canvas, bounds: Rect, theme: &Theme) { + let shape = &theme.shape; + let color = theme.colors.focus_ring; + if color.a() <= 0.0 || shape.focus_ring_width <= 0.0 { + return; + } + let ring = focus_frame(bounds, shape); + canvas.stroke_rounded_rect( + ring.rect, + CornerRadius::uniform(ring.corner_radius), + color, + shape.focus_ring_width, + ); +} + +/// The chrome layer of a Breeze button: its frame, shadow and focus frame, +/// painted behind whatever content the style stacks on top. +/// +/// Sized like `RectWidget`: it takes whatever the proposal offers and +/// reports zero when unbounded, so it can sit in a `ZStack` without changing +/// the control's size. +pub struct BreezeButtonChrome { + kind: BreezeButtonKind, + state: Signal, + /// `true` while the button shows its focus frame. + show_focus_frame: Signal, + /// The checked state of a checkable button. + checked: Option>, +} + +impl BreezeButtonChrome { + /// A chrome of `kind` following `state`, showing the focus frame while + /// `show_focus_frame` is set. + pub fn new( + kind: BreezeButtonKind, + state: Signal, + show_focus_frame: Signal, + ) -> Self { + Self { + kind, + state, + show_focus_frame, + checked: None, + } + } + + /// Paint the checked state while `checked` is set. + pub fn checked(mut self, checked: Option>) -> Self { + self.checked = checked; + self + } +} + +impl std::fmt::Debug for BreezeButtonChrome { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeButtonChrome") + .field("kind", &self.kind) + .finish() + } +} + +impl Widget for BreezeButtonChrome { + fn build(&mut self, ctx: &mut BuildContext) -> Vec { + let id = ctx.self_id(); + let registry = ctx.binding_registry(); + self.state.bind_to(id, registry, BindingLevel::RepaintOnly); + self.show_focus_frame + .bind_to(id, registry, BindingLevel::RepaintOnly); + if let Some(checked) = &self.checked { + checked.bind_to(id, registry, BindingLevel::RepaintOnly); + } + vec![] + } + + fn layout_response(&self, proposal: SizeProposal, _ctx: &LayoutContext) -> LayoutResponse { + proposal.resolve(0.0, 0.0).into() + } + + fn place_children( + &self, + _bounds: Rect, + _proposal: SizeProposal, + _children: &mut [WidgetPlacement], + _ctx: &LayoutContext, + ) { + } + + fn paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext) { + let state = self.state.get(); + let checked = self.checked.as_ref().is_some_and(Signal::get); + let colors = BreezeButtonColors::resolve( + ctx.theme, + ctx.window_active, + ctx.prefers_high_contrast, + state == BreezeButtonState::Disabled, + ); + let paint = button_paint(self.kind, state, checked, ctx.window_active, &colors); + paint_button(canvas, bounds, &paint, ctx.theme); + if self.show_focus_frame.get() { + paint_focus_frame(canvas, bounds, ctx.theme); + } + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + // Presentational: the owning control emits the real node. + builder.set_hidden(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_kde_scheme::PaletteRole; + + fn rgba8(c: Color) -> [u8; 4] { + KdeColor::from_color(c).to_rgba8() + } + + fn colors(theme: &Theme, window_active: bool, disabled: bool) -> BreezeButtonColors { + BreezeButtonColors::resolve(theme, window_active, false, disabled) + } + + #[test] + fn the_state_follows_breezes_precedence() { + let disabled = Signal::new(false); + let pressed = Signal::new(false); + let hovered = Signal::new(false); + let focused = Signal::new(false); + let state = BreezeButtonState::derive(&disabled, &pressed, &hovered, &focused); + assert_eq!(state.get(), BreezeButtonState::Rest); + focused.set(true); + assert_eq!( + state.get(), + BreezeButtonState::Highlighted, + "focus lights it" + ); + focused.set(false); + hovered.set(true); + assert_eq!(state.get(), BreezeButtonState::Highlighted, "so does hover"); + pressed.set(true); + assert_eq!(state.get(), BreezeButtonState::Pressed, "press beats hover"); + disabled.set(true); + assert_eq!( + state.get(), + BreezeButtonState::Disabled, + "disabled beats all" + ); + } + + /// The Breeze Light values of the specification's rules, and the + /// colours Plasma 6.8 paints them in (the golden pixel samples). + #[test] + fn breeze_light_paints_the_specifications_colours() { + let t = crate::light(); + let c = colors(&t, true, false); + assert_eq!(rgba8(c.button), [252, 252, 252, 255]); + assert_eq!(rgba8(c.button_outline), [209, 209, 210, 255]); + assert_eq!(rgba8(c.highlight), [61, 174, 233, 255]); + assert_eq!(rgba8(c.pressed), [195, 229, 246, 255]); + assert_eq!(rgba8(c.default_face()), [214, 236, 248, 255]); + assert_eq!(rgba8(c.default_outline()), [135, 192, 221, 255]); + + let d = colors(&crate::dark(), true, false); + assert_eq!(rgba8(d.button), [41, 44, 48, 255]); + assert_eq!(rgba8(d.button_outline), [83, 86, 89, 255]); + assert_eq!(rgba8(d.default_face()), [45, 70, 85, 255]); + assert_eq!(rgba8(d.default_outline()), [72, 130, 161, 255]); + assert_eq!(rgba8(d.pressed), [47, 83, 104, 255]); + } + + #[test] + fn a_hovered_button_in_a_backdrop_window_is_outlined_in_the_active_highlight() { + let t = crate::light(); + let inactive = t.for_paint_state(PaintState { + window_active: false, + high_contrast: false, + }); + assert_ne!(inactive.colors.accent, t.colors.accent, "premise: it mutes"); + let c = colors(&inactive, false, false); + assert_eq!(c.highlight, t.colors.accent); + assert_eq!(c.pressed, t.colors.surface_pressed); + // A disabled button uses the disabled highlight. + assert_eq!(colors(&t, true, true).highlight, t.colors.accent_disabled); + } + + #[test] + fn an_accent_the_app_changed_is_painted_as_projected() { + let mut t = crate::light(); + t.colors.accent = Color::from_hex("#FF0000"); + let c = colors(&t, true, false); + assert_eq!(c.highlight, t.colors.accent); + } + + #[test] + fn the_high_contrast_outline_is_the_button_text() { + let t = crate::light(); + let hc = t.for_paint_state(PaintState { + window_active: true, + high_contrast: true, + }); + let c = BreezeButtonColors::resolve(&hc, true, true, false); + assert_eq!(c.button_outline, c.button_text); + assert_eq!(c.highlight, hc.colors.accent, "the lifted accent"); + } + + #[test] + fn a_theme_without_the_palette_paints_from_its_roles() { + let t = teksilo_core::presets::intui::light(); + let c = colors(&t, true, false); + assert_eq!(c.button, t.colors.surface_content); + assert_eq!(c.button_outline, t.colors.border); + assert_eq!(c.highlight, t.colors.accent); + let d = colors(&t, true, true); + assert_eq!(d.button, t.colors.surface_disabled); + assert_eq!(d.button_outline, t.colors.border_disabled); + } + + #[test] + fn the_disabled_push_button_paints_the_disabled_button_colours() { + let t = crate::light(); + let p = t.extension::().unwrap(); + let c = colors(&t, true, true); + assert_eq!(c.button, p.role(ColorState::Disabled, PaletteRole::Button)); + assert_eq!( + c.button_outline, + p.colors(ColorState::Disabled).button_outline + ); + // Plasma 6.8 paints 240,240,240 outlined in 226,226,226. + assert_eq!(rgba8(c.button), [240, 240, 240, 255]); + assert_eq!(rgba8(c.button_outline), [226, 226, 226, 255]); + let paint = button_paint( + BreezeButtonKind::Push, + BreezeButtonState::Disabled, + false, + true, + &c, + ); + assert_eq!(paint.face, Some(c.button)); + assert!(!paint.shadow, "a disabled button casts no shadow"); + } + + #[test] + fn the_paint_rules_for_each_kind_and_state() { + use BreezeButtonKind::{Accent, Default, Flat, Push}; + use BreezeButtonState::{Disabled, Highlighted, Pressed, Rest}; + let c = colors(&crate::light(), true, false); + let p = |kind, state, checked, active| button_paint(kind, state, checked, active, &c); + + assert_eq!( + p(Push, Rest, false, true), + ButtonPaint { + face: Some(c.button), + outline: Some(c.button_outline), + shadow: true + } + ); + assert_eq!(p(Push, Highlighted, false, true).outline, Some(c.highlight)); + assert!(p(Push, Highlighted, false, true).shadow); + let pressed = p(Push, Pressed, false, true); + assert_eq!( + (pressed.face, pressed.outline, pressed.shadow), + (Some(c.pressed), Some(c.highlight), false) + ); + let checked = p(Push, Highlighted, true, true); + assert_eq!( + (checked.face, checked.outline, checked.shadow), + (Some(c.checked_face()), Some(c.button_outline), false) + ); + // The shadow is an active window's only. + assert!(!p(Push, Rest, false, false).shadow); + + let default = p(Default, Rest, false, true); + assert_eq!(default.face, Some(c.default_face())); + assert_eq!(default.outline, Some(c.default_outline())); + assert!(default.shadow); + // In an inactive window the default button is a push button. + assert_eq!(p(Default, Rest, false, false), p(Push, Rest, false, false)); + + assert_eq!(p(Flat, Rest, false, true), ButtonPaint::NOTHING); + assert_eq!(p(Flat, Disabled, false, true), ButtonPaint::NOTHING); + assert_eq!( + p(Flat, Highlighted, false, true), + ButtonPaint { + face: None, + outline: Some(c.highlight), + shadow: false + } + ); + let flat_pressed = p(Flat, Pressed, false, true); + assert_eq!( + flat_pressed.face, + Some(c.highlight.with_alpha(FLAT_PRESSED_ALPHA)) + ); + assert!(!flat_pressed.shadow); + let flat_checked = p(Flat, Rest, true, true); + assert_eq!( + flat_checked.face, + Some(c.button_text.with_alpha(CHECKED_FILL)) + ); + assert_eq!(flat_checked.outline, Some(c.button_outline)); + + assert_eq!(p(Accent, Rest, false, true).face, Some(c.accent)); + assert_eq!( + p(Accent, Highlighted, false, true).face, + Some(c.accent_hover) + ); + assert_eq!(p(Accent, Pressed, false, true).face, Some(c.accent_pressed)); + assert_eq!( + p(Accent, Disabled, false, true).face, + Some(c.accent_disabled) + ); + assert!(p(Accent, Rest, false, true).shadow); + // The accent frame is outlined in its own face, every state. + for state in [Rest, Highlighted, Pressed, Disabled] { + let accent = p(Accent, state, false, true); + assert_eq!(accent.outline, accent.face, "{state:?}"); + } + } + + #[test] + fn the_flat_and_checked_fills_are_breezes_samples() { + // Over the Breeze Light window, 239,240,241, as Plasma 6.8 paints a + // pressed and a checked tool button: within one step a channel, the + // margin by which Qt's raster painter rounds an 8-bit blend its own + // way. + let c = colors(&crate::light(), true, false); + let window = Color::from_hex("#EFF0F1"); + let over = |top: Color| { + let a = top.a(); + let ch = |f: f32, g: f32| ((f * a + g * (1.0 - a)) * 255.0).round() as i32; + [ + ch(top.r(), window.r()), + ch(top.g(), window.g()), + ch(top.b(), window.b()), + ] + }; + let near = |got: [i32; 3], want: [i32; 3]| { + assert!( + got.iter().zip(want).all(|(g, w)| (g - w).abs() <= 1), + "{got:?} is not within one step of {want:?}" + ); + }; + near( + over(c.highlight.with_alpha(FLAT_PRESSED_ALPHA)), + [185, 220, 238], + ); + near( + over(c.button_text.with_alpha(CHECKED_FILL)), + [213, 215, 216], + ); + } + + #[test] + fn the_frame_lies_inside_the_node_with_room_for_the_shadow() { + let t = crate::light(); + let node = Rect::new(0.0, 0.0, 84.0, 34.0); + let r = frame_rect(node, t.shape.border_width); + assert_eq!(r, Rect::new(1.5, 1.5, 81.0, 31.0)); + assert_eq!(frame_radius(&t.shape), 4.5); + // A degenerate node does not invert. + let tiny = frame_rect(Rect::new(0.0, 0.0, 2.0, 2.0), 1.0); + assert!(tiny.width >= 0.0 && tiny.height >= 0.0); + } + + #[test] + fn the_focus_frame_runs_from_one_pixel_inside_to_one_pixel_outside() { + let t = crate::light(); + let node = Rect::new(10.0, 10.0, 84.0, 34.0); + let ring = focus_frame(node, &t.shape); + // Centred on the node edge, 2 px wide: from 1 px inside to 1 px + // outside, inner radius 5 and outer radius 7. + assert_eq!(ring.rect, node); + assert_eq!(ring.corner_radius, 6.0); + assert_eq!( + ring.corner_radius - t.shape.focus_ring_width * 0.5, + t.shape.radius_control + ); + assert_eq!( + ring.corner_radius + t.shape.focus_ring_width * 0.5, + crate::shape::BREEZE_FOCUS_RING_OUTER_RADIUS + ); + } + + #[test] + fn only_the_flat_kind_never_casts_a_shadow() { + assert!(!BreezeButtonKind::Flat.casts_shadow()); + for k in [ + BreezeButtonKind::Push, + BreezeButtonKind::Default, + BreezeButtonKind::Accent, + ] { + assert!(k.casts_shadow()); + } + } +} diff --git a/crates/teksilo-theme-kde/src/styles/icon_button.rs b/crates/teksilo-theme-kde/src/styles/icon_button.rs new file mode 100644 index 000000000..04aed8a53 --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/icon_button.rs @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze tool button, for `IconButton`. +//! +//! An `IconButton` is Breeze's auto-raise tool button, the borderless kind a +//! toolbar holds: nothing at rest, a highlight outline under the pointer or +//! keyboard focus, the highlight at 30 % while pressed and, for a toggle +//! that is on, the button text at 12.5 % with the plain button outline. It +//! never casts a shadow. [`crate::styles::chrome`] paints it. +//! +//! ## Sizes +//! +//! Breeze sizes an auto-raise tool button as its icon plus the 6 px margin +//! on each side: 28 px around a 16 px icon and 34 px around the 22 px +//! toolbar icon. The five `IconButtonSize`s take those two and the same rule +//! at Kirigami's 32 and 48 px icon sizes, with a compact rung at the +//! density's target size ([`BreezeToolButtonSizes`]). Every one clears the +//! 24 dp conformance floor at every density, so no conformance box is built +//! around them. +//! +//! Breeze also draws a tool button with a frame, the push button's, 32 and +//! 38 px around the same icons. `IconButton` has no framed form, so those +//! two sizes ([`BreezeGeometry`](crate::geometry::BreezeGeometry)'s +//! `framed_tool_button_height` and its medium twin) have no widget to reach. +//! +//! The glyph inside is the one the `IconButton` builds at its own icon size +//! for each rung; a style does not size it. + +use teksilo_core::build_context::BuildContext; +use teksilo_core::styles::{IconButtonSize, IconButtonStyle, IconButtonStyleConfig}; +use teksilo_core::widget_id::WidgetId; +use teksilo_widgets::primitives::{Center, FixedSize, ZStack}; + +use crate::styles::chrome::{BreezeButtonChrome, BreezeButtonKind, BreezeButtonState}; +use crate::styles::metrics::{BreezeToolButtonSizes, breeze_tool_button_sizes_for}; + +/// Breeze `IconButtonStyle`. +#[derive(Debug, Default, Clone, Copy)] +pub struct BreezeIconButtonStyle; + +impl BreezeIconButtonStyle { + /// The square of `size` among `sizes`. + pub fn square(size: IconButtonSize, sizes: &BreezeToolButtonSizes) -> f32 { + match size { + IconButtonSize::Compact => sizes.compact, + IconButtonSize::Default => sizes.default, + IconButtonSize::Toolbar => sizes.toolbar, + IconButtonSize::Large => sizes.large, + IconButtonSize::Hero => sizes.hero, + } + } +} + +impl IconButtonStyle for BreezeIconButtonStyle { + fn make_body(&self, cfg: &IconButtonStyleConfig, ctx: &mut BuildContext) -> WidgetId { + let sizes = breeze_tool_button_sizes_for(&ctx.theme().input); + let square = Self::square(cfg.size, &sizes); + let state = BreezeButtonState::derive( + &cfg.is_disabled, + &cfg.is_pressed, + &cfg.is_hovered, + &cfg.is_focused, + ); + let show_focus_frame = cfg + .is_focused + .zip(&cfg.is_disabled) + .map(|(focused, disabled)| *focused && !*disabled); + let chrome = ctx.add( + BreezeButtonChrome::new(BreezeButtonKind::Flat, state, show_focus_frame) + .checked(cfg.is_on.clone()), + ); + let icon = ctx.add(Center::new().child(cfg.icon)); + let stack = ctx.add(ZStack::new().child(chrome).child(icon)); + ctx.add(FixedSize::new().width(square).height(square).child(stack)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::styles::metrics::breeze_tool_button_sizes; + + #[test] + fn each_size_takes_its_rung() { + let s = breeze_tool_button_sizes(); + let squares = [ + IconButtonSize::Compact, + IconButtonSize::Default, + IconButtonSize::Toolbar, + IconButtonSize::Large, + IconButtonSize::Hero, + ] + .map(|size| BreezeIconButtonStyle::square(size, &s)); + assert_eq!(squares, [24.0, 28.0, 34.0, 44.0, 60.0]); + } +} diff --git a/crates/teksilo-theme-kde/src/styles/metrics.rs b/crates/teksilo-theme-kde/src/styles/metrics.rs new file mode 100644 index 000000000..7474e6f76 --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/metrics.rs @@ -0,0 +1,212 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The dimensions the Breeze widget styles are built with, at a density. +//! +//! Every height here starts from a Breeze rule in [`crate::geometry`]: the +//! text-driven ones from the theme's body line box, the icon-driven ones +//! from an icon size. A height of 24 or more is a target, so it goes through +//! the density ladder's `dp(.., Target)`, which leaves it alone at Compact +//! and raises it to the density's target size above it (`[unpublished]`: +//! KDE publishes no touch ladder, so the ladder is Teksilo's generic one). +//! A gap or padding goes through `spacing`. At Compact every value is +//! Breeze's own. + +use teksilo_core::styles::density::{dp, spacing}; +use teksilo_tokens::{InputTokens, TargetRole, TypographyTokens}; + +use crate::geometry::{ + BUTTON_MARGIN_WIDTH, BreezeGeometry, FRAME_WIDTH, LARGE_ICON_SIZE, MEDIUM_ICON_SIZE, + TOOL_BUTTON_MARGIN_WIDTH, +}; + +/// The body line box `H` of `typography`, in whole pixels: the height every +/// text-driven Breeze control is derived from. 18 for the Breeze typography. +pub fn body_line_height(typography: &TypographyTokens) -> f32 { + (typography.body.size * typography.body.line_height).round() +} + +/// The Breeze geometry of `typography`'s body line box. +pub fn geometry_of(typography: &TypographyTokens) -> BreezeGeometry { + BreezeGeometry::for_line_height(body_line_height(typography)) +} + +/// The dimensions of a push button, a default button and a flat push button, +/// which share them. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeButtonMetrics { + /// `[S]` The button's height, at least: `H + 16`, through the density + /// ladder. 34 at Compact for the Breeze typography. + pub height: f32, + /// `[S]` The button's width, at least: 84, Breeze's 80 plus the 2 px + /// frame margin on each side. + pub min_width: f32, + /// `[S]` The space between the frame and the label on the leading and + /// trailing sides: the 6 px button margin and the 2 px frame margin, + /// scaled by the density's spacing. + pub padding_horizontal: f32, + /// `[S]` The same above and below the label. It is part of the height + /// rule rather than a gap, so it does not scale: the height floor rises + /// with the density instead. + pub padding_vertical: f32, +} + +/// The button dimensions at the density of `tokens`, for `typography`. +pub fn breeze_button_metrics_for( + tokens: &InputTokens, + typography: &TypographyTokens, +) -> BreezeButtonMetrics { + let g = geometry_of(typography); + BreezeButtonMetrics { + height: dp(g.push_button_height, TargetRole::Target, tokens), + min_width: g.push_button_min_width, + padding_horizontal: spacing(BUTTON_MARGIN_WIDTH + FRAME_WIDTH, tokens), + padding_vertical: BUTTON_MARGIN_WIDTH + FRAME_WIDTH, + } +} + +/// [`breeze_button_metrics_for`] at the Compact density and the Breeze +/// typography. +pub fn breeze_button_metrics() -> BreezeButtonMetrics { + breeze_button_metrics_for( + &InputTokens::default(), + &crate::typography::breeze_typography(), + ) +} + +/// The square an `IconButton` is drawn in at each of its five sizes: Breeze's +/// auto-raise tool button, an icon with the 6 px tool-button margin around +/// it, through the density ladder. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeToolButtonSizes { + /// `[unpublished]` Breeze has no tool button smaller than the one around + /// a 16 px icon; the compact rung is the density's target size, 24 at + /// Compact. + pub compact: f32, + /// `[S]` A 16 px icon: 28 at Compact. + pub default: f32, + /// `[S]` A 22 px icon, the toolbar size: 34 at Compact. + pub toolbar: f32, + /// `[derived]` Breeze's rule at Kirigami's 32 px medium icon: 44. + pub large: f32, + /// `[derived]` Breeze's rule at Kirigami's 48 px large icon: 60. + pub hero: f32, +} + +/// The tool-button squares at the density of `tokens`. +pub fn breeze_tool_button_sizes_for(tokens: &InputTokens) -> BreezeToolButtonSizes { + // Icon-driven, so the font does not enter: the default geometry's + // tool-button heights are those of any font. + let g = BreezeGeometry::breeze_default(); + let around = |icon: f32| icon + 2.0 * TOOL_BUTTON_MARGIN_WIDTH; + let target = |h: f32| dp(h, TargetRole::Target, tokens); + BreezeToolButtonSizes { + compact: target(tokens.min_target_conformance), + default: target(g.tool_button_height), + toolbar: target(g.tool_button_height_medium), + large: target(around(MEDIUM_ICON_SIZE)), + hero: target(around(LARGE_ICON_SIZE)), + } +} + +/// [`breeze_tool_button_sizes_for`] at the Compact density. +pub fn breeze_tool_button_sizes() -> BreezeToolButtonSizes { + breeze_tool_button_sizes_for(&InputTokens::default()) +} + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_tokens::TargetDensity; + + fn at(density: TargetDensity) -> InputTokens { + InputTokens::for_density(density) + } + + #[test] + fn the_compact_button_is_breezes() { + let m = breeze_button_metrics(); + assert_eq!(m.height, 34.0); + assert_eq!(m.min_width, 84.0); + assert_eq!(m.padding_horizontal, 8.0); + assert_eq!(m.padding_vertical, 8.0); + // The label's 18 px line box and the two gutters make the height. + let h = body_line_height(&crate::typography::breeze_typography()); + assert_eq!(h, 18.0); + assert_eq!(h + 2.0 * m.padding_vertical, m.height); + // The width rule: max(text + 12, 80) + 4 is text + 16 or 84. + assert_eq!(2.0 * m.padding_horizontal, 12.0 + 2.0 * FRAME_WIDTH); + } + + #[test] + fn the_button_rises_with_the_density_and_never_falls() { + let t = crate::typography::breeze_typography(); + let compact = breeze_button_metrics_for(&at(TargetDensity::Compact), &t); + let comfortable = breeze_button_metrics_for(&at(TargetDensity::Comfortable), &t); + let touch = breeze_button_metrics_for(&at(TargetDensity::Touch), &t); + assert_eq!(comfortable.height, 34.0, "34 already clears 32"); + assert_eq!(touch.height, 44.0); + assert!((comfortable.padding_horizontal - 9.2).abs() < 1e-4); + assert!((touch.padding_horizontal - 10.4).abs() < 1e-4); + for m in [compact, comfortable, touch] { + assert_eq!(m.min_width, 84.0); + assert_eq!(m.padding_vertical, 8.0); + } + } + + #[test] + fn a_larger_body_font_makes_a_taller_button() { + let mut t = crate::typography::breeze_typography(); + // Plasma's 12 pt: a 16 px face on a 22 px line, which Qt makes 38. + t.body.size = 16.0; + t.body.line_height = 22.0 / 16.0; + let m = breeze_button_metrics_for(&InputTokens::default(), &t); + assert_eq!(m.height, 38.0); + } + + #[test] + fn the_tool_buttons_are_breezes_and_grow_with_the_density() { + let s = breeze_tool_button_sizes(); + assert_eq!( + (s.compact, s.default, s.toolbar, s.large, s.hero), + (24.0, 28.0, 34.0, 44.0, 60.0) + ); + let comfortable = breeze_tool_button_sizes_for(&at(TargetDensity::Comfortable)); + assert_eq!( + ( + comfortable.compact, + comfortable.default, + comfortable.toolbar + ), + (32.0, 32.0, 34.0) + ); + let touch = breeze_tool_button_sizes_for(&at(TargetDensity::Touch)); + assert_eq!( + ( + touch.compact, + touch.default, + touch.toolbar, + touch.large, + touch.hero + ), + (44.0, 44.0, 44.0, 44.0, 60.0) + ); + } + + #[test] + fn every_tool_button_clears_the_conformance_floor_without_a_box() { + for density in [ + TargetDensity::Compact, + TargetDensity::Comfortable, + TargetDensity::Touch, + ] { + let tokens = at(density); + let s = breeze_tool_button_sizes_for(&tokens); + for size in [s.compact, s.default, s.toolbar, s.large, s.hero] { + assert!(size >= tokens.min_target_conformance, "{density:?}: {size}"); + } + assert!(s.compact <= s.default && s.default <= s.toolbar); + assert!(s.toolbar <= s.large && s.large <= s.hero); + } + } +} diff --git a/crates/teksilo-theme-kde/src/styles/split_button.rs b/crates/teksilo-theme-kde/src/styles/split_button.rs new file mode 100644 index 000000000..b2fffb9a4 --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/split_button.rs @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze frame of a `SplitButton`. +//! +//! A `SplitButton` is a push button with a menu, and its frame is the Breeze +//! push button's ([`crate::styles::chrome`]): the same fill, outline, +//! highlight under the pointer or keyboard focus, press and 1 px shadow, +//! around the widget's own row (the action, a divider, the menu chevron). It +//! is as tall as a push button, 34 px at Plasma's default font, and at least +//! as wide, 84 px ([`crate::styles::metrics`]). +//! +//! | `ButtonVariant` | Frame | +//! | --- | --- | +//! | `Plain` (default) / `Tinted` / `Outlined` | the push button | +//! | `Ghost` / `Link` | the flat button | +//! | `Filled` / `Destructive` | the push button filled with the accent | +//! +//! ## The filled variants +//! +//! A `SplitButton` labels its `Filled` and `Destructive` variants in the +//! on-accent text and gives its style no say over the label. Breeze has no +//! accent-filled button, and its default button's light fill under the +//! on-accent text would be unreadable in a dark scheme (black on Breeze +//! Dark's 45,70,85), so those two variants are framed in the accent itself, +//! with its hover, press and disabled shades, which the on-accent text is +//! lifted to read on (D1 of the colour mapping). This is the one place the +//! Breeze styles paint an accent fill (`[unpublished]`). A `Button`'s +//! `Filled` variant is the Breeze default button instead, because its style +//! chooses the label. + +use teksilo_core::build_context::BuildContext; +use teksilo_core::styles::{ButtonVariant, SplitButtonStyle, SplitButtonStyleConfig}; +use teksilo_core::widget_id::WidgetId; +use teksilo_widgets::primitives::{MinSize, ZStack}; + +use crate::styles::chrome::{BreezeButtonChrome, BreezeButtonKind, BreezeButtonState}; +use crate::styles::metrics::breeze_button_metrics_for; + +/// Breeze `SplitButtonStyle`. +#[derive(Debug, Default, Clone, Copy)] +pub struct BreezeSplitButtonStyle; + +impl BreezeSplitButtonStyle { + /// The Breeze button a split button of `variant` is framed as. + pub fn kind(variant: ButtonVariant) -> BreezeButtonKind { + match variant { + ButtonVariant::Plain | ButtonVariant::Tinted | ButtonVariant::Outlined => { + BreezeButtonKind::Push + } + ButtonVariant::Ghost | ButtonVariant::Link => BreezeButtonKind::Flat, + ButtonVariant::Filled | ButtonVariant::Destructive => BreezeButtonKind::Accent, + } + } +} + +impl SplitButtonStyle for BreezeSplitButtonStyle { + fn make_body(&self, cfg: &SplitButtonStyleConfig, ctx: &mut BuildContext) -> WidgetId { + let theme = ctx.theme(); + let m = breeze_button_metrics_for(&theme.input, &theme.typography); + let state = BreezeButtonState::derive( + &cfg.is_disabled, + &cfg.is_pressed, + &cfg.is_hovered, + &cfg.is_focused, + ); + let show_focus_frame = cfg + .is_focused + .zip(&cfg.is_disabled) + .map(|(focused, disabled)| *focused && !*disabled); + let chrome = ctx.add(BreezeButtonChrome::new( + Self::kind(cfg.variant), + state, + show_focus_frame, + )); + let stack = ctx.add(ZStack::new().child(chrome).child(cfg.content)); + ctx.add(MinSize::new(m.min_width, m.height).child(stack)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn the_variants_map_onto_the_frames() { + for v in [ + ButtonVariant::Plain, + ButtonVariant::Tinted, + ButtonVariant::Outlined, + ] { + assert_eq!(BreezeSplitButtonStyle::kind(v), BreezeButtonKind::Push); + } + for v in [ButtonVariant::Ghost, ButtonVariant::Link] { + assert_eq!(BreezeSplitButtonStyle::kind(v), BreezeButtonKind::Flat); + } + for v in [ButtonVariant::Filled, ButtonVariant::Destructive] { + assert_eq!(BreezeSplitButtonStyle::kind(v), BreezeButtonKind::Accent); + } + } + + #[test] + fn the_on_accent_label_reads_on_every_accent_frame() { + use teksilo_tokens::contrast::composite_contrast; + for t in [crate::light(), crate::dark()] { + let c = &t.colors; + for fill in [c.accent, c.accent_hover, c.accent_pressed] { + assert!(composite_contrast(c.text_on_accent, fill) >= 4.5); + } + } + } +} diff --git a/crates/teksilo-theme-kde/tests/mount.rs b/crates/teksilo-theme-kde/tests/mount.rs new file mode 100644 index 000000000..c4c9f747e --- /dev/null +++ b/crates/teksilo-theme-kde/tests/mount.rs @@ -0,0 +1,638 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Mount every widget the Breeze preset restyles, in both schemes, render +//! it, and check the colours it paints against Plasma's own. +//! +//! The unit tests beside each style check its rules. This checks that the +//! styles run: a Tier-3 style is only exercised when its widget is built, +//! and its `make_body` and `paint` reach framework surfaces (derived +//! signals, the binding registry, the paint context's window state) whose +//! preconditions the trait signature does not show. +//! +//! The exact-colour checks read the colours from the render frame, which +//! carries what the style asked for, and compare them with the golden +//! samples of Plasma 6.8 painting the same controls +//! (`tools/kde_golden/vectors/pixels.json`). This file reads that file from +//! the repository, so it is left out of the published package (the +//! `exclude` list in `Cargo.toml`). + +use std::cell::RefCell; +use std::rc::Rc; + +use serde_json::Value; +use teksilo_canvas::{MockTextBackend, RenderFrame, SizeProposal}; +use teksilo_core::event::PointerButton; +use teksilo_core::signal::Signal; +use teksilo_core::styles::Theme; +use teksilo_core::widget::Widget; +use teksilo_core::widget_id::WidgetId; +use teksilo_core::widget_tree::WidgetTree; +use teksilo_i18n::lit; +use teksilo_theme_kde::{self as kde, KdePalette, PlasmaAccent}; +use teksilo_tokens::Color; +use teksilo_widgets::primitives::{HStack, IconWidget}; +use teksilo_widgets::{ + Button, ButtonVariant, IconButton, IconButtonSize, MenuItem, SplitButton, VStack, +}; + +const PIXELS_JSON: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../tools/kde_golden/vectors/pixels.json" +)); + +const VARIANTS: [ButtonVariant; 7] = [ + ButtonVariant::Filled, + ButtonVariant::Tinted, + ButtonVariant::Outlined, + ButtonVariant::Plain, + ButtonVariant::Ghost, + ButtonVariant::Link, + ButtonVariant::Destructive, +]; + +const SIZES: [IconButtonSize; 5] = [ + IconButtonSize::Compact, + IconButtonSize::Default, + IconButtonSize::Toolbar, + IconButtonSize::Large, + IconButtonSize::Hero, +]; + +fn themes() -> [(&'static str, Theme); 2] { + [("BreezeLight", kde::light()), ("BreezeDark", kde::dark())] +} + +fn tree_with(theme: Theme) -> WidgetTree { + WidgetTree::new() + .with_theme(theme) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))) +} + +/// Mount `w` under `theme`, lay it out and render it: the number of draw +/// commands, so a caller can assert something was painted. +fn mount(theme: Theme, w: impl Widget + 'static) -> usize { + let mut tree = tree_with(theme); + tree.add(w); + tree.layout(SizeProposal::exact(400.0, 300.0)); + tree.render().draw_order.len() +} + +/// A tree holding `w` at its natural size in a row, laid out: the tree and +/// the widget's id. +fn placed(theme: Theme, w: impl Widget + 'static) -> (WidgetTree, WidgetId) { + let mut tree = tree_with(theme); + let row = tree.add(HStack::new().child(w)); + tree.layout(SizeProposal::exact(400.0, 300.0)); + let id = tree.children(row)[0]; + (tree, id) +} + +fn rerender(tree: &mut WidgetTree) -> Rc { + tree.layout(SizeProposal::exact(400.0, 300.0)); + tree.render() +} + +fn rgba8(c: [f32; 4]) -> [u8; 4] { + c.map(|v| (v.clamp(0.0, 1.0) * 255.0).round() as u8) +} + +/// One painted shape: its colour in 8 bits and its stroke width (0 for a +/// fill). +#[derive(Debug, Clone, Copy, PartialEq)] +struct Painted { + color: [u8; 4], + stroke: f32, + screen: [f32; 4], +} + +fn painted(frame: &RenderFrame) -> Vec { + frame + .shapes + .iter() + .map(|s| Painted { + color: rgba8(s.color), + stroke: s.stroke_width, + screen: s.screen, + }) + .collect() +} + +fn fills(frame: &RenderFrame) -> Vec<[u8; 4]> { + painted(frame) + .into_iter() + .filter(|p| p.stroke == 0.0) + .map(|p| p.color) + .collect() +} + +fn strokes(frame: &RenderFrame) -> Vec<[u8; 4]> { + painted(frame) + .into_iter() + .filter(|p| p.stroke > 0.0) + .map(|p| p.color) + .collect() +} + +/// Black at 12.5 %, the button shadow, in 8 bits. +const SHADOW: [u8; 4] = [0, 0, 0, 32]; + +fn has_shadow(frame: &RenderFrame) -> bool { + strokes(frame).contains(&SHADOW) +} + +/// The colour Plasma painted at `(x, y)` of the control `id` in `scheme`. +fn sample(scheme: &str, id: &str, x: usize, y: usize) -> [u8; 4] { + let all: Value = serde_json::from_str(PIXELS_JSON).expect("pixels.json parses"); + let record = all["schemes"][scheme]["records"] + .as_array() + .expect("the scheme's records") + .iter() + .find(|r| r["id"] == id) + .unwrap_or_else(|| panic!("{scheme} has no {id}")); + let (line, at) = if let Some(row) = record["rows"].get(y.to_string()) { + (row, x) + } else { + ( + record["cols"] + .get(x.to_string()) + .unwrap_or_else(|| panic!("{id} samples neither row {y} nor column {x}")), + y, + ) + }; + let run = line + .as_array() + .expect("a run-length line") + .iter() + .find(|run| { + let start = run[0].as_u64().unwrap() as usize; + let len = run[1].as_u64().unwrap() as usize; + (start..start + len).contains(&at) + }) + .expect("the line covers the pixel"); + let hex = run[2].as_str().unwrap().trim_start_matches('#'); + let byte = |i: usize| u8::from_str_radix(&hex[i..i + 2], 16).unwrap(); + [byte(0), byte(2), byte(4), byte(6)] +} + +/// `top` composited over the opaque `bottom`, in 8 bits. +fn over(top: [u8; 4], bottom: [u8; 4]) -> [u8; 4] { + let a = f32::from(top[3]) / 255.0; + let ch = |i: usize| (f32::from(top[i]) * a + f32::from(bottom[i]) * (1.0 - a)).round() as u8; + [ch(0), ch(1), ch(2), 255] +} + +/// Whether two colours are within one step a channel: Qt's raster painter +/// rounds an 8-bit blend its own way. +fn near(a: [u8; 4], b: [u8; 4]) -> bool { + a.iter().zip(b).all(|(x, y)| x.abs_diff(y) <= 1) +} + +// ── Every restyled widget mounts and paints ───────────────────────────── + +#[test] +fn buttons_mount_in_every_variant() { + for (_, theme) in themes() { + for variant in VARIANTS { + let drawn = mount(theme.clone(), Button::new(lit!("Save")).variant(variant)); + assert!(drawn > 0, "{variant:?} painted nothing"); + } + } +} + +#[test] +fn icon_buttons_mount_at_every_size() { + for (_, theme) in themes() { + for size in SIZES { + let drawn = mount( + theme.clone(), + IconButton::new(IconWidget::checkmark(12.0)).size(size), + ); + assert!(drawn > 0, "{size:?} painted nothing"); + for on in [false, true] { + let drawn = mount( + theme.clone(), + IconButton::new(IconWidget::checkmark(12.0)) + .size(size) + .toggle(Signal::new(on)), + ); + assert!(drawn > 0, "a {size:?} toggle painted nothing"); + } + } + } +} + +#[test] +fn split_buttons_mount_in_every_variant() { + for (_, theme) in themes() { + for variant in VARIANTS { + let drawn = mount( + theme.clone(), + SplitButton::new() + .item(MenuItem::new(lit!("Run"))) + .item(MenuItem::new(lit!("Debug"))) + .variant(variant), + ); + assert!(drawn > 0, "{variant:?} painted nothing"); + } + } +} + +/// The styles read the theme at paint time, so a tree built under Breeze +/// survives a live swap to the other scheme, out to another design language +/// and back. +#[test] +fn a_mounted_tree_survives_a_theme_swap() { + let mut tree = tree_with(kde::light()); + tree.add( + VStack::new() + .child(Button::new(lit!("Save")).variant(ButtonVariant::Filled)) + .child(Button::new(lit!("Cancel"))) + .child(IconButton::new(IconWidget::checkmark(12.0)).toggle(Signal::new(true))) + .child(SplitButton::new().item(MenuItem::new(lit!("Run")))), + ); + for theme in [ + kde::light(), + kde::dark(), + teksilo_core::presets::intui::light(), + kde::light(), + ] { + tree.set_theme(theme); + let frame = rerender(&mut tree); + assert!(!frame.draw_order.is_empty()); + } +} + +/// The neutral button colours come from `KdePalette`; without it the styles +/// paint from the theme's roles rather than panicking or painting nothing. +#[test] +fn the_styles_degrade_without_the_palette() { + let mut bare = kde::light(); + bare.extensions.remove::(); + assert!(bare.extension::().is_none()); + for variant in VARIANTS { + assert!(mount(bare.clone(), Button::new(lit!("Save")).variant(variant)) > 0); + } + assert!(mount(bare.clone(), IconButton::new(IconWidget::checkmark(12.0))) > 0); + assert!( + mount( + bare.clone(), + SplitButton::new().item(MenuItem::new(lit!("Run"))) + ) > 0 + ); + // The push button still has a face and an outline, from the roles. + let (mut tree, _) = placed(bare.clone(), Button::new(lit!("Save"))); + let frame = rerender(&mut tree); + assert!(fills(&frame).contains(&rgba8(bare.colors.surface_content.to_array()))); + assert!(strokes(&frame).contains(&rgba8(bare.colors.border.to_array()))); +} + +#[test] +fn every_swatch_mounts() { + for accent in PlasmaAccent::ALL { + for theme in [ + kde::light_with_accent(accent.color()), + kde::dark_with_accent(accent.color()), + ] { + let drawn = mount( + theme, + VStack::new() + .child(Button::new(lit!("Save")).variant(ButtonVariant::Filled)) + .child(Button::new(lit!("Cancel"))) + .child(IconButton::new(IconWidget::checkmark(12.0))) + .child( + SplitButton::new() + .item(MenuItem::new(lit!("Run"))) + .variant(ButtonVariant::Filled), + ), + ); + assert!(drawn > 0, "{accent:?} painted nothing"); + } + } +} + +// ── Breeze's colours, checked in the render frame ─────────────────────── + +/// A push button at rest: Plasma's button face and outline, and the shadow, +/// black at 12.5 %, which over the window is the line Plasma paints below +/// the button. +#[test] +fn the_push_button_paints_breezes_face_outline_and_shadow() { + for (scheme, theme) in themes() { + let window = rgba8(theme.colors.surface_main.to_array()); + let (mut tree, id) = placed(theme, Button::new(lit!("OK"))); + let frame = rerender(&mut tree); + assert!( + fills(&frame).contains(&sample(scheme, "push_button.normal", 42, 17)), + "{scheme}: no face {:?} in {:?}", + sample(scheme, "push_button.normal", 42, 17), + fills(&frame) + ); + assert!( + strokes(&frame).contains(&sample(scheme, "push_button.normal", 1, 17)), + "{scheme}: no outline in {:?}", + strokes(&frame) + ); + assert!(has_shadow(&frame), "{scheme}: no shadow"); + assert!(near( + over(SHADOW, window), + sample(scheme, "push_button.normal", 42, 33) + )); + // The outline is stroked on the node inset by 1.5 with radius 4.5, + // and the shadow is that outline one pixel lower. + let b = tree.bounds(id); + let outline = painted(&frame) + .into_iter() + .find(|p| p.color == sample(scheme, "push_button.normal", 1, 17) && p.stroke > 0.0) + .unwrap(); + assert_eq!( + outline.screen, + [b.x + 1.5, b.y + 1.5, b.width - 3.0, b.height - 3.0] + ); + let shadow = painted(&frame) + .into_iter() + .find(|p| p.color == SHADOW) + .unwrap(); + assert_eq!(shadow.screen[1], outline.screen[1] + 1.0); + assert_eq!(shadow.screen[0], outline.screen[0]); + } +} + +/// The default button's fill is the button colour 20 % of the way to the +/// highlight and its outline half-way from the highlight to the button +/// outline, as Plasma paints them. +#[test] +fn the_default_button_blends_the_button_toward_the_highlight() { + for (scheme, theme) in themes() { + let (mut tree, _) = placed( + theme.clone(), + Button::new(lit!("OK")).variant(ButtonVariant::Filled), + ); + let frame = rerender(&mut tree); + let face = sample(scheme, "push_button.default", 42, 17); + let outline = sample(scheme, "push_button.default", 1, 17); + assert!( + fills(&frame).contains(&face), + "{scheme}: {:?}", + fills(&frame) + ); + assert!(strokes(&frame).contains(&outline), "{scheme}"); + assert!(has_shadow(&frame), "{scheme}: the default button casts one"); + // Its label is the primary text, not the on-accent one. + let text = rgba8(theme.colors.text_primary.to_array()); + assert!( + frame.glyphs.iter().all(|g| rgba8(g.color) == text), + "{scheme}: the default button's label is not the primary text" + ); + + // In an inactive window it is a push button, and casts no shadow. + tree.set_window_active(false); + let frame = rerender(&mut tree); + assert!(!fills(&frame).contains(&face), "{scheme}"); + assert!(fills(&frame).contains(&sample(scheme, "push_button.normal", 42, 17))); + assert!(!has_shadow(&frame), "{scheme}"); + } +} + +/// Under the pointer the outline turns to the highlight, and the face stays. +#[test] +fn a_hovered_button_is_outlined_in_the_highlight() { + for (scheme, theme) in themes() { + let highlight = sample(scheme, "push_button.hover", 1, 17); + assert_eq!(highlight, rgba8(theme.colors.accent.to_array())); + let (mut tree, id) = placed(theme, Button::new(lit!("OK"))); + let frame = rerender(&mut tree); + assert!(!strokes(&frame).contains(&highlight), "{scheme}: at rest"); + + tree.pointer_move(tree.bounds(id).center()); + let frame = rerender(&mut tree); + assert!(strokes(&frame).contains(&highlight), "{scheme}: hovered"); + assert!(fills(&frame).contains(&sample(scheme, "push_button.hover", 42, 17))); + assert!( + has_shadow(&frame), + "{scheme}: a hovered button keeps its shadow" + ); + } +} + +/// Pressing fills the button 30 % toward the highlight and drops the +/// shadow. +#[test] +fn a_pressed_button_casts_no_shadow() { + for (scheme, theme) in themes() { + let (mut tree, id) = placed(theme, Button::new(lit!("OK"))); + let center = tree.bounds(id).center(); + tree.pointer_move(center); + tree.pointer_down_button(center, PointerButton::Primary); + let frame = rerender(&mut tree); + assert!( + fills(&frame).contains(&sample(scheme, "push_button.pressed", 42, 17)), + "{scheme}: {:?}", + fills(&frame) + ); + assert!(strokes(&frame).contains(&sample(scheme, "push_button.pressed", 1, 17))); + assert!( + !has_shadow(&frame), + "{scheme}: a pressed button cast a shadow" + ); + tree.pointer_up_button(center, PointerButton::Primary); + } +} + +/// The shadow is an active window's only. +#[test] +fn an_inactive_window_drops_the_shadow() { + for (scheme, theme) in themes() { + let (mut tree, _) = placed(theme, Button::new(lit!("OK"))); + assert!(has_shadow(&rerender(&mut tree)), "{scheme}"); + tree.set_window_active(false); + let frame = rerender(&mut tree); + assert!(!has_shadow(&frame), "{scheme}: inactive"); + // The rest is Plasma's inactive push button. + assert!(fills(&frame).contains(&sample(scheme, "push_button.inactive_window", 42, 17))); + tree.set_window_active(true); + assert!(has_shadow(&rerender(&mut tree)), "{scheme}: active again"); + } +} + +/// A flat button paints nothing at rest, never a shadow, and a highlight +/// outline with no fill under the pointer. +#[test] +fn a_flat_button_paints_nothing_until_hovered_and_never_a_shadow() { + for (scheme, theme) in themes() { + let (mut tree, id) = placed(theme, Button::new(lit!("OK")).variant(ButtonVariant::Ghost)); + let frame = rerender(&mut tree); + assert!(frame.shapes.is_empty(), "{scheme}: {:?}", painted(&frame)); + tree.pointer_move(tree.bounds(id).center()); + let frame = rerender(&mut tree); + assert!( + fills(&frame).is_empty(), + "{scheme}: a hovered flat button has no face" + ); + assert!(strokes(&frame).contains(&sample(scheme, "push_button.flat_hover", 1, 17))); + assert!(!has_shadow(&frame), "{scheme}"); + } +} + +/// An `IconButton` is the auto-raise tool button: invisible at rest, the +/// highlight outline under the pointer, and a toggle that is on fills with +/// the button text at 12.5 % in the plain outline, as Plasma paints a +/// checked tool button. +#[test] +fn an_icon_button_is_breezes_tool_button() { + for (scheme, theme) in themes() { + let window = rgba8(theme.colors.surface_main.to_array()); + let (mut tree, id) = placed(theme.clone(), IconButton::new(IconWidget::checkmark(12.0))); + let frame = rerender(&mut tree); + assert!( + frame.shapes.is_empty(), + "{scheme}: an idle tool button painted {:?}", + painted(&frame) + ); + tree.pointer_move(tree.bounds(id).center()); + let frame = rerender(&mut tree); + assert!(strokes(&frame).contains(&sample(scheme, "tool_button.hover", 1, 14))); + assert!(!has_shadow(&frame)); + + let (mut tree, _) = placed( + theme.clone(), + IconButton::new(IconWidget::checkmark(12.0)).toggle(Signal::new(true)), + ); + let frame = rerender(&mut tree); + let checked = painted(&frame) + .into_iter() + .find(|p| p.stroke == 0.0 && p.color[3] == 32) + .unwrap_or_else(|| panic!("{scheme}: no checked fill in {:?}", painted(&frame))); + assert!(near( + over(checked.color, window), + sample(scheme, "tool_button.checked", 14, 14) + )); + assert!(strokes(&frame).contains(&sample(scheme, "tool_button.checked", 1, 14))); + assert!(!has_shadow(&frame)); + } +} + +/// A split button is framed as a push button, its filled variants in the +/// accent so their on-accent label reads. +#[test] +fn a_split_button_is_framed_as_a_push_button() { + for (scheme, theme) in themes() { + let (mut tree, _) = placed( + theme.clone(), + SplitButton::new().item(MenuItem::new(lit!("Run"))), + ); + let frame = rerender(&mut tree); + assert!(fills(&frame).contains(&sample(scheme, "push_button.normal", 42, 17))); + assert!(strokes(&frame).contains(&sample(scheme, "push_button.normal", 1, 17))); + assert!(has_shadow(&frame)); + + let (mut tree, _) = placed( + theme.clone(), + SplitButton::new() + .item(MenuItem::new(lit!("Run"))) + .variant(ButtonVariant::Filled), + ); + let frame = rerender(&mut tree); + assert!(fills(&frame).contains(&rgba8(theme.colors.accent.to_array()))); + let on_accent: Color = theme.colors.text_on_accent; + assert!( + frame + .glyphs + .iter() + .any(|g| rgba8(g.color) == rgba8(on_accent.to_array())), + "{scheme}: the filled split button's label is not the on-accent text" + ); + } +} + +/// A filled split button's frame covers exactly what a push button's does: +/// its face and its outline, in the accent, lie on the same rectangles, so +/// the outline hides the shadow's sides and meets the shadow line below. +#[test] +fn a_filled_split_button_frame_has_the_push_buttons_bounds() { + // Each shape's screen rectangle relative to the node. + let local = |p: Painted, b: teksilo_canvas::Rect| { + [ + p.screen[0] - b.x, + p.screen[1] - b.y, + p.screen[2], + p.screen[3], + ] + }; + for (scheme, theme) in themes() { + let (mut tree, id) = placed( + theme.clone(), + SplitButton::new().item(MenuItem::new(lit!("Run"))), + ); + let frame = rerender(&mut tree); + let b = tree.bounds(id); + let face = sample(scheme, "push_button.normal", 42, 17); + let outline = sample(scheme, "push_button.normal", 1, 17); + let push = painted(&frame); + let push_face = *push + .iter() + .find(|p| p.color == face && p.stroke == 0.0) + .unwrap(); + let push_outline = *push + .iter() + .find(|p| p.color == outline && p.stroke > 0.0) + .unwrap(); + + let (mut tree, id) = placed( + theme.clone(), + SplitButton::new() + .item(MenuItem::new(lit!("Run"))) + .variant(ButtonVariant::Filled), + ); + let frame = rerender(&mut tree); + let fb = tree.bounds(id); + assert_eq!((fb.width, fb.height), (b.width, b.height), "{scheme}"); + let accent = rgba8(theme.colors.accent.to_array()); + let filled = painted(&frame); + let accent_face = *filled + .iter() + .find(|p| p.color == accent && p.stroke == 0.0) + .unwrap_or_else(|| panic!("{scheme}: no accent face in {filled:?}")); + let accent_outline = *filled + .iter() + .find(|p| p.color == accent && p.stroke > 0.0) + .unwrap_or_else(|| panic!("{scheme}: no accent outline in {filled:?}")); + assert_eq!(accent_outline.stroke, push_outline.stroke, "{scheme}"); + assert_eq!(local(accent_face, fb), local(push_face, b), "{scheme}"); + assert_eq!( + local(accent_outline, fb), + local(push_outline, b), + "{scheme}" + ); + // The shadow is the outline one pixel lower, as under a push button. + let shadow = *filled.iter().find(|p| p.color == SHADOW).unwrap(); + assert_eq!(shadow.screen[0], accent_outline.screen[0], "{scheme}"); + assert_eq!(shadow.screen[2], accent_outline.screen[2], "{scheme}"); + assert_eq!(shadow.screen[1], accent_outline.screen[1] + 1.0, "{scheme}"); + } +} + +/// Keyboard focus adds the 2 px focus frame, centred on the node edge, in +/// the theme's focus colour. +#[test] +fn keyboard_focus_draws_the_focus_frame() { + use teksilo_core::event::{Key, Modifiers}; + for (scheme, theme) in themes() { + let ring = rgba8(theme.colors.focus_ring.to_array()); + let mut tree = tree_with(theme); + let row = tree.add( + HStack::new() + .child(Button::new(lit!("One"))) + .child(Button::new(lit!("Two"))), + ); + tree.layout(SizeProposal::exact(400.0, 300.0)); + tree.press_key(Key::Tab, Modifiers::NONE); + let frame = rerender(&mut tree); + let first = tree.bounds(tree.children(row)[0]); + let focus = painted(&frame) + .into_iter() + .find(|p| p.color == ring && p.stroke == 2.0) + .unwrap_or_else(|| panic!("{scheme}: no focus frame in {:?}", painted(&frame))); + assert_eq!(focus.screen, [first.x, first.y, first.width, first.height]); + } +} diff --git a/crates/teksilo-theme-kde/tests/preset_metrics.rs b/crates/teksilo-theme-kde/tests/preset_metrics.rs new file mode 100644 index 000000000..779bc0bd0 --- /dev/null +++ b/crates/teksilo-theme-kde/tests/preset_metrics.rs @@ -0,0 +1,305 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! A dimension this preset writes must be the dimension the widget renders, +//! and at the Compact density it must be the one Plasma's Breeze reports. +//! +//! The unit tests beside each style check the numbers the styles are built +//! with. These mount the real widgets under the real preset, at every +//! density, inside a tappable row (the geometry that denies the miss-only +//! slop pass, so a target too small fails rather than being topped up), and +//! measure the laid-out nodes. The Compact sizes are checked against what Qt +//! measured for Breeze at Plasma's default font +//! (`tools/kde_golden/vectors/sizes.json`); this file reads that file from +//! the repository, so it is left out of the published package (the +//! `exclude` list in `Cargo.toml`). + +use std::cell::RefCell; +use std::rc::Rc; + +use serde_json::Value; +use teksilo_canvas::{MockTextBackend, SizeProposal}; +use teksilo_core::accessibility::target_audit::{ + PIN_TOLERANCE, gate::ALL_DENSITIES, measure_targets, target_audit, +}; +use teksilo_core::styles::Theme; +use teksilo_core::widget::Widget; +use teksilo_core::widget_id::WidgetId; +use teksilo_core::widget_tree::WidgetTree; +use teksilo_i18n::lit; +use teksilo_target_conformance::in_tappable_row; +use teksilo_theme_kde::geometry::BreezeGeometry; +use teksilo_theme_kde::{self as kde}; +use teksilo_tokens::TargetDensity; +use teksilo_widgets::primitives::IconWidget; +use teksilo_widgets::{Button, ButtonVariant, IconButton, IconButtonSize, MenuItem, SplitButton}; + +const SIZES_JSON: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../tools/kde_golden/vectors/sizes.json" +)); + +/// The size hint Qt reported for the Breeze control `id` labelled `text` +/// (or unlabelled) at Plasma's default Noto Sans 10. +fn qt_size(id: &str, text: Option<&str>) -> (f32, f32) { + let all: Value = serde_json::from_str(SIZES_JSON).expect("sizes.json parses"); + let widget = all["widgets"] + .as_array() + .expect("the measured widgets") + .iter() + .find(|w| { + w["id"] == id + && w["font"] == "Noto Sans 10" + && text.is_none_or(|t| w["config"]["text"] == t) + }) + .unwrap_or_else(|| panic!("sizes.json has no {id}")); + let hint = &widget["size_hint"]; + ( + hint[0].as_f64().unwrap() as f32, + hint[1].as_f64().unwrap() as f32, + ) +} + +/// A tree under `theme` at `density` holding `w` in a tappable row, laid out. +fn in_a_row( + theme: &Theme, + density: TargetDensity, + w: impl Widget + 'static, +) -> (WidgetTree, WidgetId) { + let mut tree = WidgetTree::new() + .with_theme(theme.with_density(density)) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))); + let root = in_tappable_row(&mut tree, w); + tree.layout(SizeProposal::exact(600.0, 200.0)); + (tree, root) +} + +/// Every node under `root` whose type name is `name`, in tree order. +fn nodes_named(tree: &WidgetTree, root: WidgetId, name: &str) -> Vec { + let mut out = Vec::new(); + fn walk(tree: &WidgetTree, id: WidgetId, name: &str, out: &mut Vec) { + if tree + .widget_type_name(id) + .is_some_and(|t| t.rsplit("::").next() == Some(name)) + { + out.push(id); + } + for c in tree.children(id) { + walk(tree, c, name, out); + } + } + walk(tree, root, name, &mut out); + out +} + +/// The laid-out `(width, height)` of the one `name` node in a row holding +/// `w`, built at `density`, and whether the row passes the conformance gate. +fn measured( + theme: &Theme, + density: TargetDensity, + name: &str, + w: impl Widget + 'static, +) -> ((f32, f32), usize) { + let (tree, root) = in_a_row(theme, density, w); + let nodes = nodes_named(&tree, root, name); + assert_eq!(nodes.len(), 1, "one {name} in the row"); + let b = tree.bounds(nodes[0]); + let failures = target_audit(&tree, density) + .into_iter() + .filter(|v| v.rule.is_conformance_failure()) + .count(); + ((b.width, b.height), failures) +} + +fn themes() -> [Theme; 2] { + [kde::light(), kde::dark()] +} + +// ── Push buttons ─────────────────────────────────────────────────────── + +/// A push button is 84 x 34 at Compact, Qt's size for Breeze's "OK" and +/// "Cancel" buttons, and keeps that size whether it is the default button or +/// a flat one. Above Compact its height rises to the density's target size +/// (34 already clears Comfortable's 32, and Touch makes it 44); the 84 px +/// minimum width is above every target. +/// +/// The labels are short enough to sit inside the minimum width under the +/// mock text metrics, so the width measured is Breeze's own floor rather +/// than the mock's glyph widths. +#[test] +fn a_push_button_measures_breezes_size_at_every_density() { + let compact = qt_size("push_button", Some("OK")); + assert_eq!(compact, (84.0, 34.0)); + assert_eq!(qt_size("push_button", Some("Cancel")), compact); + assert_eq!(qt_size("push_button.default", Some("OK")), compact); + assert_eq!(qt_size("push_button.flat", Some("OK")), compact); + let expected = [ + (TargetDensity::Compact, compact), + (TargetDensity::Comfortable, (84.0, 34.0)), + (TargetDensity::Touch, (84.0, 44.0)), + ]; + assert_eq!(expected.len(), ALL_DENSITIES.len(), "every density"); + for (density, size) in expected { + for theme in themes() { + for variant in [ + ButtonVariant::Plain, + ButtonVariant::Filled, + ButtonVariant::Ghost, + ButtonVariant::Destructive, + ] { + for label in ["OK", "Cancel"] { + let (got, failures) = measured( + &theme, + density, + "Button", + Button::new(lit!(label)).variant(variant), + ); + assert_eq!(got, size, "{density:?} {variant:?} {label}"); + assert_eq!( + failures, 0, + "{density:?} {variant:?}: a conformance failure" + ); + } + } + } + } +} + +/// A label wider than the minimum grows the button by Breeze's 8 px gutter +/// on each side, scaled by the density's spacing. +#[test] +fn a_long_label_grows_the_button_by_the_breeze_gutters() { + // Under the mock metrics a character is 8 px wide. + let label = "Apply all the changes"; + let text = label.chars().count() as f32 * 8.0; + for (density, gutter) in [ + (TargetDensity::Compact, 8.0), + (TargetDensity::Comfortable, 9.2), + (TargetDensity::Touch, 10.4), + ] { + let ((w, _), _) = measured(&kde::light(), density, "Button", Button::new(lit!(label))); + assert!( + (w - (text + 2.0 * gutter)).abs() < 1e-3, + "{density:?}: {w}, want {}", + text + 2.0 * gutter + ); + } +} + +// ── Tool buttons ─────────────────────────────────────────────────────── + +/// An `IconButton` is Breeze's auto-raise tool button: 28 px around a 16 px +/// icon and 34 px around the 22 px toolbar icon at Compact, as Qt measures +/// them, rising to the density's target size above it. Every rung clears the +/// conformance floor at every density. +#[test] +fn an_icon_button_measures_breezes_tool_button_at_every_density() { + assert_eq!(qt_size("tool_button.auto_raise.16", None), (28.0, 28.0)); + assert_eq!(qt_size("tool_button.auto_raise.22", None), (34.0, 34.0)); + let expected = [ + (TargetDensity::Compact, [24.0, 28.0, 34.0, 44.0, 60.0]), + (TargetDensity::Comfortable, [32.0, 32.0, 34.0, 44.0, 60.0]), + (TargetDensity::Touch, [44.0, 44.0, 44.0, 44.0, 60.0]), + ]; + let sizes = [ + IconButtonSize::Compact, + IconButtonSize::Default, + IconButtonSize::Toolbar, + IconButtonSize::Large, + IconButtonSize::Hero, + ]; + for (density, squares) in expected { + for theme in themes() { + for (size, square) in sizes.into_iter().zip(squares) { + let (tree, _) = in_a_row( + &theme, + density, + IconButton::new(IconWidget::checkmark(12.0)).size(size), + ); + let button = measure_targets(&tree, density) + .into_iter() + .find(|m| m.widget.ends_with("IconButton") && m.part.is_none()) + .unwrap_or_else(|| panic!("{density:?}: the row holds an icon button")); + assert!( + (button.size.width - square).abs() < 1e-3 + && (button.size.height - square).abs() < 1e-3, + "{density:?} {size:?}: {:?}, want {square}", + button.size + ); + let floor = button.conformance_floor; + assert!( + button.expanded.width + PIN_TOLERANCE >= floor + && button.expanded.height + PIN_TOLERANCE >= floor, + "{density:?} {size:?}: {:?} against {floor}", + button.expanded + ); + assert_eq!( + target_audit(&tree, density) + .into_iter() + .filter(|v| v.rule.is_conformance_failure()) + .count(), + 0, + "{density:?} {size:?}: a conformance failure", + ); + } + } + } + // The two rungs Qt measured are the geometry's. + let g = BreezeGeometry::breeze_default(); + assert_eq!(g.tool_button_height, 28.0); + assert_eq!(g.tool_button_height_medium, 34.0); +} + +/// The framed tool button, which `IconButton` has no form of, is still +/// recorded at Qt's sizes. +#[test] +fn the_framed_tool_button_heights_are_qts() { + let g = BreezeGeometry::breeze_default(); + assert_eq!( + qt_size("tool_button.framed.16", None), + (g.framed_tool_button_height, g.framed_tool_button_height) + ); + assert_eq!( + qt_size("tool_button.framed.22", None), + ( + g.framed_tool_button_height_medium, + g.framed_tool_button_height_medium + ) + ); +} + +// ── Split buttons ────────────────────────────────────────────────────── + +/// A `SplitButton` is framed as a push button: as tall as one at every +/// density (34, 34, 44), and at least its 84 px wide. +#[test] +fn a_split_button_is_as_tall_as_a_push_button_at_every_density() { + for (density, height) in [ + (TargetDensity::Compact, 34.0), + (TargetDensity::Comfortable, 34.0), + (TargetDensity::Touch, 44.0), + ] { + for theme in themes() { + for variant in [ + ButtonVariant::Plain, + ButtonVariant::Filled, + ButtonVariant::Ghost, + ] { + let ((w, h), failures) = measured( + &theme, + density, + "SplitButton", + SplitButton::new() + .item(MenuItem::new(lit!("Run"))) + .variant(variant), + ); + assert_eq!(h, height, "{density:?} {variant:?}"); + assert!(w >= 84.0, "{density:?} {variant:?}: {w} wide"); + assert_eq!( + failures, 0, + "{density:?} {variant:?}: a conformance failure" + ); + } + } + } +} From b178e365fd34270e590ccc5c253d3ab2a2b7fb17 Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 16:46:46 +0200 Subject: [PATCH 23/59] feat(theme-kde): paint the switch, check box, radio and field as Breeze does The preset installs four more structural styles: toggle, checkbox, radio and text_input. The four slots leave KDE_UNFILLED. The check box, radio button and switch share their colours through styles::indicator, and their dimensions are in styles::metrics. Check box and radio button, spec k.5.6 and k.5.7: a 20 px indicator holding a 16 px box, stroked as 15 px at 2.5 with radius 4 (a disc for the radio), filled with the button colour, darkened 110 % while pressed. Checked or partial, the outline is the current window's highlight and the box is filled again with the highlight at 0.3; the check is a polyline through (6, 10), (9, 13), (14.5, 7.5) with a 2 px pen and mitre joins in the view's text, the partial state three 2 px squares 4 px apart, the radio dot 6 px. Hover adds a 1 px ring of the focus colour on the outline. The mark draws along its length and the dot grows over 100 ms, linearly. Keyboard focus is the 2 px focus frame outside the box, in the focus_ring token (D5). The body is laid out 18 px wide, so the widgets' 6 px gap puts the label at x 24, where Qt measures it. D8: Qt's labelled check box and radio row is 22 px; the node is raised to the density's target (24 at Compact) by the widgets' existing MinSize and the indicator is still painted at 20, centred. Switch, spec k.5.9 and k.8 (the desktop QtQuick style): a 36 x 18 indicator, a 36 x 12 track at radius 6 filled with the button colour moved 10 % toward the button text, the highlight at 0.5 up to the handle's trailing edge when on, an 18 px handle in the button colour outlined in the button outline or, hovered or keyboard focused, the button set's hover decoration. The handle sits at clamp(p x 36 - 9, 0, 18), mirrored right to left, and moves over min(100 ms, 18 px at 200 px a second), so 90 ms, on the handle easing; its outline changes over 100 ms on the colour easing. The node is raised to the target on both axes, the paint centred. A focus frame is added around the indicator. Line edit, spec k.5.3: the view fill on the node inset by 0.5 at radius 4.5, no shadow inset; the outline turns to the focus colour while focused at the same 1 px width, to the hover colour under the pointer (TextInput never reports hover, so only the rule is tested). 32 px at Compact through dp(.., Target), text inset 6 through spacing(); cfg.min_height replaces the height; Bare returns the editor untouched; Underline keeps the bottom edge; a validation level tints the outline. D6: the outline of an empty box, disc, switch track and field at rest is border_strong, the frame outline lifted to 3:1, with a premise test that Breeze's own fails. A checked switch has no mark, so its track outline, Breeze Light's highlight at 2.2:1 on the window, is the highlight lifted in luma to 3:1 (4.5:1 under high contrast) on the control surfaces and the handle's face; Breeze Dark's highlight passes and is kept. Where the specification and the plan differ, the specification is followed: the switch's colours, borders and checked fill are k.5.9's, not the plan's fallback values, and its handle travels in 90 ms rather than 100 ms (k.8). Breeze paints only the fill of a line edit shorter than the line box plus 12 px; the frame is kept at every height, for D6. Tests: unit tests of each paint rule, geometry and timing, the Breeze Light colours against Plasma's samples, the lifts and their premises, the backdrop window and the palette-less fallback; tests/mount.rs mounts every state and variant, light and dark, in the swap, the palette-less and the swatch tests, and checks the box face, outline, wash, mark, partial squares, hover ring, pressed face, backdrop highlight and focus frame, the radio disc, dot and focus frame, the switch track, handle, outlines and focus frame in both directions, the field fill, outlines and disabled colours, and the disabled check box and radio, against pixels.json; the right-to-left box, disc, label and squares; with each Plasma accent, a hover ring in the focus colour rather than the highlight; and, on the tree's simulated clock, the handle reaching 18 px at 90 ms, its outline turning over 100 ms, the mark drawing, the squares appearing at each third, the dot growing, and all of them snapping under reduced motion. tests/preset_metrics.rs measures the check box and radio row (D8, label at 24), the switch node and the field frame at all three densities against sizes.json, with the conformance gate; tests/row_hit.rs presses the painted box of a check box in a selected and an unselected list row at Compact and Touch; tests/text_input_min_height.rs checks the min_height override. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 15 +- crates/teksilo-theme-kde/src/lib.rs | 57 +- crates/teksilo-theme-kde/src/styles.rs | 25 +- .../teksilo-theme-kde/src/styles/checkbox.rs | 452 ++++++ crates/teksilo-theme-kde/src/styles/chrome.rs | 2 +- .../teksilo-theme-kde/src/styles/indicator.rs | 391 ++++++ .../teksilo-theme-kde/src/styles/metrics.rs | 143 +- crates/teksilo-theme-kde/src/styles/radio.rs | 228 ++++ .../src/styles/text_input.rs | 367 +++++ crates/teksilo-theme-kde/src/styles/toggle.rs | 458 +++++++ crates/teksilo-theme-kde/tests/mount.rs | 1216 ++++++++++++++++- .../teksilo-theme-kde/tests/preset_metrics.rs | 183 ++- crates/teksilo-theme-kde/tests/row_hit.rs | 120 ++ .../tests/text_input_min_height.rs | 64 + 14 files changed, 3678 insertions(+), 43 deletions(-) create mode 100644 crates/teksilo-theme-kde/src/styles/checkbox.rs create mode 100644 crates/teksilo-theme-kde/src/styles/indicator.rs create mode 100644 crates/teksilo-theme-kde/src/styles/radio.rs create mode 100644 crates/teksilo-theme-kde/src/styles/text_input.rs create mode 100644 crates/teksilo-theme-kde/src/styles/toggle.rs create mode 100644 crates/teksilo-theme-kde/tests/row_hit.rs create mode 100644 crates/teksilo-theme-kde/tests/text_input_min_height.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index c83dab1d5..3d25721bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -155,8 +155,19 @@ by crate for clarity, not because crates version independently. toolbar's tool button, 28 px around a 16 px icon and 34 px around a toolbar one, and a `SplitButton` has the push button's frame, its `Filled` and `Destructive` variants filled with the accent so their label stays - readable. All three grow to the density's target size. Other widgets draw - Teksilo's own chrome in these colours and shapes. + readable. All three grow to the density's target size. A `Checkbox` and a + `RadioButton` are Breeze's: a 15 px box or disc in the button colour, + outlined, and when checked outlined in the highlight, washed with it and + marked in the text colour, with the label 24 px from the leading edge; + their row is 24 px rather than Breeze's 22, so it stays a WCAG target + size. A `Toggle` is the switch KDE applications show, an 18 px handle on + a 36 px track, moving and changing colour on the curves KDE uses. A + `TextInput` is the line edit, 32 px tall at Plasma's default font, its + 1 px outline turning to the focus colour while it has focus, and it + honours `TextInput::min_height`. The outlines of an empty check box, + radio button and field, and of a switch on or off, are strengthened to a + 3:1 contrast, keeping their hue. Other widgets draw Teksilo's own chrome + in these colours and shapes. #### Platform diff --git a/crates/teksilo-theme-kde/src/lib.rs b/crates/teksilo-theme-kde/src/lib.rs index 9a5043606..f175a5d10 100644 --- a/crates/teksilo-theme-kde/src/lib.rs +++ b/crates/teksilo-theme-kde/src/lib.rs @@ -41,7 +41,13 @@ //! contrast), with an outline that turns to the highlight under the //! pointer or keyboard focus and a 1 px shadow below it in an active //! window; the default button's fill moves toward the highlight, and a -//! tool button shows nothing until it is hovered ([`styles`]). Other +//! tool button shows nothing until it is hovered ([`styles`]). +//! - **Breeze's indicators and fields.** A check box or radio button is a +//! 15 px box or disc in the button colour, filled toward the highlight and +//! marked in the view's text when checked, its label 24 px from its +//! leading edge; a switch is a handle as tall as its 36 x 18 indicator +//! riding a 12 px track; a text field is a flat view-coloured frame whose +//! 1 px outline turns to the focus colour while it has focus. Other //! controls are outlined in the window colour moved the same way toward //! the text, the `border` token; the highlight-based outlines are in //! [`BreezeColors`]. @@ -95,9 +101,25 @@ //! ## Known limitations //! //! - **Most widget chrome is the framework's.** This version installs -//! Breeze styles for `Button`, `IconButton` and `SplitButton` only: every -//! other widget keeps Teksilo's recipe style, painted in the Breeze -//! colours, radii, focus ring, typography and motion. +//! Breeze styles for `Button`, `IconButton`, `SplitButton`, `Toggle`, +//! `Checkbox`, `RadioButton` and `TextInput` only: every other widget +//! keeps Teksilo's recipe style, painted in the Breeze colours, radii, +//! focus ring, typography and motion. +//! - **A check box or radio button row is 24 px, not 22.** Breeze's row is +//! the label's line box plus 4 px; the widgets keep their 24 px minimum, +//! WCAG 2.2's target size, and paint the 20 px indicator unchanged in it +//! (D8, [`styles::checkbox`]). +//! - **The switch is not exactly the desktop style's.** Its label is the +//! `Toggle`'s, 6 px after the node, where the desktop style spaces it 4 px +//! after the indicator; keyboard focus adds the 2 px focus frame Breeze +//! draws around a check box, which the desktop style's switch has not; +//! the node is raised to the density's target on both axes, the 36 x 18 +//! indicator painted unchanged in it; and a checked track is outlined in +//! the highlight lifted to 3:1 (D6) ([`styles::toggle`]). +//! - **A short text field keeps its frame.** Breeze paints only the fill of +//! a line edit shorter than the line box plus 12 px; the field keeps its +//! outline at every height, the field's only boundary (D6, +//! [`styles::text_input`]). //! - **A filled `SplitButton` is filled with the accent.** The widget labels //! its `Filled` and `Destructive` variants in the on-accent text and gives //! its style no say, so they are framed in the accent rather than as @@ -256,7 +278,8 @@ fn project(theme: &Theme, state: PaintState) -> Theme { /// Install the Breeze Tier-3 chrome. /// -/// The buttons are Breeze's own ([`styles`]); every other slot is left to +/// The buttons, the check box, the radio button, the switch and the line +/// edit are Breeze's own ([`styles`]); every other slot is left to /// the widget's recipe style, which paints from the Breeze tokens, and the /// crate's tests list the reason for each. Every style installed here reads /// its metrics from the theme it builds under, `theme.input` included, so @@ -266,6 +289,10 @@ fn install_styles(theme: &mut Theme) { slots.button = Some(Rc::new(styles::button::BreezeButtonStyle)); slots.icon_button = Some(Rc::new(styles::icon_button::BreezeIconButtonStyle)); slots.split_button = Some(Rc::new(styles::split_button::BreezeSplitButtonStyle)); + slots.toggle = Some(Rc::new(styles::toggle::BreezeToggleStyle)); + slots.checkbox = Some(Rc::new(styles::checkbox::BreezeCheckboxStyle)); + slots.radio = Some(Rc::new(styles::radio::BreezeRadioStyle)); + slots.text_input = Some(Rc::new(styles::text_input::BreezeTextInputStyle)); } #[cfg(test)] @@ -465,18 +492,6 @@ mod tests { "splitter", "the recipe's thin divider in the border role reads as Breeze's 1 px splitter handle", ), - ( - "toggle", - "no Breeze switch is installed; the recipe switch reads the Breeze accent and border tokens", - ), - ( - "checkbox", - "no Breeze check box is installed; the recipe box reads the Breeze accent and strong border tokens", - ), - ( - "radio", - "no Breeze radio button is installed; the recipe ring reads the Breeze accent and strong border tokens", - ), ( "radio_tile", "Breeze has no selectable card; the recipe surface reads the preset's surface and accent roles", @@ -485,10 +500,6 @@ mod tests { "slider", "no Breeze slider is installed; the recipe track and knob read the Breeze accent and border tokens", ), - ( - "text_input", - "no Breeze line-edit frame is installed; the recipe field reads the Breeze content, border and focus tokens", - ), ( "combo_box", "no Breeze combo box is installed; the recipe paints from the Breeze field and border tokens", @@ -579,7 +590,7 @@ mod tests { ), ( "date_edit", - "the recipe is a passthrough around the TextInput, whose slot this preset leaves to its recipe", + "the recipe is a passthrough around the TextInput, which this preset frames as Breeze's line edit", ), ( "rich_text_editor", @@ -615,7 +626,7 @@ mod tests { ), ( "search_field", - "the recipe field reads the Breeze content, border and focus tokens", + "the recipe is a passthrough around the TextInput, which this preset frames as Breeze's line edit", ), ]; diff --git a/crates/teksilo-theme-kde/src/styles.rs b/crates/teksilo-theme-kde/src/styles.rs index 6c4efc8e9..4ea80df47 100644 --- a/crates/teksilo-theme-kde/src/styles.rs +++ b/crates/teksilo-theme-kde/src/styles.rs @@ -6,15 +6,28 @@ //! [`crate::from_scheme`]. //! //! Widgets whose Breeze counterpart differs in **structure** get a real -//! `impl FooStyle` here: the push button, the default button and the flat -//! tool button, with their outline that turns to the highlight under the -//! pointer and their one-pixel shadow. They share one painter, -//! [`chrome::BreezeButtonChrome`]. The dimensions they are built with, all -//! derived from [`crate::geometry`] and the density ladder, are collected in -//! [`metrics`]. +//! `impl FooStyle` here: +//! +//! - the push button, the default button and the flat tool button, with +//! their outline that turns to the highlight under the pointer and their +//! one-pixel shadow, sharing one painter, [`chrome::BreezeButtonChrome`]; +//! - the check box and the radio button, a 15 px box or disc in a 20 px +//! indicator marked in the view's text, and the desktop QtQuick style's +//! switch, a handle as tall as its track's indicator, which share their +//! colours through [`indicator`]; +//! - the line edit, a view-coloured frame whose outline turns to the focus +//! colour, in [`text_input`]. +//! +//! The dimensions they are built with, all derived from [`crate::geometry`] +//! and the density ladder, are collected in [`metrics`]. pub mod button; +pub mod checkbox; pub mod chrome; pub mod icon_button; +pub mod indicator; pub mod metrics; +pub mod radio; pub mod split_button; +pub mod text_input; +pub mod toggle; diff --git a/crates/teksilo-theme-kde/src/styles/checkbox.rs b/crates/teksilo-theme-kde/src/styles/checkbox.rs new file mode 100644 index 000000000..21fe444d5 --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/checkbox.rs @@ -0,0 +1,452 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze check box. +//! +//! A 20 px indicator holding a 16 px box, stroked as 15 px at 2.5 with a +//! 4 px radius and filled with the button colour. Checked or partial, the +//! box is outlined in the highlight and filled again with the highlight at +//! 30 %, then marked in the view's text: a check drawn with a 2 px pen and +//! mitred joins through (6, 10), (9, 13) and (14.5, 7.5) of the indicator, +//! or three 2 px squares 4 px apart for the partial state. Pressed, the +//! button colour darkens 110 %; under the pointer a 1 px ring of the focus +//! colour lies on the outline. The mark draws itself along its length over +//! the style's 100 ms, linearly, and the partial squares appear one at each +//! third. The colours, and where they depart from Breeze, are in +//! [`crate::styles::indicator`]. +//! +//! ## D8, the check box row +//! +//! Breeze lays a labelled check box out in a row as tall as the label's +//! line box plus 2 px above and below: 22 px at Plasma's default font, the +//! indicator 1 px from its top. That is under WCAG 2.2 SC 2.5.8's 24 px +//! target. The `Checkbox` widget already wraps its row in a minimum size of +//! the density's target, 24 px at Compact, so the node is 24 px tall and +//! the indicator, still painted at 20, sits 2 px from its top. Nothing is +//! scaled: only the row grows. +//! +//! ## The label +//! +//! Breeze puts the label 24 px from the indicator's leading edge, the +//! indicator and a 4 px spacing. The widget puts its own 6 px between the +//! style's body and the label, so the body is laid out 18 px wide, the +//! indicator less the trailing 2 px of its focus margin, and the label lands +//! where Breeze puts it. The box ends at 18, so it lies in the body; only +//! the keyboard focus frame reaches past it. +//! +//! ## Variants +//! +//! Breeze has one check box. `Square` is it; `Rounded` rounds the box to +//! 6 px and `Circle` makes it a disc (`[unpublished]`), with Breeze's fills, +//! outline and mark. + +use teksilo_canvas::{Canvas, LineJoin, Path, Point, Rect, Size, SizeProposal, StrokeStyle}; +use teksilo_core::accessibility::AccessNodeBuilder; +use teksilo_core::binding::BindingLevel; +use teksilo_core::build_context::BuildContext; +use teksilo_core::signal::Signal; +use teksilo_core::styles::{ + CheckboxState, CheckboxStyle, CheckboxStyleConfig, CheckboxVariant, FocusRingStroke, +}; +use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement}; +use teksilo_core::widget_id::WidgetId; +use teksilo_tokens::{Color, CornerRadius}; +use teksilo_widgets::styles::recipe_checkbox_style::CHECKBOX_LABEL_GAP; + +use crate::shape::BREEZE_CHECKBOX_RADIUS; +use crate::styles::indicator::{BreezeIndicatorColors, box_rect, indicator_rect, stroked_box_rect}; +use crate::styles::metrics::{ + CHECK_MARK_PEN, INDICATOR_BOX_STROKED, INDICATOR_CHECKED_WASH, INDICATOR_SIZE, + PARTIAL_DOT_SIZE, PARTIAL_DOT_SPACING, indicator_body_width, +}; + +/// `[Hp]` The check mark's three points, in the indicator's coordinates: +/// `(left + 4, centre y)`, `(centre x - 1, bottom - 5)`, `(centre x + 4.5, +/// top + 5.5)` of the 16 px box at (2, 2), whose centre is (10, 10). +pub const CHECK_MARK_POINTS: [(f32, f32); 3] = [(6.0, 10.0), (9.0, 13.0), (14.5, 7.5)]; + +/// `[unpublished]` The radius of the `Rounded` variant's box. +const ROUNDED_RADIUS: f32 = 6.0; + +/// Breeze `CheckboxStyle`. +#[derive(Debug, Default, Clone, Copy)] +pub struct BreezeCheckboxStyle; + +impl CheckboxStyle for BreezeCheckboxStyle { + fn make_body(&self, cfg: &CheckboxStyleConfig, ctx: &mut BuildContext) -> WidgetId { + let marked = |s: &CheckboxState| !matches!(s, CheckboxState::Unchecked); + let progress = ctx.animated_signal(if marked(&cfg.state.get()) { 1.0 } else { 0.0 }); + // `[S]` Breeze's style transitions: 100 ms, linear. + let draw = ctx.animate().fast().standard(); + { + let progress = progress.clone(); + ctx.effect(&cfg.state, move |s| { + draw.to_or_snap(&progress, if marked(s) { 1.0 } else { 0.0 }); + }); + } + let show_focus_frame = cfg + .is_focused + .zip(&cfg.is_disabled) + .map(|(focused, disabled)| *focused && !*disabled); + ctx.add(BreezeCheckboxBody { + check: cfg.state.clone(), + progress, + is_hovered: cfg.is_hovered.clone(), + is_pressed: cfg.is_pressed.clone(), + is_disabled: cfg.is_disabled.clone(), + show_focus_frame, + variant: cfg.variant, + }) + } +} + +struct BreezeCheckboxBody { + check: Signal, + /// How far the mark is drawn, 0 to 1. + progress: Signal, + is_hovered: Signal, + is_pressed: Signal, + is_disabled: Signal, + show_focus_frame: Signal, + variant: CheckboxVariant, +} + +impl std::fmt::Debug for BreezeCheckboxBody { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeCheckboxBody") + .field("variant", &self.variant) + .finish() + } +} + +/// The radius the box of `variant` is stroked with. +pub fn variant_radius(variant: CheckboxVariant) -> f32 { + match variant { + CheckboxVariant::Square => BREEZE_CHECKBOX_RADIUS, + CheckboxVariant::Rounded => ROUNDED_RADIUS, + CheckboxVariant::Circle => INDICATOR_BOX_STROKED * 0.5, + } +} + +/// What a box paints: a face, an optional highlight wash over it, an +/// outline, and whether the hover ring lies on the outline. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BoxPaint { + /// The button colour, darkened while pressed. + pub face: Color, + /// The highlight at 30 % over the face, when checked or partial. + pub wash: Option, + /// The 1 px outline. + pub outline: Color, + /// The 1 px ring of the focus colour on the outline, under the pointer. + pub hover_ring: Option, +} + +/// `[Hp]` What a box (or a radio disc) paints, marked or not, hovered or +/// pressed, enabled or not, from `c`. +pub fn box_paint( + marked: bool, + hovered: bool, + pressed: bool, + disabled: bool, + c: &BreezeIndicatorColors, +) -> BoxPaint { + let active = !disabled; + BoxPaint { + face: if pressed && active { + c.button_pressed + } else { + c.button + }, + wash: marked.then(|| c.highlight.with_alpha(INDICATOR_CHECKED_WASH)), + outline: if marked { c.highlight } else { c.outline }, + hover_ring: (hovered && active).then_some(c.focus), + } +} + +/// Paint `paint` on the stroked box `rect` at `radius`. +pub fn paint_box(canvas: &mut Canvas, rect: Rect, radius: f32, pen: f32, paint: &BoxPaint) { + let corner = CornerRadius::uniform(radius); + if paint.face.a() > 0.0 { + canvas.fill_rounded_rect(rect, corner, paint.face); + } + if let Some(wash) = paint.wash + && wash.a() > 0.0 + { + canvas.fill_rounded_rect(rect, corner, wash); + } + if pen <= 0.0 { + return; + } + if paint.outline.a() > 0.0 { + canvas.stroke_rounded_rect(rect, corner, paint.outline, pen); + } + if let Some(ring) = paint.hover_ring + && ring.a() > 0.0 + { + canvas.stroke_rounded_rect(rect, corner, ring, pen); + } +} + +/// `[Hp]` The keyboard focus frame around an indicator: a band as wide as +/// the focus ring whose inner edge is the 16 px box, with the box's corner +/// radius `radius`. +pub fn indicator_focus_frame(indicator: Rect, radius: f32, width: f32) -> FocusRingStroke { + FocusRingStroke::at_distance(box_rect(indicator), radius, width * 0.5) +} + +/// The points of the check mark drawn `progress` of the way along its +/// length, in canvas coordinates: none at 0, the whole polyline at 1. +pub fn check_mark(indicator: Rect, progress: f32) -> Vec { + let at = |(x, y): (f32, f32)| Point::new(indicator.x + x, indicator.y + y); + let points = CHECK_MARK_POINTS.map(at); + let progress = progress.clamp(0.0, 1.0); + if progress <= 0.0 { + return Vec::new(); + } + let lengths: Vec = points + .windows(2) + .map(|w| ((w[1].x - w[0].x).powi(2) + (w[1].y - w[0].y).powi(2)).sqrt()) + .collect(); + let mut left = lengths.iter().sum::() * progress; + let mut out = vec![points[0]]; + for (w, len) in points.windows(2).zip(lengths) { + if left >= len { + out.push(w[1]); + left -= len; + } else { + let t = left / len; + out.push(Point::new( + w[0].x + (w[1].x - w[0].x) * t, + w[0].y + (w[1].y - w[0].y) * t, + )); + break; + } + } + out +} + +/// The partial squares shown at `progress`: one at each third, from the +/// leading side. +pub fn partial_dots(indicator: Rect, progress: f32, direction_rtl: bool) -> Vec { + let shown = (progress.clamp(0.0, 1.0) * 3.0 + 1e-4).floor() as usize; + let cx = indicator.x + INDICATOR_SIZE * 0.5; + let cy = indicator.y + INDICATOR_SIZE * 0.5; + let half = PARTIAL_DOT_SIZE * 0.5; + let order: [f32; 3] = if direction_rtl { + [1.0, 0.0, -1.0] + } else { + [-1.0, 0.0, 1.0] + }; + order + .iter() + .take(shown) + .map(|side| { + Rect::new( + cx + side * PARTIAL_DOT_SPACING - half, + cy - half, + PARTIAL_DOT_SIZE, + PARTIAL_DOT_SIZE, + ) + }) + .collect() +} + +impl Widget for BreezeCheckboxBody { + fn build(&mut self, ctx: &mut BuildContext) -> Vec { + let id = ctx.self_id(); + let registry = ctx.binding_registry(); + self.check.bind_to(id, registry, BindingLevel::RepaintOnly); + self.progress + .bind_to(id, registry, BindingLevel::RepaintOnly); + for s in [ + &self.is_hovered, + &self.is_pressed, + &self.is_disabled, + &self.show_focus_frame, + ] { + s.bind_to(id, registry, BindingLevel::RepaintOnly); + } + vec![] + } + + /// The 18 px body of the module documentation, as tall as the indicator. + /// The widget's own minimum size raises the row to the density's target + /// (D8). + fn layout_response(&self, _proposal: SizeProposal, _ctx: &LayoutContext) -> LayoutResponse { + Size::new(indicator_body_width(CHECKBOX_LABEL_GAP), INDICATOR_SIZE).into() + } + + fn place_children( + &self, + _bounds: Rect, + _proposal: SizeProposal, + _children: &mut [WidgetPlacement], + _ctx: &LayoutContext, + ) { + } + + fn paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext) { + let check = self.check.get(); + let disabled = self.is_disabled.get(); + let colors = BreezeIndicatorColors::resolve( + ctx.theme, + ctx.window_active, + ctx.prefers_high_contrast, + disabled, + ); + let indicator = indicator_rect(bounds, ctx.layout_direction); + let pen = ctx.theme.shape.border_width; + let radius = variant_radius(self.variant); + let paint = box_paint( + !matches!(check, CheckboxState::Unchecked), + self.is_hovered.get(), + self.is_pressed.get(), + disabled, + &colors, + ); + paint_box( + canvas, + stroked_box_rect(indicator, pen), + radius, + pen, + &paint, + ); + + let progress = self.progress.get(); + let rtl = ctx.layout_direction == teksilo_core::environment::LayoutDirection::RightToLeft; + match check { + CheckboxState::Checked => { + let points = check_mark(indicator, progress); + if points.len() >= 2 && colors.text.a() > 0.0 { + let mut path = Path::new(); + path.move_to(points[0]); + for p in &points[1..] { + path.line_to(*p); + } + let mut style = StrokeStyle::solid(CHECK_MARK_PEN); + style.line_join = LineJoin::Miter; + canvas.stroke_path(&path, colors.text, style); + } + } + CheckboxState::Indeterminate => { + for dot in partial_dots(indicator, progress, rtl) { + canvas.fill_rect(dot, colors.text); + } + } + CheckboxState::Unchecked => {} + } + + if self.show_focus_frame.get() { + let shape = &ctx.theme.shape; + if colors.focus_ring.a() > 0.0 && shape.focus_ring_width > 0.0 { + let ring = indicator_focus_frame(indicator, radius, shape.focus_ring_width); + canvas.stroke_rounded_rect( + ring.rect, + CornerRadius::uniform(ring.corner_radius), + colors.focus_ring, + shape.focus_ring_width, + ); + } + } + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + // Presentational: the `Checkbox` emits the check box node. + builder.set_hidden(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn c() -> BreezeIndicatorColors { + BreezeIndicatorColors::resolve(&crate::light(), true, false, false) + } + + #[test] + fn the_box_follows_breezes_rules() { + let c = c(); + let off = box_paint(false, false, false, false, &c); + assert_eq!(off.face, c.button); + assert_eq!(off.wash, None); + assert_eq!(off.outline, c.outline); + assert_eq!(off.hover_ring, None); + + let on = box_paint(true, false, false, false, &c); + assert_eq!(on.outline, c.highlight); + assert_eq!(on.wash, Some(c.highlight.with_alpha(0.3))); + + let pressed = box_paint(false, false, true, false, &c); + assert_eq!(pressed.face, c.button_pressed); + + let hovered = box_paint(false, true, false, false, &c); + assert_eq!(hovered.hover_ring, Some(c.focus)); + // A disabled box neither presses nor hovers. + let d = box_paint(false, true, true, true, &c); + assert_eq!((d.face, d.hover_ring), (c.button, None)); + } + + #[test] + fn the_mark_runs_through_the_three_points() { + let i = Rect::new(0.0, 0.0, 20.0, 20.0); + let whole = check_mark(i, 1.0); + assert_eq!( + whole, + vec![ + Point::new(6.0, 10.0), + Point::new(9.0, 13.0), + Point::new(14.5, 7.5) + ] + ); + assert!(check_mark(i, 0.0).is_empty()); + // Part way, it ends on the polyline, short of the end. + let half = check_mark(i, 0.5); + let end = *half.last().unwrap(); + assert!(end.x > 9.0 && end.x < 14.5, "{end:?}"); + assert!( + (end.y - (13.0 - (end.x - 9.0))).abs() < 1e-3, + "on the long arm" + ); + } + + #[test] + fn the_partial_squares_appear_one_a_third() { + let i = Rect::new(0.0, 0.0, 20.0, 20.0); + assert!(partial_dots(i, 0.0, false).is_empty()); + assert_eq!(partial_dots(i, 0.34, false).len(), 1); + assert_eq!(partial_dots(i, 0.67, false).len(), 2); + let all = partial_dots(i, 1.0, false); + assert_eq!( + all, + vec![ + Rect::new(5.0, 9.0, 2.0, 2.0), + Rect::new(9.0, 9.0, 2.0, 2.0), + Rect::new(13.0, 9.0, 2.0, 2.0) + ] + ); + // From the trailing side's opposite in right-to-left. + assert_eq!( + partial_dots(i, 0.34, true)[0], + Rect::new(13.0, 9.0, 2.0, 2.0) + ); + } + + #[test] + fn the_focus_frame_lies_outside_the_box() { + let i = Rect::new(0.0, 0.0, 20.0, 20.0); + let ring = indicator_focus_frame(i, BREEZE_CHECKBOX_RADIUS, 2.0); + // Centred 1 px outside the 16 px box: from its edge to the + // indicator's. + assert_eq!(ring.rect, Rect::new(1.0, 1.0, 18.0, 18.0)); + assert_eq!(ring.corner_radius, BREEZE_CHECKBOX_RADIUS + 1.0); + } + + #[test] + fn variants_move_only_the_radius() { + assert_eq!(variant_radius(CheckboxVariant::Square), 4.0); + assert!(variant_radius(CheckboxVariant::Rounded) > 4.0); + assert_eq!(variant_radius(CheckboxVariant::Circle), 7.5); + } +} diff --git a/crates/teksilo-theme-kde/src/styles/chrome.rs b/crates/teksilo-theme-kde/src/styles/chrome.rs index 25d5ca775..fb5234935 100644 --- a/crates/teksilo-theme-kde/src/styles/chrome.rs +++ b/crates/teksilo-theme-kde/src/styles/chrome.rs @@ -278,7 +278,7 @@ impl BreezeButtonColors { } /// KDE's mix of two colours, in its 16-bit arithmetic. -fn kde_mix(a: Color, b: Color, t: f64) -> Color { +pub(crate) fn kde_mix(a: Color, b: Color, t: f64) -> Color { mix(KdeColor::from_color(a), KdeColor::from_color(b), t).to_color() } diff --git a/crates/teksilo-theme-kde/src/styles/indicator.rs b/crates/teksilo-theme-kde/src/styles/indicator.rs new file mode 100644 index 000000000..29ad792a4 --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/indicator.rs @@ -0,0 +1,391 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The colours and geometry the Breeze check box, radio button and switch +//! share. +//! +//! All three are painted from the **button** colours of the scheme (a check +//! box's box is the button colour, a switch's track is the button colour +//! moved toward the button text), from the current window's highlight (a +//! checked box, unlike a hovered push button, uses the muted highlight of a +//! backdrop window) and from the view's text for the mark. Every colour is +//! resolved at paint time from the theme the walker hands the widget, so the +//! inactive and high-contrast projections reach them. +//! +//! ## Where this departs from Breeze +//! +//! - **D6, the outline of an empty indicator.** Breeze outlines an unchecked +//! box and an unselected disc in the separator colour, the window colour +//! moved a fifth of the way to the window text: 1.5:1 on the Breeze Light +//! window. That outline is the whole control, so it is drawn in +//! `border_strong`, the same outline lifted to SC 1.4.11's 3:1 (D6 of the +//! colour mapping), which a scheme whose outline already passes keeps +//! exactly. A checked box and a selected disc keep Breeze's highlight +//! outline: their state is carried by the mark, in the view text, which +//! is well above 3:1 on the highlight-washed fill. +//! - **D6, the outline of a checked switch.** A switch has no mark: on, its +//! track's highlight outline (2.2:1 on the Breeze Light window) is as much +//! the control's only boundary as the off track's. It is drawn in the +//! highlight lifted in luma to the non-text floor on the control surfaces +//! and the button colour, [`BreezeIndicatorColors::checked_outline`]; a +//! scheme whose highlight already passes, Breeze Dark's, keeps it exactly. +//! See [`crate::styles::toggle`]. +//! - **D5, keyboard focus.** Breeze shows keyboard focus with a 2 px band +//! of the highlight at 30 % outside the box. The band is drawn in the +//! opaque `focus_ring` token, the focus colour lifted to 3:1, as on the +//! buttons. +//! +//! ## Without the palette +//! +//! The button colours come from [`KdePalette`]. A theme without it paints +//! from its own roles: the content surface for the button colour, the +//! primary text for its text, `border` for its outline, `border_focused` +//! for the hover decorations. + +use teksilo_canvas::Rect; +use teksilo_core::environment::LayoutDirection; +use teksilo_core::styles::Theme; +use teksilo_kde_scheme::math::{hsv_darker, lift_luma_until}; +use teksilo_kde_scheme::{ColorSet, ColorState, DecorationRole, KdeColor, PaletteRole}; +use teksilo_tokens::Color; + +use crate::color::{AA, ENHANCED}; +use crate::palette::KdePalette; +use crate::styles::metrics::{INDICATOR_BOX_INSET, INDICATOR_PRESSED_DARKER, INDICATOR_SIZE}; + +/// The colours a Breeze check box, radio button or switch is painted from, in +/// one paint state. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeIndicatorColors { + /// `[qt]` The button colour: the face of a box, a disc and a switch's + /// handle. + pub button: Color, + /// `[Hp]` The button colour darkened 110 %, a pressed box's face. + pub button_pressed: Color, + /// `[qt]` The button text, which a switch's track is tinted toward. + pub button_text: Color, + /// `[Hp]` The button colour moved toward the button text by the frame + /// contrast: a switch handle's outline at rest. + pub button_outline: Color, + /// `[Qd]` The button set's hover decoration: a hovered or focused switch + /// handle's outline. + pub button_hover: Color, + /// `[Hp]` The view's text: the check mark, the partial squares and the + /// radio dot. + pub text: Color, + /// `[Hp]` The current window's highlight (the muted one in a backdrop + /// window, the disabled one for a disabled control): a checked box's + /// outline and wash, a checked track. + pub highlight: Color, + /// `[wcag]` D6: the outline of an unchecked box, an unselected disc and + /// an unchecked track, `border_strong`; `border_disabled` when disabled. + pub outline: Color, + /// `[wcag]` D6: the outline of a checked track, the highlight lifted in + /// luma to the non-text floor (3:1, 4.5:1 under high contrast) on the + /// window, the view, the frame background and the button colour; the + /// disabled highlight, unlifted, when disabled. + pub checked_outline: Color, + /// `[Hp]` The view's focus decoration, the ring a hovered box or disc + /// adds to its outline. + pub focus: Color, + /// `[wcag]` D5: the keyboard focus frame, `focus_ring`. + pub focus_ring: Color, +} + +impl BreezeIndicatorColors { + /// The colours of `theme` as it paints in a window that is or is not + /// active, with or without the high-contrast preference, for an enabled + /// or a disabled control. + pub fn resolve( + theme: &Theme, + window_active: bool, + high_contrast: bool, + disabled: bool, + ) -> BreezeIndicatorColors { + let c = &theme.colors; + let highlight = if disabled { + c.accent_disabled + } else { + c.accent + }; + let outline = if disabled { + c.border_disabled + } else { + c.border_strong + }; + let Some(palette) = theme.extension::() else { + let (button, button_text, button_outline, text) = if disabled { + ( + c.surface_disabled, + c.text_disabled, + c.border_disabled, + c.text_disabled, + ) + } else { + (c.surface_content, c.text_primary, c.border, c.editor_fg) + }; + return BreezeIndicatorColors { + button, + button_pressed: darker(button), + button_text, + button_outline, + button_hover: c.border_focused, + text, + highlight, + outline, + checked_outline: checked_outline(theme, highlight, button, high_contrast, disabled), + focus: c.border_focused, + focus_ring: c.focus_ring, + }; + }; + let state = if disabled { + ColorState::Disabled + } else if window_active { + ColorState::Active + } else { + ColorState::Inactive + }; + let b = palette.breeze_colors(state, high_contrast); + // The view's text: the projected token, which the high-contrast + // projection lifts, or the disabled view text. + let text = if disabled { + palette.role(ColorState::Disabled, PaletteRole::Text) + } else { + c.editor_fg + }; + BreezeIndicatorColors { + button: b.button, + button_pressed: darker(b.button), + button_text: b.button_text, + button_outline: b.button_outline, + button_hover: palette + .resolved() + .set(state, ColorSet::Button) + .decoration(DecorationRole::Hover) + .to_color(), + text, + highlight, + outline, + checked_outline: checked_outline(theme, highlight, b.button, high_contrast, disabled), + focus: b.focus, + focus_ring: c.focus_ring, + } + } +} + +/// `[wcag]` D6: `highlight` lifted in luma until it reaches the non-text +/// floor on the control surfaces of `theme` and on `button`, the face of the +/// handle the outline meets; `highlight` itself when `disabled`, which +/// SC 1.4.11 exempts. +fn checked_outline( + theme: &Theme, + highlight: Color, + button: Color, + high_contrast: bool, + disabled: bool, +) -> Color { + if disabled { + return highlight; + } + let c = &theme.colors; + let floor = if high_contrast { ENHANCED } else { AA }.non_text; + let on = + [c.surface_main, c.surface_content, c.surface_raised, button].map(KdeColor::from_color); + lift_luma_until(KdeColor::from_color(highlight), &on, floor).to_color() +} + +/// KDE's darkening of a pressed indicator's button colour. +fn darker(c: Color) -> Color { + hsv_darker(KdeColor::from_color(c), INDICATOR_PRESSED_DARKER).to_color() +} + +/// `[Hp]` The 20 px indicator square inside a body laid out at `bounds`: +/// against the body's leading edge, centred vertically. +/// +/// The body can be narrower than the indicator (see +/// [`indicator_body_width`](crate::styles::metrics::indicator_body_width)), +/// so the indicator is anchored to the leading edge in either direction and +/// what does not fit lies past the trailing one. +pub fn indicator_rect(bounds: Rect, direction: LayoutDirection) -> Rect { + let x = match direction { + LayoutDirection::LeftToRight => bounds.x, + LayoutDirection::RightToLeft => bounds.x + bounds.width - INDICATOR_SIZE, + }; + Rect::new( + x, + bounds.y + (bounds.height - INDICATOR_SIZE) * 0.5, + INDICATOR_SIZE, + INDICATOR_SIZE, + ) +} + +/// `[Hp]` The box (or the disc's square) of an indicator: the indicator +/// inset by 2, 16 x 16. +pub fn box_rect(indicator: Rect) -> Rect { + inset(indicator, INDICATOR_BOX_INSET) +} + +/// `[Hp]` The rectangle the box is filled and stroked on: the box inset by +/// half the `pen`, 15 x 15 at 2.5 for the 1 px pen. +pub fn stroked_box_rect(indicator: Rect, pen: f32) -> Rect { + inset(box_rect(indicator), pen * 0.5) +} + +fn inset(r: Rect, d: f32) -> Rect { + Rect::new( + r.x + d, + r.y + d, + (r.width - 2.0 * d).max(0.0), + (r.height - 2.0 * d).max(0.0), + ) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn rgba8(c: Color) -> [u8; 4] { + KdeColor::from_color(c).to_rgba8() + } + + #[test] + fn the_indicator_hugs_the_leading_edge_in_either_direction() { + let body = Rect::new(10.0, 0.0, 18.0, 24.0); + let ltr = indicator_rect(body, LayoutDirection::LeftToRight); + assert_eq!(ltr, Rect::new(10.0, 2.0, 20.0, 20.0)); + let rtl = indicator_rect(body, LayoutDirection::RightToLeft); + assert_eq!(rtl, Rect::new(8.0, 2.0, 20.0, 20.0)); + // The box lies in the body either way. + for r in [ltr, rtl] { + let b = box_rect(r); + assert!(b.x >= body.x && b.x + b.width <= body.x + body.width); + } + } + + #[test] + fn the_box_is_fifteen_pixels_at_two_and_a_half() { + let i = Rect::new(0.0, 0.0, 20.0, 20.0); + assert_eq!(box_rect(i), Rect::new(2.0, 2.0, 16.0, 16.0)); + assert_eq!(stroked_box_rect(i, 1.0), Rect::new(2.5, 2.5, 15.0, 15.0)); + } + + /// The Breeze Light colours, against Plasma's painted samples. + #[test] + fn breeze_light_paints_the_specifications_colours() { + let t = crate::light(); + let c = BreezeIndicatorColors::resolve(&t, true, false, false); + assert_eq!(rgba8(c.button), [252, 252, 252, 255]); + // 252 darkened 110 % is 229, Plasma's pressed box. + assert_eq!(rgba8(c.button_pressed), [229, 229, 229, 255]); + assert_eq!(rgba8(c.text), [35, 38, 41, 255]); + assert_eq!(rgba8(c.highlight), [61, 174, 233, 255]); + assert_eq!(rgba8(c.focus), [61, 174, 233, 255]); + assert_eq!(rgba8(c.button_hover), [61, 174, 233, 255]); + assert_eq!(c.outline, t.colors.border_strong); + assert_eq!(c.focus_ring, t.colors.focus_ring); + } + + #[test] + fn the_empty_outline_is_lifted_and_its_premise_holds() { + let t = crate::light(); + let p = t.extension::().unwrap(); + let separator = p.colors(ColorState::Active).separator; + let window = t.colors.surface_main; + assert!( + separator.contrast_ratio(window) < 3.0, + "premise: Breeze's own outline falls short" + ); + let c = BreezeIndicatorColors::resolve(&t, true, false, false); + assert!(c.outline.contrast_ratio(window) >= 3.0); + assert!(c.outline.contrast_ratio(c.button) >= 3.0); + } + + /// D6 for a checked switch: Breeze Light's highlight falls short of 3:1 + /// on its window, so the checked track is outlined in the highlight + /// lifted to 3:1 on every control surface and on the handle's face. + #[test] + fn the_checked_outline_is_lifted_and_its_premise_holds() { + let t = crate::light(); + let c = BreezeIndicatorColors::resolve(&t, true, false, false); + let window = t.colors.surface_main; + assert!( + c.highlight.contrast_ratio(window) < 3.0, + "premise: Breeze's own checked outline falls short" + ); + for on in [ + window, + t.colors.surface_content, + t.colors.surface_raised, + c.button, + ] { + assert!(c.checked_outline.contrast_ratio(on) >= 3.0, "{on:?}"); + } + assert_ne!(c.checked_outline, c.highlight); + } + + /// The lift is a rule: a highlight that already reaches 3:1 is kept + /// exactly, a disabled control keeps the disabled highlight, and the + /// high-contrast projection raises the floor to 4.5:1. + #[test] + fn the_checked_outline_follows_the_floor_of_each_projection() { + let dark = crate::dark(); + let c = BreezeIndicatorColors::resolve(&dark, true, false, false); + assert!(c.highlight.contrast_ratio(dark.colors.surface_main) >= 3.0); + assert_eq!(c.checked_outline, c.highlight, "Breeze Dark passes"); + + let light = crate::light(); + let disabled = BreezeIndicatorColors::resolve(&light, true, false, true); + assert_eq!(disabled.checked_outline, light.colors.accent_disabled); + + for t in [crate::light(), crate::dark()] { + let hc = t.for_paint_state(teksilo_core::styles::PaintState { + window_active: true, + high_contrast: true, + }); + let c = BreezeIndicatorColors::resolve(&hc, true, true, false); + for on in [hc.colors.surface_main, hc.colors.surface_content, c.button] { + assert!(c.checked_outline.contrast_ratio(on) >= 4.5, "{on:?}"); + } + } + + // Without the palette the rule reads the theme's own roles. + let t = teksilo_core::presets::intui::light(); + let c = BreezeIndicatorColors::resolve(&t, true, false, false); + assert!(c.checked_outline.contrast_ratio(t.colors.surface_main) >= 3.0); + } + + #[test] + fn a_backdrop_window_checks_in_its_muted_highlight() { + let t = crate::light(); + let inactive = t.for_paint_state(teksilo_core::styles::PaintState { + window_active: false, + high_contrast: false, + }); + let c = BreezeIndicatorColors::resolve(&inactive, false, false, false); + assert_eq!(c.highlight, inactive.colors.accent); + assert_ne!(c.highlight, t.colors.accent, "the current window's"); + } + + #[test] + fn a_disabled_indicator_paints_the_disabled_colours() { + let t = crate::light(); + let p = t.extension::().unwrap(); + let c = BreezeIndicatorColors::resolve(&t, true, false, true); + assert_eq!(c.button, p.role(ColorState::Disabled, PaletteRole::Button)); + assert_eq!(c.text, p.role(ColorState::Disabled, PaletteRole::Text)); + assert_eq!(c.highlight, t.colors.accent_disabled); + assert_eq!(c.outline, t.colors.border_disabled); + } + + #[test] + fn a_theme_without_the_palette_paints_from_its_roles() { + let t = teksilo_core::presets::intui::light(); + let c = BreezeIndicatorColors::resolve(&t, true, false, false); + assert_eq!(c.button, t.colors.surface_content); + assert_eq!(c.button_outline, t.colors.border); + assert_eq!(c.text, t.colors.editor_fg); + assert_eq!(c.highlight, t.colors.accent); + assert_eq!(c.outline, t.colors.border_strong); + assert_eq!(c.focus, t.colors.border_focused); + } +} diff --git a/crates/teksilo-theme-kde/src/styles/metrics.rs b/crates/teksilo-theme-kde/src/styles/metrics.rs index 7474e6f76..d503defc5 100644 --- a/crates/teksilo-theme-kde/src/styles/metrics.rs +++ b/crates/teksilo-theme-kde/src/styles/metrics.rs @@ -16,9 +16,116 @@ use teksilo_core::styles::density::{dp, spacing}; use teksilo_tokens::{InputTokens, TargetRole, TypographyTokens}; use crate::geometry::{ - BUTTON_MARGIN_WIDTH, BreezeGeometry, FRAME_WIDTH, LARGE_ICON_SIZE, MEDIUM_ICON_SIZE, + BUTTON_MARGIN_WIDTH, BreezeGeometry, CHECKBOX_FOCUS_MARGIN, CHECKBOX_ITEM_SPACING, + CHECKBOX_SIZE, FRAME_WIDTH, LARGE_ICON_SIZE, LINE_EDIT_FRAME_WIDTH, MEDIUM_ICON_SIZE, TOOL_BUTTON_MARGIN_WIDTH, }; +use crate::shape::BREEZE_PEN_WIDTH; + +/// `[M]` The square a check box or radio button indicator is painted in. +pub const INDICATOR_SIZE: f32 = CHECKBOX_SIZE; +/// `[Hp]` How far the box (or the radio disc) lies inside the indicator: the +/// indicator's focus margin. +pub const INDICATOR_BOX_INSET: f32 = CHECKBOX_FOCUS_MARGIN; +/// `[Hp]` The side of the box as stroked: the indicator inset by 2, then by +/// half the pen. 15. +pub const INDICATOR_BOX_STROKED: f32 = + INDICATOR_SIZE - 2.0 * INDICATOR_BOX_INSET - BREEZE_PEN_WIDTH; +/// `[M]` Where a check box's or radio button's label starts, from the +/// indicator's leading edge: the indicator and Breeze's 4 px label spacing. +pub const INDICATOR_LABEL_X: f32 = CHECKBOX_SIZE + CHECKBOX_ITEM_SPACING; +/// `[Hp]` The width of the pen a check mark is drawn with. +pub const CHECK_MARK_PEN: f32 = 2.0; +/// `[Hp]` The side of each of the three squares of a partial check box. +pub const PARTIAL_DOT_SIZE: f32 = 2.0; +/// `[Hp]` The distance between the centres of the partial squares. +pub const PARTIAL_DOT_SPACING: f32 = 4.0; +/// `[Hp]` The radius of a selected radio button's dot: `floor((18 - 12) / +/// 2)`, a 6 px dot. +pub const RADIO_DOT_RADIUS: f32 = 3.0; +/// `[Hp]` How much of the highlight fills a checked box or a selected disc +/// over the button colour. +pub const INDICATOR_CHECKED_WASH: f32 = 0.3; +/// `[Hp]` How much a pressed indicator's button colour is darkened, in Qt's +/// percent (d.11 of the specification). +pub const INDICATOR_PRESSED_DARKER: i32 = 110; + +/// `[K]` The height of a switch: Kirigami's grid unit. +pub const SWITCH_HEIGHT: f32 = 18.0; +/// `[Qd]` The width of a switch: twice its height. +pub const SWITCH_WIDTH: f32 = 2.0 * SWITCH_HEIGHT; +/// `[Qd]` How far the track lies inside the switch above and below: `floor(18 +/// / 6)`. +pub const SWITCH_TRACK_INSET: f32 = 3.0; +/// `[Qd]` The track's radius: `round(12 / 2)`. +pub const SWITCH_TRACK_RADIUS: f32 = 6.0; +/// `[Qd]` The handle's radius: `floor(18 / 2)`, a circle of the switch's +/// full height. +pub const SWITCH_HANDLE_RADIUS: f32 = 9.0; +/// `[Qd]` How much of the button text the track is filled with over the +/// button colour. +pub const SWITCH_TRACK_TEXT: f64 = 0.1; +/// `[Qd]` The alpha of the highlight that fills a checked track up to the +/// handle. +pub const SWITCH_CHECKED_ALPHA: f32 = 0.5; +/// `[qt]` The speed Qt's smoothed animation moves the handle at, at most, in +/// pixels a second: a full travel of 18 px takes 90 ms rather than the +/// 100 ms duration. +pub const SWITCH_HANDLE_VELOCITY: f32 = 200.0; + +// The switch is twice as wide as tall, its track centred inside it. +const _: () = assert!(SWITCH_WIDTH == 2.0 * SWITCH_HEIGHT); +const _: () = assert!(SWITCH_TRACK_RADIUS * 2.0 == SWITCH_HEIGHT - 2.0 * SWITCH_TRACK_INSET); +const _: () = assert!(SWITCH_HANDLE_RADIUS * 2.0 == SWITCH_HEIGHT); +// The box is the 15 px square of the specification. +const _: () = assert!(INDICATOR_BOX_STROKED == 15.0); + +/// The width the body of a check box or radio button is laid out at, when +/// the widget puts `label_gap` between it and its label: the label then +/// starts at [`INDICATOR_LABEL_X`], where Breeze puts it. +/// +/// With the widget's 6 px gap that is 18, the indicator less the trailing +/// 2 px of its focus margin; the box itself ends at 18, so it always lies in +/// the node, and only the focus frame reaches past it. Never narrower than +/// the box's far edge, so a larger gap moves the label rather than the box +/// out of the node. +pub fn indicator_body_width(label_gap: f32) -> f32 { + (INDICATOR_LABEL_X - label_gap).max(INDICATOR_SIZE - INDICATOR_BOX_INSET) +} + +/// The dimensions of a line edit, the frame a `TextInput` is drawn in. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeFieldMetrics { + /// `[S]` `[qt]` The field's height, at least: Qt's inner height + /// `max(H, 14) + 2` plus the 6 px frame above and below, through the + /// density ladder. 32 at Compact for the Breeze typography. + pub height: f32, + /// `[M]` The space between the frame and the text on the leading and + /// trailing sides: the 6 px line-edit frame, scaled by the density's + /// spacing. + pub padding_horizontal: f32, +} + +/// The line-edit dimensions at the density of `tokens`, for `typography`. +pub fn breeze_field_metrics_for( + tokens: &InputTokens, + typography: &TypographyTokens, +) -> BreezeFieldMetrics { + let g = geometry_of(typography); + BreezeFieldMetrics { + height: dp(g.line_edit_height, TargetRole::Target, tokens), + padding_horizontal: spacing(LINE_EDIT_FRAME_WIDTH, tokens), + } +} + +/// [`breeze_field_metrics_for`] at the Compact density and the Breeze +/// typography. +pub fn breeze_field_metrics() -> BreezeFieldMetrics { + breeze_field_metrics_for( + &InputTokens::default(), + &crate::typography::breeze_typography(), + ) +} /// The body line box `H` of `typography`, in whole pixels: the height every /// text-driven Breeze control is derived from. 18 for the Breeze typography. @@ -193,6 +300,40 @@ mod tests { ); } + #[test] + fn the_field_is_breezes_line_edit_and_grows_with_the_density() { + let m = breeze_field_metrics(); + assert_eq!(m.height, 32.0); + assert_eq!(m.padding_horizontal, 6.0); + let t = crate::typography::breeze_typography(); + let comfortable = breeze_field_metrics_for(&at(TargetDensity::Comfortable), &t); + let touch = breeze_field_metrics_for(&at(TargetDensity::Touch), &t); + assert_eq!(comfortable.height, 32.0, "32 already clears 32"); + assert_eq!(touch.height, 44.0); + assert!((touch.padding_horizontal - 7.8).abs() < 1e-4); + } + + #[test] + fn the_indicator_puts_the_label_where_breeze_does() { + assert_eq!(INDICATOR_LABEL_X, 24.0); + // The widgets' 6 px gap: an 18 px body. + let gap = teksilo_widgets::styles::recipe_checkbox_style::CHECKBOX_LABEL_GAP; + assert_eq!( + gap, + teksilo_widgets::styles::recipe_radio_style::RADIO_LABEL_GAP + ); + assert_eq!(indicator_body_width(gap), 18.0); + assert_eq!(indicator_body_width(gap) + gap, INDICATOR_LABEL_X); + // The box ends 2 px inside the indicator, so it stays in the body. + assert_eq!(INDICATOR_SIZE - INDICATOR_BOX_INSET, 18.0); + assert_eq!( + indicator_body_width(12.0), + 18.0, + "never narrower than the box" + ); + assert_eq!(indicator_body_width(0.0), 24.0); + } + #[test] fn every_tool_button_clears_the_conformance_floor_without_a_box() { for density in [ diff --git a/crates/teksilo-theme-kde/src/styles/radio.rs b/crates/teksilo-theme-kde/src/styles/radio.rs new file mode 100644 index 000000000..b81f37627 --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/radio.rs @@ -0,0 +1,228 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze radio button. +//! +//! The check box's twin: a 20 px indicator holding a 15 px disc at 2.5, +//! filled with the button colour and outlined in the separator colour. +//! Selected, the disc is outlined in the highlight and filled again with +//! the highlight at 30 %, and a 6 px dot of the view's text sits at its +//! centre, growing to its size over the style's 100 ms. Pressed, the button +//! colour darkens 110 %; under the pointer a 1 px ring of the focus colour +//! lies on the outline. +//! +//! The row, the label position and the departures from Breeze are the check +//! box's: see [`crate::styles::checkbox`] (D8, the 18 px body) and +//! [`crate::styles::indicator`] (D5 and D6). +//! +//! ## Variants +//! +//! Breeze has one radio button. `Circle` is it; `Square` and `Rounded` +//! (`[unpublished]`) paint the disc as the check box's box at its 4 px and +//! the check box's `Rounded` 6 px radius, with the same dot. + +use teksilo_canvas::{Canvas, Point, Rect, Size, SizeProposal}; +use teksilo_core::accessibility::AccessNodeBuilder; +use teksilo_core::binding::BindingLevel; +use teksilo_core::build_context::BuildContext; +use teksilo_core::signal::Signal; +use teksilo_core::styles::{CheckboxVariant, RadioStyle, RadioStyleConfig, RadioVariant}; +use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement}; +use teksilo_core::widget_id::WidgetId; +use teksilo_tokens::CornerRadius; +use teksilo_widgets::styles::recipe_radio_style::RADIO_LABEL_GAP; + +use crate::styles::checkbox::{box_paint, indicator_focus_frame, paint_box, variant_radius}; +use crate::styles::indicator::{BreezeIndicatorColors, indicator_rect, stroked_box_rect}; +use crate::styles::metrics::{INDICATOR_SIZE, RADIO_DOT_RADIUS, indicator_body_width}; + +/// Breeze `RadioStyle`. +#[derive(Debug, Default, Clone, Copy)] +pub struct BreezeRadioStyle; + +impl RadioStyle for BreezeRadioStyle { + fn make_body(&self, cfg: &RadioStyleConfig, ctx: &mut BuildContext) -> WidgetId { + let progress = ctx.animated_signal(if cfg.is_selected.get() { 1.0 } else { 0.0 }); + // `[S]` Breeze's style transitions: 100 ms, linear. + let grow = ctx.animate().fast().standard(); + { + let progress = progress.clone(); + ctx.effect(&cfg.is_selected, move |on| { + grow.to_or_snap(&progress, if *on { 1.0 } else { 0.0 }); + }); + } + let show_focus_frame = cfg + .is_focused + .zip(&cfg.is_disabled) + .map(|(focused, disabled)| *focused && !*disabled); + ctx.add(BreezeRadioBody { + selected: cfg.is_selected.clone(), + progress, + is_hovered: cfg.is_hovered.clone(), + is_pressed: cfg.is_pressed.clone(), + is_disabled: cfg.is_disabled.clone(), + show_focus_frame, + variant: cfg.variant, + }) + } +} + +struct BreezeRadioBody { + selected: Signal, + /// How far the dot has grown, 0 to 1. + progress: Signal, + is_hovered: Signal, + is_pressed: Signal, + is_disabled: Signal, + show_focus_frame: Signal, + variant: RadioVariant, +} + +impl std::fmt::Debug for BreezeRadioBody { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeRadioBody") + .field("variant", &self.variant) + .finish() + } +} + +/// The radius the disc of `variant` is stroked with. +pub fn variant_radius_of(variant: RadioVariant) -> f32 { + match variant { + RadioVariant::Circle => variant_radius(CheckboxVariant::Circle), + RadioVariant::Square => variant_radius(CheckboxVariant::Square), + RadioVariant::Rounded => variant_radius(CheckboxVariant::Rounded), + } +} + +/// `[Hp]` The dot's radius `progress` of the way to its full size. +pub fn dot_radius(progress: f32) -> f32 { + RADIO_DOT_RADIUS * progress.clamp(0.0, 1.0) +} + +impl Widget for BreezeRadioBody { + fn build(&mut self, ctx: &mut BuildContext) -> Vec { + let id = ctx.self_id(); + let registry = ctx.binding_registry(); + self.progress + .bind_to(id, registry, BindingLevel::RepaintOnly); + for s in [ + &self.selected, + &self.is_hovered, + &self.is_pressed, + &self.is_disabled, + &self.show_focus_frame, + ] { + s.bind_to(id, registry, BindingLevel::RepaintOnly); + } + vec![] + } + + /// The check box's 18 px body; the widget raises the row (D8). + fn layout_response(&self, _proposal: SizeProposal, _ctx: &LayoutContext) -> LayoutResponse { + Size::new(indicator_body_width(RADIO_LABEL_GAP), INDICATOR_SIZE).into() + } + + fn place_children( + &self, + _bounds: Rect, + _proposal: SizeProposal, + _children: &mut [WidgetPlacement], + _ctx: &LayoutContext, + ) { + } + + fn paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext) { + let selected = self.selected.get(); + let disabled = self.is_disabled.get(); + let colors = BreezeIndicatorColors::resolve( + ctx.theme, + ctx.window_active, + ctx.prefers_high_contrast, + disabled, + ); + let indicator = indicator_rect(bounds, ctx.layout_direction); + let pen = ctx.theme.shape.border_width; + let radius = variant_radius_of(self.variant); + let paint = box_paint( + selected, + self.is_hovered.get(), + self.is_pressed.get(), + disabled, + &colors, + ); + paint_box( + canvas, + stroked_box_rect(indicator, pen), + radius, + pen, + &paint, + ); + + let r = if selected { + dot_radius(self.progress.get()) + } else { + 0.0 + }; + if r > 0.0 && colors.text.a() > 0.0 { + let centre = Point::new( + indicator.x + INDICATOR_SIZE * 0.5, + indicator.y + INDICATOR_SIZE * 0.5, + ); + canvas.fill_circle(centre, r, colors.text); + } + + if self.show_focus_frame.get() { + let shape = &ctx.theme.shape; + if colors.focus_ring.a() > 0.0 && shape.focus_ring_width > 0.0 { + // The disc's frame is a circle: the box's radius is half of + // it, which the ring grows with. + let box_radius = if self.variant == RadioVariant::Circle { + (INDICATOR_SIZE * 0.5) - crate::styles::metrics::INDICATOR_BOX_INSET + } else { + radius + }; + let ring = indicator_focus_frame(indicator, box_radius, shape.focus_ring_width); + canvas.stroke_rounded_rect( + ring.rect, + CornerRadius::uniform(ring.corner_radius), + colors.focus_ring, + shape.focus_ring_width, + ); + } + } + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + // Presentational: the `RadioButton` emits the radio node. + builder.set_hidden(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn the_dot_is_six_pixels_and_grows_with_the_progress() { + assert_eq!(dot_radius(1.0) * 2.0, 6.0); + assert_eq!(dot_radius(0.0), 0.0); + assert_eq!(dot_radius(0.5), 1.5); + assert_eq!(dot_radius(2.0), 3.0, "clamped"); + } + + #[test] + fn the_circle_is_breezes_disc() { + assert_eq!(variant_radius_of(RadioVariant::Circle), 7.5); + assert_eq!(variant_radius_of(RadioVariant::Square), 4.0); + assert!(variant_radius_of(RadioVariant::Rounded) > 4.0); + } + + #[test] + fn the_focus_frame_of_the_disc_is_a_circle_outside_it() { + let i = Rect::new(0.0, 0.0, 20.0, 20.0); + let ring = indicator_focus_frame(i, 8.0, 2.0); + assert_eq!(ring.rect, Rect::new(1.0, 1.0, 18.0, 18.0)); + assert_eq!(ring.corner_radius, 9.0, "half its side: a circle"); + } +} diff --git a/crates/teksilo-theme-kde/src/styles/text_input.rs b/crates/teksilo-theme-kde/src/styles/text_input.rs new file mode 100644 index 000000000..9a8a2426f --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/text_input.rs @@ -0,0 +1,367 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze line edit, the frame a `TextInput` is drawn in. +//! +//! A flat fill of the view background in a 1 px outline stroked on the +//! node inset by half the pen, at radius 4.5, with no shadow and no inset +//! for one. The outline is the input-frame outline: the focus colour while +//! the field has focus, the hover colour under the pointer, otherwise the +//! frame outline. Focus changes only the outline's colour; its width stays +//! 1 px and no band is drawn around the field. A disabled field fills with +//! the disabled view background in the disabled frame outline. The hover +//! outline follows the configuration's hover signal, which `TextInput` +//! itself never sets, so a plain `TextInput` shows only the rest and focus +//! outlines. +//! +//! The field is the body line box plus 14 px, 32 px at Plasma's default +//! font, through the density ladder, and its text starts 6 px inside the +//! frame ([`crate::styles::metrics::breeze_field_metrics_for`]). An app's +//! `TextInput::min_height` replaces that height. `TextInput` has already +//! inset its editor vertically by the time a style sees it, so the style +//! pads only horizontally. +//! +//! ## Where this departs from Breeze +//! +//! - **D6, the outline at rest.** The frame outline is the window colour +//! moved a fifth of the way to the window text, 1.5:1 on the Breeze Light +//! window, and the field's view background is no further from the window +//! (1.1:1), so nothing else marks where the field is. The outline at rest +//! is `border_strong`, lifted to SC 1.4.11's 3:1 (D6 of the colour +//! mapping). +//! - **D5, focus.** The focus outline is `border_focused`, the focus colour +//! lifted to 3:1, which Breeze Light's 61,174,233 does not reach on the +//! white view. The hover outline is the scheme's own hover colour: it +//! shows where the pointer is, which needs no contrast floor. +//! - **A short field keeps its frame.** Breeze paints only the fill of a +//! line edit shorter than the line box plus 12 px. This keeps the frame +//! at every height, for the reason of D6. +//! - **Validation** (`[unpublished]`): Breeze has none. A field with a +//! validation level is outlined in its colour, as in the other presets. +//! +//! ## Variants +//! +//! `Outlined` and `Filled` are the line edit (Breeze has one field); +//! `Underline` keeps only the bottom edge of the outline; `Bare` returns the +//! editor untouched, for a control that draws its own frame around it. + +use teksilo_canvas::{Canvas, Rect, SizeProposal}; +use teksilo_core::accessibility::AccessNodeBuilder; +use teksilo_core::binding::BindingLevel; +use teksilo_core::build_context::BuildContext; +use teksilo_core::signal::Signal; +use teksilo_core::styles::{ + TextInputStyle, TextInputStyleConfig, TextInputValidationLevel, TextInputVariant, Theme, +}; +use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement}; +use teksilo_core::widget_id::WidgetId; +use teksilo_kde_scheme::{ColorState, PaletteRole}; +use teksilo_tokens::{Color, CornerRadius}; +use teksilo_widgets::primitives::{MinSize, Padding, ZStack}; + +use crate::palette::KdePalette; +use crate::styles::chrome::frame_radius; +use crate::styles::metrics::breeze_field_metrics_for; + +/// Breeze `TextInputStyle`. +#[derive(Debug, Default, Clone, Copy)] +pub struct BreezeTextInputStyle; + +impl TextInputStyle for BreezeTextInputStyle { + fn make_body(&self, cfg: &TextInputStyleConfig, ctx: &mut BuildContext) -> WidgetId { + // The embedded case: the surrounding control draws the frame. + if cfg.variant == TextInputVariant::Bare { + return cfg.editor; + } + let theme = ctx.theme(); + let m = breeze_field_metrics_for(&theme.input, &theme.typography); + let chrome = ctx.add(BreezeFieldChrome { + is_focused: cfg.is_focused.clone(), + is_hovered: cfg.is_hovered.clone(), + is_disabled: cfg.is_disabled.clone(), + validation: cfg.validation.clone(), + underline: cfg.variant == TextInputVariant::Underline, + }); + let padded = ctx.add( + Padding::new(0.0, m.padding_horizontal, 0.0, m.padding_horizontal).child(cfg.editor), + ); + let stack = ctx.add(ZStack::new().child(chrome).child(padded)); + // An app's `TextInput::min_height` (or a styled field's floor) wins. + ctx.add(MinSize::new(0.0, cfg.min_height.unwrap_or(m.height)).child(stack)) + } +} + +/// The colours a Breeze field is painted from, in one paint state. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeFieldColors { + /// `[qt]` The view background; the disabled one for a disabled field. + pub fill: Color, + /// `[wcag]` D6: the outline at rest, `border_strong`; `border_disabled` + /// for a disabled field. + pub outline: Color, + /// `[Hp]` The outline under the pointer: the view's hover decoration. + pub hover: Color, + /// `[wcag]` D5: the outline while focused, `border_focused`. + pub focus: Color, +} + +impl BreezeFieldColors { + /// The colours of `theme` as it paints in a window that is or is not + /// active, with or without the high-contrast preference, for an enabled + /// or a disabled field. + /// + /// Without a [`KdePalette`] the disabled fill is `surface_disabled` and + /// the hover outline `border_focused`. + pub fn resolve( + theme: &Theme, + window_active: bool, + high_contrast: bool, + disabled: bool, + ) -> BreezeFieldColors { + let c = &theme.colors; + let palette = theme.extension::(); + let state = if disabled { + ColorState::Disabled + } else if window_active { + ColorState::Active + } else { + ColorState::Inactive + }; + BreezeFieldColors { + fill: match (disabled, palette) { + (false, _) => c.surface_content, + (true, Some(p)) => p.role(ColorState::Disabled, PaletteRole::Base), + (true, None) => c.surface_disabled, + }, + outline: if disabled { + c.border_disabled + } else { + c.border_strong + }, + hover: palette.map_or(c.border_focused, |p| { + p.breeze_colors(state, high_contrast).hover + }), + focus: c.border_focused, + } + } + + /// `[Hp]` The outline in a state: disabled first, then a validation + /// colour, then focus, then hover, then rest. + pub fn outline_for( + &self, + focused: bool, + hovered: bool, + disabled: bool, + validation: Option, + ) -> Color { + if disabled { + self.outline + } else if let Some(tint) = validation { + tint + } else if focused { + self.focus + } else if hovered { + self.hover + } else { + self.outline + } + } +} + +/// The tint a validation level outlines a field in, or `None` for +/// [`TextInputValidationLevel::None`]. +pub fn validation_color(level: TextInputValidationLevel, theme: &Theme) -> Option { + let c = &theme.colors; + match level { + TextInputValidationLevel::None => None, + TextInputValidationLevel::Info => Some(c.status_info_fg), + TextInputValidationLevel::Warning => Some(c.border_warning), + TextInputValidationLevel::Error => Some(c.border_error), + TextInputValidationLevel::Corrected => Some(c.accent), + } +} + +/// `[Hp]` The rectangle a field's frame is filled and stroked on: the node +/// inset by half the pen. A field casts no shadow, so there is no further +/// inset. +pub fn field_frame_rect(bounds: Rect, pen: f32) -> Rect { + let d = pen * 0.5; + Rect::new( + bounds.x + d, + bounds.y + d, + (bounds.width - 2.0 * d).max(0.0), + (bounds.height - 2.0 * d).max(0.0), + ) +} + +/// The frame layer of a Breeze field, painted behind the editor. +/// +/// Sized like `RectWidget`: it takes whatever the proposal offers, so it can +/// sit in a `ZStack` without changing the field's size. +pub struct BreezeFieldChrome { + is_focused: Signal, + is_hovered: Signal, + is_disabled: Signal, + validation: Signal, + underline: bool, +} + +impl std::fmt::Debug for BreezeFieldChrome { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeFieldChrome") + .field("underline", &self.underline) + .finish() + } +} + +impl Widget for BreezeFieldChrome { + fn build(&mut self, ctx: &mut BuildContext) -> Vec { + let id = ctx.self_id(); + let registry = ctx.binding_registry(); + for s in [&self.is_focused, &self.is_hovered, &self.is_disabled] { + s.bind_to(id, registry, BindingLevel::RepaintOnly); + } + self.validation + .bind_to(id, registry, BindingLevel::RepaintOnly); + vec![] + } + + fn layout_response(&self, proposal: SizeProposal, _ctx: &LayoutContext) -> LayoutResponse { + proposal.resolve(0.0, 0.0).into() + } + + fn place_children( + &self, + _bounds: Rect, + _proposal: SizeProposal, + _children: &mut [WidgetPlacement], + _ctx: &LayoutContext, + ) { + } + + fn paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext) { + let disabled = self.is_disabled.get(); + let colors = BreezeFieldColors::resolve( + ctx.theme, + ctx.window_active, + ctx.prefers_high_contrast, + disabled, + ); + let pen = ctx.theme.shape.border_width; + let rect = field_frame_rect(bounds, pen); + let corner = CornerRadius::uniform(frame_radius(&ctx.theme.shape)); + if colors.fill.a() > 0.0 { + canvas.fill_rounded_rect(rect, corner, colors.fill); + } + let outline = colors.outline_for( + self.is_focused.get(), + self.is_hovered.get(), + disabled, + validation_color(self.validation.get(), ctx.theme), + ); + if outline.a() > 0.0 && pen > 0.0 { + if self.underline { + canvas.draw_border_bottom(bounds, outline, pen); + } else { + canvas.stroke_rounded_rect(rect, corner, outline, pen); + } + } + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + // Presentational: the `TextInput` emits the field's node. + builder.set_hidden(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_kde_scheme::KdeColor; + + fn rgba8(c: Color) -> [u8; 4] { + KdeColor::from_color(c).to_rgba8() + } + + #[test] + fn focus_wins_over_hover_and_disabled_over_both() { + let c = BreezeFieldColors::resolve(&crate::light(), true, false, false); + assert_eq!(c.outline_for(false, false, false, None), c.outline); + assert_eq!(c.outline_for(false, true, false, None), c.hover); + assert_eq!(c.outline_for(true, true, false, None), c.focus); + let red = Color::from_hex("#FF0000"); + assert_eq!(c.outline_for(true, true, false, Some(red)), red); + assert_eq!(c.outline_for(true, true, true, Some(red)), c.outline); + } + + /// The Breeze Light colours, against Plasma's painted samples. + #[test] + fn breeze_light_paints_the_specifications_colours() { + let t = crate::light(); + let c = BreezeFieldColors::resolve(&t, true, false, false); + assert_eq!(rgba8(c.fill), [255, 255, 255, 255]); + assert_eq!(rgba8(c.hover), [61, 174, 233, 255]); + assert_eq!(c.outline, t.colors.border_strong); + assert_eq!(c.focus, t.colors.border_focused); + let d = BreezeFieldColors::resolve(&t, true, false, true); + assert_eq!(rgba8(d.fill), [243, 243, 243, 255]); + assert_eq!(d.outline, t.colors.border_disabled); + } + + #[test] + fn the_rest_and_focus_outlines_are_lifted_and_their_premises_hold() { + for t in [crate::light(), crate::dark()] { + let p = t.extension::().unwrap(); + let b = p.colors(ColorState::Active); + let view = t.colors.surface_content; + let window = t.colors.surface_main; + assert!( + b.frame_outline.contrast_ratio(view) < 3.0, + "premise: Breeze's frame outline falls short on the view" + ); + let c = BreezeFieldColors::resolve(&t, true, false, false); + assert!(c.outline.contrast_ratio(view) >= 3.0); + assert!(c.outline.contrast_ratio(window) >= 3.0); + assert!(c.focus.contrast_ratio(view) >= 3.0); + } + // Breeze Light's focus colour itself falls short on the white view. + let t = crate::light(); + let focus = t + .extension::() + .unwrap() + .colors(ColorState::Active) + .focus; + assert!(focus.contrast_ratio(t.colors.surface_content) < 3.0); + } + + #[test] + fn the_frame_lies_inside_the_node() { + let r = field_frame_rect(Rect::new(0.0, 0.0, 150.0, 32.0), 1.0); + assert_eq!(r, Rect::new(0.5, 0.5, 149.0, 31.0)); + assert_eq!(frame_radius(&crate::light().shape), 4.5); + } + + #[test] + fn every_validation_level_but_none_tints_the_outline() { + let t = crate::light(); + for level in [ + TextInputValidationLevel::Info, + TextInputValidationLevel::Warning, + TextInputValidationLevel::Error, + TextInputValidationLevel::Corrected, + ] { + assert!(validation_color(level, &t).is_some(), "{level:?}"); + } + assert!(validation_color(TextInputValidationLevel::None, &t).is_none()); + } + + #[test] + fn a_theme_without_the_palette_paints_from_its_roles() { + let t = teksilo_core::presets::intui::light(); + let c = BreezeFieldColors::resolve(&t, true, false, false); + assert_eq!(c.fill, t.colors.surface_content); + assert_eq!(c.hover, t.colors.border_focused); + let d = BreezeFieldColors::resolve(&t, true, false, true); + assert_eq!(d.fill, t.colors.surface_disabled); + } +} diff --git a/crates/teksilo-theme-kde/src/styles/toggle.rs b/crates/teksilo-theme-kde/src/styles/toggle.rs new file mode 100644 index 000000000..320cc35bd --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/toggle.rs @@ -0,0 +1,458 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze switch. +//! +//! Plasma's widget style has no switch: the one KDE applications show is the +//! desktop QtQuick style's, which Kirigami applications use (`[Qd]`), and +//! this transcribes it. It is drawn in the **button** colours. +//! +//! - **The indicator** is 36 x 18, Kirigami's grid unit tall and twice as +//! wide. +//! - **The track** is the indicator inset by 3 above and below, 36 x 12 at +//! a 6 px radius, filled with the button colour moved 10 % toward the +//! button text and outlined in 1 px: the highlight when on, otherwise the +//! handle's outline. On, the track is filled again with the highlight at +//! 50 % from its leading end to the handle's trailing edge. +//! - **The handle** is a circle of the indicator's full height, 18 px, +//! filled with the button colour and outlined in 1 px: the button set's +//! hover decoration while hovered or focused from the keyboard, otherwise +//! the button colour moved toward the button text by the frame contrast. +//! Its leading edge is at `clamp(p x 36 - 9, 0, 18)` for the position `p`, +//! 0 off and 1 on, mirrored right to left. +//! +//! ## Motion +//! +//! The handle moves on Qt's smoothed animation: Kirigami's short duration, +//! 100 ms, or the time it takes at Qt's default 200 px a second if that is +//! shorter, so the 18 px travel takes 90 ms, on the quadratic ease-in-out +//! approximated by [`BREEZE_SWITCH_HANDLE_EASING`]. The handle's outline +//! changes colour over the short duration on the cubic ease-in, +//! [`BREEZE_SWITCH_COLOR_EASING`]. Both snap under the reduced-motion +//! preference. +//! +//! ## Where this departs from the desktop style +//! +//! - **D6, the track's outline.** Off and at rest, the track is outlined in +//! the handle's outline, which is 1.3:1 on the Breeze Light window; it is +//! the only boundary of the off switch, so it is drawn in `border_strong`, +//! lifted to 3:1 (D6 of the colour mapping). On, it is outlined in the +//! highlight, 2.2:1 on that window, and is just as much the only boundary, +//! so it is drawn in the highlight lifted the same way, +//! [`checked_outline`](BreezeIndicatorColors::checked_outline), which +//! Breeze Dark's highlight already passes and keeps. The lift includes the +//! button colour, the handle's face, so in either state the handle stands +//! out at 3:1 where the track's outline meets it. +//! - **The handle keeps its colours.** Its face, the button colour, is +//! 1.7:1 on the checked fill and its outline 1.3:1 on the Breeze Light +//! window, as the desktop style paints them. The handle's position is +//! shown by where it interrupts the track's lifted outline, which is 3:1 +//! on its face. +//! - **D5, keyboard focus.** The desktop style shows keyboard focus only by +//! the handle's hover outline. The switch adds the 2 px focus frame the +//! Breeze widget style draws around a check box, in the opaque +//! `focus_ring` token, from the indicator's edge outward (`[derived]`). +//! - **The target.** The 36 x 18 indicator is painted unchanged, centred in +//! a node raised to the density's target size on both axes (36 x 24 at +//! Compact), which WCAG 2.2 SC 2.5.8 asks of a control. +//! - **The label** is the `Toggle`'s, 6 px after the node; the desktop style +//! puts it 4 px after the indicator. + +use std::time::Duration; + +use teksilo_canvas::{Canvas, Point, Rect, Size, SizeProposal}; +use teksilo_core::accessibility::AccessNodeBuilder; +use teksilo_core::binding::BindingLevel; +use teksilo_core::build_context::BuildContext; +use teksilo_core::environment::LayoutDirection; +use teksilo_core::signal::Signal; +use teksilo_core::styles::density::density_min_size; +use teksilo_core::styles::{FocusRingStroke, ToggleStyle, ToggleStyleConfig}; +use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement}; +use teksilo_core::widget_id::WidgetId; +use teksilo_tokens::{Color, CornerRadius, TargetAxes}; + +use crate::motion::{BREEZE_SWITCH_COLOR_EASING, BREEZE_SWITCH_HANDLE_EASING}; +use crate::styles::chrome::kde_mix; +use crate::styles::indicator::BreezeIndicatorColors; +use crate::styles::metrics::{ + SWITCH_CHECKED_ALPHA, SWITCH_HANDLE_RADIUS, SWITCH_HANDLE_VELOCITY, SWITCH_HEIGHT, + SWITCH_TRACK_INSET, SWITCH_TRACK_RADIUS, SWITCH_TRACK_TEXT, SWITCH_WIDTH, +}; + +/// The handle's travel, from off to on. +const TRAVEL: f32 = SWITCH_WIDTH - SWITCH_HEIGHT; + +/// `[Qd]` How far the handle's leading edge lies from the indicator's leading +/// edge at the visual position `position` (0 off, 1 on). +pub fn handle_offset(position: f32) -> f32 { + (position * SWITCH_WIDTH - SWITCH_HANDLE_RADIUS).clamp(0.0, TRAVEL) +} + +/// `[qt]` How long the handle takes to travel: the short duration, or the +/// time the full travel takes at Qt's default velocity if that is shorter. +pub fn handle_duration(short: Duration) -> Duration { + short.min(Duration::from_secs_f32(TRAVEL / SWITCH_HANDLE_VELOCITY)) +} + +/// Breeze `ToggleStyle`: the desktop QtQuick style's switch. +#[derive(Debug, Default, Clone, Copy)] +pub struct BreezeToggleStyle; + +impl ToggleStyle for BreezeToggleStyle { + fn make_body(&self, cfg: &ToggleStyleConfig, ctx: &mut BuildContext) -> WidgetId { + let short = ctx.theme().motion.duration_fast; + let target = |on: bool| handle_offset(if on { 1.0 } else { 0.0 }); + + let offset = ctx.animated_signal(target(cfg.is_on.get())); + let slide = ctx + .animate() + .duration(handle_duration(short)) + .easing(BREEZE_SWITCH_HANDLE_EASING); + { + let offset = offset.clone(); + ctx.effect(&cfg.is_on, move |on| slide.to_or_snap(&offset, target(*on))); + } + + // The handle's outline: hovered, or focused from the keyboard. + let emphasised = cfg + .is_hovered + .zip3(&cfg.is_focused, &cfg.is_focus_visible) + .map(|(hovered, focused, visible)| *hovered || (*focused && *visible)); + let emphasis = ctx.animated_signal(if emphasised.get() { 1.0 } else { 0.0 }); + let tint = ctx.animate().fast().easing(BREEZE_SWITCH_COLOR_EASING); + { + let emphasis = emphasis.clone(); + ctx.effect(&emphasised, move |on| { + tint.to_or_snap(&emphasis, if *on { 1.0 } else { 0.0 }) + }); + } + + let show_focus_frame = cfg + .is_focused + .zip3(&cfg.is_focus_visible, &cfg.is_disabled) + .map(|(focused, visible, disabled)| *focused && *visible && !*disabled); + + ctx.add(BreezeSwitchBody { + offset, + emphasis, + is_disabled: cfg.is_disabled.clone(), + show_focus_frame, + }) + } +} + +struct BreezeSwitchBody { + /// The handle's leading edge from the indicator's, 0 to 18. + offset: Signal, + /// How far the handle's outline has turned to the hover colour, 0 to 1. + emphasis: Signal, + is_disabled: Signal, + show_focus_frame: Signal, +} + +impl std::fmt::Debug for BreezeSwitchBody { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeSwitchBody").finish() + } +} + +/// What a switch paints at one moment. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct SwitchPaint { + /// The track: the button colour moved 10 % toward the button text. + pub track: Color, + /// The track's outline. + pub track_outline: Color, + /// The highlight at 50 % from the track's leading end to the handle's + /// trailing edge. + pub checked_fill: Color, + /// The handle's face. + pub handle: Color, + /// The handle's outline. + pub handle_outline: Color, +} + +/// `[Qd]` The colours of a switch whose handle has travelled `on` of the way +/// (0 off, 1 on) and whose outline has turned `emphasis` of the way to the +/// hover colour, from `c`. +pub fn switch_paint(on: f32, emphasis: f32, c: &BreezeIndicatorColors) -> SwitchPaint { + let on = on.clamp(0.0, 1.0); + let emphasis = emphasis.clamp(0.0, 1.0); + let handle_outline = c.button_outline.mix(c.button_hover, emphasis); + // D6: the track's outline is the lifted one, off at rest and on. + let off_outline = c.outline.mix(c.button_hover, emphasis); + SwitchPaint { + track: kde_mix(c.button, c.button_text, SWITCH_TRACK_TEXT), + track_outline: off_outline.mix(c.checked_outline, on), + checked_fill: c.highlight.with_alpha(SWITCH_CHECKED_ALPHA), + handle: c.button, + handle_outline, + } +} + +/// `[Qd]` The 36 x 18 indicator, centred in the node `bounds`. +pub fn switch_indicator(bounds: Rect) -> Rect { + Rect::new( + bounds.x + (bounds.width - SWITCH_WIDTH) * 0.5, + bounds.y + (bounds.height - SWITCH_HEIGHT) * 0.5, + SWITCH_WIDTH, + SWITCH_HEIGHT, + ) +} + +/// `[Qd]` The track: the indicator inset by 3 above and below. +pub fn switch_track(indicator: Rect) -> Rect { + Rect::new( + indicator.x, + indicator.y + SWITCH_TRACK_INSET, + indicator.width, + (indicator.height - 2.0 * SWITCH_TRACK_INSET).max(0.0), + ) +} + +/// The handle's square, `offset` from the indicator's leading edge in +/// `direction`. +pub fn switch_handle(indicator: Rect, offset: f32, direction: LayoutDirection) -> Rect { + let x = match direction { + LayoutDirection::LeftToRight => indicator.x + offset, + LayoutDirection::RightToLeft => indicator.x + indicator.width - SWITCH_HEIGHT - offset, + }; + Rect::new(x, indicator.y, SWITCH_HEIGHT, SWITCH_HEIGHT) +} + +/// The checked part of the track: from its leading end to the handle's +/// trailing edge. +pub fn switch_checked_part(track: Rect, handle: Rect, direction: LayoutDirection) -> Rect { + match direction { + LayoutDirection::LeftToRight => Rect::new( + track.x, + track.y, + (handle.x + handle.width - track.x).max(0.0), + track.height, + ), + LayoutDirection::RightToLeft => Rect::new( + handle.x, + track.y, + (track.x + track.width - handle.x).max(0.0), + track.height, + ), + } +} + +impl Widget for BreezeSwitchBody { + fn build(&mut self, ctx: &mut BuildContext) -> Vec { + let id = ctx.self_id(); + let registry = ctx.binding_registry(); + self.offset.bind_to(id, registry, BindingLevel::RepaintOnly); + self.emphasis + .bind_to(id, registry, BindingLevel::RepaintOnly); + self.is_disabled + .bind_to(id, registry, BindingLevel::RepaintOnly); + self.show_focus_frame + .bind_to(id, registry, BindingLevel::RepaintOnly); + vec![] + } + + /// The indicator, raised to the density's target size on both axes; the + /// paint stays 36 x 18, centred. + fn layout_response(&self, _proposal: SizeProposal, ctx: &LayoutContext) -> LayoutResponse { + density_min_size( + Size::new(SWITCH_WIDTH, SWITCH_HEIGHT), + TargetAxes::BOTH, + &ctx.theme.input, + ) + .into() + } + + fn place_children( + &self, + _bounds: Rect, + _proposal: SizeProposal, + _children: &mut [WidgetPlacement], + _ctx: &LayoutContext, + ) { + } + + fn paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext) { + let colors = BreezeIndicatorColors::resolve( + ctx.theme, + ctx.window_active, + ctx.prefers_high_contrast, + self.is_disabled.get(), + ); + let offset = self.offset.get().clamp(0.0, TRAVEL); + let paint = switch_paint(offset / TRAVEL, self.emphasis.get(), &colors); + let pen = ctx.theme.shape.border_width; + let direction = ctx.layout_direction; + + let indicator = switch_indicator(bounds); + let track = switch_track(indicator); + let handle = switch_handle(indicator, offset, direction); + let track_corner = CornerRadius::uniform(SWITCH_TRACK_RADIUS); + + canvas.fill_rounded_rect(track, track_corner, paint.track); + if offset > 0.0 && paint.checked_fill.a() > 0.0 { + canvas.fill_rounded_rect( + switch_checked_part(track, handle, direction), + track_corner, + paint.checked_fill, + ); + } + if pen > 0.0 && paint.track_outline.a() > 0.0 { + // A Qt Quick border lies inside its rectangle. + canvas.stroke_rounded_rect( + inset(track, pen * 0.5), + CornerRadius::uniform((SWITCH_TRACK_RADIUS - pen * 0.5).max(0.0)), + paint.track_outline, + pen, + ); + } + + let centre = Point::new( + handle.x + SWITCH_HANDLE_RADIUS, + handle.y + SWITCH_HANDLE_RADIUS, + ); + canvas.fill_circle(centre, SWITCH_HANDLE_RADIUS, paint.handle); + if pen > 0.0 && paint.handle_outline.a() > 0.0 { + canvas.stroke_circle( + centre, + SWITCH_HANDLE_RADIUS - pen * 0.5, + paint.handle_outline, + pen, + ); + } + + if self.show_focus_frame.get() { + let shape = &ctx.theme.shape; + if colors.focus_ring.a() > 0.0 && shape.focus_ring_width > 0.0 { + let ring = FocusRingStroke::at_distance( + indicator, + SWITCH_HEIGHT * 0.5, + shape.focus_ring_width * 0.5, + ); + canvas.stroke_rounded_rect( + ring.rect, + CornerRadius::uniform(ring.corner_radius), + colors.focus_ring, + shape.focus_ring_width, + ); + } + } + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + // Presentational: the `Toggle` emits the switch node. + builder.set_hidden(); + } +} + +fn inset(r: Rect, d: f32) -> Rect { + Rect::new( + r.x + d, + r.y + d, + (r.width - 2.0 * d).max(0.0), + (r.height - 2.0 * d).max(0.0), + ) +} + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_kde_scheme::KdeColor; + + fn rgba8(c: Color) -> [u8; 4] { + KdeColor::from_color(c).to_rgba8() + } + + #[test] + fn the_handle_follows_the_desktop_styles_position_rule() { + assert_eq!(handle_offset(0.0), 0.0); + assert_eq!(handle_offset(1.0), 18.0); + // It moves only over the middle half of the position. + assert_eq!(handle_offset(0.25), 0.0); + assert_eq!(handle_offset(0.5), 9.0); + assert_eq!(handle_offset(0.75), 18.0); + } + + #[test] + fn the_travel_takes_ninety_milliseconds_at_the_default_speed() { + let d = handle_duration(Duration::from_millis(100)); + assert!((d.as_secs_f32() - 0.09).abs() < 1e-6, "{d:?}"); + // A shorter short duration wins. + assert_eq!( + handle_duration(Duration::from_millis(50)), + Duration::from_millis(50) + ); + assert_eq!(handle_duration(Duration::ZERO), Duration::ZERO); + } + + #[test] + fn the_geometry_is_the_desktop_styles() { + let node = Rect::new(0.0, 0.0, 36.0, 24.0); + let i = switch_indicator(node); + assert_eq!(i, Rect::new(0.0, 3.0, 36.0, 18.0)); + assert_eq!(switch_track(i), Rect::new(0.0, 6.0, 36.0, 12.0)); + let off = switch_handle(i, 0.0, LayoutDirection::LeftToRight); + let on = switch_handle(i, 18.0, LayoutDirection::LeftToRight); + assert_eq!(off, Rect::new(0.0, 3.0, 18.0, 18.0)); + assert_eq!(on, Rect::new(18.0, 3.0, 18.0, 18.0)); + // Mirrored right to left. + let rtl_off = switch_handle(i, 0.0, LayoutDirection::RightToLeft); + assert_eq!(rtl_off, on); + let rtl_on = switch_handle(i, 18.0, LayoutDirection::RightToLeft); + assert_eq!(rtl_on, off); + // The checked part runs from the leading end to the handle's trailing + // edge: the whole track when on, either way. + let t = switch_track(i); + assert_eq!(switch_checked_part(t, on, LayoutDirection::LeftToRight), t); + assert_eq!( + switch_checked_part(t, rtl_on, LayoutDirection::RightToLeft), + t + ); + } + + /// The figures the module documentation gives for the handle, which + /// keeps the desktop style's colours, and the 3:1 its position is read + /// at in either state. + #[test] + fn the_handle_keeps_its_colours_and_meets_a_lifted_outline() { + let t = crate::light(); + let c = BreezeIndicatorColors::resolve(&t, true, false, false); + let off = switch_paint(0.0, 0.0, &c); + let on = switch_paint(1.0, 0.0, &c); + let checked = over(on.checked_fill, on.track); + let face = on.handle.contrast_ratio(checked); + assert!((1.65..1.75).contains(&face), "{face}"); + let outline = on.handle_outline.contrast_ratio(t.colors.surface_main); + assert!((1.3..1.4).contains(&outline), "{outline}"); + for p in [off, on] { + assert!(p.track_outline.contrast_ratio(p.handle) >= 3.0, "{p:?}"); + } + } + + /// `top` composited over the opaque `bottom`. + fn over(top: Color, bottom: Color) -> Color { + bottom.with_alpha(1.0).mix(top.with_alpha(1.0), top.a()) + } + + #[test] + fn breeze_lights_switch_colours() { + let c = BreezeIndicatorColors::resolve(&crate::light(), true, false, false); + let p = switch_paint(0.0, 0.0, &c); + // 252 moved 10 % toward 35,38,41. + assert_eq!(rgba8(p.track), [230, 231, 231, 255]); + assert_eq!(p.handle, c.button); + assert_eq!(p.handle_outline, c.button_outline); + assert_eq!(p.track_outline, c.outline, "D6 at rest"); + let on = switch_paint(1.0, 0.0, &c); + assert_eq!(on.track_outline, c.checked_outline, "D6 when on"); + assert_ne!(on.track_outline, c.highlight, "Breeze Light's is lifted"); + let on_hovered = switch_paint(1.0, 1.0, &c); + assert_eq!(on_hovered.track_outline, c.checked_outline); + assert_eq!(on.checked_fill, c.highlight.with_alpha(0.5)); + let hovered = switch_paint(0.0, 1.0, &c); + assert_eq!(hovered.handle_outline, c.button_hover); + assert_eq!(hovered.track_outline, c.button_hover); + } +} diff --git a/crates/teksilo-theme-kde/tests/mount.rs b/crates/teksilo-theme-kde/tests/mount.rs index c4c9f747e..2368b00bd 100644 --- a/crates/teksilo-theme-kde/tests/mount.rs +++ b/crates/teksilo-theme-kde/tests/mount.rs @@ -2,7 +2,8 @@ // SPDX-FileCopyrightText: 2026 FernTech //! Mount every widget the Breeze preset restyles, in both schemes, render -//! it, and check the colours it paints against Plasma's own. +//! it, and check the colours it paints against Plasma's own: the buttons, +//! the check box, the radio button, the switch and the line edit. //! //! The unit tests beside each style check its rules. This checks that the //! styles run: a Tier-3 style is only exercised when its widget is built, @@ -19,21 +20,24 @@ use std::cell::RefCell; use std::rc::Rc; +use std::time::Duration; use serde_json::Value; -use teksilo_canvas::{MockTextBackend, RenderFrame, SizeProposal}; -use teksilo_core::event::PointerButton; +use teksilo_canvas::{MockTextBackend, RenderFrame, ShapeKind, SizeProposal}; +use teksilo_core::event::{Key, Modifiers, PointerButton}; use teksilo_core::signal::Signal; use teksilo_core::styles::Theme; use teksilo_core::widget::Widget; use teksilo_core::widget_id::WidgetId; use teksilo_core::widget_tree::WidgetTree; use teksilo_i18n::lit; +use teksilo_theme_kde::styles::indicator::BreezeIndicatorColors; use teksilo_theme_kde::{self as kde, KdePalette, PlasmaAccent}; use teksilo_tokens::Color; use teksilo_widgets::primitives::{HStack, IconWidget}; use teksilo_widgets::{ - Button, ButtonVariant, IconButton, IconButtonSize, MenuItem, SplitButton, VStack, + Button, ButtonVariant, CheckState, Checkbox, IconButton, IconButtonSize, MenuItem, RadioButton, + SplitButton, TextInput, Toggle, VStack, }; const PIXELS_JSON: &str = include_str!(concat!( @@ -88,6 +92,17 @@ fn placed(theme: Theme, w: impl Widget + 'static) -> (WidgetTree, WidgetId) { (tree, id) } +/// A tree holding `w` at its natural height in a column, laid out: the tree +/// and the widget's id. +fn in_column(theme: Theme, w: impl Widget + 'static) -> (WidgetTree, WidgetId) { + let mut tree = tree_with(theme); + let column = tree.add(VStack::new().child(HStack::new().child(w))); + tree.layout(SizeProposal::exact(400.0, 300.0)); + let row = tree.children(column)[0]; + let id = tree.children(row)[0]; + (tree, id) +} + fn rerender(tree: &mut WidgetTree) -> Rc { tree.layout(SizeProposal::exact(400.0, 300.0)); tree.render() @@ -97,13 +112,15 @@ fn rgba8(c: [f32; 4]) -> [u8; 4] { c.map(|v| (v.clamp(0.0, 1.0) * 255.0).round() as u8) } -/// One painted shape: its colour in 8 bits and its stroke width (0 for a -/// fill). +/// One painted shape: its colour in 8 bits, its stroke width (0 for a +/// fill), its rectangle, its kind and its top-leading corner radius. #[derive(Debug, Clone, Copy, PartialEq)] struct Painted { color: [u8; 4], stroke: f32, screen: [f32; 4], + kind: ShapeKind, + radius: f32, } fn painted(frame: &RenderFrame) -> Vec { @@ -114,6 +131,8 @@ fn painted(frame: &RenderFrame) -> Vec { color: rgba8(s.color), stroke: s.stroke_width, screen: s.screen, + kind: s.shape, + radius: s.corner_radii[0], }) .collect() } @@ -238,6 +257,77 @@ fn split_buttons_mount_in_every_variant() { } } +#[test] +fn indicators_and_fields_mount_in_every_state_and_variant() { + use teksilo_core::styles::{CheckboxVariant, RadioVariant, TextInputVariant}; + for (_, theme) in themes() { + for on in [false, true] { + assert!( + mount( + theme.clone(), + Toggle::new(Signal::new(on)).label(lit!("Wi-Fi")) + ) > 0 + ); + assert!(mount(theme.clone(), Toggle::new(Signal::new(on)).enabled(false)) > 0); + } + for state in [ + CheckState::Unchecked, + CheckState::Checked, + CheckState::Indeterminate, + ] { + for variant in [ + CheckboxVariant::Square, + CheckboxVariant::Rounded, + CheckboxVariant::Circle, + ] { + let drawn = mount( + theme.clone(), + Checkbox::tristate(Signal::new(state)) + .variant(variant) + .label(lit!("Enable")), + ); + assert!(drawn > 0, "{state:?} {variant:?} painted nothing"); + } + } + for variant in [ + RadioVariant::Circle, + RadioVariant::Square, + RadioVariant::Rounded, + ] { + let selected = Signal::new(0_usize); + let drawn = mount( + theme.clone(), + VStack::new() + .child( + RadioButton::new(0, selected.clone()) + .variant(variant) + .label(lit!("One")), + ) + .child( + RadioButton::new(1, selected.clone()) + .variant(variant) + .label(lit!("Two")), + ), + ); + assert!(drawn > 0, "{variant:?} painted nothing"); + } + for variant in [ + TextInputVariant::Outlined, + TextInputVariant::Filled, + TextInputVariant::Underline, + TextInputVariant::Bare, + ] { + let drawn = mount( + theme.clone(), + TextInput::new(Signal::new("hello".to_string())) + .placeholder(lit!("Name")) + .variant(variant), + ); + assert!(drawn > 0, "{variant:?} painted nothing"); + } + } +} + /// The styles read the theme at paint time, so a tree built under Breeze /// survives a live swap to the other scheme, out to another design language /// and back. @@ -249,7 +339,11 @@ fn a_mounted_tree_survives_a_theme_swap() { .child(Button::new(lit!("Save")).variant(ButtonVariant::Filled)) .child(Button::new(lit!("Cancel"))) .child(IconButton::new(IconWidget::checkmark(12.0)).toggle(Signal::new(true))) - .child(SplitButton::new().item(MenuItem::new(lit!("Run")))), + .child(SplitButton::new().item(MenuItem::new(lit!("Run")))) + .child(Toggle::new(Signal::new(true))) + .child(Checkbox::new(Signal::new(true)).label(lit!("On"))) + .child(RadioButton::new(0, Signal::new(0_usize)).label(lit!("One"))) + .child(TextInput::new(Signal::new("text".to_string()))), ); for theme in [ kde::light(), @@ -280,6 +374,10 @@ fn the_styles_degrade_without_the_palette() { SplitButton::new().item(MenuItem::new(lit!("Run"))) ) > 0 ); + assert!(mount(bare.clone(), Toggle::new(Signal::new(true))) > 0); + assert!(mount(bare.clone(), Checkbox::new(Signal::new(true))) > 0); + assert!(mount(bare.clone(), RadioButton::new(0, Signal::new(0_usize))) > 0); + assert!(mount(bare.clone(), TextInput::new(Signal::new(String::new()))) > 0); // The push button still has a face and an outline, from the roles. let (mut tree, _) = placed(bare.clone(), Button::new(lit!("Save"))); let frame = rerender(&mut tree); @@ -304,7 +402,11 @@ fn every_swatch_mounts() { SplitButton::new() .item(MenuItem::new(lit!("Run"))) .variant(ButtonVariant::Filled), - ), + ) + .child(Toggle::new(Signal::new(true))) + .child(Checkbox::new(Signal::new(true)).label(lit!("On"))) + .child(RadioButton::new(0, Signal::new(0_usize)).label(lit!("One"))) + .child(TextInput::new(Signal::new(String::new()))), ); assert!(drawn > 0, "{accent:?} painted nothing"); } @@ -616,7 +718,6 @@ fn a_filled_split_button_frame_has_the_push_buttons_bounds() { /// the theme's focus colour. #[test] fn keyboard_focus_draws_the_focus_frame() { - use teksilo_core::event::{Key, Modifiers}; for (scheme, theme) in themes() { let ring = rgba8(theme.colors.focus_ring.to_array()); let mut tree = tree_with(theme); @@ -636,3 +737,1100 @@ fn keyboard_focus_draws_the_focus_frame() { assert_eq!(focus.screen, [first.x, first.y, first.width, first.height]); } } + +// ── Check boxes, radio buttons, switches and fields ───────────────────── + +/// The 15 x 15 shapes a painted box or disc lies on, filled or stroked. +fn box_shapes(frame: &RenderFrame) -> Vec { + painted(frame) + .into_iter() + .filter(|p| (p.screen[2] - 15.0).abs() < 0.01 && (p.screen[3] - 15.0).abs() < 0.01) + .collect() +} + +/// The centre of the painted box of the one indicator in `frame`. +fn box_centre(frame: &RenderFrame) -> teksilo_canvas::Point { + let b = box_shapes(frame) + .into_iter() + .next() + .expect("a 15 px box is painted"); + teksilo_canvas::Point::new(b.screen[0] + 7.5, b.screen[1] + 7.5) +} + +/// An unchecked box: Plasma's button-coloured face on the stroked 15 px +/// box at 2.5 inside the indicator, outlined in the lifted outline (D6). +#[test] +fn an_unchecked_box_is_breezes_face_in_the_lifted_outline() { + for (scheme, theme) in themes() { + let (mut tree, id) = in_column( + theme.clone(), + Checkbox::new(Signal::new(false)).label(lit!("Check")), + ); + let frame = rerender(&mut tree); + let shapes = box_shapes(&frame); + let face = sample(scheme, "check_box.off", 8, 8); + assert!( + shapes.iter().any(|p| p.stroke == 0.0 && p.color == face), + "{scheme}: no face {face:?} in {shapes:?}" + ); + let outline = rgba8(theme.colors.border_strong.to_array()); + let stroke = shapes + .iter() + .find(|p| p.stroke > 0.0) + .unwrap_or_else(|| panic!("{scheme}: no outline")); + assert_eq!(stroke.color, outline, "{scheme}"); + assert_eq!(stroke.stroke, 1.0); + // The indicator hugs the node's leading edge, 2 px down in the 24 px + // row: the box at 2.5 in it. + let b = tree.bounds(id); + assert_eq!(b.height, 24.0, "{scheme}: D8"); + assert_eq!( + [stroke.screen[0] - b.x, stroke.screen[1] - b.y], + [2.5, 4.5], + "{scheme}" + ); + // Plasma's own outline is the separator, which D6 lifts. + let plasma = sample(scheme, "check_box.off", 2, 8); + assert_ne!(plasma, outline, "{scheme}: the premise of D6"); + } +} + +/// A checked box: the highlight outline, the highlight at 30 % over the +/// face, and the check in the view's text, drawn with a 2 px pen and mitred +/// joins. +#[test] +fn a_checked_box_is_washed_in_the_highlight_and_marked_in_the_text() { + use teksilo_canvas::LineJoin; + for (scheme, theme) in themes() { + let (mut tree, id) = in_column( + theme.clone(), + Checkbox::new(Signal::new(true)).label(lit!("Check")), + ); + let frame = rerender(&mut tree); + let shapes = box_shapes(&frame); + let face = sample(scheme, "check_box.off", 8, 8); + let wash = shapes + .iter() + .find(|p| p.stroke == 0.0 && p.color[3] == 77) + .unwrap_or_else(|| panic!("{scheme}: no wash in {shapes:?}")); + assert!( + near(over(wash.color, face), sample(scheme, "check_box.on", 8, 8)), + "{scheme}: {:?}", + over(wash.color, face) + ); + assert!( + shapes + .iter() + .any(|p| p.stroke > 0.0 && p.color == sample(scheme, "check_box.on", 2, 8)), + "{scheme}: no highlight outline" + ); + let mark = frame + .paths + .iter() + .find(|p| p.stroke_style.width > 0.0) + .unwrap_or_else(|| panic!("{scheme}: no check mark")); + assert_eq!( + rgba8(mark.color), + sample(scheme, "check_box.on", 13, 8), + "{scheme}" + ); + assert_eq!(mark.stroke_style.width, 2.0); + assert_eq!(mark.stroke_style.line_join, LineJoin::Miter); + // The mark's three points, in the indicator. + let b = tree.bounds(id); + let points: Vec<[f32; 2]> = + mark.path + .commands() + .iter() + .filter_map(|c| match c { + teksilo_canvas::PathCommand::MoveTo(p) + | teksilo_canvas::PathCommand::LineTo(p) => Some([p.x - b.x, p.y - b.y]), + _ => None, + }) + .collect(); + assert_eq!( + points, + vec![[6.0, 12.0], [9.0, 15.0], [14.5, 9.5]], + "{scheme}: (6, 10), (9, 13), (14.5, 7.5) of an indicator 2 px down" + ); + } +} + +/// A partial box: three 2 px squares of the view's text, 4 px apart. +#[test] +fn a_partial_box_shows_three_squares() { + for (scheme, theme) in themes() { + let (mut tree, _) = placed( + theme, + Checkbox::tristate(Signal::new(CheckState::Indeterminate)).label(lit!("Some")), + ); + let frame = rerender(&mut tree); + let text = sample(scheme, "check_box.partial", 5, 10); + let squares: Vec<[f32; 4]> = frame + .decorations + .iter() + .filter(|d| rgba8(d.color) == text) + .map(|d| d.rect) + .collect(); + assert_eq!(squares.len(), 3, "{scheme}: {squares:?}"); + for s in &squares { + assert_eq!((s[2], s[3]), (2.0, 2.0)); + } + assert_eq!(squares[1][0] - squares[0][0], 4.0); + assert_eq!(squares[2][0] - squares[1][0], 4.0); + } +} + +/// Under the pointer the box gains a 1 px ring of the focus colour; pressed, +/// its face darkens to Plasma's pressed face. +#[test] +fn a_hovered_box_rings_and_a_pressed_one_darkens() { + for (scheme, theme) in themes() { + let (mut tree, _) = placed( + theme, + Checkbox::new(Signal::new(false)).label(lit!("Check")), + ); + let frame = rerender(&mut tree); + let ring = sample(scheme, "check_box.hover_off", 2, 8); + assert!(!strokes(&frame).contains(&ring), "{scheme}: at rest"); + let centre = box_centre(&frame); + tree.pointer_move(centre); + let frame = rerender(&mut tree); + assert!( + box_shapes(&frame) + .iter() + .any(|p| p.stroke > 0.0 && p.color == ring), + "{scheme}: no hover ring" + ); + tree.pointer_down_button(centre, PointerButton::Primary); + let frame = rerender(&mut tree); + let pressed = sample(scheme, "check_box.pressed_off", 8, 8); + assert!( + box_shapes(&frame) + .iter() + .any(|p| p.stroke == 0.0 && near(p.color, pressed)), + "{scheme}: no pressed face {pressed:?} in {:?}", + box_shapes(&frame) + ); + tree.pointer_up_button(centre, PointerButton::Primary); + } +} + +/// A checked box in a backdrop window is outlined in the scheme's muted +/// highlight, not the active one. +#[test] +fn a_checked_box_in_a_backdrop_window_uses_the_muted_highlight() { + for (scheme, theme) in themes() { + let active = rgba8(theme.colors.accent.to_array()); + let (mut tree, _) = placed( + theme.clone(), + Checkbox::new(Signal::new(true)).label(lit!("Check")), + ); + tree.set_window_active(false); + let frame = rerender(&mut tree); + let muted = theme.for_paint_state(teksilo_core::styles::PaintState { + window_active: false, + high_contrast: false, + }); + let muted = rgba8(muted.colors.accent.to_array()); + assert_ne!(muted, active, "{scheme}: premise"); + let outlines: Vec<[u8; 4]> = box_shapes(&frame) + .into_iter() + .filter(|p| p.stroke > 0.0) + .map(|p| p.color) + .collect(); + assert!(outlines.contains(&muted), "{scheme}: {outlines:?}"); + assert!(!outlines.contains(&active), "{scheme}"); + } +} + +/// Keyboard focus draws the 2 px focus frame outside the 16 px box. +#[test] +fn keyboard_focus_frames_the_box() { + for (scheme, theme) in themes() { + let ring = rgba8(theme.colors.focus_ring.to_array()); + let (mut tree, id) = in_column(theme, Checkbox::new(Signal::new(false)).label(lit!("A"))); + tree.press_key(Key::Tab, Modifiers::NONE); + let frame = rerender(&mut tree); + let focus = painted(&frame) + .into_iter() + .find(|p| p.color == ring && p.stroke == 2.0) + .unwrap_or_else(|| panic!("{scheme}: no focus frame in {:?}", painted(&frame))); + let b = tree.bounds(id); + // The indicator at (0, 2): the ring's centre line 1 px outside the + // box at (2, 2), so at (1, 3), 18 px wide. + assert_eq!( + [ + focus.screen[0] - b.x, + focus.screen[1] - b.y, + focus.screen[2], + focus.screen[3] + ], + [1.0, 3.0, 18.0, 18.0], + "{scheme}" + ); + } +} + +/// A radio button: the check box's face and lifted outline on a disc, and, +/// selected, the highlight outline, the wash and a 6 px dot of the view's +/// text. +#[test] +fn a_radio_button_is_breezes_disc_and_dot() { + for (scheme, theme) in themes() { + let selected = Signal::new(1_usize); + let (mut tree, _) = placed( + theme.clone(), + RadioButton::new(0, selected.clone()).label(lit!("One")), + ); + let frame = rerender(&mut tree); + let shapes = box_shapes(&frame); + assert!( + shapes + .iter() + .any(|p| p.stroke == 0.0 && p.color == sample(scheme, "radio_button.off", 10, 10)), + "{scheme}: no face in {shapes:?}" + ); + assert!( + shapes + .iter() + .any(|p| p.stroke > 0.0 && p.color == rgba8(theme.colors.border_strong.to_array())), + "{scheme}: no lifted outline" + ); + + let (mut tree, _) = placed( + theme.clone(), + RadioButton::new(0, Signal::new(0_usize)).label(lit!("One")), + ); + let frame = rerender(&mut tree); + let shapes = box_shapes(&frame); + let face = sample(scheme, "radio_button.off", 10, 10); + let wash = shapes + .iter() + .find(|p| p.stroke == 0.0 && p.color[3] == 77) + .unwrap_or_else(|| panic!("{scheme}: no wash")); + assert!(near( + over(wash.color, face), + sample(scheme, "radio_button.on", 5, 10) + )); + assert!( + shapes + .iter() + .any(|p| p.stroke > 0.0 && p.color == sample(scheme, "radio_button.on", 2, 10)), + "{scheme}: no highlight outline" + ); + let dot = painted(&frame) + .into_iter() + .find(|p| (p.screen[2] - 6.0).abs() < 0.01 && (p.screen[3] - 6.0).abs() < 0.01) + .unwrap_or_else(|| panic!("{scheme}: no 6 px dot")); + assert_eq!(dot.color, sample(scheme, "radio_button.on", 10, 10)); + let disc = shapes[0]; + assert_eq!( + [dot.screen[0] + 3.0, dot.screen[1] + 3.0], + [disc.screen[0] + 7.5, disc.screen[1] + 7.5], + "{scheme}: the dot is centred" + ); + } +} + +/// A switch: the 12 px track in the button colour moved 10 % toward the +/// button text, an 18 px handle in the button colour, and, on, the +/// highlight at 50 % up to the handle, which sits at the trailing end; in +/// right-to-left at the leading one. +#[test] +fn a_switch_is_the_desktop_styles_track_and_handle() { + use teksilo_core::environment::LayoutDirection; + use teksilo_kde_scheme::KdeColor; + use teksilo_kde_scheme::math::mix; + for (scheme, theme) in themes() { + let p = theme.extension::().unwrap(); + let b = p.colors(teksilo_kde_scheme::ColorState::Active); + let track = mix( + KdeColor::from_color(b.button), + KdeColor::from_color(b.button_text), + 0.1, + ) + .to_color(); + let track = rgba8(track.to_array()); + let button = rgba8(b.button.to_array()); + for direction in [LayoutDirection::LeftToRight, LayoutDirection::RightToLeft] { + for on in [false, true] { + let mut tree = tree_with(theme.clone()); + tree.set_layout_direction(direction); + let row = tree.add(HStack::new().child(Toggle::new(Signal::new(on)))); + tree.layout(SizeProposal::exact(400.0, 300.0)); + let id = tree.children(row)[0]; + let node = tree.bounds(id); + let frame = rerender(&mut tree); + let all = painted(&frame); + let t = all + .iter() + .find(|s| s.stroke == 0.0 && s.screen[2] == 36.0 && s.screen[3] == 12.0) + .unwrap_or_else(|| panic!("{scheme}: no 36 x 12 track in {all:?}")); + assert_eq!(t.color, track, "{scheme}"); + let handle = all + .iter() + .find(|s| s.stroke == 0.0 && s.screen[2] == 18.0 && s.screen[3] == 18.0) + .unwrap_or_else(|| panic!("{scheme}: no 18 px handle")); + assert_eq!(handle.color, button, "{scheme}"); + let at_trailing = handle.screen[0] - t.screen[0] == 18.0; + let rtl = direction == LayoutDirection::RightToLeft; + assert_eq!(at_trailing, on != rtl, "{scheme} {direction:?} on {on}"); + let checked = all.iter().any(|s| s.stroke == 0.0 && s.color[3] == 128); + assert_eq!(checked, on, "{scheme}: the checked fill"); + // The node is the density's target; the indicator is centred. + assert_eq!((node.width, node.height), (36.0, 24.0)); + assert_eq!(t.screen[1] - node.y, 6.0); + } + } + } +} + +/// A line edit: Plasma's view fill on the node inset by 0.5 at radius 4.5, +/// the lifted outline at rest (D6) and the lifted focus colour while +/// focused, at the same 1 px. (The hover outline is the style's rule, tested +/// beside it: `TextInput` does not report the pointer over it.) +#[test] +fn a_field_is_breezes_line_edit() { + for (scheme, theme) in themes() { + let mut tree = tree_with(theme.clone()); + tree.add( + VStack::new() + .child(Button::new(lit!("Before"))) + .child(TextInput::new(Signal::new(String::new()))), + ); + tree.layout(SizeProposal::exact(400.0, 300.0)); + let frame = rerender(&mut tree); + let fill = sample(scheme, "line_edit.normal", 75, 16); + let rest = rgba8(theme.colors.border_strong.to_array()); + let outline = painted(&frame) + .into_iter() + .find(|p| p.stroke > 0.0 && p.color == rest) + .unwrap_or_else(|| panic!("{scheme}: no lifted outline in {:?}", painted(&frame))); + assert_eq!(outline.stroke, 1.0); + assert_eq!( + outline.screen[3], 31.0, + "{scheme}: a 32 px field inset by 0.5" + ); + assert!( + painted(&frame) + .iter() + .any(|p| p.stroke == 0.0 && p.color == fill && p.screen == outline.screen), + "{scheme}: no view fill on the frame" + ); + assert_ne!( + sample(scheme, "line_edit.normal", 0, 16), + rest, + "{scheme}: the premise of D6" + ); + + tree.press_key(Key::Tab, Modifiers::NONE); + tree.press_key(Key::Tab, Modifiers::NONE); + let frame = rerender(&mut tree); + let focus = rgba8(theme.colors.border_focused.to_array()); + let focused = painted(&frame) + .into_iter() + .find(|p| p.color == focus && p.screen == outline.screen) + .unwrap_or_else(|| panic!("{scheme}: no focus outline in {:?}", painted(&frame))); + assert_eq!(focused.stroke, 1.0, "{scheme}: focus keeps the 1 px width"); + } +} + +/// A disabled field: Plasma's disabled view fill in the disabled outline. +#[test] +fn a_disabled_field_paints_the_disabled_colours() { + for (scheme, theme) in themes() { + let (mut tree, _) = placed( + theme.clone(), + TextInput::new(Signal::new(String::new())).enabled(false), + ); + let frame = rerender(&mut tree); + let fill = sample(scheme, "line_edit.disabled", 75, 16); + assert!( + fills(&frame).contains(&fill), + "{scheme}: no {fill:?} in {:?}", + fills(&frame) + ); + let outline = rgba8(theme.colors.border_disabled.to_array()); + assert!(strokes(&frame).contains(&outline), "{scheme}"); + assert!(near(outline, sample(scheme, "line_edit.disabled", 0, 16))); + } +} + +// ── Indicator geometry, focus, disabled and right-to-left ────────────── + +/// The colours the indicator styles paint from, in an active window. +fn indicator_colors(theme: &Theme, disabled: bool) -> BreezeIndicatorColors { + BreezeIndicatorColors::resolve(theme, true, false, disabled) +} + +fn rgba8_of(c: Color) -> [u8; 4] { + rgba8(c.to_array()) +} + +/// Every node under `root` whose type is `name`. +fn nodes_named(tree: &WidgetTree, root: WidgetId, name: &str) -> Vec { + fn walk(tree: &WidgetTree, id: WidgetId, name: &str, out: &mut Vec) { + if tree + .widget_type_name(id) + .is_some_and(|t| t.rsplit("::").next() == Some(name)) + { + out.push(id); + } + for c in tree.children(id) { + walk(tree, c, name, out); + } + } + let mut out = Vec::new(); + walk(tree, root, name, &mut out); + out +} + +/// The track fill and the handle face of the one switch in `frame`. +fn switch_parts(frame: &RenderFrame) -> (Painted, Painted) { + let all = painted(frame); + let track = *all + .iter() + .find(|s| s.stroke == 0.0 && s.screen[2] == 36.0 && s.screen[3] == 12.0) + .unwrap_or_else(|| panic!("no 36 x 12 track in {all:?}")); + let handle = *all + .iter() + .find(|s| s.stroke == 0.0 && s.kind == ShapeKind::Circle && s.screen[2] == 18.0) + .unwrap_or_else(|| panic!("no 18 px handle in {all:?}")); + (track, handle) +} + +/// The handle's leading edge from the track's, left to right. +fn handle_offset(frame: &RenderFrame) -> f32 { + let (track, handle) = switch_parts(frame); + handle.screen[0] - track.screen[0] +} + +/// The handle's 1 px outline, a 17 px circle. +fn handle_outline(frame: &RenderFrame) -> Painted { + *painted(frame) + .iter() + .find(|s| s.stroke > 0.0 && s.kind == ShapeKind::Circle && s.screen[2] == 17.0) + .unwrap_or_else(|| panic!("no 17 px handle outline in {:?}", painted(frame))) +} + +/// The track's 1 px outline, 35 x 11. +fn track_outline(frame: &RenderFrame) -> Painted { + *painted(frame) + .iter() + .find(|s| s.stroke > 0.0 && s.screen[2] == 35.0 && s.screen[3] == 11.0) + .unwrap_or_else(|| panic!("no 35 x 11 track outline in {:?}", painted(frame))) +} + +/// The track's outline is inset by half its pen at radius 5.5, the handle's +/// is the 17 px circle inside the handle, and both take the D6 colours; the +/// track is outlined in the lifted highlight when on. Keyboard focus adds +/// the 2 px focus frame around the 36 x 18 indicator and turns the handle's +/// outline to the button set's hover colour. +#[test] +fn a_switch_is_outlined_and_framed_where_the_desktop_style_puts_it() { + for (scheme, theme) in themes() { + let c = indicator_colors(&theme, false); + let ring = rgba8_of(theme.colors.focus_ring); + for on in [false, true] { + let (mut tree, id) = on_the_clock(theme.clone(), false, Toggle::new(Signal::new(on))); + let frame = tick(&mut tree, 0); + let node = tree.bounds(id); + let (track, handle) = switch_parts(&frame); + let t = track_outline(&frame); + assert_eq!(t.kind, ShapeKind::RoundedRect, "{scheme}"); + assert_eq!( + t.screen, + [track.screen[0] + 0.5, track.screen[1] + 0.5, 35.0, 11.0], + "{scheme} on {on}" + ); + assert_eq!(t.radius, 5.5, "{scheme}"); + assert_eq!(t.stroke, 1.0); + let expected = if on { c.checked_outline } else { c.outline }; + assert_eq!(t.color, rgba8_of(expected), "{scheme} on {on}: D6"); + let h = handle_outline(&frame); + assert_eq!( + h.screen, + [handle.screen[0] + 0.5, handle.screen[1] + 0.5, 17.0, 17.0], + "{scheme}" + ); + assert_eq!(h.stroke, 1.0); + assert_eq!(h.color, rgba8_of(c.button_outline), "{scheme}: at rest"); + assert!( + !painted(&frame) + .iter() + .any(|p| p.color == ring && p.stroke == 2.0), + "{scheme}: no focus frame unfocused" + ); + + tree.press_key(Key::Tab, Modifiers::NONE); + let frame = tick(&mut tree, 100); + let focus = painted(&frame) + .into_iter() + .find(|p| p.color == ring && p.stroke == 2.0) + .unwrap_or_else(|| panic!("{scheme}: no focus frame in {:?}", painted(&frame))); + // The indicator at (0, 3) of the 36 x 24 node: the frame's centre + // line 1 px outside it, at the indicator's radius plus 1. + assert_eq!( + [ + focus.screen[0] - node.x, + focus.screen[1] - node.y, + focus.screen[2], + focus.screen[3] + ], + [-1.0, 2.0, 38.0, 20.0], + "{scheme} on {on}" + ); + assert_eq!(focus.radius, 10.0, "{scheme}"); + assert_eq!( + handle_outline(&frame).color, + rgba8_of(c.button_hover), + "{scheme}: keyboard focus outlines the handle in the hover colour" + ); + } + } +} + +/// Keyboard focus draws the radio button's focus frame through the widget: +/// a circle 1 px outside the 16 px disc. +#[test] +fn keyboard_focus_frames_the_disc_in_a_circle() { + for (scheme, theme) in themes() { + let ring = rgba8_of(theme.colors.focus_ring); + let (mut tree, id) = in_column( + theme, + RadioButton::new(0, Signal::new(1_usize)).label(lit!("A")), + ); + tree.press_key(Key::Tab, Modifiers::NONE); + let frame = rerender(&mut tree); + let focus = painted(&frame) + .into_iter() + .find(|p| p.color == ring && p.stroke == 2.0) + .unwrap_or_else(|| panic!("{scheme}: no focus frame in {:?}", painted(&frame))); + let b = tree.bounds(id); + assert_eq!( + [ + focus.screen[0] - b.x, + focus.screen[1] - b.y, + focus.screen[2], + focus.screen[3] + ], + [1.0, 3.0, 18.0, 18.0], + "{scheme}" + ); + assert_eq!(focus.radius, 9.0, "{scheme}: half its side, a circle"); + } +} + +/// A disabled checked box and selected disc, against Plasma's disabled +/// samples: the disabled highlight's wash over the disabled face, the mark +/// and the dot in the disabled view text, the outline in the disabled +/// highlight, and no hover ring under the pointer. +#[test] +fn disabled_indicators_paint_plasmas_disabled_colours() { + for (scheme, theme) in themes() { + let c = indicator_colors(&theme, true); + let highlight = rgba8_of(theme.colors.accent_disabled); + + let id = "check_box.disabled_on"; + let (mut tree, _) = placed( + theme.clone(), + Checkbox::new(Signal::new(true)) + .label(lit!("Check")) + .enabled(false), + ); + let frame = rerender(&mut tree); + let shapes = box_shapes(&frame); + let face = shapes + .iter() + .find(|p| p.stroke == 0.0 && p.color[3] == 255) + .unwrap_or_else(|| panic!("{scheme}: no face in {shapes:?}")); + assert_eq!(face.color, rgba8_of(c.button), "{scheme}"); + let wash = shapes + .iter() + .find(|p| p.stroke == 0.0 && p.color[3] == 77) + .unwrap_or_else(|| panic!("{scheme}: no wash in {shapes:?}")); + assert!( + near(over(wash.color, face.color), sample(scheme, id, 4, 12)), + "{scheme}: {:?} against {:?}", + over(wash.color, face.color), + sample(scheme, id, 4, 12) + ); + let outline = shapes + .iter() + .find(|p| p.stroke > 0.0) + .unwrap_or_else(|| panic!("{scheme}: no outline")); + assert_eq!(outline.color, highlight, "{scheme}"); + let mark = frame + .paths + .iter() + .find(|p| p.stroke_style.width > 0.0) + .unwrap_or_else(|| panic!("{scheme}: no check mark")); + assert!( + near(rgba8(mark.color), sample(scheme, id, 13, 8)), + "{scheme}: {:?} against {:?}", + rgba8(mark.color), + sample(scheme, id, 13, 8) + ); + tree.pointer_move(box_centre(&frame)); + let frame = rerender(&mut tree); + assert_eq!( + box_shapes(&frame).iter().filter(|p| p.stroke > 0.0).count(), + 1, + "{scheme}: no hover ring on a disabled box" + ); + + let id = "radio_button.disabled_on"; + let (mut tree, _) = placed( + theme.clone(), + RadioButton::new(0, Signal::new(0_usize)) + .label(lit!("One")) + .enabled(false), + ); + let frame = rerender(&mut tree); + let shapes = box_shapes(&frame); + let face = shapes + .iter() + .find(|p| p.stroke == 0.0 && p.color[3] == 255) + .unwrap_or_else(|| panic!("{scheme}: no disc face in {shapes:?}")); + let wash = shapes + .iter() + .find(|p| p.stroke == 0.0 && p.color[3] == 77) + .unwrap_or_else(|| panic!("{scheme}: no disc wash")); + assert!( + near(over(wash.color, face.color), sample(scheme, id, 4, 10)), + "{scheme}: {:?} against {:?}", + over(wash.color, face.color), + sample(scheme, id, 4, 10) + ); + assert!( + shapes + .iter() + .any(|p| p.stroke > 0.0 && p.color == highlight), + "{scheme}: no disabled highlight outline" + ); + let dot = painted(&frame) + .into_iter() + .find(|p| p.kind == ShapeKind::Circle && (p.screen[2] - 6.0).abs() < 0.01) + .unwrap_or_else(|| panic!("{scheme}: no 6 px dot")); + assert!( + near(dot.color, sample(scheme, id, 10, 10)), + "{scheme}: {:?} against {:?}", + dot.color, + sample(scheme, id, 10, 10) + ); + } +} + +/// Right to left, the box and the disc hug the node's trailing (right) +/// edge, the label ends 24 px from it, and the partial squares are +/// centred on the box, the first to appear on the leading (right) side. +#[test] +fn right_to_left_mirrors_the_indicators() { + use teksilo_core::environment::LayoutDirection; + for (scheme, theme) in themes() { + let rows: [(&str, Box); 2] = [ + ( + "Checkbox", + Box::new(Checkbox::new(Signal::new(false)).label(lit!("Check"))), + ), + ( + "RadioButton", + Box::new(RadioButton::new(0, Signal::new(1_usize)).label(lit!("Radio"))), + ), + ]; + for (name, w) in rows { + let mut tree = tree_with(theme.clone()); + tree.set_layout_direction(LayoutDirection::RightToLeft); + let root = tree.add(VStack::new().child(HStack::new().child(w))); + tree.layout(SizeProposal::exact(400.0, 300.0)); + let node = nodes_named(&tree, root, name); + assert_eq!(node.len(), 1, "{scheme}: one {name}"); + let b = tree.bounds(node[0]); + let frame = rerender(&mut tree); + let stroke = box_shapes(&frame) + .into_iter() + .find(|p| p.stroke > 0.0) + .unwrap_or_else(|| panic!("{scheme}: no {name} outline")); + assert_eq!( + [ + b.x + b.width - (stroke.screen[0] + stroke.screen[2]), + stroke.screen[1] - b.y + ], + [2.5, 4.5], + "{scheme} {name}: the box mirrored" + ); + let label = nodes_named(&tree, node[0], "TextWidget"); + assert_eq!(label.len(), 1, "{scheme}: one label"); + let l = tree.bounds(label[0]); + assert_eq!( + b.x + b.width - (l.x + l.width), + 24.0, + "{scheme} {name}: the label 24 px from the trailing edge" + ); + } + + let state = Signal::new(CheckState::Unchecked); + let mut tree = tree_with(theme.clone()); + tree.set_layout_direction(LayoutDirection::RightToLeft); + tree.advance_time(Duration::ZERO); + tree.add( + VStack::new() + .child(HStack::new().child(Checkbox::tristate(state.clone()).label(lit!("Some")))), + ); + tree.layout(SizeProposal::exact(400.0, 300.0)); + tree.render(); + let text = sample(scheme, "check_box.partial", 5, 10); + state.set(CheckState::Indeterminate); + let squares = |f: &RenderFrame| -> Vec<[f32; 4]> { + f.decorations + .iter() + .filter(|d| rgba8(d.color) == text && d.rect[2] == 2.0) + .map(|d| d.rect) + .collect() + }; + tick(&mut tree, 0); + let frame = tick(&mut tree, 40); + let centre = box_centre(&frame); + let first = squares(&frame); + assert_eq!(first.len(), 1, "{scheme}: {first:?}"); + assert_eq!(first[0][0] + 1.0 - centre.x, 4.0, "{scheme}: on the right"); + let frame = tick(&mut tree, 60); + let all = squares(&frame); + assert_eq!(all.len(), 3, "{scheme}"); + let mut xs: Vec = all.iter().map(|s| s[0] + 1.0 - centre.x).collect(); + xs.sort_by(f32::total_cmp); + assert_eq!(xs, vec![-4.0, 0.0, 4.0], "{scheme}: centred on the box"); + } +} + +/// The hover ring is the view's focus decoration, not the highlight. With a +/// Plasma accent applied the two differ (the highlight is the accent at +/// 70 % over the view, the focus decoration the accent itself), so the +/// ring's colour tells them apart. +#[test] +fn the_hover_ring_is_the_focus_colour_not_the_highlight() { + for accent in PlasmaAccent::ALL { + for theme in [ + kde::light_with_accent(accent.color()), + kde::dark_with_accent(accent.color()), + ] { + let c = indicator_colors(&theme, false); + let focus = rgba8_of(c.focus); + let highlight = rgba8_of(c.highlight); + assert_ne!(focus, highlight, "{accent:?}: premise"); + for checked in [false, true] { + let (mut tree, _) = placed( + theme.clone(), + Checkbox::new(Signal::new(checked)).label(lit!("Check")), + ); + let frame = rerender(&mut tree); + tree.pointer_move(box_centre(&frame)); + let frame = rerender(&mut tree); + let outlines: Vec<[u8; 4]> = box_shapes(&frame) + .into_iter() + .filter(|p| p.stroke > 0.0) + .map(|p| p.color) + .collect(); + assert!( + outlines.contains(&focus), + "{accent:?} checked {checked}: {outlines:?}" + ); + assert_eq!( + outlines.contains(&highlight), + checked, + "{accent:?} checked {checked}: the highlight outlines only a checked box" + ); + } + let (mut tree, _) = placed( + theme.clone(), + RadioButton::new(0, Signal::new(1_usize)).label(lit!("One")), + ); + let frame = rerender(&mut tree); + tree.pointer_move(box_centre(&frame)); + let frame = rerender(&mut tree); + assert!( + box_shapes(&frame) + .iter() + .any(|p| p.stroke > 0.0 && p.color == focus), + "{accent:?}: no focus ring on the hovered disc" + ); + } + } +} + +// ── Motion, on the tree's simulated clock ─────────────────────────────── + +/// A tree on the simulated clock, with or without the reduced-motion +/// preference, holding `w` in a row in a column, laid out and rendered +/// once: the tree and the widget's id. +fn on_the_clock( + theme: Theme, + reduced_motion: bool, + w: impl Widget + 'static, +) -> (WidgetTree, WidgetId) { + let mut tree = tree_with(theme); + tree.set_accessibility_preferences(false, reduced_motion, 1.0); + tree.advance_time(Duration::ZERO); + let column = tree.add(VStack::new().child(HStack::new().child(w))); + tree.layout(SizeProposal::exact(400.0, 300.0)); + let row = tree.children(column)[0]; + let id = tree.children(row)[0]; + tree.render(); + (tree, id) +} + +/// Move the clock on by `ms` and render. An animation samples the clock +/// at most once a frame (about 16 ms), so the steps the tests take are at +/// least that long wherever the value is read. +fn tick(tree: &mut WidgetTree, ms: u64) -> Rc { + tree.advance_time(Duration::from_millis(ms)); + rerender(tree) +} + +/// The check mark's points, in the node's coordinates. +fn mark_points(frame: &RenderFrame, node: teksilo_canvas::Rect) -> Vec<[f32; 2]> { + frame + .paths + .iter() + .find(|p| p.stroke_style.width > 0.0) + .map(|mark| { + mark.path + .commands() + .iter() + .filter_map(|c| match c { + teksilo_canvas::PathCommand::MoveTo(p) + | teksilo_canvas::PathCommand::LineTo(p) => Some([p.x - node.x, p.y - node.y]), + _ => None, + }) + .collect() + }) + .unwrap_or_default() +} + +/// The diameter of the radio dot in `frame`, if one is painted. +fn dot_diameter(frame: &RenderFrame, text: [u8; 4]) -> Option { + painted(frame) + .into_iter() + .find(|p| p.kind == ShapeKind::Circle && p.stroke == 0.0 && p.color == text) + .map(|p| p.screen[2]) +} + +/// The whole mark, an indicator 2 px down in the 24 px row. +const WHOLE_MARK: [[f32; 2]; 3] = [[6.0, 12.0], [9.0, 15.0], [14.5, 9.5]]; + +/// The handle travels its 18 px in 90 ms (k.8: 100 ms, or 18 px at Qt's +/// 200 px a second if that is shorter), half way at the half time on its +/// ease-in-out, and back the same way. +#[test] +fn the_switch_handle_travels_in_ninety_milliseconds() { + for (scheme, theme) in themes() { + let on = Signal::new(false); + let (mut tree, _) = on_the_clock(theme, false, Toggle::new(on.clone())); + on.set(true); + assert_eq!(handle_offset(&tick(&mut tree, 0)), 0.0, "{scheme}: at 0"); + let mid = handle_offset(&tick(&mut tree, 45)); + assert!( + (8.5..9.5).contains(&mid), + "{scheme}: half way at 45 ms, {mid}" + ); + let late = handle_offset(&tick(&mut tree, 25)); + assert!( + late > mid && late < 18.0, + "{scheme}: still moving at 70 ms, {late}" + ); + assert_eq!( + handle_offset(&tick(&mut tree, 20)), + 18.0, + "{scheme}: at 90 ms" + ); + on.set(false); + tick(&mut tree, 0); + let back = handle_offset(&tick(&mut tree, 45)); + assert!((8.5..9.5).contains(&back), "{scheme}: {back}"); + assert_eq!( + handle_offset(&tick(&mut tree, 45)), + 0.0, + "{scheme}: back at 90 ms" + ); + } +} + +/// Under the pointer the handle's outline turns to the hover colour over the +/// short duration, 100 ms, on the ease-in cubic: an eighth of the way at +/// half the time. +#[test] +fn the_switch_handle_outline_turns_over_a_hundred_milliseconds() { + for (scheme, theme) in themes() { + let c = indicator_colors(&theme, false); + let rest = rgba8_of(c.button_outline); + let hover = rgba8_of(c.button_hover); + let (mut tree, _) = on_the_clock(theme, false, Toggle::new(Signal::new(false))); + let frame = tick(&mut tree, 0); + let (_, handle) = switch_parts(&frame); + assert_eq!(handle_outline(&frame).color, rest, "{scheme}"); + tree.pointer_move(teksilo_canvas::Point::new( + handle.screen[0] + 9.0, + handle.screen[1] + 9.0, + )); + assert_eq!(handle_outline(&tick(&mut tree, 0)).color, rest, "{scheme}"); + let half = handle_outline(&tick(&mut tree, 50)).color; + let eighth = rgba8_of(c.button_outline.mix(c.button_hover, 0.125)); + assert!(near(half, eighth), "{scheme}: {half:?}, not {eighth:?}"); + let late = handle_outline(&tick(&mut tree, 30)).color; + assert_ne!(late, hover, "{scheme}: still turning at 80 ms"); + assert_eq!( + handle_outline(&tick(&mut tree, 20)).color, + hover, + "{scheme}" + ); + } +} + +/// The check mark draws along its length over 100 ms, linearly: part of its +/// first stroke at 25 ms, into its second at 50, whole at 100. +#[test] +fn the_check_mark_draws_itself_over_a_hundred_milliseconds() { + for (scheme, theme) in themes() { + let checked = Signal::new(false); + let (mut tree, id) = on_the_clock( + theme, + false, + Checkbox::new(checked.clone()).label(lit!("Check")), + ); + let node = tree.bounds(id); + checked.set(true); + assert!( + mark_points(&tick(&mut tree, 0), node).is_empty(), + "{scheme}" + ); + let quarter = mark_points(&tick(&mut tree, 25), node); + assert_eq!(quarter.len(), 2, "{scheme}: {quarter:?}"); + assert_eq!(quarter[0], WHOLE_MARK[0]); + assert!( + quarter[1][0] > 6.0 && quarter[1][0] < 9.0, + "{scheme}: {quarter:?}" + ); + let half = mark_points(&tick(&mut tree, 25), node); + assert_eq!(half.len(), 3, "{scheme}: {half:?}"); + assert_eq!(&half[..2], &WHOLE_MARK[..2]); + assert!(half[2][0] > 9.0 && half[2][0] < 14.5, "{scheme}: {half:?}"); + let late = mark_points(&tick(&mut tree, 30), node); + assert_ne!(late, WHOLE_MARK.to_vec(), "{scheme}: not whole at 80 ms"); + assert_eq!(mark_points(&tick(&mut tree, 20), node), WHOLE_MARK.to_vec()); + } +} + +/// The partial squares appear one at each third of the 100 ms. +#[test] +fn the_partial_squares_appear_one_at_each_third() { + for (scheme, theme) in themes() { + let text = sample(scheme, "check_box.partial", 5, 10); + let state = Signal::new(CheckState::Unchecked); + let (mut tree, _) = on_the_clock( + theme, + false, + Checkbox::tristate(state.clone()).label(lit!("Some")), + ); + state.set(CheckState::Indeterminate); + let count = |f: &RenderFrame| { + f.decorations + .iter() + .filter(|d| rgba8(d.color) == text && d.rect[2] == 2.0) + .count() + }; + for (ms, shown) in [(0, 0), (20, 0), (20, 1), (30, 2), (30, 3)] { + let frame = tick(&mut tree, ms); + assert_eq!(count(&frame), shown, "{scheme}: after {ms} more ms"); + } + } +} + +/// The radio dot grows to its 6 px over 100 ms, linearly. +#[test] +fn the_radio_dot_grows_over_a_hundred_milliseconds() { + for (scheme, theme) in themes() { + let text = sample(scheme, "radio_button.on", 10, 10); + let selected = Signal::new(1_usize); + let (mut tree, _) = on_the_clock( + theme, + false, + RadioButton::new(0, selected.clone()).label(lit!("One")), + ); + selected.set(0); + assert_eq!(dot_diameter(&tick(&mut tree, 0), text), None, "{scheme}"); + let half = dot_diameter(&tick(&mut tree, 50), text).expect("a dot at 50 ms"); + assert!((half - 3.0).abs() < 0.01, "{scheme}: {half}"); + let late = dot_diameter(&tick(&mut tree, 30), text).expect("a dot at 80 ms"); + assert!((late - 4.8).abs() < 0.01, "{scheme}: {late}"); + let whole = dot_diameter(&tick(&mut tree, 20), text).expect("a dot at 100 ms"); + assert!((whole - 6.0).abs() < 0.01, "{scheme}: {whole}"); + } +} + +/// Under the reduced-motion preference every indicator snaps: the handle, +/// its outline, the mark, the partial squares and the dot reach their end +/// with no time passing. +#[test] +fn reduced_motion_snaps_every_indicator() { + for (scheme, theme) in themes() { + let c = indicator_colors(&theme, false); + + let on = Signal::new(false); + let (mut tree, _) = on_the_clock(theme.clone(), true, Toggle::new(on.clone())); + on.set(true); + let frame = tick(&mut tree, 0); + assert_eq!(handle_offset(&frame), 18.0, "{scheme}: the handle"); + let (_, handle) = switch_parts(&frame); + tree.pointer_move(teksilo_canvas::Point::new( + handle.screen[0] + 9.0, + handle.screen[1] + 9.0, + )); + assert_eq!( + handle_outline(&tick(&mut tree, 0)).color, + rgba8_of(c.button_hover), + "{scheme}: the handle's outline" + ); + + let checked = Signal::new(false); + let (mut tree, id) = on_the_clock( + theme.clone(), + true, + Checkbox::new(checked.clone()).label(lit!("Check")), + ); + let node = tree.bounds(id); + checked.set(true); + assert_eq!( + mark_points(&tick(&mut tree, 0), node), + WHOLE_MARK.to_vec(), + "{scheme}: the mark" + ); + + let state = Signal::new(CheckState::Unchecked); + let (mut tree, _) = on_the_clock( + theme.clone(), + true, + Checkbox::tristate(state.clone()).label(lit!("Some")), + ); + state.set(CheckState::Indeterminate); + let text = sample(scheme, "check_box.partial", 5, 10); + let frame = tick(&mut tree, 0); + let squares = frame + .decorations + .iter() + .filter(|d| rgba8(d.color) == text && d.rect[2] == 2.0) + .count(); + assert_eq!(squares, 3, "{scheme}: the partial squares"); + + let selected = Signal::new(1_usize); + let (mut tree, _) = on_the_clock( + theme.clone(), + true, + RadioButton::new(0, selected.clone()).label(lit!("One")), + ); + selected.set(0); + let text = sample(scheme, "radio_button.on", 10, 10); + let d = dot_diameter(&tick(&mut tree, 0), text).expect("a dot"); + assert!((d - 6.0).abs() < 0.01, "{scheme}: the dot, {d}"); + } +} diff --git a/crates/teksilo-theme-kde/tests/preset_metrics.rs b/crates/teksilo-theme-kde/tests/preset_metrics.rs index 779bc0bd0..655069623 100644 --- a/crates/teksilo-theme-kde/tests/preset_metrics.rs +++ b/crates/teksilo-theme-kde/tests/preset_metrics.rs @@ -22,6 +22,7 @@ use teksilo_canvas::{MockTextBackend, SizeProposal}; use teksilo_core::accessibility::target_audit::{ PIN_TOLERANCE, gate::ALL_DENSITIES, measure_targets, target_audit, }; +use teksilo_core::signal::Signal; use teksilo_core::styles::Theme; use teksilo_core::widget::Widget; use teksilo_core::widget_id::WidgetId; @@ -32,7 +33,10 @@ use teksilo_theme_kde::geometry::BreezeGeometry; use teksilo_theme_kde::{self as kde}; use teksilo_tokens::TargetDensity; use teksilo_widgets::primitives::IconWidget; -use teksilo_widgets::{Button, ButtonVariant, IconButton, IconButtonSize, MenuItem, SplitButton}; +use teksilo_widgets::{ + Button, ButtonVariant, Checkbox, IconButton, IconButtonSize, MenuItem, RadioButton, + SplitButton, TextInput, Toggle, +}; const SIZES_JSON: &str = include_str!(concat!( env!("CARGO_MANIFEST_DIR"), @@ -303,3 +307,180 @@ fn a_split_button_is_as_tall_as_a_push_button_at_every_density() { } } } + +// ── Check boxes and radio buttons ────────────────────────────────────── + +/// The row height a check box or radio button is raised to at `density`: +/// the density's target size, which the widgets' own minimum gives them. +const INDICATOR_ROWS: [(TargetDensity, f32); 3] = [ + (TargetDensity::Compact, 24.0), + (TargetDensity::Comfortable, 32.0), + (TargetDensity::Touch, 44.0), +]; + +/// Measure the indicator control `name` in a row holding `w`: its node, the +/// leading edge of its label from the node's, the painted 15 px box from the +/// node's corner, and the number of conformance failures. +/// +/// The row is laid out with no height proposed, so it takes its natural +/// height: in a taller one the widget fills the height it is given, whatever +/// the theme. +fn indicator_row( + theme: &Theme, + density: TargetDensity, + name: &str, + w: impl Widget + 'static, +) -> ((f32, f32), f32, [f32; 2], usize) { + let mut tree = WidgetTree::new() + .with_theme(theme.with_density(density)) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))); + let root = in_tappable_row(&mut tree, w); + tree.layout(SizeProposal { + width: Some(600.0), + height: None, + }); + let node = nodes_named(&tree, root, name); + assert_eq!(node.len(), 1, "one {name} in the row"); + let b = tree.bounds(node[0]); + let label = nodes_named(&tree, node[0], "TextWidget"); + assert_eq!(label.len(), 1, "one label"); + let label_x = tree.bounds(label[0]).x - b.x; + let failures = target_audit(&tree, density) + .into_iter() + .filter(|v| v.rule.is_conformance_failure()) + .count(); + let frame = tree.render(); + let painted = frame + .shapes + .iter() + .find(|s| (s.screen[2] - 15.0).abs() < 0.01 && (s.screen[3] - 15.0).abs() < 0.01) + .unwrap_or_else(|| panic!("{density:?}: no 15 px box painted")); + let at = [painted.screen[0] - b.x, painted.screen[1] - b.y]; + ((b.width, b.height), label_x, at, failures) +} + +/// D8. Qt lays a labelled Breeze check box out in a 22 px row, its 20 px +/// indicator 1 px down. The node here is the density's target size, 24 px at +/// Compact, raised by the widget's own minimum; the indicator is still +/// painted at 20 (its 15 px box at 2.5 inside it), now centred 2 px down, and +/// the label starts 24 px from the leading edge, as Qt measures it, at every +/// density. +#[test] +fn d8_a_check_box_row_is_raised_and_its_indicator_is_breezes() { + assert_eq!(qt_size("check_box", Some("Check")).1, 22.0, "Breeze's row"); + assert_eq!(qt_size("check_box.no_text", None), (20.0, 20.0)); + let qt_contents_x = 24.0; + for (density, row) in INDICATOR_ROWS { + for theme in themes() { + let ((_, h), label_x, at, failures) = indicator_row( + &theme, + density, + "Checkbox", + Checkbox::new(Signal::new(false)).label(lit!("Check")), + ); + assert_eq!(h, row, "{density:?}"); + assert_eq!(label_x, qt_contents_x, "{density:?}: the label"); + assert_eq!(at, [2.5, (row - 20.0) * 0.5 + 2.5], "{density:?}: the box"); + assert_eq!(failures, 0, "{density:?}: a conformance failure"); + } + } +} + +/// The radio button is the check box's twin: Qt's 22 px row raised the same +/// way, the same indicator, the label at 24. +#[test] +fn d8_a_radio_button_row_is_raised_and_its_indicator_is_breezes() { + assert_eq!(qt_size("radio_button", Some("Radio")).1, 22.0); + assert_eq!(qt_size("radio_button.no_text", None), (20.0, 20.0)); + for (density, row) in INDICATOR_ROWS { + for theme in themes() { + let ((_, h), label_x, at, failures) = indicator_row( + &theme, + density, + "RadioButton", + RadioButton::new(0, Signal::new(1_usize)).label(lit!("Radio")), + ); + assert_eq!(h, row, "{density:?}"); + assert_eq!(label_x, 24.0, "{density:?}: the label"); + assert_eq!(at, [2.5, (row - 20.0) * 0.5 + 2.5], "{density:?}: the disc"); + assert_eq!(failures, 0, "{density:?}: a conformance failure"); + } + } +} + +// ── Switches ─────────────────────────────────────────────────────────── + +/// The switch's 36 x 18 indicator is painted unchanged, its 36 x 12 track +/// centred, in a node raised to the density's target on both axes. +#[test] +fn a_switch_paints_its_indicator_in_a_node_at_the_target_size() { + for (density, node) in [ + (TargetDensity::Compact, (36.0, 24.0)), + (TargetDensity::Comfortable, (36.0, 32.0)), + (TargetDensity::Touch, (44.0, 44.0)), + ] { + for theme in themes() { + let (mut tree, root) = in_a_row(&theme, density, Toggle::new(Signal::new(true))); + let toggle = nodes_named(&tree, root, "Toggle"); + assert_eq!(toggle.len(), 1); + let b = tree.bounds(toggle[0]); + assert_eq!((b.width, b.height), node, "{density:?}"); + assert_eq!( + target_audit(&tree, density) + .into_iter() + .filter(|v| v.rule.is_conformance_failure()) + .count(), + 0, + "{density:?}: a conformance failure" + ); + let frame = tree.render(); + let track = frame + .shapes + .iter() + .find(|s| s.stroke_width == 0.0 && s.screen[2] == 36.0 && s.screen[3] == 12.0) + .unwrap_or_else(|| panic!("{density:?}: no 36 x 12 track")); + assert_eq!( + [track.screen[0] - b.x, track.screen[1] - b.y], + [(node.0 - 36.0) * 0.5, (node.1 - 12.0) * 0.5], + "{density:?}: centred" + ); + } + } +} + +// ── Text fields ──────────────────────────────────────────────────────── + +/// A text field's frame is 32 px at Compact, Qt's line edit, rising to the +/// density's target size above it (32 already clears Comfortable's 32, and +/// Touch makes it 44). +#[test] +fn a_text_field_measures_breezes_line_edit_at_every_density() { + assert_eq!(qt_size("line_edit", None).1, 32.0); + let g = BreezeGeometry::breeze_default(); + assert_eq!(g.line_edit_height, 32.0); + for (density, height) in [ + (TargetDensity::Compact, 32.0), + (TargetDensity::Comfortable, 32.0), + (TargetDensity::Touch, 44.0), + ] { + for theme in themes() { + let (tree, root) = + in_a_row(&theme, density, TextInput::new(Signal::new(String::new()))); + let input = nodes_named(&tree, root, "TextInput"); + assert_eq!(input.len(), 1); + // The framed field is the first child of the composite's root, + // above the validation strip it reserves. + let composite = tree.children(input[0])[0]; + let frame = tree.children(composite)[0]; + assert_eq!(tree.bounds(frame).height, height, "{density:?}"); + assert_eq!( + target_audit(&tree, density) + .into_iter() + .filter(|v| v.rule.is_conformance_failure()) + .count(), + 0, + "{density:?}: a conformance failure" + ); + } + } +} diff --git a/crates/teksilo-theme-kde/tests/row_hit.rs b/crates/teksilo-theme-kde/tests/row_hit.rs new file mode 100644 index 000000000..1f2f926c3 --- /dev/null +++ b/crates/teksilo-theme-kde/tests/row_hit.rs @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! A check box inside a list row is ticked by a press where its box is +//! painted. +//! +//! The Breeze check box paints its 20 px indicator unchanged inside a node +//! the widget raises to the density's target size, and lays its body out +//! 18 px wide so its label lands where Breeze puts it. Either could leave +//! the painted box outside the node that takes the press, or under another +//! part of the row. The press here aims at the centre of the box as it is +//! painted, read from the render frame, not at the centre of a node, in a +//! selected row (whose selection is painted over the row) and an unselected +//! one, at the Compact density and at Touch. + +use std::cell::RefCell; +use std::rc::Rc; + +use teksilo_canvas::{MockTextBackend, Point, SizeProposal}; +use teksilo_core::event::{Modifiers, PointerButton, WidgetEvent}; +use teksilo_core::signal::Signal; +use teksilo_core::widget_tree::WidgetTree; +use teksilo_i18n::lit; +use teksilo_tokens::TargetDensity; +use teksilo_widgets::StandardListItem; + +/// A Breeze list row carrying a checkbox, laid out at `density`. +fn row(density: TargetDensity, checked: &Signal, selected: bool) -> WidgetTree { + let mut tree = WidgetTree::new() + .with_theme(teksilo_theme_kde::light().with_density(density)) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))); + tree.add( + StandardListItem::new(lit!("Row")) + .checkbox(checked.clone()) + .selected(Signal::new(selected)), + ); + tree.layout(SizeProposal::exact(400.0, 300.0)); + tree +} + +/// The centre of the 15 px box the check box painted. +fn painted_box_centre(tree: &mut WidgetTree) -> Point { + let frame = tree.render(); + let boxes: Vec<[f32; 4]> = frame + .shapes + .iter() + .map(|s| s.screen) + .filter(|s| (s[2] - 15.0).abs() < 0.01 && (s[3] - 15.0).abs() < 0.01) + .collect(); + assert!(!boxes.is_empty(), "the row paints a 15 px box"); + let b = boxes[0]; + Point::new(b[0] + b[2] * 0.5, b[1] + b[3] * 0.5) +} + +/// A mouse press at the centre of the painted box ticks it, and a second +/// one clears it. +/// +/// Asserts the check box's own signal, never the row's: the row answers a +/// press that never reached the check box, so a row-level assertion is +/// satisfied by the defect. +#[test] +fn a_press_on_the_painted_box_ticks_it_in_a_breeze_row() { + for selected in [false, true] { + for density in [TargetDensity::Compact, TargetDensity::Touch] { + let checked = Signal::new(false); + let mut tree = row(density, &checked, selected); + for expected in [true, false] { + let at = painted_box_centre(&mut tree); + tree.pointer_move(at); + tree.dispatch_event(WidgetEvent::pointer_down( + at, + PointerButton::Primary, + Modifiers::default(), + )); + tree.dispatch_event(WidgetEvent::pointer_up( + at, + PointerButton::Primary, + Modifiers::default(), + )); + assert_eq!( + checked.get(), + expected, + "a press at the painted box (selected: {selected}) at \ + {density:?} did not reach the check box", + ); + tree.layout(SizeProposal::exact(400.0, 300.0)); + } + } + } +} + +/// The painted box lies inside the check box's own node at both densities, +/// so the press above lands on the check box rather than near it. +#[test] +fn the_painted_box_lies_inside_the_check_box_node() { + use teksilo_core::accessibility::target_audit::measure_targets; + for selected in [false, true] { + for density in [TargetDensity::Compact, TargetDensity::Touch] { + let checked = Signal::new(false); + let mut tree = row(density, &checked, selected); + let node = measure_targets(&tree, density) + .into_iter() + .find(|m| m.widget.ends_with("Checkbox") && m.part.is_none()) + .unwrap_or_else(|| panic!("the row builds a check box at {density:?}")); + let b = tree.bounds(node.node); + let at = painted_box_centre(&mut tree); + let inside = |p: Point, half: f32| { + p.x - half >= b.x + && p.x + half <= b.x + b.width + && p.y - half >= b.y + && p.y + half <= b.y + b.height + }; + assert!( + inside(at, 7.5), + "the box around {at:?} leaves the check box node {b:?} at \ + {density:?} (selected: {selected})" + ); + } + } +} diff --git a/crates/teksilo-theme-kde/tests/text_input_min_height.rs b/crates/teksilo-theme-kde/tests/text_input_min_height.rs new file mode 100644 index 000000000..d7c8e2c9b --- /dev/null +++ b/crates/teksilo-theme-kde/tests/text_input_min_height.rs @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! `TextInput::min_height` reaches this preset's field: its style replaces +//! the Breeze line edit's height with the one the app asked for. + +use teksilo_canvas::SizeProposal; +use teksilo_core::signal::Signal; +use teksilo_core::widget_tree::WidgetTree; +use teksilo_widgets::TextInput; +use teksilo_widgets::primitives::VStack; + +/// The framed field's height: the first child of the composite's root. +fn frame_height(input: TextInput) -> f32 { + let mut tree = WidgetTree::new().with_theme(teksilo_theme_kde::light()); + // In a `VStack`, so the composite is laid out at the height it asks for. + let id = tree.add(VStack::new().child(input)); + tree.layout(SizeProposal::exact(300.0, 200.0)); + let input_id = tree.children(id)[0]; + let root = tree.children(input_id)[0]; + let frame = tree.children(root)[0]; + tree.bounds(frame).height +} + +fn input() -> TextInput { + TextInput::new(Signal::new(String::new())) +} + +fn small_style() -> teksilo_tokens::TextStyle { + teksilo_tokens::TextStyle { + family: "Inter".to_string(), + size: 11.0, + weight: teksilo_tokens::FontWeight::REGULAR, + line_height: 1.3, + letter_spacing: 0.0, + } +} + +/// Without one, the field is Breeze's 32 px line edit. +#[test] +fn the_field_is_the_breeze_line_edit_by_default() { + assert_eq!(frame_height(input()), 32.0); +} + +/// Below the line edit's height: only the style can stand in the way there, +/// since the widget's floor already follows the app's value. +#[test] +fn an_apps_min_height_replaces_the_presets_height() { + let preset = frame_height(input()); + let asked = 23.0; + assert!(asked < preset, "the preset's height is {preset}"); + let short = frame_height(input().text_style(small_style()).min_height(asked)); + assert!( + (short - asked).abs() < 0.01, + "asked for {asked}, got {short}" + ); +} + +/// Above it too. +#[test] +fn a_taller_min_height_raises_the_field() { + let tall = frame_height(input().min_height(40.0)); + assert!((tall - 40.0).abs() < 0.01, "asked for 40, got {tall}"); +} From 7e360cbee1f45449ec6cb28acc90f1d8eb95d65c Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 17:44:12 +0200 Subject: [PATCH 24/59] feat(theme-kde): paint the combo box, spin box and slider as Breeze does The preset installs three more structural styles: combo_box, spin_box and slider. The three slots leave KDE_UNFILLED. Their dimensions are in styles::metrics (BreezeComboMetrics, BreezeSpinMetrics and the slider constants), and the combo and spin arrows share one painter, styles::arrow, the 10 px chevron of spec k.5.17: ends a quarter and three quarters across the square on its centre line, apex a quarter of the side away, 1 px pen, square caps, mitre join, nudged along the way it points by 0.5 for a side of 10, in the arrow colour of a text role (the text moved 15 % toward its background). Combo box, spec k.4 and k.5.4: the push button frame of P2, "pressed" meaning the popup is open, 32 px at Compact through dp(.., Target), the label 6 px inside the leading edge, the arrow centred in a 20 px box 2 px inside the trailing edge, the label plus 38 px when no width is proposed (gaps through spacing(), the box and the margin fixed), mirrored right to left. The arrow is the arrow colour of the button text, the window text while keyboard focused and not hovered, the disabled colours when disabled. Keyboard focus adds the 2 px focus frame (D5), as on buttons. Underline draws the line edit's bottom edge and Plain no frame, both [unpublished]. Spin box, spec k.4 and k.5.5: the line edit frame of P3 (D6 outline at rest, D5 focus, the hover colour while the pointer is over any part), the field 6 px inside the leading edge, a 20 px column 2 px inside the trailing edge, min(inner height, 20) tall and centred, split into halves of floor(h / 2): 20 x 10 and 20 x 10 at every density, as Qt's sub rectangles at (78, 6) and (78, 16) of a 100 x 32 spin box. The SpinBox's own step buttons are placed on those halves, so they keep their press and hold-to-repeat; their chrome is painted at zero opacity and the style draws the chevrons, in the arrow colour of the view text, the hover colour on the half under the pointer, with no button chrome. The halves are the only conformance failures the row reports; the Equivalent pin is left to P12. Slider, spec k.4 and k.5.10: 20 thick, the 6 px groove the full length, filled and stroked on itself inset by half the pen at radius 3, the window text at 0.14 over the window outlined in the window text at fc, and from the minimum to the handle centre the highlight at 0.7 outlined in the highlight at fc; the 20 px handle box placed by the value over the length less 20, painted as a 17 px circle in the button colour with a 1 px outline (focus over hover over rest) and a shadow ring at its bottom right unless dragged; disabled, only the groove's background in the disabled colours. Tick marks are 1 px lines 8 long, 2 px from the groove, 23 thick in all, the highlight up to the value. thumb_diameter and thumb_diameter_for are the 20 px box at every density, the travel the Slider maps the pointer over; the node is raised to the target across the groove (24, 32, 44) and is 84 long when unbounded, Qt's size hint. Right to left the handle, fill and ticks mirror. A vertical groove is filled from its top down to the handle, as k.5.10 says Breeze fills a vertical slider that is not inverted; a Slider puts a vertical slider's minimum at the bottom, as Qt does, so the fill is on the maximum side. Departures, documented in each module: D6 lifts the slider handle's outline at rest to border_strong and the ticks to border_strong and the lifted highlight; the handle outlines in the hover colour while the pointer is anywhere on the slider (the style is told only that); ticks are drawn below or to the right, a Slider naming no side; the spin box's 20 x 10 halves are under the 24 px target size, the value reachable by keyboard, wheel and AT actions. The styles are not told a spin box's limits or a combo box's item count, so an arrow at the limit and the arrow of an empty combo box keep their colour. The crate's known limitations list the arrows, the spin box halves, the tick side and the slider's hover. BreezeFieldChrome gains a public constructor, used by the spin box and the Underline combo box. Tests: unit tests of the arrow points against Plasma's pixels, the arrow colours, the combo arrow box and spin halves at Qt's sub rectangles and right to left, the slider geometry against Qt's groove and handle rectangles, its travel, RTL, the vertical fill from the top and tick placement, its Breeze Light colours against pixels.json, the D6 lifts and their premises, and the palette-less fallbacks; tests/mount.rs mounts every variant and state, light and dark, in the swap, the palette-less and the swatch tests, and checks the combo face, outline, shadow, arrow, hover and focus outline, focused arrow and focus frame, and the mirrored arrow and label; the spin fill, lifted outline, the two arrows and nothing else, the step buttons on the halves, the hovered half and frame and a press stepping the value, the disabled colours and the mirrored column; the slider groove, fill, handle face, lifted outline and shadow ring against pixels.json, hover, focus outline and focus frame, no shadow while dragged, the disabled slider, right to left the mirrored handle and fill, a press putting the painted handle under the pointer, and the mirrored ticks, and a vertical slider's fill from the top to the handle and its press. tests/preset_metrics.rs measures the combo box, spin box (with its two halves) and slider (with and without ticks, both orientations) at all three densities against sizes.json, with the conformance gate. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 16 +- crates/teksilo-theme-kde/src/lib.rs | 47 +- crates/teksilo-theme-kde/src/styles.rs | 11 +- crates/teksilo-theme-kde/src/styles/arrow.rs | 159 ++++ .../teksilo-theme-kde/src/styles/combo_box.rs | 381 +++++++++ .../teksilo-theme-kde/src/styles/metrics.rs | 190 ++++- crates/teksilo-theme-kde/src/styles/slider.rs | 773 ++++++++++++++++++ .../teksilo-theme-kde/src/styles/spin_box.rs | 483 +++++++++++ .../src/styles/text_input.rs | 37 +- crates/teksilo-theme-kde/tests/mount.rs | 746 ++++++++++++++++- .../teksilo-theme-kde/tests/preset_metrics.rs | 160 +++- 11 files changed, 2966 insertions(+), 37 deletions(-) create mode 100644 crates/teksilo-theme-kde/src/styles/arrow.rs create mode 100644 crates/teksilo-theme-kde/src/styles/combo_box.rs create mode 100644 crates/teksilo-theme-kde/src/styles/slider.rs create mode 100644 crates/teksilo-theme-kde/src/styles/spin_box.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d25721bb..2947cca0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -164,10 +164,18 @@ by crate for clarity, not because crates version independently. a 36 px track, moving and changing colour on the curves KDE uses. A `TextInput` is the line edit, 32 px tall at Plasma's default font, its 1 px outline turning to the focus colour while it has focus, and it - honours `TextInput::min_height`. The outlines of an empty check box, - radio button and field, and of a switch on or off, are strengthened to a - 3:1 contrast, keeping their hue. Other widgets draw Teksilo's own chrome - in these colours and shapes. + honours `TextInput::min_height`. A `ComboBox` is the push button with a + chevron at its trailing edge, 32 px tall at Plasma's default font, filled + toward the highlight while its list is open. A `SpinBox` is the line edit + with a 20 px column of two arrows and no buttons drawn, each arrow taking + the hover colour under the pointer. A `Slider` is Breeze's 6 px groove, + filled toward the highlight up to a 17 px round handle in the button + colour, with tick marks below it when it has a tick count, mirrored right + to left; its node grows to the density's target size. The outlines of an + empty check box, radio button and field, of a switch on or off and of a + slider's handle, and a slider's tick marks, are strengthened to a 3:1 + contrast, keeping their hue. Other widgets draw Teksilo's own chrome in + these colours and shapes. #### Platform diff --git a/crates/teksilo-theme-kde/src/lib.rs b/crates/teksilo-theme-kde/src/lib.rs index f175a5d10..309290a26 100644 --- a/crates/teksilo-theme-kde/src/lib.rs +++ b/crates/teksilo-theme-kde/src/lib.rs @@ -47,7 +47,11 @@ //! marked in the view's text when checked, its label 24 px from its //! leading edge; a switch is a handle as tall as its 36 x 18 indicator //! riding a 12 px track; a text field is a flat view-coloured frame whose -//! 1 px outline turns to the focus colour while it has focus. Other +//! 1 px outline turns to the focus colour while it has focus. A combo box +//! is the push button with a chevron 2 px inside its trailing edge, a +//! spin box the line edit with a column of two chevrons and no buttons +//! drawn, and a slider a 6 px groove filled toward the highlight up to a +//! 17 px round handle in the button colour. Other //! controls are outlined in the window colour moved the same way toward //! the text, the `border` token; the highlight-based outlines are in //! [`BreezeColors`]. @@ -102,9 +106,24 @@ //! //! - **Most widget chrome is the framework's.** This version installs //! Breeze styles for `Button`, `IconButton`, `SplitButton`, `Toggle`, -//! `Checkbox`, `RadioButton` and `TextInput` only: every other widget -//! keeps Teksilo's recipe style, painted in the Breeze colours, radii, -//! focus ring, typography and motion. +//! `Checkbox`, `RadioButton`, `TextInput`, `ComboBox`, `SpinBox` and +//! `Slider` only: every other widget keeps Teksilo's recipe style, painted +//! in the Breeze colours, radii, focus ring, typography and motion. +//! - **A spin box's arrows keep their colour at the limit**, and an empty +//! combo box's arrow is not greyed: the styles are not told the value's +//! limits or the item count ([`styles::spin_box`], +//! [`styles::combo_box`]). +//! - **A spin box's two arrow halves are 20 x 10**, Breeze's geometry, +//! under WCAG 2.2 SC 2.5.8's 24 px at every density; the value is also +//! reachable with the arrow and page keys, the mouse wheel and the +//! assistive Increment and Decrement actions ([`styles::spin_box`]). +//! - **A slider's tick marks are on a fixed side**, below a horizontal +//! slider and to the right of a vertical one: Breeze draws them on the +//! side the application asks for, and a `Slider` names none +//! ([`styles::slider`]). +//! - **A slider's handle is outlined in the hover colour while the pointer +//! is anywhere on the slider**, not only over the handle, and is +//! outlined at 3:1 at rest (D6, [`styles::slider`]). //! - **A check box or radio button row is 24 px, not 22.** Breeze's row is //! the label's line box plus 4 px; the widgets keep their 24 px minimum, //! WCAG 2.2's target size, and paint the 20 px indicator unchanged in it @@ -278,8 +297,9 @@ fn project(theme: &Theme, state: PaintState) -> Theme { /// Install the Breeze Tier-3 chrome. /// -/// The buttons, the check box, the radio button, the switch and the line -/// edit are Breeze's own ([`styles`]); every other slot is left to +/// The buttons, the check box, the radio button, the switch, the line edit, +/// the combo box, the spin box and the slider are Breeze's own +/// ([`styles`]); every other slot is left to /// the widget's recipe style, which paints from the Breeze tokens, and the /// crate's tests list the reason for each. Every style installed here reads /// its metrics from the theme it builds under, `theme.input` included, so @@ -293,6 +313,9 @@ fn install_styles(theme: &mut Theme) { slots.checkbox = Some(Rc::new(styles::checkbox::BreezeCheckboxStyle)); slots.radio = Some(Rc::new(styles::radio::BreezeRadioStyle)); slots.text_input = Some(Rc::new(styles::text_input::BreezeTextInputStyle)); + slots.combo_box = Some(Rc::new(styles::combo_box::BreezeComboBoxStyle)); + slots.spin_box = Some(Rc::new(styles::spin_box::BreezeSpinBoxStyle)); + slots.slider = Some(Rc::new(styles::slider::BreezeSliderStyle)); } #[cfg(test)] @@ -496,14 +519,6 @@ mod tests { "radio_tile", "Breeze has no selectable card; the recipe surface reads the preset's surface and accent roles", ), - ( - "slider", - "no Breeze slider is installed; the recipe track and knob read the Breeze accent and border tokens", - ), - ( - "combo_box", - "no Breeze combo box is installed; the recipe paints from the Breeze field and border tokens", - ), ( "menu_item", "no Breeze menu row is installed; the recipe row paints its highlight from the Breeze selection tokens", @@ -584,10 +599,6 @@ mod tests { "color_picker", "Breeze has no in-window colour picker chrome; the recipe reads the theme roles", ), - ( - "spin_box", - "no Breeze spin box is installed; the recipe frames the field and step buttons in the Breeze roles", - ), ( "date_edit", "the recipe is a passthrough around the TextInput, which this preset frames as Breeze's line edit", diff --git a/crates/teksilo-theme-kde/src/styles.rs b/crates/teksilo-theme-kde/src/styles.rs index 4ea80df47..a6d8e8a73 100644 --- a/crates/teksilo-theme-kde/src/styles.rs +++ b/crates/teksilo-theme-kde/src/styles.rs @@ -16,18 +16,27 @@ //! switch, a handle as tall as its track's indicator, which share their //! colours through [`indicator`]; //! - the line edit, a view-coloured frame whose outline turns to the focus -//! colour, in [`text_input`]. +//! colour, in [`text_input`]; +//! - the combo box, a push button with a chevron at its trailing edge, and +//! the spin box, a line edit with a column of two chevrons, which share +//! the chevron, [`arrow`]; +//! - the slider, a 6 px groove filled toward the highlight up to a 17 px +//! round handle, in [`slider`]. //! //! The dimensions they are built with, all derived from [`crate::geometry`] //! and the density ladder, are collected in [`metrics`]. +pub mod arrow; pub mod button; pub mod checkbox; pub mod chrome; +pub mod combo_box; pub mod icon_button; pub mod indicator; pub mod metrics; pub mod radio; +pub mod slider; +pub mod spin_box; pub mod split_button; pub mod text_input; pub mod toggle; diff --git a/crates/teksilo-theme-kde/src/styles/arrow.rs b/crates/teksilo-theme-kde/src/styles/arrow.rs new file mode 100644 index 000000000..9704e97b1 --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/arrow.rs @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze arrow: the chevron a combo box and a spin box draw. +//! +//! A polyline in a square of side `min(width, height, 10)` centred in the +//! box it is drawn in. Its two ends lie a quarter and three quarters of the +//! way across the square, on its centre line, and its apex on the square's +//! other centre line, a quarter of the side away from the ends, so the arms +//! meet at a right angle. It is drawn with a 1 px pen, square caps and a +//! mitred join, and moved along the way it points by -0.25, +0.5 or +//! +0.25 px when the side is 1, 2 or 3 more than a multiple of four, which +//! puts the apex on a pixel. +//! +//! An arrow is drawn in the arrow colour of a text role: that text moved +//! 15 % of the way toward its background. + +use teksilo_canvas::{Canvas, LineCap, LineJoin, Path, Point, Rect, StrokeStyle}; +use teksilo_tokens::Color; + +use crate::geometry::ARROW_SIZE; +use crate::styles::chrome::kde_mix; + +/// `[Hp]` How far an arrow's colour moves from its text toward the text's +/// background. +pub const ARROW_TOWARD_BACKGROUND: f64 = 0.15; + +/// `[Hp]` The pen an arrow is drawn with. +pub const ARROW_PEN: f32 = 1.0; + +/// Which way an arrow points. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ArrowDirection { + /// Up, the spin box's step up. + Up, + /// Down, the combo box's arrow and the spin box's step down. + Down, +} + +/// `[Hp]` The side of the square an arrow is drawn in inside `rect`. +pub fn arrow_side(rect: Rect) -> f32 { + rect.width.min(rect.height).clamp(0.0, ARROW_SIZE) +} + +/// `[Hp]` How far an arrow of side `side` is moved along the way it points, +/// so that its apex lands on a pixel. +pub fn arrow_nudge(side: f32) -> f32 { + match (side.round() as i64).rem_euclid(4) { + 1 => -0.25, + 2 => 0.5, + 3 => 0.25, + _ => 0.0, + } +} + +/// `[Hp]` The three points of an arrow pointing `direction` centred in +/// `rect`: the leading end, the apex and the trailing end. +/// +/// `[measured-qt]` The nudge moves an up arrow up and a down arrow down: +/// Plasma's spin box puts the ends of its up arrow half a pixel above the +/// centre of its half and those of its down arrow half a pixel below. +pub fn arrow_points(rect: Rect, direction: ArrowDirection) -> [Point; 3] { + let s = arrow_side(rect); + let cx = rect.x + rect.width * 0.5; + let cy = rect.y + rect.height * 0.5; + let quarter = s * 0.25; + let (ends, apex) = match direction { + ArrowDirection::Down => { + let ends = cy + arrow_nudge(s); + (ends, ends + quarter) + } + ArrowDirection::Up => { + let ends = cy - arrow_nudge(s); + (ends, ends - quarter) + } + }; + [ + Point::new(cx - quarter, ends), + Point::new(cx, apex), + Point::new(cx + quarter, ends), + ] +} + +/// The arrow colour of the text `text` on `background`. +pub fn arrow_color(text: Color, background: Color) -> Color { + kde_mix(text, background, ARROW_TOWARD_BACKGROUND) +} + +/// Draw an arrow pointing `direction` centred in `rect` in `color`. +pub fn paint_arrow(canvas: &mut Canvas, rect: Rect, direction: ArrowDirection, color: Color) { + if color.a() <= 0.0 || arrow_side(rect) <= 0.0 { + return; + } + let [a, b, c] = arrow_points(rect, direction); + let mut path = Path::new(); + path.move_to(a); + path.line_to(b); + path.line_to(c); + let mut style = StrokeStyle::solid(ARROW_PEN); + style.line_cap = LineCap::Square; + style.line_join = LineJoin::Miter; + canvas.stroke_path(&path, color, style); +} + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_kde_scheme::KdeColor; + + fn xy(p: Point) -> [f32; 2] { + [p.x, p.y] + } + + /// The combo box's arrow, in its 20 px box at (128, 6) of a 150 x 32 + /// combo box: its ends on pixel row 16, five pixels apart, as Plasma + /// paints them, and its apex 2.5 px below. + #[test] + fn the_combo_arrow_lies_where_plasma_paints_it() { + let p = arrow_points(Rect::new(128.0, 6.0, 20.0, 20.0), ArrowDirection::Down); + assert_eq!(p.map(xy), [[135.5, 16.5], [138.0, 19.0], [140.5, 16.5]]); + } + + /// The spin box's two arrows, in the 20 x 10 halves at (78, 6) and + /// (78, 16) of a 100 x 32 spin box: the ends on pixel rows 10 and 21. + #[test] + fn the_spin_arrows_lie_where_plasma_paints_them() { + let up = arrow_points(Rect::new(78.0, 6.0, 20.0, 10.0), ArrowDirection::Up); + assert_eq!(up.map(xy), [[85.5, 10.5], [88.0, 8.0], [90.5, 10.5]]); + let down = arrow_points(Rect::new(78.0, 16.0, 20.0, 10.0), ArrowDirection::Down); + assert_eq!(down.map(xy), [[85.5, 21.5], [88.0, 24.0], [90.5, 21.5]]); + } + + #[test] + fn the_side_is_at_most_ten_and_the_nudge_follows_it() { + assert_eq!(arrow_side(Rect::new(0.0, 0.0, 20.0, 20.0)), 10.0); + assert_eq!(arrow_side(Rect::new(0.0, 0.0, 20.0, 7.0)), 7.0); + assert_eq!(arrow_nudge(10.0), 0.5); + assert_eq!(arrow_nudge(9.0), -0.25); + assert_eq!(arrow_nudge(7.0), 0.25); + assert_eq!(arrow_nudge(8.0), 0.0); + } + + #[test] + fn the_arms_meet_at_a_right_angle() { + let [a, b, c] = arrow_points(Rect::new(0.0, 0.0, 20.0, 20.0), ArrowDirection::Down); + let (u, v) = ((a.x - b.x, a.y - b.y), (c.x - b.x, c.y - b.y)); + assert!((u.0 * v.0 + u.1 * v.1).abs() < 1e-6); + } + + /// Breeze Light's combo arrow: the button text moved 15 % toward the + /// button colour. + #[test] + fn the_arrow_colour_moves_the_text_toward_its_background() { + let text = Color::from_hex("#232629"); + let button = Color::from_hex("#FCFCFC"); + let c = KdeColor::from_color(arrow_color(text, button)).to_rgba8(); + assert_eq!(c, [68, 70, 73, 255]); + } +} diff --git a/crates/teksilo-theme-kde/src/styles/combo_box.rs b/crates/teksilo-theme-kde/src/styles/combo_box.rs new file mode 100644 index 000000000..812673c52 --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/combo_box.rs @@ -0,0 +1,381 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze combo box. +//! +//! A combo box that cannot be typed into is a push button with an arrow: +//! the push button's frame, face, outline and shadow +//! ([`crate::styles::chrome`]), with "pressed" meaning the popup is open, so +//! an open combo box is filled 30 % toward the highlight and casts no +//! shadow. Its arrow is a 10 px chevron ([`crate::styles::arrow`]) centred in +//! a 20 px box at the trailing edge, 2 px inside it (the frame margin), +//! drawn in the arrow colour of the button text: the button text moved 15 % +//! toward the button colour. While the combo box has keyboard focus and the +//! pointer is not over it the arrow is the window text. The arrow does not +//! change under the pointer, as in Breeze. +//! +//! The combo box is `max(H, 20)` plus the 6 px frame above and below, 32 px +//! at Plasma's default font, through the density ladder, and its label +//! starts 6 px inside the leading edge. It is Breeze's width rule, the label +//! plus 38 px, when nothing proposes a width: the 6 px frame on both sides +//! of the label, the 20 px arrow box and 6 more, laid out as 6 px before the +//! label, 10 px between it and the arrow box and the 2 px frame margin after +//! it ([`crate::styles::metrics::BreezeComboMetrics`]). The gaps scale with +//! the density's spacing; the arrow box and the frame margin are painted +//! and do not. Right to left, the arrow box is at the left edge. +//! +//! ## Where this departs from Breeze +//! +//! - **D5, keyboard focus.** As on a push button, keyboard focus adds the +//! 2 px focus frame in the opaque `focus_ring` token, from 1 px inside to +//! 1 px outside the node, besides the highlight outline Breeze draws. +//! - **An empty combo box keeps its arrow colour.** Breeze draws the arrow +//! of a combo box with no items in the disabled colours; the style is not +//! told how many items there are, so only a disabled combo box's arrow is +//! in them. +//! +//! ## Variants +//! +//! Breeze has one combo box that cannot be typed into. `Outlined` and +//! `Filled` are it. `Underline` (`[unpublished]`) draws only the bottom edge +//! of a line edit's outline, in its rest, hover and focus colours, the +//! popup counting as focus; `Plain` (`[unpublished]`) draws no frame, for a +//! combo box whose surroundings are its frame. Both keep the arrow and the +//! metrics. + +use teksilo_canvas::{Canvas, Point, Rect, Size, SizeProposal}; +use teksilo_core::accessibility::AccessNodeBuilder; +use teksilo_core::binding::BindingLevel; +use teksilo_core::build_context::BuildContext; +use teksilo_core::signal::Signal; +use teksilo_core::styles::{ + ComboBoxStyle, ComboBoxStyleConfig, ComboBoxVariant, TextInputValidationLevel, Theme, +}; +use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement}; +use teksilo_core::widget_id::WidgetId; +use teksilo_kde_scheme::ColorState; +use teksilo_tokens::Color; + +use crate::palette::KdePalette; +use crate::styles::arrow::{ArrowDirection, arrow_color, paint_arrow}; +use crate::styles::chrome::{BreezeButtonChrome, BreezeButtonKind, BreezeButtonState}; +use crate::styles::metrics::{BreezeComboMetrics, breeze_combo_metrics_for}; +use crate::styles::text_input::BreezeFieldChrome; + +/// Breeze `ComboBoxStyle`. +#[derive(Debug, Default, Clone, Copy)] +pub struct BreezeComboBoxStyle; + +impl ComboBoxStyle for BreezeComboBoxStyle { + fn make_body(&self, cfg: &ComboBoxStyleConfig, ctx: &mut BuildContext) -> WidgetId { + let theme = ctx.theme(); + let metrics = breeze_combo_metrics_for(&theme.input, &theme.typography); + let chrome = match cfg.variant { + ComboBoxVariant::Outlined | ComboBoxVariant::Filled => { + // `[Hp]` The push button, the open popup standing for the + // press. The combo box's focus signal is already its + // `:focus-visible` one. + let state = BreezeButtonState::derive( + &cfg.is_disabled, + &cfg.is_open, + &cfg.is_hovered, + &cfg.is_focused, + ); + let show_focus_frame = cfg + .is_focused + .zip(&cfg.is_disabled) + .map(|(focused, disabled)| *focused && !*disabled); + Some(ctx.add(BreezeButtonChrome::new( + BreezeButtonKind::Push, + state, + show_focus_frame, + ))) + } + ComboBoxVariant::Underline => Some(ctx.add(BreezeFieldChrome::new( + cfg.is_focused.or(&cfg.is_open), + cfg.is_hovered.clone(), + cfg.is_disabled.clone(), + Signal::new(TextInputValidationLevel::None), + true, + ))), + ComboBoxVariant::Plain => None, + }; + let arrow = ctx.add(BreezeComboArrow { + is_focused: cfg.is_focused.clone(), + is_hovered: cfg.is_hovered.clone(), + is_disabled: cfg.is_disabled.clone(), + }); + ctx.add(BreezeComboLayout { + metrics, + chrome, + label: cfg.selected_label, + arrow, + }) + } +} + +/// `[Hp]` The colour of a combo box's arrow in `theme`, as it paints in a +/// window that is or is not active, with or without the high-contrast +/// preference, focused or not, enabled or not. +/// +/// The arrow colour of the button text, or the window text while focused +/// (and not under the pointer, which the caller decides), or the arrow +/// colour of the disabled button text. Without a [`KdePalette`] the primary +/// text and the content surface stand in for the button text and colour. +pub fn combo_arrow_color( + theme: &Theme, + window_active: bool, + high_contrast: bool, + focused: bool, + disabled: bool, +) -> Color { + let c = &theme.colors; + if focused && !disabled { + return c.text_primary; + } + let Some(palette) = theme.extension::() else { + return if disabled { + arrow_color(c.text_disabled, c.surface_disabled) + } else { + arrow_color(c.text_primary, c.surface_content) + }; + }; + let state = if disabled { + ColorState::Disabled + } else if window_active { + ColorState::Active + } else { + ColorState::Inactive + }; + let b = palette.breeze_colors(state, high_contrast); + arrow_color(b.button_text, b.button) +} + +/// `[S]` Where a combo box's arrow box lies in the node `bounds`: at the +/// trailing edge, inside the frame margin, centred vertically. +pub fn combo_arrow_rect(bounds: Rect, m: &BreezeComboMetrics, rtl: bool) -> Rect { + let x = if rtl { + bounds.x + m.padding_trailing + } else { + bounds.x + bounds.width - m.padding_trailing - m.arrow_box + }; + Rect::new( + x, + bounds.y + (bounds.height - m.arrow_box) * 0.5, + m.arrow_box, + m.arrow_box, + ) +} + +/// The arrangement of a Breeze combo box: the frame over the whole node, +/// the label after the leading inset, the arrow box at the trailing edge. +struct BreezeComboLayout { + metrics: BreezeComboMetrics, + chrome: Option, + label: WidgetId, + arrow: WidgetId, +} + +impl std::fmt::Debug for BreezeComboLayout { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeComboLayout") + .field("metrics", &self.metrics) + .finish() + } +} + +impl BreezeComboLayout { + /// The label's size when it is offered `width`. + fn label_size(&self, width: Option, ctx: &LayoutContext) -> Size { + ctx.child_size( + self.label, + SizeProposal { + width, + height: None, + }, + ) + .unwrap_or(Size::new(0.0, 0.0)) + } +} + +impl Widget for BreezeComboLayout { + fn build(&mut self, _ctx: &mut BuildContext) -> Vec { + self.children() + } + + fn children(&self) -> Vec { + self.chrome + .into_iter() + .chain([self.label, self.arrow]) + .collect() + } + + /// The label plus the chrome when nothing proposes a width, the + /// proposed width otherwise; the Breeze height, or the label's if it is + /// taller. + fn layout_response(&self, proposal: SizeProposal, ctx: &LayoutContext) -> LayoutResponse { + let chrome = self.metrics.chrome_width(); + let label = self.label_size(proposal.width.map(|w| (w - chrome).max(0.0)), ctx); + Size::new( + proposal.width.unwrap_or(label.width + chrome), + self.metrics.height.max(label.height), + ) + .into() + } + + fn place_children( + &self, + bounds: Rect, + _proposal: SizeProposal, + children: &mut [WidgetPlacement], + ctx: &LayoutContext, + ) { + let m = &self.metrics; + let rtl = ctx.is_rtl(); + let arrow = combo_arrow_rect(bounds, m, rtl); + let room = (bounds.width - m.chrome_width()).max(0.0); + let label = self.label_size(Some(room), ctx); + let label_width = label.width.min(room); + let label_x = if rtl { + bounds.x + bounds.width - m.padding_leading - label_width + } else { + bounds.x + m.padding_leading + }; + let label_rect = Rect::new( + label_x, + bounds.y + (bounds.height - label.height) * 0.5, + label_width, + label.height, + ); + for child in children.iter_mut() { + let rect = if Some(child.id) == self.chrome { + bounds + } else if child.id == self.label { + label_rect + } else { + arrow + }; + child.origin = Point::new(rect.x, rect.y); + child.size = Size::new(rect.width, rect.height); + } + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + // Layout only: the walker prunes it and the `ComboBox` names itself. + builder.set_role(teksilo_core::accesskit::Role::GenericContainer); + } +} + +/// The arrow of a Breeze combo box, painted in its 20 px box. +struct BreezeComboArrow { + is_focused: Signal, + is_hovered: Signal, + is_disabled: Signal, +} + +impl std::fmt::Debug for BreezeComboArrow { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeComboArrow").finish() + } +} + +impl Widget for BreezeComboArrow { + fn build(&mut self, ctx: &mut BuildContext) -> Vec { + let id = ctx.self_id(); + let registry = ctx.binding_registry(); + for s in [&self.is_focused, &self.is_hovered, &self.is_disabled] { + s.bind_to(id, registry, BindingLevel::RepaintOnly); + } + vec![] + } + + fn layout_response(&self, proposal: SizeProposal, _ctx: &LayoutContext) -> LayoutResponse { + proposal.resolve(0.0, 0.0).into() + } + + fn place_children( + &self, + _bounds: Rect, + _proposal: SizeProposal, + _children: &mut [WidgetPlacement], + _ctx: &LayoutContext, + ) { + } + + fn paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext) { + let color = combo_arrow_color( + ctx.theme, + ctx.window_active, + ctx.prefers_high_contrast, + self.is_focused.get() && !self.is_hovered.get(), + self.is_disabled.get(), + ); + paint_arrow(canvas, bounds, ArrowDirection::Down, color); + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + // Presentational: the `ComboBox` emits the real node. + builder.set_hidden(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::styles::metrics::breeze_combo_metrics; + use teksilo_kde_scheme::KdeColor; + + fn rgba8(c: Color) -> [u8; 4] { + KdeColor::from_color(c).to_rgba8() + } + + /// Plasma's 150 x 32 combo box puts its arrow box at (128, 6). + #[test] + fn the_arrow_box_is_where_qt_puts_it() { + let m = breeze_combo_metrics(); + let b = Rect::new(0.0, 0.0, 150.0, 32.0); + assert_eq!( + combo_arrow_rect(b, &m, false), + Rect::new(128.0, 6.0, 20.0, 20.0) + ); + assert_eq!( + combo_arrow_rect(b, &m, true), + Rect::new(2.0, 6.0, 20.0, 20.0), + "mirrored right to left" + ); + } + + /// The arrow is the arrow colour of the button text, and the window + /// text while focused, in Breeze Light. + #[test] + fn the_arrow_colours_are_breezes() { + let t = crate::light(); + let p = t.extension::().unwrap(); + let b = p.colors(ColorState::Active); + let rest = combo_arrow_color(&t, true, false, false, false); + assert_eq!(rest, arrow_color(b.button_text, b.button)); + assert_eq!(rgba8(rest), [68, 70, 73, 255]); + let focused = combo_arrow_color(&t, true, false, true, false); + assert_eq!(rgba8(focused), [35, 38, 41, 255]); + let d = p.colors(ColorState::Disabled); + assert_eq!( + combo_arrow_color(&t, true, false, true, true), + arrow_color(d.button_text, d.button), + "disabled wins over focus" + ); + } + + #[test] + fn a_theme_without_the_palette_paints_from_its_roles() { + let t = teksilo_core::presets::intui::light(); + let c = &t.colors; + assert_eq!( + combo_arrow_color(&t, true, false, false, false), + arrow_color(c.text_primary, c.surface_content) + ); + assert_eq!( + combo_arrow_color(&t, true, false, false, true), + arrow_color(c.text_disabled, c.surface_disabled) + ); + } +} diff --git a/crates/teksilo-theme-kde/src/styles/metrics.rs b/crates/teksilo-theme-kde/src/styles/metrics.rs index d503defc5..ae4701832 100644 --- a/crates/teksilo-theme-kde/src/styles/metrics.rs +++ b/crates/teksilo-theme-kde/src/styles/metrics.rs @@ -17,7 +17,9 @@ use teksilo_tokens::{InputTokens, TargetRole, TypographyTokens}; use crate::geometry::{ BUTTON_MARGIN_WIDTH, BreezeGeometry, CHECKBOX_FOCUS_MARGIN, CHECKBOX_ITEM_SPACING, - CHECKBOX_SIZE, FRAME_WIDTH, LARGE_ICON_SIZE, LINE_EDIT_FRAME_WIDTH, MEDIUM_ICON_SIZE, + CHECKBOX_SIZE, COMBO_BOX_FRAME_WIDTH, FRAME_WIDTH, LARGE_ICON_SIZE, LINE_EDIT_FRAME_WIDTH, + MEDIUM_ICON_SIZE, SLIDER_CONTROL_THICKNESS, SLIDER_GROOVE_THICKNESS, SLIDER_TICK_LENGTH, + SLIDER_TICK_MARGIN, SPIN_BOX_ARROW_BUTTON_WIDTH, SPIN_BOX_FRAME_WIDTH, TOOL_BUTTON_MARGIN_WIDTH, }; use crate::shape::BREEZE_PEN_WIDTH; @@ -221,6 +223,150 @@ pub fn breeze_tool_button_sizes() -> BreezeToolButtonSizes { breeze_tool_button_sizes_for(&InputTokens::default()) } +/// `[S]` The square a combo box's arrow is centred in, at the trailing edge +/// inside the 2 px frame margin. +pub const COMBO_ARROW_BOX: f32 = 20.0; +/// `[S]` What a combo box adds to its label's width: the 6 px frame on both +/// sides of the label, the arrow box, and 2 and 4 more. 38. +pub const COMBO_CHROME_WIDTH: f32 = 2.0 * COMBO_BOX_FRAME_WIDTH + COMBO_ARROW_BOX + 2.0 + 4.0; +/// `[derived]` The space between a combo box's label and its arrow box: the +/// chrome width less the leading frame, the arrow box and the trailing frame +/// margin. 10. +pub const COMBO_ARROW_GAP: f32 = + COMBO_CHROME_WIDTH - COMBO_BOX_FRAME_WIDTH - COMBO_ARROW_BOX - FRAME_WIDTH; +/// `[S]` The tallest a spin box's arrow column is, centred in the frame. +pub const SPIN_ARROW_MAX_HEIGHT: f32 = 20.0; + +/// `[Hp]` The radius of a slider's groove, on the groove inset by half the +/// pen. +pub const SLIDER_GROOVE_RADIUS: f32 = 3.0; +/// `[Hp]` How much of the window text a slider's groove is filled with over +/// the window: 0.2 times 0.7. +pub const SLIDER_GROOVE_ALPHA: f64 = 0.2 * 0.7; +/// `[Hp]` How much of the highlight fills the groove up to the handle, over +/// the window. +pub const SLIDER_FILL_ALPHA: f64 = 0.7; +/// `[measured-qt]` A slider's length when nothing proposes one: Qt's size +/// hint for a Breeze slider, 84 at every font size. +pub const SLIDER_DEFAULT_LENGTH: f32 = 84.0; +/// `[derived]` How far a row of tick marks reaches past the handle box: +/// the groove's half thickness, the 2 px gap and the 8 px tick, less half +/// the handle box. 3, the step Qt measures for each side with ticks. +pub const SLIDER_TICK_OVERHANG: f32 = + SLIDER_GROOVE_THICKNESS * 0.5 + SLIDER_TICK_MARGIN + SLIDER_TICK_LENGTH + - SLIDER_CONTROL_THICKNESS * 0.5; + +// The groove fits inside the handle box, and the ticks clear the groove. +const _: () = assert!(SLIDER_GROOVE_THICKNESS < SLIDER_CONTROL_THICKNESS); +const _: () = assert!(SLIDER_TICK_OVERHANG == 3.0); +const _: () = assert!(COMBO_CHROME_WIDTH == 38.0); +const _: () = assert!(COMBO_ARROW_GAP == 10.0); + +/// The dimensions of a combo box, a push-button frame holding the selected +/// item and an arrow. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeComboMetrics { + /// `[S]` The combo box's height, at least: `max(H, 20) + 2 x 6`, through + /// the density ladder. 32 at Compact for the Breeze typography. + pub height: f32, + /// `[S]` The space before the label: the 6 px combo-box frame, scaled by + /// the density's spacing. + pub padding_leading: f32, + /// `[derived]` The space between the label and the arrow box, + /// [`COMBO_ARROW_GAP`], scaled by the density's spacing. + pub arrow_gap: f32, + /// `[S]` The arrow box, [`COMBO_ARROW_BOX`]. Painted, so it does not + /// scale. + pub arrow_box: f32, + /// `[M]` The space after the arrow box: the 2 px frame margin. It holds + /// the frame, so it does not scale. + pub padding_trailing: f32, +} + +impl BreezeComboMetrics { + /// Everything the combo box adds to its label's width. + pub fn chrome_width(&self) -> f32 { + self.padding_leading + self.arrow_gap + self.arrow_box + self.padding_trailing + } +} + +/// The combo box dimensions at the density of `tokens`, for `typography`. +pub fn breeze_combo_metrics_for( + tokens: &InputTokens, + typography: &TypographyTokens, +) -> BreezeComboMetrics { + let g = geometry_of(typography); + BreezeComboMetrics { + height: dp(g.combo_box_height, TargetRole::Target, tokens), + padding_leading: spacing(COMBO_BOX_FRAME_WIDTH, tokens), + arrow_gap: spacing(COMBO_ARROW_GAP, tokens), + arrow_box: COMBO_ARROW_BOX, + padding_trailing: FRAME_WIDTH, + } +} + +/// [`breeze_combo_metrics_for`] at the Compact density and the Breeze +/// typography. +pub fn breeze_combo_metrics() -> BreezeComboMetrics { + breeze_combo_metrics_for( + &InputTokens::default(), + &crate::typography::breeze_typography(), + ) +} + +/// The dimensions of a spin box: a line-edit frame holding the field and a +/// column of two arrows. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeSpinMetrics { + /// `[S]` The spin box's height, at least: the line edit's inner height + /// `max(H, 14) + 2` and the 6 px frame on each side, at least 20, + /// through the density ladder. 32 at Compact for the Breeze typography. + pub height: f32, + /// `[M]` The space before the field: the 6 px spin-box frame, scaled by + /// the density's spacing. + pub padding_leading: f32, + /// `[M]` The width of the arrow column, [`SPIN_BOX_ARROW_BUTTON_WIDTH`]. + /// Painted, so it does not scale. + pub arrow_width: f32, + /// `[M]` The space after the arrow column: the 2 px frame margin. + pub padding_trailing: f32, +} + +impl BreezeSpinMetrics { + /// `[S]` The two halves of the arrow column in a frame `height` tall: + /// the column is `min(inner height, 20)` tall, the inner height being the + /// frame less the 6 px frame above and below, and each half is the + /// column halved and rounded down. 10 and 10 at every density for the + /// Breeze typography. + pub fn arrow_half(height: f32) -> f32 { + let inner = (height - 2.0 * SPIN_BOX_FRAME_WIDTH).max(0.0); + (inner.min(SPIN_ARROW_MAX_HEIGHT) * 0.5).floor() + } +} + +/// The spin box dimensions at the density of `tokens`, for `typography`. +pub fn breeze_spin_metrics_for( + tokens: &InputTokens, + typography: &TypographyTokens, +) -> BreezeSpinMetrics { + let g = geometry_of(typography); + BreezeSpinMetrics { + height: dp(g.spin_box_height, TargetRole::Target, tokens), + padding_leading: spacing(SPIN_BOX_FRAME_WIDTH, tokens), + arrow_width: SPIN_BOX_ARROW_BUTTON_WIDTH, + padding_trailing: FRAME_WIDTH, + } +} + +/// [`breeze_spin_metrics_for`] at the Compact density and the Breeze +/// typography. +pub fn breeze_spin_metrics() -> BreezeSpinMetrics { + breeze_spin_metrics_for( + &InputTokens::default(), + &crate::typography::breeze_typography(), + ) +} + #[cfg(test)] mod tests { use super::*; @@ -334,6 +480,48 @@ mod tests { assert_eq!(indicator_body_width(0.0), 24.0); } + #[test] + fn the_combo_box_is_breezes_and_grows_with_the_density() { + let m = breeze_combo_metrics(); + assert_eq!(m.height, 32.0); + assert_eq!(m.padding_leading, 6.0); + assert_eq!(m.arrow_gap, 10.0); + assert_eq!(m.arrow_box, 20.0); + assert_eq!(m.padding_trailing, 2.0); + // Breeze's width rule: the label plus 12 + 20 + 2 + 4. + assert_eq!(m.chrome_width(), 38.0); + let t = crate::typography::breeze_typography(); + let comfortable = breeze_combo_metrics_for(&at(TargetDensity::Comfortable), &t); + let touch = breeze_combo_metrics_for(&at(TargetDensity::Touch), &t); + assert_eq!(comfortable.height, 32.0, "32 already clears 32"); + assert_eq!(touch.height, 44.0); + for m in [comfortable, touch] { + assert_eq!(m.arrow_box, 20.0, "the painted box does not scale"); + assert_eq!(m.padding_trailing, 2.0); + assert!(m.padding_leading > 6.0 && m.arrow_gap > 10.0); + } + } + + #[test] + fn the_spin_box_has_a_twenty_pixel_column_of_two_ten_pixel_halves() { + let m = breeze_spin_metrics(); + assert_eq!(m.height, 32.0); + assert_eq!(m.padding_leading, 6.0); + assert_eq!(m.arrow_width, 20.0); + assert_eq!(m.padding_trailing, 2.0); + assert_eq!(BreezeSpinMetrics::arrow_half(32.0), 10.0); + let t = crate::typography::breeze_typography(); + let touch = breeze_spin_metrics_for(&at(TargetDensity::Touch), &t); + assert_eq!(touch.height, 44.0); + assert_eq!(touch.arrow_width, 20.0); + // The column stops at 20, so a taller frame keeps the halves. + assert_eq!(BreezeSpinMetrics::arrow_half(touch.height), 10.0); + // A frame too short for a 20 px column halves what is left, rounded + // down: 29 tall leaves 17, two 8 px halves. + assert_eq!(BreezeSpinMetrics::arrow_half(29.0), 8.0); + assert_eq!(BreezeSpinMetrics::arrow_half(4.0), 0.0); + } + #[test] fn every_tool_button_clears_the_conformance_floor_without_a_box() { for density in [ diff --git a/crates/teksilo-theme-kde/src/styles/slider.rs b/crates/teksilo-theme-kde/src/styles/slider.rs new file mode 100644 index 000000000..b0c0c848e --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/slider.rs @@ -0,0 +1,773 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze slider. +//! +//! Breeze's slider is 20 px thick. Its **groove** is 6 px, centred, as long +//! as the slider, filled and stroked on itself inset by half the pen at a +//! 3 px radius: the window text at 14 % over the window, outlined in the +//! window text at the frame contrast, and from the start up to the handle's +//! centre the highlight at 70 % over the window, outlined in the highlight at +//! the frame contrast. The start is the leading end of a horizontal groove +//! and the top of a vertical one, as Breeze fills a slider that is not +//! inverted. A `Slider` puts a vertical slider's minimum at the bottom, as +//! Qt does, so a vertical groove is filled on its maximum side, from the top +//! down to the handle. Its **handle** is a 20 px box, centred across the +//! groove and placed along it by the value over the length less 20, painted +//! as a 17 px circle (the box inset by 1, then stroked) in the button colour +//! with a 1 px outline: the slider outline at rest, the hover colour under +//! the pointer, the focus colour while focused. A 1 px ring of the shadow +//! colour, black at 12.5 %, shows at the handle's bottom right, unless the +//! handle is being dragged. A disabled slider shows only the groove's +//! background part, in the disabled colours. +//! +//! **Tick marks**, for a slider given a tick count, are 1 px lines 8 px long, +//! 2 px from the groove; they take the slider 3 px further, 23 px thick, and +//! are drawn in the highlight up to the value and in the separator colour +//! after it. Breeze draws them on the side the application asks for; a +//! `Slider` names no side, so they are below a horizontal slider and to the +//! right of a vertical one (`[unpublished]`), Qt's ticks below. +//! +//! Right to left, a horizontal slider runs from the right: the handle, the +//! fill and the ticks are mirrored, as the `Slider` mirrors its pointer and +//! arrow keys. +//! +//! The handle box is the knob the `Slider` maps the pointer with +//! ([`SliderStyle::thumb_diameter_for`]): 20 px at every density, the +//! distance Breeze divides the value over. The node is raised to the +//! density's target size across the groove (24 px at Compact), with the +//! 20 or 23 px of the slider centred in it; along the groove it is 84 px +//! when nothing proposes a length, Qt's size hint. +//! +//! ## Where this departs from Breeze +//! +//! - **D6, the handle's outline.** The slider outline, the button colour +//! moved toward the button text by the frame contrast, is 1.3:1 on the +//! Breeze Light window, and the groove is no further from the window; the +//! handle is the one part of the slider that marks where it is and what it +//! is set to, so its outline at rest is `border_strong`, lifted to SC +//! 1.4.11's 3:1 (D6 of the colour mapping). A scheme whose outline passes +//! keeps it. The groove keeps its colours. +//! - **D5, focus.** The focused outline is `border_focused`, the focus +//! colour lifted to 3:1, and keyboard focus adds the 2 px focus frame +//! around the handle in the opaque `focus_ring` token, from 1 px inside +//! the box to 1 px outside it, both edges circles. +//! - **D6, the tick marks.** The separator colour is 1.5:1 on the Breeze +//! Light window and Breeze Light's highlight 2.2:1, and a tick marks a +//! value the slider can take, so the ticks after the value are +//! `border_strong` and those up to it the highlight lifted to 3:1, as a +//! checked switch's outline ([`crate::styles::indicator`]). +//! - **Hover is the slider's.** Breeze outlines the handle in the hover +//! colour while the pointer is over the handle; the style is told only +//! whether the pointer is over the slider, so the outline turns while the +//! pointer is anywhere on it. +//! - **The node is the target size.** Breeze's 20 px slider is under WCAG +//! 2.2 SC 2.5.8's 24 px, so the node is raised; nothing painted grows. + +use teksilo_canvas::{Canvas, Point, Rect, Size, SizeProposal}; +use teksilo_core::accessibility::AccessNodeBuilder; +use teksilo_core::binding::BindingLevel; +use teksilo_core::build_context::BuildContext; +use teksilo_core::environment::LayoutDirection; +use teksilo_core::focus::FocusOrigin; +use teksilo_core::signal::Signal; +use teksilo_core::styles::density::density_min_size; +use teksilo_core::styles::{ + FocusRingStroke, SliderOrientation, SliderStyle, SliderStyleConfig, Theme, +}; +use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement}; +use teksilo_core::widget_id::WidgetId; +use teksilo_kde_scheme::{ColorState, PaletteRole}; +use teksilo_tokens::{Color, CornerRadius, InputTokens, TargetAxes}; + +use crate::geometry::{ + SLIDER_CONTROL_THICKNESS, SLIDER_GROOVE_THICKNESS, SLIDER_HANDLE_PAINTED, SLIDER_TICK_LENGTH, + SLIDER_TICK_MARGIN, +}; +use crate::palette::KdePalette; +use crate::styles::chrome::kde_mix; +use crate::styles::indicator::BreezeIndicatorColors; +use crate::styles::metrics::{ + SLIDER_DEFAULT_LENGTH, SLIDER_FILL_ALPHA, SLIDER_GROOVE_ALPHA, SLIDER_GROOVE_RADIUS, + SLIDER_TICK_OVERHANG, +}; + +/// `[Hp]` How far the handle's circle lies inside its box, before it is +/// stroked. +const HANDLE_INSET: f32 = 1.0; +/// `[derived]` How far the handle's shadow ring is moved toward the bottom +/// right. Breeze draws it as an ellipse turned 45 degrees so that it shows +/// at the bottom right; the handle's own circle moved half a pixel each way +/// shows the same crescent. +const SHADOW_OFFSET: f32 = 0.5; +/// `[Hp]` The pen a tick mark is drawn with. +const TICK_PEN: f32 = 1.0; + +// The painted handle is the box inset by one and then by half the pen. +const _: () = assert!(SLIDER_HANDLE_PAINTED == SLIDER_CONTROL_THICKNESS - 2.0 * HANDLE_INSET - 1.0); + +/// Breeze `SliderStyle`. +#[derive(Debug, Default, Clone, Copy)] +pub struct BreezeSliderStyle; + +impl SliderStyle for BreezeSliderStyle { + fn thumb_diameter(&self, _cfg: &SliderStyleConfig) -> f32 { + SLIDER_CONTROL_THICKNESS + } + + /// `[Hp]` The handle box at every density: Breeze places the handle by + /// the value over the slider's length less the box, which is what the + /// `Slider` maps the pointer with. The node, not the handle, grows to + /// the density's target size, and a press anywhere on it moves the + /// value. + fn thumb_diameter_for(&self, cfg: &SliderStyleConfig, _tokens: &InputTokens) -> f32 { + self.thumb_diameter(cfg) + } + + fn make_body(&self, cfg: &SliderStyleConfig, ctx: &mut BuildContext) -> WidgetId { + ctx.add(BreezeSliderBody { + value: cfg.value_normalized.clone(), + is_hovered: cfg.is_hovered.clone(), + is_dragging: cfg.is_dragging.clone(), + is_disabled: cfg.is_disabled.clone(), + focus_origin: cfg.focus_origin.clone(), + orientation: cfg.orientation, + tick_count: cfg.tick_count.filter(|n| *n >= 2), + }) + } +} + +/// The colours a Breeze slider is painted from, in one paint state. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeSliderColors { + /// `[Hp]` The groove: the window text at 14 % over the window. + pub groove: Color, + /// `[Hp]` The groove's outline: the window text at the frame contrast. + pub groove_outline: Color, + /// `[Hp]` The groove up to the handle: the highlight at 70 % over the + /// window. + pub fill: Color, + /// `[Hp]` Its outline: the highlight at the frame contrast. + pub fill_outline: Color, + /// `[qt]` The handle's face, the button colour. + pub handle: Color, + /// `[wcag]` D6: the handle's outline at rest, `border_strong`; + /// `border_disabled` for a disabled slider. + pub handle_outline: Color, + /// `[Hp]` The handle's outline under the pointer: the view's hover + /// decoration. + pub hover: Color, + /// `[wcag]` D5: the handle's outline while focused, `border_focused`. + pub focus: Color, + /// `[wcag]` D5: the keyboard focus frame, `focus_ring`. + pub focus_ring: Color, + /// `[Hp]` The handle's shadow, black at 12.5 %. + pub shadow: Color, + /// `[wcag]` D6: a tick up to the value, the highlight lifted to the + /// non-text floor. + pub tick_on: Color, + /// `[wcag]` D6: a tick after the value, `border_strong`. + pub tick_off: Color, +} + +impl BreezeSliderColors { + /// The colours of `theme` as it paints in a window that is or is not + /// active, with or without the high-contrast preference, for an enabled + /// or a disabled slider. + /// + /// The window, its text and the highlight are the theme's projected + /// tokens (the disabled palette's window and window text for a disabled + /// slider); the button colour, the frame contrast and the hover colour + /// come from [`KdePalette`]. Without it the button colour is the content + /// surface, the frame contrast Breeze's 0.2 and the hover colour + /// `border_focused`. + pub fn resolve( + theme: &Theme, + window_active: bool, + high_contrast: bool, + disabled: bool, + ) -> BreezeSliderColors { + let c = &theme.colors; + let palette = theme.extension::(); + let state = if disabled { + ColorState::Disabled + } else if window_active { + ColorState::Active + } else { + ColorState::Inactive + }; + let (window, window_text) = match (disabled, palette) { + (true, Some(p)) => ( + p.role(ColorState::Disabled, PaletteRole::Window), + p.role(ColorState::Disabled, PaletteRole::WindowText), + ), + (true, None) => (c.surface_main, c.text_disabled), + (false, _) => (c.surface_main, c.text_primary), + }; + let highlight = if disabled { + c.accent_disabled + } else { + c.accent + }; + // `[derived]` The frame contrast: 1 in the high-contrast scheme the + // palette builds, as `KdePalette::breeze_colors` computes it. + let fc = match palette { + Some(_) if high_contrast => 1.0, + Some(p) => p.frame_contrast(), + None => teksilo_kde_scheme::scheme::DEFAULT_FRAME_CONTRAST, + } as f32; + let (handle, hover, shadow) = match palette { + Some(p) => { + let b = p.breeze_colors(state, high_contrast); + (b.button, b.hover, b.shadow) + } + None => ( + if disabled { + c.surface_disabled + } else { + c.surface_content + }, + c.border_focused, + theme.shape.shadow_xs.color, + ), + }; + let indicator = + BreezeIndicatorColors::resolve(theme, window_active, high_contrast, disabled); + BreezeSliderColors { + groove: kde_mix(window, window_text, SLIDER_GROOVE_ALPHA), + groove_outline: window_text.with_alpha(fc), + fill: kde_mix(window, highlight, SLIDER_FILL_ALPHA), + fill_outline: highlight.with_alpha(fc), + handle, + handle_outline: if disabled { + c.border_disabled + } else { + c.border_strong + }, + hover, + focus: c.border_focused, + focus_ring: c.focus_ring, + shadow, + tick_on: indicator.checked_outline, + tick_off: indicator.outline, + } + } + + /// `[Hp]` The handle's outline: disabled first, then focus, then hover, + /// then rest. + pub fn handle_outline_for(&self, focused: bool, hovered: bool, disabled: bool) -> Color { + if disabled { + self.handle_outline + } else if focused { + self.focus + } else if hovered { + self.hover + } else { + self.handle_outline + } + } +} + +/// Where a Breeze slider's parts lie in its node. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct SliderGeometry { + /// `[Hp]` The groove, 6 px thick and the node's full length, before it + /// is inset by half the pen. + pub groove: Rect, + /// `[Hp]` The handle's 20 px box. + pub handle: Rect, + /// `[Hp]` The groove from its start to the handle's centre, before it is + /// inset by half the pen: from the minimum's end of a horizontal groove, + /// and from the top, the maximum's end, of a vertical one. + pub fill: Rect, + /// The main-axis coordinate of the handle's centre at the value 0 and at + /// the value 1. + pub travel: (f32, f32), + /// The cross-axis coordinate of the groove's centre. + pub centre: f32, +} + +/// `[Hp]` The parts of a slider whose node is `bounds`, at the value +/// `value` (0 to 1), laid out `orientation`, `direction` and with or without +/// a row of tick marks. +pub fn slider_geometry( + bounds: Rect, + value: f32, + orientation: SliderOrientation, + direction: LayoutDirection, + ticks: bool, +) -> SliderGeometry { + let t = value.clamp(0.0, 1.0); + let box_ = SLIDER_CONTROL_THICKNESS; + let half = box_ * 0.5; + let thickness = slider_thickness(ticks); + match orientation { + SliderOrientation::Horizontal => { + // The slider (with its ticks below) centred across the node. + let top = bounds.y + (bounds.height - thickness) * 0.5; + let cy = top + half; + let (start, end) = match direction { + LayoutDirection::LeftToRight => (bounds.x + half, bounds.x + bounds.width - half), + LayoutDirection::RightToLeft => (bounds.x + bounds.width - half, bounds.x + half), + }; + let cx = start + (end - start) * t; + let groove = Rect::new( + bounds.x, + cy - SLIDER_GROOVE_THICKNESS * 0.5, + bounds.width, + SLIDER_GROOVE_THICKNESS, + ); + let fill = match direction { + LayoutDirection::LeftToRight => { + Rect::new(groove.x, groove.y, (cx - groove.x).max(0.0), groove.height) + } + LayoutDirection::RightToLeft => Rect::new( + cx, + groove.y, + (groove.x + groove.width - cx).max(0.0), + groove.height, + ), + }; + SliderGeometry { + groove, + handle: Rect::new(cx - half, cy - half, box_, box_), + fill, + travel: (start, end), + centre: cy, + } + } + SliderOrientation::Vertical => { + // The ticks are to the right, so the slider is centred with them. + let left = bounds.x + (bounds.width - thickness) * 0.5; + let cx = left + half; + let (start, end) = (bounds.y + bounds.height - half, bounds.y + half); + let cy = start + (end - start) * t; + let groove = Rect::new( + cx - SLIDER_GROOVE_THICKNESS * 0.5, + bounds.y, + SLIDER_GROOVE_THICKNESS, + bounds.height, + ); + // Breeze fills a vertical groove that is not inverted from its + // top, and a `Slider`'s maximum is at the top. + let fill = Rect::new(groove.x, groove.y, groove.width, (cy - groove.y).max(0.0)); + SliderGeometry { + groove, + handle: Rect::new(cx - half, cy - half, box_, box_), + fill, + travel: (start, end), + centre: cx, + } + } + } +} + +/// `[Hp]` `[measured-qt]` How thick a slider is: 20, and 23 with a row of +/// tick marks. +pub fn slider_thickness(ticks: bool) -> f32 { + if ticks { + SLIDER_CONTROL_THICKNESS + SLIDER_TICK_OVERHANG + } else { + SLIDER_CONTROL_THICKNESS + } +} + +/// `[Hp]` The tick mark for the stop `stop` of `count` (from the minimum) of +/// a slider laid out as `g`: a line 8 px long, 2 px from the groove, as the +/// two points it runs between. +pub fn tick_line( + g: &SliderGeometry, + orientation: SliderOrientation, + stop: u32, + count: u32, +) -> (Point, Point) { + let f = if count > 1 { + stop as f32 / (count - 1) as f32 + } else { + 0.0 + }; + let (start, end) = g.travel; + let at = start + (end - start) * f; + let near = g.centre + SLIDER_GROOVE_THICKNESS * 0.5 + SLIDER_TICK_MARGIN; + let far = near + SLIDER_TICK_LENGTH; + match orientation { + SliderOrientation::Horizontal => (Point::new(at, near), Point::new(at, far)), + SliderOrientation::Vertical => (Point::new(near, at), Point::new(far, at)), + } +} + +/// `[Hp]` A rectangle inset by half of `pen` on every side. +fn inset_half(r: Rect, pen: f32) -> Rect { + let d = pen * 0.5; + Rect::new( + r.x + d, + r.y + d, + (r.width - pen).max(0.0), + (r.height - pen).max(0.0), + ) +} + +struct BreezeSliderBody { + value: Signal, + is_hovered: Signal, + is_dragging: Signal, + is_disabled: Signal, + focus_origin: Signal>, + orientation: SliderOrientation, + tick_count: Option, +} + +impl std::fmt::Debug for BreezeSliderBody { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeSliderBody") + .field("orientation", &self.orientation) + .field("tick_count", &self.tick_count) + .finish() + } +} + +impl Widget for BreezeSliderBody { + fn build(&mut self, ctx: &mut BuildContext) -> Vec { + let id = ctx.self_id(); + let registry = ctx.binding_registry(); + self.value.bind_to(id, registry, BindingLevel::RepaintOnly); + for s in [&self.is_hovered, &self.is_dragging, &self.is_disabled] { + s.bind_to(id, registry, BindingLevel::RepaintOnly); + } + self.focus_origin + .bind_to(id, registry, BindingLevel::RepaintOnly); + vec![] + } + + /// The proposed length (84 when none is), and the slider's thickness + /// raised to the density's target size. + fn layout_response(&self, proposal: SizeProposal, ctx: &LayoutContext) -> LayoutResponse { + let thickness = slider_thickness(self.tick_count.is_some()); + let (size, axes) = match self.orientation { + SliderOrientation::Horizontal => ( + Size::new(proposal.width.unwrap_or(SLIDER_DEFAULT_LENGTH), thickness), + TargetAxes::HEIGHT, + ), + SliderOrientation::Vertical => ( + Size::new(thickness, proposal.height.unwrap_or(SLIDER_DEFAULT_LENGTH)), + TargetAxes::WIDTH, + ), + }; + density_min_size(size, axes, &ctx.theme.input).into() + } + + fn place_children( + &self, + _bounds: Rect, + _proposal: SizeProposal, + _children: &mut [WidgetPlacement], + _ctx: &LayoutContext, + ) { + } + + fn paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext) { + let disabled = self.is_disabled.get(); + let colors = BreezeSliderColors::resolve( + ctx.theme, + ctx.window_active, + ctx.prefers_high_contrast, + disabled, + ); + let pen = ctx.theme.shape.border_width; + let value = self.value.get().clamp(0.0, 1.0); + let g = slider_geometry( + bounds, + value, + self.orientation, + ctx.layout_direction, + self.tick_count.is_some(), + ); + let corner = CornerRadius::uniform(SLIDER_GROOVE_RADIUS); + + // The groove, then its part up to the handle. + let groove = inset_half(g.groove, pen); + canvas.fill_rounded_rect(groove, corner, colors.groove); + if pen > 0.0 && colors.groove_outline.a() > 0.0 { + canvas.stroke_rounded_rect(groove, corner, colors.groove_outline, pen); + } + let fill = inset_half(g.fill, pen); + if !disabled && fill.width > 0.0 && fill.height > 0.0 { + canvas.fill_rounded_rect(fill, corner, colors.fill); + if pen > 0.0 && colors.fill_outline.a() > 0.0 { + canvas.stroke_rounded_rect(fill, corner, colors.fill_outline, pen); + } + } + + // The ticks, up to the value in the highlight. + if let Some(n) = self.tick_count { + for stop in 0..n { + let f = stop as f32 / (n - 1) as f32; + let color = if f <= value + 1e-4 { + colors.tick_on + } else { + colors.tick_off + }; + let (a, b) = tick_line(&g, self.orientation, stop, n); + let rect = match self.orientation { + SliderOrientation::Horizontal => { + Rect::new(a.x - TICK_PEN * 0.5, a.y, TICK_PEN, b.y - a.y) + } + SliderOrientation::Vertical => { + Rect::new(a.x, a.y - TICK_PEN * 0.5, b.x - a.x, TICK_PEN) + } + }; + canvas.fill_rect(rect, color); + } + } + + // The handle: its shadow, its face and its outline. + let centre = Point::new( + g.handle.x + g.handle.width * 0.5, + g.handle.y + g.handle.height * 0.5, + ); + let radius = (g.handle.width * 0.5 - HANDLE_INSET - pen * 0.5).max(0.0); + if !self.is_dragging.get() && colors.shadow.a() > 0.0 && pen > 0.0 { + canvas.stroke_circle( + Point::new(centre.x + SHADOW_OFFSET, centre.y + SHADOW_OFFSET), + radius, + colors.shadow, + pen, + ); + } + canvas.fill_circle(centre, radius, colors.handle); + let focused = self.focus_origin.get().is_some(); + let outline = colors.handle_outline_for(focused, self.is_hovered.get(), disabled); + if pen > 0.0 && outline.a() > 0.0 { + canvas.stroke_circle(centre, radius, outline, pen); + } + + if self.focus_origin.get() == Some(FocusOrigin::Keyboard) && !disabled { + let shape = &ctx.theme.shape; + if colors.focus_ring.a() > 0.0 && shape.focus_ring_width > 0.0 { + let ring = slider_focus_frame(g.handle, shape.focus_ring_width); + canvas.stroke_rounded_rect( + ring.rect, + CornerRadius::uniform(ring.corner_radius), + colors.focus_ring, + shape.focus_ring_width, + ); + } + } + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + // Presentational: the `Slider` emits the slider node. + builder.set_hidden(); + } +} + +/// `[Hp]` The keyboard focus frame around a slider's handle box `handle`: a +/// band `width` wide whose inner edge is the box inset by 1, a circle. +pub fn slider_focus_frame(handle: Rect, width: f32) -> FocusRingStroke { + let inner = Rect::new( + handle.x + HANDLE_INSET, + handle.y + HANDLE_INSET, + (handle.width - 2.0 * HANDLE_INSET).max(0.0), + (handle.height - 2.0 * HANDLE_INSET).max(0.0), + ); + FocusRingStroke::at_distance(inner, inner.width * 0.5, width * 0.5) +} + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_kde_scheme::KdeColor; + + fn rgba8(c: Color) -> [u8; 4] { + KdeColor::from_color(c).to_rgba8() + } + + const LTR: LayoutDirection = LayoutDirection::LeftToRight; + const RTL: LayoutDirection = LayoutDirection::RightToLeft; + + /// Plasma's 200 x 20 slider at 30 % puts its groove at (0, 7, 200, 6) + /// and its handle box at (54, 0, 20, 20). + #[test] + fn the_groove_and_the_handle_are_where_qt_puts_them() { + let b = Rect::new(0.0, 0.0, 200.0, 20.0); + let g = slider_geometry(b, 0.3, SliderOrientation::Horizontal, LTR, false); + assert_eq!(g.groove, Rect::new(0.0, 7.0, 200.0, 6.0)); + assert!((g.handle.x - 54.0).abs() < 1e-4, "{:?}", g.handle); + assert_eq!( + (g.handle.y, g.handle.width, g.handle.height), + (0.0, 20.0, 20.0) + ); + assert_eq!(g.fill.x, 0.0); + assert_eq!(g.fill.width, g.handle.x + 10.0, "up to the handle's centre"); + } + + #[test] + fn right_to_left_mirrors_the_handle_and_the_fill() { + let b = Rect::new(0.0, 0.0, 200.0, 20.0); + let l = slider_geometry(b, 0.25, SliderOrientation::Horizontal, LTR, false); + let r = slider_geometry(b, 0.25, SliderOrientation::Horizontal, RTL, false); + assert_eq!(r.handle.x, 200.0 - l.handle.x - 20.0); + assert_eq!(r.fill.x + r.fill.width, 200.0, "from the right end"); + assert_eq!(r.fill.x, r.handle.x + 10.0); + // The stops mirror too. + let (a, _) = tick_line(&r, SliderOrientation::Horizontal, 0, 5); + assert_eq!(a.x, 190.0, "the minimum's tick at the right"); + } + + /// The handle's travel is the one the `Slider` maps the pointer over: + /// the length less the 20 px box. + #[test] + fn the_travel_is_the_widgets() { + for orientation in [SliderOrientation::Horizontal, SliderOrientation::Vertical] { + let b = Rect::new(10.0, 20.0, 200.0, 300.0); + let g = slider_geometry(b, 0.0, orientation, LTR, false); + let length = match orientation { + SliderOrientation::Horizontal => b.width, + SliderOrientation::Vertical => b.height, + }; + assert_eq!((g.travel.1 - g.travel.0).abs(), length - 20.0); + } + let style = BreezeSliderStyle; + let cfg = SliderStyleConfig { + value_normalized: Signal::new(0.0), + is_hovered: Signal::new(false), + is_dragging: Signal::new(false), + is_disabled: Signal::new(false), + focus_origin: Signal::new(None), + orientation: SliderOrientation::Horizontal, + tick_count: None, + variant: teksilo_core::styles::SliderVariant::Continuous, + }; + assert_eq!(style.thumb_diameter(&cfg), 20.0); + for density in [ + teksilo_tokens::TargetDensity::Compact, + teksilo_tokens::TargetDensity::Comfortable, + teksilo_tokens::TargetDensity::Touch, + ] { + assert_eq!( + style.thumb_diameter_for(&cfg, &InputTokens::for_density(density)), + 20.0 + ); + } + } + + /// A vertical slider's minimum is at the bottom, and its groove is + /// filled from the top down to the handle, as Breeze fills a vertical + /// slider that is not inverted (spec k.5.10). + #[test] + fn a_vertical_slider_fills_from_the_top() { + let b = Rect::new(0.0, 0.0, 20.0, 120.0); + let g = slider_geometry(b, 0.25, SliderOrientation::Vertical, LTR, false); + assert_eq!(g.travel, (110.0, 10.0)); + assert_eq!(g.handle.y + 10.0, 110.0 - 25.0); + assert_eq!(g.fill.y, 0.0, "from the groove's top"); + assert_eq!(g.fill.y + g.fill.height, g.handle.y + 10.0, "to the handle"); + assert_eq!(g.groove, Rect::new(7.0, 0.0, 6.0, 120.0)); + // At the minimum the whole groove above the handle is filled; at the + // maximum the fill is the half handle above its centre. + let low = slider_geometry(b, 0.0, SliderOrientation::Vertical, LTR, false); + assert_eq!(low.fill, Rect::new(7.0, 0.0, 6.0, 110.0)); + let high = slider_geometry(b, 1.0, SliderOrientation::Vertical, LTR, false); + assert_eq!(high.fill, Rect::new(7.0, 0.0, 6.0, 10.0)); + } + + /// Qt's slider with ticks below is 23 high: the ticks run from 5 to 13 + /// px below the groove's centre. + #[test] + fn the_ticks_lie_below_the_groove_and_add_three_pixels() { + assert_eq!(slider_thickness(false), 20.0); + assert_eq!(slider_thickness(true), 23.0); + let b = Rect::new(0.0, 0.0, 200.0, 23.0); + let g = slider_geometry(b, 0.5, SliderOrientation::Horizontal, LTR, true); + assert_eq!(g.centre, 10.0, "the slider at the top, its ticks below"); + let (a, z) = tick_line(&g, SliderOrientation::Horizontal, 0, 3); + assert_eq!((a, z), (Point::new(10.0, 15.0), Point::new(10.0, 23.0))); + let (a, _) = tick_line(&g, SliderOrientation::Horizontal, 2, 3); + assert_eq!(a.x, 190.0); + } + + /// Whether two colours are within one step a channel: Qt's raster + /// painter rounds an 8-bit blend its own way. + fn near(a: [u8; 4], b: [u8; 4]) -> bool { + a.iter().zip(b).all(|(x, y)| x.abs_diff(y) <= 1) + } + + /// The Breeze Light colours, against Plasma's painted samples. + #[test] + fn breeze_light_paints_the_specifications_colours() { + let t = crate::light(); + let c = BreezeSliderColors::resolve(&t, true, false, false); + assert!( + near(rgba8(c.groove), [210, 211, 213, 255]), + "{:?}", + rgba8(c.groove) + ); + assert!( + near(rgba8(c.fill), [114, 194, 235, 255]), + "{:?}", + rgba8(c.fill) + ); + assert_eq!(rgba8(c.handle), [252, 252, 252, 255]); + assert_eq!(rgba8(c.hover), [61, 174, 233, 255]); + assert_eq!(c.handle_outline, t.colors.border_strong); + assert_eq!(c.focus, t.colors.border_focused); + assert_eq!(c.groove_outline.a(), 0.2); + let d = BreezeSliderColors::resolve(&t, true, false, true); + assert!( + near(rgba8(d.groove), [217, 220, 221, 255]), + "{:?}", + rgba8(d.groove) + ); + assert_eq!(rgba8(d.handle), [240, 240, 240, 255]); + } + + #[test] + fn focus_wins_over_hover_and_disabled_over_both() { + let c = BreezeSliderColors::resolve(&crate::light(), true, false, false); + assert_eq!(c.handle_outline_for(false, false, false), c.handle_outline); + assert_eq!(c.handle_outline_for(false, true, false), c.hover); + assert_eq!(c.handle_outline_for(true, true, false), c.focus); + assert_eq!(c.handle_outline_for(true, true, true), c.handle_outline); + } + + /// D6: the handle's outline and the ticks reach 3:1 on the window, which + /// Breeze's slider outline, separator and Breeze Light's highlight do + /// not. + #[test] + fn the_handle_and_tick_colours_are_lifted_and_their_premises_hold() { + for t in [crate::light(), crate::dark()] { + let window = t.colors.surface_main; + let c = BreezeSliderColors::resolve(&t, true, false, false); + let b = t + .extension::() + .unwrap() + .colors(ColorState::Active); + assert!( + b.slider_outline.contrast_ratio(window) < 3.0, + "premise: Breeze's slider outline falls short" + ); + assert!(b.separator.contrast_ratio(window) < 3.0); + assert!(c.handle_outline.contrast_ratio(window) >= 3.0); + assert!(c.tick_off.contrast_ratio(window) >= 3.0); + assert!(c.tick_on.contrast_ratio(window) >= 3.0); + } + let t = crate::light(); + assert!(t.colors.accent.contrast_ratio(t.colors.surface_main) < 3.0); + } + + #[test] + fn the_focus_frame_is_a_circle_around_the_handle() { + let ring = slider_focus_frame(Rect::new(54.0, 0.0, 20.0, 20.0), 2.0); + assert_eq!(ring.rect, Rect::new(54.0, 0.0, 20.0, 20.0)); + assert_eq!(ring.corner_radius, 10.0); + } + + #[test] + fn a_theme_without_the_palette_paints_from_its_roles() { + let t = teksilo_core::presets::intui::light(); + let c = BreezeSliderColors::resolve(&t, true, false, false); + assert_eq!(c.handle, t.colors.surface_content); + assert_eq!(c.hover, t.colors.border_focused); + assert!((c.groove_outline.a() - 0.2).abs() < 1e-6); + } +} diff --git a/crates/teksilo-theme-kde/src/styles/spin_box.rs b/crates/teksilo-theme-kde/src/styles/spin_box.rs new file mode 100644 index 000000000..4c265392c --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/spin_box.rs @@ -0,0 +1,483 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze spin box. +//! +//! A line edit ([`crate::styles::text_input`]) with a column of two arrows +//! at its trailing edge. The frame is the line edit's: the view colour in a +//! 1 px outline, the focus colour while the field has focus, the hover +//! colour under the pointer. The column is 20 px wide, 2 px inside the +//! trailing edge (the frame margin), and `min(inner height, 20)` tall, +//! centred, the inner height being the frame less the 6 px frame above and +//! below; it is split into an upper and a lower half, each half the column +//! rounded down, 10 and 10 at Plasma's default font +//! ([`crate::styles::metrics::BreezeSpinMetrics`]). Each half holds a +//! chevron ([`crate::styles::arrow`]), up and down, in the arrow colour of +//! the view's text, the hover colour on the half under the pointer. Breeze +//! draws no button in the column: no fill, no outline, no press. +//! +//! The spin box is the line edit's inner height plus the 6 px frame above +//! and below, 32 px at Plasma's default font, through the density ladder. +//! The field starts 6 px inside the leading edge and ends at the column. +//! Right to left, the column is at the left edge. +//! +//! The column's halves are the `SpinBox`'s own step buttons, which keep +//! their press, hold-to-repeat and pointer handling; the style places them +//! at Breeze's geometry and draws their arrows itself, painting the step +//! buttons' own chrome at zero opacity. +//! +//! ## Where this departs from Breeze +//! +//! - **D6, the outline at rest.** As on the line edit, the frame is +//! outlined in `border_strong` rather than in the frame outline, which is +//! 1.5:1 on the Breeze Light window; focus is `border_focused` (D5). +//! - **An arrow keeps its colour at the limit.** Breeze draws the arrow +//! that can step no further in the disabled colours. The style is not told +//! the value's limits, so only a disabled spin box's arrows are in them; +//! an arrow at the limit does nothing when pressed. +//! - **The column's halves are under the target size.** Two 20 x 10 +//! halves are Breeze's geometry, below WCAG 2.2 SC 2.5.8's 24 px at every +//! density. The value is reachable with the arrow and page keys, the +//! mouse wheel and the assistive Increment and Decrement actions, the +//! criterion's "equivalent" exception. + +use teksilo_canvas::{Canvas, Point, Rect, Size, SizeProposal}; +use teksilo_core::accessibility::AccessNodeBuilder; +use teksilo_core::binding::BindingLevel; +use teksilo_core::build_context::BuildContext; +use teksilo_core::signal::Signal; +use teksilo_core::styles::{ + ButtonLayout, SpinBoxStyle, SpinBoxStyleConfig, TextInputValidationLevel, Theme, +}; +use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement}; +use teksilo_core::widget_builder::WidgetBuilder; +use teksilo_core::widget_id::WidgetId; +use teksilo_kde_scheme::{ColorState, PaletteRole}; +use teksilo_tokens::Color; + +use crate::palette::KdePalette; +use crate::styles::arrow::{ArrowDirection, arrow_color, paint_arrow}; +use crate::styles::metrics::{BreezeSpinMetrics, breeze_spin_metrics_for}; +use crate::styles::text_input::BreezeFieldChrome; + +/// Breeze `SpinBoxStyle`. +#[derive(Debug, Default, Clone, Copy)] +pub struct BreezeSpinBoxStyle; + +impl SpinBoxStyle for BreezeSpinBoxStyle { + fn make_body(&self, cfg: &SpinBoxStyleConfig, ctx: &mut BuildContext) -> WidgetId { + let theme = ctx.theme(); + let metrics = breeze_spin_metrics_for(&theme.input, &theme.typography); + // The frame turns to the hover colour while the pointer is anywhere + // over the spin box, which is over one of its parts. + let hovered = Signal::new(false); + let chrome = ctx.add(BreezeFieldChrome::new( + cfg.is_focused.clone(), + hovered.clone(), + cfg.is_disabled.clone(), + Signal::new(TextInputValidationLevel::None), + false, + )); + let column = match (cfg.layout, cfg.step_up, cfg.step_down) { + (ButtonLayout::Stacked, Some(up), Some(down)) => { + let halves = [up, down].map(|step| { + // The step button keeps its handlers and its node; its + // own background and icon are not Breeze's. + ctx.set_opacity(step, 0.0); + let hover = Signal::new(false); + let half = ctx.add(BreezeSpinHalf { step }.hover_within(hover.clone())); + (half, hover) + }); + let [(up_half, up_hover), (down_half, down_hover)] = halves; + Some(ctx.add(BreezeSpinArrows { + up: up_half, + down: down_half, + up_hovered: up_hover, + down_hovered: down_hover, + is_disabled: cfg.is_disabled.clone(), + })) + } + _ => None, + }; + let layout = BreezeSpinLayout { + metrics, + chrome, + field: cfg.field, + column, + }; + ctx.add(layout.hover_within(hovered)) + } +} + +/// The colours a Breeze spin box's arrows are painted in. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeSpinArrowColors { + /// `[Hp]` An arrow at rest: the arrow colour of the view's text, on the + /// view; of the disabled view's text for a disabled spin box. + pub arrow: Color, + /// `[Hp]` The arrow of the half under the pointer: the view's hover + /// decoration. + pub hover: Color, +} + +impl BreezeSpinArrowColors { + /// The colours of `theme` as it paints in a window that is or is not + /// active, with or without the high-contrast preference, for an enabled + /// or a disabled spin box. + /// + /// Without a [`KdePalette`] the arrow is the primary text over the + /// content surface (the disabled text over the disabled surface) and the + /// hover colour `border_focused`. + pub fn resolve( + theme: &Theme, + window_active: bool, + high_contrast: bool, + disabled: bool, + ) -> BreezeSpinArrowColors { + let c = &theme.colors; + let Some(palette) = theme.extension::() else { + let arrow = if disabled { + arrow_color(c.text_disabled, c.surface_disabled) + } else { + arrow_color(c.text_primary, c.surface_content) + }; + return BreezeSpinArrowColors { + arrow, + hover: c.border_focused, + }; + }; + let state = if disabled { + ColorState::Disabled + } else if window_active { + ColorState::Active + } else { + ColorState::Inactive + }; + // The view's text and background: the projected tokens, which the + // high-contrast projection lifts, or the disabled view's. + let arrow = if disabled { + arrow_color( + palette.role(ColorState::Disabled, PaletteRole::Text), + palette.role(ColorState::Disabled, PaletteRole::Base), + ) + } else { + arrow_color(c.editor_fg, c.surface_content) + }; + BreezeSpinArrowColors { + arrow, + hover: palette.breeze_colors(state, high_contrast).hover, + } + } +} + +/// `[S]` The arrow column of a spin box whose node is `bounds`: 20 px wide +/// at the trailing edge, inside the frame margin, the full height. +pub fn spin_column_rect(bounds: Rect, m: &BreezeSpinMetrics, rtl: bool) -> Rect { + let x = if rtl { + bounds.x + m.padding_trailing + } else { + bounds.x + bounds.width - m.padding_trailing - m.arrow_width + }; + Rect::new(x, bounds.y, m.arrow_width, bounds.height) +} + +/// `[S]` The upper and lower halves of the arrow column `column`, centred in +/// it. +pub fn spin_halves(column: Rect) -> (Rect, Rect) { + let half = BreezeSpinMetrics::arrow_half(column.height); + let top = column.y + (column.height - 2.0 * half) * 0.5; + ( + Rect::new(column.x, top, column.width, half), + Rect::new(column.x, top + half, column.width, half), + ) +} + +/// The arrangement of a Breeze spin box: the frame over the whole node, the +/// field from the leading inset to the column, the column at the trailing +/// edge. +struct BreezeSpinLayout { + metrics: BreezeSpinMetrics, + chrome: WidgetId, + field: WidgetId, + column: Option, +} + +impl std::fmt::Debug for BreezeSpinLayout { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeSpinLayout") + .field("metrics", &self.metrics) + .finish() + } +} + +impl BreezeSpinLayout { + /// Everything the frame adds to the field's width. + fn chrome_width(&self) -> f32 { + let m = &self.metrics; + match self.column { + Some(_) => m.padding_leading + m.arrow_width + m.padding_trailing, + // Without the column the field is inset on both sides. + None => 2.0 * m.padding_leading, + } + } +} + +impl Widget for BreezeSpinLayout { + fn build(&mut self, _ctx: &mut BuildContext) -> Vec { + self.children() + } + + fn children(&self) -> Vec { + [self.chrome, self.field] + .into_iter() + .chain(self.column) + .collect() + } + + /// The field plus the chrome when nothing proposes a width, the + /// proposed width otherwise; the Breeze height, or the field's if it is + /// taller. + fn layout_response(&self, proposal: SizeProposal, ctx: &LayoutContext) -> LayoutResponse { + let chrome = self.chrome_width(); + let field = ctx + .child_size( + self.field, + SizeProposal { + width: proposal.width.map(|w| (w - chrome).max(0.0)), + height: None, + }, + ) + .unwrap_or(Size::new(0.0, 0.0)); + Size::new( + proposal.width.unwrap_or(field.width + chrome), + self.metrics.height.max(field.height), + ) + .into() + } + + fn place_children( + &self, + bounds: Rect, + _proposal: SizeProposal, + children: &mut [WidgetPlacement], + ctx: &LayoutContext, + ) { + let m = &self.metrics; + let rtl = ctx.is_rtl(); + let column = spin_column_rect(bounds, m, rtl); + let field_width = (bounds.width - self.chrome_width()).max(0.0); + let field_x = if rtl { + bounds.x + bounds.width - m.padding_leading - field_width + } else { + bounds.x + m.padding_leading + }; + let field = Rect::new(field_x, bounds.y, field_width, bounds.height); + for child in children.iter_mut() { + let rect = if child.id == self.chrome { + bounds + } else if child.id == self.field { + field + } else { + column + }; + child.origin = Point::new(rect.x, rect.y); + child.size = Size::new(rect.width, rect.height); + } + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + // Layout only: the `SpinBox` field carries the spin button's node. + builder.set_role(teksilo_core::accesskit::Role::GenericContainer); + } +} + +/// One half of the arrow column: holds a step button and gives it the whole +/// half, so its press region is Breeze's 20 x 10. +struct BreezeSpinHalf { + step: WidgetId, +} + +impl std::fmt::Debug for BreezeSpinHalf { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeSpinHalf").finish() + } +} + +impl Widget for BreezeSpinHalf { + fn build(&mut self, _ctx: &mut BuildContext) -> Vec { + vec![self.step] + } + + fn children(&self) -> Vec { + vec![self.step] + } + + fn layout_response(&self, proposal: SizeProposal, _ctx: &LayoutContext) -> LayoutResponse { + proposal.resolve(0.0, 0.0).into() + } + + fn place_children( + &self, + bounds: Rect, + _proposal: SizeProposal, + children: &mut [WidgetPlacement], + _ctx: &LayoutContext, + ) { + for child in children.iter_mut() { + child.origin = Point::new(bounds.x, bounds.y); + child.size = Size::new(bounds.width, bounds.height); + } + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + builder.set_role(teksilo_core::accesskit::Role::GenericContainer); + } +} + +/// The arrow column of a Breeze spin box: places the two halves holding the +/// step buttons and draws their arrows. +struct BreezeSpinArrows { + up: WidgetId, + down: WidgetId, + up_hovered: Signal, + down_hovered: Signal, + is_disabled: Signal, +} + +impl std::fmt::Debug for BreezeSpinArrows { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeSpinArrows").finish() + } +} + +impl Widget for BreezeSpinArrows { + fn build(&mut self, ctx: &mut BuildContext) -> Vec { + let id = ctx.self_id(); + let registry = ctx.binding_registry(); + for s in [&self.up_hovered, &self.down_hovered, &self.is_disabled] { + s.bind_to(id, registry, BindingLevel::RepaintOnly); + } + vec![self.up, self.down] + } + + fn children(&self) -> Vec { + vec![self.up, self.down] + } + + fn layout_response(&self, proposal: SizeProposal, _ctx: &LayoutContext) -> LayoutResponse { + proposal.resolve(0.0, 0.0).into() + } + + fn place_children( + &self, + bounds: Rect, + _proposal: SizeProposal, + children: &mut [WidgetPlacement], + _ctx: &LayoutContext, + ) { + let (up, down) = spin_halves(bounds); + for child in children.iter_mut() { + let rect = if child.id == self.up { up } else { down }; + child.origin = Point::new(rect.x, rect.y); + child.size = Size::new(rect.width, rect.height); + } + } + + fn paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext) { + let disabled = self.is_disabled.get(); + let colors = BreezeSpinArrowColors::resolve( + ctx.theme, + ctx.window_active, + ctx.prefers_high_contrast, + disabled, + ); + let (up, down) = spin_halves(bounds); + let color = |hovered: bool| { + if hovered && !disabled { + colors.hover + } else { + colors.arrow + } + }; + paint_arrow(canvas, up, ArrowDirection::Up, color(self.up_hovered.get())); + paint_arrow( + canvas, + down, + ArrowDirection::Down, + color(self.down_hovered.get()), + ); + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + // Layout and paint only: the step buttons are the `SpinBox`'s own. + builder.set_role(teksilo_core::accesskit::Role::GenericContainer); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::styles::metrics::breeze_spin_metrics; + use teksilo_kde_scheme::KdeColor; + + fn rgba8(c: Color) -> [u8; 4] { + KdeColor::from_color(c).to_rgba8() + } + + /// Plasma's 100 x 32 spin box: the up half at (78, 6) and the down half + /// at (78, 16), each 20 x 10. + #[test] + fn the_column_and_its_halves_are_where_qt_puts_them() { + let m = breeze_spin_metrics(); + let b = Rect::new(0.0, 0.0, 100.0, 32.0); + let column = spin_column_rect(b, &m, false); + assert_eq!(column, Rect::new(78.0, 0.0, 20.0, 32.0)); + let (up, down) = spin_halves(column); + assert_eq!(up, Rect::new(78.0, 6.0, 20.0, 10.0)); + assert_eq!(down, Rect::new(78.0, 16.0, 20.0, 10.0)); + assert_eq!( + spin_column_rect(b, &m, true), + Rect::new(2.0, 0.0, 20.0, 32.0), + "mirrored right to left" + ); + } + + /// A taller frame keeps the 20 px column, centred. + #[test] + fn a_touch_frame_centres_the_same_halves() { + let (up, down) = spin_halves(Rect::new(0.0, 0.0, 20.0, 44.0)); + assert_eq!(up, Rect::new(0.0, 12.0, 20.0, 10.0)); + assert_eq!(down, Rect::new(0.0, 22.0, 20.0, 10.0)); + } + + #[test] + fn the_arrows_are_the_views_text_and_hover_colours() { + let t = crate::light(); + let c = BreezeSpinArrowColors::resolve(&t, true, false, false); + assert_eq!( + c.arrow, + arrow_color(t.colors.editor_fg, t.colors.surface_content) + ); + assert_eq!(rgba8(c.hover), [61, 174, 233, 255]); + let p = t.extension::().unwrap(); + let d = BreezeSpinArrowColors::resolve(&t, true, false, true); + assert_eq!( + d.arrow, + arrow_color( + p.role(ColorState::Disabled, PaletteRole::Text), + p.role(ColorState::Disabled, PaletteRole::Base), + ) + ); + } + + #[test] + fn a_theme_without_the_palette_paints_from_its_roles() { + let t = teksilo_core::presets::intui::light(); + let c = BreezeSpinArrowColors::resolve(&t, true, false, false); + assert_eq!( + c.arrow, + arrow_color(t.colors.text_primary, t.colors.surface_content) + ); + assert_eq!(c.hover, t.colors.border_focused); + } +} diff --git a/crates/teksilo-theme-kde/src/styles/text_input.rs b/crates/teksilo-theme-kde/src/styles/text_input.rs index 9a8a2426f..577230779 100644 --- a/crates/teksilo-theme-kde/src/styles/text_input.rs +++ b/crates/teksilo-theme-kde/src/styles/text_input.rs @@ -75,13 +75,13 @@ impl TextInputStyle for BreezeTextInputStyle { } let theme = ctx.theme(); let m = breeze_field_metrics_for(&theme.input, &theme.typography); - let chrome = ctx.add(BreezeFieldChrome { - is_focused: cfg.is_focused.clone(), - is_hovered: cfg.is_hovered.clone(), - is_disabled: cfg.is_disabled.clone(), - validation: cfg.validation.clone(), - underline: cfg.variant == TextInputVariant::Underline, - }); + let chrome = ctx.add(BreezeFieldChrome::new( + cfg.is_focused.clone(), + cfg.is_hovered.clone(), + cfg.is_disabled.clone(), + cfg.validation.clone(), + cfg.variant == TextInputVariant::Underline, + )); let padded = ctx.add( Padding::new(0.0, m.padding_horizontal, 0.0, m.padding_horizontal).child(cfg.editor), ); @@ -206,6 +206,29 @@ pub struct BreezeFieldChrome { underline: bool, } +impl BreezeFieldChrome { + /// A field frame outlined by the focus, hover and disabled states and a + /// validation level; with `underline`, only its bottom edge is outlined. + /// + /// The spin box frames its field with it, and a combo box's `Underline` + /// variant draws its bottom edge. + pub fn new( + is_focused: Signal, + is_hovered: Signal, + is_disabled: Signal, + validation: Signal, + underline: bool, + ) -> Self { + Self { + is_focused, + is_hovered, + is_disabled, + validation, + underline, + } + } +} + impl std::fmt::Debug for BreezeFieldChrome { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("BreezeFieldChrome") diff --git a/crates/teksilo-theme-kde/tests/mount.rs b/crates/teksilo-theme-kde/tests/mount.rs index 2368b00bd..c9e072a98 100644 --- a/crates/teksilo-theme-kde/tests/mount.rs +++ b/crates/teksilo-theme-kde/tests/mount.rs @@ -36,8 +36,8 @@ use teksilo_theme_kde::{self as kde, KdePalette, PlasmaAccent}; use teksilo_tokens::Color; use teksilo_widgets::primitives::{HStack, IconWidget}; use teksilo_widgets::{ - Button, ButtonVariant, CheckState, Checkbox, IconButton, IconButtonSize, MenuItem, RadioButton, - SplitButton, TextInput, Toggle, VStack, + Button, ButtonVariant, CheckState, Checkbox, ComboBox, IconButton, IconButtonSize, MenuItem, + RadioButton, Slider, SpinBox, SplitButton, TextInput, Toggle, VStack, }; const PIXELS_JSON: &str = include_str!(concat!( @@ -328,6 +328,60 @@ fn indicators_and_fields_mount_in_every_state_and_variant() { } } +#[test] +fn combo_boxes_spin_boxes_and_sliders_mount_in_every_state_and_variant() { + use teksilo_core::styles::{ComboBoxVariant, SliderVariant}; + use teksilo_tokens::Orientation; + use teksilo_widgets::SpinButtonLayout; + for (_, theme) in themes() { + for variant in [ + ComboBoxVariant::Outlined, + ComboBoxVariant::Filled, + ComboBoxVariant::Underline, + ComboBoxVariant::Plain, + ] { + for enabled in [true, false] { + let drawn = mount( + theme.clone(), + ComboBox::new(["Item", "Other"], Signal::new(Some("Item".to_string()))) + .variant(variant) + .enabled(enabled), + ); + assert!(drawn > 0, "{variant:?} painted nothing"); + } + } + for layout in [SpinButtonLayout::Stacked, SpinButtonLayout::Hidden] { + for enabled in [true, false] { + let drawn = mount( + theme.clone(), + SpinBox::new(Signal::new(3_i32), 0, 10) + .button_layout(layout) + .enabled(enabled), + ); + assert!(drawn > 0, "{layout:?} painted nothing"); + } + } + for orientation in [Orientation::Horizontal, Orientation::Vertical] { + for (variant, ticks) in [ + (SliderVariant::Continuous, None), + (SliderVariant::Discrete, Some(5)), + ] { + for enabled in [true, false] { + let mut slider = Slider::new(Signal::new(0.4), 0.0, 1.0) + .orientation(orientation) + .variant(variant) + .enabled(enabled); + if let Some(n) = ticks { + slider = slider.tick_count(n); + } + let drawn = mount(theme.clone(), slider); + assert!(drawn > 0, "{orientation:?} {variant:?} painted nothing"); + } + } + } + } +} + /// The styles read the theme at paint time, so a tree built under Breeze /// survives a live swap to the other scheme, out to another design language /// and back. @@ -343,7 +397,13 @@ fn a_mounted_tree_survives_a_theme_swap() { .child(Toggle::new(Signal::new(true))) .child(Checkbox::new(Signal::new(true)).label(lit!("On"))) .child(RadioButton::new(0, Signal::new(0_usize)).label(lit!("One"))) - .child(TextInput::new(Signal::new("text".to_string()))), + .child(TextInput::new(Signal::new("text".to_string()))) + .child(ComboBox::new( + ["A", "B"], + Signal::new(Some("A".to_string())), + )) + .child(SpinBox::new(Signal::new(3_i32), 0, 10)) + .child(Slider::new(Signal::new(0.4), 0.0, 1.0).tick_count(5)), ); for theme in [ kde::light(), @@ -378,6 +438,19 @@ fn the_styles_degrade_without_the_palette() { assert!(mount(bare.clone(), Checkbox::new(Signal::new(true))) > 0); assert!(mount(bare.clone(), RadioButton::new(0, Signal::new(0_usize))) > 0); assert!(mount(bare.clone(), TextInput::new(Signal::new(String::new()))) > 0); + assert!( + mount( + bare.clone(), + ComboBox::new(["A", "B"], Signal::new(Some("A".to_string()))) + ) > 0 + ); + assert!(mount(bare.clone(), SpinBox::new(Signal::new(3_i32), 0, 10)) > 0); + assert!( + mount( + bare.clone(), + Slider::new(Signal::new(0.5), 0.0, 1.0).tick_count(3) + ) > 0 + ); // The push button still has a face and an outline, from the roles. let (mut tree, _) = placed(bare.clone(), Button::new(lit!("Save"))); let frame = rerender(&mut tree); @@ -406,7 +479,13 @@ fn every_swatch_mounts() { .child(Toggle::new(Signal::new(true))) .child(Checkbox::new(Signal::new(true)).label(lit!("On"))) .child(RadioButton::new(0, Signal::new(0_usize)).label(lit!("One"))) - .child(TextInput::new(Signal::new(String::new()))), + .child(TextInput::new(Signal::new(String::new()))) + .child(ComboBox::new( + ["A", "B"], + Signal::new(Some("A".to_string())), + )) + .child(SpinBox::new(Signal::new(3_i32), 0, 10)) + .child(Slider::new(Signal::new(0.5), 0.0, 1.0)), ); assert!(drawn > 0, "{accent:?} painted nothing"); } @@ -1834,3 +1913,662 @@ fn reduced_motion_snaps_every_indicator() { assert!((d - 6.0).abs() < 0.01, "{scheme}: the dot, {d}"); } } + +// ── Combo boxes, spin boxes and sliders ───────────────────────────────── + +/// Every stroked path in `frame`: its colour and its points. +fn stroked_paths(frame: &RenderFrame) -> Vec<([u8; 4], Vec<[f32; 2]>)> { + frame + .paths + .iter() + .filter(|p| p.stroke_style.width > 0.0) + .map(|p| { + let points = p + .path + .commands() + .iter() + .filter_map(|c| match c { + teksilo_canvas::PathCommand::MoveTo(q) + | teksilo_canvas::PathCommand::LineTo(q) => Some([q.x, q.y]), + _ => None, + }) + .collect(); + (rgba8(p.color), points) + }) + .collect() +} + +/// The points of a Breeze arrow pointing `direction` in `rect`. +fn arrow_at( + rect: teksilo_canvas::Rect, + direction: teksilo_theme_kde::styles::arrow::ArrowDirection, +) -> Vec<[f32; 2]> { + teksilo_theme_kde::styles::arrow::arrow_points(rect, direction) + .iter() + .map(|p| [p.x, p.y]) + .collect() +} + +/// The one node of type `name` under `root`, and its bounds. +fn the_node(tree: &WidgetTree, root: WidgetId, name: &str) -> (WidgetId, teksilo_canvas::Rect) { + let nodes = nodes_named(tree, root, name); + assert_eq!(nodes.len(), 1, "one {name}"); + (nodes[0], tree.bounds(nodes[0])) +} + +fn combo() -> ComboBox { + ComboBox::new( + ["Item", "Longer item text"], + Signal::new(Some("Item".to_string())), + ) +} + +/// A combo box at rest is Plasma's push button, face, outline and shadow, +/// 32 px tall, with its arrow in the 20 px box 2 px inside the trailing +/// edge, in the arrow colour of the button text. +#[test] +fn a_combo_box_is_a_push_button_with_breezes_arrow() { + use teksilo_theme_kde::styles::arrow::ArrowDirection; + use teksilo_theme_kde::styles::combo_box::combo_arrow_color; + for (scheme, theme) in themes() { + let (mut tree, id) = placed(theme.clone(), combo()); + let frame = rerender(&mut tree); + let b = tree.bounds(id); + assert_eq!(b.height, 32.0, "{scheme}"); + assert!( + fills(&frame).contains(&sample(scheme, "combo_box.normal", 40, 16)), + "{scheme}: no face in {:?}", + fills(&frame) + ); + let outline = sample(scheme, "combo_box.normal", 1, 16); + let stroke = painted(&frame) + .into_iter() + .find(|p| p.stroke > 0.0 && p.color == outline) + .unwrap_or_else(|| panic!("{scheme}: no outline in {:?}", painted(&frame))); + assert_eq!( + stroke.screen, + [b.x + 1.5, b.y + 1.5, b.width - 3.0, b.height - 3.0] + ); + assert!(has_shadow(&frame), "{scheme}: no shadow"); + assert!(near( + over(SHADOW, rgba8_of(theme.colors.surface_main)), + sample(scheme, "combo_box.normal", 40, 31) + )); + let arrow_box = teksilo_canvas::Rect::new(b.x + b.width - 22.0, b.y + 6.0, 20.0, 20.0); + let rest = rgba8_of(combo_arrow_color(&theme, true, false, false, false)); + assert!( + stroked_paths(&frame).contains(&(rest, arrow_at(arrow_box, ArrowDirection::Down))), + "{scheme}: no arrow in {:?}", + stroked_paths(&frame) + ); + } +} + +/// Under the pointer the outline turns to the highlight and the arrow keeps +/// its colour; with keyboard focus the outline is the highlight, the arrow +/// the window text, and the focus frame is drawn around the node. +#[test] +fn a_hovered_or_focused_combo_box_is_outlined_in_the_highlight() { + use teksilo_theme_kde::styles::combo_box::combo_arrow_color; + for (scheme, theme) in themes() { + let (mut tree, id) = placed(theme.clone(), combo()); + let b = tree.bounds(id); + tree.pointer_move(b.center()); + let frame = rerender(&mut tree); + assert!( + strokes(&frame).contains(&sample(scheme, "combo_box.hover", 1, 16)), + "{scheme}: hovered" + ); + let rest = rgba8_of(combo_arrow_color(&theme, true, false, false, false)); + assert!( + stroked_paths(&frame).iter().any(|(c, _)| *c == rest), + "{scheme}: the arrow keeps its colour under the pointer" + ); + + let (mut tree, id) = placed(theme.clone(), combo()); + tree.press_key(Key::Tab, Modifiers::NONE); + let frame = rerender(&mut tree); + let b = tree.bounds(id); + assert!( + strokes(&frame).contains(&sample(scheme, "combo_box.focus", 1, 16)), + "{scheme}: focused" + ); + let text = rgba8_of(theme.colors.text_primary); + assert!( + stroked_paths(&frame).iter().any(|(c, _)| *c == text), + "{scheme}: the focused arrow is the window text" + ); + let ring = rgba8_of(theme.colors.focus_ring); + let focus = painted(&frame) + .into_iter() + .find(|p| p.color == ring && p.stroke == 2.0) + .unwrap_or_else(|| panic!("{scheme}: no focus frame")); + assert_eq!(focus.screen, [b.x, b.y, b.width, b.height]); + } +} + +/// Right to left, the arrow box is 2 px inside the left edge and the label +/// starts 6 px inside the right one. +#[test] +fn right_to_left_mirrors_the_combo_box() { + use teksilo_core::environment::LayoutDirection; + use teksilo_theme_kde::styles::arrow::ArrowDirection; + for (scheme, theme) in themes() { + let mut tree = tree_with(theme.clone()); + tree.set_layout_direction(LayoutDirection::RightToLeft); + let root = tree.add(VStack::new().child(HStack::new().child(combo()))); + tree.layout(SizeProposal::exact(400.0, 300.0)); + let (node, b) = the_node(&tree, root, "BreezeComboLayout"); + let frame = rerender(&mut tree); + let arrow_box = teksilo_canvas::Rect::new(b.x + 2.0, b.y + 6.0, 20.0, 20.0); + let expected = arrow_at(arrow_box, ArrowDirection::Down); + assert!( + stroked_paths(&frame).iter().any(|(_, p)| *p == expected), + "{scheme}: no mirrored arrow in {:?}", + stroked_paths(&frame) + ); + let (_, label) = the_node(&tree, node, "TextWidget"); + assert_eq!(b.x + b.width - (label.x + label.width), 6.0, "{scheme}"); + } +} + +/// A spin box is the line edit, 32 px tall, with its two arrows in the 20 x +/// 10 halves of the column 2 px inside the trailing edge, in the arrow +/// colour of the view's text; the step buttons paint nothing of their own. +#[test] +fn a_spin_box_is_a_line_edit_with_two_arrows() { + use teksilo_theme_kde::styles::arrow::ArrowDirection; + use teksilo_theme_kde::styles::spin_box::BreezeSpinArrowColors; + for (scheme, theme) in themes() { + let (mut tree, id) = placed(theme.clone(), SpinBox::new(Signal::new(3_i32), 0, 10)); + let (_, b) = the_node(&tree, id, "BreezeSpinLayout"); + assert_eq!(b.height, 32.0, "{scheme}"); + let frame = rerender(&mut tree); + let rest = rgba8_of(theme.colors.border_strong); + let outline = painted(&frame) + .into_iter() + .find(|p| p.stroke > 0.0 && p.color == rest) + .unwrap_or_else(|| panic!("{scheme}: no lifted outline in {:?}", painted(&frame))); + assert_eq!( + outline.screen, + [b.x + 0.5, b.y + 0.5, b.width - 1.0, b.height - 1.0] + ); + assert!( + painted(&frame).iter().any(|p| p.stroke == 0.0 + && p.color == sample(scheme, "spin_box.normal", 50, 16) + && p.screen == outline.screen), + "{scheme}: no view fill on the frame" + ); + assert_ne!( + sample(scheme, "spin_box.normal", 0, 16), + rest, + "{scheme}: the premise of D6" + ); + let arrow = rgba8_of(BreezeSpinArrowColors::resolve(&theme, true, false, false).arrow); + let x = b.x + b.width - 22.0; + let up = teksilo_canvas::Rect::new(x, b.y + 6.0, 20.0, 10.0); + let down = teksilo_canvas::Rect::new(x, b.y + 16.0, 20.0, 10.0); + let paths = stroked_paths(&frame); + assert_eq!( + paths, + vec![ + (arrow, arrow_at(up, ArrowDirection::Up)), + (arrow, arrow_at(down, ArrowDirection::Down)), + ], + "{scheme}: only Breeze's two arrows" + ); + // The step buttons press on Breeze's halves. + let steps = nodes_named(&tree, id, "StepButton"); + assert_eq!(steps.len(), 2, "{scheme}"); + assert_eq!(tree.bounds(steps[0]), up, "{scheme}: the up half"); + assert_eq!(tree.bounds(steps[1]), down, "{scheme}: the down half"); + } +} + +/// Under the pointer the frame is outlined in the hover colour and the +/// arrow of the half under it turns to the hover colour; a press there +/// still steps the value. +#[test] +fn a_hovered_spin_box_half_turns_to_the_hover_colour() { + use teksilo_theme_kde::styles::spin_box::BreezeSpinArrowColors; + for (scheme, theme) in themes() { + let value = Signal::new(3_i32); + let (mut tree, id) = placed(theme.clone(), SpinBox::new(value.clone(), 0, 10)); + let steps = nodes_named(&tree, id, "StepButton"); + let up = tree.bounds(steps[0]); + tree.pointer_move(up.center()); + let frame = rerender(&mut tree); + let c = BreezeSpinArrowColors::resolve(&theme, true, false, false); + let paths = stroked_paths(&frame); + assert_eq!(paths.len(), 2, "{scheme}"); + assert_eq!(paths[0].0, rgba8_of(c.hover), "{scheme}: the up arrow"); + assert_eq!(paths[1].0, rgba8_of(c.arrow), "{scheme}: the down arrow"); + assert!( + strokes(&frame).contains(&sample(scheme, "spin_box.hover", 0, 16)), + "{scheme}: the hover outline in {:?}", + strokes(&frame) + ); + tree.pointer_down_button(up.center(), PointerButton::Primary); + tree.pointer_up_button(up.center(), PointerButton::Primary); + assert_eq!(value.get(), 4, "{scheme}: the up half steps"); + } +} + +/// Right to left, the column is 2 px inside the left edge. +#[test] +fn right_to_left_mirrors_the_spin_box() { + use teksilo_core::environment::LayoutDirection; + for (scheme, theme) in themes() { + let mut tree = tree_with(theme.clone()); + tree.set_layout_direction(LayoutDirection::RightToLeft); + let root = tree.add(VStack::new().child(HStack::new().child(SpinBox::new( + Signal::new(3_i32), + 0, + 10, + )))); + tree.layout(SizeProposal::exact(400.0, 300.0)); + let (_, b) = the_node(&tree, root, "BreezeSpinLayout"); + let steps = nodes_named(&tree, root, "StepButton"); + assert_eq!( + tree.bounds(steps[0]), + teksilo_canvas::Rect::new(b.x + 2.0, b.y + 6.0, 20.0, 10.0), + "{scheme}" + ); + } +} + +/// A disabled spin box: the disabled view fill in the disabled outline, its +/// arrows in the arrow colour of the disabled view's text. +#[test] +fn a_disabled_spin_box_paints_the_disabled_colours() { + use teksilo_theme_kde::styles::spin_box::BreezeSpinArrowColors; + for (scheme, theme) in themes() { + let (mut tree, _) = placed( + theme.clone(), + SpinBox::new(Signal::new(3_i32), 0, 10).enabled(false), + ); + let frame = rerender(&mut tree); + assert!( + fills(&frame).contains(&sample(scheme, "line_edit.disabled", 75, 16)), + "{scheme}" + ); + assert!(strokes(&frame).contains(&rgba8_of(theme.colors.border_disabled))); + let arrow = rgba8_of(BreezeSpinArrowColors::resolve(&theme, true, false, true).arrow); + assert!( + stroked_paths(&frame).iter().all(|(c, _)| *c == arrow), + "{scheme}" + ); + } +} + +/// A slider at 30 % in a 200 px node, as Plasma's: the groove's two parts, +/// the handle's face, its D6 outline, its shadow ring. +fn slider_at( + theme: &Theme, + value: f32, + direction: teksilo_core::environment::LayoutDirection, + slider: impl FnOnce(Signal) -> Slider, +) -> (WidgetTree, WidgetId, Signal) { + let value = Signal::new(value); + let mut tree = tree_with(theme.clone()); + tree.set_layout_direction(direction); + let root = tree.add( + VStack::new().child( + teksilo_widgets::primitives::FixedSize::new() + .width(200.0) + .child(slider(value.clone())), + ), + ); + tree.layout(SizeProposal::exact(400.0, 300.0)); + (tree, root, value) +} + +fn slider_parts( + tree: &WidgetTree, + root: WidgetId, + value: f32, + direction: teksilo_core::environment::LayoutDirection, +) -> ( + teksilo_canvas::Rect, + teksilo_theme_kde::styles::slider::SliderGeometry, +) { + use teksilo_core::styles::SliderOrientation; + let (_, b) = the_node(tree, root, "BreezeSliderBody"); + let g = teksilo_theme_kde::styles::slider::slider_geometry( + b, + value, + SliderOrientation::Horizontal, + direction, + false, + ); + (b, g) +} + +fn inset(r: teksilo_canvas::Rect) -> [f32; 4] { + [r.x + 0.5, r.y + 0.5, r.width - 1.0, r.height - 1.0] +} + +#[test] +fn a_slider_is_breezes_groove_and_handle() { + use teksilo_core::environment::LayoutDirection; + let ltr = LayoutDirection::LeftToRight; + for (scheme, theme) in themes() { + let (mut tree, root, _) = slider_at(&theme, 0.3, ltr, |v| Slider::new(v, 0.0, 1.0)); + let (b, g) = slider_parts(&tree, root, 0.3, ltr); + assert_eq!(b.height, 24.0, "{scheme}: raised to the target"); + assert_eq!(g.handle.width, 20.0); + let frame = rerender(&mut tree); + let all = painted(&frame); + let groove = all + .iter() + .find(|p| p.stroke == 0.0 && p.screen == inset(g.groove)) + .unwrap_or_else(|| panic!("{scheme}: no groove in {all:?}")); + assert!( + near(groove.color, sample(scheme, "slider.normal", 190, 10)), + "{scheme}: the groove {:?}", + groove.color + ); + // Breeze's radius 3, which the canvas holds to half the thickness of + // the 5 px groove (6, inset by half the pen). + assert_eq!(groove.radius, 2.5); + let fill = all + .iter() + .find(|p| p.stroke == 0.0 && p.screen == inset(g.fill)) + .unwrap_or_else(|| panic!("{scheme}: no fill in {all:?}")); + assert!( + near(fill.color, sample(scheme, "slider.normal", 10, 10)), + "{scheme}: the fill {:?}", + fill.color + ); + let circles: Vec<_> = all + .iter() + .filter(|p| p.kind == ShapeKind::Circle && p.screen[2] == 17.0) + .collect(); + let face = circles + .iter() + .find(|p| p.stroke == 0.0) + .unwrap_or_else(|| panic!("{scheme}: no handle face")); + assert_eq!( + face.color, + sample(scheme, "slider.normal", 63, 10), + "{scheme}" + ); + assert_eq!( + [face.screen[0], face.screen[1]], + [g.handle.x + 1.5, g.handle.y + 1.5], + "{scheme}: the box inset by 1, then stroked" + ); + let outline = rgba8_of(theme.colors.border_strong); + assert!( + circles + .iter() + .any(|p| p.stroke == 1.0 && p.color == outline), + "{scheme}: no lifted outline in {circles:?}" + ); + assert_ne!( + sample(scheme, "slider.normal", 63, 1), + outline, + "{scheme}: the premise of D6" + ); + assert!( + circles.iter().any(|p| p.stroke == 1.0 && p.color == SHADOW), + "{scheme}: no shadow ring" + ); + } +} + +/// Hovered, the handle is outlined in the hover colour; focused from the +/// keyboard, in the lifted focus colour, with the focus frame around it; +/// dragged, it casts no shadow. +#[test] +fn a_slider_handle_shows_hover_focus_and_press() { + use teksilo_core::environment::LayoutDirection; + let ltr = LayoutDirection::LeftToRight; + for (scheme, theme) in themes() { + let hover = theme + .extension::() + .unwrap() + .colors(teksilo_theme_kde::scheme::ColorState::Active) + .hover; + let (mut tree, root, _) = slider_at(&theme, 0.3, ltr, |v| Slider::new(v, 0.0, 1.0)); + let (_, g) = slider_parts(&tree, root, 0.3, ltr); + tree.pointer_move(g.handle.center()); + let frame = rerender(&mut tree); + assert!( + painted(&frame).iter().any(|p| p.kind == ShapeKind::Circle + && p.stroke == 1.0 + && p.color == rgba8_of(hover)), + "{scheme}: no hover outline" + ); + tree.pointer_down_button(g.handle.center(), PointerButton::Primary); + let c = g.handle.center(); + tree.pointer_move(teksilo_canvas::Point::new(c.x + 12.0, c.y)); + let frame = rerender(&mut tree); + assert!( + !strokes(&frame).contains(&SHADOW), + "{scheme}: a dragged handle casts no shadow" + ); + tree.pointer_up_button(g.handle.center(), PointerButton::Primary); + + let (mut tree, root, _) = slider_at(&theme, 0.3, ltr, |v| Slider::new(v, 0.0, 1.0)); + let (_, g) = slider_parts(&tree, root, 0.3, ltr); + tree.press_key(Key::Tab, Modifiers::NONE); + let frame = rerender(&mut tree); + let focus = rgba8_of(theme.colors.border_focused); + assert!( + painted(&frame) + .iter() + .any(|p| p.kind == ShapeKind::Circle && p.stroke == 1.0 && p.color == focus), + "{scheme}: no focus outline" + ); + let ring = rgba8_of(theme.colors.focus_ring); + let frame_ring = painted(&frame) + .into_iter() + .find(|p| p.color == ring && p.stroke == 2.0) + .unwrap_or_else(|| panic!("{scheme}: no focus frame")); + assert_eq!( + frame_ring.screen, + [g.handle.x, g.handle.y, 20.0, 20.0], + "{scheme}: from 1 px inside the box to 1 px outside it" + ); + } +} + +/// Disabled, only the groove's background part is painted, in the disabled +/// colours, and the handle is the disabled button colour. +#[test] +fn a_disabled_slider_paints_only_the_groove_in_the_disabled_colours() { + use teksilo_core::environment::LayoutDirection; + let ltr = LayoutDirection::LeftToRight; + for (scheme, theme) in themes() { + let (mut tree, root, _) = slider_at(&theme, 0.3, ltr, |v| { + Slider::new(v, 0.0, 1.0).enabled(false) + }); + let (_, g) = slider_parts(&tree, root, 0.3, ltr); + let frame = rerender(&mut tree); + let all = painted(&frame); + assert!( + !all.iter().any(|p| p.screen == inset(g.fill)), + "{scheme}: no fill part" + ); + let groove = all + .iter() + .find(|p| p.stroke == 0.0 && p.screen == inset(g.groove)) + .unwrap_or_else(|| panic!("{scheme}: no groove")); + assert!( + near(groove.color, sample(scheme, "slider.disabled", 190, 10)), + "{scheme}: {:?}", + groove.color + ); + assert!( + all.iter().any(|p| p.kind == ShapeKind::Circle + && p.stroke == 0.0 + && p.color == sample(scheme, "slider.disabled", 63, 10)), + "{scheme}: the disabled handle" + ); + } +} + +/// A vertical slider has its minimum at the bottom, and its groove is +/// filled from the top down to the handle's centre, as Breeze fills a +/// vertical slider that is not inverted (spec k.5.10); a press puts the +/// value where the handle is then painted. +#[test] +fn a_vertical_slider_fills_from_the_top_to_the_handle() { + use teksilo_core::environment::LayoutDirection; + use teksilo_core::styles::SliderOrientation; + use teksilo_tokens::Orientation; + let ltr = LayoutDirection::LeftToRight; + for (scheme, theme) in themes() { + let value = Signal::new(0.25_f32); + let mut tree = tree_with(theme.clone()); + let root = tree.add( + VStack::new().child( + teksilo_widgets::primitives::FixedSize::new() + .height(200.0) + .child( + Slider::new(value.clone(), 0.0, 1.0) + .orientation(Orientation::Vertical) + .jump_on_press(true), + ), + ), + ); + tree.layout(SizeProposal::exact(400.0, 300.0)); + let (_, b) = the_node(&tree, root, "BreezeSliderBody"); + assert_eq!(b.height, 200.0, "{scheme}"); + assert_eq!(b.width, 24.0, "{scheme}: raised to the target"); + let g = teksilo_theme_kde::styles::slider::slider_geometry( + b, + 0.25, + SliderOrientation::Vertical, + ltr, + false, + ); + assert_eq!( + g.handle.center().y, + b.y + b.height - 10.0 - 180.0 * 0.25, + "{scheme}: a quarter up from the bottom" + ); + let frame = rerender(&mut tree); + let fill = painted(&frame) + .into_iter() + .find(|p| p.stroke == 0.0 && p.screen == inset(g.fill)) + .unwrap_or_else(|| panic!("{scheme}: no fill")); + assert_eq!(fill.screen[1], b.y + 0.5, "{scheme}: from the top"); + assert_eq!( + fill.screen[1] + fill.screen[3], + g.handle.center().y - 0.5, + "{scheme}: down to the handle's centre" + ); + assert!( + near(fill.color, sample(scheme, "slider.normal", 10, 10)), + "{scheme}: the fill {:?}", + fill.color + ); + + // 55 px down from the top, a quarter of the 180 px travel past the + // handle's half from the maximum: 75 %. + let at = teksilo_canvas::Point::new(b.x + b.width * 0.5, b.y + 55.0); + tree.pointer_down_button(at, PointerButton::Primary); + tree.pointer_up_button(at, PointerButton::Primary); + let v = value.get(); + assert!( + (v - 0.75).abs() < 1e-4, + "{scheme}: the top is the high end, {v}" + ); + let frame = rerender(&mut tree); + let face = painted(&frame) + .into_iter() + .find(|p| p.kind == ShapeKind::Circle && p.stroke == 0.0 && p.screen[2] == 17.0) + .unwrap_or_else(|| panic!("{scheme}: no handle")); + assert!( + (face.screen[1] + 8.5 - at.y).abs() < 0.01, + "{scheme}: the handle is under the pointer" + ); + let g = teksilo_theme_kde::styles::slider::slider_geometry( + b, + v, + SliderOrientation::Vertical, + ltr, + false, + ); + let fill = painted(&frame) + .into_iter() + .find(|p| p.stroke == 0.0 && p.screen == inset(g.fill)) + .unwrap_or_else(|| panic!("{scheme}: no fill at {v}")); + assert_eq!(fill.screen[3], 55.0 - 1.0, "{scheme}: the top 55 px, inset"); + } +} + +/// Right to left, the handle, the fill and the ticks run from the right, +/// and a press puts the value where the handle is then painted: the paint +/// and the `Slider`'s pointer mapping agree. +#[test] +fn right_to_left_mirrors_the_slider_and_keeps_the_handle_under_the_pointer() { + use teksilo_core::environment::LayoutDirection; + let rtl = LayoutDirection::RightToLeft; + for (scheme, theme) in themes() { + let (mut tree, root, value) = slider_at(&theme, 0.25, rtl, |v| { + Slider::new(v, 0.0, 1.0).jump_on_press(true) + }); + let (b, g) = slider_parts(&tree, root, 0.25, rtl); + assert_eq!( + g.handle.x, + b.x + b.width - 20.0 - (b.width - 20.0) * 0.25, + "{scheme}: a quarter in from the right" + ); + let frame = rerender(&mut tree); + let fill = painted(&frame) + .into_iter() + .find(|p| p.stroke == 0.0 && p.screen == inset(g.fill)) + .unwrap_or_else(|| panic!("{scheme}: no mirrored fill")); + assert_eq!(fill.screen[0] + fill.screen[2], b.x + b.width - 0.5); + + // 55 px in from the left, a quarter of the 180 px travel past the + // handle's half: 75 %, on the slider's step. + let at = teksilo_canvas::Point::new(b.x + 55.0, b.y + b.height * 0.5); + tree.pointer_down_button(at, PointerButton::Primary); + tree.pointer_up_button(at, PointerButton::Primary); + let v = value.get(); + assert!( + (v - 0.75).abs() < 1e-4, + "{scheme}: the left is the high end, {v}" + ); + let frame = rerender(&mut tree); + let (_, g) = slider_parts(&tree, root, v, rtl); + let face = painted(&frame) + .into_iter() + .find(|p| p.kind == ShapeKind::Circle && p.stroke == 0.0 && p.screen[2] == 17.0) + .unwrap_or_else(|| panic!("{scheme}: no handle")); + assert!( + (face.screen[0] + 8.5 - at.x).abs() < 0.01, + "{scheme}: the handle is under the pointer" + ); + assert!((g.handle.center().x - at.x).abs() < 0.01); + } + + // The ticks of a discrete slider mirror with it: the minimum's tick is at + // the right, in the highlight up to the value. + let theme = kde::light(); + let (mut tree, root, _) = + slider_at(&theme, 0.5, rtl, |v| Slider::new(v, 0.0, 1.0).tick_count(3)); + let (_, b) = the_node(&tree, root, "BreezeSliderBody"); + let frame = rerender(&mut tree); + let colors = + teksilo_theme_kde::styles::slider::BreezeSliderColors::resolve(&theme, true, false, false); + let mut ticks: Vec<([u8; 4], f32)> = frame + .decorations + .iter() + .filter(|d| d.rect[2] == 1.0 && d.rect[3] == 8.0) + .map(|d| (rgba8(d.color), d.rect[0] + 0.5 - b.x)) + .collect(); + ticks.sort_by(|a, b| a.1.total_cmp(&b.1)); + assert_eq!( + ticks, + vec![ + (rgba8_of(colors.tick_off), 10.0), + (rgba8_of(colors.tick_on), 100.0), + (rgba8_of(colors.tick_on), 190.0), + ] + ); +} diff --git a/crates/teksilo-theme-kde/tests/preset_metrics.rs b/crates/teksilo-theme-kde/tests/preset_metrics.rs index 655069623..fdc7307c6 100644 --- a/crates/teksilo-theme-kde/tests/preset_metrics.rs +++ b/crates/teksilo-theme-kde/tests/preset_metrics.rs @@ -34,8 +34,8 @@ use teksilo_theme_kde::{self as kde}; use teksilo_tokens::TargetDensity; use teksilo_widgets::primitives::IconWidget; use teksilo_widgets::{ - Button, ButtonVariant, Checkbox, IconButton, IconButtonSize, MenuItem, RadioButton, - SplitButton, TextInput, Toggle, + Button, ButtonVariant, Checkbox, ComboBox, IconButton, IconButtonSize, MenuItem, RadioButton, + Slider, SpinBox, SplitButton, TextInput, Toggle, }; const SIZES_JSON: &str = include_str!(concat!( @@ -484,3 +484,159 @@ fn a_text_field_measures_breezes_line_edit_at_every_density() { } } } + +// ── Combo boxes ──────────────────────────────────────────────────────── + +/// A combo box is 32 px tall at Compact, Qt's Breeze combo box, rising to +/// the density's target size above it, with its arrow box 2 px inside the +/// trailing edge and its label 6 px inside the leading one (more at the +/// denser ladders, by their spacing). +#[test] +fn a_combo_box_measures_breezes_at_every_density() { + assert_eq!(qt_size("combo_box", None).1, 32.0); + let g = BreezeGeometry::breeze_default(); + assert_eq!(g.combo_box_height, 32.0); + for (density, height, leading) in [ + (TargetDensity::Compact, 32.0, 6.0), + (TargetDensity::Comfortable, 32.0, 6.9), + (TargetDensity::Touch, 44.0, 7.8), + ] { + for theme in themes() { + let (tree, root) = in_a_row( + &theme, + density, + ComboBox::new(["Item", "Other"], Signal::new(Some("Item".to_string()))), + ); + let layout = nodes_named(&tree, root, "BreezeComboLayout"); + assert_eq!(layout.len(), 1); + let b = tree.bounds(layout[0]); + assert_eq!(b.height, height, "{density:?}"); + let arrow = nodes_named(&tree, layout[0], "BreezeComboArrow"); + let a = tree.bounds(arrow[0]); + assert_eq!( + [b.x + b.width - (a.x + a.width), a.width, a.height], + [2.0, 20.0, 20.0], + "{density:?}: the arrow box" + ); + assert_eq!(a.y - b.y, (height - 20.0) * 0.5, "{density:?}: centred"); + let label = nodes_named(&tree, layout[0], "TextWidget"); + assert!( + (tree.bounds(label[0]).x - b.x - leading).abs() < 1e-3, + "{density:?}: the label" + ); + assert_eq!( + target_audit(&tree, density) + .into_iter() + .filter(|v| v.rule.is_conformance_failure()) + .count(), + 0, + "{density:?}: a conformance failure" + ); + } + } +} + +// ── Spin boxes ───────────────────────────────────────────────────────── + +/// A spin box's frame is 32 px at Compact, Qt's Breeze spin box, rising to +/// the density's target size, and its arrow column is Breeze's at every +/// density: 20 px wide, 2 px inside the trailing edge, two 10 px halves +/// centred in the frame, where the step buttons press. +/// +/// The halves are under the target size, at every density; the value has +/// keyboard, wheel and assistive-action equivalents, so they are the only +/// conformance failures the row reports, one per half. +#[test] +fn a_spin_box_measures_breezes_at_every_density() { + assert_eq!(qt_size("spin_box.0_99", None).1, 32.0); + let g = BreezeGeometry::breeze_default(); + assert_eq!(g.spin_box_height, 32.0); + for (density, height) in [ + (TargetDensity::Compact, 32.0), + (TargetDensity::Comfortable, 32.0), + (TargetDensity::Touch, 44.0), + ] { + for theme in themes() { + let (tree, root) = in_a_row(&theme, density, SpinBox::new(Signal::new(3_i32), 0, 10)); + let layout = nodes_named(&tree, root, "BreezeSpinLayout"); + assert_eq!(layout.len(), 1); + let b = tree.bounds(layout[0]); + assert_eq!(b.height, height, "{density:?}"); + let steps = nodes_named(&tree, layout[0], "StepButton"); + assert_eq!(steps.len(), 2); + let top = (height - 20.0) * 0.5; + for (step, y) in steps.iter().zip([top, top + 10.0]) { + let s = tree.bounds(*step); + assert_eq!( + [ + b.x + b.width - (s.x + s.width), + s.y - b.y, + s.width, + s.height + ], + [2.0, y, 20.0, 10.0], + "{density:?}: a half" + ); + } + let failures: Vec<_> = target_audit(&tree, density) + .into_iter() + .filter(|v| v.rule.is_conformance_failure()) + .collect(); + assert_eq!(failures.len(), 2, "{density:?}: {failures:?}"); + assert!( + failures.iter().all(|v| v.widget.ends_with("StepButton")), + "{density:?}: {failures:?}" + ); + } + } +} + +// ── Sliders ──────────────────────────────────────────────────────────── + +/// A slider is 84 px long when nothing proposes a length, Qt's size hint, +/// and 20 px thick (23 with a row of ticks), raised to the density's target +/// size across the groove: 24, 32 and 44. +#[test] +fn a_slider_measures_breezes_at_every_density() { + assert_eq!(qt_size("slider.horizontal", None), (84.0, 20.0)); + assert_eq!(qt_size("slider.horizontal.ticks_below", None), (84.0, 23.0)); + assert_eq!(qt_size("slider.vertical", None), (20.0, 84.0)); + use teksilo_tokens::Orientation; + for (density, cross) in [ + (TargetDensity::Compact, 24.0), + (TargetDensity::Comfortable, 32.0), + (TargetDensity::Touch, 44.0), + ] { + for theme in themes() { + for ticks in [None, Some(5)] { + for orientation in [Orientation::Horizontal, Orientation::Vertical] { + let mut slider = + Slider::new(Signal::new(0.5), 0.0, 1.0).orientation(orientation); + if let Some(n) = ticks { + slider = slider.tick_count(n); + } + let (tree, root) = in_a_row(&theme, density, slider); + let body = nodes_named(&tree, root, "BreezeSliderBody"); + assert_eq!(body.len(), 1); + let b = tree.bounds(body[0]); + let (along, across) = match orientation { + Orientation::Horizontal => (b.width, b.height), + Orientation::Vertical => (b.height, b.width), + }; + assert_eq!(across, cross, "{density:?} {orientation:?} {ticks:?}"); + if orientation == Orientation::Horizontal { + assert_eq!(along, 84.0, "{density:?} {ticks:?}"); + } + assert_eq!( + target_audit(&tree, density) + .into_iter() + .filter(|v| v.rule.is_conformance_failure()) + .count(), + 0, + "{density:?} {orientation:?}: a conformance failure" + ); + } + } + } + } +} From 49a8dbb135d453985d5b305e251d1a83a773101b Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 18:20:54 +0200 Subject: [PATCH 25/59] feat(theme-kde): paint menus, popovers and tooltips as Breeze does The preset installs three more structural styles: menu_item, popover and tooltip. The three slots leave KDE_UNFILLED. The menu dimensions are in styles::metrics (BreezeMenuMetrics), and the popover and the tooltip share one frame painter, styles::popup. Menu item, spec k.4 and k.5.13: 29 px at Compact, max(H, 20, 16) + 1 and the 4 px item margin above and below, through dp(.., Target), so 32 and 44 above it; a separator 5 px, scaled by spacing(); the rows 4 px inside the frame, MenuList's own inset. The row is laid out as Breeze lays out a menu with icons, since MenuItem reserves its leading column on every row: the icon column 12 px inside the row (the 4 px margin and the 8 px text margin), 16 wide, the text 3 px after it, and a 27 px trailing column (3 after the text, the 20 px arrow box, the 4 px margin); the shortcut gap is the 16 px accelerator space. The style stores a MenuItemRecipe built from the theme's input tokens and typography at install time, so metrics() follows the density the theme is projected to; the row arithmetic is the shipped RecipeMenuItemStyle's, its own highlight held off, and the row is floored at its height. Highlighted (hovered, reached by the keyboard, or a trigger whose submenu is open), the row is washed with the view's focus decoration at 0.3 and outlined at radius 4.5 on the row inset by half the pen; a disabled row is never highlighted; held down it is filled and outlined, and pressed_label_role (G3) turns its label and shortcut to TextRole::OnAccent. Popover and tooltip, spec k.5.13, k.5.18 and k.6: a rounded frame at radius 4.5 on the node inset by half the pen, the frame background in the frame outline (surface_raised and border) or the tooltip background in its outline (tooltip_bg and tooltip_border), over both layers of the Large window shadow, shadow_lg and shadow_inner_lg, on the 5 px window. A menu's frame has no padding; a popover's and a tooltip's content lies 4 px inside it through spacing(), so a one-line body tooltip is 26 px. The Menu variant's node is a bare GenericContainer, the others a named dialog, the tooltip frame hidden, as the framework's surfaces are. Departures, documented in each module: D5 lifts the highlight outline, Breeze Light's 57,154,204 at 2.9:1 on the frame background, in luma to 3:1 (4.5:1 under high contrast) on the window, view and frame background, with a premise test, Breeze Dark's kept; D1 fills a pressed row with accent rather than the focus colour, the colour text_on_accent is chosen for, the two being the same in the stock schemes; a popup draws no caret, a shadow on every side, and is always rounded and opaque; the frame outline is the passive frame's, not lifted. The crate's known limitations list what the menu widgets build themselves: the shortcut keeps the framework's shortcut role, not Breeze's window text at 0.7 (MenuItem gives its style no hook for it); a separator line runs the row width; a section title is the app's MenuList::header widget, which BreezeMenuMetrics::section_height (28) can size; a menu without icons keeps the icon column; a checkable row shows the framework's check mark; TooltipWidget writes in the small style, so its tooltip is the small line box plus 8. Tests: unit tests of the menu metrics at every density and font size, the recipe and metrics, the state precedence and paint rules, Breeze Light's and Dark's wash and outline against Plasma's pixels, the D5 lift and its premise including high contrast, the label on the wash and the pressed fill with every Plasma accent in both window states, the palette-less fallback, the popup colours against pixels.json and the popover and tooltip padding; lib.rs reprojects the menu metrics through with_density; tests/mount.rs mounts menus, tooltips and every popover variant, light and dark, hovers and presses every row, swaps themes and drops KdePalette, mounts every swatch, and checks the menu panel, the tooltip and the popover faces and outlines against pixels.json with both shadow layers, the rows in the 4 px margin, the hovered row's exact wash and outline, the pressed row's fill and flipped label, the disabled row, and no caret; tests/preset_metrics.rs measures the menu rows, separator, margin and label inset at all three densities against sizes.json, with the conformance gate. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 19 +- crates/teksilo-theme-kde/src/lib.rs | 95 ++- crates/teksilo-theme-kde/src/styles.rs | 10 +- .../teksilo-theme-kde/src/styles/menu_item.rs | 596 ++++++++++++++++++ .../teksilo-theme-kde/src/styles/metrics.rs | 146 ++++- .../teksilo-theme-kde/src/styles/popover.rs | 94 +++ crates/teksilo-theme-kde/src/styles/popup.rs | 280 ++++++++ .../teksilo-theme-kde/src/styles/tooltip.rs | 88 +++ crates/teksilo-theme-kde/tests/mount.rs | 403 +++++++++++- .../teksilo-theme-kde/tests/preset_metrics.rs | 109 +++- 10 files changed, 1806 insertions(+), 34 deletions(-) create mode 100644 crates/teksilo-theme-kde/src/styles/menu_item.rs create mode 100644 crates/teksilo-theme-kde/src/styles/popover.rs create mode 100644 crates/teksilo-theme-kde/src/styles/popup.rs create mode 100644 crates/teksilo-theme-kde/src/styles/tooltip.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 2947cca0c..43f1d6fb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -171,11 +171,20 @@ by crate for clarity, not because crates version independently. the hover colour under the pointer. A `Slider` is Breeze's 6 px groove, filled toward the highlight up to a 17 px round handle in the button colour, with tick marks below it when it has a tick count, mirrored right - to left; its node grows to the density's target size. The outlines of an - empty check box, radio button and field, of a switch on or off and of a - slider's handle, and a slider's tick marks, are strengthened to a 3:1 - contrast, keeping their hue. Other widgets draw Teksilo's own chrome in - these colours and shapes. + to left; its node grows to the density's target size. A `MenuItem` is + Breeze's menu row, 29 px tall at Plasma's default font and growing to the + density's target size, washed with the focus colour and outlined while it + is highlighted, and filled with the accent while it is held down, its + label then turning to the text on the accent; a `MenuSeparator` is 5 px. + Menus, combo box lists, popovers and tooltips are framed as Breeze's + popups, at the 5 px radius in a 1 px outline over Breeze's two-layer + window shadow, and a tooltip's text lies 4 px inside its frame. + `styles::metrics::BreezeMenuMetrics` gives the menu's dimensions at any + density and font, among them the height of a section title. The outlines + of an empty check box, radio button and field, of a switch on or off and + of a slider's handle, a slider's tick marks and a highlighted menu row's + outline, are strengthened to a 3:1 contrast, keeping their hue. Other + widgets draw Teksilo's own chrome in these colours and shapes. #### Platform diff --git a/crates/teksilo-theme-kde/src/lib.rs b/crates/teksilo-theme-kde/src/lib.rs index 309290a26..53a58c192 100644 --- a/crates/teksilo-theme-kde/src/lib.rs +++ b/crates/teksilo-theme-kde/src/lib.rs @@ -55,6 +55,12 @@ //! controls are outlined in the window colour moved the same way toward //! the text, the `border` token; the highlight-based outlines are in //! [`BreezeColors`]. +//! - **Breeze's menus and popups.** A menu row is 29 px at Plasma's default +//! font, washed with the focus colour at 30 % and outlined while it is +//! highlighted, and filled with the accent while it is held down; a menu, +//! a popover and a tooltip are framed at the 5 px radius in a 1 px +//! outline over Breeze's two-layer window shadow, and a tooltip's text +//! lies 4 px inside its frame. //! - **Breeze's focus ring geometry.** Keyboard focus is a 2 px band, half //! inside the control and half outside, in the scheme's focus colour. //! Breeze paints it at 30 % ([`shape::BREEZE_FOCUS_RING_ALPHA`]); the @@ -106,9 +112,34 @@ //! //! - **Most widget chrome is the framework's.** This version installs //! Breeze styles for `Button`, `IconButton`, `SplitButton`, `Toggle`, -//! `Checkbox`, `RadioButton`, `TextInput`, `ComboBox`, `SpinBox` and -//! `Slider` only: every other widget keeps Teksilo's recipe style, painted -//! in the Breeze colours, radii, focus ring, typography and motion. +//! `Checkbox`, `RadioButton`, `TextInput`, `ComboBox`, `SpinBox`, +//! `Slider`, `MenuItem`, the popup frame and the tooltip only: every +//! other widget keeps Teksilo's recipe style, painted in the Breeze +//! colours, radii, focus ring, typography and motion. +//! - **A menu's shortcuts, separators, section titles and check marks are +//! the framework's.** `MenuItem` writes a shortcut in the shortcut text +//! role, where Breeze writes the window text at 70 % opacity, and gives +//! its style no say over it; a `MenuSeparator` runs the width of the +//! rows, where Breeze stops its line 4 px short of either end; a section +//! title is the widget an app hands `MenuList::header`, which +//! [`styles::metrics::BreezeMenuMetrics::section_height`] can size; and +//! a checkable row shows the framework's check mark in its icon column, +//! not Breeze's check box ([`styles::menu_item`]). +//! - **Every menu is laid out as one with icons.** `MenuItem` reserves its +//! icon column on every row, so a menu without icons keeps the column, +//! where Breeze moves the text 4 px past its 8 px margin instead +//! ([`styles::menu_item`]). +//! - **A pressed menu row is filled with the accent**, not the focus +//! colour, so the text on it is readable (D1); the two are the same colour +//! in the stock Breeze schemes. A highlighted row's outline is lifted to +//! 3:1 (D5, [`styles::menu_item`]). +//! - **A popup has no caret and a shadow on every side**, and is rounded and +//! opaque whatever the desktop's compositing and menu opacity +//! ([`styles::popup`]). +//! - **A plain tooltip is shorter than Plasma's.** `TooltipWidget` writes its +//! text in the small text style, where Breeze uses the body font, so a +//! one-line tooltip is the small line box plus 8 px rather than 26 px +//! ([`styles::tooltip`]). //! - **A spin box's arrows keep their colour at the limit**, and an empty //! combo box's arrow is not greyed: the styles are not told the value's //! limits or the item count ([`styles::spin_box`], @@ -298,13 +329,16 @@ fn project(theme: &Theme, state: PaintState) -> Theme { /// Install the Breeze Tier-3 chrome. /// /// The buttons, the check box, the radio button, the switch, the line edit, -/// the combo box, the spin box and the slider are Breeze's own -/// ([`styles`]); every other slot is left to +/// the combo box, the spin box, the slider, the menu item, the popup frame +/// and the tooltip are Breeze's own ([`styles`]); every other slot is left to /// the widget's recipe style, which paints from the Breeze tokens, and the /// crate's tests list the reason for each. Every style installed here reads /// its metrics from the theme it builds under, `theme.input` included, so /// [`reproject`] can rerun this alone. fn install_styles(theme: &mut Theme) { + let menu_item = styles::menu_item::BreezeMenuItemStyle::for_theme(theme); + let popover = styles::popover::BreezePopoverStyle::for_tokens(&theme.input); + let tooltip = styles::tooltip::BreezeTooltipStyle::for_tokens(&theme.input); let slots = &mut theme.style_slots; slots.button = Some(Rc::new(styles::button::BreezeButtonStyle)); slots.icon_button = Some(Rc::new(styles::icon_button::BreezeIconButtonStyle)); @@ -316,6 +350,9 @@ fn install_styles(theme: &mut Theme) { slots.combo_box = Some(Rc::new(styles::combo_box::BreezeComboBoxStyle)); slots.spin_box = Some(Rc::new(styles::spin_box::BreezeSpinBoxStyle)); slots.slider = Some(Rc::new(styles::slider::BreezeSliderStyle)); + slots.menu_item = Some(Rc::new(menu_item)); + slots.popover = Some(Rc::new(popover)); + slots.tooltip = Some(Rc::new(tooltip)); } #[cfg(test)] @@ -519,10 +556,6 @@ mod tests { "radio_tile", "Breeze has no selectable card; the recipe surface reads the preset's surface and accent roles", ), - ( - "menu_item", - "no Breeze menu row is installed; the recipe row paints its highlight from the Breeze selection tokens", - ), ( "panel", "the recipe panel paints the Breeze surface and border tokens with the Breeze radius", @@ -535,14 +568,6 @@ mod tests { "chart", "Breeze has no chart chrome; the teksilo-charts default reads the series colours and the Breeze border role", ), - ( - "popover", - "no Breeze popup frame is installed; the recipe popover paints the Breeze raised surface, outline and shadow tokens", - ), - ( - "tooltip", - "no Breeze tooltip frame is installed; the recipe tooltip paints the Breeze tooltip tokens", - ), ( "scroll_bar", "no Breeze scroll bar is installed; the recipe paints the Breeze thumb tokens over no track", @@ -805,6 +830,42 @@ mod tests { ); } + /// The menu metrics `MenuItem`, `MenuSeparator` and `MenuList` read + /// follow the density a theme is projected to: the installed style is + /// rebuilt from the projected input tokens. + #[test] + fn a_density_switch_reprojects_the_menu_metrics() { + use teksilo_core::styles::MenuItemStyle; + let base = light(); + for (density, item, separator) in [ + (TargetDensity::Compact, 29.0, 5.0), + (TargetDensity::Comfortable, 32.0, 5.75), + (TargetDensity::Touch, 44.0, 6.5), + ] { + let t = base.with_density(density); + let m = t + .style_slots + .menu_item + .as_ref() + .expect("a menu style") + .metrics(); + assert_eq!(m.item_height, item, "{density:?}"); + assert!((m.separator_height - separator).abs() < 1e-4, "{density:?}"); + assert_eq!(m.icon_column_width, 16.0, "{density:?}"); + assert_eq!( + m, + styles::menu_item::BreezeMenuItemStyle::for_theme(&t).metrics(), + "{density:?}" + ); + } + // Projecting back to Compact gives Breeze's own numbers again. + let back = base + .with_density(TargetDensity::Touch) + .with_density(TargetDensity::Compact); + let m = back.style_slots.menu_item.as_ref().unwrap().metrics(); + assert_eq!(m.item_height, 29.0); + } + /// Every colour token, pinned to its source in Breeze Light's resolved /// palette. The destructuring has no `..`: a field added to /// `ColorTokens` must be pinned here before this compiles. diff --git a/crates/teksilo-theme-kde/src/styles.rs b/crates/teksilo-theme-kde/src/styles.rs index a6d8e8a73..8d4d018ea 100644 --- a/crates/teksilo-theme-kde/src/styles.rs +++ b/crates/teksilo-theme-kde/src/styles.rs @@ -21,7 +21,11 @@ //! the spin box, a line edit with a column of two chevrons, which share //! the chevron, [`arrow`]; //! - the slider, a 6 px groove filled toward the highlight up to a 17 px -//! round handle, in [`slider`]. +//! round handle, in [`slider`]; +//! - the menu item, washed with the focus colour and outlined while it is +//! highlighted, in [`menu_item`], and the frame of every popup, a menu's, +//! a popover's and a tooltip's, over Breeze's two-layer window shadow, +//! painted by [`popup`] for [`popover`] and [`tooltip`]. //! //! The dimensions they are built with, all derived from [`crate::geometry`] //! and the density ladder, are collected in [`metrics`]. @@ -33,10 +37,14 @@ pub mod chrome; pub mod combo_box; pub mod icon_button; pub mod indicator; +pub mod menu_item; pub mod metrics; +pub mod popover; +pub mod popup; pub mod radio; pub mod slider; pub mod spin_box; pub mod split_button; pub mod text_input; pub mod toggle; +pub mod tooltip; diff --git a/crates/teksilo-theme-kde/src/styles/menu_item.rs b/crates/teksilo-theme-kde/src/styles/menu_item.rs new file mode 100644 index 000000000..5fd3352f7 --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/menu_item.rs @@ -0,0 +1,596 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze menu item. +//! +//! A row is transparent at rest. Hovered or reached with the arrow keys it +//! is washed with the focus colour at 30 % and outlined in the focus colour +//! moved 15 % toward the window text, a 1 px outline stroked on the row +//! inset by half the pen at radius 4.5; held down it is filled with the +//! solid colour and its label and shortcut turn to the text on it +//! ([`MenuItemStyle::pressed_label_role`]), while a highlighted label stays +//! the window text. The highlight covers the whole row, which `MenuList` +//! already places 4 px inside the menu's frame, Breeze's menu margin. A +//! disabled row is never highlighted. +//! +//! The row is 29 px at Plasma's default font: `max(H, 20, 16) + 1` and the +//! 4 px item margin above and below, through the density ladder. Its layout +//! is Breeze's for a menu that shows icons, because `MenuItem` reserves its +//! leading column on every row: the icon column 12 px inside the row (the +//! 4 px margin and the 8 px text margin), 16 px wide, the text 3 px after +//! it, and at the trailing edge a 20 px arrow box 4 px inside the row with +//! the text ending 3 px before it. A separator is 5 px, its 1 px line in the +//! middle. The row arithmetic is the shipped [`RecipeMenuItemStyle`]'s, +//! built with these numbers ([`breeze_menu_item_recipe_for`]); its own +//! highlight is held off, so the one painted here is the only one. +//! +//! The style stores the recipe it was built with from the theme's input +//! tokens and typography, so [`MenuItemStyle::metrics`], which `MenuItem` +//! and `MenuSeparator` read for the parts they build themselves, follows +//! the density the theme was projected to. +//! +//! ## Where this departs from Breeze +//! +//! - **D5, the highlight outline.** The outline marks the row the keyboard +//! is on, so it is the menu's focus indicator. Breeze Light's, 57,154,204 +//! (its focus colour 61,174,233 moved toward the window text), is 2.9:1 +//! on the menu's frame background and 2.8:1 on the window; it is lifted in +//! luma, keeping its hue, until it reaches SC 1.4.11's 3:1 (4.5:1 under +//! high contrast) on the window, the view and the frame background +//! ([`BreezeMenuColors::outline`]). Breeze Dark's passes and is kept. +//! - **D1, the pressed fill.** Breeze fills a pressed row with the focus +//! colour and writes its text in the selection text. Teksilo's selection +//! text is chosen against the accent (D1 of the colour mapping), so the +//! pressed row is filled and outlined with `accent`, which the label's +//! [`TextRole::OnAccent`] is readable on. In the stock Breeze schemes the +//! focus colour and the accent are the same colour; they part when an +//! accent colour or the high-contrast projection changes the accent. +//! +//! What `MenuItem`, `MenuSeparator` and `MenuList` build themselves is +//! theirs, and the crate's known limitations list where it differs from +//! Breeze: the shortcut's colour, the separator's length, section titles, +//! a menu without icons and the check mark. + +use teksilo_canvas::{Canvas, Rect, SizeProposal}; +use teksilo_core::accessibility::AccessNodeBuilder; +use teksilo_core::binding::BindingLevel; +use teksilo_core::build_context::BuildContext; +use teksilo_core::signal::Signal; +use teksilo_core::styles::{MenuItemMetrics, MenuItemStyle, MenuItemStyleConfig, Theme}; +use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement}; +use teksilo_core::widget_id::WidgetId; +use teksilo_kde_scheme::math::lift_luma_until; +use teksilo_kde_scheme::{ColorState, KdeColor}; +use teksilo_tokens::{Color, CornerRadius, InputTokens, TextRole, TypographyTokens}; +use teksilo_widgets::primitives::{MinSize, ZStack}; +use teksilo_widgets::styles::{MenuItemRecipe, RecipeMenuItemStyle}; + +use crate::color::{AA, ENHANCED}; +use crate::palette::KdePalette; +use crate::shape::BREEZE_STROKED_FRAME_RADIUS; +use crate::styles::metrics::{MENU_HIGHLIGHT_ALPHA, breeze_menu_metrics_for}; + +/// The Breeze [`MenuItemRecipe`] at the density of `tokens`, for +/// `typography`: the row arithmetic of [`RecipeMenuItemStyle`] with the +/// dimensions of [`crate::styles::metrics::BreezeMenuMetrics`]. +pub fn breeze_menu_item_recipe_for( + tokens: &InputTokens, + typography: &TypographyTokens, +) -> MenuItemRecipe { + let m = breeze_menu_metrics_for(tokens, typography); + MenuItemRecipe { + item_height: m.item_height, + // The trailing column is the row's right-hand padding: the shortcut + // and the arrow live in it. + padding_horizontal: m.trailing_column, + padding_leading: m.padding_leading, + icon_column_width: m.icon_column, + icon_label_gap: m.icon_label_gap, + shortcut_left_gap: m.shortcut_gap, + separator_height: m.separator_height, + // `[Hp]` Only the radius of the recipe's own highlight, which this + // style holds off. + item_corner_radius: BREEZE_STROKED_FRAME_RADIUS, + } +} + +/// [`breeze_menu_item_recipe_for`] at the Compact density and the Breeze +/// typography. +pub fn breeze_menu_item_recipe() -> MenuItemRecipe { + breeze_menu_item_recipe_for( + &InputTokens::default(), + &crate::typography::breeze_typography(), + ) +} + +/// Breeze `MenuItemStyle`. +/// +/// [`Default`] is the Compact density and the Breeze typography; the preset +/// installs [`BreezeMenuItemStyle::for_theme`] of the theme it builds. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeMenuItemStyle { + /// The row dimensions this style lays out and reports. + pub recipe: MenuItemRecipe, +} + +impl BreezeMenuItemStyle { + /// The style with `recipe`'s dimensions. + pub fn new(recipe: MenuItemRecipe) -> Self { + Self { recipe } + } + + /// The style at the density and typography of `theme`. + pub fn for_theme(theme: &Theme) -> Self { + Self::new(breeze_menu_item_recipe_for(&theme.input, &theme.typography)) + } +} + +impl Default for BreezeMenuItemStyle { + fn default() -> Self { + Self::new(breeze_menu_item_recipe()) + } +} + +impl MenuItemStyle for BreezeMenuItemStyle { + fn make_body(&self, cfg: &MenuItemStyleConfig, ctx: &mut BuildContext) -> WidgetId { + let state = MenuRowState::derive( + &cfg.is_disabled, + &cfg.is_pressed, + &cfg.is_hovered, + &cfg.is_highlighted, + ); + let highlight = ctx.add(BreezeMenuHighlight { state }); + // The recipe's row, with its interaction signals held low so its own + // highlight never paints under this one. + let quiet = Signal::new(false); + let inner = MenuItemStyleConfig { + label: cfg.label, + leading: cfg.leading, + trailing: cfg.trailing, + is_hovered: quiet.clone(), + is_pressed: quiet.clone(), + is_focused: cfg.is_focused.clone(), + is_disabled: cfg.is_disabled.clone(), + is_highlighted: quiet, + }; + let row = RecipeMenuItemStyle::new(self.recipe).make_body(&inner, ctx); + let stack = ctx.add(ZStack::new().child(highlight).child(row)); + // `[S]` The row is at least its height whatever its label measures: + // Breeze's rule takes the larger of the line box and 20 px. + ctx.add(MinSize::new(0.0, self.recipe.item_height).child(stack)) + } + + fn metrics(&self) -> MenuItemMetrics { + RecipeMenuItemStyle::new(self.recipe).metrics() + } + + /// `[wcag]` D1: the text on the pressed row's accent fill. Breeze writes + /// a highlighted row in the window text, which the 30 % wash keeps + /// readable, so [`MenuItemStyle::highlighted_label_role`] stays `None`. + fn pressed_label_role(&self) -> Option { + Some(TextRole::OnAccent) + } +} + +/// A menu row's interaction state, in Breeze's precedence order. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub enum MenuRowState { + /// Neither hovered nor reached by the keyboard. + #[default] + Rest, + /// Hovered, reached with the arrow keys, or a submenu trigger whose + /// submenu is open. + Highlighted, + /// Held down. + Pressed, + /// Disabled: never highlighted. + Disabled, +} + +impl MenuRowState { + /// Collapse the style configuration's booleans into a state: disabled + /// first, then pressed, then hovered or highlighted. + pub fn derive( + is_disabled: &Signal, + is_pressed: &Signal, + is_hovered: &Signal, + is_highlighted: &Signal, + ) -> Signal { + is_disabled + .zip3(is_pressed, is_hovered) + .zip(is_highlighted) + .map(|((disabled, pressed, hovered), highlighted)| { + if *disabled { + MenuRowState::Disabled + } else if *pressed { + MenuRowState::Pressed + } else if *hovered || *highlighted { + MenuRowState::Highlighted + } else { + MenuRowState::Rest + } + }) + } +} + +/// The colours a Breeze menu row is highlighted in, in one paint state. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeMenuColors { + /// `[Hp]` The view's focus decoration of the current window state, which + /// washes a highlighted row at 30 %. + pub focus: Color, + /// `[wcag]` D5: a highlighted row's outline, the focus colour moved 15 % + /// toward the window text, lifted in luma to the non-text floor on the + /// window, the view and the frame background. + pub outline: Color, + /// `[wcag]` D1: a pressed row's fill and outline, `accent`. + pub pressed: Color, +} + +impl BreezeMenuColors { + /// The colours of `theme` as it paints in a window that is or is not + /// active, with or without the high-contrast preference. + /// + /// `theme` is the theme the paint walker hands a widget, already + /// projected for that state. Without a [`KdePalette`] the focus colour + /// and the outline are `border_focused`. + pub fn resolve(theme: &Theme, window_active: bool, high_contrast: bool) -> BreezeMenuColors { + let c = &theme.colors; + let Some(palette) = theme.extension::() else { + return BreezeMenuColors { + focus: c.border_focused, + outline: c.border_focused, + pressed: c.accent, + }; + }; + let state = if window_active { + ColorState::Active + } else { + ColorState::Inactive + }; + let b = palette.breeze_colors(state, high_contrast); + let floor = if high_contrast { ENHANCED } else { AA }.non_text; + let on = [c.surface_main, c.surface_content, c.surface_raised].map(KdeColor::from_color); + BreezeMenuColors { + focus: b.focus, + outline: lift_luma_until(KdeColor::from_color(b.focus_outline), &on, floor).to_color(), + pressed: c.accent, + } + } + + /// `[Hp]` A highlighted row's wash: the focus colour at 30 %. + pub fn wash(&self) -> Color { + self.focus.with_alpha(MENU_HIGHLIGHT_ALPHA) + } +} + +/// What a menu row paints in one state: a fill and a 1 px outline, each +/// optional. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct MenuRowPaint { + /// The fill of the row, or nothing. + pub fill: Option, + /// The outline of the row, or nothing. + pub outline: Option, +} + +/// `[Hp]` What a row paints in `state`, from `c`. +pub fn menu_row_paint(state: MenuRowState, c: &BreezeMenuColors) -> MenuRowPaint { + match state { + MenuRowState::Rest | MenuRowState::Disabled => MenuRowPaint { + fill: None, + outline: None, + }, + MenuRowState::Highlighted => MenuRowPaint { + fill: Some(c.wash()), + outline: Some(c.outline), + }, + MenuRowState::Pressed => MenuRowPaint { + fill: Some(c.pressed), + outline: Some(c.pressed), + }, + } +} + +/// `[Hp]` The rectangle a row's highlight is filled and stroked on: the row +/// inset by half the `pen`, so the outline lies inside the row. +pub fn highlight_rect(bounds: Rect, pen: f32) -> Rect { + let d = pen * 0.5; + Rect::new( + bounds.x + d, + bounds.y + d, + (bounds.width - 2.0 * d).max(0.0), + (bounds.height - 2.0 * d).max(0.0), + ) +} + +/// The highlight layer of a Breeze menu row, painted behind the row's +/// content. +/// +/// Sized like `RectWidget`: it takes whatever the proposal offers and +/// reports zero when unbounded, so it does not change the row's size. +struct BreezeMenuHighlight { + state: Signal, +} + +impl std::fmt::Debug for BreezeMenuHighlight { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeMenuHighlight").finish() + } +} + +impl Widget for BreezeMenuHighlight { + fn build(&mut self, ctx: &mut BuildContext) -> Vec { + let id = ctx.self_id(); + self.state + .bind_to(id, ctx.binding_registry(), BindingLevel::RepaintOnly); + vec![] + } + + fn layout_response(&self, proposal: SizeProposal, _ctx: &LayoutContext) -> LayoutResponse { + proposal.resolve(0.0, 0.0).into() + } + + fn place_children( + &self, + _bounds: Rect, + _proposal: SizeProposal, + _children: &mut [WidgetPlacement], + _ctx: &LayoutContext, + ) { + } + + fn paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext) { + let colors = + BreezeMenuColors::resolve(ctx.theme, ctx.window_active, ctx.prefers_high_contrast); + let paint = menu_row_paint(self.state.get(), &colors); + paint_menu_row(canvas, bounds, &paint, ctx.theme); + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + // Presentational: the `MenuItem` emits the real node. + builder.set_hidden(); + } +} + +/// Paint `paint` into the row `bounds`: the fill, then the outline, both on +/// [`highlight_rect`] at radius 4.5. +pub fn paint_menu_row(canvas: &mut Canvas, bounds: Rect, paint: &MenuRowPaint, theme: &Theme) { + let pen = theme.shape.border_width; + let rect = highlight_rect(bounds, pen); + let corner = CornerRadius::uniform(crate::styles::chrome::frame_radius(&theme.shape)); + if let Some(fill) = paint.fill + && fill.a() > 0.0 + { + canvas.fill_rounded_rect(rect, corner, fill); + } + if let Some(outline) = paint.outline + && outline.a() > 0.0 + && pen > 0.0 + { + canvas.stroke_rounded_rect(rect, corner, outline, pen); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_core::styles::PaintState; + use teksilo_tokens::TargetDensity; + use teksilo_tokens::contrast::composite_contrast; + + use crate::PlasmaAccent; + + fn rgba8(c: Color) -> [u8; 4] { + KdeColor::from_color(c).to_rgba8() + } + + fn colors(theme: &Theme) -> BreezeMenuColors { + BreezeMenuColors::resolve(theme, true, false) + } + + #[test] + fn the_recipe_carries_breezes_menu_metrics() { + let r = breeze_menu_item_recipe(); + assert_eq!(r.item_height, 29.0); + assert_eq!(r.separator_height, 5.0); + assert_eq!(r.padding_leading, 12.0); + assert_eq!(r.icon_column_width, 16.0); + assert_eq!(r.icon_label_gap, 3.0); + assert_eq!(r.padding_horizontal, 27.0); + assert_eq!(r.shortcut_left_gap, 16.0); + assert_eq!(r.item_corner_radius, 4.5); + assert_eq!(BreezeMenuItemStyle::default().recipe, r); + assert_eq!(BreezeMenuItemStyle::for_theme(&crate::light()).recipe, r); + } + + /// The metrics `MenuItem` and `MenuSeparator` read are the recipe's. + #[test] + fn the_metrics_are_the_recipes_at_every_density() { + for (density, item, separator) in [ + (TargetDensity::Compact, 29.0, 5.0), + (TargetDensity::Comfortable, 32.0, 5.75), + (TargetDensity::Touch, 44.0, 6.5), + ] { + let theme = crate::light().with_density(density); + let m = BreezeMenuItemStyle::for_theme(&theme).metrics(); + assert_eq!(m.item_height, item, "{density:?}"); + assert!((m.separator_height - separator).abs() < 1e-4, "{density:?}"); + assert_eq!(m.icon_column_width, 16.0); + assert!(m.trailing_column_width >= 27.0); + } + } + + #[test] + fn the_state_follows_breezes_precedence() { + let disabled = Signal::new(false); + let pressed = Signal::new(false); + let hovered = Signal::new(false); + let highlighted = Signal::new(false); + let state = MenuRowState::derive(&disabled, &pressed, &hovered, &highlighted); + assert_eq!(state.get(), MenuRowState::Rest); + highlighted.set(true); + assert_eq!( + state.get(), + MenuRowState::Highlighted, + "the keyboard lights it" + ); + highlighted.set(false); + hovered.set(true); + assert_eq!( + state.get(), + MenuRowState::Highlighted, + "so does the pointer" + ); + pressed.set(true); + assert_eq!(state.get(), MenuRowState::Pressed); + disabled.set(true); + assert_eq!(state.get(), MenuRowState::Disabled, "disabled beats all"); + } + + #[test] + fn only_a_highlighted_or_pressed_row_paints() { + let c = colors(&crate::light()); + let nothing = MenuRowPaint { + fill: None, + outline: None, + }; + assert_eq!(menu_row_paint(MenuRowState::Rest, &c), nothing); + assert_eq!(menu_row_paint(MenuRowState::Disabled, &c), nothing); + let lit = menu_row_paint(MenuRowState::Highlighted, &c); + assert_eq!(lit.fill, Some(c.wash())); + assert_eq!(lit.outline, Some(c.outline)); + let held = menu_row_paint(MenuRowState::Pressed, &c); + assert_eq!(held.fill, Some(c.pressed)); + assert_eq!(held.outline, Some(c.pressed)); + } + + /// Breeze Light's and Dark's highlight, against Plasma's pixels: the + /// wash over the window is 185,220,238 and 40,76,97; the outline is + /// 57,154,204 and 90,186,236. + #[test] + fn the_wash_and_outline_are_breezes() { + let over = |top: Color, bottom: Color| { + let a = top.a(); + let ch = |t: f32, b: f32| t * a + b * (1.0 - a); + Color::new( + ch(top.r(), bottom.r()), + ch(top.g(), bottom.g()), + ch(top.b(), bottom.b()), + 1.0, + ) + }; + let light = crate::light(); + let c = colors(&light); + assert_eq!(rgba8(c.focus), [61, 174, 233, 255]); + let near = |a: [u8; 4], b: [u8; 4]| a.iter().zip(b).all(|(x, y)| x.abs_diff(y) <= 1); + assert!(near( + rgba8(over(c.wash(), light.colors.surface_main)), + [185, 220, 238, 255] + )); + let dark = crate::dark(); + let d = colors(&dark); + assert!(near( + rgba8(over(d.wash(), dark.colors.surface_main)), + [40, 76, 97, 255] + )); + // Breeze Dark's outline reaches 3:1 and is Breeze's own. + assert_eq!(rgba8(d.outline), [90, 186, 236, 255]); + assert_eq!(rgba8(c.pressed), rgba8(light.colors.accent)); + } + + /// D5: Breeze Light's outline is lifted to 3:1 on the menu's backdrops, + /// keeping its hue, and its own outline does not reach it. + #[test] + fn the_highlight_outline_is_lifted_to_three_to_one() { + let t = crate::light(); + let palette = t.extension::().unwrap(); + let vendor = palette.colors(ColorState::Active).focus_outline; + assert_eq!(rgba8(vendor), [57, 154, 204, 255]); + let c = &t.colors; + let backdrops = [c.surface_main, c.surface_content, c.surface_raised]; + let worst = |x: Color| { + backdrops + .iter() + .map(|b| composite_contrast(x, *b)) + .fold(f32::INFINITY, f32::min) + }; + assert!(worst(vendor) < 3.0, "premise: {:.2}:1", worst(vendor)); + let lifted = colors(&t).outline; + assert!(worst(lifted) >= 3.0, "{:.2}:1", worst(lifted)); + let (h0, _, _) = vendor.to_hsv(); + let (h1, _, _) = lifted.to_hsv(); + assert!((h0 - h1).abs() < 2.0, "the hue moved from {h0} to {h1}"); + // Under high contrast the floor is 4.5:1. + let hc = t.for_paint_state(PaintState { + window_active: true, + high_contrast: true, + }); + let hc_colors = BreezeMenuColors::resolve(&hc, true, true); + let hc_backdrops = [ + hc.colors.surface_main, + hc.colors.surface_content, + hc.colors.surface_raised, + ]; + for b in hc_backdrops { + assert!(composite_contrast(hc_colors.outline, b) >= 4.5); + } + } + + /// With every Plasma accent, in both schemes and both window states, the + /// window text stays readable on the wash and the pressed label on the + /// pressed fill, and the outline reaches 3:1. + #[test] + fn every_swatch_keeps_the_rows_readable() { + for accent in PlasmaAccent::ALL { + for base in [ + crate::light_with_accent(accent.color()), + crate::dark_with_accent(accent.color()), + ] { + for window_active in [true, false] { + let t = base.for_paint_state(PaintState { + window_active, + high_contrast: false, + }); + let c = BreezeMenuColors::resolve(&t, window_active, false); + let panel = t.colors.surface_raised; + let wash = { + let w = c.wash(); + let a = w.a(); + Color::new( + w.r() * a + panel.r() * (1.0 - a), + w.g() * a + panel.g() * (1.0 - a), + w.b() * a + panel.b() * (1.0 - a), + 1.0, + ) + }; + assert!( + composite_contrast(t.colors.text_primary, wash) >= 4.5, + "{accent:?}: the label on the wash" + ); + assert!( + composite_contrast(TextRole::OnAccent.resolve(&t.colors), c.pressed) >= 4.5, + "{accent:?}: the pressed label" + ); + assert!(composite_contrast(c.outline, panel) >= 3.0); + } + } + } + } + + #[test] + fn the_rows_degrade_without_the_palette() { + let mut bare = crate::light(); + bare.extensions.remove::(); + let c = colors(&bare); + assert_eq!(c.focus, bare.colors.border_focused); + assert_eq!(c.outline, bare.colors.border_focused); + assert_eq!(c.pressed, bare.colors.accent); + } + + #[test] + fn the_highlight_is_stroked_inside_the_row() { + let r = highlight_rect(Rect::new(4.0, 4.0, 200.0, 29.0), 1.0); + assert_eq!(r, Rect::new(4.5, 4.5, 199.0, 28.0)); + } +} diff --git a/crates/teksilo-theme-kde/src/styles/metrics.rs b/crates/teksilo-theme-kde/src/styles/metrics.rs index ae4701832..b1d0487f4 100644 --- a/crates/teksilo-theme-kde/src/styles/metrics.rs +++ b/crates/teksilo-theme-kde/src/styles/metrics.rs @@ -18,9 +18,9 @@ use teksilo_tokens::{InputTokens, TargetRole, TypographyTokens}; use crate::geometry::{ BUTTON_MARGIN_WIDTH, BreezeGeometry, CHECKBOX_FOCUS_MARGIN, CHECKBOX_ITEM_SPACING, CHECKBOX_SIZE, COMBO_BOX_FRAME_WIDTH, FRAME_WIDTH, LARGE_ICON_SIZE, LINE_EDIT_FRAME_WIDTH, - MEDIUM_ICON_SIZE, SLIDER_CONTROL_THICKNESS, SLIDER_GROOVE_THICKNESS, SLIDER_TICK_LENGTH, - SLIDER_TICK_MARGIN, SPIN_BOX_ARROW_BUTTON_WIDTH, SPIN_BOX_FRAME_WIDTH, - TOOL_BUTTON_MARGIN_WIDTH, + MEDIUM_ICON_SIZE, MENU_ITEM_ACCELERATOR_SPACE, MENU_ITEM_MARGIN, MENU_ITEM_TEXT_LEFT_MARGIN, + SLIDER_CONTROL_THICKNESS, SLIDER_GROOVE_THICKNESS, SLIDER_TICK_LENGTH, SLIDER_TICK_MARGIN, + SMALL_ICON_SIZE, SPIN_BOX_ARROW_BUTTON_WIDTH, SPIN_BOX_FRAME_WIDTH, TOOL_BUTTON_MARGIN_WIDTH, }; use crate::shape::BREEZE_PEN_WIDTH; @@ -367,6 +367,96 @@ pub fn breeze_spin_metrics() -> BreezeSpinMetrics { ) } +/// `[S]` The space a menu item's text starts after its icon column: Breeze's +/// 2 px and Qt's 1. +pub const MENU_ICON_TEXT_GAP: f32 = 3.0; +/// `[Hp]` The square a submenu arrow is centred in, at the trailing edge of +/// a menu item's contents. +pub const MENU_ARROW_BOX: f32 = 20.0; +/// `[Hp]` The space between the end of a menu item's text and its arrow +/// box. +pub const MENU_ARROW_TEXT_GAP: f32 = 3.0; +/// `[Hp]` How much of the focus colour washes a highlighted menu item: the +/// style's blend value. +pub const MENU_HIGHLIGHT_ALPHA: f32 = 0.3; +/// `[M]` How far a popup's content lies inside its frame: the menu margin, +/// which Breeze gives every popup panel. +pub const POPUP_PADDING: f32 = MENU_ITEM_MARGIN; +/// `[unpublished]` The widest a tooltip's text is laid out before it wraps: +/// Qt wraps a tooltip against the screen, which a tooltip in a Teksilo window +/// has no use for, so this is Teksilo's own 320 px. +pub const TOOLTIP_MAX_WIDTH: f32 = 320.0; + +/// The dimensions of a menu: its rows, separators and section titles. +/// +/// A row is laid out as Breeze lays out the item of a menu that shows icons: +/// `MenuItem` reserves its leading column on every row, the icon and the +/// check mark's alike. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeMenuMetrics { + /// `[S]` A row's height: `max(H, 20, 16) + 1` and the 4 px item margin + /// above and below, through the density ladder. 29 at Compact for the + /// Breeze typography. + pub item_height: f32, + /// `[S]` A separator's height: its 1 px line and the 4 px item margin, + /// scaled by the density's spacing. 5 at Compact. + pub separator_height: f32, + /// `[S]` A section title's height (a separator with text): `max(H, 20, + /// 16)` and the 4 px item margin above and below, through the density + /// ladder. 28 at Compact. `MenuList::header` shows a widget the app + /// builds, which the style never sees, so this is what an app sizes its + /// section titles with. + pub section_height: f32, + /// `[M]` The space before a row's icon column: the 4 px item margin and + /// Breeze's 8 px text margin, scaled by the density's spacing. 12 at + /// Compact. + pub padding_leading: f32, + /// `[K]` The icon column: the small icon size. Painted, so it does not + /// scale. + pub icon_column: f32, + /// `[S]` The space between the icon column and the text, + /// [`MENU_ICON_TEXT_GAP`], scaled by the density's spacing. + pub icon_label_gap: f32, + /// `[derived]` The column at a row's trailing edge: the 3 px gap after + /// the text, the 20 px arrow box and the 4 px item margin, the gaps + /// scaled by the density's spacing. 27 at Compact. + pub trailing_column: f32, + /// `[M]` The least space between a row's text and its shortcut: the + /// 16 px accelerator space, scaled by the density's spacing. + pub shortcut_gap: f32, + /// `[M]` The gap between a menu's frame and its rows on every side: the + /// 4 px menu margin, `MenuList`'s own inset. + pub popup_margin: f32, +} + +/// The menu dimensions at the density of `tokens`, for `typography`. +pub fn breeze_menu_metrics_for( + tokens: &InputTokens, + typography: &TypographyTokens, +) -> BreezeMenuMetrics { + let g = geometry_of(typography); + BreezeMenuMetrics { + item_height: dp(g.menu_item_height, TargetRole::Target, tokens), + separator_height: spacing(g.menu_separator_height, tokens), + section_height: dp(g.menu_section_height, TargetRole::Target, tokens), + padding_leading: spacing(MENU_ITEM_MARGIN + MENU_ITEM_TEXT_LEFT_MARGIN, tokens), + icon_column: SMALL_ICON_SIZE, + icon_label_gap: spacing(MENU_ICON_TEXT_GAP, tokens), + trailing_column: spacing(MENU_ARROW_TEXT_GAP + MENU_ITEM_MARGIN, tokens) + MENU_ARROW_BOX, + shortcut_gap: spacing(MENU_ITEM_ACCELERATOR_SPACE, tokens), + popup_margin: MENU_ITEM_MARGIN, + } +} + +/// [`breeze_menu_metrics_for`] at the Compact density and the Breeze +/// typography. +pub fn breeze_menu_metrics() -> BreezeMenuMetrics { + breeze_menu_metrics_for( + &InputTokens::default(), + &crate::typography::breeze_typography(), + ) +} + #[cfg(test)] mod tests { use super::*; @@ -522,6 +612,56 @@ mod tests { assert_eq!(BreezeSpinMetrics::arrow_half(4.0), 0.0); } + #[test] + fn the_menu_is_breezes_and_grows_with_the_density() { + let m = breeze_menu_metrics(); + assert_eq!(m.item_height, 29.0); + assert_eq!(m.separator_height, 5.0); + assert_eq!(m.section_height, 28.0); + assert_eq!(m.padding_leading, 12.0); + assert_eq!(m.icon_column, 16.0); + assert_eq!(m.icon_label_gap, 3.0); + assert_eq!(m.trailing_column, 27.0); + assert_eq!(m.shortcut_gap, 16.0); + assert_eq!(m.popup_margin, 4.0); + // The text starts where Breeze puts it in a menu with icons: the + // 4 px margin, the 8 px text margin, the icon and 3 px after it. + assert_eq!(m.padding_leading + m.icon_column + m.icon_label_gap, 31.0); + // And ends 3 px before a 20 px arrow box 4 px inside the row. + assert_eq!( + m.trailing_column, + MENU_ARROW_TEXT_GAP + MENU_ARROW_BOX + MENU_ITEM_MARGIN + ); + let t = crate::typography::breeze_typography(); + let comfortable = breeze_menu_metrics_for(&at(TargetDensity::Comfortable), &t); + let touch = breeze_menu_metrics_for(&at(TargetDensity::Touch), &t); + assert_eq!(comfortable.item_height, 32.0); + assert_eq!(touch.item_height, 44.0); + assert_eq!(comfortable.section_height, 32.0); + assert_eq!(touch.section_height, 44.0); + assert!((comfortable.separator_height - 5.75).abs() < 1e-4); + assert!((touch.separator_height - 6.5).abs() < 1e-4); + for m in [comfortable, touch] { + assert_eq!(m.icon_column, 16.0, "the painted column does not scale"); + assert_eq!(m.popup_margin, 4.0, "MenuList's inset does not scale"); + assert!(m.trailing_column > 27.0 && m.trailing_column - MENU_ARROW_BOX > 7.0); + assert!(m.padding_leading > 12.0 && m.shortcut_gap > 16.0); + } + } + + #[test] + fn a_larger_body_font_makes_taller_menu_rows() { + let mut t = crate::typography::breeze_typography(); + // Plasma's 12 pt: a 22 px line, which Qt makes a 31 px item and a + // 30 px section. + t.body.size = 16.0; + t.body.line_height = 22.0 / 16.0; + let m = breeze_menu_metrics_for(&InputTokens::default(), &t); + assert_eq!(m.item_height, 31.0); + assert_eq!(m.section_height, 30.0); + assert_eq!(m.separator_height, 5.0, "a separator has no text"); + } + #[test] fn every_tool_button_clears_the_conformance_floor_without_a_box() { for density in [ diff --git a/crates/teksilo-theme-kde/src/styles/popover.rs b/crates/teksilo-theme-kde/src/styles/popover.rs new file mode 100644 index 000000000..35b46c7eb --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/popover.rs @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze popup panel: the frame around a menu, a combo box's list, a +//! search field's suggestions and a popover. +//! +//! The frame is [`crate::styles::popup`]'s: the frame background in the +//! frame outline at radius 4.5, over Breeze's two-layer window shadow. A +//! menu's frame has no padding of its own: `MenuList` puts its rows 4 px +//! inside it, Breeze's menu margin, and the highlight of a row fills the row +//! up to that margin. Any other popup's content lies 4 px inside the frame, +//! the same margin, scaled by the density's spacing. The `Tooltip` variant +//! is drawn in the tooltip's colours. +//! +//! ## Where this departs from Breeze +//! +//! - **No caret.** A Breeze popup has no arrow pointing at what opened it, +//! so the frame ignores [`PopoverStyleConfig::show_caret`] and lies flush +//! against the placement the overlay gives it. + +use teksilo_core::build_context::BuildContext; +use teksilo_core::styles::{PopoverStyle, PopoverStyleConfig, PopoverVariant}; +use teksilo_core::widget_id::WidgetId; +use teksilo_tokens::InputTokens; + +use crate::styles::metrics::POPUP_PADDING; +use crate::styles::popup::{BreezePopupFrame, BreezePopupKind, PopupNode}; +use teksilo_core::styles::density::spacing; + +/// Breeze `PopoverStyle`. +/// +/// [`Default`] is the Compact density; the preset installs +/// [`BreezePopoverStyle::for_tokens`] of the theme it builds. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezePopoverStyle { + /// `[M]` The space between the frame and the content of a popup that is + /// not a menu. + pub padding: f32, +} + +impl BreezePopoverStyle { + /// The style at the density of `tokens`. + pub fn for_tokens(tokens: &InputTokens) -> Self { + Self { + padding: spacing(POPUP_PADDING, tokens), + } + } +} + +impl Default for BreezePopoverStyle { + fn default() -> Self { + Self::for_tokens(&InputTokens::default()) + } +} + +impl PopoverStyle for BreezePopoverStyle { + fn make_body(&self, cfg: &PopoverStyleConfig, ctx: &mut BuildContext) -> WidgetId { + let (kind, padding, node) = match cfg.variant { + // The menu's owner carries the container role, and its rows + // their own margin. + PopoverVariant::Menu => (BreezePopupKind::Panel, 0.0, PopupNode::Container), + PopoverVariant::Default => ( + BreezePopupKind::Panel, + self.padding, + PopupNode::Dialog(cfg.name.clone()), + ), + PopoverVariant::Tooltip => ( + BreezePopupKind::Tooltip, + self.padding, + PopupNode::Dialog(cfg.name.clone()), + ), + }; + ctx.add(BreezePopupFrame::new( + cfg.content, + kind, + padding, + None, + node, + )) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_tokens::TargetDensity; + + #[test] + fn the_padding_is_the_menu_margin_and_grows_with_the_density() { + assert_eq!(BreezePopoverStyle::default().padding, 4.0); + let touch = BreezePopoverStyle::for_tokens(&InputTokens::for_density(TargetDensity::Touch)); + assert!((touch.padding - 5.2).abs() < 1e-4); + } +} diff --git a/crates/teksilo-theme-kde/src/styles/popup.rs b/crates/teksilo-theme-kde/src/styles/popup.rs new file mode 100644 index 000000000..6a7568697 --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/popup.rs @@ -0,0 +1,280 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The frame every Breeze popup is drawn in: a menu, a combo box's list, a +//! popover and a tooltip. +//! +//! A Breeze popup is a window of its own, a rounded rectangle at the 5 px +//! frame radius, filled and stroked with a 1 px pen on the rectangle inset +//! by half the pen, so the outline lies inside it at radius 4.5. A menu or +//! any other popup panel is filled with the frame background (the window +//! colour 30 % of the way to the view's, `surface_raised`) and outlined in +//! the frame outline (`border`); a tooltip is filled with the tooltip +//! background and outlined in the tooltip background moved toward the +//! tooltip text by the frame contrast (`tooltip_bg`, `tooltip_border`). +//! Both colours are resolved from the theme at paint time, so the inactive +//! and high-contrast projections reach them; the tooltip tokens are the +//! active state's in every state, as Qt's palette has them. +//! +//! Under the frame lies Breeze's window shadow at its default size, Large: +//! two layers of black, one 5 px down with a 20 px blur at 22 %, one 2 px +//! down with a 10 px blur at 12 %, both on the window's 5 px rounded +//! rectangle (`shadow_lg` and `shadow_inner_lg`, spec k.6). +//! +//! ## Where this departs from Breeze +//! +//! - **The panel is always rounded and opaque.** Breeze rounds a popup only +//! on a compositing desktop, and makes a menu translucent when +//! `breezerc`'s `MenuOpacity` is below 100; a Teksilo popup is drawn in +//! its window's own pass, so it is the composited form at Breeze's +//! default opacity. +//! - **The shadow is drawn on every side.** The framework's popover cuts +//! the shadow on the side that meets the control that opened it; a Breeze +//! popup is a window, and its shadow surrounds it. +//! - **The frame outline is not lifted** (D6): it is the outline Breeze +//! draws around a passive frame, and the shadow already separates the +//! panel from what lies under it. + +use teksilo_canvas::{Canvas, Point, Rect, Size, SizeProposal}; +use teksilo_core::accessibility::AccessNodeBuilder; +use teksilo_core::build_context::BuildContext; +use teksilo_core::styles::Theme; +use teksilo_core::widget::{ + LayoutContext, LayoutResponse, PaintContext, PendingChild, Widget, WidgetPlacement, +}; +use teksilo_core::widget_id::WidgetId; +use teksilo_tokens::{Color, CornerRadius}; + +use crate::styles::chrome::frame_radius; + +/// Which Breeze popup a frame is painted as. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum BreezePopupKind { + /// A menu, a combo box's list or any other popup panel. + Panel, + /// A tooltip. + Tooltip, +} + +/// The colours of a popup frame. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezePopupColors { + /// The frame's fill. + pub fill: Color, + /// The frame's 1 px outline. + pub outline: Color, +} + +impl BreezePopupColors { + /// `[Hp]` The colours of a `kind` popup in `theme`, the theme the paint + /// walker hands a widget. + pub fn resolve(theme: &Theme, kind: BreezePopupKind) -> BreezePopupColors { + let c = &theme.colors; + match kind { + BreezePopupKind::Panel => BreezePopupColors { + fill: c.surface_raised, + outline: c.border, + }, + BreezePopupKind::Tooltip => BreezePopupColors { + fill: c.tooltip_bg, + outline: c.tooltip_border, + }, + } + } +} + +/// Paint a `kind` popup frame on `bounds`: both shadow layers on the +/// window's rounded rectangle, then the fill and the outline on the +/// rectangle inset by half the pen. +pub fn paint_popup(canvas: &mut Canvas, bounds: Rect, kind: BreezePopupKind, theme: &Theme) { + let shape = &theme.shape; + let window = CornerRadius::uniform(shape.radius_popup); + for shadow in [&shape.shadow_lg, &shape.shadow_inner_lg] { + if shadow.color.a() > 0.0 { + canvas.draw_shadow(bounds, window, shadow); + } + } + let colors = BreezePopupColors::resolve(theme, kind); + let pen = shape.border_width; + let d = pen * 0.5; + let rect = Rect::new( + bounds.x + d, + bounds.y + d, + (bounds.width - 2.0 * d).max(0.0), + (bounds.height - 2.0 * d).max(0.0), + ); + let corner = CornerRadius::uniform(frame_radius(shape)); + if colors.fill.a() > 0.0 { + canvas.fill_rounded_rect(rect, corner, colors.fill); + } + if colors.outline.a() > 0.0 && pen > 0.0 { + canvas.stroke_rounded_rect(rect, corner, colors.outline, pen); + } +} + +/// The accessibility node a popup frame emits. +#[derive(Debug, Clone, PartialEq, Eq)] +pub(crate) enum PopupNode { + /// Nothing of its own: a bare `GenericContainer`, which the adapters + /// drop while keeping its children. For a menu, whose owner carries the + /// container role. + Container, + /// A non-modal dialog named after what opened it, as the framework's + /// popover surface is. + Dialog(String), + /// Hidden: the tooltip widget emits the tooltip node. + Hidden, +} + +/// A popup frame around one content subtree, `padding` inside it on every +/// side. +pub(crate) struct BreezePopupFrame { + content: Option, + pending: Option, + kind: BreezePopupKind, + padding: f32, + /// The widest the frame lays its content out, even when nothing bounds + /// it. + max_width: Option, + node: PopupNode, +} + +impl BreezePopupFrame { + pub(crate) fn new( + content: WidgetId, + kind: BreezePopupKind, + padding: f32, + max_width: Option, + node: PopupNode, + ) -> Self { + Self { + content: None, + pending: Some(PendingChild::Id(content)), + kind, + padding, + max_width, + node, + } + } +} + +impl std::fmt::Debug for BreezePopupFrame { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezePopupFrame") + .field("kind", &self.kind) + .finish() + } +} + +impl Widget for BreezePopupFrame { + fn build(&mut self, ctx: &mut BuildContext) -> Vec { + if let Some(pending) = self.pending.take() { + self.content = Some(match pending { + PendingChild::Id(id) => id, + PendingChild::Deferred(w) => ctx.add_boxed(w), + }); + } + self.children() + } + + fn layout_response(&self, proposal: SizeProposal, ctx: &LayoutContext) -> LayoutResponse { + let inset = 2.0 * self.padding; + let width = match self.max_width { + Some(max) => Some(proposal.width.map_or(max, |w| w.min(max))), + None => proposal.width, + }; + let inner = SizeProposal { + width: width.map(|w| (w - inset).max(0.0)), + height: proposal.height.map(|h| (h - inset).max(0.0)), + }; + self.content + .and_then(|id| ctx.child_size(id, inner)) + .map(|s| Size::new(s.width + inset, s.height + inset)) + .unwrap_or_else(|| proposal.resolve(inset, inset)) + .into() + } + + fn place_children( + &self, + bounds: Rect, + _proposal: SizeProposal, + children: &mut [WidgetPlacement], + _ctx: &LayoutContext, + ) { + let p = self.padding; + for child in children.iter_mut() { + child.origin = Point::new(bounds.x + p, bounds.y + p); + child.size = Size::new( + (bounds.width - 2.0 * p).max(0.0), + (bounds.height - 2.0 * p).max(0.0), + ); + } + } + + fn paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext) { + paint_popup(canvas, bounds, self.kind, ctx.theme); + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + match &self.node { + PopupNode::Container => { + builder.set_role(teksilo_core::accesskit::Role::GenericContainer); + } + PopupNode::Dialog(name) => { + builder.set_role(teksilo_core::accesskit::Role::Dialog); + // An empty name would hide the `labelled_by` relation the + // popover names its surface with. + if !name.is_empty() { + builder.set_name(name); + } + } + PopupNode::Hidden => builder.set_hidden(), + } + } + + fn children(&self) -> Vec { + self.content.into_iter().collect() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_kde_scheme::KdeColor; + + fn rgba8(c: Color) -> [u8; 4] { + KdeColor::from_color(c).to_rgba8() + } + + /// Plasma's menu panel and tooltip, in Breeze Light and Dark. + #[test] + fn the_frames_are_breezes() { + let light = crate::light(); + let panel = BreezePopupColors::resolve(&light, BreezePopupKind::Panel); + assert_eq!(rgba8(panel.fill), [244, 245, 245, 255]); + assert_eq!(rgba8(panel.outline), [198, 200, 201, 255]); + let tip = BreezePopupColors::resolve(&light, BreezePopupKind::Tooltip); + assert_eq!(rgba8(tip.fill), [247, 247, 247, 255]); + assert_eq!(rgba8(tip.outline), [205, 205, 206, 255]); + let dark = crate::dark(); + let panel = BreezePopupColors::resolve(&dark, BreezePopupKind::Panel); + assert_eq!(rgba8(panel.fill), [28, 31, 34, 255]); + assert_eq!(rgba8(panel.outline), [76, 78, 81, 255]); + let tip = BreezePopupColors::resolve(&dark, BreezePopupKind::Tooltip); + assert_eq!(rgba8(tip.fill), [41, 44, 48, 255]); + assert_eq!(rgba8(tip.outline), [83, 86, 89, 255]); + } + + /// The frame is painted from the projected tokens, so the high-contrast + /// projection reaches its outline. + #[test] + fn the_frame_follows_the_high_contrast_projection() { + let t = crate::light().for_paint_state(teksilo_core::styles::PaintState { + window_active: true, + high_contrast: true, + }); + let panel = BreezePopupColors::resolve(&t, BreezePopupKind::Panel); + assert_eq!(panel.outline, t.colors.border); + assert_ne!(panel.outline, crate::light().colors.border); + } +} diff --git a/crates/teksilo-theme-kde/src/styles/tooltip.rs b/crates/teksilo-theme-kde/src/styles/tooltip.rs new file mode 100644 index 000000000..4416b6861 --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/tooltip.rs @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze tooltip. +//! +//! The frame is [`crate::styles::popup`]'s in the tooltip's colours: the +//! tooltip background in a 1 px outline moved toward the tooltip text by the +//! frame contrast, at radius 4.5, over Breeze's two-layer window shadow. The +//! text lies 4 px inside the frame on every side, Breeze's 3 px tooltip frame +//! and the pixel Qt adds, scaled by the density's spacing, so a one-line +//! tooltip of Plasma's default font is 26 px tall, as Qt measures it. The +//! text wraps at 320 px ([`TOOLTIP_MAX_WIDTH`]). +//! +//! The text itself is the tooltip widget's: a plain `TooltipWidget` writes +//! it in the small text style, where Breeze uses the body font, so its +//! tooltip is shorter than Plasma's by the difference of the two line boxes +//! (the crate's known limitations). + +use teksilo_core::build_context::BuildContext; +use teksilo_core::styles::density::spacing; +use teksilo_core::styles::{TooltipStyle, TooltipStyleConfig}; +use teksilo_core::widget_id::WidgetId; +use teksilo_tokens::InputTokens; + +use crate::geometry::BreezeGeometry; +use crate::styles::metrics::TOOLTIP_MAX_WIDTH; +use crate::styles::popup::{BreezePopupFrame, BreezePopupKind, PopupNode}; + +/// Breeze `TooltipStyle`. +/// +/// [`Default`] is the Compact density; the preset installs +/// [`BreezeTooltipStyle::for_tokens`] of the theme it builds. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeTooltipStyle { + /// `[measured-qt]` The space between the frame and the text on every + /// side. + pub padding: f32, + /// `[unpublished]` The widest the frame lays its content out. + pub max_width: f32, +} + +impl BreezeTooltipStyle { + /// The style at the density of `tokens`. + pub fn for_tokens(tokens: &InputTokens) -> Self { + Self { + padding: spacing(BreezeGeometry::breeze_default().tooltip_padding, tokens), + max_width: TOOLTIP_MAX_WIDTH, + } + } +} + +impl Default for BreezeTooltipStyle { + fn default() -> Self { + Self::for_tokens(&InputTokens::default()) + } +} + +impl TooltipStyle for BreezeTooltipStyle { + fn make_body(&self, cfg: &TooltipStyleConfig, ctx: &mut BuildContext) -> WidgetId { + ctx.add(BreezePopupFrame::new( + cfg.content, + BreezePopupKind::Tooltip, + self.padding, + Some(self.max_width), + // The tooltip widget emits the tooltip node. + PopupNode::Hidden, + )) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_tokens::TargetDensity; + + #[test] + fn a_one_line_tooltip_is_breezes_twenty_six_pixels() { + let s = BreezeTooltipStyle::default(); + assert_eq!(s.padding, 4.0); + assert_eq!(s.max_width, 320.0); + let g = BreezeGeometry::breeze_default(); + assert_eq!(g.line_height + 2.0 * s.padding, 26.0); + assert_eq!(g.tooltip_height, 26.0); + let touch = BreezeTooltipStyle::for_tokens(&InputTokens::for_density(TargetDensity::Touch)); + assert!((touch.padding - 5.2).abs() < 1e-4); + assert_eq!(touch.max_width, 320.0); + } +} diff --git a/crates/teksilo-theme-kde/tests/mount.rs b/crates/teksilo-theme-kde/tests/mount.rs index c9e072a98..378b5336b 100644 --- a/crates/teksilo-theme-kde/tests/mount.rs +++ b/crates/teksilo-theme-kde/tests/mount.rs @@ -3,7 +3,8 @@ //! Mount every widget the Breeze preset restyles, in both schemes, render //! it, and check the colours it paints against Plasma's own: the buttons, -//! the check box, the radio button, the switch and the line edit. +//! the check box, the radio button, the switch, the line edit, the combo +//! box, the spin box, the slider, the menu, the popup frame and the tooltip. //! //! The unit tests beside each style check its rules. This checks that the //! styles run: a Tier-3 style is only exercised when its widget is built, @@ -24,20 +25,22 @@ use std::time::Duration; use serde_json::Value; use teksilo_canvas::{MockTextBackend, RenderFrame, ShapeKind, SizeProposal}; +use teksilo_core::build_context::BuildContext; use teksilo_core::event::{Key, Modifiers, PointerButton}; +use teksilo_core::overlay::OverlayPlacement; use teksilo_core::signal::Signal; -use teksilo_core::styles::Theme; -use teksilo_core::widget::Widget; +use teksilo_core::styles::{PopoverStyleConfig, PopoverVariant, Theme}; +use teksilo_core::widget::{LayoutContext, LayoutResponse, Widget}; use teksilo_core::widget_id::WidgetId; use teksilo_core::widget_tree::WidgetTree; use teksilo_i18n::lit; use teksilo_theme_kde::styles::indicator::BreezeIndicatorColors; use teksilo_theme_kde::{self as kde, KdePalette, PlasmaAccent}; use teksilo_tokens::Color; -use teksilo_widgets::primitives::{HStack, IconWidget}; +use teksilo_widgets::primitives::{FixedSize, HStack, IconWidget, TextWidget}; use teksilo_widgets::{ Button, ButtonVariant, CheckState, Checkbox, ComboBox, IconButton, IconButtonSize, MenuItem, - RadioButton, Slider, SpinBox, SplitButton, TextInput, Toggle, VStack, + MenuList, RadioButton, Slider, SpinBox, SplitButton, TextInput, Toggle, TooltipWidget, VStack, }; const PIXELS_JSON: &str = include_str!(concat!( @@ -2572,3 +2575,393 @@ fn right_to_left_mirrors_the_slider_and_keeps_the_handle_under_the_pointer() { ] ); } + +// ── Menus, popups and tooltips ────────────────────────────────────────── + +/// A menu of every kind of row Breeze has, in a 200 px column. +fn menu() -> MenuList { + MenuList::new() + .item(MenuItem::new(lit!("Open"))) + .item(MenuItem::new(lit!("Save")).shortcut_label("Ctrl+S")) + .separator() + .header(TextWidget::new(lit!("Section"))) + .item(MenuItem::new(lit!("Checkable")).checked(Signal::new(true))) + .item(MenuItem::new(lit!("Option")).radio(0, Signal::new(0_usize))) + .item(MenuItem::submenu(lit!("More"), || { + Box::new(MenuList::new().item(MenuItem::new(lit!("Inner")))) + })) + .item(MenuItem::new(lit!("Unavailable")).enabled(false)) +} + +/// A tree holding [`menu`] 200 px wide, laid out: the tree, the menu's id +/// and the ids of its rows, in order. +fn menu_tree(theme: Theme) -> (WidgetTree, WidgetId, Vec) { + let mut tree = tree_with(theme); + let column = tree.add(VStack::new().child(FixedSize::new().width(200.0).child(menu()))); + tree.layout(SizeProposal::exact(400.0, 400.0)); + let rows = nodes_named(&tree, column, "MenuItem"); + (tree, column, rows) +} + +/// Builds the theme's popover style around a label, as a popover does. +#[derive(Debug)] +struct PopoverProbe { + variant: PopoverVariant, + root: Option, +} + +impl Widget for PopoverProbe { + fn build(&mut self, ctx: &mut BuildContext) -> Vec { + let content = ctx.add(TextWidget::new(lit!("Content"))); + let style = ctx + .theme() + .style_slots + .popover + .clone() + .expect("the preset installs a popover style"); + let root = style.make_body( + &PopoverStyleConfig { + content, + variant: self.variant, + name: "Probe".to_string(), + placement: OverlayPlacement::Below, + show_caret: true, + caret_size: 6.0, + }, + ctx, + ); + self.root = Some(root); + vec![root] + } + + fn layout_response(&self, proposal: SizeProposal, ctx: &LayoutContext) -> LayoutResponse { + self.root + .and_then(|id| ctx.child_size(id, proposal)) + .unwrap_or_else(|| proposal.resolve(0.0, 0.0)) + .into() + } + + fn children(&self) -> Vec { + self.root.into_iter().collect() + } +} + +fn popover(variant: PopoverVariant) -> PopoverProbe { + PopoverProbe { + variant, + root: None, + } +} + +#[test] +fn menus_popovers_and_tooltips_mount_in_every_variant() { + for (_, theme) in themes() { + assert!(mount(theme.clone(), menu()) > 0); + assert!(mount(theme.clone(), TooltipWidget::new(lit!("Tooltip text"))) > 0); + for variant in [ + PopoverVariant::Default, + PopoverVariant::Menu, + PopoverVariant::Tooltip, + ] { + assert!(mount(theme.clone(), popover(variant)) > 0, "{variant:?}"); + } + let (mut tree, _, rows) = menu_tree(theme.clone()); + // Hover, then press, every row: none panics, each paints. + for row in rows { + let at = tree.bounds(row).center(); + tree.pointer_move(at); + assert!(!rerender(&mut tree).draw_order.is_empty()); + tree.pointer_down_button(at, PointerButton::Primary); + assert!(!rerender(&mut tree).draw_order.is_empty()); + tree.pointer_up_button(at, PointerButton::Primary); + } + } +} + +#[test] +fn menus_and_tooltips_survive_a_theme_swap_and_a_missing_palette() { + let mut tree = tree_with(kde::light()); + tree.add( + VStack::new() + .child(menu()) + .child(TooltipWidget::new(lit!("Tooltip text"))) + .child(popover(PopoverVariant::Default)), + ); + let mut bare = kde::light(); + bare.extensions.remove::(); + for theme in [ + kde::light(), + kde::dark(), + teksilo_core::presets::intui::light(), + bare, + kde::light(), + ] { + tree.set_theme(theme); + assert!(!rerender(&mut tree).draw_order.is_empty()); + } + for accent in PlasmaAccent::ALL { + for theme in [ + kde::light_with_accent(accent.color()), + kde::dark_with_accent(accent.color()), + ] { + assert!(mount(theme, menu()) > 0, "{accent:?}"); + } + } +} + +/// The menu's frame is Plasma's: the frame background in the frame outline, +/// over both layers of Breeze's Large window shadow on the 5 px window. +#[test] +fn a_menu_is_framed_as_breezes_popup_menu() { + for (scheme, theme) in themes() { + let (mut tree, column, _) = menu_tree(theme); + let (_, frame_bounds) = the_node(&tree, column, "BreezePopupFrame"); + let frame = rerender(&mut tree); + let all = painted(&frame); + let panel = inset(frame_bounds); + let face = all + .iter() + .find(|p| p.stroke == 0.0 && p.screen == panel) + .unwrap_or_else(|| panic!("{scheme}: no panel face in {all:?}")); + assert_eq!( + face.color, + sample(scheme, "menu.panel", 100, 50), + "{scheme}" + ); + assert_eq!(face.radius, 4.5); + let outline = all + .iter() + .find(|p| p.stroke == 1.0 && p.screen == panel) + .unwrap_or_else(|| panic!("{scheme}: no panel outline")); + assert_eq!( + outline.color, + sample(scheme, "menu.panel", 0, 50), + "{scheme}" + ); + assert_window_shadow(&frame, frame_bounds, scheme); + } +} + +/// Both layers of Breeze's Large shadow, on the 5 px window `bounds`. +fn assert_window_shadow(frame: &RenderFrame, bounds: teksilo_canvas::Rect, scheme: &str) { + let window = [bounds.x, bounds.y, bounds.width, bounds.height]; + let layers: Vec<_> = frame + .shadows + .iter() + .filter(|s| s.shape_rect == window) + .collect(); + assert_eq!(layers.len(), 2, "{scheme}: two shadow layers"); + for (layer, (offset, blur, alpha)) in layers.iter().zip([(5.0, 20.0, 0.22), (2.0, 10.0, 0.12)]) + { + assert_eq!(layer.blur_radius, blur, "{scheme}"); + assert!((layer.color[3] - alpha).abs() < 1e-6, "{scheme}"); + assert_eq!(&layer.color[..3], &[0.0, 0.0, 0.0], "{scheme}: black"); + assert_eq!(layer.corner_radii, [5.0; 4], "{scheme}"); + // The quad covers the blur around the window moved down by the + // layer's offset. + assert_eq!(layer.screen[1], bounds.y + offset - blur, "{scheme}"); + assert_eq!(layer.screen[0], bounds.x - blur, "{scheme}"); + } +} + +/// Every row sits 4 px inside the frame, Breeze's menu margin, and is 29 px +/// tall; a separator is 5 px. +#[test] +fn a_menus_rows_sit_in_breezes_margin() { + let (tree, column, rows) = menu_tree(kde::light()); + let (_, frame) = the_node(&tree, column, "BreezePopupFrame"); + let first = tree.bounds(rows[0]); + assert_eq!((first.x - frame.x, first.y - frame.y), (4.0, 4.0)); + assert_eq!(first.width, frame.width - 8.0); + for row in &rows { + assert_eq!(tree.bounds(*row).height, 29.0); + } + let (_, separator) = the_node(&tree, column, "MenuSeparator"); + assert_eq!(separator.height, 5.0); + assert_eq!(separator.y, tree.bounds(rows[1]).bottom()); +} + +/// The highlighted row's rectangle and the shapes painted on it. +fn row_shapes(frame: &RenderFrame, row: teksilo_canvas::Rect) -> Vec { + painted(frame) + .into_iter() + .filter(|p| p.screen == inset(row)) + .collect() +} + +/// Under the pointer a row is washed with the focus colour at 30 % and +/// outlined at radius 4.5 on the row inset by half the pen: Plasma's +/// highlight. Breeze Dark's outline is Plasma's; Breeze Light's is lifted to +/// 3:1 on the menu (D5), its own falling short. +#[test] +fn a_hovered_menu_row_is_breezes_highlight() { + for (scheme, theme) in themes() { + let window = sample(scheme, "menu_item.normal", 100, 14); + let (mut tree, _, rows) = menu_tree(theme.clone()); + let row = tree.bounds(rows[0]); + assert!( + row_shapes(&rerender(&mut tree), row).is_empty(), + "{scheme}: at rest" + ); + + tree.pointer_move(row.center()); + let frame = rerender(&mut tree); + let shapes = row_shapes(&frame, row); + let wash = shapes + .iter() + .find(|p| p.stroke == 0.0) + .unwrap_or_else(|| panic!("{scheme}: no wash in {shapes:?}")); + assert!( + near( + over(wash.color, window), + sample(scheme, "menu_item.selected", 100, 14) + ), + "{scheme}: the wash {:?}", + wash.color + ); + assert_eq!(wash.radius, 4.5); + let outline = shapes + .iter() + .find(|p| p.stroke == 1.0) + .unwrap_or_else(|| panic!("{scheme}: no outline in {shapes:?}")); + assert_eq!(outline.radius, 4.5); + let plasma = sample(scheme, "menu_item.selected", 100, 0); + let panel = theme.colors.surface_raised; + let contrast = |c: [u8; 4]| { + teksilo_tokens::contrast::composite_contrast( + Color::new( + f32::from(c[0]) / 255.0, + f32::from(c[1]) / 255.0, + f32::from(c[2]) / 255.0, + f32::from(c[3]) / 255.0, + ), + panel, + ) + }; + if scheme == "BreezeDark" { + assert_eq!(outline.color, plasma, "{scheme}: Breeze's own outline"); + } else { + assert!(contrast(plasma) < 3.0, "{scheme}: the premise of D5"); + assert_ne!(outline.color, plasma); + } + assert!(contrast(outline.color) >= 3.0, "{scheme}"); + // The label stays the window text while highlighted. + let text = rgba8_of(theme.colors.text_primary); + assert!(frame.glyphs.iter().any(|g| rgba8(g.color) == text)); + } +} + +/// Held down, the row is filled and outlined with the accent and its label +/// turns to the text on it. +#[test] +fn a_pressed_menu_row_is_filled_and_its_label_flips() { + for (scheme, theme) in themes() { + let (mut tree, _, rows) = menu_tree(theme.clone()); + let row = tree.bounds(rows[1]); + tree.pointer_move(row.center()); + tree.pointer_down_button(row.center(), PointerButton::Primary); + let frame = rerender(&mut tree); + let shapes = row_shapes(&frame, row); + let accent = rgba8_of(theme.colors.accent); + assert!( + shapes.iter().any(|p| p.stroke == 0.0 && p.color == accent), + "{scheme}: {shapes:?}" + ); + assert!(shapes.iter().any(|p| p.stroke == 1.0 && p.color == accent)); + let on_accent = rgba8_of(theme.colors.text_on_accent); + let in_row: Vec<_> = frame + .glyphs + .iter() + .filter(|g| g.screen[1] >= row.y && g.screen[1] < row.bottom()) + .map(|g| rgba8(g.color)) + .collect(); + assert!(!in_row.is_empty()); + assert!( + in_row.iter().all(|c| *c == on_accent), + "{scheme}: the label and its shortcut on the fill, {in_row:?}" + ); + tree.pointer_up_button(row.center(), PointerButton::Primary); + } +} + +/// A disabled row is never highlighted. +#[test] +fn a_disabled_menu_row_is_not_highlighted() { + let (mut tree, _, rows) = menu_tree(kde::light()); + let row = tree.bounds(*rows.last().unwrap()); + tree.pointer_move(row.center()); + assert!(row_shapes(&rerender(&mut tree), row).is_empty()); +} + +/// A tooltip is Plasma's: the tooltip background in its outline, over the +/// window shadow, the text 4 px inside the frame. +#[test] +fn a_tooltip_is_framed_as_breezes() { + for (scheme, theme) in themes() { + let mut tree = tree_with(theme); + let root = tree.add( + VStack::new().child(HStack::new().child(TooltipWidget::new(lit!("Tooltip text")))), + ); + tree.layout(SizeProposal::exact(400.0, 300.0)); + let (frame_id, bounds) = the_node(&tree, root, "BreezePopupFrame"); + let text = tree.bounds(tree.children(frame_id)[0]); + assert_eq!((text.x - bounds.x, text.y - bounds.y), (4.0, 4.0)); + assert_eq!(bounds.height, text.height + 8.0); + let frame = rerender(&mut tree); + let all = painted(&frame); + let face = all + .iter() + .find(|p| p.stroke == 0.0 && p.screen == inset(bounds)) + .unwrap_or_else(|| panic!("{scheme}: no face in {all:?}")); + assert_eq!( + face.color, + sample(scheme, "tooltip.panel", 50, 15), + "{scheme}" + ); + assert_eq!(face.radius, 4.5); + let outline = all + .iter() + .find(|p| p.stroke == 1.0 && p.screen == inset(bounds)) + .unwrap_or_else(|| panic!("{scheme}: no outline")); + assert_eq!( + outline.color, + sample(scheme, "tooltip.panel", 0, 15), + "{scheme}" + ); + assert_window_shadow(&frame, bounds, scheme); + } +} + +/// A popover that is not a menu pads its content 4 px and draws no caret; +/// its `Tooltip` variant takes the tooltip's colours, and a menu's frame +/// has no padding. +#[test] +fn a_popover_is_a_breeze_popup_with_no_caret() { + for (variant, padding, face) in [ + (PopoverVariant::Default, 4.0, "menu.panel"), + (PopoverVariant::Tooltip, 4.0, "tooltip.panel"), + (PopoverVariant::Menu, 0.0, "menu.panel"), + ] { + for (scheme, theme) in themes() { + let (mut tree, root) = placed(theme, popover(variant)); + let (frame_id, bounds) = the_node(&tree, root, "BreezePopupFrame"); + let content = tree.bounds(tree.children(frame_id)[0]); + assert_eq!(content.x - bounds.x, padding, "{variant:?}"); + assert_eq!(content.y - bounds.y, padding, "{variant:?}: no caret above"); + let frame = rerender(&mut tree); + assert!(frame.paths.is_empty(), "{variant:?}: a caret was drawn"); + let all = painted(&frame); + let fill_at = if face == "tooltip.panel" { + (50, 15) + } else { + (100, 50) + }; + assert!( + all.iter().any(|p| p.stroke == 0.0 + && p.screen == inset(bounds) + && p.color == sample(scheme, face, fill_at.0, fill_at.1)), + "{scheme} {variant:?}: {all:?}" + ); + } + } +} diff --git a/crates/teksilo-theme-kde/tests/preset_metrics.rs b/crates/teksilo-theme-kde/tests/preset_metrics.rs index fdc7307c6..d3ad84404 100644 --- a/crates/teksilo-theme-kde/tests/preset_metrics.rs +++ b/crates/teksilo-theme-kde/tests/preset_metrics.rs @@ -32,10 +32,10 @@ use teksilo_target_conformance::in_tappable_row; use teksilo_theme_kde::geometry::BreezeGeometry; use teksilo_theme_kde::{self as kde}; use teksilo_tokens::TargetDensity; -use teksilo_widgets::primitives::IconWidget; +use teksilo_widgets::primitives::{FixedSize, IconWidget}; use teksilo_widgets::{ - Button, ButtonVariant, Checkbox, ComboBox, IconButton, IconButtonSize, MenuItem, RadioButton, - Slider, SpinBox, SplitButton, TextInput, Toggle, + Button, ButtonVariant, Checkbox, ComboBox, IconButton, IconButtonSize, MenuItem, MenuList, + RadioButton, Slider, SpinBox, SplitButton, TextInput, Toggle, }; const SIZES_JSON: &str = include_str!(concat!( @@ -640,3 +640,106 @@ fn a_slider_measures_breezes_at_every_density() { } } } + +// ── Menus ────────────────────────────────────────────────────────────── + +/// The rows Qt laid out for Breeze's menu with icons at Plasma's default +/// font: each row's kind and its `(x, y, height)` in the menu. +fn qt_menu_rows() -> Vec<(String, (f32, f32, f32))> { + let all: Value = serde_json::from_str(SIZES_JSON).expect("sizes.json parses"); + let menu = all["widgets"] + .as_array() + .expect("the measured widgets") + .iter() + .find(|w| w["id"] == "menu.with_icon" && w["font"] == "Noto Sans 10") + .expect("sizes.json has the menu"); + menu["rows"] + .as_array() + .expect("the menu's rows") + .iter() + .map(|r| { + let g = |i: usize| r["geometry"][i].as_f64().unwrap() as f32; + (r["kind"].as_str().unwrap().to_string(), (g(0), g(1), g(3))) + }) + .collect() +} + +/// A menu's rows are 29 px at Compact, Qt's height for every Breeze menu +/// item, and rise to the density's target size above it; a separator is +/// Breeze's 5 px, its gap scaled by the density's spacing; the rows sit +/// 4 px inside the frame, the menu margin, and every label starts after +/// the 12 px margin, the 16 px icon column and 3 px more. No row fails the +/// conformance gate at any density. +#[test] +fn a_menu_measures_breezes_rows_at_every_density() { + let qt = qt_menu_rows(); + let height_of = |kind: &str| { + qt.iter() + .find(|(k, _)| k == kind) + .unwrap_or_else(|| panic!("Qt measured no {kind} row")) + .1 + }; + for kind in ["item", "shortcut", "checkable", "submenu"] { + assert_eq!(height_of(kind).2, 29.0, "{kind}"); + } + assert_eq!(height_of("separator").2, 5.0); + assert_eq!(height_of("section").2, 28.0); + let (x, y, _) = height_of("item"); + assert_eq!((x, y), (4.0, 4.0), "Qt's menu margin"); + let compact = teksilo_theme_kde::styles::metrics::breeze_menu_metrics(); + assert_eq!(compact.section_height, height_of("section").2); + + for (density, item, separator, spacing) in [ + (TargetDensity::Compact, 29.0, 5.0, 1.0), + (TargetDensity::Comfortable, 32.0, 5.75, 1.15), + (TargetDensity::Touch, 44.0, 6.5, 1.3), + ] { + for theme in themes() { + let menu = MenuList::new() + .item(MenuItem::new(lit!("Open"))) + .item(MenuItem::new(lit!("Save")).shortcut_label("Ctrl+S")) + .separator() + .item(MenuItem::new(lit!("Checkable")).checked(Signal::new(true))) + .item(MenuItem::submenu(lit!("Submenu"), || { + Box::new(MenuList::new().item(MenuItem::new(lit!("Inner")))) + })); + let (mut tree, root) = + in_a_row(&theme, density, FixedSize::new().width(200.0).child(menu)); + let rows = nodes_named(&tree, root, "MenuItem"); + assert_eq!(rows.len(), 4); + for row in &rows { + assert_eq!(tree.bounds(*row).height, item, "{density:?}"); + } + let sep = nodes_named(&tree, root, "MenuSeparator"); + assert!( + (tree.bounds(sep[0]).height - separator).abs() < 1e-4, + "{density:?}" + ); + let frame = nodes_named(&tree, root, "BreezePopupFrame"); + let (f, first) = (tree.bounds(frame[0]), tree.bounds(rows[0])); + assert_eq!((first.x - f.x, first.y - f.y), (4.0, 4.0), "{density:?}"); + // The first row's label. + let rendered = tree.render(); + let label_x = rendered + .glyphs + .iter() + .filter(|g| g.screen[1] >= first.y && g.screen[1] < first.bottom()) + .map(|g| g.screen[0]) + .fold(f32::INFINITY, f32::min); + let expected = (12.0 + 3.0) * spacing + 16.0; + assert!( + (label_x - first.x - expected).abs() < 1e-3, + "{density:?}: the label at {}, want {expected}", + label_x - first.x + ); + assert_eq!( + target_audit(&tree, density) + .into_iter() + .filter(|v| v.rule.is_conformance_failure()) + .count(), + 0, + "{density:?}: a conformance failure" + ); + } + } +} From 8adb67dbe70701e42ccbb08c293d918f44ddae0d Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 19:20:03 +0200 Subject: [PATCH 26/59] feat(theme-kde): paint rows, tables, tabs, scroll bars and progress bars as Breeze does The preset installs five more structural styles: standard_item, table, tab, scroll_bar and progress_bar. The five slots leave KDE_UNFILLED. Their dimensions are in styles::metrics (BreezeRowMetrics, BreezeTableMetrics, BreezeTabMetrics, BreezeScrollBarMetrics, BreezeProgressMetrics), all built from geometry and rendered through the row, table, tab and thumb accessors. Two framework hooks close what those accessors could not reach, both defaulted so an existing style needs no change: StandardItemStyle::min_height_decorated, the floor of a single-line row with a check box or a leading slot (StandardListItem records whether it has one before its build takes them), and ProgressBarStyle::thickness and paints_busy_indicator, the bar's thickness when the app sets none and whether the style draws an indeterminate bar's motion, in which case ProgressBar mounts the style alone in either orientation and draws no sweep. The ProgressBar::thickness doc and its catalog page say the default is now the style's. Rows, spec k.4, k.5.16 and the C0 outcome: 24 px of text, 26 with an icon or a check box, 42 with a subtitle (two line boxes and the margins, [derived]), through dp(.., Target); content 7 px inside the leading and trailing edges (Qt's check box at x 7) and 1 px inside the top and bottom; the shipped recipe's row arithmetic with its chrome held off and its unread gaps left at their defaults. The selection lies inside the 2 px and 1 px item margins, stroked at radius 4.5: selected, accent fill and outline with TextRole::OnAccent glyphs (D1); hovered and selected, accent_hover, Qt's lighter(110); hovered, surface_hover outlined in the highlight at 0.8; disabled and selected, the disabled highlight. The leaf is hit_transparent, the frame places it and the row at full bounds so the selection spans the row's width, and selection_emphasis is WindowActive: a backdrop window paints Plasma's inactive highlight, 194,224,245 in Breeze Light. Keyboard focus on a focused view adds the D5 focus frame around the selection. Tables, k.4 and k.5.15: D7 raises Qt's 23 px row (with its grid line) to 24, then through the ladder; the header is 30, its sections the button colour, moved 20 % toward the hover colour when hovered and toward the focus colour while resizing or sorted down, with a 1 px bottom and trailing line in the window text at the frame contrast, mirrored right to left, label padding 6. Sorted down is Qt's indicator, which its header view sets for an ascending sort and Breeze, inverting the indicator, draws as an up arrow, so the ascending column is the one shown pressed. make_row_background and make_sort_indicator are Breeze's (square cells, the 10 px chevron), though the views paint their own band and arrow. Tabs, k.4 and k.5.14: 30 px, padding 8; the selected tab a 3 px highlight bar on its outer edge, outer corners at radius 5, the window colour below it and the frame outline down its two sides, open toward the page, the outline stroked at radius 4.5 so it and the face keep turning through the bar's corner below the bar (rows 3 and 4 of Plasma's sample); an unselected tab the window darkened 120 %, hovered the window moved 20 % toward the hover colour; the bar follows active_indicator and the layout direction; disabled tabs paint the disabled colours; focus draws the focus frame flush inside. The strip is the shipped RecipeTabStyle's with these metrics. Where the specification gives the selected tab the frame background, Plasma's samples (pixels.json, document mode on and off) show the window colour, which is used, as measured. Scroll bars, k.5.11 and n.20: no track; a permanent bar's 1 px separator on its leading edge in the view text at the frame contrast; the 8 px handle centred in what it leaves (7 px from the separator in a 21 px bar), painted 7 wide at radius 4 and floored at 20 px (a grab, so at every density), filled with the D9-lifted thumb tokens and outlined in the window text or the hover colour at the frame contrast; the widget's own thumb arithmetic, mirrored right to left. Progress bars, k.5.12: 26 px, Qt's hint, around a 6 px groove at radius 3, the window text at 0.14 and the contents floor(value x length) long in the highlight at 0.7, each outlined at the frame contrast, from the right in a right-to-left window and from the bottom when vertical; a busy bar's 28 px stripes, 14 of the highlight and 14 of it moved 70 % to the window, move one period every 800 ms, linearly, and stand still under reduced motion. Departures and limits, documented in the modules and the crate's known limitations: the bar's own 96 px minimum tab width replaces Breeze's 80, and the 34 px static tab is recorded but not laid out (a TabStyle is not told); scroll bars keep the widget's thickness rather than 21 px and turn to the hover colour over the whole bar; the views paint the table's selection band, which mutes on view focus too; a row cannot mark the current unselected row; a short progress contents keeps its length. Tests: unit tests of every metric at every density and at 12 pt, the D7 premise, the row, header, tab, scroll and progress colours against pixels.json in Breeze Light and Dark, the label on the selection with every Plasma accent, the bar edge for each orientation, position and direction, the separator and handle placement, the busy stripes and the palette-less fallbacks; lib.rs reprojects the five slots through with_density and measures a rendered row of 24, 32 and 44; StandardListItem and ProgressBar tests cover the new hooks and their defaults. tests/mount.rs mounts every row, table, tab bar, scroll bar variant and progress bar, light and dark, in the swap, the palette-less and the swatch tests, and checks the selected row (highlight, opaque outline, OnAccent glyphs, filling 200 and 480 px rows), the unselected row painting nothing, the hovered and backdrop rows, the 3 px tab bar with its face and sides and the unselected and hovered tabs, a vertical tab's bar in both directions, the scroll bar's separator, handle and hover with no track, the progress groove and contents in both directions, the busy stripes' direction and speed on the simulated clock, and the header section at rest, hovered, resizing and sorted, with its trailing line right to left; a scheme whose focus and hover colours differ tells the pressed mix from the hovered one. tests/preset_metrics.rs measures list and tree rows (24, 26, 26, 42 at Compact; 32, 32, 34, 42; 44, 44, 46, 44) against sizes.json with the conformance gate, the installed row floors, D7 (table and tree table rows 24 under a 30 px header), tabs (30 and padding 8, rising with the density), the 20 px thumb floor and the 26 px progress bar. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 30 +- Cargo.lock | 1 + .../src/styles/progress_bar_style.rs | 32 +- .../src/styles/standard_item_style.rs | 15 + crates/teksilo-theme-kde/Cargo.toml | 2 + crates/teksilo-theme-kde/src/lib.rs | 148 +++- crates/teksilo-theme-kde/src/styles.rs | 15 +- .../teksilo-theme-kde/src/styles/metrics.rs | 387 ++++++++- .../src/styles/progress_bar.rs | 512 ++++++++++++ .../src/styles/scroll_bar.rs | 506 ++++++++++++ .../src/styles/standard_item.rs | 625 ++++++++++++++ crates/teksilo-theme-kde/src/styles/tab.rs | 695 ++++++++++++++++ crates/teksilo-theme-kde/src/styles/table.rs | 559 +++++++++++++ crates/teksilo-theme-kde/tests/mount.rs | 775 +++++++++++++++++- .../teksilo-theme-kde/tests/preset_metrics.rs | 319 +++++++ crates/teksilo-widgets/src/progress_bar.rs | 140 +++- crates/teksilo-widgets/src/standard_item.rs | 122 +++ docs/widgets/progress_bar.md | 3 +- 18 files changed, 4839 insertions(+), 47 deletions(-) create mode 100644 crates/teksilo-theme-kde/src/styles/progress_bar.rs create mode 100644 crates/teksilo-theme-kde/src/styles/scroll_bar.rs create mode 100644 crates/teksilo-theme-kde/src/styles/standard_item.rs create mode 100644 crates/teksilo-theme-kde/src/styles/tab.rs create mode 100644 crates/teksilo-theme-kde/src/styles/table.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 43f1d6fb6..a501938c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -65,6 +65,16 @@ by crate for clarity, not because crates version independently. colour groups). The row's label, subtitle and chevron follow it, and `SelectionEmphasis::emphasised` gives a style the same condition for its own selection fill. +- **`StandardItemStyle::min_height_decorated`.** A row style says how tall a + `StandardListItem` or `StandardTreeItem` row with a check box or a leading + slot is at the active density, for a design whose rows grow with an icon. + It defaults to the single-line height, so an existing style keeps one + height for every row. +- **`ProgressBarStyle::thickness` and `paints_busy_indicator`.** A progress + bar style says how thick a `ProgressBar` is when the app sets no + thickness, and whether it draws an indeterminate bar's motion itself, in + which case the bar shows the style alone instead of its own sweep. Both + have defaults, so an existing style keeps the 4 px bar and the sweep. - **`MenuItemStyle::pressed_label_role`.** A menu style gives the text role a `MenuItem`'s label and shortcut take while the row is pressed, for a design whose pressed row is a solid fill while its hover is a pale wash. It @@ -183,8 +193,24 @@ by crate for clarity, not because crates version independently. density and font, among them the height of a section title. The outlines of an empty check box, radio button and field, of a switch on or off and of a slider's handle, a slider's tick marks and a highlighted menu row's - outline, are strengthened to a 3:1 contrast, keeping their hue. Other - widgets draw Teksilo's own chrome in these colours and shapes. + outline, are strengthened to a 3:1 contrast, keeping their hue. A + `StandardListItem` or `StandardTreeItem` row is Breeze's, 24 px at + Plasma's default font, 26 px with an icon or a check box and 42 px with a + subtitle, growing to the density's target size: a selected row is the + highlight inside the row's margins, its label in the text on it, a + hovered one a pale wash of the highlight, and a selection mutes only when + the window goes inactive. A `TableView` or `TreeTableView` row is 24 px, + rather than Breeze's 23, so it stays a WCAG target size, under a 30 px + header of Breeze's sections, where the column sorted in ascending order + is shown pressed, as in Plasma. A selected tab is the window colour under + a 3 px highlight bar, its outline turning through the bar's rounded + corners, and an unselected one the window colour darkened, 30 px tall. A + `ScrollBar` is Breeze's 8 px handle over no track, beside a 1 px + separator, with a thumb at least 20 px long, its colours strengthened to a + 3:1 contrast. A `ProgressBar` is 26 px thick around Breeze's 6 px groove, + filled toward the highlight, and an indeterminate one shows Breeze's + moving stripes. Other widgets draw Teksilo's own chrome in these colours + and shapes. #### Platform diff --git a/Cargo.lock b/Cargo.lock index e74427cbb..60150b2a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12237,6 +12237,7 @@ dependencies = [ "serde_json", "teksilo-canvas", "teksilo-core", + "teksilo-data", "teksilo-i18n", "teksilo-kde-scheme", "teksilo-target-conformance", diff --git a/crates/teksilo-core/src/styles/progress_bar_style.rs b/crates/teksilo-core/src/styles/progress_bar_style.rs index 1395df0df..1469b8721 100644 --- a/crates/teksilo-core/src/styles/progress_bar_style.rs +++ b/crates/teksilo-core/src/styles/progress_bar_style.rs @@ -13,7 +13,7 @@ use std::rc::Rc; -use teksilo_tokens::Orientation; +use teksilo_tokens::{InputTokens, Orientation}; use crate::build_context::BuildContext; use crate::color_prop::ColorProp; @@ -45,6 +45,36 @@ pub struct ProgressBarStyleConfig { pub trait ProgressBarStyle: 'static { fn make_body(&self, cfg: &ProgressBarStyleConfig, ctx: &mut BuildContext) -> WidgetId; + + /// The bar's narrow dimension, in logical pixels, at the density `tokens` + /// describe, when the app gives it none (`ProgressBar::thickness`): the + /// height of a horizontal bar, the width of a vertical one. `None` (the + /// default) keeps the widget's own 4 px. + /// + /// A metrics accessor because the bar measures itself in + /// `layout_response`, where the chrome `make_body` built is out of reach. + /// A design language whose bar reserves room around a thinner groove (Qt + /// sizes a KDE Breeze bar for its text and centres a 6 px groove in it) + /// says so here and paints the groove inside the bounds it is given. + fn thickness(&self, _tokens: &InputTokens) -> Option { + None + } + + /// Whether this style paints an indeterminate bar's motion itself. + /// + /// `false` (the default): the bar draws its own sweep, a shader-driven + /// quad for a horizontal bar and a moving fill over + /// [`make_body`](Self::make_body)'s track for a vertical one, and the + /// style supplies only the stationary chrome. `true`: the bar mounts + /// `make_body` alone for an indeterminate bar in either orientation, with + /// [`ProgressKind::Indeterminate`], and the style draws the whole busy + /// indicator, animating it (and holding it still under the reduced-motion + /// preference, `BuildContext::prefers_reduced_motion`) itself. For a + /// design language whose busy bar is not a sweep, such as KDE Breeze's + /// moving stripes. + fn paints_busy_indicator(&self) -> bool { + false + } } pub type SharedProgressBarStyle = Rc; diff --git a/crates/teksilo-core/src/styles/standard_item_style.rs b/crates/teksilo-core/src/styles/standard_item_style.rs index c2ae67611..3be0932cf 100644 --- a/crates/teksilo-core/src/styles/standard_item_style.rs +++ b/crates/teksilo-core/src/styles/standard_item_style.rs @@ -155,6 +155,21 @@ pub trait StandardItemStyle: 'static { dp(28.0, TargetRole::Target, tokens) } + /// The height floor of a row with no subtitle that carries a leading + /// decoration, a check box or a leading slot (an icon, typically), in + /// logical pixels, at the density `tokens` describe. + /// + /// Some design languages make such a row taller than a row of text + /// alone: Qt adds 2 px for an item's icon, so a KDE Breeze row is 24 px + /// with text only and 26 px with an icon or a check box. + /// + /// **Defaulted** to [`min_height_single_line`](Self::min_height_single_line), + /// so a style that does not tell the two apart keeps one floor and an + /// existing style needs no change. + fn min_height_decorated(&self, tokens: &InputTokens) -> f32 { + self.min_height_single_line(tokens) + } + /// The height floor of a row carrying a subtitle, in logical pixels. /// Defaulted on the same terms as /// [`min_height_single_line`](Self::min_height_single_line), from diff --git a/crates/teksilo-theme-kde/Cargo.toml b/crates/teksilo-theme-kde/Cargo.toml index 6c35ac92b..578ab8dda 100644 --- a/crates/teksilo-theme-kde/Cargo.toml +++ b/crates/teksilo-theme-kde/Cargo.toml @@ -45,6 +45,8 @@ serde_json = { workspace = true } # `tests/mount.rs` and `tests/preset_metrics.rs` build real widget trees; # `lit!` supplies the untranslated labels those constructors take. teksilo-i18n = { workspace = true } +# The models behind the tables and tab bars those tests mount. +teksilo-data = { workspace = true } # `tests/preset_metrics.rs` reuses the conformance harness's # `in_tappable_row`, the row geometry that denies the miss-only slop pass, # rather than a copy that could drift from the gate's. Path-only (no diff --git a/crates/teksilo-theme-kde/src/lib.rs b/crates/teksilo-theme-kde/src/lib.rs index 53a58c192..94f5bc229 100644 --- a/crates/teksilo-theme-kde/src/lib.rs +++ b/crates/teksilo-theme-kde/src/lib.rs @@ -61,6 +61,17 @@ //! a popover and a tooltip are framed at the 5 px radius in a 1 px //! outline over Breeze's two-layer window shadow, and a tooltip's text //! lies 4 px inside its frame. +//! - **Breeze's rows, tabs and bars.** A list or tree row is 24 px at +//! Plasma's default font, 26 with an icon or a check box, its selection a +//! rounded rectangle inside the row's 2 px and 1 px margins, filled with +//! the highlight and written in the text on it, and muted only when the +//! window goes inactive; a table row is 24 px under a 30 px header of +//! button-coloured sections, the column sorted in ascending order shown +//! pressed. A selected tab is the window colour under a +//! 3 px highlight bar, an unselected one the window colour darkened. A +//! scroll bar is an 8 px handle over no track beside a 1 px separator, +//! and a progress bar a 6 px groove filled toward the highlight, its busy +//! state moving stripes. //! - **Breeze's focus ring geometry.** Keyboard focus is a 2 px band, half //! inside the control and half outside, in the scheme's focus colour. //! Breeze paints it at 30 % ([`shape::BREEZE_FOCUS_RING_ALPHA`]); the @@ -113,9 +124,11 @@ //! - **Most widget chrome is the framework's.** This version installs //! Breeze styles for `Button`, `IconButton`, `SplitButton`, `Toggle`, //! `Checkbox`, `RadioButton`, `TextInput`, `ComboBox`, `SpinBox`, -//! `Slider`, `MenuItem`, the popup frame and the tooltip only: every -//! other widget keeps Teksilo's recipe style, painted in the Breeze -//! colours, radii, focus ring, typography and motion. +//! `Slider`, `MenuItem`, the popup frame, the tooltip, `StandardListItem` +//! and `StandardTreeItem`, `TableView` and `TreeTableView`, `TabBar` and +//! `TabWidget`, `ScrollBar` and `ProgressBar` only: every other widget +//! keeps Teksilo's recipe style, painted in the Breeze colours, radii, +//! focus ring, typography and motion. //! - **A menu's shortcuts, separators, section titles and check marks are //! the framework's.** `MenuItem` writes a shortcut in the shortcut text //! role, where Breeze writes the window text at 70 % opacity, and gives @@ -166,6 +179,32 @@ //! the node is raised to the density's target on both axes, the 36 x 18 //! indicator painted unchanged in it; and a checked track is outlined in //! the highlight lifted to 3:1 (D6) ([`styles::toggle`]). +//! - **A table's selection band, alternate rows, grid lines and sort arrow +//! are the view's.** `TableView` and `TreeTableView` paint them +//! themselves, from the theme's tokens: the band is square and the +//! highlight, as Breeze's, but it mutes when the table loses keyboard +//! focus as well as when the window goes inactive, and a hovered row is +//! not washed. The style's own row background and sort arrow are +//! Breeze's, for a style that composes them ([`styles::table`]). +//! - **A tab is at least 96 px wide, and always 30 px tall.** The bar +//! applies its own minimum tab width, where Breeze's is 80, and a +//! `TabStyle` is not told whether its bar is one Breeze makes 34 px tall +//! (a document-mode, static bar); both numbers are in +//! [`styles::metrics::BreezeTabMetrics`] ([`styles::tab`]). +//! - **A scroll bar is as thick as the widget lays it out.** A +//! `ScrollArea`'s bars are 12 px and a `ScrollBar`'s 8 px unless the app +//! says otherwise, where Breeze's is 21; the handle keeps its 8 px width +//! and a permanent bar its 1 px separator in whatever thickness it is +//! given. The handle takes the hover colour while the pointer is over the +//! bar, not only over the handle, and is filled in the lifted thumb +//! colours (D9, [`styles::scroll_bar`]). +//! - **A list row does not mark the current row apart from the selected +//! one.** Keyboard focus on a focused view adds the focus frame around the +//! selected row; Breeze outlines an unselected current row instead, which +//! a row is not told it is ([`styles::standard_item`]). +//! - **A progress bar shows no text.** `ProgressBar` has none to show; the +//! bar is still Qt's 26 px, room for it, around the 6 px groove +//! ([`styles::progress_bar`]). //! - **A short text field keeps its frame.** Breeze paints only the fill of //! a line edit shorter than the line box plus 12 px; the field keeps its //! outline at every height, the field's only boundary (D6, @@ -329,8 +368,9 @@ fn project(theme: &Theme, state: PaintState) -> Theme { /// Install the Breeze Tier-3 chrome. /// /// The buttons, the check box, the radio button, the switch, the line edit, -/// the combo box, the spin box, the slider, the menu item, the popup frame -/// and the tooltip are Breeze's own ([`styles`]); every other slot is left to +/// the combo box, the spin box, the slider, the menu item, the popup frame, +/// the tooltip, the list row, the table, the tab, the scroll bar and the +/// progress bar are Breeze's own ([`styles`]); every other slot is left to /// the widget's recipe style, which paints from the Breeze tokens, and the /// crate's tests list the reason for each. Every style installed here reads /// its metrics from the theme it builds under, `theme.input` included, so @@ -339,6 +379,11 @@ fn install_styles(theme: &mut Theme) { let menu_item = styles::menu_item::BreezeMenuItemStyle::for_theme(theme); let popover = styles::popover::BreezePopoverStyle::for_tokens(&theme.input); let tooltip = styles::tooltip::BreezeTooltipStyle::for_tokens(&theme.input); + let standard_item = styles::standard_item::BreezeStandardItemStyle::for_theme(theme); + let table = styles::table::BreezeTableStyle::for_theme(theme); + let tab = styles::tab::BreezeTabStyle::for_theme(theme); + let scroll_bar = styles::scroll_bar::BreezeScrollBarStyle::for_tokens(&theme.input); + let progress_bar = styles::progress_bar::BreezeProgressBarStyle::for_theme(theme); let slots = &mut theme.style_slots; slots.button = Some(Rc::new(styles::button::BreezeButtonStyle)); slots.icon_button = Some(Rc::new(styles::icon_button::BreezeIconButtonStyle)); @@ -353,6 +398,11 @@ fn install_styles(theme: &mut Theme) { slots.menu_item = Some(Rc::new(menu_item)); slots.popover = Some(Rc::new(popover)); slots.tooltip = Some(Rc::new(tooltip)); + slots.standard_item = Some(Rc::new(standard_item)); + slots.table = Some(Rc::new(table)); + slots.tab = Some(Rc::new(tab)); + slots.scroll_bar = Some(Rc::new(scroll_bar)); + slots.progress_bar = Some(Rc::new(progress_bar)); } #[cfg(test)] @@ -568,18 +618,6 @@ mod tests { "chart", "Breeze has no chart chrome; the teksilo-charts default reads the series colours and the Breeze border role", ), - ( - "scroll_bar", - "no Breeze scroll bar is installed; the recipe paints the Breeze thumb tokens over no track", - ), - ( - "standard_item", - "no Breeze row highlight is installed; the recipe row paints the Breeze hover and selection tokens", - ), - ( - "tab", - "no Breeze tab is installed; the recipe tab paints the Breeze surface and accent tokens", - ), ( "dialog", "the recipe dialog paints the Breeze surfaces, radius and shadow tokens", @@ -600,10 +638,6 @@ mod tests { "badge", "Breeze has no badge; the recipe badge paints the Breeze accent and status tokens", ), - ( - "progress_bar", - "no Breeze progress groove is installed; the recipe bar paints the Breeze accent token", - ), ( "link", "the recipe link paints the Breeze link tokens, lifted to the text floor", @@ -632,10 +666,6 @@ mod tests { "rich_text_editor", "the recipe frames the viewport in the Breeze border and surface roles; the text is document content", ), - ( - "table", - "no Breeze table rows are installed; the recipe paints the Breeze selection, alternate-row and divider tokens", - ), ( "list_container", "the recipe is only the drag-insertion line, drawn in the Breeze accent", @@ -866,6 +896,74 @@ mod tests { assert_eq!(m.item_height, 29.0); } + /// The rows a `StandardListItem` lays out follow the density a theme is + /// projected to: the installed row, table, tab, scroll-bar and + /// progress-bar styles are rebuilt from the projected input tokens, and + /// a row measured in a tree is the one the style reports. + #[test] + fn a_density_switch_reprojects_the_rows_and_bars() { + use std::cell::RefCell; + use teksilo_canvas::{MockTextBackend, SizeProposal}; + use teksilo_core::widget_tree::WidgetTree; + let base = light(); + for (density, row, table, tab) in [ + (TargetDensity::Compact, 24.0, 24.0, 30.0), + (TargetDensity::Comfortable, 32.0, 32.0, 32.0), + (TargetDensity::Touch, 44.0, 44.0, 44.0), + ] { + let t = base.with_density(density); + let slots = &t.style_slots; + let input = &t.input; + let rows = slots.standard_item.as_ref().expect("a row style"); + assert_eq!(rows.min_height_single_line(input), row, "{density:?}"); + assert_eq!( + slots + .table + .as_ref() + .expect("a table style") + .row_height(input), + table, + "{density:?}" + ); + assert_eq!( + slots + .tab + .as_ref() + .expect("a tab style") + .editor_height(input), + tab, + "{density:?}" + ); + assert_eq!( + slots + .scroll_bar + .as_ref() + .expect("a scroll-bar style") + .min_thumb_length(input), + 20.0 + ); + assert_eq!( + slots + .progress_bar + .as_ref() + .expect("a progress-bar style") + .thickness(input), + Some(26.0) + ); + let mut tree = WidgetTree::new() + .with_theme(t.clone()) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))); + let id = tree.add(teksilo_widgets::StandardListItem::new(teksilo_i18n::lit!( + "Row" + ))); + tree.layout(SizeProposal { + width: Some(300.0), + height: None, + }); + assert_eq!(tree.bounds(id).height, row, "{density:?}: the rendered row"); + } + } + /// Every colour token, pinned to its source in Breeze Light's resolved /// palette. The destructuring has no `..`: a field added to /// `ColorTokens` must be pinned here before this compiles. diff --git a/crates/teksilo-theme-kde/src/styles.rs b/crates/teksilo-theme-kde/src/styles.rs index 8d4d018ea..e1edbce3a 100644 --- a/crates/teksilo-theme-kde/src/styles.rs +++ b/crates/teksilo-theme-kde/src/styles.rs @@ -25,7 +25,15 @@ //! - the menu item, washed with the focus colour and outlined while it is //! highlighted, in [`menu_item`], and the frame of every popup, a menu's, //! a popover's and a tooltip's, over Breeze's two-layer window shadow, -//! painted by [`popup`] for [`popover`] and [`tooltip`]. +//! painted by [`popup`] for [`popover`] and [`tooltip`]; +//! - the list and tree row, a rounded selection inside the item margins +//! filled with the highlight, in [`standard_item`], and the table's header +//! sections and rows, in [`table`]; +//! - the tab, the window colour with a 3 px highlight bar when selected and +//! the window colour darkened when not, in [`tab`]; +//! - the scroll bar, a separator and an 8 px handle over no track, in +//! [`scroll_bar`], and the progress bar, a 6 px groove filled toward the +//! highlight or striped while busy, in [`progress_bar`]. //! //! The dimensions they are built with, all derived from [`crate::geometry`] //! and the density ladder, are collected in [`metrics`]. @@ -41,10 +49,15 @@ pub mod menu_item; pub mod metrics; pub mod popover; pub mod popup; +pub mod progress_bar; pub mod radio; +pub mod scroll_bar; pub mod slider; pub mod spin_box; pub mod split_button; +pub mod standard_item; +pub mod tab; +pub mod table; pub mod text_input; pub mod toggle; pub mod tooltip; diff --git a/crates/teksilo-theme-kde/src/styles/metrics.rs b/crates/teksilo-theme-kde/src/styles/metrics.rs index b1d0487f4..baac4ecc8 100644 --- a/crates/teksilo-theme-kde/src/styles/metrics.rs +++ b/crates/teksilo-theme-kde/src/styles/metrics.rs @@ -17,10 +17,13 @@ use teksilo_tokens::{InputTokens, TargetRole, TypographyTokens}; use crate::geometry::{ BUTTON_MARGIN_WIDTH, BreezeGeometry, CHECKBOX_FOCUS_MARGIN, CHECKBOX_ITEM_SPACING, - CHECKBOX_SIZE, COMBO_BOX_FRAME_WIDTH, FRAME_WIDTH, LARGE_ICON_SIZE, LINE_EDIT_FRAME_WIDTH, + CHECKBOX_SIZE, COMBO_BOX_FRAME_WIDTH, FRAME_WIDTH, HEADER_MARGIN, ITEM_VIEW_MARGIN_HEIGHT, + ITEM_VIEW_MARGIN_WIDTH, ITEM_VIEW_PADDING, LARGE_ICON_SIZE, LINE_EDIT_FRAME_WIDTH, MEDIUM_ICON_SIZE, MENU_ITEM_ACCELERATOR_SPACE, MENU_ITEM_MARGIN, MENU_ITEM_TEXT_LEFT_MARGIN, - SLIDER_CONTROL_THICKNESS, SLIDER_GROOVE_THICKNESS, SLIDER_TICK_LENGTH, SLIDER_TICK_MARGIN, - SMALL_ICON_SIZE, SPIN_BOX_ARROW_BUTTON_WIDTH, SPIN_BOX_FRAME_WIDTH, TOOL_BUTTON_MARGIN_WIDTH, + PROGRESS_BAR_THICKNESS, SCROLL_BAR_EXTENT, SCROLL_BAR_HANDLE_WIDTH, + SCROLL_BAR_MIN_HANDLE_LENGTH, SLIDER_CONTROL_THICKNESS, SLIDER_GROOVE_THICKNESS, + SLIDER_TICK_LENGTH, SLIDER_TICK_MARGIN, SMALL_ICON_SIZE, SPIN_BOX_ARROW_BUTTON_WIDTH, + SPIN_BOX_FRAME_WIDTH, TAB_MARGIN_WIDTH, TOOL_BUTTON_MARGIN_WIDTH, }; use crate::shape::BREEZE_PEN_WIDTH; @@ -457,6 +460,266 @@ pub fn breeze_menu_metrics() -> BreezeMenuMetrics { ) } +/// `[measured-qt]` How far a row's content lies inside its leading and +/// trailing edges: the 2 px item margin, the 2 px item padding and Qt's 3 px +/// text margin, where Qt puts a row's check box (7 px in, among the +/// `item_view_item` sub-rectangles of `sizes.json`). +pub const ROW_CONTENT_INSET: f32 = ITEM_VIEW_MARGIN_WIDTH + ITEM_VIEW_PADDING + 3.0; +/// `[Hp]` How much of the highlight washes a hovered row that is not +/// selected. +pub const ROW_HOVER_ALPHA: f32 = 0.3; +/// `[Hp]` The alpha of a hovered row's outline: the fill colour, at 0.8, +/// where a selected row's is opaque. +pub const ROW_HOVER_OUTLINE_ALPHA: f32 = 0.8; +/// `[Hp]` How much a hovered selected row's highlight is lightened, in Qt's +/// percent (d.11 of the specification). +pub const ROW_SELECTED_HOVER_LIGHTER: i32 = 110; + +/// The dimensions of a list or tree row, `StandardListItem` and +/// `StandardTreeItem`. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeRowMetrics { + /// `[S]` A row of text: `H + 1 + 1 + 2 x 2`, the line box and the 1 px + /// item margin and 2 px item padding above and below, through the + /// density ladder. 24 at Compact for the Breeze typography. + pub height: f32, + /// `[measured-qt]` A row with an icon or a check box: 26 at Compact, Qt + /// adding 2 px for an item's icon and making room for the 20 px check + /// box, through the density ladder. + pub height_decorated: f32, + /// `[derived]` A row with a subtitle: two body line boxes and the same + /// margins and padding, `2H + 6`, through the density ladder. 42 at + /// Compact. Qt sizes an item to its text and has no two-line row of its + /// own. + pub height_two_line: f32, + /// `[measured-qt]` [`ROW_CONTENT_INSET`], scaled by the density's + /// spacing. + pub padding_horizontal: f32, + /// `[M]` The space above and below the content: the 1 px item margin. + /// It holds the selection's outline, so it does not scale; the height + /// floor rises with the density instead. + pub padding_vertical: f32, + /// `[M]` How far the selection lies inside the row's leading and + /// trailing edges: the 2 px item margin. Painted, so it does not scale. + pub selection_inset_horizontal: f32, + /// `[M]` The same above and below: the 1 px item margin. + pub selection_inset_vertical: f32, +} + +/// The row dimensions at the density of `tokens`, for `typography`. +pub fn breeze_row_metrics_for( + tokens: &InputTokens, + typography: &TypographyTokens, +) -> BreezeRowMetrics { + let g = geometry_of(typography); + let margins = 2.0 * (ITEM_VIEW_MARGIN_HEIGHT + ITEM_VIEW_PADDING); + BreezeRowMetrics { + height: dp(g.list_row_height, TargetRole::Target, tokens), + height_decorated: dp( + g.list_row_height_with_icon + .max(g.list_row_height_with_check), + TargetRole::Target, + tokens, + ), + height_two_line: dp(2.0 * g.line_height + margins, TargetRole::Target, tokens), + padding_horizontal: spacing(ROW_CONTENT_INSET, tokens), + padding_vertical: ITEM_VIEW_MARGIN_HEIGHT, + selection_inset_horizontal: ITEM_VIEW_MARGIN_WIDTH, + selection_inset_vertical: ITEM_VIEW_MARGIN_HEIGHT, + } +} + +/// [`breeze_row_metrics_for`] at the Compact density and the Breeze +/// typography. +pub fn breeze_row_metrics() -> BreezeRowMetrics { + breeze_row_metrics_for( + &InputTokens::default(), + &crate::typography::breeze_typography(), + ) +} + +/// The dimensions of a `TableView` or `TreeTableView`: its rows and its +/// column header. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeTableMetrics { + /// `[wcag]` D7: a body row. Qt lays a Breeze table row out at `H + 2 x + /// (1 + 1)` and adds its 1 px grid line, 23 at Plasma's default font, + /// under WCAG 2.2 SC 2.5.8's 24 px; it is raised to 24, then through the + /// density ladder. + pub row_height: f32, + /// `[S]` The column header: `max(H, 10) + 2 x 6`, room for the sort + /// arrow, through the density ladder. 30 at Compact for the Breeze + /// typography. + pub header_height: f32, + /// `[M]` The space between a header section's edges and its label: the + /// 6 px header margin, scaled by the density's spacing. + pub header_padding: f32, +} + +/// The table dimensions at the density of `tokens`, for `typography`. +pub fn breeze_table_metrics_for( + tokens: &InputTokens, + typography: &TypographyTokens, +) -> BreezeTableMetrics { + let g = geometry_of(typography); + BreezeTableMetrics { + row_height: dp( + g.table_row_height.max(tokens.min_target_conformance), + TargetRole::Target, + tokens, + ), + header_height: dp(g.header_height, TargetRole::Target, tokens), + header_padding: spacing(HEADER_MARGIN, tokens), + } +} + +/// [`breeze_table_metrics_for`] at the Compact density and the Breeze +/// typography. +pub fn breeze_table_metrics() -> BreezeTableMetrics { + breeze_table_metrics_for( + &InputTokens::default(), + &crate::typography::breeze_typography(), + ) +} + +/// `[Hp]` How far a hovered unselected tab's fill moves from the window +/// colour toward the hover colour. +pub const TAB_HOVER_MIX: f64 = 0.2; +/// `[Hp]` How much an unselected tab's window colour is darkened, in Qt's +/// percent. +pub const TAB_UNSELECTED_DARKER: i32 = 120; +/// `[Hp]` The radius of the active tab's highlight bar at its outer +/// corners: the frame radius. +pub const TAB_BAR_RADIUS: f32 = 5.0; +/// `[Hp]` The radius the selected tab's outline is stroked at, on the pen's +/// centre line: with a 1 px pen its outer edge turns at 5 px, the bar's +/// radius, and its inner edge at 4. +pub const TAB_OUTLINE_RADIUS: f32 = 4.5; + +/// The dimensions of a tab in a `TabBar` or `TabWidget`. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeTabMetrics { + /// `[S]` A tab's height: `max(H + 2 x 4, 30)`, through the density + /// ladder. 30 at Compact for the Breeze typography. + pub height: f32, + /// `[S]` A static tab bar's tab: `max(H + 2 x 4, 34)`, through the + /// density ladder. Recorded, not laid out: a `TabStyle` is not told + /// whether its bar is one (see the crate's known limitations). + pub static_height: f32, + /// `[M]` The space between a tab's edges and its title: the 8 px tab + /// margin, scaled by the density's spacing. + pub padding_horizontal: f32, + /// `[M]` A tab's minimum width with a title. Recorded, not laid out: the + /// bar applies its own minimum tab width (see the crate's known + /// limitations). + pub min_width: f32, + /// `[M]` The thickness of the active tab's highlight bar. Painted, so it + /// does not scale. + pub indicator: f32, +} + +/// The tab dimensions at the density of `tokens`, for `typography`. +pub fn breeze_tab_metrics_for( + tokens: &InputTokens, + typography: &TypographyTokens, +) -> BreezeTabMetrics { + let g = geometry_of(typography); + BreezeTabMetrics { + height: dp(g.tab_height, TargetRole::Target, tokens), + static_height: dp(g.static_tab_height, TargetRole::Target, tokens), + padding_horizontal: spacing(TAB_MARGIN_WIDTH, tokens), + min_width: crate::geometry::TAB_MIN_WIDTH, + indicator: crate::geometry::TAB_ACTIVE_INDICATOR, + } +} + +/// [`breeze_tab_metrics_for`] at the Compact density and the Breeze +/// typography. +pub fn breeze_tab_metrics() -> BreezeTabMetrics { + breeze_tab_metrics_for( + &InputTokens::default(), + &crate::typography::breeze_typography(), + ) +} + +/// `[Hp]` The width of the separator line on a scroll bar's leading edge. +pub const SCROLL_BAR_SEPARATOR: f32 = 1.0; + +/// The dimensions of a `ScrollBar`. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeScrollBarMetrics { + /// `[M]` Breeze's extent, its 1 px separator included. Recorded, not laid + /// out: the widgets choose a scroll bar's thickness themselves (see the + /// crate's known limitations). + pub extent: f32, + /// `[M]` The handle's width, centred across what the separator leaves. + /// Painted, so it does not scale. + pub handle_width: f32, + /// `[M]` The shortest the handle gets. The handle is a grab, which this + /// clears at every density, so it is Breeze's 20 at all three. + pub min_handle_length: f32, + /// `[Hp]` The separator line's width. + pub separator: f32, +} + +/// The scroll-bar dimensions at the density of `tokens`. +pub fn breeze_scroll_bar_metrics_for(tokens: &InputTokens) -> BreezeScrollBarMetrics { + BreezeScrollBarMetrics { + extent: SCROLL_BAR_EXTENT, + handle_width: SCROLL_BAR_HANDLE_WIDTH, + min_handle_length: dp(SCROLL_BAR_MIN_HANDLE_LENGTH, TargetRole::Grab, tokens), + separator: SCROLL_BAR_SEPARATOR, + } +} + +/// [`breeze_scroll_bar_metrics_for`] at the Compact density. +pub fn breeze_scroll_bar_metrics() -> BreezeScrollBarMetrics { + breeze_scroll_bar_metrics_for(&InputTokens::default()) +} + +/// `[Hp]` How much of the window text a progress bar's groove is filled with +/// over the window: 0.2 times 0.7, as a slider's. +pub const PROGRESS_GROOVE_ALPHA: f64 = 0.2 * 0.7; +/// `[Hp]` How much of the highlight fills a determinate bar's contents over +/// the window. +pub const PROGRESS_CONTENTS_ALPHA: f64 = 0.7; +/// `[Hp]` How far the busy bar's lighter stripes move from the highlight +/// toward the window. +pub const PROGRESS_BUSY_LIGHT_MIX: f64 = 0.7; + +/// The dimensions of a `ProgressBar`. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeProgressMetrics { + /// `[qt]` `[measured-qt]` The bar's thickness: Qt's size hint, `H + 8`, + /// 26 at Plasma's default font, the groove centred in it. A progress bar + /// is not a target, so it does not rise with the density. + pub thickness: f32, + /// `[M]` The groove's thickness. + pub groove: f32, + /// `[Hp]` The groove's radius, on the groove inset by half the pen. + pub radius: f32, + /// `[Hp]` The period of the busy bar's stripes: one highlight stripe and + /// one lighter stripe, each half of it. + pub busy_period: f32, +} + +/// The progress-bar dimensions for `typography`. None of them follows the +/// density. +pub fn breeze_progress_metrics_for(typography: &TypographyTokens) -> BreezeProgressMetrics { + let g = geometry_of(typography); + BreezeProgressMetrics { + thickness: g.progress_bar_height, + groove: PROGRESS_BAR_THICKNESS, + radius: crate::shape::BREEZE_GROOVE_RADIUS, + busy_period: crate::geometry::PROGRESS_BAR_BUSY_PERIOD, + } +} + +/// [`breeze_progress_metrics_for`] the Breeze typography. +pub fn breeze_progress_metrics() -> BreezeProgressMetrics { + breeze_progress_metrics_for(&crate::typography::breeze_typography()) +} + #[cfg(test)] mod tests { use super::*; @@ -662,6 +925,124 @@ mod tests { assert_eq!(m.separator_height, 5.0, "a separator has no text"); } + #[test] + fn the_rows_are_breezes_and_grow_with_the_density() { + let m = breeze_row_metrics(); + assert_eq!(m.height, 24.0); + assert_eq!(m.height_decorated, 26.0); + assert_eq!(m.height_two_line, 42.0); + assert_eq!(m.padding_horizontal, 7.0); + assert_eq!(m.padding_vertical, 1.0); + assert_eq!( + (m.selection_inset_horizontal, m.selection_inset_vertical), + (2.0, 1.0) + ); + let t = crate::typography::breeze_typography(); + let comfortable = breeze_row_metrics_for(&at(TargetDensity::Comfortable), &t); + let touch = breeze_row_metrics_for(&at(TargetDensity::Touch), &t); + assert_eq!( + ( + comfortable.height, + comfortable.height_decorated, + comfortable.height_two_line + ), + (32.0, 32.0, 42.0) + ); + assert_eq!( + (touch.height, touch.height_decorated, touch.height_two_line), + (44.0, 44.0, 44.0) + ); + for m in [comfortable, touch] { + assert_eq!(m.padding_vertical, 1.0, "holds the outline"); + assert_eq!(m.selection_inset_horizontal, 2.0, "painted"); + assert!(m.padding_horizontal > 7.0); + } + } + + #[test] + fn a_larger_body_font_makes_taller_rows() { + let mut t = crate::typography::breeze_typography(); + // Plasma's 12 pt: a 22 px line, a 28 px row and a 30 px row with an + // icon, as Qt measures them. + t.body.size = 16.0; + t.body.line_height = 22.0 / 16.0; + let m = breeze_row_metrics_for(&InputTokens::default(), &t); + assert_eq!((m.height, m.height_decorated), (28.0, 30.0)); + assert_eq!(m.height_two_line, 50.0); + } + + /// D7: Qt's table row is 23 px with its grid line; Teksilo's is 24. + #[test] + fn d7_the_table_row_is_raised_to_the_target_size() { + let g = BreezeGeometry::breeze_default(); + assert_eq!(g.table_row_height, 23.0, "Qt's row, below the floor"); + let m = breeze_table_metrics(); + assert_eq!(m.row_height, 24.0); + assert_eq!(m.header_height, 30.0); + assert_eq!(m.header_padding, 6.0); + // The label's line box and the margin above and below fill the + // header exactly. + assert_eq!(g.line_height + 2.0 * m.header_padding, m.header_height); + let t = crate::typography::breeze_typography(); + let touch = breeze_table_metrics_for(&at(TargetDensity::Touch), &t); + assert_eq!((touch.row_height, touch.header_height), (44.0, 44.0)); + // A larger font's row is Qt's own once it clears the floor. + let mut big = t; + big.body.size = 16.0; + big.body.line_height = 22.0 / 16.0; + assert_eq!( + breeze_table_metrics_for(&InputTokens::default(), &big).row_height, + 27.0 + ); + } + + #[test] + fn the_tab_is_breezes_and_grows_with_the_density() { + let m = breeze_tab_metrics(); + assert_eq!(m.height, 30.0); + assert_eq!(m.static_height, 34.0); + assert_eq!(m.padding_horizontal, 8.0); + assert_eq!(m.min_width, 80.0); + assert_eq!(m.indicator, 3.0); + let t = crate::typography::breeze_typography(); + let comfortable = breeze_tab_metrics_for(&at(TargetDensity::Comfortable), &t); + let touch = breeze_tab_metrics_for(&at(TargetDensity::Touch), &t); + assert_eq!(comfortable.height, 32.0); + assert_eq!(touch.height, 44.0); + assert!((touch.padding_horizontal - 10.4).abs() < 1e-4); + assert_eq!(touch.indicator, 3.0, "the painted bar does not scale"); + } + + #[test] + fn the_scroll_bar_handle_is_breezes_at_every_density() { + for density in [ + TargetDensity::Compact, + TargetDensity::Comfortable, + TargetDensity::Touch, + ] { + let tokens = at(density); + let m = breeze_scroll_bar_metrics_for(&tokens); + assert_eq!(m.extent, 21.0); + assert_eq!(m.handle_width, 8.0); + assert_eq!(m.min_handle_length, 20.0, "{density:?}"); + assert!(m.min_handle_length >= tokens.grab_size); + assert_eq!(m.separator, 1.0); + // The handle centred in what the separator leaves is 6 px clear + // of it on either side. + assert_eq!((m.extent - m.separator - m.handle_width) / 2.0, 6.0); + } + } + + #[test] + fn the_progress_bar_is_qts_hint_around_breezes_groove() { + let m = breeze_progress_metrics(); + assert_eq!(m.thickness, 26.0); + assert_eq!(m.groove, 6.0); + assert_eq!(m.radius, 3.0); + assert_eq!(m.busy_period, 28.0); + assert!((PROGRESS_GROOVE_ALPHA - 0.14).abs() < 1e-12); + } + #[test] fn every_tool_button_clears_the_conformance_floor_without_a_box() { for density in [ diff --git a/crates/teksilo-theme-kde/src/styles/progress_bar.rs b/crates/teksilo-theme-kde/src/styles/progress_bar.rs new file mode 100644 index 000000000..66354deaa --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/progress_bar.rs @@ -0,0 +1,512 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze progress bar. +//! +//! A 6 px groove centred across the bar, filled and stroked with a 1 px pen +//! on itself inset by half the pen at radius 3: the window text at 14 % over +//! the window, outlined in the window text at the frame contrast. A +//! determinate bar's contents run from the start of the groove, `floor(value +//! x length)` long, in the highlight at 70 % over the window, outlined in the +//! highlight at the frame contrast; they start at the right-hand end in a +//! right-to-left window, and at the bottom of a vertical bar. A disabled bar +//! paints the disabled colours. +//! +//! A busy (indeterminate) bar fills its groove with stripes 28 px apart, a +//! 14 px stripe of the highlight and a 14 px stripe of the highlight moved +//! 70 % toward the window, which move one period along the groove every +//! 800 ms, linearly and looping. The style paints this itself +//! ([`ProgressBarStyle::paints_busy_indicator`]), so the bar draws no sweep +//! of its own; under the reduced-motion preference the stripes stand still. +//! The desktop's animation speed does not change the period, as in Breeze. +//! +//! The bar is 26 px thick at Plasma's default font, Qt's size hint, the +//! groove centred in it ([`BreezeProgressMetrics`]); a thickness the app +//! sets wins. A track or fill colour the app sets takes the place of the +//! groove's or the highlight's. +//! +//! ## Where this departs from Breeze +//! +//! - **A short contents keeps its length.** Breeze draws contents shorter +//! than the groove's thickness 6 px long and clips them; here they are +//! drawn at their length, the radius shrinking to half of it. + +use std::time::Duration; + +use teksilo_canvas::{Canvas, Rect, SizeProposal}; +use teksilo_core::accessibility::AccessNodeBuilder; +use teksilo_core::binding::BindingLevel; +use teksilo_core::build_context::BuildContext; +use teksilo_core::color_prop::ColorProp; +use teksilo_core::environment::LayoutDirection; +use teksilo_core::signal::{Prop, Signal}; +use teksilo_core::styles::{ProgressBarStyle, ProgressBarStyleConfig, ProgressKind, Theme}; +use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget}; +use teksilo_core::widget_id::WidgetId; +use teksilo_kde_scheme::{ColorState, PaletteRole}; +use teksilo_tokens::{Color, CornerRadius, InputTokens, Orientation, TypographyTokens}; + +use crate::motion::BREEZE_BUSY_STEP_MS; +use crate::palette::KdePalette; +use crate::styles::chrome::kde_mix; +use crate::styles::metrics::{ + BreezeProgressMetrics, PROGRESS_BUSY_LIGHT_MIX, PROGRESS_CONTENTS_ALPHA, PROGRESS_GROOVE_ALPHA, + breeze_progress_metrics_for, +}; + +/// Breeze `ProgressBarStyle`. +/// +/// [`Default`] is the Breeze typography; the preset installs +/// [`BreezeProgressBarStyle::for_theme`] of the theme it builds. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeProgressBarStyle { + /// The progress-bar dimensions this style paints and reports. + pub metrics: BreezeProgressMetrics, +} + +impl BreezeProgressBarStyle { + /// The style for `typography`. + pub fn for_typography(typography: &TypographyTokens) -> Self { + Self { + metrics: breeze_progress_metrics_for(typography), + } + } + + /// The style for the typography of `theme`. + pub fn for_theme(theme: &Theme) -> Self { + Self::for_typography(&theme.typography) + } +} + +impl Default for BreezeProgressBarStyle { + fn default() -> Self { + Self::for_typography(&crate::typography::breeze_typography()) + } +} + +impl ProgressBarStyle for BreezeProgressBarStyle { + fn make_body(&self, cfg: &ProgressBarStyleConfig, ctx: &mut BuildContext) -> WidgetId { + let (value, phase) = match &cfg.progress { + ProgressKind::Determinate(p) => (Some(p.clone()), None), + ProgressKind::Indeterminate => { + let phase = ctx.animated_signal(0.0); + let spec = ctx + .animate() + .duration(Duration::from_millis(BREEZE_BUSY_STEP_MS)) + .linear() + .looping(); + if !spec.reduced_motion() { + spec.to(&phase, 1.0); + } + (None, Some(phase)) + } + }; + ctx.add(BreezeProgressBody { + orientation: cfg.orientation, + value, + phase, + track: cfg.track_color_override.clone(), + fill: cfg.fill_color_override.clone(), + metrics: self.metrics, + }) + } + + /// [`BreezeProgressMetrics::thickness`], 26 at Plasma's default font. + fn thickness(&self, _tokens: &InputTokens) -> Option { + Some(self.metrics.thickness) + } + + /// The busy stripes are this style's. + fn paints_busy_indicator(&self) -> bool { + true + } +} + +/// The colours a Breeze progress bar is painted in, in one paint state. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeProgressColors { + /// `[Hp]` The groove: the window text at 14 % over the window. + pub groove: Color, + /// `[Hp]` Its outline: the window text at the frame contrast. + pub groove_outline: Color, + /// `[Hp]` The contents: the highlight at 70 % over the window. + pub contents: Color, + /// `[Hp]` Their outline: the highlight at the frame contrast. + pub contents_outline: Color, + /// `[Hp]` A busy bar's highlight stripe. + pub busy: Color, + /// `[Hp]` A busy bar's other stripe: the highlight moved 70 % toward the + /// window. + pub busy_light: Color, +} + +impl BreezeProgressColors { + /// The colours of `theme` as it paints with or without the high-contrast + /// preference, for an enabled or a disabled bar, with the track and fill + /// colours an app set, if any. + /// + /// The window, its text and the highlight are the theme's projected + /// tokens (the disabled palette's window and window text for a disabled + /// bar); the frame contrast comes from [`KdePalette`], Breeze's 0.2 + /// without it. + pub fn resolve( + theme: &Theme, + high_contrast: bool, + disabled: bool, + track: Option, + fill: Option, + ) -> BreezeProgressColors { + let c = &theme.colors; + let palette = theme.extension::(); + let (window, window_text) = match (disabled, palette) { + (true, Some(p)) => ( + p.role(ColorState::Disabled, PaletteRole::Window), + p.role(ColorState::Disabled, PaletteRole::WindowText), + ), + (true, None) => (c.surface_main, c.text_disabled), + (false, _) => (c.surface_main, c.text_primary), + }; + let highlight = fill.unwrap_or(if disabled { + c.accent_disabled + } else { + c.accent + }); + // `[derived]` The frame contrast: 1 in the high-contrast scheme the + // palette builds, as `KdePalette::breeze_colors` computes it. + let fc = match palette { + Some(_) if high_contrast => 1.0, + Some(p) => p.frame_contrast(), + None => teksilo_kde_scheme::scheme::DEFAULT_FRAME_CONTRAST, + } as f32; + BreezeProgressColors { + groove: track.unwrap_or_else(|| kde_mix(window, window_text, PROGRESS_GROOVE_ALPHA)), + groove_outline: window_text.with_alpha(fc), + contents: kde_mix(window, highlight, PROGRESS_CONTENTS_ALPHA), + contents_outline: highlight.with_alpha(fc), + busy: highlight, + busy_light: kde_mix(highlight, window, PROGRESS_BUSY_LIGHT_MIX), + } + } +} + +/// `[Hp]` The groove in a bar's `bounds`: `thickness` across, centred and +/// rounded down to a whole pixel, the bar's full length along it. +pub fn groove_rect(bounds: Rect, orientation: Orientation, thickness: f32) -> Rect { + match orientation { + Orientation::Horizontal => { + let t = thickness.min(bounds.height); + let y = bounds.y + ((bounds.height - t) * 0.5).floor(); + Rect::new(bounds.x, y, bounds.width, t) + } + Orientation::Vertical => { + let t = thickness.min(bounds.width); + let x = bounds.x + ((bounds.width - t) * 0.5).floor(); + Rect::new(x, bounds.y, t, bounds.height) + } + } +} + +/// `[Hp]` A determinate bar's contents in `groove`: `floor(value x length)` +/// long from the start, the right-hand end in a right-to-left window and +/// the bottom of a vertical bar. +pub fn contents_rect( + groove: Rect, + orientation: Orientation, + direction: LayoutDirection, + value: f32, +) -> Rect { + let value = value.clamp(0.0, 1.0); + match orientation { + Orientation::Horizontal => { + let len = (value * groove.width).floor(); + let x = if direction == LayoutDirection::RightToLeft { + groove.x + groove.width - len + } else { + groove.x + }; + Rect::new(x, groove.y, len, groove.height) + } + Orientation::Vertical => { + let len = (value * groove.height).floor(); + Rect::new(groove.x, groove.y + groove.height - len, groove.width, len) + } + } +} + +/// `[Hp]` The highlight stripes of a busy bar's `groove`, moved `phase` of a +/// period along it: each `(start, end)` along the groove, clipped to it. +pub fn busy_stripes(length: f32, period: f32, phase: f32) -> Vec<(f32, f32)> { + if length <= 0.0 || period <= 0.0 { + return Vec::new(); + } + let half = period * 0.5; + let shift = phase.rem_euclid(1.0) * period; + let mut stripes = Vec::new(); + let mut start = shift - period; + while start < length { + let a = start.max(0.0); + let b = (start + half).min(length); + if b > a { + stripes.push((a, b)); + } + start += period; + } + stripes +} + +/// The `(along, length)` part of `groove` as a rectangle. +fn along(groove: Rect, orientation: Orientation, from: f32, to: f32) -> Rect { + match orientation { + Orientation::Horizontal => Rect::new(groove.x + from, groove.y, to - from, groove.height), + Orientation::Vertical => Rect::new(groove.x, groove.y + from, groove.width, to - from), + } +} + +/// Paints a Breeze progress bar: its groove and contents, or its stripes. +struct BreezeProgressBody { + orientation: Orientation, + value: Option>, + /// The busy stripes' position in their period, for an indeterminate + /// bar. + phase: Option>, + track: Option, + fill: Option, + metrics: BreezeProgressMetrics, +} + +impl std::fmt::Debug for BreezeProgressBody { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeProgressBody") + .field("orientation", &self.orientation) + .finish() + } +} + +impl Widget for BreezeProgressBody { + fn build(&mut self, ctx: &mut BuildContext) -> Vec { + let id = ctx.self_id(); + let registry = ctx.binding_registry(); + if let Some(v) = &self.value { + v.register_if_bound(id, registry, BindingLevel::RepaintOnly); + } + if let Some(p) = &self.phase { + p.bind_to(id, registry, BindingLevel::RepaintOnly); + } + vec![] + } + + fn layout_response(&self, proposal: SizeProposal, _ctx: &LayoutContext) -> LayoutResponse { + // The bar owns its size; this fills what it is given. + proposal.resolve(0.0, 0.0).into() + } + + fn paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext) { + let theme = ctx.theme; + let enabled = ctx.effective_enabled; + let colors = BreezeProgressColors::resolve( + theme, + ctx.prefers_high_contrast, + !enabled, + self.track.as_ref().map(|p| p.resolve(theme, enabled)), + self.fill.as_ref().map(|p| p.resolve(theme, enabled)), + ); + let groove = groove_rect(bounds, self.orientation, self.metrics.groove); + let pen = theme.shape.border_width; + let radius = CornerRadius::uniform(self.metrics.radius); + let inset = |r: Rect| { + Rect::new( + r.x + pen * 0.5, + r.y + pen * 0.5, + (r.width - pen).max(0.0), + (r.height - pen).max(0.0), + ) + }; + + if let Some(phase) = &self.phase { + // Busy: the lighter stripes fill the groove and the highlight + // stripes are laid over them. + let length = match self.orientation { + Orientation::Horizontal => groove.width, + Orientation::Vertical => groove.height, + }; + canvas.fill_rounded_rect(groove, radius, colors.busy_light); + for (a, b) in busy_stripes(length, self.metrics.busy_period, phase.get()) { + let stripe = along(groove, self.orientation, a, b); + // A stripe at an end of the groove keeps the groove's + // rounded corners there. + let mut corners = CornerRadius::ZERO; + let r = self.metrics.radius; + let (at_start, at_end) = (a <= 0.0, b >= length); + match self.orientation { + Orientation::Horizontal => { + if at_start { + corners.top_left = r; + corners.bottom_left = r; + } + if at_end { + corners.top_right = r; + corners.bottom_right = r; + } + } + Orientation::Vertical => { + if at_start { + corners.top_left = r; + corners.top_right = r; + } + if at_end { + corners.bottom_left = r; + corners.bottom_right = r; + } + } + } + canvas.fill_rounded_rect(stripe, corners, colors.busy); + } + return; + } + + let stroked = inset(groove); + canvas.fill_rounded_rect(stroked, radius, colors.groove); + if pen > 0.0 { + canvas.stroke_rounded_rect(stroked, radius, colors.groove_outline, pen); + } + let value = self.value.as_ref().map_or(0.0, Prop::get); + let contents = contents_rect(groove, self.orientation, ctx.layout_direction, value); + if contents.width > 0.0 && contents.height > 0.0 { + let stroked = inset(contents); + canvas.fill_rounded_rect(stroked, radius, colors.contents); + if pen > 0.0 { + canvas.stroke_rounded_rect(stroked, radius, colors.contents_outline, pen); + } + } + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + // Presentational: the `ProgressBar` announces its value. + builder.set_hidden(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_kde_scheme::KdeColor; + + fn rgba8(c: Color) -> [u8; 4] { + KdeColor::from_color(c).to_rgba8() + } + + /// Whether two colours are within one step a channel: Qt's raster + /// painter rounds an 8-bit blend its own way. + fn near(a: [u8; 4], b: [u8; 4]) -> bool { + a.iter().zip(b).all(|(x, y)| x.abs_diff(y) <= 1) + } + + #[test] + fn the_style_sizes_the_bar_and_paints_its_busy_indicator() { + let s = BreezeProgressBarStyle::default(); + assert_eq!(s.thickness(&InputTokens::default()), Some(26.0)); + assert!(s.paints_busy_indicator()); + assert_eq!(BreezeProgressBarStyle::for_theme(&crate::light()), s); + } + + /// The groove Qt laid out in a 26 px bar, 10 px down, and the one + /// Plasma painted in an 18 px sample, 6 px down. + #[test] + fn the_groove_is_centred_across_the_bar() { + let g = groove_rect( + Rect::new(0.0, 0.0, 160.0, 26.0), + Orientation::Horizontal, + 6.0, + ); + assert_eq!((g.x, g.y, g.width, g.height), (0.0, 10.0, 160.0, 6.0)); + let g = groove_rect( + Rect::new(0.0, 0.0, 200.0, 18.0), + Orientation::Horizontal, + 6.0, + ); + assert_eq!(g.y, 6.0); + let g = groove_rect(Rect::new(0.0, 0.0, 26.0, 91.0), Orientation::Vertical, 6.0); + assert_eq!((g.x, g.width, g.height), (10.0, 6.0, 91.0)); + } + + #[test] + fn the_contents_run_from_the_start_and_mirror() { + let g = Rect::new(0.0, 6.0, 200.0, 6.0); + let c = contents_rect( + g, + Orientation::Horizontal, + LayoutDirection::LeftToRight, + 0.5, + ); + assert_eq!((c.x, c.width), (0.0, 100.0)); + let c = contents_rect( + g, + Orientation::Horizontal, + LayoutDirection::RightToLeft, + 0.5, + ); + assert_eq!((c.x, c.width), (100.0, 100.0)); + let c = contents_rect( + g, + Orientation::Horizontal, + LayoutDirection::LeftToRight, + 0.333, + ); + assert_eq!(c.width, 66.0, "rounded down"); + let v = Rect::new(0.0, 0.0, 6.0, 100.0); + let c = contents_rect(v, Orientation::Vertical, LayoutDirection::LeftToRight, 0.25); + assert_eq!((c.y, c.height), (75.0, 25.0)); + } + + #[test] + fn the_stripes_are_fourteen_of_twenty_eight_and_move_with_the_phase() { + assert_eq!( + busy_stripes(60.0, 28.0, 0.0), + vec![(0.0, 14.0), (28.0, 42.0), (56.0, 60.0)] + ); + assert_eq!( + busy_stripes(60.0, 28.0, 0.5), + vec![(14.0, 28.0), (42.0, 56.0)] + ); + let shifted = busy_stripes(60.0, 28.0, 0.25); + assert_eq!(shifted[0], (7.0, 21.0)); + assert_eq!(shifted[1], (35.0, 49.0)); + // A whole period is the same picture. + assert_eq!(busy_stripes(60.0, 28.0, 1.0), busy_stripes(60.0, 28.0, 0.0)); + assert!(busy_stripes(0.0, 28.0, 0.3).is_empty()); + } + + /// The groove and contents Plasma painted in Breeze Light. + #[test] + fn breeze_lights_progress_colours_are_plasmas() { + let c = BreezeProgressColors::resolve(&crate::light(), false, false, None, None); + assert!(near(rgba8(c.groove), [210, 211, 213, 255]), "#d2d3d5"); + assert!(near(rgba8(c.contents), [114, 194, 235, 255]), "#72c2eb"); + assert_eq!(rgba8(c.busy), [61, 174, 233, 255]); + assert!((c.groove_outline.a() - 0.2).abs() < 1e-6); + assert!((c.contents_outline.a() - 0.2).abs() < 1e-6); + let light = rgba8(c.busy_light); + // 70 % of the way from the highlight to the window. + assert_eq!(light, [186, 220, 239, 255]); + } + + #[test] + fn overrides_and_the_disabled_state_change_the_colours() { + let theme = crate::light(); + let c = BreezeProgressColors::resolve( + &theme, + false, + false, + Some(Color::RED), + Some(Color::BLUE), + ); + assert_eq!(c.groove, Color::RED); + assert_eq!(c.busy, Color::BLUE); + let d = BreezeProgressColors::resolve(&theme, false, true, None, None); + assert_eq!(d.busy, theme.colors.accent_disabled); + let mut bare = theme.clone(); + bare.extensions.remove::(); + let b = BreezeProgressColors::resolve(&bare, false, false, None, None); + assert_eq!(b.busy, bare.colors.accent); + } +} diff --git a/crates/teksilo-theme-kde/src/styles/scroll_bar.rs b/crates/teksilo-theme-kde/src/styles/scroll_bar.rs new file mode 100644 index 000000000..ac0fb0c24 --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/scroll_bar.rs @@ -0,0 +1,506 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze scroll bar. +//! +//! Breeze paints no track. A permanent bar has a 1 px separator line on its +//! leading edge, the edge toward the content (the top of a horizontal bar, +//! the left of a vertical one, the right of a vertical one in a +//! right-to-left window), in the view's text at the frame contrast. The +//! handle is 8 px wide, centred across what the separator leaves, and +//! stroked with a 1 px pen on itself inset by half the pen, so it is painted +//! 7 px wide, at a radius of half its width, 4. Along the bar it is the +//! widget's own thumb, at least 20 px long, so the handle painted is the +//! one a press and a drag find. +//! +//! The handle is filled with the `scrollbar_thumb` token at rest and +//! `scrollbar_thumb_hover` while the pointer is over the bar or the handle +//! is dragged, and outlined in the window text at rest and the hover colour +//! otherwise, each at the frame contrast. An overlay or thin bar, which +//! lies over the content, has no separator. A bar with nothing to scroll +//! paints nothing. A thumb colour the app sets +//! (`ScrollBar::thumb_color`) takes the place of the window text and the +//! hover colour. +//! +//! ## Where this departs from Breeze +//! +//! - **D9, the handle's fill.** Breeze fills the idle handle with the window +//! text at an effective 17.5 % over the window (25 % while the pointer is +//! over the bar), 1.4:1, and a hovered one with the hover colour at 50 %; +//! the tokens lift both to 3:1, keeping their hue (D9 of the colour +//! mapping), and the handle is painted in them. Lifted, the idle and the +//! pointer-over-the-bar handles are one colour. +//! - **The hover colour follows the bar, not the handle.** Breeze turns the +//! handle to the hover colour when the pointer is over the handle itself; +//! the style is told only that the pointer is over the bar. +//! - **The bar is as thick as the widget lays it out**, not Breeze's 21 px: +//! the handle keeps its 8 px width and the separator its 1 px in whatever +//! thickness the bar is given (see the crate's known limitations). + +use teksilo_canvas::{Canvas, Rect, SizeProposal}; +use teksilo_core::accessibility::AccessNodeBuilder; +use teksilo_core::binding::BindingLevel; +use teksilo_core::build_context::BuildContext; +use teksilo_core::color_prop::ColorProp; +use teksilo_core::environment::LayoutDirection; +use teksilo_core::signal::Signal; +use teksilo_core::styles::{ + ScrollBarOrientation, ScrollBarStyle, ScrollBarStyleConfig, ScrollBarVariant, Theme, +}; +use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget}; +use teksilo_core::widget_id::WidgetId; +use teksilo_kde_scheme::{ColorState, PaletteRole}; +use teksilo_tokens::{Color, CornerRadius, InputTokens}; + +use crate::palette::KdePalette; +use crate::shape::BREEZE_SCROLL_HANDLE_RADIUS; +use crate::styles::metrics::{BreezeScrollBarMetrics, breeze_scroll_bar_metrics_for}; + +/// `[Hp]` The alpha a handle colour the app sets is painted at, at rest and +/// while the pointer is over the bar: Breeze's 0.5 x 0.7 x 0.5 and 0.5, the +/// effective alphas of its own handle. +pub const OVERRIDE_THUMB_ALPHA: [f32; 2] = [0.175, 0.5]; + +/// Breeze `ScrollBarStyle`. +/// +/// [`Default`] is the Compact density; the preset installs +/// [`BreezeScrollBarStyle::for_tokens`] of the theme it builds. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeScrollBarStyle { + /// The scroll-bar dimensions this style paints and reports. + pub metrics: BreezeScrollBarMetrics, +} + +impl BreezeScrollBarStyle { + /// The style at the density of `tokens`. + pub fn for_tokens(tokens: &InputTokens) -> Self { + Self { + metrics: breeze_scroll_bar_metrics_for(tokens), + } + } +} + +impl Default for BreezeScrollBarStyle { + fn default() -> Self { + Self::for_tokens(&InputTokens::default()) + } +} + +impl ScrollBarStyle for BreezeScrollBarStyle { + fn make_body(&self, cfg: &ScrollBarStyleConfig, ctx: &mut BuildContext) -> WidgetId { + ctx.add(BreezeScrollBarBody { + orientation: cfg.orientation, + separator: matches!(cfg.variant, ScrollBarVariant::Permanent), + min_thumb_length: cfg.min_thumb_length, + scroll_ratio: cfg.scroll_ratio.clone(), + viewport_ratio: cfg.viewport_ratio.clone(), + is_hovered: cfg.is_hovered.clone(), + is_dragging: cfg.is_dragging.clone(), + is_idle: cfg.is_idle.clone(), + thumb_color: cfg.thumb_color.clone(), + metrics: self.metrics, + }) + } + + /// [`BreezeScrollBarMetrics::min_handle_length`], 20 at every density. + fn min_thumb_length(&self, _tokens: &InputTokens) -> f32 { + self.metrics.min_handle_length + } +} + +/// The colours a Breeze scroll bar is painted in, in one paint state. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeScrollBarColors { + /// `[wcag]` D9: the handle at rest, `scrollbar_thumb`. + pub thumb: Color, + /// `[wcag]` D9: the handle with the pointer over the bar or while it is + /// dragged, `scrollbar_thumb_hover`. + pub thumb_hover: Color, + /// `[Hp]` The handle's outline at rest: the window text at the frame + /// contrast. + pub outline: Color, + /// `[Hp]` Its outline otherwise: the hover colour at the frame contrast. + pub outline_hover: Color, + /// `[Hp]` The separator: the view's text at the frame contrast. + pub separator: Color, +} + +impl BreezeScrollBarColors { + /// The colours of `theme` as it paints in a window that is or is not + /// active, with or without the high-contrast preference. + /// + /// The thumbs are the theme's projected tokens; the outlines and the + /// separator come from [`KdePalette`]. Without it the outlines are the + /// border and `border_focused`, and the separator the divider. + pub fn resolve( + theme: &Theme, + window_active: bool, + high_contrast: bool, + ) -> BreezeScrollBarColors { + let c = &theme.colors; + let Some(palette) = theme.extension::() else { + return BreezeScrollBarColors { + thumb: c.scrollbar_thumb, + thumb_hover: c.scrollbar_thumb_hover, + outline: c.border, + outline_hover: c.border_focused, + separator: c.divider, + }; + }; + let state = if window_active { + ColorState::Active + } else { + ColorState::Inactive + }; + let fc = frame_contrast(palette, high_contrast); + BreezeScrollBarColors { + thumb: c.scrollbar_thumb, + thumb_hover: c.scrollbar_thumb_hover, + outline: palette.role(state, PaletteRole::WindowText).with_alpha(fc), + outline_hover: palette + .breeze_colors(state, high_contrast) + .hover + .with_alpha(fc), + separator: palette.role(state, PaletteRole::Text).with_alpha(fc), + } + } + + /// The handle's fill and outline: hovered or dragged, or at rest. + pub fn handle(&self, active: bool) -> (Color, Color) { + if active { + (self.thumb_hover, self.outline_hover) + } else { + (self.thumb, self.outline) + } + } +} + +/// `[derived]` The frame contrast: 1 in the high-contrast scheme the palette +/// builds, as `KdePalette::breeze_colors` computes it. +fn frame_contrast(palette: &KdePalette, high_contrast: bool) -> f32 { + if high_contrast { + 1.0 + } else { + palette.frame_contrast() as f32 + } +} + +/// The parts of a Breeze scroll bar across its thickness, in a bar whose +/// bounds are `bounds`. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct ScrollBarParts { + /// The separator line, when the bar has one. + pub separator: Option, + /// The band the handle runs in: its offset across the bar and its width. + pub handle_across: (f32, f32), +} + +/// `[Hp]` Where the separator and the handle lie across a bar: the separator +/// on the leading edge, the handle centred in what it leaves, at most the +/// handle width wide. +pub fn scroll_bar_parts( + bounds: Rect, + orientation: ScrollBarOrientation, + direction: LayoutDirection, + separator: bool, + m: &BreezeScrollBarMetrics, +) -> ScrollBarParts { + let sep = if separator { m.separator } else { 0.0 }; + let (start, thickness) = match orientation { + ScrollBarOrientation::Vertical => (bounds.x, bounds.width), + ScrollBarOrientation::Horizontal => (bounds.y, bounds.height), + }; + // The separator is on the edge toward the content: the top of a + // horizontal bar, the left of a vertical one, its right in a + // right-to-left window, where the bar sits left of the content. + let separator_first = !(orientation == ScrollBarOrientation::Vertical + && direction == LayoutDirection::RightToLeft); + let (sep_at, region_start) = if separator_first { + (start, start + sep) + } else { + (start + thickness - sep, start) + }; + let region = (thickness - sep).max(0.0); + let width = m.handle_width.min(region); + let offset = ((region - width) * 0.5).floor(); + let separator = separator.then(|| match orientation { + ScrollBarOrientation::Vertical => Rect::new(sep_at, bounds.y, sep, bounds.height), + ScrollBarOrientation::Horizontal => Rect::new(bounds.x, sep_at, bounds.width, sep), + }); + ScrollBarParts { + separator, + handle_across: (region_start + offset, width), + } +} + +/// The along-the-bar extent of the thumb in a track `track` long: its offset +/// and its length, the widget's own arithmetic, so the handle painted is the +/// one the bar hit-tests. +pub fn thumb_along(track: f32, viewport_ratio: f32, scroll_ratio: f32, min: f32) -> (f32, f32) { + let len = (track * viewport_ratio.clamp(0.0, 1.0)).max(min).min(track); + let offset = scroll_ratio.clamp(0.0, 1.0) * (track - len); + (offset, len) +} + +/// Paints a Breeze scroll bar: its separator and its handle. +struct BreezeScrollBarBody { + orientation: ScrollBarOrientation, + separator: bool, + min_thumb_length: f32, + scroll_ratio: Signal, + viewport_ratio: Signal, + is_hovered: Signal, + is_dragging: Signal, + is_idle: Signal, + thumb_color: Option, + metrics: BreezeScrollBarMetrics, +} + +impl std::fmt::Debug for BreezeScrollBarBody { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeScrollBarBody") + .field("orientation", &self.orientation) + .finish() + } +} + +impl Widget for BreezeScrollBarBody { + fn build(&mut self, ctx: &mut BuildContext) -> Vec { + let id = ctx.self_id(); + let registry = ctx.binding_registry(); + for s in [&self.scroll_ratio, &self.viewport_ratio] { + s.bind_to(id, registry, BindingLevel::RepaintOnly); + } + for s in [&self.is_hovered, &self.is_dragging, &self.is_idle] { + s.bind_to(id, registry, BindingLevel::RepaintOnly); + } + Vec::new() + } + + fn layout_response(&self, proposal: SizeProposal, _ctx: &LayoutContext) -> LayoutResponse { + // The bar owns its thickness; this fills what it is given. + proposal.resolve(0.0, 0.0).into() + } + + fn paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext) { + if self.is_idle.get() { + return; + } + let theme = ctx.theme; + let mut colors = + BreezeScrollBarColors::resolve(theme, ctx.window_active, ctx.prefers_high_contrast); + if let Some(prop) = &self.thumb_color { + let tint = prop.resolve(theme, true); + let fc = theme.extension::().map_or( + teksilo_kde_scheme::scheme::DEFAULT_FRAME_CONTRAST as f32, + |p| frame_contrast(p, ctx.prefers_high_contrast), + ); + colors.thumb = tint.with_alpha(OVERRIDE_THUMB_ALPHA[0]); + colors.thumb_hover = tint.with_alpha(OVERRIDE_THUMB_ALPHA[1]); + colors.outline = tint.with_alpha(fc); + colors.outline_hover = colors.outline; + } + let parts = scroll_bar_parts( + bounds, + self.orientation, + ctx.layout_direction, + self.separator, + &self.metrics, + ); + if let Some(line) = parts.separator { + canvas.fill_rect(line, colors.separator); + } + let (across, width) = parts.handle_across; + if width <= 0.0 { + return; + } + let track = match self.orientation { + ScrollBarOrientation::Vertical => bounds.height, + ScrollBarOrientation::Horizontal => bounds.width, + }; + let (offset, len) = thumb_along( + track, + self.viewport_ratio.get(), + self.scroll_ratio.get(), + self.min_thumb_length, + ); + let handle = match self.orientation { + ScrollBarOrientation::Vertical => Rect::new(across, bounds.y + offset, width, len), + ScrollBarOrientation::Horizontal => { + // The start of the content is the right-hand end of the + // track in a right-to-left window, where the bar's own hit + // test puts the thumb. + let x = if ctx.layout_direction == LayoutDirection::RightToLeft { + bounds.x + bounds.width - offset - len + } else { + bounds.x + offset + }; + Rect::new(x, across, len, width) + } + }; + let (fill, outline) = colors.handle(self.is_hovered.get() || self.is_dragging.get()); + let pen = theme.shape.border_width; + let half = pen * 0.5; + let stroked = Rect::new( + handle.x + half, + handle.y + half, + (handle.width - pen).max(0.0), + (handle.height - pen).max(0.0), + ); + // `[Hp]` Half the handle's narrower side, at most 4. + let radius = (0.5 * handle.width.min(handle.height)).min(BREEZE_SCROLL_HANDLE_RADIUS); + let corner = CornerRadius::uniform(radius); + canvas.fill_rounded_rect(stroked, corner, fill); + if pen > 0.0 && outline.a() > 0.0 { + canvas.stroke_rounded_rect(stroked, corner, outline, pen); + } + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + // Presentational: the bar announces itself. + builder.set_hidden(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_kde_scheme::KdeColor; + use teksilo_kde_scheme::math::mix; + use teksilo_tokens::TargetDensity; + + fn rgba8(c: Color) -> [u8; 4] { + KdeColor::from_color(c).to_rgba8() + } + + fn m() -> BreezeScrollBarMetrics { + crate::styles::metrics::breeze_scroll_bar_metrics() + } + + /// Breeze's 21 px vertical bar: the separator in the leftmost column, + /// the handle from 7 to 15, as Plasma painted it. + #[test] + fn breezes_own_bar_puts_the_handle_six_pixels_from_the_separator() { + let p = scroll_bar_parts( + Rect::new(0.0, 0.0, 21.0, 200.0), + ScrollBarOrientation::Vertical, + LayoutDirection::LeftToRight, + true, + &m(), + ); + let sep = p.separator.unwrap(); + assert_eq!((sep.x, sep.width, sep.height), (0.0, 1.0, 200.0)); + assert_eq!(p.handle_across, (7.0, 8.0)); + // Right to left the separator moves to the right edge. + let p = scroll_bar_parts( + Rect::new(0.0, 0.0, 21.0, 200.0), + ScrollBarOrientation::Vertical, + LayoutDirection::RightToLeft, + true, + &m(), + ); + assert_eq!(p.separator.unwrap().x, 20.0); + assert_eq!(p.handle_across, (6.0, 8.0)); + // A horizontal bar's separator is its top line in either direction. + let p = scroll_bar_parts( + Rect::new(0.0, 0.0, 200.0, 21.0), + ScrollBarOrientation::Horizontal, + LayoutDirection::RightToLeft, + true, + &m(), + ); + let sep = p.separator.unwrap(); + assert_eq!((sep.y, sep.height, sep.width), (0.0, 1.0, 200.0)); + assert_eq!(p.handle_across, (7.0, 8.0)); + } + + #[test] + fn a_thinner_bar_keeps_the_handle_and_an_overlay_has_no_separator() { + let p = scroll_bar_parts( + Rect::new(100.0, 0.0, 12.0, 200.0), + ScrollBarOrientation::Vertical, + LayoutDirection::LeftToRight, + true, + &m(), + ); + assert_eq!(p.handle_across, (102.0, 8.0)); + let p = scroll_bar_parts( + Rect::new(100.0, 0.0, 12.0, 200.0), + ScrollBarOrientation::Vertical, + LayoutDirection::LeftToRight, + false, + &m(), + ); + assert!(p.separator.is_none()); + assert_eq!(p.handle_across, (102.0, 8.0)); + // Narrower than the handle: the handle fills it. + let p = scroll_bar_parts( + Rect::new(0.0, 0.0, 4.0, 200.0), + ScrollBarOrientation::Vertical, + LayoutDirection::LeftToRight, + false, + &m(), + ); + assert_eq!(p.handle_across, (0.0, 4.0)); + } + + #[test] + fn the_thumb_is_the_widgets_and_never_shorter_than_twenty() { + assert_eq!(thumb_along(200.0, 0.5, 0.0, 20.0), (0.0, 100.0)); + assert_eq!(thumb_along(200.0, 0.5, 1.0, 20.0), (100.0, 100.0)); + assert_eq!(thumb_along(200.0, 0.01, 0.5, 20.0), (90.0, 20.0)); + assert_eq!(thumb_along(10.0, 0.01, 0.5, 20.0), (0.0, 10.0)); + for density in [ + TargetDensity::Compact, + TargetDensity::Comfortable, + TargetDensity::Touch, + ] { + let tokens = InputTokens::for_density(density); + assert_eq!( + BreezeScrollBarStyle::for_tokens(&tokens).min_thumb_length(&tokens), + 20.0 + ); + } + } + + /// The separator Plasma painted, the view's text at the frame contrast + /// over the window, and the thumbs are the lifted tokens. + #[test] + fn the_colours_are_plasmas_lines_and_the_lifted_thumbs() { + for (theme, separator) in [ + (crate::light(), [198, 200, 201, 255]), + (crate::dark(), [76, 78, 80, 255]), + ] { + let c = BreezeScrollBarColors::resolve(&theme, true, false); + let window = KdeColor::from_color(theme.colors.surface_main); + let over = |x: Color| { + rgba8( + mix( + window, + KdeColor::from_color(x.with_alpha(1.0)), + f64::from(x.a()), + ) + .to_color(), + ) + }; + let got = over(c.separator); + for (g, w) in got.iter().zip(separator) { + assert!(g.abs_diff(w) <= 1, "{got:?} against {separator:?}"); + } + assert_eq!(c.thumb, theme.colors.scrollbar_thumb); + assert_eq!(c.thumb_hover, theme.colors.scrollbar_thumb_hover); + assert_eq!(c.handle(false), (c.thumb, c.outline)); + assert_eq!(c.handle(true), (c.thumb_hover, c.outline_hover)); + assert!((c.outline.a() - 0.2).abs() < 1e-6); + } + } + + #[test] + fn the_bar_paints_from_the_roles_without_the_palette() { + let mut bare = crate::light(); + bare.extensions.remove::(); + let c = BreezeScrollBarColors::resolve(&bare, true, false); + assert_eq!(c.outline, bare.colors.border); + assert_eq!(c.separator, bare.colors.divider); + } +} diff --git a/crates/teksilo-theme-kde/src/styles/standard_item.rs b/crates/teksilo-theme-kde/src/styles/standard_item.rs new file mode 100644 index 000000000..e415ece75 --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/standard_item.rs @@ -0,0 +1,625 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze list and tree row, `StandardListItem` and `StandardTreeItem`. +//! +//! A row at rest paints nothing. Its selection is a rounded rectangle 2 px +//! inside the row's leading and trailing edges and 1 px inside its top and +//! bottom, the item margins, stroked with a 1 px pen on that rectangle inset +//! by half the pen at radius 4.5: +//! +//! - **selected:** filled and outlined in the highlight, the row's label, +//! subtitle and chevron in the text on it +//! ([`StandardItemStyle::selected_label_role`]); +//! - **hovered and selected:** the highlight lightened 110 %; +//! - **hovered:** the highlight at 30 % over the view, outlined in the +//! highlight at 80 %; +//! - **disabled:** never hovered; a selected disabled row in the disabled +//! highlight. +//! +//! Qt picks the colour group by window, so a selection mutes only when the +//! window goes inactive, never when the view loses keyboard focus +//! ([`SelectionEmphasis::WindowActive`]): an inactive window paints the +//! scheme's inactive highlight, for Breeze the window colour tinted toward +//! the selection colour, with the row's label in the window text. +//! +//! A row of text is 24 px at Plasma's default font, a row with an icon or a +//! check box 26 px, as Qt measures them, and a row with a subtitle 42 px, +//! all through the density ladder ([`BreezeRowMetrics`]). The content lies +//! 7 px inside the leading and trailing edges, where Qt puts a row's check +//! box, and 1 px inside the top and bottom. The row arithmetic is the +//! shipped [`RecipeStandardItemStyle`]'s, built with these numbers and its +//! own chrome held off, so the selection painted here is the only one. +//! +//! ## Where this departs from Breeze +//! +//! - **D1, the selection fill.** Breeze writes a selected row in its +//! selection text; Teksilo's text on the accent is chosen against the +//! accent (D1 of the colour mapping), so a selected row is filled with +//! `accent`, which [`TextRole::OnAccent`] is readable on, and a hovered +//! one is washed with `surface_hover`, the highlight at 30 % over the +//! view moved until the primary text is readable on it. In the stock +//! Breeze schemes both are Breeze's own colours. +//! - **Keyboard focus** on the selected row of a focused view adds the 2 px +//! focus frame (D5) around the selection, as on the other controls; +//! Breeze draws no frame on a selected row, and Teksilo's rows have no way +//! to tell the current row from the selected one. +//! - **A pressed row** paints as it does at rest or hovered: Breeze has no +//! pressed item. + +use teksilo_canvas::{Canvas, Point, Rect, SizeProposal}; +use teksilo_core::accessibility::AccessNodeBuilder; +use teksilo_core::binding::BindingLevel; +use teksilo_core::build_context::BuildContext; +use teksilo_core::signal::Signal; +use teksilo_core::styles::{SelectionEmphasis, StandardItemStyle, StandardItemStyleConfig, Theme}; +use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement}; +use teksilo_core::widget_builder::WidgetBuilder; +use teksilo_core::widget_id::WidgetId; +use teksilo_kde_scheme::KdeColor; +use teksilo_kde_scheme::math::hsv_lighter; +use teksilo_tokens::{Color, CornerRadius, InputTokens, TextRole, TypographyTokens}; +use teksilo_widgets::styles::{RecipeStandardItemStyle, StandardItemRecipe}; + +use crate::geometry::SMALL_ICON_SIZE; +use crate::shape::{BREEZE_FOCUS_RING_WIDTH, BREEZE_STROKED_FRAME_RADIUS}; +use crate::styles::chrome::{frame_radius, paint_focus_frame}; +use crate::styles::metrics::{ + BreezeRowMetrics, ROW_HOVER_OUTLINE_ALPHA, ROW_SELECTED_HOVER_LIGHTER, breeze_row_metrics_for, +}; + +/// The Breeze [`StandardItemRecipe`] at the density of `tokens`, for +/// `typography`: the row arithmetic of [`RecipeStandardItemStyle`] with the +/// dimensions of [`BreezeRowMetrics`]. +/// +/// The slot gaps and the tree indent are the recipe's own: `StandardListItem` +/// lays them out from its own constants, so a value written here would not +/// reach the row. +pub fn breeze_standard_item_recipe_for( + tokens: &InputTokens, + typography: &TypographyTokens, +) -> StandardItemRecipe { + let m = breeze_row_metrics_for(tokens, typography); + StandardItemRecipe { + // `[K]` The small icon size. + icon_size: SMALL_ICON_SIZE, + padding_horizontal: m.padding_horizontal, + padding_vertical: m.padding_vertical, + min_height_single_line: m.height, + min_height_two_line: m.height_two_line, + // `[Hp]` Only the radius of the recipe's own chrome, which this style + // holds off. + item_corner_radius: BREEZE_STROKED_FRAME_RADIUS, + bg_horizontal_inset: m.selection_inset_horizontal, + focus_ring_width: BREEZE_FOCUS_RING_WIDTH, + // The selection painted here is the only boundary. + selection_edge_width: 0.0, + ..StandardItemRecipe::for_tokens(tokens) + } +} + +/// [`breeze_standard_item_recipe_for`] at the Compact density and the Breeze +/// typography. +pub fn breeze_standard_item_recipe() -> StandardItemRecipe { + breeze_standard_item_recipe_for( + &InputTokens::default(), + &crate::typography::breeze_typography(), + ) +} + +/// Breeze `StandardItemStyle`. +/// +/// [`Default`] is the Compact density and the Breeze typography; the preset +/// installs [`BreezeStandardItemStyle::for_theme`] of the theme it builds, +/// so the row heights follow the density the theme is projected to. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeStandardItemStyle { + /// The row dimensions this style lays out and reports. + pub metrics: BreezeRowMetrics, + /// The recipe the row's content is laid out with. + pub recipe: StandardItemRecipe, +} + +impl BreezeStandardItemStyle { + /// The style at the density of `tokens`, for `typography`. + pub fn for_tokens(tokens: &InputTokens, typography: &TypographyTokens) -> Self { + Self { + metrics: breeze_row_metrics_for(tokens, typography), + recipe: breeze_standard_item_recipe_for(tokens, typography), + } + } + + /// The style at the density and typography of `theme`. + pub fn for_theme(theme: &Theme) -> Self { + Self::for_tokens(&theme.input, &theme.typography) + } +} + +impl Default for BreezeStandardItemStyle { + fn default() -> Self { + Self::for_tokens( + &InputTokens::default(), + &crate::typography::breeze_typography(), + ) + } +} + +impl StandardItemStyle for BreezeStandardItemStyle { + fn make_body(&self, cfg: &StandardItemStyleConfig, ctx: &mut BuildContext) -> WidgetId { + let selection = BreezeRowSelection { + is_selected: cfg.is_selected.clone(), + is_hovered: cfg.is_hovered.clone(), + is_disabled: cfg.is_disabled.clone(), + emphasised: self + .selection_emphasis() + .emphasised(&cfg.is_focused, &cfg.is_window_active), + show_focus: cfg + .is_selected + .zip3(&cfg.is_focused, &cfg.is_focus_visible) + .map(|(selected, focused, visible)| *selected && *focused && *visible), + inset_horizontal: self.metrics.selection_inset_horizontal, + inset_vertical: self.metrics.selection_inset_vertical, + }; + // The selection is listed first, so it paints behind the row; it is + // still a sibling the hit walk visits, and it spans the whole row, so + // it is taken out of hit testing and a press reaches the row's own + // controls (a check box) wherever it lands. + let selection = ctx.add(selection.hit_transparent(true)); + + // The recipe's row, with its interaction signals held low so its own + // chrome never paints under this selection. + let quiet = Signal::new(false); + let inner = StandardItemStyleConfig { + content: cfg.content, + is_selected: quiet.clone(), + is_hovered: quiet.clone(), + is_pressed: quiet, + is_focused: cfg.is_focused.clone(), + is_focus_visible: cfg.is_focus_visible.clone(), + is_disabled: cfg.is_disabled.clone(), + is_window_active: cfg.is_window_active.clone(), + }; + let row = RecipeStandardItemStyle::new(self.recipe).make_body(&inner, ctx); + ctx.add(BreezeRowFrame { selection, row }) + } + + /// `[wcag]` D1: the text on the selection's accent fill. + fn selected_label_role(&self) -> Option { + Some(TextRole::OnAccent) + } + + /// `[qt]` Qt picks a palette colour group per window, so only the window + /// mutes a selection. + fn selection_emphasis(&self) -> SelectionEmphasis { + SelectionEmphasis::WindowActive + } + + /// [`BreezeRowMetrics::height`]. The style was built at a density, so + /// `tokens` is not consulted again. + fn min_height_single_line(&self, _tokens: &InputTokens) -> f32 { + self.metrics.height + } + + /// [`BreezeRowMetrics::height_decorated`]. + fn min_height_decorated(&self, _tokens: &InputTokens) -> f32 { + self.metrics.height_decorated + } + + /// [`BreezeRowMetrics::height_two_line`]. + fn min_height_two_line(&self, _tokens: &InputTokens) -> f32 { + self.metrics.height_two_line + } +} + +/// Stacks the selection under the delegated row, stretching both to the +/// frame's bounds, so the selection spans the row's full width. +/// +/// A `ZStack` would measure the row at an unspecified width, where the +/// row's `Expand` reports only its padding, and centre a narrow row in a +/// wide list; this places both children at the frame's bounds, as +/// `StandardListItem` places its one root. +struct BreezeRowFrame { + selection: WidgetId, + row: WidgetId, +} + +impl std::fmt::Debug for BreezeRowFrame { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeRowFrame").finish() + } +} + +impl Widget for BreezeRowFrame { + fn build(&mut self, _ctx: &mut BuildContext) -> Vec { + vec![self.selection, self.row] + } + + fn layout_response(&self, proposal: SizeProposal, ctx: &LayoutContext) -> LayoutResponse { + // The row owns the frame's size, its shrink weight and floor + // included; the selection is decoration. + ctx.child_layout_response(self.row, proposal) + .unwrap_or_else(|| proposal.resolve(0.0, 0.0).into()) + } + + fn place_children( + &self, + bounds: Rect, + _proposal: SizeProposal, + children: &mut [WidgetPlacement], + _ctx: &LayoutContext, + ) { + for child in children.iter_mut() { + child.origin = Point::new(bounds.x, bounds.y); + child.size = bounds.size(); + } + } + + fn children(&self) -> Vec { + vec![self.selection, self.row] + } +} + +/// The colours a Breeze row's selection is painted in, in one paint state. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeRowColors { + /// `[wcag]` D1: an emphasised selected row's fill, `accent`. + pub selected: Color, + /// `[Hp]` `[wcag]` D1: the same row hovered, the highlight lightened + /// 110 %, `accent_hover` (moved, as D1 moves it, where the text on the + /// accent would fall short on it). + pub selected_hover: Color, + /// `[Hp]` The fill of a selected row in an inactive window: the scheme's + /// inactive highlight, `surface_selected_inactive`. + pub selected_inactive: Color, + /// `[wcag]` D1: a hovered row's wash, `surface_hover`. + pub hover: Color, + /// `[Hp]` A selected disabled row's fill, the disabled highlight. + pub disabled: Color, +} + +impl BreezeRowColors { + /// The colours of `theme`, the theme the paint walker hands a widget, + /// already projected for its window state. + pub fn resolve(theme: &Theme) -> BreezeRowColors { + let c = &theme.colors; + BreezeRowColors { + selected: c.accent, + selected_hover: c.accent_hover, + selected_inactive: c.surface_selected_inactive, + hover: c.surface_hover, + disabled: c.accent_disabled, + } + } +} + +/// What a row's selection paints: a fill and a 1 px outline, each optional. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct RowPaint { + /// The fill of the selection, or nothing. + pub fill: Option, + /// The outline of the selection, or nothing. + pub outline: Option, +} + +impl RowPaint { + const NOTHING: RowPaint = RowPaint { + fill: None, + outline: None, + }; +} + +/// `[Hp]` What a row paints, from `c`: disabled first, then selected (and +/// hovered), then hovered, then nothing. `emphasised` says whether a +/// selected row is drawn in the active highlight. +pub fn row_paint( + selected: bool, + hovered: bool, + disabled: bool, + emphasised: bool, + c: &BreezeRowColors, +) -> RowPaint { + let solid = |fill: Color| RowPaint { + fill: Some(fill), + outline: Some(fill), + }; + if disabled { + return if selected { + solid(c.disabled) + } else { + RowPaint::NOTHING + }; + } + if selected { + return solid(match (emphasised, hovered) { + (true, false) => c.selected, + (true, true) => c.selected_hover, + (false, false) => c.selected_inactive, + (false, true) => lighter(c.selected_inactive), + }); + } + if hovered { + // The outline is the highlight of the row's colour group at 80 %; + // in an inactive window the projected accent is that group's. + let highlight = if emphasised { + c.selected + } else { + c.selected_inactive + }; + return RowPaint { + fill: Some(c.hover), + outline: Some(highlight.with_alpha(ROW_HOVER_OUTLINE_ALPHA)), + }; + } + RowPaint::NOTHING +} + +/// `[Hp]` Qt's lighter at 110 %, in KDE's arithmetic. +fn lighter(c: Color) -> Color { + hsv_lighter(KdeColor::from_color(c), ROW_SELECTED_HOVER_LIGHTER).to_color() +} + +/// `[M]` The rectangle a row's selection lies in: the row inset by the item +/// margins. +pub fn selection_rect(bounds: Rect, inset_horizontal: f32, inset_vertical: f32) -> Rect { + Rect::new( + bounds.x + inset_horizontal, + bounds.y + inset_vertical, + (bounds.width - 2.0 * inset_horizontal).max(0.0), + (bounds.height - 2.0 * inset_vertical).max(0.0), + ) +} + +/// The selection layer of a Breeze row, painted behind the row's content. +/// +/// A leaf rather than a composition: a virtualized list realizes and +/// recycles rows constantly. Sized like `RectWidget`: it takes whatever the +/// proposal offers and reports zero when unbounded. +struct BreezeRowSelection { + is_selected: Signal, + is_hovered: Signal, + is_disabled: Signal, + emphasised: Signal, + show_focus: Signal, + inset_horizontal: f32, + inset_vertical: f32, +} + +impl std::fmt::Debug for BreezeRowSelection { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeRowSelection").finish() + } +} + +impl Widget for BreezeRowSelection { + fn build(&mut self, ctx: &mut BuildContext) -> Vec { + let id = ctx.self_id(); + let registry = ctx.binding_registry(); + for s in [ + &self.is_selected, + &self.is_hovered, + &self.is_disabled, + &self.emphasised, + &self.show_focus, + ] { + s.bind_to(id, registry, BindingLevel::RepaintOnly); + } + vec![] + } + + fn layout_response(&self, proposal: SizeProposal, _ctx: &LayoutContext) -> LayoutResponse { + proposal.resolve(0.0, 0.0).into() + } + + fn place_children( + &self, + _bounds: Rect, + _proposal: SizeProposal, + _children: &mut [WidgetPlacement], + _ctx: &LayoutContext, + ) { + } + + fn paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext) { + let theme = ctx.theme; + let paint = row_paint( + self.is_selected.get(), + self.is_hovered.get(), + self.is_disabled.get(), + self.emphasised.get(), + &BreezeRowColors::resolve(theme), + ); + let area = selection_rect(bounds, self.inset_horizontal, self.inset_vertical); + let pen = theme.shape.border_width; + let half = pen * 0.5; + let stroked = Rect::new( + area.x + half, + area.y + half, + (area.width - pen).max(0.0), + (area.height - pen).max(0.0), + ); + let corner = CornerRadius::uniform(frame_radius(&theme.shape)); + if let Some(fill) = paint.fill + && fill.a() > 0.0 + { + canvas.fill_rounded_rect(stroked, corner, fill); + } + if let Some(outline) = paint.outline + && outline.a() > 0.0 + && pen > 0.0 + { + canvas.stroke_rounded_rect(stroked, corner, outline, pen); + } + if self.show_focus.get() && !self.is_disabled.get() { + paint_focus_frame(canvas, area, theme); + } + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + // Presentational: the row announces its own selection. + builder.set_hidden(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_core::styles::PaintState; + use teksilo_tokens::TargetDensity; + use teksilo_tokens::contrast::composite_contrast; + + use crate::PlasmaAccent; + + fn rgba8(c: Color) -> [u8; 4] { + KdeColor::from_color(c).to_rgba8() + } + + #[test] + fn the_recipe_carries_breezes_row_metrics() { + let r = breeze_standard_item_recipe(); + assert_eq!(r.min_height_single_line, 24.0); + assert_eq!(r.min_height_two_line, 42.0); + assert_eq!(r.padding_horizontal, 7.0); + assert_eq!(r.padding_vertical, 1.0); + assert_eq!(r.icon_size, 16.0); + assert_eq!(r.bg_horizontal_inset, 2.0); + assert_eq!(r.selection_edge_width, 0.0); + // The fields the row lays out from its own constants are left alone. + let shipped = StandardItemRecipe::default(); + assert_eq!(r.slot_gap, shipped.slot_gap); + assert_eq!(r.subtitle_slot_gap, shipped.subtitle_slot_gap); + assert_eq!(r.label_subtitle_gap, shipped.label_subtitle_gap); + assert_eq!(r.tree_indent_step, shipped.tree_indent_step); + assert_eq!(BreezeStandardItemStyle::default().recipe, r); + assert_eq!( + BreezeStandardItemStyle::for_theme(&crate::light()).recipe, + r + ); + } + + /// The floors a row asks for: 24, 26 with a decoration, 42 with a + /// subtitle at Compact, through the density ladder above it. + #[test] + fn the_floors_are_the_row_metrics_at_every_density() { + for (density, floors) in [ + (TargetDensity::Compact, (24.0, 26.0, 42.0)), + (TargetDensity::Comfortable, (32.0, 32.0, 42.0)), + (TargetDensity::Touch, (44.0, 44.0, 44.0)), + ] { + let theme = crate::light().with_density(density); + let style = BreezeStandardItemStyle::for_theme(&theme); + let t = &theme.input; + assert_eq!( + ( + style.min_height_single_line(t), + style.min_height_decorated(t), + style.min_height_two_line(t) + ), + floors, + "{density:?}" + ); + } + } + + #[test] + fn the_style_flips_the_label_and_follows_the_window() { + let s = BreezeStandardItemStyle::default(); + assert_eq!(s.selected_label_role(), Some(TextRole::OnAccent)); + assert_eq!(s.selection_emphasis(), SelectionEmphasis::WindowActive); + } + + #[test] + fn a_row_paints_breezes_selection_in_each_state() { + let c = BreezeRowColors::resolve(&crate::light()); + assert_eq!(row_paint(false, false, false, true, &c), RowPaint::NOTHING); + assert_eq!(row_paint(false, true, true, true, &c), RowPaint::NOTHING); + let selected = row_paint(true, false, false, true, &c); + assert_eq!(selected.fill, Some(c.selected)); + assert_eq!(selected.outline, Some(c.selected), "opaque outline"); + let hovered = row_paint(false, true, false, true, &c); + assert_eq!(hovered.fill, Some(c.hover)); + assert_eq!(hovered.outline, Some(c.selected.with_alpha(0.8))); + let selected_hovered = row_paint(true, true, false, true, &c); + assert_ne!(selected_hovered.fill, Some(c.selected)); + assert_eq!(selected_hovered.fill, selected_hovered.outline); + assert_eq!( + row_paint(true, false, false, false, &c).fill, + Some(c.selected_inactive) + ); + assert_eq!(row_paint(true, true, true, true, &c).fill, Some(c.disabled)); + } + + /// The colours Plasma painted in a 200 x 24 row: the highlight, its + /// lightened hover, the 30 % wash and the inactive highlight. + #[test] + fn breeze_lights_row_colours_are_plasmas() { + let light = crate::light(); + let c = BreezeRowColors::resolve(&light); + assert_eq!(rgba8(c.selected), [61, 174, 233, 255]); + assert_eq!( + rgba8(row_paint(true, true, false, true, &c).fill.unwrap()), + [68, 191, 255, 255], + "#44bfff" + ); + let wash = rgba8(c.hover); + for (got, want) in wash.iter().zip([196u8, 230, 248]) { + assert!(got.abs_diff(want) <= 1, "{wash:?}, Plasma #c4e6f8"); + } + let inactive = light.for_paint_state(PaintState { + window_active: false, + high_contrast: false, + }); + let ci = BreezeRowColors::resolve(&inactive); + assert_eq!( + rgba8(row_paint(true, false, false, false, &ci).fill.unwrap()), + [194, 224, 245, 255], + "#c2e0f5" + ); + } + + /// The label on a selected row is readable on the fill and its hover, + /// with every swatch, light and dark. + #[test] + fn the_label_is_readable_on_the_selection_with_every_accent() { + for accent in PlasmaAccent::ALL { + for theme in [ + crate::light_with_accent(accent.color()), + crate::dark_with_accent(accent.color()), + ] { + let c = BreezeRowColors::resolve(&theme); + let text = theme.colors.text_on_accent; + for selected_hover in [false, true] { + let fill = row_paint(true, selected_hover, false, true, &c) + .fill + .unwrap(); + assert!( + composite_contrast(text, fill) >= 4.5, + "{accent:?}: {:.2}:1", + composite_contrast(text, fill) + ); + } + let wash = row_paint(false, true, false, true, &c).fill.unwrap(); + assert!(composite_contrast(theme.colors.text_primary, wash) >= 4.5); + } + } + } + + #[test] + fn the_selection_lies_inside_the_item_margins() { + let r = selection_rect(Rect::new(0.0, 0.0, 200.0, 24.0), 2.0, 1.0); + assert_eq!((r.x, r.y, r.width, r.height), (2.0, 1.0, 196.0, 22.0)); + let tiny = selection_rect(Rect::new(0.0, 0.0, 3.0, 1.0), 2.0, 1.0); + assert_eq!((tiny.width, tiny.height), (0.0, 0.0)); + } + + /// Without the palette the colours are the theme's own tokens, so a row + /// in another theme still paints. + #[test] + fn the_colours_are_tokens_and_need_no_palette() { + let mut bare = crate::light(); + bare.extensions.remove::(); + assert_eq!( + BreezeRowColors::resolve(&bare), + BreezeRowColors::resolve(&crate::light()) + ); + } +} diff --git a/crates/teksilo-theme-kde/src/styles/tab.rs b/crates/teksilo-theme-kde/src/styles/tab.rs new file mode 100644 index 000000000..05d888ae9 --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/tab.rs @@ -0,0 +1,695 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze tab, in a `TabBar` or a `TabWidget`. +//! +//! The selected tab is filled with the window colour, merging into the page +//! below it, outlined on its two sides in the window colour moved toward the +//! window text by the frame contrast, and open on the side of the page. A +//! 3 px highlight bar runs along its outer edge, its two outer corners +//! rounded at the 5 px frame radius. The outline is stroked at radius 4.5, +//! so its outer edge turns through the same 5 px corner: the curve the bar +//! starts runs on into the outline and the face below the bar, rows 3 and 4 +//! of a 30 px tab, before the sides straighten. An unselected tab is the window colour +//! darkened 120 %, square; hovered, the window colour moved 20 % toward the +//! hover colour. A disabled tab paints the disabled colours. +//! +//! The bar is on the edge the bar's `active_indicator` names: the top of a +//! horizontal tab and the leading side of a vertical one by default, the +//! bottom or the trailing side for `InnerEdge`; the open side is always the +//! opposite one. A tab is 30 px at Plasma's default font, through the density +//! ladder, its title 8 px inside its edges ([`BreezeTabMetrics`]). The strip +//! behind the tabs, its separator and the drop indicator of a reorder drag +//! are the shipped [`RecipeTabStyle`]'s, built with these numbers. +//! +//! Plasma's samples of a standalone tab bar fill the selected tab with the +//! window colour; the specification gives the frame background for a tab +//! bar that frames a tab widget's panel. A Teksilo tab's page is the window, +//! so the window colour is used, as measured. +//! +//! ## Where this departs from Breeze +//! +//! - **Keyboard focus** draws the 2 px focus frame (D5) flush inside the +//! tab, as the framework's tabs keep their ring inside so a neighbouring +//! tab cannot cover it; Breeze draws no focus frame on a tab. +//! - **The highlight bar is not lifted.** It is Breeze's highlight, as are a +//! slider's fill and a check box's wash; the selected tab is also told by +//! its fill, its outline and its open side. + +use teksilo_canvas::{Canvas, Path, Point, Rect, SizeProposal, arc_to_cubics}; +use teksilo_core::accessibility::AccessNodeBuilder; +use teksilo_core::binding::BindingLevel; +use teksilo_core::build_context::BuildContext; +use teksilo_core::environment::LayoutDirection; +use teksilo_core::signal::Signal; +use teksilo_core::styles::{ + TabBarChromeConfig, TabBarOrientation, TabIndicatorPosition, TabStyle, TabStyleConfig, Theme, +}; +use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement}; +use teksilo_core::widget_id::WidgetId; +use teksilo_kde_scheme::math::hsv_darker; +use teksilo_kde_scheme::{ColorState, KdeColor, PaletteRole}; +use teksilo_tokens::{Color, InputTokens, TypographyTokens}; +use teksilo_widgets::primitives::{HStack, ZStack}; +use teksilo_widgets::styles::{RecipeTabStyle, TabRecipe}; + +use crate::palette::KdePalette; +use crate::styles::chrome::{kde_mix, paint_focus_frame}; +use crate::styles::metrics::{ + BreezeTabMetrics, TAB_BAR_RADIUS, TAB_HOVER_MIX, TAB_OUTLINE_RADIUS, TAB_UNSELECTED_DARKER, + breeze_tab_metrics_for, +}; + +/// Breeze `TabStyle`. +/// +/// [`Default`] is the Compact density and the Breeze typography; the preset +/// installs [`BreezeTabStyle::for_theme`] of the theme it builds. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeTabStyle { + /// The tab dimensions this style lays out and reports. + pub metrics: BreezeTabMetrics, + /// The recipe the bar's strip is built with. + pub recipe: TabRecipe, +} + +impl BreezeTabStyle { + /// The style at the density of `tokens`, for `typography`. + pub fn for_tokens(tokens: &InputTokens, typography: &TypographyTokens) -> Self { + let metrics = breeze_tab_metrics_for(tokens, typography); + Self { + metrics, + recipe: TabRecipe { + editor_height: metrics.height, + padding_horizontal: metrics.padding_horizontal, + ..TabRecipe::for_tokens(tokens) + }, + } + } + + /// The style at the density and typography of `theme`. + pub fn for_theme(theme: &Theme) -> Self { + Self::for_tokens(&theme.input, &theme.typography) + } +} + +impl Default for BreezeTabStyle { + fn default() -> Self { + Self::for_tokens( + &InputTokens::default(), + &crate::typography::breeze_typography(), + ) + } +} + +impl TabStyle for BreezeTabStyle { + fn make_body(&self, cfg: &TabStyleConfig, ctx: &mut BuildContext) -> WidgetId { + let painter = ctx.add(BreezeTabShape { + is_active: cfg.is_active.clone(), + is_hovered: cfg.is_hovered.clone(), + is_focused: cfg.is_focused.clone(), + is_disabled: cfg.is_disabled.clone(), + edge: bar_edge(cfg.orientation, cfg.indicator_position), + indicator: self.metrics.indicator, + }); + let mut row = HStack::new(); + if let Some(id) = cfg.leading { + row = row.child(id); + } + row = row.child(cfg.label); + if let Some(id) = cfg.trailing { + row = row.child(id); + } + let row = ctx.add(row); + ctx.add(ZStack::new().child(painter).child(row)) + } + + fn make_bar(&self, cfg: &TabBarChromeConfig, ctx: &mut BuildContext) -> WidgetId { + RecipeTabStyle::new(self.recipe).make_bar(cfg, ctx) + } + + /// [`BreezeTabMetrics::height`], 30 at Compact. The style was built at a + /// density, so `tokens` is not consulted again. + fn editor_height(&self, _tokens: &InputTokens) -> f32 { + self.metrics.height + } + + /// [`BreezeTabMetrics::padding_horizontal`], 8 at Compact. + fn padding_horizontal(&self, _tokens: &InputTokens) -> f32 { + self.metrics.padding_horizontal + } +} + +/// Which edge of a tab carries the highlight bar, before right-to-left +/// mirroring. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum TabBarEdge { + /// The top of a horizontal tab. + Top, + /// The bottom of a horizontal tab. + Bottom, + /// The leading side of a vertical tab. + Leading, + /// The trailing side of a vertical tab. + Trailing, +} + +/// The edge a tab's bar is on, for the bar's orientation and indicator +/// position. +pub fn bar_edge(orientation: TabBarOrientation, position: TabIndicatorPosition) -> TabBarEdge { + match (orientation, position) { + (TabBarOrientation::Horizontal, TabIndicatorPosition::OuterEdge) => TabBarEdge::Top, + (TabBarOrientation::Horizontal, TabIndicatorPosition::InnerEdge) => TabBarEdge::Bottom, + (TabBarOrientation::Vertical, TabIndicatorPosition::OuterEdge) => TabBarEdge::Leading, + (TabBarOrientation::Vertical, TabIndicatorPosition::InnerEdge) => TabBarEdge::Trailing, + } +} + +/// The physical side of a tab: the bar's edge with leading and trailing +/// resolved for a layout direction. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum Side { + Top, + Bottom, + Left, + Right, +} + +fn side_of(edge: TabBarEdge, direction: LayoutDirection) -> Side { + let rtl = direction == LayoutDirection::RightToLeft; + match edge { + TabBarEdge::Top => Side::Top, + TabBarEdge::Bottom => Side::Bottom, + TabBarEdge::Leading if rtl => Side::Right, + TabBarEdge::Leading => Side::Left, + TabBarEdge::Trailing if rtl => Side::Left, + TabBarEdge::Trailing => Side::Right, + } +} + +/// A selected tab's length along the edge carrying its bar, and its depth +/// away from that edge. +fn extent(bounds: Rect, side: Side) -> (f32, f32) { + match side { + Side::Top | Side::Bottom => (bounds.width, bounds.height), + Side::Left | Side::Right => (bounds.height, bounds.width), + } +} + +/// The point `u` along the bar's edge of a tab in `bounds` and `v` in from +/// that edge, on the screen. +fn to_screen(bounds: Rect, side: Side, u: f32, v: f32) -> Point { + match side { + Side::Top => Point::new(bounds.x + u, bounds.y + v), + Side::Bottom => Point::new(bounds.x + u, bounds.y + bounds.height - v), + Side::Left => Point::new(bounds.x + v, bounds.y + u), + Side::Right => Point::new(bounds.x + bounds.width - v, bounds.y + u), + } +} + +/// A rectangle in a tab's own frame, `u` along the bar's edge and `v` in +/// from it, whose two corners on the bar's edge are rounded at `radius`. +#[derive(Debug, Clone, Copy, PartialEq)] +struct OuterRounded { + u0: f32, + u1: f32, + v0: f32, + v1: f32, + radius: f32, +} + +impl OuterRounded { + /// The whole tab, its outer corners rounded at `radius`. + fn tab(len: f32, depth: f32, radius: f32) -> Self { + Self { + u0: 0.0, + u1: len, + v0: 0.0, + v1: depth, + radius, + } + } +} + +/// `[Hp]` The part of `shape` between `from` and `to` in from the bar's +/// edge, as a path on the screen. Its two sides follow the rounded corners +/// wherever the band crosses them, so a band cut below the bar keeps the +/// curve the bar started. +fn band_path(bounds: Rect, side: Side, shape: OuterRounded, from: f32, to: f32) -> Path { + let OuterRounded { + u0, + u1, + v0, + v1, + radius, + } = shape; + let mut path = Path::new(); + let (from, to) = (from.max(v0), to.min(v1)); + if to <= from || u1 <= u0 { + return path; + } + let r = radius.min((u1 - u0) * 0.5).min(v1 - v0).max(0.0); + let cy = v0 + r; + // How far round a corner the side is at `v`: 90 degrees on the edge, 0 + // where the corner meets the straight side. + let lift = |v: f32| -> f32 { + if r <= 0.0 { + 0.0 + } else { + ((cy - v) / r).clamp(0.0, 1.0).asin().to_degrees() + } + }; + let inset = |v: f32| -> f32 { + if r <= 0.0 || v >= cy { + 0.0 + } else { + r - (r * r - (cy - v) * (cy - v)).max(0.0).sqrt() + } + }; + let pt = |u: f32, v: f32| to_screen(bounds, side, u, v); + let arc = |path: &mut Path, cx: f32, start: f32, sweep: f32| { + let square = Rect::new(cx - r, cy - r, 2.0 * r, 2.0 * r); + for seg in arc_to_cubics(square, start, sweep) { + path.line_to(pt(seg.from.x, seg.from.y)); + path.cubic_to( + pt(seg.control1.x, seg.control1.y), + pt(seg.control2.x, seg.control2.y), + pt(seg.to.x, seg.to.y), + ); + } + }; + let curved = r > 0.0 && from < cy; + let knee = to.min(cy); + path.move_to(pt(u0 + inset(from), from)); + if curved { + // Down the leading corner, from `from` toward the straight side. + arc( + &mut path, + u0 + r, + 180.0 + lift(from), + lift(knee) - lift(from), + ); + } + path.line_to(pt(u0 + inset(to), to)); + path.line_to(pt(u1 - inset(to), to)); + if curved { + path.line_to(pt(u1 - inset(knee), knee)); + // Up the trailing corner, back to `from`. + arc(&mut path, u1 - r, -lift(knee), lift(knee) - lift(from)); + } + path.line_to(pt(u1 - inset(from), from)); + path.close(); + path +} + +/// The three paths of a selected tab in `bounds` with the bar `bar` thick +/// along the side `side` and a `pen` wide outline: the bar, the outline and +/// the face, the last two from the bar to the open side. +/// +/// The bar is the tab's outer edge rounded at [`TAB_BAR_RADIUS`]. The +/// outline is the tab stroked at [`TAB_OUTLINE_RADIUS`]: its outer edge +/// that radius plus half the pen, its inner edge, the face, that radius +/// less half the pen, so both turn through the corner below the bar. +fn selected_paths(bounds: Rect, side: Side, bar: f32, pen: f32) -> [Path; 3] { + let (len, depth) = extent(bounds, side); + let bar = bar.min(depth).max(0.0); + let bar_path = band_path( + bounds, + side, + OuterRounded::tab(len, depth, TAB_BAR_RADIUS), + 0.0, + bar, + ); + let pen = pen.max(0.0); + let outer = OuterRounded::tab(len, depth, TAB_OUTLINE_RADIUS + pen * 0.5); + let outline = band_path(bounds, side, outer, bar, depth); + let face = if pen > 0.0 { + let inner = OuterRounded { + u0: pen, + u1: len - pen, + v0: pen, + v1: depth, + radius: (TAB_OUTLINE_RADIUS - pen * 0.5).max(0.0), + }; + band_path(bounds, side, inner, bar, depth) + } else { + outline.clone() + }; + [bar_path, outline, face] +} + +/// The colours a Breeze tab is painted in, in one paint state. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeTabColors { + /// `[measured-qt]` The selected tab's fill: the window colour. + pub selected: Color, + /// `[Hp]` The selected tab's outline: its fill moved toward the window + /// text by the frame contrast. + pub outline: Color, + /// `[Hp]` The highlight bar: the highlight of the tab's colour group. + pub bar: Color, + /// `[Hp]` An unselected tab: the window colour darkened 120 %. + pub unselected: Color, + /// `[Hp]` A hovered unselected tab: the window colour moved 20 % toward + /// the hover colour. + pub hovered: Color, +} + +impl BreezeTabColors { + /// The colours of `theme` as it paints in a window that is or is not + /// active, with or without the high-contrast preference, for an enabled + /// or a disabled tab. + /// + /// The window colour and the highlight are the theme's projected tokens + /// (the disabled palette's window for a disabled tab); the outline and + /// the hover colour come from [`KdePalette`]. Without it the outline is + /// the border, an unselected tab the sunken surface and a hovered one the + /// hover surface. + pub fn resolve( + theme: &Theme, + window_active: bool, + high_contrast: bool, + disabled: bool, + ) -> BreezeTabColors { + let c = &theme.colors; + let bar = if disabled { + c.accent_disabled + } else { + c.accent + }; + let Some(palette) = theme.extension::() else { + return BreezeTabColors { + selected: c.surface_main, + outline: c.border, + bar, + unselected: c.surface_sunken, + hovered: c.surface_hover, + }; + }; + let state = if disabled { + ColorState::Disabled + } else if window_active { + ColorState::Active + } else { + ColorState::Inactive + }; + let window = if disabled { + palette.role(ColorState::Disabled, PaletteRole::Window) + } else { + c.surface_main + }; + let b = palette.breeze_colors(state, high_contrast); + BreezeTabColors { + selected: window, + outline: b.frame_outline, + bar, + unselected: hsv_darker(KdeColor::from_color(window), TAB_UNSELECTED_DARKER).to_color(), + hovered: kde_mix(window, b.hover, TAB_HOVER_MIX), + } + } +} + +/// The chrome of a Breeze tab, painted behind its title. +struct BreezeTabShape { + is_active: Signal, + is_hovered: Signal, + is_focused: Signal, + is_disabled: Signal, + edge: TabBarEdge, + indicator: f32, +} + +impl std::fmt::Debug for BreezeTabShape { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeTabShape").finish() + } +} + +impl Widget for BreezeTabShape { + fn build(&mut self, ctx: &mut BuildContext) -> Vec { + let id = ctx.self_id(); + let registry = ctx.binding_registry(); + for s in [ + &self.is_active, + &self.is_hovered, + &self.is_focused, + &self.is_disabled, + ] { + s.bind_to(id, registry, BindingLevel::RepaintOnly); + } + vec![] + } + + fn layout_response(&self, proposal: SizeProposal, _ctx: &LayoutContext) -> LayoutResponse { + proposal.resolve(0.0, 0.0).into() + } + + fn place_children( + &self, + _bounds: Rect, + _proposal: SizeProposal, + _children: &mut [WidgetPlacement], + _ctx: &LayoutContext, + ) { + } + + fn paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext) { + let theme = ctx.theme; + let disabled = self.is_disabled.get(); + let c = BreezeTabColors::resolve( + theme, + ctx.window_active, + ctx.prefers_high_contrast, + disabled, + ); + if self.is_active.get() { + let side = side_of(self.edge, ctx.layout_direction); + let pen = theme.shape.border_width; + let [bar, outline, face] = selected_paths(bounds, side, self.indicator, pen); + if !bar.is_empty() { + canvas.fill_path(&bar, c.bar); + } + if pen > 0.0 && !outline.is_empty() { + canvas.fill_path(&outline, c.outline); + } + if !face.is_empty() { + canvas.fill_path(&face, c.selected); + } + } else { + let fill = if self.is_hovered.get() && !disabled { + c.hovered + } else { + c.unselected + }; + canvas.fill_rect(bounds, fill); + } + if self.is_focused.get() && !disabled { + // Flush inside the tab: the frame runs 1 px either side of a + // rectangle 1 px in. + let inner = Rect::new( + bounds.x + 1.0, + bounds.y + 1.0, + (bounds.width - 2.0).max(0.0), + (bounds.height - 2.0).max(0.0), + ); + paint_focus_frame(canvas, inner, theme); + } + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + // Presentational: the tab announces itself. + builder.set_hidden(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_tokens::TargetDensity; + + fn rgba8(c: Color) -> [u8; 4] { + KdeColor::from_color(c).to_rgba8() + } + + /// Whether two colours are within one step a channel: Qt's raster + /// painter rounds an 8-bit blend its own way. + fn near(a: [u8; 4], b: [u8; 4]) -> bool { + a.iter().zip(b).all(|(x, y)| x.abs_diff(y) <= 1) + } + + #[test] + fn the_metrics_and_the_strip_recipe_are_breezes() { + let s = BreezeTabStyle::default(); + let t = InputTokens::default(); + assert_eq!(s.editor_height(&t), 30.0); + assert_eq!(s.padding_horizontal(&t), 8.0); + assert_eq!(s.recipe.editor_height, 30.0); + assert_eq!(s.recipe.padding_horizontal, 8.0); + for (density, height) in [ + (TargetDensity::Comfortable, 32.0), + (TargetDensity::Touch, 44.0), + ] { + let theme = crate::light().with_density(density); + let s = BreezeTabStyle::for_theme(&theme); + assert_eq!(s.editor_height(&theme.input), height, "{density:?}"); + } + } + + /// The tab colours Plasma painted in Breeze Light and Breeze Dark. + #[test] + fn the_tab_colours_are_plasmas() { + for (theme, selected, outline, unselected, hovered) in [ + ( + crate::light(), + [239, 240, 241, 255], + [198, 200, 201, 255], + [199, 200, 201, 255], + [203, 227, 240, 255], + ), + ( + crate::dark(), + [32, 35, 38, 255], + [76, 78, 81, 255], + [27, 29, 32, 255], + [38, 63, 77, 255], + ), + ] { + let c = BreezeTabColors::resolve(&theme, true, false, false); + assert_eq!(rgba8(c.selected), selected); + assert!(near(rgba8(c.outline), outline), "{:?}", rgba8(c.outline)); + assert!( + near(rgba8(c.unselected), unselected), + "{:?}", + rgba8(c.unselected) + ); + assert!(near(rgba8(c.hovered), hovered), "{:?}", rgba8(c.hovered)); + assert_eq!(rgba8(c.bar), [61, 174, 233, 255]); + } + } + + #[test] + fn the_bar_follows_the_orientation_the_position_and_the_direction() { + use LayoutDirection::{LeftToRight, RightToLeft}; + use TabBarOrientation::{Horizontal, Vertical}; + use TabIndicatorPosition::{InnerEdge, OuterEdge}; + assert_eq!(bar_edge(Horizontal, OuterEdge), TabBarEdge::Top); + assert_eq!(bar_edge(Horizontal, InnerEdge), TabBarEdge::Bottom); + assert_eq!(bar_edge(Vertical, OuterEdge), TabBarEdge::Leading); + assert_eq!(bar_edge(Vertical, InnerEdge), TabBarEdge::Trailing); + assert_eq!(side_of(TabBarEdge::Leading, LeftToRight), Side::Left); + assert_eq!(side_of(TabBarEdge::Leading, RightToLeft), Side::Right); + assert_eq!(side_of(TabBarEdge::Trailing, RightToLeft), Side::Left); + assert_eq!(side_of(TabBarEdge::Top, RightToLeft), Side::Top); + } + + fn inside(path: &Path, x: f32, y: f32) -> bool { + path.contains_point(Point::new(x, y), teksilo_canvas::FillRule::Winding, 0.01) + } + + fn near_rect(r: Rect, x: f32, y: f32, w: f32, h: f32) -> bool { + (r.x - x).abs() < 0.01 + && (r.y - y).abs() < 0.01 + && (r.width - w).abs() < 0.01 + && (r.height - h).abs() < 0.01 + } + + /// A selected 80 x 30 tab: the bar along the top 3 px, the outline down + /// the two sides below it, the bottom open, as Plasma's sample. + #[test] + fn a_selected_tab_is_a_bar_two_sides_and_an_open_edge() { + let b = Rect::new(0.0, 0.0, 80.0, 30.0); + let [bar, outline, face] = selected_paths(b, Side::Top, 3.0, 1.0); + // The bar's rounded corners keep it clear of the tab's two sides: + // at its inner edge, 3 px down a 5 px corner, it is 5 - sqrt(21) + // in from each. + let corner = 5.0 - 21.0_f32.sqrt(); + let bb = bar.exact_bounds(0.01); + assert!( + near_rect(bb, corner, 0.0, 80.0 - 2.0 * corner, 3.0), + "{bb:?}" + ); + assert!(near_rect(outline.bounds(), 0.0, 3.0, 80.0, 27.0)); + assert!(near_rect(face.bounds(), 1.0, 3.0, 78.0, 27.0)); + assert!(inside(&bar, 40.0, 1.5)); + assert!(!inside(&bar, 40.0, 3.5)); + // The outline is the 1 px either side of the face, down to the + // open bottom. + for y in [15.0, 29.5] { + assert!(inside(&outline, 0.5, y) && !inside(&face, 0.5, y)); + assert!(inside(&outline, 79.5, y) && !inside(&face, 79.5, y)); + assert!(inside(&face, 40.0, y)); + } + let [bar, _, face] = selected_paths(Rect::new(0.0, 0.0, 30.0, 80.0), Side::Right, 3.0, 1.0); + let bb = bar.exact_bounds(0.01); + assert!( + near_rect(bb, 27.0, corner, 3.0, 80.0 - 2.0 * corner), + "{bb:?}" + ); + assert!(near_rect(face.bounds(), 0.0, 1.0, 27.0, 78.0)); + } + + /// The corner the bar starts goes on turning below it: in rows 3 and 4 + /// the outline's outer edge and the face's edge are still curving, as + /// in Plasma's sample (column 0 is blended there and only reaches the + /// outline colour at row 5), rather than stepping to a square body. + #[test] + fn the_outline_and_the_face_follow_the_bars_corner() { + let b = Rect::new(0.0, 0.0, 80.0, 30.0); + let [bar, outline, face] = selected_paths(b, Side::Top, 3.0, 1.0); + // The bar's rounded corner. + assert!(!inside(&bar, 0.3, 0.3)); + assert!(inside(&bar, 2.5, 2.5)); + // Row 3: the outline starts about 0.4 px in, not at the edge. + assert!(!inside(&outline, 0.1, 3.1)); + assert!(inside(&outline, 0.8, 3.1)); + assert!(!inside(&outline, 79.9, 3.1)); + // Row 4: the edge has nearly reached the side, and the face is still + // inset more than the straight 1 px pen. + assert!(inside(&outline, 0.5, 4.5)); + assert!(!inside(&face, 0.9, 4.5)); + assert!(inside(&face, 1.5, 4.5)); + assert!(inside(&face, 1.1, 15.0)); + // Every orientation and direction carries the same corner. + for (bounds, side, outside) in [ + (Rect::new(0.0, 0.0, 80.0, 30.0), Side::Bottom, (0.1, 26.9)), + (Rect::new(0.0, 0.0, 30.0, 80.0), Side::Left, (3.1, 0.1)), + (Rect::new(0.0, 0.0, 30.0, 80.0), Side::Right, (26.9, 79.9)), + ] { + let [_, outline, _] = selected_paths(bounds, side, 3.0, 1.0); + assert!(!inside(&outline, outside.0, outside.1), "{side:?}"); + } + // At the default 1 px pen the outline's outer edge is the bar's + // radius. + assert_eq!(TAB_OUTLINE_RADIUS + 0.5, TAB_BAR_RADIUS); + } + + #[test] + fn a_band_without_a_radius_is_a_rectangle() { + let b = Rect::new(10.0, 20.0, 40.0, 30.0); + let shape = OuterRounded::tab(40.0, 30.0, 0.0); + let p = band_path(b, Side::Top, shape, 3.0, 30.0); + assert!(near_rect(p.bounds(), 10.0, 23.0, 40.0, 27.0)); + assert!(inside(&p, 10.1, 23.1)); + assert!(band_path(b, Side::Top, shape, 30.0, 30.0).is_empty()); + } + + #[test] + fn a_disabled_tab_paints_the_disabled_colours() { + let theme = crate::light(); + let c = BreezeTabColors::resolve(&theme, true, false, true); + assert_eq!(c.bar, theme.colors.accent_disabled); + let palette = theme.extension::().unwrap(); + assert_eq!( + c.selected, + palette.role(ColorState::Disabled, PaletteRole::Window) + ); + } + + #[test] + fn the_tab_paints_from_the_roles_without_the_palette() { + let mut bare = crate::light(); + bare.extensions.remove::(); + let c = BreezeTabColors::resolve(&bare, true, false, false); + assert_eq!(c.outline, bare.colors.border); + assert_eq!(c.unselected, bare.colors.surface_sunken); + } +} diff --git a/crates/teksilo-theme-kde/src/styles/table.rs b/crates/teksilo-theme-kde/src/styles/table.rs new file mode 100644 index 000000000..330f01fce --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/table.rs @@ -0,0 +1,559 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze table: `TableView` and `TreeTableView`, their rows and their +//! column header. +//! +//! A header section is filled with the button colour, moved 20 % toward the +//! hover colour under the pointer, and toward the focus colour while its +//! column is being resized (Breeze's pressed section) or while it is the +//! column sorted down, with a 1 px line along its bottom and its trailing +//! edge in the window text at the frame contrast. +//! +//! Sorted down is Qt's indicator, not the arrow Breeze draws: Qt's header +//! view marks a column sorted in ascending order with its down indicator, +//! and Breeze, which inverts the sort indicator by default +//! (`ViewInvertSortIndicator`), draws that column's arrow pointing up. So +//! the ascending column is the one tinted, under an up arrow, and a +//! descending one keeps the button colour under its down arrow. Its label lies 6 px inside it, the header margin. The header +//! row is 30 px at Plasma's default font, room for the 10 px sort arrow, +//! through the density ladder. +//! +//! A body row is 24 px (D7, below). Table cells are square: a selected row +//! is the highlight across the row, a hovered one the highlight at 30 % +//! over the view, an alternate row the view's alternate background. +//! +//! The views paint their own selection band, alternate rows and grid lines +//! from the theme's tokens in one pass over the visible rows, and draw their +//! own sort arrow, so [`TableStyle::make_row_background`] and +//! [`TableStyle::make_sort_indicator`] are Breeze's for a style author who +//! composes them, and the band the views paint is the `surface_selected` +//! token; the crate's known limitations say where that differs from Breeze. +//! +//! ## Where this departs from Breeze +//! +//! - **D7, the row height.** Qt lays a Breeze table row out at the line box +//! and its item margins and padding and adds its 1 px grid line: 23 px at +//! Plasma's default font, under WCAG 2.2 SC 2.5.8's 24 px target. The row +//! is raised to 24 px, then through the density ladder; at a larger font +//! Qt's own row, already taller, is kept. + +use teksilo_canvas::{Canvas, Rect, SizeProposal}; +use teksilo_core::accessibility::AccessNodeBuilder; +use teksilo_core::binding::BindingLevel; +use teksilo_core::build_context::BuildContext; +use teksilo_core::environment::LayoutDirection; +use teksilo_core::signal::Signal; +use teksilo_core::styles::{ + SortDirection, TableGridRecipe, TableHeaderCellConfig, TableRowConfig, TableStyle, Theme, +}; +use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, WidgetPlacement}; +use teksilo_core::widget_id::WidgetId; +use teksilo_kde_scheme::{ColorState, PaletteRole}; +use teksilo_tokens::{Color, InputTokens, TypographyTokens}; +use teksilo_widgets::primitives::ZStack; + +use crate::palette::KdePalette; +use crate::styles::arrow::{ArrowDirection, arrow_color, paint_arrow}; +use crate::styles::chrome::kde_mix; +use crate::styles::metrics::{BreezeTableMetrics, ROW_HOVER_ALPHA, breeze_table_metrics_for}; + +/// `[Hp]` How far a hovered or pressed header section moves from the button +/// colour toward the hover or focus colour. +pub const HEADER_STATE_MIX: f64 = 0.2; +/// `[Hp]` The width of a header section's bottom and trailing lines. +pub const HEADER_LINE_WIDTH: f32 = 1.0; + +/// Breeze `TableStyle`. +/// +/// [`Default`] is the Compact density and the Breeze typography; the preset +/// installs [`BreezeTableStyle::for_theme`] of the theme it builds. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeTableStyle { + /// The table dimensions this style reports. + pub metrics: BreezeTableMetrics, +} + +impl BreezeTableStyle { + /// The style at the density of `tokens`, for `typography`. + pub fn for_tokens(tokens: &InputTokens, typography: &TypographyTokens) -> Self { + Self { + metrics: breeze_table_metrics_for(tokens, typography), + } + } + + /// The style at the density and typography of `theme`. + pub fn for_theme(theme: &Theme) -> Self { + Self::for_tokens(&theme.input, &theme.typography) + } +} + +impl Default for BreezeTableStyle { + fn default() -> Self { + Self::for_tokens( + &InputTokens::default(), + &crate::typography::breeze_typography(), + ) + } +} + +impl TableStyle for BreezeTableStyle { + fn make_header_cell(&self, cfg: &TableHeaderCellConfig, ctx: &mut BuildContext) -> WidgetId { + let section = ctx.add(BreezeHeaderSection { + is_hovered: cfg.is_hovered.clone(), + is_resizing: cfg.is_resizing.clone(), + sorted_down: sorts_down(cfg.sort), + }); + ctx.add(ZStack::new().child(section).child(cfg.label)) + } + + fn make_sort_indicator(&self, direction: SortDirection, ctx: &mut BuildContext) -> WidgetId { + ctx.add(BreezeSortArrow { direction }) + } + + fn make_row_background(&self, cfg: &TableRowConfig, ctx: &mut BuildContext) -> WidgetId { + ctx.add(BreezeTableRowBackground { + is_selected: cfg.is_selected.clone(), + is_hovered: cfg.is_hovered.clone(), + is_alt: cfg.is_alt, + // `[qt]` A selection mutes with its window only. + is_window_active: cfg.is_window_active.clone(), + }) + } + + /// `[unpublished]` The specification records no grid-line colour of its + /// own: the framework's 1 px lines in the divider role, Breeze's frame + /// outline, and its frozen-column shadow. + fn grid(&self) -> TableGridRecipe { + TableGridRecipe::default() + } + + /// [`BreezeTableMetrics::header_padding`]. The style was built at a + /// density, so `tokens` is not consulted again. + fn cell_padding_horizontal(&self, _tokens: &InputTokens) -> f32 { + self.metrics.header_padding + } + + /// [`BreezeTableMetrics::header_padding`]: the label's line box and the + /// header margin above and below fill the header. + fn cell_padding_vertical(&self, _tokens: &InputTokens) -> f32 { + self.metrics.header_padding + } + + /// [`BreezeTableMetrics::row_height`], 24 at Compact (D7). + fn row_height(&self, _tokens: &InputTokens) -> f32 { + self.metrics.row_height + } + + /// [`BreezeTableMetrics::header_height`], 30 at Compact. + fn header_height(&self, _tokens: &InputTokens) -> f32 { + self.metrics.header_height + } +} + +/// The colours a Breeze header section is painted in, in one paint state. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct BreezeHeaderColors { + /// `[qt]` The section at rest: the button colour. + pub rest: Color, + /// `[Hp]` Hovered: the button colour moved 20 % toward the hover colour. + pub hovered: Color, + /// `[Hp]` Pressed (its column being resized) or sorted down: the button + /// colour moved 20 % toward the focus colour. + pub pressed: Color, + /// `[Hp]` The bottom and trailing lines: the window text at the frame + /// contrast, composited over the section. + pub line: Color, + /// `[Hp]` The sort arrow: the arrow colour of the button text. + pub arrow: Color, +} + +impl BreezeHeaderColors { + /// The colours of `theme` as it paints in a window that is or is not + /// active, with or without the high-contrast preference. + /// + /// The button, hover and focus colours come from [`KdePalette`]; without + /// it the section is the raised surface, its states the hover and pressed + /// surfaces and its lines the border. + pub fn resolve(theme: &Theme, window_active: bool, high_contrast: bool) -> BreezeHeaderColors { + let c = &theme.colors; + let Some(palette) = theme.extension::() else { + return BreezeHeaderColors { + rest: c.surface_raised, + hovered: c.surface_hover, + pressed: c.surface_pressed, + line: c.border, + arrow: c.text_secondary, + }; + }; + let state = if window_active { + ColorState::Active + } else { + ColorState::Inactive + }; + let b = palette.breeze_colors(state, high_contrast); + // `[derived]` The frame contrast: 1 in the high-contrast scheme the + // palette builds, as `KdePalette::breeze_colors` computes it. + let fc = if high_contrast { + 1.0 + } else { + palette.frame_contrast() as f32 + }; + BreezeHeaderColors { + rest: b.button, + hovered: kde_mix(b.button, b.hover, HEADER_STATE_MIX), + pressed: kde_mix(b.button, b.focus, HEADER_STATE_MIX), + line: palette.role(state, PaletteRole::WindowText).with_alpha(fc), + arrow: arrow_color(b.button_text, b.button), + } + } + + /// The section's fill: pressed (or sorted down) over hovered over rest. + pub fn fill(&self, hovered: bool, pressed: bool) -> Color { + if pressed { + self.pressed + } else if hovered { + self.hovered + } else { + self.rest + } + } +} + +/// `[qt]` Whether a header sorted in `sort` carries Qt's down indicator, +/// which Breeze paints as a pressed section: Qt's header view marks an +/// ascending column down. Breeze's inverted arrow then points up, as +/// [`TableStyle::make_sort_indicator`] draws it. +pub fn sorts_down(sort: Option) -> bool { + sort == Some(SortDirection::Ascending) +} + +/// `[Hp]` The bottom line and the trailing separator of a header section in +/// `bounds`, each 1 px, the separator on the left in a right-to-left window. +pub fn header_lines(bounds: Rect, direction: LayoutDirection) -> [Rect; 2] { + let w = HEADER_LINE_WIDTH; + let bottom = Rect::new(bounds.x, bounds.y + bounds.height - w, bounds.width, w); + let x = match direction { + LayoutDirection::LeftToRight => bounds.x + bounds.width - w, + LayoutDirection::RightToLeft => bounds.x, + }; + [bottom, Rect::new(x, bounds.y, w, bounds.height)] +} + +/// The chrome of a Breeze header section, painted behind its label. +struct BreezeHeaderSection { + is_hovered: Signal, + is_resizing: Signal, + /// Fixed for the build: the header cell is rebuilt when its sort + /// changes. + sorted_down: bool, +} + +impl std::fmt::Debug for BreezeHeaderSection { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeHeaderSection").finish() + } +} + +impl Widget for BreezeHeaderSection { + fn build(&mut self, ctx: &mut BuildContext) -> Vec { + let id = ctx.self_id(); + let registry = ctx.binding_registry(); + self.is_hovered + .bind_to(id, registry, BindingLevel::RepaintOnly); + self.is_resizing + .bind_to(id, registry, BindingLevel::RepaintOnly); + vec![] + } + + fn layout_response(&self, proposal: SizeProposal, _ctx: &LayoutContext) -> LayoutResponse { + proposal.resolve(0.0, 0.0).into() + } + + fn place_children( + &self, + _bounds: Rect, + _proposal: SizeProposal, + _children: &mut [WidgetPlacement], + _ctx: &LayoutContext, + ) { + } + + fn paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext) { + let c = + BreezeHeaderColors::resolve(ctx.theme, ctx.window_active, ctx.prefers_high_contrast); + canvas.fill_rect( + bounds, + c.fill( + self.is_hovered.get(), + self.is_resizing.get() || self.sorted_down, + ), + ); + for line in header_lines(bounds, ctx.layout_direction) { + canvas.fill_rect(line, c.line); + } + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + // Presentational: the header cell announces its column. + builder.set_hidden(); + } +} + +/// A header's sort arrow: the 10 px Breeze chevron, pointing down for a +/// descending sort and up for an ascending one. +struct BreezeSortArrow { + direction: SortDirection, +} + +impl std::fmt::Debug for BreezeSortArrow { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeSortArrow").finish() + } +} + +impl Widget for BreezeSortArrow { + fn layout_response(&self, _proposal: SizeProposal, _ctx: &LayoutContext) -> LayoutResponse { + // `[M]` The header's 10 px arrow. + let side = crate::geometry::HEADER_ARROW_SIZE; + teksilo_canvas::Size::new(side, side).into() + } + + fn paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext) { + let c = + BreezeHeaderColors::resolve(ctx.theme, ctx.window_active, ctx.prefers_high_contrast); + let direction = match self.direction { + SortDirection::Ascending => ArrowDirection::Up, + SortDirection::Descending => ArrowDirection::Down, + }; + paint_arrow(canvas, bounds, direction, c.arrow); + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + // The header announces its sort direction. + builder.set_hidden(); + } +} + +/// `[Hp]` The fill of a table row: a selected row the highlight (the +/// inactive one in an inactive window), a hovered one the highlight at 30 % +/// over the view, an alternate one the alternate background, otherwise +/// nothing. +pub fn table_row_fill( + theme: &Theme, + selected: bool, + hovered: bool, + alt: bool, + window_active: bool, +) -> Option { + let c = &theme.colors; + if selected { + Some(if window_active { + c.surface_selected + } else { + c.surface_selected_inactive + }) + } else if hovered { + Some(c.accent.with_alpha(ROW_HOVER_ALPHA)) + } else if alt { + Some(c.surface_alt_row) + } else { + None + } +} + +/// The background of one Breeze table row, for a style author who composes +/// rows from [`TableStyle::make_row_background`]. Square, as Breeze paints +/// table cells. +struct BreezeTableRowBackground { + is_selected: Signal, + is_hovered: Signal, + is_alt: bool, + is_window_active: Option>, +} + +impl std::fmt::Debug for BreezeTableRowBackground { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BreezeTableRowBackground").finish() + } +} + +impl Widget for BreezeTableRowBackground { + fn build(&mut self, ctx: &mut BuildContext) -> Vec { + let id = ctx.self_id(); + let registry = ctx.binding_registry(); + self.is_selected + .bind_to(id, registry, BindingLevel::RepaintOnly); + self.is_hovered + .bind_to(id, registry, BindingLevel::RepaintOnly); + if let Some(active) = &self.is_window_active { + active.bind_to(id, registry, BindingLevel::RepaintOnly); + } + vec![] + } + + fn layout_response(&self, proposal: SizeProposal, _ctx: &LayoutContext) -> LayoutResponse { + proposal.resolve(0.0, 0.0).into() + } + + fn paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext) { + let window_active = self + .is_window_active + .as_ref() + .map_or(ctx.window_active, Signal::get); + if let Some(fill) = table_row_fill( + ctx.theme, + self.is_selected.get(), + self.is_hovered.get(), + self.is_alt, + window_active, + ) { + canvas.fill_rect(bounds, fill); + } + } + + fn accessibility(&self, builder: &mut AccessNodeBuilder) { + builder.set_hidden(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_kde_scheme::KdeColor; + use teksilo_tokens::TargetDensity; + + fn rgba8(c: Color) -> [u8; 4] { + KdeColor::from_color(c).to_rgba8() + } + + /// Whether two colours are within one step a channel: Qt's raster + /// painter rounds an 8-bit blend its own way. + fn near(a: [u8; 4], b: [u8; 4]) -> bool { + a.iter().zip(b).all(|(x, y)| x.abs_diff(y) <= 1) + } + + /// `c` composited over the opaque `under`, in 8 bits. + fn over(c: Color, under: Color) -> [u8; 4] { + rgba8(kde_mix(under, c.with_alpha(1.0), f64::from(c.a()))) + } + + #[test] + fn the_heights_and_padding_are_breezes_at_every_density() { + for (density, row, header) in [ + (TargetDensity::Compact, 24.0, 30.0), + (TargetDensity::Comfortable, 32.0, 32.0), + (TargetDensity::Touch, 44.0, 44.0), + ] { + let theme = crate::light().with_density(density); + let s = BreezeTableStyle::for_theme(&theme); + assert_eq!(s.row_height(&theme.input), row, "{density:?}"); + assert_eq!(s.header_height(&theme.input), header, "{density:?}"); + } + let s = BreezeTableStyle::default(); + let t = InputTokens::default(); + assert_eq!(s.cell_padding_horizontal(&t), 6.0); + assert_eq!(s.cell_padding_vertical(&t), 6.0); + assert_eq!(s.grid(), TableGridRecipe::default()); + } + + /// The header section Plasma painted in Breeze Light: the button colour, + /// its hover and pressed mixes, and the line in the window text at the + /// frame contrast over each. + #[test] + fn breeze_lights_header_is_plasmas() { + let c = BreezeHeaderColors::resolve(&crate::light(), true, false); + assert_eq!(rgba8(c.rest), [252, 252, 252, 255], "#fcfcfc"); + assert_eq!(rgba8(c.hovered), [214, 236, 248, 255], "#d6ecf8"); + assert_eq!(rgba8(c.pressed), [214, 236, 248, 255], "#d6ecf8"); + assert!(near(over(c.line, c.rest), [209, 210, 210, 255]), "#d1d2d2"); + assert!( + near(over(c.line, c.hovered), [178, 197, 206, 255]), + "#b2c5ce" + ); + assert_eq!(c.fill(true, true), c.pressed); + assert_eq!(c.fill(true, false), c.hovered); + assert_eq!(c.fill(false, false), c.rest); + } + + /// In a scheme whose view focus and hover decorations differ, the + /// pressed section moves toward the focus colour and the hovered one + /// toward the hover colour. Breeze Light's two are the same colour, so + /// only such a scheme tells the two mixes apart. + #[test] + fn the_pressed_section_mixes_toward_focus_and_the_hovered_toward_hover() { + let (scheme, diagnostics) = teksilo_kde_scheme::KdeColorScheme::parse( + "[Colors:View]\nDecorationFocus=61,174,233\nDecorationHover=246,116,0\n", + ); + assert!(diagnostics.is_empty(), "{diagnostics:?}"); + let theme = crate::from_scheme(&scheme); + let b = theme + .extension::() + .unwrap() + .breeze_colors(ColorState::Active, false); + // Premise: the scheme's two decorations are the ones written. + assert_eq!(rgba8(b.focus), [61, 174, 233, 255]); + assert_eq!(rgba8(b.hover), [246, 116, 0, 255]); + let c = BreezeHeaderColors::resolve(&theme, true, false); + assert_eq!(c.pressed, kde_mix(b.button, b.focus, HEADER_STATE_MIX)); + assert_eq!(c.hovered, kde_mix(b.button, b.hover, HEADER_STATE_MIX)); + assert_ne!(c.pressed, c.hovered); + assert_eq!(c.fill(true, true), c.pressed); + assert_eq!(c.fill(true, false), c.hovered); + } + + #[test] + fn the_ascending_column_is_the_one_sorted_down() { + assert!(sorts_down(Some(SortDirection::Ascending))); + assert!(!sorts_down(Some(SortDirection::Descending))); + assert!(!sorts_down(None)); + } + + #[test] + fn the_header_lines_run_along_the_bottom_and_the_trailing_edge() { + let b = Rect::new(10.0, 20.0, 100.0, 30.0); + let [bottom, side] = header_lines(b, LayoutDirection::LeftToRight); + assert_eq!( + (bottom.x, bottom.y, bottom.width, bottom.height), + (10.0, 49.0, 100.0, 1.0) + ); + assert_eq!( + (side.x, side.y, side.width, side.height), + (109.0, 20.0, 1.0, 30.0) + ); + let [_, rtl] = header_lines(b, LayoutDirection::RightToLeft); + assert_eq!(rtl.x, 10.0); + } + + #[test] + fn a_table_row_is_filled_by_state() { + let t = crate::light(); + let c = &t.colors; + assert_eq!( + table_row_fill(&t, true, true, true, true), + Some(c.surface_selected) + ); + assert_eq!( + table_row_fill(&t, true, false, false, false), + Some(c.surface_selected_inactive) + ); + assert_eq!( + table_row_fill(&t, false, true, true, true), + Some(c.accent.with_alpha(0.3)) + ); + assert_eq!( + table_row_fill(&t, false, false, true, true), + Some(c.surface_alt_row) + ); + assert_eq!(table_row_fill(&t, false, false, false, true), None); + } + + #[test] + fn the_header_paints_from_the_roles_without_the_palette() { + let mut bare = crate::light(); + bare.extensions.remove::(); + let c = BreezeHeaderColors::resolve(&bare, true, false); + assert_eq!(c.rest, bare.colors.surface_raised); + assert_eq!(c.line, bare.colors.border); + } +} diff --git a/crates/teksilo-theme-kde/tests/mount.rs b/crates/teksilo-theme-kde/tests/mount.rs index 378b5336b..7175d6460 100644 --- a/crates/teksilo-theme-kde/tests/mount.rs +++ b/crates/teksilo-theme-kde/tests/mount.rs @@ -4,7 +4,9 @@ //! Mount every widget the Breeze preset restyles, in both schemes, render //! it, and check the colours it paints against Plasma's own: the buttons, //! the check box, the radio button, the switch, the line edit, the combo -//! box, the spin box, the slider, the menu, the popup frame and the tooltip. +//! box, the spin box, the slider, the menu, the popup frame, the tooltip, +//! the list and tree rows, the table, the tab, the scroll bar and the +//! progress bar. //! //! The unit tests beside each style check its rules. This checks that the //! styles run: a Tier-3 style is only exercised when its widget is built, @@ -24,23 +26,30 @@ use std::rc::Rc; use std::time::Duration; use serde_json::Value; -use teksilo_canvas::{MockTextBackend, RenderFrame, ShapeKind, SizeProposal}; +use teksilo_canvas::{FillRule, MockTextBackend, Path, RenderFrame, ShapeKind, SizeProposal}; use teksilo_core::build_context::BuildContext; use teksilo_core::event::{Key, Modifiers, PointerButton}; use teksilo_core::overlay::OverlayPlacement; use teksilo_core::signal::Signal; +use teksilo_core::styles::TabIndicatorPosition; use teksilo_core::styles::{PopoverStyleConfig, PopoverVariant, Theme}; use teksilo_core::widget::{LayoutContext, LayoutResponse, Widget}; use teksilo_core::widget_id::WidgetId; use teksilo_core::widget_tree::WidgetTree; +use teksilo_data::{ListModel, TreeModel}; use teksilo_i18n::lit; use teksilo_theme_kde::styles::indicator::BreezeIndicatorColors; +use teksilo_theme_kde::styles::table::BreezeHeaderColors; use teksilo_theme_kde::{self as kde, KdePalette, PlasmaAccent}; -use teksilo_tokens::Color; +use teksilo_tokens::{Color, Orientation}; use teksilo_widgets::primitives::{FixedSize, HStack, IconWidget, TextWidget}; +use teksilo_widgets::scroll_bar::{ScrollBar, ScrollBarOrientation, ScrollBarVariant}; +use teksilo_widgets::tab_widget::{TabBar, TabDelegate, TabId, TabSizing}; +use teksilo_widgets::table_view::{Column, ColumnWidth, SortDirection}; use teksilo_widgets::{ Button, ButtonVariant, CheckState, Checkbox, ComboBox, IconButton, IconButtonSize, MenuItem, - MenuList, RadioButton, Slider, SpinBox, SplitButton, TextInput, Toggle, TooltipWidget, VStack, + MenuList, ProgressBar, RadioButton, Slider, SpinBox, SplitButton, StandardListItem, + StandardTreeItem, TableView, TextInput, Toggle, TooltipWidget, TreeTableView, VStack, }; const PIXELS_JSON: &str = include_str!(concat!( @@ -2965,3 +2974,761 @@ fn a_popover_is_a_breeze_popup_with_no_caret() { } } } + +// ── Rows, tables, tabs, scroll bars and progress bars ─────────────────── + +/// Every plain rectangle in `frame` (`Canvas::fill_rect`): its colour in 8 +/// bits and its rectangle. +fn decorations(frame: &RenderFrame) -> Vec<([u8; 4], [f32; 4])> { + frame + .decorations + .iter() + .map(|d| (rgba8(d.color), d.rect)) + .collect() +} + +/// A two-tab bar, the first tab selected, laid out at its own height. +fn tab_bar(vertical: bool) -> TabBar<(TabId, &'static str)> { + let first = TabId::fresh(); + let model = ListModel::from_vec(vec![(first, "Tab"), (TabId::fresh(), "Second")]); + let delegate = TabDelegate::new(|_, t: &(TabId, &'static str)| lit!(t.1)); + let selected: Signal> = Signal::new(Some(first)); + let bar = if vertical { + TabBar::vertical(model, delegate, selected, |_, t| t.0) + } else { + TabBar::horizontal(model, delegate, selected, |_, t| t.0) + }; + bar.tab_sizing(TabSizing::Independent) + .show_scroll_arrows(false) + .show_overflow_dropdown(false) +} + +fn name_column(label: fn(&T) -> String) -> Column { + Column::new("name", lit!("Name"), move |row: &T, _| { + Box::new(TextWidget::new(lit!(label(row)))) + }) + .width(ColumnWidth::Fixed(160.0)) +} + +fn table() -> TableView { + let model = ListModel::from_vec(vec!["alpha".to_string(), "beta".into(), "gamma".into()]); + TableView::new(model).add_column(name_column(|s: &String| s.clone())) +} + +fn tree_table() -> TreeTableView { + let model: TreeModel = TreeModel::new(); + for (i, name) in ["alpha", "beta"].into_iter().enumerate() { + model.insert_root(i, name.to_string()); + } + TreeTableView::new(model).add_column(name_column(|s: &String| s.clone())) +} + +fn scroll_bar(orientation: ScrollBarOrientation, variant: ScrollBarVariant) -> ScrollBar { + ScrollBar::new( + orientation, + Signal::new(0.0), + Signal::new(100.0), + Signal::new(0.16), + ) + .thickness(21.0) + .variant(variant) +} + +/// Every widget this section restyles, in a column, for the swap, the +/// palette-less and the swatch tests. +fn rows_and_bars() -> VStack { + VStack::new() + .child( + FixedSize::new() + .width(300.0) + .child(StandardListItem::new(lit!("Row"))), + ) + .child( + FixedSize::new() + .width(300.0) + .child(StandardListItem::new(lit!("Picked")).selected(Signal::new(true))), + ) + .child( + FixedSize::new() + .width(300.0) + .child(StandardTreeItem::new(lit!("Node")).depth(1)), + ) + .child(FixedSize::new().width(300.0).height(120.0).child(table())) + .child(tab_bar(false)) + .child(FixedSize::new().width(21.0).height(100.0).child(scroll_bar( + ScrollBarOrientation::Vertical, + ScrollBarVariant::Permanent, + ))) + .child(FixedSize::new().width(200.0).child(ProgressBar::new(0.4))) + .child( + FixedSize::new() + .width(200.0) + .child(ProgressBar::indeterminate()), + ) +} + +#[test] +fn rows_tables_tabs_and_bars_mount_in_every_state_and_variant() { + for (_, theme) in themes() { + for row in [ + StandardListItem::new(lit!("Row")), + StandardListItem::new(lit!("Row")).selected(Signal::new(true)), + StandardListItem::new(lit!("Row")).checkbox(Signal::new(true)), + StandardListItem::new(lit!("Row")) + .leading_slot(IconWidget::checkmark(16.0)) + .subtitle(lit!("Below")), + StandardListItem::new(lit!("Row")) + .selected(Signal::new(true)) + .enabled(Signal::new(false)), + ] { + assert!(mount(theme.clone(), FixedSize::new().width(300.0).child(row)) > 0); + } + assert!( + mount( + theme.clone(), + FixedSize::new() + .width(300.0) + .child(StandardTreeItem::new(lit!("Node")).selected(Signal::new(true))) + ) > 0 + ); + assert!(mount(theme.clone(), table()) > 0); + assert!(mount(theme.clone(), tree_table()) > 0); + for vertical in [false, true] { + assert!(mount(theme.clone(), tab_bar(vertical)) > 0); + assert!( + mount( + theme.clone(), + tab_bar(vertical).active_indicator(TabIndicatorPosition::InnerEdge) + ) > 0 + ); + } + for orientation in [ + ScrollBarOrientation::Vertical, + ScrollBarOrientation::Horizontal, + ] { + for variant in [ + ScrollBarVariant::Permanent, + ScrollBarVariant::Overlay, + ScrollBarVariant::Thin, + ] { + assert!(mount(theme.clone(), scroll_bar(orientation, variant)) > 0); + } + } + for orientation in [Orientation::Horizontal, Orientation::Vertical] { + assert!( + mount( + theme.clone(), + ProgressBar::new(0.4).orientation(orientation) + ) > 0 + ); + assert!( + mount( + theme.clone(), + ProgressBar::indeterminate().orientation(orientation) + ) > 0 + ); + } + } +} + +#[test] +fn the_rows_and_bars_survive_a_theme_swap_and_every_swatch() { + let mut tree = tree_with(kde::light()); + tree.add(rows_and_bars()); + for theme in [ + kde::light(), + kde::dark(), + teksilo_core::presets::intui::light(), + kde::light(), + ] { + tree.set_theme(theme); + assert!(!rerender(&mut tree).draw_order.is_empty()); + } + for accent in PlasmaAccent::ALL { + for theme in [ + kde::light_with_accent(accent.color()), + kde::dark_with_accent(accent.color()), + ] { + assert!(mount(theme, rows_and_bars()) > 0, "{accent:?}"); + } + } + let mut bare = kde::light(); + bare.extensions.remove::(); + assert!(mount(bare, rows_and_bars()) > 0); +} + +/// A row of `width` holding `row`, alone at the top of a tree under `theme`. +fn row_tree(theme: Theme, width: f32, row: StandardListItem) -> (WidgetTree, WidgetId) { + let mut tree = tree_with(theme); + let column = tree.add(VStack::new().child(FixedSize::new().width(width).child(row))); + tree.layout(SizeProposal::exact(600.0, 300.0)); + let id = nodes_named(&tree, column, "StandardListItem")[0]; + (tree, id) +} + +/// The selection inside the row `b`: the row inset by the 2 px and 1 px +/// item margins, then by half the pen. +fn row_selection(b: teksilo_canvas::Rect) -> [f32; 4] { + [b.x + 2.5, b.y + 1.5, b.width - 5.0, b.height - 3.0] +} + +/// A selected row is filled and outlined with Plasma's highlight inside its +/// item margins, its label in the text on the accent, and the selection +/// spans the whole width the row is given. +#[test] +fn a_selected_row_is_the_highlight_with_on_accent_glyphs() { + for (scheme, theme) in themes() { + let accent = rgba8_of(theme.colors.accent); + assert_eq!(accent, sample(scheme, "item_view_row.selected", 100, 12)); + let on_accent = rgba8_of(theme.colors.text_on_accent); + let primary = rgba8_of(theme.colors.text_primary); + assert_ne!(on_accent, primary, "the flip is visible"); + for width in [200.0, 480.0] { + let (mut tree, id) = row_tree( + theme.clone(), + width, + StandardListItem::new(lit!("Row")).selected(Signal::new(true)), + ); + let b = tree.bounds(id); + assert_eq!((b.width, b.height), (width, 24.0), "{scheme}: the row"); + let frame = rerender(&mut tree); + let all = painted(&frame); + let fill = all + .iter() + .find(|p| p.stroke == 0.0 && p.color == accent) + .unwrap_or_else(|| panic!("{scheme}: no highlight in {all:?}")); + assert_eq!(fill.screen, row_selection(b), "{scheme}: fills the row"); + assert_eq!(fill.radius, 4.5); + assert!( + all.iter() + .any(|p| p.stroke == 1.0 && p.color == accent && p.screen == fill.screen), + "{scheme}: the opaque outline" + ); + let glyphs: Vec<_> = frame.glyphs.iter().map(|g| rgba8(g.color)).collect(); + assert!(!glyphs.is_empty()); + assert!( + glyphs.iter().all(|g| *g == on_accent), + "{scheme}: {glyphs:?}" + ); + } + } +} + +/// An unselected row at rest paints nothing but its label. +#[test] +fn an_unselected_row_paints_nothing() { + for (scheme, theme) in themes() { + let (mut tree, _) = row_tree(theme.clone(), 300.0, StandardListItem::new(lit!("Row"))); + let frame = rerender(&mut tree); + assert!( + painted(&frame).iter().all(|p| p.color[3] == 0), + "{scheme}: {:?}", + painted(&frame) + ); + assert!( + decorations(&frame).iter().all(|(c, _)| c[3] == 0), + "{scheme}: {:?}", + decorations(&frame) + ); + assert!(frame.paths.is_empty()); + let primary = rgba8_of(theme.colors.text_primary); + assert!(frame.glyphs.iter().all(|g| rgba8(g.color) == primary)); + } +} + +/// A hovered row is washed with the highlight at 30 % over the view and +/// outlined in it at 80 %, as Plasma paints it. +#[test] +fn a_hovered_row_is_washed_and_outlined_in_the_highlight() { + for (scheme, theme) in themes() { + let (mut tree, id) = row_tree(theme.clone(), 200.0, StandardListItem::new(lit!("Row"))); + tree.pointer_move(tree.bounds(id).center()); + let frame = rerender(&mut tree); + let b = tree.bounds(id); + let all = painted(&frame); + let wash = all + .iter() + .find(|p| p.stroke == 0.0 && p.screen == row_selection(b)) + .unwrap_or_else(|| panic!("{scheme}: no wash in {all:?}")); + assert!( + near(wash.color, sample(scheme, "item_view_row.hover", 100, 12)), + "{scheme}: {:?}", + wash.color + ); + let outline = all + .iter() + .find(|p| p.stroke == 1.0 && p.screen == row_selection(b)) + .expect("an outline"); + let mut want = rgba8_of(theme.colors.accent); + want[3] = 204; + assert_eq!(outline.color, want, "{scheme}: the highlight at 80 %"); + } +} + +/// In a backdrop window a selected row is Plasma's inactive highlight, the +/// window colour tinted toward the selection, and its label the window +/// text. +#[test] +fn a_selected_row_in_a_backdrop_window_is_the_inactive_highlight() { + for (scheme, theme) in themes() { + let (mut tree, _) = row_tree( + theme.clone(), + 200.0, + StandardListItem::new(lit!("Row")).selected(Signal::new(true)), + ); + tree.set_window_active(false); + let frame = rerender(&mut tree); + let want = sample(scheme, "item_view_row.selected_inactive_window", 100, 12); + assert!( + fills(&frame).contains(&want), + "{scheme}: {:?}", + fills(&frame) + ); + let primary = rgba8_of(theme.colors.text_primary); + assert!(frame.glyphs.iter().all(|g| rgba8(g.color) == primary)); + } +} + +/// Every filled path in `frame`: its colour in 8 bits and the path. +fn filled_paths(frame: &RenderFrame) -> Vec<([u8; 4], Path)> { + frame + .paths + .iter() + .filter(|p| p.stroke_style.width == 0.0) + .map(|p| (rgba8(p.color), p.path.clone())) + .collect() +} + +fn covers(path: &Path, x: f32, y: f32) -> bool { + path.contains_point(teksilo_canvas::Point::new(x, y), FillRule::Winding, 0.01) +} + +/// Whether `r` is `[x, y, w, h]` to a hundredth of a pixel. +fn about(r: teksilo_canvas::Rect, want: [f32; 4]) -> bool { + [r.x, r.y, r.width, r.height] + .iter() + .zip(want) + .all(|(a, b)| (a - b).abs() < 0.01) +} + +/// The headers of a two-tab bar: the selected one first. +fn tab_headers(theme: Theme, vertical: bool) -> (WidgetTree, Vec) { + let mut tree = tree_with(theme); + let bar = tree.add(tab_bar(vertical)); + tree.layout(SizeProposal { + width: Some(800.0), + height: if vertical { Some(400.0) } else { None }, + }); + let headers = nodes_named(&tree, bar, "TabHeader") + .into_iter() + .map(|h| tree.bounds(h)) + .collect(); + (tree, headers) +} + +/// The selected tab: the highlight in a 3 px bar along its top, its +/// rounded outer corners at the frame radius, the window colour below it +/// and the frame outline down its two sides, both still turning through the +/// bar's corner in rows 3 and 4; the unselected tab the window darkened, and +/// hovered washed toward the hover colour. Against Plasma's samples of an +/// 80 x 30 tab. +#[test] +fn the_selected_tab_has_breezes_three_pixel_bar() { + for (scheme, theme) in themes() { + let (mut tree, headers) = tab_headers(theme, false); + let (sel, other) = (headers[0], headers[1]); + assert_eq!(sel.height, 30.0, "{scheme}"); + let frame = tree.render(); + let paths = filled_paths(&frame); + let rects = decorations(&frame); + let highlight = sample(scheme, "tab.selected", 40, 1); + let bar = &paths + .iter() + .find(|(color, _)| *color == highlight) + .unwrap_or_else(|| panic!("{scheme}: no bar in {paths:?}")) + .1; + let bb = bar.exact_bounds(0.01); + assert!((bb.y - sel.y).abs() < 0.01 && (bb.height - 3.0).abs() < 0.01); + assert!(bb.x > sel.x && bb.x < sel.x + 0.5, "{scheme}: {bb:?}"); + assert!(covers(bar, sel.x + 40.0, sel.y + 1.5)); + assert!(!covers(bar, sel.x + 0.3, sel.y + 0.3), "the outer corner"); + let window = sample(scheme, "tab.selected", 40, 15); + let face = &paths + .iter() + .find(|(color, _)| *color == window) + .unwrap_or_else(|| panic!("{scheme}: no tab face in {paths:?}")) + .1; + assert!( + about( + face.bounds(), + [sel.x + 1.0, sel.y + 3.0, sel.width - 2.0, sel.height - 3.0] + ), + "{scheme}: the bar shows 3 px: {:?}", + face.bounds() + ); + let outline = sample(scheme, "tab.selected", 0, 15); + let sides = &paths + .iter() + .find(|(color, _)| near(*color, outline)) + .unwrap_or_else(|| panic!("{scheme}: no outline in {paths:?}")) + .1; + assert!(about( + sides.bounds(), + [sel.x, sel.y + 3.0, sel.width, sel.height - 3.0] + )); + for x in [sel.x + 0.5, sel.x + sel.width - 0.5] { + assert!( + covers(sides, x, sel.y + 15.0) && !covers(face, x, sel.y + 15.0), + "{scheme}: the outline down both sides" + ); + } + // Rows 3 and 4: the corner is still turning, as Plasma's column 0 + // is still blended there; the body is not square below the bar. + assert!(!covers(sides, sel.x + 0.1, sel.y + 3.1), "{scheme}"); + assert!(covers(sides, sel.x + 0.5, sel.y + 4.5), "{scheme}"); + assert!(!covers(face, sel.x + 0.9, sel.y + 4.5), "{scheme}"); + assert_ne!( + sample(scheme, "tab.selected", 0, 4), + outline, + "{scheme}: Plasma's corner at row 4" + ); + let other_rect = [other.x, other.y, other.width, other.height]; + let unselected = rects + .iter() + .find(|(_, r)| *r == other_rect) + .unwrap_or_else(|| panic!("{scheme}: no unselected tab")); + assert!(near(unselected.0, sample(scheme, "tab.unselected", 40, 15))); + tree.pointer_move(other.center()); + tree.layout(SizeProposal { + width: Some(800.0), + height: None, + }); + let frame = tree.render(); + let hovered = decorations(&frame) + .into_iter() + .find(|(_, r)| *r == other_rect) + .unwrap(); + assert!( + near(hovered.0, sample(scheme, "tab.hover", 40, 15)), + "{scheme}: {:?}", + hovered.0 + ); + } +} + +/// A vertical bar's selected tab carries its bar on the leading side, the +/// left, and on the right in a right-to-left window. +#[test] +fn a_vertical_tabs_bar_is_on_its_leading_side() { + for rtl in [false, true] { + let mut tree = tree_with(kde::light()); + if rtl { + tree.set_layout_direction(teksilo_core::environment::LayoutDirection::RightToLeft); + } + let bar = tree.add(tab_bar(true)); + tree.layout(SizeProposal::exact(400.0, 400.0)); + let sel = tree.bounds(nodes_named(&tree, bar, "TabHeader")[0]); + let frame = tree.render(); + let window = sample("BreezeLight", "tab.selected", 40, 15); + let (_, face) = filled_paths(&frame) + .into_iter() + .find(|(color, _)| *color == window) + .expect("a tab face"); + let x = if rtl { sel.x } else { sel.x + 3.0 }; + assert!( + about( + face.bounds(), + [x, sel.y + 1.0, sel.width - 3.0, sel.height - 2.0] + ), + "rtl {rtl}: {:?}", + face.bounds() + ); + } +} + +/// A 21 px scroll bar: the separator in its leading column in the view's +/// text at the frame contrast, Plasma's pixels, and the handle 7 px from it +/// in the lifted thumb colour, 8 px wide painted 7 at radius 4, turning to +/// the lifted hover colour under the pointer. No track. +#[test] +fn the_scroll_bar_is_a_separator_and_a_handle_over_no_track() { + for (scheme, theme) in themes() { + let mut tree = tree_with(theme.clone()); + let bar = tree.add(scroll_bar( + ScrollBarOrientation::Vertical, + ScrollBarVariant::Permanent, + )); + tree.layout(SizeProposal::exact(21.0, 200.0)); + let frame = tree.render(); + let all = painted(&frame); + let window = rgba8_of(theme.colors.surface_main); + let separator = decorations(&frame) + .into_iter() + .find(|(_, r)| *r == [0.0, 0.0, 1.0, 200.0]) + .unwrap_or_else(|| panic!("{scheme}: no separator")); + assert!(near( + over(separator.0, window), + sample(scheme, "scroll_bar.normal", 0, 150) + )); + let thumb = rgba8_of(theme.colors.scrollbar_thumb); + let handle = all + .iter() + .find(|p| p.stroke == 0.0 && p.color == thumb) + .unwrap_or_else(|| panic!("{scheme}: no handle")); + assert_eq!(handle.screen, [7.5, 0.5, 7.0, 31.0], "{scheme}"); + // Breeze's radius 4, which the renderer holds to half the painted + // width. + assert_eq!(handle.radius, 3.5); + assert!( + all.iter() + .any(|p| p.stroke == 1.0 && p.screen == handle.screen), + "{scheme}: the handle's outline" + ); + assert_eq!(all.len(), 2, "{scheme}: no track: {all:?}"); + assert_eq!(frame.decorations.len(), 1, "{scheme}: the separator alone"); + tree.pointer_move(tree.bounds(bar).center()); + tree.layout(SizeProposal::exact(21.0, 200.0)); + let frame = tree.render(); + let hover = rgba8_of(theme.colors.scrollbar_thumb_hover); + assert!(fills(&frame).contains(&hover), "{scheme}"); + } +} + +/// A determinate bar is Qt's 26 px, its 6 px groove 10 px down, the groove +/// and the contents to the half way point in Plasma's colours; right to +/// left the contents start at the right. +#[test] +fn the_progress_bar_is_breezes_groove_and_contents() { + for (scheme, theme) in themes() { + for rtl in [false, true] { + let mut tree = tree_with(theme.clone()); + if rtl { + tree.set_layout_direction(teksilo_core::environment::LayoutDirection::RightToLeft); + } + let column = tree.add( + VStack::new().child(FixedSize::new().width(200.0).child(ProgressBar::new(0.5))), + ); + tree.layout(SizeProposal::exact(400.0, 300.0)); + let bar = nodes_named(&tree, column, "ProgressBar")[0]; + let b = tree.bounds(bar); + assert_eq!(b.height, 26.0, "{scheme}: Qt's hint"); + let frame = rerender(&mut tree); + let all = painted(&frame); + let groove = all + .iter() + .find(|p| p.stroke == 0.0 && p.screen == [b.x + 0.5, b.y + 10.5, 199.0, 5.0]) + .unwrap_or_else(|| panic!("{scheme}: no groove in {all:?}")); + if scheme == "BreezeLight" { + assert!(near( + groove.color, + sample(scheme, "progress_bar.half", 150, 9) + )); + } + // Breeze's radius 3, held to half the stroked groove. + assert_eq!(groove.radius, 2.5); + let x = if rtl { b.x + 100.5 } else { b.x + 0.5 }; + let contents = all + .iter() + .find(|p| p.stroke == 0.0 && p.screen == [x, b.y + 10.5, 99.0, 5.0]) + .unwrap_or_else(|| panic!("{scheme} rtl {rtl}: no contents in {all:?}")); + if scheme == "BreezeLight" { + assert!(near( + contents.color, + sample(scheme, "progress_bar.half", 50, 9) + )); + } + assert!(frame.animated_quads.is_empty()); + } + } +} + +/// A busy bar is the style's stripes, 14 px of the highlight every 28 px, +/// which move forward 7 px in 200 ms and 14 px in 400 ms on the tree's clock and stand still under +/// reduced motion. The bar draws no sweep of its own. +#[test] +fn a_busy_progress_bar_moves_its_stripes() { + let theme = kde::light(); + let highlight = rgba8_of(theme.colors.accent); + let stripes = |frame: &RenderFrame| -> Vec<[f32; 4]> { + painted(frame) + .into_iter() + .filter(|p| p.stroke == 0.0 && p.color == highlight) + .map(|p| p.screen) + .collect() + }; + let (mut tree, bar) = on_the_clock( + theme.clone(), + false, + FixedSize::new() + .width(200.0) + .child(ProgressBar::indeterminate()), + ); + let x0 = tree.bounds(bar).x; + let first = stripes(&rerender(&mut tree)); + assert!(rerender(&mut tree).animated_quads.is_empty()); + assert_eq!(first[0][0] - x0, 0.0); + assert_eq!(first[0][2], 14.0); + assert_eq!(first[1][0] - first[0][0], 28.0); + // A quarter of a period on, the stripes have moved 7 px forward, toward + // the end of the groove: moving back would put a stripe at the start. + let quarter = stripes(&tick(&mut tree, 200)); + assert!( + (quarter[0][0] - x0 - 7.0).abs() < 1.0, + "a quarter period on: {quarter:?}" + ); + assert!((quarter[0][2] - 14.0).abs() < 1.0, "{quarter:?}"); + let later = stripes(&tick(&mut tree, 200)); + assert!( + (later[0][0] - x0 - 14.0).abs() < 1.0 || (later[1][0] - x0 - 14.0).abs() < 1.0, + "half a period on: {later:?}" + ); + let (mut still, _) = on_the_clock( + theme, + true, + FixedSize::new() + .width(200.0) + .child(ProgressBar::indeterminate()), + ); + let at_rest = stripes(&rerender(&mut still)); + assert_eq!(stripes(&tick(&mut still, 400)), at_rest); +} + +/// A table's header sections are the button colour, outlined at the bottom +/// and trailing edge in the window text at the frame contrast, 30 px tall +/// over 24 px rows; hovered and resized they are Plasma's hovered and +/// sunken sections, and right to left the trailing line is on the left. +#[test] +fn a_table_header_is_breezes_section() { + for (scheme, theme) in themes() { + for rtl in [false, true] { + let mut tree = tree_with(theme.clone()); + if rtl { + tree.set_layout_direction(teksilo_core::environment::LayoutDirection::RightToLeft); + } + let root = tree.add(table()); + tree.layout(SizeProposal::exact(400.0, 300.0)); + let header = nodes_named(&tree, root, "BreezeHeaderSection"); + assert_eq!(header.len(), 1); + let h = tree.bounds(header[0]); + assert_eq!(h.height, 30.0); + let frame = tree.render(); + let rects = decorations(&frame); + let face = rects + .iter() + .find(|(_, r)| *r == [h.x, h.y, h.width, h.height]) + .unwrap_or_else(|| panic!("{scheme}: no section face in {rects:?}")); + assert_eq!(face.0, sample(scheme, "header.normal", 50, 15), "{scheme}"); + let line = rects + .iter() + .find(|(_, r)| *r == [h.x, h.y + 29.0, h.width, 1.0]) + .expect("the bottom line"); + assert!(near( + over(line.0, face.0), + sample(scheme, "header.normal", 50, 29) + )); + let x = if rtl { h.x } else { h.x + h.width - 1.0 }; + let trailing = rects + .iter() + .find(|(_, r)| *r == [x, h.y, 1.0, 30.0]) + .unwrap_or_else(|| panic!("{scheme} rtl {rtl}: no trailing line in {rects:?}")); + assert_eq!(trailing.0, line.0); + } + } +} + +/// The face of the one header section of `root`. +fn header_face(tree: &mut WidgetTree, root: WidgetId) -> [u8; 4] { + tree.layout(SizeProposal::exact(400.0, 300.0)); + let h = tree.bounds(nodes_named(tree, root, "BreezeHeaderSection")[0]); + let frame = tree.render(); + decorations(&frame) + .into_iter() + .find(|(_, r)| *r == [h.x, h.y, h.width, h.height]) + .unwrap_or_else(|| panic!("no section face at {h:?}")) + .0 +} + +/// Hover the section of a table in `theme`, then grab its trailing edge and +/// drag it: the face hovered, and the face while the column resizes. +fn hovered_and_resizing_faces(theme: Theme) -> ([u8; 4], [u8; 4]) { + use teksilo_core::event::WidgetEvent; + let mut tree = tree_with(theme); + let root = tree.add(table()); + tree.layout(SizeProposal::exact(400.0, 300.0)); + let h = tree.bounds(nodes_named(&tree, root, "BreezeHeaderSection")[0]); + tree.pointer_move(h.center()); + let hovered = header_face(&mut tree, root); + let grip = teksilo_canvas::Point::new(h.x + h.width - 1.0, h.y + h.height * 0.5); + let to = teksilo_canvas::Point::new(grip.x + 10.0, grip.y); + tree.pointer_move(grip); + tree.dispatch_event(WidgetEvent::pointer_down( + grip, + PointerButton::Primary, + Modifiers::NONE, + )); + tree.dispatch_event(WidgetEvent::pointer_move(to)); + let resizing = header_face(&mut tree, root); + tree.dispatch_event(WidgetEvent::pointer_up( + to, + PointerButton::Primary, + Modifiers::NONE, + )); + (hovered, resizing) +} + +/// Under the pointer the section is Plasma's hovered one; grabbed by its +/// trailing edge to resize the column, Plasma's sunken one. +#[test] +fn a_hovered_or_resized_header_section_is_plasmas() { + for (scheme, theme) in themes() { + let (hovered, resizing) = hovered_and_resizing_faces(theme); + assert_eq!(hovered, sample(scheme, "header.hover", 50, 15), "{scheme}"); + assert_eq!( + resizing, + sample(scheme, "header.sunken", 50, 15), + "{scheme}" + ); + } +} + +/// Breeze's schemes give the view's focus and hover decorations one +/// colour, so Plasma's hovered and sunken sections match. In a scheme where +/// they differ, the hovered section moves toward the hover colour and the +/// one being resized toward the focus colour. +#[test] +fn a_resized_header_section_turns_toward_the_focus_colour() { + let (scheme, _) = teksilo_kde_scheme::KdeColorScheme::parse( + "[Colors:View]\nDecorationFocus=61,174,233\nDecorationHover=246,116,0\n", + ); + let theme = kde::from_scheme(&scheme); + let colors = BreezeHeaderColors::resolve(&theme, true, false); + assert_ne!(colors.hovered, colors.pressed, "the premise"); + let (hovered, resizing) = hovered_and_resizing_faces(theme); + assert_eq!(hovered, rgba8_of(colors.hovered)); + assert_eq!(resizing, rgba8_of(colors.pressed)); +} + +/// The column sorted down, Qt's indicator for an ascending sort, is +/// painted as Plasma's pressed section; a descending column is not. +#[test] +fn the_column_sorted_down_is_a_pressed_section() { + for (scheme, theme) in themes() { + for (direction, want) in [ + (SortDirection::Ascending, "header.sunken"), + (SortDirection::Descending, "header.normal"), + ] { + let mut tree = tree_with(theme.clone()); + let model = ListModel::from_vec(vec!["alpha".to_string(), "beta".into()]); + let root = tree.add( + TableView::new(model) + .add_column(name_column(|s: &String| s.clone()).sortable(true)) + .bind_sort(Signal::new(Some(("name".to_string(), direction)))), + ); + assert_eq!( + header_face(&mut tree, root), + sample(scheme, want, 50, 15), + "{scheme} {direction:?}" + ); + } + } +} diff --git a/crates/teksilo-theme-kde/tests/preset_metrics.rs b/crates/teksilo-theme-kde/tests/preset_metrics.rs index d3ad84404..90ae76fb7 100644 --- a/crates/teksilo-theme-kde/tests/preset_metrics.rs +++ b/crates/teksilo-theme-kde/tests/preset_metrics.rs @@ -743,3 +743,322 @@ fn a_menu_measures_breezes_rows_at_every_density() { } } } + +// ── List and tree rows ───────────────────────────────────────────────── + +/// The `size_hint_for_row` Qt reported for the Breeze item view `id` at +/// Plasma's default font. +fn qt_row(id: &str) -> f32 { + let all: Value = serde_json::from_str(SIZES_JSON).expect("sizes.json parses"); + all["widgets"] + .as_array() + .expect("the measured widgets") + .iter() + .find(|w| w["id"] == id && w["font"] == "Noto Sans 10") + .unwrap_or_else(|| panic!("sizes.json has no {id}"))["size_hint_for_row"] + .as_f64() + .expect("a row height") as f32 +} + +/// The laid-out height of every `name` row under `root`. +fn heights(tree: &WidgetTree, root: WidgetId, name: &str) -> Vec { + nodes_named(tree, root, name) + .into_iter() + .map(|id| tree.bounds(id).height) + .collect() +} + +/// A column of list rows at `density`: text only, with an icon, with a check +/// box, and with a subtitle; then the same as tree rows. Laid out with no +/// height proposed, so each row takes its own. +fn rows_at(theme: &Theme, density: TargetDensity) -> (Vec, Vec, usize) { + use teksilo_widgets::{StandardListItem, StandardTreeItem}; + let icon = || IconWidget::checkmark(16.0); + let column = teksilo_widgets::VStack::new() + .child(StandardListItem::new(lit!("Text"))) + .child(StandardListItem::new(lit!("Icon")).leading_slot(icon())) + .child(StandardListItem::new(lit!("Check")).checkbox(Signal::new(true))) + .child(StandardListItem::new(lit!("Two")).subtitle(lit!("Lines"))) + .child(StandardTreeItem::new(lit!("Text")).depth(1)) + .child( + StandardTreeItem::new(lit!("Icon")) + .depth(1) + .leading_slot(icon()), + ) + .child( + StandardTreeItem::new(lit!("Check")) + .depth(1) + .checkbox(Signal::new(true)), + ) + .child( + StandardTreeItem::new(lit!("Two")) + .depth(1) + .subtitle(lit!("Lines")), + ); + let mut tree = WidgetTree::new() + .with_theme(theme.with_density(density)) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))); + let root = in_tappable_row(&mut tree, FixedSize::new().width(400.0).child(column)); + tree.layout(SizeProposal { + width: Some(600.0), + height: None, + }); + let failures = target_audit(&tree, density) + .into_iter() + .filter(|v| v.rule.is_conformance_failure()) + .count(); + ( + heights(&tree, root, "StandardListItem"), + heights(&tree, root, "StandardTreeItem"), + failures, + ) +} + +/// A row is Qt's at Compact: 24 px of text, 26 with a 16 px icon or a check +/// box, measured on the laid-out rows; a row with a subtitle is 42. Above +/// Compact every row rises to the density's target size, and a check box +/// row is its check box's node, itself at the target size, with the 1 px +/// item margin above and below it: 34 and 46. A tree row lays out through +/// the list row it wraps. +#[test] +fn a_row_measures_breezes_at_every_density() { + assert_eq!(qt_row("list_view"), 24.0); + assert_eq!(qt_row("list_view.icon"), 26.0); + assert_eq!(qt_row("list_view.check"), 26.0); + assert_eq!(qt_row("tree_view"), 24.0); + assert_eq!(qt_row("tree_view.icon"), 26.0); + let g = BreezeGeometry::breeze_default(); + assert_eq!(g.list_row_height, qt_row("list_view")); + let expected = [ + (TargetDensity::Compact, [24.0, 26.0, 26.0, 42.0]), + (TargetDensity::Comfortable, [32.0, 32.0, 34.0, 42.0]), + (TargetDensity::Touch, [44.0, 44.0, 46.0, 44.0]), + ]; + assert_eq!(expected.len(), ALL_DENSITIES.len(), "every density"); + for (density, rows) in expected { + for theme in themes() { + let (list, tree, failures) = rows_at(&theme, density); + assert_eq!(list, rows.to_vec(), "{density:?}: the list rows"); + assert_eq!(tree, rows.to_vec(), "{density:?}: the tree rows"); + assert_eq!(failures, 0, "{density:?}: a conformance failure"); + } + } +} + +/// The installed row style reports what the rows lay out. +#[test] +fn the_installed_row_style_reports_the_breeze_rows() { + for (density, floors) in [ + (TargetDensity::Compact, (24.0, 26.0, 42.0)), + (TargetDensity::Comfortable, (32.0, 32.0, 42.0)), + (TargetDensity::Touch, (44.0, 44.0, 44.0)), + ] { + let theme = kde::light().with_density(density); + let slot = theme + .style_slots + .standard_item + .clone() + .expect("the preset installs a row style"); + let t = &theme.input; + assert_eq!( + ( + slot.min_height_single_line(t), + slot.min_height_decorated(t), + slot.min_height_two_line(t) + ), + floors, + "{density:?}" + ); + } +} + +// ── Tables ───────────────────────────────────────────────────────────── + +/// The laid-out `(header height, row height)` of a `TableView` and of a +/// `TreeTableView` at `density`, each measured on its hosted header and its +/// first two realized rows, the first starting under the header. +fn table_bands(theme: &Theme, density: TargetDensity) -> [(f32, f32); 2] { + use teksilo_data::{ListModel, TreeModel}; + use teksilo_widgets::table_view::{Column, ColumnWidth}; + use teksilo_widgets::{TableView, TreeTableView}; + + fn bands(tree: &WidgetTree, root: WidgetId) -> (f32, f32) { + let header = nodes_named(tree, root, "TableHeader"); + assert_eq!(header.len(), 1, "one hosted header"); + let mut rows = nodes_named(tree, root, "BodyRow"); + rows.sort_by(|a, b| tree.bounds(*a).y.total_cmp(&tree.bounds(*b).y)); + assert!(rows.len() >= 2, "at least two realized rows"); + let h = tree.bounds(header[0]); + let first = tree.bounds(rows[0]); + assert_eq!( + first.y, + h.y + h.height, + "the first row starts under the header" + ); + assert_eq!(tree.bounds(rows[1]).y - first.y, first.height, "the pitch"); + (h.height, first.height) + } + fn column(label: fn(&T) -> String) -> Column { + Column::new("name", lit!("Name"), move |row: &T, _| { + Box::new(teksilo_widgets::primitives::TextWidget::new(lit!(label( + row + )))) + }) + .width(ColumnWidth::Fixed(200.0)) + } + let mount = |w: Box| { + let mut tree = WidgetTree::new() + .with_theme(theme.with_density(density)) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))); + let root = tree.add_boxed(w); + tree.layout(SizeProposal::exact(400.0, 300.0)); + bands(&tree, root) + }; + let model = ListModel::from_vec(vec!["alpha".to_string(), "beta".into(), "gamma".into()]); + let flat = mount(Box::new( + TableView::new(model).add_column(column(|s: &String| s.clone())), + )); + let model: TreeModel = TreeModel::new(); + for (i, name) in ["alpha", "beta", "gamma"].into_iter().enumerate() { + model.insert_root(i, name.to_string()); + } + let nested = mount(Box::new( + TreeTableView::new(model).add_column(column(|s: &String| s.clone())), + )); + [flat, nested] +} + +/// D7. Qt's Breeze table row is 23 px with its grid line, under the 24 px +/// target size; the laid-out row is 24, the header Qt's 30, at Compact, and +/// both rise to the density's target size above it. +#[test] +fn d7_a_table_row_is_raised_to_the_target_size() { + assert_eq!(qt_row("table_view"), 23.0, "Qt's row, with its grid line"); + assert_eq!(qt_size("header.horizontal", None).1, 30.0); + let g = BreezeGeometry::breeze_default(); + assert_eq!(g.table_row_height, qt_row("table_view")); + assert_eq!(g.header_height, 30.0); + for (density, bands) in [ + (TargetDensity::Compact, (30.0, 24.0)), + (TargetDensity::Comfortable, (32.0, 32.0)), + (TargetDensity::Touch, (44.0, 44.0)), + ] { + for theme in themes() { + assert_eq!(table_bands(&theme, density), [bands; 2], "{density:?}"); + } + let theme = kde::light().with_density(density); + let slot = theme.style_slots.table.clone().expect("a table style"); + assert_eq!( + ( + slot.header_height(&theme.input), + slot.row_height(&theme.input) + ), + bands, + "{density:?}: the installed slot" + ); + } +} + +// ── Tabs ─────────────────────────────────────────────────────────────── + +/// A tab is Qt's 30 px at Compact, its title 8 px inside its edges, rising +/// to the density's target size above it and its padding by the spacing. +#[test] +fn a_tab_measures_breezes_at_every_density() { + use teksilo_data::ListModel; + use teksilo_widgets::tab_widget::{TabBar, TabDelegate, TabId, TabSizing}; + assert_eq!(qt_size("tab_bar", None).1, 30.0); + for (density, height, padding) in [ + (TargetDensity::Compact, 30.0, 8.0), + (TargetDensity::Comfortable, 32.0, 9.2), + (TargetDensity::Touch, 44.0, 10.4), + ] { + for theme in themes() { + let model = + ListModel::from_vec(vec![(TabId::fresh(), "Tab"), (TabId::fresh(), "Third")]); + let delegate = TabDelegate::new(|_, t: &(TabId, &'static str)| lit!(t.1)); + let mut tree = WidgetTree::new() + .with_theme(theme.with_density(density)) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))); + let bar = tree.add( + TabBar::horizontal(model, delegate, Signal::new(None), |_, t| t.0) + .tab_sizing(TabSizing::Independent) + .show_scroll_arrows(false) + .show_overflow_dropdown(false), + ); + tree.layout(SizeProposal { + width: Some(800.0), + height: None, + }); + let headers = nodes_named(&tree, bar, "TabHeader"); + assert_eq!(headers.len(), 2); + for header in headers { + assert_eq!(tree.bounds(header).height, height, "{density:?}"); + let pad = nodes_named(&tree, header, "Padding"); + let outer = tree.bounds(pad[0]); + let row = tree.bounds(tree.children(pad[0])[0]); + assert!( + (row.x - outer.x - padding).abs() < 1e-3, + "{density:?}: padding {}", + row.x - outer.x + ); + } + assert_eq!(tree.bounds(bar).height, height, "{density:?}: the strip"); + } + } +} + +// ── Scroll bars and progress bars ────────────────────────────────────── + +/// A scroll bar's handle is never shorter than Breeze's 20 px, at every +/// density: measured on the thumb the mounted bar reports, the rectangle its +/// hit test and its drag use, over a document fifty viewports long. +#[test] +fn a_scroll_bar_floors_its_handle_at_twenty_pixels_at_every_density() { + use teksilo_widgets::scroll_bar::{SCROLLBAR_PART_THUMB, ScrollBar, ScrollBarOrientation}; + for density in ALL_DENSITIES.iter().copied() { + for theme in themes() { + let mut tree = WidgetTree::new() + .with_theme(theme.with_density(density)) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))); + let bar = tree.add( + ScrollBar::new( + ScrollBarOrientation::Vertical, + Signal::new(0.0), + Signal::new(500.0), + Signal::new(0.02), + ) + .thickness(21.0), + ); + tree.layout(SizeProposal::exact(21.0, 400.0)); + let thumb = tree + .widget_target_regions(bar) + .into_iter() + .find(|r| r.part == SCROLLBAR_PART_THUMB) + .expect("the bar reports its thumb"); + assert_eq!(thumb.rect.height, 20.0, "{density:?}"); + } + } +} + +/// A progress bar is Qt's 26 px at every density, its 6 px groove 10 px +/// down, Qt's groove; a thickness the app sets wins. +#[test] +fn a_progress_bar_is_qts_hint_around_breezes_groove() { + use teksilo_widgets::ProgressBar; + assert_eq!(qt_size("progress_bar.no_text", None).1, 26.0); + assert_eq!(qt_size("progress_bar.vertical", None).0, 26.0); + for density in ALL_DENSITIES.iter().copied() { + for theme in themes() { + let ((_, h), _) = measured(&theme, density, "ProgressBar", ProgressBar::new(0.3)); + assert_eq!(h, 26.0, "{density:?}"); + let ((_, h), _) = measured( + &theme, + density, + "ProgressBar", + ProgressBar::new(0.3).thickness(6.0), + ); + assert_eq!(h, 6.0, "{density:?}: the app's thickness"); + } + } +} diff --git a/crates/teksilo-widgets/src/progress_bar.rs b/crates/teksilo-widgets/src/progress_bar.rs index ebe4ee556..e54c3363a 100644 --- a/crates/teksilo-widgets/src/progress_bar.rs +++ b/crates/teksilo-widgets/src/progress_bar.rs @@ -68,7 +68,12 @@ pub struct ProgressBar { value: Prop, indeterminate: bool, orientation: Orientation, - thickness: f32, + /// The app's thickness, if it set one. + thickness: Option, + /// The thickness the style resolved at the last build declares + /// ([`ProgressBarStyle::thickness`](teksilo_core::styles::ProgressBarStyle::thickness)), + /// used when the app set none. + style_thickness: Option, track_color: Option, fill_color: Option, label: Option, @@ -84,7 +89,8 @@ impl ProgressBar { value: Prop::Static(value.clamp(0.0, 1.0)), indeterminate: false, orientation: Orientation::Horizontal, - thickness: DEFAULT_THICKNESS, + thickness: None, + style_thickness: None, track_color: None, fill_color: None, label: None, @@ -99,7 +105,8 @@ impl ProgressBar { value: Prop::Static(0.0), indeterminate: true, orientation: Orientation::Horizontal, - thickness: DEFAULT_THICKNESS, + thickness: None, + style_thickness: None, track_color: None, fill_color: None, label: None, @@ -123,12 +130,21 @@ impl ProgressBar { } /// Set the bar's narrow dimension in logical pixels. For horizontal bars - /// this is the height; for vertical bars this is the width. Default is 4.0. + /// this is the height; for vertical bars this is the width. Default is the + /// active style's thickness, 4.0 for the shipped style. pub fn thickness(mut self, thickness: f32) -> Self { - self.thickness = thickness; + self.thickness = Some(thickness); self } + /// The narrow dimension laid out: the app's, else the style's, else the + /// shipped 4.0. + fn effective_thickness(&self) -> f32 { + self.thickness + .or(self.style_thickness) + .unwrap_or(DEFAULT_THICKNESS) + } + /// Override the track background. Default (unset) is `SurfaceRole::Sunken`. /// Accepts `Color`, roles, or `Signal`. pub fn track_color(mut self, color: impl Into) -> Self { @@ -164,7 +180,7 @@ impl ProgressBar { impl std::fmt::Debug for ProgressBar { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("ProgressBar") - .field("thickness", &self.thickness) + .field("thickness", &self.effective_thickness()) .finish() } } @@ -175,8 +191,6 @@ impl Widget for ProgressBar { // when reduced-motion is on, fall through to a static // signal-driven path that never animates (pos stays at 0). let reduced_motion = ctx.prefers_reduced_motion(); - let animate = self.indeterminate && !reduced_motion; - let use_shader_path = animate && matches!(self.orientation, Orientation::Horizontal); let sweep_period = ctx.theme().motion.duration_indeterminate_sweep; let style: SharedProgressBarStyle = self @@ -188,6 +202,12 @@ impl Widget for ProgressBar { &ctx.theme().input, )) }); + self.style_thickness = style.thickness(&ctx.theme().input); + // A style that paints its own busy indicator takes the indeterminate + // bar whole, in either orientation: no sweep is drawn over it. + let style_owns_busy = self.indeterminate && style.paints_busy_indicator(); + let animate = self.indeterminate && !reduced_motion && !style_owns_busy; + let use_shader_path = animate && matches!(self.orientation, Orientation::Horizontal); let cfg = ProgressBarStyleConfig { orientation: self.orientation, progress: if self.indeterminate { @@ -226,6 +246,8 @@ impl Widget for ProgressBar { fill_color: fill, }); ctx.add(IndeterminateSweepLeaf::shader(handle)) + } else if style_owns_busy { + style.make_body(&cfg, ctx) } else if self.indeterminate { let frame_id = style.make_body(&cfg, ctx); let pos = ctx.animated_signal(0.0); @@ -270,11 +292,11 @@ impl Widget for ProgressBar { match self.orientation { Orientation::Horizontal => { let width = proposal.width.unwrap_or(100.0); - Size::new(width, self.thickness) + Size::new(width, self.effective_thickness()) } Orientation::Vertical => { let height = proposal.height.unwrap_or(100.0); - Size::new(self.thickness, height) + Size::new(self.effective_thickness(), height) } } .into() @@ -425,6 +447,7 @@ impl Widget for IndeterminateSweepLeaf { #[cfg(test)] mod tests { use super::*; + use teksilo_core::styles::ProgressBarStyle; use teksilo_core::widget_tree::WidgetTree; #[test] @@ -534,4 +557,101 @@ mod tests { "animated-quad phase must advance between frames" ); } + + /// A style that sizes its bar and paints its own busy indicator: a red + /// rectangle for an indeterminate bar, so the test can find it. + #[derive(Debug, Default, Clone, Copy)] + struct BusyStyle; + + impl ProgressBarStyle for BusyStyle { + fn make_body( + &self, + cfg: &ProgressBarStyleConfig, + ctx: &mut teksilo_core::build_context::BuildContext, + ) -> WidgetId { + let color = match cfg.progress { + ProgressKind::Indeterminate => Color::RED, + ProgressKind::Determinate(_) => Color::BLUE, + }; + ctx.add(crate::primitives::RectWidget::new().background(color)) + } + + fn thickness(&self, _tokens: &teksilo_tokens::InputTokens) -> Option { + Some(9.0) + } + + fn paints_busy_indicator(&self) -> bool { + true + } + } + + /// `bar` laid out 200 long with its narrow dimension left to it. + fn laid_out(bar: ProgressBar) -> (WidgetTree, WidgetId) { + let proposal = match bar.orientation { + Orientation::Horizontal => SizeProposal { + width: Some(200.0), + height: None, + }, + Orientation::Vertical => SizeProposal { + width: None, + height: Some(200.0), + }, + }; + let mut tree = WidgetTree::new().with_theme(teksilo_core::presets::intui::light()); + let id = tree.add(bar); + tree.layout(proposal); + (tree, id) + } + + /// The style's thickness is the bar's when the app names none, across + /// either orientation, and the app's own thickness wins over it. + #[test] + fn the_styles_thickness_sizes_a_bar_the_app_did_not_size() { + let (tree, id) = laid_out(ProgressBar::new(0.5).style(BusyStyle)); + assert_eq!(tree.bounds(id).height, 9.0); + let (tree, id) = laid_out( + ProgressBar::new(0.5) + .orientation(Orientation::Vertical) + .style(BusyStyle), + ); + assert_eq!(tree.bounds(id).width, 9.0); + let (tree, id) = laid_out(ProgressBar::new(0.5).thickness(3.0).style(BusyStyle)); + assert_eq!(tree.bounds(id).height, 3.0); + // The shipped style declares none, which keeps the widget's 4. + assert_eq!( + crate::styles::RecipeProgressBarStyle::default() + .thickness(&teksilo_tokens::InputTokens::default()), + None + ); + let (tree, id) = laid_out(ProgressBar::new(0.5)); + assert_eq!(tree.bounds(id).height, DEFAULT_THICKNESS); + } + + /// A style that paints its own busy indicator is mounted alone for an + /// indeterminate bar in both orientations: no shader quad, no sweep. + #[test] + fn a_style_that_paints_the_busy_indicator_replaces_the_sweep() { + for orientation in [Orientation::Horizontal, Orientation::Vertical] { + let (mut tree, _) = laid_out( + ProgressBar::indeterminate() + .orientation(orientation) + .style(BusyStyle), + ); + let frame = tree.render(); + assert!(frame.animated_quads.is_empty(), "{orientation:?}"); + let red: Vec<_> = frame + .shapes + .iter() + .filter(|s| s.color == Color::RED.to_array()) + .collect(); + assert_eq!(red.len(), 1, "{orientation:?}: the style's body"); + assert_eq!( + frame.shapes.len(), + 1, + "{orientation:?}: nothing painted over it" + ); + } + // The shipped style keeps the widget's sweep. + assert!(!crate::styles::RecipeProgressBarStyle::default().paints_busy_indicator()); + } } diff --git a/crates/teksilo-widgets/src/standard_item.rs b/crates/teksilo-widgets/src/standard_item.rs index 479508988..6d080c872 100644 --- a/crates/teksilo-widgets/src/standard_item.rs +++ b/crates/teksilo-widgets/src/standard_item.rs @@ -160,6 +160,11 @@ pub struct StandardListItem { /// same style for its height floor that painted its chrome. `None` until /// the first build. resolved_style: Option, + /// Whether the row was built with a check box or a leading slot, kept so + /// `layout_response` asks the style for the floor of a decorated row + /// ([`StandardItemStyle::min_height_decorated`](teksilo_core::styles::StandardItemStyle::min_height_decorated)). + /// The build takes both slots, so it records this first. + decorated: bool, root_child_id: Option, /// Optional plain tooltip text shown after a hover delay. Mutually exclusive /// with the rich / composite slots — every setter clears the other two so @@ -198,6 +203,7 @@ impl StandardListItem { reveal: None, style_override: None, resolved_style: None, + decorated: false, root_child_id: None, tooltip_text: None, rich_tooltip_source: None, @@ -596,6 +602,10 @@ impl StandardListItem { fn build_content(&mut self, ctx: &mut BuildContext, roles: &RowRoles) -> WidgetId { use crate::styles::recipe_standard_item_style as si; + // Recorded before the slots are taken below; a rebuild finds them + // gone and keeps what the first build saw. + self.decorated |= self.checkbox.is_some() || self.leading_slot.is_some(); + // A style whose selected row is a *solid* fill (macOS's accent // capsule) cannot recolour the label from `make_body` — the label // is already built by then — so it declares the role instead. @@ -882,6 +892,7 @@ impl Widget for StandardListItem { let two_line = self.subtitle.is_some(); let min_height = match self.resolved_style.as_ref() { Some(style) if two_line => style.min_height_two_line(input), + Some(style) if self.decorated => style.min_height_decorated(input), Some(style) => style.min_height_single_line(input), None => { let fallback = crate::styles::RecipeStandardItemStyle::for_tokens(input); @@ -2319,4 +2330,115 @@ mod tests { ); assert!(tree.find_by_label("TreeTip").is_some()); } + + /// A style whose decorated rows are taller than its rows of text. + #[derive(Debug, Default, Clone, Copy)] + struct DecoratedRowStyle; + + impl StandardItemStyle for DecoratedRowStyle { + fn make_body( + &self, + cfg: &StandardItemStyleConfig, + ctx: &mut teksilo_core::build_context::BuildContext, + ) -> WidgetId { + crate::styles::RecipeStandardItemStyle::for_tokens(&ctx.theme().input) + .make_body(cfg, ctx) + } + + fn min_height_single_line(&self, _tokens: &teksilo_tokens::InputTokens) -> f32 { + 31.0 + } + + fn min_height_decorated(&self, _tokens: &teksilo_tokens::InputTokens) -> f32 { + 37.0 + } + + fn min_height_two_line(&self, _tokens: &teksilo_tokens::InputTokens) -> f32 { + 53.0 + } + } + + /// The laid-out height of `row` alone in a tree. + fn row_height(row: impl Widget + 'static) -> f32 { + let mut tree = WidgetTree::new() + .with_theme(theme()) + .with_text_backend(std::rc::Rc::new(std::cell::RefCell::new( + teksilo_canvas::MockTextBackend::new(), + ))); + let id = tree.add(row); + tree.layout(SizeProposal { + width: Some(300.0), + height: None, + }); + tree.bounds(id).height + } + + /// A row with a check box or a leading slot takes the style's decorated + /// floor, a row of text alone the single-line one, and a row with a + /// subtitle the two-line one whatever it carries. A tree row lays out + /// through the list row it wraps, so it follows the same floors. + #[test] + fn a_decorated_row_takes_the_styles_decorated_floor() { + let icon = || crate::primitives::RectWidget::new(); + assert_eq!( + row_height(StandardListItem::new(lit!("Row")).style(DecoratedRowStyle)), + 31.0 + ); + assert_eq!( + row_height( + StandardListItem::new(lit!("Row")) + .checkbox(Signal::new(false)) + .style(DecoratedRowStyle) + ), + 37.0 + ); + assert_eq!( + row_height( + StandardListItem::new(lit!("Row")) + .leading_slot(icon()) + .style(DecoratedRowStyle) + ), + 37.0 + ); + assert_eq!( + row_height( + StandardListItem::new(lit!("Row")) + .leading_slot(icon()) + .subtitle(lit!("Below")) + .style(DecoratedRowStyle) + ), + 53.0 + ); + assert_eq!( + row_height( + StandardTreeItem::new(lit!("Node")) + .leading_slot(icon()) + .style(DecoratedRowStyle) + ), + 37.0 + ); + assert_eq!( + row_height(StandardTreeItem::new(lit!("Node")).style(DecoratedRowStyle)), + 31.0 + ); + } + + /// The hook defaults to the single-line floor, so the shipped recipe + /// lays a decorated row out exactly as a row of text. + #[test] + fn the_decorated_floor_defaults_to_the_single_line_one() { + let recipe = crate::styles::RecipeStandardItemStyle::default(); + let tokens = teksilo_tokens::InputTokens::default(); + assert_eq!( + recipe.min_height_decorated(&tokens), + recipe.min_height_single_line(&tokens) + ); + assert_eq!( + row_height( + StandardListItem::new(lit!("Row")) + .leading_slot(crate::primitives::RectWidget::new()) + ), + row_height(StandardListItem::new(lit!("Row"))), + ); + } } diff --git a/docs/widgets/progress_bar.md b/docs/widgets/progress_bar.md index db5454b91..a7cb6593c 100644 --- a/docs/widgets/progress_bar.md +++ b/docs/widgets/progress_bar.md @@ -117,7 +117,8 @@ vertical indeterminate bars use the signal-driven path instead. #### `pub fn thickness(mut self, thickness: f32) -> Self` Set the bar's narrow dimension in logical pixels. For horizontal bars -this is the height; for vertical bars this is the width. Default is 4.0. +this is the height; for vertical bars this is the width. Default is the +active style's thickness, 4.0 for the shipped style. From 3ad9ab1130f6f4db30b5e86f7f7db58fcf80906c Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 20:08:33 +0200 Subject: [PATCH 27/59] feat(theme-kde): build the recipe slots with Breeze's metrics The preset installs fourteen more slots: card, panel, dialog, snackbar, toast, banner, link, badge, calendar, search_field, avatar, splitter, list_container and segmented_control. Each is the stock Recipe*Style built with Breeze's numbers, in the new styles::recipes module, with a _for(&InputTokens) factory that install_styles calls with theme.input, so the density projection rebuilds them, and a zero-argument Compact twin. Values, spec k.1, k.4, k.5 and k.7: a card, a panel and a banner are framed at the 5 px frame radius in the 1 px pen with their content 6 px inside, the child margin, scaled by the density's spacing; a dialog's content lies spacing(10.0, tokens) inside it, Breeze's dialog margin, and the dialog, the snackbar and the toast round at the 5 px window radius; the banner's and the toast's glyph gap is the 6 px layout spacing; a badge rounds at the frame radius, Breeze drawing no pill; the segmented control's frame is the 5 px radius and the 1 px pen; the link's focus ring is Breeze's focus frame (k.5.8), a 2 px stroke centred on the link's bounds whose centre line rounds at 6, so its inner edge rounds at 5 and its outer at 7, and its underline is the pen; a calendar day and today's ring round at 5 in the pen; a search suggestion's text lies 16 px across and 4 px down inside its row, a menu item without icons (k.5.13); the splitter is its 1 px handle and the presence dot's outline the pen. A field is set only when Breeze has a number for it and the widget renders it. The segmented control's height and paddings, the calendar's cell size, header height, outer padding, section and cell gaps, the search field's row height, panel padding and input gap, the toast's and the banner's title gaps and the avatar sizes are listed as unrendered in density-projection-gaps.md and stay the stock projection, as do the fields nothing reads (the glyph sizes, the search field's radii, the calendar's nav icon and arrow radius, the avatar's ring). The calendar's header gap stays the recipe's too: Breeze's 6 px would leave the month title below 24 px at Touch, and its nav arrow is already Breeze's tool-button rule around the widget's 12 px chevron. Plan deviation: the plan lists only the dialog margin as a value; the spec gives the rest. KDE_UNFILLED keeps ten slots, each with its final reason: radio_tile, chart, color_picker, date_edit, rich_text_editor, drop_zone, drop_target, grid_view, web_view and text_selection. Tests: tests/density_gaps.rs parses density-projection-gaps.md sections 1 to 3 and asserts that no recipe literal in the crate's sources sets a listed field (a liveness fixture checks the scan) and that every factory building a listed recipe, segmented_control and the row recipe included, gives each listed field the stock value at every density. preset_metrics measures, at every density, the panel's and the card's 6 px insets and 5 px stroked frames, the dialog's 10 px margin, the banner's insets and gap, the suggestion row gutters, the calendar's today ring, stock header gap and zero conformance failures, the segmented control's frame and its stock 30 px height, the link's 1 px underline and its focus ring, the open snackbar's and the toast's 5 px radius and the toast's 6 px row gaps. mount.rs mounts every recipe-styled widget, the open snackbar and a toast surface included, light, dark and without the palette and checks the badge's radius; lib.rs checks the slot set and reprojects the search field and calendar metrics; the recipes module unit-tests every value. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 14 +- crates/teksilo-theme-kde/Cargo.toml | 12 +- crates/teksilo-theme-kde/src/lib.rs | 177 ++++--- crates/teksilo-theme-kde/src/styles.rs | 7 + .../teksilo-theme-kde/src/styles/recipes.rs | 490 ++++++++++++++++++ .../teksilo-theme-kde/tests/density_gaps.rs | 371 +++++++++++++ crates/teksilo-theme-kde/tests/mount.rs | 156 +++++- .../teksilo-theme-kde/tests/preset_metrics.rs | 459 +++++++++++++++- 8 files changed, 1606 insertions(+), 80 deletions(-) create mode 100644 crates/teksilo-theme-kde/src/styles/recipes.rs create mode 100644 crates/teksilo-theme-kde/tests/density_gaps.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index a501938c5..bf47cbda6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -209,8 +209,18 @@ by crate for clarity, not because crates version independently. separator, with a thumb at least 20 px long, its colours strengthened to a 3:1 contrast. A `ProgressBar` is 26 px thick around Breeze's 6 px groove, filled toward the highlight, and an indeterminate one shows Breeze's - moving stripes. Other widgets draw Teksilo's own chrome in these colours - and shapes. + moving stripes. A `Card`, a `Panel` and a `Banner` are framed as Breeze + frames a group, at the 5 px radius in a 1 px outline with their content + 6 px inside, and a `Dialog`'s content lies 10 px inside it, Breeze's + dialog margin; these gaps grow with the density. A `Snackbar`, a `Toast` + and a `Badge` are rounded at the 5 px radius, the badge rather than as a + pill, a toast's glyph, text and close button stand 6 px apart, and a + `SegmentedControl`'s frame is a 5 px radius in a 1 px outline. A + `Calendar`'s selected day is rounded at 5 px too, a focused `Link` is + ringed by Breeze's 2 px focus frame, from 1 px inside it to 1 px outside, + and a `SearchField`'s suggestions are laid out as the items of a Breeze + menu without icons. Other widgets draw Teksilo's own chrome in these + colours and shapes. #### Platform diff --git a/crates/teksilo-theme-kde/Cargo.toml b/crates/teksilo-theme-kde/Cargo.toml index 578ab8dda..72888124f 100644 --- a/crates/teksilo-theme-kde/Cargo.toml +++ b/crates/teksilo-theme-kde/Cargo.toml @@ -16,9 +16,15 @@ keywords = ["kde", "plasma", "breeze", "theme", "gui"] categories = ["gui"] # `tests/contrast.rs`, `tests/mount.rs` and `tests/preset_metrics.rs` read # the golden vectors under `tools/kde_golden` (the Oxygen schemes, Plasma's -# painted pixels and its control sizes); left in, they would not compile -# from the package and `cargo test` there would fail. -exclude = ["tests/contrast.rs", "tests/mount.rs", "tests/preset_metrics.rs"] +# painted pixels and its control sizes), and `tests/density_gaps.rs` reads +# `engineering/docs/density-projection-gaps.md`; left in, they would not +# compile from the package and `cargo test` there would fail. +exclude = [ + "tests/contrast.rs", + "tests/density_gaps.rs", + "tests/mount.rs", + "tests/preset_metrics.rs", +] [dependencies] teksilo-core = { workspace = true } diff --git a/crates/teksilo-theme-kde/src/lib.rs b/crates/teksilo-theme-kde/src/lib.rs index 94f5bc229..c67d1996b 100644 --- a/crates/teksilo-theme-kde/src/lib.rs +++ b/crates/teksilo-theme-kde/src/lib.rs @@ -78,6 +78,11 @@ //! `focus_ring` token is opaque, lifted to 3:1, and the styles draw it as //! it is. //! - **Linear, quick motion.** Style transitions run 100 ms, linearly. +//! - **Breeze's frames and margins.** A card, a panel and a banner are +//! framed at the 5 px radius in the 1 px pen with their content 6 px +//! inside, the margin of a nested layout; a dialog's content lies 10 px +//! inside it, Breeze's dialog margin; a suggestion list lays its rows out +//! as a menu without icons ([`styles::recipes`]). //! - **Text-driven heights.** A push button is the text line plus 16 px, a //! field the line plus 14: 34 and 32 px at Plasma's default font, and //! they grow with it ([`geometry`]). @@ -121,14 +126,21 @@ //! //! ## Known limitations //! -//! - **Most widget chrome is the framework's.** This version installs +//! - **Some widget chrome is the framework's.** This version installs //! Breeze styles for `Button`, `IconButton`, `SplitButton`, `Toggle`, //! `Checkbox`, `RadioButton`, `TextInput`, `ComboBox`, `SpinBox`, //! `Slider`, `MenuItem`, the popup frame, the tooltip, `StandardListItem` //! and `StandardTreeItem`, `TableView` and `TreeTableView`, `TabBar` and -//! `TabWidget`, `ScrollBar` and `ProgressBar` only: every other widget -//! keeps Teksilo's recipe style, painted in the Breeze colours, radii, -//! focus ring, typography and motion. +//! `TabWidget`, `ScrollBar` and `ProgressBar`. `Card`, `Panel`, `Dialog`, +//! `Snackbar`, `Toast`, `Banner`, `Link`, `Badge`, `Calendar`, +//! `SearchField`, `Avatar`, `Splitter`, the list containers and +//! `SegmentedControl` keep Teksilo's recipe style built with Breeze's +//! radius, pen and margins, and the dimensions Breeze has no number for, +//! or that the widget does not take from its style (a segmented control's +//! height, a calendar's cell size), stay the framework's +//! ([`styles::recipes`]). Every other widget keeps Teksilo's recipe style +//! as it ships, painted in the Breeze colours, radii, focus ring, +//! typography and motion. //! - **A menu's shortcuts, separators, section titles and check marks are //! the framework's.** `MenuItem` writes a shortcut in the shortcut text //! role, where Breeze writes the window text at 70 % opacity, and gives @@ -370,9 +382,13 @@ fn project(theme: &Theme, state: PaintState) -> Theme { /// The buttons, the check box, the radio button, the switch, the line edit, /// the combo box, the spin box, the slider, the menu item, the popup frame, /// the tooltip, the list row, the table, the tab, the scroll bar and the -/// progress bar are Breeze's own ([`styles`]); every other slot is left to -/// the widget's recipe style, which paints from the Breeze tokens, and the -/// crate's tests list the reason for each. Every style installed here reads +/// progress bar are Breeze's own ([`styles`]); the card, the panel, the +/// dialog, the snackbar, the toast, the banner, the link, the badge, the +/// calendar, the search field, the avatar, the splitter, the list container +/// and the segmented control are the stock recipe styles built with Breeze's +/// metrics ([`styles::recipes`]); every other slot is left to the widget's +/// recipe style, which paints from the Breeze tokens, and the crate's tests +/// list the reason for each. Every style installed here reads /// its metrics from the theme it builds under, `theme.input` included, so /// [`reproject`] can rerun this alone. fn install_styles(theme: &mut Theme) { @@ -403,6 +419,23 @@ fn install_styles(theme: &mut Theme) { slots.tab = Some(Rc::new(tab)); slots.scroll_bar = Some(Rc::new(scroll_bar)); slots.progress_bar = Some(Rc::new(progress_bar)); + let t = &theme.input; + slots.card = Some(Rc::new(styles::recipes::breeze_card_style_for(t))); + slots.panel = Some(Rc::new(styles::recipes::breeze_panel_style_for(t))); + slots.dialog = Some(Rc::new(styles::recipes::breeze_dialog_style_for(t))); + slots.snackbar = Some(Rc::new(styles::recipes::breeze_snackbar_style_for(t))); + slots.toast = Some(Rc::new(styles::recipes::breeze_toast_style_for(t))); + slots.banner = Some(Rc::new(styles::recipes::breeze_banner_style_for(t))); + slots.link = Some(Rc::new(styles::recipes::breeze_link_style_for(t))); + slots.badge = Some(Rc::new(styles::recipes::breeze_badge_style_for(t))); + slots.calendar = Some(Rc::new(styles::recipes::breeze_calendar_style_for(t))); + slots.search_field = Some(Rc::new(styles::recipes::breeze_search_field_style_for(t))); + slots.avatar = Some(Rc::new(styles::recipes::breeze_avatar_style_for(t))); + slots.splitter = Some(Rc::new(styles::recipes::breeze_splitter_style_for(t))); + slots.list_container = Some(Rc::new(styles::recipes::breeze_list_container_style_for(t))); + slots.segmented_control = Some(Rc::new( + styles::recipes::breeze_segmented_control_style_for(t), + )); } #[cfg(test)] @@ -595,68 +628,26 @@ mod tests { assert!((lp.frame_contrast() - 0.2).abs() < 1e-12); } - /// Every slot this commit leaves to the widget's own recipe style, with - /// the reason it is inherited rather than filled. + /// Every slot the preset deliberately leaves to the widget's own recipe + /// style, with the reason it is inherited rather than filled. Each is a + /// widget Breeze has no counterpart or no metric for, or one whose + /// dimensions the style cannot set; its recipe paints from the Breeze + /// tokens all the same. const KDE_UNFILLED: &[(&str, &str)] = &[ - ( - "splitter", - "the recipe's thin divider in the border role reads as Breeze's 1 px splitter handle", - ), ( "radio_tile", - "Breeze has no selectable card; the recipe surface reads the preset's surface and accent roles", - ), - ( - "panel", - "the recipe panel paints the Breeze surface and border tokens with the Breeze radius", - ), - ( - "card", - "Breeze has no card; the recipe card paints the Breeze raised surface and border tokens", + "Breeze has no selectable card, so there is no Breeze metric to build it with; \ + the recipe frame paints the Breeze surface, accent, border and focus roles", ), ( "chart", - "Breeze has no chart chrome; the teksilo-charts default reads the series colours and the Breeze border role", - ), - ( - "dialog", - "the recipe dialog paints the Breeze surfaces, radius and shadow tokens", - ), - ( - "snackbar", - "Breeze has no snackbar; the recipe paints the Breeze raised surface and text tokens", - ), - ( - "toast", - "Breeze has no toast; the recipe paints the Breeze raised surface and status tokens", - ), - ( - "banner", - "the recipe banner paints the Breeze status foregrounds and their computed backgrounds", - ), - ( - "badge", - "Breeze has no badge; the recipe badge paints the Breeze accent and status tokens", - ), - ( - "link", - "the recipe link paints the Breeze link tokens, lifted to the text floor", - ), - ( - "segmented_control", - "Breeze has no segmented control; the recipe paints the Breeze surface, accent and border tokens", - ), - ( - "avatar", - "Breeze has no avatar; the recipe paints the Breeze accent and surface tokens", - ), - ( - "calendar", - "the recipe calendar paints the Breeze selection, hover and text tokens", + "Breeze has no chart chrome, and the default ChartStyle lives in teksilo-charts, \ + which this preset does not depend on; it reads the series colours and the Breeze border role", ), ( "color_picker", - "Breeze has no in-window colour picker chrome; the recipe reads the theme roles", + "Breeze specifies no colour-picker geometry; the canvas, strips and swatches are \ + colour-space renderers that read the recipe's own dimensions, drawn in the theme roles", ), ( "date_edit", @@ -664,23 +655,23 @@ mod tests { ), ( "rich_text_editor", - "the recipe frames the viewport in the Breeze border and surface roles; the text is document content", - ), - ( - "list_container", - "the recipe is only the drag-insertion line, drawn in the Breeze accent", + "a read-only viewer is frameless, and an editable one takes its frame's radius, pen and \ + insets from the stock line-edit recipe rather than the slot, painted in the Breeze roles", ), ( "drop_zone", - "Breeze has no drop-zone control; the recipe tints its region from the theme roles", + "Breeze has no drop-zone control, so there is no Breeze metric to build it with; \ + the recipe tints its region from the theme roles", ), ( "drop_target", - "Breeze has no drop-target control; the recipe border reads the theme roles", + "Breeze has no drop-target control, so there is no Breeze metric to build it with; \ + the recipe border reads the theme roles", ), ( "grid_view", - "the recipe's focus ring, marquee and insertion bar use the focus and accent roles this preset maps", + "Breeze specifies no grid view; the recipe's focus ring, marquee, insertion bar and \ + pinned header are the trait's default decorations, drawn in the roles this preset maps", ), ( "web_view", @@ -688,11 +679,8 @@ mod tests { ), ( "text_selection", - "touch chrome Breeze does not define; its geometry is teksilo_core::text_touch's, shared with hit testing", - ), - ( - "search_field", - "the recipe is a passthrough around the TextInput, which this preset frames as Breeze's line edit", + "Breeze defines no touch selection handles or magnifier, so there is no Breeze \ + metric to build it with; the recipe paints them in the theme roles", ), ]; @@ -964,6 +952,49 @@ mod tests { } } + /// The recipe slots built with Breeze's metrics are rebuilt for the + /// density a theme is projected to: what a widget asking the installed + /// style is told follows the projected input tokens. + #[test] + fn a_density_switch_reprojects_the_recipe_slots() { + let base = light(); + for (density, factor, arrow) in [ + (TargetDensity::Compact, 1.0, 24.0), + (TargetDensity::Comfortable, 1.15, 32.0), + (TargetDensity::Touch, 1.3, 44.0), + ] { + let t = base.with_density(density); + let slots = &t.style_slots; + let search = slots.search_field.as_ref().expect("a search-field style"); + assert!( + (search.row_padding_horizontal(&t.input) - 16.0 * factor).abs() < 1e-4, + "{density:?}" + ); + assert!( + (search.row_padding_vertical(&t.input) - 4.0 * factor).abs() < 1e-4, + "{density:?}" + ); + let calendar = slots.calendar.as_ref().expect("a calendar style"); + assert_eq!(calendar.nav_arrow_size(&t.input), arrow, "{density:?}"); + for (name, installed) in [ + ("card", slots.card.is_some()), + ("panel", slots.panel.is_some()), + ("dialog", slots.dialog.is_some()), + ("snackbar", slots.snackbar.is_some()), + ("toast", slots.toast.is_some()), + ("banner", slots.banner.is_some()), + ("link", slots.link.is_some()), + ("badge", slots.badge.is_some()), + ("avatar", slots.avatar.is_some()), + ("splitter", slots.splitter.is_some()), + ("list_container", slots.list_container.is_some()), + ("segmented_control", slots.segmented_control.is_some()), + ] { + assert!(installed, "{density:?}: no {name} style"); + } + } + } + /// Every colour token, pinned to its source in Breeze Light's resolved /// palette. The destructuring has no `..`: a field added to /// `ColorTokens` must be pinned here before this compiles. diff --git a/crates/teksilo-theme-kde/src/styles.rs b/crates/teksilo-theme-kde/src/styles.rs index e1edbce3a..390b8467c 100644 --- a/crates/teksilo-theme-kde/src/styles.rs +++ b/crates/teksilo-theme-kde/src/styles.rs @@ -37,6 +37,12 @@ //! //! The dimensions they are built with, all derived from [`crate::geometry`] //! and the density ladder, are collected in [`metrics`]. +//! +//! Widgets whose shipped recipe style already paints Breeze's shape get that +//! style built with Breeze's numbers instead, in [`recipes`]: the card, the +//! panel, the dialog, the snackbar, the toast, the banner, the link, the +//! badge, the calendar, the search field, the avatar, the splitter, the list +//! container and the segmented control. pub mod arrow; pub mod button; @@ -51,6 +57,7 @@ pub mod popover; pub mod popup; pub mod progress_bar; pub mod radio; +pub mod recipes; pub mod scroll_bar; pub mod slider; pub mod spin_box; diff --git a/crates/teksilo-theme-kde/src/styles/recipes.rs b/crates/teksilo-theme-kde/src/styles/recipes.rs new file mode 100644 index 000000000..e7042f795 --- /dev/null +++ b/crates/teksilo-theme-kde/src/styles/recipes.rs @@ -0,0 +1,490 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! Breeze metrics for the widgets whose stock `Recipe*Style` already paints +//! the right shape: they only need Breeze's numbers. +//! +//! Every style here is the shipped Teksilo implementation built with a +//! Breeze recipe, not a reimplementation, the way the macOS preset's +//! `styles::metrics` builds its own. Each has a `_for(&InputTokens)` factory, +//! which [`crate::light`] and the other constructors install and the +//! density projection reruns, and a zero-argument twin at the Compact +//! density. +//! +//! Three Breeze rules give almost every value: +//! +//! - **One radius.** A frame in the page (a group box, a generic frame, a +//! button) and a window (a menu, a tooltip, a dialog) round at the 5 px +//! frame radius, [`BREEZE_CONTROL_RADIUS`] and [`BREEZE_POPUP_RADIUS`], +//! outlined in the 1 px pen, [`BREEZE_PEN_WIDTH`] (spec k.1, k.5.19, +//! k.5.20, k.6, k.7). +//! - **Three layout gaps.** A window's content lies 10 px inside it, a +//! nested group's 6 px inside its frame, and siblings stand 6 px apart +//! ([`LAYOUT_TOP_LEVEL_MARGIN`], [`LAYOUT_CHILD_MARGIN`], +//! [`LAYOUT_SPACING`], spec k.1 and k.7). +//! - **A popup list is a menu.** The rows of a search field's suggestion +//! list lie where Breeze lays out the items of a menu without icons +//! (spec k.5.13). +//! +//! A gap goes through the density's `spacing`, as every Breeze gap does in +//! [`crate::styles::metrics`]; a radius or a pen is painted and does not +//! scale. `[unpublished]` KDE publishes no touch ladder, so the ladder is +//! the framework's generic one. +//! +//! ## What is left at the stock recipe +//! +//! A field is set only when Breeze has a number for it **and** the widget +//! renders it. The rest keep the stock recipe's value, for one of four +//! reasons. +//! +//! - **The widget does not render it.** `engineering/docs/density-projection-gaps.md` +//! lists the projected fields a widget composes from the recipe module's +//! constant instead of the style, and a crate test holds every factory +//! here to that list: a value written there would never reach the +//! screen. So the segmented control's height and paddings, the +//! calendar's cell size, header height, outer padding, section gap and +//! cell gap, the search field's row height, panel padding and +//! input-to-panel gap, the toast's title and action gaps, the banner's +//! title gap and every avatar size stay the recipe's. The same holds for +//! the fields nothing reads at all, projected or not: the banner's and +//! toast's glyph sizes, the search field's glyph, glyph slot and two +//! radii, the calendar's navigation icon and arrow radius, and the +//! avatar's default ring width. +//! - **Breeze has no counterpart.** The specification records no Breeze +//! snackbar, toast, badge, avatar or segmented control, and no rule for a +//! dialog's minimum width, a toast's or a snackbar's padding, a badge's padding, the +//! avatar's shape or the drag-insertion line of a list. Those keep the +//! framework's values rather than invented ones. +//! - **Breeze's value would cost a target.** The calendar's header keeps +//! the recipe's gap between its arrows, narrower than Breeze's 6 px layout +//! spacing, which at the Touch density would leave the month title +//! narrower than WCAG 2.2's 24 px target. +//! - **Breeze's rule gives the stock value.** The calendar's navigation +//! arrow is a flat tool button around its chevron, the chevron plus 6 px +//! on each side ([`TOOL_BUTTON_MARGIN_WIDTH`]): around the 12 px chevron +//! the widget draws, that is the recipe's own 24. +//! +//! A card keeps the recipe's elevation too: Breeze casts no shadow from a +//! frame in the page (spec k.5.19), so an app that asks for an `Elevated` +//! card is asking for something Breeze does not draw, and gets the +//! framework's, in Breeze's shadow colours. + +use teksilo_core::styles::density::spacing; +use teksilo_tokens::InputTokens; +use teksilo_widgets::styles::{ + AvatarRecipe, BadgeRecipe, BannerRecipe, CalendarRecipe, CardRecipe, DialogRecipe, LinkRecipe, + PanelRecipe, RecipeAvatarStyle, RecipeBadgeStyle, RecipeBannerStyle, RecipeCalendarStyle, + RecipeCardStyle, RecipeDialogStyle, RecipeLinkStyle, RecipeListContainerStyle, + RecipePanelStyle, RecipeSearchFieldStyle, RecipeSegmentedControlStyle, RecipeSnackbarStyle, + RecipeSplitterStyle, RecipeToastStyle, SearchFieldRecipe, SegmentedControlRecipe, + SnackbarRecipe, SplitterRecipe, ToastRecipe, +}; + +#[cfg(doc)] +use crate::geometry::TOOL_BUTTON_MARGIN_WIDTH; +use crate::geometry::{ + LAYOUT_CHILD_MARGIN, LAYOUT_SPACING, LAYOUT_TOP_LEVEL_MARGIN, MENU_ITEM_EXTRA_LEFT_MARGIN, + MENU_ITEM_MARGIN, MENU_ITEM_TEXT_LEFT_MARGIN, SPLITTER_WIDTH, +}; +use crate::shape::{ + BREEZE_CONTROL_RADIUS, BREEZE_FOCUS_RING_WIDTH, BREEZE_PEN_WIDTH, BREEZE_POPUP_RADIUS, +}; + +/// `[derived]` How far a suggestion's text lies inside its row, on either +/// side: a menu item's contents start 4 px inside the item and 8 px more on +/// the leading side, and 4 px more again in a menu without icons (spec +/// k.5.13). Teksilo pads both sides alike. 16 at Compact. +pub const SUGGESTION_TEXT_INSET: f32 = + MENU_ITEM_MARGIN + MENU_ITEM_TEXT_LEFT_MARGIN + MENU_ITEM_EXTRA_LEFT_MARGIN; + +const _: () = assert!(SUGGESTION_TEXT_INSET == 16.0); + +/// `[derived]` The radius of the centre line of a link's focus ring: the +/// ring's inner edge rounds at the frame radius and its outer edge at the +/// frame radius plus the ring's width (spec k.5.8: 5 and 7), so the line +/// halfway between them rounds at the frame radius plus half the width. +/// 6 px. +pub const LINK_FOCUS_RING_RADIUS: f32 = BREEZE_CONTROL_RADIUS + BREEZE_FOCUS_RING_WIDTH / 2.0; + +const _: () = assert!(LINK_FOCUS_RING_RADIUS == 6.0); + +// ── Frames in the page ────────────────────────────────────────────────── + +/// `Card`: Breeze's group box (spec k.5.19), a frame at the frame radius +/// whose contents Qt lays out with the nested-layout margin. +pub fn breeze_card_style_for(tokens: &InputTokens) -> RecipeCardStyle { + RecipeCardStyle::new(CardRecipe { + // `[derived]` A framed group's layout takes the child margin (k.1, + // k.4 "Dialog margin ... child margin 6"). + padding: spacing(LAYOUT_CHILD_MARGIN, tokens), + // `[M]` The frame radius. + corner_radius: BREEZE_CONTROL_RADIUS, + // `[M]` The pen of every frame. + border_width: BREEZE_PEN_WIDTH, + ..CardRecipe::for_tokens(tokens) + }) +} + +/// `Panel`: Breeze's group box, as [`breeze_card_style_for`]. +pub fn breeze_panel_style_for(tokens: &InputTokens) -> RecipePanelStyle { + RecipePanelStyle::new(PanelRecipe { + // `[derived]` A framed group's layout takes the child margin. + padding: spacing(LAYOUT_CHILD_MARGIN, tokens), + // `[M]` The frame radius. + corner_radius: BREEZE_CONTROL_RADIUS, + // `[M]` The pen of every frame. + border_width: BREEZE_PEN_WIDTH, + }) +} + +/// `Banner`: an in-page notice, framed as a group box is and laid out as a +/// row of a nested layout. +pub fn breeze_banner_style_for(tokens: &InputTokens) -> RecipeBannerStyle { + RecipeBannerStyle::new(BannerRecipe { + // `[derived]` The child margin on every side, as a framed group. + padding_horizontal: spacing(LAYOUT_CHILD_MARGIN, tokens), + padding_vertical: spacing(LAYOUT_CHILD_MARGIN, tokens), + // `[derived]` A frame in the page rounds at the frame radius. + corner_radius: BREEZE_CONTROL_RADIUS, + // `[M]` The layout spacing between the glyph and the text. + content_gap: spacing(LAYOUT_SPACING, tokens), + ..BannerRecipe::for_tokens(tokens) + }) +} + +/// `Link`: the focus frame Breeze draws around a focused control, and an +/// underline in the 1 px pen. +/// +/// Breeze's focus frame is a 2 px ring from 1 px inside the control to 1 px +/// outside it, its inner edge at the frame radius and its outer edge 2 px +/// further out (spec k.5.8). The recipe strokes the ring centred on the +/// link's bounds in the theme's focus-ring width, which is that ring when +/// the stroke's centre line rounds at [`LINK_FOCUS_RING_RADIUS`]. +pub fn breeze_link_style_for(_tokens: &InputTokens) -> RecipeLinkStyle { + RecipeLinkStyle::new(LinkRecipe { + // `[derived]` The ring's centre line, on the link's bounds. + corner_radius: LINK_FOCUS_RING_RADIUS, + // `[derived]` Drawn in the pen of every Breeze line. + underline_thickness: BREEZE_PEN_WIDTH, + }) +} + +/// `Badge`: Breeze draws no pill, so a badge rounds at the frame radius like +/// every other Breeze frame (spec k.7). +pub fn breeze_badge_style_for(tokens: &InputTokens) -> RecipeBadgeStyle { + RecipeBadgeStyle::new(BadgeRecipe { + // `[derived]` The frame radius, in place of a pill. + corner_radius: BREEZE_CONTROL_RADIUS, + ..BadgeRecipe::for_tokens(tokens) + }) +} + +/// `SegmentedControl`: the frame of a Breeze button, at the frame radius in +/// the 1 px pen. +/// +/// Only the radius and the pen: the control lays its height and paddings out +/// from the recipe module's constants, so a value written here would not +/// reach the screen (`density-projection-gaps.md`, section 2). +pub fn breeze_segmented_control_style_for(tokens: &InputTokens) -> RecipeSegmentedControlStyle { + RecipeSegmentedControlStyle::new(SegmentedControlRecipe { + // `[M]` The frame radius. + corner_radius: BREEZE_CONTROL_RADIUS, + // `[M]` The pen of every frame. + border_width: BREEZE_PEN_WIDTH, + ..SegmentedControlRecipe::for_tokens(tokens) + }) +} + +/// `Splitter`: Breeze's 1 px splitter handle (spec k.5.21). +/// +/// The handle Breeze grabs is a 12 px proxy around the line (`breezerc` +/// `SplitterProxyWidth`); the `Splitter` widget widens its own gutter for the +/// pointer, which the style is not asked about. +pub fn breeze_splitter_style_for(_tokens: &InputTokens) -> RecipeSplitterStyle { + RecipeSplitterStyle::new(SplitterRecipe { + // `[M]` The splitter width. + divider_line_thickness: SPLITTER_WIDTH, + }) +} + +/// `ListView` and `TreeView` containers: the stock style, whose one +/// decoration is the drag-insertion line in the accent. +/// +/// `[unpublished]` The spec records no Breeze drop indicator, so the line +/// keeps the framework's 2 px; the style carries no dimension of its own and +/// the projection is the identity. +pub fn breeze_list_container_style_for(tokens: &InputTokens) -> RecipeListContainerStyle { + RecipeListContainerStyle::for_tokens(tokens) +} + +/// `Calendar`: a day is selected as an item-view row is, so its fill rounds +/// at the frame radius the selection's outer edge has (spec k.5.16), and +/// today's ring is the 1 px pen. +/// +/// The header's gap stays the recipe's: Breeze's 6 px layout spacing between +/// its four arrows would take the month title below a target's width at the +/// Touch density, where the arrows are 44 px. +pub fn breeze_calendar_style_for(tokens: &InputTokens) -> RecipeCalendarStyle { + RecipeCalendarStyle::new(CalendarRecipe { + // `[derived]` The selection's outer radius: 4.5 stroked, 5 outside. + cell_radius: BREEZE_CONTROL_RADIUS, + // `[derived]` A month or a year is selected as a day is. + zoom_cell_radius: BREEZE_CONTROL_RADIUS, + // `[M]` The pen of every frame. + today_ring_width: BREEZE_PEN_WIDTH, + ..CalendarRecipe::for_tokens(tokens) + }) +} + +/// `SearchField`: the suggestion list is a menu without icons, so a row's +/// text lies [`SUGGESTION_TEXT_INSET`] inside it across and the 4 px item +/// margin inside it down (spec k.5.13). The list already lies 4 px inside +/// its panel, the recipe's constant, which is Breeze's menu margin. +pub fn breeze_search_field_style_for(tokens: &InputTokens) -> RecipeSearchFieldStyle { + RecipeSearchFieldStyle::new(SearchFieldRecipe { + // `[derived]` A menu item's text inset, without icons. + row_padding_horizontal: spacing(SUGGESTION_TEXT_INSET, tokens), + // `[M]` The menu item margin. + row_padding_vertical: spacing(MENU_ITEM_MARGIN, tokens), + ..SearchFieldRecipe::for_tokens(tokens) + }) +} + +/// `Avatar`: Breeze has no avatar; only the presence dot's outline takes +/// the 1 px pen of every Breeze outline. +pub fn breeze_avatar_style_for(tokens: &InputTokens) -> RecipeAvatarStyle { + RecipeAvatarStyle::new(AvatarRecipe { + // `[derived]` The pen of every frame. + presence_outline_width: BREEZE_PEN_WIDTH, + ..AvatarRecipe::for_tokens(tokens) + }) +} + +// ── Windows ───────────────────────────────────────────────────────────── + +/// `Dialog`: a window, rounded as Breeze rounds a window's frame (spec +/// k.6), its content inside the top-level layout margin, Breeze's dialog +/// margin (spec k.4, k.7). +pub fn breeze_dialog_style_for(tokens: &InputTokens) -> RecipeDialogStyle { + RecipeDialogStyle::new(DialogRecipe { + // `[M]` The top-level layout margin. + content_padding: spacing(LAYOUT_TOP_LEVEL_MARGIN, tokens), + // `[Hp]` A window's radius. + corner_radius: BREEZE_POPUP_RADIUS, + ..DialogRecipe::for_tokens(tokens) + }) +} + +/// `Snackbar`: a floating surface, so a window's radius. +pub fn breeze_snackbar_style_for(tokens: &InputTokens) -> RecipeSnackbarStyle { + RecipeSnackbarStyle::new(SnackbarRecipe { + // `[derived]` A floating surface rounds as a window does. + corner_radius: BREEZE_POPUP_RADIUS, + ..SnackbarRecipe::for_tokens(tokens) + }) +} + +/// `Toast`: a floating surface, so a window's radius, its glyph, text and +/// close button the layout spacing apart. +pub fn breeze_toast_style_for(tokens: &InputTokens) -> RecipeToastStyle { + RecipeToastStyle::new(ToastRecipe { + // `[derived]` A floating surface rounds as a window does. + corner_radius: BREEZE_POPUP_RADIUS, + // `[M]` The layout spacing. + content_gap: spacing(LAYOUT_SPACING, tokens), + ..ToastRecipe::for_tokens(tokens) + }) +} + +// ── Compact twins ─────────────────────────────────────────────────────── + +/// [`breeze_card_style_for`] at the Compact density. +pub fn breeze_card_style() -> RecipeCardStyle { + breeze_card_style_for(&InputTokens::default()) +} +/// [`breeze_panel_style_for`] at the Compact density. +pub fn breeze_panel_style() -> RecipePanelStyle { + breeze_panel_style_for(&InputTokens::default()) +} +/// [`breeze_banner_style_for`] at the Compact density. +pub fn breeze_banner_style() -> RecipeBannerStyle { + breeze_banner_style_for(&InputTokens::default()) +} +/// [`breeze_link_style_for`] at the Compact density. +pub fn breeze_link_style() -> RecipeLinkStyle { + breeze_link_style_for(&InputTokens::default()) +} +/// [`breeze_badge_style_for`] at the Compact density. +pub fn breeze_badge_style() -> RecipeBadgeStyle { + breeze_badge_style_for(&InputTokens::default()) +} +/// [`breeze_segmented_control_style_for`] at the Compact density. +pub fn breeze_segmented_control_style() -> RecipeSegmentedControlStyle { + breeze_segmented_control_style_for(&InputTokens::default()) +} +/// [`breeze_splitter_style_for`] at the Compact density. +pub fn breeze_splitter_style() -> RecipeSplitterStyle { + breeze_splitter_style_for(&InputTokens::default()) +} +/// [`breeze_list_container_style_for`] at the Compact density. +pub fn breeze_list_container_style() -> RecipeListContainerStyle { + breeze_list_container_style_for(&InputTokens::default()) +} +/// [`breeze_calendar_style_for`] at the Compact density. +pub fn breeze_calendar_style() -> RecipeCalendarStyle { + breeze_calendar_style_for(&InputTokens::default()) +} +/// [`breeze_search_field_style_for`] at the Compact density. +pub fn breeze_search_field_style() -> RecipeSearchFieldStyle { + breeze_search_field_style_for(&InputTokens::default()) +} +/// [`breeze_avatar_style_for`] at the Compact density. +pub fn breeze_avatar_style() -> RecipeAvatarStyle { + breeze_avatar_style_for(&InputTokens::default()) +} +/// [`breeze_dialog_style_for`] at the Compact density. +pub fn breeze_dialog_style() -> RecipeDialogStyle { + breeze_dialog_style_for(&InputTokens::default()) +} +/// [`breeze_snackbar_style_for`] at the Compact density. +pub fn breeze_snackbar_style() -> RecipeSnackbarStyle { + breeze_snackbar_style_for(&InputTokens::default()) +} +/// [`breeze_toast_style_for`] at the Compact density. +pub fn breeze_toast_style() -> RecipeToastStyle { + breeze_toast_style_for(&InputTokens::default()) +} + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_tokens::TargetDensity; + + const DENSITIES: [(TargetDensity, f32); 3] = [ + (TargetDensity::Compact, 1.0), + (TargetDensity::Comfortable, 1.15), + (TargetDensity::Touch, 1.3), + ]; + + fn near(a: f32, b: f32) -> bool { + (a - b).abs() < 1e-4 + } + + /// The link's ring, stroked centred in the 2 px focus-ring width, has + /// Breeze's inner radius 5 and outer radius 7 (spec k.5.8); its + /// underline is the pen. + #[test] + fn a_links_focus_ring_has_breezes_inner_and_outer_radii() { + let link = breeze_link_style().recipe; + let half = BREEZE_FOCUS_RING_WIDTH / 2.0; + assert_eq!(link.corner_radius - half, 5.0); + assert_eq!(link.corner_radius + half, 7.0); + assert_eq!(link.underline_thickness, 1.0); + } + + #[test] + fn every_frame_rounds_at_the_frame_radius_in_the_one_pixel_pen() { + assert_eq!(breeze_card_style().recipe.corner_radius, 5.0); + assert_eq!(breeze_card_style().recipe.border_width, 1.0); + assert_eq!(breeze_panel_style().recipe.corner_radius, 5.0); + assert_eq!(breeze_panel_style().recipe.border_width, 1.0); + assert_eq!(breeze_banner_style().recipe.corner_radius, 5.0); + assert_eq!(breeze_badge_style().recipe.corner_radius, 5.0); + let s = breeze_segmented_control_style().recipe; + assert_eq!((s.corner_radius, s.border_width), (5.0, 1.0)); + let c = breeze_calendar_style().recipe; + assert_eq!((c.cell_radius, c.zoom_cell_radius), (5.0, 5.0)); + assert_eq!(c.today_ring_width, 1.0); + assert_eq!(breeze_splitter_style().recipe.divider_line_thickness, 1.0); + assert_eq!(breeze_avatar_style().recipe.presence_outline_width, 1.0); + } + + #[test] + fn windows_round_at_the_window_radius() { + assert_eq!(breeze_dialog_style().recipe.corner_radius, 5.0); + assert_eq!(breeze_snackbar_style().recipe.corner_radius, 5.0); + assert_eq!(breeze_toast_style().recipe.corner_radius, 5.0); + } + + /// The layout gaps at Compact are Breeze's, and every one scales with + /// the density's spacing; the painted radii and pens do not. + #[test] + fn the_gaps_are_breezes_and_follow_the_density() { + for (density, factor) in DENSITIES { + let t = InputTokens::for_density(density); + let child = 6.0 * factor; + assert!(near(breeze_card_style_for(&t).recipe.padding, child)); + assert!(near(breeze_panel_style_for(&t).recipe.padding, child)); + let b = breeze_banner_style_for(&t).recipe; + assert!(near(b.padding_horizontal, child) && near(b.padding_vertical, child)); + assert!(near(b.content_gap, 6.0 * factor)); + assert!(near( + breeze_dialog_style_for(&t).recipe.content_padding, + 10.0 * factor + )); + assert!(near( + breeze_toast_style_for(&t).recipe.content_gap, + 6.0 * factor + )); + let s = breeze_search_field_style_for(&t).recipe; + assert!(near(s.row_padding_horizontal, 16.0 * factor)); + assert!(near(s.row_padding_vertical, 4.0 * factor)); + assert_eq!(breeze_card_style_for(&t).recipe.corner_radius, 5.0); + assert_eq!(breeze_dialog_style_for(&t).recipe.corner_radius, 5.0); + } + } + + /// What Breeze has no number for is the stock recipe's, at every + /// density. + #[test] + fn what_breeze_does_not_say_is_the_stock_recipe() { + for (density, _) in DENSITIES { + let t = InputTokens::for_density(density); + let card = breeze_card_style_for(&t).recipe; + assert_eq!( + card.shadow_density, + CardRecipe::for_tokens(&t).shadow_density + ); + let dialog = breeze_dialog_style_for(&t).recipe; + assert_eq!(dialog.min_width, DialogRecipe::for_tokens(&t).min_width); + let snackbar = breeze_snackbar_style_for(&t).recipe; + let stock = SnackbarRecipe::for_tokens(&t); + assert_eq!( + (snackbar.padding_horizontal, snackbar.padding_vertical), + (stock.padding_horizontal, stock.padding_vertical) + ); + let toast = breeze_toast_style_for(&t).recipe; + let stock = ToastRecipe::for_tokens(&t); + assert_eq!( + (toast.padding_horizontal, toast.padding_vertical), + (stock.padding_horizontal, stock.padding_vertical) + ); + let badge = breeze_badge_style_for(&t).recipe; + let stock = BadgeRecipe::for_tokens(&t); + assert_eq!( + (badge.padding_horizontal, badge.padding_vertical), + (stock.padding_horizontal, stock.padding_vertical) + ); + let avatar = breeze_avatar_style_for(&t).recipe; + assert_eq!( + avatar.rounded_radius_ratio, + AvatarRecipe::for_tokens(&t).rounded_radius_ratio + ); + assert_eq!( + breeze_calendar_style_for(&t).recipe.header_gap, + CalendarRecipe::for_tokens(&t).header_gap + ); + // Breeze's tool-button rule around the recipe's chevron gives + // the recipe's own arrow. + assert_eq!( + breeze_calendar_style_for(&t).recipe.nav_arrow_size, + CalendarRecipe::for_tokens(&t).nav_arrow_size + ); + } + // The `Calendar` draws its navigation chevrons 12 px wide. + assert_eq!( + 12.0 + 2.0 * crate::geometry::TOOL_BUTTON_MARGIN_WIDTH, + CalendarRecipe::default().nav_arrow_size + ); + } +} diff --git a/crates/teksilo-theme-kde/tests/density_gaps.rs b/crates/teksilo-theme-kde/tests/density_gaps.rs new file mode 100644 index 000000000..2c81e7973 --- /dev/null +++ b/crates/teksilo-theme-kde/tests/density_gaps.rs @@ -0,0 +1,371 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! No recipe this preset builds sets a field the widget does not render. +//! +//! `engineering/docs/density-projection-gaps.md` lists the density-projected +//! recipe fields that the widget composes from the recipe module's constant +//! instead of the style: a preset that writes one writes a number nobody +//! renders. Its sections 1 to 3 are the unrendered fields (section 4 lists +//! fields the page's text rule misses but a reader can see are read). +//! +//! Two checks hold this crate to that list, both driven by the page itself so +//! a row added there is covered here with no edit: +//! +//! - every struct literal of a recipe type in this crate's `src/`, the +//! segmented control's among them, leaves out every field the page lists +//! for that recipe; +//! - every factory that builds one of those recipes gives each listed field +//! the stock recipe's value at every density. +//! +//! This file reads the page from the repository, so it is left out of the +//! published package (the `exclude` list in `Cargo.toml`). + +use std::collections::BTreeSet; +use std::path::{Path, PathBuf}; + +use teksilo_theme_kde::styles::recipes; +use teksilo_theme_kde::styles::standard_item::breeze_standard_item_recipe_for; +use teksilo_theme_kde::typography::breeze_typography; +use teksilo_tokens::{InputTokens, TargetDensity}; +use teksilo_widgets::styles::{ + AvatarRecipe, BannerRecipe, CalendarRecipe, SearchFieldRecipe, SegmentedControlRecipe, + StandardItemRecipe, ToastRecipe, +}; + +const GAPS_MD: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../engineering/docs/density-projection-gaps.md" +)); + +const DENSITIES: [TargetDensity; 3] = [ + TargetDensity::Compact, + TargetDensity::Comfortable, + TargetDensity::Touch, +]; + +/// The text between two backticks of a table cell, if the cell is one. +fn ticked(cell: &str) -> Option<&str> { + cell.trim().strip_prefix('`')?.strip_suffix('`') +} + +/// The `(recipe, field)` rows of the page's sections 1 to 3, with the +/// section each came from. +fn unrendered() -> Vec<(String, String, String)> { + let sections = GAPS_MD + .split("\n## 4.") + .next() + .expect("the page has a section 4"); + let mut section = String::new(); + let mut rows = Vec::new(); + for line in sections.lines() { + if let Some(h) = line.strip_prefix("## ").or(line.strip_prefix("### ")) { + section = h.split_whitespace().next().unwrap_or("").to_string(); + continue; + } + let cells: Vec<&str> = line.split('|').collect(); + if cells.len() < 4 || !cells[0].trim().is_empty() { + continue; + } + if let (Some(recipe), Some(field)) = (ticked(cells[1]), ticked(cells[2])) + && recipe.ends_with("Recipe") + { + rows.push((section.clone(), recipe.to_string(), field.to_string())); + } + } + rows +} + +/// The page parses: every section 1 to 3 table yields rows, and the +/// segmented control's are among them. +#[test] +fn the_page_lists_unrendered_fields_in_every_section() { + let rows = unrendered(); + let sections: BTreeSet<&str> = rows.iter().map(|(s, _, _)| s.as_str()).collect(); + for s in ["1.", "2.", "3a.", "3b."] { + assert!( + sections.contains(s), + "section {s} yields no row; parsed {sections:?}" + ); + } + assert!( + rows.iter() + .any(|(_, r, f)| r == "SegmentedControlRecipe" && f == "height"), + "the segmented control's height is listed" + ); +} + +fn strip_comments(src: &str) -> String { + src.lines() + .map(|line| match line.find("//") { + Some(i) => &line[..i], + None => line, + }) + .collect::>() + .join("\n") +} + +/// The identifier ending just before `pos`, skipping whitespace, and the text +/// before it. +fn ident_before(src: &str, pos: usize) -> Option<(&str, &str)> { + let head = src[..pos].trim_end(); + let start = head + .char_indices() + .rev() + .take_while(|(_, c)| c.is_alphanumeric() || *c == '_') + .last() + .map(|(i, _)| i)?; + Some((&head[start..], &head[..start])) +} + +fn matching_close(bytes: &[u8], open: usize) -> Option { + let mut depth = 0i32; + for (i, b) in bytes.iter().enumerate().skip(open) { + match b { + b'{' | b'(' | b'[' => depth += 1, + b'}' | b')' | b']' => { + depth -= 1; + if depth == 0 { + return Some(i); + } + } + _ => {} + } + } + None +} + +fn split_top_level(body: &str) -> Vec<&str> { + let mut parts = Vec::new(); + let mut depth = 0i32; + let mut start = 0; + for (i, c) in body.char_indices() { + match c { + '{' | '(' | '[' => depth += 1, + '}' | ')' | ']' => depth -= 1, + ',' if depth == 0 => { + parts.push(&body[start..i]); + start = i + 1; + } + _ => {} + } + } + parts.push(&body[start..]); + parts +} + +/// Every `FooRecipe { field: .. }` literal in `src`: the recipe and the +/// fields it initialises. A type named after `struct`, `impl`, `for`, `enum` +/// or a return arrow opens a declaration or a body, not a literal. +fn recipe_literals(src: &str) -> Vec<(String, Vec)> { + let src = strip_comments(src); + let bytes = src.as_bytes(); + let mut out = Vec::new(); + for (open, _) in src.match_indices('{') { + let Some((name, before)) = ident_before(&src, open) else { + continue; + }; + if !name.ends_with("Recipe") || !name.starts_with(char::is_uppercase) { + continue; + } + let prev = before.trim_end(); + if ["struct", "impl", "for", "enum", "->"] + .iter() + .any(|k| prev.ends_with(k)) + { + continue; + } + let Some(close) = matching_close(bytes, open) else { + continue; + }; + let fields = split_top_level(&src[open + 1..close]) + .into_iter() + .filter_map(|part| { + let (field, _) = part.split_once(':')?; + let field = field.trim(); + (!field.is_empty() + && field + .chars() + .all(|c| c.is_ascii_lowercase() || c.is_ascii_digit() || c == '_')) + .then(|| field.to_string()) + }) + .collect(); + out.push((name.to_string(), fields)); + } + out +} + +fn sources() -> Vec<(PathBuf, String)> { + let mut out = Vec::new(); + let mut stack = vec![Path::new(env!("CARGO_MANIFEST_DIR")).join("src")]; + while let Some(dir) = stack.pop() { + for entry in std::fs::read_dir(&dir).expect("a readable source directory") { + let path = entry.expect("a directory entry").path(); + if path.is_dir() { + stack.push(path); + } else if path.extension().is_some_and(|e| e == "rs") { + let text = std::fs::read_to_string(&path).expect("readable source"); + out.push((path, text)); + } + } + } + out +} + +/// No recipe literal in this crate initialises a field the page lists as +/// unrendered for that recipe. +#[test] +fn no_recipe_literal_sets_an_unrendered_field() { + let rows = unrendered(); + let mut literals = 0; + let mut seen: BTreeSet = BTreeSet::new(); + let mut offenders = Vec::new(); + for (path, text) in sources() { + for (recipe, fields) in recipe_literals(&text) { + literals += 1; + seen.insert(recipe.clone()); + for field in fields { + if rows.iter().any(|(_, r, f)| *r == recipe && *f == field) { + offenders.push(format!("{}: {recipe}::{field}", path.display())); + } + } + } + } + // The scan finds the literals it is meant to judge, the segmented + // control's included. + assert!(literals >= 10, "only {literals} recipe literals found"); + for recipe in [ + "SegmentedControlRecipe", + "CalendarRecipe", + "SearchFieldRecipe", + "StandardItemRecipe", + ] { + assert!(seen.contains(recipe), "no {recipe} literal found: {seen:?}"); + } + assert!( + offenders.is_empty(), + "unrendered fields set:\n{}", + offenders.join("\n") + ); +} + +/// The scan sees a field initialised in a literal, and none in a +/// declaration or a function body. +#[test] +fn the_scan_finds_fields_in_literals_only() { + let src = "pub struct FooRecipe { pub height: f32 }\n\ + fn make() -> FooRecipe {\n\ + let x: f32 = 1.0;\n\ + FooRecipe {\n\ + // a comment, with a comma: height\n\ + height: dp(x, TargetRole::Target, t),\n\ + width: 2.0,\n\ + ..FooRecipe::for_tokens(t)\n\ + }\n\ + }"; + assert_eq!( + recipe_literals(src), + vec![( + "FooRecipe".to_string(), + vec!["height".to_string(), "width".to_string()] + )] + ); +} + +/// One recipe's fields, by name. +macro_rules! fields { + ($r:expr; $($f:ident),* $(,)?) => { + vec![$((stringify!($f), $r.$f)),*] + }; +} + +type Fields = Vec<(&'static str, f32)>; + +/// Every factory of this crate that builds a recipe the page lists, with the +/// stock recipe's values at the same density: `(recipe, preset, stock)`. +fn factories(tokens: &InputTokens) -> Vec<(&'static str, Fields, Fields)> { + let avatar = |r: AvatarRecipe| fields!(r; size_small, size_medium, size_large, size_x_large); + let banner = |r: BannerRecipe| fields!(r; title_description_gap); + let calendar = |r: CalendarRecipe| fields!(r; cell_size, header_height, outer_padding, section_gap, cell_gap); + let search = |r: SearchFieldRecipe| fields!(r; row_height, input_panel_gap, panel_padding); + let segmented = + |r: SegmentedControlRecipe| fields!(r; height, padding_horizontal, padding_vertical); + let toast = |r: ToastRecipe| fields!(r; title_body_gap, body_actions_gap); + let item = |r: StandardItemRecipe| fields!(r; tree_indent_step, label_subtitle_gap, slot_gap, subtitle_slot_gap); + vec![ + ( + "AvatarRecipe", + avatar(recipes::breeze_avatar_style_for(tokens).recipe), + avatar(AvatarRecipe::for_tokens(tokens)), + ), + ( + "BannerRecipe", + banner(recipes::breeze_banner_style_for(tokens).recipe), + banner(BannerRecipe::for_tokens(tokens)), + ), + ( + "CalendarRecipe", + calendar(recipes::breeze_calendar_style_for(tokens).recipe), + calendar(CalendarRecipe::for_tokens(tokens)), + ), + ( + "SearchFieldRecipe", + search(recipes::breeze_search_field_style_for(tokens).recipe), + search(SearchFieldRecipe::for_tokens(tokens)), + ), + ( + "SegmentedControlRecipe", + segmented(recipes::breeze_segmented_control_style_for(tokens).recipe), + segmented(SegmentedControlRecipe::for_tokens(tokens)), + ), + ( + "ToastRecipe", + toast(recipes::breeze_toast_style_for(tokens).recipe), + toast(ToastRecipe::for_tokens(tokens)), + ), + ( + "StandardItemRecipe", + item(breeze_standard_item_recipe_for( + tokens, + &breeze_typography(), + )), + item(StandardItemRecipe::for_tokens(tokens)), + ), + ] +} + +/// Every listed field of a recipe this crate builds is the stock recipe's, +/// at every density: the factory leaves the unrendered dimension to the +/// widget's own constant, as the page says it must. +#[test] +fn every_factory_leaves_the_unrendered_fields_at_the_stock_projection() { + let rows = unrendered(); + let mut compared = 0; + for density in DENSITIES { + let tokens = InputTokens::for_density(density); + for (recipe, preset, stock) in factories(&tokens) { + let listed = rows + .iter() + .filter(|(_, r, _)| r == recipe) + .map(|(_, _, f)| f.as_str()); + for field in listed { + compared += 1; + let value = |set: &Fields| { + set.iter() + .find(|(f, _)| *f == field) + .map(|(_, v)| *v) + .unwrap_or_else(|| panic!("{recipe}::{field} is not compared here")) + }; + assert_eq!( + value(&preset), + value(&stock), + "{density:?}: {recipe}::{field} is set to a value the widget does not render" + ); + } + } + } + assert!( + compared > 0, + "no listed field of a recipe this crate builds" + ); +} diff --git a/crates/teksilo-theme-kde/tests/mount.rs b/crates/teksilo-theme-kde/tests/mount.rs index 7175d6460..4a75e9352 100644 --- a/crates/teksilo-theme-kde/tests/mount.rs +++ b/crates/teksilo-theme-kde/tests/mount.rs @@ -6,7 +6,8 @@ //! the check box, the radio button, the switch, the line edit, the combo //! box, the spin box, the slider, the menu, the popup frame, the tooltip, //! the list and tree rows, the table, the tab, the scroll bar and the -//! progress bar. +//! progress bar, and the widgets whose stock recipe style the preset builds +//! with Breeze's metrics. //! //! The unit tests beside each style check its rules. This checks that the //! styles run: a Tier-3 style is only exercised when its widget is built, @@ -504,6 +505,159 @@ fn every_swatch_mounts() { } } +/// The widgets whose Breeze styling is the stock recipe style built with +/// Breeze's metrics ([`kde::styles::recipes`]): each mounts and paints in +/// both schemes and without the palette. A recipe field that stops existing +/// is a compile error, but a nonsensical dimension still compiles and can +/// make a widget paint nothing. +#[test] +fn recipe_styled_widgets_mount() { + use teksilo_widgets::splitter::{Splitter, SplitterModel}; + use teksilo_widgets::{ + Avatar, Badge, Banner, Calendar, Card, Link, ListView, ModalContainer, Panel, SearchField, + SegmentedControl, + }; + let leaf = || FixedSize::new().width(120.0).height(40.0); + let mut bare = kde::light(); + bare.extensions.remove::(); + let mut all: Vec<(&str, Theme)> = themes().into_iter().collect(); + all.push(("no palette", bare)); + for (scheme, theme) in all { + for (name, drawn) in [ + ("card", mount(theme.clone(), Card::new().content(leaf()))), + ("panel", mount(theme.clone(), Panel::new().child(leaf()))), + ("dialog", mount(theme.clone(), ModalContainer::new(leaf()))), + ( + "banner", + mount( + theme.clone(), + Banner::warning(lit!("Low disk")).description(lit!("Free some space")), + ), + ), + ("link", mount(theme.clone(), Link::new(lit!("Docs")))), + ("badge", mount(theme.clone(), Badge::new(lit!("9")))), + ( + "calendar", + mount(theme.clone(), Calendar::single(Signal::new(None))), + ), + ( + "search_field", + mount(theme.clone(), SearchField::new(Signal::new(String::new()))), + ), + ( + "avatar", + mount(theme.clone(), Avatar::with_name(lit!("Jane Doe"))), + ), + ( + "segmented_control", + mount( + theme.clone(), + SegmentedControl::indexed(Signal::new(0_usize)) + .segment(lit!("One")) + .segment(lit!("Two")), + ), + ), + ( + "splitter", + mount( + theme.clone(), + Splitter::new(SplitterModel::new(2, Orientation::Horizontal)) + .pane(leaf()) + .pane(leaf()), + ), + ), + ( + "list_container", + mount( + theme.clone(), + ListView::new(ListModel::from_vec(vec!["A", "B"]), |_, item, _| { + Box::new(StandardListItem::new(lit!(*item))) + }), + ), + ), + ("snackbar", snackbar_drawn(theme.clone())), + ("toast", mount(theme.clone(), toast_surface())), + ] { + assert!(drawn > 0, "{scheme}: {name} painted nothing"); + } + } +} + +/// A toast's surface as the toast host builds it for one entry: an +/// information toast titled "Saved", with a body and a close button. +fn toast_surface() -> teksilo_widgets::toast::ToastSurface { + use teksilo_widgets::toast::surface::ToastSurfaceData; + use teksilo_widgets::toast::{ToastInstallOptions, ToastRegistry, ToastSeverity}; + let data = ToastSurfaceData { + entry_id: 1, + severity: ToastSeverity::Info, + priority: teksilo_core::styles::ToastPriority::Normal, + title: lit!("Saved"), + body: Some(lit!("The file is on disk")), + announcement: None, + actions: Rc::new(Vec::new()), + show_close_button: true, + on_click: None, + style_override: None, + body_state: Signal::new(0), + }; + teksilo_widgets::toast::ToastSurface::new( + data, + None, + ToastRegistry::new(ToastInstallOptions::default()), + false, + ) +} + +/// Open a snackbar under `theme` through its trigger and render it: the +/// number of shapes painted at the bounds of its surface's frame, which the +/// snackbar style builds. +fn snackbar_drawn(theme: Theme) -> usize { + use teksilo_core::event::WidgetEvent; + use teksilo_widgets::Snackbar; + let mut tree = tree_with(theme); + tree.add(Snackbar::new(lit!("Show")).content(TextWidget::new(lit!("File deleted")))); + let proposal = SizeProposal::exact(400.0, 300.0); + tree.layout(proposal); + let trigger = tree.find_by_label("Show").expect("the snackbar's trigger"); + tree.dispatch_event(WidgetEvent::AccessAction { + action: teksilo_core::accesskit::Action::Click, + target: Some(trigger), + target_node: teksilo_core::accessibility::root_node_id(), + data: None, + }); + // Past the fade-in, so the surface paints at full opacity. + tree.advance_time(Duration::from_secs(1)); + tree.layout(proposal); + let frame = tree.render(); + let surfaces: Vec = tree + .roots() + .into_iter() + .flat_map(|root| nodes_named(&tree, root, "SnackbarFrame")) + .collect(); + assert_eq!(surfaces.len(), 1, "the snackbar is open"); + let at = tree.bounds(surfaces[0]).to_array(); + frame.shapes.iter().filter(|s| s.screen == at).count() +} + +/// A badge rounds at the 5 px frame radius rather than as a pill: Breeze +/// draws no pill. +#[test] +fn a_badge_rounds_at_the_frame_radius() { + use teksilo_widgets::Badge; + for (scheme, theme) in themes() { + let (mut tree, _) = placed(theme, Badge::new(lit!("12"))); + let frame = rerender(&mut tree); + assert!( + frame + .shapes + .iter() + .any(|s| s.stroke_width == 0.0 && s.corner_radii == [5.0; 4]), + "{scheme}: no fill at the frame radius" + ); + } +} + // ── Breeze's colours, checked in the render frame ─────────────────────── /// A push button at rest: Plasma's button face and outline, and the shadow, diff --git a/crates/teksilo-theme-kde/tests/preset_metrics.rs b/crates/teksilo-theme-kde/tests/preset_metrics.rs index 90ae76fb7..b4ab30c08 100644 --- a/crates/teksilo-theme-kde/tests/preset_metrics.rs +++ b/crates/teksilo-theme-kde/tests/preset_metrics.rs @@ -32,7 +32,7 @@ use teksilo_target_conformance::in_tappable_row; use teksilo_theme_kde::geometry::BreezeGeometry; use teksilo_theme_kde::{self as kde}; use teksilo_tokens::TargetDensity; -use teksilo_widgets::primitives::{FixedSize, IconWidget}; +use teksilo_widgets::primitives::{FixedSize, HStack, IconWidget, VStack}; use teksilo_widgets::{ Button, ButtonVariant, Checkbox, ComboBox, IconButton, IconButtonSize, MenuItem, MenuList, RadioButton, Slider, SpinBox, SplitButton, TextInput, Toggle, @@ -1062,3 +1062,460 @@ fn a_progress_bar_is_qts_hint_around_breezes_groove() { } } } + +// ── Recipe slots built with Breeze's metrics ────────────────────────── + +/// The spacing factor of each density's ladder, which every Breeze gap the +/// recipe slots set is scaled by. +const SPACING: [(TargetDensity, f32); 3] = [ + (TargetDensity::Compact, 1.0), + (TargetDensity::Comfortable, 1.15), + (TargetDensity::Touch, 1.3), +]; + +fn near(a: f32, b: f32) -> bool { + (a - b).abs() < 1e-3 +} + +/// A tree under `theme` at `density` holding `w` at its natural size, laid +/// out and rendered: the tree, the widget's root and the render frame. +fn natural( + theme: &Theme, + density: TargetDensity, + w: impl Widget + 'static, +) -> (WidgetTree, WidgetId, Rc) { + natural_in(theme.with_density(density), w) +} + +/// [`natural`] under `theme` as it is, already at its density. +fn natural_in( + theme: Theme, + w: impl Widget + 'static, +) -> (WidgetTree, WidgetId, Rc) { + let mut tree = WidgetTree::new() + .with_theme(theme) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))); + let root = tree.add(VStack::new().child(HStack::new().child(w))); + tree.layout(SizeProposal::exact(800.0, 600.0)); + let frame = tree.render(); + (tree, root, frame) +} + +/// The one `name` node under `root`. +fn the(tree: &WidgetTree, root: WidgetId, name: &str) -> WidgetId { + let nodes = nodes_named(tree, root, name); + assert_eq!(nodes.len(), 1, "one {name}, found {}", nodes.len()); + nodes[0] +} + +/// How far `inner` lies inside `outer` on each side: leading, top, +/// trailing, bottom. +fn insets(tree: &WidgetTree, outer: WidgetId, inner: WidgetId) -> [f32; 4] { + let o = tree.bounds(outer); + let i = tree.bounds(inner); + [ + i.x - o.x, + i.y - o.y, + (o.x + o.width) - (i.x + i.width), + (o.y + o.height) - (i.y + i.height), + ] +} + +/// Whether the frame strokes a rounded rectangle at `radius` in a pen of +/// `pen`. +fn strokes_at(frame: &teksilo_canvas::RenderFrame, radius: f32, pen: f32) -> bool { + frame + .shapes + .iter() + .any(|s| s.stroke_width == pen && s.corner_radii == [radius; 4]) +} + +/// A leaf of a fixed size, the content the frames are measured around. +fn leaf() -> FixedSize { + FixedSize::new().width(300.0).height(40.0) +} + +/// A `Panel` and an outlined `Card` are Breeze's group box: their content +/// 6 px inside the frame, the margin of a nested layout, scaled by the +/// density's spacing, and the frame stroked at the 5 px radius in the 1 px +/// pen. +#[test] +fn a_panel_and_a_card_frame_their_content_as_a_group_box_at_every_density() { + use teksilo_core::styles::CardVariant; + use teksilo_widgets::{Card, Panel}; + for (density, factor) in SPACING { + for theme in themes() { + let (tree, root, frame) = natural(&theme, density, Panel::new().child(leaf())); + let pad = insets( + &tree, + the(&tree, root, "PanelFrame"), + the(&tree, root, "FixedSize"), + ); + assert!( + pad.iter().all(|p| near(*p, 6.0 * factor)), + "{density:?}: the panel's content lies {pad:?} inside it" + ); + assert!(strokes_at(&frame, 5.0, 1.0), "{density:?}: the panel frame"); + + let (tree, root, frame) = natural( + &theme, + density, + Card::new().variant(CardVariant::Outlined).content(leaf()), + ); + let pad = insets( + &tree, + the(&tree, root, "CardFrame"), + the(&tree, root, "FixedSize"), + ); + assert!( + pad.iter().all(|p| near(*p, 6.0 * factor)), + "{density:?}: the card's content lies {pad:?} inside it" + ); + assert!(strokes_at(&frame, 5.0, 1.0), "{density:?}: the card frame"); + } + } +} + +/// A dialog's content lies Breeze's 10 px dialog margin inside its panel, +/// the top-level layout margin, scaled by the density's spacing, and the +/// panel is rounded at the 5 px window radius. +#[test] +fn a_dialog_holds_its_content_inside_breezes_dialog_margin_at_every_density() { + use teksilo_widgets::ModalContainer; + for (density, factor) in SPACING { + for theme in themes() { + let (tree, root, frame) = natural(&theme, density, ModalContainer::new(leaf())); + let pad = insets( + &tree, + the(&tree, root, "DialogPanel"), + the(&tree, root, "FixedSize"), + ); + assert!( + pad.iter().all(|p| near(*p, 10.0 * factor)), + "{density:?}: the dialog's content lies {pad:?} inside it" + ); + assert!( + strokes_at(&frame, 5.0, 1.0), + "{density:?}: the dialog panel" + ); + } + } +} + +/// A banner lays its glyph and text out 6 px inside its frame and 6 px +/// apart, Breeze's child margin and layout spacing, scaled by the density's +/// spacing. +#[test] +fn a_banner_lays_out_on_breezes_margin_and_spacing_at_every_density() { + use teksilo_widgets::Banner; + for (density, factor) in SPACING { + for theme in themes() { + let (tree, root, _) = natural(&theme, density, Banner::info(lit!("Saved"))); + let padding = nodes_named(&tree, root, "Padding") + .into_iter() + .find(|p| { + tree.children(*p).first().is_some_and(|c| { + tree.widget_type_name(*c) + .is_some_and(|t| t.ends_with("HStack")) + }) + }) + .expect("the banner pads its row"); + let row = tree.children(padding)[0]; + let pad = insets(&tree, padding, row); + assert!( + pad.iter().all(|p| near(*p, 6.0 * factor)), + "{density:?}: the banner's row lies {pad:?} inside it" + ); + let items = tree.children(row); + assert_eq!(items.len(), 2, "the glyph and the text"); + let glyph = tree.bounds(items[0]); + let gap = tree.bounds(items[1]).x - (glyph.x + glyph.width); + assert!(near(gap, 6.0 * factor), "{density:?}: a gap of {gap}"); + } + } +} + +/// The `(horizontal, vertical)` gutter inside a suggestion row of a search +/// field under `theme` at `density`, measured on the open suggestion list. +fn suggestion_row_gutters(theme: &Theme, density: TargetDensity) -> (f32, f32) { + use teksilo_core::event::{Key, Modifiers}; + use teksilo_widgets::SearchField; + let mut tree = WidgetTree::new() + .with_theme(theme.with_density(density)) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))); + let query = Signal::new(String::new()); + tree.add( + SearchField::new(query.clone()) + .with_suggestions(|_| vec!["alpha".to_string(), "apricot".to_string()]), + ); + let proposal = SizeProposal::exact(400.0, 300.0); + tree.layout(proposal); + // The provider runs off the query, so the list is empty until it + // changes. + query.set("a".to_string()); + tree.layout(proposal); + let mut fields = Vec::new(); + for root in tree.roots() { + fields.extend(nodes_named(&tree, root, "TextInputField")); + } + tree.focus(*fields.first().expect("the field's editable surface")); + tree.press_key(Key::ArrowDown, Modifiers::default()); + tree.layout(proposal); + let mut rows = Vec::new(); + for root in tree.roots() { + rows.extend(nodes_named(&tree, root, "SuggestionRow")); + } + assert_eq!(rows.len(), 2, "two suggestions, two rows"); + let padding = the(&tree, rows[0], "Padding"); + let pad = tree.bounds(padding); + let label = tree.bounds(tree.children(padding)[0]); + ( + (pad.width - label.width) / 2.0, + (pad.height - label.height) / 2.0, + ) +} + +/// A suggestion's text lies where Breeze puts the text of a menu item +/// without icons: 16 px across and the 4 px item margin down, scaled by the +/// density's spacing. +#[test] +fn a_search_field_lays_its_suggestions_out_as_menu_items_at_every_density() { + for (density, factor) in SPACING { + let (h, v) = suggestion_row_gutters(&kde::light(), density); + assert!( + near(h, 16.0 * factor) && near(v, 4.0 * factor), + "{density:?}: ({h}, {v})" + ); + } +} + +/// A calendar marks today with a ring in the 1 px pen at the 5 px frame +/// radius, at every density. Its header keeps the recipe's gap between the +/// arrows, so the month title between them stays a target: no part of the +/// calendar is a conformance failure. +#[test] +fn a_calendar_rings_today_in_the_pen_and_keeps_its_targets_at_every_density() { + use teksilo_widgets::Calendar; + use teksilo_widgets::styles::CalendarRecipe; + for (density, _) in SPACING { + for theme in themes() { + let (tree, root, frame) = natural(&theme, density, Calendar::single(Signal::new(None))); + assert!(strokes_at(&frame, 5.0, 1.0), "{density:?}: today's ring"); + let arrows = nodes_named(&tree, root, "NavArrow"); + assert_eq!(arrows.len(), 4, "prev-year / prev / next / next-year"); + let a = tree.bounds(arrows[0]); + let gap = tree.bounds(arrows[1]).x - (a.x + a.width); + let stock = CalendarRecipe::for_tokens(&theme.with_density(density).input).header_gap; + assert!(near(gap, stock), "{density:?}: a gap of {gap}"); + let failures: Vec<_> = target_audit(&tree, density) + .into_iter() + .filter(|v| v.rule.is_conformance_failure()) + .collect(); + assert!(failures.is_empty(), "{density:?}: {failures:#?}"); + } + } +} + +/// A segmented control's frame is a Breeze button's, at the 5 px radius in +/// the 1 px pen. Its height is the one the stock recipe gives under the same +/// theme, at every density: the control lays it out from the recipe +/// module's constants, which the preset therefore leaves alone, around +/// Breeze's 18 px line, 30 px at every density. +#[test] +fn a_segmented_control_takes_breezes_frame_and_keeps_its_height() { + use teksilo_widgets::SegmentedControl; + use teksilo_widgets::styles::RecipeSegmentedControlStyle; + let control = || { + SegmentedControl::indexed(Signal::new(0_usize)) + .segment(lit!("One")) + .segment(lit!("Two")) + }; + for (density, _) in SPACING { + for theme in themes() { + let (tree, root, frame) = natural(&theme, density, control()); + let got = tree.bounds(the(&tree, root, "SegmentedControl")).height; + assert!(strokes_at(&frame, 5.0, 1.0), "{density:?}: the frame"); + let mut stock = theme.with_density(density); + stock.style_slots.segmented_control = Some(Rc::new( + RecipeSegmentedControlStyle::for_tokens(&stock.input), + )); + let (tree, root, _) = natural_in(stock, control()); + let want = tree.bounds(the(&tree, root, "SegmentedControl")).height; + assert_eq!(got, want, "{density:?}: the stock recipe's height"); + assert_eq!(got, 30.0, "{density:?}"); + } + } +} + +/// A focused link is ringed as Breeze frames keyboard focus (spec k.5.8): +/// a 2 px ring from 1 px inside the link to 1 px outside it, its inner edge +/// rounded at the 5 px frame radius and its outer edge at 7. The recipe +/// strokes it centred on the link's bounds, so the stroke's centre line is +/// the bounds, rounded at 6. An unfocused link draws no ring. +#[test] +fn a_focused_links_ring_is_breezes_focus_frame_at_every_density() { + use teksilo_core::event::{Key, Modifiers}; + use teksilo_widgets::Link; + for (density, _) in SPACING { + for theme in themes() { + let (mut tree, root, frame) = natural(&theme, density, Link::new(lit!("Docs"))); + let ring_width = theme.shape.focus_ring_width; + assert_eq!(ring_width, 2.0, "Breeze's ring is 2 px wide"); + assert!( + !frame.shapes.iter().any(|s| s.stroke_width == ring_width), + "{density:?}: a ring before focus" + ); + let link = the(&tree, root, "Link"); + // Tab, as a keyboard user does: the ring shows on keyboard focus. + tree.press_key(Key::Tab, Modifiers::NONE); + assert_eq!( + tree.focused(), + Some(link), + "{density:?}: Tab reaches the link" + ); + tree.layout(SizeProposal::exact(800.0, 600.0)); + let frame = tree.render(); + let rings: Vec<_> = frame + .shapes + .iter() + .filter(|s| s.stroke_width == ring_width) + .collect(); + assert_eq!(rings.len(), 1, "{density:?}: one focus ring"); + let ring = rings[0]; + assert_eq!( + ring.screen, + tree.bounds(link).to_array(), + "{density:?}: the ring is centred on the link's bounds" + ); + let half = ring_width / 2.0; + for r in ring.corner_radii { + assert!( + near(r - half, 5.0) && near(r + half, 7.0), + "{density:?}: a ring rounded at {r}, edges at {} and {}", + r - half, + r + half + ); + } + } + } +} + +/// A snackbar's surface rounds at the 5 px window radius, as every Breeze +/// window does, at every density. +#[test] +fn a_snackbar_rounds_at_the_window_radius_at_every_density() { + use teksilo_core::event::WidgetEvent; + use teksilo_widgets::Snackbar; + for (density, _) in SPACING { + for theme in themes() { + let mut tree = WidgetTree::new() + .with_theme(theme.with_density(density)) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))); + tree.add(Snackbar::new(lit!("Show")).content(leaf())); + let proposal = SizeProposal::exact(800.0, 600.0); + tree.layout(proposal); + let trigger = tree.find_by_label("Show").expect("the snackbar's trigger"); + tree.dispatch_event(WidgetEvent::AccessAction { + action: teksilo_core::accesskit::Action::Click, + target: Some(trigger), + target_node: teksilo_core::accessibility::root_node_id(), + data: None, + }); + // Past the fade-in, so the surface paints at full opacity. + tree.advance_time(std::time::Duration::from_secs(1)); + tree.layout(proposal); + let frame = tree.render(); + let surfaces: Vec = tree + .roots() + .into_iter() + .flat_map(|root| nodes_named(&tree, root, "SnackbarFrame")) + .collect(); + assert_eq!(surfaces.len(), 1, "{density:?}: the snackbar is open"); + let at = tree.bounds(surfaces[0]).to_array(); + let fill = frame + .shapes + .iter() + .find(|s| s.screen == at && s.stroke_width == 0.0) + .unwrap_or_else(|| panic!("{density:?}: no snackbar surface")); + assert_eq!(fill.corner_radii, [5.0; 4], "{density:?}: the surface"); + assert!( + frame + .shapes + .iter() + .any(|s| s.screen == at && s.stroke_width == 1.0 && s.corner_radii == [5.0; 4]), + "{density:?}: the surface's outline" + ); + } + } +} + +/// A toast's surface rounds at the 5 px window radius, and its glyph, its +/// text and its close button stand Breeze's 6 px layout spacing apart, +/// scaled by the density's spacing. +#[test] +fn a_toast_rounds_at_the_window_radius_and_spaces_its_row_at_every_density() { + use teksilo_widgets::toast::surface::ToastSurfaceData; + use teksilo_widgets::toast::{ToastInstallOptions, ToastRegistry, ToastSeverity, ToastSurface}; + for (density, factor) in SPACING { + for theme in themes() { + let data = ToastSurfaceData { + entry_id: 1, + severity: ToastSeverity::Info, + priority: teksilo_core::styles::ToastPriority::Normal, + title: lit!("Saved"), + body: None, + announcement: None, + actions: Rc::new(Vec::new()), + show_close_button: true, + on_click: None, + style_override: None, + body_state: Signal::new(0), + }; + let surface = ToastSurface::new( + data, + None, + ToastRegistry::new(ToastInstallOptions::default()), + false, + ); + let (tree, root, frame) = natural(&theme, density, surface); + let toast = the(&tree, root, "ToastSurface"); + let body = tree.children(toast)[0]; + let background = tree.children(body)[0]; + assert_eq!( + tree.widget_type_name(background) + .and_then(|t| t.rsplit("::").next()), + Some("RectWidget"), + "the surface's background" + ); + let at = tree.bounds(background).to_array(); + let fill = frame + .shapes + .iter() + .find(|s| s.screen == at && s.stroke_width == 0.0) + .unwrap_or_else(|| panic!("{density:?}: no toast surface")); + assert_eq!(fill.corner_radii, [5.0; 4], "{density:?}: the surface"); + + let padding = tree.children(body)[1]; + let row = tree.children(padding)[0]; + let items = tree.children(row); + assert_eq!(items.len(), 3, "the glyph, the text and the close button"); + for pair in items.windows(2) { + let before = tree.bounds(pair[0]); + let gap = tree.bounds(pair[1]).x - (before.x + before.width); + assert!(near(gap, 6.0 * factor), "{density:?}: a gap of {gap}"); + } + } + } +} + +/// A link's underline is the 1 px pen at every density. +#[test] +fn a_links_underline_is_the_pen_at_every_density() { + use teksilo_widgets::Link; + for (density, _) in SPACING { + let (tree, root, _) = natural(&kde::light(), density, Link::new(lit!("Docs"))); + let underline = nodes_named(&tree, root, "FixedSize"); + assert_eq!(underline.len(), 1, "one underline"); + assert_eq!(tree.bounds(underline[0]).height, 1.0, "{density:?}"); + } +} From 9e96e25b4bff8aa16b5de677e76cbea05639f7b7 Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 20:44:17 +0200 Subject: [PATCH 28/59] feat(theme-kde): build the theme of the live KDE desktop from_desktop(&KdeDesktop, TargetDensity) builds the Breeze theme of a desktop as it is configured, and native_theme gives it only for a desktop using the Breeze widget style: widgetStyle absent, empty or "breeze" in any ASCII case (spec j.4). Fusion, Oxygen, Kvantum and every other style get None, so the native-theme seam falls back to IntUI in the desktop's colours. Colours: the desktop's scheme, through KdePalette::from_scheme, the user's accent already in it. Fonts (spec j.1, l.2): the general font becomes body and body_bold, the smallest readable font small, small_bold and tiny, the fixed font mono, in the desktop's own families. The glyph size is the whole pixel size Qt draws the font at (a font stored in pixels keeps its pixel size), the line box Qt's for Noto Sans and Hack and round(P x 1.362) for any other family; the weights stay the slots' 400 and 600. The control heights follow the body line box through geometry_of. The menu and toolbar fonts have no text style and ride on the theme as KdeFontRoles, a new extension; menu rows are sized for the taller of the menu font's and the body's line box (menu_row_typography), since MenuItem writes its label in the body style. Animation speed (spec j.2, m): motion::desktop_motion applies AnimationDurationFactor as Kirigami does: the long duration max(1, round(200 f)) is duration_normal and duration_collapse, its half rounded down duration_fast, its double duration_slow; the busy period and the tooltip delays are not scaled. A factor of 0 gives 0 and 1 ms transitions and BreezeStyleConfig::prefers_reduced_motion reports it. Plan deviation: the plan scales every non-zero duration with MotionTokens::scaled; the specification derives the short duration from the long one and leaves the busy period alone, and a test pins the difference. breezerc (spec j.6, k.5.13, k.6): BreezeStyleConfig, a new extension in breeze_config.rs, carries BreezeSettings and the factor on every theme (the defaults on the stock ones). Under MenuOpacity below 100 a menu's panel (the new BreezePopupKind::Menu, the popover style's Menu variant) is filled at that opacity and outlined in the window text at 25 %; ShadowSize, ShadowStrength and ShadowColor give the window shadow, shadow_lg and shadow_inner_lg, through shape::breeze_shape_for (None paints no shadow); ProgressBarBusyStepDuration is the sweep token and the busy bar's period, and ProgressBarAnimated off stands the stripes still. The other keys are carried and change nothing, each reason listed on BreezeStyleConfig. The seam's contract, documented on native_theme: resolve_native_theme returns a factory's theme as it comes, and the window manager's resolution then stamps the id "system" and projects it onto the window's density; the theme itself carries kde.light or kde.dark and the density it was asked at. Tests: tests/native.rs covers the five fonts, a Qt 5 font string, the line boxes of known and unknown families, the button and menu heights they give, a menu font smaller than the body and the menu metrics across a density projection; factors 2, 0 and absent; MenuOpacity on the resolved colours and on a mounted MenuList's painted panel, with the popover staying opaque; the shadow size, colour, strength and None; the busy bar's 400 ms period on the simulated clock and its stripes standing still; Fusion, Oxygen, Kvantum and others to None, Breeze in any case, empty and absent to Some at the density asked; and the theme composing through teksilo-app's resolve_native_theme with a factory, before and after the window manager's id and density, with the fallback for a Fusion desktop and for a report without KDE settings (teksilo-app and teksilo-platform as dev-dependencies, acyclic). Unit tests cover BreezeStyleConfig, desktop_motion, desktop_typography, breeze_shape_for and the menu panel colours; lib.rs checks every theme carries both extensions and that the default desktop is the stock theme in its own faces. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 16 +- Cargo.lock | 2 + crates/teksilo-theme-kde/Cargo.toml | 5 + crates/teksilo-theme-kde/src/breeze_config.rs | 183 +++++++ crates/teksilo-theme-kde/src/lib.rs | 261 +++++++++- crates/teksilo-theme-kde/src/motion.rs | 142 ++++- crates/teksilo-theme-kde/src/shape.rs | 73 ++- .../teksilo-theme-kde/src/styles/menu_item.rs | 33 +- .../teksilo-theme-kde/src/styles/popover.rs | 7 +- crates/teksilo-theme-kde/src/styles/popup.rs | 76 ++- .../src/styles/progress_bar.rs | 34 +- crates/teksilo-theme-kde/src/typography.rs | 209 +++++++- crates/teksilo-theme-kde/tests/native.rs | 490 ++++++++++++++++++ 13 files changed, 1476 insertions(+), 55 deletions(-) create mode 100644 crates/teksilo-theme-kde/src/breeze_config.rs create mode 100644 crates/teksilo-theme-kde/tests/native.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index bf47cbda6..938a0d56a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -220,7 +220,21 @@ by crate for clarity, not because crates version independently. ringed by Breeze's 2 px focus frame, from 1 px inside it to 1 px outside, and a `SearchField`'s suggestions are laid out as the items of a Breeze menu without icons. Other widgets draw Teksilo's own chrome in these - colours and shapes. + colours and shapes. `from_desktop` gives the theme of a KDE desktop as it + is configured: its colour scheme with the accent the user chose; its + general, smallest readable and fixed fonts as the text styles, in the + desktop's own families at the sizes and line heights Qt gives them, so + the controls grow with the font; its menu font sizing the menu rows, and + its menu and toolbar fonts carried as `KdeFontRoles`; its animation + speed, which slows or quickens the transitions as it does Plasma's, a + factor of 0 meaning reduced motion; and its `breezerc`, carried as + `BreezeStyleConfig`: menus translucent under `MenuOpacity`, the window + shadow's size, colour and strength, and the busy progress bar's period, + or its stripes standing still. `native_theme` gives that theme for a + desktop using the Breeze widget style and nothing for Fusion, Oxygen, + Kvantum or any other, which keep Teksilo's default shapes in the + desktop's colours; it is what `TeksiloAppBuilder::native_theme` asks + for, so a window in `ThemeMode::Native` shows Breeze on a Breeze desktop. #### Platform diff --git a/Cargo.lock b/Cargo.lock index 60150b2a5..d5cd6dccc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12235,11 +12235,13 @@ version = "0.19.0" dependencies = [ "proptest", "serde_json", + "teksilo-app", "teksilo-canvas", "teksilo-core", "teksilo-data", "teksilo-i18n", "teksilo-kde-scheme", + "teksilo-platform", "teksilo-target-conformance", "teksilo-tokens", "teksilo-widgets", diff --git a/crates/teksilo-theme-kde/Cargo.toml b/crates/teksilo-theme-kde/Cargo.toml index 72888124f..a6e79d32e 100644 --- a/crates/teksilo-theme-kde/Cargo.toml +++ b/crates/teksilo-theme-kde/Cargo.toml @@ -59,6 +59,11 @@ teksilo-data = { workspace = true } # version): the crate is `publish = false`, and cargo strips versionless # path dev-dependencies at publish time. teksilo-target-conformance = { path = "../teksilo-target-conformance" } +# `tests/native.rs` hands `native_theme` to the app's native-theme seam, +# `resolve_native_theme`, with the desktop report the platform builds. +# Neither crate depends on this one, so this is acyclic. +teksilo-app = { workspace = true } +teksilo-platform = { workspace = true } [package.metadata.docs.rs] all-features = true diff --git a/crates/teksilo-theme-kde/src/breeze_config.rs b/crates/teksilo-theme-kde/src/breeze_config.rs new file mode 100644 index 000000000..410894c79 --- /dev/null +++ b/crates/teksilo-theme-kde/src/breeze_config.rs @@ -0,0 +1,183 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The Breeze widget-style settings a desktop configures, carried on a +//! theme as an extension ([`BreezeStyleConfig`]). + +use std::time::Duration; + +use teksilo_kde_scheme::{BreezeSettings, KdeDesktop}; + +/// The Breeze widget-style settings of a desktop: `breezerc` and the +/// animation speed. +/// +/// A [`teksilo_core::styles::Theme`] extension. [`Default`] is a desktop +/// whose `breezerc` and `[KDE]` group set nothing. +/// +/// It holds what `breezerc` sets (read by +/// [`BreezeSettings::from_config`](teksilo_kde_scheme::BreezeSettings::from_config)) +/// and the desktop's animation speed, `kdeglobals [KDE] +/// AnimationDurationFactor`. Every theme of this preset carries one: +/// [`crate::light`] and the other stock themes carry the defaults, and +/// [`crate::from_desktop`] the desktop's own. The styles read it from the +/// theme they paint under, so a theme without one paints the defaults. +/// +/// What the preset does with each setting: +/// +/// | Setting | Effect | +/// | --- | --- | +/// | `[Style] MenuOpacity` | Below 100, a menu's panel is filled at that opacity and outlined in the window text at 25 % ([`crate::styles::popup`]) | +/// | `[Common] ShadowSize`, `ShadowStrength`, `ShadowColor` | The window shadow under every popup, `shadow_lg` and `shadow_inner_lg` ([`crate::shape::breeze_shape_for`]) | +/// | `[Style] ProgressBarAnimated`, `ProgressBarBusyStepDuration` | Whether a busy progress bar's stripes move, and the period they move in ([`crate::styles::progress_bar`]) | +/// | `[KDE] AnimationDurationFactor` | The motion tokens ([`crate::motion::desktop_motion`]); 0 is the desktop asking for reduced motion ([`BreezeStyleConfig::prefers_reduced_motion`]) | +/// +/// The other keys are carried for an application to read and change +/// nothing the preset paints, each for its reason: +/// +/// - `AnimationsEnabled`, `AnimationsDuration` and `AnimationSteps` time +/// Breeze's own style animations; Teksilo's controls take their timing +/// from the motion tokens, which follow Kirigami's rule for the factor +/// (spec j.2), so a desktop's factor reaches them and these do not. +/// - `MenuItemDrawStrongFocus`: a highlighted menu row is always washed and +/// outlined, Breeze's default. With the key off Breeze marks the row the +/// keyboard is on with a 1 px underline only, a weaker focus indicator +/// than the lifted outline the preset keeps. +/// - `ViewDrawFocusIndicator`: the focus frame of a focused list row is +/// the view's keyboard focus indicator, and the preset keeps it. +/// - `ScrollBarAddLineButtons`, `ScrollBarSubLineButtons`, +/// `SliderDrawTickMarks`, `ViewDrawTreeBranchLines`, +/// `ViewInvertSortIndicator`, `TabBarDrawCenteredTabs`, +/// `ToolBarDrawItemSeparator`, `DockWidgetDrawFrame`, +/// `SidePanelDrawFrame`, `StackedWidgetTransitionsEnabled` and +/// `MnemonicsMode` change parts the widgets build themselves (a scroll +/// bar's buttons, a slider's ticks, a tree's lines, a tab bar's +/// alignment, a toolbar's separators, a stack's transition, the mnemonic +/// underline), which a style is not asked to draw. +/// +/// ``` +/// use teksilo_theme_kde::{self as kde, BreezeStyleConfig}; +/// use teksilo_theme_kde::scheme::{KdeColorScheme, KdeDesktop}; +/// use teksilo_tokens::TargetDensity; +/// +/// let mut desktop = KdeDesktop::new(KdeColorScheme::breeze_light()); +/// desktop.breeze.menu_opacity = 80; +/// let theme = kde::from_desktop(&desktop, TargetDensity::Compact); +/// let config = theme.extension::().unwrap(); +/// assert_eq!(config.menu_opacity(), 0.8); +/// ``` +#[derive(Debug, Clone, Copy, PartialEq, Default)] +#[non_exhaustive] +pub struct BreezeStyleConfig { + /// What `breezerc` sets. + pub settings: BreezeSettings, + /// `kdeglobals [KDE] AnimationDurationFactor`, `None` when the desktop + /// does not set it. + pub animation_factor: Option, +} + +impl BreezeStyleConfig { + /// The settings `desktop` configures. + pub fn from_desktop(desktop: &KdeDesktop) -> BreezeStyleConfig { + BreezeStyleConfig { + settings: desktop.breeze, + animation_factor: desktop.animation_duration_factor, + } + } + + /// `[S]` The opacity of a menu's panel, `MenuOpacity / 100`: 1 unless + /// the desktop makes menus translucent. + pub fn menu_opacity(&self) -> f32 { + f32::from(self.settings.menu_opacity.min(100)) / 100.0 + } + + /// `[S]` Whether menus are translucent: `MenuOpacity` below 100, which + /// is when Breeze also outlines the panel in the window text at 25 %. + pub fn menu_is_translucent(&self) -> bool { + self.settings.menu_opacity < 100 + } + + /// `[Hp]` The strength of the window shadow, `ShadowStrength / 255`. + pub fn shadow_strength(&self) -> f32 { + f32::from(self.settings.shadow_strength) / 255.0 + } + + /// `[S]` The period of a busy progress bar's stripes, or `None` when + /// they stand still: `ProgressBarAnimated` is off, or + /// `ProgressBarBusyStepDuration` is not a positive number of + /// milliseconds (`[unpublished]`: a period of no length cannot move). + pub fn busy_step(&self) -> Option { + let ms = self.settings.progress_bar_busy_step_duration_ms; + (self.settings.progress_bar_animated && ms > 0) + .then(|| Duration::from_millis(u64::try_from(ms).unwrap_or(u64::MAX))) + } + + /// Whether the desktop asks for reduced motion: its animation duration + /// factor is exactly 0, as the KDE desktop portal reports it. The + /// platform reads the same factor into the accessibility preferences, + /// which is how the framework's transitions learn to snap. + pub fn prefers_reduced_motion(&self) -> bool { + self.animation_factor == Some(0.0) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use teksilo_kde_scheme::KdeColorScheme; + + #[test] + fn the_defaults_are_a_desktop_that_sets_nothing() { + let c = BreezeStyleConfig::default(); + assert_eq!(c.settings, BreezeSettings::default()); + assert_eq!(c.animation_factor, None); + assert_eq!(c.menu_opacity(), 1.0); + assert!(!c.menu_is_translucent()); + assert_eq!(c.shadow_strength(), 1.0); + assert_eq!(c.busy_step(), Some(Duration::from_millis(800))); + assert!(!c.prefers_reduced_motion()); + let desktop = KdeDesktop::new(KdeColorScheme::breeze_light()); + assert_eq!(BreezeStyleConfig::from_desktop(&desktop), c); + } + + #[test] + fn a_desktop_carries_its_settings_through() { + let mut desktop = KdeDesktop::new(KdeColorScheme::breeze_dark()); + desktop.breeze.menu_opacity = 75; + desktop.breeze.shadow_strength = 51; + desktop.breeze.progress_bar_busy_step_duration_ms = 400; + desktop.animation_duration_factor = Some(0.0); + let c = BreezeStyleConfig::from_desktop(&desktop); + assert_eq!(c.menu_opacity(), 0.75); + assert!(c.menu_is_translucent()); + assert!((c.shadow_strength() - 0.2).abs() < 1e-6); + assert_eq!(c.busy_step(), Some(Duration::from_millis(400))); + assert!(c.prefers_reduced_motion()); + } + + #[test] + fn a_busy_bar_stands_still_when_its_animation_is_off_or_has_no_period() { + let mut c = BreezeStyleConfig::default(); + c.settings.progress_bar_animated = false; + assert_eq!(c.busy_step(), None); + c.settings.progress_bar_animated = true; + c.settings.progress_bar_busy_step_duration_ms = 0; + assert_eq!(c.busy_step(), None); + c.settings.progress_bar_busy_step_duration_ms = -5; + assert_eq!(c.busy_step(), None); + } + + #[test] + fn only_an_exact_zero_factor_asks_for_reduced_motion() { + let mut c = BreezeStyleConfig::default(); + for (factor, reduced) in [ + (None, false), + (Some(1.0), false), + (Some(0.5), false), + (Some(1e-9), false), + (Some(0.0), true), + ] { + c.animation_factor = factor; + assert_eq!(c.prefers_reduced_motion(), reduced, "{factor:?}"); + } + } +} diff --git a/crates/teksilo-theme-kde/src/lib.rs b/crates/teksilo-theme-kde/src/lib.rs index c67d1996b..434696609 100644 --- a/crates/teksilo-theme-kde/src/lib.rs +++ b/crates/teksilo-theme-kde/src/lib.rs @@ -87,6 +87,29 @@ //! field the line plus 14: 34 and 32 px at Plasma's default font, and //! they grow with it ([`geometry`]). //! +//! ## The live desktop +//! +//! [`from_desktop`] builds the theme of a KDE desktop as it is configured, +//! read by the platform or by [`scheme`] ([`scheme::KdeDesktop`]): its +//! colour scheme with the user's accent, its fonts, its animation speed and +//! its `breezerc`. [`native_theme`] is the same theme for a desktop styled +//! with Breeze and `None` for one styled otherwise, the shape +//! `teksilo-app`'s native-theme factory takes: +//! +//! ``` +//! use teksilo_theme_kde::{self as kde, scheme::KdeColorScheme, scheme::KdeDesktop}; +//! use teksilo_tokens::TargetDensity; +//! +//! let mut desktop = KdeDesktop::new(KdeColorScheme::breeze_light()); +//! assert!(kde::native_theme(&desktop, TargetDensity::Compact).is_some()); +//! desktop.widget_style = Some("Fusion".to_owned()); +//! assert!(kde::native_theme(&desktop, TargetDensity::Compact).is_none()); +//! ``` +//! +//! Every theme carries the desktop's `breezerc` settings as a +//! [`BreezeStyleConfig`] and its menu and toolbar fonts as +//! [`KdeFontRoles`], at Plasma's defaults for the stock themes. +//! //! ## Accent colour //! //! [`light_with_accent`] and [`dark_with_accent`] apply an accent the way @@ -158,9 +181,10 @@ //! colour, so the text on it is readable (D1); the two are the same colour //! in the stock Breeze schemes. A highlighted row's outline is lifted to //! 3:1 (D5, [`styles::menu_item`]). -//! - **A popup has no caret and a shadow on every side**, and is rounded and -//! opaque whatever the desktop's compositing and menu opacity -//! ([`styles::popup`]). +//! - **A popup has no caret and a shadow on every side**, and is rounded +//! whatever the desktop's compositing; a menu translucent under +//! `breezerc`'s `MenuOpacity` has nothing blurred behind it, where Plasma's +//! compositor blurs what lies under it ([`styles::popup`]). //! - **A plain tooltip is shorter than Plasma's.** `TooltipWidget` writes its //! text in the small text style, where Breeze uses the body font, so a //! one-line tooltip is the small line box plus 8 px rather than 26 px @@ -226,9 +250,25 @@ //! its style no say, so they are framed in the accent rather than as //! Breeze's default button, whose light fill would not carry that text in //! a dark scheme ([`styles::split_button`]). -//! - **The fonts are not Plasma's.** The text sizes and line boxes are Noto -//! Sans and Hack's at Plasma's default sizes, drawn in Teksilo's bundled -//! Inter and JetBrains Mono. +//! - **The stock themes' fonts are not Plasma's.** The text sizes and line +//! boxes are Noto Sans and Hack's at Plasma's default sizes, drawn in +//! Teksilo's bundled Inter and JetBrains Mono. [`from_desktop`] names the +//! desktop's own families instead, which the text engine finds among the +//! installed fonts or replaces with the bundled ones. +//! - **A desktop's fonts keep the text styles' weights**, 400 and 600, and +//! a family other than Noto Sans and Hack gets a line box from Noto +//! Sans's proportions, which can be a pixel off: the preset measures no +//! font ([`typography`]). A menu's label is written in the general font, +//! its row sized for the taller of the general and menu fonts, and a +//! toolbar's buttons in the general font: Teksilo has no text style for +//! either, and [`KdeFontRoles`] carries them for an app to apply. +//! - **Some `breezerc` settings change nothing.** The menu opacity, the +//! window shadow and the busy progress bar follow `breezerc`; the keys +//! that time Breeze's own style animations, draw its other focus +//! indicators, or change parts the widgets build themselves (scroll-bar +//! buttons, tick marks, tree lines, centred tabs, toolbar separators, +//! mnemonic underlines) are carried and not drawn ([`BreezeStyleConfig`] +//! lists each). //! - **The high-contrast selection is light on a light window.** Under the //! OS high-contrast preference the selection fill carries the window's //! text at 7:1, which keeps it below 4.5:1 on the window (about 1.9:1 for @@ -237,6 +277,7 @@ //! another preset at runtime re-tints instantly but keeps the shapes the //! tree was built with, a property of the styling system. +mod breeze_config; mod color; pub mod geometry; pub mod motion; @@ -245,15 +286,20 @@ pub mod shape; pub mod styles; pub mod typography; +pub use breeze_config::BreezeStyleConfig; pub use palette::{BreezeColors, KdePalette, PlasmaAccent, UnknownPlasmaAccent}; pub use teksilo_kde_scheme as scheme; +pub use typography::KdeFontRoles; use std::rc::Rc; +use std::time::Duration; use teksilo_core::presets::intui; use teksilo_core::styles::{DensityProjection, PaintProjection, PaintState, Theme}; -use teksilo_kde_scheme::KdeColorScheme; -use teksilo_tokens::{Color, InputTokens, LayoutTokens, TargetDensity}; +use teksilo_kde_scheme::{KdeColorScheme, KdeDesktop}; +use teksilo_tokens::{ + Color, InputTokens, LayoutTokens, MotionTokens, ShapeTokens, TargetDensity, TypographyTokens, +}; /// The Plasma release whose Breeze style this preset transcribes. pub const BREEZE_VERSION: &str = "6.8.0"; @@ -296,10 +342,140 @@ pub fn dark_with_accent(accent: Color) -> Theme { /// contrast and inactive and disabled effects all come through; geometry, /// typography and motion are Breeze's. pub fn from_scheme(scheme: &KdeColorScheme) -> Theme { - build(KdePalette::from_scheme(scheme)) + build(KdePalette::from_scheme(scheme), Desktop::breeze_default()) +} + +/// The Breeze theme of a KDE desktop as it is configured, at `density`. +/// +/// Everything the desktop sets that the preset can follow comes through: +/// +/// - **Colours**: the desktop's scheme, as [`from_scheme`] takes it, with +/// the accent the user chose already applied ([`KdeDesktop::scheme`]). +/// - **Fonts**: the general, smallest readable and fixed fonts become the +/// six text styles, in the desktop's own families, at the whole pixel +/// sizes Qt draws them at and on Qt's line boxes +/// ([`typography::desktop_typography`]); the control heights follow the +/// general font's line box ([`geometry`]). The menu and toolbar fonts +/// are carried as [`KdeFontRoles`], and the menu rows are sized for the +/// menu font. +/// - **Animation speed**: `AnimationDurationFactor` scales the motion +/// tokens as Kirigami scales its units, with the tooltip delays and the +/// busy progress period left alone ([`motion::desktop_motion`]). A factor +/// of 0 is the desktop asking for reduced motion: the transitions are +/// then 0 or 1 ms long, and [`BreezeStyleConfig::prefers_reduced_motion`] +/// reports it, as the platform does from the same factor. +/// - **`breezerc`**: the menu opacity, the window shadow's size, colour and +/// strength and the busy progress bar's animation; the theme carries all +/// of it as a [`BreezeStyleConfig`], which lists what each key does. +/// +/// The theme's id is `kde.light` or `kde.dark`, as KDE judges the scheme, +/// whatever the desktop's widget style; [`native_theme`] is the form that +/// answers only for a Breeze desktop. +/// +/// ``` +/// use teksilo_theme_kde::{self as kde, scheme::KdeColorScheme, scheme::KdeDesktop}; +/// use teksilo_tokens::TargetDensity; +/// +/// let mut desktop = KdeDesktop::new(KdeColorScheme::breeze_dark()); +/// desktop.animation_duration_factor = Some(2.0); +/// let theme = kde::from_desktop(&desktop, TargetDensity::Touch); +/// assert!(theme.is_dark()); +/// assert_eq!(theme.motion.duration_normal.as_millis(), 400); +/// assert_eq!(theme.input.density, TargetDensity::Touch); +/// ``` +pub fn from_desktop(desktop: &KdeDesktop, density: TargetDensity) -> Theme { + build( + KdePalette::from_scheme(&desktop.scheme), + Desktop::from_desktop(desktop), + ) + .with_density(density) +} + +/// The Breeze theme of a KDE desktop for `teksilo-app`'s native-theme +/// seam, or `None` when the desktop does not use the Breeze widget style. +/// +/// `Some(`[`from_desktop`]`)` when `kdeglobals [KDE] widgetStyle` is absent, +/// empty or `Breeze` in any ASCII case ([`KdeDesktop::uses_breeze_style`]). +/// A desktop styled with Fusion, Oxygen, Kvantum or any other style gets +/// `None`: its applications do not draw Breeze's shapes, so a Teksilo +/// application keeps the framework's default geometry, coloured by the +/// desktop. +/// +/// Meant as `TeksiloAppBuilder::native_theme`'s factory, which is asked +/// with the desktop's report and a density: +/// +/// ```no_run +/// use teksilo_app::{TeksiloAppBuilder, ThemeMode}; +/// +/// TeksiloAppBuilder::new() +/// .theme_mode(ThemeMode::Native) +/// .native_theme(|request| { +/// let desktop = request.desktop.kde.as_ref()?; +/// teksilo_theme_kde::native_theme(desktop, request.density) +/// }) +/// .run(); +/// ``` +/// +/// The seam's contract is that a factory's theme is used as it comes: +/// `resolve_native_theme` sets no id and applies no density, and the window +/// manager, which resolves every theme that follows the OS, then gives it +/// the id `system` and projects it onto the density of the window it is +/// for. So the theme this returns carries `kde.light` or `kde.dark` and +/// `density`, and a window in Native mode shows it as `system`. A `None` +/// makes the seam fall back to the framework's IntUI coloured by the +/// desktop's report, which on a KDE session is the same scheme's colours. +pub fn native_theme(desktop: &KdeDesktop, density: TargetDensity) -> Option { + desktop + .uses_breeze_style() + .then(|| from_desktop(desktop, density)) +} + +/// What a theme takes from a desktop besides its colours. +struct Desktop { + typography: TypographyTokens, + fonts: KdeFontRoles, + shape: ShapeTokens, + motion: MotionTokens, + config: BreezeStyleConfig, +} + +impl Desktop { + /// A desktop at Plasma's defaults, drawn in the bundled faces. + fn breeze_default() -> Desktop { + Desktop { + typography: typography::breeze_typography(), + fonts: KdeFontRoles::breeze_default(), + shape: shape::breeze_shape(), + motion: motion::breeze_motion(), + config: BreezeStyleConfig::default(), + } + } + + /// What `desktop` configures. + fn from_desktop(desktop: &KdeDesktop) -> Desktop { + let config = BreezeStyleConfig::from_desktop(desktop); + let breeze = &config.settings; + let busy = match breeze.progress_bar_busy_step_duration_ms { + ms if ms > 0 => Duration::from_millis(u64::try_from(ms).unwrap_or(u64::MAX)), + // `[unpublished]` A period of no length cannot move; the bar + // stands still and the token keeps Breeze's default. + _ => Duration::from_millis(motion::BREEZE_BUSY_STEP_MS), + }; + Desktop { + typography: typography::desktop_typography(&desktop.fonts), + fonts: KdeFontRoles::from_fonts(&desktop.fonts), + shape: shape::breeze_shape_for( + breeze.shadow_size, + breeze.shadow_color.to_color(), + config.shadow_strength(), + ), + motion: motion::desktop_motion(desktop.animation_factor(), busy), + config, + } + } } -fn build(palette: KdePalette) -> Theme { +fn build(palette: KdePalette, desktop: Desktop) -> Theme { // Starting from Int UI keeps the input tokens, the density ladder, at // the framework's Compact baseline; every other token group is replaced. let mut theme = if palette.is_dark() { @@ -312,10 +488,12 @@ fn build(palette: KdePalette) -> Theme { control_gap: BREEZE_CONTROL_GAP, section_gap: BREEZE_SECTION_GAP, }; - theme.typography = typography::breeze_typography(); - theme.shape = shape::breeze_shape(); - theme.motion = motion::breeze_motion(); + theme.typography = desktop.typography; + theme.shape = desktop.shape; + theme.motion = desktop.motion; theme.extensions.insert(palette); + theme.extensions.insert(desktop.fonts); + theme.extensions.insert(desktop.config); install_styles(&mut theme); theme.extensions.insert(DensityProjection(reproject)); theme.extensions.insert(PaintProjection(project)); @@ -489,6 +667,16 @@ mod tests { b.extension::(), "KDE palette" ); + assert_eq!( + extensions.get::(), + b.extension::(), + "KDE font roles" + ); + assert_eq!( + extensions.get::(), + b.extension::(), + "Breeze style config" + ); } fn paint(theme: &Theme, window_active: bool, high_contrast: bool) -> Theme { @@ -539,6 +727,53 @@ mod tests { assert_same_theme(&from_scheme(&KdeColorScheme::breeze_dark()), &dark()); } + #[test] + fn every_theme_carries_the_desktop_extensions_at_their_defaults() { + for t in [ + light(), + dark(), + light_with_accent(PlasmaAccent::Red.color()), + ] { + assert_eq!( + t.extension::(), + Some(&BreezeStyleConfig::default()) + ); + assert_eq!( + t.extension::(), + Some(&KdeFontRoles::breeze_default()) + ); + } + } + + /// The default desktop is the stock theme but for the families, which + /// a desktop names and the stock theme leaves to the bundled faces. + #[test] + fn a_desktop_at_plasmas_defaults_is_the_stock_theme_in_its_own_faces() { + let desktop = from_desktop( + &KdeDesktop::new(KdeColorScheme::breeze_light()), + TargetDensity::Compact, + ); + let stock = light(); + let mut renamed = stock.clone(); + renamed.typography = desktop.typography.clone(); + renamed + .extensions + .insert(desktop.extension::().unwrap().clone()); + assert_same_theme(&desktop, &renamed); + assert_eq!(desktop.typography.body.family, "Noto Sans"); + assert_eq!(desktop.typography.mono.family, "Hack"); + for (a, b) in [ + (&desktop.typography.body, &stock.typography.body), + (&desktop.typography.small, &stock.typography.small), + (&desktop.typography.mono, &stock.typography.mono), + ] { + assert_eq!( + (a.size, a.line_height, a.weight), + (b.size, b.line_height, b.weight) + ); + } + } + #[test] fn breezes_own_blue_as_an_accent_still_changes_the_colours() { // Plasma's accent application blends the selection from the accent diff --git a/crates/teksilo-theme-kde/src/motion.rs b/crates/teksilo-theme-kde/src/motion.rs index 1e7578ff5..7711ae309 100644 --- a/crates/teksilo-theme-kde/src/motion.rs +++ b/crates/teksilo-theme-kde/src/motion.rs @@ -24,8 +24,28 @@ //! | `duration_indeterminate_sweep` | 800 | Breeze busy progress step | //! | `tooltip_delay`, `tooltip_delay_heavy` | 700 | Kirigami tooltip delay | //! -//! The desktop's animation speed (`AnimationDurationFactor`) is applied by -//! the desktop reader, not here: these are the factor-1 values. +//! These are the values at the desktop's default animation speed. +//! +//! ## The desktop's animation speed +//! +//! Plasma's animation speed setting is `kdeglobals [KDE] +//! AnimationDurationFactor`, a real, 1 when absent, 2 for twice as slow. +//! [`desktop_motion`] applies it as Kirigami applies it to its units, +//! which drive the controls whose timing the preset reproduces (spec j.2, +//! `[derived]`): the long duration is `max(1, round(200 f))` ms with `f` +//! the factor (0 for a negative one), the short half of it rounded down and +//! the very long twice it. So `duration_normal` and `duration_collapse` are +//! that long duration, `duration_fast` its half and `duration_slow` its +//! double. The busy progress bar's period is `breezerc`'s +//! `ProgressBarBusyStepDuration` and the factor does not scale it, nor the +//! tooltip delays, which are dwell times rather than animations. +//! +//! A factor of 0 is the desktop asking for reduced motion: the long +//! duration is 1 ms and the short one 0, which the framework plays as no +//! animation, and the platform reports the preference from the same factor. +//! This is not [`MotionTokens::scaled`], which would scale every duration +//! by the factor itself: Kirigami derives the short duration from the long +//! one, and Breeze does not scale the busy bar. //! //! ## The switch curves //! @@ -105,10 +125,128 @@ pub fn breeze_motion() -> MotionTokens { } } +/// `[derived]` Breeze motion tokens at the desktop animation speed `factor` +/// (`kdeglobals [KDE] AnimationDurationFactor`, 1 when the desktop sets +/// none), with the busy progress bar's stripes moving one period every +/// `busy_step` (`breezerc` `ProgressBarBusyStepDuration`, 800 ms by +/// default). +/// +/// The long duration is `max(1, round(200 x max(0, factor)))` ms, rounded +/// half up: `duration_normal` and `duration_collapse` are it, +/// `duration_fast` half of it rounded down, `duration_slow` twice it. The +/// busy period and the tooltip delays are not scaled. A factor that is not +/// finite is read as 1. See the [module documentation](self). +pub fn desktop_motion(factor: f64, busy_step: Duration) -> MotionTokens { + let factor = if factor.is_finite() { + factor.max(0.0) + } else { + 1.0 + }; + // Capped so that twice the long duration still fits a `u64` of + // milliseconds. + let long = (BREEZE_NORMAL_MS as f64 * factor + 0.5) + .floor() + .clamp(1.0, f64::from(u32::MAX)) as u64; + MotionTokens { + duration_fast: Duration::from_millis(long / 2), + duration_normal: Duration::from_millis(long), + duration_slow: Duration::from_millis(2 * long), + duration_collapse: Duration::from_millis(long), + duration_indeterminate_sweep: busy_step, + ..breeze_motion() + } +} + #[cfg(test)] mod tests { use super::*; + fn ms(d: Duration) -> u128 { + d.as_millis() + } + + #[test] + fn the_default_speed_is_the_default_motion() { + assert_eq!( + desktop_motion(1.0, Duration::from_millis(BREEZE_BUSY_STEP_MS)), + breeze_motion() + ); + } + + #[test] + fn the_factor_scales_kirigamis_long_duration() { + for (factor, fast, normal, slow) in [ + (2.0, 200, 400, 800), + (0.5, 50, 100, 200), + (0.25, 25, 50, 100), + // Half of the long duration is rounded down: 67 / 2. + (0.335, 33, 67, 134), + // Rounded half up: 200 x 0.0125 is 2.5. + (0.0125, 1, 3, 6), + ] { + let m = desktop_motion(factor, Duration::from_millis(800)); + assert_eq!(ms(m.duration_fast), fast, "{factor}"); + assert_eq!(ms(m.duration_normal), normal, "{factor}"); + assert_eq!(ms(m.duration_slow), slow, "{factor}"); + assert_eq!(m.duration_collapse, m.duration_normal, "{factor}"); + assert_eq!(m.duration_instant, Duration::ZERO); + assert_eq!(m.easing_standard, Easing::Linear); + } + } + + #[test] + fn the_busy_period_and_the_tooltip_delays_are_not_scaled() { + let m = desktop_motion(3.0, Duration::from_millis(500)); + assert_eq!(ms(m.duration_indeterminate_sweep), 500); + assert_eq!(ms(m.tooltip_delay), 700); + assert_eq!(ms(m.tooltip_delay_heavy), 700); + assert_eq!( + m.tooltip_reshow_delay, + MotionTokens::default().tooltip_reshow_delay + ); + } + + #[test] + fn a_factor_of_zero_leaves_a_one_millisecond_long_duration() { + for factor in [0.0, -1.0] { + let m = desktop_motion(factor, Duration::from_millis(800)); + assert_eq!(ms(m.duration_fast), 0, "{factor}"); + assert_eq!(ms(m.duration_normal), 1, "{factor}"); + assert_eq!(ms(m.duration_slow), 2, "{factor}"); + assert_eq!(ms(m.duration_collapse), 1, "{factor}"); + assert_eq!(ms(m.duration_indeterminate_sweep), 800, "{factor}"); + } + } + + #[test] + fn a_factor_that_is_not_finite_is_the_default_speed() { + for factor in [f64::NAN, f64::INFINITY, f64::NEG_INFINITY] { + assert_eq!( + desktop_motion(factor, Duration::from_millis(800)), + breeze_motion(), + "{factor}" + ); + } + // A huge finite factor is capped rather than overflowing. + let m = desktop_motion(1e300, Duration::from_millis(800)); + assert_eq!(ms(m.duration_normal), u128::from(u32::MAX)); + } + + #[test] + fn kirigamis_rule_is_not_the_frameworks_uniform_scale() { + // Pins why `desktop_motion` does not call `MotionTokens::scaled`: + // the uniform scale rounds the short duration on its own and + // scales the busy period. + let scaled = breeze_motion().scaled(0.335); + let kirigami = desktop_motion(0.335, Duration::from_millis(800)); + assert_eq!(ms(scaled.duration_fast), 34); + assert_eq!(ms(kirigami.duration_fast), 33); + assert_ne!( + scaled.duration_indeterminate_sweep, + kirigami.duration_indeterminate_sweep + ); + } + /// The largest distance between two curves, sampled every 1/1000. fn max_deviation(a: impl Fn(f32) -> f32, b: impl Fn(f32) -> f32) -> f32 { (0..=1000) diff --git a/crates/teksilo-theme-kde/src/shape.rs b/crates/teksilo-theme-kde/src/shape.rs index ceadd7fbc..140a9056b 100644 --- a/crates/teksilo-theme-kde/src/shape.rs +++ b/crates/teksilo-theme-kde/src/shape.rs @@ -32,7 +32,9 @@ //! table is the size's offset plus the layer's, and the blur is Breeze's //! radius, a CSS blur radius. The colour is black, at each layer's opacity. //! Breeze's shadows do not change with the colour scheme, so light and dark -//! share one set of shape tokens. +//! share one set of shape tokens. A desktop that changes the shadow's size, +//! colour or strength in `breezerc` gets its own window shadow through +//! [`breeze_shape_for`], which [`crate::from_desktop`] uses. use teksilo_kde_scheme::ShadowSize; use teksilo_tokens::{Color, Shadow, ShapeTokens}; @@ -124,18 +126,42 @@ pub fn shadow_token(layer: ShadowLayer, color: Color, strength: f32) -> Shadow { } } -/// Breeze shape tokens, for both colour schemes. +/// Breeze shape tokens, for both colour schemes, at Breeze's default +/// window shadow: Large, black, at full strength. pub fn breeze_shape() -> ShapeTokens { + breeze_shape_for(ShadowSize::Large, Color::BLACK, 1.0) +} + +/// Breeze shape tokens with the window shadow a desktop configures: +/// `breezerc`'s `ShadowSize` as `window`, `ShadowColor` as `color` and +/// `ShadowStrength / 255` as `strength`. +/// +/// `shadow_lg` and `shadow_inner_lg` are the window shadow the popups +/// paint, so they carry `window`'s two layers, and nothing at all for +/// [`ShadowSize::None`]; `shadow_sm` and `shadow_md` stay the Small and +/// Medium layers. All of them take `color` at each layer's opacity times +/// `strength`. The push button's own shadow, `shadow_xs`, is not a window +/// shadow and does not change. +pub fn breeze_shape_for(window: ShadowSize, color: Color, strength: f32) -> ShapeTokens { + let none = Shadow { + offset_x: 0.0, + offset_y: 0.0, + blur: 0.0, + spread: 0.0, + color: Color::TRANSPARENT, + }; let pair = |size: ShadowSize| -> (Shadow, Shadow) { - let [outer, inner] = window_shadow_layers(size).expect("a sized shadow has two layers"); - ( - shadow_token(outer, Color::BLACK, 1.0), - shadow_token(inner, Color::BLACK, 1.0), - ) + match window_shadow_layers(size) { + Some([outer, inner]) => ( + shadow_token(outer, color, strength), + shadow_token(inner, color, strength), + ), + None => (none, none), + } }; let (sm, inner_sm) = pair(ShadowSize::Small); let (md, inner_md) = pair(ShadowSize::Medium); - let (lg, inner_lg) = pair(ShadowSize::Large); + let (lg, inner_lg) = pair(window); ShapeTokens { radius_control: BREEZE_CONTROL_RADIUS, radius_popup: BREEZE_POPUP_RADIUS, @@ -233,6 +259,37 @@ mod tests { assert!((shadow_token(outer, Color::BLACK, 3.0).color.a() - 0.20).abs() < 1e-6); } + #[test] + fn the_desktops_window_shadow_is_the_popups() { + let red = Color::from_hex("#FF0000"); + let s = breeze_shape_for(ShadowSize::Small, red, 0.5); + // The window shadow is the Small pair, in the colour, at half the + // opacity. + assert_eq!((s.shadow_lg.offset_y, s.shadow_lg.blur), (3.0, 12.0)); + assert!((s.shadow_lg.color.a() - 0.13).abs() < 1e-6); + assert_eq!(s.shadow_lg.color.with_alpha(1.0), red); + assert_eq!( + (s.shadow_inner_lg.offset_y, s.shadow_inner_lg.blur), + (1.0, 6.0) + ); + assert!((s.shadow_inner_lg.color.a() - 0.08).abs() < 1e-6); + // The Small and Medium tokens keep their sizes in the same colour. + assert_eq!((s.shadow_md.offset_y, s.shadow_md.blur), (4.0, 16.0)); + assert_eq!(s.shadow_md.color.with_alpha(1.0), red); + // The button's shadow is not a window shadow. + assert_eq!(s.shadow_xs, breeze_shape().shadow_xs); + // No window shadow at all. + let bare = breeze_shape_for(ShadowSize::None, Color::BLACK, 1.0); + assert_eq!(bare.shadow_lg.color.a(), 0.0); + assert_eq!(bare.shadow_inner_lg.color.a(), 0.0); + assert_eq!(bare.shadow_sm, breeze_shape().shadow_sm); + // The defaults are Large, black, at full strength. + assert_eq!( + breeze_shape_for(ShadowSize::Large, Color::BLACK, 1.0), + breeze_shape() + ); + } + #[test] fn larger_shadows_reach_further_and_fade_more() { let sizes = [ diff --git a/crates/teksilo-theme-kde/src/styles/menu_item.rs b/crates/teksilo-theme-kde/src/styles/menu_item.rs index 5fd3352f7..026db1725 100644 --- a/crates/teksilo-theme-kde/src/styles/menu_item.rs +++ b/crates/teksilo-theme-kde/src/styles/menu_item.rs @@ -27,7 +27,9 @@ //! The style stores the recipe it was built with from the theme's input //! tokens and typography, so [`MenuItemStyle::metrics`], which `MenuItem` //! and `MenuSeparator` read for the parts they build themselves, follows -//! the density the theme was projected to. +//! the density the theme was projected to. The `H` of the row is the line +//! box of the desktop's menu font when the theme carries one taller than +//! the body style ([`menu_row_typography`]). //! //! ## Where this departs from Breeze //! @@ -61,7 +63,7 @@ use teksilo_core::widget::{LayoutContext, LayoutResponse, PaintContext, Widget, use teksilo_core::widget_id::WidgetId; use teksilo_kde_scheme::math::lift_luma_until; use teksilo_kde_scheme::{ColorState, KdeColor}; -use teksilo_tokens::{Color, CornerRadius, InputTokens, TextRole, TypographyTokens}; +use teksilo_tokens::{Color, CornerRadius, InputTokens, TextRole, TextStyle, TypographyTokens}; use teksilo_widgets::primitives::{MinSize, ZStack}; use teksilo_widgets::styles::{MenuItemRecipe, RecipeMenuItemStyle}; @@ -69,6 +71,7 @@ use crate::color::{AA, ENHANCED}; use crate::palette::KdePalette; use crate::shape::BREEZE_STROKED_FRAME_RADIUS; use crate::styles::metrics::{MENU_HIGHLIGHT_ALPHA, breeze_menu_metrics_for}; +use crate::typography::KdeFontRoles; /// The Breeze [`MenuItemRecipe`] at the density of `tokens`, for /// `typography`: the row arithmetic of [`RecipeMenuItemStyle`] with the @@ -119,12 +122,34 @@ impl BreezeMenuItemStyle { Self { recipe } } - /// The style at the density and typography of `theme`. + /// The style at the density and typography of `theme`, its rows sized + /// for the theme's menu font ([`menu_row_typography`]). pub fn for_theme(theme: &Theme) -> Self { - Self::new(breeze_menu_item_recipe_for(&theme.input, &theme.typography)) + Self::new(breeze_menu_item_recipe_for( + &theme.input, + &menu_row_typography(theme), + )) } } +/// The typography a menu row of `theme` is sized for. +/// +/// `[qt]` A Qt menu lays its rows out in the desktop's menu font, which +/// [`KdeFontRoles::menu`] carries; `[derived]` `MenuItem` writes its label +/// in the body style, so the row is sized for whichever of the two has the +/// taller line box, and the label always fits it. A theme without +/// [`KdeFontRoles`] sizes its rows for its body style. +pub fn menu_row_typography(theme: &Theme) -> TypographyTokens { + let mut typography = theme.typography.clone(); + if let Some(roles) = theme.extension::() { + let line_box = |s: &TextStyle| s.size * s.line_height; + if line_box(&roles.menu) > line_box(&typography.body) { + typography.body = roles.menu.clone(); + } + } + typography +} + impl Default for BreezeMenuItemStyle { fn default() -> Self { Self::new(breeze_menu_item_recipe()) diff --git a/crates/teksilo-theme-kde/src/styles/popover.rs b/crates/teksilo-theme-kde/src/styles/popover.rs index 35b46c7eb..0fd9571c5 100644 --- a/crates/teksilo-theme-kde/src/styles/popover.rs +++ b/crates/teksilo-theme-kde/src/styles/popover.rs @@ -9,8 +9,9 @@ //! menu's frame has no padding of its own: `MenuList` puts its rows 4 px //! inside it, Breeze's menu margin, and the highlight of a row fills the row //! up to that margin. Any other popup's content lies 4 px inside the frame, -//! the same margin, scaled by the density's spacing. The `Tooltip` variant -//! is drawn in the tooltip's colours. +//! the same margin, scaled by the density's spacing. The `Menu` variant +//! follows the desktop's menu opacity ([`BreezePopupKind::Menu`]), and the +//! `Tooltip` variant is drawn in the tooltip's colours. //! //! ## Where this departs from Breeze //! @@ -58,7 +59,7 @@ impl PopoverStyle for BreezePopoverStyle { let (kind, padding, node) = match cfg.variant { // The menu's owner carries the container role, and its rows // their own margin. - PopoverVariant::Menu => (BreezePopupKind::Panel, 0.0, PopupNode::Container), + PopoverVariant::Menu => (BreezePopupKind::Menu, 0.0, PopupNode::Container), PopoverVariant::Default => ( BreezePopupKind::Panel, self.padding, diff --git a/crates/teksilo-theme-kde/src/styles/popup.rs b/crates/teksilo-theme-kde/src/styles/popup.rs index 6a7568697..5ef7a919a 100644 --- a/crates/teksilo-theme-kde/src/styles/popup.rs +++ b/crates/teksilo-theme-kde/src/styles/popup.rs @@ -23,11 +23,16 @@ //! //! ## Where this departs from Breeze //! -//! - **The panel is always rounded and opaque.** Breeze rounds a popup only -//! on a compositing desktop, and makes a menu translucent when -//! `breezerc`'s `MenuOpacity` is below 100; a Teksilo popup is drawn in -//! its window's own pass, so it is the composited form at Breeze's -//! default opacity. +//! - **The panel is always rounded.** Breeze rounds a popup only on a +//! compositing desktop; a Teksilo popup is drawn in its window's own +//! pass, so it is always the composited form. +//! - **A translucent menu has nothing blurred behind it.** When +//! `breezerc`'s `MenuOpacity` is below 100 a menu's panel is filled at +//! that opacity and outlined in the window text at 25 %, as Breeze paints +//! it ([`BreezePopupKind::Menu`], [`crate::BreezeStyleConfig`]); on a +//! Plasma desktop the compositor blurs what lies behind such a menu, and +//! Teksilo draws the panel over its window's content as it is. The other +//! popups stay opaque. //! - **The shadow is drawn on every side.** The framework's popover cuts //! the shadow on the side that meets the control that opened it; a Breeze //! popup is a window, and its shadow surrounds it. @@ -45,12 +50,20 @@ use teksilo_core::widget::{ use teksilo_core::widget_id::WidgetId; use teksilo_tokens::{Color, CornerRadius}; +use crate::breeze_config::BreezeStyleConfig; use crate::styles::chrome::frame_radius; +/// `[S]` The alpha of a translucent menu's outline: the window text at +/// 25 %, where an opaque panel is outlined in the frame outline. +pub const TRANSLUCENT_MENU_OUTLINE_ALPHA: f32 = 0.25; + /// Which Breeze popup a frame is painted as. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum BreezePopupKind { - /// A menu, a combo box's list or any other popup panel. + /// A menu, a combo box's list or a search field's suggestions: a panel + /// that follows the desktop's menu opacity. + Menu, + /// Any other popup panel, such as a popover. Panel, /// A tooltip. Tooltip, @@ -68,13 +81,28 @@ pub struct BreezePopupColors { impl BreezePopupColors { /// `[Hp]` The colours of a `kind` popup in `theme`, the theme the paint /// walker hands a widget. + /// + /// A menu whose theme carries a [`BreezeStyleConfig`] with a + /// `MenuOpacity` below 100 is filled at that opacity and outlined in + /// the window text at [`TRANSLUCENT_MENU_OUTLINE_ALPHA`] (`[S]`); + /// otherwise it is the panel. pub fn resolve(theme: &Theme, kind: BreezePopupKind) -> BreezePopupColors { let c = &theme.colors; + let panel = BreezePopupColors { + fill: c.surface_raised, + outline: c.border, + }; match kind { - BreezePopupKind::Panel => BreezePopupColors { - fill: c.surface_raised, - outline: c.border, + BreezePopupKind::Menu => match theme.extension::() { + Some(config) if config.menu_is_translucent() => BreezePopupColors { + fill: c + .surface_raised + .with_alpha(c.surface_raised.a() * config.menu_opacity()), + outline: c.text_primary.with_alpha(TRANSLUCENT_MENU_OUTLINE_ALPHA), + }, + _ => panel, }, + BreezePopupKind::Panel => panel, BreezePopupKind::Tooltip => BreezePopupColors { fill: c.tooltip_bg, outline: c.tooltip_border, @@ -265,6 +293,36 @@ mod tests { assert_eq!(rgba8(tip.outline), [83, 86, 89, 255]); } + /// A menu is the panel at the default menu opacity, and translucent + /// below it; other popups never are. + #[test] + fn a_menu_follows_the_menu_opacity() { + let opaque = crate::light(); + assert_eq!( + BreezePopupColors::resolve(&opaque, BreezePopupKind::Menu), + BreezePopupColors::resolve(&opaque, BreezePopupKind::Panel) + ); + let mut t = crate::light(); + let mut config = BreezeStyleConfig::default(); + config.settings.menu_opacity = 60; + t.extensions.insert(config); + let menu = BreezePopupColors::resolve(&t, BreezePopupKind::Menu); + assert_eq!(rgba8(menu.fill), [244, 245, 245, 153]); + assert_eq!(menu.outline, t.colors.text_primary.with_alpha(0.25)); + let panel = BreezePopupColors::resolve(&t, BreezePopupKind::Panel); + assert_eq!(panel.fill.a(), 1.0); + assert_eq!(panel.outline, t.colors.border); + // Without the extension a menu is opaque. + let mut bare = t.clone(); + bare.extensions.remove::(); + assert_eq!( + BreezePopupColors::resolve(&bare, BreezePopupKind::Menu) + .fill + .a(), + 1.0 + ); + } + /// The frame is painted from the projected tokens, so the high-contrast /// projection reaches its outline. #[test] diff --git a/crates/teksilo-theme-kde/src/styles/progress_bar.rs b/crates/teksilo-theme-kde/src/styles/progress_bar.rs index 66354deaa..cd3c6a381 100644 --- a/crates/teksilo-theme-kde/src/styles/progress_bar.rs +++ b/crates/teksilo-theme-kde/src/styles/progress_bar.rs @@ -18,7 +18,8 @@ //! 800 ms, linearly and looping. The style paints this itself //! ([`ProgressBarStyle::paints_busy_indicator`]), so the bar draws no sweep //! of its own; under the reduced-motion preference the stripes stand still. -//! The desktop's animation speed does not change the period, as in Breeze. +//! The desktop's animation speed does not change the period, as in Breeze; +//! its `breezerc` can, and can stop the stripes ([`busy_step`]). //! //! The bar is 26 px thick at Plasma's default font, Qt's size hint, the //! groove centred in it ([`BreezeProgressMetrics`]); a thickness the app @@ -46,7 +47,7 @@ use teksilo_core::widget_id::WidgetId; use teksilo_kde_scheme::{ColorState, PaletteRole}; use teksilo_tokens::{Color, CornerRadius, InputTokens, Orientation, TypographyTokens}; -use crate::motion::BREEZE_BUSY_STEP_MS; +use crate::breeze_config::BreezeStyleConfig; use crate::palette::KdePalette; use crate::styles::chrome::kde_mix; use crate::styles::metrics::{ @@ -90,13 +91,11 @@ impl ProgressBarStyle for BreezeProgressBarStyle { ProgressKind::Determinate(p) => (Some(p.clone()), None), ProgressKind::Indeterminate => { let phase = ctx.animated_signal(0.0); - let spec = ctx - .animate() - .duration(Duration::from_millis(BREEZE_BUSY_STEP_MS)) - .linear() - .looping(); - if !spec.reduced_motion() { - spec.to(&phase, 1.0); + if let Some(step) = busy_step(ctx.theme()) { + let spec = ctx.animate().duration(step).linear().looping(); + if !spec.reduced_motion() { + spec.to(&phase, 1.0); + } } (None, Some(phase)) } @@ -122,6 +121,23 @@ impl ProgressBarStyle for BreezeProgressBarStyle { } } +/// The period a busy bar's stripes move in under `theme`, or `None` when +/// they stand still. +/// +/// `[S]` The desktop's `breezerc` decides whether they move +/// ([`BreezeStyleConfig::busy_step`]); the period is the theme's +/// `duration_indeterminate_sweep`, which the preset sets to +/// `ProgressBarBusyStepDuration`, 800 ms by default. A theme without the +/// config moves them with its sweep duration; a sweep of no length stands +/// still. +pub fn busy_step(theme: &Theme) -> Option { + let moves = theme + .extension::() + .is_none_or(|config| config.busy_step().is_some()); + let step = theme.motion.duration_indeterminate_sweep; + (moves && !step.is_zero()).then_some(step) +} + /// The colours a Breeze progress bar is painted in, in one paint state. #[derive(Debug, Clone, Copy, PartialEq)] pub struct BreezeProgressColors { diff --git a/crates/teksilo-theme-kde/src/typography.rs b/crates/teksilo-theme-kde/src/typography.rs index ab473d408..efc4bbae6 100644 --- a/crates/teksilo-theme-kde/src/typography.rs +++ b/crates/teksilo-theme-kde/src/typography.rs @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2026 FernTech //! Breeze typography: Plasma's default fonts mapped onto Teksilo's six -//! [`TextStyle`](teksilo_tokens::TextStyle) slots. +//! [`TextStyle`] slots. //! //! | Slot | Plasma font | Glyph size | Line box | Weight | //! | --- | --- | --- | --- | --- | @@ -34,12 +34,28 @@ //! //! ## Families //! -//! Plasma's faces are Noto Sans and Hack. This preset does not ship or name -//! them: it keeps Teksilo's bundled Inter and JetBrains Mono at the sizes and -//! line boxes above, which are computed from the Noto Sans and Hack metrics -//! whichever family draws them. +//! Plasma's faces are Noto Sans and Hack. The stock themes do not ship or +//! name them: they keep Teksilo's bundled Inter and JetBrains Mono at the +//! sizes and line boxes above, which are computed from the Noto Sans and +//! Hack metrics whichever family draws them. +//! +//! ## The desktop's fonts +//! +//! [`desktop_typography`] maps a desktop's own fonts onto the six slots: +//! the general font onto `body` and `body_bold`, the smallest readable +//! font onto `small`, `small_bold` and `tiny`, the fixed font onto `mono`. +//! Each takes the font's family as Plasma names it and its size by Qt's +//! rule above (a font stored in pixels keeps its pixel size); the weights +//! stay the slots' own, 400 and 600. The line box is Qt's for Noto Sans and +//! Hack, whose metrics are known, and `round(P x 1.362)` for any other +//! family ([`desktop_line_height`]), Noto Sans's natural line height, which +//! can be a pixel off for a face with other metrics: the preset measures no +//! font. Teksilo has no slot for the menu and toolbar fonts, so +//! [`KdeFontRoles`] carries them on the theme; the menu rows are sized for +//! the menu font ([`crate::styles::menu_item`]). -use teksilo_tokens::{FontWeight, TypographyTokens}; +use teksilo_kde_scheme::{KdeFont, KdeFonts}; +use teksilo_tokens::{FontWeight, TextStyle, TypographyTokens}; /// The vertical metrics of a font face that its line height is computed /// from: the `hhea` ascender and the absolute descender, in font units. @@ -133,6 +149,123 @@ pub fn breeze_typography() -> TypographyTokens { t } +/// `[derived]` The line height of a family whose metrics the preset does +/// not know, in em: Noto Sans's natural line height, its ascender and +/// descender over its units per em, rounded to three places. +pub const NATURAL_LINE_HEIGHT_EM: f64 = 1.362; + +/// The metrics of `family` when the preset knows them: Noto Sans and Hack, +/// named in any ASCII case. +pub fn known_metrics(family: &str) -> Option { + if family.eq_ignore_ascii_case("Noto Sans") { + Some(NOTO_SANS_METRICS) + } else if family.eq_ignore_ascii_case("Hack") { + Some(HACK_METRICS) + } else { + None + } +} + +/// `[measured-qt]` The whole pixel size Qt draws `font` at: its pixel size +/// when it is stored in pixels, otherwise its point size by [`face_px`], +/// otherwise `default`'s. At least 1. +pub fn desktop_face_px(font: &KdeFont, default: &KdeFont) -> u32 { + let points = |f: &KdeFont| f.point_size.map(|pt| face_px(pt as f32)); + let pixels = |f: &KdeFont| f.pixel_size.map(|px| px.max(0) as u32); + pixels(font) + .or_else(|| points(font)) + .or_else(|| pixels(default)) + .or_else(|| points(default)) + .unwrap_or_else(|| face_px(BREEZE_BODY_PT)) + .max(1) +} + +/// The line height of a `face_px` face of `family`: [`qt_line_height`] +/// with its metrics when the preset knows them ([`known_metrics`]), and +/// `[derived]` `round(face_px x 1.362)`, rounded half up, otherwise. +pub fn desktop_line_height(face_px: u32, family: &str) -> u32 { + match known_metrics(family) { + Some(metrics) => qt_line_height(face_px, metrics), + None => (f64::from(face_px) * NATURAL_LINE_HEIGHT_EM + 0.5).floor() as u32, + } +} + +/// The text style of a desktop `font` at `weight`: its family (`default`'s +/// when it names none, `[unpublished]`), the whole pixel size Qt draws it +/// at ([`desktop_face_px`]) and the line box of [`desktop_line_height`], +/// with no tracking. +pub fn desktop_text_style(font: &KdeFont, default: &KdeFont, weight: FontWeight) -> TextStyle { + let family = if font.family.trim().is_empty() { + default.family.clone() + } else { + font.family.clone() + }; + let px = desktop_face_px(font, default); + let line = desktop_line_height(px, &family); + TextStyle { + family, + size: px as f32, + weight, + line_height: line as f32 / px as f32, + letter_spacing: 0.0, + } +} + +/// Breeze typography tokens for a desktop's `fonts`. See [the module +/// documentation](self#the-desktops-fonts). +pub fn desktop_typography(fonts: &KdeFonts) -> TypographyTokens { + let defaults = KdeFonts::default(); + let general = |weight| desktop_text_style(&fonts.general, &defaults.general, weight); + let small = |weight| desktop_text_style(&fonts.small, &defaults.small, weight); + TypographyTokens { + body: general(FontWeight::REGULAR), + body_bold: general(BREEZE_BOLD_WEIGHT), + small: small(FontWeight::REGULAR), + small_bold: small(BREEZE_BOLD_WEIGHT), + // `[derived]` KDE has no role below the smallest readable font. + tiny: small(FontWeight::REGULAR), + mono: desktop_text_style(&fonts.fixed, &defaults.fixed, FontWeight::REGULAR), + } +} + +/// The two KDE font roles Teksilo's six text styles have no slot for, as +/// text styles: the menu font and the toolbar font. +/// +/// A [`teksilo_core::styles::Theme`] extension. The menu rows the preset +/// installs are sized for [`menu`](Self::menu); `MenuItem` still writes its +/// label in the body style unless an app hands it this one, and a toolbar's +/// buttons write in the body style, so an app that wants the desktop's +/// toolbar font passes [`toolbar`](Self::toolbar) to the labels it builds. +#[derive(Debug, Clone, PartialEq)] +pub struct KdeFontRoles { + /// `[General] menuFont`: Plasma's default, Noto Sans 10 pt. + pub menu: TextStyle, + /// `[General] toolBarFont`: Plasma's default, Noto Sans 10 pt. + pub toolbar: TextStyle, +} + +impl KdeFontRoles { + /// The stock themes' roles: both are the body style of + /// [`breeze_typography`], as Plasma's defaults are the general font. + pub fn breeze_default() -> KdeFontRoles { + let body = breeze_typography().body; + KdeFontRoles { + menu: body.clone(), + toolbar: body, + } + } + + /// The roles of a desktop's `fonts`, regular weight, as + /// [`desktop_text_style`] maps them. + pub fn from_fonts(fonts: &KdeFonts) -> KdeFontRoles { + let defaults = KdeFonts::default(); + KdeFontRoles { + menu: desktop_text_style(&fonts.menu, &defaults.menu, FontWeight::REGULAR), + toolbar: desktop_text_style(&fonts.toolbar, &defaults.toolbar, FontWeight::REGULAR), + } + } +} + #[cfg(test)] mod tests { use super::*; @@ -227,6 +360,70 @@ mod tests { } } + #[test] + fn plasmas_default_fonts_give_the_breeze_sizes_and_line_boxes() { + let t = desktop_typography(&KdeFonts::default()); + let b = breeze_typography(); + for (desktop, stock) in [ + (&t.body, &b.body), + (&t.body_bold, &b.body_bold), + (&t.small, &b.small), + (&t.small_bold, &b.small_bold), + (&t.tiny, &b.tiny), + (&t.mono, &b.mono), + ] { + assert_eq!(desktop.size, stock.size); + assert_eq!(desktop.line_height, stock.line_height); + assert_eq!(desktop.weight, stock.weight); + assert_eq!(desktop.letter_spacing, 0.0); + } + assert_eq!(t.body.family, "Noto Sans"); + assert_eq!(t.small.family, "Noto Sans"); + assert_eq!(t.mono.family, "Hack"); + let roles = KdeFontRoles::from_fonts(&KdeFonts::default()); + assert_eq!(roles.menu, t.body); + assert_eq!(roles.toolbar, t.body); + } + + #[test] + fn a_family_without_known_metrics_takes_noto_sans_natural_line_height() { + // 11 pt is a 15 px face: 15 x 1.362 is 20.43. + assert_eq!(desktop_line_height(15, "Cantarell"), 20); + // 16 x 1.362 is 21.79, and 22 for Noto Sans by Qt's rule as well. + assert_eq!(desktop_line_height(16, "Inter"), 22); + assert_eq!(desktop_line_height(16, "noto sans"), 22); + // Hack's own metrics: 15 at 13 px, where the rule would say 18. + assert_eq!(desktop_line_height(13, "HACK"), 15); + assert_eq!(desktop_line_height(13, "Fira Code"), 18); + } + + #[test] + fn a_font_stored_in_pixels_keeps_its_pixel_size() { + let defaults = KdeFonts::default(); + let mut font = KdeFont::new("Noto Sans", 0.0); + font.point_size = None; + font.pixel_size = Some(17); + assert_eq!(desktop_face_px(&font, &defaults.general), 17); + // Neither stored: the default's 10 pt. + font.pixel_size = None; + assert_eq!(desktop_face_px(&font, &defaults.general), 13); + // A tiny point size still draws a pixel. + font.point_size = Some(0.1); + assert_eq!(desktop_face_px(&font, &defaults.general), 1); + } + + #[test] + fn a_font_without_a_family_takes_the_roles_default() { + let defaults = KdeFonts::default(); + let style = desktop_text_style( + &KdeFont::new("", 12.0), + &defaults.fixed, + FontWeight::REGULAR, + ); + assert_eq!(style.family, "Hack"); + assert_eq!(style.size, 16.0); + } + #[test] fn the_families_are_the_bundled_defaults() { let t = breeze_typography(); diff --git a/crates/teksilo-theme-kde/tests/native.rs b/crates/teksilo-theme-kde/tests/native.rs new file mode 100644 index 000000000..5cb0bdec7 --- /dev/null +++ b/crates/teksilo-theme-kde/tests/native.rs @@ -0,0 +1,490 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 FernTech + +//! The live desktop: `from_desktop` follows a KDE desktop's fonts, +//! animation speed and `breezerc`, and `native_theme` answers only for a +//! desktop styled with Breeze, through `teksilo-app`'s native-theme seam. + +use std::cell::RefCell; +use std::rc::Rc; +use std::time::Duration; + +use teksilo_app::{NativeThemeFactory, NativeThemeRequest, resolve_native_theme}; +use teksilo_canvas::{MockTextBackend, RenderFrame, SizeProposal}; +use teksilo_core::styles::Theme; +use teksilo_core::widget::Widget; +use teksilo_core::widget_id::WidgetId; +use teksilo_core::widget_tree::WidgetTree; +use teksilo_i18n::lit; +use teksilo_platform::os_theme::NativeDesktop; +use teksilo_theme_kde::scheme::{KdeColor, KdeColorScheme, KdeDesktop, KdeFont, ShadowSize}; +use teksilo_theme_kde::styles::popup::{BreezePopupColors, BreezePopupKind}; +use teksilo_theme_kde::{self as kde, BreezeStyleConfig, KdeFontRoles, KdePalette}; +use teksilo_tokens::{Color, FontWeight, TargetDensity}; +use teksilo_widgets::primitives::{FixedSize, HStack}; +use teksilo_widgets::{Button, MenuItem, MenuList, ProgressBar, VStack}; + +fn light_desktop() -> KdeDesktop { + KdeDesktop::new(KdeColorScheme::breeze_light()) +} + +fn font(qt: &str) -> KdeFont { + KdeFont::parse_qfont(qt).unwrap_or_else(|| panic!("{qt} does not parse")) +} + +fn line_box(style: &teksilo_tokens::TextStyle) -> f32 { + style.size * style.line_height +} + +fn tree_with(theme: Theme) -> WidgetTree { + WidgetTree::new() + .with_theme(theme) + .with_text_backend(Rc::new(RefCell::new(MockTextBackend::new()))) +} + +fn rgba8(c: [f32; 4]) -> [u8; 4] { + c.map(|v| (v.clamp(0.0, 1.0) * 255.0).round() as u8) +} + +fn ms(d: Duration) -> u128 { + d.as_millis() +} + +// ── Fonts ──────────────────────────────────────────────────────────────── + +/// A desktop whose five fonts are all set: a Qt 6 general font of a family +/// the preset has no metrics for, a 9 pt smallest readable font, an 11 pt +/// Hack, a 12 pt menu font and a Qt 5 toolbar font. +fn desktop_with_fonts() -> KdeDesktop { + let mut d = light_desktop(); + d.fonts.general = font("Cantarell,11,-1,5,400,0,0,0,0,0,0,0,0,0,0,1"); + d.fonts.small = font("Noto Sans,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1"); + d.fonts.fixed = font("Hack,11,-1,7,400,0,0,0,1,0,0,0,0,0,0,1"); + d.fonts.menu = font("Noto Sans,12,-1,5,400,0,0,0,0,0,0,0,0,0,0,1"); + d.fonts.toolbar = font("Ubuntu,10,-1,5,50,0,0,0,0,0"); + d +} + +/// Each text style takes its font's family and the whole pixel size Qt +/// draws it at, on Qt's line box for Noto Sans and Hack and on +/// `round(P x 1.362)` for any other family; the weights stay the slots'. +#[test] +fn the_desktops_fonts_become_the_text_styles() { + let t = kde::from_desktop(&desktop_with_fonts(), TargetDensity::Compact).typography; + // Cantarell 11 pt: a 15 px face, 15 x 1.362 = 20.43. + for (style, weight) in [ + (&t.body, FontWeight::REGULAR), + (&t.body_bold, FontWeight::SEMI_BOLD), + ] { + assert_eq!(style.family, "Cantarell"); + assert_eq!(style.size, 15.0); + assert!((line_box(style) - 20.0).abs() < 1e-4); + assert_eq!(style.weight, weight); + assert_eq!(style.letter_spacing, 0.0); + } + // Noto Sans 9 pt: a 12 px face on Qt's 17 px line. + for style in [&t.small, &t.small_bold, &t.tiny] { + assert_eq!(style.family, "Noto Sans"); + assert_eq!(style.size, 12.0); + assert!((line_box(style) - 17.0).abs() < 1e-4); + } + assert_eq!(t.small_bold.weight, FontWeight::SEMI_BOLD); + // Hack 11 pt: a 15 px face on Qt's 18 px line. + assert_eq!(t.mono.family, "Hack"); + assert_eq!(t.mono.size, 15.0); + assert!((line_box(&t.mono) - 18.0).abs() < 1e-4); +} + +/// The menu and toolbar fonts, which have no text style, ride on the theme +/// as `KdeFontRoles`; a Qt 5 font string is read as Plasma 5 wrote it. +#[test] +fn the_menu_and_toolbar_fonts_ride_on_the_theme() { + let theme = kde::from_desktop(&desktop_with_fonts(), TargetDensity::Compact); + let roles = theme.extension::().expect("the font roles"); + assert_eq!(roles.menu.family, "Noto Sans"); + assert_eq!(roles.menu.size, 16.0); + assert!((line_box(&roles.menu) - 22.0).abs() < 1e-4); + assert_eq!(roles.toolbar.family, "Ubuntu"); + assert_eq!(roles.toolbar.size, 13.0); + assert!((line_box(&roles.toolbar) - 18.0).abs() < 1e-4); + assert_eq!(roles.toolbar.weight, FontWeight::REGULAR); +} + +/// The control heights follow the general font's line box, and a menu row +/// the taller of the menu font's and the body's. +#[test] +fn the_controls_follow_the_desktops_fonts() { + let theme = kde::from_desktop(&desktop_with_fonts(), TargetDensity::Compact); + // A 22 px menu line: max(22, 20, 16) + 1 + 2 x 4. + let menu = theme.style_slots.menu_item.as_ref().expect("a menu style"); + assert_eq!(menu.metrics().item_height, 31.0); + // A 20 px body line: the push button is H + 16. + let mut tree = tree_with(theme); + let row = tree.add(HStack::new().child(Button::new(lit!("OK")))); + tree.layout(SizeProposal::exact(400.0, 300.0)); + let button = tree.children(row)[0]; + assert_eq!(tree.bounds(button).height, 36.0); + + // A menu font smaller than the body leaves the rows sized for the body, + // which their labels are written in: a 20 px line gives 29. + let mut d = desktop_with_fonts(); + d.fonts.menu = font("Noto Sans,7,-1,5,400,0,0,0,0,0,0,0,0,0,0,1"); + let theme = kde::from_desktop(&d, TargetDensity::Compact); + let menu = theme.style_slots.menu_item.as_ref().unwrap(); + assert_eq!(menu.metrics().item_height, 29.0); +} + +/// The density the theme is asked at reprojects the rows built for the +/// desktop's menu font too. +#[test] +fn the_menu_font_survives_a_density_projection() { + let theme = kde::from_desktop(&desktop_with_fonts(), TargetDensity::Touch); + assert_eq!(theme.input.density, TargetDensity::Touch); + let back = theme.with_density(TargetDensity::Compact); + let menu = back.style_slots.menu_item.as_ref().unwrap(); + assert_eq!(menu.metrics().item_height, 31.0); +} + +// ── Animation speed ────────────────────────────────────────────────────── + +/// A factor of 2 doubles Kirigami's long duration and everything derived +/// from it, and leaves the busy period and the tooltip delays alone. +#[test] +fn a_factor_of_two_slows_the_transitions() { + let mut d = light_desktop(); + d.animation_duration_factor = Some(2.0); + let m = kde::from_desktop(&d, TargetDensity::Compact).motion; + assert_eq!(ms(m.duration_fast), 200); + assert_eq!(ms(m.duration_normal), 400); + assert_eq!(ms(m.duration_slow), 800); + assert_eq!(ms(m.duration_collapse), 400); + assert_eq!(ms(m.duration_indeterminate_sweep), 800); + assert_eq!(ms(m.tooltip_delay), 700); + assert_eq!(ms(m.tooltip_delay_heavy), 700); + assert_eq!(m.duration_instant, Duration::ZERO); + assert_eq!(m.easing_standard, kde::light().motion.easing_standard); +} + +/// A factor of 0 is the desktop asking for reduced motion: the theme +/// reports it, and its transitions are 0 or 1 ms long. +#[test] +fn a_factor_of_zero_is_reduced_motion() { + let mut d = light_desktop(); + d.animation_duration_factor = Some(0.0); + let theme = kde::from_desktop(&d, TargetDensity::Compact); + let config = theme.extension::().expect("the config"); + assert!(config.prefers_reduced_motion()); + assert!(d.prefers_reduced_motion()); + let m = &theme.motion; + assert_eq!(ms(m.duration_fast), 0); + assert_eq!(ms(m.duration_normal), 1); + assert_eq!(ms(m.duration_slow), 2); + assert_eq!(ms(m.duration_collapse), 1); + assert_eq!(ms(m.duration_indeterminate_sweep), 800); + assert_eq!(ms(m.tooltip_delay), 700); +} + +/// A desktop that sets no factor animates at Breeze's own speed, and does +/// not ask for reduced motion. +#[test] +fn no_factor_is_the_default_speed() { + let theme = kde::from_desktop(&light_desktop(), TargetDensity::Compact); + assert_eq!(theme.motion, kde::light().motion); + let config = theme.extension::().unwrap(); + assert!(!config.prefers_reduced_motion()); + assert_eq!(config.animation_factor, None); +} + +// ── breezerc ───────────────────────────────────────────────────────────── + +/// A menu under `MenuOpacity` 80 is filled at 80 % and outlined in the +/// window text at 25 %; at the default 100 it is the opaque panel. +#[test] +fn a_translucent_menu_follows_menu_opacity() { + let mut d = light_desktop(); + d.breeze.menu_opacity = 80; + let theme = kde::from_desktop(&d, TargetDensity::Compact); + let config = theme.extension::().unwrap(); + assert_eq!(config.menu_opacity(), 0.8); + let colors = BreezePopupColors::resolve(&theme, BreezePopupKind::Menu); + let fill = rgba8(colors.fill.to_array()); + assert_eq!(fill, [244, 245, 245, 204]); + let outline = theme.colors.text_primary.with_alpha(0.25); + assert_eq!(colors.outline, outline); + + // Painted: the menu's panel carries those colours. + let mut tree = tree_with(theme.clone()); + tree.add( + VStack::new().child( + FixedSize::new() + .width(200.0) + .child(MenuList::new().item(MenuItem::new(lit!("Open")))), + ), + ); + tree.layout(SizeProposal::exact(400.0, 300.0)); + let frame = tree.render(); + let shapes: Vec<([u8; 4], f32)> = frame + .shapes + .iter() + .map(|s| (rgba8(s.color), s.stroke_width)) + .collect(); + assert!( + shapes.contains(&(fill, 0.0)), + "no translucent panel in {shapes:?}" + ); + assert!( + shapes.contains(&(rgba8(outline.to_array()), 1.0)), + "no window-text outline in {shapes:?}" + ); + + // A popover is not a menu, and stays opaque. + let popover = BreezePopupColors::resolve(&theme, BreezePopupKind::Panel); + assert_eq!(popover.fill.a(), 1.0); + // The stock opacity paints the opaque panel. + let stock = kde::from_desktop(&light_desktop(), TargetDensity::Compact); + assert_eq!( + BreezePopupColors::resolve(&stock, BreezePopupKind::Menu), + BreezePopupColors::resolve(&stock, BreezePopupKind::Panel) + ); +} + +/// The window shadow under a popup is the size, colour and strength +/// `breezerc` asks for. +#[test] +fn the_window_shadow_follows_breezerc() { + let mut d = light_desktop(); + d.breeze.shadow_size = ShadowSize::Small; + d.breeze.shadow_strength = 102; + d.breeze.shadow_color = KdeColor::rgb8(0, 0, 128); + let shape = kde::from_desktop(&d, TargetDensity::Compact).shape; + let navy = KdeColor::rgb8(0, 0, 128).to_color(); + assert_eq!( + (shape.shadow_lg.offset_y, shape.shadow_lg.blur), + (3.0, 12.0) + ); + assert!((shape.shadow_lg.color.a() - 0.26 * 0.4).abs() < 1e-6); + assert_eq!(shape.shadow_lg.color.with_alpha(1.0), navy); + assert_eq!( + (shape.shadow_inner_lg.offset_y, shape.shadow_inner_lg.blur), + (1.0, 6.0) + ); + assert!((shape.shadow_inner_lg.color.a() - 0.16 * 0.4).abs() < 1e-6); + // The rest of the shape is Breeze's. + let stock = kde::light().shape; + assert_eq!(shape.radius_control, stock.radius_control); + assert_eq!(shape.shadow_xs, stock.shadow_xs); + + d.breeze.shadow_size = ShadowSize::None; + let bare = kde::from_desktop(&d, TargetDensity::Compact).shape; + assert_eq!(bare.shadow_lg.color.a(), 0.0); + assert_eq!(bare.shadow_inner_lg.color.a(), 0.0); + assert_eq!( + kde::from_desktop(&light_desktop(), TargetDensity::Compact).shape, + stock + ); +} + +/// A tree holding `w` on the simulated clock, laid out and rendered once: +/// the tree and the widget's id. +fn on_the_clock(theme: Theme, w: impl Widget + 'static) -> (WidgetTree, WidgetId) { + let mut tree = tree_with(theme); + tree.advance_time(Duration::ZERO); + let column = tree.add(VStack::new().child(HStack::new().child(w))); + tree.layout(SizeProposal::exact(400.0, 300.0)); + let row = tree.children(column)[0]; + let id = tree.children(row)[0]; + tree.render(); + (tree, id) +} + +fn tick(tree: &mut WidgetTree, ms: u64) -> Rc { + tree.advance_time(Duration::from_millis(ms)); + tree.layout(SizeProposal::exact(400.0, 300.0)); + tree.render() +} + +/// The leading edges of a busy bar's highlight stripes, from the bar's. +fn stripe_starts(frame: &RenderFrame, highlight: Color, x0: f32) -> Vec { + let highlight = rgba8(highlight.to_array()); + frame + .shapes + .iter() + .filter(|s| s.stroke_width == 0.0 && rgba8(s.color) == highlight) + .map(|s| s.screen[0] - x0) + .collect() +} + +/// `ProgressBarBusyStepDuration` is the stripes' period, and +/// `ProgressBarAnimated` off stands them still. +#[test] +fn the_busy_bar_follows_breezerc() { + let mut d = light_desktop(); + d.breeze.progress_bar_busy_step_duration_ms = 400; + let theme = kde::from_desktop(&d, TargetDensity::Compact); + assert_eq!(ms(theme.motion.duration_indeterminate_sweep), 400); + let highlight = theme.colors.accent; + let bar = || { + FixedSize::new() + .width(200.0) + .child(ProgressBar::indeterminate()) + }; + let (mut tree, id) = on_the_clock(theme.clone(), bar()); + let x0 = tree.bounds(id).x; + // A quarter of the 400 ms period on, the stripes have moved 7 px. + let quarter = stripe_starts(&tick(&mut tree, 100), highlight, x0); + assert!( + (quarter[0] - 7.0).abs() < 1.0, + "a quarter period on: {quarter:?}" + ); + + d.breeze.progress_bar_animated = false; + let theme = kde::from_desktop(&d, TargetDensity::Compact); + let (mut still, id) = on_the_clock(theme.clone(), bar()); + let x0 = still.bounds(id).x; + let at_rest = stripe_starts(&tick(&mut still, 16), highlight, x0); + assert_eq!(at_rest[0], 0.0); + assert_eq!( + stripe_starts(&tick(&mut still, 300), highlight, x0), + at_rest + ); +} + +// ── native_theme ───────────────────────────────────────────────────────── + +/// Fusion, Oxygen and Kvantum desktops get no Breeze theme, in any case. +#[test] +fn another_widget_style_gets_no_breeze_theme() { + for style in [ + "Fusion", + "fusion", + "Oxygen", + "kvantum", + "Breeze-Dark", + "Windows", + ] { + let mut d = light_desktop(); + d.widget_style = Some(style.to_owned()); + assert!( + kde::native_theme(&d, TargetDensity::Compact).is_none(), + "{style}" + ); + } +} + +/// An absent or empty widget style is Breeze, and so is `breeze` in any +/// case: the theme is `from_desktop`'s, at the density asked for. +#[test] +fn a_breeze_desktop_gets_its_theme() { + for style in [ + None, + Some(""), + Some("Breeze"), + Some("breeze"), + Some("BREEZE"), + ] { + for (scheme, id) in [ + (KdeColorScheme::breeze_light(), "kde.light"), + (KdeColorScheme::breeze_dark(), "kde.dark"), + ] { + let mut d = KdeDesktop::new(scheme); + d.widget_style = style.map(str::to_owned); + d.animation_duration_factor = Some(0.5); + let theme = kde::native_theme(&d, TargetDensity::Comfortable) + .unwrap_or_else(|| panic!("{style:?}: no theme")); + assert_eq!(theme.id.as_str(), id, "{style:?}"); + assert_eq!(theme.input.density, TargetDensity::Comfortable); + assert_eq!(ms(theme.motion.duration_normal), 100); + let direct = kde::from_desktop(&d, TargetDensity::Comfortable); + assert_eq!(theme.colors, direct.colors); + assert_eq!(theme.typography, direct.typography); + assert_eq!(theme.input, direct.input); + assert_eq!( + theme.extension::(), + direct.extension::() + ); + } + } +} + +/// The report the platform builds for a KDE session: the scheme's colours +/// and the desktop itself. +fn native_desktop(desktop: KdeDesktop) -> NativeDesktop { + let mut native = NativeDesktop::new(desktop.scheme.os_theme_colors()); + native.kde = Some(desktop); + native +} + +/// The factory an app installs with `TeksiloAppBuilder::native_theme`. +fn factory() -> NativeThemeFactory { + Box::new(|request: &NativeThemeRequest<'_>| { + let desktop = request.desktop.kde.as_ref()?; + kde::native_theme(desktop, request.density) + }) +} + +/// Through the seam, a Breeze desktop's theme comes back as the factory +/// built it: `resolve_native_theme` sets no id and applies no density, so +/// it is `kde.dark` at the request's density until the window manager +/// names it `system`, which changes nothing else. +#[test] +fn the_theme_composes_through_the_native_seam() { + let mut d = KdeDesktop::new(KdeColorScheme::breeze_dark()); + d.breeze.menu_opacity = 90; + let native = native_desktop(d.clone()); + let factory = factory(); + let request = NativeThemeRequest::new(&native, true, TargetDensity::Touch); + let theme = resolve_native_theme(Some(&factory), &request); + assert_eq!(theme.id.as_str(), "kde.dark"); + assert_eq!(theme.input.density, TargetDensity::Touch); + assert!(theme.extension::().is_some()); + assert_eq!( + theme + .extension::() + .map(|c| c.menu_opacity()), + Some(0.9) + ); + + // What the window manager makes of it for a Touch window. + let shown = theme.with_density(TargetDensity::Touch).with_id("system"); + assert_eq!(shown.id.as_str(), "system"); + assert_eq!(shown.colors, theme.colors); + assert_eq!(shown.typography, theme.typography); + assert_eq!(shown.shape, theme.shape); + assert_eq!(shown.motion, theme.motion); + assert_eq!(shown.input, theme.input); + assert_eq!(shown.style_slots.installed(), theme.style_slots.installed()); + assert_eq!( + shown.extension::(), + theme.extension::() + ); + assert_eq!( + shown.extension::(), + theme.extension::() + ); + let menu = shown.style_slots.menu_item.as_ref().unwrap(); + assert_eq!(menu.metrics().item_height, 44.0); +} + +/// A desktop styled otherwise falls back to the framework's IntUI coloured +/// by the desktop's report, which carries no Breeze palette or chrome; so +/// does a report without KDE settings. +#[test] +fn another_style_falls_back_through_the_seam() { + let mut d = KdeDesktop::new(KdeColorScheme::breeze_dark()); + d.widget_style = Some("Fusion".to_owned()); + let native = native_desktop(d.clone()); + let factory = factory(); + let request = NativeThemeRequest::new(&native, true, TargetDensity::Compact); + let theme = resolve_native_theme(Some(&factory), &request); + assert!(theme.extension::().is_none()); + assert!(theme.extension::().is_none()); + let intui = teksilo_core::presets::intui::from_os(&native.os, true); + assert_eq!(theme.id, intui.id); + assert_eq!(theme.colors, intui.colors); + assert!(theme.is_dark()); + + let bare = NativeDesktop::new(d.scheme.os_theme_colors()); + let request = NativeThemeRequest::new(&bare, true, TargetDensity::Compact); + let theme = resolve_native_theme(Some(&factory), &request); + assert!(theme.extension::().is_none()); +} From 33bbb2eade2eb6246afae68658562bb8c2b0e226 Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Sat, 17 Oct 2026 21:06:13 +0200 Subject: [PATCH 29/59] feat(theme-kde): name or embed Plasma's Noto Sans and Hack Two features, both off by default, put Plasma's own faces in the typography (spec l.1, l.3). bundled-fonts embeds them and adds font_registrar(), a FontRegistrar for TeksiloAppBuilder::register_fonts that registers them under "Noto Sans" and "Hack", shares the static bytes rather than copying them, and makes upright Noto Sans at the 13 px body size the default face. system-fonts names the same families without embedding anything, for a desktop that has them installed. Without either the families stay Inter and JetBrains Mono. The constants NOTO_SANS_FAMILY and HACK_FAMILY live in the new fonts module, which documents the three builds; known_metrics names them too. The faces, from the releases spec o.10 names, each archive checked against its recorded sha256 before anything was taken from it: - Noto Sans v2.015 (NotoSans-v2.015.zip): the full variable upright face, NotoSans[wdth,wght].ttf, whose sha256 is the ledger's, and its italic, as NotoSans-Variable.ttf and NotoSans-Italic-Variable.ttf (renamed so no axis tag reaches a file name), with the release's OFL.txt. - Hack v3.003 (Hack-v3.003-ttf.zip): Regular, whose sha256 is the ledger's, Bold, Italic and Bold Italic. The archive carries no licence file, so hack-LICENSE.txt is the project's LICENSE.md at tag v3.003. All six faces fit P10's budget easily: 5.6 MB uncompressed, about 3.2 MiB packaged against the 9 MiB guard, so the italics are in. The variable Noto Sans draws the bold styles at 600 rather than at a bold. tools/kde_golden/vectors/fonts.sha256 records the Ubuntu packages the reference image measured with (fonts-noto-core 20201225, fonts-hack 3.003-3), not the upstream releases, and neither hash matches a bundled file; the faces' head and hhea metrics are the ones the specification gives (o.10, n.7), and a test reads them from the files. Line heights: unchanged in every build. The spec's rule (l.2) computes every line box from Noto Sans and Hack's metrics whatever family draws them, so the monospace box is Qt's 15 px from Hack's hhea (a natural 1.1640625 em at the 13 px face) with or without the feature. Plan deviation: the plan computes it from hhea only when bundled. NOTICE: 2.6 Noto Sans (OFL-1.1) and 2.7 Hack (MIT and the Bitstream Vera licence), each with the release tag, the archive and file sha256 and, for Hack, the Bitstream naming condition; section 2's Reserved Font Name sentence now speaks of the OFL faces only, and section 3 names the two faces under teksilo-theme-kde's system-fonts as free fonts used from the machine. tests/fonts.rs: every file under fonts/ matches its recorded sha256 and nothing else is there; the faces' units per em, ascender, descender and line gap equal NOTO_SANS_METRICS and HACK_METRICS; the sizes and line boxes are the same in every build. With a font feature, the stock themes and their font roles name Noto Sans and Hack and a desktop at Plasma's defaults has the stock typography exactly; without one, they keep Inter and JetBrains Mono. Under bundled-fonts the registrar's faces answer every weight and style the styles ask for, Hack is monospaced and Noto Sans is the default at 13 px. sha2 joins the workspace as a test-only dependency, already in the lockfile. The crate was built, linted and tested with bundled-fonts,system-fonts, each alone, and neither. Signed-off-by: Cyril Jacquet --- CHANGELOG.md | 9 + Cargo.lock | 2 + Cargo.toml | 5 + NOTICE | 99 +++++- crates/teksilo-theme-kde/Cargo.toml | 24 ++ crates/teksilo-theme-kde/fonts/Hack-Bold.ttf | Bin 0 -> 317628 bytes .../fonts/Hack-BoldItalic.ttf | Bin 0 -> 322288 bytes .../teksilo-theme-kde/fonts/Hack-Italic.ttf | Bin 0 -> 316156 bytes .../teksilo-theme-kde/fonts/Hack-Regular.ttf | Bin 0 -> 309408 bytes .../fonts/NotoSans-Italic-Variable.ttf | Bin 0 -> 2323744 bytes .../fonts/NotoSans-Variable.ttf | Bin 0 -> 2049764 bytes .../teksilo-theme-kde/fonts/hack-LICENSE.txt | 45 +++ .../fonts/noto-sans-LICENSE.txt | 93 ++++++ crates/teksilo-theme-kde/src/fonts.rs | 158 ++++++++++ crates/teksilo-theme-kde/src/lib.rs | 40 ++- crates/teksilo-theme-kde/src/typography.rs | 49 ++- crates/teksilo-theme-kde/tests/fonts.rs | 286 ++++++++++++++++++ 17 files changed, 789 insertions(+), 21 deletions(-) create mode 100644 crates/teksilo-theme-kde/fonts/Hack-Bold.ttf create mode 100644 crates/teksilo-theme-kde/fonts/Hack-BoldItalic.ttf create mode 100644 crates/teksilo-theme-kde/fonts/Hack-Italic.ttf create mode 100644 crates/teksilo-theme-kde/fonts/Hack-Regular.ttf create mode 100644 crates/teksilo-theme-kde/fonts/NotoSans-Italic-Variable.ttf create mode 100644 crates/teksilo-theme-kde/fonts/NotoSans-Variable.ttf create mode 100644 crates/teksilo-theme-kde/fonts/hack-LICENSE.txt create mode 100644 crates/teksilo-theme-kde/fonts/noto-sans-LICENSE.txt create mode 100644 crates/teksilo-theme-kde/src/fonts.rs create mode 100644 crates/teksilo-theme-kde/tests/fonts.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 938a0d56a..5b1a6eb11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -235,6 +235,15 @@ by crate for clarity, not because crates version independently. Kvantum or any other, which keep Teksilo's default shapes in the desktop's colours; it is what `TeksiloAppBuilder::native_theme` asks for, so a window in `ThemeMode::Native` shows Breeze on a Breeze desktop. + The stock themes write in Teksilo's bundled Inter and JetBrains Mono at + the sizes and line heights of Plasma's Noto Sans and Hack. Two features, + both off by default, write in Plasma's own faces instead: + `bundled-fonts` embeds Noto Sans 2.015 (upright and italic, every + weight) and Hack 3.003 (regular, bold and their italics), about 5.6 MB, + with `font_registrar()` to hand to `TeksiloAppBuilder::register_fonts`; + `system-fonts` uses the copies installed on the desktop and embeds + nothing. Neither changes a text size, a line height or a control's + height. #### Platform diff --git a/Cargo.lock b/Cargo.lock index d5cd6dccc..f88e48b38 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12235,6 +12235,7 @@ version = "0.19.0" dependencies = [ "proptest", "serde_json", + "sha2 0.10.9", "teksilo-app", "teksilo-canvas", "teksilo-core", @@ -12243,6 +12244,7 @@ dependencies = [ "teksilo-kde-scheme", "teksilo-platform", "teksilo-target-conformance", + "teksilo-text", "teksilo-tokens", "teksilo-widgets", "thiserror 2.0.21", diff --git a/Cargo.toml b/Cargo.toml index 25c1ae908..8c5d1180e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -91,6 +91,11 @@ tempfile = "3" # used in the sibling `text-typeset` / `text-document` repos. Never a # production dependency — `[dev-dependencies]` only. proptest = "1" +# Test-only: `teksilo-theme-kde`'s `tests/fonts.rs` checks its bundled font +# files against the sha256 recorded for their upstream releases. 0.10 is +# already in the lockfile through `wry` and others. Never a production +# dependency: `[dev-dependencies]` only. +sha2 = "0.10" # Test-only: statistics-driven micro-benchmarking, behind the pointer-dispatch # performance budget (`crates/teksilo-core/benches/pointer_dispatch.rs`). The # default features pull `rayon` and `plotters` in for HTML reports; the budget diff --git a/NOTICE b/NOTICE index 01348995a..00d39e3e7 100644 --- a/NOTICE +++ b/NOTICE @@ -183,8 +183,10 @@ beside the font file, at the path given with each entry. "Default" in the Embedded column means the face is compiled into any binary built with that crate's default features. -None of these faces carries a Reserved Font Name, so the OFL's font-name -restriction does not apply to them. +None of the faces under the SIL Open Font License carries a Reserved Font +Name, so the OFL's font-name restriction does not apply to them. Hack's +Bitstream Vera licence has a naming condition of its own for modified +copies; see 2.7. 2.1 Inter -- crates/teksilo-text/fonts/ @@ -247,15 +249,88 @@ restriction does not apply to them. feature, which is off by default +2.6 Noto Sans -- crates/teksilo-theme-kde/fonts/ +--------------------------------------------------------------------------- + Copyright 2022 The Noto Project Authors + (https://github.com/notofonts/latin-greek-cyrillic) + + Licence: SIL Open Font License, Version 1.1 + Text: crates/teksilo-theme-kde/fonts/noto-sans-LICENSE.txt + (the release's OFL.txt, verbatim) + Files: NotoSans-Variable.ttf, NotoSans-Italic-Variable.ttf + Embedded: only with the teksilo-theme-kde "bundled-fonts" feature, + which is off by default + + Release: NotoSans-v2.015, notofonts/latin-greek-cyrillic + https://github.com/notofonts/latin-greek-cyrillic/releases/tag/NotoSans-v2.015 + Archive: NotoSans-v2.015.zip + 0c34df072a3fa7efbb7cbf34950e1f971a4447cffe365d3a359e2d4089b958f5 + + File (renamed from the archive path) sha256 + NotoSans-Variable.ttf + NotoSans/full/variable-ttf/NotoSans[wdth,wght].ttf + ae80a5e79e4afbf493e9f4684ec4988e6a861b3598102ee48950b4b7a754cdff + NotoSans-Italic-Variable.ttf + NotoSans/full/variable-ttf/NotoSans-Italic[wdth,wght].ttf + 8bcb0ae904c973257ec957ca92559d425469d92e0913d489fe80fbb49c3b6ded + noto-sans-LICENSE.txt + OFL.txt + cee9892f9f0cc8fe882c9e9537ee6a89621d86ee7ceaf70b02e2b2b1c25c061a + + Noto is a trademark of Google LLC. + + +2.7 Hack -- crates/teksilo-theme-kde/fonts/ +--------------------------------------------------------------------------- + Copyright (c) 2018 Source Foundry Authors + (https://github.com/source-foundry/Hack) + Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. + The work in the DejaVu project was committed to the public domain. + + Licence: MIT License (the Hack project's work) and the Bitstream Vera + License (Bitstream Vera Sans Mono, which Hack derives from) + Text: crates/teksilo-theme-kde/fonts/hack-LICENSE.txt + (the project's LICENSE.md at tag v3.003, verbatim; the + release archive carries no licence file) + Files: Hack-Regular.ttf, Hack-Bold.ttf, Hack-Italic.ttf, + Hack-BoldItalic.ttf + Embedded: only with the teksilo-theme-kde "bundled-fonts" feature, + which is off by default + + Release: v3.003, source-foundry/Hack + https://github.com/source-foundry/Hack/releases/tag/v3.003 + Archive: Hack-v3.003-ttf.zip + 0c2604631b1f055041c68a0e09ae4801acab6c5072ba2db6a822f53c3f8290ac + + File sha256 + Hack-Regular.ttf 15f55cc0c85a2988d2b4b3a8cdb5d77fdfbaf319e1bb5309d725db9818fb7125 + Hack-Bold.ttf 5bbf531eff7f8a0c2559c9a0656718e2828a012a9b1f60b5f54006d59a4de8d4 + Hack-Italic.ttf 096fb67a2b85f3c866e9cb3e965b27c2c10b977315f4d3d7f095674be35091c1 + Hack-BoldItalic.ttf 64f74a079700b7dfe128551a1e28875d5ba980971e55f5e0f0596e37bdc6a6bc + hack-LICENSE.txt 1f61bb7c790c59b4b0ecdf304628b94e42ae4c8020094a8c3da73381ab212623 + + The Bitstream Vera License lets the fonts be modified only if they are + renamed to names containing neither "Bitstream" nor "Vera", and forbids + selling a copy of the fonts by itself. Teksilo redistributes them + unmodified, as part of a larger work. Bitstream Vera is a trademark of + Bitstream, Inc. + +The tests in crates/teksilo-theme-kde/tests/fonts.rs check every file in +crates/teksilo-theme-kde/fonts/ against the sha256 values above. + + =========================================================================== 3. FONTS NAMED BUT NOT REDISTRIBUTED =========================================================================== -Two theme presets can ask the platform's text stack for a proprietary system -face by name. Neither font is included in this repository or in any binary -built from it, and no licence to either is granted or implied. The face -resolves only on a machine that already has it installed; on any other, the -text stack falls back to the bundled Inter and JetBrains Mono. +Three theme presets can ask the platform's text stack for a system face by +name, under their "system-fonts" feature. The face resolves only on a +machine that already has it installed; on any other, the text stack falls +back to the bundled Inter and JetBrains Mono. + +The Microsoft and Apple faces are proprietary. Neither is included in this +repository or in any binary built from it, and no licence to either is +granted or implied. Segoe UI Variable, Consolas Microsoft Corporation teksilo-theme-fluent, "system-fonts" @@ -263,6 +338,16 @@ text stack falls back to the bundled Inter and JetBrains Mono. SF Pro Text, SF Mono Apple Inc. teksilo-theme-macos, "system-fonts" +Noto Sans and Hack, KDE Plasma's default faces, are free fonts, the +releases in 2.6 and 2.7. Under "system-fonts" alone teksilo-theme-kde +embeds neither and uses the copies installed on the machine, under the +licences they were installed with; only its "bundled-fonts" feature +embeds them. + + Noto Sans, Hack The Noto Project Authors; Source Foundry + Authors and Bitstream, Inc. + teksilo-theme-kde, "system-fonts" + The same applies to the platform colour-emoji faces (Noto Color Emoji, Apple Color Emoji, Segoe UI Emoji) that the teksilo-text "system-emoji" feature reads from well-known paths at startup: located at runtime, never embedded. diff --git a/crates/teksilo-theme-kde/Cargo.toml b/crates/teksilo-theme-kde/Cargo.toml index a6e79d32e..f61708f01 100644 --- a/crates/teksilo-theme-kde/Cargo.toml +++ b/crates/teksilo-theme-kde/Cargo.toml @@ -26,6 +26,23 @@ exclude = [ "tests/preset_metrics.rs", ] +[features] +# Both off by default. Plasma's faces are Noto Sans (text) and Hack +# (monospace); without either feature the typography keeps Teksilo's bundled +# Inter and JetBrains Mono, at the sizes and line boxes Noto Sans and Hack +# have at Plasma's default fonts. +# +# `bundled-fonts` embeds Noto Sans v2.015 (variable, upright and italic, +# OFL-1.1) and Hack v3.003 (regular, bold and their italics, MIT plus the +# Bitstream Vera licence), about 5.6 MB in all, switches the families to +# "Noto Sans" and "Hack", and exposes `font_registrar()`. +bundled-fonts = ["dep:teksilo-text"] +# `system-fonts` switches the families to "Noto Sans" and "Hack" without +# embedding them, for a desktop that has them installed, as every Plasma +# desktop does; the text engine finds them among the installed fonts, and +# falls back to the bundled default on a machine without them. +system-fonts = [] + [dependencies] teksilo-core = { workspace = true } teksilo-tokens = { workspace = true } @@ -39,6 +56,10 @@ teksilo-widgets = { workspace = true } # palette, Plasma's accent application and the colour arithmetic. teksilo-kde-scheme = { workspace = true } thiserror = { workspace = true } +# Only pulled in under `bundled-fonts`, for the `FontRegistrar` types. +# Declared directly, with `default-features = false`, so it does not turn on +# teksilo-text's Noto fallback fonts: which of those ship is the app's call. +teksilo-text = { path = "../teksilo-text", version = "0.19.0", optional = true, default-features = false } [dev-dependencies] # Property-based testing: `tests/contrast.rs` checks every declared text and @@ -46,6 +67,9 @@ thiserror = { workspace = true } # toolchain, which is not a guaranteed CI dependency; proptest gives the same # coverage plus shrinking on stable (see the workspace `Cargo.toml`). proptest = { workspace = true } +# `tests/fonts.rs` checks every file under `fonts/` against the sha256 +# recorded for its upstream release. +sha2 = { workspace = true } # Reads the golden vectors in `tools/kde_golden/vectors`. serde_json = { workspace = true } # `tests/mount.rs` and `tests/preset_metrics.rs` build real widget trees; diff --git a/crates/teksilo-theme-kde/fonts/Hack-Bold.ttf b/crates/teksilo-theme-kde/fonts/Hack-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7ff4975285da696a57111071bfa6028e691de608 GIT binary patch literal 317628 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Ξ*Adjxjn5c9JUr1Ok4PZ%1JM;ieu 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®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 literal 0 HcmV?d00001 diff --git a/crates/teksilo-theme-kde/fonts/Hack-BoldItalic.ttf b/crates/teksilo-theme-kde/fonts/Hack-BoldItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3b137d9715e4ced28a4ab855046d95b2ca979231 GIT binary patch literal 322288 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

}ZV5x0A7(dfY86 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 literal 0 HcmV?d00001 diff --git a/crates/teksilo-theme-kde/fonts/Hack-Italic.ttf b/crates/teksilo-theme-kde/fonts/Hack-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d26198a321a5ce0f2a9c26d0f96e02eaa5f461b4 GIT binary patch literal 316156 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

hyMIUP)%s`b`Y%t?u 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�BO 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 z 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

lipX z89%t)L1Zn7w#;-}USgg#E*&nk6g|(G1Qmus3tNsjIhevgp16@5CCac&oFQ%eMM}nZ z{mnz>s34v3aMz*q^t7z0vk!G1GW!Jt2ASxcw2bWTp8MFWsimbQCDW&tl$Dk-0g1n8B}ozJZoF0r$e^J`a*sp<@okRTsO%H2(}g3TTkA_r zY_P>jVzWUR3KUay?+f%NC1?ezWXd19?3;y;D2) z=Jd@SxaBCD7@yRdoI1@I*B<-wy!p$P-g4A5y{O1h(7URyq%^-^5%4=S<)}GLXGT&? zP*KLzTkhzZ9`LuniN0E|5dVh^Rxh7GQJxUnGxL_)=k$BaC)IDL^7E%p&b9}+_DF?A zGiGGlx&2!bzLjrRQ-8rQ!6d{9w;c=hLS+CVTojp^4u~Lz7RS90h8bLbuiryo}eM%KoVvP^fjleHU^+=q5A;2uIP{IMn8hjx?CUO%x=LY*K$e zUzje{LKq99L~=Fia#OW;19`##VP1~Mrtvh>B0Gh6=r^B#@tfaImET5%z7r=71y6sR z1)+KIKbbhmHDqK(Opkw#A(lJ1ckkf2b32FbV2>ybjO9me1|^F}-I933OjHUpo!ybB za2SP5ev0ZSLtRNH0zA}Iy~GRPK;d0)CZZjOFGZkHpcnj=aBX`konu{0C@R1fXWJ6u zt>zd5de9(qgvu{hvPyqiP=X*?9QK49o6V7vmy2IXc%isb1#ifGsWofO;PWB)4-5)1 z;7{NZNdd%*kTmtr&*fqJ!&%FTzlevj)`WLeZu_9MsiDqXpU^aM&*aJB?87X%2GSC~ z2D0Q+hRKs}Y;8)eG1oRU8MQ2k#V^zZ`IMHcL&f>K|5&>xBqaImm<(OqoH=jI_YU>b z>SAO4B%e^+h{dN=?PS~(gl+~lg! zO4x6Syg#q!XWP@GGQ%@7XD^FdKFsu40i{{Jdo!~$as#PyNTj_fx=|f«q(At`*`NbkV(;WAZRz)Jn7&p-cM>U1p@ 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�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 z

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 z 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%0DhV0qC7p|fL@)U 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%0A0BMy90^qO_Kl+kES{#Ht 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

U(94VYELS=g`7V7w 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 Ek}nRVdJKn0GD#7Loh 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 JCH)LyFAk1QKLD;{JI6 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ð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≠m7il$~ekyQyX}8pV!mu;}oe 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

=aoU=K&Y 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%0Dll$Arco0*fDm3qbQ_)LZ&FP{dZ+;qD` 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 literal 0 HcmV?d00001 diff --git a/crates/teksilo-theme-kde/fonts/NotoSans-Variable.ttf b/crates/teksilo-theme-kde/fonts/NotoSans-Variable.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ad87d1d9109f83ef52d08792cf9cbeef1bd11067 GIT binary patch literal 2049764 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.Y=tG=aKwF{<$>{oKhuH2>#$ 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ÐX(Ja$cIhp5sf>r_UlOt;Ek_N5F_ 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 z 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㍺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�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 %Ch1- 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±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 D9ti__ literal 0 HcmV?d00001 diff --git a/crates/teksilo-theme-kde/fonts/NotoSans-Italic-Variable.ttf b/crates/teksilo-theme-kde/fonts/NotoSans-Italic-Variable.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b2e71e21cc5f1123ccee665e07c1bd4f1ff90086 GIT binary patch literal 2323744 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