sy-tilemap

Tilemap

Compare locations and values using equally sized tiles.

sy-tilemap

Show administrative or logical regions in a normalized layout.

Tile coordinates do not represent actual geographic area or distance. Explain what the layout means.

Base chart tier: Community. Features such as additional renderers and custom branding have separate entitlement requirements.

InputData description
dataAn array of { x, y, value?, name?, label? }.
tileShapeThe tile shape.
colorAxisContinuous values can use an auto color axis.

Complete implementation example

html
<div id="chart-container" style="width: 100%; min-width: 0;"></div>

<script type="module">
  import { defineCustomElement as define0 } from '@syidax/advanced/components/sy-tilemap.js';
  define0();

  const specs = [
    {
      "id": "example-chart",
      "tag": "sy-tilemap",
      "props": {
        "engine": "standard",
        "data": [
          {
            "x": 0,
            "y": 0,
            "name": "Zone 1",
            "label": "1",
            "value": 20
          },
          {
            "x": 1,
            "y": 0,
            "name": "Zone 2",
            "label": "2",
            "value": 33
          },
          {
            "x": 2,
            "y": 0,
            "name": "Zone 3",
            "label": "3",
            "value": 46
          },
          {
            "x": 3,
            "y": 0,
            "name": "Zone 4",
            "label": "4",
            "value": 59
          },
          {
            "x": 4,
            "y": 0,
            "name": "Zone 5",
            "label": "5",
            "value": 72
          },
          {
            "x": 0,
            "y": 1,
            "name": "Zone 6",
            "label": "6",
            "value": 85
          },
          {
            "x": 1,
            "y": 1,
            "name": "Zone 7",
            "label": "7",
            "value": 98
          },
          {
            "x": 2,
            "y": 1,
            "name": "Zone 8",
            "label": "8",
            "value": 31
          },
          {
            "x": 3,
            "y": 1,
            "name": "Zone 9",
            "label": "9",
            "value": 44
          },
          {
            "x": 4,
            "y": 1,
            "name": "Zone 10",
            "label": "10",
            "value": 57
          },
          {
            "x": 0,
            "y": 2,
            "name": "Zone 11",
            "label": "11",
            "value": 70
          },
          {
            "x": 1,
            "y": 2,
            "name": "Zone 12",
            "label": "12",
            "value": 83
          },
          {
            "x": 2,
            "y": 2,
            "name": "Zone 13",
            "label": "13",
            "value": 96
          },
          {
            "x": 3,
            "y": 2,
            "name": "Zone 14",
            "label": "14",
            "value": 29
          },
          {
            "x": 4,
            "y": 2,
            "name": "Zone 15",
            "label": "15",
            "value": 42
          },
          {
            "x": 0,
            "y": 3,
            "name": "Zone 16",
            "label": "16",
            "value": 55
          },
          {
            "x": 1,
            "y": 3,
            "name": "Zone 17",
            "label": "17",
            "value": 68
          },
          {
            "x": 2,
            "y": 3,
            "name": "Zone 18",
            "label": "18",
            "value": 81
          },
          {
            "x": 3,
            "y": 3,
            "name": "Zone 19",
            "label": "19",
            "value": 94
          },
          {
            "x": 4,
            "y": 3,
            "name": "Zone 20",
            "label": "20",
            "value": 27
          }
        ],
        "tileShape": "hexagon",
        "colorAxis": "auto",
        "width": 640,
        "height": 360,
        "brandPosition": "bottom-right",
        "brandLogo": ""
      }
    }
  ];
  const container = document.querySelector('#chart-container');
  const elements = specs.map(({ tag, id, props }) => {
    const element = document.createElement(tag);
    element.id = id;
    Object.assign(element, props);
    element.setAttribute('aria-label', 'tilemap example chart');
    return element;
  });
  container.replaceChildren(...elements);
  const chart = elements.at(-1);
  const onEvent = event => {
    console.log('pointClick', event.detail);
  };
  chart.addEventListener('pointClick', onEvent);
  const observer = new ResizeObserver(([entry]) => {
    const width = Math.max(160, Math.floor(entry.contentRect.width));
    elements.forEach(element => { element.width = width; });
  });
  observer.observe(container);

  // In an SPA, call this function when the view is disposed.
  function disposeChart() {
    observer.disconnect();
    chart.removeEventListener('pointClick', onEvent);
    container.replaceChildren();
  }
