19-05-2026 Rebrand Pressekonto, Hub-Flux UI und Legacy-Media-Migration
Umbenennung presseportale → pressekonto in Domains, Themes und Dokumentation. Design-Tokens, Portal-Shell, Customer-Dashboard, Auth- und Admin-PM-Views. Artisan-Befehl migrate:legacy-media mit Tests und Hub-Flux-Entwicklungsdocs. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
8bfa378028
commit
36810ac81b
112 changed files with 8464 additions and 1649 deletions
|
|
@ -1,6 +1,23 @@
|
|||
@import "tailwindcss";
|
||||
@import "../../vendor/livewire/flux/dist/flux.css";
|
||||
|
||||
/**
|
||||
* Hub × FluxUI — Phase 1: Portal-Shell auf Hub-Design.
|
||||
*
|
||||
* Tokens leben in shared/design-tokens.css (Single Source of Truth aus Phase 0).
|
||||
* Hier:
|
||||
* 1. Tokens importieren
|
||||
* 2. Zinc-Skala auf Hub-Buchpapier-Familie mappen (für FluxUI-Komponenten,
|
||||
* die ihre Skala-Defaults aus Zinc beziehen)
|
||||
* 3. FluxUI-Akzent (--color-accent) auf Hub-Blau umstellen
|
||||
* 4. FluxUI-Komponenten via [data-flux-*]-Selektoren ans Hub-Design angleichen
|
||||
* (Sidebar, Navlist-Active, Primary-Buttons, Cards)
|
||||
*
|
||||
* Dokumentation: dev/frontend/hub-flux/02-PHASE-1-PORTAL-SHELL.md
|
||||
*/
|
||||
@import "./shared/design-tokens.css";
|
||||
@import "./shared/hub-components.css";
|
||||
|
||||
@source '../views';
|
||||
@source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php';
|
||||
@source '../../vendor/livewire/flux-pro/stubs/**/*.blade.php';
|
||||
|
|
@ -9,34 +26,46 @@
|
|||
@custom-variant dark (&:where(.dark, .dark *));
|
||||
|
||||
@theme {
|
||||
--font-sans: "Instrument Sans", ui-sans-serif, system-ui, sans-serif,
|
||||
/* Font: Inter Tight statt Instrument Sans
|
||||
(Token --font-sans aus design-tokens.css wird hier nochmal explizit
|
||||
gesetzt, weil FluxUI zuvor seinen eigenen Wert setzen würde) */
|
||||
--font-sans:
|
||||
"Inter Tight", Inter, ui-sans-serif, system-ui, sans-serif,
|
||||
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol",
|
||||
"Noto Color Emoji";
|
||||
|
||||
--color-zinc-50: var(--color-neutral-50);
|
||||
--color-zinc-100: var(--color-neutral-100);
|
||||
--color-zinc-200: var(--color-neutral-200);
|
||||
--color-zinc-300: var(--color-neutral-300);
|
||||
--color-zinc-400: var(--color-neutral-400);
|
||||
--color-zinc-500: var(--color-neutral-500);
|
||||
--color-zinc-600: var(--color-neutral-600);
|
||||
--color-zinc-700: var(--color-neutral-700);
|
||||
--color-zinc-800: var(--color-neutral-800);
|
||||
--color-zinc-900: var(--color-neutral-900);
|
||||
--color-zinc-950: var(--color-neutral-950);
|
||||
/* FluxUI-Akzent (für Buttons, Focus-Rings, Active-States) auf Hub-Blau.
|
||||
Vorher: #3ea3dc (Starter-Kit-Türkis). */
|
||||
--color-accent: var(--color-hub);
|
||||
--color-accent-content: var(--color-hub);
|
||||
--color-accent-foreground: #ffffff;
|
||||
|
||||
--color-accent: #3ea3dc;
|
||||
--color-accent-content: #3ea3dc;
|
||||
--color-accent-foreground: var(--color-white);
|
||||
/* Zinc-Skala auf warmes Buchpapier mappen.
|
||||
FluxUI nutzt Zinc als neutrale Skala für Sidebars, Borders, Text.
|
||||
Wir bridgen die ganze Skala, damit der Look automatisch auf Hub-Stil
|
||||
umschwenkt — ohne dass wir hunderte FluxUI-Klassen einzeln umbiegen
|
||||
müssen. */
|
||||
--color-zinc-50: #fbfaf6;
|
||||
--color-zinc-100: #f6f4ef;
|
||||
--color-zinc-200: #e2ddd0;
|
||||
--color-zinc-300: #cfc8b5;
|
||||
--color-zinc-400: #8a918d;
|
||||
--color-zinc-500: #5a6360;
|
||||
--color-zinc-600: #3a413d;
|
||||
--color-zinc-700: #1a1f1c;
|
||||
--color-zinc-800: #243152;
|
||||
--color-zinc-900: #1a2540;
|
||||
--color-zinc-950: #0f1729;
|
||||
}
|
||||
|
||||
@layer theme {
|
||||
.dark {
|
||||
--color-accent: #3ea3dc;
|
||||
--color-accent-content: #5bb8e6;
|
||||
--color-accent-foreground: var(--color-white);
|
||||
}
|
||||
}
|
||||
/* Phase 5: Dark-Mode-Mapping liegt jetzt vollständig in
|
||||
shared/design-tokens.css (`.dark { … }`). FluxUI Appearance-Switcher
|
||||
setzt `class="dark"` auf <html>, alle `--color-*`-Vars schalten
|
||||
automatisch um — inklusive `--color-accent`, weil das oben im @theme
|
||||
per `var(--color-hub)`-Verweis dynamisch ist.
|
||||
|
||||
Der Notfall-Hack aus Phase 1 (`.dark { --color-accent: var(--color-hub) }`)
|
||||
ist damit gegenstandslos und entfernt. */
|
||||
|
||||
@layer base {
|
||||
*,
|
||||
|
|
@ -48,6 +77,10 @@
|
|||
}
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* FluxUI Form-Felder — Layout vom Starter-Kit übernommen
|
||||
* Input-Focus wird weiter unten im Kontrast-Tuning auf Hub-Blau gesetzt.
|
||||
* ============================================================ */
|
||||
[data-flux-field]:not(ui-radio, ui-checkbox) {
|
||||
@apply grid gap-2;
|
||||
}
|
||||
|
|
@ -56,12 +89,165 @@
|
|||
@apply !mb-0 !leading-tight;
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* Phase 1 — Hub-Style-Overrides für FluxUI-Komponenten
|
||||
* ============================================================
|
||||
*
|
||||
* Strategie: minimal-invasive Overrides via [data-flux-*]-Attribute und
|
||||
* der Tailwind-Klassen, die FluxUI auf seinen Komponenten setzt. Wir
|
||||
* ändern KEINE Vendor-Dateien, sondern legen unsere Styles mit höherer
|
||||
* Spezifität darüber.
|
||||
*
|
||||
* Wichtig: FluxUI nutzt für variant-spezifisches Styling KEINE
|
||||
* `data-variant`-Attribute, sondern direkt Tailwind-Klassen wie
|
||||
* `bg-[var(--color-accent)]` (für variant="primary"). Wir greifen
|
||||
* deshalb über diese Klassen-Selektoren.
|
||||
*
|
||||
* Bei FluxUI-Updates können sich diese Klassen ändern — Selektoren bewusst
|
||||
* konservativ, gut kommentiert. Visueller Smoke-Test pro Release-Bump.
|
||||
* ============================================================ */
|
||||
|
||||
/* Sidebar — warmes Buchpapier statt Zinc-Grau, klare Trennlinie */
|
||||
[data-flux-sidebar] {
|
||||
background: var(--color-bg-elev);
|
||||
border-color: var(--color-bg-rule);
|
||||
}
|
||||
|
||||
/* Sidebar-Section-Headings — Mockup-Konvention:
|
||||
10 px, fett, gesperrt, anthrazit */
|
||||
[data-flux-navlist] [data-flux-navlist-group-heading],
|
||||
[data-flux-navlist] [data-flux-group-heading] {
|
||||
font-size: 10px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.18em;
|
||||
text-transform: uppercase;
|
||||
color: var(--color-ink-4);
|
||||
padding-bottom: 6px;
|
||||
}
|
||||
|
||||
/* Navlist-Item — Hub-Stil: kompakter, mit Active-Strip links */
|
||||
[data-flux-navlist-item] {
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
color: var(--color-ink-2);
|
||||
border-radius: var(--radius-sm);
|
||||
transition:
|
||||
background 0.12s,
|
||||
color 0.12s;
|
||||
}
|
||||
|
||||
[data-flux-navlist-item]:hover {
|
||||
background: var(--color-bg);
|
||||
color: var(--color-hub);
|
||||
}
|
||||
|
||||
[data-flux-navlist-item][data-current="true"],
|
||||
[data-flux-navlist-item][aria-current="page"],
|
||||
[data-flux-navlist-item].active {
|
||||
background: var(--color-hub-soft);
|
||||
color: var(--color-hub);
|
||||
font-weight: 600;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
[data-flux-navlist-item][data-current="true"]::before,
|
||||
[data-flux-navlist-item][aria-current="page"]::before,
|
||||
[data-flux-navlist-item].active::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: -1px;
|
||||
top: 6px;
|
||||
bottom: 6px;
|
||||
width: 2px;
|
||||
background: var(--color-hub);
|
||||
border-radius: 0 2px 2px 0;
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* FluxUI Buttons — Hub-Stil
|
||||
* ============================================================
|
||||
* FluxUI rendert `<flux:button variant="primary">` als
|
||||
* class="… bg-[var(--color-accent)]
|
||||
* hover:bg-[color-mix(in_oklab,_var(--color-accent),_transparent_10%)]
|
||||
* shadow-[inset_0px_1px_--theme(--color-white/.2)] …"
|
||||
*
|
||||
* `--color-accent` haben wir auf `var(--color-hub)` (#1A2540) gesetzt →
|
||||
* Default-Background passt schon. ABER:
|
||||
*
|
||||
* 1. Der Hover ("10 % transparent") wirkt auf hellem Buchpapier
|
||||
* hellblau — wir wollen statt dessen Hub-2 (#243152, dunkler) wie
|
||||
* auf der Hub-Landing (`hover:bg-hub-2`).
|
||||
* 2. FluxUI's Default-Shadow (1 px Weiß-Inset) braucht auf dem warmen
|
||||
* Hintergrund mehr Kontrast für klare Button-Kanten.
|
||||
*
|
||||
* Wir greifen über `data-flux-button` (Attribut auf dem gerenderten
|
||||
* <button>) plus dem Tailwind-Klassen-Selektor mit escapten Brackets.
|
||||
* !important ist nötig, weil FluxUI's Tailwind-Hover normal höhere
|
||||
* Spezifität hätte (escapter Klassenname). */
|
||||
|
||||
/* Primary-Button-Hover: dunkler statt heller. */
|
||||
[data-flux-button].hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover {
|
||||
background-color: var(--color-hub-2) !important;
|
||||
}
|
||||
|
||||
/* Primary-Button: kräftigerer Shadow für klare Button-Kanten auf hellem Bg.
|
||||
Schatten-Farbton hängt vom Mode ab: Light = warmer Hub-Blau-Alpha,
|
||||
Dark = neutraler Schwarz-Alpha (sonst wirkt der hub-blaue Schatten
|
||||
auf dunklem Card-BG zu sichtbar). */
|
||||
[data-flux-button].bg-\[var\(--color-accent\)\] {
|
||||
box-shadow:
|
||||
inset 0 1px 0 rgba(255, 255, 255, 0.18),
|
||||
0 1px 2px rgba(26, 37, 64, 0.25),
|
||||
0 2px 6px -2px rgba(26, 37, 64, 0.18);
|
||||
border-color: var(--color-hub-2);
|
||||
}
|
||||
|
||||
[data-flux-button].bg-\[var\(--color-accent\)\]:hover {
|
||||
box-shadow:
|
||||
inset 0 1px 0 rgba(255, 255, 255, 0.15),
|
||||
0 2px 4px rgba(26, 37, 64, 0.35),
|
||||
0 3px 10px -2px rgba(26, 37, 64, 0.25);
|
||||
}
|
||||
|
||||
.dark [data-flux-button].bg-\[var\(--color-accent\)\] {
|
||||
box-shadow:
|
||||
inset 0 1px 0 rgba(255, 255, 255, 0.12),
|
||||
0 1px 2px rgba(0, 0, 0, 0.5),
|
||||
0 2px 6px -2px rgba(0, 0, 0, 0.4);
|
||||
border-color: var(--color-hub);
|
||||
}
|
||||
|
||||
.dark [data-flux-button].bg-\[var\(--color-accent\)\]:hover {
|
||||
box-shadow:
|
||||
inset 0 1px 0 rgba(255, 255, 255, 0.1),
|
||||
0 2px 4px rgba(0, 0, 0, 0.6),
|
||||
0 3px 10px -2px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
/* Cards — Buchpapier statt Zinc */
|
||||
[data-flux-card] {
|
||||
background: var(--color-bg-card);
|
||||
border-color: var(--color-bg-rule);
|
||||
}
|
||||
|
||||
/* Headings & Heading-Defaults — Hub-Ink-Farbe */
|
||||
[data-flux-heading] {
|
||||
color: var(--color-ink);
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* Kontrast-Tuning für Inputs, Borders, Trennlinien
|
||||
* ============================================================
|
||||
* Unser Zinc → Buchpapier-Mapping macht `border-zinc-200` zu `#e2ddd0`
|
||||
* (warmes Rule). Auf hellem Buchpapier sind Inputs/Cards damit korrekt
|
||||
* vom Bg trennend, aber für Fokus-States braucht's klar Hub-Blau. */
|
||||
|
||||
/* Input-Focus: Hub-Blau-Ring statt blassen Default */
|
||||
input:focus[data-flux-control],
|
||||
textarea:focus[data-flux-control],
|
||||
select:focus[data-flux-control] {
|
||||
@apply outline-hidden ring-2 ring-accent ring-offset-2 ring-offset-accent-foreground;
|
||||
@apply ring-2 ring-offset-1;
|
||||
--tw-ring-color: var(--color-hub);
|
||||
--tw-ring-offset-color: var(--color-bg-elev);
|
||||
border-color: var(--color-hub) !important;
|
||||
}
|
||||
|
||||
/* \[:where(&)\]:size-4 {
|
||||
@apply size-4;
|
||||
} */
|
||||
|
|
|
|||
248
resources/css/shared/design-tokens.css
Normal file
248
resources/css/shared/design-tokens.css
Normal file
|
|
@ -0,0 +1,248 @@
|
|||
/**
|
||||
* Hub × FluxUI — Gemeinsame Design-Tokens (Single Source of Truth)
|
||||
*
|
||||
* Diese Datei ist die EINZIGE Quelle für Hub-Farben, Fonts, Radii und
|
||||
* Schatten. Sowohl der Web-Build (Hub-Landing, Hub-Auth) als auch der
|
||||
* Portal-Build (User-Panel, Admin-Bereich) importieren diese Datei.
|
||||
*
|
||||
* Konventionen:
|
||||
* - Token-Names sind STABIL. Werte können sich ändern (z.B. Dark Mode),
|
||||
* Namen nicht.
|
||||
* - Light Mode ist Default. Dark Mode kommt in Phase 5.
|
||||
* - FluxUI-Akzent-Variablen (--color-accent, --color-accent-*) werden
|
||||
* in portal.css mit unseren Hub-Werten gebridged, nicht hier.
|
||||
*
|
||||
* Dokumentation: dev/frontend/hub-flux/README.md
|
||||
* dev/frontend/hub-flux/01-PHASE-0-TOKENS.md
|
||||
*/
|
||||
|
||||
@theme {
|
||||
/* =========================================================
|
||||
* SURFACES — warmes Buchpapier, gemeinsame Familie
|
||||
* ========================================================= */
|
||||
--color-bg: #f6f4ef;
|
||||
--color-bg-elev: #fbfaf6;
|
||||
--color-bg-rule: #e2ddd0;
|
||||
--color-bg-rule-2: #ede7d7; /* leicht hellere Variante für Progress-Tracks */
|
||||
--color-bg-rule-strong: #1a1f1c;
|
||||
--color-bg-dark: #15201a;
|
||||
--color-bg-card: #ffffff;
|
||||
--color-bg-card-warm: #efeadc;
|
||||
--color-bg-card-warm-border: #d6cfbb;
|
||||
--color-bg-card-warm-hover: #e6deca;
|
||||
--color-bg-card-warm-rule: #c8bda3;
|
||||
|
||||
/* =========================================================
|
||||
* HUB-BLAU — primärer Akzent, plattform-neutral
|
||||
* Klarer Kontrast zum hellen Buchpapier-Hintergrund.
|
||||
* ========================================================= */
|
||||
--color-hub: #1a2540;
|
||||
--color-hub-2: #243152;
|
||||
--color-hub-3: #2e3d66;
|
||||
--color-hub-soft: #e5e9f1;
|
||||
--color-hub-soft-2: #cfd6e4;
|
||||
--color-hub-line: #7b8fbf;
|
||||
|
||||
/* Topbar-Aliase für Hub-Gradient */
|
||||
--color-topbar: #1a2540;
|
||||
--color-topbar2: #243152;
|
||||
--color-topbar-deep: #0f1729;
|
||||
|
||||
/* =========================================================
|
||||
* AKZENT — gedecktes Bernstein (sekundärer Akzent)
|
||||
* Bewusst NICHT Orange (BP24) und NICHT Grün (Presseecho).
|
||||
* Im Portal für: Notifications, Datenqualität, Empfehlungs-Ribbons.
|
||||
*
|
||||
* Wichtige Trennung (Phase 5 / Dark Mode):
|
||||
* --color-accent — heller Akzent (Light: Bernstein, Dark: heller Bernstein).
|
||||
* In portal.css wird das auf var(--color-hub) umgebogen,
|
||||
* weil FluxUI-Primary-Buttons das nutzen.
|
||||
* --color-accent-warm — KONSTANTER Bernstein (gleicher Wert in beiden Modi).
|
||||
* Für Hint-Card-Border, Schritt-Karten-Eyebrows
|
||||
* und alle Stellen, die explizit Bernstein sein müssen.
|
||||
* --color-accent-deep — gedämpfter Bernstein für Action-Links.
|
||||
* ========================================================= */
|
||||
--color-accent: #b07a3a;
|
||||
--color-accent-deep: #8a5e27;
|
||||
--color-accent-soft: #f1e6d3;
|
||||
--color-accent-warm: #b07a3a;
|
||||
|
||||
/* =========================================================
|
||||
* PANEL-DARK — KONSTANTES dunkles Hub-Blau (in beiden Modi).
|
||||
* Wird von `.panel-dark` und der Brand-Bridge genutzt; soll im
|
||||
* Dark Mode NICHT hell werden, sondern immer dunkel bleiben.
|
||||
* Im Hub-Frontend (Light-Only) zeigt's die gleiche Atmosphäre.
|
||||
* ========================================================= */
|
||||
--color-panel-dark: #0f1729;
|
||||
--color-panel-dark-2: #1a2540;
|
||||
|
||||
/* =========================================================
|
||||
* INK — Anthrazit-Reihe für Text & Linien
|
||||
* ========================================================= */
|
||||
--color-ink: #1a1f1c;
|
||||
--color-ink-2: #3a413d;
|
||||
--color-ink-3: #5a6360;
|
||||
--color-ink-4: #8a918d;
|
||||
--color-ink-on-dark: #f6f4ef;
|
||||
--color-ink-on-dark-2: #b2b9c7;
|
||||
--color-ink-on-dark-3: #7b8fbf;
|
||||
--color-ink-on-dark-muted: #7b8fbf;
|
||||
--color-ink-on-dark-rule: #2a3550;
|
||||
|
||||
/* =========================================================
|
||||
* BRAND-ALIASE für Komponenten, die brand-Tokens nutzen
|
||||
* ========================================================= */
|
||||
--color-brand: #1a2540;
|
||||
--color-brand-deep: #0f1729;
|
||||
--color-brand-soft: #e5e9f1;
|
||||
|
||||
/* =========================================================
|
||||
* STATUS — Erfolg, Warnung, Fehler, Live
|
||||
* Identische Namen wie das User-Dashboard-Mockup verwendet.
|
||||
* ========================================================= */
|
||||
--color-ok: #2e8540;
|
||||
--color-ok-soft: #e2f1e5;
|
||||
--color-warn: #a87a1f;
|
||||
--color-warn-soft: #f6eac8;
|
||||
--color-err: #a8331f;
|
||||
--color-err-soft: #f4dad2;
|
||||
--color-live: #c84a1e;
|
||||
--color-gain: #2e8540;
|
||||
--color-gain-deep: #1f5e2e;
|
||||
--color-loss: #c8341e;
|
||||
|
||||
/* =========================================================
|
||||
* EDITORIAL — für Card-Warm-Sektionen
|
||||
* ========================================================= */
|
||||
--color-card-warm-cat: #5a6360;
|
||||
--color-card-warm-title: #2a302d;
|
||||
--color-feature-line: #c0c8db;
|
||||
--color-feature-dot: #d8dde9;
|
||||
|
||||
/* =========================================================
|
||||
* BRIDGE-DOTS — kleine farbige Punkte für presseecho /
|
||||
* businessportal24 in Brücken-Anzeigen (Sidebar, Topbar,
|
||||
* Bridge-Cards). Werte aus dem User-Dashboard-Mockup.
|
||||
* ========================================================= */
|
||||
--color-bridge-presseecho: #1f4d3a;
|
||||
--color-bridge-businessportal: #c84a1e;
|
||||
|
||||
/* =========================================================
|
||||
* FONTS — Hub: Inter Tight + JetBrains Mono.
|
||||
* Source Serif 4 wird im Hub für die Markennennungen der
|
||||
* Tochter-Portale (presseecho, businessportal24) verwendet;
|
||||
* im Portal nur für Brand-Mark, falls überhaupt.
|
||||
* ========================================================= */
|
||||
--font-sans:
|
||||
"Inter Tight", Inter, system-ui, -apple-system, BlinkMacSystemFont,
|
||||
"Segoe UI", sans-serif;
|
||||
--font-serif:
|
||||
"Source Serif 4", "Source Serif Pro", Charter, "Iowan Old Style",
|
||||
Georgia, serif;
|
||||
--font-mono:
|
||||
"JetBrains Mono", "SF Mono", ui-monospace, SFMono-Regular, Menlo,
|
||||
Consolas, monospace;
|
||||
|
||||
/* =========================================================
|
||||
* LAYOUT
|
||||
* ========================================================= */
|
||||
--container-layout: 1280px;
|
||||
|
||||
/* =========================================================
|
||||
* RADII — kleines Set, am Mockup orientiert
|
||||
* ========================================================= */
|
||||
--radius-xs: 3px;
|
||||
--radius-sm: 4px;
|
||||
--radius-md: 6px;
|
||||
--radius-lg: 8px;
|
||||
|
||||
/* =========================================================
|
||||
* SCHATTEN — weich, warm-getönt
|
||||
* ========================================================= */
|
||||
--shadow-soft: 0 1px 0 rgba(26, 31, 28, 0.03);
|
||||
--shadow-card: 0 1px 2px 0 rgb(26 37 64 / 0.06);
|
||||
--shadow-card-hover: 0 4px 12px -2px rgb(26 37 64 / 0.12);
|
||||
--shadow-auth:
|
||||
0 1px 0 rgba(26, 31, 28, 0.03),
|
||||
0 20px 50px -32px rgba(26, 37, 64, 0.28);
|
||||
}
|
||||
|
||||
/* =========================================================
|
||||
* DARK MODE — Phase 5 AKTIV.
|
||||
* Werte aus dev/frontend/tailwind_v3/User Dashboard presseportale Dark.html.
|
||||
* Aktivierung über `.dark` (FluxUI Appearance-Switcher setzt das auf <html>).
|
||||
*
|
||||
* Konventionen:
|
||||
* - Gleiche Token-Namen wie Light Mode (Single Source of Truth).
|
||||
* - `--color-accent-warm`, `--color-panel-dark*` bleiben KONSTANT
|
||||
* (siehe Begründungen oben im Light-Block).
|
||||
* - Hub-Frontend (Landing + Auth) lädt KEIN `@fluxAppearance` und
|
||||
* bleibt damit immer Light. Nur Portal-Seiten schalten um.
|
||||
* ========================================================= */
|
||||
.dark {
|
||||
/* Surfaces */
|
||||
--color-bg: #0e1218;
|
||||
--color-bg-elev: #14181f;
|
||||
--color-bg-rule: #2a3142;
|
||||
--color-bg-rule-2: #232838;
|
||||
--color-bg-rule-strong: #ece9e0;
|
||||
--color-bg-card: #181d27;
|
||||
--color-bg-card-warm: #1f1a12;
|
||||
|
||||
/* Hub-Blau (im Dark Mode HELLER für Lesbarkeit auf dunklem Bg) */
|
||||
--color-hub: #5a78c2;
|
||||
--color-hub-2: #6d8ad3;
|
||||
--color-hub-3: #4a65a8;
|
||||
--color-hub-soft: #1f2a47;
|
||||
--color-hub-soft-2: #2c3a5d;
|
||||
--color-hub-line: #7b8fbf;
|
||||
|
||||
/* Bernstein — heller Akzent (warm-Token bleibt konstant) */
|
||||
--color-accent: #d9a560;
|
||||
--color-accent-deep: #b07a3a;
|
||||
--color-accent-soft: #2a2418;
|
||||
/* --color-accent-warm: konstant #b07a3a (aus Light geerbt) */
|
||||
|
||||
/* Ink */
|
||||
--color-ink: #ece9e0;
|
||||
--color-ink-2: #c9c5b8;
|
||||
--color-ink-3: #8e8b82;
|
||||
--color-ink-4: #5d5c57;
|
||||
|
||||
/* Brand-Aliase */
|
||||
--color-brand: #5a78c2;
|
||||
--color-brand-deep: #4a65a8;
|
||||
--color-brand-soft: #1f2a47;
|
||||
|
||||
/* Status */
|
||||
--color-ok: #4dc076;
|
||||
--color-ok-soft: #1a2d22;
|
||||
--color-warn: #d9a560;
|
||||
--color-warn-soft: #2d2418;
|
||||
--color-err: #e07664;
|
||||
--color-err-soft: #2e1715;
|
||||
--color-gain: #4dc076;
|
||||
--color-gain-deep: #3aa060;
|
||||
--color-loss: #e07664;
|
||||
|
||||
/* Bridge-Dots heller für Dark-Bg */
|
||||
--color-bridge-presseecho: #4da37a;
|
||||
--color-bridge-businessportal: #e36340;
|
||||
|
||||
/* Editorial */
|
||||
--color-card-warm-cat: #8e8b82;
|
||||
--color-card-warm-title: #ece9e0;
|
||||
--color-feature-line: #2c3a5d;
|
||||
--color-feature-dot: #2a3142;
|
||||
|
||||
/* Schatten — im Dark Mode neutral schwarz statt hub-blau-warm */
|
||||
--shadow-soft: 0 1px 0 rgba(0, 0, 0, 0.4);
|
||||
--shadow-card: 0 1px 2px 0 rgba(0, 0, 0, 0.4);
|
||||
--shadow-card-hover: 0 4px 12px -2px rgba(0, 0, 0, 0.55);
|
||||
--shadow-auth:
|
||||
0 1px 0 rgba(0, 0, 0, 0.5),
|
||||
0 20px 50px -32px rgba(0, 0, 0, 0.7);
|
||||
|
||||
/* color-scheme-Hint für native Form-Controls (Scrollbars, Inputs) */
|
||||
color-scheme: dark;
|
||||
}
|
||||
340
resources/css/shared/hub-components.css
Normal file
340
resources/css/shared/hub-components.css
Normal file
|
|
@ -0,0 +1,340 @@
|
|||
/**
|
||||
* Hub-Components — Single Source of Truth für Hub-typische Layout-Bausteine
|
||||
*
|
||||
* Wird von BEIDEN Builds importiert:
|
||||
* - resources/css/portal.css (FluxUI-Portal)
|
||||
* - resources/css/web/shared-styles.css (Web/Hub-Frontend)
|
||||
*
|
||||
* Dadurch DRY für Customer-Dashboard (Phase 2), Admin-Dashboard (Phase 3),
|
||||
* Listen/Detail-Pages (Phase 4) und perspektivisch auch die Hub-Landing.
|
||||
*
|
||||
* Tokens kommen aus shared/design-tokens.css — diese Datei darf KEINE
|
||||
* Hex-Literale enthalten (außer wo bewusst alpha-overlays via `rgba`
|
||||
* gegen White/Black gerechnet werden).
|
||||
*
|
||||
* Vorlage: dev/frontend/tailwind_v3/User Dashboard presseportale.html
|
||||
* Dokumentation: dev/frontend/hub-flux/04-PHASE-2-CUSTOMER-DASHBOARD.md
|
||||
*/
|
||||
|
||||
@layer components {
|
||||
/* ============================================================
|
||||
* Panels (Karten-Container mit Hub-Charakter)
|
||||
* ============================================================ */
|
||||
|
||||
.panel {
|
||||
background: var(--color-bg-card);
|
||||
border: 1px solid var(--color-bg-rule);
|
||||
border-radius: 6px;
|
||||
}
|
||||
.panel-warm {
|
||||
background: var(--color-bg-elev);
|
||||
border: 1px solid var(--color-bg-rule);
|
||||
border-radius: 6px;
|
||||
}
|
||||
.panel-dark {
|
||||
/* KONSTANTES Dark-Hub-Blau — bleibt auch im Dark Mode dunkel
|
||||
(sonst würde `var(--color-hub)` zum hellen #5a78c2 werden).
|
||||
Tokens `--color-panel-dark` und `--color-panel-dark-2` sind
|
||||
in beiden Modi identisch. */
|
||||
background: var(--color-panel-dark-2);
|
||||
border: 1px solid var(--color-panel-dark);
|
||||
border-radius: 6px;
|
||||
color: var(--color-ink-on-dark);
|
||||
}
|
||||
|
||||
.panel-head {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 12px;
|
||||
padding: 14px 20px;
|
||||
border-bottom: 1px solid var(--color-bg-rule);
|
||||
}
|
||||
.panel-dark .panel-head {
|
||||
border-bottom-color: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* Stat-Cards (KPI-Karten mit farbigem Strip links)
|
||||
* ============================================================ */
|
||||
|
||||
.stat-card {
|
||||
position: relative;
|
||||
background: var(--color-bg-card);
|
||||
border: 1px solid var(--color-bg-rule);
|
||||
border-radius: 6px;
|
||||
padding: 18px 20px;
|
||||
transition:
|
||||
border-color 0.12s,
|
||||
box-shadow 0.12s;
|
||||
}
|
||||
.stat-card .stat-strip {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
width: 3px;
|
||||
background: var(--color-hub-soft-2);
|
||||
border-radius: 6px 0 0 6px;
|
||||
}
|
||||
.stat-card.is-primary .stat-strip {
|
||||
background: var(--color-hub);
|
||||
}
|
||||
.stat-card.is-ok .stat-strip {
|
||||
background: var(--color-ok);
|
||||
}
|
||||
.stat-card.is-warn .stat-strip {
|
||||
background: var(--color-warn);
|
||||
}
|
||||
.stat-card.is-muted .stat-strip {
|
||||
background: var(--color-ink-4);
|
||||
}
|
||||
|
||||
.stat-label {
|
||||
font-size: 10.5px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.16em;
|
||||
text-transform: uppercase;
|
||||
color: var(--color-ink-3);
|
||||
}
|
||||
.stat-card.is-primary .stat-label {
|
||||
color: var(--color-hub);
|
||||
}
|
||||
.stat-card.is-ok .stat-label {
|
||||
color: var(--color-ok);
|
||||
}
|
||||
.stat-card.is-warn .stat-label {
|
||||
color: var(--color-warn);
|
||||
}
|
||||
.stat-card.is-muted .stat-label {
|
||||
color: var(--color-ink-4);
|
||||
}
|
||||
|
||||
.stat-num {
|
||||
font-family: var(--font-mono);
|
||||
font-variant-numeric: tabular-nums;
|
||||
font-size: 36px;
|
||||
font-weight: 600;
|
||||
color: var(--color-ink);
|
||||
letter-spacing: -0.5px;
|
||||
line-height: 1;
|
||||
margin-top: 14px;
|
||||
}
|
||||
.stat-card.is-ok .stat-num {
|
||||
color: var(--color-ok);
|
||||
}
|
||||
.stat-card.is-warn .stat-num {
|
||||
color: var(--color-warn);
|
||||
}
|
||||
.stat-card.is-muted .stat-num {
|
||||
color: var(--color-ink-3);
|
||||
}
|
||||
|
||||
.stat-meta {
|
||||
font-family: var(--font-mono);
|
||||
font-size: 10.5px;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.14em;
|
||||
text-transform: uppercase;
|
||||
color: var(--color-ink-3);
|
||||
}
|
||||
|
||||
.stat-trend {
|
||||
margin-top: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-size: 11.5px;
|
||||
color: var(--color-ink-3);
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* Hint-Cards (Datenqualitäts-Hinweise mit Progress-Bar)
|
||||
* ============================================================ */
|
||||
|
||||
.hint-card {
|
||||
display: grid;
|
||||
gap: 14px;
|
||||
grid-template-columns: auto 1fr;
|
||||
align-items: start;
|
||||
/* Im Light Mode warmes Buchpapier-elev; im Dark Mode der wärmere
|
||||
Card-Ton (`--color-bg-card-warm` schaltet automatisch um). */
|
||||
background: var(--color-bg-card-warm);
|
||||
border: 1px solid var(--color-bg-rule);
|
||||
/* `--color-accent-warm` bleibt KONSTANT Bernstein (Phase 5):
|
||||
Im Portal mappt --color-accent auf Hub-Blau, hier wollen wir
|
||||
aber den klassischen Bernstein-Border behalten. */
|
||||
border-left: 3px solid var(--color-accent-warm);
|
||||
border-radius: 5px;
|
||||
padding: 16px 18px;
|
||||
}
|
||||
.hint-card .hint-ico {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
border-radius: 4px;
|
||||
background: var(--color-accent-soft);
|
||||
color: var(--color-accent-deep);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.hint-card .hint-bar {
|
||||
margin-top: 8px;
|
||||
height: 4px;
|
||||
width: 100%;
|
||||
border-radius: 999px;
|
||||
background: var(--color-bg-rule-2);
|
||||
overflow: hidden;
|
||||
}
|
||||
.hint-card .hint-bar > span {
|
||||
display: block;
|
||||
height: 100%;
|
||||
border-radius: 999px;
|
||||
background: var(--color-accent-warm);
|
||||
}
|
||||
.hint-card .hint-action {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
margin-top: 8px;
|
||||
font-size: 11.5px;
|
||||
font-weight: 600;
|
||||
color: var(--color-accent-deep);
|
||||
text-decoration: none;
|
||||
text-underline-offset: 3px;
|
||||
}
|
||||
.hint-card .hint-action:hover {
|
||||
text-decoration: underline;
|
||||
text-decoration-color: color-mix(
|
||||
in oklab,
|
||||
var(--color-accent-deep),
|
||||
transparent 60%
|
||||
);
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* Badges (Status-Pillen)
|
||||
* ============================================================ */
|
||||
|
||||
.badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
padding: 3px 9px;
|
||||
border-radius: 999px;
|
||||
font-size: 10.5px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.1em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.badge.warn {
|
||||
background: var(--color-warn-soft);
|
||||
color: var(--color-accent-deep);
|
||||
}
|
||||
.badge.ok {
|
||||
background: var(--color-ok-soft);
|
||||
color: var(--color-gain-deep);
|
||||
}
|
||||
.badge.hub {
|
||||
background: var(--color-hub-soft);
|
||||
color: var(--color-hub);
|
||||
}
|
||||
.badge.err {
|
||||
background: var(--color-err-soft);
|
||||
color: var(--color-loss);
|
||||
}
|
||||
.badge.dot::before {
|
||||
content: "";
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
border-radius: 999px;
|
||||
background: currentColor;
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* Brand-Bridge (presseecho + businessportal24 Indikatoren)
|
||||
* ============================================================ */
|
||||
|
||||
.bridge-row {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
font-family: var(--font-mono);
|
||||
font-size: 10.5px;
|
||||
letter-spacing: 0.1em;
|
||||
text-transform: uppercase;
|
||||
color: var(--color-ink-3);
|
||||
}
|
||||
.dot-pe {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
border-radius: 999px;
|
||||
background: var(--color-bridge-presseecho);
|
||||
}
|
||||
.dot-bp {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
border-radius: 999px;
|
||||
background: var(--color-bridge-businessportal);
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* Section-Eyebrow VARIANTE (für panel-head)
|
||||
* ============================================================
|
||||
* Die Basis-`.section-eyebrow` liegt in theme-pressekonto.css.
|
||||
* Im Portal-Bundle haben wir die Klasse heute NOCH NICHT — hier
|
||||
* eine portable Definition, die im Web-Build vom Original-Layer
|
||||
* überschrieben wird (gleiche Werte → idempotent).
|
||||
*/
|
||||
.section-eyebrow {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
font-size: 10.5px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.22em;
|
||||
text-transform: uppercase;
|
||||
color: var(--color-hub);
|
||||
}
|
||||
.section-eyebrow::after {
|
||||
content: "";
|
||||
display: block;
|
||||
width: 30px;
|
||||
height: 1px;
|
||||
background: var(--color-hub);
|
||||
opacity: 0.45;
|
||||
}
|
||||
.section-eyebrow.on-dark {
|
||||
color: var(--color-hub-line);
|
||||
}
|
||||
.section-eyebrow.on-dark::after {
|
||||
background: var(--color-hub-line);
|
||||
opacity: 0.55;
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* Eyebrow VARIANTE (für Portal)
|
||||
* ============================================================
|
||||
* Basis liegt in theme-pressekonto.css. Hier portabel für Portal-Build.
|
||||
*/
|
||||
.eyebrow {
|
||||
font-size: 11px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.2em;
|
||||
text-transform: uppercase;
|
||||
color: var(--color-hub);
|
||||
}
|
||||
.eyebrow.muted {
|
||||
color: var(--color-ink-3);
|
||||
letter-spacing: 0.16em;
|
||||
font-weight: 600;
|
||||
font-size: 10.5px;
|
||||
}
|
||||
.eyebrow.accent {
|
||||
color: var(--color-accent-deep);
|
||||
}
|
||||
.eyebrow.on-dark {
|
||||
color: var(--color-hub-line);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,14 +1,24 @@
|
|||
/**
|
||||
* Gemeinsame Styles für alle Frontend-Themes
|
||||
* Diese Datei wird von allen Web-Themes importiert
|
||||
*
|
||||
* Hub × FluxUI: Seit Phase 0 leben die Design-Tokens (Farben, Fonts,
|
||||
* Radii, Schatten) zentral in resources/css/shared/design-tokens.css.
|
||||
* Wir importieren sie hier — damit kommen sie automatisch in jedes
|
||||
* Web-Theme (theme-pressekonto.css, theme-presseecho.css,
|
||||
* theme-businessportal24.css).
|
||||
*/
|
||||
@import "tailwindcss";
|
||||
@import "../shared/design-tokens.css";
|
||||
@import "../shared/hub-components.css";
|
||||
|
||||
/* Definiere wo Tailwind nach Klassen suchen soll */
|
||||
@source "../../views/web";
|
||||
@source "../../views/layouts/web";
|
||||
@source "../../views/livewire/web";
|
||||
@source "../../views/components/web";
|
||||
@source "../../views/livewire/auth";
|
||||
@source "../../views/components/layouts/auth";
|
||||
|
||||
/* Tailwind Base Layer für gemeinsame Elemente */
|
||||
@layer base {
|
||||
|
|
|
|||
|
|
@ -21,8 +21,8 @@
|
|||
--color-bg-dark: #15201a;
|
||||
--color-bg-card-warm: #ecefe3;
|
||||
--color-bg-card-warm-border: #c7cfb6;
|
||||
--color-topbar: #1a3d2e; /* moderat heller als #1b2a1f, aber dunkler als #1f4d3a */
|
||||
--color-topbar2: #122d22; /* analog moderat heller als #25342a */
|
||||
--color-topbar: #112d20; /* Brand-Manual: satter Forest-Verlauf für die Topbar */
|
||||
--color-topbar2: #081b13; /* Brand-Manual: tieferer Forest-Endpunkt */
|
||||
|
||||
/* Ink */
|
||||
--color-ink: #1b2417;
|
||||
|
|
|
|||
484
resources/css/web/theme-pressekonto.css
Normal file
484
resources/css/web/theme-pressekonto.css
Normal file
|
|
@ -0,0 +1,484 @@
|
|||
/**
|
||||
* Theme für den Publisher-Hub pressekonto.de (pressekonto.test)
|
||||
*
|
||||
* Charakter:
|
||||
* - Surface: warmes Buchpapier (gleiche Familie wie BP24/Presseecho)
|
||||
* - Primary: Hub-Blau (#1A2540) – seriös, plattform-neutral
|
||||
* - Accent: gedecktes Bernstein (#B07A3A) – bewusst NICHT Orange (BP24) und NICHT Grün (Presseecho)
|
||||
* - Schrift: Inter Tight + JetBrains Mono
|
||||
*
|
||||
* Tokens (Farben, Fonts, Radii, Schatten) leben seit Phase 0 in
|
||||
* resources/css/shared/design-tokens.css als Single Source of Truth
|
||||
* — sie werden via shared-styles.css → design-tokens.css importiert.
|
||||
*
|
||||
* Hier nur noch:
|
||||
* - HSL-Variablen für Legacy-Komponenten (shared-styles)
|
||||
* - @layer components { … } mit Hub-spezifischen Klassen
|
||||
* (Eyebrows, Hero-Grid, Auth-Felder, FAQ-Accordion, …)
|
||||
*
|
||||
* Dokumentation: dev/frontend/hub-flux/01-PHASE-0-TOKENS.md
|
||||
*/
|
||||
@import "./shared-styles.css";
|
||||
|
||||
/* HSL-Variablen für Legacy-Komponenten (shared-styles) */
|
||||
:root {
|
||||
--font-primary: var(--font-sans);
|
||||
--font-secondary: var(--font-sans);
|
||||
|
||||
--background: 40 30% 95%; /* #f6f4ef */
|
||||
--foreground: 144 8% 11%;
|
||||
--card: 0 0% 100%;
|
||||
--card-foreground: 144 8% 11%;
|
||||
--popover: 0 0% 100%;
|
||||
--popover-foreground: 144 8% 11%;
|
||||
|
||||
/* Primary: #1A2540 -> hsl(222, 43%, 18%) */
|
||||
--primary: 222 43% 18%;
|
||||
--primary-foreground: 0 0% 100%;
|
||||
--primary-50: 222 43% 96%;
|
||||
--primary-100: 222 43% 92%;
|
||||
--primary-200: 222 43% 85%;
|
||||
--primary-300: 222 43% 75%;
|
||||
--primary-400: 222 43% 60%;
|
||||
--primary-500: 222 43% 45%;
|
||||
--primary-600: 222 43% 36%;
|
||||
--primary-700: 222 43% 28%;
|
||||
--primary-800: 222 43% 22%;
|
||||
--primary-900: 222 43% 18%;
|
||||
--primary-950: 222 43% 12%;
|
||||
|
||||
--secondary: 224 30% 30%;
|
||||
--secondary-foreground: 0 0% 100%;
|
||||
|
||||
--muted: 40 18% 90%;
|
||||
--muted-foreground: 144 6% 38%;
|
||||
--accent: 31 51% 46%;
|
||||
--accent-foreground: 0 0% 100%;
|
||||
--destructive: 0 84% 60%;
|
||||
--destructive-foreground: 0 0% 100%;
|
||||
--border: 38 23% 85%;
|
||||
--input: 38 23% 85%;
|
||||
--ring: 222 43% 18%;
|
||||
--radius: 4px;
|
||||
|
||||
--shadow-card: 0 1px 2px 0 rgb(26 37 64 / 0.06);
|
||||
--shadow-card-hover: 0 4px 12px -2px rgb(26 37 64 / 0.12);
|
||||
}
|
||||
|
||||
@layer base {
|
||||
html,
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #e8e4da;
|
||||
color: var(--color-ink);
|
||||
font-family: var(--font-sans);
|
||||
-webkit-font-smoothing: antialiased;
|
||||
font-feature-settings: "ss01", "cv11";
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4 {
|
||||
font-family: var(--font-sans);
|
||||
color: inherit;
|
||||
letter-spacing: -0.01em;
|
||||
}
|
||||
|
||||
.font-mono {
|
||||
font-family: var(--font-mono);
|
||||
font-feature-settings: "tnum";
|
||||
}
|
||||
}
|
||||
|
||||
@layer components {
|
||||
/* Hub-Eyebrow — sperrgesetzt, in Hub-Blau */
|
||||
.eyebrow {
|
||||
font-size: 11px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.2em;
|
||||
text-transform: uppercase;
|
||||
color: var(--color-hub);
|
||||
}
|
||||
.eyebrow.muted {
|
||||
color: var(--color-ink-3);
|
||||
letter-spacing: 0.16em;
|
||||
font-weight: 600;
|
||||
font-size: 10.5px;
|
||||
}
|
||||
.eyebrow.accent {
|
||||
color: var(--color-accent-deep);
|
||||
}
|
||||
.eyebrow.on-dark {
|
||||
color: var(--color-hub-line);
|
||||
}
|
||||
|
||||
/* Section-Eyebrow mit kurzem Linien-Schwanz */
|
||||
.section-eyebrow {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
font-size: 11px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.22em;
|
||||
text-transform: uppercase;
|
||||
color: var(--color-hub);
|
||||
}
|
||||
.section-eyebrow::after {
|
||||
content: "";
|
||||
display: block;
|
||||
width: 42px;
|
||||
height: 1px;
|
||||
background: var(--color-hub);
|
||||
opacity: 0.45;
|
||||
}
|
||||
.section-eyebrow.on-dark {
|
||||
color: var(--color-hub-line);
|
||||
}
|
||||
.section-eyebrow.on-dark::after {
|
||||
background: var(--color-hub-line);
|
||||
opacity: 0.55;
|
||||
}
|
||||
|
||||
.rule {
|
||||
height: 1px;
|
||||
background: var(--color-bg-rule);
|
||||
border: 0;
|
||||
margin: 0;
|
||||
}
|
||||
.rule-strong {
|
||||
height: 1px;
|
||||
background: var(--color-bg-rule-strong);
|
||||
border: 0;
|
||||
margin: 0;
|
||||
}
|
||||
.rule-hub {
|
||||
height: 2px;
|
||||
background: var(--color-hub);
|
||||
border: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* Subtile geometrische Hintergrundlinien fürs Hero */
|
||||
.hero-grid {
|
||||
background-image:
|
||||
linear-gradient(
|
||||
to right,
|
||||
rgba(26, 37, 64, 0.04) 1px,
|
||||
transparent 1px
|
||||
),
|
||||
linear-gradient(
|
||||
to bottom,
|
||||
rgba(26, 37, 64, 0.04) 1px,
|
||||
transparent 1px
|
||||
);
|
||||
background-size: 48px 48px;
|
||||
background-position: -1px -1px;
|
||||
}
|
||||
|
||||
/* Hub-Gradient-Klassen */
|
||||
.bg-hub-grad {
|
||||
background-image: linear-gradient(
|
||||
135deg,
|
||||
var(--color-hub) 0%,
|
||||
var(--color-hub-2) 100%
|
||||
);
|
||||
}
|
||||
.bg-hub-grad-2 {
|
||||
background-image: linear-gradient(
|
||||
180deg,
|
||||
var(--color-hub) 0%,
|
||||
var(--color-topbar-deep) 100%
|
||||
);
|
||||
}
|
||||
.bg-accent-grad {
|
||||
background-image: linear-gradient(
|
||||
135deg,
|
||||
var(--color-accent) 0%,
|
||||
var(--color-accent-deep) 100%
|
||||
);
|
||||
}
|
||||
.bg-topbar-grad {
|
||||
background-image: linear-gradient(
|
||||
135deg,
|
||||
var(--color-topbar) 0%,
|
||||
var(--color-topbar2) 100%
|
||||
);
|
||||
}
|
||||
|
||||
/* Empfohlen-Ribbon auf Tarif-Karten */
|
||||
.ribbon-recommend {
|
||||
position: absolute;
|
||||
top: -1px;
|
||||
left: -1px;
|
||||
right: -1px;
|
||||
background: var(--color-hub);
|
||||
color: #fff;
|
||||
font-size: 10.5px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.18em;
|
||||
text-transform: uppercase;
|
||||
text-align: center;
|
||||
padding: 8px 0;
|
||||
}
|
||||
|
||||
/* Accordion-Pfeil (FAQ) */
|
||||
details > summary {
|
||||
list-style: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
details > summary::-webkit-details-marker {
|
||||
display: none;
|
||||
}
|
||||
details[open] .faq-chev {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
.faq-chev {
|
||||
transition: transform 0.2s ease;
|
||||
}
|
||||
|
||||
/*
|
||||
* Auth-Seiten (Anmelden, Registrieren, Passwort zurücksetzen, …)
|
||||
* — Konsistente Felder, Buttons und Atmosphäre für den Publisher-Hub
|
||||
*/
|
||||
|
||||
/* Hintergrund-Raster (Atmosphäre) */
|
||||
.auth-grid {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background-image:
|
||||
linear-gradient(
|
||||
to right,
|
||||
rgba(26, 37, 64, 0.045) 1px,
|
||||
transparent 1px
|
||||
),
|
||||
linear-gradient(
|
||||
to bottom,
|
||||
rgba(26, 37, 64, 0.045) 1px,
|
||||
transparent 1px
|
||||
);
|
||||
background-size: 56px 56px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
/* From=portal Banner über der Auth-Card */
|
||||
.from-banner {
|
||||
background: #ffffff;
|
||||
border: 1px solid var(--color-bg-rule);
|
||||
border-left: 2px solid var(--color-hub);
|
||||
border-radius: 4px;
|
||||
padding: 8px 14px;
|
||||
font-size: 12px;
|
||||
color: var(--color-ink-2);
|
||||
}
|
||||
|
||||
/* Auth-Card mit weicher, fokussierender Schatten-Glocke */
|
||||
.auth-card {
|
||||
background: var(--color-bg-card);
|
||||
border: 1px solid var(--color-bg-rule);
|
||||
border-radius: 8px;
|
||||
padding: 34px 36px 32px;
|
||||
box-shadow:
|
||||
0 1px 0 rgba(26, 31, 28, 0.03),
|
||||
0 20px 50px -32px rgba(26, 37, 64, 0.28);
|
||||
}
|
||||
|
||||
/* Eyebrow & Link in Hub-Blau für Auth-Kontext */
|
||||
.eyebrow-hub {
|
||||
font-size: 10.5px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.22em;
|
||||
text-transform: uppercase;
|
||||
color: var(--color-hub);
|
||||
}
|
||||
.link-hub {
|
||||
color: var(--color-hub);
|
||||
font-weight: 600;
|
||||
text-decoration: none;
|
||||
text-underline-offset: 3px;
|
||||
}
|
||||
.link-hub:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Input-Felder */
|
||||
.field-label {
|
||||
display: block;
|
||||
font-size: 12.5px;
|
||||
font-weight: 600;
|
||||
color: var(--color-ink);
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
.field-input {
|
||||
width: 100%;
|
||||
background: #ffffff;
|
||||
border: 1px solid var(--color-bg-rule);
|
||||
border-radius: 6px;
|
||||
padding: 11px 13px;
|
||||
font-size: 14px;
|
||||
color: var(--color-ink);
|
||||
outline: none;
|
||||
transition:
|
||||
border-color 0.15s,
|
||||
box-shadow 0.15s,
|
||||
background 0.15s;
|
||||
font-family: inherit;
|
||||
}
|
||||
.field-input::placeholder {
|
||||
color: var(--color-ink-4);
|
||||
}
|
||||
.field-input:hover {
|
||||
border-color: #cfc8b5;
|
||||
}
|
||||
.field-input:focus {
|
||||
border-color: var(--color-hub);
|
||||
box-shadow: 0 0 0 3px rgba(26, 37, 64, 0.1);
|
||||
}
|
||||
.field-input[aria-invalid="true"],
|
||||
.field-input.is-invalid {
|
||||
border-color: var(--color-loss);
|
||||
}
|
||||
|
||||
/* Passwort-Feld mit „Anzeigen“-Button */
|
||||
.field-pw-wrap {
|
||||
position: relative;
|
||||
}
|
||||
.field-affix {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
right: 10px;
|
||||
transform: translateY(-50%);
|
||||
color: var(--color-ink-3);
|
||||
font-size: 11.5px;
|
||||
font-weight: 600;
|
||||
background: transparent;
|
||||
border: 0;
|
||||
cursor: pointer;
|
||||
padding: 4px 6px;
|
||||
border-radius: 3px;
|
||||
font-family: inherit;
|
||||
}
|
||||
.field-affix:hover {
|
||||
color: var(--color-hub);
|
||||
background: var(--color-bg);
|
||||
}
|
||||
|
||||
/* Checkbox */
|
||||
.auth-check {
|
||||
appearance: none;
|
||||
-webkit-appearance: none;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
border: 1.5px solid #cfc8b5;
|
||||
border-radius: 3px;
|
||||
background: #ffffff;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
flex-shrink: 0;
|
||||
transition:
|
||||
border-color 0.12s,
|
||||
background 0.12s;
|
||||
margin: 0;
|
||||
}
|
||||
.auth-check:hover {
|
||||
border-color: var(--color-hub);
|
||||
}
|
||||
.auth-check:checked {
|
||||
background: var(--color-hub);
|
||||
border-color: var(--color-hub);
|
||||
}
|
||||
.auth-check:checked::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 4px;
|
||||
top: 1px;
|
||||
width: 5px;
|
||||
height: 9px;
|
||||
border: solid #fff;
|
||||
border-width: 0 1.8px 1.8px 0;
|
||||
transform: rotate(42deg);
|
||||
}
|
||||
|
||||
/* Buttons (auth-spezifisch, um den allgemeinen .btn-primary nicht zu überschreiben) */
|
||||
.auth-btn-primary {
|
||||
width: 100%;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 8px;
|
||||
padding: 11px 16px;
|
||||
background: var(--color-hub);
|
||||
color: #ffffff;
|
||||
border-radius: 6px;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
border: 0;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.15s;
|
||||
font-family: inherit;
|
||||
}
|
||||
.auth-btn-primary:hover {
|
||||
background: var(--color-hub-2);
|
||||
}
|
||||
.auth-btn-primary:disabled {
|
||||
opacity: 0.6;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.auth-btn-outline {
|
||||
width: 100%;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 8px;
|
||||
padding: 10px 16px;
|
||||
background: #ffffff;
|
||||
color: var(--color-ink);
|
||||
border: 1px solid var(--color-bg-rule);
|
||||
border-radius: 6px;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
transition:
|
||||
background-color 0.15s,
|
||||
border-color 0.15s;
|
||||
font-family: inherit;
|
||||
}
|
||||
.auth-btn-outline:hover {
|
||||
background: var(--color-bg-elev);
|
||||
border-color: #cfc8b5;
|
||||
}
|
||||
|
||||
/* Validierungs-Fehler-Text */
|
||||
.field-error {
|
||||
margin-top: 6px;
|
||||
color: var(--color-loss);
|
||||
font-size: 12px;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
/* Erfolgs-/Status-Mitteilung */
|
||||
.field-status {
|
||||
background: #f1f6ef;
|
||||
border: 1px solid #c8dec0;
|
||||
color: #2e5b32;
|
||||
padding: 10px 14px;
|
||||
border-radius: 4px;
|
||||
font-size: 12.5px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
}
|
||||
|
||||
@layer utilities {
|
||||
.tabular-nums {
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
}
|
||||
|
||||
[x-cloak] {
|
||||
display: none !important;
|
||||
}
|
||||
|
|
@ -1,319 +0,0 @@
|
|||
/**
|
||||
* Theme für den Publisher-Hub presseportale.com (presseportale.test)
|
||||
*
|
||||
* Eigener Charakter zwischen den beiden Brand-Portalen:
|
||||
* - Surface: warmes Buchpapier (gleiche Familie wie BP24/Presseecho)
|
||||
* - Primary: Hub-Blau (#1A2540) – seriös, plattform-neutral
|
||||
* - Accent: gedecktes Bernstein (#B07A3A) – bewusst NICHT Orange (BP24) und NICHT Grün (Presseecho)
|
||||
* - Schrift: Inter Tight + JetBrains Mono, OHNE Source Serif (Hub-Bezug, weniger editorial-redaktionell als die Brand-Portale)
|
||||
*
|
||||
* Token-Namen folgen wo möglich der BP24/Presseecho-Konvention (bg, bg-elev, bg-rule, ink-*),
|
||||
* sodass viele Utility-Klassen identisch greifen. Hub-spezifische Tokens
|
||||
* (hub, hub-2, hub-soft, accent-soft, hub-line) sind zusätzlich definiert.
|
||||
*/
|
||||
@import "./shared-styles.css";
|
||||
|
||||
@theme {
|
||||
/* Surfaces — warmes Buchpapier, gleiche Familie wie die Brand-Portale */
|
||||
--color-bg: #f6f4ef;
|
||||
--color-bg-elev: #fbfaf6;
|
||||
--color-bg-rule: #e2ddd0;
|
||||
--color-bg-rule-strong: #1a1f1c;
|
||||
--color-bg-dark: #15201a;
|
||||
--color-bg-card: #ffffff;
|
||||
--color-bg-card-warm: #efeadc;
|
||||
--color-bg-card-warm-border: #d6cfbb;
|
||||
|
||||
/* Hub-Blau — Primary, plattform-neutral */
|
||||
--color-hub: #1a2540;
|
||||
--color-hub-2: #243152;
|
||||
--color-hub-3: #2e3d66;
|
||||
--color-hub-soft: #e5e9f1;
|
||||
--color-hub-soft-2: #cfd6e4;
|
||||
--color-hub-line: #7b8fbf;
|
||||
|
||||
/* Topbar (Alias für Hub-Gradient, damit shared base-Klassen passen) */
|
||||
--color-topbar: #1a2540;
|
||||
--color-topbar2: #243152;
|
||||
--color-topbar-deep: #0f1729;
|
||||
|
||||
/* Akzent — gedecktes Bernstein (zwischen Orange und Beige) */
|
||||
--color-accent: #b07a3a;
|
||||
--color-accent-deep: #8a5e27;
|
||||
--color-accent-soft: #f1e6d3;
|
||||
--color-accent-warm: #b07a3a;
|
||||
|
||||
/* Ink — Anthrazit-Reihe */
|
||||
--color-ink: #1a1f1c;
|
||||
--color-ink-2: #3a413d;
|
||||
--color-ink-3: #5a6360;
|
||||
--color-ink-4: #8a918d;
|
||||
--color-ink-on-dark: #f6f4ef;
|
||||
--color-ink-on-dark-2: #b2b9c7;
|
||||
--color-ink-on-dark-3: #7b8fbf;
|
||||
--color-ink-on-dark-muted: #7b8fbf;
|
||||
--color-ink-on-dark-rule: #2a3550;
|
||||
|
||||
/* Brand-Aliase, damit Komponenten, die brand-Tokens verwenden, funktionieren */
|
||||
--color-brand: #1a2540;
|
||||
--color-brand-deep: #0f1729;
|
||||
--color-brand-soft: #e5e9f1;
|
||||
--color-live: #c84a1e;
|
||||
--color-gain: #2e8540;
|
||||
--color-loss: #c8341e;
|
||||
--color-ok: #2e8540;
|
||||
|
||||
/* Editorial-Akzente (für card-warm-Sektionen) */
|
||||
--color-bg-card-warm-hover: #e6deca;
|
||||
--color-bg-card-warm-rule: #c8bda3;
|
||||
--color-card-warm-cat: #5a6360;
|
||||
--color-card-warm-title: #2a302d;
|
||||
--color-feature-line: #c0c8db;
|
||||
--color-feature-dot: #d8dde9;
|
||||
|
||||
/* Fonts — Hub: Inter Tight + JetBrains Mono.
|
||||
Source Serif 4 wird zusätzlich geladen, damit Markennennungen der
|
||||
Tochter-Portale (presseecho, businessportal24) typografisch konsistent
|
||||
erscheinen – im Hub-Standardtext kommt sie aber nicht zum Einsatz. */
|
||||
--font-sans: "Inter Tight", Inter, system-ui, -apple-system,
|
||||
BlinkMacSystemFont, "Segoe UI", sans-serif;
|
||||
--font-serif: "Source Serif 4", "Source Serif Pro", Charter,
|
||||
"Iowan Old Style", Georgia, serif;
|
||||
--font-mono: "JetBrains Mono", "SF Mono", ui-monospace, SFMono-Regular,
|
||||
Menlo, Consolas, monospace;
|
||||
|
||||
/* Layout */
|
||||
--container-layout: 1280px;
|
||||
}
|
||||
|
||||
/* HSL-Variablen für Legacy-Komponenten (shared-styles) */
|
||||
:root {
|
||||
--font-primary: var(--font-sans);
|
||||
--font-secondary: var(--font-sans);
|
||||
|
||||
--background: 40 30% 95%; /* #f6f4ef */
|
||||
--foreground: 144 8% 11%;
|
||||
--card: 0 0% 100%;
|
||||
--card-foreground: 144 8% 11%;
|
||||
--popover: 0 0% 100%;
|
||||
--popover-foreground: 144 8% 11%;
|
||||
|
||||
/* Primary: #1A2540 -> hsl(222, 43%, 18%) */
|
||||
--primary: 222 43% 18%;
|
||||
--primary-foreground: 0 0% 100%;
|
||||
--primary-50: 222 43% 96%;
|
||||
--primary-100: 222 43% 92%;
|
||||
--primary-200: 222 43% 85%;
|
||||
--primary-300: 222 43% 75%;
|
||||
--primary-400: 222 43% 60%;
|
||||
--primary-500: 222 43% 45%;
|
||||
--primary-600: 222 43% 36%;
|
||||
--primary-700: 222 43% 28%;
|
||||
--primary-800: 222 43% 22%;
|
||||
--primary-900: 222 43% 18%;
|
||||
--primary-950: 222 43% 12%;
|
||||
|
||||
--secondary: 224 30% 30%;
|
||||
--secondary-foreground: 0 0% 100%;
|
||||
|
||||
--muted: 40 18% 90%;
|
||||
--muted-foreground: 144 6% 38%;
|
||||
--accent: 31 51% 46%;
|
||||
--accent-foreground: 0 0% 100%;
|
||||
--destructive: 0 84% 60%;
|
||||
--destructive-foreground: 0 0% 100%;
|
||||
--border: 38 23% 85%;
|
||||
--input: 38 23% 85%;
|
||||
--ring: 222 43% 18%;
|
||||
--radius: 4px;
|
||||
|
||||
--shadow-card: 0 1px 2px 0 rgb(26 37 64 / 0.06);
|
||||
--shadow-card-hover: 0 4px 12px -2px rgb(26 37 64 / 0.12);
|
||||
}
|
||||
|
||||
@layer base {
|
||||
html,
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #e8e4da;
|
||||
color: var(--color-ink);
|
||||
font-family: var(--font-sans);
|
||||
-webkit-font-smoothing: antialiased;
|
||||
font-feature-settings: "ss01", "cv11";
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4 {
|
||||
font-family: var(--font-sans);
|
||||
color: inherit;
|
||||
letter-spacing: -0.01em;
|
||||
}
|
||||
|
||||
.font-mono {
|
||||
font-family: var(--font-mono);
|
||||
font-feature-settings: "tnum";
|
||||
}
|
||||
}
|
||||
|
||||
@layer components {
|
||||
/* Hub-Eyebrow — sperrgesetzt, in Hub-Blau */
|
||||
.eyebrow {
|
||||
font-size: 11px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.2em;
|
||||
text-transform: uppercase;
|
||||
color: var(--color-hub);
|
||||
}
|
||||
.eyebrow.muted {
|
||||
color: var(--color-ink-3);
|
||||
letter-spacing: 0.16em;
|
||||
font-weight: 600;
|
||||
font-size: 10.5px;
|
||||
}
|
||||
.eyebrow.accent {
|
||||
color: var(--color-accent-deep);
|
||||
}
|
||||
.eyebrow.on-dark {
|
||||
color: var(--color-hub-line);
|
||||
}
|
||||
|
||||
/* Section-Eyebrow mit kurzem Linien-Schwanz */
|
||||
.section-eyebrow {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
font-size: 11px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.22em;
|
||||
text-transform: uppercase;
|
||||
color: var(--color-hub);
|
||||
}
|
||||
.section-eyebrow::after {
|
||||
content: "";
|
||||
display: block;
|
||||
width: 42px;
|
||||
height: 1px;
|
||||
background: var(--color-hub);
|
||||
opacity: 0.45;
|
||||
}
|
||||
.section-eyebrow.on-dark {
|
||||
color: var(--color-hub-line);
|
||||
}
|
||||
.section-eyebrow.on-dark::after {
|
||||
background: var(--color-hub-line);
|
||||
opacity: 0.55;
|
||||
}
|
||||
|
||||
.rule {
|
||||
height: 1px;
|
||||
background: var(--color-bg-rule);
|
||||
border: 0;
|
||||
margin: 0;
|
||||
}
|
||||
.rule-strong {
|
||||
height: 1px;
|
||||
background: var(--color-bg-rule-strong);
|
||||
border: 0;
|
||||
margin: 0;
|
||||
}
|
||||
.rule-hub {
|
||||
height: 2px;
|
||||
background: var(--color-hub);
|
||||
border: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* Subtile geometrische Hintergrundlinien fürs Hero */
|
||||
.hero-grid {
|
||||
background-image:
|
||||
linear-gradient(
|
||||
to right,
|
||||
rgba(26, 37, 64, 0.04) 1px,
|
||||
transparent 1px
|
||||
),
|
||||
linear-gradient(
|
||||
to bottom,
|
||||
rgba(26, 37, 64, 0.04) 1px,
|
||||
transparent 1px
|
||||
);
|
||||
background-size: 48px 48px;
|
||||
background-position: -1px -1px;
|
||||
}
|
||||
|
||||
/* Hub-Gradient-Klassen */
|
||||
.bg-hub-grad {
|
||||
background-image: linear-gradient(
|
||||
135deg,
|
||||
var(--color-hub) 0%,
|
||||
var(--color-hub-2) 100%
|
||||
);
|
||||
}
|
||||
.bg-hub-grad-2 {
|
||||
background-image: linear-gradient(
|
||||
180deg,
|
||||
var(--color-hub) 0%,
|
||||
var(--color-topbar-deep) 100%
|
||||
);
|
||||
}
|
||||
.bg-accent-grad {
|
||||
background-image: linear-gradient(
|
||||
135deg,
|
||||
var(--color-accent) 0%,
|
||||
var(--color-accent-deep) 100%
|
||||
);
|
||||
}
|
||||
.bg-topbar-grad {
|
||||
background-image: linear-gradient(
|
||||
135deg,
|
||||
var(--color-topbar) 0%,
|
||||
var(--color-topbar2) 100%
|
||||
);
|
||||
}
|
||||
|
||||
/* Empfohlen-Ribbon auf Tarif-Karten */
|
||||
.ribbon-recommend {
|
||||
position: absolute;
|
||||
top: -1px;
|
||||
left: -1px;
|
||||
right: -1px;
|
||||
background: var(--color-hub);
|
||||
color: #fff;
|
||||
font-size: 10.5px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.18em;
|
||||
text-transform: uppercase;
|
||||
text-align: center;
|
||||
padding: 8px 0;
|
||||
}
|
||||
|
||||
/* Accordion-Pfeil (FAQ) */
|
||||
details > summary {
|
||||
list-style: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
details > summary::-webkit-details-marker {
|
||||
display: none;
|
||||
}
|
||||
details[open] .faq-chev {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
.faq-chev {
|
||||
transition: transform 0.2s ease;
|
||||
}
|
||||
}
|
||||
|
||||
@layer utilities {
|
||||
.tabular-nums {
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
}
|
||||
|
||||
[x-cloak] {
|
||||
display: none !important;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue