/* Design-System "Petrol · Volt · Kupfer" v2.1 (H:\design-system-econsult.md), projektübergreifendes Update für die Econsult-Familie (siehe elt-planung-suite). Bootstrap bleibt Basis für Formulare/Tabellen/Modals; wir tönen die vorhandenen Bootstrap-Komponenten über deren eigene --bs-btn-*-Variablen um (globals.css lädt nach bootstrap.min.css, gleiche Spezifität gewinnt per Ladereihenfolge) statt Bootstrap zu ersetzen. */ :root { --color-primary: #1c3f52; /* Petrol */ --color-primary-dark: #0f2733; /* Petrol Dark */ --color-primary-deep: #0a1920; /* Petrol Deep */ --color-accent: #4e7e93; /* Petrol Light */ --color-accent-pale: #9dbac9; /* Petrol Pale */ --color-signal: #3fa66b; /* Volt - generelle aktiv/positiv-Farbe */ --color-signal-dark: #237a47; --color-attention: #c97a3b; /* Kupfer - bewusst selten, "braucht Aufmerksamkeit" */ --color-attention-dark: #9c5a26; --color-ink: #182229; /* Graphite */ --color-ink-soft: #59666d; /* Slate */ --color-bg: #ffffff; --color-surface: #f1f2ee; /* Fog */ --color-border: #dee2dc; --color-danger: #b04035; --color-danger-bg: #f7e6e3; --color-warn: #a9791e; --font-head: system-ui, "Segoe UI", "Helvetica Neue", sans-serif; --font-body: system-ui, "Segoe UI", "Helvetica Neue", sans-serif; --space-xs: 4px; --space-sm: 8px; --space-md: 16px; --space-lg: 24px; --space-xl: 40px; --radius: 12px; } html { scroll-behavior: smooth; } body { background-color: var(--color-surface); color: var(--color-ink); } a { color: var(--color-primary); } /* ── Bootstrap-Einfärbung auf Petrol/Volt/Kupfer ────────────────────────── */ .btn-primary { --bs-btn-bg: var(--color-primary); --bs-btn-border-color: var(--color-primary); --bs-btn-hover-bg: var(--color-primary-dark); --bs-btn-hover-border-color: var(--color-primary-dark); --bs-btn-active-bg: var(--color-primary-deep); --bs-btn-active-border-color: var(--color-primary-deep); --bs-btn-disabled-bg: var(--color-primary); --bs-btn-disabled-border-color: var(--color-primary); } .btn-outline-primary { --bs-btn-color: var(--color-primary); --bs-btn-border-color: var(--color-primary); --bs-btn-hover-bg: var(--color-primary); --bs-btn-hover-border-color: var(--color-primary); --bs-btn-active-bg: var(--color-primary-dark); --bs-btn-active-border-color: var(--color-primary-dark); } .btn-success, .btn-outline-success { --bs-btn-bg: var(--color-signal); --bs-btn-border-color: var(--color-signal); --bs-btn-color: #fff; --bs-btn-hover-bg: var(--color-signal-dark); --bs-btn-hover-border-color: var(--color-signal-dark); --bs-btn-active-bg: var(--color-signal-dark); --bs-btn-active-border-color: var(--color-signal-dark); } .btn-outline-success { --bs-btn-bg: transparent; --bs-btn-color: var(--color-signal-dark); --bs-btn-hover-color: #fff; } .form-control:focus, .form-select:focus { border-color: var(--color-accent); box-shadow: 0 0 0 0.25rem rgba(28, 63, 82, 0.15); } .form-check-input:checked { background-color: var(--color-primary); border-color: var(--color-primary); } .text-bg-secondary { background-color: var(--color-surface) !important; color: var(--color-ink-soft) !important; } .alert-success { --bs-alert-color: var(--color-signal-dark); --bs-alert-bg: #eaf6f0; --bs-alert-border-color: #b6e2ce; } /* ── App-Shell / Seitenleiste (nur auf der Projektseite) ────────────────── */ .app-shell { display: grid; grid-template-columns: 260px 1fr; min-height: 100vh; } .sidebar { background: linear-gradient( 160deg, var(--color-primary-deep) 0%, var(--color-primary-dark) 45%, var(--color-primary) 100% ); color: #fff; display: flex; flex-direction: column; position: sticky; top: 0; height: 100vh; overflow-y: auto; } .sidebar-brand { padding: 22px 22px 18px; border-bottom: 1px solid rgba(255, 255, 255, 0.12); } .sidebar-wordmark { font-size: 1.2rem; font-weight: 700; color: #fff; } .sidebar-bar { height: 3px; background: linear-gradient(90deg, var(--color-signal), var(--color-attention)); margin-top: 9px; width: 42px; border-radius: 2px; } .sidebar-tag { font-size: 0.72rem; letter-spacing: 0.13em; text-transform: uppercase; color: var(--color-accent-pale); margin-top: 10px; } .sidebar-nav { display: flex; flex-direction: column; gap: 2px; padding: 12px; } .sidebar-section-label { font-size: 0.66rem; letter-spacing: 0.1em; text-transform: uppercase; color: rgba(199, 214, 224, 0.7); padding: 16px 14px 4px; } .sidebar-link { display: flex; align-items: center; gap: 10px; padding: 10px 14px; border-radius: 8px; color: #c7d6e0; text-decoration: none; font-size: 0.92rem; font-weight: 500; border: 0; background: transparent; width: 100%; text-align: left; cursor: pointer; } .sidebar-link:hover { background: rgba(255, 255, 255, 0.08); color: #fff; text-decoration: none; } .sidebar-link.active { background: rgba(255, 255, 255, 0.14); color: #fff; box-shadow: inset 3px 0 0 var(--color-signal); } .sidebar-icon { width: 1.1em; display: inline-flex; justify-content: center; } .app-shell-content { width: 100%; min-width: 0; } .page-header { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--space-md); margin-bottom: var(--space-lg); flex-wrap: wrap; } .page-header h1 { font-size: 1.5rem; font-weight: 700; color: var(--color-primary); } .kicker { font-size: 0.72rem; letter-spacing: 0.12em; text-transform: uppercase; color: var(--color-accent); margin-bottom: 2px; font-weight: 600; } /* ── KPI-Kacheln ─────────────────────────────────────────────────────── */ .kpi-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: var(--space-md); margin-bottom: var(--space-lg); } .kpi { background: var(--color-bg); border: 1px solid var(--color-border); border-radius: 9px; padding: 13px 15px; display: block; color: inherit; text-decoration: none; transition: box-shadow 0.15s, transform 0.15s; } a.kpi:hover { color: inherit; text-decoration: none; box-shadow: 0 3px 8px rgba(15, 39, 51, 0.07), 0 16px 32px -14px rgba(15, 39, 51, 0.28); transform: translateY(-1px); } .kpi-label { font-size: 0.66rem; letter-spacing: 0.06em; text-transform: uppercase; color: var(--color-ink-soft); margin-bottom: var(--space-xs); font-weight: 600; display: flex; align-items: center; gap: 6px; } .kpi-value { font-size: 1.2rem; font-weight: 700; line-height: 1.1; color: var(--color-primary); } .card { border-radius: var(--radius); border-top: 3px solid var(--color-primary); box-shadow: 0 1px 2px rgba(15, 39, 51, 0.05), 0 10px 24px -14px rgba(15, 39, 51, 0.22); } .card-header { font-weight: 700; color: var(--color-primary); background: var(--color-bg); border-bottom: 1px solid var(--color-border); } .table td input.form-control-sm, .table td select.form-select-sm { min-width: 8rem; } .tree-editor-shell { display: flex; flex-direction: column; gap: 0.75rem; min-width: 0; } .editor-toolbar { display: flex; flex-wrap: wrap; gap: 0.5rem; position: sticky; top: 0; z-index: 12; padding: 0.35rem 0; background: #fff; box-shadow: 0 1px 0 rgba(196, 205, 220, 0.8); } .editor-toolbar button { border: 1px solid #c4cddc; background: #fff; padding: 0.28rem 0.6rem; border-radius: 4px; font-size: 0.82rem; } .editor-toolbar button:disabled { opacity: 0.45; } .editor-toolbar .project-device-drawer-toggle { border-color: #2563eb; background: #2563eb; color: #fff; font-weight: 600; } .active-view-summary { display: flex; flex-wrap: wrap; align-items: center; gap: 0.35rem; padding: 0.4rem 0.5rem; border: 1px solid #bfdbfe; border-radius: 5px; background: #eff6ff; color: #1e3a5f; font-size: 0.78rem; } .active-view-label { font-weight: 600; } .active-view-chip, .active-view-reset { border: 1px solid #93b4df; border-radius: 999px; background: #fff; color: #1e3a5f; padding: 0.18rem 0.48rem; font-size: 0.76rem; cursor: pointer; } .active-view-chip:hover, .active-view-reset:hover { border-color: #2563eb; } .active-view-reset { margin-left: auto; font-weight: 600; } .distribution-power-summary { display: grid; grid-template-columns: repeat(3, minmax(12rem, 1fr)); gap: 0.5rem; padding: 0.55rem; border: 1px solid #cbd5e1; border-radius: 5px; background: #f8fafc; } .distribution-power-summary > div { display: flex; flex-direction: column; gap: 0.15rem; } .distribution-power-summary span { color: #475569; font-size: 0.74rem; line-height: 1.2; } .distribution-power-summary strong { color: #172033; font-size: 0.95rem; } @media (max-width: 900px) { .distribution-power-summary { grid-template-columns: 1fr; } } .column-settings-menu { position: absolute; z-index: 9; margin-top: 2rem; border: 1px solid #cfd7e5; background: #fff; border-radius: 5px; box-shadow: 0 6px 16px rgba(0, 0, 0, 0.12); padding: 0.55rem; width: 340px; color: #1f2937; text-align: left; } .column-settings-title-row, .column-settings-footer { display: flex; align-items: center; justify-content: space-between; gap: 0.4rem; } .column-settings-title-row { margin-bottom: 0.25rem; font-size: 0.82rem; } .column-settings-close { border: 0 !important; background: transparent !important; color: #4b5563; padding: 0.05rem 0.2rem !important; font-size: 1rem !important; line-height: 1; cursor: pointer; } .column-settings-explanation { margin-bottom: 0.4rem; color: #4b5563; font-size: 0.72rem; line-height: 1.3; } .column-settings-search { width: 100%; margin-bottom: 0.4rem; border: 1px solid #c4cddc; border-radius: 4px; padding: 0.3rem 0.4rem; font-size: 0.76rem; } .column-settings-list { display: flex; flex-direction: column; gap: 0.15rem; max-height: 300px; overflow: auto; border: 1px solid #e1e6ef; border-radius: 4px; padding: 0.25rem; } .column-settings-item { display: flex; align-items: center; justify-content: space-between; gap: 0.4rem; border: 1px solid transparent; border-radius: 4px; padding: 0.1rem; } .column-settings-item.selected { border-color: #bfdbfe; background: #eff6ff; } .column-settings-item.dragging { opacity: 0.55; } .column-settings-item.drop-target { border-color: #2b6cb0; background: #ebf4ff; } .column-settings-item.locked { background: #f7fafc; } .column-visibility-button { display: flex; align-items: center; gap: 0.35rem; flex: 1; min-width: 0; border: 0 !important; background: transparent !important; padding: 0.2rem 0.25rem !important; color: inherit; text-align: left; font-size: 0.8rem; cursor: pointer; } .column-visibility-button:disabled { cursor: default; } .selection-marker { display: inline-flex; flex: 0 0 1rem; align-items: center; justify-content: center; color: #1d4ed8; font-weight: 700; } .column-settings-order { display: flex; gap: 0.2rem; } .column-settings-order button { border: 1px solid #c4cddc; background: #fff; border-radius: 3px; font-size: 0.72rem; padding: 0.08rem 0.28rem; } .tree-grid-wrap { overflow: auto; border: 1px solid #d9dee8; background: #fff; width: 100%; max-width: 100%; min-width: 0; max-height: max(28rem, calc(100vh - 12rem)); scrollbar-gutter: stable; } .column-settings-empty { padding: 0.55rem 0.35rem; color: #6b7280; font-size: 0.76rem; } .column-settings-footer { justify-content: flex-end; margin-top: 0.45rem; } .column-settings-footer button.primary { border-color: #2563eb; background: #2563eb; color: #fff; } .tree-editor-layout { display: block; min-height: 560px; min-width: 0; position: relative; } .project-device-sidebar { border: 1px solid #d9dee8; background: #fff; padding: 0.6rem; display: flex; flex-direction: column; gap: 0.55rem; } .project-device-sidebar h3 { margin: 0; font-size: 1rem; } .project-device-sidebar input, .project-device-sidebar select { width: 100%; border: 1px solid #cfd7e5; border-radius: 4px; padding: 0.25rem 0.35rem; } .project-device-list { max-height: 360px; overflow: auto; display: flex; flex-direction: column; gap: 0.4rem; } .project-device-item { border: 1px solid #d5ddec; background: #f8faff; text-align: left; padding: 0.4rem; border-radius: 4px; display: flex; flex-direction: column; gap: 0.1rem; font-size: 0.8rem; } .project-device-item.selected { border-color: #4c7dd9; background: #edf3ff; } .project-device-item.dragging { opacity: 0.55; border-style: dashed; } .sidebar-actions { display: flex; flex-direction: column; gap: 0.5rem; } .sidebar-actions label { display: flex; flex-direction: column; gap: 0.2rem; font-size: 0.82rem; } .sidebar-actions button { border: 1px solid #c4cddc; background: #fff; border-radius: 4px; padding: 0.3rem 0.45rem; font-size: 0.82rem; } .tree-grid { width: max-content; min-width: 0; border-collapse: collapse; font-size: 0.9rem; } .tree-grid th, .tree-grid td { border: 1px solid #e4e9f2; padding: 0.35rem 0.4rem; vertical-align: middle; } .tree-grid th { width: 1px; background: #f4f7fb; position: sticky; top: 0; z-index: 2; vertical-align: top; white-space: normal; } .tree-grid td { white-space: nowrap; } .tree-grid .header-cell { display: flex; flex-direction: column; align-items: stretch; gap: 0.2rem; min-width: 0; } .tree-grid .header-filter-btn { display: block; width: 100%; border: 1px solid #c4cddc; background: #fff; border-radius: 3px; font-size: 0.75rem; padding: 0.15rem 0.35rem; white-space: nowrap; } .tree-grid .header-sort-btn { display: flex; align-items: center; justify-content: space-between; gap: 0.25rem; width: 100%; min-width: 0; border: 0; background: transparent; padding: 0; color: #1f2937; font: inherit; font-size: 0.78rem; font-weight: 600; line-height: 1.15; overflow-wrap: anywhere; white-space: normal; text-align: left; cursor: pointer; } .project-device-drawer { position: fixed; z-index: 1040; top: 5.5rem; right: 1rem; left: auto; width: min(360px, calc(100vw - 2rem)); max-height: calc(100vh - 7rem); overflow: auto; border-radius: 0.5rem; box-shadow: 0 0.75rem 2rem rgba(31, 41, 55, 0.22); } .project-device-drawer-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 0.75rem; } .project-device-drawer-header span { color: #6b7280; font-size: 0.75rem; } .project-device-drawer-header button { border: 1px solid #c4cddc; background: #fff; border-radius: 4px; padding: 0.25rem 0.4rem; font-size: 0.78rem; } .tree-grid .header-sort-btn:hover span:first-child, .tree-grid .header-sort-btn:focus-visible span:first-child { text-decoration: underline; } .tree-grid .sort-indicator { color: #2563eb; font-size: 0.85rem; } .tree-grid .header-filter-btn.active { border-color: #2563eb; color: #2563eb; background: #eff6ff; } .tree-grid .header-filter-menu { position: absolute; z-index: 7; margin-top: 0.2rem; border: 1px solid #cfd7e5; background: #fff; box-shadow: 0 6px 16px rgba(0, 0, 0, 0.12); width: 300px; padding: 0.55rem; text-align: left; } .tree-grid .header-filter-title-row, .tree-grid .header-filter-selection-actions, .tree-grid .header-filter-footer, .tree-grid .header-filter-footer-actions { display: flex; align-items: center; justify-content: space-between; gap: 0.4rem; } .tree-grid .header-filter-title-row { margin-bottom: 0.25rem; font-size: 0.82rem; } .tree-grid .header-filter-close { border: 0; background: transparent; color: #4b5563; padding: 0.05rem 0.2rem; font-size: 1rem; line-height: 1; cursor: pointer; } .tree-grid .header-filter-selection-actions { justify-content: flex-start; margin: 0.4rem 0 0.3rem; font-size: 0.72rem; } .tree-grid .header-filter-selection-actions span { margin-left: auto; color: #4b5563; } .tree-grid .header-filter-selection-actions button, .tree-grid .header-filter-footer button { border: 1px solid #c4cddc; background: #fff; border-radius: 3px; padding: 0.18rem 0.35rem; font-size: 0.72rem; cursor: pointer; } .tree-grid .header-filter-explanation { margin-bottom: 0.4rem; color: #4b5563; font-size: 0.72rem; line-height: 1.3; white-space: normal; } .tree-grid .header-filter-search { width: 100%; border: 1px solid #c4cddc; border-radius: 4px; padding: 0.3rem 0.4rem; font-size: 0.76rem; } .tree-grid .header-filter-values { display: flex; flex-direction: column; gap: 0.15rem; max-height: 210px; overflow: auto; border: 1px solid #e1e6ef; border-radius: 4px; padding: 0.25rem; } .tree-grid .header-filter-item { display: flex; align-items: center; gap: 0.35rem; width: 100%; border: 1px solid transparent; border-radius: 3px; background: transparent; padding: 0.25rem 0.3rem; color: #1f2937; font-weight: 400; font-size: 0.75rem; text-align: left; cursor: pointer; } .tree-grid .header-filter-item:hover { background: #f3f4f6; } .tree-grid .header-filter-item.selected { border-color: #bfdbfe; background: #eff6ff; } .tree-grid .header-filter-empty { padding: 0.45rem 0.25rem; color: #6b7280; font-size: 0.74rem; } .tree-grid .header-filter-footer { margin-top: 0.45rem; } .tree-grid .header-filter-footer-actions { margin-left: auto; } .tree-grid .header-filter-footer button.primary { border-color: #2563eb; background: #2563eb; color: #fff; } .tree-grid .header-filter-footer button:disabled { opacity: 0.45; cursor: default; } .tree-grid .header-filter-warning { color: #9a3412; font-size: 0.7rem; white-space: normal; } .tree-grid .num { text-align: right; } .tree-grid .section-row td { background: #e8eef8; font-weight: 600; } .tree-grid .structure-component-row td { padding: 0.38rem 0.6rem; border-bottom-color: #d8dee9; } .tree-grid .structure-component-row.headerComponent td { background: #e2e8f0; } .tree-grid .structure-component-row.groupComponent td { background: #f8fafc; } .tree-grid .structure-component-row.footerComponent td { background: #f1f5f9; } .tree-grid .structure-component-content { display: flex; align-items: baseline; gap: 0.75rem; min-width: 0; } .tree-grid .structure-component-content strong { flex: 0 0 auto; font-variant-numeric: tabular-nums; } .tree-grid .structure-component-protection { color: #475569; font-size: 0.78rem; } .tree-grid .structure-component-actions { display: inline-flex; align-items: center; gap: 0.35rem; margin-left: auto; } .tree-grid .structure-component-actions button { font-size: 0.75rem; padding: 0.18rem 0.45rem; } .tree-grid .structure-component-fixed { color: #64748b; font-size: 0.75rem; } .tree-grid .section-drop-cell { padding: 0.45rem 0.6rem; } .tree-grid .section-content { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; } .tree-grid .section-actions { display: flex; gap: 0.35rem; } .tree-grid .section-actions button { border: 1px solid #c4cddc; background: #fff; padding: 0.2rem 0.45rem; border-radius: 3px; font-size: 0.78rem; } .tree-grid .summary-row td { background: #f3f7fd; } .tree-grid .device-row td:first-child { color: #6b7280; } .tree-grid .empty-circuit-row td { background: #f8fbff; } .tree-grid tr.row-selected td { background: #eaf1ff; } .tree-grid .placeholder-row td { background: #f7f7f7; color: #6b7280; font-style: italic; } .tree-grid .cell-editable { cursor: text; } .tree-grid .cell-protection-trigger { color: var(--color-primary); cursor: pointer; font-weight: 600; transition: background-color 0.12s ease, box-shadow 0.12s ease; } .tree-grid .cell-protection-trigger:hover { background: #eaf6f0; box-shadow: inset 0 0 0 1px var(--color-signal); } .tree-grid .device-drag-handle { cursor: grab; } .tree-grid .device-drag-handle.device-dragging { opacity: 0.55; } .tree-grid .circuit-drag-handle { cursor: grab; } .tree-grid .circuit-dragging-block td { opacity: 0.55; } .tree-grid .cell-selected { outline: 2px solid #4c7dd9; outline-offset: -2px; } .tree-grid .section-title { display: flex; align-items: baseline; gap: 0.75rem; } .tree-grid .section-title span { color: #475569; font-size: 0.78rem; font-weight: 500; } .tree-grid .cell-invalid { outline: 2px solid #c2410c; outline-offset: -2px; background: #fff7ed !important; } .tree-grid .cell-invalid input { border-color: #c2410c; } .tree-grid input, .tree-grid select { width: 100%; min-width: 5rem; border: 1px solid #9fb6e0; border-radius: 2px; padding: 0.2rem 0.3rem; } .tree-grid .action-cell { display: flex; gap: 0.3rem; } .tree-grid .action-cell button { border: 1px solid #c4cddc; background: #fff; padding: 0.2rem 0.45rem; border-radius: 3px; font-size: 0.78rem; } .tree-grid .drop-target-active { box-shadow: inset 0 0 0 2px #4c7dd9; background: #eef4ff !important; } .tree-grid .drop-target-invalid { box-shadow: inset 0 0 0 2px #d97706; background: #fff7ed !important; } .tree-grid .drop-target-confirm { box-shadow: inset 0 0 0 2px #d97706; background: #fffbeb !important; } .tree-grid tr.circuit-insert-before td, .tree-grid tr.circuit-insert-after td { position: relative; } .tree-grid tr.circuit-insert-before td::before { content: ""; position: absolute; left: -1px; right: -1px; top: -2px; border-top: 4px solid #2563eb; pointer-events: none; } .tree-grid tr.circuit-insert-before td:first-child::after { content: ""; position: absolute; left: -7px; top: -7px; width: 0; height: 0; border-top: 7px solid transparent; border-bottom: 7px solid transparent; border-left: 10px solid #2563eb; pointer-events: none; } .tree-grid tr.circuit-insert-after td::after { content: ""; position: absolute; left: -1px; right: -1px; bottom: -2px; border-bottom: 4px solid #2563eb; pointer-events: none; } .tree-grid tr.circuit-insert-after td:first-child::before { content: ""; position: absolute; left: -7px; bottom: -7px; width: 0; height: 0; border-top: 7px solid transparent; border-bottom: 7px solid transparent; border-left: 10px solid #2563eb; pointer-events: none; } .drop-hint { font-size: 0.75rem; color: #1f4ea3; font-weight: 600; } .notice { padding: 0.5rem 0.75rem; border-radius: 4px; border: 1px solid transparent; } .notice.info { background: #ebf3ff; border-color: #bad1f7; } .notice.error { background: #fdecec; border-color: #f5b5b5; } .notice.warning { background: #fff7ed; border-color: #fdba74; } .editor-error-notice { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; } .notice.muted { background: #f6f6f6; border-color: #e4e4e4; } .todo-hint { color: #6b7280; font-size: 0.8rem; margin: 0; } @media (max-width: 720px) { .project-device-drawer { top: 4.5rem; max-height: calc(100vh - 5.5rem); } }