</script>

Properties

data

An array of { x, y, value?, name?, label? }.

ItemValue
JavaScript propertydata
HTML attributePass objects, arrays, and callbacks as JavaScript properties
TypeTilemapData
Default[]

width

Chart width in pixels. If the container width changes, update width from a ResizeObserver.

ItemValue
JavaScript propertywidth
HTML attributewidth
Typenumber
Default640

height

Chart height in pixels. Allow space for axes, titles, and the legend.

ItemValue
JavaScript propertyheight
HTML attributeheight
Typenumber
Default420

brandPosition

The corner where the logo is anchored. Community and Pro both support all four corners, using the same position on screen and in image exports.

ItemValue
JavaScript propertybrandPosition
HTML attributebrand-position
Type'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'
Default'bottom-right'
Allowed valuestop-left, top-right, bottom-left, bottom-right

palette

Allowed values: tableau10, tableau20, observable10, paired12, set3_12. Default: 'tableau10'.

ItemValue
JavaScript propertypalette
HTML attributepalette
TypeTilemapPaletteName
Default'tableau10'
Allowed valuestableau10, tableau20, observable10, paired12, set3_12

colors

Pass as a JavaScript property. type: ReadonlyArray<string>.

ItemValue
JavaScript propertycolors
HTML attributePass objects, arrays, and callbacks as JavaScript properties
TypeReadonlyArray<string>
Defaultundefined

undefined means this property was not explicitly set. The effective value may depend on the chart type and other settings.

tileShape

The tile shape.

ItemValue
JavaScript propertytileShape
HTML attributetile-shape
TypeTilemapTileShape
Default'hexagon'
Allowed valuescircle, square, diamond, hexagon

gap

Empty px kept between tiles.

ItemValue
JavaScript propertygap
HTML attributegap
Typenumber
Default2

showLabels

Render each tile's label (falling back to name) inside the tile when it fits.

ItemValue
JavaScript propertyshowLabels
HTML attributeshow-labels
Typeboolean
Defaulttrue

colorAxis

Continuous values can use an auto color axis.

ItemValue
JavaScript propertycolorAxis
HTML attributePass objects, arrays, and callbacks as JavaScript properties
TypeTilemapColorAxisInput
Defaultundefined
Literals in the typeauto

undefined means this property was not explicitly set. The effective value may depend on the chart type and other settings.

colorLegend

Show the colour-axis gradient legend under the map (on while the axis is on).

ItemValue
JavaScript propertycolorLegend
HTML attributecolor-legend
Typeboolean
Defaulttrue

legendPosition

Storybook parity (2026-09-10) — where the colour legend sits: docked on an edge of the map (top / bottom / left / right; the band is taken off the map) or float — an overlay box inside the drawing rectangle anchored by legend-float-align / legend-float-vertical-align. The line chart's legend contract.

ItemValue
JavaScript propertylegendPosition
HTML attributelegend-position
TypeTilemapLegendPosition
Default'bottom'
Allowed valuestop, bottom, left, right, float

legendFloatAlign

legend-position="float": the overlay's horizontal anchor inside the drawing rectangle.

ItemValue
JavaScript propertylegendFloatAlign
HTML attributelegend-float-align
Type'start' | 'center' | 'end'
Default'end'
Allowed valuesstart, center, end

legendFloatVerticalAlign

legend-position="float": the overlay's vertical anchor inside the drawing rectangle.

ItemValue
JavaScript propertylegendFloatVerticalAlign
HTML attributelegend-float-vertical-align
Type'top' | 'middle' | 'bottom'
Default'top'
Allowed valuestop, bottom, middle

legendDraggable

legend-position="float": the floating legend can be dragged inside the chart bounds.

ItemValue
JavaScript propertylegendDraggable
HTML attributelegend-draggable
Typeboolean
Defaultfalse

labelColor

Set as an HTML attribute or JavaScript property. type: string.

ItemValue
JavaScript propertylabelColor
HTML attributelabel-color
Typestring
Default'#ffffff'

chartTitle

The title inside the chart. Explain the data's unit and meaning alongside it.

