leaflet-polydraw 2.0.2 → 2.1.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.
Files changed (47) hide show
  1. package/CODE_OF_CONDUCT.md +34 -0
  2. package/README.md +10 -3
  3. package/dist/icons/icon-color.svg +3 -0
  4. package/dist/icons/icon-edit.svg +4 -0
  5. package/dist/icons/icon-layer-toggle.svg +1 -4
  6. package/dist/icons/icon-move-to-layer.svg +10 -0
  7. package/dist/leaflet-polydraw.css +1 -1
  8. package/dist/polydraw.es.js +2905 -3600
  9. package/dist/polydraw.es.js.map +1 -1
  10. package/dist/polydraw.umd.min.js +1 -1
  11. package/dist/polydraw.umd.min.js.map +1 -1
  12. package/dist/styles/polydraw.css +950 -49
  13. package/dist/types/buttons.d.ts +1 -0
  14. package/dist/types/buttons.d.ts.map +1 -1
  15. package/dist/types/compatibility/leaflet-adapter.d.ts +2 -2
  16. package/dist/types/compatibility/leaflet-adapter.d.ts.map +1 -1
  17. package/dist/types/compatibility/version-detector.d.ts.map +1 -1
  18. package/dist/types/config.d.ts.map +1 -1
  19. package/dist/types/coordinate-utils.d.ts.map +1 -1
  20. package/dist/types/geometry-utils.d.ts +5 -0
  21. package/dist/types/geometry-utils.d.ts.map +1 -1
  22. package/dist/types/index.d.ts +1 -1
  23. package/dist/types/managers/event-manager.d.ts +23 -0
  24. package/dist/types/managers/event-manager.d.ts.map +1 -1
  25. package/dist/types/managers/history-manager.d.ts +9 -0
  26. package/dist/types/managers/history-manager.d.ts.map +1 -1
  27. package/dist/types/managers/layer-manager.d.ts +11 -3
  28. package/dist/types/managers/layer-manager.d.ts.map +1 -1
  29. package/dist/types/managers/polygon-draw-manager.d.ts +4 -4
  30. package/dist/types/managers/polygon-draw-manager.d.ts.map +1 -1
  31. package/dist/types/managers/polygon-interaction-manager.d.ts +30 -5
  32. package/dist/types/managers/polygon-interaction-manager.d.ts.map +1 -1
  33. package/dist/types/managers/polygon-mutation-manager.d.ts +9 -4
  34. package/dist/types/managers/polygon-mutation-manager.d.ts.map +1 -1
  35. package/dist/types/polydraw.d.ts +30 -23
  36. package/dist/types/polydraw.d.ts.map +1 -1
  37. package/dist/types/popup-factory.d.ts +2 -1
  38. package/dist/types/popup-factory.d.ts.map +1 -1
  39. package/dist/types/types/polydraw-interfaces.d.ts +50 -4
  40. package/dist/types/types/polydraw-interfaces.d.ts.map +1 -1
  41. package/dist/types/ui/color-map.d.ts +13 -0
  42. package/dist/types/ui/color-map.d.ts.map +1 -0
  43. package/dist/types/ui/layer-panel.d.ts +6 -2
  44. package/dist/types/ui/layer-panel.d.ts.map +1 -1
  45. package/dist/types/utils/color-style.util.d.ts +18 -0
  46. package/dist/types/utils/color-style.util.d.ts.map +1 -0
  47. package/package.json +7 -5
@@ -6,7 +6,7 @@ body {
6
6
  }
7
7
 
8
8
  /*
9
- * Leaflet 2 alpha applies width/height: 100% to pane SVG elements.
9
+ * Leaflet 2 applies width/height: 100% to pane SVG elements.
10
10
  * Leaflet's SVG renderer expects its own viewport sizing, so forcing a full-size
11
11
  * SVG can shift vector overlays relative to marker panes while drawing/editing.
12
12
  */
@@ -165,16 +165,16 @@ body {
165
165
  align-items: center;
166
166
  justify-content: center;
167
167
  gap: 0;
168
- max-width: 132px;
168
+ max-width: 102px;
169
169
  }
170
170
 
171
171
  @supports (display: grid) {
172
172
  .marker-menu-content {
173
173
  display: grid;
174
- grid-template-columns: repeat(3, minmax(22px, 1fr));
174
+ grid-template-columns: repeat(3, 30px);
175
175
  justify-items: center;
176
176
  align-items: center;
177
- column-gap: 8px;
177
+ column-gap: 6px;
178
178
  row-gap: 6px;
179
179
  }
180
180
  }
