@bpd-library/components 1.2.5-beta.4 → 1.2.6-beta.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.
Files changed (202) hide show
  1. package/dist/esm/atoms/button/button.js +33 -0
  2. package/dist/esm/atoms/button/button.js.map +1 -0
  3. package/dist/esm/atoms/col/col.js +22 -0
  4. package/dist/esm/atoms/col/col.js.map +1 -0
  5. package/dist/esm/atoms/container/container.js +6 -0
  6. package/dist/esm/atoms/container/container.js.map +1 -0
  7. package/dist/esm/atoms/form-elements/range-slider/range-slider.js +21 -0
  8. package/dist/esm/atoms/form-elements/range-slider/range-slider.js.map +1 -0
  9. package/dist/esm/atoms/form-elements/utilities/range-slider.js +100 -0
  10. package/dist/esm/atoms/form-elements/utilities/range-slider.js.map +1 -0
  11. package/dist/esm/atoms/image/image.js +18 -0
  12. package/dist/esm/atoms/image/image.js.map +1 -0
  13. package/dist/esm/atoms/image/utilities/create-image-url.js +15 -0
  14. package/dist/esm/atoms/image/utilities/create-image-url.js.map +1 -0
  15. package/dist/esm/atoms/row/row.js +6 -0
  16. package/dist/esm/atoms/row/row.js.map +1 -0
  17. package/dist/esm/atoms/svg/svg.js +25 -0
  18. package/dist/esm/atoms/svg/svg.js.map +1 -0
  19. package/dist/esm/index.js +14 -0
  20. package/dist/esm/index.js.map +1 -0
  21. package/dist/esm/molecules/infobox/infobox.js +20 -0
  22. package/dist/esm/molecules/infobox/infobox.js.map +1 -0
  23. package/dist/esm/molecules/map/map.js +256 -0
  24. package/dist/esm/molecules/map/map.js.map +1 -0
  25. package/dist/esm/molecules/map/store/map/store.js +150 -0
  26. package/dist/esm/molecules/map/store/map/store.js.map +1 -0
  27. package/dist/esm/molecules/map/utilities/fit-bounds.js +4 -0
  28. package/dist/esm/molecules/map/utilities/fit-bounds.js.map +1 -0
  29. package/dist/esm/molecules/map/utilities/mapbox/add-data.js +54 -0
  30. package/dist/esm/molecules/map/utilities/mapbox/add-data.js.map +1 -0
  31. package/dist/esm/molecules/map/utilities/mapbox/center.js +15 -0
  32. package/dist/esm/molecules/map/utilities/mapbox/center.js.map +1 -0
  33. package/dist/esm/molecules/map/utilities/mapbox/constants.js +5 -0
  34. package/dist/esm/molecules/map/utilities/mapbox/constants.js.map +1 -0
  35. package/dist/esm/molecules/map/utilities/mapbox/index.js +3 -0
  36. package/dist/esm/molecules/map/utilities/mapbox/index.js.map +1 -0
  37. package/dist/esm/molecules/map/utilities/mapbox/mapbox.js +27 -0
  38. package/dist/esm/molecules/map/utilities/mapbox/mapbox.js.map +1 -0
  39. package/dist/esm/molecules/map/utilities/mapbox/parse-feature-properties.js +18 -0
  40. package/dist/esm/molecules/map/utilities/mapbox/parse-feature-properties.js.map +1 -0
  41. package/dist/esm/molecules/map/utilities/mapbox/pointers/setup-pointers.js +151 -0
  42. package/dist/esm/molecules/map/utilities/mapbox/pointers/setup-pointers.js.map +1 -0
  43. package/dist/esm/molecules/map/utilities/mapbox/polygons/feature-state.js +11 -0
  44. package/dist/esm/molecules/map/utilities/mapbox/polygons/feature-state.js.map +1 -0
  45. package/dist/esm/molecules/map/utilities/mapbox/polygons/geojson.js +10 -0
  46. package/dist/esm/molecules/map/utilities/mapbox/polygons/geojson.js.map +1 -0
  47. package/dist/esm/molecules/map/utilities/mapbox/polygons/interaction.js +34 -0
  48. package/dist/esm/molecules/map/utilities/mapbox/polygons/interaction.js.map +1 -0
  49. package/dist/esm/molecules/map/utilities/mapbox/polygons/layer.js +110 -0
  50. package/dist/esm/molecules/map/utilities/mapbox/polygons/layer.js.map +1 -0
  51. package/dist/esm/molecules/map/utilities/mapbox/raster.js +43 -0
  52. package/dist/esm/molecules/map/utilities/mapbox/raster.js.map +1 -0
  53. package/dist/esm/molecules/map/utilities/mapbox/search/alternative-city-suggestions.js +27 -0
  54. package/dist/esm/molecules/map/utilities/mapbox/search/alternative-city-suggestions.js.map +1 -0
  55. package/dist/esm/molecules/map/utilities/mapbox/search/search.js +174 -0
  56. package/dist/esm/molecules/map/utilities/mapbox/search/search.js.map +1 -0
  57. package/dist/esm/molecules/map/utilities/mapbox/tooltip.js +26 -0
  58. package/dist/esm/molecules/map/utilities/mapbox/tooltip.js.map +1 -0
  59. package/dist/esm/molecules/tooltip/tooltip.js +14 -0
  60. package/dist/esm/molecules/tooltip/tooltip.js.map +1 -0
  61. package/dist/esm/node_modules/tslib/tslib.es6.js +24 -0
  62. package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -0
  63. package/dist/lib/atoms/button/button.js +31 -0
  64. package/dist/lib/atoms/button/button.js.map +1 -0
  65. package/dist/lib/atoms/button/index.js +2 -0
  66. package/dist/lib/atoms/button/index.js.map +1 -0
  67. package/dist/lib/atoms/col/col.js +19 -0
  68. package/dist/lib/atoms/col/col.js.map +1 -0
  69. package/dist/lib/atoms/container/container.js +3 -0
  70. package/dist/lib/atoms/container/container.js.map +1 -0
  71. package/dist/lib/atoms/form-elements/range-slider/range-slider.js +18 -0
  72. package/dist/lib/atoms/form-elements/range-slider/range-slider.js.map +1 -0
  73. package/dist/lib/atoms/form-elements/utilities/range-slider.js +97 -0
  74. package/dist/lib/atoms/form-elements/utilities/range-slider.js.map +1 -0
  75. package/dist/lib/atoms/image/image.js +15 -0
  76. package/dist/lib/atoms/image/image.js.map +1 -0
  77. package/dist/lib/atoms/image/index.js +2 -0
  78. package/dist/lib/atoms/image/index.js.map +1 -0
  79. package/dist/lib/atoms/image/utilities/create-image-url.js +14 -0
  80. package/dist/lib/atoms/image/utilities/create-image-url.js.map +1 -0
  81. package/dist/lib/atoms/image/utilities/detect-responsive-images.js +24 -0
  82. package/dist/lib/atoms/image/utilities/detect-responsive-images.js.map +1 -0
  83. package/dist/lib/atoms/image/utilities/image.js +86 -0
  84. package/dist/lib/atoms/image/utilities/image.js.map +1 -0
  85. package/dist/lib/atoms/image/utilities/object-fit.js +35 -0
  86. package/dist/lib/atoms/image/utilities/object-fit.js.map +1 -0
  87. package/dist/lib/atoms/row/row.js +3 -0
  88. package/dist/lib/atoms/row/row.js.map +1 -0
  89. package/dist/lib/atoms/svg/svg.js +23 -0
  90. package/dist/lib/atoms/svg/svg.js.map +1 -0
  91. package/dist/lib/index.js +12 -0
  92. package/dist/lib/index.js.map +1 -0
  93. package/dist/lib/molecules/infobox/index.js +2 -0
  94. package/dist/lib/molecules/infobox/index.js.map +1 -0
  95. package/dist/lib/molecules/infobox/infobox.js +17 -0
  96. package/dist/lib/molecules/infobox/infobox.js.map +1 -0
  97. package/dist/lib/molecules/map/hooks/use-style-loaded.js +14 -0
  98. package/dist/lib/molecules/map/hooks/use-style-loaded.js.map +1 -0
  99. package/dist/lib/molecules/map/index.js +4 -0
  100. package/dist/lib/molecules/map/index.js.map +1 -0
  101. package/dist/lib/molecules/map/map.js +256 -0
  102. package/dist/lib/molecules/map/map.js.map +1 -0
  103. package/dist/lib/molecules/map/store/map/index.js +2 -0
  104. package/dist/lib/molecules/map/store/map/index.js.map +1 -0
  105. package/dist/lib/molecules/map/store/map/store.js +147 -0
  106. package/dist/lib/molecules/map/store/map/store.js.map +1 -0
  107. package/dist/lib/molecules/map/storybook/themes.js +54 -0
  108. package/dist/lib/molecules/map/storybook/themes.js.map +1 -0
  109. package/dist/lib/molecules/map/utilities/fit-bounds.js +2 -0
  110. package/dist/lib/molecules/map/utilities/fit-bounds.js.map +1 -0
  111. package/dist/lib/molecules/map/utilities/mapbox/add-data.js +52 -0
  112. package/dist/lib/molecules/map/utilities/mapbox/add-data.js.map +1 -0
  113. package/dist/lib/molecules/map/utilities/mapbox/center.js +13 -0
  114. package/dist/lib/molecules/map/utilities/mapbox/center.js.map +1 -0
  115. package/dist/lib/molecules/map/utilities/mapbox/constants.js +3 -0
  116. package/dist/lib/molecules/map/utilities/mapbox/constants.js.map +1 -0
  117. package/dist/lib/molecules/map/utilities/mapbox/index.js +3 -0
  118. package/dist/lib/molecules/map/utilities/mapbox/index.js.map +1 -0
  119. package/dist/lib/molecules/map/utilities/mapbox/mapbox.js +25 -0
  120. package/dist/lib/molecules/map/utilities/mapbox/mapbox.js.map +1 -0
  121. package/dist/lib/molecules/map/utilities/mapbox/parse-feature-properties.js +16 -0
  122. package/dist/lib/molecules/map/utilities/mapbox/parse-feature-properties.js.map +1 -0
  123. package/dist/lib/molecules/map/utilities/mapbox/pointers/setup-pointers.js +151 -0
  124. package/dist/lib/molecules/map/utilities/mapbox/pointers/setup-pointers.js.map +1 -0
  125. package/dist/lib/molecules/map/utilities/mapbox/polygons/feature-state.js +10 -0
  126. package/dist/lib/molecules/map/utilities/mapbox/polygons/feature-state.js.map +1 -0
  127. package/dist/lib/molecules/map/utilities/mapbox/polygons/geojson.js +9 -0
  128. package/dist/lib/molecules/map/utilities/mapbox/polygons/geojson.js.map +1 -0
  129. package/dist/lib/molecules/map/utilities/mapbox/polygons/interaction.js +32 -0
  130. package/dist/lib/molecules/map/utilities/mapbox/polygons/interaction.js.map +1 -0
  131. package/dist/lib/molecules/map/utilities/mapbox/polygons/layer.js +109 -0
  132. package/dist/lib/molecules/map/utilities/mapbox/polygons/layer.js.map +1 -0
  133. package/dist/lib/molecules/map/utilities/mapbox/raster.js +42 -0
  134. package/dist/lib/molecules/map/utilities/mapbox/raster.js.map +1 -0
  135. package/dist/lib/molecules/map/utilities/mapbox/search/alternative-city-suggestions.js +26 -0
  136. package/dist/lib/molecules/map/utilities/mapbox/search/alternative-city-suggestions.js.map +1 -0
  137. package/dist/lib/molecules/map/utilities/mapbox/search/search.js +172 -0
  138. package/dist/lib/molecules/map/utilities/mapbox/search/search.js.map +1 -0
  139. package/dist/lib/molecules/map/utilities/mapbox/tooltip.js +24 -0
  140. package/dist/lib/molecules/map/utilities/mapbox/tooltip.js.map +1 -0
  141. package/dist/lib/molecules/tooltip/index.js +2 -0
  142. package/dist/lib/molecules/tooltip/index.js.map +1 -0
  143. package/dist/lib/molecules/tooltip/tooltip.js +11 -0
  144. package/dist/lib/molecules/tooltip/tooltip.js.map +1 -0
  145. package/dist/molecules/map/utilities/mapbox/directions/directions.js +12 -2
  146. package/dist/molecules/map/utilities/mapbox/directions/directions.js.map +1 -1
  147. package/dist/types/atoms/button/button.d.ts +17 -0
  148. package/dist/types/atoms/button/index.d.ts +1 -0
  149. package/dist/types/atoms/col/col.d.ts +11 -0
  150. package/dist/types/atoms/container/container.d.ts +6 -0
  151. package/dist/types/atoms/form-elements/range-slider/range-slider.d.ts +11 -0
  152. package/dist/types/atoms/form-elements/utilities/range-slider.d.ts +7 -0
  153. package/dist/types/atoms/image/image.d.ts +14 -0
  154. package/dist/types/atoms/image/index.d.ts +1 -0
  155. package/dist/types/atoms/image/utilities/create-image-url.d.ts +6 -0
  156. package/dist/types/atoms/image/utilities/detect-responsive-images.d.ts +7 -0
  157. package/dist/types/atoms/image/utilities/image.d.ts +18 -0
  158. package/dist/types/atoms/image/utilities/object-fit.d.ts +7 -0
  159. package/dist/types/atoms/row/row.d.ts +6 -0
  160. package/dist/types/atoms/svg/svg.d.ts +4 -0
  161. package/dist/types/index.d.ts +11 -0
  162. package/dist/types/molecules/infobox/index.d.ts +1 -0
  163. package/dist/types/molecules/infobox/infobox.d.ts +7 -0
  164. package/dist/types/molecules/map/hooks/use-style-loaded.d.ts +2 -0
  165. package/dist/types/molecules/map/index.d.ts +3 -0
  166. package/dist/types/molecules/map/map.d.ts +2 -0
  167. package/dist/types/molecules/map/store/map/index.d.ts +1 -0
  168. package/dist/types/molecules/map/store/map/store.d.ts +60 -0
  169. package/dist/types/molecules/map/storybook/themes.d.ts +3 -0
  170. package/dist/types/molecules/map/utilities/fit-bounds.d.ts +3 -0
  171. package/dist/types/molecules/map/utilities/mapbox/add-data.d.ts +3 -0
  172. package/dist/types/molecules/map/utilities/mapbox/center.d.ts +3 -0
  173. package/dist/types/molecules/map/utilities/mapbox/constants.d.ts +2 -0
  174. package/dist/types/molecules/map/utilities/mapbox/index.d.ts +2 -0
  175. package/dist/types/molecules/map/utilities/mapbox/mapbox.d.ts +16 -0
  176. package/dist/types/molecules/map/utilities/mapbox/parse-feature-properties.d.ts +6 -0
  177. package/dist/types/molecules/map/utilities/mapbox/pointers/setup-pointers.d.ts +3 -0
  178. package/dist/types/molecules/map/utilities/mapbox/polygons/feature-state.d.ts +2 -0
  179. package/dist/types/molecules/map/utilities/mapbox/polygons/geojson.d.ts +3 -0
  180. package/dist/types/molecules/map/utilities/mapbox/polygons/interaction.d.ts +3 -0
  181. package/dist/types/molecules/map/utilities/mapbox/polygons/layer.d.ts +3 -0
  182. package/dist/types/molecules/map/utilities/mapbox/raster.d.ts +3 -0
  183. package/dist/types/molecules/map/utilities/mapbox/search/alternative-city-suggestions.d.ts +3 -0
  184. package/dist/types/molecules/map/utilities/mapbox/search/search.d.ts +4 -0
  185. package/dist/types/molecules/map/utilities/mapbox/tooltip.d.ts +4 -0
  186. package/dist/types/molecules/tooltip/index.d.ts +1 -0
  187. package/dist/types/molecules/tooltip/tooltip.d.ts +7 -0
  188. package/package.json +4 -4
  189. package/coverage/base.css +0 -224
  190. package/coverage/block-navigation.js +0 -79
  191. package/coverage/index.html +0 -95
  192. package/coverage/lcov.info +0 -0
  193. package/coverage/prettify.css +0 -1
  194. package/coverage/prettify.js +0 -2
  195. package/coverage/sort-arrow-sprite.png +0 -0
  196. package/coverage/sorter.js +0 -170
  197. package/dist/molecules/map/store/map/hooks/index.d.ts +0 -1
  198. package/dist/molecules/map/store/map/hooks/index.js +0 -2
  199. package/dist/molecules/map/store/map/hooks/index.js.map +0 -1
  200. package/dist/molecules/map/store/map/hooks/use-map-instance.d.ts +0 -2
  201. package/dist/molecules/map/store/map/hooks/use-map-instance.js +0 -15
  202. package/dist/molecules/map/store/map/hooks/use-map-instance.js.map +0 -1
