Skip to content

feat: add uZoomRanger() — interactive range-selector below uPlot charts#2

Open
Copilot wants to merge 3 commits intomainfrom
copilot/add-zoom-ranger-feature
Open

feat: add uZoomRanger() — interactive range-selector below uPlot charts#2
Copilot wants to merge 3 commits intomainfrom
copilot/add-zoom-ranger-feature

Conversation

Copy link
Copy Markdown

Copilot AI commented May 5, 2026

Adds a range-selector navigator widget (à la zoom-ranger-grips.html demo) to the R package API, letting users pan/zoom the main chart by dragging a selection window on a compact overview chart rendered below it.

New R API

uPlot(data = eco2mix[, c("datetime", "consumption")]) %>%
  uZoomRanger(
    height     = 80,        # navigator height in px
    grip_color = "#4a90d9", # resize grip colour
    grip_width = 8          # resize grip width in px
  )

Changes

R

  • R/zoom_ranger.RuZoomRanger(uplot, height, stroke, grip_color, grip_width) sets x$config$zoomRanger on the widget; follows existing pipe-chain idiom
  • NAMESPACE / man/uZoomRanger.Rd — export + roxygen docs
  • examples/ex-uZoomRanger.R — runnable example

JavaScript

  • srcjs/modules/zoomRangerPlugin.jscreateZoomRanger() encapsulates the full two-chart pattern: DOM wiring, CSS injection (once per page), bidirectional sync via setScale/setSelect hooks, left/right grip handles with mousemove/mouseup drag logic, and a ResizeObserver that keeps both charts sized together
  • srcjs/widgets/uPlot.js — when x.config.zoomRanger is present, delegates to createZoomRanger instead of the normal single-chart path; properly destroys both charts and removes the wrapper div on re-render (Shiny-safe)
  • inst/htmlwidgets/uPlot.js — rebuilt webpack bundle

Behaviour

  • Drag the selection area → pans main chart
  • Drag left/right grips → resizes the zoomed window
  • Zoom/pan the main chart → ranger selection syncs back automatically
  • Grip colour/width are applied inline so multiple widgets on one page can have independent styles
Original prompt

Ajouter au package R dreamRs/uPlot-r une fonctionnalité permettant d'afficher sous un graphique uPlot un zoom ranger similaire à la démo HTML suivante de leeoniya/uPlot : demos/zoom-ranger-grips.html (source de référence : https://github.com/leeoniya/uPlot/blob/0e5812c504430f5c804e0f993376d8999b26cc34/demos/zoom-ranger-grips.html).

Objectif produit

  • Permettre aux utilisateurs du package R d'activer, depuis l'API R du package, un sous-graphique/range selector en dessous du graphique principal.
  • Le composant doit permettre de sélectionner une fenêtre sur l’axe X, de la déplacer, et de redimensionner la sélection via des grips gauche/droite, comme dans la démo uPlot.
  • L’interaction doit mettre à jour le zoom du graphique principal.
  • Quand le graphique principal change d’échelle X, la sélection du ranger doit se synchroniser en retour.

Contraintes d’implémentation

  • Travailler dans le dépôt dreamRs/uPlot-r.
  • Concevoir une API R idiomatique et cohérente avec le reste du package, par exemple une fonction dédiée du style uplot_zoom_ranger(...) ou équivalent mieux adapté à l’architecture existante.
  • Intégrer l’implémentation côté JavaScript/htmlwidgets sans casser les fonctionnalités existantes.
  • Ajouter, si nécessaire, le CSS/JS de support pour les grips et la logique de synchronisation entre graphique principal et ranger.
  • Gérer raisonnablement les dimensions, options par défaut, et la configuration de l’axe X.
  • Prévoir une documentation minimale de la nouvelle API (roxygen, man, README/vignette/example si c’est le pattern du repo).
  • Ajouter ou mettre à jour un exemple démontrant l’usage de cette fonctionnalité.

Critères d’acceptation

  • Un utilisateur R peut activer/configurer le zoom ranger depuis le package sans écrire manuellement le JavaScript de la démo.
  • Le widget rendu affiche un graphique principal et un ranger en dessous.
  • Le déplacement de la zone sélectionnée dans le ranger met à jour le zoom du graphique principal.
  • Le redimensionnement par les grips gauche/droite fonctionne.
  • La modification de l’échelle X du graphique principal resynchronise la sélection du ranger.
  • La fonctionnalité est documentée et illustrée par un exemple.

Référence technique utile

  • La logique de base de la démo comprend : setSelect, setScale, valToPos, posToVal, une sélection synchronisée entre uRanger et uZoomed, et des poignées .u-grip-l / .u-grip-r.
  • La démo de référence est fournie uniquement comme comportement cible ; adaptez son implémentation à l’architecture du package R.

Merci de créer une pull request avec les changements nécessaires.

The following is the prior conversation context from the user's chat exploration (may be truncated):

User: Je voudrai modifier ce package R @dreamRs/uPlot-r pour ajouter une fonction permettant d'ajouter en-dessous d'un graphique la fonctionnalité de zoom ranger démontré ici @leeoniya/uPlot/files/demos/zoom-ranger-grips.html

Assistant: J’attends simplement votre réponse au dialogue de confirmation pour pouvoir continuer.

This pull request was created from Copilot chat.

@pvictor pvictor marked this pull request as ready for review May 5, 2026 15:05
Copilot AI changed the title [WIP] Add zoom ranger feature for uPlot graphs feat: add uZoomRanger() — interactive range-selector below uPlot charts May 5, 2026
Copilot finished work on behalf of pvictor May 5, 2026 15:07
Copilot AI requested a review from pvictor May 5, 2026 15:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants