@fmidev/smartmet-alert-client 4.4.19 → 4.7.0-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 (123) hide show
  1. package/.eslintignore +2 -14
  2. package/.github/workflows/test.yaml +26 -0
  3. package/.nvmrc +1 -0
  4. package/AGENTS.md +26 -0
  5. package/index.html +1 -1
  6. package/package.json +80 -22
  7. package/src/AlertClientVue.vue +160 -0
  8. package/src/App.vue +154 -296
  9. package/src/assets/img/ui/arrow-down.svg +4 -11
  10. package/src/assets/img/ui/arrow-up.svg +4 -11
  11. package/src/assets/img/ui/clear.svg +7 -21
  12. package/src/assets/img/ui/close.svg +4 -15
  13. package/src/assets/img/ui/toggle-selected.svg +5 -6
  14. package/src/assets/img/ui/toggle-unselected.svg +5 -6
  15. package/src/assets/img/warning/cold-weather.svg +3 -6
  16. package/src/assets/img/warning/flood-level-3.svg +4 -7
  17. package/src/assets/img/warning/forest-fire-weather.svg +2 -6
  18. package/src/assets/img/warning/grass-fire-weather.svg +2 -6
  19. package/src/assets/img/warning/hot-weather.svg +3 -6
  20. package/src/assets/img/warning/pedestrian-safety.svg +3 -7
  21. package/src/assets/img/warning/rain.svg +2 -7
  22. package/src/assets/img/warning/sea-icing.svg +2 -6
  23. package/src/assets/img/warning/sea-thunder-storm.svg +2 -5
  24. package/src/assets/img/warning/sea-water-height-high-water.svg +3 -8
  25. package/src/assets/img/warning/sea-water-height-shallow-water.svg +3 -7
  26. package/src/assets/img/warning/sea-wave-height.svg +4 -7
  27. package/src/assets/img/warning/sea-wind-legend.svg +2 -5
  28. package/src/assets/img/warning/sea-wind.svg +2 -5
  29. package/src/assets/img/warning/several.svg +2 -5
  30. package/src/assets/img/warning/thunder-storm.svg +2 -5
  31. package/src/assets/img/warning/traffic-weather.svg +2 -6
  32. package/src/assets/img/warning/uv-note.svg +2 -6
  33. package/src/assets/img/warning/wind.svg +2 -5
  34. package/src/components/AlertClient.vue +330 -251
  35. package/src/components/CollapsiblePanel.vue +281 -0
  36. package/src/components/DayLarge.vue +146 -110
  37. package/src/components/DaySmall.vue +97 -81
  38. package/src/components/Days.vue +229 -159
  39. package/src/components/DescriptionWarning.vue +63 -38
  40. package/src/components/GrayScaleToggle.vue +58 -54
  41. package/src/components/Legend.vue +102 -325
  42. package/src/components/MapLarge.vue +574 -351
  43. package/src/components/MapSmall.vue +137 -122
  44. package/src/components/PopupRow.vue +24 -12
  45. package/src/components/Region.vue +168 -118
  46. package/src/components/RegionWarning.vue +40 -33
  47. package/src/components/Regions.vue +189 -105
  48. package/src/components/Warning.vue +70 -45
  49. package/src/components/Warnings.vue +136 -72
  50. package/src/composables/useAlertClient.ts +360 -0
  51. package/src/composables/useConfig.ts +573 -0
  52. package/src/composables/useFields.ts +66 -0
  53. package/src/composables/useI18n.ts +62 -0
  54. package/src/composables/useKeyCodes.ts +16 -0
  55. package/src/composables/useMapPaths.ts +477 -0
  56. package/src/composables/useUtils.ts +683 -0
  57. package/src/composables/useWarningsProcessor.ts +1007 -0
  58. package/src/data/geometries.json +993 -0
  59. package/src/{main.js → main.ts} +1 -0
  60. package/src/mixins/geojsonsvg.d.ts +57 -0
  61. package/src/mixins/geojsonsvg.js +5 -3
  62. package/src/plugins/index.ts +5 -0
  63. package/src/scss/_utilities.scss +193 -0
  64. package/src/scss/constants.scss +2 -1
  65. package/src/scss/warningImages.scss +8 -3
  66. package/src/types/index.ts +509 -0
  67. package/src/vite-env.d.ts +23 -0
  68. package/src/vue.ts +41 -0
  69. package/svgo.config.js +45 -0
  70. package/tests/README.md +430 -0
  71. package/tests/fixtures/mockWarningData.ts +152 -0
  72. package/tests/integration/warning-flow.spec.ts +445 -0
  73. package/tests/setup.ts +41 -0
  74. package/tests/unit/components/AlertClient.spec.ts +701 -0
  75. package/tests/unit/components/DayLarge.spec.ts +348 -0
  76. package/tests/unit/components/DaySmall.spec.ts +352 -0
  77. package/tests/unit/components/Days.spec.ts +548 -0
  78. package/tests/unit/components/DescriptionWarning.spec.ts +385 -0
  79. package/tests/unit/components/GrayScaleToggle.spec.ts +318 -0
  80. package/tests/unit/components/Legend.spec.ts +295 -0
  81. package/tests/unit/components/MapLarge.spec.ts +448 -0
  82. package/tests/unit/components/MapSmall.spec.ts +367 -0
  83. package/tests/unit/components/PopupRow.spec.ts +270 -0
  84. package/tests/unit/components/Region.spec.ts +373 -0
  85. package/tests/unit/components/RegionWarning.snapshot.spec.ts +361 -0
  86. package/tests/unit/components/RegionWarning.spec.ts +381 -0
  87. package/tests/unit/components/Regions.spec.ts +503 -0
  88. package/tests/unit/components/Warning.snapshot.spec.ts +483 -0
  89. package/tests/unit/components/Warning.spec.ts +489 -0
  90. package/tests/unit/components/Warnings.spec.ts +343 -0
  91. package/tests/unit/components/__snapshots__/RegionWarning.snapshot.spec.ts.snap +41 -0
  92. package/tests/unit/components/__snapshots__/Warning.snapshot.spec.ts.snap +433 -0
  93. package/tests/unit/composables/useConfig.spec.ts +279 -0
  94. package/tests/unit/composables/useI18n.spec.ts +116 -0
  95. package/tests/unit/composables/useKeyCodes.spec.ts +27 -0
  96. package/tests/unit/composables/useUtils.spec.ts +213 -0
  97. package/tsconfig.json +43 -0
  98. package/tsconfig.node.json +11 -0
  99. package/vite.config.js +96 -26
  100. package/vitest.config.js +40 -0
  101. package/dist/favicon.ico +0 -0
  102. package/dist/index.dark.html +0 -20
  103. package/dist/index.en.html +0 -15
  104. package/dist/index.fi.html +0 -15
  105. package/dist/index.html +0 -15
  106. package/dist/index.js +0 -281
  107. package/dist/index.mjs +0 -281
  108. package/dist/index.mjs.map +0 -1
  109. package/dist/index.relative.html +0 -19
  110. package/dist/index.start.html +0 -20
  111. package/dist/index.sv.html +0 -15
  112. package/playwright.config.ts +0 -18
  113. package/public/index.relative.html +0 -19
  114. package/public/index.start.html +0 -20
  115. package/src/mixins/config.js +0 -1378
  116. package/src/mixins/fields.js +0 -26
  117. package/src/mixins/i18n.js +0 -25
  118. package/src/mixins/keycodes.js +0 -10
  119. package/src/mixins/panzoom.js +0 -900
  120. package/src/mixins/utils.js +0 -900
  121. package/src/plugins/index.js +0 -3
  122. package/test/snapshot.test.ts +0 -126
  123. package/vitest.config.ts +0 -6
