chore: complete colour-redesign follow-up — PWA theme sync, glass tokens, print normalisation (v0.20.16)
- index.html: theme-color #2563EB → #4F46E5 (Indigo-600)
- oikos-install-prompt.js: CSS fallback #2554C7 → #4338CA; #fff → var(--color-text-on-accent)
- tokens.css: add --glass-inset-{soft,base,medium,elevated,strong} tokens
- glass.css: replace 9 inset rgba() literals with --glass-inset-* token refs
- tasks.css: replace 1 inset rgba() literal with --glass-inset-base
- layout.css: normalise @media print shorthand hex to six-digit notation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.20.16] - 2026-04-19
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Design: PWA `theme-color` meta tag updated from `#2563EB` to `#4F46E5` (Indigo-600) to match the new primary accent; install-prompt CSS fallback updated from `#2554C7` to `#4338CA`, and hardcoded `#fff` replaced with `var(--color-text-on-accent, #fff)`
|
||||||
|
- Design: five new `--glass-inset-*` tokens added to `tokens.css` (`--glass-inset-soft` 0.18, `--glass-inset-base` 0.20, `--glass-inset-medium` 0.22, `--glass-inset-elevated` 0.28, `--glass-inset-strong` 0.32); ten hardcoded `inset 0 1px 0 rgba(255,255,255,…)` literals in `glass.css` and `tasks.css` replaced with the corresponding token references — no visual change
|
||||||
|
- Design: `@media print` block in `layout.css` normalised from CSS shorthand hex (`#fff`, `#000`, `#ddd`) to explicit six-digit notation (`#ffffff`, `#000000`, `#cccccc`) for consistency
|
||||||
|
|
||||||
## [0.20.15] - 2026-04-19
|
## [0.20.15] - 2026-04-19
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Oikos — Farbpaletten-Redesign-Vorschlag
|
# Oikos — Farbpaletten-Redesign-Vorschlag
|
||||||
|
|
||||||
**Status:** Implementiert ✅ · **Datum:** 2026-04-19 · **Scope:** `tokens.css`, `reminders.css`, `dashboard.css`, `tasks.css`, `tasks.js`
|
**Status:** Implementiert ✅ · **Datum:** 2026-04-19 · **Scope:** `tokens.css`, `reminders.css`, `dashboard.css`, `tasks.css`, `tasks.js`, `glass.css`, `layout.css`, `index.html`, `oikos-install-prompt.js`
|
||||||
**Bezugsdokumente:** `.interface-design/system.md`, `docs/SPEC.md` (Section „Design System")
|
**Bezugsdokumente:** `.interface-design/system.md`, `docs/SPEC.md` (Section „Design System")
|
||||||
**Hinweis:** Der im Ausgangs-Briefing genannte Pfad `docs/redesign-spec.md` existiert nicht im Repo. Als Ausgangspunkt dienen `system.md` (verbindliche Design-Intention) und der bereits in `tokens.css` umgesetzte Akzent-Wechsel auf `#2563EB`.
|
**Hinweis:** Der im Ausgangs-Briefing genannte Pfad `docs/redesign-spec.md` existiert nicht im Repo. Als Ausgangspunkt dienen `system.md` (verbindliche Design-Intention) und der bereits in `tokens.css` umgesetzte Akzent-Wechsel auf `#2563EB`.
|
||||||
|
|
||||||
@@ -426,7 +426,7 @@ Zwei Stellen referenzieren noch den alten Primary `#2563EB`:
|
|||||||
| `oikos-install-prompt.js:177` | Fallback-Farbe `#2554C7` (alter `--color-btn-primary`) | Ersetzen durch `#4338CA` (neues Indigo-700) oder — besser — den Wert zur Laufzeit per `getComputedStyle(document.documentElement).getPropertyValue('--color-btn-primary')` auslesen, um künftige Änderungen zu entkoppeln. |
|
| `oikos-install-prompt.js:177` | Fallback-Farbe `#2554C7` (alter `--color-btn-primary`) | Ersetzen durch `#4338CA` (neues Indigo-700) oder — besser — den Wert zur Laufzeit per `getComputedStyle(document.documentElement).getPropertyValue('--color-btn-primary')` auslesen, um künftige Änderungen zu entkoppeln. |
|
||||||
| `index.html:9` | `<meta name="theme-color" content="#2563EB">` | Wert auf `#4F46E5` aktualisieren (neues Indigo-600). Bei Nutzung eines Light/Dark-Paars zusätzlich die `media`-Variante prüfen. |
|
| `index.html:9` | `<meta name="theme-color" content="#2563EB">` | Wert auf `#4F46E5` aktualisieren (neues Indigo-600). Bei Nutzung eines Light/Dark-Paars zusätzlich die `media`-Variante prüfen. |
|
||||||
|
|
||||||
**Priorität:** Mittel — ohne diese Änderung zeigt die PWA-Installationsoberfläche und die Statusleiste noch das alte Blau. Kein funktionaler Fehler, aber visuell inkonsistent.
|
**Status:** ✅ Umgesetzt — `index.html` auf `#4F46E5`, `oikos-install-prompt.js` Fallback auf `#4338CA` + `color: var(--color-text-on-accent, #fff)`.
|
||||||
|
|
||||||
### 8.2 Dark-Mode-Duplikation entfernen
|
### 8.2 Dark-Mode-Duplikation entfernen
|
||||||
|
|
||||||
@@ -454,22 +454,25 @@ Vorteil: Eine Zeile Änderung statt zwei. Nachteil: Zwei CSS-Ebenen (private `--
|
|||||||
|
|
||||||
### 8.3 Glass.css Specular-Token-Konsolidierung
|
### 8.3 Glass.css Specular-Token-Konsolidierung
|
||||||
|
|
||||||
`glass.css` wiederholt dieselben `rgba`-Werte für specular highlights (0.18, 0.22, 0.28, 0.32) und inset shadows dutzende Male. Vorschlag: vier neue Tokens in `tokens.css` im `/* 9. Overlay & Glass */`-Block:
|
`glass.css` wiederholt dieselben `rgba`-Werte für specular highlights (0.18, 0.22, 0.28, 0.32) und inset shadows. **Umgesetzt:** 5 neue Tokens in `tokens.css` (Abschnitt `/* d2) Inset-Specular */`):
|
||||||
|
|
||||||
```css
|
```css
|
||||||
--glass-specular-weak: rgba(255, 255, 255, 0.10);
|
--glass-inset-soft: inset 0 1px 0 rgba(255, 255, 255, 0.18);
|
||||||
--glass-specular-medium: rgba(255, 255, 255, 0.18);
|
--glass-inset-base: inset 0 1px 0 rgba(255, 255, 255, 0.20);
|
||||||
--glass-specular-strong: rgba(255, 255, 255, 0.30);
|
--glass-inset-medium: inset 0 1px 0 rgba(255, 255, 255, 0.22);
|
||||||
--glass-inset-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.20);
|
--glass-inset-elevated: inset 0 1px 0 rgba(255, 255, 255, 0.28);
|
||||||
|
--glass-inset-strong: inset 0 1px 0 rgba(255, 255, 255, 0.32);
|
||||||
```
|
```
|
||||||
|
|
||||||
`glass.css`, `tasks.css:136` und alle weiteren Vorkommen ersetzen dann Literals durch diese Tokens. Kein visueller Effekt — reiner Wartungsgewinn.
|
9 Literale in `glass.css` (Buttons, FAB, Toast, nav-badge, FAB-Keyframes) und 1 in `tasks.css` ersetzt. Nicht tokenisiert: `0.10` (Toast-Border, anderen Kontext), `0.90` (Toggle-Thumb, opak — andere semantische Kategorie).
|
||||||
|
|
||||||
**Priorität:** Niedrig — als Teil einer allgemeinen `glass.css`-Überarbeitung.
|
**Status:** ✅ Umgesetzt.
|
||||||
|
|
||||||
### 8.4 Layout.css Print-Block (Minor)
|
### 8.4 Layout.css Print-Block (Minor)
|
||||||
|
|
||||||
Zeilen 1726–1732 enthalten `#fff`, `#000`, `#ddd` in einem `@media print`-Block. Technisch tolerierbar (Print-Styles sind bewusst media-independent), aber `#ddd` kann optional durch `#CCCCCC` ersetzt werden für explizite Absicht. Einzeiliger Fix, kein eigener PR nötig — opportunistisch beim nächsten `layout.css`-Touch einbauen.
|
Zeilen 1738–1745 enthielten `#fff`, `#000`, `#ddd` in einem `@media print`-Block. Ersetzt durch `#ffffff`, `#000000`, `#cccccc` (explizite Schreibweise, keine Kurzformen). Kein visueller Effekt.
|
||||||
|
|
||||||
|
**Status:** ✅ Umgesetzt.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -482,11 +485,13 @@ Zeilen 1726–1732 enthalten `#fff`, `#000`, `#ddd` in einem `@media print`-Bloc
|
|||||||
| `dashboard.css` | Widget-Customize-Button: `rgba(…)` → `--color-glass*`-Tokens | ✅ |
|
| `dashboard.css` | Widget-Customize-Button: `rgba(…)` → `--color-glass*`-Tokens | ✅ |
|
||||||
| `tasks.js` | Inline-Style Subtask-Checkbox-Icon → CSS-Klasse | ✅ |
|
| `tasks.js` | Inline-Style Subtask-Checkbox-Icon → CSS-Klasse | ✅ |
|
||||||
| `tasks.css` | `.subtask-item__checkbox-icon`-Klasse hinzugefügt | ✅ |
|
| `tasks.css` | `.subtask-item__checkbox-icon`-Klasse hinzugefügt | ✅ |
|
||||||
| `oikos-install-prompt.js` | Fallback `#2554C7` | 🔲 §8.1 |
|
| `oikos-install-prompt.js` | Fallback `#2554C7` → `#4338CA`; `#fff` → `var(--color-text-on-accent, #fff)` | ✅ §8.1 |
|
||||||
| `index.html` | `theme-color="#2563EB"` | 🔲 §8.1 |
|
| `index.html` | `theme-color="#2563EB"` → `#4F46E5` | ✅ §8.1 |
|
||||||
| Dark-Mode-Dedup | `@media` + `[data-theme]` kollabieren | 🔲 §8.2 |
|
| Dark-Mode-Dedup | `@media` + `[data-theme]` kollabieren | 🔲 §8.2 |
|
||||||
| `glass.css` specular | Werte konsolidieren | 🔲 §8.3 |
|
| `tokens.css` | 5 neue `--glass-inset-*` Tokens (0.18–0.32) | ✅ §8.3 |
|
||||||
| `layout.css` Print | Minor Literal-Bereinigung | 🔲 §8.4 |
|
| `glass.css` | 9 specular rgba-Literale → `var(--glass-inset-*)` | ✅ §8.3 |
|
||||||
|
| `tasks.css` | 1 specular rgba-Literal → `var(--glass-inset-base)` | ✅ §8.3 |
|
||||||
|
| `layout.css` Print | `#fff`→`#ffffff`, `#000`→`#000000`, `#ddd`→`#cccccc` | ✅ §8.4 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -174,8 +174,8 @@ class OikosInstallPrompt extends HTMLElement {
|
|||||||
.btn-install {
|
.btn-install {
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
padding: var(--space-2, 8px) var(--space-4, 16px);
|
padding: var(--space-2, 8px) var(--space-4, 16px);
|
||||||
background: var(--color-btn-primary, #2554C7);
|
background: var(--color-btn-primary, #4338CA);
|
||||||
color: #fff;
|
color: var(--color-text-on-accent, #fff);
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: var(--radius-sm, 8px);
|
border-radius: var(--radius-sm, 8px);
|
||||||
font-family: var(--font-sans, system-ui);
|
font-family: var(--font-sans, system-ui);
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, maximum-scale=5" />
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, maximum-scale=5" />
|
||||||
|
|
||||||
<!-- PWA / Theme -->
|
<!-- PWA / Theme -->
|
||||||
<meta name="theme-color" content="#2563EB" media="(prefers-color-scheme: light)" />
|
<meta name="theme-color" content="#4F46E5" media="(prefers-color-scheme: light)" />
|
||||||
<meta name="theme-color" content="#222220" media="(prefers-color-scheme: dark)" />
|
<meta name="theme-color" content="#222220" media="(prefers-color-scheme: dark)" />
|
||||||
<meta name="mobile-web-app-capable" content="yes" />
|
<meta name="mobile-web-app-capable" content="yes" />
|
||||||
|
|
||||||
|
|||||||
@@ -122,13 +122,13 @@
|
|||||||
border-radius: var(--radius-glass-button);
|
border-radius: var(--radius-glass-button);
|
||||||
box-shadow:
|
box-shadow:
|
||||||
var(--shadow-sm),
|
var(--shadow-sm),
|
||||||
inset 0 1px 0 rgba(255, 255, 255, 0.22);
|
var(--glass-inset-medium);
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn--primary:hover {
|
.btn--primary:hover {
|
||||||
box-shadow:
|
box-shadow:
|
||||||
var(--shadow-md),
|
var(--shadow-md),
|
||||||
inset 0 1px 0 rgba(255, 255, 255, 0.18);
|
var(--glass-inset-soft);
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn--secondary {
|
.btn--secondary {
|
||||||
@@ -150,14 +150,14 @@
|
|||||||
.fab {
|
.fab {
|
||||||
box-shadow:
|
box-shadow:
|
||||||
var(--shadow-lg),
|
var(--shadow-lg),
|
||||||
inset 0 1px 0 rgba(255, 255, 255, 0.28),
|
var(--glass-inset-elevated),
|
||||||
inset 0 -1px 0 rgba(0, 0, 0, 0.12);
|
inset 0 -1px 0 rgba(0, 0, 0, 0.12);
|
||||||
}
|
}
|
||||||
|
|
||||||
.fab:hover {
|
.fab:hover {
|
||||||
box-shadow:
|
box-shadow:
|
||||||
var(--shadow-lg),
|
var(--shadow-lg),
|
||||||
inset 0 1px 0 rgba(255, 255, 255, 0.32),
|
var(--glass-inset-strong),
|
||||||
inset 0 -1px 0 rgba(0, 0, 0, 0.16);
|
inset 0 -1px 0 rgba(0, 0, 0, 0.16);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,7 +252,7 @@ textarea.form-input {
|
|||||||
border-radius: var(--radius-glass-card);
|
border-radius: var(--radius-glass-card);
|
||||||
box-shadow:
|
box-shadow:
|
||||||
var(--glass-shadow-md),
|
var(--glass-shadow-md),
|
||||||
inset 0 1px 0 rgba(255, 255, 255, 0.18);
|
var(--glass-inset-soft);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ================================================================
|
/* ================================================================
|
||||||
@@ -273,7 +273,7 @@ textarea.form-input {
|
|||||||
* Immer aktiv (kein backdrop-filter nötig)
|
* Immer aktiv (kein backdrop-filter nötig)
|
||||||
* ================================================================ */
|
* ================================================================ */
|
||||||
.nav-badge {
|
.nav-badge {
|
||||||
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.20);
|
box-shadow: var(--glass-inset-base);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ================================================================
|
/* ================================================================
|
||||||
@@ -458,9 +458,9 @@ html.navigating .app-content *::after {
|
|||||||
* 23. FAB — Attention Pulse
|
* 23. FAB — Attention Pulse
|
||||||
* ================================================================ */
|
* ================================================================ */
|
||||||
@keyframes fab-ring-pulse {
|
@keyframes fab-ring-pulse {
|
||||||
0% { box-shadow: var(--shadow-lg), inset 0 1px 0 rgba(255,255,255,0.28), 0 0 0 0 color-mix(in srgb, var(--module-accent, var(--color-btn-primary)) 50%, transparent); }
|
0% { box-shadow: var(--shadow-lg), var(--glass-inset-elevated), 0 0 0 0 color-mix(in srgb, var(--module-accent, var(--color-btn-primary)) 50%, transparent); }
|
||||||
60% { box-shadow: var(--shadow-lg), inset 0 1px 0 rgba(255,255,255,0.28), 0 0 0 10px transparent; }
|
60% { box-shadow: var(--shadow-lg), var(--glass-inset-elevated), 0 0 0 10px transparent; }
|
||||||
100% { box-shadow: var(--shadow-lg), inset 0 1px 0 rgba(255,255,255,0.28), 0 0 0 0 transparent; }
|
100% { box-shadow: var(--shadow-lg), var(--glass-inset-elevated), 0 0 0 0 transparent; }
|
||||||
}
|
}
|
||||||
|
|
||||||
.fab {
|
.fab {
|
||||||
|
|||||||
@@ -1736,13 +1736,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
background: #fff;
|
background: #ffffff;
|
||||||
color: #000;
|
color: #000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card {
|
.card {
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
border: 1px solid #ddd;
|
border: 1px solid #cccccc;
|
||||||
break-inside: avoid;
|
break-inside: avoid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -133,7 +133,7 @@
|
|||||||
backdrop-filter: var(--blur-xs);
|
backdrop-filter: var(--blur-xs);
|
||||||
-webkit-backdrop-filter: var(--blur-xs);
|
-webkit-backdrop-filter: var(--blur-xs);
|
||||||
border-color: color-mix(in srgb, var(--color-accent) 50%, transparent);
|
border-color: color-mix(in srgb, var(--color-accent) 50%, transparent);
|
||||||
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.20);
|
box-shadow: var(--glass-inset-base);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -308,6 +308,13 @@
|
|||||||
--glass-highlight: rgba(255, 255, 255, 0.70);
|
--glass-highlight: rgba(255, 255, 255, 0.70);
|
||||||
--glass-highlight-subtle: rgba(255, 255, 255, 0.35);
|
--glass-highlight-subtle: rgba(255, 255, 255, 0.35);
|
||||||
|
|
||||||
|
/* d2) Inset-Specular: Oberrand-Sheen für Glass-Elemente (volle inset-Kurzform) */
|
||||||
|
--glass-inset-soft: inset 0 1px 0 rgba(255, 255, 255, 0.18);
|
||||||
|
--glass-inset-base: inset 0 1px 0 rgba(255, 255, 255, 0.20);
|
||||||
|
--glass-inset-medium: inset 0 1px 0 rgba(255, 255, 255, 0.22);
|
||||||
|
--glass-inset-elevated: inset 0 1px 0 rgba(255, 255, 255, 0.28);
|
||||||
|
--glass-inset-strong: inset 0 1px 0 rgba(255, 255, 255, 0.32);
|
||||||
|
|
||||||
/* e) Glass-Schatten */
|
/* e) Glass-Schatten */
|
||||||
--glass-shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.06), 0 0 0 1px rgba(255, 255, 255, 0.55);
|
--glass-shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.06), 0 0 0 1px rgba(255, 255, 255, 0.55);
|
||||||
--glass-shadow-md: 0 4px 20px rgba(0, 0, 0, 0.10), 0 0 0 1px rgba(255, 255, 255, 0.50);
|
--glass-shadow-md: 0 4px 20px rgba(0, 0, 0, 0.10), 0 0 0 1px rgba(255, 255, 255, 0.50);
|
||||||
|
|||||||
Reference in New Issue
Block a user