Mermaid rendert als zwarte vlakken: <style> gestript, stijlen niet ge-inlined #862
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#862
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Symptoom: Mermaid-diagrammen renderen in de app (web én desktop) hun knoop-vormen als zwarte vlakken zonder zichtbare labeltekst; edges worden zwart gevulde wiggen i.p.v. dunne pijlen. Op web zichtbaar sinds #851 (daarvoor bleef het diagram leeg); op desktop hetzelfde renderpad, dus vermoedelijk al langer zo. Waargenomen 25-07-2026 in de proefpresentatie op ocideck.librekat.nl.
Oorzaak (getoetst): het diagram wordt getekend met flutter_svg (vector_graphics), dat GEEN CSS/
<style>-blokken ondersteunt — het leest alleen inline presentatie-attributen. sanitize_svg.dart verwijdert daarom terecht het<style>-element (enclass). Maar mermaid stopt ál zijn theme-styling (node-fill #eee, stroke #999, edge fill:none, tekst #000) in dat<style>-blok met class-selectors. Zonder dat blok vallen alle vormen én tekst terug op de SVG-standaard fill:black → zwarte vakjes met zwarte (onzichtbare) tekst, en edges gevuld zwart.Gevalideerde fix: in de browser-render-stap (WebView op desktop, JS-interop op web — beide hebben een browser die de CSS wél toepast) de computed styles per element inline zetten (fill, fill-opacity, stroke, stroke-, color, opacity, font-, text-anchor — inclusief fill:none, anders vallen edges op zwart terug), en daarna het
<style>-blok verwijderen. De resulterende SVG heeft inline stijlen die flutter_svg wél leest. Empirisch getoetst met de gebundelde mermaid: nodes lichtgrijs, tekst leesbaar, edges dunne pijnen.Let op de web-CSP (script-src 'self' 'wasm-unsafe-eval'): geen eval/inline-JS op web, dus de web-inliner moet in Dart via package:web (DOM), niet als ge-eval'de JS-string. Desktop-WebView mag inline JS.