Components

Map

Interactive map component built on Leaflet with SSR-safe lazy loading, theme-aware tiles, marker clustering, drawing tools, custom controls, and geolocation.

Client Only

Installation

pnpm dlx @docyrus/cli add @docyrus/ui-map
UI Primitives(3 components)
npx shadcn@latest add button button-group dropdown-menu
Required Packages(6 packages)
pnpm add leaflet-draw leaflet leaflet.markercluster react-dom react-leaflet react-leaflet-markercluster

Usage

import {
  Map,
  MapTileLayer,
  MapMarker,
  MapPopup,
  MapZoomControl,
  useLeaflet
} from '@docyrus/ui/components/map';

<Map center={[41.0082, 28.9784]} zoom={13}>
  <MapTileLayer />
  <MapZoomControl />
  <MapMarker position={[41.0082, 28.9784]}>
    <MapPopup>Istanbul</MapPopup>
  </MapMarker>
</Map>

With Layers & Clustering

import {
  Map,
  MapTileLayer,
  MapLayers,
  MapLayerGroup,
  MapLayersControl,
  MapMarker,
  MapMarkerClusterGroup,
  MapZoomControl
} from '@docyrus/ui/components/map';

<Map center={[41.0082, 28.9784]} zoom={13}>
  <MapLayers defaultTileLayer="Default" defaultLayerGroups={['markers']}>
    <MapTileLayer name="Default" />
    <MapTileLayer
      name="Satellite"
      url="https://..."
      darkUrl="https://..."
    />
    <MapLayerGroup name="markers">
      <MapMarkerClusterGroup>
        {markers.map(m => (
          <MapMarker key={m.id} position={m.position} />
        ))}
      </MapMarkerClusterGroup>
    </MapLayerGroup>
    <MapLayersControl />
  </MapLayers>
  <MapZoomControl />
</Map>

With Drawing Tools

import {
  Map,
  MapTileLayer,
  MapDrawControl,
  MapDrawMarker,
  MapDrawPolyline,
  MapDrawPolygon,
  MapDrawCircle,
  MapDrawRectangle,
  MapDrawEdit,
  MapDrawDelete,
  MapDrawUndo
} from '@docyrus/ui/components/map';

<Map center={[41.0082, 28.9784]} zoom={13}>
  <MapTileLayer />
  <MapDrawControl>
    <MapDrawMarker />
    <MapDrawPolyline />
    <MapDrawPolygon />
    <MapDrawCircle />
    <MapDrawRectangle />
    <MapDrawEdit />
    <MapDrawDelete />
    <MapDrawUndo />
  </MapDrawControl>
</Map>

Dark Mode Tile Layers

MapTileLayer supports separate url and darkUrl props. Theme detection uses useDocyTheme automatically.

<MapTileLayer
  name="Streets"
  url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
  darkUrl="https://tiles.stadiamaps.com/tiles/alidade_smooth_dark/{z}/{x}/{y}.png"
/>

Components

ComponentDescription
MapRoot container. Wraps Leaflet MapContainer with SSR-safe lazy loading.
MapTileLayerTile layer with dark mode support via darkUrl.
MapLayersContext provider for tile layer and layer group management.
MapLayerGroupNamed layer group that registers with MapLayers.
MapFeatureGroupFeature group that registers with MapLayers.
MapLayersControlDropdown to select tile layers and toggle layer groups.
MapMarkerMarker with custom ReactNode icon via DivIcon.
MapMarkerClusterGroupCluster group with custom badge icon function.
MapCircleCircle shape overlay.
MapCircleMarkerCircle marker overlay.
MapPolylinePolyline shape overlay.
MapPolygonPolygon shape overlay.
MapRectangleRectangle shape overlay.
MapPopupStyled popup with dark mode support.
MapTooltipTooltip with directional arrow.
MapControlContainerContainer for custom controls (disables map interaction propagation).
MapZoomControlZoom in/out buttons.
MapFullscreenControlFullscreen toggle button.
MapLocateControlGeolocation tracker with optional watch mode.
MapSearchControlPlace search via PlaceAutocomplete integration.
MapDrawControlContext provider for drawing mode.
MapDrawMarkerToggle button for marker drawing.
MapDrawPolylineToggle button for polyline drawing.
MapDrawCircleToggle button for circle drawing.
MapDrawRectangleToggle button for rectangle drawing.
MapDrawPolygonToggle button for polygon drawing.
MapDrawEditToggle button for editing drawn shapes.
MapDrawDeleteToggle button for deleting drawn shapes.
MapDrawUndoUndo last edit/delete action.
useLeafletHook to lazy-load Leaflet + plugins. Returns { L, ready }.

API Reference

Map

PropTypeDefaultDescription
centerLatLngExpression—Map center coordinates.
zoomnumber15Initial zoom level.
maxZoomnumber18Maximum zoom level.
classNamestring—Additional CSS classes.

MapTileLayer

PropTypeDefaultDescription
namestring'Default'Layer identifier for MapLayersControl.
urlstringOpenStreetMap URLTile URL template.
darkUrlstring—Dark theme tile URL. Auto-switches with useDocyTheme.
attributionstring—Attribution text for light theme.
darkAttributionstring—Attribution text for dark theme.

MapLayers

PropTypeDefaultDescription
defaultTileLayerstring—Initial active tile layer name.
defaultLayerGroupsstring[][]Initially visible layer group names.

MapLayerGroup

PropTypeDefaultDescription
namestring—Layer group identifier.
disabledboolean—Hide from layer controls toggle.

MapMarker

PropTypeDefaultDescription
positionLatLngExpression—Marker coordinates.
iconReactNode<MapPinIcon />Custom icon rendered as DivIcon.
iconAnchor[number, number][12, 12]Icon anchor point.
popupAnchor[number, number]—Popup anchor offset.
tooltipAnchor[number, number]—Tooltip anchor offset.

MapMarkerClusterGroup

PropTypeDefaultDescription
icon(count: number) => ReactNode—Custom cluster badge render function.
polygonOptionsobject—Cluster boundary polygon styling.

MapLayersControl

PropTypeDefaultDescription
positionstring'top-1 right-1'Tailwind position classes.
tileLayersLabelstring'Map Type'Section label for tile layers.
layerGroupsLabelstring'Layers'Section label for layer groups.

MapTooltip

PropTypeDefaultDescription
side'top' | 'right' | 'bottom' | 'left''top'Arrow direction.
sideOffsetnumber15Distance from target element.

MapZoomControl

PropTypeDefaultDescription
positionstring'top-1 left-1'Tailwind position classes.

MapFullscreenControl

PropTypeDefaultDescription
positionstring'top-1 right-1'Tailwind position classes.

MapLocateControl

PropTypeDefaultDescription
watchbooleanfalseContinuously track location.
onLocationFound(event: LocationEvent) => void—Called when location is found.
onLocationError(error: ErrorEvent) => void—Called on location error.
positionstring'right-1 bottom-1'Tailwind position classes.

MapSearchControl

Inherits all props from PlaceAutocomplete. Renders a search input on the map.

MapDrawControl

Container for drawing tool buttons. Provides drawing mode context.

PropTypeDefaultDescription
classNamestring—Additional CSS classes.

useLeaflet

Hook that lazy-loads the Leaflet library and its plugins.

const { L, ready } = useLeaflet();
if (!ready) return <Spinner />;

Returns { L: typeof Leaflet, ready: boolean }.

On this page