raain-ui 2.3.21 → 2.3.23

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.
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RaainDivIcon = void 0;
4
+ const leaflet_1 = require("leaflet");
5
+ /**
6
+ * A DivIcon with built-in rotation and dynamic sizing support
7
+ *
8
+ * Usage:
9
+ * ```typescript
10
+ * // Basic usage with rotation
11
+ * const icon = new RaainDivIcon({
12
+ * html: '<div style="width: 30px; height: 30px; background: red;"></div>',
13
+ * rotationAngle: 0,
14
+ * className: 'my-custom-marker'
15
+ * });
16
+ *
17
+ * // With dynamic sizing (for wind speed visualization)
18
+ * const windIcon = new RaainDivIcon({
19
+ * htmlTemplate: `<div style="width: {width}px; height: {height}px; background: blue;"></div>`,
20
+ * width: 40,
21
+ * height: 40,
22
+ * rotationAngle: 45
23
+ * });
24
+ *
25
+ * const marker = L.marker([51.505, -0.09], { icon: windIcon }).addTo(map);
26
+ *
27
+ * // Update rotation dynamically
28
+ * windIcon.setRotation(90);
29
+ *
30
+ * // Update size dynamically (e.g., based on wind speed)
31
+ * windIcon.setSize(60, 60);
32
+ *
33
+ * // Update both size and rotation
34
+ * windIcon.update({ width: 50, height: 50, rotationAngle: 180 });
35
+ * ```
36
+ */
37
+ class RaainDivIcon extends leaflet_1.DivIcon {
38
+ constructor(options) {
39
+ var _a, _b;
40
+ // Process initial size options
41
+ const processedOptions = RaainDivIcon._processSizeOptions(options);
42
+ super(processedOptions);
43
+ this.options = options;
44
+ this._icon = null;
45
+ this._marker = null;
46
+ this.options = Object.assign(Object.assign({}, processedOptions), { rotationAngle: (_a = options.rotationAngle) !== null && _a !== void 0 ? _a : 0, rotationOrigin: (_b = options.rotationOrigin) !== null && _b !== void 0 ? _b : 'center center', width: options.width, height: options.height, htmlTemplate: options.htmlTemplate });
47
+ }
48
+ /**
49
+ * Process size options and generate HTML from template if needed
50
+ */
51
+ static _processSizeOptions(options) {
52
+ var _a, _b, _c, _d;
53
+ const processed = Object.assign({}, options);
54
+ // Update iconSize if width/height are provided
55
+ if (options.width !== undefined || options.height !== undefined) {
56
+ const width = (_a = options.width) !== null && _a !== void 0 ? _a : (Array.isArray(options.iconSize) ? options.iconSize[0] : 30);
57
+ const height = (_b = options.height) !== null && _b !== void 0 ? _b : (Array.isArray(options.iconSize) ? options.iconSize[1] : 30);
58
+ processed.iconSize = [width, height];
59
+ // Update iconAnchor proportionally if it exists
60
+ if (options.iconAnchor && Array.isArray(options.iconAnchor)) {
61
+ const oldSize = Array.isArray(options.iconSize) ? options.iconSize : [30, 30];
62
+ const anchorX = (options.iconAnchor[0] / oldSize[0]) * width;
63
+ const anchorY = (options.iconAnchor[1] / oldSize[1]) * height;
64
+ processed.iconAnchor = [anchorX, anchorY];
65
+ }
66
+ }
67
+ // Generate HTML from template if provided
68
+ if (options.htmlTemplate && (options.width !== undefined || options.height !== undefined)) {
69
+ const width = (_c = options.width) !== null && _c !== void 0 ? _c : (Array.isArray(processed.iconSize) ? processed.iconSize[0] : 30);
70
+ const height = (_d = options.height) !== null && _d !== void 0 ? _d : (Array.isArray(processed.iconSize) ? processed.iconSize[1] : 30);
71
+ processed.html = options.htmlTemplate
72
+ .replace(/\{width\}/g, String(width))
73
+ .replace(/\{height\}/g, String(height));
74
+ }
75
+ return processed;
76
+ }
77
+ /**
78
+ * Override createIcon to store reference and apply initial rotation
79
+ */
80
+ createIcon(oldIcon) {
81
+ const div = super.createIcon(oldIcon);
82
+ this._icon = div;
83
+ // Set transform-origin
84
+ div.style.transformOrigin = this.options.rotationOrigin;
85
+ // Apply initial rotation
86
+ this.applyRotation();
87
+ return div;
88
+ }
89
+ /**
90
+ * Set the rotation angle in degrees
91
+ * @param angle Rotation angle (0 = North, 90 = East, 180 = South, 270 = West)
92
+ */
93
+ setRotation(angle) {
94
+ this.options.rotationAngle = angle;
95
+ this.applyRotation();
96
+ return this;
97
+ }
98
+ /**
99
+ * Get the current rotation angle
100
+ */
101
+ getRotation() {
102
+ var _a;
103
+ return (_a = this.options.rotationAngle) !== null && _a !== void 0 ? _a : 0;
104
+ }
105
+ /**
106
+ * Set the size (width and height) of the icon dynamically
107
+ * @param width New width in pixels
108
+ * @param height New height in pixels
109
+ */
110
+ setSize(width, height) {
111
+ this.options.width = width;
112
+ this.options.height = height;
113
+ this._updateSize();
114
+ return this;
115
+ }
116
+ /**
117
+ * Get the current size
118
+ */
119
+ getSize() {
120
+ var _a, _b;
121
+ const iconSize = Array.isArray(this.options.iconSize) ? this.options.iconSize : [30, 30];
122
+ return {
123
+ width: (_a = this.options.width) !== null && _a !== void 0 ? _a : iconSize[0],
124
+ height: (_b = this.options.height) !== null && _b !== void 0 ? _b : iconSize[1],
125
+ };
126
+ }
127
+ /**
128
+ * Update multiple properties at once (size, rotation)
129
+ * @param updates Object with properties to update
130
+ */
131
+ update(updates) {
132
+ let sizeChanged = false;
133
+ if (updates.width !== undefined) {
134
+ this.options.width = updates.width;
135
+ sizeChanged = true;
136
+ }
137
+ if (updates.height !== undefined) {
138
+ this.options.height = updates.height;
139
+ sizeChanged = true;
140
+ }
141
+ if (updates.rotationAngle !== undefined) {
142
+ this.options.rotationAngle = updates.rotationAngle;
143
+ }
144
+ if (sizeChanged) {
145
+ this._updateSize();
146
+ }
147
+ this.applyRotation();
148
+ return this;
149
+ }
150
+ /**
151
+ * Set the transform origin for rotation
152
+ * @param origin CSS transform-origin value (e.g., 'center center', '50% 50%')
153
+ */
154
+ setRotationOrigin(origin) {
155
+ this.options.rotationOrigin = origin;
156
+ if (this._icon) {
157
+ this._icon.style.transformOrigin = origin;
158
+ this.applyRotation();
159
+ }
160
+ return this;
161
+ }
162
+ /**
163
+ * Apply the current rotation to the icon element
164
+ * This preserves any existing translate3d transformations from Leaflet
165
+ */
166
+ applyRotation() {
167
+ var _a;
168
+ if (!this._icon) {
169
+ return this;
170
+ }
171
+ const currentTransform = this._icon.style.transform || '';
172
+ const angle = (_a = this.options.rotationAngle) !== null && _a !== void 0 ? _a : 0;
173
+ // Preserve existing translate3d from Leaflet positioning
174
+ if (currentTransform.includes('translate3d')) {
175
+ // Remove any existing rotation from the transform
176
+ const withoutRotation = currentTransform.replace(/\s*rotate\([^)]+\)/g, '');
177
+ this._icon.style.transform = `${withoutRotation} rotate(${angle}deg)`;
178
+ }
179
+ else {
180
+ this._icon.style.transform = `rotate(${angle}deg)`;
181
+ }
182
+ return this;
183
+ }
184
+ /**
185
+ * Bind this icon to a marker for automatic rotation updates
186
+ * @param marker The Leaflet marker to bind to
187
+ */
188
+ bindToMarker(marker) {
189
+ this._marker = marker;
190
+ // Re-apply rotation on marker events that might reset the transform
191
+ marker.on('move', () => this.applyRotation());
192
+ marker.on('add', () => this.applyRotation());
193
+ return this;
194
+ }
195
+ /**
196
+ * Unbind from the current marker
197
+ */
198
+ unbindFromMarker() {
199
+ if (this._marker) {
200
+ this._marker.off('move');
201
+ this._marker.off('add');
202
+ this._marker = null;
203
+ }
204
+ return this;
205
+ }
206
+ /**
207
+ * Get the icon HTML element (if created)
208
+ */
209
+ getIconElement() {
210
+ return this._icon;
211
+ }
212
+ /**
213
+ * Internal method to update the icon's size
214
+ */
215
+ _updateSize() {
216
+ if (!this._icon || this.options.width === undefined || this.options.height === undefined) {
217
+ return;
218
+ }
219
+ const width = this.options.width;
220
+ const height = this.options.height;
221
+ // Update iconSize
222
+ this.options.iconSize = [width, height];
223
+ // Update the icon element's size
224
+ this._icon.style.width = `${width}px`;
225
+ this._icon.style.height = `${height}px`;
226
+ // Update anchor proportionally
227
+ if (this.options.iconAnchor && Array.isArray(this.options.iconAnchor)) {
228
+ const anchorX = this.options.iconAnchor[0];
229
+ const anchorY = this.options.iconAnchor[1];
230
+ this._icon.style.marginLeft = `-${anchorX}px`;
231
+ this._icon.style.marginTop = `-${anchorY}px`;
232
+ }
233
+ // Regenerate HTML from template if available
234
+ if (this.options.htmlTemplate) {
235
+ const newHtml = this.options.htmlTemplate
236
+ .replace(/\{width\}/g, String(width))
237
+ .replace(/\{height\}/g, String(height));
238
+ this._icon.innerHTML = newHtml;
239
+ }
240
+ }
241
+ }
242
+ exports.RaainDivIcon = RaainDivIcon;
243
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFhaW5EaXZJY29uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xzL1JhYWluRGl2SWNvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxQ0FBeUU7QUFnQ3pFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBQ0gsTUFBYSxZQUFhLFNBQVEsaUJBQU87SUFJckMsWUFBbUIsT0FBNEI7O1FBQzNDLCtCQUErQjtRQUMvQixNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUhULFlBQU8sR0FBUCxPQUFPLENBQXFCO1FBSHZDLFVBQUssR0FBdUIsSUFBSSxDQUFDO1FBQ2pDLFlBQU8sR0FBa0IsSUFBSSxDQUFDO1FBT2xDLElBQUksQ0FBQyxPQUFPLG1DQUNMLGdCQUFnQixLQUNuQixhQUFhLEVBQUUsTUFBQSxPQUFPLENBQUMsYUFBYSxtQ0FBSSxDQUFDLEVBQ3pDLGNBQWMsRUFBRSxNQUFBLE9BQU8sQ0FBQyxjQUFjLG1DQUFJLGVBQWUsRUFDekQsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUN0QixZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVksR0FDckMsQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNLLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUE0Qjs7UUFDM0QsTUFBTSxTQUFTLHFCQUFPLE9BQU8sQ0FBQyxDQUFDO1FBRS9CLCtDQUErQztRQUMvQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQzdELE1BQU0sS0FBSyxHQUNQLE1BQUEsT0FBTyxDQUFDLEtBQUssbUNBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FB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
package/tools/index.d.ts CHANGED
@@ -3,3 +3,4 @@ export * from './CartesianMapValue';
3
3
  export * from './MapTools';
