fix(insights): a11y + UX Pro Max audit — accessible list view, reduced-motion, focus, lazy-load
Some checks failed
CI / Deploy production (on server) (push) Has been cancelled
CI / Lint, Unit Tests & Build (push) Has been cancelled

Accessibility (CRITIQUE per UI/UX Pro Max skill):
- NetworkGraph Accessibility Grade D → added accessible List view alternative
  (toggle Graph/List with cluster→notes table, keyboard navigable)
- aria-label text summary on graph container for screen readers
- role=button + tabIndex + onKeyDown on bridge note cards (keyboard accessible)
- focus-visible:ring on all interactive cards (isolated clusters, bridges, list items)

UX (HIGH):
- prefers-reduced-motion: whileHover disabled when user prefers reduced motion
- cursor-pointer verified + focus-visible:ring-ochre on all clickable cards
- Mobile sidebar: hamburger Menu button in header (dispatches open-mobile-sidebar)

Performance (MEDIUM):
- NetworkGraph lazy-loaded via next/dynamic (D3 ~200KB deferred, ssr:false)
- Loading spinner shown while D3 chunk loads

i18n:
- listView, graphAriaLabel, listAriaLabel added to 15 locales
This commit is contained in:
Antigravity
2026-06-28 09:24:34 +00:00
parent 40292f4c00
commit 056b0260cf
17 changed files with 200 additions and 39 deletions

View File

@@ -3002,6 +3002,9 @@
"scheduledCron": "مجدول",
"lastSync": "آخر مزامنة"
},
"resetFocus": "إعادة ضبط التركيز"
"resetFocus": "إعادة ضبط التركيز",
"listView": "List",
"graphAriaLabel": "Semantic network: {clusters} clusters, {notes} notes, {bridges} bridge notes. Switch to List view for accessible navigation.",
"listAriaLabel": "Accessible cluster list with notes and bridge connections"
}
}

View File

@@ -3002,6 +3002,9 @@
"scheduledCron": "Geplant",
"lastSync": "Letzte Sync"
},
"resetFocus": "Fokus zurücksetzen"
"resetFocus": "Fokus zurücksetzen",
"listView": "List",
"graphAriaLabel": "Semantic network: {clusters} clusters, {notes} notes, {bridges} bridge notes. Switch to List view for accessible navigation.",
"listAriaLabel": "Accessible cluster list with notes and bridge connections"
}
}

View File

@@ -3532,7 +3532,10 @@
"scheduledCron": "Scheduled",
"lastSync": "Last sync"
},
"resetFocus": "Reset focus"
"resetFocus": "Reset focus",
"listView": "List",
"graphAriaLabel": "Semantic network: {clusters} clusters, {notes} notes, {bridges} bridge notes. Switch to List view for accessible navigation.",
"listAriaLabel": "Accessible cluster list with notes and bridge connections"
},
"consent": {
"banner": {

View File

@@ -3002,6 +3002,9 @@
"scheduledCron": "Programado",
"lastSync": "Última sync"
},
"resetFocus": "Restablecer enfoque"
"resetFocus": "Restablecer enfoque",
"listView": "List",
"graphAriaLabel": "Semantic network: {clusters} clusters, {notes} notes, {bridges} bridge notes. Switch to List view for accessible navigation.",
"listAriaLabel": "Accessible cluster list with notes and bridge connections"
}
}

View File

@@ -3041,6 +3041,9 @@
"scheduledCron": "برنامه‌ریزی‌شده",
"lastSync": "آخرین همگام‌سازی"
},
"resetFocus": "بازنشانی تمرکز"
"resetFocus": "بازنشانی تمرکز",
"listView": "List",
"graphAriaLabel": "Semantic network: {clusters} clusters, {notes} notes, {bridges} bridge notes. Switch to List view for accessible navigation.",
"listAriaLabel": "Accessible cluster list with notes and bridge connections"
}
}

View File