@@ -0,0 +1,172 @@
1
+ import { h } from '@atomify/jsx';
2
+ import { calculateBoundingBoxCenter, debounce, environment, expandBoundingBox, getCountryBoundingBox, useClickOutside, withinBoundingBox, } from '@bpd-library/utilities';
3
+ import mapboxgl from 'mapbox-gl';
4
+ import { clearSearchResult, getMapboxData, mapStore, updateSearchIsMoving, updateSearchResult, } from '../../../store/map';
5
+ import { fitBounds } from '../../fit-bounds';
6
+ import getCityAlternativeSuggestions from './alternative-city-suggestions';
7
+ const MIN_KM_PADDING = 10;
8
+ const search = async (map, { hook, kmPadding = MIN_KM_PADDING, onSearchSuggestion }, { searchCountryIsoCodes = ['nl', 'de'], language = 'nl' }) => {
9
+ const element = document.querySelector(hook);
10
+ const bounds = getCountryBoundingBox(searchCountryIsoCodes);
11
+ if (!element) {
12
+ if (environment.isLocal)
13
+ console.error(`Search element can't be found: ${hook}`);
14
+ return;
15
+ }
16
+ const inputElement = element.querySelector('[js-hook-map-search-input]');
17
+ const form = inputElement.closest('form');
18
+ const suggestionsElement = element.querySelector('[js-hook-map-search-suggestions]');
19
+ const buttonElement = element.querySelector('[js-hook-map-search-button]');
20
+ let geocoder;
21
+ let suggestions;
22
+ init();
23
+ async function init() {
24
+ const { default: MapboxGeocoder } = await import('@mapbox/mapbox-gl-geocoder');
25
+ geocoder = new MapboxGeocoder({
26
+ accessToken: mapboxgl.accessToken,
27
+ mapboxgl,
28
+ countries: searchCountryIsoCodes.join(',').toUpperCase(),
29
+ types: 'region,district,place,neighborhood',
30
+ localGeocoder,
31
+ language,
32
+ enableEventLogging: false,
33
+ marker: false,
34
+ });
35
+ map.addControl(geocoder);
36
+ bindEvents();
37
+ subscribe();
38
+ }
39
+ function bindEvents() {
40
+ const debouncedOnKeyDown = debounce(onKeyDown, 300);
41
+ inputElement.addEventListener('keydown', debouncedOnKeyDown);
42
+ buttonElement.addEventListener('click', handleButtonClick);
43
+ form === null || form === void 0 ? void 0 : form.addEventListener('submit', (e) => e.preventDefault());
44
+ useClickOutside(inputElement, handleClickOutside);
45
+ geocoder.on('results', (results) => {
46
+ suggestions = results;
47
+ renderSuggestions(suggestions);
48
+ });
49
+ }
50
+ function subscribe() {
51
+ handleManualSearch(mapStore.getState());
52
+ mapStore.subscribe(handleManualSearch, ['manualSearch']);
53
+ }
54
+ function handleManualSearch({ manualSearch }) {
55
+ if (manualSearch) {
56
+ geocoder.setInput(manualSearch).on('results', function handleResults(results) {
57
+ suggestions = results;
58
+ submitFirstSuggestion();
59
+ geocoder.off('results', handleResults);
60
+ });
61
+ }
62
+ }
63
+ function handleClickOutside() {
64
+ clearSuggestionsContainer();
65
+ }
66
+ function handleFitBounds() {
67
+ return fitBounds(map, bounds);
68
+ }
69
+ function onKeyDown(e) {
70
+ const { value } = inputElement;
71
+ if (e.key === 'Enter') {
72
+ if (!value) {
73
+ clearAll();
74
+ return;
75
+ }
76
+ else {
77
+ geocoder.on('results', function handleEnter() {
78
+ submitFirstSuggestion();
79
+ inputElement === null || inputElement === void 0 ? void 0 : inputElement.blur();
80
+ geocoder.off('results', handleEnter);
81
+ });
82
+ }
83
+ }
84
+ if (value.length >= 3) {
85
+ geocoder.setInput(value);
86
+ }
87
+ else {
88
+ suggestions = undefined;
89
+ handleFitBounds();
90
+ clearSuggestionsContainer();
91
+ clearSearchResult();
92
+ }
93
+ }
94
+ function handleButtonClick() {
95
+ const { value } = inputElement;
96
+ if (!value) {
97
+ clearAll();
98
+ }
99
+ else {
100
+ submitFirstSuggestion();
101
+ }
102
+ }
103
+ function submitFirstSuggestion() {
104
+ const firstSuggestion = suggestions === null || suggestions === void 0 ? void 0 : suggestions.features[0];
105
+ updateStore(firstSuggestion);
106
+ clearSuggestionsContainer();
107
+ }
108
+ function clearSuggestionsContainer() {
109
+ suggestionsElement.innerHTML = '';
110
+ }
111
+ function clearAll() {
112
+ suggestions = undefined;
113
+ handleFitBounds();
114
+ clearSuggestionsContainer();
115
+ clearSearchResult();
116
+ inputElement === null || inputElement === void 0 ? void 0 : inputElement.blur();
117
+ }
118
+ function localGeocoder(query) {
119
+ const createSuggestion = ({ title, bbox, type, id }) => {
120
+ const center = calculateBoundingBoxCenter(bbox);
121
+ return {
122
+ place_name: title,
123
+ bbox,
124
+ center,
125
+ type,
126
+ id,
127
+ };
128
+ };
129
+ const customSuggestions = onSearchSuggestion
130
+ ? onSearchSuggestion(query.toLowerCase()).map(createSuggestion)
131
+ : [];
132
+ const cityAlternatives = getCityAlternativeSuggestions(query.toLowerCase()).map(createSuggestion);
133
+ return [...customSuggestions, ...cityAlternatives].slice(0, 4);
134
+ }
135
+ function updateStore(result) {
136
+ if (!result) {
137
+ updateSearchResult({
138
+ items: [],
139
+ result: false,
140
+ });
141
+ handleFitBounds();
142
+ return;
143
+ }
144
+ const expandedBoundingBox = expandBoundingBox(result.bbox, kmPadding);
145
+ const originalBoundingBox = result.bbox;
146
+ const mapData = getMapboxData();
147
+ const filteredData = mapData.filter((item) => withinBoundingBox(item.coordinates, expandedBoundingBox));
148
+ map.fitBounds(expandedBoundingBox);
149
+ updateSearchIsMoving(true);
150
+ map.once('moveend', () => {
151
+ updateSearchIsMoving(false);
152
+ });
153
+ updateSearchResult({
154
+ items: filteredData,
155
+ result,
156
+ originalBoundingBox,
157
+ expandedBoundingBox,
158
+ });
159
+ }
160
+ function handleSuggestionClick(feature) {
161
+ inputElement.value = feature.place_name;
162
+ clearSuggestionsContainer();
163
+ updateStore(feature);
164
+ }
165
+ function renderSuggestions(suggestions) {
166
+ clearSuggestionsContainer();
167
+ suggestionsElement.append(h("ul", { class: "map-search__suggestions" }, suggestions.features.map((feature) => (h("li", { class: "map-search__suggestion" },
168
+ h("button", { onClick: () => handleSuggestionClick(feature) }, feature.place_name))))));
169
+ }
170
+ };
171
+ export default search;
172
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../../../../src/molecules/map/utilities/mapbox/search/search.tsx"],"names":[],"mappings":"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","sourcesContent":["import { h } from '@atomify/jsx';\nimport { BoundingBox, MapOptions, MapSearchOptions, MapSearchSuggestion } from '@bpd-library/types';\nimport {\n calculateBoundingBoxCenter,\n debounce,\n environment,\n expandBoundingBox,\n getCountryBoundingBox,\n useClickOutside,\n withinBoundingBox,\n} from '@bpd-library/utilities';\nimport mapboxgl from 'mapbox-gl';\n\nimport {\n clearSearchResult,\n getMapboxData,\n MapState,\n mapStore,\n updateSearchIsMoving,\n updateSearchResult,\n} from '../../../store/map';\nimport { fitBounds } from '../../fit-bounds';\nimport getCityAlternativeSuggestions from './alternative-city-suggestions';\n\nconst MIN_KM_PADDING = 10;\n\nconst search = async (\n map: mapboxgl.Map,\n { hook, kmPadding = MIN_KM_PADDING, onSearchSuggestion }: MapSearchOptions,\n { searchCountryIsoCodes = ['nl', 'de'], language = 'nl' }: MapOptions,\n) => {\n const element = document.querySelector(hook);\n const bounds = getCountryBoundingBox(searchCountryIsoCodes);\n\n if (!element) {\n if (environment.isLocal) console.error(`Search element can't be found: ${hook}`);\n return;\n }\n\n const inputElement = element.querySelector('[js-hook-map-search-input]') as HTMLInputElement;\n const form = inputElement.closest<HTMLFormElement>('form');\n const suggestionsElement = element.querySelector(\n '[js-hook-map-search-suggestions]',\n ) as HTMLElement;\n const buttonElement = element.querySelector('[js-hook-map-search-button]') as HTMLButtonElement;\n\n let geocoder: any | undefined;\n let suggestions: any | undefined;\n\n init();\n\n async function init() {\n // Dynamically import geocoder library\n const { default: MapboxGeocoder } = await import('@mapbox/mapbox-gl-geocoder');\n\n geocoder = new MapboxGeocoder({\n accessToken: mapboxgl.accessToken,\n mapboxgl,\n countries: searchCountryIsoCodes.join(',').toUpperCase(),\n types: 'region,district,place,neighborhood',\n localGeocoder,\n language,\n enableEventLogging: false,\n marker: false,\n });\n\n map.addControl(geocoder);\n\n bindEvents();\n subscribe();\n }\n\n function bindEvents() {\n const debouncedOnKeyDown = debounce(onKeyDown, 300);\n\n inputElement.addEventListener('keydown', debouncedOnKeyDown);\n buttonElement.addEventListener('click', handleButtonClick);\n form?.addEventListener('submit', (e) => e.preventDefault());\n\n useClickOutside(inputElement!, handleClickOutside);\n\n geocoder.on('results', (results: any) => {\n suggestions = results;\n\n renderSuggestions(suggestions);\n });\n }\n\n function subscribe() {\n handleManualSearch(mapStore.getState());\n mapStore.subscribe(handleManualSearch, ['manualSearch']);\n }\n\n function handleManualSearch({ manualSearch }: MapState) {\n if (manualSearch) {\n geocoder.setInput(manualSearch).on('results', function handleResults(results: any) {\n suggestions = results;\n\n submitFirstSuggestion();\n\n geocoder.off('results', handleResults);\n });\n }\n }\n\n function handleClickOutside() {\n clearSuggestionsContainer();\n }\n\n function handleFitBounds() {\n return fitBounds(map, bounds);\n }\n\n function onKeyDown(e: KeyboardEvent) {\n const { value } = inputElement!;\n\n if (e.key === 'Enter') {\n if (!value) {\n clearAll();\n return;\n } else {\n geocoder.on('results', function handleEnter() {\n submitFirstSuggestion();\n inputElement?.blur();\n\n geocoder.off('results', handleEnter);\n });\n }\n }\n\n if (value.length >= 3) {\n geocoder.setInput(value);\n } else {\n suggestions = undefined;\n handleFitBounds();\n clearSuggestionsContainer();\n clearSearchResult();\n }\n }\n\n function handleButtonClick() {\n const { value } = inputElement!;\n\n if (!value) {\n clearAll();\n } else {\n submitFirstSuggestion();\n }\n }\n\n function submitFirstSuggestion() {\n const firstSuggestion = suggestions?.features[0];\n\n updateStore(firstSuggestion);\n clearSuggestionsContainer();\n }\n\n function clearSuggestionsContainer() {\n suggestionsElement.innerHTML = '';\n }\n\n function clearAll() {\n suggestions = undefined;\n handleFitBounds();\n clearSuggestionsContainer();\n clearSearchResult();\n inputElement?.blur();\n }\n\n function localGeocoder(query: string) {\n const createSuggestion = ({ title, bbox, type, id }: MapSearchSuggestion) => {\n const center = calculateBoundingBoxCenter(bbox);\n\n return {\n place_name: title,\n bbox,\n center,\n type,\n id,\n };\n };\n\n const customSuggestions = onSearchSuggestion\n ? onSearchSuggestion(query.toLowerCase()).map(createSuggestion)\n : [];\n const cityAlternatives = getCityAlternativeSuggestions(query.toLowerCase()).map(\n createSuggestion,\n );\n\n return [...customSuggestions, ...cityAlternatives].slice(0, 4);\n }\n\n function updateStore(result: any) {\n if (!result) {\n updateSearchResult({\n items: [],\n result: false,\n });\n\n handleFitBounds();\n\n return;\n }\n\n const expandedBoundingBox = expandBoundingBox(result.bbox as BoundingBox, kmPadding);\n const originalBoundingBox = result.bbox as BoundingBox;\n\n const mapData = getMapboxData();\n const filteredData = mapData.filter((item) =>\n withinBoundingBox(item.coordinates, expandedBoundingBox),\n );\n\n map.fitBounds(expandedBoundingBox);\n\n // Update searchIsMoving boolean in store. Is used to block other focus interactions when searched.\n updateSearchIsMoving(true);\n\n map.once('moveend', () => {\n updateSearchIsMoving(false);\n });\n\n updateSearchResult({\n items: filteredData,\n result,\n originalBoundingBox,\n expandedBoundingBox,\n });\n }\n\n function handleSuggestionClick(feature: any) {\n inputElement.value = feature.place_name;\n\n clearSuggestionsContainer();\n updateStore(feature);\n }\n\n function renderSuggestions(suggestions: any) {\n clearSuggestionsContainer();\n\n suggestionsElement.append(\n <ul class=\"map-search__suggestions\">\n {suggestions.features.map((feature: any) => (\n <li class=\"map-search__suggestion\">\n <button onClick={() => handleSuggestionClick(feature)}>\n {feature.place_name}\n </button>\n </li>\n ))}\n </ul>,\n );\n }\n};\n\nexport default search;\n"]}
@@ -0,0 +1,24 @@
1
+ import { h } from '@atomify/jsx';
2
+ import { calculateCenter } from '@bpd-library/utilities';
3
+ import { Popup } from 'mapbox-gl';
4
+ import { Tooltip } from '../../../tooltip';
5
+ let currentTooltip;
6
+ const addTooltip = (map, coordinates, mapDataItem, openInTab) => {
7
+ removeTooltip();
8
+ const { tooltip, url } = mapDataItem;
9
+ if (!tooltip)
10
+ return;
11
+ const center = calculateCenter(coordinates);
12
+ currentTooltip = new Popup({
13
+ closeButton: false,
14
+ offset: 20,
15
+ })
16
+ .setLngLat(center)
17
+ .setDOMContent(h(Tooltip, Object.assign({}, tooltip, { url: url, openInTab: openInTab })))
18
+ .addTo(map);
19
+ };
20
+ const removeTooltip = () => {
21
+ currentTooltip === null || currentTooltip === void 0 ? void 0 : currentTooltip.remove();
22
+ };
23
+ export { addTooltip, removeTooltip };
24
+ //# sourceMappingURL=tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.js","sourceRoot":"","sources":["../../../../../../src/molecules/map/utilities/mapbox/tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,IAAI,cAA0C,CAAC;AAE/C,MAAM,UAAU,GAAG,CACf,GAAiB,EACjB,WAAwB,EACxB,WAAwB,EACxB,SAAmB,EACrB,EAAE;IACA,aAAa,EAAE,CAAC;IAEhB,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC;IAErC,IAAI,CAAC,OAAO;QAAE,OAAO;IAErB,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAE5C,cAAc,GAAG,IAAI,KAAK,CAAC;QACvB,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,EAAE;KACb,CAAC;SACG,SAAS,CAAC,MAAM,CAAC;SACjB,aAAa,CAAC,EAAC,OAAO,oBAAK,OAAO,IAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,IAAI,CAAC;SACvE,KAAK,CAAC,GAAG,CAAC,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,GAAG,EAAE;IACvB,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,GAAG;AAC7B,CAAC,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC","sourcesContent":["import { h } from '@atomify/jsx';\nimport { Coordinates, MapDataItem } from '@bpd-library/types';\nimport { calculateCenter } from '@bpd-library/utilities';\nimport { Popup } from 'mapbox-gl';\n\nimport { Tooltip } from '../../../tooltip';\n\nlet currentTooltip: mapboxgl.Popup | undefined;\n\nconst addTooltip = (\n map: mapboxgl.Map,\n coordinates: Coordinates,\n mapDataItem: MapDataItem,\n openInTab?: boolean,\n) => {\n removeTooltip();\n\n const { tooltip, url } = mapDataItem;\n\n if (!tooltip) return;\n\n const center = calculateCenter(coordinates);\n\n currentTooltip = new Popup({\n closeButton: false,\n offset: 20,\n })\n .setLngLat(center)\n .setDOMContent(<Tooltip {...tooltip} url={url} openInTab={openInTab} />)\n .addTo(map);\n};\n\nconst removeTooltip = () => {\n currentTooltip?.remove();\n};\n\nexport { addTooltip, removeTooltip };\n"]}
@@ -0,0 +1,2 @@
1
+ export * from './tooltip';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/molecules/tooltip/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC","sourcesContent":["export * from './tooltip';\n"]}
@@ -0,0 +1,11 @@
1
+ import { h } from '@atomify/jsx';
2
+ import { ButtonA } from '../../atoms/button';
3
+ import { Image } from '../../atoms/image';
4
+ export const Tooltip = ({ title, image, tags, buttonLabel, url, openInTab }) => (h("div", { class: "c-tooltip" },
5
+ image && (h("div", { class: "tooltip__image" },
6
+ h(Image, { image: image, preload: { width: 180, height: 100 }, alt: title }))),
7
+ h("div", { class: "tooltip__wrapper" },
8
+ h("h3", { class: "tooltip__title" }, title), tags === null || tags === void 0 ? void 0 :
9
+ tags.map((tag) => (h("span", { class: "tooltip__meta" }, tag))),
10
+ url && buttonLabel && (h(ButtonA, { classes: "tooltip__button", url: url, target: openInTab ? '_blank' : '_self', label: buttonLabel, size: "small" })))));
11
+ //# sourceMappingURL=tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.js","sourceRoot":"","sources":["../../../../src/molecules/tooltip/tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAGjC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAO1C,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAW,EAAE,EAAE,CAAC,CACrF,WAAK,KAAK,EAAC,WAAW;IACjB,KAAK,IAAI,CACN,WAAK,KAAK,EAAC,gBAAgB;QACvB,EAAC,KAAK,IAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,GAAI,CACvE,CACT;IACD,WAAK,KAAK,EAAC,kBAAkB;QACzB,UAAI,KAAK,EAAC,gBAAgB,IAAE,KAAK,CAAM,EACtC,IAAI,aAAJ,IAAI;QAAJ,IAAI,CAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAChB,YAAM,KAAK,EAAC,eAAe,IAAE,GAAG,CAAQ,CAC3C;QAEA,GAAG,IAAI,WAAW,IAAI,CACnB,EAAC,OAAO,IACJ,OAAO,EAAC,iBAAiB,EACzB,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EACtC,KAAK,EAAE,WAAW,EAClB,IAAI,EAAC,OAAO,GACd,CACL,CACC,CACJ,CACT,CAAC","sourcesContent":["import { h } from '@atomify/jsx';\nimport { MapTooltip } from '@bpd-library/types';\n\nimport { ButtonA } from '../../atoms/button';\nimport { Image } from '../../atoms/image';\n\ninterface Tooltip extends MapTooltip {\n url?: string | null;\n openInTab?: boolean;\n}\n\nexport const Tooltip = ({ title, image, tags, buttonLabel, url, openInTab }: Tooltip) => (\n <div class=\"c-tooltip\">\n {image && (\n <div class=\"tooltip__image\">\n <Image image={image} preload={{ width: 180, height: 100 }} alt={title} />\n </div>\n )}\n <div class=\"tooltip__wrapper\">\n <h3 class=\"tooltip__title\">{title}</h3>\n {tags?.map((tag) => (\n <span class=\"tooltip__meta\">{tag}</span>\n ))}\n\n {url && buttonLabel && (\n <ButtonA\n classes=\"tooltip__button\"\n url={url}\n target={openInTab ? '_blank' : '_self'}\n label={buttonLabel}\n size=\"small\"\n />\n )}\n </div>\n </div>\n);\n"]}
@@ -33,9 +33,10 @@ const addDirections = async (map, directionsOptions) => {
33
33
  ],
34
34
  });
