Usa screenshot di pagina come sfondo heatmap al posto dell’iframe.

Cattura periodica client-side (con consenso), storage ActiveStorage e overlay allineato all’immagine.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-20 23:14:47 +02:00
co-authored by Cursor
parent 406a90ae5b
commit 70fccc493e
25 changed files with 442 additions and 73 deletions
+5 -3
View File
@@ -383,9 +383,11 @@ de:
scroll_hint: "Durchschnitt %{avg}% · Maximum %{max}%"
heatmap_moves: Mausbewegungs-Karte
heatmap_clicks: Klickkarte
heatmap_hint: Farbiges Overlay auf der Live-Seite (aktuelles Layout). Grün = wenig, Rot = viel.
preview_title: Seitenvorschau
preview_unavailable: Vorschau für Pfade mit Platzhalter nicht verfügbar (z. B. /clubs/:id). Nur Overlay.
heatmap_hint: Farbiges Overlay auf dem Seiten-Screenshot. Grün = wenig, Rot = viel.
preview_title: Seiten-Screenshot
preview_unavailable: Vorschau für Pfade mit Platzhalter nicht verfügbar (z. B. /clubs/:id).
snapshot_missing: Noch kein Screenshot. Seite mit Analytics-Einwilligung (Desktop) besuchen und erneut versuchen.
snapshot_meta: "Screenshot %{device} · %{at}"
no_points: Keine aggregierten Punkte für diese Ebene im Zeitraum.
heatmap_title: Klickkarte
no_clicks: Keine aggregierten Klicks für diese Seite im Zeitraum.
+5 -3
View File
@@ -383,9 +383,11 @@ en:
scroll_hint: "Average %{avg}% · max %{max}%"
heatmap_moves: Mouse-move map
heatmap_clicks: Click map
heatmap_hint: Colored overlay on the live page (current layout). Green = low, red = high.
preview_title: Page preview
preview_unavailable: Preview unavailable for paths with placeholders (e.g. /clubs/:id). Overlay only.
heatmap_hint: Colored overlay on the page screenshot. Green = low, red = high.
preview_title: Page screenshot
preview_unavailable: Preview unavailable for paths with placeholders (e.g. /clubs/:id).
snapshot_missing: No screenshot yet. Visit the page on the site with analytics consent (desktop), then retry in a few seconds.
snapshot_meta: "Screenshot %{device} · captured %{at}"
no_points: No aggregated points for this layer in the period.
heatmap_title: Click map
no_clicks: No aggregated clicks for this page in the period.
+5 -3
View File
@@ -383,9 +383,11 @@ es:
scroll_hint: "Media %{avg}% · máximo %{max}%"
heatmap_moves: Mapa de movimientos
heatmap_clicks: Mapa de clics
heatmap_hint: Superposición de color sobre la página en vivo (layout actual). Verde = poco, rojo = mucho.
preview_title: Vista previa de la página
preview_unavailable: Vista previa no disponible para rutas con placeholder (p. ej. /clubs/:id). Solo overlay.
heatmap_hint: Superposición de color sobre la captura de la página. Verde = poco, rojo = mucho.
preview_title: Captura de página
preview_unavailable: Vista previa no disponible para rutas con placeholder (p. ej. /clubs/:id).
snapshot_missing: Aún no hay captura. Visita la página con consentimiento analytics (escritorio) y vuelve a intentarlo.
snapshot_meta: "Captura %{device} · %{at}"
no_points: No hay puntos agregados para esta capa en el periodo.
heatmap_title: Mapa de clics
no_clicks: No hay clics agregados para esta página en el periodo.
+5 -3
View File
@@ -383,9 +383,11 @@ fr:
scroll_hint: "Moyenne %{avg}% · maximum %{max}%"
heatmap_moves: Carte des mouvements
heatmap_clicks: Carte des clics
heatmap_hint: Superposition colorée sur la page live (mise en page actuelle). Vert = faible, rouge = fort.
preview_title: Aperçu de la page
preview_unavailable: Aperçu indisponible pour les chemins avec placeholder (ex. /clubs/:id). Overlay seul.
heatmap_hint: Superposition colorée sur la capture d’écran de la page. Vert = faible, rouge = fort.
preview_title: Capture de page
preview_unavailable: Aperçu indisponible pour les chemins avec placeholder (ex. /clubs/:id).
snapshot_missing: Pas encore de capture. Visitez la page avec consentement analytics (desktop), puis réessayez.
snapshot_meta: "Capture %{device} · %{at}"
no_points: Aucun point agrégé pour cette couche sur la période.
heatmap_title: Carte des clics
no_clicks: Aucun clic agrégé pour cette page sur la période.
+5 -3
View File
@@ -404,9 +404,11 @@ it:
scroll_hint: "Media %{avg}% · massimo %{max}%"
heatmap_moves: Mappa movimenti mouse
heatmap_clicks: Mappa click
heatmap_hint: Overlay colorato sulla pagina live (layout attuale). Verde = poco, rosso = molto.
preview_title: Anteprima pagina
preview_unavailable: Anteprima non disponibile per path con placeholder (es. /clubs/:id). Mostra solo loverlay.
heatmap_hint: Overlay colorato sullo screenshot della pagina. Verde = poco, rosso = molto.
preview_title: Screenshot pagina
preview_unavailable: Anteprima non disponibile per path con placeholder (es. /clubs/:id).
snapshot_missing: Nessuno screenshot ancora. Visita la pagina sul sito con consenso analytics (desktop) e riprova tra qualche secondo.
snapshot_meta: "Screenshot %{device} · catturato %{at}"
no_points: Nessun punto aggregato per questo livello nel periodo.
heatmap_title: Mappa click
no_clicks: Nessun click aggregato per questa pagina nel periodo.
+1 -1
View File
@@ -186,7 +186,7 @@ en:
s4_2_row3_duration: 24 hours
s4_2_row3_provider: Google
s4_2_row4_name_html: "Heatmap / scroll (first-party)"
s4_2_row4_purpose: Aggregated mouse-move, click and scroll-depth counts by page and device type (no user identifiers)
s4_2_row4_purpose: Aggregated mouse-move, click and scroll-depth counts, plus page screenshots for heatmaps (no user identifiers)
s4_2_row4_duration: Aggregates kept up to 30 days
s4_2_row4_provider: Match Live TV (first-party)
s4_2_p2_html: "You can withdraw consent from the banner or from your browser settings. Google information: %{google_privacy_link}, %{google_optout_link}."
+1 -1
View File
@@ -186,7 +186,7 @@ it:
s4_2_row3_duration: 24 ore
s4_2_row3_provider: Google
s4_2_row4_name_html: "Heatmap / scroll (prima parte)"
s4_2_row4_purpose: Conteggi aggregati di movimenti mouse, click e profondità di scroll per pagina e tipo di dispositivo (nessun identificativo utente)
s4_2_row4_purpose: Conteggi aggregati di movimenti mouse, click e profondità di scroll, più screenshot della pagina per le heatmaps (nessun identificativo utente)
s4_2_row4_duration: Aggregati fino a 30 giorni
s4_2_row4_provider: Match Live TV (prima parte)
s4_2_p2_html: "Puoi revocare il consenso dal banner o dalle impostazioni del browser. Informazioni Google: %{google_privacy_link}, %{google_optout_link}."
+1
View File
@@ -77,6 +77,7 @@ Rails.application.routes.draw do
post "internal/validate_publish", to: "webhooks/mediamtx#validate_publish"
post "analytics/events", to: "analytics/events#create"
post "analytics/snapshot", to: "analytics/snapshots#create"
namespace :admin do
get "login", to: "auth#new", as: :login