add_layer_tuner() now applies the Filter Arguments control to flowmap
layer controls and includes Undo and Redo buttons with up to 1,000 undo
states. Numeric sliders automatically expand when current or typed values
exceed the default range, and color controls normalize common color formats
to editable hex values. The tuner panel can now be initialized with a custom
title, position, size, and collapsed state.
add_flowmap() now supports flow_temporal_scale_domain for temporal
flowmaps, allowing flow thickness and color scales to use either the
selected time interval or the full temporal extent.
New bivariate mapping support with bivariate_scale(), bivariate_palettes(), and add_bivariate_legend(). Bivariate scales use 3-by-3 palettes, support custom 3-by-3 color matrices, optional x_breaks and y_breaks for stable bins, and explicit na_color handling (#181).
Continuous legends can now expose an opt-in color-ramp picker. Use color_ramps, selected_ramp, and ramp_picker = TRUE with continuous legends to let readers switch palettes directly from the legend; named ramps display labels by default, and ramp_labels = FALSE creates a compact picker.
interpolate_palette() now carries additional scale metadata for downstream legends, including the source column, missing-value color, available color ramps, and selected ramp.
set_flowmap_settings() now updates a single validated FlowMapGL setting at
a time with name and value arguments. Snake-case aliases are still
accepted, and filter state remains handled by set_flowmap_filter().
Compare maps now initialize legend interactivity assets so supported dynamic legend features can be used in compare views.
GitHub source archives are now slimmed with .gitattributes export-ignore rules for generated site and vignette assets. This preserves GitHub Pages content in the repository while avoiding large downloads during GitHub-based package installs.
New save_map() function renders a map widget to a static PNG file using headless Chrome via the chromote package. Supports options for hiding controls, including/excluding legends and scale bars, replacing the basemap with a solid color, and retina-quality output with image_scale. New print_map() function provides the same capability for use in Quarto and R Markdown documents.
Update MapLibre GL JS to v5.22.0 and Mapbox GL JS to v3.21.0.
Mapbox GL JS v3.21.0 adds native PMTiles support via the TileProvider API. add_pmtiles_source() now uses the native vector tile path for Mapbox, removing the need for the custom PMTiles source implementation for vector tiles.
Support for color tables and categorical rasters in add_image_source() (#21).
New layer properties: circle_emissive_strength, circle_pitch_alignment, circle_pitch_scale, fill_pattern_cross_fade, line_elevation_reference, line_elevation_ground_scale, line_pattern_cross_fade, fill_extrusion_emissive_strength, fill_extrusion_ambient_occlusion_intensity, fill_extrusion_ambient_occlusion_radius, fill_extrusion_cast_shadows, fill_extrusion_cutoff_fade_range, fill_extrusion_vertical_gradient, raster_color, raster_color_mix, raster_color_range, raster_emissive_strength, icon_occlusion_opacity, text_occlusion_opacity.
sfc geometry vectors are now accepted wherever sf objects are accepted, including layer functions, quickview functions, and the bounds parameter (#177).
Various bug fixes and performance improvements (see GitHub issues for full list).
Esri styles support: New esri_style() function provides access to Esri basemap styles for use with MapLibre maps, with support for ArcGIS API key authentication.
MLT format support: Updated PMTiles implementation to support the MapLibre Tiles (MLT) format.
Update Mapbox GL JS to v3.19.1 and MapLibre GL JS to v5.19.0.
Bug fixes and improvements:
add_reset_control() button to match the visual style of other navigation controls (#168)set_source() not working with maplibre_compare_proxy() and mapboxgl_compare_proxy() (#171)Update Mapbox GL JS to v3.17.0 and MapLibre GL JS to v5.15.0.
Interactive legends: New opt-in interactivity for map legends enables direct data filtering from the legend:
interactive = TRUE, filter_column, filter_values, and classification in legend functionsinteractive_legend parameter in maplibre_view() and mapboxgl_view() for quick interactive visualizationsDraggable legends: New draggable = TRUE parameter allows users to drag legends to any position on the map. Supports both mouse and touch interactions.
Screenshot control: New add_screenshot_control() function allows users to capture and download map screenshots as PNG images. Includes image_scale parameter for controlling output resolution.
Globe projection for compare views: Compare maps in MapLibre now properly respect globe projection when specified.
Bug fixes and improvements:
get_legend_labels())step_expr() to properly handle quoted column names (#148)add_image() now persist across set_style() callsbounds argument in maplibre() and mapboxgl() now accepts sf::st_bbox() output with automatic CRS transformation to EPSG:4326.set_style() is called in Shiny applications.clear_controls() not properly removing controls.projection argument to maplibre() for consistency with mapboxgl().number_format() in comparison maps.palette_to_lut() function for creating custom color lookup tables in Mapbox styles.maplibre() and maplibre_view() now defaults to the globe projection.Enhanced draw control with new drawing modes and live measurements:
measurement_units parameterAdvanced layers control enhancements:
New map style support:
openfreemap_style() function providing free, open-source map styles without API key requirementsGeneral improvements:
Selective control functionality: Enhanced control over which map controls are displayed and when, providing more granular customization options
Bug fixes and stability improvements:
move_layer() functionality outside of Shiny applicationsturf_buffer(), turf_union(), turf_intersect(), turf_difference()turf_filter() with predicates (intersects, within, contains, crosses, disjoint)turf_convex_hull(), turf_concave_hull(), turf_voronoi(), turf_centroid(), turf_center_of_mass()turf_distance() and turf_area() (Shiny-only)download_button and download_filename parameters in add_draw_control(). Users can now export drawn features as GeoJSON files directly from the draw control interface.provider parameter allows choosing between "osm" (OpenStreetMap/Nominatim) and "maptiler" providers, with maptiler_api_key parameter for MapTiler authentication.add_pmtiles_source() function.query_rendered_features() and get_queried_features() allow users to directly invoke the map.queryRenderedFeatures() method from the parent libraries in Shiny apps, with guidance for users to avoid race conditions and ensure proper synchronization. Functions query visible features in the map's viewport and which can be extracted as sf objects.mapboxgl_view() and maplibre_view() now support quick view of terra rasters. A new function, add_view(), is designed to help users quickly stack layers on top of the core view functions.Added enable_shiny_hover() function for optional hover events in Shiny applications:
_hover input for mouse coordinates and _feature_hover input for feature informationmaplibre() and mapboxgl() widgets, including compare viewscoordinates = TRUE/FALSE and features = TRUE/FALSEmaplibre() |> add_circle_layer(...) |> enable_shiny_hover()"before" or "after") in input namesComprehensive legend styling system: Major enhancement to legend functionality with extensive customization options:
legend_style() function provides user-friendly interface for legend styling without requiring CSS knowledgemap_legends documentationAdvanced data classification system: New functions for automatic choropleth mapping similar to GIS software:
step_equal_interval(), step_quantile(), and step_jenks() for automatic classification with equal interval, quantile, and Jenks natural breaks methodsinterpolate_palette() for continuous color scaling with multiple interpolation methodsget_legend_labels(), get_legend_colors(), and get_breaks() for extracting classification metadataclassInt package for robust statistical classification algorithmsEnhanced MapTiler integration: Expanded support for MapTiler mapping styles:
variant parameter in maptiler_style()Robust set_style() improvements: Fixed critical issues with dynamic style switching in Shiny applications:
set_style() now properly preserves user-added layers, sources, popups, tooltips, and other map elements when switching base stylesNew number_format() function: Comprehensive number formatting for tooltips and map content:
Enhanced draw control functionality with improved feature editing capabilities:
add_features_to_draw()Fixed hover_options for vector tile sources in MapLibre (#67):
Enhanced tooltip functionality with expression support:
get_column() to reference feature properties in tooltipsconcat() helper function for combining strings and expressionstooltip = concat("<strong>Name:</strong> ", get_column("name"), "<br>Value: ", get_column("value"))set_tooltip() in Shiny applicationsmapboxgl_view() and maplibre_view() functions for quick visualization of sf objects with automatic geometry detection and column-based styling (#102).set_rain() and set_snow() functions.add_globe_control() for MapLibre maps, allowing users to toggle between "mercator" and "globe" projections.set_style() in Shiny applications for both Mapbox and MapLibre maps (#99).get_drawn_features() for Shiny modules (#95).layer_id parameter in add_legend(). When a layer is toggled in the layers control, its associated legend will automatically show or hide.margin_top, margin_right, margin_bottom, margin_left) that allow fine-grained control over legend placement.visibility = "none" showing as active in the control.compare() plugin in Shiny applications, with new rendering and proxy functions for comparison apps in Mapbox and MapLibre.mode parameter in compare() allowing users to choose between "swipe" mode with a comparison slider, and "sync" mode which displays synchronized maps side-by-side.add_image() allows you to add your own image to the map's sprite for use as an icon / symbol layeradd_geolocate_control() adds a Geolocate control to the mapadd_globe_minimap() adds a mini globe overview map that tracks how your map moves around the globeadd = TRUEmove_layer() function that gives you more fine-grained control over layer ordering in a Shiny sessionadd_geocoder_control()add_draw_control(freehand = TRUE)add_reset_control()cluster_options() function, to be used with the cluster_options argument in add_circle_layer() and add_symbol_layer()