#20 Cross-Mindmap: lesbarere Defaults und Quote-Theme-Tags optional

- cross-claim-erweitert (282 Linien) ist mit Abstand der dichteste Strang;
  default off, damit die Erkenntnis-fokussierten Signale (debates, widerspricht,
  belegt, answers) nicht ueberdeckt werden.
- Neuer Quote-Theme-Tag-Layer analog zur Single-Mindmap aus #19: jeder Top-Quote
  bekommt zusaetzliche Verbindungen zu allen Theme-Tags aus seinem themes-Array,
  default off, per Toggle einblendbar.
- Force-Layout: Quote-Theme-Links bekommen sehr niedrige Strength (0.03), damit
  sie das Layout nicht ueber die Hierarchie kippen.

Effekt: Default-Sichtbarkeit von 1422 auf 835 Linien reduziert; per Toggle
laesst sich gezielt die jeweilige Erkenntnisachse einblenden.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dotty Dotter 2026-04-28 22:09:08 +02:00
parent 7019a7a04e
commit 226fd8db31

View File

@ -1536,9 +1536,10 @@ const CrossMindmapView = {
'cross-debate': true, 'cross-debate': true,
'cross-claim-belegt': true, 'cross-claim-belegt': true,
'cross-claim-widerspricht': true, 'cross-claim-widerspricht': true,
'cross-claim-erweitert': false, 'cross-claim-erweitert': false, // 282 Stueck — visuell zu dicht, opt-in
'cross-answer': true, 'cross-answer': true,
'cross-similarity': false, 'cross-similarity': false,
'quote-theme': false, // Quote-Tags zu allen Themen, opt-in
}, },
activeClusterId: null, activeClusterId: null,
_refs: null, _refs: null,
@ -1550,6 +1551,7 @@ const CrossMindmapView = {
'cross-claim-erweitert': { stroke: '#60a5fa', dash: null, width: 1.2, opacity: 0.7 }, 'cross-claim-erweitert': { stroke: '#60a5fa', dash: null, width: 1.2, opacity: 0.7 },
'cross-answer': { stroke: '#fb923c', dash: null, width: 1.4, opacity: 0.8 }, 'cross-answer': { stroke: '#fb923c', dash: null, width: 1.4, opacity: 0.8 },
'cross-similarity': { stroke: '#7dd3fc', dash: '4,4', width: 0.7, opacity: 0.4 }, 'cross-similarity': { stroke: '#7dd3fc', dash: '4,4', width: 0.7, opacity: 0.4 },
'quote-theme': { stroke: '#a3a3a3', dash: '1,3', width: 0.5, opacity: 0.3 },
}, },
async show(fromUrl = false) { async show(fromUrl = false) {
@ -1661,18 +1663,26 @@ const CrossMindmapView = {
}); });
}); });
// 4. Top-Quote-Knoten // 4. Top-Quote-Knoten + optionale Quote-Theme-Tag-Links
(d.top_quotes || []).forEach(q => { (d.top_quotes || []).forEach(q => {
const epK = epIndex[`${q.podcast_id}:${q.episode_id}`]; const epK = epIndex[`${q.podcast_id}:${q.episode_id}`];
if (!epK) return; if (!epK) return;
const ep = nodes.find(n => n.id === epK); const ep = nodes.find(n => n.id === epK);
const qK = `q-${q.podcast_id}-${q.id}`;
nodes.push({ nodes.push({
id: `q-${q.podcast_id}-${q.id}`, type: 'quote', id: qK, type: 'quote',
podcast_id: q.podcast_id, episode_id: q.episode_id, quote_id: q.id, podcast_id: q.podcast_id, episode_id: q.episode_id, quote_id: q.id,
text: q.text, speaker: q.speaker, start_time: q.start_time, text: q.text, speaker: q.speaker, start_time: q.start_time,
r: 3 * sc, color: ep ? ep.color : '#aaa', r: 3 * sc, color: ep ? ep.color : '#aaa',
}); });
links.push({ source: epK, target: `q-${q.podcast_id}-${q.id}`, type: 'episode-quote' }); links.push({ source: epK, target: qK, type: 'episode-quote' });
// Quote ↔ Theme-Tags (default off)
(q.themes || []).forEach(tid => {
const tK = `t-${q.podcast_id}-${tid}`;
if (nodes.find(n => n.id === tK)) {
links.push({ source: qK, target: tK, type: 'quote-theme' });
}
});
}); });
// 5. Cross-Links (debates, claim_*, answers, similarity) // 5. Cross-Links (debates, claim_*, answers, similarity)
@ -1696,12 +1706,14 @@ const CrossMindmapView = {
if (l.type === 'cluster-theme') return 100 * sc; if (l.type === 'cluster-theme') return 100 * sc;
if (l.type === 'theme-episode') return 70 * sc; if (l.type === 'theme-episode') return 70 * sc;
if (l.type === 'episode-quote') return 18 * sc; if (l.type === 'episode-quote') return 18 * sc;
if (l.type === 'quote-theme') return 50 * sc;
if (l.type && l.type.startsWith('cross-')) return 220 * sc; if (l.type && l.type.startsWith('cross-')) return 220 * sc;
return 60 * sc; return 60 * sc;
}).strength(l => { }).strength(l => {
if (l.type === 'cluster-theme') return 0.4; if (l.type === 'cluster-theme') return 0.4;
if (l.type === 'theme-episode') return 0.2; if (l.type === 'theme-episode') return 0.2;
if (l.type === 'episode-quote') return 0.4; if (l.type === 'episode-quote') return 0.4;
if (l.type === 'quote-theme') return 0.03;
if (l.type && l.type.startsWith('cross-')) return 0.04; if (l.type && l.type.startsWith('cross-')) return 0.04;
return 0.2; return 0.2;
})) }))
@ -1816,6 +1828,7 @@ const CrossMindmapView = {
'cross-claim-erweitert': 'Erweiterung (Claims)', 'cross-claim-erweitert': 'Erweiterung (Claims)',
'cross-answer': 'Frage→Antwort', 'cross-answer': 'Frage→Antwort',
'cross-similarity': 'semantische Ähnlichkeit', 'cross-similarity': 'semantische Ähnlichkeit',
'quote-theme': 'Quote-Theme-Tags',
}; };
panel.innerHTML = `<div style="font-weight:600;color:var(--text-muted);margin-bottom:2px">Cross-Verbindungen</div>`; panel.innerHTML = `<div style="font-weight:600;color:var(--text-muted);margin-bottom:2px">Cross-Verbindungen</div>`;
Object.keys(labels).forEach(t => { Object.keys(labels).forEach(t => {