/* Paliad — Patent Knowledge platform. Firm name is rendered at runtime from FIRM_NAME (see internal/branding + frontend/src/branding.ts). Default: "HLC". */ :root { /* Brand palette (4 colors). Token names use the --hlc- prefix as a stable internal identifier — not a firm-specific reference; renaming the prefix would touch every CSS rule for no user-visible benefit. Lime + midnight are the primary pair. Cyan + cream are supporting. */ --hlc-lime: #BFF355; --hlc-midnight: #002236; --hlc-cyan: #9FE3D9; --hlc-cream: #EEE5E1; /* Channel tokens enable rgb(var(--*-rgb) / a) for tints without hard-coded rgba values elsewhere. */ --hlc-lime-rgb: 191 243 85; --hlc-midnight-rgb: 0 34 54; --hlc-cyan-rgb: 159 227 217; --hlc-cream-rgb: 238 229 225; /* Surface + semantic tokens — re-pointed onto the brand palette. Light mode is the default. Dark mode overrides every token below in the :root[data-theme="dark"] block further down. Components that read these tokens (instead of palette/hex literals) get the theme swap for free. */ --color-bg: var(--hlc-cream); --color-bg-subtle: #f7f3f0; /* slightly off-cream for table headers / soft surfaces */ --color-bg-lime-tint: rgb(var(--hlc-lime-rgb) / 0.10); --color-surface: #ffffff; /* cards stay white for contrast */ --color-surface-2: #fafafa; /* slightly raised surface (alt rows, code blocks) */ --color-surface-muted: #f3f4f6; /* nested muted surfaces (chips, soft fills) */ /* Form inputs render on white in light mode (m: 2026-04-30 — the cream `--color-bg` made inputs feel like background blocks, not wells). In dark mode we drop slightly *below* the card surface so the input still reads as a depressed well rather than merging into the card panel. */ --color-input-bg: #ffffff; --color-text: var(--hlc-midnight); --color-text-muted: #5a6573; --color-text-subtle: #6b7280; /* third-tier text (placeholders, helper) */ --color-accent: var(--hlc-lime); --color-accent-light: #d8f78a; /* lighter lime for hover */ --color-accent-dark: var(--hlc-midnight); /* foreground on lime — WCAG AA */ /* Accent text colour. Lime fails WCAG on the cream/white BGs we use in light mode, so accent emphasis in body copy is rendered in midnight here. Dark-mode flips this to lime (lime on midnight is WCAG AA); the .sidebar scope below already keeps lime today since the sidebar lives on a midnight BG, so it's a no-op there. */ --color-accent-fg: var(--hlc-midnight); --color-border: #e1dcd6; /* derived from cream, neutral warm */ --color-border-strong: #d4d4d8; /* stronger border for tab/select boundaries */ --color-hero-bg: var(--hlc-midnight); --color-hero-text: #ffffff; /* Overlay tints for hover/stripe/divider — opacities tuned so they read on cream backgrounds. Dark mode swaps to white-channel alphas. */ --color-overlay-faint: rgba(0, 0, 0, 0.04); --color-overlay-subtle: rgba(0, 0, 0, 0.06); --color-overlay-strong: rgba(0, 0, 0, 0.10); --color-overlay-modal: rgba(0, 0, 0, 0.4); /* modal/drawer scrim */ /* Segmented-control active pill — brand-lime accent so every density / view-mode toggle reads as the same primary action (m/paliad#52). Surfaces consuming these tokens: .filter-bar-segment (FilterBar density + future view-mode segments). Override on dark mode below. */ --color-segment-active-bg: var(--color-accent); --color-segment-active-fg: var(--color-accent-dark); --color-segment-active-border: var(--color-accent); /* Status palette — five buckets (red/amber/green/blue/neutral) shared across dashboard cards, frist-due-chips, agenda urgency, termin badges, login forms. Light values match the existing pastel-on-dark Tailwind-100/700 pattern; dark values invert to a tinted alpha backdrop with bright foreground for AA contrast on dark surfaces. */ --status-red-bg: #fee2e2; --status-red-fg: #b91c1c; --status-red-border: #fecaca; --status-amber-bg: #fef3c7; --status-amber-fg: #92400e; --status-amber-fg-2: #b45309; --status-amber-border: #fcd34d; --status-green-bg: #dcfce7; --status-green-fg: #166534; --status-green-border: #bbf7d0; --status-green-soft-bg: #ecfccb; --status-green-soft-fg: #365314; --status-blue-bg: #dbeafe; --status-blue-fg: #1e40af; --status-blue-fg-2: #2563eb; --status-blue-soft-bg: #eef2ff; --status-blue-soft-fg: #4338ca; --status-neutral-bg: #f3f4f6; --status-neutral-fg: #6b7280; --status-neutral-fg-2: #475569; --status-neutral-fg-3: #374151; /* Project-tree icon palette — five identity colours by node type. Light values are saturated-mid; dark values are brightened pastels so they remain legible on midnight without losing identity. */ --tree-icon-client: #4338ca; --tree-icon-litigation: #9d174d; --tree-icon-patent: #075985; --tree-icon-case: #92400e; --tree-icon-project: #166534; /* Sidebar — light mode harmonises with the cream/white body palette (t-paliad-104). Surface lifts one step from the body cream so the sidebar reads as part of the same design language, not a separate midnight panel. The active item's text colour is midnight (full contrast against the muted-grey inactive items); the brand-lime accent stripe on .sidebar-item.active::after stays via --color-accent directly, so the lime brand cue is preserved in both themes. Dark mode (block below) restores the original midnight + cream + lime palette since that already reads as one piece. */ --sidebar-bg: var(--color-bg-subtle); --sidebar-text: var(--color-text); --sidebar-text-muted: var(--color-text-muted); --sidebar-text-active: var(--hlc-midnight); --sidebar-border: var(--color-border); --sidebar-hover-bg: rgb(var(--hlc-midnight-rgb) / 0.05); --sidebar-input-bg: rgb(var(--hlc-midnight-rgb) / 0.05); --font-sans: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; --font-mono: "JetBrains Mono", "Fira Code", monospace; --radius: 8px; --shadow: 0 1px 3px rgba(0, 0, 0, 0.06), 0 1px 2px rgba(0, 0, 0, 0.04); --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08); --shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.15); --shadow-xl: 0 20px 60px rgba(0, 0, 0, 0.15); /* Sidebar scrollbar — themed thin scrollbar so the auto-overflow inside the nav reads as part of the sidebar surface. Light mode uses midnight-channel alpha against the cream sidebar; the dark block below switches to cream-channel alpha against midnight. */ --sidebar-scrollbar-thumb: rgb(var(--hlc-midnight-rgb) / 0.18); --sidebar-scrollbar-thumb-hover: rgb(var(--hlc-midnight-rgb) / 0.32); --sidebar-scrollbar-width: 6px; --max-width: 1080px; --sidebar-collapsed: 64px; --sidebar-expanded: 240px; /* User-adjustable width for the expanded/pinned desktop sidebar. Defaults to --sidebar-expanded; sidebar.ts overrides on document.documentElement when the user drags the resize handle and persists the value to localStorage. Mobile drawer keeps the fixed --sidebar-expanded width. */ --sidebar-width: 240px; --bottom-nav-height: 56px; } /* Dark mode (m/paliad#2). Activated by the pre-paint inline script in PWAHead.tsx setting from localStorage[paliad-theme] ("dark" | "auto"+system-prefers-dark). The body palette flips to midnight-bg + cream-fg, and accent text flips back to lime (passes WCAG AA on midnight). Status pills, dashboard cards, and tree-icon colours are tinted-alpha-on-dark for readability. Sidebar (t-paliad-104, reversing t-paliad-083): the sidebar now flips with the theme. Light mode keeps the sidebar on a cream-tinted surface so it reads as part of the page; dark mode restores the original midnight + cream-text + lime-active palette below — that combo already reads as one piece on a midnight body. */ :root[data-theme="dark"] { --color-bg: var(--hlc-midnight); --color-bg-subtle: #00304a; /* slightly raised for table headers */ --color-bg-lime-tint: rgb(var(--hlc-lime-rgb) / 0.12); --color-surface: #0a3047; /* card surface — distinct from body */ --color-surface-2: #0d3a55; /* one step further raised */ --color-surface-muted: rgb(var(--hlc-cream-rgb) / 0.05); /* Input wells render BELOW card surface so the depression reads. */ --color-input-bg: #00192a; --color-text: var(--hlc-cream); --color-text-muted: rgb(var(--hlc-cream-rgb) / 0.66); --color-text-subtle: rgb(var(--hlc-cream-rgb) / 0.50); --color-accent-light: #9bd926; /* darker lime for hover on dark */ --color-accent-dark: var(--hlc-midnight); /* foreground on lime stays midnight */ --color-accent-fg: var(--hlc-lime); /* lime text on midnight is AA */ --color-border: rgb(var(--hlc-cream-rgb) / 0.12); --color-border-strong: rgb(var(--hlc-cream-rgb) / 0.22); --color-hero-bg: #0a3047; /* hero panel one step lighter than bg */ --color-hero-text: var(--hlc-cream); --color-overlay-faint: rgba(255, 255, 255, 0.04); --color-overlay-subtle: rgba(255, 255, 255, 0.07); --color-overlay-strong: rgba(255, 255, 255, 0.12); --color-overlay-modal: rgba(0, 0, 0, 0.65); /* Segmented active pill — lime stays the brand on dark mode too; the --color-accent-dark token already resolves to midnight in both themes, keeping the foreground WCAG-AA on lime. */ --color-segment-active-bg: var(--color-accent); --color-segment-active-fg: var(--color-accent-dark); --color-segment-active-border: var(--color-accent); --shadow: 0 1px 3px rgba(0, 0, 0, 0.4), 0 1px 2px rgba(0, 0, 0, 0.3); --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.45); --shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.55); --shadow-xl: 0 20px 60px rgba(0, 0, 0, 0.6); /* Status palette — alpha-tinted backdrops so the pill reads as a coloured swatch rather than a saturated rectangle. Foregrounds are the Tailwind 300-shades for AA contrast on the alpha bg. */ --status-red-bg: rgb(239 68 68 / 0.18); --status-red-fg: #fca5a5; --status-red-border: rgb(239 68 68 / 0.35); --status-amber-bg: rgb(245 158 11 / 0.18); --status-amber-fg: #fcd34d; --status-amber-fg-2: #fbbf24; --status-amber-border: rgb(245 158 11 / 0.35); --status-green-bg: rgb(34 197 94 / 0.18); --status-green-fg: #86efac; --status-green-border: rgb(34 197 94 / 0.35); --status-green-soft-bg: rgb(132 204 22 / 0.18); --status-green-soft-fg: #bef264; --status-blue-bg: rgb(59 130 246 / 0.18); --status-blue-fg: #93c5fd; --status-blue-fg-2: #60a5fa; --status-blue-soft-bg: rgb(99 102 241 / 0.18); --status-blue-soft-fg: #a5b4fc; --status-neutral-bg: rgb(var(--hlc-cream-rgb) / 0.08); --status-neutral-fg: rgb(var(--hlc-cream-rgb) / 0.66); --status-neutral-fg-2: rgb(var(--hlc-cream-rgb) / 0.55); --status-neutral-fg-3: rgb(var(--hlc-cream-rgb) / 0.78); /* Tree-icon colours — brighter shades so they remain identifiable on midnight without losing their colour identity. */ --tree-icon-client: #818cf8; --tree-icon-litigation: #f472b6; --tree-icon-patent: #38bdf8; --tree-icon-case: #fbbf24; --tree-icon-project: #86efac; /* Sidebar — restore the original midnight + cream + lime palette here (the light-mode defaults harmonise with the cream body; dark mode wants the high-contrast midnight column it had before t-paliad-104). */ --sidebar-bg: var(--hlc-midnight); --sidebar-text: var(--hlc-cream); --sidebar-text-muted: rgb(var(--hlc-cream-rgb) / 0.66); --sidebar-text-active: var(--hlc-lime); --sidebar-border: rgb(var(--hlc-cream-rgb) / 0.12); --sidebar-hover-bg: rgb(var(--hlc-cream-rgb) / 0.08); --sidebar-input-bg: rgb(var(--hlc-cream-rgb) / 0.08); --sidebar-scrollbar-thumb: rgb(var(--hlc-cream-rgb) / 0.20); --sidebar-scrollbar-thumb-hover: rgb(var(--hlc-cream-rgb) / 0.35); } /* Smooth the body-background swap so theme toggles don't snap. Surface and text colors are read by individual elements and inherit a similar transition where they apply their own background/color shorthand. */ :root { color-scheme: light; } :root[data-theme="dark"] { color-scheme: dark; } *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; } html { font-size: 16px; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } body { font-family: var(--font-sans); color: var(--color-text); background: var(--color-bg); line-height: 1.6; min-height: 100vh; display: flex; flex-direction: column; } main { flex: 1; } .container { max-width: var(--max-width); margin: 0 auto; padding: 0 1.5rem; } /* --- Header --- */ .header { background: var(--color-surface); border-bottom: 1px solid var(--color-border); position: sticky; top: 0; z-index: 10; } .nav { display: flex; align-items: center; justify-content: space-between; height: 3.5rem; } .logo { display: flex; align-items: baseline; gap: 0.15rem; text-decoration: none; font-weight: 600; font-size: 1.15rem; letter-spacing: -0.02em; color: var(--color-text); } .logo-mark { font-family: var(--font-mono); color: var(--color-accent-fg); font-weight: 700; font-size: 1.3rem; } .nav-right { display: flex; align-items: center; gap: 1.25rem; } .nav-logout { font-size: 0.8rem; color: var(--color-text-muted); text-decoration: none; } .nav-logout:hover { color: var(--color-accent-fg); } .nav-lang { font-size: 0.8rem; letter-spacing: 0.05em; color: var(--color-text-muted); user-select: none; } .lang-btn { background: none; border: none; font-family: inherit; font-size: inherit; letter-spacing: inherit; cursor: pointer; padding: 0; color: inherit; } .lang-btn:hover { color: var(--color-accent-fg); } .lang-active { color: var(--color-accent-fg); font-weight: 600; cursor: default; } .lang-sep { margin: 0 0.25rem; } .timeline-trigger-date { font-weight: 400; color: var(--color-text-muted); font-size: 0.85rem; } /* --- Hero --- */ .hero { background: var(--color-hero-bg); color: var(--color-hero-text); padding: 5rem 0 4.5rem; } .hero h1 { font-size: 2.75rem; font-weight: 700; line-height: 1.15; letter-spacing: -0.03em; } .hero-accent { font-weight: 400; opacity: 0.85; } .hero-sub { margin-top: 1.25rem; font-size: 1.1rem; line-height: 1.7; opacity: 0.9; max-width: 560px; } /* --- Card Grid --- */ .sections { padding: 4rem 0; } .grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.5rem; } .card { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius); padding: 2rem; transition: box-shadow 0.15s ease, border-color 0.15s ease; } .card:hover { box-shadow: var(--shadow-md); border-color: var(--color-accent-light); } .card-icon { width: 2.25rem; height: 2.25rem; color: var(--color-accent-fg); margin-bottom: 1rem; } .card-icon svg { width: 100%; height: 100%; } .card h2 { font-size: 1.15rem; font-weight: 600; margin-bottom: 0.5rem; letter-spacing: -0.01em; } .card p { color: var(--color-text-muted); font-size: 0.92rem; line-height: 1.6; } .section-heading { font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--color-text-muted); margin-bottom: 1rem; } .grid-2 { grid-template-columns: repeat(2, 1fr); } .card-link { text-decoration: none; color: inherit; display: block; } .card-link:hover { border-color: var(--color-accent); } /* --- Offices --- */ .offices { padding: 0 0 4rem; } .offices h3 { font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--color-text-muted); margin-bottom: 1rem; } .office-list { display: flex; gap: 2rem; flex-wrap: wrap; } .office-list span { font-size: 1rem; font-weight: 500; color: var(--color-text); position: relative; padding-left: 0.85rem; } .office-list span::before { content: ""; position: absolute; left: 0; top: 50%; transform: translateY(-50%); width: 5px; height: 5px; border-radius: 50%; background: var(--color-accent); } /* --- Footer --- */ .footer { border-top: 1px solid var(--color-border); padding: 1.5rem 0; margin-top: auto; } .footer p { font-size: 0.8rem; color: var(--color-text-muted); text-align: center; } /* --- Login --- */ .login-main { flex: 1; display: flex; align-items: center; justify-content: center; padding: 3rem 1.5rem; } .login-card { width: 100%; max-width: 400px; background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius); padding: 2.5rem; box-shadow: var(--shadow-md); } .login-tabs { display: flex; margin-bottom: 1.75rem; border-bottom: 1px solid var(--color-border); } .login-tab { flex: 1; padding: 0.6rem 0; background: none; border: none; border-bottom: 2px solid transparent; font-family: var(--font-sans); font-size: 0.9rem; font-weight: 500; color: var(--color-text-muted); cursor: pointer; transition: color 0.15s ease, border-color 0.15s ease; } .login-tab:hover { color: var(--color-text); } .login-tab.active { /* Canonical active-tab pattern (F-20) — lime underline + midnight text + 600 weight. Matches .entity-tab.active and .gebuehren-tab.active. */ color: var(--color-text); border-bottom-color: var(--hlc-lime); font-weight: 600; } .login-error { background: var(--status-red-bg); color: var(--status-red-fg); border: 1px solid var(--status-red-border); border-radius: var(--radius); padding: 0.75rem 1rem; font-size: 0.85rem; margin-bottom: 1.25rem; line-height: 1.5; } .login-success { background: var(--status-green-bg); color: var(--status-green-fg); border: 1px solid var(--status-green-border); border-radius: var(--radius); padding: 0.75rem 1rem; font-size: 0.85rem; margin-bottom: 1.25rem; line-height: 1.5; } .login-form { display: flex; flex-direction: column; } .login-label { font-size: 0.85rem; font-weight: 500; color: var(--color-text); margin-bottom: 0.35rem; margin-top: 0.75rem; } .login-label:first-child { margin-top: 0; } .login-input { font-family: var(--font-sans); font-size: 0.92rem; padding: 0.6rem 0.8rem; border: 1px solid var(--color-border); border-radius: var(--radius); outline: none; transition: border-color 0.15s ease, box-shadow 0.15s ease; color: var(--color-text); background: var(--color-input-bg); } .login-input:focus { border-color: var(--color-accent); box-shadow: 0 0 0 3px rgb(var(--hlc-lime-rgb) / 0.15); } .login-input::placeholder { color: var(--color-text-muted); opacity: 0.6; } .login-button { font-family: var(--font-sans); font-size: 0.92rem; font-weight: 600; padding: 0.65rem 1rem; margin-top: 1.25rem; border: none; border-radius: var(--radius); background: var(--color-accent); color: var(--color-accent-dark); cursor: pointer; transition: background 0.15s ease; } .login-button:hover { background: var(--color-accent-light); } .login-hint { font-size: 0.78rem; color: var(--color-text-muted); text-align: center; margin-top: 1.5rem; } /* --- Onboarding (first-login profile capture) --- */ .onboarding-card { max-width: 460px; } .onboarding-heading { font-size: 1.5rem; font-weight: 600; margin: 0 0 0.5rem; color: var(--color-text); } .onboarding-lede { font-size: 0.9rem; color: var(--color-text-muted); line-height: 1.5; margin: 0 0 1.5rem; } .login-label-optional { font-weight: 400; color: var(--color-text-muted); margin-left: 0.25rem; } /* --- Nav Links --- */ .nav-link { font-size: 0.8rem; color: var(--color-text-muted); text-decoration: none; transition: color 0.15s ease; } .nav-link:hover { color: var(--color-accent-fg); } /* --- Sidebar --- */ .sidebar { position: fixed; left: 0; top: 0; bottom: 0; width: var(--sidebar-collapsed); background: var(--sidebar-bg); color: var(--sidebar-text); border-right: 1px solid var(--sidebar-border); z-index: 40; display: flex; flex-direction: column; overflow: hidden; transition: width 150ms ease; /* Accent text inside the sidebar tracks --sidebar-text-active so it stays legible against the sidebar surface in either theme. Light mode: midnight on cream-tint (no-op vs the root default). Dark mode: lime on midnight (matches root). */ --color-accent-fg: var(--sidebar-text-active); } /* `:root.sidebar-pinned .sidebar` is the pre-paint companion to `.sidebar.pinned` (t-paliad-142). The FOUC script in PWAHead.tsx sets the html class before paint, so the sidebar element renders at pinned width from frame 1; runtime initSidebar later mirrors `.pinned` onto the element itself for the explicit pin/unpin click animation. Same pattern as the `.has-sidebar.sidebar-pinned` / `:root.sidebar-pinned .has-sidebar` pair below. */ .sidebar.expanded, .sidebar.pinned, :root.sidebar-pinned .sidebar { width: var(--sidebar-width); } .sidebar.resizing, .sidebar.resizing .sidebar-label, .has-sidebar.sidebar-resizing { transition: none !important; } .sidebar-header { display: flex; align-items: center; height: 3.5rem; border-bottom: 1px solid var(--sidebar-border); flex-shrink: 0; overflow: hidden; } .sidebar-logo { display: flex; align-items: center; text-decoration: none; color: var(--sidebar-text); flex: 1; min-width: 0; height: 100%; } .sidebar-logo .logo-text { font-weight: 600; font-size: 1.15rem; letter-spacing: -0.02em; } .sidebar-pin { background: none; border: none; color: var(--sidebar-text-muted); cursor: pointer; padding: 0.35rem; margin-right: 0.75rem; border-radius: 4px; flex-shrink: 0; opacity: 0; pointer-events: none; transition: opacity 150ms ease, color 150ms ease, background 150ms ease; } .sidebar.expanded .sidebar-pin, .sidebar.pinned .sidebar-pin, :root.sidebar-pinned .sidebar .sidebar-pin { opacity: 1; pointer-events: auto; } .sidebar-pin:hover { color: var(--sidebar-text-active); background: var(--sidebar-hover-bg); } .sidebar-pin svg { width: 16px; height: 16px; display: block; } .sidebar.pinned .sidebar-pin, :root.sidebar-pinned .sidebar .sidebar-pin { color: var(--sidebar-text-active); } /* Vertical drag-strip on the sidebar's right edge. Only meaningful when the sidebar is wide enough to show labels (expanded or pinned), so collapsed/icon-rail state hides it. Positioned slightly off-edge for easier hit; pointer-events stay enabled only when visible. */ .sidebar-resize-handle { position: absolute; top: 0; right: -3px; width: 6px; height: 100%; cursor: col-resize; z-index: 41; background: transparent; opacity: 0; pointer-events: none; transition: opacity 150ms ease, background 150ms ease; user-select: none; touch-action: none; } .sidebar.expanded .sidebar-resize-handle, .sidebar.pinned .sidebar-resize-handle, :root.sidebar-pinned .sidebar .sidebar-resize-handle { opacity: 1; pointer-events: auto; } .sidebar-resize-handle:hover, .sidebar.resizing .sidebar-resize-handle { background: var(--color-accent); opacity: 0.5; } .sidebar-nav { display: flex; flex-direction: column; padding: 0.5rem 0; flex: 1 1 auto; overflow-x: hidden; overflow-y: auto; min-height: 0; /* Themed thin scrollbar — cream-channel alpha so it reads as part of the midnight sidebar surface in both light and dark mode. The gutter is reserved (`stable`) so the sidebar's icon column doesn't shift left when the scrollbar appears (admin nav can be tall enough to overflow on shorter viewports). */ scrollbar-width: thin; scrollbar-color: var(--sidebar-scrollbar-thumb) transparent; scrollbar-gutter: stable; } /* WebKit fallback (Safari, older Chromium): explicit thumb styling. The thumb width matches --sidebar-scrollbar-width so the visual gutter is the same on Firefox (`scrollbar-width: thin`) and Webkit. */ .sidebar-nav::-webkit-scrollbar { width: var(--sidebar-scrollbar-width); } .sidebar-nav::-webkit-scrollbar-track { background: transparent; } .sidebar-nav::-webkit-scrollbar-thumb { background: var(--sidebar-scrollbar-thumb); border-radius: 3px; } .sidebar-nav::-webkit-scrollbar-thumb:hover { background: var(--sidebar-scrollbar-thumb-hover); } .sidebar-item { display: flex; align-items: center; min-height: 2.5rem; color: var(--sidebar-text-muted); text-decoration: none; font-size: 0.85rem; font-weight: 500; position: relative; transition: color 150ms ease, background 150ms ease; border: none; background: none; cursor: pointer; font-family: var(--font-sans); width: 100%; text-align: left; padding: 0; } .sidebar-item:hover { color: var(--sidebar-text); background: var(--sidebar-hover-bg); } .sidebar-item.active { color: var(--sidebar-text-active); } .sidebar-item.active::after { content: ""; position: absolute; left: 0; top: 4px; bottom: 4px; width: 3px; /* Brand lime in both themes — keeps the active cue visually anchored even when the active text colour flips between midnight (light) and lime (dark). */ background: var(--color-accent); border-radius: 0 2px 2px 0; } .sidebar-icon { /* Width accounts for the reserved scrollbar gutter on .sidebar-nav so icons stay visually centered inside the 64px collapsed rail rather than drifting left when the scrollbar appears (or appearing left of center even when it doesn't, since `scrollbar-gutter: stable` always reserves the gutter). The other sidebar items (header, bottom, hamburger) sit outside .sidebar-nav and are unaffected. */ width: calc(var(--sidebar-collapsed) - var(--sidebar-scrollbar-width)); display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .sidebar-icon svg { width: 20px; height: 20px; } .sidebar-label { opacity: 0; white-space: nowrap; transition: opacity 150ms ease; overflow: hidden; padding-right: 1rem; } .sidebar.expanded .sidebar-label, .sidebar.pinned .sidebar-label, :root.sidebar-pinned .sidebar .sidebar-label { opacity: 1; } .sidebar-spacer { flex: 1; } .sidebar-bottom { display: flex; flex-direction: column; padding: 0.5rem 0; border-top: 1px solid var(--sidebar-border); flex-shrink: 0; } .sidebar-lang-item { cursor: default; } .sidebar-lang-item:hover { background: transparent; color: var(--sidebar-text-muted); } .sidebar-lang { display: flex; align-items: center; } .sidebar-hamburger { display: none; position: fixed; bottom: 1.5rem; left: 1.5rem; z-index: 50; width: 48px; height: 48px; border-radius: 50%; border: none; background: var(--color-accent); color: var(--color-accent-dark); cursor: pointer; align-items: center; justify-content: center; box-shadow: var(--shadow-md); transition: background 150ms ease; } .sidebar-hamburger:hover { background: var(--color-accent-light); } .sidebar-hamburger svg { width: 22px; height: 22px; } .sidebar-overlay { display: none; } /* Layout: pages with sidebar */ .has-sidebar { padding-left: var(--sidebar-collapsed); transition: padding-left 150ms ease; } /* Two selectors apply the pinned padding because the pre-paint inline script in PWAHead.tsx sets `` (body doesn't exist yet at that point), while the runtime sidebar.ts later adds `sidebar-pinned` to `
` too. Either source is sufficient and they don't conflict. Keeping both keeps the legacy DOM contract intact (sidebar.ts continues to manage the body class). */ .has-sidebar.sidebar-pinned, :root.sidebar-pinned .has-sidebar { padding-left: var(--sidebar-width); } .has-sidebar .tool-results { top: 1.5rem; } .no-scroll { overflow: hidden; } /* --- Tool Pages --- */ .tool-page { padding: 2rem 0 4rem; } .tool-header { margin-bottom: 2rem; } .tool-header h1 { font-size: 1.75rem; font-weight: 700; letter-spacing: -0.02em; } .tool-subtitle { color: var(--color-text-muted); font-size: 0.92rem; margin-top: 0.5rem; line-height: 1.6; } .tool-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 2rem; align-items: start; } .tool-input { display: flex; flex-direction: column; gap: 1.5rem; } .tool-results { position: sticky; top: 4.5rem; } /* Input sections */ .input-section h3 { font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.06em; color: var(--color-text-muted); margin-bottom: 0.75rem; padding-bottom: 0.5rem; border-bottom: 1px solid var(--color-border); } .input-section select { font-family: var(--font-sans); font-size: 0.88rem; padding: 0.45rem 0.7rem; border: 1px solid var(--color-border); border-radius: var(--radius); background: var(--color-input-bg); color: var(--color-text); outline: none; cursor: pointer; } .input-section select:focus { border-color: var(--color-accent); box-shadow: 0 0 0 3px rgb(var(--hlc-lime-rgb) / 0.15); } /* Streitwert */ .streitwert-group { display: flex; flex-direction: column; gap: 0.75rem; } .streitwert-input-row { display: flex; align-items: center; gap: 0.5rem; } .streitwert-prefix { font-size: 0.88rem; font-weight: 500; color: var(--color-text-muted); } .streitwert-field { font-family: var(--font-mono); font-size: 1.25rem; font-weight: 600; padding: 0.5rem 0.75rem; border: 1px solid var(--color-border); border-radius: var(--radius); background: var(--color-surface); color: var(--color-text); outline: none; width: 100%; max-width: 240px; } .streitwert-field:focus { border-color: var(--color-accent); box-shadow: 0 0 0 3px rgb(var(--hlc-lime-rgb) / 0.15); } input[type="range"] { -webkit-appearance: none; width: 100%; height: 4px; border-radius: 2px; background: var(--color-border); outline: none; } input[type="range"]::-webkit-slider-thumb { -webkit-appearance: none; width: 18px; height: 18px; border-radius: 50%; background: var(--color-accent); cursor: pointer; border: 2px solid var(--color-surface); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); } input[type="range"]::-moz-range-thumb { width: 18px; height: 18px; border-radius: 50%; background: var(--color-accent); cursor: pointer; border: 2px solid var(--color-surface); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); } .streitwert-presets { display: flex; gap: 0.4rem; flex-wrap: wrap; } .streitwert-presets button { font-family: var(--font-mono); font-size: 0.75rem; font-weight: 500; padding: 0.3rem 0.6rem; border: 1px solid var(--color-border); border-radius: var(--radius); background: var(--color-surface); color: var(--color-text-muted); cursor: pointer; transition: all 0.15s ease; } .streitwert-presets button:hover { border-color: var(--color-accent); color: var(--color-accent-fg); } .streitwert-presets button.active { background: var(--color-accent); border-color: var(--color-accent); color: var(--color-accent-dark); } /* Instance cards */ .instance-card { border: 1px solid var(--color-border); border-radius: var(--radius); margin-bottom: 0.5rem; transition: border-color 0.15s ease; } .instance-card.enabled { border-color: var(--color-accent-light); } .instance-header { display: flex; align-items: center; gap: 0.6rem; padding: 0.65rem 0.85rem; cursor: pointer; } .instance-header input[type="checkbox"] { accent-color: var(--color-accent); width: 16px; height: 16px; cursor: pointer; } .instance-header label { flex: 1; font-size: 0.88rem; cursor: pointer; display: flex; align-items: baseline; gap: 0.5rem; } .instance-header label strong { font-weight: 500; } .instance-toggle { background: none; border: none; color: var(--color-text-muted); font-size: 0.75rem; cursor: pointer; padding: 0.2rem; } .instance-details { padding: 0.75rem 0.85rem; border-top: 1px solid var(--color-border); background: var(--color-bg); } .instance-fields { display: flex; flex-direction: column; gap: 0.5rem; } .field-row { display: flex; align-items: center; gap: 0.5rem; font-size: 0.85rem; } .field-row label { display: flex; align-items: center; gap: 0.4rem; color: var(--color-text); } .field-row select { font-size: 0.82rem; padding: 0.3rem 0.5rem; } .field-row input[type="checkbox"] { accent-color: var(--color-accent); } /* Results panel */ .result-card { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius); padding: 1.5rem; box-shadow: var(--shadow); } .result-total-section { text-align: center; padding-bottom: 1.25rem; margin-bottom: 1.25rem; border-bottom: 2px solid var(--color-accent); } .result-total-label { font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.06em; color: var(--color-text-muted); margin-bottom: 0.25rem; } .result-total { font-family: var(--font-mono); font-size: 1.6rem; font-weight: 700; color: var(--color-accent-fg); } .result-empty { text-align: center; color: var(--color-text-muted); font-size: 0.88rem; padding: 2rem 0; } .result-summary { padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--color-border); } .result-summary-row { display: flex; justify-content: space-between; font-size: 0.85rem; padding: 0.2rem 0; color: var(--color-text-muted); } .result-section { padding: 0.85rem 0; border-bottom: 1px solid var(--color-border); } .result-section:last-child { border-bottom: none; } .result-section-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem; } .result-section-label { font-size: 0.88rem; font-weight: 600; } .result-section-total { font-family: var(--font-mono); font-size: 0.92rem; font-weight: 600; color: var(--color-accent-fg); } .result-detail-row { display: flex; justify-content: space-between; font-size: 0.82rem; padding: 0.15rem 0; color: var(--color-text-muted); } .result-detail-sum { font-weight: 600; color: var(--color-text); padding-top: 0.25rem; border-top: 1px dotted var(--color-border); margin-top: 0.15rem; } .result-attorney-detail { margin: 0.4rem 0; padding-left: 0.5rem; border-left: 2px solid var(--color-border); } .result-detail-label { font-size: 0.8rem; font-weight: 500; color: var(--color-text); margin-bottom: 0.15rem; } .result-detail-note { font-size: 0.78rem; color: var(--color-text-muted); font-style: italic; margin-top: 0.25rem; } /* Result action buttons */ .result-actions { display: flex; gap: 0.5rem; margin-top: 1rem; } .result-action-btn { font-family: var(--font-sans); font-size: 0.82rem; font-weight: 500; padding: 0.5rem 1rem; flex: 1; border: 1px solid var(--color-border); border-radius: var(--radius); background: var(--color-surface); color: var(--color-text-muted); cursor: pointer; transition: all 0.15s ease; text-align: center; } .result-action-btn:hover { border-color: var(--color-accent); color: var(--color-accent-fg); } .result-action-btn--accent { background: var(--color-accent); border-color: var(--color-accent); color: var(--color-accent-dark); } .result-action-btn--accent:hover { background: var(--color-accent-light); border-color: var(--color-accent-light); color: var(--color-accent-dark); } .result-action-btn.copied { background: var(--color-accent); border-color: var(--color-accent); color: var(--color-accent-dark); } /* Scenario comparison */ .comparison-container { margin-top: 2rem; } .comparison-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1.5rem; } .comparison-header h2 { font-size: 1.25rem; font-weight: 700; } .comparison-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1.5rem; align-items: start; } .comparison-col-title { font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.06em; color: var(--color-text-muted); margin-bottom: 0.75rem; padding-bottom: 0.5rem; border-bottom: 1px solid var(--color-border); } .comparison-diff { margin-top: 1.5rem; } .comparison-diff-card { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius); padding: 1.25rem; text-align: center; } .comparison-diff-card.diff-decrease { border-color: var(--color-accent); background: rgb(var(--hlc-lime-rgb) / 0.04); } .comparison-diff-card.diff-increase { border-color: #e53e3e; background: rgba(229, 62, 62, 0.04); } .comparison-diff-label { font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.06em; color: var(--color-text-muted); margin-bottom: 0.25rem; } .comparison-diff-value { font-family: var(--font-mono); font-size: 1.4rem; font-weight: 700; } .diff-decrease .comparison-diff-value { color: var(--color-accent-fg); } .diff-increase .comparison-diff-value { color: #e53e3e; } .diff-neutral .comparison-diff-value { color: var(--color-text-muted); } .comparison-diff-pct { font-family: var(--font-mono); font-size: 0.88rem; color: var(--color-text-muted); margin-bottom: 0.75rem; } .comparison-diff-detail { padding-top: 0.75rem; border-top: 1px solid var(--color-border); text-align: left; } /* Print header/footer (hidden on screen) */ .print-header, .print-footer { display: none; } /* --- Fristenrechner --- */ /* Fristenrechner v3 (t-paliad-133) — landing fork + pathway shells. The fork is the default landing surface. Each pathway is a peer container that slides in once chosen; back-button returns to fork. */ .fristen-pathway-fork { margin: 2rem 0 2.5rem; padding: 1.75rem; border: 1px solid var(--color-border); border-radius: 12px; background: var(--color-surface); } .fristen-pathway-fork-heading { margin: 0 0 1.25rem; font-size: 1.25rem; font-weight: 600; color: var(--color-text); } .fristen-pathway-fork-cards { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin-bottom: 1.5rem; } @media (max-width: 720px) { .fristen-pathway-fork-cards { grid-template-columns: 1fr; } } .fristen-pathway-card { display: flex; flex-direction: column; align-items: flex-start; gap: 0.5rem; padding: 1.25rem; border: 1px solid var(--color-border); border-radius: 10px; background: var(--color-bg); cursor: pointer; text-align: left; transition: border-color 120ms, box-shadow 120ms, transform 60ms; } .fristen-pathway-card:hover { border-color: var(--color-accent); box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05); } .fristen-pathway-card:active { transform: translateY(1px); } .fristen-pathway-card:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; } .fristen-pathway-card-icon { font-size: 1.75rem; line-height: 1; } .fristen-pathway-card-title { font-size: 1.05rem; font-weight: 600; color: var(--color-text); } .fristen-pathway-card-desc { font-size: 0.9rem; color: var(--color-text-muted); line-height: 1.4; } .fristen-pathway-fork-shortcut { border-top: 1px dashed var(--color-border); padding-top: 1rem; } .fristen-pathway-fork-shortcut-label { font-size: 0.85rem; color: var(--color-text-muted); margin-bottom: 0.5rem; } .fristen-pathway-shell { margin: 1.5rem 0; } .fristen-pathway-back { display: inline-flex; align-items: center; gap: 0.4rem; background: none; border: none; color: var(--color-text-muted); cursor: pointer; padding: 0.25rem 0.5rem; margin-bottom: 0.75rem; font-size: 0.9rem; border-radius: 4px; } .fristen-pathway-back:hover { color: var(--color-text); background: var(--color-bg-muted); } .fristen-pathway-heading { display: flex; align-items: center; gap: 0.5rem; margin: 0 0 1.5rem; font-size: 1.4rem; font-weight: 600; color: var(--color-text); } .fristen-b1-stub { padding: 1.5rem; border: 1px dashed var(--color-border); border-radius: 8px; color: var(--color-text-muted); font-style: italic; text-align: center; } /* t-paliad-180 Slice 1 — Determinator row-stack primitive. * * Every decision (mode, perspective, inbox, cascade depth N) renders as * a `.fristen-row` with three possible states: `is-active` (user is * picking — expands to show chips), `is-answered` (compact single-line * paper-trail row), `is-prefilled` (answered but the value came from * the project context, marked with a `aus Akte` tag). * * Layout is column-flex: rows stack top-to-bottom, the active row's * chip body wraps as a responsive grid. The whole-row click on an * answered/prefilled row re-activates it (handled via JS row-level * click handlers, never a `::before { inset: 0 }` overlay — see * CLAUDE.md "Whole-card / whole-row click"). */ .fristen-row-stack-header { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 0.5rem; margin-bottom: 0.75rem; } .fristen-row-search-link, .fristen-row-reset-link { display: inline-flex; align-items: center; gap: 0.35rem; background: none; border: 1px solid var(--color-border); border-radius: 999px; color: var(--color-text-muted); cursor: pointer; padding: 0.3rem 0.75rem; font-size: 0.85rem; transition: border-color 120ms, color 120ms, background 120ms; } .fristen-row-search-link:hover, .fristen-row-reset-link:hover { border-color: var(--color-text-muted); color: var(--color-text); background: var(--color-bg-subtle, var(--color-bg-muted)); } .fristen-row-search-link:focus-visible, .fristen-row-reset-link:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; } .fristen-row-stack { display: flex; flex-direction: column; gap: 0.4rem; margin-bottom: 1.5rem; } /* When inline search is active, the stack-header's reset link is the * only chrome that doesn't make sense — the search panel has its own * "← back to decision tree" button at the top. */ .fristen-row-stack-header.is-inline-search-active .fristen-row-search-link, .fristen-row-stack-header.is-inline-search-active .fristen-row-reset-link { display: none; } /* t-paliad-198 Slice 3 — inline search overlay. Expands above the row * stack when the `🔍 Direkt suchen` button is clicked. The row stack * itself is hidden via the JS toggle on `#fristen-row-stack`; the * search input drives the same `#fristen-b1-results` container the * cascade narrows into. */ .fristen-row-search-panel { display: flex; flex-direction: column; gap: 0.75rem; margin-bottom: 1.25rem; padding: 0.85rem 1rem 1rem; border: 1px solid var(--color-accent); border-radius: 8px; background: color-mix(in srgb, var(--color-accent) 4%, var(--color-bg)); } .fristen-row-search-panel-back { display: inline-flex; align-items: center; gap: 0.35rem; align-self: flex-start; background: none; border: none; color: var(--color-text-muted); cursor: pointer; padding: 0.25rem 0.5rem; font-size: 0.85rem; border-radius: 4px; } .fristen-row-search-panel-back:hover { color: var(--color-text); background: var(--color-bg-muted); } .fristen-row-search-panel-back:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 1px; } .fristen-row-search-panel-input-wrap { display: flex; align-items: center; gap: 0.5rem; padding: 0.4rem 0.75rem; border: 1px solid var(--color-border); border-radius: 6px; background: var(--color-bg); } .fristen-row-search-panel-input-wrap:focus-within { border-color: var(--color-accent); } .fristen-row-search-panel-icon { flex-shrink: 0; color: var(--color-text-muted); } .fristen-row-search-panel-input { flex: 1 1 auto; border: none; background: transparent; color: var(--color-text); font-size: 1rem; padding: 0.4rem 0; outline: none; } .fristen-row-search-panel-input::placeholder { color: var(--color-text-muted); } .fristen-row-search-panel-clear { flex-shrink: 0; background: none; border: none; color: var(--color-text-muted); font-size: 1.2rem; line-height: 1; cursor: pointer; padding: 0.1rem 0.4rem; border-radius: 4px; } .fristen-row-search-panel-clear:hover { color: var(--color-text); background: var(--color-bg-muted); } .fristen-row-search-panel-clear:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 1px; } .fristen-row { display: flex; flex-direction: column; gap: 0.6rem; padding: 0.5rem 0.85rem; border: 1px solid var(--color-border); border-radius: 8px; background: var(--color-bg); transition: background 120ms, border-color 120ms; } .fristen-row.is-active { background: var(--color-bg-subtle, var(--color-bg-muted)); border-color: var(--color-accent); border-left-width: 4px; padding: 0.85rem 1rem; } .fristen-row.is-answered { background: transparent; border-color: var(--color-border); } .fristen-row.is-prefilled { background: color-mix(in srgb, var(--color-accent) 6%, transparent); border-color: color-mix(in srgb, var(--color-accent) 35%, var(--color-border)); border-left-width: 4px; } .fristen-row.is-answered, .fristen-row.is-prefilled { cursor: pointer; } .fristen-row.is-answered:hover, .fristen-row.is-prefilled:hover { border-color: var(--color-accent); background: var(--color-bg-subtle, var(--color-bg-muted)); } .fristen-row-head { display: flex; flex-wrap: wrap; align-items: center; gap: 0.6rem; min-height: 1.6rem; } .fristen-row-num { display: inline-flex; align-items: center; justify-content: center; width: 1.5rem; height: 1.5rem; border-radius: 999px; border: 1px solid var(--color-border); background: var(--color-bg); font-size: 0.75rem; font-weight: 600; color: var(--color-text-muted); flex-shrink: 0; } .fristen-row.is-active .fristen-row-num { background: var(--color-accent); border-color: var(--color-accent); /* Lime is high-luminance; foreground stays midnight in both themes via --color-accent-dark (light: midnight by default, dark: midnight explicit). Using --color-text here would flip to cream in dark mode and collapse contrast on lime. */ color: var(--color-accent-dark); } .fristen-row.is-prefilled .fristen-row-num { border-color: color-mix(in srgb, var(--color-accent) 50%, var(--color-border)); } .fristen-row-label { flex: 1 1 auto; font-size: 0.95rem; font-weight: 500; color: var(--color-text); } .fristen-row.is-active .fristen-row-label { font-weight: 600; font-size: 1.05rem; } .fristen-row-answer { display: inline-flex; align-items: center; gap: 0.35rem; font-weight: 600; color: var(--color-text); } .fristen-row-answer-check { color: var(--color-accent); font-weight: 700; } .fristen-row-answer-icon { font-size: 1.05rem; line-height: 1; } .fristen-row-prefilled-tag { display: inline-flex; align-items: center; gap: 0.25rem; margin-left: 0.4rem; padding: 0.05rem 0.45rem; border-radius: 999px; background: color-mix(in srgb, var(--color-accent) 18%, transparent); color: var(--color-text-muted); font-size: 0.72rem; font-weight: 500; font-style: italic; text-transform: lowercase; letter-spacing: 0.02em; } /* Reference identifier (project.reference / "HL-2024-001") inside the * prefilled tag. Rendered upper-case and not italic so the project ID * stands out from the surrounding "aus Akte" italic text. */ .fristen-row-prefilled-ref { font-style: normal; text-transform: none; font-weight: 600; color: var(--color-text); } /* t-paliad-197 Slice 2 — auto-walk inline tooltip. Surfaces once per * user per browser when ≥ 2 cascade rows render in is-prefilled state. * Slots above the first prefilled row inside the stack so it reads as * a contextual hint rather than a global banner. The dismiss button * removes the element and writes a localStorage flag so the tooltip * never re-surfaces in this browser. */ .fristen-row-autowalk-tip { display: flex; align-items: flex-start; gap: 0.5rem; margin: 0.25rem 0 0.4rem; padding: 0.5rem 0.75rem; border: 1px solid color-mix(in srgb, var(--color-accent) 35%, var(--color-border)); border-left-width: 4px; border-radius: 6px; background: color-mix(in srgb, var(--color-accent) 8%, transparent); font-size: 0.85rem; color: var(--color-text); /* t-paliad-198 Slice 3: fade-in + slight slide-down on first paint. * The is-entering class is applied at injection and removed on the * next animation frame so the transition fires from the initial * offset state to the resting state. ~200ms keeps it subtle — the * user notices the hint without it feeling theatrical. */ opacity: 1; transform: translateY(0); transition: opacity 200ms ease, transform 200ms ease; } .fristen-row-autowalk-tip.is-entering { opacity: 0; transform: translateY(-4px); } /* Mobile (<640px): the tooltip sits below the prefilled row instead of * above it, so the user's eye lands on the row's "aus Akte" tag first * and reads the explanation beneath. The transform offset flips * accordingly. */ @media (max-width: 640px) { .fristen-row.is-prefilled + .fristen-row-autowalk-tip, .fristen-row-autowalk-tip { margin: 0 0 0.4rem; font-size: 0.8rem; } .fristen-row-autowalk-tip.is-entering { transform: translateY(4px); } } .fristen-row-autowalk-tip-icon { flex-shrink: 0; font-size: 1.05rem; line-height: 1.2; color: var(--color-accent); } .fristen-row-autowalk-tip-text { flex: 1 1 auto; } .fristen-row-autowalk-tip-dismiss { flex-shrink: 0; background: none; border: none; color: var(--color-text-muted); font-size: 1.1rem; line-height: 1; cursor: pointer; padding: 0 0.25rem; border-radius: 4px; } .fristen-row-autowalk-tip-dismiss:hover { color: var(--color-text); background: var(--color-bg-muted); } .fristen-row-autowalk-tip-dismiss:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 1px; } .fristen-row-edit { background: none; border: none; color: var(--color-text-muted); cursor: pointer; padding: 0.15rem 0.35rem; font-size: 0.8rem; text-decoration: underline; text-decoration-style: dotted; text-underline-offset: 3px; border-radius: 4px; opacity: 0; transition: opacity 120ms, color 120ms, background 120ms; } .fristen-row.is-answered:hover .fristen-row-edit, .fristen-row.is-prefilled .fristen-row-edit, .fristen-row:focus-within .fristen-row-edit { opacity: 1; } .fristen-row-edit:hover { color: var(--color-text); background: var(--color-bg-muted); } .fristen-row-edit:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 1px; } .fristen-row-body { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 0.5rem; margin-left: 2.1rem; } .fristen-row-chip { display: inline-flex; align-items: center; gap: 0.45rem; padding: 0.65rem 0.85rem; border: 1px solid var(--color-border); border-radius: 8px; background: var(--color-bg); cursor: pointer; font-size: 0.95rem; text-align: left; color: var(--color-text); transition: border-color 120ms, background 120ms; } .fristen-row-chip:hover { border-color: var(--color-accent); background: var(--color-bg-muted); } .fristen-row-chip:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; } .fristen-row-chip.is-picked { border-color: var(--color-accent); background: color-mix(in srgb, var(--color-accent) 12%, transparent); } .fristen-row-chip--leaf { /* Leaf nodes get a subtle accent marker so users sense they'll see results, not deeper buttons. */ border-left: 3px solid var(--color-accent); } .fristen-row-chip-icon { font-size: 1.2rem; line-height: 1; } .fristen-row-chip-label { flex: 1; } /* t-paliad-198 Slice 3 — responsive row-stack breakpoints (design §7). * * Default (above): desktop layout — head + chip body share the row, chips * wrap into a 3-column grid via auto-fill 220px. * * 768–1023px (tablet density): same head layout but chip grid drops to * 2 columns (auto-fill 200px) so each chip stays comfortably tappable. * * 640–767px (small tablet / large phone): head wraps so the ändern * affordance moves to its own line; chip grid is single-column to keep * the chip body legible. * * <640px (phone): chips full-width single-column; ändern stays * permanently visible (no hover state to reveal it on touch); the row * num badge tucks into the same line as the label to save vertical * space. */ @media (max-width: 1023px) { .fristen-row-body { grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); } } @media (max-width: 767px) { .fristen-row { padding: 0.6rem 0.75rem; } .fristen-row.is-active { padding: 0.85rem 0.85rem; } .fristen-row-head { gap: 0.4rem; } .fristen-row-body { grid-template-columns: 1fr; gap: 0.4rem; margin-left: 1.9rem; } .fristen-row-edit { opacity: 1; margin-left: auto; } } @media (max-width: 640px) { .fristen-row-body { grid-template-columns: 1fr; margin-left: 0; } .fristen-row-head { gap: 0.4rem; flex-wrap: wrap; } .fristen-row-answer { flex-basis: 100%; margin-left: 2rem; } .fristen-row-edit { opacity: 1; } .fristen-row-chip { padding: 0.75rem 0.85rem; } } .fristen-b1-loosen-link { background: none; border: 1px solid var(--color-border); border-radius: var(--radius); color: var(--color-text-muted); cursor: pointer; padding: 0.35rem 0.75rem; font-size: 0.9rem; margin-right: 0.5rem; transition: border-color 0.15s ease, color 0.15s ease; } .fristen-b1-loosen-link:hover { border-color: var(--color-text-muted); color: var(--color-text); } .fristen-b1-loosen-link:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; } .fristen-b1-error { padding: 1rem; color: var(--color-text-muted); font-style: italic; } .fristen-forum-filter { display: flex; flex-wrap: wrap; align-items: center; gap: 0.6rem; margin: 0.75rem 0 1rem; } .fristen-forum-filter-label { font-size: 0.9rem; color: var(--color-text-muted); } .fristen-forum-chips { display: flex; flex-wrap: wrap; gap: 0.4rem; } .fristen-forum-chip { display: inline-flex; align-items: center; padding: 0.25rem 0.65rem; border: 1px solid var(--color-border); border-radius: 999px; background: var(--color-bg); cursor: pointer; font-size: 0.85rem; color: var(--color-text); transition: background 120ms, border-color 120ms; } .fristen-forum-chip:hover { background: var(--color-bg-muted); } .fristen-forum-chip--active { background: var(--color-accent); border-color: var(--color-accent); color: var(--color-accent-text, #000); font-weight: 500; } /* Phase D search (t-paliad-131) — augments the proceeding tile grid by letting the user type a phrase and drill into the right calculator from a ranked card list. Sits above the mode tabs. */ .fristen-search { margin-bottom: 1.5rem; } .fristen-search-row { position: relative; display: flex; align-items: center; } .fristen-search-icon { position: absolute; left: 0.875rem; color: var(--color-muted, #777); pointer-events: none; } .fristen-search-input { flex: 1; width: 100%; padding: 0.75rem 2.5rem 0.75rem 2.6rem; font-size: 1rem; border: 1px solid var(--color-border, #ddd); border-radius: 8px; background: var(--color-bg, #fff); color: var(--color-text, #222); } .fristen-search-input:focus { outline: none; border-color: var(--color-accent, #c6f41c); box-shadow: 0 0 0 3px rgba(198, 244, 28, 0.25); } .fristen-search-clear { position: absolute; right: 0.5rem; width: 28px; height: 28px; border: none; background: transparent; color: var(--color-muted, #777); font-size: 1.4rem; line-height: 1; cursor: pointer; border-radius: 50%; } .fristen-search-clear:hover { background: var(--color-bg-subtle, #f4f4f4); color: var(--color-text, #222); } .fristen-search-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; margin-top: 0.75rem; } .fristen-search-chips-label { font-size: 0.875rem; color: var(--color-muted, #666); margin-right: 0.25rem; } .fristen-search-chip { padding: 0.3rem 0.7rem; border: 1px solid var(--color-border, #ddd); border-radius: 999px; background: var(--color-bg, #fff); color: var(--color-text, #222); font-size: 0.85rem; cursor: pointer; transition: background 120ms, border-color 120ms; } .fristen-search-chip:hover { background: var(--color-bg-subtle, #f7f7f7); border-color: var(--color-text-muted, #aaa); } .fristen-search-chip:focus-visible { outline: 2px solid var(--color-accent, #c6f41c); outline-offset: 1px; } .fristen-search-results, .fristen-b1-results { margin-top: 1rem; } .fristen-search-results.is-loading, .fristen-b1-results.is-loading { opacity: 0.55; transition: opacity 0.15s ease; pointer-events: none; } .fristen-b1-results { margin-top: 1.5rem; } .fristen-search-status { padding: 1rem; color: var(--color-muted, #666); font-size: 0.95rem; text-align: center; } .fristen-search-error { color: var(--color-error, #b00020); } .fristen-search-summary { font-size: 0.85rem; color: var(--color-muted, #666); margin-bottom: 0.5rem; } .fristen-search-cards { display: flex; flex-direction: column; gap: 1rem; } .fristen-card { border: 1px solid var(--color-border, #ddd); border-radius: 10px; padding: 1rem 1.1rem; background: var(--color-bg, #fff); } .fristen-card-header { display: flex; align-items: baseline; gap: 0.6rem; flex-wrap: wrap; margin-bottom: 0.25rem; } .fristen-card-title { font-size: 1.05rem; font-weight: 600; margin: 0; color: var(--color-text, #222); } .fristen-card-altname { font-size: 0.85rem; color: var(--color-muted, #777); font-style: italic; } .fristen-card-desc { margin: 0.25rem 0 0.5rem; font-size: 0.92rem; color: var(--color-text-muted, #555); line-height: 1.45; } .fristen-card-aliases { font-size: 0.82rem; color: var(--color-muted, #888); margin-bottom: 0.6rem; } .fristen-card-aliases-label { font-weight: 500; color: var(--color-muted, #777); margin-right: 0.25rem; } .fristen-card-pills-section { margin-top: 0.7rem; } .fristen-card-pills-heading { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--color-muted, #888); margin: 0 0 0.4rem; font-weight: 600; } .fristen-card-pills { display: flex; flex-direction: column; gap: 0.35rem; } /* Each pill is one (proceeding × rule) or one cross-cutting trigger. Click navigates into the right calculator mode pre-selected. The anchor element preserves middle-click / cmd-click "open in new tab" semantics — the JS handler skips drill-in for those modifier clicks. */ .fristen-pill { display: grid; grid-template-columns: minmax(0, 1.3fr) minmax(0, 1.5fr) minmax(0, 1fr) auto auto; gap: 0.6rem; align-items: center; padding: 0.5rem 0.75rem; border: 1px solid var(--color-border-subtle, #ececec); border-radius: 6px; background: var(--color-bg-subtle, #fafafa); color: var(--color-text, #222); text-decoration: none; cursor: pointer; transition: background 120ms, border-color 120ms; } .fristen-pill:hover { background: rgba(198, 244, 28, 0.08); border-color: var(--color-accent, #c6f41c); } .fristen-pill:focus-visible { outline: 2px solid var(--color-accent, #c6f41c); outline-offset: 1px; } .fristen-pill-proc { font-weight: 600; font-size: 0.86rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .fristen-pill-proc--cross { font-style: italic; color: var(--color-muted, #888); } .fristen-pill-rule { font-size: 0.86rem; color: var(--color-text-muted, #444); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .fristen-pill-source { font-family: var(--font-mono, ui-monospace, "SF Mono", Menlo, monospace); font-size: 0.8rem; color: var(--color-muted, #666); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .fristen-pill-duration { font-size: 0.82rem; color: var(--color-text-muted, #444); white-space: nowrap; } .fristen-pill-party { font-size: 0.74rem; padding: 0.1rem 0.45rem; border-radius: 999px; border: 1px solid transparent; white-space: nowrap; } .fristen-pill-party--claimant { background: rgba(54, 160, 255, 0.12); color: #1a6dba; border-color: rgba(54, 160, 255, 0.3); } .fristen-pill-party--defendant { background: rgba(220, 90, 60, 0.12); color: #a0381f; border-color: rgba(220, 90, 60, 0.3); } .fristen-pill-party--both { background: rgba(120, 120, 120, 0.12); color: #555; border-color: rgba(120, 120, 120, 0.3); } .fristen-pill-party--court { background: rgba(190, 130, 0, 0.12); color: #8a5d00; border-color: rgba(190, 130, 0, 0.3); } @media (max-width: 720px) { .fristen-pill { grid-template-columns: 1fr auto; grid-template-rows: auto auto auto; row-gap: 0.25rem; } .fristen-pill-rule { grid-column: 1 / -1; } .fristen-pill-source { grid-column: 1 / -1; } .fristen-pill-duration { grid-column: 1; } .fristen-pill-party { grid-column: 2; } } /* v4 (t-paliad-136 Phase B): card-click → inline calc panel. The card is now interactive — click anywhere in the body (or on a pill) to expand the panel that holds the trigger-date input, flag checkboxes, computed deadline, and "Add to project" CTA. Only one card may be expanded at a time; opening another collapses the previous. */ .fristen-card[role="button"] { cursor: pointer; transition: border-color 120ms, box-shadow 120ms; } .fristen-card[role="button"]:hover:not(.is-expanded) { border-color: var(--brand-lime, #c6f41c); box-shadow: 0 0 0 2px rgba(198, 244, 28, 0.18); } .fristen-card.is-expanded { border-color: var(--brand-lime, #c6f41c); box-shadow: 0 0 0 2px rgba(198, 244, 28, 0.25); } .fristen-card-calc { margin-top: 1rem; padding: 0.9rem 1rem 0.8rem; border-top: 1px dashed var(--color-border, #e2e2e2); background: rgba(198, 244, 28, 0.04); border-radius: 0 0 8px 8px; display: flex; flex-direction: column; gap: 0.7rem; position: relative; cursor: default; } .fristen-card-calc-close { position: absolute; top: 0.4rem; right: 0.5rem; background: transparent; border: 0; font-size: 1.4rem; line-height: 1; color: var(--color-muted, #888); cursor: pointer; padding: 0.1rem 0.4rem; } .fristen-card-calc-close:hover { color: var(--color-text, #222); } .fristen-card-calc-label { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--color-muted, #777); font-weight: 600; display: block; margin-bottom: 0.3rem; } .fristen-card-calc-pill-picker { border: 0; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.3rem; } .fristen-card-calc-pill-picker legend { padding: 0; margin-bottom: 0.3rem; } .fristen-card-calc-pill-option { display: grid; grid-template-columns: auto minmax(0, 1.2fr) minmax(0, 1.5fr) minmax(0, 1fr); gap: 0.5rem; align-items: center; padding: 0.4rem 0.6rem; border: 1px solid var(--color-border-subtle, #ececec); border-radius: 5px; background: var(--color-bg, #fff); cursor: pointer; font-size: 0.88rem; } .fristen-card-calc-pill-option:has(input:checked) { border-color: var(--brand-lime, #c6f41c); background: rgba(198, 244, 28, 0.08); } .fristen-card-calc-pill-option-proc { font-weight: 600; color: var(--color-text, #222); } .fristen-card-calc-pill-option-rule { color: var(--color-text, #222); } .fristen-card-calc-pill-option-source { font-size: 0.8rem; color: var(--color-muted, #888); font-family: ui-monospace, monospace; } /* m/paliad#57 part 4 — once a card is expanded into a calc panel, the rule-pill list is redundant with the calc panel's context picker (locked caption or fieldset). Hide it so the user isn't asked the same thing twice. The cross-cutting section stays — those pills are alternative concepts to explore, not the same proceeding context. */ .fristen-card.is-expanded .fristen-card-pills-section--rules { display: none; } /* Locked-context caption when the user clicked a specific rule pill to expand. Shows the picked (proceeding, rule) tuple compactly with a small "ändern" button to swap back to the radio picker. */ .fristen-card-calc-pill-locked { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.4rem; padding: 0.35rem 0.55rem; border: 1px solid var(--color-border-subtle, #ececec); border-radius: 5px; background: rgba(198, 244, 28, 0.06); font-size: 0.88rem; } .fristen-card-calc-pill-locked-label { font-weight: 600; color: var(--color-muted, #777); text-transform: uppercase; font-size: 0.74rem; letter-spacing: 0.04em; } .fristen-card-calc-pill-locked-proc { font-weight: 600; color: var(--color-text, #222); } .fristen-card-calc-pill-locked-rule { color: var(--color-text, #222); } .fristen-card-calc-pill-locked-source { font-size: 0.8rem; color: var(--color-muted, #888); font-family: ui-monospace, monospace; } .fristen-card-calc-pill-change { margin-left: auto; background: transparent; border: 0; padding: 0; color: var(--color-link, #1267a8); cursor: pointer; font-size: 0.82rem; text-decoration: underline; } .fristen-card-calc-pill-change:hover { text-decoration: none; } .fristen-card-calc-inputs { display: flex; flex-wrap: wrap; gap: 1rem; align-items: flex-end; } .fristen-card-calc-trigger { display: flex; flex-direction: column; min-width: 200px; } .fristen-card-calc-trigger-input { padding: 0.45rem 0.6rem; border: 1px solid var(--color-border, #ddd); border-radius: 5px; font-size: 0.95rem; background: var(--color-bg, #fff); } .fristen-card-calc-flags { display: flex; flex-wrap: wrap; gap: 0.6rem; align-items: center; } .fristen-card-calc-flag { display: inline-flex; gap: 0.35rem; align-items: center; font-size: 0.88rem; padding: 0.3rem 0.55rem; background: var(--color-bg, #fff); border: 1px solid var(--color-border-subtle, #ececec); border-radius: 4px; cursor: pointer; } .fristen-card-calc-flag:has(input:checked) { border-color: var(--brand-lime, #c6f41c); background: rgba(198, 244, 28, 0.08); } .fristen-card-calc-result { padding: 0.6rem 0.8rem; background: var(--color-bg, #fff); border: 1px solid var(--color-border-subtle, #ececec); border-radius: 6px; min-height: 2.6rem; } .fristen-card-calc-result-row { display: flex; align-items: baseline; gap: 0.5rem; flex-wrap: wrap; } .fristen-card-calc-result-arrow { color: var(--brand-lime-strong, #88a800); font-weight: 700; } .fristen-card-calc-result-due strong { font-size: 1.1rem; color: var(--color-text, #222); } .fristen-card-calc-result-detail { color: var(--color-muted, #777); font-size: 0.88rem; } .fristen-card-calc-result-rule { color: var(--color-muted, #888); font-size: 0.83rem; margin-top: 0.3rem; font-style: italic; } .fristen-card-calc-result-shift { margin-top: 0.4rem; padding: 0.4rem 0.55rem; background: rgba(255, 184, 0, 0.1); border-left: 3px solid #f5a800; border-radius: 3px; font-size: 0.85rem; color: #6c4a00; } .fristen-card-calc-result-status { color: var(--color-muted, #888); font-size: 0.9rem; font-style: italic; } .fristen-card-calc-result-error { color: var(--color-danger, #c44); font-style: normal; } .fristen-card-calc-result-court { color: #8a5d00; font-style: normal; } .fristen-card-calc-actions { display: flex; gap: 0.5rem; align-items: center; } .fristen-card-calc-add[disabled] { opacity: 0.55; cursor: not-allowed; } .fristen-card-calc-msg { font-size: 0.88rem; min-height: 0; } .fristen-card-calc-msg .form-msg { display: inline-block; padding: 0.3rem 0.55rem; border-radius: 4px; } .fristen-card-calc-msg .form-msg-ok { background: rgba(140, 200, 80, 0.15); color: #2e6a16; } .fristen-card-calc-msg .form-msg-error { background: rgba(200, 60, 60, 0.1); color: #a31919; } .fristen-card-calc-add-picker { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: flex-end; padding: 0.5rem; border: 1px solid var(--color-border-subtle, #ececec); border-radius: 5px; background: var(--color-bg, #fff); } .fristen-card-calc-add-select { padding: 0.4rem 0.55rem; border: 1px solid var(--color-border, #ddd); border-radius: 4px; min-width: 240px; font-size: 0.95rem; } @media (max-width: 720px) { .fristen-card-calc-pill-option { grid-template-columns: auto 1fr; grid-template-rows: auto auto; } .fristen-card-calc-pill-option-rule, .fristen-card-calc-pill-option-source { grid-column: 2; } } /* Drill-in highlight — applied to the focused timeline / column row for ~2.4 s after a pill click pre-selects the proceeding and computes the timeline. Fades the row to draw attention without staying loud. */ .fristen-focus-highlight { animation: fristen-focus-pulse 2.4s ease-out; border-radius: 6px; } @keyframes fristen-focus-pulse { 0% { background: rgba(198, 244, 28, 0.55); box-shadow: 0 0 0 4px rgba(198, 244, 28, 0.35); } 40% { background: rgba(198, 244, 28, 0.30); } 100% { background: transparent; box-shadow: 0 0 0 0 transparent; } } .fristen-mode-tabs { display: flex; gap: 0.5rem; margin-bottom: 1.5rem; border-bottom: 1px solid var(--color-border); } .mode-tab { background: transparent; border: none; border-bottom: 2px solid transparent; padding: 0.6rem 1rem; font-size: 0.95rem; font-weight: 500; color: var(--color-text-muted); cursor: pointer; margin-bottom: -1px; } .mode-tab:hover { color: var(--color-text); } .mode-tab.is-active { color: var(--color-text); border-bottom-color: var(--color-accent); font-weight: 600; } .mode-panel[hidden] { display: none; } .fristen-wizard { max-width: 720px; } /* --- Event mode (Was kommt nach…) --- */ .wizard-step-hint { color: var(--color-text-muted); font-size: 0.9rem; margin: -0.4rem 0 1rem; } .event-picker-row { display: flex; flex-direction: column; gap: 0.5rem; } .event-search-input { width: 100%; padding: 0.6rem 0.8rem; font-size: 1rem; border: 1px solid var(--color-border); border-radius: 6px; background: var(--color-surface); color: var(--color-text); } .event-search-input:focus { outline: 2px solid var(--color-accent); outline-offset: 1px; } .event-list { list-style: none; margin: 0; padding: 0; max-height: 320px; overflow-y: auto; border: 1px solid var(--color-border); border-radius: 6px; background: var(--color-surface); } .event-list-item { padding: 0.55rem 0.8rem; cursor: pointer; border-bottom: 1px solid var(--color-border); font-size: 0.92rem; line-height: 1.35; } .event-list-item:last-child { border-bottom: none; } .event-list-item:hover, .event-list-item:focus { background: var(--color-bg-lime-tint); outline: none; } .event-list-empty { padding: 1rem; color: var(--color-text-muted); font-style: italic; text-align: center; } .event-results-header { background: var(--color-surface-muted); border-radius: 6px; padding: 0.8rem 1rem; margin-bottom: 1rem; font-size: 0.95rem; line-height: 1.5; } .event-results-empty { padding: 1rem; color: var(--color-text-muted); font-style: italic; } .event-result-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.6rem; } .event-result-row { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: 6px; padding: 0.8rem 1rem; } .event-result-header { display: flex; justify-content: space-between; gap: 1rem; margin-bottom: 0.4rem; flex-wrap: wrap; } .event-result-title { font-weight: 600; color: var(--color-text); } .event-result-date { font-variant-numeric: tabular-nums; color: var(--color-accent-fg); font-weight: 600; } .event-result-meta { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: center; font-size: 0.85rem; color: var(--color-text-muted); } .event-result-duration { background: var(--color-surface-muted); padding: 0.15rem 0.5rem; border-radius: 4px; } .event-rule-code { background: var(--color-bg-lime-tint); color: var(--color-accent-fg); padding: 0.15rem 0.5rem; border-radius: 4px; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 0.78rem; } .event-result-composite, .event-result-adjusted { margin-top: 0.4rem; font-size: 0.82rem; color: var(--color-text-muted); font-style: italic; } .event-result-notes { margin-top: 0.4rem; font-size: 0.85rem; color: var(--color-text); line-height: 1.4; } .visually-hidden { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } .wizard-step { margin-bottom: 2rem; } .wizard-step-label { font-size: 0.92rem; font-weight: 600; margin-bottom: 1rem; display: flex; align-items: center; gap: 0.6rem; } .step-number { display: inline-flex; align-items: center; justify-content: center; width: 1.5rem; height: 1.5rem; border-radius: 50%; background: var(--color-accent); color: var(--color-accent-dark); font-size: 0.75rem; font-weight: 700; flex-shrink: 0; } .proceeding-group { margin-bottom: 1.25rem; } .proceeding-group h4 { font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.06em; color: var(--color-text-muted); margin-bottom: 0.5rem; } /* Sub-group inside a .proceeding-group — used today by the DE block to split Verletzungsverfahren tiles from Nichtigkeitsverfahren tiles under one "Deutsche Gerichte" h4. Heading is one tier below the h4 (mixed-case, no upper-tracking) so the two-level hierarchy reads at a glance. */ .proceeding-subgroup { margin-top: 0.6rem; } .proceeding-subgroup:first-child { margin-top: 0; } .proceeding-subgroup-heading { font-size: 0.78rem; font-weight: 600; color: var(--color-text); margin: 0 0 0.35rem 0; } .proceeding-btns { display: flex; flex-wrap: wrap; gap: 0.5rem; } .proceeding-btn { font-family: var(--font-sans); font-size: 0.85rem; padding: 0.6rem 1rem; border: 1px solid var(--color-border); border-radius: var(--radius); background: var(--color-surface); color: var(--color-text); cursor: pointer; transition: all 0.15s ease; text-align: left; display: flex; flex-direction: column; gap: 0.1rem; } .proceeding-btn:hover { border-color: var(--color-accent); box-shadow: var(--shadow); } .proceeding-btn.active { border-color: var(--color-accent); background: rgb(var(--hlc-lime-rgb) / 0.06); box-shadow: 0 0 0 3px rgb(var(--hlc-lime-rgb) / 0.15); } .proceeding-btn strong { font-weight: 500; } /* Date input */ .date-input-group { display: flex; flex-direction: column; gap: 0.75rem; max-width: 400px; } .date-field-row { display: flex; align-items: center; gap: 0.75rem; } /* Nested checkbox under a parent flag (e.g. upc.inf.cfi inf-amend-flag is only meaningful with ccr-flag on — indent so the dependency is visible). */ .date-field-row--nested { margin-left: 1.5rem; } .date-field-row--nested input[type="checkbox"]:disabled + span { color: var(--color-text-muted); } .date-label { font-size: 0.85rem; font-weight: 500; color: var(--color-text); min-width: 160px; } .trigger-event-name { font-size: 0.88rem; font-weight: 600; color: var(--color-accent-fg); } .date-input { font-family: var(--font-sans); font-size: 0.92rem; padding: 0.5rem 0.7rem; border: 1px solid var(--color-border); border-radius: var(--radius); background: var(--color-surface); color: var(--color-text); outline: none; } .date-input:focus { border-color: var(--color-accent); box-shadow: 0 0 0 3px rgb(var(--hlc-lime-rgb) / 0.15); } .calculate-btn { font-family: var(--font-sans); font-size: 0.88rem; font-weight: 600; padding: 0.6rem 1.25rem; border: none; border-radius: var(--radius); background: var(--color-accent); color: var(--color-accent-dark); cursor: pointer; transition: background 0.15s ease; align-self: flex-start; } .calculate-btn:hover { background: var(--color-accent-light); } .reset-btn { font-family: var(--font-sans); font-size: 0.82rem; font-weight: 500; padding: 0.5rem 1rem; border: 1px solid var(--color-border); border-radius: var(--radius); background: var(--color-surface); color: var(--color-text-muted); cursor: pointer; transition: all 0.15s ease; } .reset-btn:hover { border-color: var(--color-accent); color: var(--color-accent-fg); } /* Timeline */ .timeline-header { margin-bottom: 1.25rem; padding-bottom: 0.75rem; border-bottom: 2px solid var(--color-accent); } .timeline-header strong { font-size: 1rem; } /* Sub-track contextual note banner (m/paliad#58). Renders above the timeline body when the picked proceeding is a sub-track of another proceeding (e.g. UPC CCR rendered standalone). Plain-text content; white-space: pre-line preserves paragraph breaks if server copy ever uses them. */ .timeline-context-note { margin: 0 0 1rem; padding: 0.7rem 0.9rem; background: rgba(198, 244, 28, 0.10); border-left: 3px solid var(--brand-lime, #c6f41c); border-radius: 4px; color: var(--color-text, #222); font-size: 0.9rem; line-height: 1.4; white-space: pre-line; } .timeline { position: relative; } .timeline-item { display: flex; gap: 0.75rem; /* t-paliad-293: tighter min-height. Previously 4rem — too much vertical air per card on long projections. Title row + meta row fits comfortably in 2.75rem; longer cards (with notes expanded or adjusted-date banners) still grow naturally. */ min-height: 2.75rem; } .timeline-item:last-child .timeline-line { display: none; } .timeline-dot-col { display: flex; flex-direction: column; align-items: center; width: 14px; flex-shrink: 0; } .timeline-dot { width: 10px; height: 10px; border-radius: 50%; background: var(--color-accent); border: 2px solid var(--color-surface); box-shadow: 0 0 0 2px var(--color-accent); flex-shrink: 0; margin-top: 0.35rem; } .dot-root { width: 14px; height: 14px; margin-top: 0.2rem; } .timeline-line { width: 2px; flex: 1; background: var(--color-border); margin: 0.25rem 0; } .timeline-content { flex: 1; /* t-paliad-293: tighter inter-card gutter. Was 1rem; 0.6rem keeps the dotted-connector line readable without bloating long projections. */ padding-bottom: 0.6rem; min-width: 0; } .timeline-item-header { display: flex; justify-content: space-between; align-items: flex-start; gap: 0.5rem; /* t-paliad-293: allow shrink + wrap so a long title plus the state icons + caret never push the card past its column. Combined with min-width:0 on the name, no inline child can blow the row width on 375/414/768 viewports. */ flex-wrap: wrap; min-width: 0; } .timeline-name { font-size: 0.88rem; font-weight: 500; /* min-width:0 lets the name shrink and wrap inside its flex parent — otherwise overflow:hidden in an ancestor would clip it but the flex item would still demand its intrinsic width. */ min-width: 0; /* Word-break on long German compounds (Vertraulichkeitswiderklage …) so they wrap mid-word rather than pushing the date column off- screen. (t-paliad-293) */ overflow-wrap: anywhere; } .timeline-date { font-family: var(--font-mono); font-size: 0.85rem; font-weight: 600; color: var(--color-text); white-space: nowrap; } .timeline-court-set { font-size: 0.82rem; color: var(--color-text-muted); font-style: italic; text-align: right; } /* t-paliad-131: click-to-edit on timeline / column dates. Lets the user override the calculated date (court extension) or fill in a court-set placeholder once the real decision date is known. Subtle hover hint — the affordance must be discoverable without dominating the layout. The inline editor input replaces the span on click and commits on blur / Enter. */ .frist-date-edit { cursor: pointer; border-bottom: 1px dashed transparent; transition: border-color 120ms ease, background-color 120ms ease; } .frist-date-edit:hover, .frist-date-edit:focus-visible { border-bottom-color: var(--color-text-muted); outline: none; } .timeline-date--overridden { color: var(--color-accent-fg, #4d7c0f); border-bottom: 1px solid var(--color-accent, #c6f41c); } .frist-date-edit-input { font-family: var(--font-mono); font-size: 0.85rem; font-weight: 600; padding: 0.1rem 0.3rem; border: 1px solid var(--color-accent, #c6f41c); border-radius: 3px; background: var(--color-bg); color: var(--color-text); } .timeline-meta { display: flex; align-items: center; gap: 0.5rem; margin-top: 0.25rem; } .party-badge { font-size: 0.7rem; font-weight: 500; padding: 0.1rem 0.45rem; border-radius: 99px; } .party-claimant { background: var(--status-blue-bg); color: var(--status-blue-fg); } .party-defendant { background: var(--status-amber-bg); color: var(--status-amber-fg); } .party-court { background: var(--status-blue-soft-bg); color: var(--status-blue-soft-fg); } .party-both { background: var(--status-neutral-bg); color: var(--status-neutral-fg-3); } /* t-paliad-293 — compact state icons in the card title row. They * replace the legacy `.optional-badge` text chip and add a uniform * language for the per-card decision state ("cut the tree of * possibilities"). Each icon carries its own modifier so the tint * matches the state semantic. The glyph itself is the primary signal; * the i18n tooltip on the span carries the accessible description. */ .timeline-state-icon { display: inline-flex; align-items: center; justify-content: center; min-width: 1rem; height: 1rem; margin-left: 0.3rem; font-size: 0.85rem; line-height: 1; color: var(--color-text-muted); cursor: help; user-select: none; /* Cancel the wrapper fade so the marker stays legible inside .timeline-item--hidden which fades the whole content panel. */ opacity: 1; } .timeline-state-icon--optional { color: var(--status-amber-fg); } .timeline-state-icon--hidden { color: var(--color-text-muted); } /* t-paliad-265 — per-event-card optional choices. The caret sits in * the card header next to the date; the chip surfaces the active pick * inline with the title; the popover is body-attached and positioned * by the JS module. Skipped rows fade to 50% opacity. */ .event-card-choices-caret { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; margin-left: 0.4rem; border: 1px solid var(--color-border, #d4d4d4); border-radius: 4px; background: transparent; color: var(--color-text-muted); font-size: 0.85rem; cursor: pointer; line-height: 1; } .event-card-choices-caret:hover, .event-card-choices-caret:focus-visible { background: var(--color-accent-bg, rgba(198, 244, 28, 0.18)); color: var(--color-text); } .event-card-choices-chip { display: inline-flex; gap: 0.3rem; margin-left: 0.4rem; } .event-card-choices-chip[data-empty="true"] { display: none; } .event-card-choices-chip-part { font-size: 0.7rem; font-weight: 500; padding: 0.05rem 0.4rem; border-radius: 99px; background: var(--color-accent-bg, rgba(198, 244, 28, 0.22)); color: var(--color-text); } .event-card-choices-chip-part--skipped { background: var(--color-bg-soft, #f1f1f1); color: var(--color-text-muted); text-decoration: line-through; } .timeline-item--skipped { opacity: 0.55; } /* t-paliad-290 (m/paliad#122) — re-surfaced "hidden" cards. The user * has previously marked these optional events as "Überspringen"; the * "Ausgeblendete anzeigen" toggle on /tools/verfahrensablauf returns * them with a faded + dotted-border treatment so they're visually * distinct from the active timeline. The inline "Wieder einblenden" * chip cancels the skip on click. */ .timeline-item--hidden .timeline-content, .fr-col-item--hidden { opacity: 0.55; border: 1px dotted var(--color-border, #d4d4d4); border-radius: 6px; padding: 0.3rem 0.5rem; } /* t-paliad-293 — prominent "Wieder einblenden" entry inside the caret * popover. Surfaced only when the caret is opened on a hidden card * (data-is-hidden="1"). Used to be an inline chip in the card header, * but that caused horizontal scroll on narrow viewports (m/paliad#125) * because its German label is wide ("Wieder einblenden") and the * card header is a non-wrapping flex row. Moving it into the popover * removes the surface entirely and matches m's "actions live in the * caret menu" framing. */ .event-card-choices-block--unhide { /* No top border separator — this block sits at the top of the popover with the highest visual priority. */ padding-top: 0; border-top: 0; margin-top: 0; } .event-card-choices-unhide-btn { display: block; width: 100%; padding: 0.4rem 0.6rem; font-size: 0.82rem; font-weight: 600; border-radius: 4px; border: 1px solid var(--color-accent, #c6f41c); background: var(--color-accent, #c6f41c); /* Match the active-option pin (lime fg → midnight text) so the button reads against the lime in both light and dark themes (m/paliad#123). */ color: var(--color-accent-dark); cursor: pointer; transition: background 120ms ease; } .event-card-choices-unhide-btn:hover, .event-card-choices-unhide-btn:focus-visible { background: var(--color-bg, #fff); color: var(--color-text); outline: none; } .show-hidden-count { font-size: 0.78rem; color: var(--color-text-muted); margin-left: 0.4rem; } /* t-paliad-289: rules whose anchor is uncertain (court-set ancestor without override, backward-anchor with unset forward date, optional event not recorded). The "abhängig von