ItemValue
JavaScript propertychartTitle
HTML attributechart-title
Typestring
Defaultundefined

undefined means this property was not explicitly set. The effective value may depend on the chart type and other settings.

chartSubtitle

The subtitle inside the chart.

ItemValue
JavaScript propertychartSubtitle
HTML attributechart-subtitle
Typestring
Defaultundefined

undefined means this property was not explicitly set. The effective value may depend on the chart type and other settings.

tooltipShow

Whether to display the built-in tooltip.

ItemValue
JavaScript propertytooltipShow
HTML attributetooltip-show
Typeboolean
Defaulttrue

tooltipFormat

Pass as a JavaScript property. type: (tile: TilemapResolvedTile) => string.

ItemValue
JavaScript propertytooltipFormat
HTML attributePass objects, arrays, and callbacks as JavaScript properties
Type(tile: TilemapResolvedTile) => string
Defaultundefined

undefined means this property was not explicitly set. The effective value may depend on the chart type and other settings.

tooltip

Rich tooltip configuration object — the tile-flavoured counterpart of the item .tooltip API (trigger/openMode/connector/draggable/interactive/ format/html/style/side/sizing). When set it wins over the flat tooltip-show / tooltipFormat props. Property-only.

ItemValue
JavaScript propertytooltip
HTML attributePass objects, arrays, and callbacks as JavaScript properties
TypeTilemapTooltipInput
Defaultundefined
Literals in the typeauto, off

undefined means this property was not explicitly set. The effective value may depend on the chart type and other settings.

enableMouseTracking

Set as an HTML attribute or JavaScript property. type: boolean.

ItemValue
JavaScript propertyenableMouseTracking
HTML attributeenable-mouse-tracking
Typeboolean
Defaulttrue

zoom

Viewport zoom — the zoom attribute the cartesian charts carry: a mode ('x' | 'y' | 'xy'), true (x) or an object; off by default. The drawing rectangle (the map between the title band and the colour legend) is the plot — x runs 0 → 1 left to right, y 0 → 1 bottom to top — and the tiles are magnified into the window; tiles outside it leave the rectangle. Property-only (a mode string also works as an attribute).

ItemValue
JavaScript propertyzoom
HTML attributePass objects, arrays, and callbacks as JavaScript properties
TypeCartesianZoomInput
Defaultundefined
Literals in the typeauto, off, true, false, x, y, xy, inside

undefined means this property was not explicitly set. The effective value may depend on the chart type and other settings.

engine

Renderer selection: auto, standard, or pro. Engine selection is separate from permission to use a Pro chart type.

ItemValue
JavaScript propertyengine
HTML attributeengine
TypeTilemapEngineMode
Default'auto'
Allowed valuesauto, standard, pro

unavailable

Allowed values: fallback, error, throw. Default: 'fallback'.

ItemValue
JavaScript propertyunavailable
HTML attributeunavailable
TypeTilemapUnavailableBehaviour
Default'fallback'
Allowed valuesfallback, error, throw

streamSource

A stream source for live data. Check the contract for the specific type.

ItemValue
JavaScript propertystreamSource
HTML attributePass objects, arrays, and callbacks as JavaScript properties
TypeTilemapStreamSource
Defaultundefined

undefined means this property was not explicitly set. The effective value may depend on the chart type and other settings.

streamWindow

The streaming data range to keep visible.

ItemValue
JavaScript propertystreamWindow
HTML attributestream-window
Typenumber
Defaultundefined

undefined means this property was not explicitly set. The effective value may depend on the chart type and other settings.

streamMax

The maximum number of streaming data points to retain.

ItemValue
JavaScript propertystreamMax
HTML attributestream-max
Typenumber
Defaultundefined

undefined means this property was not explicitly set. The effective value may depend on the chart type and other settings.

animated

Whether to animate initial display and data changes.

ItemValue
JavaScript propertyanimated
HTML attributeanimate
Typeboolean
Defaultfalse

animationDuration

Animation duration in milliseconds.

ItemValue
JavaScript propertyanimationDuration
HTML attributeanimation-duration
Typenumber
Default600

animationEasing

Allowed values: linear, ease-out, ease-in, ease-in-out. Default: 'ease-out'.

ItemValue
JavaScript propertyanimationEasing
HTML attributeanimation-easing
TypeTilemapEasing
Default'ease-out'
Allowed valueslinear, ease-out, ease-in, ease-in-out

