@mapcreator/sdk 0.0.9 → 0.0.11

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 (121) hide show
  1. package/README.md +29 -0
  2. package/dist/{esm/HighlightManager.d.ts → HighlightManager.d.ts} +2 -2
  3. package/dist/{esm/MCMap.d.ts → MCMap.d.ts} +1 -1
  4. package/dist/{esm/PopupManager.d.ts → PopupManager.d.ts} +4 -4
  5. package/dist/{esm/Registry.d.ts → Registry.d.ts} +3 -3
  6. package/dist/{esm/adornments → adornments}/categoricalLegend.d.ts +1 -1
  7. package/dist/{esm/adornments → adornments}/connectedLegend.d.ts +2 -2
  8. package/dist/{esm/adornments → adornments}/customAdornment.d.ts +1 -1
  9. package/dist/{esm/adornments → adornments}/heading.d.ts +1 -1
  10. package/dist/adornments/insetMap.d.ts +3 -0
  11. package/dist/{esm/adornments → adornments}/manualLegend.d.ts +1 -1
  12. package/dist/adornments/northArrow.d.ts +3 -0
  13. package/dist/adornments/scalebar.d.ts +3 -0
  14. package/dist/{esm/constants → constants}/index.d.ts +2 -2
  15. package/dist/{esm/controls → controls}/fullscreenControls.d.ts +1 -1
  16. package/dist/{esm/controls → controls}/geocoderControl.d.ts +1 -1
  17. package/dist/{esm/controls → controls}/geolocationControls.d.ts +1 -1
  18. package/dist/controls/refreshMapControls.d.ts +3 -0
  19. package/dist/controls/webControls.d.ts +4 -0
  20. package/dist/{esm/controls → controls}/zoomControls.d.ts +1 -1
  21. package/dist/index.d.ts +3 -0
  22. package/dist/locales/da_DK/strings.json.d.ts +10 -0
  23. package/dist/locales/de_DE/strings.json.d.ts +10 -0
  24. package/dist/locales/en_GB/strings.json.d.ts +10 -0
  25. package/dist/locales/es_ES/strings.json.d.ts +10 -0
  26. package/dist/locales/fr_FR/strings.json.d.ts +10 -0
  27. package/dist/locales/it_IT/strings.json.d.ts +10 -0
  28. package/dist/locales/nl_NL/strings.json.d.ts +10 -0
  29. package/dist/mapcreator-sdk.js +39590 -0
  30. package/dist/models/area.d.ts +5 -0
  31. package/dist/models/circle.d.ts +5 -0
  32. package/dist/models/dot.d.ts +3 -0
  33. package/dist/models/line.d.ts +4 -0
  34. package/dist/models/marker.d.ts +5 -0
  35. package/dist/models/polygon.d.ts +5 -0
  36. package/dist/{esm/renderAdornments.d.ts → renderAdornments.d.ts} +3 -3
  37. package/dist/{esm/types → types}/index.d.ts +1 -1
  38. package/dist/{esm/types → types}/mapstyle.d.ts +2 -6
  39. package/dist/{esm/utils → utils}/choropleth.d.ts +3 -3
  40. package/dist/{esm/utils → utils}/geolocation.d.ts +1 -1
  41. package/dist/{esm/utils → utils}/graphhopper.d.ts +1 -1
  42. package/dist/{esm/utils → utils}/helpers.d.ts +2 -2
  43. package/dist/{esm/utils → utils}/language.d.ts +1 -1
  44. package/dist/{esm/utils → utils}/models.d.ts +4 -4
  45. package/dist/{esm/utils → utils}/overlays.d.ts +1 -1
  46. package/dist/{esm/utils → utils}/svgHelpers.d.ts +3 -4
  47. package/dist/{esm/utils → utils}/template.d.ts +2 -2
  48. package/dist/{esm/utils → utils}/youtube.d.ts +1 -1
  49. package/package.json +8 -6
  50. package/dist/esm/HighlightManager.js +0 -203
  51. package/dist/esm/MCMap.js +0 -254
  52. package/dist/esm/PopupManager.js +0 -297
  53. package/dist/esm/Registry.js +0 -74
  54. package/dist/esm/adornments/categoricalLegend.js +0 -141
  55. package/dist/esm/adornments/connectedLegend.js +0 -393
  56. package/dist/esm/adornments/customAdornment.js +0 -29
  57. package/dist/esm/adornments/heading.js +0 -71
  58. package/dist/esm/adornments/insetMap.d.ts +0 -3
  59. package/dist/esm/adornments/insetMap.js +0 -351
  60. package/dist/esm/adornments/manualLegend.js +0 -15
  61. package/dist/esm/adornments/northArrow.d.ts +0 -3
  62. package/dist/esm/adornments/northArrow.js +0 -24
  63. package/dist/esm/adornments/scalebar.d.ts +0 -3
  64. package/dist/esm/adornments/scalebar.js +0 -176
  65. package/dist/esm/constants/index.js +0 -53
  66. package/dist/esm/controls/controls.js +0 -7
  67. package/dist/esm/controls/fullscreenControls.js +0 -29
  68. package/dist/esm/controls/geocoderControl.js +0 -202
  69. package/dist/esm/controls/geolocationControls.js +0 -65
  70. package/dist/esm/controls/refreshMapControls.d.ts +0 -3
  71. package/dist/esm/controls/refreshMapControls.js +0 -26
  72. package/dist/esm/controls/webControls.d.ts +0 -4
  73. package/dist/esm/controls/webControls.js +0 -40
  74. package/dist/esm/controls/zoomControls.js +0 -23
  75. package/dist/esm/i18n.js +0 -21
  76. package/dist/esm/index.d.ts +0 -5
  77. package/dist/esm/index.js +0 -5
  78. package/dist/esm/locales/da_DK/strings.json +0 -7
  79. package/dist/esm/locales/de_DE/strings.json +0 -7
  80. package/dist/esm/locales/en_GB/strings.json +0 -7
  81. package/dist/esm/locales/es_ES/strings.json +0 -7
  82. package/dist/esm/locales/fr_FR/strings.json +0 -7
  83. package/dist/esm/locales/it_IT/strings.json +0 -7
  84. package/dist/esm/locales/nl_NL/strings.json +0 -7
  85. package/dist/esm/models/area.d.ts +0 -5
  86. package/dist/esm/models/area.js +0 -165
  87. package/dist/esm/models/circle.d.ts +0 -5
  88. package/dist/esm/models/circle.js +0 -110
  89. package/dist/esm/models/dot.d.ts +0 -3
  90. package/dist/esm/models/dot.js +0 -42
  91. package/dist/esm/models/line.d.ts +0 -4
  92. package/dist/esm/models/line.js +0 -117
  93. package/dist/esm/models/marker.d.ts +0 -5
  94. package/dist/esm/models/marker.js +0 -179
  95. package/dist/esm/models/polygon.d.ts +0 -5
  96. package/dist/esm/models/polygon.js +0 -80
  97. package/dist/esm/renderAdornments.js +0 -129
  98. package/dist/esm/types/geometry.js +0 -1
  99. package/dist/esm/types/index.js +0 -1
  100. package/dist/esm/types/jobObject.js +0 -1
  101. package/dist/esm/types/mapstyle.js +0 -1
  102. package/dist/esm/utils/browser.js +0 -6
  103. package/dist/esm/utils/choropleth.js +0 -110
  104. package/dist/esm/utils/fullscreen.js +0 -40
  105. package/dist/esm/utils/geolocation.js +0 -93
  106. package/dist/esm/utils/graphhopper.js +0 -41
  107. package/dist/esm/utils/helpers.js +0 -116
  108. package/dist/esm/utils/language.js +0 -170
  109. package/dist/esm/utils/models.js +0 -103
  110. package/dist/esm/utils/overlays.js +0 -87
  111. package/dist/esm/utils/scalebar.js +0 -52
  112. package/dist/esm/utils/svgHelpers.js +0 -1512
  113. package/dist/esm/utils/template.js +0 -120
  114. package/dist/esm/utils/youtube.js +0 -64
  115. /package/dist/{esm/controls → controls}/controls.d.ts +0 -0
  116. /package/dist/{esm/i18n.d.ts → i18n.d.ts} +0 -0
  117. /package/dist/{esm/types → types}/geometry.d.ts +0 -0
  118. /package/dist/{esm/types → types}/jobObject.d.ts +0 -0
  119. /package/dist/{esm/utils → utils}/browser.d.ts +0 -0
  120. /package/dist/{esm/utils → utils}/fullscreen.d.ts +0 -0
  121. /package/dist/{esm/utils → utils}/scalebar.d.ts +0 -0
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1,6 +0,0 @@
1
- export function isMobile() {
2
- return navigator.userAgent.toLowerCase().indexOf('mobile') >= 0;
3
- }
4
- export function isFirefox() {
5
- return typeof window.InstallTrigger !== 'undefined';
6
- }
@@ -1,110 +0,0 @@
1
- import { interpolateHcl, piecewise, quantize } from 'd3-interpolate';
2
- import { extent, range } from 'd3-array';
3
- import { scaleLinear, scaleOrdinal, scaleQuantile, scaleQuantize, } from 'd3-scale';
4
- import { getBoundValues } from '@/utils/models';
5
- // constants/choropleth.ts
6
- const multiHue = [
7
- ['#EDF8E9', '#BAE4B3', '#74C476', '#31A354', '#006D2C'],
8
- ['#EFF3FF', '#BDD7E7', '#6BAED6', '#3182BD', '#08519C'],
9
- ['#F0F9E8', '#BAE4BC', '#7BCCC4', '#43A2CA', '#0868AC'],
10
- ['#EDF8FB', '#B3CDE3', '#8C96C6', '#8856A7', '#810F7C'],
11
- ['#FEF0D9', '#FDCC8A', '#FC8D59', '#E34A33', '#B30000'],
12
- ['#FEEBE2', '#FBB4B9', '#F768A1', '#C51B8A', '#7A0177'],
13
- ['#D7191C', '#FDAE61', '#FFFFBF', '#ABDDA4', '#2B83BA'],
14
- ['#7B3294', '#C2A5CF', '#F7F7F7', '#A6DBA0', '#008837'],
15
- ];
16
- const singleHue = [
17
- // ['#F7F7F7', '#CCCCCC', '#969696', '#636363', '#252525'],
18
- // ['#EDF8E9', '#BAE4B3', '#74C476', '#31A354', '#006D2C'],
19
- // ['#FEEDDE', '#FDBE85', '#FD8D3C', '#E6550D', '#A63603'],
20
- // ['#FEE5D9', '#FCAE91', '#FB6A4A', '#DE2D26', '#A50F15'],
21
- // ['#EFF3FF', '#BDD7E7', '#6BAED6', '#3182BD', '#08519C'],
22
- // ['#F2F0F7', '#CBC9E2', '#9E9AC8', '#756BB1', '#54278F'],
23
- ];
24
- // utils/import/pattern.ts
25
- const colourReArr = [
26
- /transparent/,
27
- /#[0-9a-fA-F]{3,4}/,
28
- /#[0-9a-fA-F]{6}/,
29
- /#[0-9a-fA-F]{8}/,
30
- /rgba?\(\s*(?:(?:\d{1,3}%?|none)\s*,\s*){2}(?:\d{1,3}%?|none)(?:\s*,\s*(?:0|1|0?\.\d+|\d+%|none))?\s*\)/,
31
- /rgba?\(\s*(?:\d{1,3}%?|none)\s+(?:\d{1,3}%?|none)\s+(?:\d{1,3}%?|none)(?:\s*\/\s*(?:0|1|0?\.\d+|\d+%|none))?\s*\)/,
32
- /hsla?\(\s*(?:[+-]?\d*\.?\d+(?:deg|grad|rad|turn)?|none)\s*,\s*(?:\d{1,3}%|none)\s*,\s*(?:\d{1,3}%|none)(?:\s*,\s*(?:0|1|0?\.\d+|\d+%|none))?\s*\)/,
33
- /hsla?\(\s*(?:[+-]?\d*\.?\d+(?:deg|grad|rad|turn)?|none)\s+(?:\d{1,3}%|none)\s+(?:\d{1,3}%|none)(?:\s*\/\s*(?:0|1|0?\.\d+|\d+%|none))?\s*\)/,
34
- // /(?:oklab|oklch|lab|lch|hwb|color)\(\s*[^()]*\)/,
35
- ];
36
- const colourReStr = colourReArr.map(re => re.toString().replace(/^\/|\/$/g, '')).join('|');
37
- const colourRe = new RegExp(`^\\s*(${colourReStr})\\s*$`);
38
- function linearDomain(values, colors) {
39
- const [min, max] = extent(values);
40
- const n = colors.length;
41
- return range(n).map(i => min + (i * (max - min)) / (n - 1));
42
- }
43
- export const legendTickCount = 4;
44
- const colorMethods = {
45
- linear: (values, colors) => scaleLinear(linearDomain(values, colors), colors)
46
- .interpolate(interpolateHcl)
47
- .nice(legendTickCount),
48
- quantile: (values, colors) => scaleQuantile(values, colors),
49
- quantize: (values, colors) => scaleQuantize(extent(values), colors).nice(),
50
- categorical: (values, colors) => scaleOrdinal(values, colors),
51
- };
52
- export function getColorGenerator(group) {
53
- if (group.choropleth) {
54
- const values = getChoroplethValues(group);
55
- const dataColumn = getColumnName(group.fillColor);
56
- if (values && dataColumn) {
57
- const { choropleth } = group;
58
- const categoricalGroup = choropleth.categoricalColors[dataColumn];
59
- const colors = choropleth.colorMode === 'categorical'
60
- ? values.map(value => categoricalGroup.values[value])
61
- : getColorSamples(choropleth.lowerColor, choropleth.upperColor, choropleth.colorMode !== 'linear' ? choropleth.colorCount : undefined);
62
- return colorMethods[choropleth.colorMode](values, colors);
63
- }
64
- }
65
- }
66
- export function getChoroplethValues(group) {
67
- if (group.choropleth) {
68
- const dataColumn = group.fillColor?.match(/\$\{([^}]+)}/)?.[1];
69
- if (dataColumn) {
70
- const bindings = Object.values(group.models);
71
- const values = getBoundValues(bindings, dataColumn);
72
- if (!values.length ||
73
- values.some(value => typeof value !== 'string' || !colourRe.test(value))) {
74
- return group.choropleth.colorMode === 'categorical' ? Array.from(new Set(values)) : values;
75
- }
76
- }
77
- }
78
- }
79
- export function getColorSamples(lowerColor, upperColor, colorCount) {
80
- const stops = multiHue.find(r => r[0] === lowerColor && r[r.length - 1] === upperColor) ??
81
- singleHue.find(r => r[0] === lowerColor && r[r.length - 1] === upperColor);
82
- return stops
83
- ? quantize(piecewise(interpolateHcl, stops), colorCount ?? stops.length)
84
- : quantize(interpolateHcl(lowerColor, upperColor), colorCount ?? 2);
85
- }
86
- export function getColumnType(modelBindings, dataColumn) {
87
- const values = dataColumn ? getBoundValues(modelBindings, dataColumn) : undefined;
88
- return !values?.length
89
- ? undefined
90
- : values.every(value => typeof value === 'number')
91
- ? 'number'
92
- : values.every(value => typeof value === 'string' && colourRe.test(value))
93
- ? 'color'
94
- : 'string';
95
- }
96
- export function getColumnName(value) {
97
- return value?.match(/\$\{([^}]+)}/)?.[1];
98
- }
99
- export function groupByColor(values) {
100
- const result = Object.create(null);
101
- for (const key in values) {
102
- const value = values[key];
103
- result[value] = value in result ? null : key;
104
- }
105
- return result;
106
- }
107
- export function isChoroplethColumn(modelBindings, dataColumn) {
108
- const columnType = dataColumn ? getColumnType(modelBindings, dataColumn) : undefined;
109
- return columnType !== undefined && columnType !== 'color';
110
- }
@@ -1,40 +0,0 @@
1
- export function isFullscreenSupported() {
2
- return Boolean(document.fullscreenEnabled ||
3
- document.mozFullScreenEnabled ||
4
- document.msFullscreenEnabled ||
5
- document.webkitFullscreenEnabled);
6
- }
7
- export function isFullscreen(mapContainer) {
8
- return (document.fullscreenElement === mapContainer ||
9
- document.webkitFullscreenElement === mapContainer ||
10
- document.mozFullScreenElement === mapContainer ||
11
- document.msFullscreenElement === mapContainer);
12
- }
13
- export function enterFullscreen(mapContainer) {
14
- if (mapContainer.requestFullscreen) {
15
- mapContainer.requestFullscreen();
16
- }
17
- else if (mapContainer.mozRequestFullScreen) {
18
- mapContainer.mozRequestFullScreen();
19
- }
20
- else if (mapContainer.msRequestFullscreen) {
21
- mapContainer.msRequestFullscreen();
22
- }
23
- else if (mapContainer.webkitRequestFullscreen) {
24
- mapContainer.webkitRequestFullscreen();
25
- }
26
- }
27
- export function exitFullscreen() {
28
- if (document.exitFullscreen) {
29
- document.exitFullscreen();
30
- }
31
- else if (document.mozCancelFullScreen) {
32
- document.mozCancelFullScreen();
33
- }
34
- else if (document.msExitFullscreen) {
35
- document.msExitFullscreen();
36
- }
37
- else if (document.webkitCancelFullScreen) {
38
- document.webkitCancelFullScreen();
39
- }
40
- }
@@ -1,93 +0,0 @@
1
- import locationDot from '@/images/location-dot.svg?raw';
2
- import { SvgCache } from '@/utils/svgHelpers';
3
- export const loadLocationDot = (map) => {
4
- const pixelRatio = 2 * window.devicePixelRatio;
5
- const svgCache = new SvgCache(map);
6
- const imageKey = svgCache.getMapLibreImageKey(locationDot, pixelRatio);
7
- map.setLayoutProperty('location-dot', 'icon-image', imageKey);
8
- };
9
- export const initLayersAndSources = (map) => {
10
- if (!map.getSource('location-circle')) {
11
- map.addSource('location-circle', {
12
- type: 'geojson',
13
- data: { type: 'FeatureCollection', features: [] },
14
- });
15
- }
16
- if (!map.getSource('location-dot')) {
17
- map.addSource('location-dot', {
18
- type: 'geojson',
19
- data: {
20
- type: 'Feature',
21
- geometry: { type: 'Point', coordinates: [] },
22
- properties: {},
23
- },
24
- });
25
- }
26
- if (!map.getLayer('location-circle')) {
27
- map.addLayer({
28
- id: 'location-circle',
29
- type: 'fill',
30
- source: 'location-circle',
31
- layout: {},
32
- paint: {
33
- 'fill-color': '#349CF2',
34
- 'fill-opacity': 0.15,
35
- 'fill-outline-color': '#005196',
36
- },
37
- }, 'mc-before-names');
38
- }
39
- if (!map.getLayer('location-dot')) {
40
- map.addLayer({
41
- id: 'location-dot',
42
- type: 'symbol',
43
- source: 'location-dot',
44
- layout: { 'icon-padding': 0 },
45
- paint: { 'icon-opacity': 1 },
46
- metadata: { 'mc-name': 'location dot', 'mc-skip-load': true },
47
- }, 'mc-before-names');
48
- }
49
- loadLocationDot(map);
50
- };
51
- export const addLocationDot = (map, lng, lat) => {
52
- const source = map.getSource('location-dot');
53
- if (source) {
54
- source.setData({
55
- type: 'Feature',
56
- geometry: { type: 'Point', coordinates: [lng, lat] },
57
- properties: {},
58
- });
59
- }
60
- };
61
- export const createCircle = (lng, lat, meters) => {
62
- const points = 64;
63
- const km = meters / 1000;
64
- const polygon = [];
65
- const deltaX = km / (111.32 * Math.cos((lat * Math.PI) / 180));
66
- const deltaY = km / 110.574;
67
- for (let i = 0; i < points; i++) {
68
- const angle = (i / points) * (2 * Math.PI);
69
- const x = deltaX * Math.cos(angle);
70
- const y = deltaY * Math.sin(angle);
71
- polygon.push([lng + x, lat + y]);
72
- }
73
- polygon.push(polygon[0]);
74
- return {
75
- type: 'FeatureCollection',
76
- features: [
77
- {
78
- type: 'Feature',
79
- geometry: { type: 'Polygon', coordinates: [polygon] },
80
- },
81
- ],
82
- };
83
- };
84
- export const showNotification = () => {
85
- const mapContainer = document.querySelector('.map');
86
- const notificationElem = document.createElement('div');
87
- notificationElem.classList.add('location-notification');
88
- notificationElem.textContent = 'Geolocation is not available';
89
- mapContainer?.appendChild(notificationElem);
90
- setTimeout(() => {
91
- mapContainer?.removeChild(notificationElem);
92
- }, 3000);
93
- };
@@ -1,41 +0,0 @@
1
- import { locale } from '@/i18n';
2
- export class GraphHopperGeocoderService {
3
- async getLocationInBounds(location, center, limit = 10) {
4
- try {
5
- const results = await this._callGraphHopper({
6
- limit,
7
- q: location,
8
- point: `${center.lat},${center.lng}`,
9
- });
10
- return this._mapResults(results.hits);
11
- }
12
- catch (e) {
13
- console.warn('Geocoding failed: ', e);
14
- return [];
15
- }
16
- }
17
- async _callGraphHopper(params) {
18
- const query = new URLSearchParams(params);
19
- query.append('key', import.meta.env.VITE_GRAPHHOPPER_GEOCODING_CODE);
20
- query.append('locale', locale.slice(0, 2));
21
- const init = { headers: { Accept: 'application/json' } };
22
- const url = `https://graphhopper.com/api/1/geocode?${query}`;
23
- const response = await fetch(url, init);
24
- const res = await response.json();
25
- return res;
26
- }
27
- _mapResults(results) {
28
- return results.map((r) => ({
29
- id: r.osm_id.toString(),
30
- labelTitle: r.name,
31
- position: { lng: r.point.lng, lat: r.point.lat },
32
- bbox: r.extent
33
- ? [
34
- { lng: r.extent[0], lat: r.extent[1] },
35
- { lng: r.extent[2], lat: r.extent[3] },
36
- ]
37
- : null,
38
- subtitle: [r.osm_value, r.city, r.state, r.country].filter(Boolean).join(', '),
39
- }));
40
- }
41
- }
@@ -1,116 +0,0 @@
1
- export const numberRe = /^\s*[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?\s*$/;
2
- export function degToRad(angle) {
3
- return (angle / 180) * Math.PI;
4
- }
5
- export function radToDeg(angle) {
6
- return (angle * 180) / Math.PI;
7
- }
8
- export function calcDistance(lngLat1, lngLat2) {
9
- const R = 6371000;
10
- const rad = Math.PI / 180;
11
- const lat1 = lngLat1.lat * rad;
12
- const lat2 = lngLat2.lat * rad;
13
- const a = Math.sin(lat1) * Math.sin(lat2) +
14
- Math.cos(lat1) * Math.cos(lat2) * Math.cos((lngLat2.lng - lngLat1.lng) * rad);
15
- return R * Math.acos(Math.min(a, 1));
16
- }
17
- export function stringToId(str) {
18
- let hash = 0;
19
- for (let i = 0; i < str.length; i++) {
20
- hash = (hash << 5) - hash + str.charCodeAt(i);
21
- hash &= hash;
22
- }
23
- return Math.abs(hash);
24
- }
25
- /**
26
- * Resolves a potential binding reference.
27
- *
28
- * 1. If the string starts with a $, it is considered a binding reference. The value of the binding
29
- * is then returned.
30
- * 2. Otherwise, the string is returned as is.
31
- */
32
- export function resolveBinding(str, bindings) {
33
- return str.startsWith('$') ? bindingToString(bindings[str.slice(1)]) : str;
34
- }
35
- export function bindingToString(binding) {
36
- return typeof binding === 'string'
37
- ? binding
38
- : typeof binding === 'number'
39
- ? String(binding)
40
- : typeof binding === 'boolean'
41
- ? String(binding).toUpperCase()
42
- : typeof binding === 'object' &&
43
- binding !== null &&
44
- (binding.t === 'n' || binding.t === 'd')
45
- ? (binding.w ?? '')
46
- : '';
47
- }
48
- export function bindingToPrimitive(binding) {
49
- return typeof binding === 'string' && numberRe.test(binding)
50
- ? Number(binding)
51
- : typeof binding === 'string' || typeof binding === 'number' || typeof binding === 'boolean'
52
- ? binding
53
- : typeof binding === 'object' && binding !== null && binding.t === 'n'
54
- ? binding.v
55
- : null;
56
- }
57
- /* eslint-enable no-nested-ternary */
58
- export function getYoutubeVideoId(url) {
59
- url = url.trim();
60
- // Reference prefixed with a $ or video id
61
- if (/^\$?[\w\-_]+$/.test(url)) {
62
- return url;
63
- }
64
- const regex = /(?:https?:\/\/)?(?:www\.)?youtu\.?be(?:\.com)?\/?.*(?:watch|embed)?(?:.*v=|v\/|\/)([\w\-_]+)&?/;
65
- return (regex.exec(url) || [])[1];
66
- }
67
- const baseDpi = 72;
68
- export function unitConvert(from, to, value) {
69
- if (from === to) {
70
- return value;
71
- }
72
- // Converters from MM to unit
73
- const map = {
74
- millimeter: 1,
75
- centimeter: 0.1,
76
- meter: 0.001,
77
- kilometer: 0.000001,
78
- foot: 0.00328084,
79
- mile: 6.21371e-7,
80
- nauticalMile: 5.39957e-7,
81
- inch: 0.0393701,
82
- pixel: 0.0393701 * baseDpi,
83
- pica: 0.236222,
84
- };
85
- return (value / map[from]) * map[to];
86
- }
87
- export function lerp(value1, value2, ratio) {
88
- return value1 + (value2 - value1) * ratio;
89
- }
90
- export function unlerp(min, max, value) {
91
- return (value - min) / (max - min);
92
- }
93
- export function clamp(value, min, max) {
94
- return Math.max(Math.min(value, max), min);
95
- }
96
- /**
97
- * Fast hash function for non-cryptographic use
98
- */
99
- export function fnv32b(str) {
100
- const FNV1_32A_INIT = 0x811c9dc5;
101
- let hash = str
102
- .split('')
103
- .map(x => x.charCodeAt(0))
104
- .reduce((sum, val) => {
105
- sum ^= val;
106
- return sum + (sum << 1) + (sum << 4) + (sum << 7) + (sum << 8) + (sum << 24);
107
- }, FNV1_32A_INIT);
108
- // Avalanche
109
- hash ^= hash << 3;
110
- hash += hash >> 5;
111
- hash ^= hash << 4;
112
- hash += hash >> 17;
113
- hash ^= hash << 25;
114
- hash += hash >> 6;
115
- return `0000000${(hash >>> 0).toString(16)}`.substr(-8);
116
- }
@@ -1,170 +0,0 @@
1
- export function setLanguage(language, map) {
2
- for (const layer of map.getStyle().layers) {
3
- if (layer.type !== 'symbol' || layer.id.startsWith('custom-') || layer.id.startsWith('gl-')) {
4
- continue;
5
- }
6
- const textField = layer.layout && layer.layout['text-field'];
7
- if (layer['source-layer'] &&
8
- Array.isArray(textField) &&
9
- textField[0] === 'coalesce' &&
10
- !textField.find(item => Array.isArray(item) && item[1] === 'name:abbr')) {
11
- map.setLayoutProperty(layer.id, 'text-field', textFieldExpression(layer.source, language), {
12
- validate: false,
13
- });
14
- }
15
- }
16
- }
17
- function textFieldExpression(source, language) {
18
- if (language !== 'en' && language !== 'native') {
19
- language = transformLanguageCode(language, LanguageNotation.TWO);
20
- }
21
- if (language === 'native') {
22
- return ['get', 'name'];
23
- }
24
- if (source.startsWith('mc-base')) {
25
- return [
26
- 'coalesce',
27
- ['get', `name:${language}`],
28
- ['case', ['has', 'name_is_latin'], ['get', 'name'], ['get', 'name:en']],
29
- ];
30
- }
31
- return ['coalesce', ['get', `name:${language}`], ['get', 'name:en'], ['get', 'name']];
32
- }
33
- export const LanguageNotation = Object.freeze({
34
- THREE: 'ISO 639-2/B',
35
- API: 'ISO 639-2/B',
36
- TWO: 'ISO 639-1',
37
- MAPLIBRE_COMPAT: 'ISO 639-1',
38
- ENDONYM: 'name', // Endonym is the native name of a language
39
- NAME: 'name', // We should add the ISO language names using this field
40
- LOCALE: 'locale',
41
- i18n: 'locale',
42
- });
43
- // The first language *must* be english because we use this as a fallback
44
- export const LanguageCodes = Object.freeze([
45
- {
46
- [LanguageNotation.TWO]: 'en',
47
- [LanguageNotation.THREE]: 'eng',
48
- [LanguageNotation.ENDONYM]: 'English',
49
- [LanguageNotation.LOCALE]: 'en_GB',
50
- },
51
- {
52
- [LanguageNotation.TWO]: 'da',
53
- [LanguageNotation.THREE]: 'dan',
54
- [LanguageNotation.ENDONYM]: 'Dansk',
55
- [LanguageNotation.LOCALE]: 'da_DK',
56
- },
57
- {
58
- [LanguageNotation.TWO]: 'nl',
59
- [LanguageNotation.THREE]: 'dut',
60
- [LanguageNotation.ENDONYM]: 'Nederlands',
61
- [LanguageNotation.LOCALE]: 'nl_NL',
62
- },
63
- {
64
- [LanguageNotation.TWO]: 'fi',
65
- [LanguageNotation.THREE]: 'fin',
66
- [LanguageNotation.ENDONYM]: 'Suomi',
67
- [LanguageNotation.LOCALE]: 'fi_FI',
68
- },
69
- {
70
- [LanguageNotation.TWO]: 'fr',
71
- [LanguageNotation.THREE]: 'fre',
72
- [LanguageNotation.ENDONYM]: 'Francais',
73
- [LanguageNotation.LOCALE]: 'fr_FR',
74
- },
75
- {
76
- [LanguageNotation.TWO]: 'de',
77
- [LanguageNotation.THREE]: 'ger',
78
- [LanguageNotation.ENDONYM]: 'Deutsch',
79
- [LanguageNotation.LOCALE]: 'de_DE',
80
- },
81
- {
82
- [LanguageNotation.TWO]: 'it',
83
- [LanguageNotation.THREE]: 'ita',
84
- [LanguageNotation.ENDONYM]: 'Italiano',
85
- [LanguageNotation.LOCALE]: 'it_IT',
86
- },
87
- {
88
- [LanguageNotation.TWO]: 'no',
89
- [LanguageNotation.THREE]: 'nor',
90
- [LanguageNotation.ENDONYM]: 'Norsk',
91
- [LanguageNotation.LOCALE]: 'nn_NO',
92
- },
93
- {
94
- [LanguageNotation.TWO]: 'pl',
95
- [LanguageNotation.THREE]: 'pol',
96
- [LanguageNotation.ENDONYM]: 'Polski',
97
- [LanguageNotation.LOCALE]: 'pl_PL',
98
- },
99
- {
100
- [LanguageNotation.TWO]: 'pt',
101
- [LanguageNotation.THREE]: 'por',
102
- [LanguageNotation.ENDONYM]: 'Portugues',
103
- [LanguageNotation.LOCALE]: 'pt_PT',
104
- },
105
- {
106
- [LanguageNotation.TWO]: 'es',
107
- [LanguageNotation.THREE]: 'spa',
108
- [LanguageNotation.ENDONYM]: 'Espanol',
109
- [LanguageNotation.LOCALE]: 'es_ES',
110
- },
111
- {
112
- [LanguageNotation.TWO]: 'sv',
113
- [LanguageNotation.THREE]: 'swe',
114
- [LanguageNotation.ENDONYM]: 'Svenska',
115
- [LanguageNotation.LOCALE]: 'sv_SE',
116
- },
117
- {
118
- [LanguageNotation.TWO]: 'ja',
119
- [LanguageNotation.THREE]: 'jpn',
120
- [LanguageNotation.ENDONYM]: '日本語',
121
- [LanguageNotation.LOCALE]: 'ja_JP',
122
- },
123
- {
124
- [LanguageNotation.TWO]: 'zh',
125
- [LanguageNotation.THREE]: 'chi',
126
- [LanguageNotation.ENDONYM]: '汉语',
127
- [LanguageNotation.LOCALE]: 'zh_CN',
128
- },
129
- {
130
- [LanguageNotation.TWO]: 'ru',
131
- [LanguageNotation.THREE]: 'rus',
132
- [LanguageNotation.ENDONYM]: 'Русский',
133
- [LanguageNotation.LOCALE]: 'ru_RU',
134
- },
135
- {
136
- [LanguageNotation.TWO]: 'uk',
137
- [LanguageNotation.THREE]: 'ukr',
138
- [LanguageNotation.ENDONYM]: 'Украї́нська',
139
- [LanguageNotation.LOCALE]: 'uk_UK',
140
- },
141
- {
142
- [LanguageNotation.TWO]: 'lv',
143
- [LanguageNotation.THREE]: 'lav',
144
- [LanguageNotation.ENDONYM]: 'Latviešu valoda',
145
- [LanguageNotation.LOCALE]: 'lv-LV',
146
- },
147
- {
148
- [LanguageNotation.TWO]: 'kk',
149
- [LanguageNotation.THREE]: 'kaz',
150
- [LanguageNotation.ENDONYM]: 'қазақша',
151
- [LanguageNotation.LOCALE]: 'kk-KZ',
152
- },
153
- {
154
- [LanguageNotation.TWO]: 'ar',
155
- [LanguageNotation.THREE]: 'ara',
156
- [LanguageNotation.ENDONYM]: 'العربية',
157
- [LanguageNotation.LOCALE]: 'ar_SA',
158
- },
159
- {
160
- [LanguageNotation.TWO]: 'native',
161
- [LanguageNotation.THREE]: 'native',
162
- [LanguageNotation.ENDONYM]: 'Native',
163
- [LanguageNotation.LOCALE]: 'native',
164
- },
165
- ]);
166
- export function transformLanguageCode(input, type = LanguageNotation.MAPLIBRE_COMPAT) {
167
- const language = LanguageCodes.find(lang => Object.values(lang).some(value => value === input)) ??
168
- LanguageCodes[0];
169
- return language[type];
170
- }