mahal_map 2.0.1 → 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/dist/index.d.mts CHANGED
@@ -1,3 +1,4 @@
1
+ import * as maplibre_gl from 'maplibre-gl';
1
2
  import { Map, FlyToOptions, Marker } from 'maplibre-gl';
2
3
 
3
4
  declare class CameraController {
@@ -174,9 +175,12 @@ interface IMaps3DBuildingsController {
174
175
  }
175
176
  interface IMaps3DBuildingClickInfo {
176
177
  id: string | number;
178
+ /** Атрибуты объекта; `props.osm_id` — идентификатор, который не меняется. */
179
+ props: Record<string, unknown>;
180
+ /** Высота здания в метрах. */
181
+ height: number;
182
+ /** Порядковый номер внутри сцены. Живёт до ближайшей пересборки геометрии. */
177
183
  index?: number;
178
- height?: number;
179
- props?: Record<string, unknown>;
180
184
  [key: string]: unknown;
181
185
  }
182
186
  interface IMaps3DObjectsLightOptions {
@@ -263,10 +267,13 @@ type Maps3DCtor = (new (options: IMaps3DLayerOptions) => IMaps3DLayer) & {
263
267
  styleUrl?(style?: string, base?: string): string;
264
268
  /** Подключение к уже созданной карте; возвращает экземпляр с `ready`. */
265
269
  enhance?(map: Map, options?: IMaps3DLayerOptions): IMaps3DLayer;
266
- /** MapLibre с платформы вместе со своим воркером. */
270
+ /**
271
+ * MapLibre с платформы вместе со своим воркером. Возвращает то же, что
272
+ * `import * as maplibregl from "maplibre-gl"` — декларации гарантирует peerDependency.
273
+ */
267
274
  maplibre?(options?: {
268
275
  base?: string;
269
- }): Promise<unknown>;
276
+ }): Promise<typeof maplibre_gl>;
270
277
  readonly maplibreVersion?: string;
271
278
  };
272
279
 
