mahal_map 2.1.0 → 2.2.2

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 CHANGED
@@ -281,7 +281,7 @@ map.setStyle("light"); // → navigator-light
281
281
  | `traffic` | `boolean \| { raster?, rasterMaxZoom?, graph?, opacity?, arrows? }` | `false` | Слой пробок. `raster: true` — картинкой вместо векторного слоя. |
282
282
  | `indoor` | `boolean \| { level? }` | `false` | Планы этажей. |
283
283
  | `closures` | `boolean \| object` | `false` | Перекрытия дорог. |
284
- | `places` | `object` | — | Парковки, заправки, зарядки: `highlight`, `paid`, `free`, `unknown`. |
284
+ | `places` | `object` | — | Парковки, заправки, зарядки: `highlight`, `paid`, `free`, `unknown`, `fillOpacity` (0.10.0+). |
285
285
  | `minZoom` | `number` | `16` | Зум появления объёма. |
286
286
  | `lodBias` | `number` | `1` | `0` — всегда детальная геометрия, `1` — упрощённая вдали. |
287
287
  | `memoryBudget` | `number` | `30` | Сколько 3D-моделей держать в памяти. |
@@ -341,7 +341,16 @@ MahalMap.create(
341
341
  | `active` | что нарисовано прямо сейчас (память SDK) |
342
342
  | `rendered` | факт со стороны карты: слой есть в стиле и не погашен |
343
343
 
344
- `rendered` появилось в Maps3D 0.8.0; у сборок постарше его нет (`undefined`). Расхождение `active !== rendered` означает, что внутренний признак SDK разошёлся с картой — это видно одной проверкой, без чтения минифицированной сборки.
344
+ `rendered` появилось в Maps3D 0.8.0; у сборок постарше его нет (`undefined`). Расхождение `active !== rendered` означает, что внутренний признак SDK разошёлся с картой — это видно одной проверкой, без чтения минифицированной сборки. Сравнивать поля можно только когда `rendered` есть — иначе на старой сборке любой активный слой покажется расхождением:
345
+
346
+ ```ts
347
+ const state = map.getLayerState("terrain");
348
+
349
+ // rendered === undefined — Maps3D < 0.8.0, проверка недоступна
350
+ if (state?.rendered !== undefined && state.active !== state.rendered) {
351
+ reportLayerMismatch(state);
352
+ }
353
+ ```
345
354
 
346
355
  Слой может быть включён и при этом не нарисован — и это не ошибка:
347
356
 
@@ -392,6 +401,12 @@ map.setLayer("parking", true, {
392
401
  });
393
402
  ```
394
403
 
404
+ Площадные парковки рисуются тремя слоями по одной геометрии: заливка в цвете подтипа, мягкая внутренняя кромка (с z14) и волосяной кант. Цвета: янтарь — платно, зелёный — бесплатно, сланцевый — неизвестно. Размеры заданы в экранных пикселях и от зума плитки не зависят.
405
+
406
+ Заливку включает только режим поиска — `highlight: true`. Без него подключение Maps3D облик карты не меняет. Постоянную плотность заливки вместо кривой по зуму задаёт `maps3d.places.fillOpacity`.
407
+
408
+ Наведение, клик и справка по участку — в разделе [Парковки: наведение, клик, справка](#парковки-наведение-клик-справка).
409
+
395
410
  #### Рельеф
396
411
 
397
412
  `auto` показывает рельеф на обзорных зумах, `on` — всегда. Режим `on` заметно дороже по трафику и времени кадра, чем `auto`.
@@ -558,6 +573,79 @@ map.setHoverEnabled(false); // подписка сохраняется
558
573
 
559
574
  Цену ограничивает сам SDK: разбор не чаще раза в кадр, пропускается во время движения карты и не трогает сцену, пока курсор на том же доме. Но разбор — это чтение пикселя обратно из GPU, поэтому на слабых устройствах наведение лучше не включать.
560
575
 
576
+ ### Парковки: наведение, клик, справка
577
+
578
+ > Нужен `@grammaps/maps3d-web` **0.10.0+**. На более старой сборке методы ничего не делают и возвращают пустые значения (`false`, `null`).
579
+
580
+ Устроено как у зданий: приложение задаёт облик и получает уведомления, подсветку и курсор рисует SDK.
581
+
582
+ ```ts
583
+ // Режим поиска: заливка по подтипу
584
+ map.setLayer("parking", true, { highlight: true });
585
+
586
+ map.setParkingHoverStyle({ opacity: 0.6, outlineWidth: 2.4, cursor: "pointer" });
587
+
588
+ map.onParkingHover((p) => {
589
+ tooltip.textContent = p ? p.subtype : "";
590
+ });
591
+
592
+ map.onParkingClick((p) => {
593
+ if (!p) return;
594
+ openCard(p); // { id, subtype, fee, access, kind, capacity, props }
595
+ });
596
+
597
+ // Подсветить со строки списка и погасить
598
+ row.onmouseenter = () => map.hoverParking(osmId);
599
+ row.onmouseleave = () => map.hoverParking(null);
600
+
601
+ // Справка по точке холста (e.point события карты), допуск 4 px
602
+ map.getMap().on("contextmenu", (e) => console.log(map.parkingAt(e.point, 4)));
603
+ ```
604
+
605
+ | Метод | Описание |
606
+ | ---------------------------------- | ------------------------------------------------------------------------------------------------- |
607
+ | `onParkingHover(callback \| null)` | Участок под курсором либо `null`. Зовётся **только при смене участка**. `null` — отписаться и погасить. |
608
+ | `setParkingHoverStyle(style)` | Облик подсветки: `color`, `opacity`, `outlineColor`, `outlineWidth`, `cursor`. |
609
+ | `setParkingHoverEnabled(enabled)` | Выключить/включить наведение, не теряя подписку. |
610
+ | `parkingHoverEnabled` | Геттер: включено ли наведение. |
611
+ | `hoverParking(id \| null)` | Подсветить участок программно по `osm_id`; `null` — погасить. `false` — участка нет в данных. |
612
+ | `hoveredParking()` | `osm_id` подсвеченного участка или `null`. |
613
+ | `onParkingClick(callback \| null)` | Клик по участку: справка либо `null`. `null` вместо колбэка — отписаться. |
614
+ | `parkingAt(point, tolPx?)` | Справка по точке холста. Допуск по умолчанию `0` — строго внутрь участка. |
615
+
616
+ Облик подсветки (`IMaps3DParkingHoverStyle`):
617
+
618
+ | Поле | По умолч. | Описание |
619
+ | -------------- | ------------ | ------------------------------------------------------------------------------------------ |
620
+ | `color` | цвет подтипа | Цвет заливки под курсором. По умолчанию не меняется намеренно — подтип уже покрашен смыслом. |
621
+ | `opacity` | `0.55` | Непрозрачность заливки под курсором. |
622
+ | `outlineColor` | кант подтипа | Цвет канта под курсором. |
623
+ | `outlineWidth` | `2.2` | Во сколько раз толще кант под курсором. |
624
+ | `cursor` | `"pointer"` | CSS-курсор над парковкой; `null` — не трогать. |
625
+
626
+ Справка (`IMaps3DParkingInfo`) — ровно то, что лежит в тайле. Отсутствующий атрибут — `null`.
627
+
628
+ | Поле | Тип | Описание |
629
+ | ---------- | -------------------------------- | --------------------------------------------------------------------- |
630
+ | `id` | `number \| string` | `osm_id` участка — тот же, что принимает `hoverParking()`. |
631
+ | `subtype` | `"paid" \| "free" \| "unknown"` | Платность. `unknown` значит «не указано», а **не** «бесплатно». |
632
+ | `fee` | `string \| null` | Исходное `fee` (`yes`/`no`). |
633
+ | `access` | `string \| null` | Кому можно: `residents`, `private`, `customers`, `permissive`… |
634
+ | `kind` | `string \| null` | OSM `parking=*`: `surface`, `multi-storey`, `underground`, `rooftop`… |
635
+ | `capacity` | `number \| null` | Число мест. |
636
+ | `props` | `Record<string, unknown>` | Все свойства фичи как есть. |
637
+
638
+ Поведение:
639
+
640
+ - Попадание определяется по границе полигона, а не по расстоянию до центра.
641
+ - Колбэк наведения вызывается при смене участка, не на каждое движение мыши. Разбор идёт не чаще раза в кадр и пропускается, пока карта движется.
642
+ - Подписка на наведение или клик поднимает слой заливки, даже когда режим поиска выключен, — по нему идёт опрос. Красить в этом случае слой ничего не будет.
643
+
644
+ Ограничения:
645
+
646
+ - Графика работы нет: `opening_hours` в слое `landuse` отсутствует.
647
+ - Названия у площадных парковок нет — оно бывает только у точек POI.
648
+
561
649
  #### Вкл/выкл 3D-здания на лету
562
650
 
563
651
  Переключение объём ⇄ штатные здания стиля, без пересоздания карты. Умеет поднять слой, если его не было (`enable3D: false` при создании):
@@ -1175,6 +1263,15 @@ MahalMap.clearSelection(map);
1175
1263
  MahalMap.onRoadClick(map, (road) => console.log(road?.name));
1176
1264
  MahalMap.roadAt(map, { x: 320, y: 240 });
1177
1265
 
1266
+ // Парковки
1267
+ MahalMap.setParkingHoverStyle(map, { opacity: 0.6, outlineWidth: 2.4 });
1268
+ MahalMap.onParkingHover(map, (p) => console.log(p?.subtype));
1269
+ MahalMap.setParkingHoverEnabled(map, false);
1270
+ MahalMap.hoverParking(map, 123456789);
1271
+ MahalMap.hoveredParking(map);
1272
+ MahalMap.onParkingClick(map, (p) => console.log(p?.id));
1273
+ MahalMap.parkingAt(map, { x: 320, y: 240 }, 4);
1274
+
1178
1275
  // Наведение на здание (Maps3D 0.8.0)
1179
1276
  MahalMap.onBuildingHover(map, (b) => console.log(b?.id));
1180
1277
  MahalMap.setHoverStyle(map, { color: "#6b9ed1", cursor: "pointer" });
@@ -1239,6 +1336,13 @@ MahalMap.setZoom(map, 14);
1239
1336
  | `setSelectionStyle(instance, style)` | Облик выделения. |
1240
1337
  | `onRoadClick(instance, callback)` | Клик по дороге. |
1241
1338
  | `roadAt(instance, point, tolPx?)` | Дорога под точкой холста. |
1339
+ | `onParkingHover(instance, callback \| null)` | Парковка под курсором (только при смене участка). |
1340
+ | `setParkingHoverStyle(instance, style)` | Облик подсветки парковки. |
1341
+ | `setParkingHoverEnabled(instance, enabled)` | Вкл/выкл наведение на парковки, не теряя подписку. |
1342
+ | `hoverParking(instance, id \| null)` | Подсветить парковку программно по `osm_id`. |
1343
+ | `hoveredParking(instance)` | `osm_id` подсвеченной парковки или `null`. |
1344
+ | `onParkingClick(instance, callback \| null)` | Клик по парковке. |
1345
+ | `parkingAt(instance, point, tolPx?)` | Справка о парковке под точкой холста. |
1242
1346
  | `onBuildingHover(instance, cb)` | Подписка на наведение (Maps3D 0.8.0); `null` отписывает. |
1243
1347
  | `setHoverStyle(instance, style)` | Облик наведения, включая CSS-курсор. |
1244
1348
  | `setHoverEnabled(instance, on)` | Вкл/выкл наведение, не трогая подписку. |
package/dist/index.d.mts CHANGED
@@ -23,7 +23,7 @@ interface IAdditionalParamType {
23
23
  /**
24
24
  * Поверхность @grammaps/maps3d-web, описанная локально. Пакет в зависимости не ставится —
25
25
  * он приходит снаружи, как и maplibre-gl, поэтому импортировать его типы нельзя. Здесь
26
- * повторена публичная часть .d.ts версии 0.7.3; всё необязательное помечено `?`, чтобы
26
+ * повторена публичная часть .d.ts версии 0.10.0; всё необязательное помечено `?`, чтобы
27
27
  * более старая сборка на странице не ломала типы у потребителя.
28
28
  */
29
29
  type Maps3DThemeName = "light" | "dark" | "navigator-light" | "navigator-dark" | "mobile-light" | "mobile-dark";
@@ -124,6 +124,41 @@ interface IMaps3DRoadHit {
124
124
  props: Record<string, unknown>;
125
125
  distancePx: number;
126
126
  }
127
+ /** Платность парковки: по ней участок и покрашен. */
128
+ type Maps3DParkingSubtype = "paid" | "free" | "unknown";
129
+ /**
130
+ * Справка о площадной парковке — ровно то, что есть в тайле. Отсутствующий атрибут — `null`.
131
+ * Графика работы и названия здесь нет: в слое `landuse` их не бывает.
132
+ */
133
+ interface IMaps3DParkingInfo {
134
+ /** `osm_id` участка — он же идентификатор для hoverParking(). */
135
+ id: number | string;
136
+ /** `unknown` значит «не указано», а не «бесплатно». */
137
+ subtype: Maps3DParkingSubtype;
138
+ /** Исходное `fee` из тайла (`yes`/`no`). */
139
+ fee: string | null;
140
+ /** Кому можно: `yes`, `private`, `customers`, `residents`, `permissive`, `no`… */
141
+ access: string | null;
142
+ /** OSM `parking=*`: `surface`, `multi-storey`, `underground`, `rooftop`… */
143
+ kind: string | null;
144
+ /** Число мест. */
145
+ capacity: number | null;
146
+ /** Все свойства фичи как есть. */
147
+ props: Record<string, unknown>;
148
+ }
149
+ /** Облик парковки под курсором. Не заданные цвета остаются цветами подтипа. */
150
+ interface IMaps3DParkingHoverStyle {
151
+ /** Цвет заливки. Не задан — цвет подтипа. */
152
+ color?: string | null;
153
+ /** Непрозрачность заливки. По умолчанию 0.55. */
154
+ opacity?: number;
155
+ /** Цвет канта. Не задан — кант подтипа. */
156
+ outlineColor?: string | null;
157
+ /** Во сколько раз толще кант. По умолчанию 2.2. */
158
+ outlineWidth?: number;
159
+ /** CSS-курсор над парковкой. По умолчанию `pointer`; `null` — не трогать. */
160
+ cursor?: string | null;
161
+ }
127
162
  interface IMaps3DTrafficOptions {
128
163
  raster?: boolean;
129
164
  rasterMaxZoom?: number;
@@ -145,6 +180,11 @@ interface IMaps3DClosuresOptions {
145
180
  }
146
181
  interface IMaps3DPlacesOptions {
147
182
  highlight?: boolean;
183
+ /**
184
+ * Непрозрачность заливки парковок в режиме выделения. Не задана — кривая по зуму;
185
+ * заданная перебивает её постоянным значением на всех зумах. С 0.10.0.
186
+ */
187
+ fillOpacity?: number;
148
188
  paid?: boolean;
149
189
  free?: boolean;
150
190
  unknown?: boolean;
@@ -190,10 +230,13 @@ interface IMaps3DBuildingsController {
190
230
  }
191
231
  interface IMaps3DBuildingClickInfo {
192
232
  id: string | number;
193
- /** Атрибуты объекта; `props.osm_id` — идентификатор, который не меняется. */
194
- props: Record<string, unknown>;
195
- /** Высота здания в метрах. */
196
- height: number;
233
+ /**
234
+ * Атрибуты объекта; `props.osm_id` — идентификатор, который не меняется.
235
+ * Необязательно: peerDependency допускает сборки Maps3D от 0.5.0, где поля может не быть.
236
+ */
237
+ props?: Record<string, unknown>;
238
+ /** Высота здания в метрах. Необязательно по той же причине, что и `props`. */
239
+ height?: number;
197
240
  /** Порядковый номер внутри сцены. Живёт до ближайшей пересборки геометрии. */
198
241
  index?: number;
199
242
  [key: string]: unknown;
@@ -240,6 +283,17 @@ interface IMaps3DLayer {
240
283
  y: number;
241
284
  }, tolerancePx?: number): IMaps3DRoadHit | null;
242
285
  readonly roadsNamed?: boolean;
286
+ parkingAt?(point: {
287
+ x: number;
288
+ y: number;
289
+ }, tolerancePx?: number): IMaps3DParkingInfo | null;
290
+ onParkingHover?(callback: ((info: IMaps3DParkingInfo | null) => void) | null): void;
291
+ setParkingHoverStyle?(style: IMaps3DParkingHoverStyle): void;
292
+ setParkingHoverEnabled?(enabled: boolean): void;
293
+ readonly parkingHoverEnabled?: boolean;
294
+ hoverParking?(id: number | string | null): boolean;
295
+ hoveredParking?(): number | string | null;
296
+ onParkingClick?(callback: ((info: IMaps3DParkingInfo | null) => void) | null): void;
243
297
  traffic?: boolean;
244
298
  trafficRaster?: boolean;
245
299
  setTraffic?(enabled: boolean): void;
@@ -564,6 +618,16 @@ declare class MahalMap {
564
618
  x: number;
565
619
  y: number;
566
620
  }, tolerancePx?: number): IMaps3DRoadHit | null;
621
+ static onParkingHover(instance: MahalMap, callback: ((info: IMaps3DParkingInfo | null) => void) | null): void;
622
+ static setParkingHoverStyle(instance: MahalMap, style: IMaps3DParkingHoverStyle): void;
623
+ static setParkingHoverEnabled(instance: MahalMap, enabled: boolean): void;
624
+ static hoverParking(instance: MahalMap, id: number | string | null): boolean;
625
+ static hoveredParking(instance: MahalMap): string | number | null;
626
+ static onParkingClick(instance: MahalMap, callback: ((info: IMaps3DParkingInfo | null) => void) | null): void;
627
+ static parkingAt(instance: MahalMap, point: {
628
+ x: number;
629
+ y: number;
630
+ }, tolerancePx?: number): IMaps3DParkingInfo | null;
567
631
  static onBuildingHover(instance: MahalMap, callback: ((info: IMaps3DBuildingClickInfo | null) => void) | null): void;
568
632
  static setHoverEnabled(instance: MahalMap, enabled: boolean): void;
569
633
  static setHoverStyle(instance: MahalMap, style: IMaps3DHoverStyle): void;
@@ -670,6 +734,31 @@ declare class MahalMap {
670
734
  }, tolerancePx?: number): IMaps3DRoadHit | null;
671
735
  /** Есть ли в текущем стиле названия дорог. Нет — roadAt() всегда вернёт null. */
672
736
  get roadsNamed(): boolean;
737
+ /**
738
+ * Участок под курсором либо null. Зовётся ТОЛЬКО при смене участка, не на каждое
739
+ * движение мыши. `null` вместо колбэка — отписаться и погасить подсветку.
740
+ */
741
+ onParkingHover(callback: ((info: IMaps3DParkingInfo | null) => void) | null): void;
742
+ /** Облик подсветки: color, opacity, outlineColor, outlineWidth, cursor. */
743
+ setParkingHoverStyle(style: IMaps3DParkingHoverStyle): void;
744
+ /** Вкл/выкл наведение, не теряя подписку. */
745
+ setParkingHoverEnabled(enabled: boolean): void;
746
+ /** Включено ли наведение на парковки. */
747
+ get parkingHoverEnabled(): boolean;
748
+ /** Подсветить участок программно (например, со строки списка). `null` — погасить. */
749
+ hoverParking(id: number | string | null): boolean;
750
+ /** `osm_id` подсвеченного участка или null. */
751
+ hoveredParking(): number | string | null;
752
+ /** Клик по участку: справка либо null. `null` вместо колбэка — отписаться. */
753
+ onParkingClick(callback: ((info: IMaps3DParkingInfo | null) => void) | null): void;
754
+ /**
755
+ * Парковка под точкой холста (`e.point` события карты). Попадание — по границе полигона;
756
+ * допуск по умолчанию 0 — строго внутрь участка.
757
+ */
758
+ parkingAt(point: {
759
+ x: number;
760
+ y: number;
761
+ }, tolerancePx?: number): IMaps3DParkingInfo | null;
673
762
  /**
674
763
  * Подписаться на наведение. Колбэк приходит только в момент смены дома под курсором,
675
764
  * а не на каждое движение мыши. `null` отписывает и гасит подсветку.
@@ -1016,4 +1105,4 @@ declare namespace index {
1016
1105
  export { index_checkCoordinates as checkCoordinates, index_debounce as debounce, index_geojsonPolyline as geojsonPolyline, index_geometryPolyline as geometryPolyline, index_trimValue as trimValue };
1017
1106
  }
1018
1107
 
1019
- export { CheckJSApi, type IAdditionalParamType, type ICheckJSApiParam, type ICheckJSApiResponse, type IMahalMapOptions, type IMapMarker, type IMaps3DBuildingClickInfo, type IMaps3DBuildingsController, type IMaps3DBuildingsOptions, type IMaps3DClosuresOptions, type IMaps3DDiagnostics, type IMaps3DHoverStyle, type IMaps3DIndoorOptions, type IMaps3DLayer, type IMaps3DLayerOptions, type IMaps3DLayerParams, type IMaps3DLayerState, type IMaps3DMapOptionsInput, type IMaps3DMapOptionsResult, type IMaps3DObjectsLightOptions, type IMaps3DPlacesOptions, type IMaps3DRoadHit, type IMaps3DSelectionStyle, type IMaps3DTrafficOptions, type IMaps3DTransformRequestOptions, type IResponse, type IRoute, type ISearchByLocationParam, type ISearchParam, type ISearchResponse, MahalMap, MahalMapDefaultMarker, type MahalMapDefaultMarkerProps, type MapEngine, type MapLanguage, type MapStyleFamily, type Maps3DBuildingDetail, type Maps3DCtor, type Maps3DLayerId, type Maps3DTerrainMode, type Maps3DThemeName, type Maps3DTransformRequest, type MeasureIcons, type MeasureLabels, type MeasureMode, type MeasurePoint, type MeasureShape, type MeasureState, type MeasureStyleOptions, MeasureTool, type MeasureToolOptions, Router, Search, SearchByLocation, SearchPoi, type Theme, index$2 as keyUtils, index$1 as measureUtils, index as utils };
1108
+ export { CheckJSApi, type IAdditionalParamType, type ICheckJSApiParam, type ICheckJSApiResponse, type IMahalMapOptions, type IMapMarker, type IMaps3DBuildingClickInfo, type IMaps3DBuildingsController, type IMaps3DBuildingsOptions, type IMaps3DClosuresOptions, type IMaps3DDiagnostics, type IMaps3DHoverStyle, type IMaps3DIndoorOptions, type IMaps3DLayer, type IMaps3DLayerOptions, type IMaps3DLayerParams, type IMaps3DLayerState, type IMaps3DMapOptionsInput, type IMaps3DMapOptionsResult, type IMaps3DObjectsLightOptions, type IMaps3DParkingHoverStyle, type IMaps3DParkingInfo, type IMaps3DPlacesOptions, type IMaps3DRoadHit, type IMaps3DSelectionStyle, type IMaps3DTrafficOptions, type IMaps3DTransformRequestOptions, type IResponse, type IRoute, type ISearchByLocationParam, type ISearchParam, type ISearchResponse, MahalMap, MahalMapDefaultMarker, type MahalMapDefaultMarkerProps, type MapEngine, type MapLanguage, type MapStyleFamily, type Maps3DBuildingDetail, type Maps3DCtor, type Maps3DLayerId, type Maps3DParkingSubtype, type Maps3DTerrainMode, type Maps3DThemeName, type Maps3DTransformRequest, type MeasureIcons, type MeasureLabels, type MeasureMode, type MeasurePoint, type MeasureShape, type MeasureState, type MeasureStyleOptions, MeasureTool, type MeasureToolOptions, Router, Search, SearchByLocation, SearchPoi, type Theme, index$2 as keyUtils, index$1 as measureUtils, index as utils };
package/dist/index.d.ts CHANGED
@@ -23,7 +23,7 @@ interface IAdditionalParamType {
23
23
  /**
24
24
  * Поверхность @grammaps/maps3d-web, описанная локально. Пакет в зависимости не ставится —
25
25
  * он приходит снаружи, как и maplibre-gl, поэтому импортировать его типы нельзя. Здесь
26
- * повторена публичная часть .d.ts версии 0.7.3; всё необязательное помечено `?`, чтобы
26
+ * повторена публичная часть .d.ts версии 0.10.0; всё необязательное помечено `?`, чтобы
27
27
  * более старая сборка на странице не ломала типы у потребителя.
28
28
  */
29
29
  type Maps3DThemeName = "light" | "dark" | "navigator-light" | "navigator-dark" | "mobile-light" | "mobile-dark";
@@ -124,6 +124,41 @@ interface IMaps3DRoadHit {
124
124
  props: Record<string, unknown>;
125
125
  distancePx: number;
126
126
  }
127
+ /** Платность парковки: по ней участок и покрашен. */
128
+ type Maps3DParkingSubtype = "paid" | "free" | "unknown";
129
+ /**
130
+ * Справка о площадной парковке — ровно то, что есть в тайле. Отсутствующий атрибут — `null`.
131
+ * Графика работы и названия здесь нет: в слое `landuse` их не бывает.
132
+ */
133
+ interface IMaps3DParkingInfo {
134
+ /** `osm_id` участка — он же идентификатор для hoverParking(). */
135
+ id: number | string;
136
+ /** `unknown` значит «не указано», а не «бесплатно». */
137
+ subtype: Maps3DParkingSubtype;
138
+ /** Исходное `fee` из тайла (`yes`/`no`). */
139
+ fee: string | null;
140
+ /** Кому можно: `yes`, `private`, `customers`, `residents`, `permissive`, `no`… */
141
+ access: string | null;
142
+ /** OSM `parking=*`: `surface`, `multi-storey`, `underground`, `rooftop`… */
143
+ kind: string | null;
144
+ /** Число мест. */
145
+ capacity: number | null;
146
+ /** Все свойства фичи как есть. */
147
+ props: Record<string, unknown>;
148
+ }
149
+ /** Облик парковки под курсором. Не заданные цвета остаются цветами подтипа. */
150
+ interface IMaps3DParkingHoverStyle {
151
+ /** Цвет заливки. Не задан — цвет подтипа. */
152
+ color?: string | null;
153
+ /** Непрозрачность заливки. По умолчанию 0.55. */
154
+ opacity?: number;
155
+ /** Цвет канта. Не задан — кант подтипа. */
156
+ outlineColor?: string | null;
157
+ /** Во сколько раз толще кант. По умолчанию 2.2. */
158
+ outlineWidth?: number;
159
+ /** CSS-курсор над парковкой. По умолчанию `pointer`; `null` — не трогать. */
160
+ cursor?: string | null;
161
+ }
127
162
  interface IMaps3DTrafficOptions {
128
163
  raster?: boolean;
129
164
  rasterMaxZoom?: number;
@@ -145,6 +180,11 @@ interface IMaps3DClosuresOptions {
145
180
  }
146
181
  interface IMaps3DPlacesOptions {
147
182
  highlight?: boolean;
183
+ /**
184
+ * Непрозрачность заливки парковок в режиме выделения. Не задана — кривая по зуму;
185
+ * заданная перебивает её постоянным значением на всех зумах. С 0.10.0.
186
+ */
187
+ fillOpacity?: number;
148
188
  paid?: boolean;
149
189
  free?: boolean;
150
190
  unknown?: boolean;
@@ -190,10 +230,13 @@ interface IMaps3DBuildingsController {
190
230
  }
191
231
  interface IMaps3DBuildingClickInfo {
192
232
  id: string | number;
193
- /** Атрибуты объекта; `props.osm_id` — идентификатор, который не меняется. */
194
- props: Record<string, unknown>;
195
- /** Высота здания в метрах. */
196
- height: number;
233
+ /**
234
+ * Атрибуты объекта; `props.osm_id` — идентификатор, который не меняется.
235
+ * Необязательно: peerDependency допускает сборки Maps3D от 0.5.0, где поля может не быть.
236
+ */
237
+ props?: Record<string, unknown>;
238
+ /** Высота здания в метрах. Необязательно по той же причине, что и `props`. */
239
+ height?: number;
197
240
  /** Порядковый номер внутри сцены. Живёт до ближайшей пересборки геометрии. */
198
241
  index?: number;
199
242
  [key: string]: unknown;
@@ -240,6 +283,17 @@ interface IMaps3DLayer {
240
283
  y: number;
241
284
  }, tolerancePx?: number): IMaps3DRoadHit | null;
242
285
  readonly roadsNamed?: boolean;
286
+ parkingAt?(point: {
287
+ x: number;
288
+ y: number;
289
+ }, tolerancePx?: number): IMaps3DParkingInfo | null;
290
+ onParkingHover?(callback: ((info: IMaps3DParkingInfo | null) => void) | null): void;
291
+ setParkingHoverStyle?(style: IMaps3DParkingHoverStyle): void;
292
+ setParkingHoverEnabled?(enabled: boolean): void;
293
+ readonly parkingHoverEnabled?: boolean;
294
+ hoverParking?(id: number | string | null): boolean;
295
+ hoveredParking?(): number | string | null;
296
+ onParkingClick?(callback: ((info: IMaps3DParkingInfo | null) => void) | null): void;
243
297
  traffic?: boolean;
244
298
  trafficRaster?: boolean;
245
299
  setTraffic?(enabled: boolean): void;
@@ -564,6 +618,16 @@ declare class MahalMap {
564
618
  x: number;
565
619
  y: number;
566
620
  }, tolerancePx?: number): IMaps3DRoadHit | null;
621
+ static onParkingHover(instance: MahalMap, callback: ((info: IMaps3DParkingInfo | null) => void) | null): void;
622
+ static setParkingHoverStyle(instance: MahalMap, style: IMaps3DParkingHoverStyle): void;
623
+ static setParkingHoverEnabled(instance: MahalMap, enabled: boolean): void;
624
+ static hoverParking(instance: MahalMap, id: number | string | null): boolean;
625
+ static hoveredParking(instance: MahalMap): string | number | null;
626
+ static onParkingClick(instance: MahalMap, callback: ((info: IMaps3DParkingInfo | null) => void) | null): void;
627
+ static parkingAt(instance: MahalMap, point: {
628
+ x: number;
629
+ y: number;
630
+ }, tolerancePx?: number): IMaps3DParkingInfo | null;
567
631
  static onBuildingHover(instance: MahalMap, callback: ((info: IMaps3DBuildingClickInfo | null) => void) | null): void;
568
632
  static setHoverEnabled(instance: MahalMap, enabled: boolean): void;
569
633
  static setHoverStyle(instance: MahalMap, style: IMaps3DHoverStyle): void;
@@ -670,6 +734,31 @@ declare class MahalMap {
670
734
  }, tolerancePx?: number): IMaps3DRoadHit | null;
671
735
  /** Есть ли в текущем стиле названия дорог. Нет — roadAt() всегда вернёт null. */
672
736
  get roadsNamed(): boolean;
737
+ /**
738
+ * Участок под курсором либо null. Зовётся ТОЛЬКО при смене участка, не на каждое
739
+ * движение мыши. `null` вместо колбэка — отписаться и погасить подсветку.
740
+ */
741
+ onParkingHover(callback: ((info: IMaps3DParkingInfo | null) => void) | null): void;
742
+ /** Облик подсветки: color, opacity, outlineColor, outlineWidth, cursor. */
743
+ setParkingHoverStyle(style: IMaps3DParkingHoverStyle): void;
744
+ /** Вкл/выкл наведение, не теряя подписку. */
745
+ setParkingHoverEnabled(enabled: boolean): void;
746
+ /** Включено ли наведение на парковки. */
747
+ get parkingHoverEnabled(): boolean;
748
+ /** Подсветить участок программно (например, со строки списка). `null` — погасить. */
749
+ hoverParking(id: number | string | null): boolean;
750
+ /** `osm_id` подсвеченного участка или null. */
751
+ hoveredParking(): number | string | null;
752
+ /** Клик по участку: справка либо null. `null` вместо колбэка — отписаться. */
753
+ onParkingClick(callback: ((info: IMaps3DParkingInfo | null) => void) | null): void;
754
+ /**
755
+ * Парковка под точкой холста (`e.point` события карты). Попадание — по границе полигона;
756
+ * допуск по умолчанию 0 — строго внутрь участка.
757
+ */
758
+ parkingAt(point: {
759
+ x: number;
760
+ y: number;
761
+ }, tolerancePx?: number): IMaps3DParkingInfo | null;
673
762
  /**
674
763
  * Подписаться на наведение. Колбэк приходит только в момент смены дома под курсором,
675
764
  * а не на каждое движение мыши. `null` отписывает и гасит подсветку.
@@ -1016,4 +1105,4 @@ declare namespace index {
1016
1105
  export { index_checkCoordinates as checkCoordinates, index_debounce as debounce, index_geojsonPolyline as geojsonPolyline, index_geometryPolyline as geometryPolyline, index_trimValue as trimValue };
1017
1106
  }
1018
1107
 
1019
- export { CheckJSApi, type IAdditionalParamType, type ICheckJSApiParam, type ICheckJSApiResponse, type IMahalMapOptions, type IMapMarker, type IMaps3DBuildingClickInfo, type IMaps3DBuildingsController, type IMaps3DBuildingsOptions, type IMaps3DClosuresOptions, type IMaps3DDiagnostics, type IMaps3DHoverStyle, type IMaps3DIndoorOptions, type IMaps3DLayer, type IMaps3DLayerOptions, type IMaps3DLayerParams, type IMaps3DLayerState, type IMaps3DMapOptionsInput, type IMaps3DMapOptionsResult, type IMaps3DObjectsLightOptions, type IMaps3DPlacesOptions, type IMaps3DRoadHit, type IMaps3DSelectionStyle, type IMaps3DTrafficOptions, type IMaps3DTransformRequestOptions, type IResponse, type IRoute, type ISearchByLocationParam, type ISearchParam, type ISearchResponse, MahalMap, MahalMapDefaultMarker, type MahalMapDefaultMarkerProps, type MapEngine, type MapLanguage, type MapStyleFamily, type Maps3DBuildingDetail, type Maps3DCtor, type Maps3DLayerId, type Maps3DTerrainMode, type Maps3DThemeName, type Maps3DTransformRequest, type MeasureIcons, type MeasureLabels, type MeasureMode, type MeasurePoint, type MeasureShape, type MeasureState, type MeasureStyleOptions, MeasureTool, type MeasureToolOptions, Router, Search, SearchByLocation, SearchPoi, type Theme, index$2 as keyUtils, index$1 as measureUtils, index as utils };
1108
+ export { CheckJSApi, type IAdditionalParamType, type ICheckJSApiParam, type ICheckJSApiResponse, type IMahalMapOptions, type IMapMarker, type IMaps3DBuildingClickInfo, type IMaps3DBuildingsController, type IMaps3DBuildingsOptions, type IMaps3DClosuresOptions, type IMaps3DDiagnostics, type IMaps3DHoverStyle, type IMaps3DIndoorOptions, type IMaps3DLayer, type IMaps3DLayerOptions, type IMaps3DLayerParams, type IMaps3DLayerState, type IMaps3DMapOptionsInput, type IMaps3DMapOptionsResult, type IMaps3DObjectsLightOptions, type IMaps3DParkingHoverStyle, type IMaps3DParkingInfo, type IMaps3DPlacesOptions, type IMaps3DRoadHit, type IMaps3DSelectionStyle, type IMaps3DTrafficOptions, type IMaps3DTransformRequestOptions, type IResponse, type IRoute, type ISearchByLocationParam, type ISearchParam, type ISearchResponse, MahalMap, MahalMapDefaultMarker, type MahalMapDefaultMarkerProps, type MapEngine, type MapLanguage, type MapStyleFamily, type Maps3DBuildingDetail, type Maps3DCtor, type Maps3DLayerId, type Maps3DParkingSubtype, type Maps3DTerrainMode, type Maps3DThemeName, type Maps3DTransformRequest, type MeasureIcons, type MeasureLabels, type MeasureMode, type MeasurePoint, type MeasureShape, type MeasureState, type MeasureStyleOptions, MeasureTool, type MeasureToolOptions, Router, Search, SearchByLocation, SearchPoi, type Theme, index$2 as keyUtils, index$1 as measureUtils, index as utils };