35
35
  const middlePoint = geometry.coordinates[~~(geometry.coordinates.length / 2)];
36
+ const transformedDuration = transformDuration(duration);
36
37
  startPopup = addPopup(start, startLabel());
37
38
  endPopup = addPopup(end, endLabel());
38
- durationPopup = addPopup(middlePoint, durationLabel(duration));
39
+ durationPopup = addPopup(middlePoint, durationLabel(transformedDuration));
39
40
  fitApiResultBounds(geometry);
40
41
  onInitialized && onInitialized();
41
42
  }
@@ -46,6 +47,15 @@ const addDirections = async (map, directionsOptions) => {
46
47
  }
47
48
  }
48
49
  }
50
+ function transformDuration(seconds) {
51
+ const totalHours = seconds / 60 / 60;
52
+ const hours = Math.floor(totalHours);
53
+ const minutes = Math.round((totalHours - hours) * 0.6 * 100);
54
+ return {
55
+ hours,
56
+ minutes,
57
+ };
58
+ }
49
59
  function setupSource() {
50
60
  map.addSource(DIRECTIONS_SOURCE, {
51
61
  type: 'geojson',
@@ -65,7 +75,7 @@ const addDirections = async (map, directionsOptions) => {
65
75
  });
66
76
  }
67
77
  function addPopup(location, labelNode, options) {
68
- return new Popup(Object.assign({ closeButton: false, closeOnClick: false, offset: 5 }, options))
78
+ return new Popup(Object.assign({ closeButton: false, closeOnClick: false, offset: 5, focusAfterOpen: false }, options))
69
79
  .setLngLat(location)
70
80
  .setDOMContent(labelNode)
71
81
  .addTo(map);
@@ -1 +1 @@
1
- {"version":3,"file":"directions.js","sourceRoot":"","sources":["../../../../../../src/molecules/map/utilities/mapbox/directions/directions.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAiB,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAM5C,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAEvC,IAAI,UAA6B,CAAC;AAClC,IAAI,QAA2B,CAAC;AAChC,IAAI,aAAgC,CAAC;AAErC,MAAM,aAAa,GAAG,KAAK,EAAE,GAAiB,EAAE,iBAAuC,EAAE,EAAE;IACvF,MAAM,IAAI,EAAE,CAAC;IAEb,KAAK,UAAU,IAAI;QACf,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,GAAG;QACrB,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,GAAG;QACnB,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,MAAM,GAAG;QAExB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE;YACnC,WAAW,EAAE,CAAC;YACd,UAAU,EAAE,CAAC;SAChB;QAED,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,GAC7E,iBAAiB,CAAC;QAEtB,MAAM,WAAW,GAAG,MAAM,CAAC,uBAAuB,CAAC,MAAM,CAAC,WAAW,CAAC;QAEtE,IAAI;YACA,MAAM,GAAG,GAAG,+CAA+C,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,kDAAkD,WAAW,EAAE,CAAC;YAC9K,MAAM,EACF,MAAM,EAAE,CAAC,KAAK,CAAC,GAClB,GAAG,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAwB,CAAC;YAEpE,IAAI,KAAK,EAAE;gBACP,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;gBAErC,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAE/B,CAAC;gBAChB,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAC;oBACZ,IAAI,EAAE,mBAAmB;oBACzB,QAAQ,EAAE;wBACN;4BACI,IAAI,EAAE,SAAS;4BACf,QAAQ,EAAE,QAAQ;4BAClB,UAAU,EAAE,IAAI;yBACnB;qBACJ;iBACJ,EAAE;gBAEH,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CACpC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CACxB,CAAC;gBAWhB,UAAU,GAAG,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC3C,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACrC,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAE/D,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBAE7B,aAAa,IAAI,aAAa,EAAE,CAAC;aACpC;SACJ;QAAC,OAAO,CAAC,EAAE;YACR,IAAI,WAAW,CAAC,OAAO,EAAE;gBACrB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACpB;SACJ;IACL,CAAC;IAED,SAAS,WAAW;QAChB,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE;YAC7B,IAAI,EAAE,SAAS;YACf,IAAI,EAAE;gBACF,IAAI,EAAE,mBAAmB;gBACzB,QAAQ,EAAE,EAAE;aACf;SACJ,CAAC,CAAC;IACP,CAAC;IAED,SAAS,UAAU;QACf,GAAG,CAAC,QAAQ,CAAC;YACT,EAAE,EAAE,kBAAkB;YACtB,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,iBAAiB;YACzB,MAAM,EAAE,EAAE;YACV,KAAK,kBACD,YAAY,EAAE,SAAS,EACvB,YAAY,EAAE,CAAC,IACZ,iBAAiB,CAAC,gBAAgB,CACxC;SACJ,CAAC,CAAC;IACP,CAAC;IAMD,SAAS,QAAQ,CAAC,QAAoB,EAAE,SAAe,EAAE,OAA+B;QACpF,OAAO,IAAI,KAAK,iBACZ,WAAW,EAAE,KAAK,EAClB,YAAY,EAAE,KAAK,EACnB,MAAM,EAAE,CAAC,IACN,OAAO,EACZ;aACG,SAAS,CAAC,QAAQ,CAAC;aACnB,aAAa,CAAC,SAAS,CAAC;aACxB,KAAK,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,SAAS,kBAAkB,CAAC,QAA4B;QACpD,MAAM,WAAW,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAgB,CAAC;QAC1D,MAAM,WAAW,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAEtD,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE;YACvB,OAAO,EAAE,iBAAiB,CAAC,aAAa,IAAI,EAAE;YAC9C,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;IACP,CAAC;AACL,CAAC,CAAC;AAEF,SAAS,gBAAgB,CAAC,GAAiB;IACvC,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAuC,CAAC;IAEtF,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,CAAC,OAAO,CAAC;QACX,IAAI,EAAE,mBAAmB;QACzB,QAAQ,EAAE,EAAE;KACf,CAAC,CAAC;IAEH,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,GAAG;IACrB,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,GAAG;IACnB,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,MAAM,GAAG;AAC5B,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC","sourcesContent":["import {\n Coordinate,\n Coordinates,\n DirectionsAPIRoute,\n MapDirectionsSetting,\n} from '@bpd-library/types';\nimport { calculateBoundingBox, environment } from '@bpd-library/utilities';\nimport mapboxgl, { Popup } from 'mapbox-gl';\n\ninterface DirectionsAPIResult {\n routes: DirectionsAPIRoute[];\n}\n\nconst DIRECTIONS_SOURCE = 'directions';\n\nlet startPopup: Popup | undefined;\nlet endPopup: Popup | undefined;\nlet durationPopup: Popup | undefined;\n\nconst addDirections = async (map: mapboxgl.Map, directionsOptions: MapDirectionsSetting) => {\n await init();\n\n async function init() {\n startPopup?.remove();\n endPopup?.remove();\n durationPopup?.remove();\n\n if (!map.getSource(DIRECTIONS_SOURCE)) {\n setupSource();\n setupLayer();\n }\n\n const { profile, start, end, startLabel, endLabel, durationLabel, onInitialized } =\n directionsOptions;\n\n const accessToken = window.__ENVIRONMENT_DETAILS__.mapbox.accessToken;\n\n try {\n const url = `https://api.mapbox.com/directions/v5/mapbox/${profile}/${start[0]},${start[1]};${end[0]},${end[1]}?overview=full&geometries=geojson&access_token=${accessToken}`;\n const {\n routes: [route],\n } = (await fetch(url).then((r) => r.json())) as DirectionsAPIResult;\n\n if (route) {\n const { geometry, duration } = route;\n\n const source = map.getSource(DIRECTIONS_SOURCE) as\n | mapboxgl.GeoJSONSource\n | undefined;\n source?.setData({\n type: 'FeatureCollection',\n features: [\n {\n type: 'Feature',\n geometry: geometry,\n properties: null,\n },\n ],\n });\n\n const middlePoint = geometry.coordinates[\n ~~(geometry.coordinates.length / 2)\n ] as Coordinate;\n\n // TODO: find better middle point - the one that lies on the line that passes between the start and end point\n // possibly use turf but definitely something like this:\n //\n // - for each coordinate on the route (except start and end)\n // - calculate distance between start and end\n // - divide (coord -> start) and (coord -> end)\n //\n // the point that has that division closest to 1 lies on that middle line and should be a good approximation\n\n startPopup = addPopup(start, startLabel());\n endPopup = addPopup(end, endLabel());\n durationPopup = addPopup(middlePoint, durationLabel(duration));\n\n fitApiResultBounds(geometry);\n\n onInitialized && onInitialized();\n }\n } catch (e) {\n if (environment.isLocal) {\n console.error(e);\n }\n }\n }\n\n function setupSource() {\n map.addSource(DIRECTIONS_SOURCE, {\n type: 'geojson',\n data: {\n type: 'FeatureCollection',\n features: [],\n },\n });\n }\n\n function setupLayer() {\n map.addLayer({\n id: 'directionsStroke',\n type: 'line',\n source: DIRECTIONS_SOURCE,\n layout: {},\n paint: {\n 'line-color': '#32C1DE',\n 'line-width': 4,\n ...directionsOptions.linePaintOptions,\n },\n });\n }\n\n // function getMiddlePoint(start: Coordinates, end: Coordinates, points: Position[]) {\n // //\n // }\n\n function addPopup(location: Coordinate, labelNode: Node, options?: mapboxgl.PopupOptions) {\n return new Popup({\n closeButton: false,\n closeOnClick: false,\n offset: 5,\n ...options,\n })\n .setLngLat(location)\n .setDOMContent(labelNode)\n .addTo(map);\n }\n\n function fitApiResultBounds(geometry: GeoJSON.LineString) {\n const coordinates = [geometry.coordinates] as Coordinates;\n const boundingBox = calculateBoundingBox(coordinates);\n\n map.fitBounds(boundingBox, {\n padding: directionsOptions.boundsPadding || 50,\n animate: true,\n duration: 1000,\n });\n }\n};\n\nfunction removeDirections(map: mapboxgl.Map) {\n const source = map.getSource(DIRECTIONS_SOURCE) as mapboxgl.GeoJSONSource | undefined;\n\n if (!source) return;\n\n source.setData({\n type: 'FeatureCollection',\n features: [],\n });\n\n startPopup?.remove();\n endPopup?.remove();\n durationPopup?.remove();\n}\n\nexport { addDirections, removeDirections };\n"]}
1
+ {"version":3,"file":"directions.js","sourceRoot":"","sources":["../../../../../../src/molecules/map/utilities/mapbox/directions/directions.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Coordinate,\n Coordinates,\n DirectionsAPIRoute,\n MapDirectionsDuration,\n MapDirectionsSetting,\n} from '@bpd-library/types';\nimport { calculateBoundingBox, environment } from '@bpd-library/utilities';\nimport mapboxgl, { Popup } from 'mapbox-gl';\n\ninterface DirectionsAPIResult {\n routes: DirectionsAPIRoute[];\n}\n\nconst DIRECTIONS_SOURCE = 'directions';\n\nlet startPopup: Popup | undefined;\nlet endPopup: Popup | undefined;\nlet durationPopup: Popup | undefined;\n\nconst addDirections = async (map: mapboxgl.Map, directionsOptions: MapDirectionsSetting) => {\n await init();\n\n async function init() {\n startPopup?.remove();\n endPopup?.remove();\n durationPopup?.remove();\n\n if (!map.getSource(DIRECTIONS_SOURCE)) {\n setupSource();\n setupLayer();\n }\n\n const { profile, start, end, startLabel, endLabel, durationLabel, onInitialized } =\n directionsOptions;\n\n const accessToken = window.__ENVIRONMENT_DETAILS__.mapbox.accessToken;\n\n try {\n const url = `https://api.mapbox.com/directions/v5/mapbox/${profile}/${start[0]},${start[1]};${end[0]},${end[1]}?overview=full&geometries=geojson&access_token=${accessToken}`;\n const {\n routes: [route],\n } = (await fetch(url).then((r) => r.json())) as DirectionsAPIResult;\n\n if (route) {\n const { geometry, duration } = route;\n\n const source = map.getSource(DIRECTIONS_SOURCE) as\n | mapboxgl.GeoJSONSource\n | undefined;\n source?.setData({\n type: 'FeatureCollection',\n features: [\n {\n type: 'Feature',\n geometry: geometry,\n properties: null,\n },\n ],\n });\n\n const middlePoint = geometry.coordinates[\n ~~(geometry.coordinates.length / 2)\n ] as Coordinate;\n\n // TODO: find better middle point - the one that lies on the line that passes between the start and end point\n // possibly use turf but definitely something like this:\n //\n // - for each coordinate on the route (except start and end)\n // - calculate distance between start and end\n // - divide (coord -> start) and (coord -> end)\n //\n // the point that has that division closest to 1 lies on that middle line and should be a good approximation\n\n const transformedDuration = transformDuration(duration);\n\n startPopup = addPopup(start, startLabel());\n endPopup = addPopup(end, endLabel());\n durationPopup = addPopup(middlePoint, durationLabel(transformedDuration));\n\n fitApiResultBounds(geometry);\n\n onInitialized && onInitialized();\n }\n } catch (e) {\n if (environment.isLocal) {\n console.error(e);\n }\n }\n }\n\n function transformDuration(seconds: number): MapDirectionsDuration {\n const totalHours = seconds / 60 / 60;\n const hours = Math.floor(totalHours);\n const minutes = Math.round((totalHours - hours) * 0.6 * 100);\n\n return {\n hours,\n minutes,\n };\n }\n\n function setupSource() {\n map.addSource(DIRECTIONS_SOURCE, {\n type: 'geojson',\n data: {\n type: 'FeatureCollection',\n features: [],\n },\n });\n }\n\n function setupLayer() {\n map.addLayer({\n id: 'directionsStroke',\n type: 'line',\n source: DIRECTIONS_SOURCE,\n layout: {},\n paint: {\n 'line-color': '#32C1DE',\n 'line-width': 4,\n ...directionsOptions.linePaintOptions,\n },\n });\n }\n\n // function getMiddlePoint(start: Coordinates, end: Coordinates, points: Position[]) {\n // //\n // }\n\n function addPopup(location: Coordinate, labelNode: Node, options?: mapboxgl.PopupOptions) {\n return new Popup({\n closeButton: false,\n closeOnClick: false,\n offset: 5,\n focusAfterOpen: false,\n ...options,\n })\n .setLngLat(location)\n .setDOMContent(labelNode)\n .addTo(map);\n }\n\n function fitApiResultBounds(geometry: GeoJSON.LineString) {\n const coordinates = [geometry.coordinates] as Coordinates;\n const boundingBox = calculateBoundingBox(coordinates);\n\n map.fitBounds(boundingBox, {\n padding: directionsOptions.boundsPadding || 50,\n animate: true,\n duration: 1000,\n });\n }\n};\n\nfunction removeDirections(map: mapboxgl.Map) {\n const source = map.getSource(DIRECTIONS_SOURCE) as mapboxgl.GeoJSONSource | undefined;\n\n if (!source) return;\n\n source.setData({\n type: 'FeatureCollection',\n features: [],\n });\n\n startPopup?.remove();\n endPopup?.remove();\n durationPopup?.remove();\n}\n\nexport { addDirections, removeDirections };\n"]}
@@ -0,0 +1,17 @@
1
+ interface ButtonInterface {
2
+ label: string | Text;
3
+ variant?: string;
4
+ icon?: string;
5
+ size?: string;
6
+ classes?: string;
7
+ type?: string;
8
+ url?: string;
9
+ hook?: string;
10
+ controls?: string;
11
+ onClick?: Function;
12
+ target?: string;
13
+ attr?: {};
14
+ }
15
+ declare const Button: (data: ButtonInterface) => any;
16
+ declare const ButtonA: (data: ButtonInterface) => any;
17
+ export { Button, ButtonA };
@@ -0,0 +1 @@
1
+ export * from './button';
@@ -0,0 +1,11 @@
1
+ interface ColInterface {
2
+ extraClass?: string;
3
+ children?: NodeList;
4
+ cols?: (number | undefined)[];
5
+ push?: (number | undefined)[];
6
+ pull?: (number | undefined)[];
7
+ pre?: (number | undefined)[];
8
+ post?: (number | undefined)[];
9
+ }
10
+ export declare const Col: ({ extraClass, children, cols, push, pull, pre, post, }: ColInterface) => any;
11
+ export {};
@@ -0,0 +1,6 @@
1
+ interface ContainerInterface {
2
+ extraClass?: string;
3
+ children?: NodeList;
4
+ }
5
+ export declare const Container: ({ extraClass, children }: ContainerInterface) => any;
6
+ export {};
@@ -0,0 +1,11 @@
1
+ export interface RangeSliderProps {
2
+ min: number;
3
+ max: number;
4
+ increment: number;
5
+ start: number[];
6
+ onChange: (e: CustomEvent) => void;
7
+ name: string;
8
+ classes?: string;
9
+ disabled?: boolean;
10
+ }
11
+ export declare const RangeSliderElement: ({ classes, disabled, min, max, increment, start, name, onChange, }: RangeSliderProps) => any;
@@ -0,0 +1,7 @@
1
+ import { Component, FC } from '@atomify/hooks';
2
+ export interface BPDRange extends Component {
3
+ bindValue: number[];
4
+ start: number[];
5
+ resetState: () => void;
6
+ }
7
+ export declare const RangeSlider: FC<BPDRange>;
@@ -0,0 +1,14 @@
1
+ import { Setting, Settings } from './utilities/image';
2
+ export interface ImageInterface {
3
+ image: string;
4
+ alt: string;
5
+ settings?: Settings;
6
+ preload?: Setting;
7
+ srcset?: string;
8
+ classes?: string;
9
+ caption?: string;
10
+ hidden?: boolean;
11
+ objectFit?: boolean | 'contain';
12
+ disableCrossFade?: boolean;
13
+ }
14
+ export declare const Image: (data: ImageInterface) => any;
@@ -0,0 +1 @@
1
+ export * from './image';
@@ -0,0 +1,6 @@
1
+ interface Setting {
2
+ width?: number;
3
+ height?: number;
4
+ }
5
+ declare const createImageUrl: (image: string, { width, height }: Setting) => string;
6
+ export default createImageUrl;
@@ -0,0 +1,7 @@
1
+ declare const _default: {
2
+ srcset: boolean;
3
+ currentSrc: boolean;
4
+ sizes: boolean;
5
+ picture: boolean;
6
+ };
7
+ export default _default;
@@ -0,0 +1,18 @@
1
+ export interface Setting {
2
+ width?: number;
3
+ height?: number;
4
+ src?: boolean | undefined;
5
+ }
6
+ export interface Settings {
7
+ [key: string]: Setting;
8
+ }
9
+ export declare class BPDImage extends HTMLElement {
10
+ img: HTMLImageElement;
11
+ componentDidLoad(): void;
12
+ disconnectedCallback(): void;
13
+ private parseSettings;
14
+ private generateSrc;
15
+ private generateSrcset;
16
+ private loadImage;
17
+ private renderImage;
18
+ }
@@ -0,0 +1,7 @@
1
+ declare type ImageElement = HTMLImageElement | HTMLImageElement[];
2
+ export default class ObjectFit {
3
+ static polyfillObjectFit(element: ImageElement): void;
4
+ static getObjectfitImages(element: ImageElement): HTMLImageElement[];
5
+ private static polyfillImage;
6
+ }
7
+ export {};
@@ -0,0 +1,6 @@
1
+ interface RowInterface {
2
+ extraClass?: string;
3
+ children?: NodeList;
4
+ }
5
+ export declare const Row: ({ extraClass, children }: RowInterface) => any;
6
+ export {};
@@ -0,0 +1,4 @@
1
+ export declare class BPDSvg extends HTMLElement {
2
+ name: string;
3
+ render(): any;
4
+ }
@@ -0,0 +1,11 @@
1
+ export * from './atoms/button';
2
+ export * from './atoms/col/col';
3
+ export * from './atoms/container/container';
4
+ export * from './atoms/form-elements/range-slider/range-slider';
5
+ export * from './atoms/form-elements/utilities/range-slider';
6
+ export * from './atoms/image';
7
+ export * from './atoms/row/row';
8
+ export * from './atoms/svg/svg';
9
+ export * from './molecules/infobox';
10
+ export * from './molecules/map';
11
+ export * from './molecules/tooltip';
@@ -0,0 +1 @@
1
+ export * from './infobox';
@@ -0,0 +1,7 @@
1
+ import { MapInfobox } from '@bpd-library/types';
2
+ interface InfoboxInterface extends MapInfobox {
3
+ onClose: () => void;
4
+ openInTab?: boolean;
5
+ }
6
+ export declare const Infobox: ({ title, image, tags, description, link, onClose, openInTab, }: InfoboxInterface) => any;
7
+ export {};
@@ -0,0 +1,2 @@
1
+ declare const useStyleLoaded: (map: mapboxgl.Map, cb: Function) => void;
2
+ export default useStyleLoaded;
@@ -0,0 +1,3 @@
1
+ export * from './utilities/fit-bounds';
2
+ export * from './store/map';
3
+ export * from './map';
@@ -0,0 +1,2 @@
1
+ import { FC } from '@atomify/hooks';
2
+ export declare const Map: FC;
@@ -0,0 +1 @@
1
+ export * from './store';
@@ -0,0 +1,60 @@
1
+ /// <reference types="mapbox-gl" />
2
+ import { BoundingBox, MapDataItem } from '@bpd-library/types';
3
+ export declare type SearchResult = {
4
+ items: MapDataItem[];
5
+ result: any;
6
+ originalBoundingBox?: BoundingBox;
7
+ expandedBoundingBox?: BoundingBox;
8
+ };
9
+ interface MapFocusOptions {
10
+ zoom?: boolean;
11
+ toggleTooltip?: boolean;
12
+ static?: boolean;
13
+ }
14
+ export interface MapLayerRasterSettings {
15
+ layerRaster: string;
16
+ minzoom?: number;
17
+ maxzoom?: number;
18
+ }
19
+ export interface MapState {
20
+ data: MapDataItem[];
21
+ mapInstance?: mapboxgl.Map;
22
+ hover: {
23
+ current?: MapDataItem;
24
+ previous?: MapDataItem;
25
+ };
26
+ filter?: MapDataItem[];
27
+ click?: MapDataItem;
28
+ focus: {
29
+ current?: MapDataItem[];
30
+ previous?: MapDataItem[];
31
+ options?: MapFocusOptions;
32
+ };
33
+ searchResult?: SearchResult;
34
+ searchIsMoving: boolean;
35
+ manualSearch?: string;
36
+ layerRasterSettings?: MapLayerRasterSettings;
37
+ }
38
+ export declare const mapStore: import("@atomify/kit/dist/utilities/store/store.types").Store<MapState>;
39
+ export declare const updateMapData: (data: MapDataItem[]) => void;
40
+ export declare const clearHover: () => void;
41
+ export declare const updateHover: (hover: MapDataItem) => void;
42
+ export declare const updateClick: (click: MapDataItem) => void;
43
+ export declare const setFocus: (ids: string[], options?: MapFocusOptions) => void;
44
+ export declare const clearFocus: () => void;
45
+ export declare const updateSearchResult: (searchResult: SearchResult) => void;
46
+ export declare const clearSearchResult: () => void;
47
+ export declare const setFilter: (data: MapDataItem[]) => void;
48
+ export declare const clearFilter: () => void;
49
+ export declare const setMapInstance: (mapInstance: mapboxgl.Map) => void;
50
+ export declare const manualSearch: (query: string) => void;
51
+ export declare const updateSearchIsMoving: (isMoving: boolean) => void;
52
+ export declare const setLayerRaster: (layerRasterSettings: MapLayerRasterSettings) => void;
53
+ export declare const getMapboxData: () => MapDataItem[];
54
+ export declare const getHover: () => {
55
+ current?: MapDataItem | undefined;
56
+ previous?: MapDataItem | undefined;
57
+ };
58
+ export declare const getMapInstance: () => import("mapbox-gl").Map | undefined;
59
+ export declare const getSearchIsMoving: () => boolean;
60
+ export {};
@@ -0,0 +1,3 @@
1
+ import { MapTheme } from '@bpd-library/types';
2
+ declare const THEME: MapTheme;
3
+ export default THEME;
@@ -0,0 +1,3 @@
1
+ /// <reference types="mapbox-gl" />
2
+ import { BoundingBox } from '@bpd-library/types';
3
+ export declare const fitBounds: (map: mapboxgl.Map, boundingBox: BoundingBox) => import("mapbox-gl").Map;
@@ -0,0 +1,3 @@
1
+ import { MapData, MapTheme } from '@bpd-library/types';
2
+ declare const addData: (map: mapboxgl.Map, data: MapData, theme: MapTheme) => Promise<void>;
3
+ export default addData;
@@ -0,0 +1,3 @@
1
+ import { Coordinates } from '@bpd-library/types';
2
+ declare const center: (map: mapboxgl.Map, coordinates: Coordinates) => void;
3
+ export default center;
@@ -0,0 +1,2 @@
1
+ export declare const MAP_FLY_DURATION = 1000;
2
+ export declare const MAP_FLY_EASING_FUNCTION: (t: number) => number;
@@ -0,0 +1,2 @@
1
+ import mapbox from './mapbox';
2
+ export default mapbox;
@@ -0,0 +1,16 @@
1
+ import { Coordinates, MapData, MapDataItem, MapOptions, MapSearchOptions, MapTheme, PolygonThemeSetting } from '@bpd-library/types';
2
+ import { MapLayerRasterSettings } from '../../store/map';
3
+ declare const mapbox: (map: mapboxgl.Map, options: MapOptions, theme: MapTheme) => {
4
+ raster: (settings: MapLayerRasterSettings) => void;
5
+ geojson: (setting: PolygonThemeSetting) => void;
6
+ layer: (setting: PolygonThemeSetting) => void;
7
+ interaction: (setting: PolygonThemeSetting) => void;
8
+ center: (coordinates: Coordinates) => void;
9
+ setupPointers: (element: HTMLElement) => void;
10
+ addData: (data: MapData) => Promise<void>;
11
+ addTooltip: (coordinates: Coordinates, mapDataItem: MapDataItem) => void;
12
+ removeTooltip: () => void;
13
+ setFeatureState: (variant: string, id: string, type: 'hover' | 'focus', hover: boolean) => void;
14
+ search: (searchOptions: MapSearchOptions) => Promise<void>;
15
+ };
16
+ export default mapbox;