@@ -456,6 +463,11 @@ declare class MahalMap {
456
463
  private maps3dReady?;
457
464
  private buildingsEnabled;
458
465
  private workerCheckTimer?;
466
+ private styleChangeHandler?;
467
+ private pendingBuildingClick?;
468
+ private pendingRoadClick?;
469
+ private pendingSelectionStyle?;
470
+ private pendingLayerSubscribers;
459
471
  private constructor();
460
472
  private static getInstanceKey;
461
473
  private static normalizeLanguage;
@@ -542,7 +554,21 @@ declare class MahalMap {
542
554
  * Без Maps3D менять нечего — карта на запасном стиле, у него варианта по теме нет.
543
555
  */
544
556
  setStyle(theme: Theme): void;
545
- private refreshLayersOnStyleLoad;
557
+ /**
558
+ * Адрес стиля по имени темы. mapOptions() — основной контракт (есть с 0.5.0);
559
+ * styleUrl остаётся запасным путём для сборок, где mapOptions ещё нет.
560
+ * Раньше здесь был только styleUrl, и сборка с одним mapOptions() тему не меняла.
561
+ */
562
+ private resolvePlatformStyle;
563
+ /**
564
+ * Полная смена стиля уносит слои Maps3D вместе с ним — реестр умеет вернуть волю
565
+ * клиента, но только когда новый стиль уже загружен.
566
+ *
567
+ * Слушаем styledata, а не style.load: setStyle() идёт через дифф и style.load при
568
+ * этом не поднимает — с ним восстановление просто не случалось. styledata приходит
569
+ * многократно, поэтому ждём isStyleLoaded() и снимаем обработчик сами.
570
+ */
571
+ private refreshLayersOnStyleChange;
546
572
  /**
547
573
  * Язык подписей приходит из стиля платформы, отдельных URL по языкам больше нет —
548
574
  * метод только запоминает выбор для остальных сервисов SDK (поиск, роутинг).
@@ -573,7 +599,10 @@ declare class MahalMap {
573
599
  getLayerState(id: Maps3DLayerId): IMaps3DLayerState | null;
574
600
  /** Снимок всех слоёв — по нему приложение рисует свою панель. */
575
601
  getLayers(): IMaps3DLayerState[];
576
- /** Подписка на изменения слоёв. Возвращает отписку (no-op, если слоя нет). */
602
+ /**
603
+ * Подписка на изменения слоёв. Возвращает отписку. Работает и до появления слоя:
604
+ * подписка переиграется при его подключении, а отписка снимет её в любом случае.
605
+ */
577
606
  onLayers(callback: (state: IMaps3DLayerState) => void): () => void;
578
607
  /** Пере-применить волю клиента ко всем слоям — после полной смены стиля. */
579
608
  refreshLayers(): void;
@@ -589,14 +618,21 @@ declare class MahalMap {
589
618
  * и метка окажется в чужом зале.
590
619
  */
591
620
  showPlace(lon: number, lat: number, level?: number | null, zoom?: number): void;
592
- /** Клик по зданию: { id, height, props } либо null. Повторный вызов заменяет обработчик. */
621
+ /**
622
+ * Клик по зданию: { id, height, props } либо null. Повторный вызов заменяет обработчик.
623
+ * Подписываться можно сразу после create(), даже когда слой ещё не поднят
624
+ * (`enable3D: false`) — подписка переиграется, как только слой появится.
625
+ */
593
626
  onBuildingClick(callback: (info: IMaps3DBuildingClickInfo | null) => void): void;
594
627
  /** Выделить здание по osm_id. `false` — здания сейчас нет в загруженных данных. */
595
628
  selectBuilding(id: number | string | null, style?: IMaps3DSelectionStyle): boolean;
596
629
  clearSelection(): void;
597
630
  selectedBuilding(): number | string | null;
598
631
  setSelectionStyle(style: IMaps3DSelectionStyle): void;
599
- /** Клик по дороге. Приходит независимо от клика по зданию — приоритет решает приложение. */
632
+ /**
633
+ * Клик по дороге. Приходит независимо от клика по зданию — приоритет решает приложение.
634
+ * Как и onBuildingClick, переживает отсутствие слоя на момент подписки.
635
+ */
600
636
  onRoadClick(callback: (hit: IMaps3DRoadHit | null) => void): void;
601
637
  /** Дорога под точкой холста. Допуск по умолчанию — 12 px. */
602
638
  roadAt(point: {
@@ -610,6 +646,12 @@ declare class MahalMap {
610
646
  * заведует реестр слоёв, а опции облика зданий приходят из options.maps3d как есть.
611
647
  */
612
648
  private createMaps3DLayer;
649
+ /**
650
+ * Переигрывает волю клиента на только что подключённом слое: подписки на клики,
651
+ * облик выделения и подписчиков реестра. Нужно, когда карта создана без слоя
652
+ * (`enable3D: false`) — тогда всё это было сказано до его появления.
653
+ */
654
+ private applyPendingSubscriptions;
613
655
  private attachMaps3DLayer;
614
656
  /**
615
657
  * Освобождает слой Maps3D одним доступным методом (destroy(), иначе remove()) и ровно один
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import * as maplibre_gl from 'maplibre-gl';
1
2
  import { Map, FlyToOptions, Marker } from 'maplibre-gl';
2
3
 
3
4
  declare class CameraController {
@@ -174,9 +175,12 @@ interface IMaps3DBuildingsController {
174
175
  }
175
176
  interface IMaps3DBuildingClickInfo {
176
177
  id: string | number;
178
+ /** Атрибуты объекта; `props.osm_id` — идентификатор, который не меняется. */
179
+ props: Record<string, unknown>;
180
+ /** Высота здания в метрах. */
181
+ height: number;
182
+ /** Порядковый номер внутри сцены. Живёт до ближайшей пересборки геометрии. */
177
183
  index?: number;
178
- height?: number;
179
- props?: Record<string, unknown>;
180
184
  [key: string]: unknown;
181
185
  }
182
186
  interface IMaps3DObjectsLightOptions {
@@ -263,10 +267,13 @@ type Maps3DCtor = (new (options: IMaps3DLayerOptions) => IMaps3DLayer) & {
263
267
  styleUrl?(style?: string, base?: string): string;
264
268
  /** Подключение к уже созданной карте; возвращает экземпляр с `ready`. */
265
269
  enhance?(map: Map, options?: IMaps3DLayerOptions): IMaps3DLayer;
266
- /** MapLibre с платформы вместе со своим воркером. */
270
+ /**
271
+ * MapLibre с платформы вместе со своим воркером. Возвращает то же, что
272
+ * `import * as maplibregl from "maplibre-gl"` — декларации гарантирует peerDependency.
273
+ */
267
274
  maplibre?(options?: {
268
275
  base?: string;
269
- }): Promise<unknown>;
276
+ }): Promise<typeof maplibre_gl>;
270
277
  readonly maplibreVersion?: string;
271
278
  };
272
279
 
@@ -456,6 +463,11 @@ declare class MahalMap {
456
463
  private maps3dReady?;
457
464
  private buildingsEnabled;
458
465
  private workerCheckTimer?;
466
+ private styleChangeHandler?;
467
+ private pendingBuildingClick?;
468
+ private pendingRoadClick?;
469
+ private pendingSelectionStyle?;
470
+ private pendingLayerSubscribers;
459
471
  private constructor();
460
472
  private static getInstanceKey;
461
473
  private static normalizeLanguage;
@@ -542,7 +554,21 @@ declare class MahalMap {
542
554
  * Без Maps3D менять нечего — карта на запасном стиле, у него варианта по теме нет.
543
555
  */
544
556
  setStyle(theme: Theme): void;
545
- private refreshLayersOnStyleLoad;
557
+ /**
558
+ * Адрес стиля по имени темы. mapOptions() — основной контракт (есть с 0.5.0);
559
+ * styleUrl остаётся запасным путём для сборок, где mapOptions ещё нет.
560
+ * Раньше здесь был только styleUrl, и сборка с одним mapOptions() тему не меняла.
561
+ */
562
+ private resolvePlatformStyle;
563
+ /**
564
+ * Полная смена стиля уносит слои Maps3D вместе с ним — реестр умеет вернуть волю
565
+ * клиента, но только когда новый стиль уже загружен.
566
+ *
567
+ * Слушаем styledata, а не style.load: setStyle() идёт через дифф и style.load при
568
+ * этом не поднимает — с ним восстановление просто не случалось. styledata приходит
569
+ * многократно, поэтому ждём isStyleLoaded() и снимаем обработчик сами.
570
+ */
571
+ private refreshLayersOnStyleChange;
546
572
  /**
547
573
  * Язык подписей приходит из стиля платформы, отдельных URL по языкам больше нет —
548
574
  * метод только запоминает выбор для остальных сервисов SDK (поиск, роутинг).
@@ -573,7 +599,10 @@ declare class MahalMap {
573
599
  getLayerState(id: Maps3DLayerId): IMaps3DLayerState | null;
574
600
  /** Снимок всех слоёв — по нему приложение рисует свою панель. */
575
601
  getLayers(): IMaps3DLayerState[];
576
- /** Подписка на изменения слоёв. Возвращает отписку (no-op, если слоя нет). */
602
+ /**
603
+ * Подписка на изменения слоёв. Возвращает отписку. Работает и до появления слоя:
604
+ * подписка переиграется при его подключении, а отписка снимет её в любом случае.
605
+ */
577
606
  onLayers(callback: (state: IMaps3DLayerState) => void): () => void;
578
607
  /** Пере-применить волю клиента ко всем слоям — после полной смены стиля. */
579
608
  refreshLayers(): void;
@@ -589,14 +618,21 @@ declare class MahalMap {
589
618
  * и метка окажется в чужом зале.
590
619
  */
591
620
  showPlace(lon: number, lat: number, level?: number | null, zoom?: number): void;
592
- /** Клик по зданию: { id, height, props } либо null. Повторный вызов заменяет обработчик. */
621
+ /**
622
+ * Клик по зданию: { id, height, props } либо null. Повторный вызов заменяет обработчик.
623
+ * Подписываться можно сразу после create(), даже когда слой ещё не поднят
624
+ * (`enable3D: false`) — подписка переиграется, как только слой появится.
625
+ */
593
626
  onBuildingClick(callback: (info: IMaps3DBuildingClickInfo | null) => void): void;
594
627
  /** Выделить здание по osm_id. `false` — здания сейчас нет в загруженных данных. */
595
628
  selectBuilding(id: number | string | null, style?: IMaps3DSelectionStyle): boolean;
596
629
  clearSelection(): void;
597
630
  selectedBuilding(): number | string | null;
598
631
  setSelectionStyle(style: IMaps3DSelectionStyle): void;
599
- /** Клик по дороге. Приходит независимо от клика по зданию — приоритет решает приложение. */
632
+ /**
633
+ * Клик по дороге. Приходит независимо от клика по зданию — приоритет решает приложение.
634
+ * Как и onBuildingClick, переживает отсутствие слоя на момент подписки.
635
+ */
600
636
  onRoadClick(callback: (hit: IMaps3DRoadHit | null) => void): void;
601
637
  /** Дорога под точкой холста. Допуск по умолчанию — 12 px. */
602
638
  roadAt(point: {
@@ -610,6 +646,12 @@ declare class MahalMap {
610
646
  * заведует реестр слоёв, а опции облика зданий приходят из options.maps3d как есть.
611
647
  */
612
648
  private createMaps3DLayer;
649
+ /**
650
+ * Переигрывает волю клиента на только что подключённом слое: подписки на клики,
651
+ * облик выделения и подписчиков реестра. Нужно, когда карта создана без слоя
652
+ * (`enable3D: false`) — тогда всё это было сказано до его появления.
653
+ */
654
+ private applyPendingSubscriptions;
613
655
  private attachMaps3DLayer;
614
656
  /**
615
657
  * Освобождает слой Maps3D одним доступным методом (destroy(), иначе remove()) и ровно один