feat(media): Phase 8.H visuels + ux + cache-bust

- CartePensees: noeuds-ecoles remplis (fill-opacity 0.82 vs transparent)
- CartePensees: labels auteurs non-ingeres grises (opacity 0.3, fill #777)
- CartePensees: repulsion plus forte (-70 vs -30) + distance liens (120 vs 85)
- ChatbotPensees: onglet defaut Pensees (vs Croise*)
- media: cache-bust JSON ?v=4.1 pour forcer rechargement navigateur

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Jules Neny
2026-05-14 16:32:06 +02:00
parent 88716657a2
commit 55d7e4de55
3 changed files with 7 additions and 5 deletions

View File

@@ -212,8 +212,8 @@ async function initGraph() {
if (simulation) simulation.stop()
// Phase 8.D : sim ajustee pour 171 auteurs (vs 28 v2.1, densite 6x)
simulation = d3.forceSimulation(allNodes)
.force('link', d3.forceLink(links).id((d: any) => d.id).distance(85).strength((d: any) => d.strength ?? 0.5))
.force('charge', d3.forceManyBody().strength(-30))
.force('link', d3.forceLink(links).id((d: any) => d.id).distance(120).strength((d: any) => d.strength ?? 0.5))
.force('charge', d3.forceManyBody().strength(-70))
.force('center', d3.forceCenter(W / 2, H / 2).strength(0.02))
.force('collision', d3.forceCollide().radius((d: any) => d.type === 'ecole-fixed' ? ecoleRadius(ecoleAuteurCounts.get(d.ecoleId) ?? 0) + 4 : 12))
.force('forceX', d3.forceX<any>((d: any) => {
@@ -241,7 +241,7 @@ async function initGraph() {
const r = ecoleRadius(count)
gEcoles.append('circle')
.attr('cx', eNode.fx).attr('cy', eNode.fy).attr('r', r)
.attr('fill', ecole.color + '22').attr('stroke', ecole.color).attr('stroke-width', 2.5)
.attr('fill', ecole.color).attr('fill-opacity', 0.82).attr('stroke', ecole.color).attr('stroke-width', 2)
.attr('class', 'ecole-node').style('cursor', 'pointer')
.on('mouseenter', (e: any) => {
if (!tooltipRef.value) return
@@ -300,6 +300,8 @@ async function initGraph() {
.attr('text-anchor', 'middle')
.attr('dy', (d: any) => -(d.r + 4))
.style('pointer-events', 'none')
.style('opacity', (d: any) => d.ingere ? 1 : 0.3)
.style('fill', (d: any) => d.ingere ? '#1a1a1a' : '#777777')
d3NodeSel
.on('mouseenter', (e: any, d: any) => {