@@ -189,80 +189,170 @@ body {
189
189
 
190
190
  @supports (display: grid) {
191
191
  .menu-popup.leaflet-v1 .marker-menu-content {
192
- grid-template-columns: repeat(3, minmax(32px, 1fr));
193
- margin-right: 12px;
192
+ grid-template-columns: repeat(3, 30px);
193
+ margin-right: 0;
194
194
  }
195
195
  }
196
196
 
197
197
  .marker-menu-content .marker-menu-button {
198
+ position: relative;
199
+ display: flex;
200
+ align-items: center;
201
+ justify-content: center;
198
202
  width: 22px;
199
203
  height: 22px;
200
204
  background-repeat: no-repeat;
201
205
  background-size: 22px, 22px;
202
206
  background-position: center;
203
207
  padding: 4px;
204
- border: 1px solid #fff;
205
- margin: 4px;
208
+ border: 1px solid #d8dee7;
209
+ margin: 0;
206
210
  border-radius: 4px;
211
+ background-color: #eef2f7;
207
212
  cursor: pointer;
213
+ transition:
214
+ background-color 120ms ease,
215
+ border-color 120ms ease,
216
+ box-shadow 120ms ease;
217
+ }
218
+
219
+ .marker-menu-content .marker-menu-button::before {
220
+ content: '';
221
+ width: 22px;
222
+ height: 22px;
223
+ background-image: var(--polydraw-action-icon, none);
224
+ background-repeat: no-repeat;
225
+ background-position: center;
226
+ background-size: contain;
227
+ filter: brightness(0);
228
+ opacity: 0.72;
229
+ pointer-events: none;
230
+ }
231
+
232
+ .marker-menu-content .marker-menu-button:hover {
233
+ border-color: #94a3b8;
234
+ background-color: #e2e8f0;
235
+ }
236
+
237
+ .marker-menu-content .marker-menu-button:focus-visible {
238
+ outline: none;
239
+ box-shadow: 0 0 0 2px rgb(37 99 235 / 32%);
208
240
  }
209
241
 
210
242
  .marker-menu-content .marker-menu-button.simplify {
211
- background-image: url('../icons/icon-simplify2.svg');
243
+ --polydraw-action-icon: url('../icons/icon-simplify2.svg');
212
244
  }
213
245
 
214
246
  .marker-menu-content .marker-menu-button.double-elbows {
215
- background-image: url('../icons/icon-double-elbows.svg');
247
+ --polydraw-action-icon: url('../icons/icon-double-elbows.svg');
216
248
  }
217
249
 
218
250
  .marker-menu-content .marker-menu-button.bbox {
219
- background-image: url('../icons/icon-bbox.svg');
251
+ --polydraw-action-icon: url('../icons/icon-bbox.svg');
220
252
  }
221
253
 
222
254
  .marker-menu-content .marker-menu-button.bezier {
223
- background-image: url('../icons/icon-bezier.svg');
255
+ --polydraw-action-icon: url('../icons/icon-bezier.svg');
224
256
  position: relative;
225
- overflow: hidden;
257
+ overflow: visible;
226
258
  }
227
259
 
228
260
  .marker-menu-content .marker-menu-button.transform-scale {
229
- background-image: url('../icons/icon-resize.svg');
261
+ --polydraw-action-icon: url('../icons/icon-resize.svg');
230
262
  }
231
263
 
232
264
  .marker-menu-content .marker-menu-button.transform-rotate {
233
- background-image: url('../icons/icon-rotate.svg');
265
+ --polydraw-action-icon: url('../icons/icon-rotate.svg');
234
266
  }
235
267
 
236
268
  .marker-menu-content .marker-menu-button.transform-donut {
237
- background-image: url('../icons/icon-donut.svg');
269
+ --polydraw-action-icon: url('../icons/icon-donut.svg');
270
+ }
271
+
272
+ .marker-menu-content .marker-menu-button.polygon-color {
273
+ --polydraw-action-icon: url('../icons/icon-color.svg');
274
+ }
275
+
276
+ .marker-menu-content .marker-menu-button.polygon-move-to-layer {
277
+ --polydraw-action-icon: url('../icons/icon-move-to-layer.svg');
238
278
  }
239
279
 
240
280
  .marker-menu-content .marker-menu-button.menu-action-default {
241
- background-image: url("data:image/svg+xml,%3Csvg fill='%23ffffff' stroke='%23ffffff' xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 100 100'%3E%3Cpath d='M79.2 32.8c-.2-.7-1.1-.9-1.7-.4L67.4 42.5c-.8.8-2 .8-2.8 0l-7.1-7.1c-.8-.8-.8-2 0-2.8l10.2-10.2c.5-.5.3-1.4-.4-1.7-1.7-.4-3.5-.7-5.3-.7-10.6 0-19.1 9.2-17.9 20 .2 1.7.6 3.2 1.2 4.7L22 68.1c-2.7 2.7-2.7 7.2 0 9.9 1.4 1.4 3.2 2.1 5 2.1s3.6-.7 5-2.1l23.3-23.3c1.5.6 3.1 1 4.7 1.2C70.9 57.1 80 48.6 80 38c0-1.8-.3-3.6-.8-5.2z'/%3E%3C/svg%3E");
281
+ --polydraw-action-icon: url("data:image/svg+xml,%3Csvg fill='%23ffffff' stroke='%23ffffff' xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 100 100'%3E%3Cpath d='M79.2 32.8c-.2-.7-1.1-.9-1.7-.4L67.4 42.5c-.8.8-2 .8-2.8 0l-7.1-7.1c-.8-.8-.8-2 0-2.8l10.2-10.2c.5-.5.3-1.4-.4-1.7-1.7-.4-3.5-.7-5.3-.7-10.6 0-19.1 9.2-17.9 20 .2 1.7.6 3.2 1.2 4.7L22 68.1c-2.7 2.7-2.7 7.2 0 9.9 1.4 1.4 3.2 2.1 5 2.1s3.6-.7 5-2.1l23.3-23.3c1.5.6 3.1 1 4.7 1.2C70.9 57.1 80 48.6 80 38c0-1.8-.3-3.6-.8-5.2z'/%3E%3C/svg%3E");
242
282
  }
243
283
 
244
284
  .marker-menu-content .marker-menu-button.menu-action-custom,
245
285
  .marker-menu-content .marker-menu-button.menu-action-default {
246
286
  position: relative;
247
- border-color: #ffffff;
248
- background-color: rgba(6, 78, 59, 0.64);
249
- box-shadow:
250
- 0 0 0 2px #064e3b,
251
- 0 2px 8px rgba(0, 0, 0, 0.26);
287
+ border-color: #99d5ca;
288
+ background-color: #e6fffa;
289
+ box-shadow: inset 0 -2px 0 #0f766e;
290
+ }
291
+
292
+ .marker-menu-content .marker-menu-button.menu-action-custom:hover,
293
+ .marker-menu-content .marker-menu-button.menu-action-default:hover {
294
+ border-color: #5eead4;
295
+ background-color: #ccfbf1;
296
+ }
297
+
298
+ .marker-menu-tooltip {
299
+ position: absolute;
300
+ top: calc(100% + 8px);
301
+ left: 50%;
302
+ z-index: 20;
303
+ padding: 4px 8px;
304
+ border-radius: 4px;
305
+ background: var(--polydraw-tooltip-bg, #645d5d);
306
+ color: var(--polydraw-tooltip-color, #ffffff);
307
+ font-size: 12px;
308
+ font-weight: 400;
309
+ line-height: 1.2;
310
+ white-space: nowrap;
311
+ opacity: 0;
312
+ visibility: hidden;
313
+ pointer-events: none;
314
+ transform: translate(-50%, -2px);
315
+ transition:
316
+ opacity 0.12s ease,
317
+ transform 0.12s ease;
318
+ transition-delay: 0s;
319
+ }
320
+
321
+ .marker-menu-tooltip::before {
322
+ content: '';
323
+ position: absolute;
324
+ bottom: 100%;
325
+ left: 50%;
326
+ border-right: 5px solid transparent;
327
+ border-bottom: 5px solid var(--polydraw-tooltip-bg, #645d5d);
328
+ border-left: 5px solid transparent;
329
+ transform: translateX(-50%);
330
+ }
331
+
332
+ .marker-menu-button:hover > .marker-menu-tooltip,
333
+ .marker-menu-button:focus-visible > .marker-menu-tooltip {
334
+ opacity: 1;
335
+ visibility: visible;
336
+ transform: translate(-50%, 0);
337
+ transition-delay: var(--polydraw-tooltip-delay, 500ms);
338
+ }
339
+
340
+ .alter-marker-outer-wrapper[data-tooltip-enabled='false'] .marker-menu-tooltip {
341
+ display: none;
252
342
  }
253
343
 
254
344
  .marker-menu-content .marker-menu-button.menu-action-custom.make-triangle {
255
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23ffffff' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round' d='M12 4 21 20H3L12 4Z'/%3E%3C/svg%3E");
345
+ --polydraw-action-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23ffffff' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round' d='M12 4 21 20H3L12 4Z'/%3E%3C/svg%3E");
256
346
  }
257
347
 
258
348
  .marker-menu-content
259
349
  .marker-menu-button.toggle-visual-optimization.visual-optimization-state-visible {
260
- background-image: url('../icons/icon-visual-optimization-show.svg');
350
+ --polydraw-action-icon: url('../icons/icon-visual-optimization-show.svg');
261
351
  }
262
352
 
263
353
  .marker-menu-content
264
354
  .marker-menu-button.toggle-visual-optimization.visual-optimization-state-hidden {
265
- background-image: url('../icons/icon-visual-optimization-hide.svg');
355
+ --polydraw-action-icon: url('../icons/icon-visual-optimization-hide.svg');
266
356
  }
267
357
 
268
358
  .marker-menu-button {
@@ -307,43 +397,172 @@ body {
307
397
  }
308
398
 
309
399
  .alter-marker-outer-wrapper,
400
+ .info-marker-outer-wrapper {
401
+ overflow: visible;
402
+ border: 1px solid #cbd5e1;
403
+ border-radius: 8px;
404
+ background-color: #f8fafc;
405
+ box-shadow: 0 10px 24px rgb(15 23 42 / 24%);
406
+ }
407
+
310
408
  .info-marker-outer-wrapper {
311
409
  overflow: hidden;
312
- background-color: #80be50;
313
- border-radius: 12px;
314
- box-shadow: 3px 4px 20px #00000080;
315
410
  }
316
411
 
317
412
  .alter-marker-wrapper,
318
413
  .info-marker-wrapper {
319
414
  min-height: 40px;
320
- border: 2px solid transparent;
321
- background-color: #80be50;
322
- color: #fff;
415
+ border: 0;
416
+ background-color: #f8fafc;
417
+ color: #1f2937;
323
418
  padding: 0 6px;
324
- text-align: center;
325
- border-radius: 12px;
326
- text-align: center;
419
+ border-radius: 8px;
327
420
  position: relative;
328
421
  }
422
+
423
+ .info-marker-outer-wrapper,
424
+ .info-marker-wrapper {
425
+ background: #f8fafc;
426
+ color: #1f2937;
427
+ }
428
+
429
+ .info-marker-wrapper {
430
+ box-sizing: border-box;
431
+ min-width: 220px;
432
+ min-height: 0;
433
+ padding: 10px 12px;
434
+ border-color: #f8fafc;
435
+ border-radius: 8px;
436
+ text-align: left;
437
+ }
438
+
439
+ .info-marker-wrapper .content {
440
+ width: 100%;
441
+ margin-right: 0;
442
+ padding: 0;
443
+ display: block;
444
+ }
445
+
446
+ .info-marker-content {
447
+ width: 100%;
448
+ display: grid;
449
+ gap: 5px;
450
+ }
451
+
452
+ .info-marker-layer {
453
+ min-width: 0;
454
+ margin: -2px -2px 3px;
455
+ padding: 0 20px 8px 0;
456
+ display: flex;
457
+ align-items: center;
458
+ gap: 8px;
459
+ border-bottom: 1px solid #e2e8f0;
460
+ }
461
+
462
+ .info-marker-layer-color {
463
+ width: 13px;
464
+ height: 13px;
465
+ flex: 0 0 13px;
466
+ border: 1px solid #cbd5e1;
467
+ border-radius: 50%;
468
+ }
469
+
470
+ .info-marker-layer-heading {
471
+ min-width: 0;
472
+ display: grid;
473
+ gap: 1px;
474
+ }
475
+
476
+ .info-marker-layer-heading strong {
477
+ overflow: hidden;
478
+ font-size: 12px;
479
+ line-height: 16px;
480
+ text-overflow: ellipsis;
481
+ white-space: nowrap;
482
+ }
483
+
484
+ .info-marker-layer-heading span {
485
+ color: #64748b;
486
+ font-size: 9px;
487
+ line-height: 12px;
488
+ }
489
+
490
+ .info-marker-row {
491
+ min-width: 0;
492
+ display: grid;
493
+ grid-template-columns: minmax(62px, auto) minmax(0, 1fr);
494
+ gap: 10px;
495
+ align-items: baseline;
496
+ font-size: 11px;
497
+ line-height: 15px;
498
+ }
499
+
500
+ .info-marker-label {
501
+ color: #64748b;
502
+ }
503
+
504
+ .info-marker-value {
505
+ min-width: 0;
506
+ color: #1f2937;
507
+ font-weight: 650;
508
+ text-align: right;
509
+ overflow-wrap: anywhere;
510
+ }
511
+
512
+ .info-marker-secondary-value {
513
+ display: block;
514
+ margin-top: 1px;
515
+ color: #64748b;
516
+ font-size: 9px;
517
+ font-weight: 400;
518
+ white-space: nowrap;
519
+ }
520
+
521
+ .info-marker-metadata {
522
+ margin-top: 3px;
523
+ padding-top: 7px;
524
+ display: grid;
525
+ gap: 5px;
526
+ border-top: 1px solid #e2e8f0;
527
+ }
528
+
529
+ .alter-marker-outer-wrapper.polygon-color-mode,
530
+ .alter-marker-outer-wrapper.polygon-color-mode .alter-marker-wrapper,
531
+ .alter-marker-outer-wrapper.polygon-layer-mode,
532
+ .alter-marker-outer-wrapper.polygon-layer-mode .alter-marker-wrapper {
533
+ background-color: #ffffff;
534
+ }
535
+
536
+ .alter-marker-outer-wrapper.polygon-color-mode .alter-marker-wrapper,
537
+ .alter-marker-outer-wrapper.polygon-layer-mode .alter-marker-wrapper {
538
+ border-color: #ffffff;
539
+ color: #1f2937;
540
+ padding: 0;
541
+ }
542
+
329
543
  .content {
330
544
  width: auto;
331
- min-height: 40px;
332
- margin-right: 12px;
545
+ min-height: 0;
546
+ margin-right: 18px;
547
+ padding: 8px 4px;
333
548
  display: flex;
334
549
  align-items: center;
335
550
  }
336
551
 
552
+ .content[hidden] {
553
+ display: none;
554
+ }
555
+
337
556
  .marker-menu-close {
338
557
  position: absolute;
339
- top: 0;
340
- right: 0;
558
+ top: 3px;
559
+ right: 3px;
341
560
  width: 24px;
342
561
  height: 24px;
343
562
  padding: 0;
344
563
  border: none;
345
564
  background: transparent;
346
- color: #fff;
565
+ color: #334155;
347
566
  font-size: 18px;
348
567
  line-height: 1;
349
568
  display: flex;
@@ -355,8 +574,278 @@ body {
355
574
  }
356
575
 
357
576
  .marker-menu-close:focus {
358
- outline: 2px solid #fff8;
359
- outline-offset: 2px;
577
+ outline: none;
578
+ box-shadow: 0 0 0 2px rgb(37 99 235 / 24%);
579
+ border-radius: 3px;
580
+ }
581
+
582
+ .polygon-color-mode .marker-menu-close,
583
+ .polygon-layer-mode .marker-menu-close {
584
+ color: #334155;
585
+ }
586
+
587
+ .polygon-color-mode .marker-menu-close:focus,
588
+ .polygon-layer-mode .marker-menu-close:focus {
589
+ outline-color: rgba(80, 98, 43, 0.45);
590
+ }
591
+
592
+ .polygon-color-picker {
593
+ width: 248px;
594
+ padding: 6px 8px 8px;
595
+ border-radius: 8px;
596
+ background: #ffffff;
597
+ color: #1f2937;
598
+ }
599
+
600
+ .polydraw-color-map,
601
+ .polygon-color-map {
602
+ position: relative;
603
+ width: 234px;
604
+ height: 199px;
605
+ margin: 6px auto 7px;
606
+ }
607
+
608
+ .polydraw-color-swatch,
609
+ .polygon-color-swatch {
610
+ position: absolute;
611
+ width: 18px;
612
+ height: 20px;
613
+ border: 0;
614
+ clip-path: polygon(50% 0, 100% 22%, 100% 78%, 50% 100%, 0 78%, 0 22%);
615
+ padding: 0;
616
+ cursor: pointer;
617
+ }
618
+
619
+ .polydraw-color-swatch:hover,
620
+ .polydraw-color-swatch.selected,
621
+ .polygon-color-swatch:hover,
622
+ .polygon-color-swatch.selected {
623
+ z-index: 2;
624
+ outline: 2px solid #1f2937;
625
+ outline-offset: 1px;
626
+ }
627
+
628
+ .polygon-color-toolbar {
629
+ display: flex;
630
+ align-items: center;
631
+ height: 24px;
632
+ padding-right: 24px;
633
+ }
634
+
635
+ .polydraw-dialog-button {
636
+ height: 28px;
637
+ border: 1px solid #cbd5e1;
638
+ border-radius: 4px;
639
+ background: #f8fafc;
640
+ color: #1f2937;
641
+ font-size: 11px;
642
+ line-height: 1;
643
+ cursor: pointer;
644
+ }
645
+
646
+ .polygon-color-back {
647
+ width: 26px;
648
+ height: 24px;
649
+ padding: 0;
650
+ border: 0;
651
+ background: transparent;
652
+ color: #50622b;
653
+ cursor: pointer;
654
+ display: flex;
655
+ align-items: center;
656
+ justify-content: center;
657
+ }
658
+
659
+ .polygon-color-back svg {
660
+ width: 22px;
661
+ height: 22px;
662
+ fill: none;
663
+ stroke: currentColor;
664
+ stroke-width: 2.4;
665
+ stroke-linecap: round;
666
+ stroke-linejoin: round;
667
+ }
668
+
669
+ .polydraw-dialog-button-primary {
670
+ background: #2563eb;
671
+ border-color: #1d4ed8;
672
+ color: #ffffff;
673
+ }
674
+
675
+ .polygon-color-preview {
676
+ height: 18px;
677
+ margin: 0 7px 7px;
678
+ border: 1px solid rgba(0, 0, 0, 0.35);
679
+ border-radius: 4px;
680
+ }
681
+
682
+ .polygon-color-custom-row {
683
+ display: grid;
684
+ grid-template-columns: 34px 1fr 36px;
685
+ gap: 6px;
686
+ align-items: center;
687
+ }
688
+
689
+ .polydraw-color-input,
690
+ .polygon-color-custom-row input[type='color'] {
691
+ width: 34px;
692
+ height: 28px;
693
+ padding: 0;
694
+ border: 1px solid #cbd5e1;
695
+ border-radius: 4px;
696
+ background: #ffffff;
697
+ color-scheme: light;
698
+ }
699
+
700
+ .polygon-color-custom-row input[type='range'] {
701
+ min-width: 0;
702
+ }
703
+
704
+ .polygon-color-opacity-value {
705
+ color: #1f2937;
706
+ font-size: 12px;
707
+ text-align: right;
708
+ }
709
+
710
+ .polygon-color-actions {
711
+ display: grid;
712
+ grid-template-columns: 1fr 1fr;
713
+ gap: 6px;
714
+ margin-top: 8px;
715
+ }
716
+
717
+ .polygon-layer-picker {
718
+ width: 248px;
719
+ padding: 6px 8px 8px;
720
+ border-radius: 8px;
721
+ background: #ffffff;
722
+ color: #1f2937;
723
+ }
724
+
725
+ .polygon-layer-toolbar {
726
+ min-height: 28px;
727
+ padding-right: 24px;
728
+ display: flex;
729
+ align-items: center;
730
+ gap: 6px;
731
+ }
732
+
733
+ .polygon-layer-toolbar strong {
734
+ font-size: 12px;
735
+ font-weight: 650;
736
+ }
737
+
738
+ .polygon-layer-options {
739
+ max-height: 180px;
740
+ margin-top: 4px;
741
+ overflow-y: auto;
742
+ border: 1px solid #dbe3ec;
743
+ border-radius: 4px;
744
+ background: #ffffff;
745
+ }
746
+
747
+ .polygon-layer-option {
748
+ box-sizing: border-box;
749
+ width: 100%;
750
+ min-height: 30px;
751
+ padding: 4px 8px;
752
+ display: flex;
753
+ align-items: center;
754
+ gap: 7px;
755
+ border: 0;
756
+ border-bottom: 1px solid #e5e7eb;
757
+ border-radius: 0;
758
+ background: #ffffff;
759
+ color: #1f2937;
760
+ font-size: 11px;
761
+ text-align: left;
762
+ cursor: pointer;
763
+ }
764
+
765
+ .polygon-layer-option:last-child {
766
+ border-bottom: 0;
767
+ }
768
+
769
+ .polygon-layer-option:hover {
770
+ background: #f3f7ff;
771
+ }
772
+
773
+ .polygon-layer-option.selected {
774
+ background: #e8f0ff;
775
+ box-shadow: inset 3px 0 0 #2563eb;
776
+ }
777
+
778
+ .polygon-layer-option-color {
779
+ width: 13px;
780
+ height: 13px;
781
+ flex: 0 0 13px;
782
+ border: 1px solid #cbd5e1;
783
+ border-radius: 50%;
784
+ }
785
+
786
+ .polygon-layer-option-label {
787
+ min-width: 0;
788
+ flex: 1;
789
+ overflow: hidden;
790
+ text-overflow: ellipsis;
791
+ white-space: nowrap;
792
+ }
793
+
794
+ .polygon-layer-option-state {
795
+ color: #64748b;
796
+ font-size: 9px;
797
+ }
798
+
799
+ .polygon-layer-option-new {
800
+ font-weight: 650;
801
+ }
802
+
803
+ .polygon-layer-new-name {
804
+ margin-top: 8px;
805
+ display: grid;
806
+ gap: 4px;
807
+ }
808
+
809
+ .polygon-layer-new-name[hidden] {
810
+ display: none;
811
+ }
812
+
813
+ .polygon-layer-new-name > span {
814
+ color: #475569;
815
+ font-size: 11px;
816
+ font-weight: 650;
817
+ }
818
+
819
+ .polygon-layer-new-name input[type='text'] {
820
+ appearance: none;
821
+ box-sizing: border-box;
822
+ width: 100%;
823
+ height: 32px;
824
+ padding: 0 8px;
825
+ border: 1px solid #cbd5e1;
826
+ border-radius: 4px;
827
+ background: #ffffff;
828
+ color: #1f2937;
829
+ color-scheme: light;
830
+ font-size: 13px;
831
+ }
832
+
833
+ .polygon-layer-new-name input[type='text']:focus {
834
+ border-color: #2563eb;
835
+ outline: 2px solid rgb(37 99 235 / 20%);
836
+ outline-offset: 0;
837
+ }
838
+
839
+ .polygon-layer-actions {
840
+ margin-top: 8px;
841
+ display: grid;
842
+ grid-template-columns: 1fr 1fr;
843
+ gap: 6px;
844
+ }
845
+
846
+ .polygon-layer-apply:disabled {
847
+ opacity: 0.45;
848
+ cursor: not-allowed;
360
849
  }
361
850
 
362
851
  .polydraw-transform-cancel,
@@ -541,6 +1030,10 @@ body {
541
1030
  color: white !important;
542
1031
  }
543
1032
 
1033
+ .info-popup .leaflet-popup-close-button {
1034
+ color: #50622b !important;
1035
+ }
1036
+
544
1037
  .leaflet-container .leaflet-control-attribution {
545
1038
  display: flex;
546
1039
  gap: 4px;
@@ -553,6 +1046,26 @@ body {
553
1046
  pointer-events: auto !important;
554
1047
  }
555
1048
 
1049
+ .leaflet-control.leaflet-bar:not(.polydraw-layer-panel) {
1050
+ border-radius: 5px;
1051
+ }
1052
+
1053
+ .leaflet-control.leaflet-bar:not(.polydraw-layer-panel) > .icon-activate {
1054
+ border-radius: 5px;
1055
+ }
1056
+
1057
+ .leaflet-control.leaflet-bar:not(.polydraw-layer-panel) > .icon-activate.active {
1058
+ border-radius: 5px 5px 0 0;
1059
+ }
1060
+
1061
+ .leaflet-control.leaflet-bar:not(.polydraw-layer-panel) > .sub-buttons a {
1062
+ border-radius: 0;
1063
+ }
1064
+
1065
+ .leaflet-control.leaflet-bar:not(.polydraw-layer-panel) > .sub-buttons a:last-child {
1066
+ border-radius: 0 0 5px 5px;
1067
+ }
1068
+
556
1069
  .leaflet-control.leaflet-bar a {
557
1070
  pointer-events: auto !important;
558
1071
  touch-action: manipulation;
@@ -563,6 +1076,10 @@ body {
563
1076
  user-select: none;
564
1077
  }
565
1078
 
1079
+ .polydraw-toolbar a.polydraw-toolbar-button-disabled > svg {
1080
+ opacity: 0.3;
1081
+ }
1082
+
566
1083
  /* Custom tooltips for Polydraw toolbar buttons */
567
1084
  .leaflet-control.leaflet-bar a[data-tooltip] {
568
1085
  position: relative;
@@ -677,13 +1194,13 @@ body {
677
1194
 
678
1195
  /* Layer panel styles */
679
1196
  .polydraw-layer-panel {
680
- width: 206px;
681
- min-width: 206px;
682
- max-width: 206px;
1197
+ width: 226px;
1198
+ min-width: 226px;
1199
+ max-width: 226px;
683
1200
  z-index: 900 !important;
684
1201
  background: #fff;
685
1202
  border: 1px solid #ccc;
686
- border-radius: 8px;
1203
+ border-radius: 5px;
687
1204
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
688
1205
  padding: 0;
689
1206
  font-family:
@@ -695,8 +1212,17 @@ body {
695
1212
  overflow: hidden;
696
1213
  }
697
1214
 
698
- .leaflet-top.leaflet-right .polydraw-layer-panel.leaflet-control {
1215
+ .leaflet-top.leaflet-right .polydraw-layer-panel.leaflet-control,
1216
+ .leaflet-top.leaflet-right .polydraw-toolbar.leaflet-control {
699
1217
  clear: none;
1218
+ }
1219
+
1220
+ .leaflet-top.leaflet-right .polydraw-toolbar.leaflet-control {
1221
+ z-index: 2100 !important;
1222
+ overflow: visible;
1223
+ }
1224
+
1225
+ .leaflet-top.leaflet-right .polydraw-layer-panel.leaflet-control {
700
1226
  margin-right: 4px;
701
1227
  }
702
1228
 
@@ -782,6 +1308,14 @@ body {
782
1308
  display: none;
783
1309
  }
784
1310
 
1311
+ .polydraw-layer-panel-body {
1312
+ max-height: min(420px, var(--polydraw-layer-panel-available-height, calc(100vh - 80px)));
1313
+ overflow-x: hidden;
1314
+ overflow-y: auto;
1315
+ overscroll-behavior: contain;
1316
+ scrollbar-gutter: stable;
1317
+ }
1318
+
785
1319
  .polydraw-layer-row {
786
1320
  display: flex;
787
1321
  align-items: center;
@@ -796,6 +1330,84 @@ body {
796
1330
  outline: none;
797
1331
  }
798
1332
 
1333
+ .polydraw-layer-section-header {
1334
+ display: flex;
1335
+ align-items: baseline;
1336
+ gap: 4px;
1337
+ padding: 6px 8px 4px;
1338
+ background: #f7f7f7;
1339
+ border-bottom: 1px solid #e5e5e5;
1340
+ }
1341
+
1342
+ .polydraw-layer-section-title {
1343
+ color: #333;
1344
+ font-size: 10.5px;
1345
+ font-weight: 700;
1346
+ text-transform: uppercase;
1347
+ }
1348
+
1349
+ .polydraw-layer-section-detail {
1350
+ min-width: 0;
1351
+ overflow: hidden;
1352
+ color: #666;
1353
+ font-size: 10.5px;
1354
+ text-overflow: ellipsis;
1355
+ white-space: nowrap;
1356
+ }
1357
+
1358
+ .polydraw-layer-section-delete {
1359
+ width: 22px;
1360
+ min-width: 22px;
1361
+ height: 22px;
1362
+ margin: -4px -4px -2px auto;
1363
+ padding: 2px;
1364
+ display: inline-flex;
1365
+ align-items: center;
1366
+ justify-content: center;
1367
+ border: 0;
1368
+ border-radius: 3px;
1369
+ background: transparent;
1370
+ color: #333;
1371
+ cursor: pointer;
1372
+ }
1373
+
1374
+ .polydraw-layer-section-delete:hover {
1375
+ background: #e7e7e7;
1376
+ }
1377
+
1378
+ .polydraw-layer-section-delete:focus-visible {
1379
+ outline: none;
1380
+ box-shadow: inset 0 0 0 2px rgba(33, 150, 243, 0.35);
1381
+ }
1382
+
1383
+ .polydraw-layer-section-delete svg {
1384
+ width: 16px;
1385
+ height: 16px;
1386
+ }
1387
+
1388
+ .polydraw-layer-add-draw {
1389
+ width: 100%;
1390
+ min-height: 30px;
1391
+ padding: 0 8px;
1392
+ background: #fff;
1393
+ border: 0;
1394
+ border-bottom: 1px solid #e0e0e0;
1395
+ color: #333;
1396
+ cursor: pointer;
1397
+ font-size: 11.5px;
1398
+ font-weight: 600;
1399
+ text-align: left;
1400
+ }
1401
+
1402
+ .polydraw-layer-add-draw:hover {
1403
+ background: #f3f7ff;
1404
+ }
1405
+
1406
+ .polydraw-layer-add-draw:focus-visible {
1407
+ outline: none;
1408
+ box-shadow: inset 0 0 0 2px rgba(33, 150, 243, 0.35);
1409
+ }
1410
+
799
1411
  .polydraw-layer-row:hover {
800
1412
  background: #f9f9f9;
801
1413
  }
@@ -867,6 +1479,7 @@ body {
867
1479
  .polydraw-layer-color-indicator {
868
1480
  width: 12px;
869
1481
  height: 12px;
1482
+ padding: 0;
870
1483
  border-radius: 50%;
871
1484
  border: 1px solid #ccc;
872
1485
  flex-shrink: 0;
@@ -901,6 +1514,16 @@ body {
901
1514
  height: 24px;
902
1515
  }
903
1516
 
1517
+ .polydraw-layer-edit {
1518
+ width: 22px;
1519
+ color: #475569;
1520
+ }
1521
+
1522
+ .polydraw-layer-edit svg {
1523
+ width: 15px;
1524
+ height: 15px;
1525
+ }
1526
+
904
1527
  .polydraw-layer-visibility {
905
1528
  color: #333;
906
1529
  }
@@ -919,6 +1542,284 @@ body {
919
1542
  box-shadow: none !important;
920
1543
  }
921
1544
 
1545
+ .polydraw-layer-dialog-backdrop {
1546
+ position: fixed;
1547
+ inset: 0;
1548
+ z-index: 10000;
1549
+ display: flex;
1550
+ align-items: center;
1551
+ justify-content: center;
1552
+ padding: 16px;
1553
+ background: rgba(15, 23, 42, 0.38);
1554
+ }
1555
+
1556
+ .polydraw-layer-dialog {
1557
+ box-sizing: border-box;
1558
+ width: min(280px, calc(100vw - 32px));
1559
+ padding: 0;
1560
+ overflow: hidden;
1561
+ border: 1px solid #cbd5e1;
1562
+ border-radius: 5px;
1563
+ background: #fff;
1564
+ box-shadow: 0 12px 32px rgba(15, 23, 42, 0.28);
1565
+ color: #1f2937;
1566
+ font-family:
1567
+ -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
1568
+ }
1569
+
1570
+ .polydraw-layer-dialog-header {
1571
+ height: 38px;
1572
+ padding: 0 8px 0 12px;
1573
+ display: flex;
1574
+ align-items: center;
1575
+ border-bottom: 1px solid #e2e8f0;
1576
+ }
1577
+
1578
+ .polydraw-layer-dialog-header h2 {
1579
+ margin: 0;
1580
+ font-size: 14px;
1581
+ font-weight: 650;
1582
+ }
1583
+
1584
+ .polydraw-layer-dialog-back {
1585
+ width: 28px;
1586
+ height: 30px;
1587
+ margin-left: -6px;
1588
+ padding: 0;
1589
+ display: inline-flex;
1590
+ align-items: center;
1591
+ justify-content: center;
1592
+ border: 0;
1593
+ background: transparent;
1594
+ color: #334155;
1595
+ cursor: pointer;
1596
+ }
1597
+
1598
+ .polydraw-layer-dialog-back[hidden] {
1599
+ display: none;
1600
+ }
1601
+
1602
+ .polydraw-layer-dialog-back svg {
1603
+ width: 20px;
1604
+ height: 20px;
1605
+ fill: none;
1606
+ stroke: currentColor;
1607
+ stroke-width: 2;
1608
+ stroke-linecap: round;
1609
+ stroke-linejoin: round;
1610
+ }
1611
+
1612
+ .polydraw-layer-dialog-close {
1613
+ width: 30px;
1614
+ height: 30px;
1615
+ margin-left: auto;
1616
+ padding: 0;
1617
+ border: 0;
1618
+ background: transparent;
1619
+ color: #50622b;
1620
+ font-size: 22px;
1621
+ line-height: 1;
1622
+ cursor: pointer;
1623
+ }
1624
+
1625
+ .polydraw-layer-dialog-field,
1626
+ .polydraw-layer-dialog-colors {
1627
+ margin: 0;
1628
+ padding: 12px;
1629
+ display: grid;
1630
+ gap: 7px;
1631
+ border: 0;
1632
+ }
1633
+
1634
+ .polydraw-layer-dialog-field {
1635
+ padding-bottom: 5px;
1636
+ }
1637
+
1638
+ .polydraw-layer-dialog-colors {
1639
+ padding-top: 5px;
1640
+ }
1641
+
1642
+ .polydraw-layer-dialog-field > span,
1643
+ .polydraw-layer-dialog-colors legend {
1644
+ padding: 0;
1645
+ color: #475569;
1646
+ font-size: 11px;
1647
+ font-weight: 650;
1648
+ }
1649
+
1650
+ .polydraw-layer-dialog-field input[type='text'] {
1651
+ appearance: none;
1652
+ box-sizing: border-box;
1653
+ width: 100%;
1654
+ height: 32px;
1655
+ padding: 0 8px;
1656
+ border: 1px solid #cbd5e1;
1657
+ border-radius: 4px;
1658
+ background: #ffffff;
1659
+ color: #1f2937;
1660
+ color-scheme: light;
1661
+ font-size: 13px;
1662
+ }
1663
+
1664
+ .polydraw-layer-dialog .polydraw-color-map {
1665
+ margin-top: 0;
1666
+ margin-bottom: 4px;
1667
+ }
1668
+
1669
+ .polydraw-layer-dialog-custom-color {
1670
+ display: flex;
1671
+ align-items: center;
1672
+ gap: 8px;
1673
+ }
1674
+
1675
+ .polydraw-layer-dialog-custom-color input[type='color'] {
1676
+ cursor: pointer;
1677
+ }
1678
+
1679
+ .polydraw-layer-dialog-color-value {
1680
+ color: #64748b;
1681
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1682
+ font-size: 11px;
1683
+ }
1684
+
1685
+ .polydraw-layer-dialog-commands {
1686
+ padding: 0 12px 8px;
1687
+ }
1688
+
1689
+ .polydraw-layer-dialog-commands:empty {
1690
+ display: none;
1691
+ }
1692
+
1693
+ .polydraw-layer-dialog-merge {
1694
+ box-sizing: border-box;
1695
+ width: 100%;
1696
+ height: 32px;
1697
+ padding: 0 9px;
1698
+ display: flex;
1699
+ align-items: center;
1700
+ gap: 8px;
1701
+ border: 1px solid #cbd5e1;
1702
+ border-radius: 4px;
1703
+ background: #eef2f7;
1704
+ color: #334155;
1705
+ font-size: 12px;
1706
+ font-weight: 600;
1707
+ cursor: pointer;
1708
+ }
1709
+
1710
+ .polydraw-layer-dialog-merge:hover {
1711
+ border-color: #94a3b8;
1712
+ background: #e2e8f0;
1713
+ }
1714
+
1715
+ .polydraw-layer-dialog-merge svg {
1716
+ width: 18px;
1717
+ height: 18px;
1718
+ flex: 0 0 18px;
1719
+ }
1720
+
1721
+ .polydraw-layer-merge-panel {
1722
+ padding: 12px;
1723
+ }
1724
+
1725
+ .polydraw-layer-merge-panel[hidden],
1726
+ .polydraw-layer-dialog-actions[hidden] {
1727
+ display: none;
1728
+ }
1729
+
1730
+ .polydraw-layer-merge-options {
1731
+ max-height: 210px;
1732
+ margin-top: 0;
1733
+ }
1734
+
1735
+ .polydraw-layer-merge-style-choice {
1736
+ margin-top: 10px;
1737
+ padding: 8px 9px;
1738
+ display: flex;
1739
+ align-items: flex-start;
1740
+ gap: 8px;
1741
+ border: 1px solid #dbe3ec;
1742
+ border-radius: 4px;
1743
+ background: #f8fafc;
1744
+ color: #334155;
1745
+ cursor: pointer;
1746
+ }
1747
+
1748
+ .polydraw-layer-merge-style-choice[hidden] {
1749
+ display: none;
1750
+ }
1751
+
1752
+ .polydraw-layer-merge-style-choice input {
1753
+ appearance: none;
1754
+ width: 15px;
1755
+ height: 15px;
1756
+ margin: 1px 0 0;
1757
+ display: grid;
1758
+ place-content: center;
1759
+ border: 1px solid #94a3b8;
1760
+ border-radius: 3px;
1761
+ background: #fff;
1762
+ color-scheme: light;
1763
+ }
1764
+
1765
+ .polydraw-layer-merge-style-choice input::before {
1766
+ width: 4px;
1767
+ height: 8px;
1768
+ content: '';
1769
+ border: solid #fff;
1770
+ border-width: 0 2px 2px 0;
1771
+ opacity: 0;
1772
+ transform: translateY(-1px) rotate(45deg);
1773
+ }
1774
+
1775
+ .polydraw-layer-merge-style-choice input:checked {
1776
+ border-color: #2563eb;
1777
+ background: #2563eb;
1778
+ }
1779
+
1780
+ .polydraw-layer-merge-style-choice input:checked::before {
1781
+ opacity: 1;
1782
+ }
1783
+
1784
+ .polydraw-layer-merge-style-choice input:focus-visible {
1785
+ outline: 2px solid rgba(37, 99, 235, 0.35);
1786
+ outline-offset: 2px;
1787
+ }
1788
+
1789
+ .polydraw-layer-merge-style-choice span {
1790
+ display: grid;
1791
+ gap: 2px;
1792
+ }
1793
+
1794
+ .polydraw-layer-merge-style-choice strong {
1795
+ font-size: 12px;
1796
+ font-weight: 600;
1797
+ }
1798
+
1799
+ .polydraw-layer-merge-style-choice small {
1800
+ color: #64748b;
1801
+ font-size: 10px;
1802
+ line-height: 1.3;
1803
+ }
1804
+
1805
+ .polydraw-layer-dialog-actions {
1806
+ padding: 5px 12px 12px;
1807
+ display: grid;
1808
+ grid-template-columns: 1fr 1fr;
1809
+ gap: 6px;
1810
+ }
1811
+
1812
+ .polydraw-layer-dialog-cancel,
1813
+ .polydraw-layer-dialog-apply {
1814
+ height: 30px;
1815
+ font-size: 12px;
1816
+ }
1817
+
1818
+ .polydraw-layer-merge-apply:disabled {
1819
+ opacity: 0.45;
1820
+ cursor: not-allowed;
1821
+ }
1822
+
922
1823
  .polydraw-layer-btn:focus-visible {
923
1824
  outline: none;
924
1825
  box-shadow: 0 0 0 2px rgba(33, 150, 243, 0.35);
@@ -940,9 +1841,9 @@ body {
940
1841
 
941
1842
  @media (max-width: 768px) {
942
1843
  .polydraw-layer-panel {
943
- width: 196px;
944
- min-width: 196px;
945
- max-width: 196px;
1844
+ width: 216px;
1845
+ min-width: 216px;
1846
+ max-width: 216px;
946
1847
  }
947
1848
 
948
1849
  .polydraw-layer-row {