@@ -0,0 +1,343 @@
1
+ import { describe, it, expect, afterEach } from 'vitest'
2
+ import { mount, VueWrapper } from '@vue/test-utils'
3
+ import Warnings from '@/components/Warnings.vue'
4
+ import type { LegendItem, Theme, Language } from '@/types'
5
+
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
+ type ComponentInstance = any
8
+
9
+ const mockWarnings: LegendItem[] = [
10
+ {
11
+ type: 'wind',
12
+ severity: 4,
13
+ visible: true,
14
+ },
15
+ {
16
+ type: 'thunderStorm',
17
+ severity: 3,
18
+ visible: true,
19
+ },
20
+ {
21
+ type: 'rain',
22
+ severity: 2,
23
+ visible: false,
24
+ },
25
+ ]
26
+
27
+ describe('Warnings.vue', () => {
28
+ let wrapper: VueWrapper | null = null
29
+
30
+ afterEach(() => {
31
+ if (wrapper) {
32
+ wrapper.unmount()
33
+ wrapper = null
34
+ }
35
+ })
36
+
37
+ describe('Component mounting', () => {
38
+ it('should mount with required props', () => {
39
+ wrapper = mount(Warnings, {
40
+ props: {
41
+ input: mockWarnings,
42
+ visibleWarnings: ['wind', 'thunderStorm'],
43
+ language: 'fi' as Language,
44
+ theme: 'light-theme' as Theme,
45
+ },
46
+ })
47
+
48
+ expect(wrapper.exists()).toBe(true)
49
+ })
50
+
51
+ it('should mount with empty warnings', () => {
52
+ wrapper = mount(Warnings, {
53
+ props: {
54
+ input: [],
55
+ visibleWarnings: [],
56
+ language: 'fi' as Language,
57
+ theme: 'light-theme' as Theme,
58
+ },
59
+ })
60
+
61
+ expect(wrapper.exists()).toBe(true)
62
+ })
63
+ })
64
+
65
+ describe('Computed properties', () => {
66
+ it('should compute warnings from input', () => {
67
+ wrapper = mount(Warnings, {
68
+ props: {
69
+ input: mockWarnings,
70
+ visibleWarnings: [],
71
+ language: 'fi' as Language,
72
+ theme: 'light-theme' as Theme,
73
+ },
74
+ })
75
+
76
+ expect((wrapper.vm as ComponentInstance).warnings).toEqual(mockWarnings)
77
+ })
78
+
79
+ it('should detect hidden warnings', () => {
80
+ wrapper = mount(Warnings, {
81
+ props: {
82
+ input: mockWarnings,
83
+ visibleWarnings: ['wind'],
84
+ language: 'fi' as Language,
85
+ theme: 'light-theme' as Theme,
86
+ },
87
+ })
88
+
89
+ expect((wrapper.vm as ComponentInstance).hiddenWarnings).toBe(true)
90
+ })
91
+
92
+ it('should detect no hidden warnings when all visible', () => {
93
+ wrapper = mount(Warnings, {
94
+ props: {
95
+ input: mockWarnings,
96
+ visibleWarnings: ['wind', 'thunderStorm', 'rain'],
97
+ language: 'fi' as Language,
98
+ theme: 'light-theme' as Theme,
99
+ },
100
+ })
101
+
102
+ expect((wrapper.vm as ComponentInstance).hiddenWarnings).toBe(false)
103
+ })
104
+
105
+ it('should detect no warnings state', () => {
106
+ wrapper = mount(Warnings, {
107
+ props: {
108
+ input: [],
109
+ visibleWarnings: [],
110
+ language: 'fi' as Language,
111
+ theme: 'light-theme' as Theme,
112
+ },
113
+ })
114
+
115
+ expect((wrapper.vm as ComponentInstance).noWarnings).toBe(true)
116
+ })
117
+
118
+ it('should compute warningSymbolsText for warnings', () => {
119
+ wrapper = mount(Warnings, {
120
+ props: {
121
+ input: mockWarnings,
122
+ visibleWarnings: [],
123
+ language: 'fi' as Language,
124
+ theme: 'light-theme' as Theme,
125
+ },
126
+ })
127
+
128
+ expect(typeof (wrapper.vm as ComponentInstance).warningSymbolsText).toBe(
129
+ 'string'
130
+ )
131
+ })
132
+
133
+ it('should compute noWarnings text when empty', () => {
134
+ wrapper = mount(Warnings, {
135
+ props: {
136
+ input: [],
137
+ visibleWarnings: [],
138
+ language: 'fi' as Language,
139
+ theme: 'light-theme' as Theme,
140
+ },
141
+ })
142
+
143
+ expect(typeof (wrapper.vm as ComponentInstance).warningSymbolsText).toBe(
144
+ 'string'
145
+ )
146
+ })
147
+
148
+ it('should compute showWarningsText', () => {
149
+ wrapper = mount(Warnings, {
150
+ props: {
151
+ input: mockWarnings,
152
+ visibleWarnings: [],
153
+ language: 'fi' as Language,
154
+ theme: 'light-theme' as Theme,
155
+ },
156
+ })
157
+
158
+ expect(typeof (wrapper.vm as ComponentInstance).showWarningsText).toBe(
159
+ 'string'
160
+ )
161
+ })
162
+
163
+ it('should compute severity level texts', () => {
164
+ wrapper = mount(Warnings, {
165
+ props: {
166
+ input: mockWarnings,
167
+ visibleWarnings: [],
168
+ language: 'fi' as Language,
169
+ theme: 'light-theme' as Theme,
170
+ },
171
+ })
172
+
173
+ const vm = wrapper.vm as ComponentInstance
174
+ expect(typeof vm.warningLevel1Text).toBe('string')
175
+ expect(typeof vm.warningLevel2Text).toBe('string')
176
+ expect(typeof vm.warningLevel3Text).toBe('string')
177
+ expect(typeof vm.warningLevel4Text).toBe('string')
178
+ })
179
+ })
180
+
181
+ describe('Event handling', () => {
182
+ it('should emit warningsToggled when warning is toggled on', () => {
183
+ wrapper = mount(Warnings, {
184
+ props: {
185
+ input: mockWarnings,
186
+ visibleWarnings: ['wind'],
187
+ language: 'fi' as Language,
188
+ theme: 'light-theme' as Theme,
189
+ },
190
+ })
191
+ ;(wrapper.vm as ComponentInstance).onWarningToggled({
192
+ warning: 'rain',
193
+ visible: true,
194
+ })
195
+
196
+ expect(wrapper.emitted('warningsToggled')).toBeTruthy()
197
+ const emittedWarnings = wrapper.emitted(
198
+ 'warningsToggled'
199
+ )![0]![0] as string[]
200
+ expect(emittedWarnings).toContain('wind')
201
+ expect(emittedWarnings).toContain('rain')
202
+ })
203
+
204
+ it('should emit warningsToggled when warning is toggled off', () => {
205
+ wrapper = mount(Warnings, {
206
+ props: {
207
+ input: mockWarnings,
208
+ visibleWarnings: ['wind', 'rain'],
209
+ language: 'fi' as Language,
210
+ theme: 'light-theme' as Theme,
211
+ },
212
+ })
213
+ ;(wrapper.vm as ComponentInstance).onWarningToggled({
214
+ warning: 'rain',
215
+ visible: false,
216
+ })
217
+
218
+ expect(wrapper.emitted('warningsToggled')).toBeTruthy()
219
+ const emittedWarnings = wrapper.emitted(
220
+ 'warningsToggled'
221
+ )![0]![0] as string[]
222
+ expect(emittedWarnings).toContain('wind')
223
+ expect(emittedWarnings).not.toContain('rain')
224
+ })
225
+
226
+ it('should not add warning twice when already visible', () => {
227
+ wrapper = mount(Warnings, {
228
+ props: {
229
+ input: mockWarnings,
230
+ visibleWarnings: ['wind'],
231
+ language: 'fi' as Language,
232
+ theme: 'light-theme' as Theme,
233
+ },
234
+ })
235
+ ;(wrapper.vm as ComponentInstance).onWarningToggled({
236
+ warning: 'wind',
237
+ visible: true,
238
+ })
239
+
240
+ const emittedWarnings = wrapper.emitted(
241
+ 'warningsToggled'
242
+ )![0]![0] as string[]
243
+ expect(emittedWarnings.filter((w) => w === 'wind').length).toBe(1)
244
+ })
245
+
246
+ it('should emit showAllWarnings event', () => {
247
+ wrapper = mount(Warnings, {
248
+ props: {
249
+ input: mockWarnings,
250
+ visibleWarnings: [],
251
+ language: 'fi' as Language,
252
+ theme: 'light-theme' as Theme,
253
+ },
254
+ })
255
+ ;(wrapper.vm as ComponentInstance).showAll()
256
+
257
+ expect(wrapper.emitted('showAllWarnings')).toBeTruthy()
258
+ })
259
+ })
260
+
261
+ describe('Theme support', () => {
262
+ it('should apply theme class', () => {
263
+ wrapper = mount(Warnings, {
264
+ props: {
265
+ input: mockWarnings,
266
+ visibleWarnings: [],
267
+ language: 'fi' as Language,
268
+ theme: 'dark-theme' as Theme,
269
+ },
270
+ })
271
+
272
+ expect(wrapper.find('#fmi-warnings-view').classes()).toContain(
273
+ 'dark-theme'
274
+ )
275
+ })
276
+
277
+ it('should support all theme variants', () => {
278
+ const themes: Theme[] = [
279
+ 'light-theme',
280
+ 'dark-theme',
281
+ 'light-gray-theme',
282
+ 'dark-gray-theme',
283
+ ]
284
+
285
+ themes.forEach((theme) => {
286
+ wrapper = mount(Warnings, {
287
+ props: {
288
+ input: mockWarnings,
289
+ visibleWarnings: [],
290
+ language: 'fi' as Language,
291
+ theme,
292
+ },
293
+ })
294
+
295
+ expect(wrapper.find('#fmi-warnings-view').classes()).toContain(theme)
296
+ })
297
+ })
298
+ })
299
+
300
+ describe('Content rendering', () => {
301
+ it('should render Warning components for each warning', () => {
302
+ wrapper = mount(Warnings, {
303
+ props: {
304
+ input: mockWarnings,
305
+ visibleWarnings: [],
306
+ language: 'fi' as Language,
307
+ theme: 'light-theme' as Theme,
308
+ },
309
+ })
310
+
311
+ const warningComponents = wrapper.findAllComponents({ name: 'Warning' })
312
+ expect(warningComponents).toHaveLength(mockWarnings.length)
313
+ })
314
+
315
+ it('should show no-warnings separator when no warnings', () => {
316
+ wrapper = mount(Warnings, {
317
+ props: {
318
+ input: [],
319
+ visibleWarnings: [],
320
+ language: 'fi' as Language,
321
+ theme: 'light-theme' as Theme,
322
+ },
323
+ })
324
+
325
+ const separator = wrapper.find('.legend-separator')
326
+ expect(separator.classes()).toContain('no-warnings')
327
+ })
328
+
329
+ it('should not show no-warnings class when warnings exist', () => {
330
+ wrapper = mount(Warnings, {
331
+ props: {
332
+ input: mockWarnings,
333
+ visibleWarnings: [],
334
+ language: 'fi' as Language,
335
+ theme: 'light-theme' as Theme,
336
+ },
337
+ })
338
+
339
+ const separator = wrapper.find('.legend-separator')
340
+ expect(separator.classes()).not.toContain('no-warnings')
341
+ })
342
+ })
343
+ })
@@ -0,0 +1,41 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`RegionWarning.vue Snapshots > Language snapshots > should render in English correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-270 symbol-rotate-270 level-3 wind" aria-label="Dangerous wind warning for land areas (25 m/s from 450°)"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-90">25</span></div>"`;
4
+
5
+ exports[`RegionWarning.vue Snapshots > Language snapshots > should render in Finnish correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-270 symbol-rotate-270 level-3 wind" aria-label="Vaarallinen tuulivaroitus maa‑alueille (25 m/s suunnasta 450°)"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-90">25</span></div>"`;
6
+
7
+ exports[`RegionWarning.vue Snapshots > Language snapshots > should render in Swedish correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-270 symbol-rotate-270 level-3 wind" aria-label="Farlig vindvarning för landområden (25 m/s från 450°)"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-90">25</span></div>"`;
8
+
9
+ exports[`RegionWarning.vue Snapshots > Rotation snapshots > should render with east direction correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-90 symbol-rotate-90 level-3 wind" aria-label="Vaarallinen tuulivaroitus maa‑alueille (20 m/s suunnasta 270°)"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-270">20</span></div>"`;
10
+
11
+ exports[`RegionWarning.vue Snapshots > Rotation snapshots > should render with north direction correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-0 symbol-rotate-0 level-3 wind" aria-label="Vaarallinen tuulivaroitus maa‑alueille (20 m/s suunnasta 180°)"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-360">20</span></div>"`;
12
+
13
+ exports[`RegionWarning.vue Snapshots > Rotation snapshots > should render with south direction correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-180 symbol-rotate-180 level-3 wind" aria-label="Vaarallinen tuulivaroitus maa‑alueille (20 m/s suunnasta 360°)"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-180">20</span></div>"`;
14
+
15
+ exports[`RegionWarning.vue Snapshots > Rotation snapshots > should render with west direction correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-270 symbol-rotate-270 level-3 wind" aria-label="Vaarallinen tuulivaroitus maa‑alueille (20 m/s suunnasta 450°)"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-90">20</span></div>"`;
16
+
17
+ exports[`RegionWarning.vue Snapshots > Severity level snapshots > should render severity level 2 correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-0 symbol-rotate-0 level-2 wind" aria-label="Mahdollisesti vaarallinen tuulivaroitus maa‑alueille"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-360"></span></div>"`;
18
+
19
+ exports[`RegionWarning.vue Snapshots > Severity level snapshots > should render severity level 3 correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-0 symbol-rotate-0 level-3 wind" aria-label="Vaarallinen tuulivaroitus maa‑alueille"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-360"></span></div>"`;
20
+
21
+ exports[`RegionWarning.vue Snapshots > Severity level snapshots > should render severity level 4 correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-0 symbol-rotate-0 level-4 wind" aria-label="Hyvin vaarallinen tuulivaroitus maa‑alueille"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-360"></span></div>"`;
22
+
23
+ exports[`RegionWarning.vue Snapshots > Warning type snapshots > should render cold weather warning correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-0 symbol-rotate-0 level-3 cold-weather" aria-label="Vaarallinen pakkasvaroitus"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-360"></span></div>"`;
24
+
25
+ exports[`RegionWarning.vue Snapshots > Warning type snapshots > should render flood level warning correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-0 symbol-rotate-0 level-3 flood-level" aria-label="Vaarallinen tulvavaroitus"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-360"></span></div>"`;
26
+
27
+ exports[`RegionWarning.vue Snapshots > Warning type snapshots > should render forest fire weather warning correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-0 symbol-rotate-0 level-3 forest-fire-weather" aria-label="Vaarallinen maastopalo&amp;shy;varoitus"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-360"></span></div>"`;
28
+
29
+ exports[`RegionWarning.vue Snapshots > Warning type snapshots > should render hot weather warning correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-0 symbol-rotate-0 level-2 hot-weather" aria-label="Mahdollisesti vaarallinen hellevaroitus"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-360"></span></div>"`;
30
+
31
+ exports[`RegionWarning.vue Snapshots > Warning type snapshots > should render pedestrian safety warning correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-0 symbol-rotate-0 level-2 pedestrian-safety" aria-label="Mahdollisesti vaarallinen jalankulkusää"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-360"></span></div>"`;
32
+
33
+ exports[`RegionWarning.vue Snapshots > Warning type snapshots > should render rain warning correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-0 symbol-rotate-0 level-2 rain" aria-label="Mahdollisesti vaarallinen sadevaroitus"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-360"></span></div>"`;
34
+
35
+ exports[`RegionWarning.vue Snapshots > Warning type snapshots > should render sea wind warning correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-180 symbol-rotate-180 level-3 sea-wind" aria-label="Vaarallinen tuulivaroitus merelle (15 m/s suunnasta 360°)"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-180">15</span></div>"`;
36
+
37
+ exports[`RegionWarning.vue Snapshots > Warning type snapshots > should render thunderstorm warning correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-0 symbol-rotate-0 level-4 thunder-storm" aria-label="Hyvin vaarallinen raju ukonilma"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-360"></span></div>"`;
38
+
39
+ exports[`RegionWarning.vue Snapshots > Warning type snapshots > should render traffic weather warning correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-0 symbol-rotate-0 level-2 traffic-weather" aria-label="Mahdollisesti vaarallinen liikennesää"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-360"></span></div>"`;
40
+
41
+ exports[`RegionWarning.vue Snapshots > Warning type snapshots > should render wind warning correctly 1`] = `"<div data-v-77d0cfc0="" class="symbol-image warning-image current-warning-image transform-rotate-270 symbol-rotate-270 level-3 wind" aria-label="Vaarallinen tuulivaroitus maa‑alueille (25 m/s suunnasta 450°)"><span data-v-77d0cfc0="" aria-hidden="true" class="warning-symbol-text symbol-text transform-rotate-90">25</span></div>"`;