diff --git a/src/ae-firefly.css b/src/ae-firefly.css new file mode 100644 index 00000000..a06663d7 --- /dev/null +++ b/src/ae-firefly.css @@ -0,0 +1,284 @@ +/* + * AE Firefly — "Shiny serenity, like a firefly." + * Aether Platform / One Sky IT, LLC — Design System Theme + * + * Aesthetic vision (Scott Idem, 2026-03-06): + * Calm, focused, softly luminous. A modern Section 508–compliant + * theme for One Sky IT, LLC. Inspired by bioluminescence — + * the brief, cool glow of a firefly against a deep, serene night. + * + * Color philosophy: + * Primary — Luminescent Teal: cool bioluminescent shimmer + * Secondary — Warm Amber-Gold: the firefly's warm body glow + * Tertiary — Night-Sky Indigo: depth and serenity of the dark + * Surface — Moonlit Slate: barely-cool neutral; crisp white + * (light mode) → deep midnight blue-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 + * Reference: src/ae-osit-default.css, Nouveau preset + */ + +[data-theme='AE_Firefly'] { + --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: teal in light, lighter teal 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; /* slightly more rounded than default for modern feel */ + --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 — Luminescent Firefly Teal + * Hue: ~184°. Reads as "living" cool teal — the shimmer of + * bioluminescence on still water. Professional and distinctive. + * At 500 (L≈50%): sufficient contrast with primary-50 text (≥4:1). + * =================================================================== */ + --color-primary-50: oklch(96.5% 0.025 192deg); + --color-primary-100: oklch(91.0% 0.050 190deg); + --color-primary-200: oklch(84.5% 0.078 188deg); + --color-primary-300: oklch(76.5% 0.105 186deg); + --color-primary-400: oklch(67.5% 0.125 185deg); + --color-primary-500: oklch(50.5% 0.130 184deg); + --color-primary-600: oklch(44.0% 0.125 183deg); + --color-primary-700: oklch(37.5% 0.115 182deg); + --color-primary-800: oklch(30.5% 0.105 181deg); + --color-primary-900: oklch(23.5% 0.090 180deg); + --color-primary-950: oklch(16.0% 0.075 179deg); + --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 — Warm Amber-Gold (firefly body glow) + * Hue: ~90°. The warm, soft luminescence of the firefly itself — + * complements the cool teal primary. Used for secondary actions, + * badges, and highlights. + * =================================================================== */ + --color-secondary-50: oklch(97.5% 0.060 102deg); + --color-secondary-100: oklch(93.5% 0.095 100deg); + --color-secondary-200: oklch(89.5% 0.128 98deg); + --color-secondary-300: oklch(85.5% 0.155 95deg); + --color-secondary-400: oklch(81.0% 0.170 93deg); + --color-secondary-500: oklch(76.0% 0.170 90deg); + --color-secondary-600: oklch(68.5% 0.160 87deg); + --color-secondary-700: oklch(60.5% 0.145 85deg); + --color-secondary-800: oklch(52.0% 0.130 83deg); + --color-secondary-900: oklch(43.5% 0.110 81deg); + --color-secondary-950: oklch(35.0% 0.090 79deg); + --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 — Night-Sky Indigo + * Hue: ~277°. The deep violet of a clear night — creates depth + * and calm serenity. Used for accents, tags, and tertiary elements. + * =================================================================== */ + --color-tertiary-50: oklch(95.5% 0.042 283deg); + --color-tertiary-100: oklch(89.0% 0.068 281deg); + --color-tertiary-200: oklch(81.5% 0.092 279deg); + --color-tertiary-300: oklch(73.5% 0.112 278deg); + --color-tertiary-400: oklch(65.0% 0.132 277deg); + --color-tertiary-500: oklch(55.5% 0.142 276deg); + --color-tertiary-600: oklch(48.5% 0.138 275deg); + --color-tertiary-700: oklch(41.5% 0.128 274deg); + --color-tertiary-800: oklch(34.5% 0.112 273deg); + --color-tertiary-900: oklch(27.5% 0.098 272deg); + --color-tertiary-950: oklch(20.0% 0.082 271deg); + --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°. Clean, readable success state. Consistent with + * other OSIT themes for recognizable semantic color meaning. + * =================================================================== */ + --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 + * Hue: ~65°. Warm amber — shares family with secondary gold but + * distinctly "caution" readable. Consistent OSIT semantic palette. + * =================================================================== */ + --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 + * Hue: ~22°. Clear error indication without being harsh. Consistent + * cross-theme 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 — Moonlit Serenity + * Barely-cool neutral (hue 215-232°, chroma 0.003-0.030). + * This is the "shiny serenity" — the surfaces feel like clean + * moonlit paper in light mode and a calm midnight sky in dark mode. + * The chroma is intentionally extremely low; it reads as neutral grey + * but with an imperceptible cool quality that lifts the whole palette. + * + * 50 → body-bg light: nearly pure white, faintest cool whisper + * 950 → body-bg dark: deep midnight slate with subtle cool depth + * =================================================================== */ + --color-surface-50: oklch(99.2% 0.003 220deg); + --color-surface-100: oklch(97.0% 0.006 217deg); + --color-surface-200: oklch(93.5% 0.009 215deg); + --color-surface-300: oklch(88.5% 0.012 213deg); + --color-surface-400: oklch(81.5% 0.015 212deg); + --color-surface-500: oklch(70.5% 0.016 215deg); + --color-surface-600: oklch(59.0% 0.018 218deg); + --color-surface-700: oklch(47.5% 0.020 222deg); + --color-surface-800: oklch(35.5% 0.022 226deg); + --color-surface-900: oklch(24.5% 0.025 229deg); + --color-surface-950: oklch(15.5% 0.028 233deg); + --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 52d6132b..24445e4e 100644 --- a/src/app.css +++ b/src/app.css @@ -27,6 +27,7 @@ @import './ae-osit-default.css'; @import './ae-c-lci.css'; @import './ae-c-idaa-light.css'; +@import './ae-firefly.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 f6054d48..8b51de41 100644 --- a/src/lib/app_components/e_app_theme.svelte +++ b/src/lib/app_components/e_app_theme.svelte @@ -100,6 +100,7 @@ if ($ae_loc.app_cfg.theme_mode == 'light') { + diff --git a/src/lib/stores/ae_stores.ts b/src/lib/stores/ae_stores.ts index 989df159..d76a5888 100644 --- a/src/lib/stores/ae_stores.ts +++ b/src/lib/stores/ae_stores.ts @@ -76,7 +76,7 @@ const ae_app_local_data_defaults: key_val = { theme: 'light', theme_mode: 'light', - theme_name: 'nouveau', // wintry + theme_name: 'AE_Firefly', // "Shiny serenity, like a firefly." — OSIT default 2026 iframe: false, // disable_sys_header: false,