svgmap 2.20.1 → 2.21.0

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/svg-map.css CHANGED
@@ -204,6 +204,15 @@
204
204
  cursor: pointer;
205
205
  }
206
206
 
207
+ .svgMap-pin-group {
208
+ pointer-events: none;
209
+ }
210
+
211
+ .svgMap-pin {
212
+ vector-effect: non-scaling-stroke;
213
+ transition: r 250ms;
214
+ }
215
+
207
216
  .svgMap-tooltip,
208
217
  .svgMap-persistent-tooltip {
209
218
  box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);
@@ -1 +1 @@
1
- .svgMap-container,.svgMap-wrapper{position:relative}.svgMap-block-zoom-notice{position:absolute;z-index:2;top:100%;left:0;right:0;bottom:0;background:rgba(0,0,0,.8);pointer-events:none;opacity:0;color:#fff;transition:opacity 250ms}.svgMap-block-zoom-notice-active .svgMap-block-zoom-notice{pointer-events:all;top:0;opacity:1}.svgMap-block-zoom-notice>div{position:absolute;top:50%;left:0;right:0;text-align:center;padding:0 32px;transform:translateY(-50%);font-size:28px}@media (max-width:900px){.svgMap-block-zoom-notice>div{font-size:22px}}.svgMap-map-wrapper{position:relative;width:100%;padding-top:50%;overflow:hidden;background:#d9ecff;color:#111}.svgMap-map-wrapper *{box-sizing:border-box}.svgMap-map-wrapper :focus:not(:focus-visible){outline:0}.svgMap-map-wrapper .svgMap-map-image{display:block;position:absolute;top:0;left:0;width:100%;height:100%;margin:0}.svgMap-map-wrapper .svgMap-map-controls-wrapper{position:absolute;z-index:1;display:flex;overflow:hidden;border-radius:2px;box-shadow:0 0 0 2px rgba(0,0,0,.1)}.svgMap-map-wrapper .svgMap-map-controls-wrapper.svgMap-controls-position-bottomLeft{bottom:10px;left:10px}.svgMap-map-wrapper .svgMap-map-controls-wrapper.svgMap-controls-position-bottomRight{bottom:10px;right:10px}.svgMap-map-wrapper .svgMap-map-controls-wrapper.svgMap-controls-position-topLeft{top:10px;left:10px}.svgMap-map-wrapper .svgMap-map-controls-wrapper.svgMap-controls-position-topRight{top:10px;right:10px}.svgMap-map-wrapper .svgMap-map-controls-wrapper.svgMap-disabled{display:none}.svgMap-map-wrapper .svgMap-map-controls-move,.svgMap-map-wrapper .svgMap-map-controls-zoom{display:flex;margin-right:5px;overflow:hidden;background:#fff}.svgMap-map-wrapper .svgMap-map-controls-move:last-child,.svgMap-map-wrapper .svgMap-map-controls-zoom:last-child{margin-right:0}.svgMap-map-wrapper .svgMap-control-button{background-color:#fff;border:0;border-radius:0;color:#fff;font:inherit;line-height:inherit;margin:0;padding:0;overflow:visible;text-transform:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;width:32px;height:32px;position:relative}.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button::after,.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button::before{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:#ccc;transition:background-color 250ms}.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button::before{width:11px;height:3px}@media (hover:hover){.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button:hover::after,.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button:hover::before{background:#000}}.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button:active::after,.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button:active::before{background:#000}.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button.svgMap-zoom-reset-button::before{width:11px;height:11px;background:0 0;border:2px solid #ccc;transition:border-color 250ms}@media (hover:hover){.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button.svgMap-zoom-reset-button:hover::before{background:0 0;border-color:#000}}.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button.svgMap-zoom-reset-button:active::before{background:0 0;border-color:#000}.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button.svgMap-disabled::after,.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button.svgMap-disabled::before{background:#eee}.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button.svgMap-zoom-reset-button.svgMap-disabled{cursor:default}.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button.svgMap-zoom-reset-button.svgMap-disabled::before{border:2px solid #eee;background:0 0}.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-in-button::after{width:3px;height:11px}.svgMap-map-wrapper .svgMap-map-continent-controls-wrapper{position:absolute;top:10px;right:10px;z-index:1;display:flex;border-radius:2px;box-shadow:0 0 0 2px rgba(0,0,0,.1)}.svgMap-map-wrapper .svgMap-country{fill:var(--svg-map-country-fill, #E2E2E2);stroke:#fff;stroke-width:1;stroke-linejoin:round;vector-effect:non-scaling-stroke;transition:fill 250ms,stroke 250ms}.svgMap-map-wrapper .svgMap-country[data-link],.svgMap-wrapper.svgMap-country-click-callback .svgMap-map-wrapper .svgMap-country{cursor:pointer}@media (hover:hover){.svgMap-map-wrapper .svgMap-country:hover{stroke:#333;stroke-width:1.5}}.svgMap-map-wrapper .svgMap-country.svgMap-active{stroke:#333;stroke-width:1.5}.svgMap-persistent-tooltip,.svgMap-tooltip{box-shadow:0 0 3px rgba(0,0,0,.2);position:absolute;z-index:2;border-radius:2px;background:#fff;transform:translate(-50%,-100%);border-bottom:1px solid #111;pointer-events:none;min-width:60px}.svgMap-persistent-tooltip.svgMap-tooltip-flipped,.svgMap-tooltip.svgMap-tooltip-flipped{transform:translate(-50%,0);border-bottom:0;border-top:1px solid #111}.svgMap-persistent-tooltip .svgMap-tooltip-content-container,.svgMap-tooltip .svgMap-tooltip-content-container{position:relative;padding:10px 20px}.svgMap-persistent-tooltip .svgMap-tooltip-content-container .svgMap-tooltip-flag-container,.svgMap-tooltip .svgMap-tooltip-content-container .svgMap-tooltip-flag-container{text-align:center;margin:2px 0 5px}.svgMap-persistent-tooltip .svgMap-tooltip-content-container .svgMap-tooltip-flag-container.svgMap-tooltip-flag-container-emoji,.svgMap-tooltip .svgMap-tooltip-content-container .svgMap-tooltip-flag-container.svgMap-tooltip-flag-container-emoji{font-size:50px;line-height:0;padding:25px 0 15px}.svgMap-persistent-tooltip .svgMap-tooltip-content-container .svgMap-tooltip-flag-container .svgMap-tooltip-flag,.svgMap-tooltip .svgMap-tooltip-content-container .svgMap-tooltip-flag-container .svgMap-tooltip-flag{display:block;margin:auto;width:auto;height:32px;padding:2px;background:rgba(0,0,0,.15);border-radius:2px}.svgMap-persistent-tooltip .svgMap-tooltip-title,.svgMap-tooltip .svgMap-tooltip-title{white-space:nowrap;font-size:18px;line-height:28px;padding:0 0 8px;text-align:center}.svgMap-persistent-tooltip .svgMap-tooltip-content,.svgMap-tooltip .svgMap-tooltip-content{white-space:nowrap;text-align:center;font-size:14px;color:#777;margin:-5px 0 0}.svgMap-persistent-tooltip .svgMap-tooltip-content table,.svgMap-tooltip .svgMap-tooltip-content table{padding:0;border-spacing:0;margin:auto}.svgMap-persistent-tooltip .svgMap-tooltip-content table td,.svgMap-tooltip .svgMap-tooltip-content table td{padding:2px 0;text-align:left}.svgMap-persistent-tooltip .svgMap-tooltip-content table td span,.svgMap-tooltip .svgMap-tooltip-content table td span{color:#111}.svgMap-persistent-tooltip .svgMap-tooltip-content table td:first-child,.svgMap-tooltip .svgMap-tooltip-content table td:first-child{padding-right:10px;text-align:right}.svgMap-persistent-tooltip .svgMap-tooltip-content table td sup,.svgMap-tooltip .svgMap-tooltip-content table td sup{vertical-align:baseline;position:relative;top:-5px}.svgMap-persistent-tooltip .svgMap-tooltip-content .svgMap-tooltip-no-data,.svgMap-tooltip .svgMap-tooltip-content .svgMap-tooltip-no-data{padding:2px 0;color:#777;font-style:italic}.svgMap-persistent-tooltip .svgMap-tooltip-pointer,.svgMap-tooltip .svgMap-tooltip-pointer{position:absolute;top:100%;left:50%;transform:translateX(-50%);overflow:hidden;height:10px;width:30px}.svgMap-persistent-tooltip .svgMap-tooltip-pointer::after,.svgMap-tooltip .svgMap-tooltip-pointer::after{content:"";width:20px;height:20px;background:#fff;border:1px solid #111;position:absolute;bottom:6px;left:50%;transform:translateX(-50%) rotate(45deg)}.svgMap-persistent-tooltip.svgMap-tooltip-flipped .svgMap-tooltip-pointer,.svgMap-tooltip.svgMap-tooltip-flipped .svgMap-tooltip-pointer{bottom:auto;top:-10px;transform:translateX(-50%) scaleY(-1)}.svgMap-tooltip{display:none}.svgMap-tooltip.svgMap-active{display:block}.svgMap-persistent-tooltip-wrapper,.svgMap-persistent-tooltips{pointer-events:none}.svgMap-persistent-tooltip-wrapper{overflow:visible}.svgMap-persistent-tooltip{display:block;left:0;top:0;width:max-content}
1
+ .svgMap-container,.svgMap-wrapper{position:relative}.svgMap-block-zoom-notice{position:absolute;z-index:2;top:100%;left:0;right:0;bottom:0;background:rgba(0,0,0,.8);pointer-events:none;opacity:0;color:#fff;transition:opacity 250ms}.svgMap-block-zoom-notice-active .svgMap-block-zoom-notice{pointer-events:all;top:0;opacity:1}.svgMap-block-zoom-notice>div{position:absolute;top:50%;left:0;right:0;text-align:center;padding:0 32px;transform:translateY(-50%);font-size:28px}@media (max-width:900px){.svgMap-block-zoom-notice>div{font-size:22px}}.svgMap-map-wrapper{position:relative;width:100%;padding-top:50%;overflow:hidden;background:#d9ecff;color:#111}.svgMap-map-wrapper *{box-sizing:border-box}.svgMap-map-wrapper :focus:not(:focus-visible){outline:0}.svgMap-map-wrapper .svgMap-map-image{display:block;position:absolute;top:0;left:0;width:100%;height:100%;margin:0}.svgMap-map-wrapper .svgMap-map-controls-wrapper{position:absolute;z-index:1;display:flex;overflow:hidden;border-radius:2px;box-shadow:0 0 0 2px rgba(0,0,0,.1)}.svgMap-map-wrapper .svgMap-map-controls-wrapper.svgMap-controls-position-bottomLeft{bottom:10px;left:10px}.svgMap-map-wrapper .svgMap-map-controls-wrapper.svgMap-controls-position-bottomRight{bottom:10px;right:10px}.svgMap-map-wrapper .svgMap-map-controls-wrapper.svgMap-controls-position-topLeft{top:10px;left:10px}.svgMap-map-wrapper .svgMap-map-controls-wrapper.svgMap-controls-position-topRight{top:10px;right:10px}.svgMap-map-wrapper .svgMap-map-controls-wrapper.svgMap-disabled{display:none}.svgMap-map-wrapper .svgMap-map-controls-move,.svgMap-map-wrapper .svgMap-map-controls-zoom{display:flex;margin-right:5px;overflow:hidden;background:#fff}.svgMap-map-wrapper .svgMap-map-controls-move:last-child,.svgMap-map-wrapper .svgMap-map-controls-zoom:last-child{margin-right:0}.svgMap-map-wrapper .svgMap-control-button{background-color:#fff;border:0;border-radius:0;color:#fff;font:inherit;line-height:inherit;margin:0;padding:0;overflow:visible;text-transform:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;width:32px;height:32px;position:relative}.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button::after,.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button::before{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:#ccc;transition:background-color 250ms}.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button::before{width:11px;height:3px}@media (hover:hover){.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button:hover::after,.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button:hover::before{background:#000}}.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button:active::after,.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button:active::before{background:#000}.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button.svgMap-zoom-reset-button::before{width:11px;height:11px;background:0 0;border:2px solid #ccc;transition:border-color 250ms}@media (hover:hover){.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button.svgMap-zoom-reset-button:hover::before{background:0 0;border-color:#000}}.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button.svgMap-zoom-reset-button:active::before{background:0 0;border-color:#000}.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button.svgMap-disabled::after,.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button.svgMap-disabled::before{background:#eee}.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button.svgMap-zoom-reset-button.svgMap-disabled{cursor:default}.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button.svgMap-zoom-reset-button.svgMap-disabled::before{border:2px solid #eee;background:0 0}.svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-in-button::after{width:3px;height:11px}.svgMap-map-wrapper .svgMap-map-continent-controls-wrapper{position:absolute;top:10px;right:10px;z-index:1;display:flex;border-radius:2px;box-shadow:0 0 0 2px rgba(0,0,0,.1)}.svgMap-map-wrapper .svgMap-country{fill:var(--svg-map-country-fill, #E2E2E2);stroke:#fff;stroke-width:1;stroke-linejoin:round;vector-effect:non-scaling-stroke;transition:fill 250ms,stroke 250ms}.svgMap-map-wrapper .svgMap-country[data-link],.svgMap-wrapper.svgMap-country-click-callback .svgMap-map-wrapper .svgMap-country{cursor:pointer}@media (hover:hover){.svgMap-map-wrapper .svgMap-country:hover{stroke:#333;stroke-width:1.5}}.svgMap-map-wrapper .svgMap-country.svgMap-active{stroke:#333;stroke-width:1.5}.svgMap-pin-group{pointer-events:none}.svgMap-pin{vector-effect:non-scaling-stroke;transition:r 250ms}.svgMap-persistent-tooltip,.svgMap-tooltip{box-shadow:0 0 3px rgba(0,0,0,.2);position:absolute;z-index:2;border-radius:2px;background:#fff;transform:translate(-50%,-100%);border-bottom:1px solid #111;pointer-events:none;min-width:60px}.svgMap-persistent-tooltip.svgMap-tooltip-flipped,.svgMap-tooltip.svgMap-tooltip-flipped{transform:translate(-50%,0);border-bottom:0;border-top:1px solid #111}.svgMap-persistent-tooltip .svgMap-tooltip-content-container,.svgMap-tooltip .svgMap-tooltip-content-container{position:relative;padding:10px 20px}.svgMap-persistent-tooltip .svgMap-tooltip-content-container .svgMap-tooltip-flag-container,.svgMap-tooltip .svgMap-tooltip-content-container .svgMap-tooltip-flag-container{text-align:center;margin:2px 0 5px}.svgMap-persistent-tooltip .svgMap-tooltip-content-container .svgMap-tooltip-flag-container.svgMap-tooltip-flag-container-emoji,.svgMap-tooltip .svgMap-tooltip-content-container .svgMap-tooltip-flag-container.svgMap-tooltip-flag-container-emoji{font-size:50px;line-height:0;padding:25px 0 15px}.svgMap-persistent-tooltip .svgMap-tooltip-content-container .svgMap-tooltip-flag-container .svgMap-tooltip-flag,.svgMap-tooltip .svgMap-tooltip-content-container .svgMap-tooltip-flag-container .svgMap-tooltip-flag{display:block;margin:auto;width:auto;height:32px;padding:2px;background:rgba(0,0,0,.15);border-radius:2px}.svgMap-persistent-tooltip .svgMap-tooltip-title,.svgMap-tooltip .svgMap-tooltip-title{white-space:nowrap;font-size:18px;line-height:28px;padding:0 0 8px;text-align:center}.svgMap-persistent-tooltip .svgMap-tooltip-content,.svgMap-tooltip .svgMap-tooltip-content{white-space:nowrap;text-align:center;font-size:14px;color:#777;margin:-5px 0 0}.svgMap-persistent-tooltip .svgMap-tooltip-content table,.svgMap-tooltip .svgMap-tooltip-content table{padding:0;border-spacing:0;margin:auto}.svgMap-persistent-tooltip .svgMap-tooltip-content table td,.svgMap-tooltip .svgMap-tooltip-content table td{padding:2px 0;text-align:left}.svgMap-persistent-tooltip .svgMap-tooltip-content table td span,.svgMap-tooltip .svgMap-tooltip-content table td span{color:#111}.svgMap-persistent-tooltip .svgMap-tooltip-content table td:first-child,.svgMap-tooltip .svgMap-tooltip-content table td:first-child{padding-right:10px;text-align:right}.svgMap-persistent-tooltip .svgMap-tooltip-content table td sup,.svgMap-tooltip .svgMap-tooltip-content table td sup{vertical-align:baseline;position:relative;top:-5px}.svgMap-persistent-tooltip .svgMap-tooltip-content .svgMap-tooltip-no-data,.svgMap-tooltip .svgMap-tooltip-content .svgMap-tooltip-no-data{padding:2px 0;color:#777;font-style:italic}.svgMap-persistent-tooltip .svgMap-tooltip-pointer,.svgMap-tooltip .svgMap-tooltip-pointer{position:absolute;top:100%;left:50%;transform:translateX(-50%);overflow:hidden;height:10px;width:30px}.svgMap-persistent-tooltip .svgMap-tooltip-pointer::after,.svgMap-tooltip .svgMap-tooltip-pointer::after{content:"";width:20px;height:20px;background:#fff;border:1px solid #111;position:absolute;bottom:6px;left:50%;transform:translateX(-50%) rotate(45deg)}.svgMap-persistent-tooltip.svgMap-tooltip-flipped .svgMap-tooltip-pointer,.svgMap-tooltip.svgMap-tooltip-flipped .svgMap-tooltip-pointer{bottom:auto;top:-10px;transform:translateX(-50%) scaleY(-1)}.svgMap-tooltip{display:none}.svgMap-tooltip.svgMap-active{display:block}.svgMap-persistent-tooltip-wrapper,.svgMap-persistent-tooltips{pointer-events:none}.svgMap-persistent-tooltip-wrapper{overflow:visible}.svgMap-persistent-tooltip{display:block;left:0;top:0;width:max-content}
@@ -2379,7 +2379,34 @@
2379
2379
  showContinentSelector: false,
2380
2380
 
2381
2381
  // Reset zoom on resize
2382
- resetZoomOnResize: false
2382
+ resetZoomOnResize: false,
2383
+
2384
+ // Static pins: false | string[] | function(countryID, countryValues) => boolean
2385
+ staticPins: false,
2386
+
2387
+ // Default pin fill color
2388
+ pinColor: '#000000',
2389
+
2390
+ // Default pin stroke color and width (circle pins; width is in screen pixels with non-scaling stroke)
2391
+ pinStrokeColor: '#ffffff',
2392
+ pinStrokeWidth: 1.5,
2393
+
2394
+ // Default pin radius in SVG units (viewBox is 2000 × 1001)
2395
+ pinSize: 8,
2396
+
2397
+ // Custom pin element: function(countryID, countryValues) => SVGElement | null
2398
+ onGetPin: null,
2399
+
2400
+ // Image URL to use as a pin instead of the default circle (can also be set per-country via values[id].pinImage)
2401
+ pinImage: null,
2402
+
2403
+ // Width and height of the pin image in SVG units (viewBox is 2000 × 1001)
2404
+ pinImageWidth: 20,
2405
+ pinImageHeight: 20,
2406
+
2407
+ // Offset from computed pin position, in SVG units (added after auto center or pinX/pinY)
2408
+ pinOffsetX: 0,
2409
+ pinOffsetY: 0
2383
2410
  };
2384
2411
 
2385
2412
  this.options = Object.assign({}, defaultOptions, options);
@@ -3253,7 +3280,7 @@
3253
3280
  }
