diff --git a/apps/web/src/pages/analytics/Analytics.tsx b/apps/web/src/pages/analytics/Analytics.tsx index 7fede462..c401110b 100644 --- a/apps/web/src/pages/analytics/Analytics.tsx +++ b/apps/web/src/pages/analytics/Analytics.tsx @@ -309,45 +309,21 @@ function VizTooltip({ } /** - * Glow for one series. Returned from a plain function, not a component: - * recharts only renders children whose type is a raw SVG tag, so a custom - * component here is dropped and the bars end up pointing at a filter that was - * never defined — which Chromium ignores but WebKit treats as an error and - * refuses to paint. + * Flat translucent fill with a full-opacity outline — the outline is what keeps + * the mark legible at this fill opacity. * - * A drop shadow rather than a blurred copy merged under the source: merging - * stacks the bar on top of itself, so its density came out of filter - * compositing and the two engines disagreed on it. Here the halo is a separate - * flood and the bar's weight is only ever its own fill and stroke. sRGB for the - * same reason — filters default to linearRGB, where that disagreement is worst. + * Deliberately unfiltered: the glow these bars used to reference was never + * actually rendered, because recharts drops children that are not raw SVG tags + * and the defs lived in a component. Chromium ignored the dangling reference + * and drew the bar anyway; WebKit refused to draw it at all. Resolving the + * filter would add a halo the deployed build does not have, so the reference + * is gone instead of fixed. */ -const neonDefs = (id: string, color: string) => ( - - - - - -); - -const neonBar = (id: string, color: string) => ({ +const neonBar = (color: string) => ({ fill: color, fillOpacity: 0.3, stroke: color, strokeWidth: 1.5, - filter: `url(#${id}-glow)`, }); /** Large global totals need compacting or the axis eats the plot. */ @@ -590,15 +566,12 @@ function Analytics() { y="-50%" width="200%" height="200%" - colorInterpolationFilters="sRGB" > - + + + + + @@ -642,7 +615,6 @@ function Analytics() { Every play in the range, folded onto the week. - {neonDefs("viz-weekday", SERIES_1)} @@ -677,7 +649,6 @@ function Analytics() { How the range breaks down month by month. - {neonDefs("viz-month", SERIES_2)} @@ -718,7 +689,6 @@ function Analytics() { ) : ( - {neonDefs("viz-artist", SERIES_1)} @@ -752,7 +722,6 @@ function Analytics() { ) : ( - {neonDefs("viz-track", SERIES_2)} diff --git a/desktop/src/pages/analytics/Analytics.tsx b/desktop/src/pages/analytics/Analytics.tsx index 7fede462..c401110b 100644 --- a/desktop/src/pages/analytics/Analytics.tsx +++ b/desktop/src/pages/analytics/Analytics.tsx @@ -309,45 +309,21 @@ function VizTooltip({ } /** - * Glow for one series. Returned from a plain function, not a component: - * recharts only renders children whose type is a raw SVG tag, so a custom - * component here is dropped and the bars end up pointing at a filter that was - * never defined — which Chromium ignores but WebKit treats as an error and - * refuses to paint. + * Flat translucent fill with a full-opacity outline — the outline is what keeps + * the mark legible at this fill opacity. * - * A drop shadow rather than a blurred copy merged under the source: merging - * stacks the bar on top of itself, so its density came out of filter - * compositing and the two engines disagreed on it. Here the halo is a separate - * flood and the bar's weight is only ever its own fill and stroke. sRGB for the - * same reason — filters default to linearRGB, where that disagreement is worst. + * Deliberately unfiltered: the glow these bars used to reference was never + * actually rendered, because recharts drops children that are not raw SVG tags + * and the defs lived in a component. Chromium ignored the dangling reference + * and drew the bar anyway; WebKit refused to draw it at all. Resolving the + * filter would add a halo the deployed build does not have, so the reference + * is gone instead of fixed. */ -const neonDefs = (id: string, color: string) => ( - - - - - -); - -const neonBar = (id: string, color: string) => ({ +const neonBar = (color: string) => ({ fill: color, fillOpacity: 0.3, stroke: color, strokeWidth: 1.5, - filter: `url(#${id}-glow)`, }); /** Large global totals need compacting or the axis eats the plot. */ @@ -590,15 +566,12 @@ function Analytics() { y="-50%" width="200%" height="200%" - colorInterpolationFilters="sRGB" > - + + + + + @@ -642,7 +615,6 @@ function Analytics() { Every play in the range, folded onto the week. - {neonDefs("viz-weekday", SERIES_1)} @@ -677,7 +649,6 @@ function Analytics() { How the range breaks down month by month. - {neonDefs("viz-month", SERIES_2)} @@ -718,7 +689,6 @@ function Analytics() { ) : ( - {neonDefs("viz-artist", SERIES_1)} @@ -752,7 +722,6 @@ function Analytics() { ) : ( - {neonDefs("viz-track", SERIES_2)}