@@ -3536,7 +3536,10 @@
"scheduledCron": "CRON planifié",
"lastSync": "Dernière synchro"
},
"resetFocus": "Réinitialiser focus"
"resetFocus": "Réinitialiser focus",
"listView": "Liste",
"graphAriaLabel": "Réseau sémantique : {clusters} thèmes, {notes} notes, {bridges} notes-ponts. Basculez en vue Liste pour une navigation accessible.",
"listAriaLabel": "Liste accessible des clusters avec notes et connexions ponts"
},
"consent": {
"banner": {

View File

@@ -3002,6 +3002,9 @@
"scheduledCron": "अनुसूचित",
"lastSync": "अंतिम सिंक"
},
"resetFocus": "फोकस रीसेट करें"
"resetFocus": "फोकस रीसेट करें",
"listView": "List",
"graphAriaLabel": "Semantic network: {clusters} clusters, {notes} notes, {bridges} bridge notes. Switch to List view for accessible navigation.",
"listAriaLabel": "Accessible cluster list with notes and bridge connections"
}
}

View File

@@ -3002,6 +3002,9 @@
"scheduledCron": "Programmato",
"lastSync": "Ultima sync"
},
"resetFocus": "Reimposta focus"
"resetFocus": "Reimposta focus",
"listView": "List",
"graphAriaLabel": "Semantic network: {clusters} clusters, {notes} notes, {bridges} bridge notes. Switch to List view for accessible navigation.",
"listAriaLabel": "Accessible cluster list with notes and bridge connections"
}
}

View File

@@ -3002,6 +3002,9 @@
"scheduledCron": "予定済み",
"lastSync": "前回同期"
},
"resetFocus": "フォーカス解除"
"resetFocus": "フォーカス解除",
"listView": "List",
"graphAriaLabel": "Semantic network: {clusters} clusters, {notes} notes, {bridges} bridge notes. Switch to List view for accessible navigation.",
"listAriaLabel": "Accessible cluster list with notes and bridge connections"
}
}

View File

@@ -3002,6 +3002,9 @@
"scheduledCron": "예약됨",
"lastSync": "마지막 동기화"
},
"resetFocus": "포커스 해제"
"resetFocus": "포커스 해제",
"listView": "List",
"graphAriaLabel": "Semantic network: {clusters} clusters, {notes} notes, {bridges} bridge notes. Switch to List view for accessible navigation.",
"listAriaLabel": "Accessible cluster list with notes and bridge connections"
}
}

View File

@@ -3002,6 +3002,9 @@
"scheduledCron": "Gepland",
"lastSync": "Laatste sync"
},
"resetFocus": "Focus resetten"
"resetFocus": "Focus resetten",
"listView": "List",
"graphAriaLabel": "Semantic network: {clusters} clusters, {notes} notes, {bridges} bridge notes. Switch to List view for accessible navigation.",
"listAriaLabel": "Accessible cluster list with notes and bridge connections"
}
}

View File

@@ -3002,6 +3002,9 @@
"scheduledCron": "Zaplanowano",
"lastSync": "Ostatnia sync"
},
"resetFocus": "Resetuj fokus"
"resetFocus": "Resetuj fokus",
"listView": "List",
"graphAriaLabel": "Semantic network: {clusters} clusters, {notes} notes, {bridges} bridge notes. Switch to List view for accessible navigation.",
"listAriaLabel": "Accessible cluster list with notes and bridge connections"
}
}

View File

@@ -3002,6 +3002,9 @@
"scheduledCron": "Programado",
"lastSync": "Última sync"
},
"resetFocus": "Repor foco"
"resetFocus": "Repor foco",
"listView": "List",
"graphAriaLabel": "Semantic network: {clusters} clusters, {notes} notes, {bridges} bridge notes. Switch to List view for accessible navigation.",
"listAriaLabel": "Accessible cluster list with notes and bridge connections"
}
}

View File

@@ -3002,6 +3002,9 @@
"scheduledCron": "Запланировано",
"lastSync": "Последняя sync"
},
"resetFocus": "Сбросить фокус"
"resetFocus": "Сбросить фокус",
"listView": "List",
"graphAriaLabel": "Semantic network: {clusters} clusters, {notes} notes, {bridges} bridge notes. Switch to List view for accessible navigation.",
"listAriaLabel": "Accessible cluster list with notes and bridge connections"
}
}

View File

@@ -3002,6 +3002,9 @@
"scheduledCron": "已计划",
"lastSync": "上次同步"
},
"resetFocus": "重置焦点"
"resetFocus": "重置焦点",
"listView": "List",
"graphAriaLabel": "Semantic network: {clusters} clusters, {notes} notes, {bridges} bridge notes. Switch to List view for accessible navigation.",
"listAriaLabel": "Accessible cluster list with notes and bridge connections"
}
}