3254
3281
  countryElement.parentNode.insertBefore(
3255
3282
  countryElement,
3256
- this.persistentTooltipGroup || null
3283
+ this.persistentTooltipGroup || this.pinGroup || null
3257
3284
  );
3258
3285
  if (setActive) {
3259
3286
  countryElement.classList.add('svgMap-active');
@@ -3373,6 +3400,10 @@
3373
3400
  this.createPersistentTooltips(countryElements);
3374
3401
  }
3375
3402
 
3403
+ if (this.options.staticPins) {
3404
+ this.createStaticPins(countryElements);
3405
+ }
3406
+
3376
3407
  let pointerStart = null;
3377
3408
  let activeCountry = null;
3378
3409
 
@@ -3435,7 +3466,7 @@
3435
3466
  clearActive();
3436
3467
  countryElement.parentNode.insertBefore(
3437
3468
  countryElement,
3438
- this.persistentTooltipGroup || null
3469
+ this.persistentTooltipGroup || this.pinGroup || null
3439
3470
  );
3440
3471
  countryElement.classList.add('svgMap-active');
3441
3472
  this.setTooltipContent(this.getTooltipContent(countryID));
@@ -3449,7 +3480,7 @@
3449
3480
  clearActive();
3450
3481
  countryElement.parentNode.insertBefore(
3451
3482
  countryElement,
3452
- this.persistentTooltipGroup || null
3483
+ this.persistentTooltipGroup || this.pinGroup || null
3453
3484
  );
