Assessor_2.0/src/styles/obsidian-graph.css

511 lines
22 KiB
CSS

.app-area-graph { overflow: hidden; }
.obsidian-graph {
box-sizing: border-box;
position: relative;
width: 100%;
height: 100%;
min-width: 0;
min-height: 0;
padding: var(--panel-inset);
color: var(--text-primary);
background: transparent;
overflow: hidden;
}
.obsidian-graph-surface {
display: block;
width: 100%;
height: 100%;
min-height: 0;
touch-action: none;
cursor: grab;
user-select: none;
}
.obsidian-graph-surface:active { cursor: grabbing; }
.obsidian-graph-edges line { stroke: var(--graph-edge); stroke-width: 1; vector-effect: non-scaling-stroke; transition: stroke .12s ease, stroke-width .12s ease; }
.obsidian-node { color: var(--graph-technique); cursor: pointer; outline: none; }
.obsidian-node-selection-ring {
fill: none;
stroke: var(--graph-selected);
stroke-width: 3;
opacity: 1;
vector-effect: non-scaling-stroke;
pointer-events: none;
filter: none;
}
.obsidian-node-branch-ring {
fill: none;
stroke: var(--graph-selected);
stroke-width: 2;
opacity: .82;
vector-effect: non-scaling-stroke;
pointer-events: none;
}
.obsidian-node.is-branch-muted { opacity: .42; }
.obsidian-graph-edges line.is-branch-path { stroke: var(--graph-selected); stroke-width: 2; opacity: 1; }
.obsidian-graph-edges line.is-branch-muted { opacity: .2; }
.obsidian-node.is-selection-muted { opacity: .48; transition: opacity .14s ease; }
.obsidian-node.is-selection-muted:hover,
.obsidian-node.is-selection-muted:focus-visible { opacity: 1; }
.obsidian-graph-edges line.is-selection-muted { opacity: .24; }
.obsidian-node-role-ring { fill: none; stroke: currentColor; stroke-width: 1.5; opacity: .72; vector-effect: non-scaling-stroke; pointer-events: none; }
.obsidian-node-core { fill: currentColor; stroke: var(--surface-app); stroke-width: 1.5; vector-effect: non-scaling-stroke; transition: filter .12s ease, stroke .12s ease; }
.obsidian-node-finding { color: var(--graph-finding); }
.obsidian-node-finding.severity-critical { color: var(--critical); }
.obsidian-node-finding.severity-high { color: var(--high); }
.obsidian-node-finding.severity-medium { color: var(--medium); }
.obsidian-node-finding.severity-low { color: var(--low); }
.obsidian-node-finding.severity-info { color: var(--info); }
.obsidian-node-finding.severity-unknown { color: var(--graph-unknown); }
.obsidian-node-category,
.obsidian-node-defense,
.obsidian-node-target,
.obsidian-node-technique,
.obsidian-node-tactic { color: var(--graph-relation); }
.obsidian-node:hover .obsidian-node-core, .obsidian-node:focus-visible .obsidian-node-core { filter: brightness(1.25); stroke: var(--graph-selected); }
.obsidian-node:hover .obsidian-node-role-ring, .obsidian-node:focus-visible .obsidian-node-role-ring { opacity: 1; stroke-width: 2; }
.obsidian-node.is-selected .obsidian-node-core { stroke: var(--graph-selected); stroke-width: 2.5; }
.obsidian-node.is-selected .obsidian-node-role-ring { opacity: 1; stroke: var(--graph-selected); stroke-width: 2; }
.obsidian-graph-card-connectors { pointer-events: none; }
.obsidian-graph-card-connectors line { vector-effect: non-scaling-stroke; }
.obsidian-card-connector-backdrop { stroke: color-mix(in srgb, var(--surface-app) 88%, var(--pathfinder-micro-connector-backdrop-mix)); stroke-width: 5; opacity: .9; }
.obsidian-card-connector { stroke: var(--graph-selected); stroke-width: 2; }
.obsidian-card-connector-anchor { fill: var(--graph-selected); stroke: color-mix(in srgb, var(--surface-app) 88%, var(--pathfinder-micro-connector-backdrop-mix)); stroke-width: 1.5; vector-effect: non-scaling-stroke; }
.obsidian-node-inline-label {
fill: var(--text-secondary);
stroke: var(--surface-app);
stroke-width: 3px;
paint-order: stroke fill;
font-size: var(--fs-lg);
font-weight: var(--fw-medium);
letter-spacing: .01em;
pointer-events: none;
}
.obsidian-node-category .obsidian-node-inline-label,
.obsidian-node-defense .obsidian-node-inline-label,
.obsidian-node-target .obsidian-node-inline-label,
.obsidian-node-tactic .obsidian-node-inline-label { fill: var(--text-primary); font-weight: var(--fw-semibold); }
.obsidian-node-card-wrap {
overflow: visible;
pointer-events: auto;
cursor: grab;
touch-action: none;
}
.obsidian-node-card-wrap:active { cursor: grabbing; }
.obsidian-node-matrix-card-wrap { overflow: visible; }
.obsidian-node-matrix-card {
width: 100%;
height: 100%;
}
.obsidian-node-matrix-card .data-tile-content {
display: grid;
grid-template-rows: auto minmax(0, 1fr);
min-height: 0;
overflow: hidden;
}
.obsidian-node-matrix-card .data-tile {
box-sizing: border-box;
width: 100%;
height: 100%;
min-height: 0;
grid-template-columns: 18px minmax(0, 1fr) 18px;
gap: var(--space-2);
padding: var(--space-3);
overflow: hidden;
}
.obsidian-node-matrix-card .data-tile-hex { width: 18px; height: 20px; }
.obsidian-node-matrix-card .data-tile-content h3 {
display: -webkit-box;
overflow: hidden;
font-size: var(--pathfinder-micro-title-size);
line-height: 1.2;
-webkit-box-orient: vertical;
-webkit-line-clamp: 5;
}
.obsidian-node-matrix-card .data-tile-badges {
flex-wrap: wrap;
gap: var(--space-1);
margin-top: var(--space-1);
min-height: 0;
max-height: none;
align-content: start;
overflow: hidden;
}
.obsidian-node-matrix-card .data-tile-badges > * {
flex: 0 1 auto;
min-width: 0;
max-width: 100%;
height: auto;
min-height: 20px;
padding: 0 3px;
overflow: visible;
font-size: var(--pathfinder-micro-badge-size);
line-height: 1.1;
overflow-wrap: anywhere;
white-space: normal;
}
.obsidian-node-matrix-card .tile-badge-overflow { justify-content: center; }
.obsidian-node-matrix-card .data-tile-actions { align-self: start; gap: 2px; }
.obsidian-node-matrix-card .tile-bookmark-btn,
.obsidian-node-matrix-card .tile-results-btn { width: 18px; height: 18px; }
.obsidian-node-card.data-tile {
box-sizing: border-box;
width: 100%;
height: 100%;
min-height: 0;
grid-template-columns: 26px minmax(0, 1fr);
gap: var(--legacy-space-3);
padding: var(--legacy-space-3);
overflow: hidden;
cursor: pointer;
}
.obsidian-node-card-technique .data-tile-hex,
.obsidian-node-card-category .data-tile-hex,
.obsidian-node-card-defense .data-tile-hex,
.obsidian-node-card-target .data-tile-hex,
.obsidian-node-card-tactic .data-tile-hex { background: var(--graph-relation); }
.obsidian-node-card .data-tile-content h3 {
display: -webkit-box;
overflow: hidden;
font-size: var(--pathfinder-micro-title-size);
line-height: 1.3;
overflow-wrap: normal;
word-break: normal;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.obsidian-node-card-technique .data-tile-content h3,
.obsidian-node-card-tactic .data-tile-content h3 { -webkit-line-clamp: 3; }
.obsidian-node-card .data-tile-badges {
gap: var(--legacy-space-1) var(--legacy-space-2);
margin-top: var(--legacy-space-2);
}
.obsidian-node-card .reader-severity {
min-height: 20px;
padding: 2px var(--legacy-space-1);
font-size: var(--pathfinder-micro-relation-badge-size);
}
.obsidian-node-card .outcome-mark { flex-basis: 100%; }
.obsidian-node.is-selected .obsidian-node-card {
border-color: var(--graph-selected);
outline: var(--bw-emphasis) solid var(--graph-selected);
outline-offset: -2px;
}
.obsidian-graph-card.is-selected .obsidian-node-card,
.obsidian-graph-card.is-selected .obsidian-node-matrix-card .data-tile {
border-color: var(--graph-selected);
outline: 3px solid var(--graph-selected);
outline-offset: -3px;
}
.obsidian-graph-toolbar,
.obsidian-graph-filters,
.obsidian-graph-inspector,
.obsidian-graph-zoom {
position: absolute;
z-index: 5;
border: var(--bw-hairline) solid var(--border-default);
border-radius: var(--radius-md);
color: var(--text-primary);
background: color-mix(in srgb, var(--surface-panel-raised) 94%, transparent);
backdrop-filter: blur(var(--space-2));
}
.obsidian-graph-toolbar {
top: var(--space-4);
left: 50%;
display: flex;
align-items: end;
gap: var(--space-2);
max-width: calc(100% - var(--space-8) * 2);
padding: var(--space-2);
transform: translateX(-50%);
}
.obsidian-graph-search { display: grid; gap: var(--space-1); min-width: calc(var(--space-8) * 8); color: var(--text-secondary); font-size: var(--fs-sm); }
.obsidian-graph-search input { min-height: var(--control-h); padding: 0 var(--space-2); border: var(--bw-hairline) solid var(--border-strong); border-radius: var(--radius-sm); color: var(--text-primary); background: var(--surface-input); font-size: var(--fs-base); }
.obsidian-graph-count { align-self: center; min-width: max-content; padding-inline: var(--space-2); color: var(--text-secondary); font-size: var(--fs-sm); font-variant-numeric: tabular-nums; }
.obsidian-graph-branch-actions {
display: flex;
align-items: center;
gap: var(--space-2);
min-width: min(360px, 32vw);
padding-left: var(--space-3);
border-left: var(--bw-hairline) solid var(--border-default);
}
.obsidian-graph-branch-actions > span {
color: var(--text-secondary);
font-size: var(--fs-sm);
font-weight: var(--fw-semibold);
letter-spacing: var(--ls-caps);
text-transform: uppercase;
}
.obsidian-graph-branch-actions .btn { min-width: 84px; }
.obsidian-graph-reset-view {
position: relative;
display: inline-flex;
align-items: center;
gap: 6px;
border-color: var(--border-strong);
border-radius: 999px;
color: var(--text-primary);
background: var(--surface-input);
overflow: hidden;
}
.obsidian-graph-reset-view:hover,
.obsidian-graph-reset-view:focus-visible {
border-color: var(--text-secondary);
color: var(--text-primary);
background: var(--surface-hover);
}
.obsidian-graph-reset-view span { font-size: 11px; line-height: 1; }
.obsidian-graph-filters {
top: calc(var(--space-8) * 2.7);
left: 50%;
display: grid;
grid-template-columns: repeat(3, minmax(calc(var(--space-8) * 5), 1fr));
gap: var(--space-3);
width: min(calc(var(--space-8) * 20), calc(100% - var(--space-8) * 2));
padding: var(--space-3);
transform: translateX(-50%);
}
.obsidian-graph-filters label { display: grid; gap: var(--space-1); color: var(--text-secondary); font-size: var(--fs-sm); }
.obsidian-graph-filters select { min-height: var(--control-h); padding-inline: var(--space-2); border: var(--bw-hairline) solid var(--border-strong); border-radius: var(--radius-sm); color: var(--text-primary); background: var(--surface-input); font-size: var(--fs-base); }
.obsidian-graph-zoom { top: var(--space-4); right: var(--space-4); display: grid; overflow: hidden; }
.obsidian-graph-zoom button { display: grid; place-items: center; width: var(--space-8); height: var(--space-8); padding: 0; border: 0; border-bottom: var(--bw-hairline) solid var(--border-default); color: var(--text-primary); background: transparent; font-size: var(--fs-lg); cursor: pointer; }
.obsidian-graph-zoom button:last-child { border-bottom: 0; }
.obsidian-graph-zoom button:hover { background: var(--surface-hover); }
.obsidian-graph-inspector {
right: var(--space-4);
bottom: var(--space-4);
display: grid;
gap: var(--space-2);
width: min(calc(var(--space-8) * 12), calc(100% - var(--space-8)));
padding: var(--space-4);
}
.obsidian-graph-inspector > small { color: var(--text-secondary); font-size: var(--fs-sm); font-weight: var(--fw-semibold); letter-spacing: var(--ls-caps); text-transform: uppercase; }
.obsidian-graph-inspector > strong { padding-right: var(--space-6); color: var(--text-primary); font-size: var(--fs-lg); line-height: var(--lh-prose); overflow-wrap: anywhere; }
.obsidian-graph-inspector > span { color: var(--text-secondary); font-size: var(--fs-lg); }
.obsidian-graph-inspector dl { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-2); margin: var(--space-2) 0 0; }
.obsidian-graph-inspector dl div { display: grid; gap: var(--space-1); padding: var(--space-2); border: var(--bw-hairline) solid var(--border-subtle); background: var(--surface-panel); }
.obsidian-graph-inspector dt { color: var(--text-secondary); font-size: var(--fs-sm); }
.obsidian-graph-inspector dd { margin: 0; color: var(--text-primary); font-size: var(--fs-lg); font-weight: var(--fw-semibold); }
.obsidian-graph-inspector-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-2); }
.obsidian-inspector-close { position: absolute; top: var(--space-2); right: var(--space-2); display: grid; place-items: center; width: var(--control-h); height: var(--control-h); padding: 0; border: 0; color: var(--text-secondary); background: transparent; font-size: var(--fs-lg); cursor: pointer; }
.obsidian-graph-empty { position: absolute; inset: 0; display: grid; place-content: center; gap: var(--space-2); color: var(--text-secondary); text-align: center; pointer-events: none; }
.obsidian-graph-empty strong, .obsidian-graph-empty span { font-size: var(--fs-lg); }
.obsidian-graph-card-zoom-hint {
position: absolute;
left: 50%;
bottom: var(--space-4);
z-index: 7;
min-height: var(--control-h);
padding: 0 var(--space-4);
border: var(--bw-hairline) solid var(--border-strong);
border-radius: var(--radius-sm);
color: var(--text-primary);
background: color-mix(in srgb, var(--surface-panel-raised) 94%, transparent);
font-size: var(--fs-sm);
cursor: pointer;
transform: translateX(-50%);
}
.obsidian-graph-card-zoom-hint:hover,
.obsidian-graph-card-zoom-hint:focus-visible { background: var(--surface-hover); outline: none; }
@media (max-width: 900px) {
.obsidian-graph-toolbar { left: var(--space-3); right: calc(var(--space-8) + var(--space-5)); flex-wrap: wrap; max-width: none; transform: none; }
.obsidian-graph-branch-actions { flex: 1 1 100%; min-width: 0; padding-top: var(--space-2); padding-left: 0; border-top: var(--bw-hairline) solid var(--border-default); border-left: 0; }
.obsidian-graph-search { flex: 1 1 100%; min-width: 0; }
.obsidian-graph-filters { top: calc(var(--space-8) * 3.5); grid-template-columns: 1fr; }
.obsidian-graph-inspector { left: var(--space-3); right: var(--space-3); width: auto; }
}
@media (prefers-reduced-motion: reduce) {
.obsidian-node circle { transition: none; }
}
/* Dreigeteilte Graph-Arbeitsansicht nach der verbindlichen Referenz:
gemeinsame Filter links, ruhiges Netzwerk in der Mitte, Details rechts. */
.obsidian-graph { background: var(--surface-app); }
.obsidian-graph-layout {
display: grid;
grid-template-columns: clamp(220px, 17vw, 280px) minmax(0, 1fr) clamp(270px, 21vw, 340px);
width: 100%;
height: 100%;
min-width: 0;
min-height: 0;
}
.obsidian-graph-filter-panel,
.obsidian-graph-inspector {
position: static;
display: flex;
flex-direction: column;
width: auto;
min-width: 0;
min-height: 0;
padding: 0;
border-radius: 0;
background: color-mix(in srgb, var(--surface-panel) 96%, var(--surface-app));
backdrop-filter: none;
}
.obsidian-graph-filter-panel { border: 0; border-right: var(--bw-hairline) solid var(--border-default); }
.obsidian-graph-inspector { border: 0; border-left: var(--bw-hairline) solid var(--border-default); }
.obsidian-graph-filter-panel > header,
.obsidian-graph-inspector > header {
display: flex;
flex: 0 0 auto;
align-items: center;
justify-content: space-between;
gap: var(--space-3);
min-height: calc(var(--row-h) + var(--space-3));
padding: 0 var(--space-4);
border-bottom: var(--bw-hairline) solid var(--border-default);
}
.obsidian-graph-filter-panel > header strong,
.obsidian-graph-inspector > header strong {
color: var(--text-primary);
font-size: var(--fs-md);
font-weight: var(--fw-semibold);
letter-spacing: var(--ls-caps);
text-transform: uppercase;
}
.obsidian-graph-filter-panel > header span { color: var(--text-secondary); font-size: var(--fs-sm); font-variant-numeric: tabular-nums; }
.obsidian-graph-filter-scroll {
display: grid;
align-content: start;
gap: var(--space-4);
min-height: 0;
padding: var(--space-4);
overflow-y: auto;
scrollbar-color: var(--border-strong) var(--surface-panel);
scrollbar-width: thin;
}
.obsidian-graph-filter-section { display: grid; gap: var(--space-2); }
.obsidian-panel-label { color: var(--text-secondary); font-size: var(--fs-sm); font-weight: var(--fw-semibold); letter-spacing: var(--ls-caps); text-transform: uppercase; }
.obsidian-graph-filter-panel .search-text-group,
.obsidian-graph-filter-panel .search-input-wrap,
.obsidian-graph-filter-panel .search-input,
.obsidian-graph-filter-panel .sheet-select { width: 100%; min-width: 0; }
.obsidian-graph-filter-panel .search-tools,
.obsidian-graph-filter-panel .primary-filter-group {
display: grid;
grid-template-columns: minmax(0, 1fr);
gap: var(--space-2);
min-width: 0;
margin: 0;
padding: 0;
}
.obsidian-graph-filter-panel .primary-filter-group { display: contents; }
.obsidian-graph-filter-panel .standard-filter-btn,
.obsidian-graph-filter-panel .dynamic-facet-select,
.obsidian-graph-filter-panel .dynamic-range-filter { width: 100%; min-width: 0; margin: 0; }
.obsidian-graph-filter-panel .standard-filter-btn { order: -1; }
.obsidian-graph-filter-panel .dynamic-range-filter { grid-template-columns: minmax(0, 1fr) minmax(0, .8fr) minmax(0, .8fr); }
.obsidian-graph-workspace-tools {
display: grid;
gap: var(--space-3);
min-width: 0;
padding-top: var(--space-4);
border-top: var(--bw-hairline) solid var(--border-default);
}
.obsidian-graph-workspace-check {
display: flex;
align-items: center;
gap: var(--space-2);
min-height: var(--control-h);
color: var(--text-primary);
font-size: var(--ui-label-size);
cursor: pointer;
}
.obsidian-graph-workspace-check input {
width: 14px;
height: 14px;
margin: 0;
accent-color: var(--accent);
}
.obsidian-graph-workspace-check:has(input:disabled) {
color: var(--text-muted);
cursor: not-allowed;
}
.obsidian-graph-workspace-tools .view-bookmark-bar,
.obsidian-graph-workspace-tools .view-bookmark-list {
align-items: stretch;
flex-direction: column;
width: 100%;
}
.obsidian-graph-workspace-tools .view-bookmark-create,
.obsidian-graph-workspace-tools .view-bookmark-item,
.obsidian-graph-workspace-tools .view-bookmark-entry { width: 100%; }
.obsidian-graph-workspace-tools .view-bookmark-item { display: flex; }
.obsidian-graph-workspace-tools .view-bookmark-entry { flex: 1 1 auto; }
.obsidian-graph-stage {
position: relative;
min-width: 0;
min-height: 0;
overflow: hidden;
background: color-mix(in srgb, var(--surface-app) 95%, var(--surface-panel));
}
.obsidian-graph-stage .obsidian-graph-surface { width: 100%; height: 100%; }
.obsidian-graph-edges line { stroke: var(--graph-edge); stroke-width: 1; }
.obsidian-graph-edges .obsidian-edge-category { stroke: color-mix(in srgb, var(--graph-edge) 58%, var(--text-muted)); stroke-width: .8; }
.obsidian-graph-edges .obsidian-edge-defense { stroke: color-mix(in srgb, var(--graph-edge) 68%, var(--graph-defense)); stroke-width: .9; }
.obsidian-graph-edges .obsidian-edge-technique { stroke-width: 1.15; }
.obsidian-graph-edges line.is-direct-path { stroke: var(--graph-alert); stroke-width: 2; }
.obsidian-node-core { fill: color-mix(in srgb, currentColor 88%, var(--surface-app)); }
.obsidian-node-card.data-tile {
grid-template-columns: 18px minmax(0, 1fr);
gap: var(--space-1);
padding: var(--space-1);
}
.obsidian-node-card .data-tile-hex { width: 18px; height: 20px; }
.obsidian-node-card .data-tile-content h3 { font-size: 16px; line-height: 1.25; }
.obsidian-node-card .data-tile-badges { flex-wrap: nowrap; gap: var(--space-1); max-height: 18px; margin-top: var(--space-1); overflow: hidden; }
.obsidian-node-card .reader-severity,
.obsidian-node-card .outcome-mark { min-height: 18px; padding: 1px var(--space-1); font-size: var(--fs-sm); white-space: nowrap; }
.obsidian-node.is-selected .obsidian-node-card { outline-width: var(--bw-hairline); outline-offset: -1px; }
.obsidian-graph-stage .obsidian-graph-toolbar {
top: var(--space-3);
left: var(--space-3);
align-items: center;
max-width: none;
padding: var(--space-1);
transform: none;
}
.obsidian-graph-stage .obsidian-graph-zoom { top: var(--space-3); right: var(--space-3); }
.obsidian-graph-inspector-content,
.obsidian-graph-inspector-empty {
display: grid;
align-content: start;
gap: var(--space-3);
min-height: 0;
padding: var(--space-4);
overflow-y: auto;
}
.obsidian-graph-inspector-content > small { color: var(--text-secondary); font-size: var(--fs-sm); font-weight: var(--fw-semibold); letter-spacing: var(--ls-caps); text-transform: uppercase; }
.obsidian-graph-inspector-content > strong { padding-right: var(--space-6); color: var(--text-primary); font-size: var(--fs-lg); line-height: var(--lh-prose); overflow-wrap: anywhere; }
.obsidian-graph-inspector-content > span,
.obsidian-graph-inspector-empty span { color: var(--text-secondary); font-size: var(--fs-lg); line-height: var(--lh-prose); }
.obsidian-graph-inspector-empty strong { color: var(--text-primary); font-size: var(--fs-lg); }
.obsidian-graph-inspector dl { display: grid; grid-template-columns: 1fr; gap: 0; margin: var(--space-2) 0 0; }
.obsidian-graph-inspector dl div { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--space-3); padding: var(--space-3) 0; border: 0; border-bottom: var(--bw-hairline) solid var(--border-subtle); background: transparent; }
.obsidian-graph-inspector dt { font-size: var(--fs-md); }
.obsidian-graph-inspector-actions { display: grid; gap: var(--space-2); margin-top: var(--space-3); }
.obsidian-graph-inspector-actions .btn { width: 100%; }
.obsidian-inspector-close { position: static; flex: 0 0 auto; }
@media (max-width: 1100px) {
.obsidian-graph-layout { grid-template-columns: 220px minmax(0, 1fr) 270px; }
}
@media (max-width: 850px) {
.obsidian-graph-layout { grid-template-columns: 210px minmax(0, 1fr); grid-template-rows: minmax(0, 1fr) 210px; }
.obsidian-graph-inspector { grid-column: 1 / -1; border-top: var(--bw-hairline) solid var(--border-default); border-left: 0; }
.obsidian-graph-inspector-content { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
}
@media (max-width: 650px) {
.obsidian-graph-layout { grid-template-columns: 1fr; grid-template-rows: 220px minmax(360px, 1fr) 220px; overflow-y: auto; }
.obsidian-graph-filter-panel { border-right: 0; border-bottom: var(--bw-hairline) solid var(--border-default); }
.obsidian-graph-inspector { grid-column: 1; }
}