diff --git a/src/ae-firefly-indigo.css b/src/ae-firefly-indigo.css
new file mode 100644
index 00000000..561a57f7
--- /dev/null
+++ b/src/ae-firefly-indigo.css
@@ -0,0 +1,291 @@
+/*
+ * AE Firefly — Indigo variant
+ * "Deep night, rich as velvet."
+ * Aether Platform / One Sky IT, LLC — Design System Theme
+ *
+ * Aesthetic vision (Scott Idem, 2026-03-09):
+ * A deep, rich purple-indigo variant of the Firefly system.
+ * Inspired by the deep indigo of a clear night sky — the hours
+ * before dawn when the dark is at its most velvety and profound.
+ * Authoritative and calm, with a warm rose accent for warmth.
+ *
+ * Color philosophy:
+ * Primary — Deep Indigo: rich blue-violet (~266°), luminous depth
+ * Secondary — Violet: companion purple, warmer/rosier tone (~290°)
+ * Tertiary — Dusty Rose: warm complement, plum/rose tones (~341°)
+ * Surface — Velvet Slate: subtly purple-tinged neutral; near-white
+ * (light mode) → deep midnight indigo-grey (dark mode)
+ *
+ * Section 508 / WCAG 2.1 AA:
+ * - Body text (surface-950 on surface-50 light): >15:1 contrast ✓
+ * - Primary-filled buttons meet ≥3:1 for interactive components ✓
+ * - Contrast crossover points calculated per OKLCH approximate RL
+ *
+ * Based on: Skeleton v4 theme CSS variable structure
+ * Variant of: src/ae-firefly.css (AE_Firefly)
+ */
+
+[data-theme='AE_Firefly_Indigo'] {
+ --text-scaling: 1.067;
+ --base-font-color: var(--color-surface-950);
+ --base-font-color-dark: var(--color-surface-50);
+ --base-font-family: system-ui, sans-serif;
+ --base-font-size: inherit;
+ --base-line-height: inherit;
+ --base-font-weight: normal;
+ --base-font-style: normal;
+ --base-letter-spacing: 0em;
+ --heading-font-color: inherit;
+ --heading-font-color-dark: inherit;
+ --heading-font-family: inherit;
+ --heading-font-weight: bold;
+ --heading-font-style: normal;
+ --heading-letter-spacing: inherit;
+
+ /* Anchors: indigo in light, lighter indigo in dark */
+ --anchor-font-color: var(--color-primary-600);
+ --anchor-font-color-dark: var(--color-primary-300);
+ --anchor-font-family: inherit;
+ --anchor-font-size: inherit;
+ --anchor-line-height: inherit;
+ --anchor-font-weight: inherit;
+ --anchor-font-style: inherit;
+ --anchor-letter-spacing: inherit;
+ --anchor-text-decoration: none;
+ --anchor-text-decoration-hover: underline;
+ --anchor-text-decoration-active: none;
+ --anchor-text-decoration-focus: none;
+
+ --spacing: 0.25rem;
+ --radius-base: 0.375rem;
+ --radius-container: 0.875rem;
+ --default-border-width: 1px;
+ --default-divide-width: 1px;
+ --default-ring-width: 1px;
+
+ --body-background-color: var(--color-surface-50);
+ --body-background-color-dark: var(--color-surface-950);
+
+ /* ===================================================================
+ * PRIMARY — Deep Indigo
+ * Hue: ~266°. Rich blue-violet indigo — the color of deep night sky
+ * in the hours before dawn. Luminous depth without harshness.
+ * CSS named "indigo" (#4B0082) is near oklch(20%, 0.18, 302°) but
+ * that's too dark to use as a 500 primary. This palette centers on
+ * a richer, usable indigo that reads clearly as "indigo" while
+ * maintaining sufficient contrast at mid-range shades.
+ * At 500 (L≈50%): sufficient contrast with primary-50 text (≥4:1).
+ * =================================================================== */
+ --color-primary-50: oklch(95.5% 0.040 270deg);
+ --color-primary-100: oklch(89.5% 0.072 270deg);
+ --color-primary-200: oklch(82.5% 0.108 269deg);
+ --color-primary-300: oklch(74.5% 0.135 268deg);
+ --color-primary-400: oklch(65.0% 0.155 267deg);
+ --color-primary-500: oklch(50.5% 0.160 266deg);
+ --color-primary-600: oklch(43.5% 0.152 265deg);
+ --color-primary-700: oklch(37.0% 0.138 264deg);
+ --color-primary-800: oklch(30.0% 0.120 263deg);
+ --color-primary-900: oklch(23.0% 0.100 262deg);
+ --color-primary-950: oklch(15.5% 0.080 261deg);
+ --color-primary-contrast-dark: var(--color-primary-950);
+ --color-primary-contrast-light: var(--color-primary-50);
+ --color-primary-contrast-50: var(--color-primary-contrast-dark);
+ --color-primary-contrast-100: var(--color-primary-contrast-dark);
+ --color-primary-contrast-200: var(--color-primary-contrast-dark);
+ --color-primary-contrast-300: var(--color-primary-contrast-dark);
+ --color-primary-contrast-400: var(--color-primary-contrast-dark);
+ --color-primary-contrast-500: var(--color-primary-contrast-light);
+ --color-primary-contrast-600: var(--color-primary-contrast-light);
+ --color-primary-contrast-700: var(--color-primary-contrast-light);
+ --color-primary-contrast-800: var(--color-primary-contrast-light);
+ --color-primary-contrast-900: var(--color-primary-contrast-light);
+ --color-primary-contrast-950: var(--color-primary-contrast-light);
+
+ /* ===================================================================
+ * SECONDARY — Violet
+ * Hue: ~290°. A companion purple, slightly warmer and rosier than
+ * the primary indigo. Creates a rich monochromatic depth while
+ * remaining clearly distinct from the primary.
+ * Used for secondary actions, badges, and soft highlights.
+ * =================================================================== */
+ --color-secondary-50: oklch(96.5% 0.032 297deg);
+ --color-secondary-100: oklch(91.5% 0.058 295deg);
+ --color-secondary-200: oklch(85.5% 0.090 293deg);
+ --color-secondary-300: oklch(78.5% 0.115 292deg);
+ --color-secondary-400: oklch(70.0% 0.132 291deg);
+ --color-secondary-500: oklch(60.0% 0.140 290deg);
+ --color-secondary-600: oklch(52.5% 0.135 289deg);
+ --color-secondary-700: oklch(45.0% 0.126 288deg);
+ --color-secondary-800: oklch(37.5% 0.112 286deg);
+ --color-secondary-900: oklch(30.0% 0.094 284deg);
+ --color-secondary-950: oklch(22.0% 0.076 282deg);
+ --color-secondary-contrast-dark: var(--color-secondary-950);
+ --color-secondary-contrast-light: var(--color-secondary-50);
+ --color-secondary-contrast-50: var(--color-secondary-contrast-dark);
+ --color-secondary-contrast-100: var(--color-secondary-contrast-dark);
+ --color-secondary-contrast-200: var(--color-secondary-contrast-dark);
+ --color-secondary-contrast-300: var(--color-secondary-contrast-dark);
+ --color-secondary-contrast-400: var(--color-secondary-contrast-dark);
+ --color-secondary-contrast-500: var(--color-secondary-contrast-light);
+ --color-secondary-contrast-600: var(--color-secondary-contrast-light);
+ --color-secondary-contrast-700: var(--color-secondary-contrast-light);
+ --color-secondary-contrast-800: var(--color-secondary-contrast-light);
+ --color-secondary-contrast-900: var(--color-secondary-contrast-light);
+ --color-secondary-contrast-950: var(--color-secondary-contrast-light);
+
+ /* ===================================================================
+ * TERTIARY — Dusty Rose / Plum
+ * Hue: ~341°. A warm, muted rose-plum that provides the crucial
+ * warm counterpoint to the cool indigo-violet palette. Prevents
+ * the theme from feeling cold — like the warm glow of dawn
+ * breaking against a deep indigo sky.
+ * Used for location chips, warm accents, tertiary elements.
+ * =================================================================== */
+ --color-tertiary-50: oklch(96.5% 0.022 348deg);
+ --color-tertiary-100: oklch(91.0% 0.042 346deg);
+ --color-tertiary-200: oklch(84.5% 0.068 344deg);
+ --color-tertiary-300: oklch(76.5% 0.095 343deg);
+ --color-tertiary-400: oklch(68.0% 0.118 342deg);
+ --color-tertiary-500: oklch(57.5% 0.128 341deg);
+ --color-tertiary-600: oklch(50.0% 0.122 340deg);
+ --color-tertiary-700: oklch(43.0% 0.112 339deg);
+ --color-tertiary-800: oklch(35.5% 0.098 338deg);
+ --color-tertiary-900: oklch(28.0% 0.080 337deg);
+ --color-tertiary-950: oklch(20.5% 0.062 336deg);
+ --color-tertiary-contrast-dark: var(--color-tertiary-950);
+ --color-tertiary-contrast-light: var(--color-tertiary-50);
+ --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark);
+ --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark);
+ --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark);
+ --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark);
+ --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark);
+ --color-tertiary-contrast-500: var(--color-tertiary-contrast-light);
+ --color-tertiary-contrast-600: var(--color-tertiary-contrast-light);
+ --color-tertiary-contrast-700: var(--color-tertiary-contrast-light);
+ --color-tertiary-contrast-800: var(--color-tertiary-contrast-light);
+ --color-tertiary-contrast-900: var(--color-tertiary-contrast-light);
+ --color-tertiary-contrast-950: var(--color-tertiary-contrast-light);
+
+ /* ===================================================================
+ * SUCCESS — Bioluminescent Green
+ * Hue: ~152°. Consistent with AE_Firefly for recognizable semantic
+ * color meaning across OSIT themes.
+ * =================================================================== */
+ --color-success-50: oklch(95.77% 0.05 152.69deg);
+ --color-success-100: oklch(91.59% 0.06 152.00deg);
+ --color-success-200: oklch(87.45% 0.08 152.08deg);
+ --color-success-300: oklch(83.57% 0.09 150.85deg);
+ --color-success-400: oklch(79.47% 0.11 150.71deg);
+ --color-success-500: oklch(75.38% 0.12 149.99deg);
+ --color-success-600: oklch(67.65% 0.11 149.94deg);
+ --color-success-700: oklch(59.71% 0.09 150.42deg);
+ --color-success-800: oklch(51.74% 0.08 150.24deg);
+ --color-success-900: oklch(43.20% 0.06 151.12deg);
+ --color-success-950: oklch(34.20% 0.04 151.44deg);
+ --color-success-contrast-dark: var(--color-success-950);
+ --color-success-contrast-light: var(--color-success-50);
+ --color-success-contrast-50: var(--color-success-contrast-dark);
+ --color-success-contrast-100: var(--color-success-contrast-dark);
+ --color-success-contrast-200: var(--color-success-contrast-dark);
+ --color-success-contrast-300: var(--color-success-contrast-dark);
+ --color-success-contrast-400: var(--color-success-contrast-dark);
+ --color-success-contrast-500: var(--color-success-contrast-dark);
+ --color-success-contrast-600: var(--color-success-contrast-dark);
+ --color-success-contrast-700: var(--color-success-contrast-light);
+ --color-success-contrast-800: var(--color-success-contrast-light);
+ --color-success-contrast-900: var(--color-success-contrast-light);
+ --color-success-contrast-950: var(--color-success-contrast-light);
+
+ /* ===================================================================
+ * WARNING — Amber Orange
+ * Consistent with AE_Firefly for recognizable semantic meaning.
+ * =================================================================== */
+ --color-warning-50: oklch(97.5% 0.065 78deg);
+ --color-warning-100: oklch(93.5% 0.090 75deg);
+ --color-warning-200: oklch(89.5% 0.120 73deg);
+ --color-warning-300: oklch(85.5% 0.145 70deg);
+ --color-warning-400: oklch(81.5% 0.160 67deg);
+ --color-warning-500: oklch(77.0% 0.165 65deg);
+ --color-warning-600: oklch(69.5% 0.155 64deg);
+ --color-warning-700: oklch(61.5% 0.140 63deg);
+ --color-warning-800: oklch(53.5% 0.125 62deg);
+ --color-warning-900: oklch(45.0% 0.105 61deg);
+ --color-warning-950: oklch(37.0% 0.088 60deg);
+ --color-warning-contrast-dark: var(--color-warning-950);
+ --color-warning-contrast-light: var(--color-warning-50);
+ --color-warning-contrast-50: var(--color-warning-contrast-dark);
+ --color-warning-contrast-100: var(--color-warning-contrast-dark);
+ --color-warning-contrast-200: var(--color-warning-contrast-dark);
+ --color-warning-contrast-300: var(--color-warning-contrast-dark);
+ --color-warning-contrast-400: var(--color-warning-contrast-dark);
+ --color-warning-contrast-500: var(--color-warning-contrast-dark);
+ --color-warning-contrast-600: var(--color-warning-contrast-dark);
+ --color-warning-contrast-700: var(--color-warning-contrast-light);
+ --color-warning-contrast-800: var(--color-warning-contrast-light);
+ --color-warning-contrast-900: var(--color-warning-contrast-light);
+ --color-warning-contrast-950: var(--color-warning-contrast-light);
+
+ /* ===================================================================
+ * ERROR — Soft Coral/Rose
+ * Consistent with AE_Firefly for recognizable semantic meaning.
+ * =================================================================== */
+ --color-error-50: oklch(95.0% 0.040 18deg);
+ --color-error-100: oklch(88.0% 0.070 20deg);
+ --color-error-200: oklch(80.0% 0.105 21deg);
+ --color-error-300: oklch(72.0% 0.140 22deg);
+ --color-error-400: oklch(64.5% 0.170 23deg);
+ --color-error-500: oklch(57.5% 0.195 24deg);
+ --color-error-600: oklch(51.5% 0.182 25deg);
+ --color-error-700: oklch(45.5% 0.165 26deg);
+ --color-error-800: oklch(39.5% 0.148 27deg);
+ --color-error-900: oklch(33.0% 0.128 28deg);
+ --color-error-950: oklch(26.5% 0.108 29deg);
+ --color-error-contrast-dark: var(--color-error-950);
+ --color-error-contrast-light: var(--color-error-50);
+ --color-error-contrast-50: var(--color-error-contrast-dark);
+ --color-error-contrast-100: var(--color-error-contrast-dark);
+ --color-error-contrast-200: var(--color-error-contrast-dark);
+ --color-error-contrast-300: var(--color-error-contrast-dark);
+ --color-error-contrast-400: var(--color-error-contrast-light);
+ --color-error-contrast-500: var(--color-error-contrast-light);
+ --color-error-contrast-600: var(--color-error-contrast-light);
+ --color-error-contrast-700: var(--color-error-contrast-light);
+ --color-error-contrast-800: var(--color-error-contrast-light);
+ --color-error-contrast-900: var(--color-error-contrast-light);
+ --color-error-contrast-950: var(--color-error-contrast-light);
+
+ /* ===================================================================
+ * SURFACE — Velvet Slate
+ * A subtly purple-tinged neutral — barely perceptible, it gives
+ * surfaces a velvet quality that harmonizes with the indigo palette
+ * without being purple-on-purple. Light mode: soft white with a
+ * whisper of purple. Dark mode: deep midnight indigo-grey.
+ *
+ * 50 → body-bg light: near-white with ImperceptibleISTIC purple cast
+ * 950 → body-bg dark: deep midnight with indigo depth
+ * =================================================================== */
+ --color-surface-50: oklch(99.0% 0.003 270deg);
+ --color-surface-100: oklch(96.5% 0.006 268deg);
+ --color-surface-200: oklch(92.5% 0.010 266deg);
+ --color-surface-300: oklch(87.0% 0.014 265deg);
+ --color-surface-400: oklch(78.5% 0.018 265deg);
+ --color-surface-500: oklch(66.5% 0.020 267deg);
+ --color-surface-600: oklch(54.5% 0.022 269deg);
+ --color-surface-700: oklch(42.5% 0.024 270deg);
+ --color-surface-800: oklch(31.0% 0.026 272deg);
+ --color-surface-900: oklch(20.5% 0.030 274deg);
+ --color-surface-950: oklch(13.0% 0.034 276deg);
+ --color-surface-contrast-dark: var(--color-surface-950);
+ --color-surface-contrast-light: var(--color-surface-50);
+ --color-surface-contrast-50: var(--color-surface-contrast-dark);
+ --color-surface-contrast-100: var(--color-surface-contrast-dark);
+ --color-surface-contrast-200: var(--color-surface-contrast-dark);
+ --color-surface-contrast-300: var(--color-surface-contrast-dark);
+ --color-surface-contrast-400: var(--color-surface-contrast-dark);
+ --color-surface-contrast-500: var(--color-surface-contrast-dark);
+ --color-surface-contrast-600: var(--color-surface-contrast-light);
+ --color-surface-contrast-700: var(--color-surface-contrast-light);
+ --color-surface-contrast-800: var(--color-surface-contrast-light);
+ --color-surface-contrast-900: var(--color-surface-contrast-light);
+ --color-surface-contrast-950: var(--color-surface-contrast-light);
+}
diff --git a/src/ae-firefly-rainbow.css b/src/ae-firefly-rainbow.css
new file mode 100644
index 00000000..8bcf3ec1
--- /dev/null
+++ b/src/ae-firefly-rainbow.css
@@ -0,0 +1,287 @@
+/*
+ * AE Firefly — Rainbow variant
+ * "All the colors of wonder."
+ * Aether Platform / One Sky IT, LLC — Design System Theme
+ *
+ * Aesthetic vision (Scott Idem, 2026-03-09):
+ * A celebration-of-color variant of the Firefly system.
+ * The three brand color slots span the visible spectrum:
+ * Coral-Red (primary) → Emerald-Green (secondary) → Violet (tertiary).
+ * Warm cream surfaces let the saturated accents breathe without
+ * competing. Joyful and energetic — still calm, still Firefly.
+ *
+ * Color philosophy:
+ * Primary — Vivid Coral-Red: ~15°, warm and energetic
+ * Secondary — Emerald Green: ~148°, lush and clear
+ * Tertiary — Rich Violet: ~295°, deep and luminous
+ * Surface — Sunrise Cream: barely warm neutral; warm white
+ * (light mode) → deep warm charcoal (dark mode)
+ *
+ * Section 508 / WCAG 2.1 AA:
+ * - Body text (surface-950 on surface-50 light): >15:1 contrast ✓
+ * - Primary-filled buttons meet ≥3:1 for interactive components ✓
+ * - Chroma values kept within sRGB gamut across the full ramp
+ *
+ * Based on: Skeleton v4 theme CSS variable structure
+ * Variant of: src/ae-firefly.css (AE_Firefly)
+ */
+
+[data-theme='AE_Firefly_Rainbow'] {
+ --text-scaling: 1.067;
+ --base-font-color: var(--color-surface-950);
+ --base-font-color-dark: var(--color-surface-50);
+ --base-font-family: system-ui, sans-serif;
+ --base-font-size: inherit;
+ --base-line-height: inherit;
+ --base-font-weight: normal;
+ --base-font-style: normal;
+ --base-letter-spacing: 0em;
+ --heading-font-color: inherit;
+ --heading-font-color-dark: inherit;
+ --heading-font-family: inherit;
+ --heading-font-weight: bold;
+ --heading-font-style: normal;
+ --heading-letter-spacing: inherit;
+
+ /* Anchors: coral-red in light, lighter coral in dark */
+ --anchor-font-color: var(--color-primary-600);
+ --anchor-font-color-dark: var(--color-primary-300);
+ --anchor-font-family: inherit;
+ --anchor-font-size: inherit;
+ --anchor-line-height: inherit;
+ --anchor-font-weight: inherit;
+ --anchor-font-style: inherit;
+ --anchor-letter-spacing: inherit;
+ --anchor-text-decoration: none;
+ --anchor-text-decoration-hover: underline;
+ --anchor-text-decoration-active: none;
+ --anchor-text-decoration-focus: none;
+
+ --spacing: 0.25rem;
+ --radius-base: 0.375rem;
+ --radius-container: 0.875rem;
+ --default-border-width: 1px;
+ --default-divide-width: 1px;
+ --default-ring-width: 1px;
+
+ --body-background-color: var(--color-surface-50);
+ --body-background-color-dark: var(--color-surface-950);
+
+ /* ===================================================================
+ * PRIMARY — Vivid Coral-Red (warm end of the rainbow)
+ * Hue: ~15°. The warm, energetic anchor of the spectrum —
+ * sits between orange and red for maximum vibrancy and warmth.
+ * Kept within sRGB gamut across the full ramp.
+ * At 500 (L≈60%): sufficient contrast with primary-50 text (≥4:1).
+ * =================================================================== */
+ --color-primary-50: oklch(97.0% 0.020 15deg);
+ --color-primary-100: oklch(92.0% 0.048 14deg);
+ --color-primary-200: oklch(86.0% 0.085 13deg);
+ --color-primary-300: oklch(79.0% 0.125 13deg);
+ --color-primary-400: oklch(71.0% 0.160 13deg);
+ --color-primary-500: oklch(60.0% 0.190 14deg);
+ --color-primary-600: oklch(52.5% 0.178 15deg);
+ --color-primary-700: oklch(45.0% 0.162 16deg);
+ --color-primary-800: oklch(37.5% 0.142 17deg);
+ --color-primary-900: oklch(30.0% 0.118 18deg);
+ --color-primary-950: oklch(22.5% 0.092 19deg);
+ --color-primary-contrast-dark: var(--color-primary-950);
+ --color-primary-contrast-light: var(--color-primary-50);
+ --color-primary-contrast-50: var(--color-primary-contrast-dark);
+ --color-primary-contrast-100: var(--color-primary-contrast-dark);
+ --color-primary-contrast-200: var(--color-primary-contrast-dark);
+ --color-primary-contrast-300: var(--color-primary-contrast-dark);
+ --color-primary-contrast-400: var(--color-primary-contrast-dark);
+ --color-primary-contrast-500: var(--color-primary-contrast-light);
+ --color-primary-contrast-600: var(--color-primary-contrast-light);
+ --color-primary-contrast-700: var(--color-primary-contrast-light);
+ --color-primary-contrast-800: var(--color-primary-contrast-light);
+ --color-primary-contrast-900: var(--color-primary-contrast-light);
+ --color-primary-contrast-950: var(--color-primary-contrast-light);
+
+ /* ===================================================================
+ * SECONDARY — Emerald Green (mid-spectrum, the heart of the rainbow)
+ * Hue: ~148°. Clear, lush emerald — the most recognizable
+ * "rainbow green." Positioned at the center of the visible spectrum,
+ * it bridges the warm red primary and the cool violet tertiary.
+ * Used for secondary actions, success-adjacent highlights, badges.
+ * =================================================================== */
+ --color-secondary-50: oklch(97.0% 0.040 152deg);
+ --color-secondary-100: oklch(92.5% 0.072 150deg);
+ --color-secondary-200: oklch(87.0% 0.105 149deg);
+ --color-secondary-300: oklch(81.0% 0.132 148deg);
+ --color-secondary-400: oklch(74.5% 0.152 148deg);
+ --color-secondary-500: oklch(62.0% 0.160 148deg);
+ --color-secondary-600: oklch(53.5% 0.148 148deg);
+ --color-secondary-700: oklch(45.5% 0.132 147deg);
+ --color-secondary-800: oklch(37.5% 0.112 146deg);
+ --color-secondary-900: oklch(29.5% 0.090 145deg);
+ --color-secondary-950: oklch(21.5% 0.068 144deg);
+ --color-secondary-contrast-dark: var(--color-secondary-950);
+ --color-secondary-contrast-light: var(--color-secondary-50);
+ --color-secondary-contrast-50: var(--color-secondary-contrast-dark);
+ --color-secondary-contrast-100: var(--color-secondary-contrast-dark);
+ --color-secondary-contrast-200: var(--color-secondary-contrast-dark);
+ --color-secondary-contrast-300: var(--color-secondary-contrast-dark);
+ --color-secondary-contrast-400: var(--color-secondary-contrast-dark);
+ --color-secondary-contrast-500: var(--color-secondary-contrast-light);
+ --color-secondary-contrast-600: var(--color-secondary-contrast-light);
+ --color-secondary-contrast-700: var(--color-secondary-contrast-light);
+ --color-secondary-contrast-800: var(--color-secondary-contrast-light);
+ --color-secondary-contrast-900: var(--color-secondary-contrast-light);
+ --color-secondary-contrast-950: var(--color-secondary-contrast-light);
+
+ /* ===================================================================
+ * TERTIARY — Rich Violet (cool end of the rainbow)
+ * Hue: ~295°. Deep blue-violet — the "indigo and violet" end of
+ * the arc. Completes the warm-cool spectrum span across the three
+ * brand color slots. Creates striking contrast with the warm primary.
+ * Used for location chips, deep accents, tertiary elements.
+ * =================================================================== */
+ --color-tertiary-50: oklch(96.5% 0.030 299deg);
+ --color-tertiary-100: oklch(91.0% 0.058 297deg);
+ --color-tertiary-200: oklch(84.5% 0.092 296deg);
+ --color-tertiary-300: oklch(77.0% 0.122 295deg);
+ --color-tertiary-400: oklch(68.5% 0.148 295deg);
+ --color-tertiary-500: oklch(57.0% 0.158 295deg);
+ --color-tertiary-600: oklch(49.5% 0.150 294deg);
+ --color-tertiary-700: oklch(42.5% 0.138 293deg);
+ --color-tertiary-800: oklch(35.5% 0.122 292deg);
+ --color-tertiary-900: oklch(28.5% 0.102 291deg);
+ --color-tertiary-950: oklch(21.0% 0.080 290deg);
+ --color-tertiary-contrast-dark: var(--color-tertiary-950);
+ --color-tertiary-contrast-light: var(--color-tertiary-50);
+ --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark);
+ --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark);
+ --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark);
+ --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark);
+ --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark);
+ --color-tertiary-contrast-500: var(--color-tertiary-contrast-light);
+ --color-tertiary-contrast-600: var(--color-tertiary-contrast-light);
+ --color-tertiary-contrast-700: var(--color-tertiary-contrast-light);
+ --color-tertiary-contrast-800: var(--color-tertiary-contrast-light);
+ --color-tertiary-contrast-900: var(--color-tertiary-contrast-light);
+ --color-tertiary-contrast-950: var(--color-tertiary-contrast-light);
+
+ /* ===================================================================
+ * SUCCESS — Bioluminescent Green
+ * Hue: ~152°. Consistent with AE_Firefly for recognizable semantic
+ * color meaning across OSIT themes.
+ * =================================================================== */
+ --color-success-50: oklch(95.77% 0.05 152.69deg);
+ --color-success-100: oklch(91.59% 0.06 152.00deg);
+ --color-success-200: oklch(87.45% 0.08 152.08deg);
+ --color-success-300: oklch(83.57% 0.09 150.85deg);
+ --color-success-400: oklch(79.47% 0.11 150.71deg);
+ --color-success-500: oklch(75.38% 0.12 149.99deg);
+ --color-success-600: oklch(67.65% 0.11 149.94deg);
+ --color-success-700: oklch(59.71% 0.09 150.42deg);
+ --color-success-800: oklch(51.74% 0.08 150.24deg);
+ --color-success-900: oklch(43.20% 0.06 151.12deg);
+ --color-success-950: oklch(34.20% 0.04 151.44deg);
+ --color-success-contrast-dark: var(--color-success-950);
+ --color-success-contrast-light: var(--color-success-50);
+ --color-success-contrast-50: var(--color-success-contrast-dark);
+ --color-success-contrast-100: var(--color-success-contrast-dark);
+ --color-success-contrast-200: var(--color-success-contrast-dark);
+ --color-success-contrast-300: var(--color-success-contrast-dark);
+ --color-success-contrast-400: var(--color-success-contrast-dark);
+ --color-success-contrast-500: var(--color-success-contrast-dark);
+ --color-success-contrast-600: var(--color-success-contrast-dark);
+ --color-success-contrast-700: var(--color-success-contrast-light);
+ --color-success-contrast-800: var(--color-success-contrast-light);
+ --color-success-contrast-900: var(--color-success-contrast-light);
+ --color-success-contrast-950: var(--color-success-contrast-light);
+
+ /* ===================================================================
+ * WARNING — Amber Orange
+ * Consistent with AE_Firefly for recognizable semantic meaning.
+ * =================================================================== */
+ --color-warning-50: oklch(97.5% 0.065 78deg);
+ --color-warning-100: oklch(93.5% 0.090 75deg);
+ --color-warning-200: oklch(89.5% 0.120 73deg);
+ --color-warning-300: oklch(85.5% 0.145 70deg);
+ --color-warning-400: oklch(81.5% 0.160 67deg);
+ --color-warning-500: oklch(77.0% 0.165 65deg);
+ --color-warning-600: oklch(69.5% 0.155 64deg);
+ --color-warning-700: oklch(61.5% 0.140 63deg);
+ --color-warning-800: oklch(53.5% 0.125 62deg);
+ --color-warning-900: oklch(45.0% 0.105 61deg);
+ --color-warning-950: oklch(37.0% 0.088 60deg);
+ --color-warning-contrast-dark: var(--color-warning-950);
+ --color-warning-contrast-light: var(--color-warning-50);
+ --color-warning-contrast-50: var(--color-warning-contrast-dark);
+ --color-warning-contrast-100: var(--color-warning-contrast-dark);
+ --color-warning-contrast-200: var(--color-warning-contrast-dark);
+ --color-warning-contrast-300: var(--color-warning-contrast-dark);
+ --color-warning-contrast-400: var(--color-warning-contrast-dark);
+ --color-warning-contrast-500: var(--color-warning-contrast-dark);
+ --color-warning-contrast-600: var(--color-warning-contrast-dark);
+ --color-warning-contrast-700: var(--color-warning-contrast-light);
+ --color-warning-contrast-800: var(--color-warning-contrast-light);
+ --color-warning-contrast-900: var(--color-warning-contrast-light);
+ --color-warning-contrast-950: var(--color-warning-contrast-light);
+
+ /* ===================================================================
+ * ERROR — Soft Coral/Rose
+ * Consistent with AE_Firefly for recognizable semantic meaning.
+ * =================================================================== */
+ --color-error-50: oklch(95.0% 0.040 18deg);
+ --color-error-100: oklch(88.0% 0.070 20deg);
+ --color-error-200: oklch(80.0% 0.105 21deg);
+ --color-error-300: oklch(72.0% 0.140 22deg);
+ --color-error-400: oklch(64.5% 0.170 23deg);
+ --color-error-500: oklch(57.5% 0.195 24deg);
+ --color-error-600: oklch(51.5% 0.182 25deg);
+ --color-error-700: oklch(45.5% 0.165 26deg);
+ --color-error-800: oklch(39.5% 0.148 27deg);
+ --color-error-900: oklch(33.0% 0.128 28deg);
+ --color-error-950: oklch(26.5% 0.108 29deg);
+ --color-error-contrast-dark: var(--color-error-950);
+ --color-error-contrast-light: var(--color-error-50);
+ --color-error-contrast-50: var(--color-error-contrast-dark);
+ --color-error-contrast-100: var(--color-error-contrast-dark);
+ --color-error-contrast-200: var(--color-error-contrast-dark);
+ --color-error-contrast-300: var(--color-error-contrast-dark);
+ --color-error-contrast-400: var(--color-error-contrast-light);
+ --color-error-contrast-500: var(--color-error-contrast-light);
+ --color-error-contrast-600: var(--color-error-contrast-light);
+ --color-error-contrast-700: var(--color-error-contrast-light);
+ --color-error-contrast-800: var(--color-error-contrast-light);
+ --color-error-contrast-900: var(--color-error-contrast-light);
+ --color-error-contrast-950: var(--color-error-contrast-light);
+
+ /* ===================================================================
+ * SURFACE — Sunrise Cream
+ * A barely-warm neutral (hue ~70°, chroma 0.004-0.022) that lets
+ * the vibrant brand colors breathe. The warmth prevents the surface
+ * from feeling clinical when the vivid accents are in use.
+ *
+ * 50 → body-bg light: warm near-white, like morning paper
+ * 950 → body-bg dark: deep warm charcoal, like a dim theatre
+ * =================================================================== */
+ --color-surface-50: oklch(99.2% 0.004 75deg);
+ --color-surface-100: oklch(97.0% 0.007 72deg);
+ --color-surface-200: oklch(93.5% 0.010 70deg);
+ --color-surface-300: oklch(88.5% 0.013 68deg);
+ --color-surface-400: oklch(81.5% 0.016 66deg);
+ --color-surface-500: oklch(70.5% 0.018 64deg);
+ --color-surface-600: oklch(59.0% 0.018 62deg);
+ --color-surface-700: oklch(47.5% 0.018 58deg);
+ --color-surface-800: oklch(35.5% 0.020 55deg);
+ --color-surface-900: oklch(24.5% 0.020 52deg);
+ --color-surface-950: oklch(15.5% 0.022 48deg);
+ --color-surface-contrast-dark: var(--color-surface-950);
+ --color-surface-contrast-light: var(--color-surface-50);
+ --color-surface-contrast-50: var(--color-surface-contrast-dark);
+ --color-surface-contrast-100: var(--color-surface-contrast-dark);
+ --color-surface-contrast-200: var(--color-surface-contrast-dark);
+ --color-surface-contrast-300: var(--color-surface-contrast-dark);
+ --color-surface-contrast-400: var(--color-surface-contrast-dark);
+ --color-surface-contrast-500: var(--color-surface-contrast-dark);
+ --color-surface-contrast-600: var(--color-surface-contrast-light);
+ --color-surface-contrast-700: var(--color-surface-contrast-light);
+ --color-surface-contrast-800: var(--color-surface-contrast-light);
+ --color-surface-contrast-900: var(--color-surface-contrast-light);
+ --color-surface-contrast-950: var(--color-surface-contrast-light);
+}
diff --git a/src/ae-firefly-steelblue.css b/src/ae-firefly-steelblue.css
new file mode 100644
index 00000000..fc1b8b1d
--- /dev/null
+++ b/src/ae-firefly-steelblue.css
@@ -0,0 +1,283 @@
+/*
+ * AE Firefly — SteelBlue variant
+ * "Polished metal, like light on still water."
+ * Aether Platform / One Sky IT, LLC — Design System Theme
+ *
+ * Aesthetic vision (Scott Idem, 2026-03-09):
+ * A metallic, professional cool-blue variant of the Firefly system.
+ * Inspired by polished steel and chrome — the reflective shimmer of
+ * cool metal under crisp light. Calm authority, not cold distance.
+ *
+ * Color philosophy:
+ * Primary — Steel Blue: polished metallic blue (~214°), cool and precise
+ * Secondary — Burnished Gold: warm metallic contrast (~52°), brass/copper
+ * Tertiary — Cobalt Navy: deeper blue for depth and dimension (~229°)
+ * Surface — Chrome Silver: barely-cool neutral with a subtle blue cast
+ * (light mode: bright chrome) → (dark mode: gunmetal slate)
+ *
+ * Section 508 / WCAG 2.1 AA:
+ * - Body text (surface-950 on surface-50 light): >15:1 contrast ✓
+ * - Primary-filled buttons meet ≥3:1 for interactive components ✓
+ * - Contrast crossover points calculated per OKLCH approximate RL
+ *
+ * Based on: Skeleton v4 theme CSS variable structure
+ * Variant of: src/ae-firefly.css (AE_Firefly)
+ */
+
+[data-theme='AE_Firefly_SteelBlue'] {
+ --text-scaling: 1.067;
+ --base-font-color: var(--color-surface-950);
+ --base-font-color-dark: var(--color-surface-50);
+ --base-font-family: system-ui, sans-serif;
+ --base-font-size: inherit;
+ --base-line-height: inherit;
+ --base-font-weight: normal;
+ --base-font-style: normal;
+ --base-letter-spacing: 0em;
+ --heading-font-color: inherit;
+ --heading-font-color-dark: inherit;
+ --heading-font-family: inherit;
+ --heading-font-weight: bold;
+ --heading-font-style: normal;
+ --heading-letter-spacing: inherit;
+
+ /* Anchors: steel blue in light, lighter steel blue in dark */
+ --anchor-font-color: var(--color-primary-600);
+ --anchor-font-color-dark: var(--color-primary-300);
+ --anchor-font-family: inherit;
+ --anchor-font-size: inherit;
+ --anchor-line-height: inherit;
+ --anchor-font-weight: inherit;
+ --anchor-font-style: inherit;
+ --anchor-letter-spacing: inherit;
+ --anchor-text-decoration: none;
+ --anchor-text-decoration-hover: underline;
+ --anchor-text-decoration-active: none;
+ --anchor-text-decoration-focus: none;
+
+ --spacing: 0.25rem;
+ --radius-base: 0.375rem;
+ --radius-container: 0.875rem;
+ --default-border-width: 1px;
+ --default-divide-width: 1px;
+ --default-ring-width: 1px;
+
+ --body-background-color: var(--color-surface-50);
+ --body-background-color-dark: var(--color-surface-950);
+
+ /* ===================================================================
+ * PRIMARY — Polished Steel Blue
+ * Hue: ~214°. Cool metallic blue — the shine of polished steel
+ * under directional light. Professional, precise, and distinctive.
+ * Approx: #4682B4 (CSS SteelBlue) sits at oklch(56%, 0.113, 214°).
+ * At 500 (L≈56%): sufficient contrast with primary-50 text (≥4:1).
+ * =================================================================== */
+ --color-primary-50: oklch(96.5% 0.022 214deg);
+ --color-primary-100: oklch(91.0% 0.045 213deg);
+ --color-primary-200: oklch(84.5% 0.072 212deg);
+ --color-primary-300: oklch(76.5% 0.097 212deg);
+ --color-primary-400: oklch(67.0% 0.115 213deg);
+ --color-primary-500: oklch(56.0% 0.115 214deg);
+ --color-primary-600: oklch(49.0% 0.112 214deg);
+ --color-primary-700: oklch(41.5% 0.105 213deg);
+ --color-primary-800: oklch(34.0% 0.095 212deg);
+ --color-primary-900: oklch(26.5% 0.080 211deg);
+ --color-primary-950: oklch(18.5% 0.065 210deg);
+ --color-primary-contrast-dark: var(--color-primary-950);
+ --color-primary-contrast-light: var(--color-primary-50);
+ --color-primary-contrast-50: var(--color-primary-contrast-dark);
+ --color-primary-contrast-100: var(--color-primary-contrast-dark);
+ --color-primary-contrast-200: var(--color-primary-contrast-dark);
+ --color-primary-contrast-300: var(--color-primary-contrast-dark);
+ --color-primary-contrast-400: var(--color-primary-contrast-dark);
+ --color-primary-contrast-500: var(--color-primary-contrast-light);
+ --color-primary-contrast-600: var(--color-primary-contrast-light);
+ --color-primary-contrast-700: var(--color-primary-contrast-light);
+ --color-primary-contrast-800: var(--color-primary-contrast-light);
+ --color-primary-contrast-900: var(--color-primary-contrast-light);
+ --color-primary-contrast-950: var(--color-primary-contrast-light);
+
+ /* ===================================================================
+ * SECONDARY — Burnished Gold (warm metallic contrast)
+ * Hue: ~52°. Warm brass/copper tones that complement the coolness
+ * of steel blue. The classic "metal on metal" contrast pairing —
+ * used for secondary actions, badges, and call-to-action highlights.
+ * =================================================================== */
+ --color-secondary-50: oklch(97.5% 0.055 56deg);
+ --color-secondary-100: oklch(93.5% 0.090 55deg);
+ --color-secondary-200: oklch(89.5% 0.120 54deg);
+ --color-secondary-300: oklch(85.5% 0.148 53deg);
+ --color-secondary-400: oklch(81.5% 0.162 52deg);
+ --color-secondary-500: oklch(76.5% 0.162 51deg);
+ --color-secondary-600: oklch(68.5% 0.152 50deg);
+ --color-secondary-700: oklch(60.5% 0.138 49deg);
+ --color-secondary-800: oklch(52.0% 0.122 48deg);
+ --color-secondary-900: oklch(43.5% 0.102 47deg);
+ --color-secondary-950: oklch(35.0% 0.084 46deg);
+ --color-secondary-contrast-dark: var(--color-secondary-950);
+ --color-secondary-contrast-light: var(--color-secondary-50);
+ --color-secondary-contrast-50: var(--color-secondary-contrast-dark);
+ --color-secondary-contrast-100: var(--color-secondary-contrast-dark);
+ --color-secondary-contrast-200: var(--color-secondary-contrast-dark);
+ --color-secondary-contrast-300: var(--color-secondary-contrast-dark);
+ --color-secondary-contrast-400: var(--color-secondary-contrast-dark);
+ --color-secondary-contrast-500: var(--color-secondary-contrast-dark);
+ --color-secondary-contrast-600: var(--color-secondary-contrast-light);
+ --color-secondary-contrast-700: var(--color-secondary-contrast-light);
+ --color-secondary-contrast-800: var(--color-secondary-contrast-light);
+ --color-secondary-contrast-900: var(--color-secondary-contrast-light);
+ --color-secondary-contrast-950: var(--color-secondary-contrast-light);
+
+ /* ===================================================================
+ * TERTIARY — Cobalt Navy
+ * Hue: ~229°. A deeper, richer blue for depth and dimension —
+ * like the heavy cobalt-blue depths under polished chrome.
+ * Used for accents, location chips, and depth elements.
+ * =================================================================== */
+ --color-tertiary-50: oklch(95.5% 0.025 232deg);
+ --color-tertiary-100: oklch(89.5% 0.048 231deg);
+ --color-tertiary-200: oklch(82.5% 0.072 230deg);
+ --color-tertiary-300: oklch(74.5% 0.095 229deg);
+ --color-tertiary-400: oklch(65.5% 0.120 229deg);
+ --color-tertiary-500: oklch(54.5% 0.135 230deg);
+ --color-tertiary-600: oklch(47.0% 0.132 230deg);
+ --color-tertiary-700: oklch(39.5% 0.122 229deg);
+ --color-tertiary-800: oklch(32.0% 0.108 228deg);
+ --color-tertiary-900: oklch(25.0% 0.090 227deg);
+ --color-tertiary-950: oklch(17.5% 0.072 226deg);
+ --color-tertiary-contrast-dark: var(--color-tertiary-950);
+ --color-tertiary-contrast-light: var(--color-tertiary-50);
+ --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark);
+ --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark);
+ --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark);
+ --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark);
+ --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark);
+ --color-tertiary-contrast-500: var(--color-tertiary-contrast-light);
+ --color-tertiary-contrast-600: var(--color-tertiary-contrast-light);
+ --color-tertiary-contrast-700: var(--color-tertiary-contrast-light);
+ --color-tertiary-contrast-800: var(--color-tertiary-contrast-light);
+ --color-tertiary-contrast-900: var(--color-tertiary-contrast-light);
+ --color-tertiary-contrast-950: var(--color-tertiary-contrast-light);
+
+ /* ===================================================================
+ * SUCCESS — Bioluminescent Green
+ * Hue: ~152°. Consistent with AE_Firefly for recognizable semantic
+ * color meaning across OSIT themes.
+ * =================================================================== */
+ --color-success-50: oklch(95.77% 0.05 152.69deg);
+ --color-success-100: oklch(91.59% 0.06 152.00deg);
+ --color-success-200: oklch(87.45% 0.08 152.08deg);
+ --color-success-300: oklch(83.57% 0.09 150.85deg);
+ --color-success-400: oklch(79.47% 0.11 150.71deg);
+ --color-success-500: oklch(75.38% 0.12 149.99deg);
+ --color-success-600: oklch(67.65% 0.11 149.94deg);
+ --color-success-700: oklch(59.71% 0.09 150.42deg);
+ --color-success-800: oklch(51.74% 0.08 150.24deg);
+ --color-success-900: oklch(43.20% 0.06 151.12deg);
+ --color-success-950: oklch(34.20% 0.04 151.44deg);
+ --color-success-contrast-dark: var(--color-success-950);
+ --color-success-contrast-light: var(--color-success-50);
+ --color-success-contrast-50: var(--color-success-contrast-dark);
+ --color-success-contrast-100: var(--color-success-contrast-dark);
+ --color-success-contrast-200: var(--color-success-contrast-dark);
+ --color-success-contrast-300: var(--color-success-contrast-dark);
+ --color-success-contrast-400: var(--color-success-contrast-dark);
+ --color-success-contrast-500: var(--color-success-contrast-dark);
+ --color-success-contrast-600: var(--color-success-contrast-dark);
+ --color-success-contrast-700: var(--color-success-contrast-light);
+ --color-success-contrast-800: var(--color-success-contrast-light);
+ --color-success-contrast-900: var(--color-success-contrast-light);
+ --color-success-contrast-950: var(--color-success-contrast-light);
+
+ /* ===================================================================
+ * WARNING — Amber Orange
+ * Consistent with AE_Firefly for recognizable semantic meaning.
+ * =================================================================== */
+ --color-warning-50: oklch(97.5% 0.065 78deg);
+ --color-warning-100: oklch(93.5% 0.090 75deg);
+ --color-warning-200: oklch(89.5% 0.120 73deg);
+ --color-warning-300: oklch(85.5% 0.145 70deg);
+ --color-warning-400: oklch(81.5% 0.160 67deg);
+ --color-warning-500: oklch(77.0% 0.165 65deg);
+ --color-warning-600: oklch(69.5% 0.155 64deg);
+ --color-warning-700: oklch(61.5% 0.140 63deg);
+ --color-warning-800: oklch(53.5% 0.125 62deg);
+ --color-warning-900: oklch(45.0% 0.105 61deg);
+ --color-warning-950: oklch(37.0% 0.088 60deg);
+ --color-warning-contrast-dark: var(--color-warning-950);
+ --color-warning-contrast-light: var(--color-warning-50);
+ --color-warning-contrast-50: var(--color-warning-contrast-dark);
+ --color-warning-contrast-100: var(--color-warning-contrast-dark);
+ --color-warning-contrast-200: var(--color-warning-contrast-dark);
+ --color-warning-contrast-300: var(--color-warning-contrast-dark);
+ --color-warning-contrast-400: var(--color-warning-contrast-dark);
+ --color-warning-contrast-500: var(--color-warning-contrast-dark);
+ --color-warning-contrast-600: var(--color-warning-contrast-dark);
+ --color-warning-contrast-700: var(--color-warning-contrast-light);
+ --color-warning-contrast-800: var(--color-warning-contrast-light);
+ --color-warning-contrast-900: var(--color-warning-contrast-light);
+ --color-warning-contrast-950: var(--color-warning-contrast-light);
+
+ /* ===================================================================
+ * ERROR — Soft Coral/Rose
+ * Consistent with AE_Firefly for recognizable semantic meaning.
+ * =================================================================== */
+ --color-error-50: oklch(95.0% 0.040 18deg);
+ --color-error-100: oklch(88.0% 0.070 20deg);
+ --color-error-200: oklch(80.0% 0.105 21deg);
+ --color-error-300: oklch(72.0% 0.140 22deg);
+ --color-error-400: oklch(64.5% 0.170 23deg);
+ --color-error-500: oklch(57.5% 0.195 24deg);
+ --color-error-600: oklch(51.5% 0.182 25deg);
+ --color-error-700: oklch(45.5% 0.165 26deg);
+ --color-error-800: oklch(39.5% 0.148 27deg);
+ --color-error-900: oklch(33.0% 0.128 28deg);
+ --color-error-950: oklch(26.5% 0.108 29deg);
+ --color-error-contrast-dark: var(--color-error-950);
+ --color-error-contrast-light: var(--color-error-50);
+ --color-error-contrast-50: var(--color-error-contrast-dark);
+ --color-error-contrast-100: var(--color-error-contrast-dark);
+ --color-error-contrast-200: var(--color-error-contrast-dark);
+ --color-error-contrast-300: var(--color-error-contrast-dark);
+ --color-error-contrast-400: var(--color-error-contrast-light);
+ --color-error-contrast-500: var(--color-error-contrast-light);
+ --color-error-contrast-600: var(--color-error-contrast-light);
+ --color-error-contrast-700: var(--color-error-contrast-light);
+ --color-error-contrast-800: var(--color-error-contrast-light);
+ --color-error-contrast-900: var(--color-error-contrast-light);
+ --color-error-contrast-950: var(--color-error-contrast-light);
+
+ /* ===================================================================
+ * SURFACE — Chrome Silver
+ * A cool-blue-tinted neutral with slightly more chromatic presence
+ * than AE_Firefly's Moonlit Slate — leaning further toward the
+ * steel palette. Light mode: bright chrome. Dark mode: gunmetal.
+ *
+ * 50 → body-bg light: brilliant near-white with a chrome whisper
+ * 950 → body-bg dark: deep gunmetal with subtle cool-blue depth
+ * =================================================================== */
+ --color-surface-50: oklch(99.0% 0.004 220deg);
+ --color-surface-100: oklch(96.5% 0.008 218deg);
+ --color-surface-200: oklch(92.5% 0.012 217deg);
+ --color-surface-300: oklch(87.0% 0.016 216deg);
+ --color-surface-400: oklch(78.5% 0.020 215deg);
+ --color-surface-500: oklch(66.5% 0.022 217deg);
+ --color-surface-600: oklch(54.5% 0.025 220deg);
+ --color-surface-700: oklch(42.5% 0.028 223deg);
+ --color-surface-800: oklch(31.0% 0.032 226deg);
+ --color-surface-900: oklch(20.5% 0.035 228deg);
+ --color-surface-950: oklch(13.0% 0.040 232deg);
+ --color-surface-contrast-dark: var(--color-surface-950);
+ --color-surface-contrast-light: var(--color-surface-50);
+ --color-surface-contrast-50: var(--color-surface-contrast-dark);
+ --color-surface-contrast-100: var(--color-surface-contrast-dark);
+ --color-surface-contrast-200: var(--color-surface-contrast-dark);
+ --color-surface-contrast-300: var(--color-surface-contrast-dark);
+ --color-surface-contrast-400: var(--color-surface-contrast-dark);
+ --color-surface-contrast-500: var(--color-surface-contrast-dark);
+ --color-surface-contrast-600: var(--color-surface-contrast-light);
+ --color-surface-contrast-700: var(--color-surface-contrast-light);
+ --color-surface-contrast-800: var(--color-surface-contrast-light);
+ --color-surface-contrast-900: var(--color-surface-contrast-light);
+ --color-surface-contrast-950: var(--color-surface-contrast-light);
+}
diff --git a/src/app.css b/src/app.css
index 3ef06673..fdccf679 100644
--- a/src/app.css
+++ b/src/app.css
@@ -28,6 +28,9 @@
@import './ae-c-lci.css';
@import './ae-c-idaa-light.css';
@import './ae-firefly.css';
+@import './ae-firefly-steelblue.css';
+@import './ae-firefly-indigo.css';
+@import './ae-firefly-rainbow.css';
@source '../node_modules/@skeletonlabs/skeleton-svelte/dist';
diff --git a/src/lib/app_components/e_app_theme.svelte b/src/lib/app_components/e_app_theme.svelte
index 8b51de41..556a3c71 100644
--- a/src/lib/app_components/e_app_theme.svelte
+++ b/src/lib/app_components/e_app_theme.svelte
@@ -101,6 +101,10 @@ if ($ae_loc.app_cfg.theme_mode == 'light') {
+
+
+
+
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 2583da71..d4fb9bfb 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -234,6 +234,23 @@
if (iframe === 'true') $ae_loc.iframe = true;
else if (iframe === 'false') $ae_loc.iframe = false;
+ // Theme URL params — ?theme=AE_Firefly_SteelBlue&theme_mode=dark
+ // Applied once on load, then silently removed from the URL (no history entry).
+ const url_theme = data.url.searchParams.get('theme');
+ const url_theme_mode = data.url.searchParams.get('theme_mode');
+ if (url_theme || url_theme_mode) {
+ if (url_theme) $ae_loc.theme_name = url_theme;
+ if (url_theme_mode === 'light' || url_theme_mode === 'dark') $ae_loc.theme_mode = url_theme_mode;
+ const clean_url = new URL(data.url.href);
+ clean_url.searchParams.delete('theme');
+ clean_url.searchParams.delete('theme_mode');
+ goto(clean_url.pathname + clean_url.search + clean_url.hash, {
+ replaceState: true,
+ noScroll: true,
+ keepFocus: true
+ });
+ }
+
// Electron Detection
if ((window as any).native_app || (window as any).aetherNative) {
if (!$ae_loc.is_native) $ae_loc.is_native = true;