3454
3485
  countryElement.classList.add('svgMap-active');
3455
3486
  this.setTooltipContent(this.getTooltipContent(countryID));
@@ -3637,6 +3668,157 @@
3637
3668
  );
3638
3669
  }
3639
3670
 
3671
+ // Create static pins on the map
3672
+
3673
+ createStaticPins(countryElements) {
3674
+ if (this.pinGroup) {
3675
+ this.pinGroup.remove();
3676
+ }
3677
+
3678
+ this.pinGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');
3679
+ this.pinGroup.classList.add('svgMap-pin-group');
3680
+ this.mapImage.appendChild(this.pinGroup);
3681
+
3682
+ countryElements.forEach(
3683
+ function (countryElement) {
3684
+ var countryID = countryElement.getAttribute('data-id');
3685
+ if (!this.shouldShowPin(countryID)) {
3686
+ return;
3687
+ }
3688
+
3689
+ var countryValues = this.options.data.values[countryID];
3690
+ var cx, cy;
3691
+
3692
+ if (
3693
+ countryValues &&
3694
+ countryValues.pinX != null &&
3695
+ countryValues.pinY != null
3696
+ ) {
3697
+ cx = countryValues.pinX;
3698
+ cy = countryValues.pinY;
3699
+ } else {
3700
+ // Split the path at absolute M commands and use the largest sub-path
3701
+ // to avoid overseas territories (islands, colonies) skewing the center.
3702
+ var d = countryElement.getAttribute('d');
3703
+ var subPaths = d.split(/(?=M)/).filter((s) => s.trim().length > 0);
3704
+ var largestBB = null;
3705
+ var largestArea = -1;
3706
+
3707
+ subPaths.forEach(
3708
+ function (subPath) {
3709
+ var tmp = document.createElementNS(
3710
+ 'http://www.w3.org/2000/svg',
3711
+ 'path'
3712
+ );
3713
+ tmp.setAttribute('d', subPath);
3714
+ this.mapImage.appendChild(tmp);
3715
+ var bb = tmp.getBBox();
3716
+ var area = bb.width * bb.height;
3717
+ if (area > largestArea) {
3718
+ largestArea = area;
3719
+ largestBB = bb;
3720
+ }
3721
+ this.mapImage.removeChild(tmp);
3722
+ }.bind(this)
3723
+ );
3724
+
3725
+ cx = largestBB.x + largestBB.width / 2;
3726
+ cy = largestBB.y + largestBB.height / 2;
3727
+ }
3728
+
3729
+ var offsetX =
3730
+ countryValues && countryValues.pinOffsetX != null
3731
+ ? countryValues.pinOffsetX
3732
+ : this.options.pinOffsetX;
3733
+ var offsetY =
3734
+ countryValues && countryValues.pinOffsetY != null
3735
+ ? countryValues.pinOffsetY
3736
+ : this.options.pinOffsetY;
3737
+ cx += offsetX;
3738
+ cy += offsetY;
3739
+
3740
+ var color =
3741
+ (countryValues && countryValues.pinColor) || this.options.pinColor;
3742
+ var size =
3743
+ (countryValues && countryValues.pinSize) || this.options.pinSize;
3744
+ var strokeColor =
3745
+ (countryValues && countryValues.pinStrokeColor) ||
3746
+ this.options.pinStrokeColor;
3747
+ var strokeWidth =
3748
+ (countryValues && countryValues.pinStrokeWidth) ||
3749
+ this.options.pinStrokeWidth;
3750
+
3751
+ if (typeof this.options.onGetPin === 'function') {
3752
+ var custom = this.options.onGetPin(countryID, countryValues);
3753
+ if (custom) {
3754
+ custom.setAttribute(
3755
+ 'transform',
3756
+ 'translate(' + cx + ',' + cy + ')'
3757
+ );
3758
+ this.pinGroup.appendChild(custom);
3759
+ return;
3760
+ }
3761
+ }
3762
+
3763
+ var pinImage =
3764
+ (countryValues && countryValues.pinImage) || this.options.pinImage;
3765
+
3766
+ if (pinImage) {
3767
+ var pinW =
3768
+ (countryValues && countryValues.pinImageWidth) ||
3769
+ this.options.pinImageWidth;
3770
+ var pinH =
3771
+ (countryValues && countryValues.pinImageHeight) ||
3772
+ this.options.pinImageHeight;
3773
+ var img = document.createElementNS(
3774
+ 'http://www.w3.org/2000/svg',
3775
+ 'image'
3776
+ );
3777
+ img.setAttribute('href', pinImage);
3778
+ img.setAttribute('x', cx - pinW / 2);
3779
+ img.setAttribute('y', cy - pinH / 2);
3780
+ img.setAttribute('width', pinW);
3781
+ img.setAttribute('height', pinH);
3782
+ img.setAttribute('data-id', countryID);
3783
+ img.classList.add('svgMap-pin');
3784
+ this.pinGroup.appendChild(img);
3785
+ return;
3786
+ }
3787
+
3788
+ var circle = document.createElementNS(
3789
+ 'http://www.w3.org/2000/svg',
3790
+ 'circle'
3791
+ );
3792
+ circle.setAttribute('cx', cx);
3793
+ circle.setAttribute('cy', cy);
3794
+ circle.setAttribute('r', size);
3795
+ circle.setAttribute('fill', color);
3796
+ if (strokeWidth > 0) {
3797
+ circle.setAttribute('stroke', strokeColor);
3798
+ circle.setAttribute('stroke-width', strokeWidth);
3799
+ circle.setAttribute('vector-effect', 'non-scaling-stroke');
3800
+ }
3801
+ circle.setAttribute('data-id', countryID);
3802
+ circle.classList.add('svgMap-pin');
3803
+ this.pinGroup.appendChild(circle);
3804
+ }.bind(this)
3805
+ );
3806
+ }
3807
+
3808
+ // Check if a static pin should be shown for a country
3809
+
3810
+ shouldShowPin(countryID) {
3811
+ var pins = this.options.staticPins;
3812
+ var countryValues = this.options.data.values[countryID];
3813
+ if (Array.isArray(pins)) {
3814
+ return pins.indexOf(countryID) !== -1;
3815
+ }
3816
+ if (typeof pins === 'function') {
3817
+ return pins(countryID, countryValues);
3818
+ }
3819
+ return false;
3820
+ }
3821
+
3640
3822
  // Check if a persistent tooltip should be shown on load
3641
3823
 
3642
3824
  shouldShowTooltipOnLoad(countryID) {