animationType

Allowed values: initial, update. Default: undefined.

ItemValue
JavaScript propertyanimationType
HTML attributeanimation-type
TypeTilemapAnimationType
Defaultundefined
Allowed valuesinitial, update

undefined means this property was not explicitly set. The effective value may depend on the chart type and other settings.

Events

rendered

Emits rendering results in detail when chart drawing completes.

Event name: rendered. Names are case-sensitive. Read the payload from detail on CustomEvent<TilemapRenderResult & { tier: TilemapEngineTier }>.

javascript
chart.addEventListener('rendered', event => {
  console.log(event.detail); // TilemapRenderResult & { tier: TilemapEngineTier }
});

pointClick

A point selection event. Read the selected data and index from CustomEvent.detail.

Event name: pointClick. Names are case-sensitive. Read the payload from detail on CustomEvent<TilemapPointEventDetail>.

javascript
chart.addEventListener('pointClick', event => {
  console.log(event.detail); // TilemapPointEventDetail
});

pointHover

CustomEvent.detail type: TilemapPointEventDetail | null. Event names are case-sensitive.

Event name: pointHover. Names are case-sensitive. Read the payload from detail on CustomEvent<TilemapPointEventDetail | null>.

javascript
chart.addEventListener('pointHover', event => {
  console.log(event.detail); // TilemapPointEventDetail | null
});

pointContextMenu

CustomEvent.detail type: ChartPointContextMenuEventDetail<TilemapPointEventDetail>. Event names are case-sensitive.

Event name: pointContextMenu. Names are case-sensitive. Read the payload from detail on CustomEvent<ChartPointContextMenuEventDetail<TilemapPointEventDetail>>.

javascript
chart.addEventListener('pointContextMenu', event => {
  console.log(event.detail); // ChartPointContextMenuEventDetail<TilemapPointEventDetail>
});

appended

CustomEvent.detail type: { count: number }. Event names are case-sensitive.

Event name: appended. Names are case-sensitive. Read the payload from detail on CustomEvent<{ count: number }>.

javascript
chart.addEventListener('appended', event => {
  console.log(event.detail); // { count: number }
});

windowSlid

CustomEvent.detail type: { dropped: number }. Event names are case-sensitive.

Event name: windowSlid. Names are case-sensitive. Read the payload from detail on CustomEvent<{ dropped: number }>.

javascript
chart.addEventListener('windowSlid', event => {
  console.log(event.detail); // { dropped: number }
});

chartAnimationStart

CustomEvent.detail type: void. Event names are case-sensitive.

Event name: chartAnimationStart. Names are case-sensitive. Read the payload from detail on CustomEvent<void>.

javascript
chart.addEventListener('chartAnimationStart', event => {
  console.log(event.detail); // void
});

chartAnimationEnd

CustomEvent.detail type: void. Event names are case-sensitive.

Event name: chartAnimationEnd. Names are case-sensitive. Read the payload from detail on CustomEvent<void>.

javascript
chart.addEventListener('chartAnimationEnd', event => {
  console.log(event.detail); // void
});

chartAnimationInterrupted

CustomEvent.detail type: void. Event names are case-sensitive.

Event name: chartAnimationInterrupted. Names are case-sensitive. Read the payload from detail on CustomEvent<void>.

javascript
chart.addEventListener('chartAnimationInterrupted', event => {
  console.log(event.detail); // void
});

tooltipShow

Whether to display the built-in tooltip.

Event name: tooltipShow. Names are case-sensitive. Read the payload from detail on CustomEvent<TilemapTooltipShowEventDetail>.

javascript
chart.addEventListener('tooltipShow', event => {
  console.log(event.detail); // TilemapTooltipShowEventDetail
});

tooltipHide

CustomEvent.detail type: void. Event names are case-sensitive.

Event name: tooltipHide. Names are case-sensitive. Read the payload from detail on CustomEvent<void>.

javascript
chart.addEventListener('tooltipHide', event => {
  console.log(event.detail); // void
});

tooltipAction

CustomEvent.detail type: TilemapTooltipActionEventDetail. Event names are case-sensitive.

