12eea333ba
Neuer Schalter im Bearbeitungsmodus (neben dem Griff) setzt hideTitle in der Widget-Konfiguration (setWidgetConfig im Dashboard-Store, optimistisch mit Ruecksetzen); in der Ansicht entfaellt die Titelzeile per data-hide-title, Aktionen der Titelzeile bleiben oben rechts. Kategorien der Seitenleiste 14 px, Moduleintraege 13 px / 32 px hoch. Version 1.5.2. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
629 lines
22 KiB
CSS
629 lines
22 KiB
CSS
@import "tailwindcss";
|
|
|
|
/*
|
|
* Bindet die `dark:`-Utility-Variante an die `.dark`-Klasse.
|
|
*
|
|
* Tailwind 4 haengt `dark:` per Vorgabe an `prefers-color-scheme`, also an die
|
|
* Einstellung des Betriebssystems. Diese Anwendung schaltet den Modus aber ueber
|
|
* next-themes mit `attribute="class"` (siehe app/layout.tsx) — der Nutzer waehlt
|
|
* hell/dunkel im Portal, unabhaengig von seinem System.
|
|
*
|
|
* Ohne diese Zeile klaffte beides auseinander: die Farbtokens unter `.dark` weiter
|
|
* unten schalteten korrekt um, jede einzelne `dark:`-Utility im Quellcode blieb
|
|
* dagegen wirkungslos, sobald System und Portal-Einstellung nicht zufaellig
|
|
* uebereinstimmten. Betroffen waren ueber 100 Stellen — Status-, Warn- und
|
|
* Fehlerfarben, Hinweisboxen und Badges in der Administration. Der Fehler fiel
|
|
* lange nicht auf, weil Hintergrund und Textfarbe eben NICHT ueber `dark:` laufen,
|
|
* die Oberflaeche also grundsaetzlich dunkel wurde und nur die Feinheiten fehlten.
|
|
*
|
|
* Aufgedeckt beim Logo-Einbau (Quick 260907-fgv, WINDOWS.md #13), dessen
|
|
* Plattenkontur `dark:stroke-white/25` aus genau diesem Grund nicht griff.
|
|
*/
|
|
@custom-variant dark (&:where(.dark, .dark *));
|
|
|
|
@theme inline {
|
|
--color-primary: var(--primary);
|
|
--color-primary-foreground: var(--primary-foreground);
|
|
--color-secondary: var(--secondary);
|
|
--color-secondary-foreground: var(--secondary-foreground);
|
|
--color-accent: var(--accent);
|
|
--color-accent-foreground: var(--accent-foreground);
|
|
--color-background: var(--background);
|
|
--color-foreground: var(--foreground);
|
|
--color-card: var(--card);
|
|
--color-card-foreground: var(--card-foreground);
|
|
--color-muted: var(--muted);
|
|
--color-muted-foreground: var(--muted-foreground);
|
|
--color-destructive: var(--destructive);
|
|
--color-destructive-foreground: var(--destructive-foreground);
|
|
--color-border: var(--border);
|
|
--color-input: var(--input);
|
|
--color-ring: var(--ring);
|
|
--color-sidebar: var(--sidebar);
|
|
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
--color-sidebar-accent: var(--sidebar-accent);
|
|
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
--color-sidebar-border: var(--sidebar-border);
|
|
/* Statusfarben (quick-260924-h7x): Flaechen (Balken, Punkte, Leisten) und
|
|
die abgedunkelte bzw. aufgehellte Textvariante `-fg` fuer Schrift. */
|
|
--color-status-ok: var(--status-ok);
|
|
--color-status-warn: var(--status-warn);
|
|
--color-status-down: var(--status-down);
|
|
--color-status-idle: var(--status-idle);
|
|
--color-status-orphan: var(--status-orphan);
|
|
--color-status-ok-fg: var(--status-ok-fg);
|
|
--color-status-warn-fg: var(--status-warn-fg);
|
|
--color-status-down-fg: var(--status-down-fg);
|
|
--color-status-idle-fg: var(--status-idle-fg);
|
|
--color-status-orphan-fg: var(--status-orphan-fg);
|
|
--color-well: var(--well);
|
|
--color-link: var(--link);
|
|
--color-tile: var(--tile);
|
|
--color-tile-foreground: var(--tile-foreground);
|
|
--color-primary-strong: var(--primary-strong);
|
|
--color-input-strong: var(--input-strong);
|
|
--color-appbar: var(--appbar);
|
|
--color-appbar-foreground: var(--appbar-foreground);
|
|
--color-appbar-muted: var(--appbar-muted);
|
|
--color-appbar-hover: var(--appbar-hover);
|
|
--color-sidebar-hover: var(--sidebar-hover);
|
|
--radius-sm: calc(var(--radius) - 2px);
|
|
--radius-md: var(--radius);
|
|
--radius-lg: calc(var(--radius) + 2px);
|
|
}
|
|
|
|
/* Fluent-2-Hoehenstufen: shadow-sm = shadow2 (ruhende Karte), shadow-md =
|
|
shadow4 (angehobene/Hover-Karte), shadow-lg = shadow16 (Menues, Dialoge).
|
|
Im dunklen Erscheinungsbild tragen Haarlinien statt Schatten (--border). */
|
|
@theme {
|
|
--shadow-sm: 0 0 2px oklch(0 0 0 / 0.12), 0 1px 2px oklch(0 0 0 / 0.14);
|
|
--shadow-md: 0 0 2px oklch(0 0 0 / 0.12), 0 4px 8px oklch(0 0 0 / 0.14);
|
|
--shadow-lg: 0 0 2px oklch(0 0 0 / 0.12), 0 8px 16px oklch(0 0 0 / 0.14);
|
|
--shadow-xl: 0 0 8px oklch(0 0 0 / 0.12), 0 14px 28px oklch(0 0 0 / 0.14);
|
|
}
|
|
|
|
:root {
|
|
/* Design „Mosaik“ (Fluent 2 / GitHub als Vorbild): 6 px fuer Bedien-
|
|
elemente (rounded-md), 8 px fuer Karten (rounded-lg), 12 px fuer grosse
|
|
Flaechen (rounded-xl). */
|
|
--radius: 0.375rem;
|
|
/* Segoe UI Variable zuerst: unter Windows (Desktop-Client) wirkt die
|
|
Oberflaeche damit wie eine native Anwendung; sonst Inter bzw. Systemschrift. */
|
|
--font-sans: "Segoe UI Variable Text", "Segoe UI", Inter, system-ui, -apple-system, sans-serif;
|
|
|
|
/* Layout dimensions */
|
|
--sidebar-width: 240px;
|
|
--sidebar-width-collapsed: 64px;
|
|
--header-height: 48px;
|
|
|
|
/* Light mode colors (OKLCH) — Arbeitsflaeche leicht kuehlgrau, Karten weiss */
|
|
--background: oklch(0.972 0.003 260);
|
|
--foreground: oklch(0.2 0.006 260);
|
|
--card: oklch(1 0 0);
|
|
--card-foreground: oklch(0.2 0.006 260);
|
|
--primary: oklch(0.91 0.19 102);
|
|
--primary-foreground: oklch(0.20 0.02 90);
|
|
--secondary: oklch(0.955 0.003 260);
|
|
--secondary-foreground: oklch(0.2 0.006 260);
|
|
--muted: oklch(0.955 0.003 260);
|
|
--muted-foreground: oklch(0.49 0.01 260);
|
|
--accent: oklch(0.955 0.003 260);
|
|
--accent-foreground: oklch(0.2 0.006 260);
|
|
--destructive: oklch(0.55 0.2 27);
|
|
--destructive-foreground: oklch(0.98 0 0);
|
|
--border: oklch(0.915 0.004 260);
|
|
--input: oklch(0.87 0 0);
|
|
/* Untere Kante von Eingabefeldern (Fluent-Eingabefeld). */
|
|
--input-strong: oklch(0.58 0.005 260);
|
|
/* Tastaturfokus: dunkler Ring statt Gelb — Gelb auf Weiss erreicht nur
|
|
1,3:1 und waere als Fokusanzeige kaum sichtbar. */
|
|
--ring: oklch(0.3 0.01 260);
|
|
/* Verweise: nie gelbe Schrift auf Weiss. 5,9:1 auf --card. */
|
|
--link: oklch(0.50 0.15 255);
|
|
/* Neutrale Modul-Kachel (Runde 2: einfarbig statt bunt). */
|
|
--tile: oklch(0.93 0.004 260);
|
|
--tile-foreground: oklch(0.35 0.01 260);
|
|
/* Akzent fuer duenne Markierungen (Auswahlpille, Reiter-Unterstrich) auf
|
|
hellem Grund: die Akzentfarbe um knapp ein Drittel abgedunkelt, damit
|
|
auch Gelb neben Hellgrau noch erkennbar bleibt. */
|
|
--primary-strong: color-mix(in oklab, var(--primary) 70%, oklch(0.3 0.03 90));
|
|
|
|
/* Kopfzeile (dunkle App-Leiste wie GitHub / Microsoft 365) */
|
|
--appbar: oklch(0.24 0.012 260);
|
|
--appbar-foreground: oklch(0.985 0 0);
|
|
--appbar-muted: oklch(0.985 0 0 / 0.72);
|
|
--appbar-hover: oklch(1 0 0 / 0.08);
|
|
|
|
/* Sidebar tokens */
|
|
--sidebar: oklch(0.975 0.003 260);
|
|
--sidebar-foreground: oklch(0.2 0.006 260);
|
|
--sidebar-accent: oklch(0.925 0.005 260);
|
|
--sidebar-accent-foreground: oklch(0.16 0.006 260);
|
|
--sidebar-hover: oklch(0.945 0.004 260);
|
|
--sidebar-border: oklch(0.915 0.004 260);
|
|
|
|
/* Statusfarben (quick-260924-h7x). Die Flaechentoene stammen aus dem
|
|
Design-Plan; als Schrift auf Weiss erreichen sie aber nur 2,6:1 bis
|
|
4,9:1 (gemessen, WCAG-Formel). Fuer Text gibt es deshalb die `-fg`-
|
|
Variante, gemessen auf --card: ok 5,6:1, warn 5,7:1, down 6,1:1,
|
|
idle/orphan 6,0:1 (auf der Pille mit 12 % Statusflaeche >= 4,9:1). */
|
|
--status-ok: oklch(0.62 0.15 152);
|
|
--status-warn: oklch(0.72 0.15 70);
|
|
--status-down: oklch(0.58 0.21 27);
|
|
--status-idle: oklch(0.62 0.02 260);
|
|
--status-orphan: oklch(0.55 0.01 260);
|
|
--status-ok-fg: oklch(0.50 0.13 152);
|
|
--status-warn-fg: oklch(0.52 0.12 60);
|
|
--status-down-fg: oklch(0.52 0.20 27);
|
|
--status-idle-fg: oklch(0.50 0.02 260);
|
|
--status-orphan-fg: oklch(0.50 0.01 260);
|
|
/* Eingelassene Messfelder. */
|
|
--well: oklch(0.972 0.003 260);
|
|
}
|
|
|
|
.dark {
|
|
--background: oklch(0.2 0.01 260);
|
|
--foreground: oklch(0.95 0.003 260);
|
|
--card: oklch(0.245 0.01 260);
|
|
--card-foreground: oklch(0.95 0.003 260);
|
|
--primary: oklch(0.91 0.19 102);
|
|
--primary-foreground: oklch(0.20 0.02 90);
|
|
--secondary: oklch(0.28 0.01 260);
|
|
--secondary-foreground: oklch(0.95 0.003 260);
|
|
--muted: oklch(0.28 0.01 260);
|
|
--muted-foreground: oklch(0.72 0.01 260);
|
|
--accent: oklch(0.28 0.01 260);
|
|
--accent-foreground: oklch(0.95 0.003 260);
|
|
--destructive: oklch(0.6 0.2 27);
|
|
--destructive-foreground: oklch(0.98 0 0);
|
|
/* Dunkel: feine helle Haarlinie statt Schatten. */
|
|
--border: oklch(1 0 0 / 0.09);
|
|
--input: oklch(1 0 0 / 0.16);
|
|
--input-strong: oklch(1 0 0 / 0.42);
|
|
--ring: oklch(0.92 0.005 260);
|
|
--link: oklch(0.78 0.11 250);
|
|
--tile: oklch(0.32 0.01 260);
|
|
--tile-foreground: oklch(0.88 0.005 260);
|
|
--primary-strong: var(--primary);
|
|
|
|
--appbar: oklch(0.18 0.01 260);
|
|
--appbar-foreground: oklch(0.985 0 0);
|
|
--appbar-muted: oklch(0.985 0 0 / 0.7);
|
|
--appbar-hover: oklch(1 0 0 / 0.08);
|
|
|
|
/* Sidebar tokens (dark) */
|
|
--sidebar: oklch(0.21 0.01 260);
|
|
--sidebar-foreground: oklch(0.93 0.003 260);
|
|
--sidebar-accent: oklch(1 0 0 / 0.08);
|
|
--sidebar-accent-foreground: oklch(0.98 0 0);
|
|
--sidebar-hover: oklch(1 0 0 / 0.05);
|
|
--sidebar-border: oklch(1 0 0 / 0.08);
|
|
|
|
/* Statusfarben (dark). Textvariante auf --card gemessen: ok 7,4:1,
|
|
warn 8,5:1, down 6,1:1, idle 6,1:1, orphan 5,6:1. */
|
|
--status-ok: oklch(0.72 0.15 152);
|
|
--status-warn: oklch(0.80 0.14 75);
|
|
--status-down: oklch(0.68 0.19 27);
|
|
--status-idle: oklch(0.60 0.02 260);
|
|
--status-orphan: oklch(0.52 0.01 260);
|
|
--status-ok-fg: oklch(0.76 0.15 152);
|
|
--status-warn-fg: oklch(0.82 0.14 75);
|
|
--status-down-fg: oklch(0.74 0.16 27);
|
|
--status-idle-fg: oklch(0.72 0.02 260);
|
|
--status-orphan-fg: oklch(0.70 0.01 260);
|
|
--well: oklch(0.215 0.01 260);
|
|
}
|
|
|
|
body {
|
|
font-family: var(--font-sans);
|
|
font-size: 0.875rem;
|
|
line-height: 1.25rem;
|
|
-webkit-font-smoothing: antialiased;
|
|
-moz-osx-font-smoothing: grayscale;
|
|
}
|
|
|
|
/* App shell main content responsive margin */
|
|
@media (min-width: 768px) {
|
|
.app-shell-main {
|
|
margin-left: var(--current-sidebar-width, var(--sidebar-width));
|
|
}
|
|
}
|
|
|
|
/* Tailwind-Preflight setzt in @layer base `ul, ol { list-style: none }`; das
|
|
Markdown-Stylesheet von @uiw/react-markdown-preview stellt es nicht wieder
|
|
her — deshalb fehlten auf „Was ist neu“ und in der Notiz-Vorschau die
|
|
Aufzaehlungspunkte. Diese Regel liegt bewusst NICHT in einem @layer, damit
|
|
sie die Layer-Regel unabhaengig von Spezifitaet schlaegt. Aufgabenlisten
|
|
mit Kaestchen (`- [ ]`) bleiben ohne Punkt (quick-260916-jvj).
|
|
*/
|
|
.wmde-markdown ul { list-style: disc; }
|
|
.wmde-markdown ul ul { list-style: circle; }
|
|
.wmde-markdown ol { list-style: decimal; }
|
|
.wmde-markdown ul.contains-task-list, .wmde-markdown li.task-list-item { list-style: none; }
|
|
|
|
/* Tastaturfokus sichtbar ueberall, auch wo ein Bauteil keinen eigenen
|
|
Fokusring setzt (im Basis-Layer, damit `outline-none` + eigener Ring
|
|
eines Bauteils Vorrang behalten). Mausklicks loesen :focus-visible nicht aus. */
|
|
@layer base {
|
|
:where(a, button, [role="tab"], [role="button"], summary, [tabindex]):focus-visible {
|
|
outline: 2px solid var(--ring);
|
|
outline-offset: 2px;
|
|
}
|
|
}
|
|
|
|
/* Fluent-Eingabefeld: untere Kante eine Stufe dunkler; Fokus = dunklerer
|
|
Rahmen plus 2 px Akzentlinie unten. Gilt fuer Textfelder und Auswahllisten
|
|
mit dem ueblichen `border-input`/`border-border`-Rahmen; Fehlerzustaende
|
|
(aria-invalid, border-destructive) behalten ihre Farbe. Bewusst ausserhalb
|
|
eines @layer, damit die Regel die Tailwind-Utilities schlaegt. */
|
|
:is(input:not([type="checkbox"], [type="radio"], [type="range"], [type="color"], [type="file"]), select, textarea):is(.border-input, .border-border):not([aria-invalid="true"], .border-destructive) {
|
|
border-bottom-color: var(--input-strong);
|
|
}
|
|
:is(input:not([type="checkbox"], [type="radio"], [type="range"], [type="color"], [type="file"]), select, textarea):is(.border-input, .border-border):not([aria-invalid="true"], .border-destructive):focus {
|
|
outline: none;
|
|
border-color: var(--input-strong);
|
|
border-bottom-color: var(--primary);
|
|
box-shadow: inset 0 -1px 0 var(--primary);
|
|
}
|
|
|
|
/* Karteneffekt in einer Klasse fuer neue Flaechen: hell Schatten, dunkel Haarlinie. */
|
|
.surface {
|
|
background: var(--card);
|
|
border-radius: 0.5rem;
|
|
box-shadow: var(--shadow-sm);
|
|
}
|
|
.dark .surface {
|
|
box-shadow: none;
|
|
outline: 1px solid var(--border);
|
|
outline-offset: -1px;
|
|
}
|
|
|
|
@media (prefers-reduced-motion: reduce) {
|
|
*, *::before, *::after {
|
|
animation-duration: 0.01ms !important;
|
|
animation-iteration-count: 1 !important;
|
|
transition-duration: 0.01ms !important;
|
|
scroll-behavior: auto !important;
|
|
}
|
|
}
|
|
|
|
/* Knoepfe (Design „Mosaik“, Fluent 2): 32 px hoch, 6 px Radius, 14 px
|
|
halbfett. Primaer = Akzentflaeche mit dunkler Schrift, Sekundaer = weisse
|
|
Flaeche mit Rahmen, Subtil = ohne Flaeche. Im Komponenten-Layer, damit
|
|
einzelne Utilities (etwa `w-full`) weiter ueberschreiben koennen. */
|
|
@layer components {
|
|
.btn {
|
|
display: inline-flex;
|
|
height: 2rem;
|
|
align-items: center;
|
|
justify-content: center;
|
|
gap: 0.5rem;
|
|
border-radius: 0.375rem;
|
|
border: 1px solid transparent;
|
|
padding-inline: 0.75rem;
|
|
font-size: 0.875rem;
|
|
line-height: 1.25rem;
|
|
font-weight: 600;
|
|
white-space: nowrap;
|
|
transition: background-color 120ms, border-color 120ms, color 120ms;
|
|
}
|
|
.btn:focus-visible {
|
|
outline: 2px solid var(--ring);
|
|
outline-offset: 2px;
|
|
}
|
|
.btn:disabled {
|
|
cursor: not-allowed;
|
|
}
|
|
/* Fluent: deaktiviert = graue Flaeche, graue Schrift (nicht verblasstes Gelb). */
|
|
.btn-primary:disabled {
|
|
background-color: var(--muted);
|
|
color: var(--muted-foreground);
|
|
border-color: var(--border);
|
|
}
|
|
.btn-secondary:disabled, .btn-subtle:disabled {
|
|
color: var(--muted-foreground);
|
|
}
|
|
.btn-primary {
|
|
background-color: var(--primary);
|
|
color: var(--primary-foreground);
|
|
}
|
|
.btn-primary:hover:not(:disabled) {
|
|
background-color: color-mix(in oklab, var(--primary) 88%, black);
|
|
}
|
|
.btn-secondary {
|
|
background-color: var(--card);
|
|
color: var(--foreground);
|
|
border-color: oklch(0.87 0 0);
|
|
box-shadow: 0 1px 2px oklch(0 0 0 / 0.06);
|
|
}
|
|
.btn-secondary:hover:not(:disabled) {
|
|
background-color: oklch(0.965 0 0);
|
|
}
|
|
.dark .btn-secondary {
|
|
border-color: var(--input);
|
|
box-shadow: none;
|
|
}
|
|
.dark .btn-secondary:hover:not(:disabled) {
|
|
background-color: var(--muted);
|
|
}
|
|
.btn-subtle {
|
|
background-color: transparent;
|
|
color: var(--foreground);
|
|
}
|
|
.btn-subtle:hover:not(:disabled) {
|
|
background-color: var(--muted);
|
|
}
|
|
.btn-icon {
|
|
width: 2rem;
|
|
padding-inline: 0;
|
|
}
|
|
/* Knopf auf der dunklen App-Leiste (Dashboard-Aktionen, quick-260928-vxe). */
|
|
.btn-appbar {
|
|
background-color: transparent;
|
|
color: var(--appbar-muted);
|
|
}
|
|
.btn-appbar:hover:not(:disabled) {
|
|
background-color: var(--appbar-hover);
|
|
color: var(--appbar-foreground);
|
|
}
|
|
.btn-appbar:focus-visible {
|
|
outline-color: var(--appbar-foreground);
|
|
outline-offset: -2px;
|
|
}
|
|
|
|
/* Verweis: dunkle bzw. blaue Schrift, nie gelb auf Weiss. */
|
|
.link {
|
|
color: var(--link);
|
|
text-decoration-line: underline;
|
|
text-decoration-thickness: 1px;
|
|
text-underline-offset: 3px;
|
|
text-decoration-color: color-mix(in oklab, var(--link) 40%, transparent);
|
|
}
|
|
.link:hover {
|
|
text-decoration-color: currentColor;
|
|
}
|
|
}
|
|
|
|
/* Markdown (Notiz-Kachel, „Was ist neu“): Fluent-Schriftgroessen statt der
|
|
GitHub-Vorgaben (16 px Grundschrift, 2em-Ueberschriften), Hintergrund
|
|
transparent, Farben aus den Tokens. */
|
|
:root .wmde-markdown {
|
|
font-family: var(--font-sans);
|
|
font-size: 0.875rem;
|
|
line-height: 1.5;
|
|
background-color: transparent !important;
|
|
color: var(--foreground) !important;
|
|
--color-border-default: var(--border);
|
|
--color-border-muted: var(--border);
|
|
--color-accent-fg: var(--link);
|
|
--color-fg-default: var(--foreground);
|
|
--color-fg-muted: var(--muted-foreground);
|
|
}
|
|
:root .wmde-markdown h1 { font-size: 1.25rem; line-height: 1.75rem; font-weight: 600; }
|
|
:root .wmde-markdown h2 { font-size: 1rem; line-height: 1.375rem; font-weight: 600; }
|
|
:root .wmde-markdown h3, :root .wmde-markdown h4 { font-size: 0.875rem; line-height: 1.25rem; font-weight: 600; }
|
|
:root .w-md-editor {
|
|
background-color: transparent !important;
|
|
box-shadow: none !important;
|
|
}
|
|
|
|
/* Navigationseintrag mit Fluent-Auswahlpille, gesteuert ueber aria-current
|
|
(Einstellungs- und Verwaltungsnavigation). */
|
|
.nav-item {
|
|
position: relative;
|
|
}
|
|
.nav-item[aria-current="page"]::before {
|
|
content: "";
|
|
position: absolute;
|
|
left: 0;
|
|
top: 50%;
|
|
width: 3px;
|
|
height: 1rem;
|
|
margin-top: -0.5rem;
|
|
border-radius: 9999px;
|
|
background-color: var(--primary-strong);
|
|
}
|
|
|
|
/* Checkboxen und Optionsfelder in der Link-Farbe statt Browser-Blau bzw.
|
|
Gelb (Gelb mit weissem Haken waere kaum lesbar). */
|
|
input[type="checkbox"], input[type="radio"] {
|
|
accent-color: var(--link);
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------
|
|
Dashboard-Kacheln (Design „Mosaik“)
|
|
------------------------------------------------------------------------- */
|
|
|
|
/* Einheitliche Kachel-Kopfzeile: 40 px, 12 px Innenabstand, 14 px halbfett. */
|
|
.widget-head {
|
|
display: flex;
|
|
flex-shrink: 0;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
min-height: 2.5rem;
|
|
padding: 0.25rem 0.5rem 0.25rem 0.75rem;
|
|
font-size: 0.875rem;
|
|
line-height: 1.25rem;
|
|
}
|
|
|
|
/* Runde 3 — mehr Leben in den Kacheln, ohne bunt zu werden.
|
|
Symbol-Chip: volle Akzentfarbe als Flaeche, Symbol in der passenden Vordergrundfarbe. */
|
|
.widget-icon-chip {
|
|
display: inline-flex;
|
|
flex-shrink: 0;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 1.625rem;
|
|
height: 1.625rem;
|
|
border-radius: 0.4375rem;
|
|
background-color: var(--primary);
|
|
color: var(--primary-foreground);
|
|
}
|
|
|
|
/* Karte hebt sich beim Zeigen leicht an (nur Maus, nur Ansicht). */
|
|
@media (hover: hover) {
|
|
.widget-card {
|
|
transition: box-shadow 180ms ease-out, translate 180ms ease-out;
|
|
}
|
|
.widget-card:not(.widget-drag-handle):hover {
|
|
translate: 0 -4px;
|
|
box-shadow: 0 0 2px oklch(0 0 0 / 0.14), 0 14px 30px oklch(0 0 0 / 0.18);
|
|
}
|
|
.dark .widget-card:not(.widget-drag-handle):hover {
|
|
box-shadow: 0 0 0 1px oklch(1 0 0 / 0.12), 0 16px 34px oklch(0 0 0 / 0.6);
|
|
}
|
|
}
|
|
|
|
/* Titel ausgeblendet (quick-260928-wtt, `hideTitle` in der Widget-
|
|
Konfiguration, nur in der Ansicht): die Titelzeile entfaellt. Traegt sie
|
|
Aktionen (Notiz-Stift, XFrame „In neuem Tab“), bleiben nur diese als
|
|
kleine Schwebeleiste oben rechts. */
|
|
[data-hide-title] .widget-head {
|
|
display: none;
|
|
}
|
|
[data-hide-title] .widget-head:has(.widget-action) {
|
|
display: flex;
|
|
position: absolute;
|
|
top: 0.25rem;
|
|
right: 0.25rem;
|
|
z-index: 5;
|
|
min-height: 0;
|
|
padding: 0;
|
|
}
|
|
[data-hide-title] .widget-head:has(.widget-action) > :not(.widget-action) {
|
|
display: none;
|
|
}
|
|
|
|
/* Beim Laden blenden die Kacheln gestaffelt ein (je 80 ms, --enter-delay). */
|
|
@media (prefers-reduced-motion: no-preference) {
|
|
.widget-card {
|
|
animation: widget-enter 520ms cubic-bezier(0.2, 0.7, 0.3, 1) both;
|
|
animation-delay: var(--enter-delay, 0ms);
|
|
}
|
|
}
|
|
@keyframes widget-enter {
|
|
from {
|
|
opacity: 0;
|
|
transform: translateY(24px) scale(0.97);
|
|
}
|
|
to {
|
|
opacity: 1;
|
|
transform: none;
|
|
}
|
|
}
|
|
|
|
/* Aktionen der Kachel erscheinen erst beim Zeigen oder mit Tastaturfokus —
|
|
nur auf Geraeten mit Maus; auf Touch bleiben sie sichtbar. */
|
|
@media (hover: hover) {
|
|
[data-widget-id]:not(:hover):not(:focus-within) .widget-action:not(.widget-action-pinned) {
|
|
opacity: 0;
|
|
}
|
|
}
|
|
.widget-action {
|
|
transition: opacity 120ms;
|
|
}
|
|
|
|
/* Notiz: ruhige Schrift, Innenabstand wie die Kopfzeile. */
|
|
:root .widget-note-body .wmde-markdown {
|
|
font-size: 0.875rem;
|
|
line-height: 1.5;
|
|
}
|
|
:root .widget-note-body .w-md-editor-preview,
|
|
:root .widget-note-body .wmde-markdown {
|
|
padding: 0 0.75rem 0.75rem;
|
|
}
|
|
:root .widget-note-body .wmde-markdown h1,
|
|
:root .widget-note-body .wmde-markdown h2 {
|
|
border-bottom: 0;
|
|
margin-top: 0.25rem;
|
|
font-size: 1rem;
|
|
line-height: 1.375rem;
|
|
}
|
|
|
|
/* Bearbeitungsmodus: gestrichelte Akzentkontur und sichtbarer Groessengriff. */
|
|
.react-grid-item .widget-drag-handle {
|
|
outline: 2px dashed var(--primary-strong);
|
|
outline-offset: -2px;
|
|
}
|
|
.react-grid-item > .react-resizable-handle {
|
|
z-index: 20;
|
|
}
|
|
.react-grid-item > .react-resizable-handle.react-resizable-handle-se {
|
|
width: 18px;
|
|
height: 18px;
|
|
right: 4px;
|
|
bottom: 4px;
|
|
background-image: none;
|
|
border-right: 2px solid var(--primary-strong);
|
|
border-bottom: 2px solid var(--primary-strong);
|
|
border-bottom-right-radius: 4px;
|
|
}
|
|
.react-grid-item > .react-resizable-handle.react-resizable-handle-se::after {
|
|
display: none;
|
|
}
|
|
.react-grid-item.react-grid-placeholder {
|
|
background: var(--primary);
|
|
opacity: 0.18;
|
|
border-radius: 0.5rem;
|
|
}
|
|
|
|
/* Mit Hintergrund: Kacheln als Windows-11-„Mica“ — halbtransparent mit
|
|
Unschaerfe. Die einzige Stelle mit Transparenz. Deckkraft so gewaehlt,
|
|
dass Text auch vor einem rein schwarzen (hell) bzw. rein weissen, dann auf
|
|
55 % abgedunkelten (dunkel) Bild 4,5:1 haelt. Ohne backdrop-filter oder
|
|
bei „weniger Transparenz“ bleibt die Kachel deckend. */
|
|
@supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
|
|
@media not (prefers-reduced-transparency: reduce) {
|
|
.dashboard-has-bg [data-widget-id] {
|
|
background-color: oklch(1 0 0 / 0.86);
|
|
-webkit-backdrop-filter: blur(20px) saturate(1.2);
|
|
backdrop-filter: blur(20px) saturate(1.2);
|
|
}
|
|
.dark .dashboard-has-bg [data-widget-id] {
|
|
background-color: oklch(0.24 0.01 260 / 0.88);
|
|
border-color: oklch(1 0 0 / 0.1);
|
|
}
|
|
}
|
|
}
|
|
.dashboard-has-bg [data-widget-id] {
|
|
box-shadow: 0 0 2px oklch(0 0 0 / 0.14), 0 2px 6px oklch(0 0 0 / 0.16);
|
|
}
|
|
|
|
/* Begruessung, Befehlsleiste und leerer Zustand: ohne Hintergrund frei auf
|
|
der Arbeitsflaeche, mit Hintergrund auf derselben Kachelflaeche wie die
|
|
Widgets (deckend als Rueckfall, durchscheinend wo moeglich). */
|
|
.dashboard-has-bg .dashboard-chrome {
|
|
padding: 0.375rem 0.75rem;
|
|
background-color: var(--card);
|
|
box-shadow: 0 0 2px oklch(0 0 0 / 0.14), 0 2px 6px oklch(0 0 0 / 0.16);
|
|
}
|
|
.dashboard-has-bg [role="toolbar"].dashboard-chrome {
|
|
padding: 0.25rem;
|
|
}
|
|
@supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
|
|
@media not (prefers-reduced-transparency: reduce) {
|
|
.dashboard-has-bg .dashboard-chrome {
|
|
background-color: oklch(1 0 0 / 0.86);
|
|
-webkit-backdrop-filter: blur(20px) saturate(1.2);
|
|
backdrop-filter: blur(20px) saturate(1.2);
|
|
}
|
|
.dark .dashboard-has-bg .dashboard-chrome {
|
|
background-color: oklch(0.24 0.01 260 / 0.88);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Notiz-Checklisten: Kaestchen in der Akzentfarbe; der Browser waehlt den
|
|
Haken selbst hell oder dunkel passend zur Akzentfarbe. */
|
|
:root .widget-note-body input[type="checkbox"] {
|
|
accent-color: var(--primary);
|
|
width: 1rem;
|
|
height: 1rem;
|
|
margin: 0 0.5rem 0 0;
|
|
vertical-align: -0.15em;
|
|
}
|
|
:root .widget-note-body .task-list-item {
|
|
padding-block: 0.125rem;
|
|
line-height: 1.5rem;
|
|
}
|