Skip to main content

MapClusterLayer

Map and Layersdata

Clusters dense point data into count bubbles that split apart as you zoom in.

import { MapClusterLayer } from "@elabs-ai/components-maps";
Install
npm install @elabs-ai/components-tokens @elabs-ai/components-ui @elabs-ai/components-maps

Skipping the @source line is the most common first failure: Tailwind does not scan node_modules, so every component renders unstyled. The one-time wiring

Prompt for your coding agent

Paste it into Claude Code, Cursor, Codex or any other coding agent. Text in [brackets] is yours to fill in.

Add the brand-ui MapClusterLayer component (from @elabs-ai/components-maps) to this project.

1. Read https://elabs-ai.com/llms.txt first: it maps every package and the rules. If you can use MCP servers, connect https://elabs-ai.com/mcp and use its search, docs and tokens tools. If not, run the same lookups in the terminal: `npx -y @elabs-ai/components-cli search "<what you need>"` and `npx -y @elabs-ai/components-cli docs <Component>`.
2. Look MapClusterLayer up before writing code: `npx -y @elabs-ai/components-cli docs MapClusterLayer` prints its real props, variants, what it pairs with and what to avoid.
3. If @elabs-ai/components-maps is not installed yet: `pnpm add @elabs-ai/components-tokens @elabs-ai/components-ui @elabs-ai/components-maps` (or `npm install @elabs-ai/components-tokens @elabs-ai/components-ui @elabs-ai/components-maps`). If this is the first brand-ui package in the project, wire it once: import `@elabs-ai/components-tokens/styles.css` plus the `themes/light.css` and `themes/dark.css` stylesheets in the CSS entry, add one Tailwind `@source` line per installed @elabs-ai package (Tailwind does not scan node_modules, so without it everything renders unstyled), and wrap the app root in `ThemeProvider` from `@elabs-ai/components-tokens`.
4. Use it here: [the screen or file, and what it should show]
5. Rules: use only @elabs-ai/components-* components and the semantic tokens — no raw colours, no raw font sizes, no arbitrary Tailwind values. Look up each component's real props with the docs tool before you use it; never guess a prop.
6. Done means: the typecheck passes, `npx -y @elabs-ai/components-cli audit src --strict` reports nothing, and you have opened the app and looked at every screen you touched in the light and the dark theme.

Avoid

  • Hardcoding the cluster step colors — the steps resolve from the status tokens.
  • Clustering a handful of points — plain MapMarkers read better below roughly 50 points.
  • Using it on a plan map — the count is a symbol text-field, and a plan's blank style has no glyph endpoint, so every count renders as nothing. Group the points yourself and draw them with MapGeoJSON.

Works with

Used inside

Pairs with

API

MapClusterLayer

PropTypeDescription
datarequiredstring | GeoJSON.FeatureCollection<GeoJSON.Point, P>GeoJSON FeatureCollection data or a URL to fetch GeoJSON from.
clusterMaxZoomnumberMaximum zoom level to cluster points on (default: 14).
clusterRadiusnumberRadius of each cluster when clustering points, in pixels (default: 50).
clusterColors[string, string, string]Colors for cluster circles: [small, medium, large] based on point count. Defaults to the theme's `--success`/`--warning`/`--destructive` tokens.
clusterThresholds[number, number]Point-count thresholds for the color/size steps: [medium, large] (default: [100, 750]).
pointColorstringColor for unclustered individual points. Defaults to the theme's `--primary` token.
onPointClick( feature: GeoJSON.Feature<GeoJSON.Point, P>, coordinates: [number, number], ) => voidCallback when an unclustered point is clicked.
onClusterClick(clusterId: number, coordinates: [number, number], pointCount: number) => voidCallback when a cluster is clicked. If not provided, zooms into the cluster.

Theming

The tokens each state resolves to. Change the token and every theme follows.

StateToken
steps--success → --warning → --destructive, --background strokes/labels