@asteby/metacore-maps 0.1.7 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -0
- package/dist/{chunk-BZP7NBAA.js → chunk-JRVBX3JG.js} +3 -3
- package/dist/{chunk-BZP7NBAA.js.map → chunk-JRVBX3JG.js.map} +1 -1
- package/dist/{chunk-VH26MQFN.js → chunk-US5QXFDR.js} +3 -3
- package/dist/{chunk-VH26MQFN.js.map → chunk-US5QXFDR.js.map} +1 -1
- package/dist/{chunk-KWMP7YH4.js → chunk-YTB3CQKE.js} +155 -8
- package/dist/chunk-YTB3CQKE.js.map +1 -0
- package/dist/index.d.ts +121 -1
- package/dist/index.js +2 -2
- package/dist/panel-MV53FJTG.js +7 -0
- package/dist/{panel-MGLCA6A7.js.map → panel-MV53FJTG.js.map} +1 -1
- package/dist/panel.js +2 -2
- package/dist/register.js +2 -2
- package/dist/view-KDQBSTCN.js +7 -0
- package/dist/{view-6J5UPM2C.js.map → view-KDQBSTCN.js.map} +1 -1
- package/dist/view.js +2 -2
- package/package.json +6 -6
- package/dist/chunk-KWMP7YH4.js.map +0 -1
- package/dist/panel-MGLCA6A7.js +0 -7
- package/dist/view-6J5UPM2C.js +0 -7
package/README.md
CHANGED
|
@@ -120,3 +120,14 @@ jsdom/happy-dom have no WebGL. In your own tests pass a stub through the loader:
|
|
|
120
120
|
```ts
|
|
121
121
|
configureMaps({ loadMaplibre: async () => myStub, supportsWebGL: () => true })
|
|
122
122
|
```
|
|
123
|
+
|
|
124
|
+
## ChoroplethLayer
|
|
125
|
+
|
|
126
|
+
```tsx
|
|
127
|
+
<MapView points={[]}>
|
|
128
|
+
<ChoroplethLayer loader={() => import('./estados.topo.json')} values={{ JAL: 120, CMX: 340 }} keyProperty="code" labelProperty="name" onRegions={setState} />
|
|
129
|
+
</MapView>
|
|
130
|
+
<ChoroplethList regions={state.regions} label="Ventas por estado" noData="Sin datos" />
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
The geometry (GeoJSON or TopoJSON) comes from the host/region through `loader`, which is called once, when the layer mounts. The SDK ships no shapes. `ChoroplethList` is the accessible equivalent (every region with its value).
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MapView, Polyline } from './chunk-
|
|
1
|
+
import { MapView, Polyline } from './chunk-YTB3CQKE.js';
|
|
2
2
|
import { useMapLabels, MAX_FEATURES } from './chunk-V53ZKCMA.js';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { buildRelationFilterParams } from '@asteby/metacore-runtime-react';
|
|
@@ -37,5 +37,5 @@ function MapPanelRenderer({ panel, record, metadata, data, locale }) {
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
export { MapPanelRenderer };
|
|
40
|
-
//# sourceMappingURL=chunk-
|
|
41
|
-
//# sourceMappingURL=chunk-
|
|
40
|
+
//# sourceMappingURL=chunk-JRVBX3JG.js.map
|
|
41
|
+
//# sourceMappingURL=chunk-JRVBX3JG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/renderers/panel.tsx"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/renderers/panel.tsx"],"names":[],"mappings":"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","file":"chunk-JRVBX3JG.js","sourcesContent":["// `kind: map` detail panel: the record's point plus its ordered route stops.\nimport * as React from 'react'\nimport { buildRelationFilterParams, type PanelRendererProps } from '@asteby/metacore-runtime-react'\nimport { toMapFeatures, toRoutePoints } from '@asteby/metacore-runtime-react/views/map'\nimport { Polyline } from '../layers'\nimport { MapView } from '../map-view'\nimport type { MapPointItem } from '../types'\nimport { MAX_FEATURES, useMapLabels } from './shared'\n\nexport default function MapPanelRenderer({ panel, record, metadata, data, locale }: PanelRendererProps) {\n const labels = useMapLabels()\n const view = panel.map\n const route = view?.route\n const rel = route ? metadata?.relations?.find((r) => r.name === route.relation) : undefined\n const [stops, setStops] = React.useState<Array<{ lat: number; lng: number }>>([])\n const recordId = record.id\n\n React.useEffect(() => {\n if (!route || !rel || recordId === undefined || recordId === null) return\n let cancelled = false\n data\n .list(rel.through, { ...buildRelationFilterParams(rel.foreign_key, String(recordId), rel.scope), per_page: MAX_FEATURES, sortBy: route.order_by, order: 'asc' })\n .then((res) => !cancelled && setStops(toRoutePoints(res.rows, route)))\n .catch(() => undefined)\n return () => {\n cancelled = true\n }\n }, [data, route, rel, recordId])\n\n const points = React.useMemo<MapPointItem[]>(() => {\n if (!view) return []\n const stopItems = stops.map((s, i) => ({ key: `stop-${i}`, ...s, label: `${labels.point} ${i + 1}`, glyph: String(i + 1) }))\n const own = toMapFeatures([record], { ...view, popup: view.popup ?? [] }).map((f) => ({\n key: f.key,\n lat: f.lat,\n lng: f.lng,\n label: f.popup[0]?.value || labels.point,\n details: f.popup.slice(1).filter((p) => p.value).map((p) => ({ label: p.field, value: p.value })),\n }))\n return [...stopItems, ...own]\n }, [view, stops, record, labels.point])\n\n if (!view) return null\n return (\n <MapView points={points} height={260} labels={labels} locale={locale} cluster={false}>\n {stops.length > 1 ? <Polyline path={stops} /> : null}\n </MapView>\n )\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MapView, Geofence } from './chunk-
|
|
1
|
+
import { MapView, Geofence } from './chunk-YTB3CQKE.js';
|
|
2
2
|
import { useMapLabels, MAX_FEATURES, statusMaps, toZones } from './chunk-V53ZKCMA.js';
|
|
3
3
|
import { colorFor } from './chunk-ZGR7H4XP.js';
|
|
4
4
|
import * as React from 'react';
|
|
@@ -91,5 +91,5 @@ function MapViewRenderer({ model, view, metadata, data, onOpenRecord, locale, cl
|
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
export { MapViewRenderer };
|
|
94
|
-
//# sourceMappingURL=chunk-
|
|
95
|
-
//# sourceMappingURL=chunk-
|
|
94
|
+
//# sourceMappingURL=chunk-US5QXFDR.js.map
|
|
95
|
+
//# sourceMappingURL=chunk-US5QXFDR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/renderers/view.tsx"],"names":[],"mappings":"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","file":"chunk-VH26MQFN.js","sourcesContent":["// `view_type: map` renderer (registered by `registerMapRenderers`). It reads\n// the manifest through the same pure helpers as the runtime's list fallback\n// (`@asteby/metacore-runtime-react/views/map`), so both interpret `point`,\n// `geometry`, `color_by` and `popup` identically — this one draws them.\nimport * as React from 'react'\nimport type { ViewRendererProps } from '@asteby/metacore-runtime-react'\nimport { toMapFeatures } from '@asteby/metacore-runtime-react/views/map'\nimport { Geofence } from '../layers'\nimport { MapView } from '../map-view'\nimport { colorFor } from '../palette'\nimport type { MapPointItem, ZoneItem } from '../types'\nimport { MAX_FEATURES, statusMaps, toZones, useMapLabels } from './shared'\n\ntype Row = Record<string, unknown>\n\nexport default function MapViewRenderer({ model, view, metadata, data, onOpenRecord, locale, className }: ViewRendererProps<'map'>) {\n const labels = useMapLabels()\n const [rows, setRows] = React.useState<Row[] | null>(null)\n const [layerRows, setLayerRows] = React.useState<Array<{ kind: string; rows: Row[]; index: number }>>([])\n const [error, setError] = React.useState(false)\n const [selected, setSelected] = React.useState<MapPointItem | null>(null)\n const layers = view.layers\n const layersSig = JSON.stringify(layers ?? [])\n\n React.useEffect(() => {\n let cancelled = false\n setError(false)\n Promise.all([\n data.list(model, { per_page: MAX_FEATURES }),\n ...(layers ?? []).map((l) => data.list(l.model, { per_page: MAX_FEATURES }).then((r) => ({ kind: l.kind, rows: r.rows }), () => ({ kind: l.kind, rows: [] as Row[] }))),\n ]).then(\n ([main, ...extra]) => {\n if (cancelled) return\n setRows((main as { rows: Row[] }).rows)\n setLayerRows((extra as Array<{ kind: string; rows: Row[] }>).map((e, index) => ({ ...e, index })))\n },\n () => !cancelled && setError(true),\n )\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [data, model, layersSig])\n\n const { colors, names } = React.useMemo(() => statusMaps(metadata, view.color_by), [metadata, view.color_by])\n\n const { points, byKey } = React.useMemo(() => {\n const map = new Map<string, Row>()\n const items: MapPointItem[] = []\n for (const f of toMapFeatures(rows ?? [], view)) {\n map.set(f.key, f.row)\n const [first, ...rest] = f.popup\n items.push({\n key: f.key,\n lat: f.lat,\n lng: f.lng,\n label: first?.value || f.key,\n status: f.color,\n statusLabel: f.color ? names[f.color] : undefined,\n details: rest.filter((p) => p.value).map((p) => ({ label: metadata?.columns?.find((c) => c.key === p.field)?.label ?? p.field, value: p.value })),\n })\n }\n // Extra layers of kind \"points\": other models drawn in their own hue.\n ;(layers ?? []).forEach((l, i) => {\n if (l.kind !== 'points') return\n const feats = toMapFeatures(layerRows.find((x) => x.index === i)?.rows ?? [], { point: l.point, geometry: l.geometry, popup: l.label ? [l.label] : [] })\n for (const f of feats) {\n items.push({ key: `${i}:${f.key}`, lat: f.lat, lng: f.lng, label: f.popup[0]?.value || l.model, color: colorFor(`layer:${l.model}`), status: l.model })\n }\n })\n return { points: items, byKey: map }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rows, layerRows, view, names, metadata])\n\n const zones = React.useMemo<ZoneItem[]>(\n () =>\n (layers ?? []).flatMap((l, i) =>\n l.kind === 'zones' && l.geometry ? toZones(layerRows.find((x) => x.index === i)?.rows ?? [], l.geometry, l.label) : [],\n ),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [layerRows, layersSig],\n )\n\n if (error) {\n return (\n <p role=\"alert\" style={{ color: 'var(--destructive, #b91c1c)', fontSize: 14 }}>\n {labels.unavailable}\n </p>\n )\n }\n if (!rows) return <div aria-busy=\"true\" style={{ height: 360 }} role=\"status\" aria-label={labels.loading} />\n const row = selected ? byKey.get(selected.key) : undefined\n return (\n <div className={className} data-testid=\"maps-view-renderer\">\n <MapView\n points={points}\n cluster={view.cluster}\n colors={colors}\n fit={view.fit !== 'org_default'}\n height=\"min(70vh, 560px)\"\n labels={labels}\n locale={locale}\n selectedKey={selected?.key ?? null}\n onSelect={setSelected}\n listExtra={zones.length ? <ul aria-label={labels.zone}>{zones.map((z) => <li key={z.key}>{z.label || z.key}</li>)}</ul> : undefined}\n >\n {zones.length ? <Geofence zones={zones} fit={view.fit !== 'org_default' && points.length === 0} /> : null}\n </MapView>\n {row && onOpenRecord ? (\n <p style={{ marginTop: 8 }}>\n <button type=\"button\" onClick={() => onOpenRecord(row)}>\n {selected?.label}\n </button>\n </p>\n ) : null}\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/renderers/view.tsx"],"names":[],"mappings":";;;;;;;AAee,SAAR,eAAA,CAAiC,EAAE,KAAA,EAAO,IAAA,EAAM,UAAU,IAAA,EAAM,YAAA,EAAc,MAAA,EAAQ,SAAA,EAAU,EAA6B;AAChI,EAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAU,eAAuB,IAAI,CAAA;AACzD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAU,KAAA,CAAA,QAAA,CAA8D,EAAE,CAAA;AACxG,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,eAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAU,eAA8B,IAAI,CAAA;AACxE,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,MAAA,IAAU,EAAE,CAAA;AAE7C,EAAM,gBAAU,MAAM;AAClB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,QAAA,CAAS,KAAK,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,MACR,KAAK,IAAA,CAAK,KAAA,EAAO,EAAE,QAAA,EAAU,cAAc,CAAA;AAAA,MAC3C,IAAI,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,OAAO,EAAE,QAAA,EAAU,YAAA,EAAc,EAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,MAAM,CAAA,CAAE,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,MAAK,CAAA,EAAI,OAAO,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,IAAA,EAAM,EAAC,GAAa,CAAC;AAAA,KACzK,CAAA,CAAE,IAAA;AAAA,MACC,CAAC,CAAC,IAAA,EAAS,GAAA,KAAK,CAAA,KAAM;AAClB,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,OAAA,CAAS,KAAyB,IAAI,CAAA;AACtC,QAAA,YAAA,CAAc,KAAA,CAA+C,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,MAAW,EAAE,GAAG,CAAA,EAAG,KAAA,EAAM,CAAE,CAAC,CAAA;AAAA,MACrG,CAAA;AAAA,MACA,MAAM,CAAC,SAAA,IAAa,QAAA,CAAS,IAAI;AAAA,KACrC;AACA,IAAA,OAAO,MAAM;AACT,MAAA,SAAA,GAAY,IAAA;AAAA,IAChB,CAAA;AAAA,EAEJ,CAAA,EAAG,CAAC,IAAA,EAAM,KAAA,EAAO,SAAS,CAAC,CAAA;AAE3B,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAU,cAAQ,MAAM,UAAA,CAAW,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAA,EAAG,CAAC,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAC,CAAA;AAE5G,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAU,cAAQ,MAAM;AAC1C,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAiB;AACjC,IAAA,MAAM,QAAwB,EAAC;AAC/B,IAAA,KAAA,MAAW,KAAK,aAAA,CAAc,IAAA,IAAQ,EAAC,EAAG,IAAI,CAAA,EAAG;AAC7C,MAAA,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,GAAG,CAAA;AACpB,MAAA,MAAM,CAAC,KAAA,EAAO,GAAG,IAAI,IAAI,CAAA,CAAE,KAAA;AAC3B,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACP,KAAK,CAAA,CAAE,GAAA;AAAA,QACP,KAAK,CAAA,CAAE,GAAA;AAAA,QACP,KAAK,CAAA,CAAE,GAAA;AAAA,QACP,KAAA,EAAO,KAAA,EAAO,KAAA,IAAS,CAAA,CAAE,GAAA;AAAA,QACzB,QAAQ,CAAA,CAAE,KAAA;AAAA,QACV,aAAa,CAAA,CAAE,KAAA,GAAQ,KAAA,CAAM,CAAA,CAAE,KAAK,CAAA,GAAI,MAAA;AAAA,QACxC,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,CAAA,CAAE,KAAK,CAAA,EAAG,KAAA,IAAS,CAAA,CAAE,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,OAAM,CAAE;AAAA,OACnJ,CAAA;AAAA,IACL;AAEC,IAAA,CAAC,UAAU,EAAC,EAAG,OAAA,CAAQ,CAAC,GAAG,CAAA,KAAM;AAC9B,MAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AACzB,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,CAAC,CAAA,EAAG,IAAA,IAAQ,EAAC,EAAG,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,QAAA,EAAU,CAAA,CAAE,QAAA,EAAU,KAAA,EAAO,CAAA,CAAE,KAAA,GAAQ,CAAC,CAAA,CAAE,KAAK,CAAA,GAAI,IAAI,CAAA;AACvJ,MAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACnB,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,GAAG,CAAA,CAAA,EAAI,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,GAAA,EAAK,EAAE,GAAA,EAAK,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,IAAS,CAAA,CAAE,OAAO,KAAA,EAAO,QAAA,CAAS,CAAA,MAAA,EAAS,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA,EAAG,MAAA,EAAQ,CAAA,CAAE,OAAO,CAAA;AAAA,MAC1J;AAAA,IACJ,CAAC,CAAA;AACD,IAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,GAAA,EAAI;AAAA,EAEvC,GAAG,CAAC,IAAA,EAAM,WAAW,IAAA,EAAM,KAAA,EAAO,QAAQ,CAAC,CAAA;AAE3C,EAAA,MAAM,KAAA,GAAc,KAAA,CAAA,OAAA;AAAA,IAChB,MAAA,CACK,MAAA,IAAU,EAAC,EAAG,OAAA;AAAA,MAAQ,CAAC,CAAA,EAAG,CAAA,KACvB,CAAA,CAAE,IAAA,KAAS,WAAW,CAAA,CAAE,QAAA,GAAW,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,CAAC,CAAA,EAAG,IAAA,IAAQ,EAAC,EAAG,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,KAAK,CAAA,GAAI;AAAC,KACzH;AAAA;AAAA,IAEJ,CAAC,WAAW,SAAS;AAAA,GACzB;AAEA,EAAA,IAAI,KAAA,EAAO;AACP,IAAA,uBACI,GAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAK,OAAA,EAAQ,KAAA,EAAO,EAAE,KAAA,EAAO,6BAAA,EAA+B,QAAA,EAAU,EAAA,EAAG,EACvE,QAAA,EAAA,MAAA,CAAO,WAAA,EACZ,CAAA;AAAA,EAER;AACA,EAAA,IAAI,CAAC,IAAA,EAAM,uBAAO,GAAA,CAAC,KAAA,EAAA,EAAI,aAAU,MAAA,EAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAI,EAAG,IAAA,EAAK,QAAA,EAAS,YAAA,EAAY,OAAO,OAAA,EAAS,CAAA;AAC1G,EAAA,MAAM,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,GAAI,MAAA;AACjD,EAAA,uBACI,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,aAAA,EAAY,oBAAA,EACnC,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACG,MAAA;AAAA,QACA,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,MAAA;AAAA,QACA,GAAA,EAAK,KAAK,GAAA,KAAQ,aAAA;AAAA,QAClB,MAAA,EAAO,kBAAA;AAAA,QACP,MAAA;AAAA,QACA,MAAA;AAAA,QACA,WAAA,EAAa,UAAU,GAAA,IAAO,IAAA;AAAA,QAC9B,QAAA,EAAU,WAAA;AAAA,QACV,SAAA,EAAW,MAAM,MAAA,mBAAS,GAAA,CAAC,QAAG,YAAA,EAAY,MAAA,CAAO,IAAA,EAAO,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,sBAAM,GAAA,CAAC,IAAA,EAAA,EAAgB,YAAE,KAAA,IAAS,CAAA,CAAE,OAArB,CAAA,CAAE,GAAuB,CAAK,CAAA,EAAE,CAAA,GAAQ,MAAA;AAAA,QAEzH,QAAA,EAAA,KAAA,CAAM,MAAA,mBAAS,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAc,GAAA,EAAK,IAAA,CAAK,GAAA,KAAQ,aAAA,IAAiB,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,CAAA,GAAK;AAAA;AAAA,KACzG;AAAA,IACC,GAAA,IAAO,+BACJ,GAAA,CAAC,GAAA,EAAA,EAAE,OAAO,EAAE,SAAA,EAAW,GAAE,EACrB,QAAA,kBAAA,GAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,SAAS,MAAM,YAAA,CAAa,GAAG,CAAA,EAChD,QAAA,EAAA,QAAA,EAAU,KAAA,EACf,CAAA,EACJ,CAAA,GACA;AAAA,GAAA,EACR,CAAA;AAER","file":"chunk-US5QXFDR.js","sourcesContent":["// `view_type: map` renderer (registered by `registerMapRenderers`). It reads\n// the manifest through the same pure helpers as the runtime's list fallback\n// (`@asteby/metacore-runtime-react/views/map`), so both interpret `point`,\n// `geometry`, `color_by` and `popup` identically — this one draws them.\nimport * as React from 'react'\nimport type { ViewRendererProps } from '@asteby/metacore-runtime-react'\nimport { toMapFeatures } from '@asteby/metacore-runtime-react/views/map'\nimport { Geofence } from '../layers'\nimport { MapView } from '../map-view'\nimport { colorFor } from '../palette'\nimport type { MapPointItem, ZoneItem } from '../types'\nimport { MAX_FEATURES, statusMaps, toZones, useMapLabels } from './shared'\n\ntype Row = Record<string, unknown>\n\nexport default function MapViewRenderer({ model, view, metadata, data, onOpenRecord, locale, className }: ViewRendererProps<'map'>) {\n const labels = useMapLabels()\n const [rows, setRows] = React.useState<Row[] | null>(null)\n const [layerRows, setLayerRows] = React.useState<Array<{ kind: string; rows: Row[]; index: number }>>([])\n const [error, setError] = React.useState(false)\n const [selected, setSelected] = React.useState<MapPointItem | null>(null)\n const layers = view.layers\n const layersSig = JSON.stringify(layers ?? [])\n\n React.useEffect(() => {\n let cancelled = false\n setError(false)\n Promise.all([\n data.list(model, { per_page: MAX_FEATURES }),\n ...(layers ?? []).map((l) => data.list(l.model, { per_page: MAX_FEATURES }).then((r) => ({ kind: l.kind, rows: r.rows }), () => ({ kind: l.kind, rows: [] as Row[] }))),\n ]).then(\n ([main, ...extra]) => {\n if (cancelled) return\n setRows((main as { rows: Row[] }).rows)\n setLayerRows((extra as Array<{ kind: string; rows: Row[] }>).map((e, index) => ({ ...e, index })))\n },\n () => !cancelled && setError(true),\n )\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [data, model, layersSig])\n\n const { colors, names } = React.useMemo(() => statusMaps(metadata, view.color_by), [metadata, view.color_by])\n\n const { points, byKey } = React.useMemo(() => {\n const map = new Map<string, Row>()\n const items: MapPointItem[] = []\n for (const f of toMapFeatures(rows ?? [], view)) {\n map.set(f.key, f.row)\n const [first, ...rest] = f.popup\n items.push({\n key: f.key,\n lat: f.lat,\n lng: f.lng,\n label: first?.value || f.key,\n status: f.color,\n statusLabel: f.color ? names[f.color] : undefined,\n details: rest.filter((p) => p.value).map((p) => ({ label: metadata?.columns?.find((c) => c.key === p.field)?.label ?? p.field, value: p.value })),\n })\n }\n // Extra layers of kind \"points\": other models drawn in their own hue.\n ;(layers ?? []).forEach((l, i) => {\n if (l.kind !== 'points') return\n const feats = toMapFeatures(layerRows.find((x) => x.index === i)?.rows ?? [], { point: l.point, geometry: l.geometry, popup: l.label ? [l.label] : [] })\n for (const f of feats) {\n items.push({ key: `${i}:${f.key}`, lat: f.lat, lng: f.lng, label: f.popup[0]?.value || l.model, color: colorFor(`layer:${l.model}`), status: l.model })\n }\n })\n return { points: items, byKey: map }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rows, layerRows, view, names, metadata])\n\n const zones = React.useMemo<ZoneItem[]>(\n () =>\n (layers ?? []).flatMap((l, i) =>\n l.kind === 'zones' && l.geometry ? toZones(layerRows.find((x) => x.index === i)?.rows ?? [], l.geometry, l.label) : [],\n ),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [layerRows, layersSig],\n )\n\n if (error) {\n return (\n <p role=\"alert\" style={{ color: 'var(--destructive, #b91c1c)', fontSize: 14 }}>\n {labels.unavailable}\n </p>\n )\n }\n if (!rows) return <div aria-busy=\"true\" style={{ height: 360 }} role=\"status\" aria-label={labels.loading} />\n const row = selected ? byKey.get(selected.key) : undefined\n return (\n <div className={className} data-testid=\"maps-view-renderer\">\n <MapView\n points={points}\n cluster={view.cluster}\n colors={colors}\n fit={view.fit !== 'org_default'}\n height=\"min(70vh, 560px)\"\n labels={labels}\n locale={locale}\n selectedKey={selected?.key ?? null}\n onSelect={setSelected}\n listExtra={zones.length ? <ul aria-label={labels.zone}>{zones.map((z) => <li key={z.key}>{z.label || z.key}</li>)}</ul> : undefined}\n >\n {zones.length ? <Geofence zones={zones} fit={view.fit !== 'org_default' && points.length === 0} /> : null}\n </MapView>\n {row && onOpenRecord ? (\n <p style={{ marginTop: 8 }}>\n <button type=\"button\" onClick={() => onOpenRecord(row)}>\n {selected?.label}\n </button>\n </p>\n ) : null}\n </div>\n )\n}\n"]}
|
|
@@ -59,14 +59,14 @@ function circlePolygon(center, radiusM, steps = 64) {
|
|
|
59
59
|
const lat = center.lat * Math.PI / 180;
|
|
60
60
|
const lng = center.lng * Math.PI / 180;
|
|
61
61
|
const d = radiusM / EARTH_M;
|
|
62
|
-
const
|
|
62
|
+
const ring2 = [];
|
|
63
63
|
for (let i = 0; i <= steps; i++) {
|
|
64
64
|
const brg = 2 * Math.PI * (i % steps) / steps;
|
|
65
65
|
const lat2 = Math.asin(Math.sin(lat) * Math.cos(d) + Math.cos(lat) * Math.sin(d) * Math.cos(brg));
|
|
66
66
|
const lng2 = lng + Math.atan2(Math.sin(brg) * Math.sin(d) * Math.cos(lat), Math.cos(d) - Math.sin(lat) * Math.sin(lat2));
|
|
67
|
-
|
|
67
|
+
ring2.push([(lng2 * 180 / Math.PI + 540) % 360 - 180, lat2 * 180 / Math.PI]);
|
|
68
68
|
}
|
|
69
|
-
return [
|
|
69
|
+
return [ring2];
|
|
70
70
|
}
|
|
71
71
|
function zonesToGeoJSON(zones) {
|
|
72
72
|
const features = [];
|
|
@@ -84,12 +84,97 @@ function zonesToGeoJSON(zones) {
|
|
|
84
84
|
function zonePoints(zones) {
|
|
85
85
|
const out = [];
|
|
86
86
|
for (const f of zonesToGeoJSON(zones).features) {
|
|
87
|
-
for (const
|
|
88
|
-
for (const c of
|
|
87
|
+
for (const ring2 of f.geometry.coordinates) {
|
|
88
|
+
for (const c of ring2) out.push({ lng: c[0], lat: c[1] });
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
return out;
|
|
92
92
|
}
|
|
93
|
+
|
|
94
|
+
// src/choropleth.ts
|
|
95
|
+
var NO_DATA_COLOR = "#D1D5DB";
|
|
96
|
+
function decodeArcs(topo) {
|
|
97
|
+
const t = topo.transform;
|
|
98
|
+
return topo.arcs.map((arc) => {
|
|
99
|
+
let x = 0;
|
|
100
|
+
let y = 0;
|
|
101
|
+
return arc.map(([dx, dy]) => {
|
|
102
|
+
if (!t) return [dx, dy];
|
|
103
|
+
x += dx;
|
|
104
|
+
y += dy;
|
|
105
|
+
return [x * t.scale[0] + t.translate[0], y * t.scale[1] + t.translate[1]];
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function ring(arcs, idx) {
|
|
110
|
+
const out = [];
|
|
111
|
+
for (const i of idx) {
|
|
112
|
+
const pts = i < 0 ? [...arcs[~i] ?? []].reverse() : arcs[i] ?? [];
|
|
113
|
+
out.push(...out.length ? pts.slice(1) : pts);
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
function topoGeometry(g, arcs) {
|
|
118
|
+
if (g.type === "Polygon") return { type: "Polygon", coordinates: g.arcs.map((r) => ring(arcs, r)) };
|
|
119
|
+
if (g.type === "MultiPolygon") return { type: "MultiPolygon", coordinates: g.arcs.map((p) => p.map((r) => ring(arcs, r))) };
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
function toRegionCollection(input, object) {
|
|
123
|
+
const g = "default" in input && input.default ? input.default : input;
|
|
124
|
+
if (g.type === "FeatureCollection") return g;
|
|
125
|
+
if (g.type !== "Topology") throw new Error("@asteby/metacore-maps: the choropleth loader must return GeoJSON or TopoJSON");
|
|
126
|
+
const obj = g.objects[object ?? Object.keys(g.objects)[0] ?? ""];
|
|
127
|
+
if (!obj) throw new Error(`@asteby/metacore-maps: TopoJSON object "${object ?? ""}" not found`);
|
|
128
|
+
const arcs = decodeArcs(g);
|
|
129
|
+
const geoms = obj.type === "GeometryCollection" ? obj.geometries ?? [] : [obj];
|
|
130
|
+
return {
|
|
131
|
+
type: "FeatureCollection",
|
|
132
|
+
features: geoms.map((x) => ({ type: "Feature", id: x.id, properties: x.properties ?? {}, geometry: topoGeometry(x, arcs) }))
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function hexRgb(c) {
|
|
136
|
+
const m = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(c);
|
|
137
|
+
if (!m) return null;
|
|
138
|
+
const h = m[1].length === 3 ? m[1].replace(/./g, (d) => d + d) : m[1];
|
|
139
|
+
return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4), 16)];
|
|
140
|
+
}
|
|
141
|
+
function sequentialRamp(base, n) {
|
|
142
|
+
const rgb = hexRgb(safeColor(base) ?? "") ?? hexRgb(DEFAULT_COLOR);
|
|
143
|
+
return Array.from({ length: n }, (_, i) => {
|
|
144
|
+
const t = n === 1 ? 1 : 0.15 + 0.85 * i / (n - 1);
|
|
145
|
+
return "#" + rgb.map((v) => Math.round(255 + (v - 255) * t).toString(16).padStart(2, "0")).join("");
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
function regionKey(f, keyProperty) {
|
|
149
|
+
const v = f.properties?.[keyProperty] ?? f.id;
|
|
150
|
+
return v == null || v === "" ? void 0 : String(v);
|
|
151
|
+
}
|
|
152
|
+
function buildChoropleth(geo, values, o = {}) {
|
|
153
|
+
const keyProperty = o.keyProperty ?? "key";
|
|
154
|
+
const labelProperty = o.labelProperty ?? "name";
|
|
155
|
+
const n = Math.max(2, Math.min(9, Math.floor(o.steps ?? 5)));
|
|
156
|
+
const nums = Object.values(values).filter((v) => Number.isFinite(v));
|
|
157
|
+
const min = nums.length ? Math.min(...nums) : 0;
|
|
158
|
+
const max = nums.length ? Math.max(...nums) : 0;
|
|
159
|
+
const ramp = sequentialRamp(o.color, n);
|
|
160
|
+
const width = (max - min) / n;
|
|
161
|
+
const stepOf = (v) => width === 0 ? n - 1 : Math.min(n - 1, Math.floor((v - min) / width));
|
|
162
|
+
const steps = ramp.map((color, i) => ({ from: min + width * i, to: i === n - 1 ? max : min + width * (i + 1), color }));
|
|
163
|
+
const regions = [];
|
|
164
|
+
const features = [];
|
|
165
|
+
for (const f of geo.features) {
|
|
166
|
+
const key = regionKey(f, keyProperty);
|
|
167
|
+
if (!key || !f.geometry) continue;
|
|
168
|
+
const raw = values[key];
|
|
169
|
+
const value = typeof raw === "number" && Number.isFinite(raw) ? raw : void 0;
|
|
170
|
+
const step = value === void 0 ? -1 : stepOf(value);
|
|
171
|
+
const color = step < 0 ? NO_DATA_COLOR : ramp[step];
|
|
172
|
+
const label = String(f.properties?.[labelProperty] ?? key);
|
|
173
|
+
regions.push({ key, label, value, color, step });
|
|
174
|
+
features.push({ ...f, properties: { ...f.properties, key, color } });
|
|
175
|
+
}
|
|
176
|
+
return { regions, steps, collection: { type: "FeatureCollection", features } };
|
|
177
|
+
}
|
|
93
178
|
var CLUSTER_THRESHOLD = 150;
|
|
94
179
|
function useFitBounds(points, enabled = true, maxZoom = 15) {
|
|
95
180
|
const { map, reducedMotion } = useMap();
|
|
@@ -306,6 +391,68 @@ function Geofence({ zones, fit, opacity = 0.18, onSelect, id = "mcm-zones" }) {
|
|
|
306
391
|
useFitBounds(React2.useMemo(() => fit ? zonePoints(zones) : [], [fit, zones]), !!fit);
|
|
307
392
|
return null;
|
|
308
393
|
}
|
|
394
|
+
function useChoropleth({ loader, values, keyProperty, labelProperty, object, steps, color }) {
|
|
395
|
+
const [geo, setGeo] = React2.useState(null);
|
|
396
|
+
const [failed, setFailed] = React2.useState(false);
|
|
397
|
+
const loaderRef = React2.useRef(loader);
|
|
398
|
+
loaderRef.current = loader;
|
|
399
|
+
React2.useEffect(() => {
|
|
400
|
+
let alive = true;
|
|
401
|
+
loaderRef.current().then((g) => alive && setGeo(toRegionCollection(g, object))).catch(() => alive && setFailed(true));
|
|
402
|
+
return () => {
|
|
403
|
+
alive = false;
|
|
404
|
+
};
|
|
405
|
+
}, [object]);
|
|
406
|
+
return React2.useMemo(() => {
|
|
407
|
+
if (!geo) return { status: failed ? "error" : "loading", regions: [], steps: [], collection: null };
|
|
408
|
+
return { status: "ready", ...buildChoropleth(geo, values, { keyProperty, labelProperty, steps, color }) };
|
|
409
|
+
}, [geo, failed, values, keyProperty, labelProperty, steps, color]);
|
|
410
|
+
}
|
|
411
|
+
function ChoroplethLayer({ opacity = 0.75, onRegions, onSelect, id = "mcm-choropleth", ...opts }) {
|
|
412
|
+
const { map, ml, styleVersion } = useMap();
|
|
413
|
+
const state = useChoropleth(opts);
|
|
414
|
+
const latest = React2.useRef({ state, onSelect, onRegions });
|
|
415
|
+
latest.current = { state, onSelect, onRegions };
|
|
416
|
+
React2.useEffect(() => {
|
|
417
|
+
latest.current.onRegions?.(state);
|
|
418
|
+
}, [state]);
|
|
419
|
+
const data = state.collection;
|
|
420
|
+
React2.useEffect(() => {
|
|
421
|
+
if (!data) return;
|
|
422
|
+
map.addSource(id, { type: "geojson", data: latest.current.state.collection });
|
|
423
|
+
map.addLayer({ id: `${id}-fill`, type: "fill", source: id, paint: { "fill-color": ["get", "color"], "fill-opacity": opacity } });
|
|
424
|
+
map.addLayer({ id: `${id}-line`, type: "line", source: id, paint: { "line-color": "#FFFFFF", "line-width": 1 } });
|
|
425
|
+
const onClick = (e) => {
|
|
426
|
+
const key = e.features?.[0]?.properties?.key;
|
|
427
|
+
const r = latest.current.state.regions.find((x) => x.key === key);
|
|
428
|
+
if (!r) return;
|
|
429
|
+
new ml.Popup().setLngLat(e.lngLat).setDOMContent(popupNode(r.value === void 0 ? r.label : `${r.label}: ${r.value}`)).addTo(map);
|
|
430
|
+
latest.current.onSelect?.(r);
|
|
431
|
+
};
|
|
432
|
+
map.on("click", `${id}-fill`, onClick);
|
|
433
|
+
return () => {
|
|
434
|
+
map.off("click", `${id}-fill`, onClick);
|
|
435
|
+
removeLayers(map, [`${id}-fill`, `${id}-line`], id);
|
|
436
|
+
};
|
|
437
|
+
}, [map, ml, id, opacity, styleVersion, !!data]);
|
|
438
|
+
React2.useEffect(() => {
|
|
439
|
+
if (data) map.getSource(id)?.setData(data);
|
|
440
|
+
}, [map, id, data, styleVersion]);
|
|
441
|
+
return null;
|
|
442
|
+
}
|
|
443
|
+
function ChoroplethList({ regions, label, noData, formatValue = String, sortByValue, id }) {
|
|
444
|
+
const rows = sortByValue ? [...regions].sort((a, b) => (b.value ?? -Infinity) - (a.value ?? -Infinity)) : regions;
|
|
445
|
+
return /* @__PURE__ */ jsxs("table", { id, "data-testid": "choropleth-list", style: { borderCollapse: "collapse", width: "100%" }, children: [
|
|
446
|
+
/* @__PURE__ */ jsx("caption", { style: { textAlign: "left", fontWeight: 600, padding: "4px 0" }, children: label }),
|
|
447
|
+
/* @__PURE__ */ jsx("tbody", { children: rows.map((r) => /* @__PURE__ */ jsxs("tr", { style: { borderBottom: "1px solid rgba(128,128,128,.25)" }, children: [
|
|
448
|
+
/* @__PURE__ */ jsxs("th", { scope: "row", style: { textAlign: "left", fontWeight: 400, padding: "6px 0" }, children: [
|
|
449
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": true, style: { display: "inline-block", width: 10, height: 10, marginRight: 8, background: r.color, border: "1px solid rgba(128,128,128,.5)" } }),
|
|
450
|
+
r.label
|
|
451
|
+
] }),
|
|
452
|
+
/* @__PURE__ */ jsx("td", { style: { textAlign: "right", fontVariantNumeric: "tabular-nums" }, children: r.value === void 0 ? noData : formatValue(r.value) })
|
|
453
|
+
] }, r.key)) })
|
|
454
|
+
] });
|
|
455
|
+
}
|
|
309
456
|
function MapList({ items, labels, selectedKey, origin, locale, onSelect, id }) {
|
|
310
457
|
if (items.length === 0) {
|
|
311
458
|
return /* @__PURE__ */ jsx("p", { id, role: "status", "data-testid": "map-empty", style: { padding: "16px 0", textAlign: "center", opacity: 0.7 }, children: labels.empty });
|
|
@@ -481,6 +628,6 @@ function MapView(props) {
|
|
|
481
628
|
] });
|
|
482
629
|
}
|
|
483
630
|
|
|
484
|
-
export { CLUSTER_THRESHOLD, ClusterLayer, Geofence, MapList, MapView, Marker, Polyline, Route, boundsOf, circlePolygon, pointsToGeoJSON, useFitBounds, useMap, useMapScheme, zonesToGeoJSON };
|
|
485
|
-
//# sourceMappingURL=chunk-
|
|
486
|
-
//# sourceMappingURL=chunk-
|
|
631
|
+
export { CLUSTER_THRESHOLD, ChoroplethLayer, ChoroplethList, ClusterLayer, Geofence, MapList, MapView, Marker, Polyline, Route, boundsOf, buildChoropleth, circlePolygon, pointsToGeoJSON, sequentialRamp, toRegionCollection, useChoropleth, useFitBounds, useMap, useMapScheme, zonesToGeoJSON };
|
|
632
|
+
//# sourceMappingURL=chunk-YTB3CQKE.js.map
|
|
633
|
+
//# sourceMappingURL=chunk-YTB3CQKE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/context.ts","../src/geometry.ts","../src/choropleth.ts","../src/layers.tsx","../src/map-list.tsx","../src/theme.ts","../src/map-view.tsx"],"names":["React","ring","isValidPoint","jsx","jsxs","React4","React5","Fragment"],"mappings":"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","file":"chunk-YTB3CQKE.js","sourcesContent":["import * as React from 'react'\nimport type * as ML from 'maplibre-gl'\nimport type { MapLibreModule, MapScheme } from './config'\n\nexport interface MapContextValue {\n map: ML.Map\n ml: MapLibreModule\n scheme: MapScheme\n /** Bumps on every `style.load`: layers re-add themselves after a theme switch. */\n styleVersion: number\n reducedMotion: boolean\n}\n\nexport const MapContext = React.createContext<MapContextValue | null>(null)\n\n/** The map of the nearest `<MapView>`; throws outside one (a programming error). */\nexport function useMap(): MapContextValue {\n const v = React.useContext(MapContext)\n if (!v) throw new Error('@asteby/metacore-maps: this component must be rendered inside <MapView>')\n return v\n}\n\n/** Remove a layer/source if present (safe on a map whose style was replaced). */\nexport function removeLayers(map: ML.Map, layerIds: string[], sourceId: string): void {\n try {\n for (const id of layerIds) if (map.getLayer(id)) map.removeLayer(id)\n if (map.getSource(sourceId)) map.removeSource(sourceId)\n } catch {\n /* map already destroyed */\n }\n}\n","// Pure geometry helpers (no MapLibre, no DOM): GeoJSON building, bounds and\n// circle polygons. Distances and point validation come from the single geo\n// module shared with the storefronts (`@asteby/storefront/geo`).\nimport { isValidPoint, type GeoPoint } from '@asteby/storefront/geo'\nimport { colorFor, safeColor } from './palette'\nimport type { MapPointItem, PolygonCoords, ZoneItem } from './types'\n\nexport type LngLatBounds = [[number, number], [number, number]]\n\nexport interface FeatureCollection {\n type: 'FeatureCollection'\n features: Array<{\n type: 'Feature'\n id?: number | string\n properties: Record<string, unknown>\n geometry: { type: string; coordinates: unknown }\n }>\n}\n\n/** `[[west, south], [east, north]]` of the valid points, or null. */\nexport function boundsOf(points: ReadonlyArray<GeoPoint | null | undefined>): LngLatBounds | null {\n let w = Infinity\n let s = Infinity\n let e = -Infinity\n let n = -Infinity\n for (const p of points) {\n if (!isValidPoint(p)) continue\n w = Math.min(w, p.lng)\n e = Math.max(e, p.lng)\n s = Math.min(s, p.lat)\n n = Math.max(n, p.lat)\n }\n return Number.isFinite(w) ? [[w, s], [e, n]] : null\n}\n\n/** Points → GeoJSON with the colour resolved per feature. */\nexport function pointsToGeoJSON(points: MapPointItem[], colors?: Record<string, string>): FeatureCollection {\n return {\n type: 'FeatureCollection',\n features: points\n .filter((p) => isValidPoint(p))\n .map((p) => ({\n type: 'Feature' as const,\n properties: {\n key: p.key,\n label: p.label,\n status: p.status ?? '',\n color: safeColor(p.color) ?? colorFor(p.status, colors),\n },\n geometry: { type: 'Point', coordinates: [p.lng, p.lat] },\n })),\n }\n}\n\nexport function lineToGeoJSON(path: GeoPoint[]): FeatureCollection {\n const coordinates = path.filter((p) => isValidPoint(p)).map((p) => [p.lng, p.lat])\n return {\n type: 'FeatureCollection',\n features: coordinates.length < 2 ? [] : [{ type: 'Feature', properties: {}, geometry: { type: 'LineString', coordinates } }],\n }\n}\n\nconst EARTH_M = 6371008.8\n\n/** Regular polygon approximating a geodesic circle (ring closed, `[lng, lat]`). */\nexport function circlePolygon(center: GeoPoint, radiusM: number, steps = 64): PolygonCoords {\n const lat = (center.lat * Math.PI) / 180\n const lng = (center.lng * Math.PI) / 180\n const d = radiusM / EARTH_M\n const ring: number[][] = []\n for (let i = 0; i <= steps; i++) {\n const brg = (2 * Math.PI * (i % steps)) / steps\n const lat2 = Math.asin(Math.sin(lat) * Math.cos(d) + Math.cos(lat) * Math.sin(d) * Math.cos(brg))\n const lng2 = lng + Math.atan2(Math.sin(brg) * Math.sin(d) * Math.cos(lat), Math.cos(d) - Math.sin(lat) * Math.sin(lat2))\n ring.push([(((lng2 * 180) / Math.PI + 540) % 360) - 180, (lat2 * 180) / Math.PI])\n }\n return [ring]\n}\n\nexport function zonesToGeoJSON(zones: ZoneItem[]): FeatureCollection {\n const features: FeatureCollection['features'] = []\n for (const z of zones) {\n const coords =\n z.polygon && z.polygon.length > 0\n ? z.polygon\n : z.center && isValidPoint(z.center) && (z.radiusM ?? 0) > 0\n ? circlePolygon(z.center, z.radiusM as number)\n : null\n if (!coords) continue\n features.push({\n type: 'Feature',\n properties: { key: z.key, label: z.label ?? '', color: safeColor(z.color) ?? colorFor(z.key) },\n geometry: { type: 'Polygon', coordinates: coords },\n })\n }\n return { type: 'FeatureCollection', features }\n}\n\n/** All vertices of the zones (for fitting the viewport). */\nexport function zonePoints(zones: ZoneItem[]): GeoPoint[] {\n const out: GeoPoint[] = []\n for (const f of zonesToGeoJSON(zones).features) {\n for (const ring of f.geometry.coordinates as number[][][]) {\n for (const c of ring) out.push({ lng: c[0] as number, lat: c[1] as number })\n }\n }\n return out\n}\n","// Choropleth data model: geometry arrives from the host through a lazy loader\n// (the SDK ships no country/region shapes), values are keyed per region and\n// binned onto a sequential ramp derived from the shared palette.\nimport { DEFAULT_COLOR, safeColor } from './palette'\n\nexport interface RegionFeature {\n type: 'Feature'\n id?: string | number\n properties?: Record<string, unknown> | null\n geometry: { type: string; coordinates?: unknown; geometries?: unknown[] } | null\n}\nexport interface RegionCollection {\n type: 'FeatureCollection'\n features: RegionFeature[]\n}\ninterface Topology {\n type: 'Topology'\n arcs: number[][][]\n transform?: { scale: [number, number]; translate: [number, number] }\n objects: Record<string, { type: string; geometries?: TopoGeometry[] } & TopoGeometry>\n}\ninterface TopoGeometry {\n type: string\n id?: string | number\n properties?: Record<string, unknown> | null\n arcs?: any\n coordinates?: unknown\n}\n\n/** What a host/region loader may resolve to: GeoJSON or TopoJSON. */\nexport type ChoroplethGeometry = RegionCollection | Topology\nexport type ChoroplethLoader = () => Promise<ChoroplethGeometry | { default: ChoroplethGeometry }>\n\nexport interface ChoroplethRegion {\n key: string\n label: string\n /** `undefined` when `values` has no entry for the region. */\n value: number | undefined\n color: string\n /** Index of the legend step, -1 without value. */\n step: number\n}\nexport interface ChoroplethStep {\n from: number\n to: number\n color: string\n}\n\nexport const NO_DATA_COLOR = '#D1D5DB'\n\nfunction decodeArcs(topo: Topology): number[][][] {\n const t = topo.transform\n return topo.arcs.map((arc) => {\n let x = 0\n let y = 0\n return arc.map(([dx, dy]) => {\n if (!t) return [dx as number, dy as number]\n x += dx as number\n y += dy as number\n return [x * t.scale[0] + t.translate[0], y * t.scale[1] + t.translate[1]]\n })\n })\n}\n\nfunction ring(arcs: number[][][], idx: number[]): number[][] {\n const out: number[][] = []\n for (const i of idx) {\n const pts = i < 0 ? [...(arcs[~i] ?? [])].reverse() : (arcs[i] ?? [])\n out.push(...(out.length ? pts.slice(1) : pts))\n }\n return out\n}\n\nfunction topoGeometry(g: TopoGeometry, arcs: number[][][]): RegionFeature['geometry'] {\n if (g.type === 'Polygon') return { type: 'Polygon', coordinates: (g.arcs as number[][]).map((r) => ring(arcs, r)) }\n if (g.type === 'MultiPolygon') return { type: 'MultiPolygon', coordinates: (g.arcs as number[][][]).map((p) => p.map((r) => ring(arcs, r))) }\n return null\n}\n\n/** Normalise GeoJSON or TopoJSON (first object, or `object`) to a FeatureCollection of polygons. */\nexport function toRegionCollection(input: ChoroplethGeometry | { default: ChoroplethGeometry }, object?: string): RegionCollection {\n const g = ('default' in input && input.default ? input.default : input) as ChoroplethGeometry\n if (g.type === 'FeatureCollection') return g\n if (g.type !== 'Topology') throw new Error('@asteby/metacore-maps: the choropleth loader must return GeoJSON or TopoJSON')\n const obj = g.objects[object ?? Object.keys(g.objects)[0] ?? '']\n if (!obj) throw new Error(`@asteby/metacore-maps: TopoJSON object \"${object ?? ''}\" not found`)\n const arcs = decodeArcs(g)\n const geoms = obj.type === 'GeometryCollection' ? (obj.geometries ?? []) : [obj]\n return {\n type: 'FeatureCollection',\n features: geoms.map((x) => ({ type: 'Feature', id: x.id, properties: x.properties ?? {}, geometry: topoGeometry(x, arcs) })),\n }\n}\n\nfunction hexRgb(c: string): [number, number, number] | null {\n const m = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(c)\n if (!m) return null\n const h = m[1]!.length === 3 ? m[1]!.replace(/./g, (d) => d + d) : m[1]!\n return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4), 16)]\n}\n\n/** `n` colours from a light tint to `base` (a hex colour; other formats fall back to the palette blue). */\nexport function sequentialRamp(base: string | undefined, n: number): string[] {\n const rgb = hexRgb(safeColor(base) ?? '') ?? hexRgb(DEFAULT_COLOR)!\n return Array.from({ length: n }, (_, i) => {\n const t = n === 1 ? 1 : 0.15 + (0.85 * i) / (n - 1)\n return '#' + rgb.map((v) => Math.round(255 + (v - 255) * t).toString(16).padStart(2, '0')).join('')\n })\n}\n\nexport function regionKey(f: RegionFeature, keyProperty: string): string | undefined {\n const v = f.properties?.[keyProperty] ?? f.id\n return v == null || v === '' ? undefined : String(v)\n}\n\nexport interface BuildOptions {\n keyProperty?: string\n labelProperty?: string\n steps?: number\n color?: string\n}\n\n/** Equal-interval bins over the values; regions without a value are grey. */\nexport function buildChoropleth(geo: RegionCollection, values: Record<string, number>, o: BuildOptions = {}) {\n const keyProperty = o.keyProperty ?? 'key'\n const labelProperty = o.labelProperty ?? 'name'\n const n = Math.max(2, Math.min(9, Math.floor(o.steps ?? 5)))\n const nums = Object.values(values).filter((v) => Number.isFinite(v))\n const min = nums.length ? Math.min(...nums) : 0\n const max = nums.length ? Math.max(...nums) : 0\n const ramp = sequentialRamp(o.color, n)\n const width = (max - min) / n\n const stepOf = (v: number) => (width === 0 ? n - 1 : Math.min(n - 1, Math.floor((v - min) / width)))\n const steps: ChoroplethStep[] = ramp.map((color, i) => ({ from: min + width * i, to: i === n - 1 ? max : min + width * (i + 1), color }))\n const regions: ChoroplethRegion[] = []\n const features: RegionFeature[] = []\n for (const f of geo.features) {\n const key = regionKey(f, keyProperty)\n if (!key || !f.geometry) continue\n const raw = values[key]\n const value = typeof raw === 'number' && Number.isFinite(raw) ? raw : undefined\n const step = value === undefined ? -1 : stepOf(value)\n const color = step < 0 ? NO_DATA_COLOR : ramp[step]!\n const label = String(f.properties?.[labelProperty] ?? key)\n regions.push({ key, label, value, color, step })\n features.push({ ...f, properties: { ...f.properties, key, color } })\n }\n return { regions, steps, collection: { type: 'FeatureCollection', features } as RegionCollection }\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport type * as ML from 'maplibre-gl'\nimport { isValidPoint } from '@asteby/storefront/geo'\nimport { removeLayers, useMap } from './context'\nimport { ensureStyles, popupNode, readableOn } from './dom'\nimport { boundsOf, lineToGeoJSON, pointsToGeoJSON, zonePoints, zonesToGeoJSON } from './geometry'\nimport { colorFor, DEFAULT_COLOR, safeColor } from './palette'\nimport { buildChoropleth, toRegionCollection, type ChoroplethLoader, type ChoroplethRegion, type ChoroplethStep, type RegionCollection } from './choropleth'\nimport type { GeoPoint, MapPointItem, ZoneItem } from './types'\n\n/** Auto-cluster above this many points (DOM markers stay focusable below it). */\nexport const CLUSTER_THRESHOLD = 150\n\n/** Fit the viewport to `points` when their set changes (instant under reduced motion). */\nexport function useFitBounds(points: ReadonlyArray<GeoPoint | null | undefined>, enabled = true, maxZoom = 15): void {\n const { map, reducedMotion } = useMap()\n const valid = points.filter((p): p is GeoPoint => isValidPoint(p))\n const sig = valid.map((p) => `${p.lat},${p.lng}`).join('|')\n React.useEffect(() => {\n if (!enabled) return\n const b = boundsOf(valid)\n if (!b) return\n const duration = reducedMotion ? 0 : 400\n if (b[0][0] === b[1][0] && b[0][1] === b[1][1]) map.easeTo({ center: b[0], zoom: Math.min(14, maxZoom), duration })\n else map.fitBounds(b, { padding: 48, maxZoom, duration })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [map, sig, enabled, reducedMotion, maxZoom])\n}\n\n// --- Marker ---------------------------------------------------------------\n\nexport interface MarkerProps {\n lat: number\n lng: number\n /** Accessible name (required: markers are buttons). */\n label: string\n color?: string\n /** Status key: tints the marker when `color` is not set. */\n status?: string\n /** One or two characters inside the pin (stop number, initial…). */\n glyph?: string\n draggable?: boolean\n selected?: boolean\n /** Popup content (opens on click / Enter / Space). */\n children?: React.ReactNode\n onClick?: () => void\n onDragEnd?: (p: GeoPoint) => void\n}\n\n/** A focusable DOM marker with an optional popup. Keep to a few hundred; use `ClusterLayer` beyond that. */\nexport function Marker(props: MarkerProps): React.ReactElement | null {\n const { map, ml } = useMap()\n const { lat, lng, label, color, status, glyph, draggable, selected, children } = props\n const handlers = React.useRef(props)\n handlers.current = props\n const markerRef = React.useRef<ML.Marker | null>(null)\n const elRef = React.useRef<HTMLButtonElement | null>(null)\n const [popupHost, setPopupHost] = React.useState<HTMLElement | null>(null)\n const hasPopup = children !== undefined && children !== null && children !== false\n\n React.useEffect(() => {\n ensureStyles()\n const el = document.createElement('button')\n el.type = 'button'\n el.className = 'mcm-marker'\n el.addEventListener('click', () => handlers.current.onClick?.())\n elRef.current = el\n const marker = new ml.Marker({ element: el, draggable: !!draggable }).setLngLat([lng, lat]).addTo(map)\n marker.on?.('dragend', () => {\n const ll = marker.getLngLat()\n handlers.current.onDragEnd?.({ lat: ll.lat, lng: ll.lng })\n })\n markerRef.current = marker\n return () => {\n marker.remove()\n markerRef.current = null\n elRef.current = null\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [map, ml, !!draggable])\n\n React.useEffect(() => {\n markerRef.current?.setLngLat([lng, lat])\n }, [lat, lng])\n\n React.useEffect(() => {\n const el = elRef.current\n if (!el) return\n const bg = safeColor(color) ?? colorFor(status)\n el.style.background = bg\n el.style.color = readableOn(bg)\n el.textContent = glyph ?? ''\n el.setAttribute('aria-label', label)\n el.setAttribute('aria-pressed', selected ? 'true' : 'false')\n }, [label, color, status, glyph, selected])\n\n React.useEffect(() => {\n const marker = markerRef.current\n if (!marker || !hasPopup) return\n const host = document.createElement('div')\n const popup = new ml.Popup({ offset: 18, closeButton: true }).setDOMContent(host)\n marker.setPopup(popup)\n setPopupHost(host)\n return () => {\n marker.setPopup(null as unknown as ML.Popup)\n setPopupHost(null)\n }\n }, [ml, map, hasPopup])\n\n return popupHost ? createPortal(children, popupHost) : null\n}\n\n// --- Clustered points -----------------------------------------------------\n\nexport interface ClusterLayerProps {\n points: MapPointItem[]\n /** Group nearby points (default true). Off draws plain circles. */\n cluster?: boolean\n colors?: Record<string, string>\n onSelect?: (item: MapPointItem) => void\n /** Layer id prefix (several layers per map need distinct ids). */\n id?: string\n}\n\n/** WebGL points with native clustering — thousands of features, no DOM per point. */\nexport function ClusterLayer({ points, cluster = true, colors, onSelect, id = 'mcm-points' }: ClusterLayerProps): null {\n const { map, ml, styleVersion } = useMap()\n const latest = React.useRef({ points, colors, onSelect })\n latest.current = { points, colors, onSelect }\n const layerIds = [`${id}-clusters`, `${id}-count`, `${id}-points`]\n\n React.useEffect(() => {\n map.addSource(id, {\n type: 'geojson',\n data: pointsToGeoJSON(latest.current.points, latest.current.colors) as never,\n cluster,\n clusterRadius: 50,\n clusterMaxZoom: 14,\n })\n map.addLayer({\n id: `${id}-clusters`,\n type: 'circle',\n source: id,\n filter: ['has', 'point_count'],\n paint: {\n 'circle-color': DEFAULT_COLOR,\n 'circle-radius': ['step', ['get', 'point_count'], 16, 20, 20, 100, 26],\n 'circle-stroke-width': 3,\n 'circle-stroke-color': '#ffffff',\n },\n })\n if ((map.getStyle() as { glyphs?: string } | undefined)?.glyphs) {\n map.addLayer({\n id: `${id}-count`,\n type: 'symbol',\n source: id,\n filter: ['has', 'point_count'],\n layout: { 'text-field': ['get', 'point_count_abbreviated'], 'text-size': 12 },\n paint: { 'text-color': '#ffffff' },\n })\n }\n map.addLayer({\n id: `${id}-points`,\n type: 'circle',\n source: id,\n filter: ['!', ['has', 'point_count']],\n paint: {\n 'circle-color': ['get', 'color'],\n 'circle-radius': 8,\n 'circle-stroke-width': 2,\n 'circle-stroke-color': '#ffffff',\n },\n })\n const onCluster = async (e: ML.MapLayerMouseEvent) => {\n const f = e.features?.[0]\n const src = map.getSource(id) as ML.GeoJSONSource | undefined\n if (!f || !src) return\n try {\n const zoom = await src.getClusterExpansionZoom(f.properties?.cluster_id as number)\n map.easeTo({ center: (f.geometry as unknown as { coordinates: [number, number] }).coordinates, zoom, duration: 300 })\n } catch {\n /* cluster vanished mid-zoom */\n }\n }\n const onPoint = (e: ML.MapLayerMouseEvent) => {\n const f = e.features?.[0]\n if (!f) return\n const item = latest.current.points.find((p) => p.key === f.properties?.key)\n if (!item) return\n new ml.Popup({ offset: 10 }).setLngLat([item.lng, item.lat]).setDOMContent(popupNode(item.label, [{ value: item.statusLabel ?? item.status ?? '' }, ...(item.details ?? [])])).addTo(map)\n latest.current.onSelect?.(item)\n }\n const pointer = () => (map.getCanvas().style.cursor = 'pointer')\n const arrow = () => (map.getCanvas().style.cursor = '')\n map.on('click', `${id}-clusters`, onCluster)\n map.on('click', `${id}-points`, onPoint)\n for (const l of [`${id}-clusters`, `${id}-points`]) {\n map.on('mouseenter', l, pointer)\n map.on('mouseleave', l, arrow)\n }\n return () => {\n for (const l of [`${id}-clusters`, `${id}-points`]) {\n map.off('mouseenter', l, pointer)\n map.off('mouseleave', l, arrow)\n }\n map.off('click', `${id}-clusters`, onCluster)\n map.off('click', `${id}-points`, onPoint)\n removeLayers(map, layerIds, id)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [map, ml, id, cluster, styleVersion])\n\n React.useEffect(() => {\n ;(map.getSource(id) as ML.GeoJSONSource | undefined)?.setData(pointsToGeoJSON(points, colors) as never)\n }, [map, id, points, colors, styleVersion])\n return null\n}\n\n// --- Polyline / Route -----------------------------------------------------\n\nexport interface PolylineProps {\n path: GeoPoint[]\n color?: string\n width?: number\n dashed?: boolean\n /** Fit the viewport to the path. */\n fit?: boolean\n id?: string\n}\n\n/** A line over ordered points (straight segments: no routing service needed). */\nexport function Polyline({ path, color, width = 4, dashed, fit, id = 'mcm-line' }: PolylineProps): null {\n const { map, styleVersion } = useMap()\n const latest = React.useRef(path)\n latest.current = path\n React.useEffect(() => {\n map.addSource(id, { type: 'geojson', data: lineToGeoJSON(latest.current) as never })\n map.addLayer({\n id,\n type: 'line',\n source: id,\n layout: { 'line-join': 'round', 'line-cap': 'round' },\n paint: {\n 'line-color': safeColor(color) ?? DEFAULT_COLOR,\n 'line-width': width,\n ...(dashed ? { 'line-dasharray': [2, 2] } : {}),\n },\n })\n return () => removeLayers(map, [id], id)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [map, id, color, width, dashed, styleVersion])\n React.useEffect(() => {\n ;(map.getSource(id) as ML.GeoJSONSource | undefined)?.setData(lineToGeoJSON(path) as never)\n }, [map, id, path, styleVersion])\n useFitBounds(path, !!fit)\n return null\n}\n\nexport interface RouteProps extends PolylineProps {\n /** Numbered stop markers along the path (default true). */\n stops?: boolean\n /** Accessible name of each stop: `${stopLabel} ${n}`. Default \"Parada\". */\n stopLabel?: string\n}\n\n/** A route: the line plus numbered, focusable stops (the list alternative gets them as points). */\nexport function Route({ path, stops = true, stopLabel = 'Parada', ...line }: RouteProps): React.ReactElement {\n const valid = path.filter((p) => isValidPoint(p))\n return (\n <>\n <Polyline path={valid} {...line} />\n {stops\n ? valid.map((p, i) => (\n <Marker key={`${p.lat},${p.lng},${i}`} lat={p.lat} lng={p.lng} glyph={String(i + 1)} label={`${stopLabel} ${i + 1}`} color={safeColor(line.color)} />\n ))\n : null}\n </>\n )\n}\n\n// --- Geofence -------------------------------------------------------------\n\nexport interface GeofenceProps {\n zones: ZoneItem[]\n fit?: boolean\n opacity?: number\n onSelect?: (zone: ZoneItem) => void\n id?: string\n}\n\n/** Coverage zones: polygons and/or circles (`center` + `radiusM`). */\nexport function Geofence({ zones, fit, opacity = 0.18, onSelect, id = 'mcm-zones' }: GeofenceProps): null {\n const { map, ml, styleVersion } = useMap()\n const latest = React.useRef({ zones, onSelect })\n latest.current = { zones, onSelect }\n React.useEffect(() => {\n map.addSource(id, { type: 'geojson', data: zonesToGeoJSON(latest.current.zones) as never })\n map.addLayer({ id: `${id}-fill`, type: 'fill', source: id, paint: { 'fill-color': ['get', 'color'], 'fill-opacity': opacity } })\n map.addLayer({ id: `${id}-line`, type: 'line', source: id, paint: { 'line-color': ['get', 'color'], 'line-width': 2 } })\n const onClick = (e: ML.MapLayerMouseEvent) => {\n const key = e.features?.[0]?.properties?.key\n const z = latest.current.zones.find((x) => x.key === key)\n if (!z) return\n if (z.label) new ml.Popup().setLngLat(e.lngLat).setDOMContent(popupNode(z.label)).addTo(map)\n latest.current.onSelect?.(z)\n }\n map.on('click', `${id}-fill`, onClick)\n return () => {\n map.off('click', `${id}-fill`, onClick)\n removeLayers(map, [`${id}-fill`, `${id}-line`], id)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [map, ml, id, opacity, styleVersion])\n React.useEffect(() => {\n ;(map.getSource(id) as ML.GeoJSONSource | undefined)?.setData(zonesToGeoJSON(zones) as never)\n }, [map, id, zones, styleVersion])\n useFitBounds(React.useMemo(() => (fit ? zonePoints(zones) : []), [fit, zones]), !!fit)\n return null\n}\n\n// --- Choropleth -----------------------------------------------------------\n\nexport interface ChoroplethOptions {\n /** Lazy geometry (GeoJSON or TopoJSON), supplied by the host or region: the SDK ships none. Called once, on mount. */\n loader: ChoroplethLoader\n /** Value per region key. */\n values: Record<string, number>\n /** Feature property (or `id`) that matches the `values` keys. Default `key`. */\n keyProperty?: string\n /** Feature property with the display name. Default `name`. */\n labelProperty?: string\n /** TopoJSON object to draw (default: the first). */\n object?: string\n /** Number of colour classes (2–9). Default 5. */\n steps?: number\n /** Hex base colour of the ramp (default: the palette blue). */\n color?: string\n}\n\nexport interface ChoroplethState {\n status: 'loading' | 'ready' | 'error'\n regions: ChoroplethRegion[]\n steps: ChoroplethStep[]\n collection: RegionCollection | null\n}\n\n/**\n * Loads the geometry once (on mount) and joins it with `values`. Usable\n * outside a map too: it feeds `<ChoroplethList>`, the accessible equivalent.\n */\nexport function useChoropleth({ loader, values, keyProperty, labelProperty, object, steps, color }: ChoroplethOptions): ChoroplethState {\n const [geo, setGeo] = React.useState<RegionCollection | null>(null)\n const [failed, setFailed] = React.useState(false)\n const loaderRef = React.useRef(loader)\n loaderRef.current = loader\n React.useEffect(() => {\n let alive = true\n loaderRef\n .current()\n .then((g) => alive && setGeo(toRegionCollection(g, object)))\n .catch(() => alive && setFailed(true))\n return () => {\n alive = false\n }\n }, [object])\n return React.useMemo(() => {\n if (!geo) return { status: failed ? 'error' : 'loading', regions: [], steps: [], collection: null }\n return { status: 'ready', ...buildChoropleth(geo, values, { keyProperty, labelProperty, steps, color }) }\n }, [geo, failed, values, keyProperty, labelProperty, steps, color])\n}\n\nexport interface ChoroplethLayerProps extends ChoroplethOptions {\n opacity?: number\n /** Receives the joined regions (label + value) to feed <ChoroplethList>. */\n onRegions?: (state: ChoroplethState) => void\n onSelect?: (region: ChoroplethRegion) => void\n id?: string\n}\n\n/** Regions shaded by value. The geometry is fetched when this mounts, never before. */\nexport function ChoroplethLayer({ opacity = 0.75, onRegions, onSelect, id = 'mcm-choropleth', ...opts }: ChoroplethLayerProps): null {\n const { map, ml, styleVersion } = useMap()\n const state = useChoropleth(opts)\n const latest = React.useRef({ state, onSelect, onRegions })\n latest.current = { state, onSelect, onRegions }\n React.useEffect(() => {\n latest.current.onRegions?.(state)\n }, [state])\n const data = state.collection\n React.useEffect(() => {\n if (!data) return\n map.addSource(id, { type: 'geojson', data: latest.current.state.collection as never })\n map.addLayer({ id: `${id}-fill`, type: 'fill', source: id, paint: { 'fill-color': ['get', 'color'], 'fill-opacity': opacity } })\n map.addLayer({ id: `${id}-line`, type: 'line', source: id, paint: { 'line-color': '#FFFFFF', 'line-width': 1 } })\n const onClick = (e: ML.MapLayerMouseEvent) => {\n const key = e.features?.[0]?.properties?.key\n const r = latest.current.state.regions.find((x) => x.key === key)\n if (!r) return\n new ml.Popup().setLngLat(e.lngLat).setDOMContent(popupNode(r.value === undefined ? r.label : `${r.label}: ${r.value}`)).addTo(map)\n latest.current.onSelect?.(r)\n }\n map.on('click', `${id}-fill`, onClick)\n return () => {\n map.off('click', `${id}-fill`, onClick)\n removeLayers(map, [`${id}-fill`, `${id}-line`], id)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [map, ml, id, opacity, styleVersion, !!data])\n React.useEffect(() => {\n if (data) (map.getSource(id) as ML.GeoJSONSource | undefined)?.setData(data as never)\n }, [map, id, data, styleVersion])\n return null\n}\n\nexport interface ChoroplethListProps {\n regions: ChoroplethRegion[]\n /** Accessible name of the list, e.g. \"Ventas por estado\". */\n label: string\n /** Text for regions without a value. */\n noData: string\n formatValue?: (v: number) => string\n /** Sort by value, highest first (default: the geometry order). */\n sortByValue?: boolean\n id?: string\n}\n\n/** Accessible equivalent of the choropleth: every region with its value written out (colour is never the only channel). */\nexport function ChoroplethList({ regions, label, noData, formatValue = String, sortByValue, id }: ChoroplethListProps): React.ReactElement {\n const rows = sortByValue ? [...regions].sort((a, b) => (b.value ?? -Infinity) - (a.value ?? -Infinity)) : regions\n return (\n <table id={id} data-testid=\"choropleth-list\" style={{ borderCollapse: 'collapse', width: '100%' }}>\n <caption style={{ textAlign: 'left', fontWeight: 600, padding: '4px 0' }}>{label}</caption>\n <tbody>\n {rows.map((r) => (\n <tr key={r.key} style={{ borderBottom: '1px solid rgba(128,128,128,.25)' }}>\n <th scope=\"row\" style={{ textAlign: 'left', fontWeight: 400, padding: '6px 0' }}>\n <span aria-hidden style={{ display: 'inline-block', width: 10, height: 10, marginRight: 8, background: r.color, border: '1px solid rgba(128,128,128,.5)' }} />\n {r.label}\n </th>\n <td style={{ textAlign: 'right', fontVariantNumeric: 'tabular-nums' }}>{r.value === undefined ? noData : formatValue(r.value)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n","import * as React from 'react'\nimport { distanceKm, formatDistance, type GeoPoint } from '@asteby/storefront/geo'\nimport { openInMapHref } from './dom'\nimport type { MapLabels, MapPointItem } from './types'\n\nexport interface MapListProps {\n items: MapPointItem[]\n labels: MapLabels\n selectedKey?: string | null\n /** Show the distance from here next to each item. */\n origin?: GeoPoint | null\n locale?: string\n onSelect?: (item: MapPointItem) => void\n id?: string\n}\n\n/**\n * The accessible equivalent of the map: every point as a keyboard-reachable\n * list item with its status written out and an \"open in map\" link. It is the\n * only view when WebGL or MapLibre are unavailable.\n */\nexport function MapList({ items, labels, selectedKey, origin, locale, onSelect, id }: MapListProps): React.ReactElement {\n if (items.length === 0) {\n return (\n <p id={id} role=\"status\" data-testid=\"map-empty\" style={{ padding: '16px 0', textAlign: 'center', opacity: 0.7 }}>\n {labels.empty}\n </p>\n )\n }\n return (\n <ul id={id} aria-label={labels.list} data-testid=\"map-list\" style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n {items.map((it) => {\n const sub = [\n it.statusLabel ?? it.status,\n ...(it.details ?? []).map((d) => (d.label ? `${d.label}: ${d.value}` : d.value)),\n origin ? formatDistance(distanceKm(origin, it), locale) : '',\n ].filter(Boolean)\n return (\n <li key={it.key} data-selected={selectedKey === it.key || undefined} style={{ display: 'flex', gap: 12, padding: '8px 0', borderBottom: '1px solid rgba(128,128,128,.25)' }}>\n <div style={{ minWidth: 0, flex: 1 }}>\n {onSelect ? (\n <button type=\"button\" aria-pressed={selectedKey === it.key} onClick={() => onSelect(it)} style={{ all: 'unset', cursor: 'pointer', fontWeight: 600, textDecoration: 'underline', textUnderlineOffset: 3 }}>\n {it.label}\n </button>\n ) : (\n <strong>{it.label}</strong>\n )}\n {sub.length > 0 ? <div style={{ fontSize: 12, opacity: 0.75 }}>{sub.join(' · ')}</div> : null}\n </div>\n <a href={openInMapHref(it.lat, it.lng)} target=\"_blank\" rel=\"noopener noreferrer\" aria-label={`${labels.openInMap}: ${it.label}`} style={{ fontSize: 12, flexShrink: 0 }}>\n {labels.openInMap}\n </a>\n </li>\n )\n })}\n </ul>\n )\n}\n","import * as React from 'react'\nimport type { MapScheme } from './config'\n\nfunction detect(): MapScheme {\n if (typeof document === 'undefined') return 'light'\n const root = document.documentElement\n const attr = root.getAttribute('data-theme')\n if (attr === 'dark' || attr === 'light') return attr\n if (root.classList.contains('dark')) return 'dark'\n if (root.classList.contains('light')) return 'light'\n return typeof matchMedia === 'function' && matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\n/**\n * Colour scheme the map follows: the host's `.dark` class / `data-theme`\n * (the metacore theme package sets them), else the OS preference. `theme`\n * pins it. Re-evaluates when the class/attribute or the OS setting changes.\n */\nexport function useMapScheme(theme: MapScheme | 'auto' = 'auto'): MapScheme {\n const [scheme, setScheme] = React.useState<MapScheme>(theme === 'auto' ? detect : theme)\n React.useEffect(() => {\n if (theme !== 'auto') {\n setScheme(theme)\n return\n }\n const update = () => setScheme(detect())\n update()\n const mo = new MutationObserver(update)\n mo.observe(document.documentElement, { attributes: true, attributeFilter: ['class', 'data-theme'] })\n const mq = typeof matchMedia === 'function' ? matchMedia('(prefers-color-scheme: dark)') : null\n mq?.addEventListener?.('change', update)\n return () => {\n mo.disconnect()\n mq?.removeEventListener?.('change', update)\n }\n }, [theme])\n return scheme\n}\n\nexport function prefersReducedMotion(): boolean {\n return typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n","import * as React from 'react'\nimport type * as ML from 'maplibre-gl'\nimport { isValidPoint } from '@asteby/storefront/geo'\nimport {\n ensureProtocols,\n getMapsConfig,\n loadMaplibre,\n resolveStyle,\n supportsWebGL,\n type MapLibreModule,\n type MapScheme,\n type MapStyle,\n} from './config'\nimport { MapContext, type MapContextValue } from './context'\nimport { ensureStyles } from './dom'\nimport { CLUSTER_THRESHOLD, ClusterLayer, Marker, useFitBounds } from './layers'\nimport { MapList } from './map-list'\nimport { prefersReducedMotion, useMapScheme } from './theme'\nimport { mergeLabels, type GeoPoint, type MapLabels, type MapPointItem } from './types'\n\nexport interface MapViewProps {\n /** Features to draw. They also feed the list alternative. */\n points?: MapPointItem[]\n /** Cluster the points (default: automatic above 150). */\n cluster?: boolean\n /** Status key → colour overrides (e.g. from the model's option colours). */\n colors?: Record<string, string>\n /** Fit the viewport to the points when they change (default true). */\n fit?: boolean\n center?: [number, number]\n zoom?: number\n /** `auto` follows the host theme (`.dark` / `data-theme`) or the OS. */\n theme?: MapScheme | 'auto'\n /** Style override: URL / object, or one per scheme. Default: `configureMaps({ style })`. */\n mapStyle?: MapStyle | { light?: MapStyle; dark?: MapStyle }\n height?: number | string\n className?: string\n ariaLabel?: string\n labels?: Partial<MapLabels>\n selectedKey?: string | null\n onSelect?: (item: MapPointItem) => void\n /** Click on the empty map (e.g. a picker). */\n onMapClick?: (p: GeoPoint) => void\n /** Show the \"Ver lista\" toggle (default true; the list is still the fallback when the map cannot render). */\n listToggle?: boolean\n /** Extra content in the list region (e.g. zone names). */\n listExtra?: React.ReactNode\n locale?: string\n /** Layers and markers: `<Route>`, `<Polyline>`, `<Geofence>`, `<Marker>`… */\n children?: React.ReactNode\n}\n\ntype Status = 'loading' | 'ready' | 'unavailable'\n\nfunction PointsLayer({ points, cluster, colors, selectedKey, onSelect, fit }: Pick<MapViewProps, 'points' | 'cluster' | 'colors' | 'selectedKey' | 'onSelect' | 'fit'>) {\n const pts = React.useMemo(() => (points ?? []).filter((p) => isValidPoint(p)), [points])\n useFitBounds(pts, fit !== false)\n const clustered = cluster ?? pts.length > CLUSTER_THRESHOLD\n if (clustered) return <ClusterLayer points={pts} colors={colors} onSelect={onSelect} />\n return (\n <>\n {pts.map((p) => (\n <Marker\n key={p.key}\n lat={p.lat}\n lng={p.lng}\n label={p.statusLabel ?? p.status ? `${p.label}, ${p.statusLabel ?? p.status}` : p.label}\n status={p.status}\n color={p.color ?? (p.status ? colors?.[p.status] : undefined)}\n glyph={p.glyph}\n selected={selectedKey === p.key}\n onClick={() => onSelect?.(p)}\n >\n <strong style={{ display: 'block' }}>{p.label}</strong>\n {p.statusLabel ?? p.status ? <span style={{ display: 'block' }}>{p.statusLabel ?? p.status}</span> : null}\n {(p.details ?? []).map((d, i) => (\n <span key={i} style={{ display: 'block' }}>\n {d.label ? `${d.label}: ${d.value}` : d.value}\n </span>\n ))}\n </Marker>\n ))}\n </>\n )\n}\n\n/**\n * Interactive map. MapLibre loads on first mount (never in your first paint),\n * the base map comes from `configureMaps({ style })` (no keys), and a list\n * with the same features is always one click away — and the only view when\n * WebGL is missing.\n */\nexport function MapView(props: MapViewProps): React.ReactElement {\n const { points, theme = 'auto', mapStyle, height = 360, className, ariaLabel, listToggle = true, listExtra, locale, children } = props\n const labels = React.useMemo(() => mergeLabels(props.labels), [props.labels])\n const scheme = useMapScheme(theme)\n const [status, setStatus] = React.useState<Status>('loading')\n const [handle, setHandle] = React.useState<{ map: ML.Map; ml: MapLibreModule } | null>(null)\n const [styleVersion, setStyleVersion] = React.useState(0)\n const [showList, setShowList] = React.useState(false)\n const [selected, setSelected] = React.useState<string | null>(props.selectedKey ?? null)\n const container = React.useRef<HTMLDivElement | null>(null)\n const live = React.useRef({ scheme, mapStyle, onMapClick: props.onMapClick })\n live.current = { scheme, mapStyle, onMapClick: props.onMapClick }\n const reducedMotion = React.useMemo(() => prefersReducedMotion(), [])\n const listId = React.useId()\n\n React.useEffect(() => {\n if (props.selectedKey !== undefined) setSelected(props.selectedKey)\n }, [props.selectedKey])\n\n React.useEffect(() => {\n const el = container.current\n if (!el) return\n if (!supportsWebGL()) {\n setStatus('unavailable')\n return\n }\n ensureStyles()\n let cancelled = false\n let map: ML.Map | null = null\n loadMaplibre()\n .then(async (ml) => {\n const style = resolveStyle(live.current.scheme, live.current.mapStyle)\n await ensureProtocols(ml, style)\n if (cancelled) return\n const cfg = getMapsConfig()\n map = new ml.Map({\n container: el,\n style,\n center: props.center ?? cfg.center ?? [-102.5, 23.6],\n zoom: props.zoom ?? cfg.zoom ?? 4,\n attributionControl: false,\n })\n map.addControl(new ml.NavigationControl({ showCompass: false }), 'top-right')\n map.addControl(new ml.AttributionControl({ compact: true, customAttribution: cfg.attribution }))\n map.on('style.load', () => setStyleVersion((v) => v + 1))\n map.on('click', (e: ML.MapMouseEvent) => {\n const cb = live.current.onMapClick\n if (cb && !(e as { defaultPrevented?: boolean }).defaultPrevented) cb({ lat: e.lngLat.lat, lng: e.lngLat.lng })\n })\n const m = map\n m.once('load', () => {\n if (cancelled) return\n setHandle({ map: m, ml })\n setStatus('ready')\n })\n })\n .catch(() => !cancelled && setStatus('unavailable'))\n return () => {\n cancelled = true\n setHandle(null)\n map?.remove()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // Theme switch: swap the base style; layers re-add on `style.load`.\n const firstScheme = React.useRef(scheme)\n React.useEffect(() => {\n if (firstScheme.current === scheme || !handle) return\n firstScheme.current = scheme\n const style = resolveStyle(scheme, mapStyle)\n void ensureProtocols(handle.ml, style).then(() => handle.map.setStyle(style, { diff: false }))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scheme, handle])\n\n const ctx = React.useMemo<MapContextValue | null>(\n () => (handle ? { map: handle.map, ml: handle.ml, scheme, styleVersion, reducedMotion } : null),\n [handle, scheme, styleVersion, reducedMotion],\n )\n\n const select = React.useCallback(\n (item: MapPointItem) => {\n setSelected(item.key)\n props.onSelect?.(item)\n handle?.map.easeTo({ center: [item.lng, item.lat], zoom: Math.max(handle.map.getZoom(), 13), duration: reducedMotion ? 0 : 400 })\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [handle, reducedMotion, props.onSelect],\n )\n\n const unavailable = status === 'unavailable'\n const listVisible = unavailable || showList\n const items = React.useMemo(() => (points ?? []).filter((p) => isValidPoint(p)), [points])\n\n return (\n <div className={['mcm-root', scheme === 'dark' ? 'mcm-dark' : '', className].filter(Boolean).join(' ')} data-testid=\"metacore-map\" data-status={status} data-scheme={scheme}>\n {unavailable ? (\n <p role=\"status\" data-testid=\"map-unavailable\" style={{ margin: '0 0 8px', fontSize: 13, opacity: 0.8 }}>\n {labels.unavailable}\n </p>\n ) : (\n <div style={{ position: 'relative', height, width: '100%' }}>\n <div ref={container} role=\"region\" aria-label={ariaLabel ?? labels.map} aria-busy={status === 'loading'} style={{ position: 'absolute', inset: 0, borderRadius: 8, overflow: 'hidden' }} />\n {status === 'loading' ? (\n <p role=\"status\" style={{ position: 'absolute', inset: 0, display: 'grid', placeItems: 'center', margin: 0, pointerEvents: 'none', fontSize: 13, opacity: 0.7 }}>\n {labels.loading}\n </p>\n ) : null}\n </div>\n )}\n {ctx ? (\n <MapContext.Provider value={ctx}>\n <PointsLayer points={points} cluster={props.cluster} colors={props.colors} selectedKey={selected} onSelect={select} fit={props.fit} />\n {children}\n </MapContext.Provider>\n ) : null}\n {listToggle && !unavailable ? (\n <button type=\"button\" aria-expanded={showList} aria-controls={listId} onClick={() => setShowList((v) => !v)} style={{ marginTop: 8, fontSize: 13 }}>\n {showList ? labels.hideList : labels.showList}\n </button>\n ) : null}\n {listVisible ? (\n <div id={listId} style={{ marginTop: 8 }}>\n <MapList items={items} labels={labels} selectedKey={selected} locale={locale} onSelect={unavailable ? undefined : select} />\n {listExtra}\n </div>\n ) : null}\n </div>\n )\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -103,6 +103,77 @@ interface MapViewProps {
|
|
|
103
103
|
*/
|
|
104
104
|
declare function MapView(props: MapViewProps): React.ReactElement;
|
|
105
105
|
|
|
106
|
+
interface RegionFeature {
|
|
107
|
+
type: 'Feature';
|
|
108
|
+
id?: string | number;
|
|
109
|
+
properties?: Record<string, unknown> | null;
|
|
110
|
+
geometry: {
|
|
111
|
+
type: string;
|
|
112
|
+
coordinates?: unknown;
|
|
113
|
+
geometries?: unknown[];
|
|
114
|
+
} | null;
|
|
115
|
+
}
|
|
116
|
+
interface RegionCollection {
|
|
117
|
+
type: 'FeatureCollection';
|
|
118
|
+
features: RegionFeature[];
|
|
119
|
+
}
|
|
120
|
+
interface Topology {
|
|
121
|
+
type: 'Topology';
|
|
122
|
+
arcs: number[][][];
|
|
123
|
+
transform?: {
|
|
124
|
+
scale: [number, number];
|
|
125
|
+
translate: [number, number];
|
|
126
|
+
};
|
|
127
|
+
objects: Record<string, {
|
|
128
|
+
type: string;
|
|
129
|
+
geometries?: TopoGeometry[];
|
|
130
|
+
} & TopoGeometry>;
|
|
131
|
+
}
|
|
132
|
+
interface TopoGeometry {
|
|
133
|
+
type: string;
|
|
134
|
+
id?: string | number;
|
|
135
|
+
properties?: Record<string, unknown> | null;
|
|
136
|
+
arcs?: any;
|
|
137
|
+
coordinates?: unknown;
|
|
138
|
+
}
|
|
139
|
+
/** What a host/region loader may resolve to: GeoJSON or TopoJSON. */
|
|
140
|
+
type ChoroplethGeometry = RegionCollection | Topology;
|
|
141
|
+
type ChoroplethLoader = () => Promise<ChoroplethGeometry | {
|
|
142
|
+
default: ChoroplethGeometry;
|
|
143
|
+
}>;
|
|
144
|
+
interface ChoroplethRegion {
|
|
145
|
+
key: string;
|
|
146
|
+
label: string;
|
|
147
|
+
/** `undefined` when `values` has no entry for the region. */
|
|
148
|
+
value: number | undefined;
|
|
149
|
+
color: string;
|
|
150
|
+
/** Index of the legend step, -1 without value. */
|
|
151
|
+
step: number;
|
|
152
|
+
}
|
|
153
|
+
interface ChoroplethStep {
|
|
154
|
+
from: number;
|
|
155
|
+
to: number;
|
|
156
|
+
color: string;
|
|
157
|
+
}
|
|
158
|
+
/** Normalise GeoJSON or TopoJSON (first object, or `object`) to a FeatureCollection of polygons. */
|
|
159
|
+
declare function toRegionCollection(input: ChoroplethGeometry | {
|
|
160
|
+
default: ChoroplethGeometry;
|
|
161
|
+
}, object?: string): RegionCollection;
|
|
162
|
+
/** `n` colours from a light tint to `base` (a hex colour; other formats fall back to the palette blue). */
|
|
163
|
+
declare function sequentialRamp(base: string | undefined, n: number): string[];
|
|
164
|
+
interface BuildOptions {
|
|
165
|
+
keyProperty?: string;
|
|
166
|
+
labelProperty?: string;
|
|
167
|
+
steps?: number;
|
|
168
|
+
color?: string;
|
|
169
|
+
}
|
|
170
|
+
/** Equal-interval bins over the values; regions without a value are grey. */
|
|
171
|
+
declare function buildChoropleth(geo: RegionCollection, values: Record<string, number>, o?: BuildOptions): {
|
|
172
|
+
regions: ChoroplethRegion[];
|
|
173
|
+
steps: ChoroplethStep[];
|
|
174
|
+
collection: RegionCollection;
|
|
175
|
+
};
|
|
176
|
+
|
|
106
177
|
/** Auto-cluster above this many points (DOM markers stay focusable below it). */
|
|
107
178
|
declare const CLUSTER_THRESHOLD = 150;
|
|
108
179
|
/** Fit the viewport to `points` when their set changes (instant under reduced motion). */
|
|
@@ -165,6 +236,55 @@ interface GeofenceProps {
|
|
|
165
236
|
}
|
|
166
237
|
/** Coverage zones: polygons and/or circles (`center` + `radiusM`). */
|
|
167
238
|
declare function Geofence({ zones, fit, opacity, onSelect, id }: GeofenceProps): null;
|
|
239
|
+
interface ChoroplethOptions {
|
|
240
|
+
/** Lazy geometry (GeoJSON or TopoJSON), supplied by the host or region: the SDK ships none. Called once, on mount. */
|
|
241
|
+
loader: ChoroplethLoader;
|
|
242
|
+
/** Value per region key. */
|
|
243
|
+
values: Record<string, number>;
|
|
244
|
+
/** Feature property (or `id`) that matches the `values` keys. Default `key`. */
|
|
245
|
+
keyProperty?: string;
|
|
246
|
+
/** Feature property with the display name. Default `name`. */
|
|
247
|
+
labelProperty?: string;
|
|
248
|
+
/** TopoJSON object to draw (default: the first). */
|
|
249
|
+
object?: string;
|
|
250
|
+
/** Number of colour classes (2–9). Default 5. */
|
|
251
|
+
steps?: number;
|
|
252
|
+
/** Hex base colour of the ramp (default: the palette blue). */
|
|
253
|
+
color?: string;
|
|
254
|
+
}
|
|
255
|
+
interface ChoroplethState {
|
|
256
|
+
status: 'loading' | 'ready' | 'error';
|
|
257
|
+
regions: ChoroplethRegion[];
|
|
258
|
+
steps: ChoroplethStep[];
|
|
259
|
+
collection: RegionCollection | null;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Loads the geometry once (on mount) and joins it with `values`. Usable
|
|
263
|
+
* outside a map too: it feeds `<ChoroplethList>`, the accessible equivalent.
|
|
264
|
+
*/
|
|
265
|
+
declare function useChoropleth({ loader, values, keyProperty, labelProperty, object, steps, color }: ChoroplethOptions): ChoroplethState;
|
|
266
|
+
interface ChoroplethLayerProps extends ChoroplethOptions {
|
|
267
|
+
opacity?: number;
|
|
268
|
+
/** Receives the joined regions (label + value) to feed <ChoroplethList>. */
|
|
269
|
+
onRegions?: (state: ChoroplethState) => void;
|
|
270
|
+
onSelect?: (region: ChoroplethRegion) => void;
|
|
271
|
+
id?: string;
|
|
272
|
+
}
|
|
273
|
+
/** Regions shaded by value. The geometry is fetched when this mounts, never before. */
|
|
274
|
+
declare function ChoroplethLayer({ opacity, onRegions, onSelect, id, ...opts }: ChoroplethLayerProps): null;
|
|
275
|
+
interface ChoroplethListProps {
|
|
276
|
+
regions: ChoroplethRegion[];
|
|
277
|
+
/** Accessible name of the list, e.g. "Ventas por estado". */
|
|
278
|
+
label: string;
|
|
279
|
+
/** Text for regions without a value. */
|
|
280
|
+
noData: string;
|
|
281
|
+
formatValue?: (v: number) => string;
|
|
282
|
+
/** Sort by value, highest first (default: the geometry order). */
|
|
283
|
+
sortByValue?: boolean;
|
|
284
|
+
id?: string;
|
|
285
|
+
}
|
|
286
|
+
/** Accessible equivalent of the choropleth: every region with its value written out (colour is never the only channel). */
|
|
287
|
+
declare function ChoroplethList({ regions, label, noData, formatValue, sortByValue, id }: ChoroplethListProps): React.ReactElement;
|
|
168
288
|
|
|
169
289
|
interface GeocodeResult {
|
|
170
290
|
label: string;
|
|
@@ -296,4 +416,4 @@ declare const PALETTE: readonly ["#0072B2", "#D55E00", "#009E73", "#CC79A7", "#E
|
|
|
296
416
|
/** Stable colour of a status/option key (same key → same colour on every render). */
|
|
297
417
|
declare function colorFor(key: string | undefined, overrides?: Record<string, string>): string;
|
|
298
418
|
|
|
299
|
-
export { CLUSTER_THRESHOLD, ClusterLayer, type ClusterLayerProps, DEFAULT_LABELS, DEFAULT_TIMELINE_LABELS, type GeocodeResult, Geofence, type GeofenceProps, LocationPicker, type LocationPickerProps, type MapContextValue, type MapLabels, MapLibreModule, MapList, type MapListProps, type MapPointItem, MapScheme, MapStyle, MapView, type MapViewProps, Marker, type MarkerProps, PALETTE, type PolygonCoords, Polyline, type PolylineProps, Route, type RouteProps, type TrackingEvent, type TrackingFieldMap, TrackingTimeline, type TrackingTimelineLabels, type TrackingTimelineProps, type TrackingTone, type ZoneItem, boundsOf, circlePolygon, colorFor, pointsToGeoJSON, sortTrackingEvents, toTrackingEvents, useFitBounds, useMap, useMapScheme, zonesToGeoJSON };
|
|
419
|
+
export { CLUSTER_THRESHOLD, type ChoroplethGeometry, ChoroplethLayer, type ChoroplethLayerProps, ChoroplethList, type ChoroplethListProps, type ChoroplethLoader, type ChoroplethOptions, type ChoroplethRegion, type ChoroplethState, type ChoroplethStep, ClusterLayer, type ClusterLayerProps, DEFAULT_LABELS, DEFAULT_TIMELINE_LABELS, type GeocodeResult, Geofence, type GeofenceProps, LocationPicker, type LocationPickerProps, type MapContextValue, type MapLabels, MapLibreModule, MapList, type MapListProps, type MapPointItem, MapScheme, MapStyle, MapView, type MapViewProps, Marker, type MarkerProps, PALETTE, type PolygonCoords, Polyline, type PolylineProps, type RegionCollection, Route, type RouteProps, type TrackingEvent, type TrackingFieldMap, TrackingTimeline, type TrackingTimelineLabels, type TrackingTimelineProps, type TrackingTone, type ZoneItem, boundsOf, buildChoropleth, circlePolygon, colorFor, pointsToGeoJSON, sequentialRamp, sortTrackingEvents, toRegionCollection, toTrackingEvents, useChoropleth, useFitBounds, useMap, useMapScheme, zonesToGeoJSON };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { MapView, Marker, useMap } from './chunk-
|
|
2
|
-
export { CLUSTER_THRESHOLD, ClusterLayer, Geofence, MapList, MapView, Marker, Polyline, Route, boundsOf, circlePolygon, pointsToGeoJSON, useFitBounds, useMap, useMapScheme, zonesToGeoJSON } from './chunk-
|
|
1
|
+
import { MapView, Marker, useMap } from './chunk-YTB3CQKE.js';
|
|
2
|
+
export { CLUSTER_THRESHOLD, ChoroplethLayer, ChoroplethList, ClusterLayer, Geofence, MapList, MapView, Marker, Polyline, Route, boundsOf, buildChoropleth, circlePolygon, pointsToGeoJSON, sequentialRamp, toRegionCollection, useChoropleth, useFitBounds, useMap, useMapScheme, zonesToGeoJSON } from './chunk-YTB3CQKE.js';
|
|
3
3
|
export { blankStyle, configureMaps, getMapsConfig, loadMaplibre, rasterStyle, supportsWebGL } from './chunk-HE2XC52R.js';
|
|
4
4
|
import { mergeLabels } from './chunk-ZGR7H4XP.js';
|
|
5
5
|
export { DEFAULT_LABELS, DEFAULT_TIMELINE_LABELS, PALETTE, TrackingTimeline, colorFor, sortTrackingEvents, toTrackingEvents } from './chunk-ZGR7H4XP.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { MapPanelRenderer as default } from './chunk-JRVBX3JG.js';
|
|
2
|
+
import './chunk-YTB3CQKE.js';
|
|
3
|
+
import './chunk-HE2XC52R.js';
|
|
4
|
+
import './chunk-V53ZKCMA.js';
|
|
5
|
+
import './chunk-ZGR7H4XP.js';
|
|
6
|
+
//# sourceMappingURL=panel-MV53FJTG.js.map
|
|
7
|
+
//# sourceMappingURL=panel-MV53FJTG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"panel-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"panel-MV53FJTG.js"}
|
package/dist/panel.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { MapPanelRenderer as default } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { MapPanelRenderer as default } from './chunk-JRVBX3JG.js';
|
|
2
|
+
import './chunk-YTB3CQKE.js';
|
|
3
3
|
import './chunk-HE2XC52R.js';
|
|
4
4
|
import './chunk-V53ZKCMA.js';
|
|
5
5
|
import './chunk-ZGR7H4XP.js';
|
package/dist/register.js
CHANGED
|
@@ -5,8 +5,8 @@ import { registerViewRenderer, registerPanelRenderer } from '@asteby/metacore-ru
|
|
|
5
5
|
function registerMapRenderers(opts = {}) {
|
|
6
6
|
if (opts.config) configureMaps(opts.config);
|
|
7
7
|
const undo = [
|
|
8
|
-
registerViewRenderer("map", () => import('./view-
|
|
9
|
-
registerPanelRenderer("map", () => import('./panel-
|
|
8
|
+
registerViewRenderer("map", () => import('./view-KDQBSTCN.js')),
|
|
9
|
+
registerPanelRenderer("map", () => import('./panel-MV53FJTG.js'))
|
|
10
10
|
];
|
|
11
11
|
if (opts.timeline !== false) undo.push(registerPanelRenderer("timeline", () => import('./timeline-panel-VP476IZJ.js')));
|
|
12
12
|
return () => {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { MapViewRenderer as default } from './chunk-US5QXFDR.js';
|
|
2
|
+
import './chunk-YTB3CQKE.js';
|
|
3
|
+
import './chunk-HE2XC52R.js';
|
|
4
|
+
import './chunk-V53ZKCMA.js';
|
|
5
|
+
import './chunk-ZGR7H4XP.js';
|
|
6
|
+
//# sourceMappingURL=view-KDQBSTCN.js.map
|
|
7
|
+
//# sourceMappingURL=view-KDQBSTCN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"view-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"view-KDQBSTCN.js"}
|
package/dist/view.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { MapViewRenderer as default } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { MapViewRenderer as default } from './chunk-US5QXFDR.js';
|
|
2
|
+
import './chunk-YTB3CQKE.js';
|
|
3
3
|
import './chunk-HE2XC52R.js';
|
|
4
4
|
import './chunk-V53ZKCMA.js';
|
|
5
5
|
import './chunk-ZGR7H4XP.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@asteby/metacore-maps",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Lazy maps for metacore hosts and addons — MapView, markers, clusters, routes, geofences, LocationPicker, TrackingTimeline and the declarative `map`/`timeline` renderers. MapLibre GL loads on demand; no API keys.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -44,11 +44,11 @@
|
|
|
44
44
|
"node": ">=20"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@asteby/storefront": "^0.
|
|
47
|
+
"@asteby/storefront": "^0.13.0"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
|
-
"@asteby/metacore-runtime-react": "^53.
|
|
51
|
-
"@asteby/metacore-sdk": "^3.18.
|
|
50
|
+
"@asteby/metacore-runtime-react": "^53.8.1",
|
|
51
|
+
"@asteby/metacore-sdk": "^3.18.1",
|
|
52
52
|
"maplibre-gl": ">=4",
|
|
53
53
|
"pmtiles": ">=3",
|
|
54
54
|
"react": ">=18",
|
|
@@ -70,8 +70,8 @@
|
|
|
70
70
|
}
|
|
71
71
|
},
|
|
72
72
|
"devDependencies": {
|
|
73
|
-
"@asteby/metacore-runtime-react": "53.
|
|
74
|
-
"@asteby/metacore-sdk": "3.18.
|
|
73
|
+
"@asteby/metacore-runtime-react": "53.8.1",
|
|
74
|
+
"@asteby/metacore-sdk": "3.18.1",
|
|
75
75
|
"@testing-library/react": "^16.3.2",
|
|
76
76
|
"@types/react": "^19.0.0",
|
|
77
77
|
"@types/react-dom": "^19.0.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context.ts","../src/geometry.ts","../src/layers.tsx","../src/map-list.tsx","../src/theme.ts","../src/map-view.tsx"],"names":["React","isValidPoint","jsx","jsxs","React4","React5","Fragment"],"mappings":"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","file":"chunk-KWMP7YH4.js","sourcesContent":["import * as React from 'react'\nimport type * as ML from 'maplibre-gl'\nimport type { MapLibreModule, MapScheme } from './config'\n\nexport interface MapContextValue {\n map: ML.Map\n ml: MapLibreModule\n scheme: MapScheme\n /** Bumps on every `style.load`: layers re-add themselves after a theme switch. */\n styleVersion: number\n reducedMotion: boolean\n}\n\nexport const MapContext = React.createContext<MapContextValue | null>(null)\n\n/** The map of the nearest `<MapView>`; throws outside one (a programming error). */\nexport function useMap(): MapContextValue {\n const v = React.useContext(MapContext)\n if (!v) throw new Error('@asteby/metacore-maps: this component must be rendered inside <MapView>')\n return v\n}\n\n/** Remove a layer/source if present (safe on a map whose style was replaced). */\nexport function removeLayers(map: ML.Map, layerIds: string[], sourceId: string): void {\n try {\n for (const id of layerIds) if (map.getLayer(id)) map.removeLayer(id)\n if (map.getSource(sourceId)) map.removeSource(sourceId)\n } catch {\n /* map already destroyed */\n }\n}\n","// Pure geometry helpers (no MapLibre, no DOM): GeoJSON building, bounds and\n// circle polygons. Distances and point validation come from the single geo\n// module shared with the storefronts (`@asteby/storefront/geo`).\nimport { isValidPoint, type GeoPoint } from '@asteby/storefront/geo'\nimport { colorFor, safeColor } from './palette'\nimport type { MapPointItem, PolygonCoords, ZoneItem } from './types'\n\nexport type LngLatBounds = [[number, number], [number, number]]\n\nexport interface FeatureCollection {\n type: 'FeatureCollection'\n features: Array<{\n type: 'Feature'\n id?: number | string\n properties: Record<string, unknown>\n geometry: { type: string; coordinates: unknown }\n }>\n}\n\n/** `[[west, south], [east, north]]` of the valid points, or null. */\nexport function boundsOf(points: ReadonlyArray<GeoPoint | null | undefined>): LngLatBounds | null {\n let w = Infinity\n let s = Infinity\n let e = -Infinity\n let n = -Infinity\n for (const p of points) {\n if (!isValidPoint(p)) continue\n w = Math.min(w, p.lng)\n e = Math.max(e, p.lng)\n s = Math.min(s, p.lat)\n n = Math.max(n, p.lat)\n }\n return Number.isFinite(w) ? [[w, s], [e, n]] : null\n}\n\n/** Points → GeoJSON with the colour resolved per feature. */\nexport function pointsToGeoJSON(points: MapPointItem[], colors?: Record<string, string>): FeatureCollection {\n return {\n type: 'FeatureCollection',\n features: points\n .filter((p) => isValidPoint(p))\n .map((p) => ({\n type: 'Feature' as const,\n properties: {\n key: p.key,\n label: p.label,\n status: p.status ?? '',\n color: safeColor(p.color) ?? colorFor(p.status, colors),\n },\n geometry: { type: 'Point', coordinates: [p.lng, p.lat] },\n })),\n }\n}\n\nexport function lineToGeoJSON(path: GeoPoint[]): FeatureCollection {\n const coordinates = path.filter((p) => isValidPoint(p)).map((p) => [p.lng, p.lat])\n return {\n type: 'FeatureCollection',\n features: coordinates.length < 2 ? [] : [{ type: 'Feature', properties: {}, geometry: { type: 'LineString', coordinates } }],\n }\n}\n\nconst EARTH_M = 6371008.8\n\n/** Regular polygon approximating a geodesic circle (ring closed, `[lng, lat]`). */\nexport function circlePolygon(center: GeoPoint, radiusM: number, steps = 64): PolygonCoords {\n const lat = (center.lat * Math.PI) / 180\n const lng = (center.lng * Math.PI) / 180\n const d = radiusM / EARTH_M\n const ring: number[][] = []\n for (let i = 0; i <= steps; i++) {\n const brg = (2 * Math.PI * (i % steps)) / steps\n const lat2 = Math.asin(Math.sin(lat) * Math.cos(d) + Math.cos(lat) * Math.sin(d) * Math.cos(brg))\n const lng2 = lng + Math.atan2(Math.sin(brg) * Math.sin(d) * Math.cos(lat), Math.cos(d) - Math.sin(lat) * Math.sin(lat2))\n ring.push([(((lng2 * 180) / Math.PI + 540) % 360) - 180, (lat2 * 180) / Math.PI])\n }\n return [ring]\n}\n\nexport function zonesToGeoJSON(zones: ZoneItem[]): FeatureCollection {\n const features: FeatureCollection['features'] = []\n for (const z of zones) {\n const coords =\n z.polygon && z.polygon.length > 0\n ? z.polygon\n : z.center && isValidPoint(z.center) && (z.radiusM ?? 0) > 0\n ? circlePolygon(z.center, z.radiusM as number)\n : null\n if (!coords) continue\n features.push({\n type: 'Feature',\n properties: { key: z.key, label: z.label ?? '', color: safeColor(z.color) ?? colorFor(z.key) },\n geometry: { type: 'Polygon', coordinates: coords },\n })\n }\n return { type: 'FeatureCollection', features }\n}\n\n/** All vertices of the zones (for fitting the viewport). */\nexport function zonePoints(zones: ZoneItem[]): GeoPoint[] {\n const out: GeoPoint[] = []\n for (const f of zonesToGeoJSON(zones).features) {\n for (const ring of f.geometry.coordinates as number[][][]) {\n for (const c of ring) out.push({ lng: c[0] as number, lat: c[1] as number })\n }\n }\n return out\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport type * as ML from 'maplibre-gl'\nimport { isValidPoint } from '@asteby/storefront/geo'\nimport { removeLayers, useMap } from './context'\nimport { ensureStyles, popupNode, readableOn } from './dom'\nimport { boundsOf, lineToGeoJSON, pointsToGeoJSON, zonePoints, zonesToGeoJSON } from './geometry'\nimport { colorFor, DEFAULT_COLOR, safeColor } from './palette'\nimport type { GeoPoint, MapPointItem, ZoneItem } from './types'\n\n/** Auto-cluster above this many points (DOM markers stay focusable below it). */\nexport const CLUSTER_THRESHOLD = 150\n\n/** Fit the viewport to `points` when their set changes (instant under reduced motion). */\nexport function useFitBounds(points: ReadonlyArray<GeoPoint | null | undefined>, enabled = true, maxZoom = 15): void {\n const { map, reducedMotion } = useMap()\n const valid = points.filter((p): p is GeoPoint => isValidPoint(p))\n const sig = valid.map((p) => `${p.lat},${p.lng}`).join('|')\n React.useEffect(() => {\n if (!enabled) return\n const b = boundsOf(valid)\n if (!b) return\n const duration = reducedMotion ? 0 : 400\n if (b[0][0] === b[1][0] && b[0][1] === b[1][1]) map.easeTo({ center: b[0], zoom: Math.min(14, maxZoom), duration })\n else map.fitBounds(b, { padding: 48, maxZoom, duration })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [map, sig, enabled, reducedMotion, maxZoom])\n}\n\n// --- Marker ---------------------------------------------------------------\n\nexport interface MarkerProps {\n lat: number\n lng: number\n /** Accessible name (required: markers are buttons). */\n label: string\n color?: string\n /** Status key: tints the marker when `color` is not set. */\n status?: string\n /** One or two characters inside the pin (stop number, initial…). */\n glyph?: string\n draggable?: boolean\n selected?: boolean\n /** Popup content (opens on click / Enter / Space). */\n children?: React.ReactNode\n onClick?: () => void\n onDragEnd?: (p: GeoPoint) => void\n}\n\n/** A focusable DOM marker with an optional popup. Keep to a few hundred; use `ClusterLayer` beyond that. */\nexport function Marker(props: MarkerProps): React.ReactElement | null {\n const { map, ml } = useMap()\n const { lat, lng, label, color, status, glyph, draggable, selected, children } = props\n const handlers = React.useRef(props)\n handlers.current = props\n const markerRef = React.useRef<ML.Marker | null>(null)\n const elRef = React.useRef<HTMLButtonElement | null>(null)\n const [popupHost, setPopupHost] = React.useState<HTMLElement | null>(null)\n const hasPopup = children !== undefined && children !== null && children !== false\n\n React.useEffect(() => {\n ensureStyles()\n const el = document.createElement('button')\n el.type = 'button'\n el.className = 'mcm-marker'\n el.addEventListener('click', () => handlers.current.onClick?.())\n elRef.current = el\n const marker = new ml.Marker({ element: el, draggable: !!draggable }).setLngLat([lng, lat]).addTo(map)\n marker.on?.('dragend', () => {\n const ll = marker.getLngLat()\n handlers.current.onDragEnd?.({ lat: ll.lat, lng: ll.lng })\n })\n markerRef.current = marker\n return () => {\n marker.remove()\n markerRef.current = null\n elRef.current = null\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [map, ml, !!draggable])\n\n React.useEffect(() => {\n markerRef.current?.setLngLat([lng, lat])\n }, [lat, lng])\n\n React.useEffect(() => {\n const el = elRef.current\n if (!el) return\n const bg = safeColor(color) ?? colorFor(status)\n el.style.background = bg\n el.style.color = readableOn(bg)\n el.textContent = glyph ?? ''\n el.setAttribute('aria-label', label)\n el.setAttribute('aria-pressed', selected ? 'true' : 'false')\n }, [label, color, status, glyph, selected])\n\n React.useEffect(() => {\n const marker = markerRef.current\n if (!marker || !hasPopup) return\n const host = document.createElement('div')\n const popup = new ml.Popup({ offset: 18, closeButton: true }).setDOMContent(host)\n marker.setPopup(popup)\n setPopupHost(host)\n return () => {\n marker.setPopup(null as unknown as ML.Popup)\n setPopupHost(null)\n }\n }, [ml, map, hasPopup])\n\n return popupHost ? createPortal(children, popupHost) : null\n}\n\n// --- Clustered points -----------------------------------------------------\n\nexport interface ClusterLayerProps {\n points: MapPointItem[]\n /** Group nearby points (default true). Off draws plain circles. */\n cluster?: boolean\n colors?: Record<string, string>\n onSelect?: (item: MapPointItem) => void\n /** Layer id prefix (several layers per map need distinct ids). */\n id?: string\n}\n\n/** WebGL points with native clustering — thousands of features, no DOM per point. */\nexport function ClusterLayer({ points, cluster = true, colors, onSelect, id = 'mcm-points' }: ClusterLayerProps): null {\n const { map, ml, styleVersion } = useMap()\n const latest = React.useRef({ points, colors, onSelect })\n latest.current = { points, colors, onSelect }\n const layerIds = [`${id}-clusters`, `${id}-count`, `${id}-points`]\n\n React.useEffect(() => {\n map.addSource(id, {\n type: 'geojson',\n data: pointsToGeoJSON(latest.current.points, latest.current.colors) as never,\n cluster,\n clusterRadius: 50,\n clusterMaxZoom: 14,\n })\n map.addLayer({\n id: `${id}-clusters`,\n type: 'circle',\n source: id,\n filter: ['has', 'point_count'],\n paint: {\n 'circle-color': DEFAULT_COLOR,\n 'circle-radius': ['step', ['get', 'point_count'], 16, 20, 20, 100, 26],\n 'circle-stroke-width': 3,\n 'circle-stroke-color': '#ffffff',\n },\n })\n if ((map.getStyle() as { glyphs?: string } | undefined)?.glyphs) {\n map.addLayer({\n id: `${id}-count`,\n type: 'symbol',\n source: id,\n filter: ['has', 'point_count'],\n layout: { 'text-field': ['get', 'point_count_abbreviated'], 'text-size': 12 },\n paint: { 'text-color': '#ffffff' },\n })\n }\n map.addLayer({\n id: `${id}-points`,\n type: 'circle',\n source: id,\n filter: ['!', ['has', 'point_count']],\n paint: {\n 'circle-color': ['get', 'color'],\n 'circle-radius': 8,\n 'circle-stroke-width': 2,\n 'circle-stroke-color': '#ffffff',\n },\n })\n const onCluster = async (e: ML.MapLayerMouseEvent) => {\n const f = e.features?.[0]\n const src = map.getSource(id) as ML.GeoJSONSource | undefined\n if (!f || !src) return\n try {\n const zoom = await src.getClusterExpansionZoom(f.properties?.cluster_id as number)\n map.easeTo({ center: (f.geometry as unknown as { coordinates: [number, number] }).coordinates, zoom, duration: 300 })\n } catch {\n /* cluster vanished mid-zoom */\n }\n }\n const onPoint = (e: ML.MapLayerMouseEvent) => {\n const f = e.features?.[0]\n if (!f) return\n const item = latest.current.points.find((p) => p.key === f.properties?.key)\n if (!item) return\n new ml.Popup({ offset: 10 }).setLngLat([item.lng, item.lat]).setDOMContent(popupNode(item.label, [{ value: item.statusLabel ?? item.status ?? '' }, ...(item.details ?? [])])).addTo(map)\n latest.current.onSelect?.(item)\n }\n const pointer = () => (map.getCanvas().style.cursor = 'pointer')\n const arrow = () => (map.getCanvas().style.cursor = '')\n map.on('click', `${id}-clusters`, onCluster)\n map.on('click', `${id}-points`, onPoint)\n for (const l of [`${id}-clusters`, `${id}-points`]) {\n map.on('mouseenter', l, pointer)\n map.on('mouseleave', l, arrow)\n }\n return () => {\n for (const l of [`${id}-clusters`, `${id}-points`]) {\n map.off('mouseenter', l, pointer)\n map.off('mouseleave', l, arrow)\n }\n map.off('click', `${id}-clusters`, onCluster)\n map.off('click', `${id}-points`, onPoint)\n removeLayers(map, layerIds, id)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [map, ml, id, cluster, styleVersion])\n\n React.useEffect(() => {\n ;(map.getSource(id) as ML.GeoJSONSource | undefined)?.setData(pointsToGeoJSON(points, colors) as never)\n }, [map, id, points, colors, styleVersion])\n return null\n}\n\n// --- Polyline / Route -----------------------------------------------------\n\nexport interface PolylineProps {\n path: GeoPoint[]\n color?: string\n width?: number\n dashed?: boolean\n /** Fit the viewport to the path. */\n fit?: boolean\n id?: string\n}\n\n/** A line over ordered points (straight segments: no routing service needed). */\nexport function Polyline({ path, color, width = 4, dashed, fit, id = 'mcm-line' }: PolylineProps): null {\n const { map, styleVersion } = useMap()\n const latest = React.useRef(path)\n latest.current = path\n React.useEffect(() => {\n map.addSource(id, { type: 'geojson', data: lineToGeoJSON(latest.current) as never })\n map.addLayer({\n id,\n type: 'line',\n source: id,\n layout: { 'line-join': 'round', 'line-cap': 'round' },\n paint: {\n 'line-color': safeColor(color) ?? DEFAULT_COLOR,\n 'line-width': width,\n ...(dashed ? { 'line-dasharray': [2, 2] } : {}),\n },\n })\n return () => removeLayers(map, [id], id)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [map, id, color, width, dashed, styleVersion])\n React.useEffect(() => {\n ;(map.getSource(id) as ML.GeoJSONSource | undefined)?.setData(lineToGeoJSON(path) as never)\n }, [map, id, path, styleVersion])\n useFitBounds(path, !!fit)\n return null\n}\n\nexport interface RouteProps extends PolylineProps {\n /** Numbered stop markers along the path (default true). */\n stops?: boolean\n /** Accessible name of each stop: `${stopLabel} ${n}`. Default \"Parada\". */\n stopLabel?: string\n}\n\n/** A route: the line plus numbered, focusable stops (the list alternative gets them as points). */\nexport function Route({ path, stops = true, stopLabel = 'Parada', ...line }: RouteProps): React.ReactElement {\n const valid = path.filter((p) => isValidPoint(p))\n return (\n <>\n <Polyline path={valid} {...line} />\n {stops\n ? valid.map((p, i) => (\n <Marker key={`${p.lat},${p.lng},${i}`} lat={p.lat} lng={p.lng} glyph={String(i + 1)} label={`${stopLabel} ${i + 1}`} color={safeColor(line.color)} />\n ))\n : null}\n </>\n )\n}\n\n// --- Geofence -------------------------------------------------------------\n\nexport interface GeofenceProps {\n zones: ZoneItem[]\n fit?: boolean\n opacity?: number\n onSelect?: (zone: ZoneItem) => void\n id?: string\n}\n\n/** Coverage zones: polygons and/or circles (`center` + `radiusM`). */\nexport function Geofence({ zones, fit, opacity = 0.18, onSelect, id = 'mcm-zones' }: GeofenceProps): null {\n const { map, ml, styleVersion } = useMap()\n const latest = React.useRef({ zones, onSelect })\n latest.current = { zones, onSelect }\n React.useEffect(() => {\n map.addSource(id, { type: 'geojson', data: zonesToGeoJSON(latest.current.zones) as never })\n map.addLayer({ id: `${id}-fill`, type: 'fill', source: id, paint: { 'fill-color': ['get', 'color'], 'fill-opacity': opacity } })\n map.addLayer({ id: `${id}-line`, type: 'line', source: id, paint: { 'line-color': ['get', 'color'], 'line-width': 2 } })\n const onClick = (e: ML.MapLayerMouseEvent) => {\n const key = e.features?.[0]?.properties?.key\n const z = latest.current.zones.find((x) => x.key === key)\n if (!z) return\n if (z.label) new ml.Popup().setLngLat(e.lngLat).setDOMContent(popupNode(z.label)).addTo(map)\n latest.current.onSelect?.(z)\n }\n map.on('click', `${id}-fill`, onClick)\n return () => {\n map.off('click', `${id}-fill`, onClick)\n removeLayers(map, [`${id}-fill`, `${id}-line`], id)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [map, ml, id, opacity, styleVersion])\n React.useEffect(() => {\n ;(map.getSource(id) as ML.GeoJSONSource | undefined)?.setData(zonesToGeoJSON(zones) as never)\n }, [map, id, zones, styleVersion])\n useFitBounds(React.useMemo(() => (fit ? zonePoints(zones) : []), [fit, zones]), !!fit)\n return null\n}\n","import * as React from 'react'\nimport { distanceKm, formatDistance, type GeoPoint } from '@asteby/storefront/geo'\nimport { openInMapHref } from './dom'\nimport type { MapLabels, MapPointItem } from './types'\n\nexport interface MapListProps {\n items: MapPointItem[]\n labels: MapLabels\n selectedKey?: string | null\n /** Show the distance from here next to each item. */\n origin?: GeoPoint | null\n locale?: string\n onSelect?: (item: MapPointItem) => void\n id?: string\n}\n\n/**\n * The accessible equivalent of the map: every point as a keyboard-reachable\n * list item with its status written out and an \"open in map\" link. It is the\n * only view when WebGL or MapLibre are unavailable.\n */\nexport function MapList({ items, labels, selectedKey, origin, locale, onSelect, id }: MapListProps): React.ReactElement {\n if (items.length === 0) {\n return (\n <p id={id} role=\"status\" data-testid=\"map-empty\" style={{ padding: '16px 0', textAlign: 'center', opacity: 0.7 }}>\n {labels.empty}\n </p>\n )\n }\n return (\n <ul id={id} aria-label={labels.list} data-testid=\"map-list\" style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n {items.map((it) => {\n const sub = [\n it.statusLabel ?? it.status,\n ...(it.details ?? []).map((d) => (d.label ? `${d.label}: ${d.value}` : d.value)),\n origin ? formatDistance(distanceKm(origin, it), locale) : '',\n ].filter(Boolean)\n return (\n <li key={it.key} data-selected={selectedKey === it.key || undefined} style={{ display: 'flex', gap: 12, padding: '8px 0', borderBottom: '1px solid rgba(128,128,128,.25)' }}>\n <div style={{ minWidth: 0, flex: 1 }}>\n {onSelect ? (\n <button type=\"button\" aria-pressed={selectedKey === it.key} onClick={() => onSelect(it)} style={{ all: 'unset', cursor: 'pointer', fontWeight: 600, textDecoration: 'underline', textUnderlineOffset: 3 }}>\n {it.label}\n </button>\n ) : (\n <strong>{it.label}</strong>\n )}\n {sub.length > 0 ? <div style={{ fontSize: 12, opacity: 0.75 }}>{sub.join(' · ')}</div> : null}\n </div>\n <a href={openInMapHref(it.lat, it.lng)} target=\"_blank\" rel=\"noopener noreferrer\" aria-label={`${labels.openInMap}: ${it.label}`} style={{ fontSize: 12, flexShrink: 0 }}>\n {labels.openInMap}\n </a>\n </li>\n )\n })}\n </ul>\n )\n}\n","import * as React from 'react'\nimport type { MapScheme } from './config'\n\nfunction detect(): MapScheme {\n if (typeof document === 'undefined') return 'light'\n const root = document.documentElement\n const attr = root.getAttribute('data-theme')\n if (attr === 'dark' || attr === 'light') return attr\n if (root.classList.contains('dark')) return 'dark'\n if (root.classList.contains('light')) return 'light'\n return typeof matchMedia === 'function' && matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\n/**\n * Colour scheme the map follows: the host's `.dark` class / `data-theme`\n * (the metacore theme package sets them), else the OS preference. `theme`\n * pins it. Re-evaluates when the class/attribute or the OS setting changes.\n */\nexport function useMapScheme(theme: MapScheme | 'auto' = 'auto'): MapScheme {\n const [scheme, setScheme] = React.useState<MapScheme>(theme === 'auto' ? detect : theme)\n React.useEffect(() => {\n if (theme !== 'auto') {\n setScheme(theme)\n return\n }\n const update = () => setScheme(detect())\n update()\n const mo = new MutationObserver(update)\n mo.observe(document.documentElement, { attributes: true, attributeFilter: ['class', 'data-theme'] })\n const mq = typeof matchMedia === 'function' ? matchMedia('(prefers-color-scheme: dark)') : null\n mq?.addEventListener?.('change', update)\n return () => {\n mo.disconnect()\n mq?.removeEventListener?.('change', update)\n }\n }, [theme])\n return scheme\n}\n\nexport function prefersReducedMotion(): boolean {\n return typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n","import * as React from 'react'\nimport type * as ML from 'maplibre-gl'\nimport { isValidPoint } from '@asteby/storefront/geo'\nimport {\n ensureProtocols,\n getMapsConfig,\n loadMaplibre,\n resolveStyle,\n supportsWebGL,\n type MapLibreModule,\n type MapScheme,\n type MapStyle,\n} from './config'\nimport { MapContext, type MapContextValue } from './context'\nimport { ensureStyles } from './dom'\nimport { CLUSTER_THRESHOLD, ClusterLayer, Marker, useFitBounds } from './layers'\nimport { MapList } from './map-list'\nimport { prefersReducedMotion, useMapScheme } from './theme'\nimport { mergeLabels, type GeoPoint, type MapLabels, type MapPointItem } from './types'\n\nexport interface MapViewProps {\n /** Features to draw. They also feed the list alternative. */\n points?: MapPointItem[]\n /** Cluster the points (default: automatic above 150). */\n cluster?: boolean\n /** Status key → colour overrides (e.g. from the model's option colours). */\n colors?: Record<string, string>\n /** Fit the viewport to the points when they change (default true). */\n fit?: boolean\n center?: [number, number]\n zoom?: number\n /** `auto` follows the host theme (`.dark` / `data-theme`) or the OS. */\n theme?: MapScheme | 'auto'\n /** Style override: URL / object, or one per scheme. Default: `configureMaps({ style })`. */\n mapStyle?: MapStyle | { light?: MapStyle; dark?: MapStyle }\n height?: number | string\n className?: string\n ariaLabel?: string\n labels?: Partial<MapLabels>\n selectedKey?: string | null\n onSelect?: (item: MapPointItem) => void\n /** Click on the empty map (e.g. a picker). */\n onMapClick?: (p: GeoPoint) => void\n /** Show the \"Ver lista\" toggle (default true; the list is still the fallback when the map cannot render). */\n listToggle?: boolean\n /** Extra content in the list region (e.g. zone names). */\n listExtra?: React.ReactNode\n locale?: string\n /** Layers and markers: `<Route>`, `<Polyline>`, `<Geofence>`, `<Marker>`… */\n children?: React.ReactNode\n}\n\ntype Status = 'loading' | 'ready' | 'unavailable'\n\nfunction PointsLayer({ points, cluster, colors, selectedKey, onSelect, fit }: Pick<MapViewProps, 'points' | 'cluster' | 'colors' | 'selectedKey' | 'onSelect' | 'fit'>) {\n const pts = React.useMemo(() => (points ?? []).filter((p) => isValidPoint(p)), [points])\n useFitBounds(pts, fit !== false)\n const clustered = cluster ?? pts.length > CLUSTER_THRESHOLD\n if (clustered) return <ClusterLayer points={pts} colors={colors} onSelect={onSelect} />\n return (\n <>\n {pts.map((p) => (\n <Marker\n key={p.key}\n lat={p.lat}\n lng={p.lng}\n label={p.statusLabel ?? p.status ? `${p.label}, ${p.statusLabel ?? p.status}` : p.label}\n status={p.status}\n color={p.color ?? (p.status ? colors?.[p.status] : undefined)}\n glyph={p.glyph}\n selected={selectedKey === p.key}\n onClick={() => onSelect?.(p)}\n >\n <strong style={{ display: 'block' }}>{p.label}</strong>\n {p.statusLabel ?? p.status ? <span style={{ display: 'block' }}>{p.statusLabel ?? p.status}</span> : null}\n {(p.details ?? []).map((d, i) => (\n <span key={i} style={{ display: 'block' }}>\n {d.label ? `${d.label}: ${d.value}` : d.value}\n </span>\n ))}\n </Marker>\n ))}\n </>\n )\n}\n\n/**\n * Interactive map. MapLibre loads on first mount (never in your first paint),\n * the base map comes from `configureMaps({ style })` (no keys), and a list\n * with the same features is always one click away — and the only view when\n * WebGL is missing.\n */\nexport function MapView(props: MapViewProps): React.ReactElement {\n const { points, theme = 'auto', mapStyle, height = 360, className, ariaLabel, listToggle = true, listExtra, locale, children } = props\n const labels = React.useMemo(() => mergeLabels(props.labels), [props.labels])\n const scheme = useMapScheme(theme)\n const [status, setStatus] = React.useState<Status>('loading')\n const [handle, setHandle] = React.useState<{ map: ML.Map; ml: MapLibreModule } | null>(null)\n const [styleVersion, setStyleVersion] = React.useState(0)\n const [showList, setShowList] = React.useState(false)\n const [selected, setSelected] = React.useState<string | null>(props.selectedKey ?? null)\n const container = React.useRef<HTMLDivElement | null>(null)\n const live = React.useRef({ scheme, mapStyle, onMapClick: props.onMapClick })\n live.current = { scheme, mapStyle, onMapClick: props.onMapClick }\n const reducedMotion = React.useMemo(() => prefersReducedMotion(), [])\n const listId = React.useId()\n\n React.useEffect(() => {\n if (props.selectedKey !== undefined) setSelected(props.selectedKey)\n }, [props.selectedKey])\n\n React.useEffect(() => {\n const el = container.current\n if (!el) return\n if (!supportsWebGL()) {\n setStatus('unavailable')\n return\n }\n ensureStyles()\n let cancelled = false\n let map: ML.Map | null = null\n loadMaplibre()\n .then(async (ml) => {\n const style = resolveStyle(live.current.scheme, live.current.mapStyle)\n await ensureProtocols(ml, style)\n if (cancelled) return\n const cfg = getMapsConfig()\n map = new ml.Map({\n container: el,\n style,\n center: props.center ?? cfg.center ?? [-102.5, 23.6],\n zoom: props.zoom ?? cfg.zoom ?? 4,\n attributionControl: false,\n })\n map.addControl(new ml.NavigationControl({ showCompass: false }), 'top-right')\n map.addControl(new ml.AttributionControl({ compact: true, customAttribution: cfg.attribution }))\n map.on('style.load', () => setStyleVersion((v) => v + 1))\n map.on('click', (e: ML.MapMouseEvent) => {\n const cb = live.current.onMapClick\n if (cb && !(e as { defaultPrevented?: boolean }).defaultPrevented) cb({ lat: e.lngLat.lat, lng: e.lngLat.lng })\n })\n const m = map\n m.once('load', () => {\n if (cancelled) return\n setHandle({ map: m, ml })\n setStatus('ready')\n })\n })\n .catch(() => !cancelled && setStatus('unavailable'))\n return () => {\n cancelled = true\n setHandle(null)\n map?.remove()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // Theme switch: swap the base style; layers re-add on `style.load`.\n const firstScheme = React.useRef(scheme)\n React.useEffect(() => {\n if (firstScheme.current === scheme || !handle) return\n firstScheme.current = scheme\n const style = resolveStyle(scheme, mapStyle)\n void ensureProtocols(handle.ml, style).then(() => handle.map.setStyle(style, { diff: false }))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scheme, handle])\n\n const ctx = React.useMemo<MapContextValue | null>(\n () => (handle ? { map: handle.map, ml: handle.ml, scheme, styleVersion, reducedMotion } : null),\n [handle, scheme, styleVersion, reducedMotion],\n )\n\n const select = React.useCallback(\n (item: MapPointItem) => {\n setSelected(item.key)\n props.onSelect?.(item)\n handle?.map.easeTo({ center: [item.lng, item.lat], zoom: Math.max(handle.map.getZoom(), 13), duration: reducedMotion ? 0 : 400 })\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [handle, reducedMotion, props.onSelect],\n )\n\n const unavailable = status === 'unavailable'\n const listVisible = unavailable || showList\n const items = React.useMemo(() => (points ?? []).filter((p) => isValidPoint(p)), [points])\n\n return (\n <div className={['mcm-root', scheme === 'dark' ? 'mcm-dark' : '', className].filter(Boolean).join(' ')} data-testid=\"metacore-map\" data-status={status} data-scheme={scheme}>\n {unavailable ? (\n <p role=\"status\" data-testid=\"map-unavailable\" style={{ margin: '0 0 8px', fontSize: 13, opacity: 0.8 }}>\n {labels.unavailable}\n </p>\n ) : (\n <div style={{ position: 'relative', height, width: '100%' }}>\n <div ref={container} role=\"region\" aria-label={ariaLabel ?? labels.map} aria-busy={status === 'loading'} style={{ position: 'absolute', inset: 0, borderRadius: 8, overflow: 'hidden' }} />\n {status === 'loading' ? (\n <p role=\"status\" style={{ position: 'absolute', inset: 0, display: 'grid', placeItems: 'center', margin: 0, pointerEvents: 'none', fontSize: 13, opacity: 0.7 }}>\n {labels.loading}\n </p>\n ) : null}\n </div>\n )}\n {ctx ? (\n <MapContext.Provider value={ctx}>\n <PointsLayer points={points} cluster={props.cluster} colors={props.colors} selectedKey={selected} onSelect={select} fit={props.fit} />\n {children}\n </MapContext.Provider>\n ) : null}\n {listToggle && !unavailable ? (\n <button type=\"button\" aria-expanded={showList} aria-controls={listId} onClick={() => setShowList((v) => !v)} style={{ marginTop: 8, fontSize: 13 }}>\n {showList ? labels.hideList : labels.showList}\n </button>\n ) : null}\n {listVisible ? (\n <div id={listId} style={{ marginTop: 8 }}>\n <MapList items={items} labels={labels} selectedKey={selected} locale={locale} onSelect={unavailable ? undefined : select} />\n {listExtra}\n </div>\n ) : null}\n </div>\n )\n}\n"]}
|
package/dist/panel-MGLCA6A7.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export { MapPanelRenderer as default } from './chunk-BZP7NBAA.js';
|
|
2
|
-
import './chunk-KWMP7YH4.js';
|
|
3
|
-
import './chunk-HE2XC52R.js';
|
|
4
|
-
import './chunk-V53ZKCMA.js';
|
|
5
|
-
import './chunk-ZGR7H4XP.js';
|
|
6
|
-
//# sourceMappingURL=panel-MGLCA6A7.js.map
|
|
7
|
-
//# sourceMappingURL=panel-MGLCA6A7.js.map
|
package/dist/view-6J5UPM2C.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export { MapViewRenderer as default } from './chunk-VH26MQFN.js';
|
|
2
|
-
import './chunk-KWMP7YH4.js';
|
|
3
|
-
import './chunk-HE2XC52R.js';
|
|
4
|
-
import './chunk-V53ZKCMA.js';
|
|
5
|
-
import './chunk-ZGR7H4XP.js';
|
|
6
|
-
//# sourceMappingURL=view-6J5UPM2C.js.map
|
|
7
|
-
//# sourceMappingURL=view-6J5UPM2C.js.map
|