Event name: tooltipAction. Names are case-sensitive. Read the payload from detail on CustomEvent<TilemapTooltipActionEventDetail>.

javascript
chart.addEventListener('tooltipAction', event => {
  console.log(event.detail); // TilemapTooltipActionEventDetail
});

zoomChange

Every zoom / pan change (drag, pan, wheel, pinch, keyboard, API, reset).

Event name: zoomChange. Names are case-sensitive. Read the payload from detail on CustomEvent<CartesianZoomChangeEventDetail>.

javascript
chart.addEventListener('zoomChange', event => {
  console.log(event.detail); // CartesianZoomChangeEventDetail
});

Methods

redraw

Redraw the chart using its current data and options. Inspect the rendered result after the returned Promise resolves.

typescript
redraw(): Promise<TilemapRenderResult>

Return type: Promise<TilemapRenderResult>. Call the method after element registration and await its Promise result.

getActiveTier

An asynchronous method. Check the argument and return types below.

typescript
getActiveTier(): Promise<TilemapEngineTier>

Return type: Promise<TilemapEngineTier>. Call the method after element registration and await its Promise result.

addTile

Tilemap-only — append a tile datum (occupied cells update in place).

typescript
addTile(datum: TilemapDatum): Promise<number>
ArgumentsTypeRequired
datumTilemapDatumRequired

Return type: Promise<number>. Call the method after element registration and await its Promise result.

removeTile

Tilemap-only — remove a tile by id, name, index, or {x, y} cell.

typescript
removeTile(idOrCell: string | number | { x: number; y: number }): Promise<boolean>
ArgumentsTypeRequired
idOrCellstring | number | { x: number; y: number }Required

Return type: Promise<boolean>. Call the method after element registration and await its Promise result.

updateTile

Tilemap-only — patch a tile's datum fields.

typescript
updateTile(idOrCell: string | number | { x: number; y: number }, patch: Partial<TilemapDatum>): Promise<boolean>
ArgumentsTypeRequired
idOrCellstring | number | { x: number; y: number }Required
patchPartial<TilemapDatum>Required

Return type: Promise<boolean>. Call the method after element registration and await its Promise result.

setTileValue

Tilemap-only — set a tile's metric value.

typescript
setTileValue(idOrCell: string | number | { x: number; y: number }, value: number): Promise<boolean>
ArgumentsTypeRequired
idOrCellstring | number | { x: number; y: number }Required
valuenumberRequired

Return type: Promise<boolean>. Call the method after element registration and await its Promise result.

appendPoint

Append one value to the stream. Check the argument type and the licensing requirements for streaming.

typescript
appendPoint(datum: TilemapDatum): Promise<void>
ArgumentsTypeRequired
datumTilemapDatumRequired

Return type: Promise<void>. Call the method after element registration and await its Promise result.

appendBatch

Append multiple values to the stream. Check the argument type and the licensing requirements for streaming.

typescript
appendBatch(datums: ReadonlyArray<TilemapDatum>): Promise<void>
ArgumentsTypeRequired
datumsReadonlyArray<TilemapDatum>Required

Return type: Promise<void>. Call the method after element registration and await its Promise result.

shift

Drops the OLDEST tiles (insertion order — a map has no value ranking).

typescript
shift(count?: number): Promise<void>
ArgumentsTypeRequired
countnumberOptional

Return type: Promise<void>. Call the method after element registration and await its Promise result.

replace

Swap the streamed set (replace([]) clears it); the base values never leave. Without chart.streaming the dies upsert into the base like a batch (quietly: no appended, no binChanged, as a ring replace).

typescript
replace(datums: ReadonlyArray<TilemapDatum>): Promise<void>
ArgumentsTypeRequired
datumsReadonlyArray<TilemapDatum>Required

Return type: Promise<void>. Call the method after element registration and await its Promise result.

getStreamSource

The stream session's source (Chart Pro): like the stream methods it waits for a license still being confirmed.

typescript
getStreamSource(): Promise<TilemapStreamSource | undefined>

Return type: Promise<TilemapStreamSource | undefined>. Call the method after element registration and await its Promise result.

setAnimation

An asynchronous method. Check the argument and return types below.

