/* * IntegrationsOverview — PORTA architecture diagram * Theme vars: --text-primary, --text-secondary, --text-tertiary, * --bg-primary, --bg-secondary, --surface-color, * --border-color, --border-dark, --primary-color, * --object-radius-large (10px), --object-radius-medium (8px), * --font-family */ /* Volle Breite des Content-Bereichs (MainLayout outletShell) — kein künstliches 900px-Cap */ .pageRoot { width: 100%; max-width: none; min-width: 0; box-sizing: border-box; padding: 1rem 1.25rem 2rem; } .pageIntro { max-width: 42rem; } .diagramScroll { width: 100%; max-width: none; overflow-x: auto; -webkit-overflow-scrolling: touch; container-type: inline-size; container-name: portaDiag; } .pageHeading { font-size: 1.35rem; font-weight: 600; color: var(--text-primary); margin: 0 0 0.35rem; } .pageLead { font-size: 0.9rem; color: var(--text-secondary); margin: 0 0 1rem; line-height: 1.4; } .srOnly { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } /* ── arch wrapper ── */ .arch { box-sizing: border-box; font-family: var(--font-family, "DM Sans", sans-serif); width: 100%; max-width: none; min-width: 0; margin: 0; display: flex; flex-direction: column; gap: 0; padding: 1rem 0 0; } /* ── layer labels ── */ .layerLabel { font-size: 11px; font-weight: 600; letter-spacing: 0.5px; text-transform: uppercase; color: var(--text-secondary); margin-bottom: 6px; display: flex; align-items: center; gap: 6px; } .layerNum { font-size: 10px; font-weight: 700; background: var(--primary-color, #4A6FA5); color: #fff; border-radius: 10px; padding: 1px 7px; } /* ── layers (Schicht 1 + 3) ── */ .layer { border: 1px solid var(--border-color); border-radius: var(--object-radius-large, 10px); padding: 14px 16px; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06), 0 1px 2px rgba(0, 0, 0, 0.04); } /* Schicht 3 — Organisation: neutrales Grau */ .layerOrg { background: #f4f5f7; border-color: #d8dce3; } /* Schicht 1 — Daten: neutrales Grau */ .layerData { background: #f4f5f7; border-color: #d8dce3; } /* ── vertical arrows ── */ .arrowVert { display: flex; justify-content: center; padding: 4px 0; } /* ── Schicht 3: tenants ── */ .tenantGrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 220px), 1fr)); gap: 10px; } .tenantCard { background: rgba(74, 111, 165, 0.08); border: 1px solid rgba(74, 111, 165, 0.25); border-radius: var(--object-radius-medium, 8px); padding: 12px 14px; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06); } .tenantEmpty { grid-column: 1 / -1; margin: 0; font-size: 13px; color: var(--text-secondary); line-height: 1.4; } .tenantName { font-size: 14px; font-weight: 700; color: var(--text-primary); margin-bottom: 7px; display: flex; align-items: center; gap: 5px; } .modGrid { display: flex; flex-wrap: wrap; gap: 4px; } .modChip { font-size: 11px; padding: 3px 8px; border-radius: 10px; background: rgba(74, 111, 165, 0.14); color: #1e3a5f; font-weight: 500; white-space: nowrap; } /* ══════════════════════════════════════════════════════════════ Schicht 2: mid-row (Infrastruktur | → | PORTA | → | Nutzen) ══════════════════════════════════════════════════════════════ */ /* Schicht 2 — nur Grid-Layout, kein Hintergrund-Band */ .midRow { display: grid; grid-template-columns: minmax(140px, 1.05fr) minmax(20px, 32px) minmax(220px, 2.85fr) minmax(20px, 32px) minmax(150px, 1.15fr); gap: 0; align-items: stretch; width: 100%; min-width: 0; box-sizing: border-box; padding: 0; background: transparent; border: none; border-radius: 0; } :global(.portaArchMidRow) { display: grid !important; grid-template-columns: minmax(140px, 1.05fr) minmax(20px, 32px) minmax(220px, 2.85fr) minmax(20px, 32px) minmax(150px, 1.15fr) !important; gap: 0 !important; align-items: stretch !important; width: 100%; min-width: 0 !important; box-sizing: border-box !important; padding: 0 !important; background: transparent !important; border: none !important; border-radius: 0 !important; } @container portaDiag (max-width: 480px) { .midRow, :global(.portaArchMidRow) { grid-template-columns: 1fr !important; } :global(.portaArchFlowCol) svg { transform: rotate(90deg); } } /* Viewport-Fallback (ältere Browser / wenn Container nicht greift) */ @media (max-width: 520px) { .midRow, :global(.portaArchMidRow) { grid-template-columns: 1fr !important; } :global(.portaArchFlowCol) svg { transform: rotate(90deg); } .tenantGrid { grid-template-columns: 1fr; } } /* ── Schicht-2 Boxen ── */ .boxInfra { min-width: 0; border-radius: var(--object-radius-large, 10px); padding: 12px 14px; background: var(--bg-secondary); border: 1px solid var(--border-color); color: var(--text-primary); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06), 0 2px 8px rgba(0, 0, 0, 0.04), inset 0 1px 0 rgba(255, 255, 255, 0.65); } /* Nutzen: leichtes Violett */ .boxNutzen { min-width: 0; border-radius: var(--object-radius-large, 10px); padding: 12px 14px; background: rgba(139, 92, 246, 0.06); border: 1px solid rgba(139, 92, 246, 0.22); color: var(--text-primary); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06), 0 2px 8px rgba(0, 0, 0, 0.04), inset 0 1px 0 rgba(255, 255, 255, 0.65); } /* PORTA: leichtes Rot */ .boxPorta { min-width: 0; border-radius: var(--object-radius-large, 10px); padding: 12px 14px; background: rgba(220, 38, 38, 0.05); border: 1px solid rgba(220, 38, 38, 0.20); color: var(--text-primary); box-shadow: 0 2px 5px rgba(0, 0, 0, 0.07), 0 4px 14px rgba(0, 0, 0, 0.05), inset 0 1px 0 rgba(255, 255, 255, 0.75); } .boxTitle { font-size: 13px; font-weight: 600; color: var(--text-primary); margin-bottom: 8px; display: flex; align-items: center; gap: 6px; } .boxTitleIcon { font-size: 15px; } .portaTitleLogo { width: 62px; height: 62px; object-fit: contain; flex-shrink: 0; display: block; transition: filter 0.2s ease; } :global(.dark-theme) .portaTitleLogo { filter: brightness(0) invert(1); } /* ── Infrastruktur items ── */ .infraBlockTitleWithIcon { display: flex; align-items: center; gap: 5px; } .infraTitleSvg { flex-shrink: 0; color: var(--primary-color, #4a6fa5); } .infraItem { font-size: 11px; padding: 4px 7px; border-radius: var(--object-radius-medium, 8px); background: var(--bg-primary); border: 1px solid var(--border-color); display: flex; align-items: center; gap: 6px; margin-bottom: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04); } .infraItemGear { flex-shrink: 0; color: var(--text-tertiary); opacity: 0.85; } .infraItem:last-child { margin-bottom: 0; } /* Zwei sichtbare Sub-Boxen in Infrastruktur (wie Daten-Schicht) */ .infraSplit { display: flex; flex-direction: column; gap: 8px; width: 100%; min-width: 0; } .infraSubBox { min-width: 0; border-radius: var(--object-radius-medium, 8px); background: rgba(255, 255, 255, 0.50); border: 1px solid rgba(74, 111, 165, 0.18); padding: 8px 10px; } .infraBlockTitle { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.4px; color: var(--text-secondary); margin-bottom: 6px; } .infraEmptyHint { font-size: 10px; color: var(--text-tertiary); font-style: italic; line-height: 1.35; padding: 2px 0; } .aicoreGrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(108px, 1fr)); gap: 5px; } .aicoreModule { display: flex; align-items: flex-start; padding: 5px 6px; border-radius: var(--object-radius-medium, 8px); background: var(--bg-primary); border: 1px solid var(--border-color); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04); min-width: 0; } .aicoreModuleText { min-width: 0; flex: 1; } .aicoreModuleTitle { font-size: 10px; font-weight: 600; color: var(--text-primary); line-height: 1.25; word-break: break-word; } .aicoreModuleMeta { font-size: 9px; color: var(--text-tertiary); margin-top: 2px; } .portaEmptyHint { font-size: 10px; color: var(--text-tertiary); margin-bottom: 4px; line-height: 1.35; } /* ── horizontal arrow columns ── */ .flowCol { display: flex; align-items: center; justify-content: center; align-self: stretch; } :global(.portaArchFlowCol) { display: flex !important; align-items: center !important; justify-content: center !important; align-self: stretch !important; } /* ── PORTA internals ── */ .shieldRow { display: grid; grid-template-columns: 1fr 1fr; gap: 5px; } .coreBox { border: 1px solid rgba(220, 38, 38, 0.25); border-radius: var(--object-radius-medium, 8px); padding: 7px 9px; background: rgba(220, 38, 38, 0.08); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.5), 0 1px 2px rgba(0, 0, 0, 0.04); } .coreTitle { font-size: 11px; font-weight: 600; color: var(--text-primary); display: flex; align-items: center; gap: 4px; } .coreIcon { font-size: 12px; } .subLabels { display: flex; flex-wrap: wrap; gap: 3px; margin-top: 3px; } .subLabel { font-size: 9px; padding: 1px 5px; border-radius: 8px; background: var(--bg-primary); color: var(--text-secondary); border: 1px solid var(--border-color); } .secLabel { font-size: 10px; font-weight: 600; color: var(--text-secondary); margin: 6px 0 3px; } .wfRow { display: flex; gap: 5px; flex-wrap: wrap; } /* Workflow: Kästchen mit Pfeil rechts (dezentes Blau) */ .wfChipFlow { display: inline-flex; align-items: stretch; max-width: 100%; font-size: 10px; font-weight: 500; color: #1e3a5f; border-radius: 5px; overflow: hidden; border: 1px solid rgba(74, 111, 165, 0.35); background: rgba(74, 111, 165, 0.10); box-shadow: 0 1px 2px rgba(74, 111, 165, 0.08); } .wfChipFlowLabel { padding: 4px 8px; min-width: 0; word-break: break-word; line-height: 1.25; } .wfChipFlowArrow { display: flex; align-items: center; justify-content: center; padding: 0 6px; background: rgba(74, 111, 165, 0.16); border-left: 1px solid rgba(74, 111, 165, 0.30); color: #4a6fa5; flex-shrink: 0; } /* PORTA: Extractors & Renderers — neutrales Grau */ .portaCodecSplit { display: flex; flex-direction: column; gap: 6px; margin-top: 10px; } .portaCodecSubBox { border-radius: var(--object-radius-medium, 8px); border: 1px solid #d4d8df; background: #f0f1f4; padding: 6px 8px; } .portaCodecSubTitle { font-size: 9px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.35px; color: var(--text-secondary); margin-bottom: 5px; } .codecSymRow { display: flex; flex-wrap: wrap; gap: 4px; } .codecSym { font-size: 10px; font-weight: 600; padding: 3px 7px; border-radius: 5px; background: #e4e6ea; border: 1px solid #c4c8d0; color: #3b4252; line-height: 1.2; max-width: 100%; word-break: break-word; } /* ── Nutzen KPI tiles ── */ .statGrid { display: flex; flex-direction: column; gap: 5px; } .statTile { display: flex; align-items: center; gap: 10px; padding: 7px 10px; border-radius: var(--object-radius-medium, 8px); background: var(--bg-primary); border: 1px solid var(--border-color); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04); line-height: 1.2; } .statValue { font-size: 1.05rem; font-weight: 700; color: #7c3aed; min-width: 2em; text-align: right; flex-shrink: 0; line-height: 1.15; font-variant-numeric: tabular-nums; } .statText { display: flex; flex-direction: column; gap: 1px; min-width: 0; } .statLabel { font-size: 11.5px; font-weight: 600; color: var(--text-primary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .statSub { font-size: 10px; color: var(--text-tertiary); } .statTeaser { display: flex; align-items: center; gap: 8px; padding: 7px 10px; border-radius: var(--object-radius-medium, 8px); border: 1px dashed rgba(139, 92, 246, 0.30); background: transparent; line-height: 1.2; } .statTeaserPlus { font-size: 1.1rem; font-weight: 700; color: rgba(139, 92, 246, 0.50); min-width: 1.4em; text-align: center; flex-shrink: 0; } .statTeaserText { font-size: 11px; font-weight: 500; color: var(--text-tertiary); font-style: italic; } /* ── Schicht 1: data chips ── */ .dataChips { display: flex; flex-wrap: wrap; gap: 6px; width: 100%; } .dataLayerSplit { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr)); gap: 12px; width: 100%; align-items: start; } .dataSubsection { min-width: 0; border-radius: var(--object-radius-medium, 8px); background: rgba(234, 179, 8, 0.08); border: 1px solid rgba(202, 138, 4, 0.25); padding: 8px 10px; } .dataSubsectionTitle { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.4px; color: var(--text-secondary); margin-bottom: 6px; } .dataChipMuted { font-size: 11px; color: var(--text-tertiary); font-style: italic; padding: 4px 2px; line-height: 1.35; } .dataChip { font-size: 12px; padding: 5px 10px; border-radius: var(--object-radius-medium, 8px); background: rgba(234, 179, 8, 0.08); border: 1px solid rgba(202, 138, 4, 0.28); color: var(--text-primary); font-weight: 500; display: flex; align-items: flex-start; gap: 6px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04); max-width: 100%; } .dataChipBody { min-width: 0; flex: 1; display: flex; flex-direction: column; gap: 2px; } .dataChipMain { font-size: 11px; font-weight: 600; line-height: 1.25; word-break: break-word; } .dataChipSub { font-size: 9px; font-weight: 400; color: var(--text-secondary); line-height: 1.2; word-break: break-word; } .dataIcon { font-size: 13px; opacity: 0.8; flex-shrink: 0; margin-top: 1px; } /* ── loading / error ── */ .loadingWrap { padding: 2rem; text-align: center; color: var(--text-secondary); } .errorWrap { padding: 1rem; color: var(--error-color, #C53030); } .errorRetry { margin-left: 0.35rem; padding: 0.35rem 0.65rem; font-size: 0.85rem; cursor: pointer; border-radius: var(--object-radius-medium, 8px); border: 1px solid var(--border-color); background: var(--bg-primary); color: var(--text-primary); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06); } /* ── dark theme 3D adjustments ── */ :global(.dark-theme) .layer { box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.15); } :global(.dark-theme) .midRow { background: transparent !important; border: none !important; } :global(.dark-theme) :global(.portaArchMidRow) { background: transparent !important; border: none !important; } :global(.dark-theme) .boxInfra { background: var(--bg-secondary); border-color: var(--border-color); color: var(--text-primary); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2), 0 2px 10px rgba(0, 0, 0, 0.12), inset 0 1px 0 rgba(255, 255, 255, 0.04); } :global(.dark-theme) .boxNutzen { background: rgba(139, 92, 246, 0.08); border-color: rgba(139, 92, 246, 0.25); color: var(--text-primary); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2), 0 2px 10px rgba(0, 0, 0, 0.12), inset 0 1px 0 rgba(255, 255, 255, 0.04); } :global(.dark-theme) .boxPorta { background: rgba(220, 38, 38, 0.06); border-color: rgba(220, 38, 38, 0.22); color: var(--text-primary); box-shadow: 0 2px 6px rgba(0, 0, 0, 0.25), 0 6px 18px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.05); } :global(.dark-theme) .coreBox { background: rgba(220, 38, 38, 0.10); border-color: rgba(220, 38, 38, 0.28); } :global(.dark-theme) .dataSubsection { background: rgba(234, 179, 8, 0.08); border-color: rgba(202, 138, 4, 0.28); } :global(.dark-theme) .infraSubBox { background: rgba(0, 0, 0, 0.16); border-color: rgba(90, 138, 197, 0.32); } /* Mandanten: lesbarer Hintergrund im Dunkelmodus */ :global(.dark-theme) .tenantCard { background: rgba(90, 138, 197, 0.12); border-color: rgba(90, 138, 197, 0.30); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.22); } :global(.dark-theme) .modChip { background: rgba(90, 138, 197, 0.15); color: var(--primary-light, #7BA7D7); } /* Workflows: dezentes Blau */ :global(.dark-theme) .wfChipFlow { background: rgba(30, 58, 138, 0.35); border-color: rgba(147, 197, 253, 0.28); color: #d0dff6; } :global(.dark-theme) .wfChipFlowArrow { background: rgba(37, 99, 235, 0.28); border-left-color: rgba(147, 197, 253, 0.22); color: #b0cbed; } /* Extractors/Renderers: neutrales Grau */ :global(.dark-theme) .portaCodecSubBox { background: rgba(255, 255, 255, 0.06); border-color: rgba(255, 255, 255, 0.14); } :global(.dark-theme) .codecSym { background: rgba(255, 255, 255, 0.10); border-color: rgba(255, 255, 255, 0.18); color: #c8ccd4; } :global(.dark-theme) .infraItem, :global(.dark-theme) .statTile, :global(.dark-theme) .dataChip { box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } :global(.dark-theme) .layerOrg { background: rgba(255, 255, 255, 0.04); border-color: rgba(255, 255, 255, 0.12); } :global(.dark-theme) .layerData { background: rgba(255, 255, 255, 0.04); border-color: rgba(255, 255, 255, 0.12); } :global(.dark-theme) .dataChip { background: rgba(234, 179, 8, 0.10); border-color: rgba(202, 138, 4, 0.25); } :global(.dark-theme) .statValue { color: #a78bfa; } :global(.dark-theme) .layerNum { background: var(--primary-color, #5A8AC5); }