mahal_map 2.0.2 → 2.0.3

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
@@ -495,7 +495,16 @@ map.roadAt({ x: 320, y: 240 });
495
495
  map.roadsNamed; // есть ли в текущем стиле названия дорог
496
496
  ```
497
497
 
498
- Подписываться можно сразу после `create()`, до готовности карты.
498
+ Подписываться можно сразу после `create()` даже когда слой ещё не поднят (`enable3D: false`). Подписка и облик выделения запоминаются и переигрываются, как только слой появится:
499
+
500
+ ```ts
501
+ const map = MahalMap.create({ container: "map", enable3D: false }, maplibregl, Maps3D);
502
+
503
+ map.onBuildingClick((b) => console.log(b?.props.osm_id));
504
+ map.setSelectionStyle({ color: "#e23b2f" });
505
+
506
+ map.toggle3DBuildings(true); // подписка и стиль выделения уже применены к новому слою
507
+ ```
499
508
 
500
509
  #### Вкл/выкл 3D-здания на лету
501
510
 
package/dist/index.d.mts CHANGED
@@ -175,9 +175,12 @@ interface IMaps3DBuildingsController {
175
175
  }
176
176
  interface IMaps3DBuildingClickInfo {
177
177
  id: string | number;
178
+ /** Атрибуты объекта; `props.osm_id` — идентификатор, который не меняется. */
179
+ props: Record<string, unknown>;
180
+ /** Высота здания в метрах. */
181
+ height: number;
182
+ /** Порядковый номер внутри сцены. Живёт до ближайшей пересборки геометрии. */
178
183
  index?: number;
179
- height?: number;
180
- props?: Record<string, unknown>;
181
184
  [key: string]: unknown;
182
185
  }
183
186
  interface IMaps3DObjectsLightOptions {
@@ -461,6 +464,10 @@ declare class MahalMap {
461
464
  private buildingsEnabled;
462
465
  private workerCheckTimer?;
463
466
  private styleChangeHandler?;
467
+ private pendingBuildingClick?;
468
+ private pendingRoadClick?;
469
+ private pendingSelectionStyle?;
470
+ private pendingLayerSubscribers;
464
471
  private constructor();
465
472
  private static getInstanceKey;
466
473
  private static normalizeLanguage;
@@ -592,7 +599,10 @@ declare class MahalMap {
592
599
  getLayerState(id: Maps3DLayerId): IMaps3DLayerState | null;
593
600
  /** Снимок всех слоёв — по нему приложение рисует свою панель. */
594
601
  getLayers(): IMaps3DLayerState[];
595
- /** Подписка на изменения слоёв. Возвращает отписку (no-op, если слоя нет). */
602
+ /**
603
+ * Подписка на изменения слоёв. Возвращает отписку. Работает и до появления слоя:
604
+ * подписка переиграется при его подключении, а отписка снимет её в любом случае.
605
+ */
596
606
  onLayers(callback: (state: IMaps3DLayerState) => void): () => void;
597
607
  /** Пере-применить волю клиента ко всем слоям — после полной смены стиля. */
598
608
  refreshLayers(): void;
@@ -608,14 +618,21 @@ declare class MahalMap {
608
618
  * и метка окажется в чужом зале.
609
619
  */
610
620
  showPlace(lon: number, lat: number, level?: number | null, zoom?: number): void;
611
- /** Клик по зданию: { id, height, props } либо null. Повторный вызов заменяет обработчик. */
621
+ /**
622
+ * Клик по зданию: { id, height, props } либо null. Повторный вызов заменяет обработчик.
623
+ * Подписываться можно сразу после create(), даже когда слой ещё не поднят
624
+ * (`enable3D: false`) — подписка переиграется, как только слой появится.
625
+ */
612
626
  onBuildingClick(callback: (info: IMaps3DBuildingClickInfo | null) => void): void;
613
627
  /** Выделить здание по osm_id. `false` — здания сейчас нет в загруженных данных. */
614
628
  selectBuilding(id: number | string | null, style?: IMaps3DSelectionStyle): boolean;
615
629
  clearSelection(): void;
616
630
  selectedBuilding(): number | string | null;
617
631
  setSelectionStyle(style: IMaps3DSelectionStyle): void;
618
- /** Клик по дороге. Приходит независимо от клика по зданию — приоритет решает приложение. */
632
+ /**
633
+ * Клик по дороге. Приходит независимо от клика по зданию — приоритет решает приложение.
634
+ * Как и onBuildingClick, переживает отсутствие слоя на момент подписки.
635
+ */
619
636
  onRoadClick(callback: (hit: IMaps3DRoadHit | null) => void): void;
620
637
  /** Дорога под точкой холста. Допуск по умолчанию — 12 px. */
621
638
  roadAt(point: {
@@ -629,6 +646,12 @@ declare class MahalMap {
629
646
  * заведует реестр слоёв, а опции облика зданий приходят из options.maps3d как есть.
630
647
  */
631
648
  private createMaps3DLayer;
649
+ /**
650
+ * Переигрывает волю клиента на только что подключённом слое: подписки на клики,
651
+ * облик выделения и подписчиков реестра. Нужно, когда карта создана без слоя
652
+ * (`enable3D: false`) — тогда всё это было сказано до его появления.
653
+ */
654
+ private applyPendingSubscriptions;
632
655
  private attachMaps3DLayer;
633
656
  /**
634
657
  * Освобождает слой Maps3D одним доступным методом (destroy(), иначе remove()) и ровно один
package/dist/index.d.ts CHANGED
@@ -175,9 +175,12 @@ interface IMaps3DBuildingsController {
175
175
  }
176
176
  interface IMaps3DBuildingClickInfo {
177
177
  id: string | number;
178
+ /** Атрибуты объекта; `props.osm_id` — идентификатор, который не меняется. */
179
+ props: Record<string, unknown>;
180
+ /** Высота здания в метрах. */
181
+ height: number;
182
+ /** Порядковый номер внутри сцены. Живёт до ближайшей пересборки геометрии. */
178
183
  index?: number;
179
- height?: number;
180
- props?: Record<string, unknown>;
181
184
  [key: string]: unknown;
182
185
  }
183
186
  interface IMaps3DObjectsLightOptions {
@@ -461,6 +464,10 @@ declare class MahalMap {
461
464
  private buildingsEnabled;
462
465
  private workerCheckTimer?;
463
466
  private styleChangeHandler?;
467
+ private pendingBuildingClick?;
468
+ private pendingRoadClick?;
469
+ private pendingSelectionStyle?;
470
+ private pendingLayerSubscribers;
464
471
  private constructor();
465
472
  private static getInstanceKey;
466
473
  private static normalizeLanguage;
@@ -592,7 +599,10 @@ declare class MahalMap {
592
599
  getLayerState(id: Maps3DLayerId): IMaps3DLayerState | null;
593
600
  /** Снимок всех слоёв — по нему приложение рисует свою панель. */
594
601
  getLayers(): IMaps3DLayerState[];
595
- /** Подписка на изменения слоёв. Возвращает отписку (no-op, если слоя нет). */
602
+ /**
603
+ * Подписка на изменения слоёв. Возвращает отписку. Работает и до появления слоя:
604
+ * подписка переиграется при его подключении, а отписка снимет её в любом случае.
605
+ */
596
606
  onLayers(callback: (state: IMaps3DLayerState) => void): () => void;
597
607
  /** Пере-применить волю клиента ко всем слоям — после полной смены стиля. */
598
608
  refreshLayers(): void;
@@ -608,14 +618,21 @@ declare class MahalMap {
608
618
  * и метка окажется в чужом зале.
609
619
  */
610
620
  showPlace(lon: number, lat: number, level?: number | null, zoom?: number): void;
611
- /** Клик по зданию: { id, height, props } либо null. Повторный вызов заменяет обработчик. */
621
+ /**
622
+ * Клик по зданию: { id, height, props } либо null. Повторный вызов заменяет обработчик.
623
+ * Подписываться можно сразу после create(), даже когда слой ещё не поднят
624
+ * (`enable3D: false`) — подписка переиграется, как только слой появится.
625
+ */
612
626
  onBuildingClick(callback: (info: IMaps3DBuildingClickInfo | null) => void): void;
613
627
  /** Выделить здание по osm_id. `false` — здания сейчас нет в загруженных данных. */
614
628
  selectBuilding(id: number | string | null, style?: IMaps3DSelectionStyle): boolean;
615
629
  clearSelection(): void;
616
630
  selectedBuilding(): number | string | null;
617
631
  setSelectionStyle(style: IMaps3DSelectionStyle): void;
618
- /** Клик по дороге. Приходит независимо от клика по зданию — приоритет решает приложение. */
632
+ /**
633
+ * Клик по дороге. Приходит независимо от клика по зданию — приоритет решает приложение.
634
+ * Как и onBuildingClick, переживает отсутствие слоя на момент подписки.
635
+ */
619
636
  onRoadClick(callback: (hit: IMaps3DRoadHit | null) => void): void;
620
637
  /** Дорога под точкой холста. Допуск по умолчанию — 12 px. */
621
638
  roadAt(point: {
@@ -629,6 +646,12 @@ declare class MahalMap {
629
646
  * заведует реестр слоёв, а опции облика зданий приходят из options.maps3d как есть.
630
647
  */
631
648
  private createMaps3DLayer;
649
+ /**
650
+ * Переигрывает волю клиента на только что подключённом слое: подписки на клики,
651
+ * облик выделения и подписчиков реестра. Нужно, когда карта создана без слоя
652
+ * (`enable3D: false`) — тогда всё это было сказано до его появления.
653
+ */
654
+ private applyPendingSubscriptions;
632
655
  private attachMaps3DLayer;
633
656
  /**
634
657
  * Освобождает слой Maps3D одним доступным методом (destroy(), иначе remove()) и ровно один