typescript
setAnimation(options: { duration?: number; easing?: TilemapEasing; enabled?: boolean; type?: TilemapAnimationType }): Promise<void>
ArgumentsTypeRequired
options{ duration?: number; easing?: TilemapEasing; enabled?: boolean; type?: TilemapAnimationType }Required

Return type: Promise<void>. Call the method after element registration and await its Promise result.

pauseAnimation

Pause the current animation.

typescript
pauseAnimation(): Promise<void>

Return type: Promise<void>. Call the method after element registration and await its Promise result.

resumeAnimation

Resume a paused animation.

typescript
resumeAnimation(): Promise<void>

Return type: Promise<void>. Call the method after element registration and await its Promise result.

replayAnimation

Replay the initial staggered reveal. No-op when animation is off.

typescript
replayAnimation(): Promise<void>

Return type: Promise<void>. Call the method after element registration and await its Promise result.

hitTestTile

The tile under a host px position (the zoomed view is honoured: the point is taken back to the layout first).

typescript
hitTestTile(cssX: number, cssY: number): Promise<{ index: number; id: string; col: number; row: number; name: string } | null>
ArgumentsTypeRequired
cssXnumberRequired
cssYnumberRequired

Return type: Promise<{ index: number; id: string; col: number; row: number; name: string } | null>. Call the method after element registration and await its Promise result.

showTooltipAtTile

Tilemap-only — programmatic tooltip open on a tile.

typescript
showTooltipAtTile(idOrCell: string | number | { x: number; y: number }): Promise<TilemapPointEventDetail | null>
ArgumentsTypeRequired
idOrCellstring | number | { x: number; y: number }Required

Return type: Promise<TilemapPointEventDetail | null>. Call the method after element registration and await its Promise result.

hideTooltip

Close the currently visible tooltip.

typescript
hideTooltip(): Promise<void>

Return type: Promise<void>. Call the method after element registration and await its Promise result.

zoomTo

Zoom to explicit windows of the drawing (x / y as { min, max } or [min, max] over 0..1; null clears that orientation).

typescript
zoomTo(request: CartesianZoomRequest): Promise<CartesianZoomChangeEventDetail | null>
ArgumentsTypeRequired
requestCartesianZoomRequestRequired

Return type: Promise<CartesianZoomChangeEventDetail | null>. Call the method after element registration and await its Promise result.

zoomBy

Scale the current windows by factor (< 1 zooms in) around anchorFraction (0..1, default centre).

typescript
zoomBy(factor: number, anchorFraction?: number): Promise<CartesianZoomChangeEventDetail | null>
ArgumentsTypeRequired
factornumberRequired
anchorFractionnumberOptional

Return type: Promise<CartesianZoomChangeEventDetail | null>. Call the method after element registration and await its Promise result.

panBy

Slide the zoomed windows by a fraction of the drawing ({ x?, y? }); a no-op at the full extent.

typescript
panBy(delta: { x?: number; y?: number }): Promise<CartesianZoomChangeEventDetail | null>
ArgumentsTypeRequired
delta{ x?: number; y?: number }Required

Return type: Promise<CartesianZoomChangeEventDetail | null>. Call the method after element registration and await its Promise result.

resetZoom

Reset the zoomed or panned range to the original data range.

typescript
resetZoom(): Promise<CartesianZoomChangeEventDetail | null>

Return type: Promise<CartesianZoomChangeEventDetail | null>. Call the method after element registration and await its Promise result.

getZoom

Read the current zoom range. Check the return type's nullability and the range for each axis.

typescript
getZoom(): Promise<CartesianZoomState | null>

Return type: Promise<CartesianZoomState | null>. Call the method after element registration and await its Promise result.

getZoomExtent

The full extent of the drawing (0..1 on both orientations, the id-less slot key).

typescript
getZoomExtent(request?: CartesianZoomExtentRequest): Promise<CartesianZoomExtentDetail | null>
ArgumentsTypeRequired
requestCartesianZoomExtentRequestOptional

Return type: Promise<CartesianZoomExtentDetail | null>. Call the method after element registration and await its Promise result.

getEngineStatus

Requested engine vs what runs, and why (CHART-ADD-08): always Standard (this type has no WebGPU renderer); read without side effects, never consults the license.

typescript
getEngineStatus(): Promise<ChartEngineStatus>

Return type: Promise<ChartEngineStatus>. Call the method after element registration and await its Promise result.