mahal_map 1.6.6 → 1.6.7

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
@@ -519,6 +519,112 @@ MahalMap.onReady("map", () => {
519
519
  map.destroy();
520
520
  ```
521
521
 
522
+ ## MeasureTool (линейка и планиметр)
523
+
524
+ `MeasureTool` — инструмент измерения расстояния и площади прямо на карте (линейка + планиметр, как в Яндекс.Картах). Полностью самодостаточен: сам рисует точки, линии, полигон и подписи поверх MapLibre, сам обрабатывает клики/drag/удаление точек. Приложение только передает стили (цвета, иконки, подписи единиц) и слушает `onChange`.
525
+
526
+ ```ts
527
+ import { MeasureTool } from "mahal_map";
528
+
529
+ const map = MahalMap.getInstance("map").getMap();
530
+
531
+ const measureTool = new MeasureTool(map, {
532
+ mode: "distance",
533
+ style: {
534
+ lineColor: "#278960",
535
+ pointColor: "#FFFFFF",
536
+ pointStrokeColor: "#278960",
537
+ fillColor: "#278960",
538
+ fillOpacity: 0.15,
539
+ },
540
+ labels: {
541
+ meters: "м",
542
+ kilometers: "км",
543
+ squareMeters: "м²",
544
+ squareKilometers: "км²",
545
+ },
546
+ onChange: (state) => {
547
+ console.log(state.mode, state.draft, state.shapes);
548
+ },
549
+ onCloseRequest: () => {
550
+ measureTool.stop();
551
+ },
552
+ });
553
+
554
+ measureTool.start("distance");
555
+ ```
556
+
557
+ ### Важно: цвета — реальные, не CSS-переменные
558
+
559
+ MapLibre GL проверяет `paint`-свойства слоя и не понимает `var(--primary)` — только hex/rgb. Если в приложении цвета живут в CSS-переменных (тема light/dark), резолвьте их в реальное значение перед передачей в `style`:
560
+
561
+ ```ts
562
+ const primary = getComputedStyle(document.documentElement)
563
+ .getPropertyValue("--primary")
564
+ .trim() || "#278960";
565
+
566
+ const measureTool = new MeasureTool(map, {
567
+ style: { lineColor: primary, pointStrokeColor: primary, fillColor: primary },
568
+ });
569
+ ```
570
+
571
+ Значения `badgeBackground`, `badgeTextColor` и другие DOM-стили бейджа — обычный CSS, туда `var(--x)` передавать можно.
572
+
573
+ ### Конструктор: `new MeasureTool(map, options?)`
574
+
575
+ | Опция | Тип | Описание |
576
+ | ------------------- | ---------------------------------------- | ------------------------------------------------------------------------ |
577
+ | `mode` | `"distance" \| "area"` | Режим по умолчанию. По умолчанию `"distance"`. |
578
+ | `sourceIdPrefix` | `string` | Префикс id source/layer на карте. По умолчанию `"mahal-measure"`. |
579
+ | `style` | `MeasureStyleOptions` | Цвета и размеры точек/линий/заливки/бейджа. |
580
+ | `icons` | `MeasureIcons` | SVG-иконки `trash` / `close` / `check` для бейджей. |
581
+ | `labels` | `MeasureLabels` | Подписи единиц: `meters`, `kilometers`, `squareMeters`, `squareKilometers`. |
582
+ | `onChange` | `(state: MeasureState) => void` | Вызывается при любом изменении: новая точка, drag, смена режима и т.д. |
583
+ | `onCloseRequest` | `() => void` | Вызывается по клику на ✕ в бейджике активной фигуры — решение "выключить инструмент" остается за приложением. |
584
+
585
+ ### Методы
586
+
587
+ | Метод | Описание |
588
+ | ------------------------------------- | ---------------------------------------------------------------------------------------------- |
589
+ | `start(mode?)` | Включает инструмент и начинает/продолжает рисование в указанном режиме. |
590
+ | `stop()` | Выключает инструмент, прячет активный бейдж. Сохраненные фигуры остаются на карте. |
591
+ | `setMode(mode)` | Переключает режим. Если фигура уже рисуется — её точки сохраняются, меняется только тип (линия ⇄ полигон), как в Яндекс.Картах. |
592
+ | `finishDraft()` | Завершает текущую фигуру (если валидна — от 2 точек для линии, от 3 для полигона) и начинает новую. |
593
+ | `removeShape(shapeId)` | Удаляет фигуру (черновик или уже сохраненную) целиком. |
594
+ | `removePoint(shapeId, pointId)` | Удаляет одну точку фигуры. |
595
+ | `clearAll()` | Удаляет все фигуры и черновик. |
596
+ | `getState()` | Возвращает текущий `MeasureState` (снимок, без подписки). |
597
+ | `destroy()` | Полностью снимает слои, обработчики и DOM-бейджи. Вызывать при размонтировании. |
598
+
599
+ ### Взаимодействие на карте
600
+
601
+ - клик по карте — добавляет точку в текущую фигуру;
602
+ - перетаскивание существующей точки — двигает её, расстояние/площадь пересчитываются на лету;
603
+ - правый клик по точке — удаляет её;
604
+ - наведение на линию/ребро полигона — показывает точку-призрак прямо под курсором; зажатие мыши вставляет в этом месте новую точку и сразу тянет её (как вставка узла в Яндекс.Картах);
605
+ - бейдж активной (незавершенной) фигуры — показывает значение и три кнопки: ✓ (завершить фигуру), 🗑 (удалить), ✕ (вызывает `onCloseRequest`);
606
+ - у уже сохраненных фигур — постоянный мини-бейдж: только значение и 🗑 (удалить), не пропадает при рисовании следующей фигуры.
607
+
608
+ ### `MeasureState`
609
+
610
+ ```ts
611
+ interface MeasureState {
612
+ active: boolean;
613
+ mode: "distance" | "area";
614
+ draft: MeasureShape | null;
615
+ shapes: MeasureShape[];
616
+ }
617
+
618
+ interface MeasureShape {
619
+ id: string;
620
+ mode: "distance" | "area";
621
+ points: { id: string; lngLat: [number, number] }[];
622
+ closed: boolean;
623
+ distance: number; // метры
624
+ area: number; // квадратные метры, 0 для линии
625
+ }
626
+ ```
627
+
522
628
  ## License
523
629
 
524
630
  ISC
package/dist/index.d.mts CHANGED
@@ -298,6 +298,7 @@ declare class MeasureTool {
298
298
  private icons;
299
299
  private draggingPointId;
300
300
  private draggingShapeId;
301
+ private dragPanWasEnabled;
301
302
  private suppressNextClick;
302
303
  private hoverInsert;
303
304
  private onChange?;
@@ -330,6 +331,7 @@ declare class MeasureTool {
330
331
  private recomputeShape;
331
332
  private onMapClick;
332
333
  private onPointMouseDown;
334
+ private beginPointDrag;
333
335
  private onPointDragMove;
334
336
  private onPointDragUp;
335
337
  private stopDragListeners;
package/dist/index.d.ts CHANGED
@@ -298,6 +298,7 @@ declare class MeasureTool {
298
298
  private icons;
299
299
  private draggingPointId;
300
300
  private draggingShapeId;
301
+ private dragPanWasEnabled;
301
302
  private suppressNextClick;
302
303
  private hoverInsert;
303
304
  private onChange?;
@@ -330,6 +331,7 @@ declare class MeasureTool {
330
331
  private recomputeShape;
331
332
  private onMapClick;
332
333
  private onPointMouseDown;
334
+ private beginPointDrag;
333
335
  private onPointDragMove;
334
336
  private onPointDragUp;
335
337
  private stopDragListeners;