4
4
  export * from './MapLatLng';
5
5
  export * from './IconMapValue';
6
+ export * from './RaainDivIcon';
package/tools/index.js CHANGED
@@ -19,4 +19,5 @@ __exportStar(require("./CartesianMapValue"), exports);
19
19
  __exportStar(require("./MapTools"), exports);
20
20
  __exportStar(require("./MapLatLng"), exports);
21
21
  __exportStar(require("./IconMapValue"), exports);
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9vbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtEQUFnQztBQUNoQyxzREFBb0M7QUFDcEMsNkNBQTJCO0FBQzNCLDhDQUE0QjtBQUM1QixpREFBK0IifQ==
22
+ __exportStar(require("./RaainDivIcon"), exports);
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9vbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtEQUFnQztBQUNoQyxzREFBb0M7QUFDcEMsNkNBQTJCO0FBQzNCLDhDQUE0QjtBQUM1QixpREFBK0I7QUFDL0IsaURBQStCIn0=
@@ -29,7 +29,7 @@ const spinningBallOriginal = __importStar(require("spinning-ball"));
29
29
  // Use the imported module or create a fallback if it fails
30
30
  const spinningBallModule = spinningBallOriginal || {
31
31
  init: (params) => {
32
- console.error('spinning-ball module failed to load properly');
32
+ console.error('raain-ui >> spinning-ball module failed to load properly');
33
33
  // Return a minimal implementation to prevent crashes
34
34
  return {
35
35
  update: () => false,
@@ -42,4 +42,4 @@ const spinningBallModule = spinningBallOriginal || {
42
42
  },
43
43
  };
44
44
  module.exports = spinningBallModule;
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbm5pbmctYmFsbC13cmFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3NwaW5uaW5nLWJhbGwtd3JhcHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsb0ZBQW9GO0FBQ3BGLDJFQUEyRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTNFLG1DQUFtQztBQUNuQyxvRUFBc0Q7QUFjdEQsMkRBQTJEO0FBQzNELE1BQU0sa0JBQWtCLEdBQXVCLG9CQUFvQixJQUFJO0lBQ25FLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQzlELHFEQUFxRDtRQUNyRCxPQUFPO1lBQ0gsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUs7WUFDbkIsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUIsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUk7WUFDckIsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUs7WUFDdEIsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUs7WUFDdEIsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUs7U0FDN0IsQ0FBQztJQUNOLENBQUM7Q0FDSixDQUFDO0FBR0YsaUJBQVMsa0JBQWtCLENBQUMifQ==
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbm5pbmctYmFsbC13cmFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3NwaW5uaW5nLWJhbGwtd3JhcHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsb0ZBQW9GO0FBQ3BGLDJFQUEyRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTNFLG1DQUFtQztBQUNuQyxvRUFBc0Q7QUFjdEQsMkRBQTJEO0FBQzNELE1BQU0sa0JBQWtCLEdBQXVCLG9CQUFvQixJQUFJO0lBQ25FLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1FBQzFFLHFEQUFxRDtRQUNyRCxPQUFPO1lBQ0gsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUs7WUFDbkIsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUIsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUk7WUFDckIsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUs7WUFDdEIsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUs7WUFDdEIsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUs7U0FDN0IsQ0FBQztJQUNOLENBQUM7Q0FDSixDQUFDO0FBR0YsaUJBQVMsa0JBQWtCLENBQUMifQ==
@@ -1,174 +0,0 @@
1
- /* ============================================================================
2
- * Wind Speed/Direction Animation for Leaflet Markers
3
- * ============================================================================
4
- * Usage: Import this CSS file in your app's global styles or index.html
5
- *
6
- * @import "~raain-ui/data/wind-markers.css";
7
- *
8
- * Or in HTML:
9
- * <link rel="stylesheet" href="node_modules/raain-ui/dist/data/wind-markers.css">
10
- *
11
- * Then apply classes to markers via MapElement.changeMarkerStyle():
12
- * mapElement.changeMarkerStyle(marker, 'marker-wind marker-wind-200', {strength: 10});
13
- */
14
-
15
- /* Base wind marker class */
16
- .marker-wind {
17
- /* Calculate animation speed: stronger wind = faster animation */
18
- --duration: calc(5s - (min(var(--strength, 5), 25) * 0.08s));
19
-
20
- /* Calculate displacement: strength in m/s * 2 = pixels */
21
- --displacement: calc(var(--strength, 5) * 2);
22
-
23
- /* Visual glow intensity based on strength */
24
- filter: drop-shadow(0 0 calc(var(--strength, 5) * 0.5px) rgba(100, 150, 255, 0.8));
25
-
26
- position: relative;
27
-
28
- /* Rotation will be set by direction-specific classes */
29
- --rotation: 0deg;
30
- }
31
-
32
- .marker-wind img {
33
- transform: rotate(var(--rotation)) !important;
34
- }
35
-
36
- /* Variant: Travel animation (move from src to target, disappear, reappear at src)
37
- Usage: Add 'marker-wind-travel' class in addition to marker-wind and direction class
38
- Example: 'marker-wind marker-wind-travel marker-wind-200' */
39
- .marker-wind-travel {
40
- /* Override animation to use travel mode */
41
- }
42
-
43
- /* Pulse animation (brightness/opacity) */
44
- @keyframes wind-pulse {
45
- 0%, 100% {
46
- opacity: 1;
47
- filter: brightness(1);
48
- }
49
- 50% {
50
- opacity: 0.85;
51
- filter: brightness(1.15);
52
- }
53
- }
54
-
55
- /* Travel mode pulse - fade out at destination */
56
- @keyframes wind-pulse-travel {
57
- 0% {
58
- filter: brightness(1.2);
59
- }
60
- 70% {
61
- filter: brightness(0.8);
62
- }
63
- 71%, 99% {
64
- filter: brightness(0);
65
- }
66
- 100% {
67
- filter: brightness(1.2);
68
- }
69
- }
70
-
71
- /* Direction arrow indicator */
72
- .marker-wind::after {
73
- content: '→';
74
- position: absolute;
75
- top: -20px;
76
- left: 50%;
77
- font-size: 18px;
78
- font-weight: bold;
79
- color: rgba(100, 150, 255, 0.95);
80
- text-shadow: 0 0 4px rgba(0, 0, 0, 0.7);
81
- pointer-events: none;
82
- transform-origin: center;
83
- }
84
-
85
- /* Wind direction classes for every available degree */
86
- /* Azimuth 0 = North (upward), 90 = East (right), 180 = South (down), 270 = West (left) */
87
- /* SVG arrow points right (East), so 90° = 0° rotation, others adjust from there */
88
-
89
- .marker-wind-0::after, .marker-wind-360::after { transform: translateX(-50%) rotate(180deg); }
90
- .marker-wind-0, .marker-wind-360 { --rotation: -90deg; animation: wind-0 var(--duration) ease-in-out infinite, wind-pulse var(--duration) ease-in-out infinite; }
91
- @keyframes wind-0 { 0%, 100% { translate: 0 0; } 50% { translate: 0 calc(var(--displacement) * -1px); } }
92
- .marker-wind-travel.marker-wind-0, .marker-wind-travel.marker-wind-360 { animation: wind-0-travel var(--duration) linear infinite, wind-pulse-travel var(--duration) linear infinite; }
93
- @keyframes wind-0-travel { 0% { translate: 0 0; opacity: 1; } 70% { translate: 0 calc(var(--displacement) * -1px); opacity: 1; } 71% { opacity: 0; } 99% { translate: 0 0; opacity: 0; } 100% { translate: 0 0; opacity: 1; } }
94
-
95
- .marker-wind-10::after { transform: translateX(-50%) rotate(190deg); }
96
- .marker-wind-10 { --rotation: -80deg; animation: wind-10 var(--duration) ease-in-out infinite, wind-pulse var(--duration) ease-in-out infinite; }
97
- @keyframes wind-10 { 0%, 100% { translate: 0 0; } 50% { translate: calc(var(--displacement) * 0.17px) calc(var(--displacement) * -0.98px); } }
98
-
99
- .marker-wind-20::after { transform: translateX(-50%) rotate(200deg); }
100
- .marker-wind-20 { --rotation: -70deg; animation: wind-20 var(--duration) ease-in-out infinite, wind-pulse var(--duration) ease-in-out infinite; }
101
- @keyframes wind-20 { 0%, 100% { translate: 0 0; } 50% { translate: calc(var(--displacement) * 0.34px) calc(var(--displacement) * -0.94px); } }
102
-
103
- .marker-wind-30::after { transform: translateX(-50%) rotate(210deg); }
104
- .marker-wind-30 { --rotation: -60deg; animation: wind-30 var(--duration) ease-in-out infinite, wind-pulse var(--duration) ease-in-out infinite; }
105
- @keyframes wind-30 { 0%, 100% { translate: 0 0; } 50% { translate: calc(var(--displacement) * 0.5px) calc(var(--displacement) * -0.87px); } }
106
-
107
- .marker-wind-45::after { transform: translateX(-50%) rotate(225deg); }
108
- .marker-wind-45 { --rotation: -45deg; animation: wind-45 var(--duration) ease-in-out infinite, wind-pulse var(--duration) ease-in-out infinite; }
109
- @keyframes wind-45 { 0%, 100% { translate: 0 0; } 50% { translate: calc(var(--displacement) * 0.71px) calc(var(--displacement) * -0.71px); } }
110
-
111
- .marker-wind-90::after { transform: translateX(-50%) rotate(270deg); }
112
- .marker-wind-90 { --rotation: 0deg; animation: wind-90 var(--duration) ease-in-out infinite, wind-pulse var(--duration) ease-in-out infinite; }
113
- @keyframes wind-90 { 0%, 100% { translate: 0 0; } 50% { translate: calc(var(--displacement) * 1px) 0; } }
114
-
115
- .marker-wind-135::after { transform: translateX(-50%) rotate(315deg); }
116
- .marker-wind-135 { --rotation: 45deg; animation: wind-135 var(--duration) ease-in-out infinite, wind-pulse var(--duration) ease-in-out infinite; }
117
- @keyframes wind-135 { 0%, 100% { translate: 0 0; } 50% { translate: calc(var(--displacement) * 0.71px) calc(var(--displacement) * 0.71px); } }
118
-
119
- .marker-wind-180::after { transform: translateX(-50%) rotate(0deg); }
120
- .marker-wind-180 { --rotation: 90deg; animation: wind-180 var(--duration) ease-in-out infinite, wind-pulse var(--duration) ease-in-out infinite; }
121
- @keyframes wind-180 { 0%, 100% { translate: 0 0; } 50% { translate: 0 calc(var(--displacement) * 1px); } }
122
-
123
- .marker-wind-200::after { transform: translateX(-50%) rotate(20deg); }
124
- .marker-wind-200 { --rotation: 110deg; animation: wind-200 var(--duration) ease-in-out infinite, wind-pulse var(--duration) ease-in-out infinite; }
125
- @keyframes wind-200 { 0%, 100% { translate: 0 0; } 50% { translate: calc(var(--displacement) * 0.34px) calc(var(--displacement) * 0.94px); } }
126
-
127
- .marker-wind-225::after { transform: translateX(-50%) rotate(45deg); }
128
- .marker-wind-225 { --rotation: 135deg; animation: wind-225 var(--duration) ease-in-out infinite, wind-pulse var(--duration) ease-in-out infinite; }
129
- @keyframes wind-225 { 0%, 100% { translate: 0 0; } 50% { translate: calc(var(--displacement) * -0.71px) calc(var(--displacement) * 0.71px); } }
130
-
131
- .marker-wind-270::after { transform: translateX(-50%) rotate(90deg); }
132
- .marker-wind-270 { --rotation: 180deg; animation: wind-270 var(--duration) ease-in-out infinite, wind-pulse var(--duration) ease-in-out infinite; }
133
- @keyframes wind-270 { 0%, 100% { translate: 0 0; } 50% { translate: calc(var(--displacement) * -1px) 0; } }
134
-
135
- .marker-wind-315::after { transform: translateX(-50%) rotate(135deg); }
136
- .marker-wind-315 { --rotation: -135deg; animation: wind-315 var(--duration) ease-in-out infinite, wind-pulse var(--duration) ease-in-out infinite; }
137
- @keyframes wind-315 { 0%, 100% { translate: 0 0; } 50% { translate: calc(var(--displacement) * -0.71px) calc(var(--displacement) * -0.71px); } }
138
-
139
- /* ============================================================================
140
- * Travel Mode Animations - Move from source to target, disappear, reappear
141
- * ============================================================================ */
142
-
143
- .marker-wind-travel.marker-wind-10 { animation: wind-10-travel var(--duration) linear infinite, wind-pulse-travel var(--duration) linear infinite; }
144
- @keyframes wind-10-travel { 0% { translate: 0 0; opacity: 1; } 70% { translate: calc(var(--displacement) * 0.17px) calc(var(--displacement) * -0.98px); opacity: 1; } 71% { opacity: 0; } 99% { translate: 0 0; opacity: 0; } 100% { translate: 0 0; opacity: 1; } }
145
-
146
- .marker-wind-travel.marker-wind-20 { animation: wind-20-travel var(--duration) linear infinite, wind-pulse-travel var(--duration) linear infinite; }
147
- @keyframes wind-20-travel { 0% { translate: 0 0; opacity: 1; } 70% { translate: calc(var(--displacement) * 0.34px) calc(var(--displacement) * -0.94px); opacity: 1; } 71% { opacity: 0; } 99% { translate: 0 0; opacity: 0; } 100% { translate: 0 0; opacity: 1; } }
148
-
149
- .marker-wind-travel.marker-wind-30 { animation: wind-30-travel var(--duration) linear infinite, wind-pulse-travel var(--duration) linear infinite; }
150
- @keyframes wind-30-travel { 0% { translate: 0 0; opacity: 1; } 70% { translate: calc(var(--displacement) * 0.5px) calc(var(--displacement) * -0.87px); opacity: 1; } 71% { opacity: 0; } 99% { translate: 0 0; opacity: 0; } 100% { translate: 0 0; opacity: 1; } }
151
-
152
- .marker-wind-travel.marker-wind-45 { animation: wind-45-travel var(--duration) linear infinite, wind-pulse-travel var(--duration) linear infinite; }
153
- @keyframes wind-45-travel { 0% { translate: 0 0; opacity: 1; } 70% { translate: calc(var(--displacement) * 0.71px) calc(var(--displacement) * -0.71px); opacity: 1; } 71% { opacity: 0; } 99% { translate: 0 0; opacity: 0; } 100% { translate: 0 0; opacity: 1; } }
154
-
155
- .marker-wind-travel.marker-wind-90 { animation: wind-90-travel var(--duration) linear infinite, wind-pulse-travel var(--duration) linear infinite; }
156
- @keyframes wind-90-travel { 0% { translate: 0 0; opacity: 1; } 70% { translate: calc(var(--displacement) * 1px) 0; opacity: 1; } 71% { opacity: 0; } 99% { translate: 0 0; opacity: 0; } 100% { translate: 0 0; opacity: 1; } }
157
-
158
- .marker-wind-travel.marker-wind-135 { animation: wind-135-travel var(--duration) linear infinite, wind-pulse-travel var(--duration) linear infinite; }
159
- @keyframes wind-135-travel { 0% { translate: 0 0; opacity: 1; } 70% { translate: calc(var(--displacement) * 0.71px) calc(var(--displacement) * 0.71px); opacity: 1; } 71% { opacity: 0; } 99% { translate: 0 0; opacity: 0; } 100% { translate: 0 0; opacity: 1; } }
160
-
161
- .marker-wind-travel.marker-wind-180 { animation: wind-180-travel var(--duration) linear infinite, wind-pulse-travel var(--duration) linear infinite; }
162
- @keyframes wind-180-travel { 0% { translate: 0 0; opacity: 1; } 70% { translate: 0 calc(var(--displacement) * 1px); opacity: 1; } 71% { opacity: 0; } 99% { translate: 0 0; opacity: 0; } 100% { translate: 0 0; opacity: 1; } }
163
-
164
- .marker-wind-travel.marker-wind-200 { animation: wind-200-travel var(--duration) linear infinite, wind-pulse-travel var(--duration) linear infinite; }
165
- @keyframes wind-200-travel { 0% { translate: 0 0; opacity: 1; } 70% { translate: calc(var(--displacement) * 0.34px) calc(var(--displacement) * 0.94px); opacity: 1; } 71% { opacity: 0; } 99% { translate: 0 0; opacity: 0; } 100% { translate: 0 0; opacity: 1; } }
166
-
167
- .marker-wind-travel.marker-wind-225 { animation: wind-225-travel var(--duration) linear infinite, wind-pulse-travel var(--duration) linear infinite; }
168
- @keyframes wind-225-travel { 0% { translate: 0 0; opacity: 1; } 70% { translate: calc(var(--displacement) * -0.71px) calc(var(--displacement) * 0.71px); opacity: 1; } 71% { opacity: 0; } 99% { translate: 0 0; opacity: 0; } 100% { translate: 0 0; opacity: 1; } }
169
-
170
- .marker-wind-travel.marker-wind-270 { animation: wind-270-travel var(--duration) linear infinite, wind-pulse-travel var(--duration) linear infinite; }
171
- @keyframes wind-270-travel { 0% { translate: 0 0; opacity: 1; } 70% { translate: calc(var(--displacement) * -1px) 0; opacity: 1; } 71% { opacity: 0; } 99% { translate: 0 0; opacity: 0; } 100% { translate: 0 0; opacity: 1; } }
172
-
173
- .marker-wind-travel.marker-wind-315 { animation: wind-315-travel var(--duration) linear infinite, wind-pulse-travel var(--duration) linear infinite; }
174
- @keyframes wind-315-travel { 0% { translate: 0 0; opacity: 1; } 70% { translate: calc(var(--displacement) * -0.71px) calc(var(--displacement) * -0.71px); opacity: 1; } 71% { opacity: 0; } 99% { translate: 0 0; opacity: 0; } 100% { translate: 0 0; opacity: 1; } }