@fmidev/smartmet-alert-client 4.4.19 → 4.7.0-alpha.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 (105) hide show
  1. package/.eslintignore +2 -14
  2. package/.github/workflows/test.yaml +26 -0
  3. package/.nvmrc +1 -0
  4. package/dist/index.html +5 -0
  5. package/dist/index.js +105 -135
  6. package/dist/index.mjs +112 -135
  7. package/dist/locale-en-DCEKDw5G.js +8 -0
  8. package/dist/locale-fi-DPiOM1rB.js +8 -0
  9. package/dist/locale-sv-B0FlbgEF.js +8 -0
  10. package/dist/vendor-Cfkkvdz7.js +21 -0
  11. package/dist/vue/index.mjs +15245 -0
  12. package/dist/vue/style.css +1 -0
  13. package/dist/xml-parser-BiNO9kc-.js +13 -0
  14. package/package.json +60 -24
  15. package/src/AlertClientVue.vue +170 -0
  16. package/src/App.vue +55 -205
  17. package/src/assets/img/ui/arrow-down.svg +4 -11
  18. package/src/assets/img/ui/arrow-up.svg +4 -11
  19. package/src/assets/img/ui/clear.svg +7 -21
  20. package/src/assets/img/ui/close.svg +4 -15
  21. package/src/assets/img/ui/toggle-selected.svg +5 -6
  22. package/src/assets/img/ui/toggle-unselected.svg +5 -6
  23. package/src/assets/img/warning/cold-weather.svg +3 -6
  24. package/src/assets/img/warning/flood-level-3.svg +4 -7
  25. package/src/assets/img/warning/forest-fire-weather.svg +2 -6
  26. package/src/assets/img/warning/grass-fire-weather.svg +2 -6
  27. package/src/assets/img/warning/hot-weather.svg +3 -6
  28. package/src/assets/img/warning/pedestrian-safety.svg +3 -7
  29. package/src/assets/img/warning/rain.svg +2 -7
  30. package/src/assets/img/warning/sea-icing.svg +2 -6
  31. package/src/assets/img/warning/sea-thunder-storm.svg +2 -5
  32. package/src/assets/img/warning/sea-water-height-high-water.svg +3 -8
  33. package/src/assets/img/warning/sea-water-height-shallow-water.svg +3 -7
  34. package/src/assets/img/warning/sea-wave-height.svg +4 -7
  35. package/src/assets/img/warning/sea-wind-legend.svg +2 -5
  36. package/src/assets/img/warning/sea-wind.svg +2 -5
  37. package/src/assets/img/warning/several.svg +2 -5
  38. package/src/assets/img/warning/thunder-storm.svg +2 -5
  39. package/src/assets/img/warning/traffic-weather.svg +2 -6
  40. package/src/assets/img/warning/uv-note.svg +2 -6
  41. package/src/assets/img/warning/wind.svg +2 -5
  42. package/src/components/AlertClient.vue +41 -19
  43. package/src/components/CollapsiblePanel.vue +284 -0
  44. package/src/components/DayLarge.vue +12 -7
  45. package/src/components/DaySmall.vue +16 -6
  46. package/src/components/Days.vue +76 -51
  47. package/src/components/DescriptionWarning.vue +15 -8
  48. package/src/components/GrayScaleToggle.vue +11 -6
  49. package/src/components/Legend.vue +36 -248
  50. package/src/components/MapLarge.vue +41 -42
  51. package/src/components/MapSmall.vue +44 -28
  52. package/src/components/PopupRow.vue +6 -3
  53. package/src/components/Region.vue +30 -15
  54. package/src/components/RegionWarning.vue +6 -5
  55. package/src/components/Regions.vue +50 -19
  56. package/src/components/Warning.vue +18 -10
  57. package/src/components/Warnings.vue +36 -21
  58. package/src/main.js +1 -0
  59. package/src/mixins/alertClientCore.js +210 -0
  60. package/src/mixins/config.js +262 -256
  61. package/src/mixins/utils.js +40 -26
  62. package/src/plugins/index.js +1 -1
  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/vue.js +41 -0
  67. package/svgo.config.js +45 -0
  68. package/tests/README.md +430 -0
  69. package/tests/fixtures/mockWarningData.js +135 -0
  70. package/tests/integration/warning-flow.spec.js +452 -0
  71. package/tests/setup.js +41 -0
  72. package/tests/unit/components/AlertClient.spec.js +734 -0
  73. package/tests/unit/components/DayLarge.spec.js +281 -0
  74. package/tests/unit/components/DaySmall.spec.js +278 -0
  75. package/tests/unit/components/Days.spec.js +565 -0
  76. package/tests/unit/components/DescriptionWarning.spec.js +432 -0
  77. package/tests/unit/components/GrayScaleToggle.spec.js +311 -0
  78. package/tests/unit/components/Legend.spec.js +223 -0
  79. package/tests/unit/components/MapLarge.spec.js +276 -0
  80. package/tests/unit/components/MapSmall.spec.js +226 -0
  81. package/tests/unit/components/PopupRow.spec.js +261 -0
  82. package/tests/unit/components/Region.spec.js +430 -0
  83. package/tests/unit/components/RegionWarning.snapshot.spec.js +73 -0
  84. package/tests/unit/components/RegionWarning.spec.js +408 -0
  85. package/tests/unit/components/Regions.spec.js +335 -0
  86. package/tests/unit/components/Warning.snapshot.spec.js +107 -0
  87. package/tests/unit/components/Warning.spec.js +472 -0
  88. package/tests/unit/components/Warnings.spec.js +329 -0
  89. package/tests/unit/components/__snapshots__/RegionWarning.snapshot.spec.js.snap +21 -0
  90. package/tests/unit/components/__snapshots__/Warning.snapshot.spec.js.snap +199 -0
  91. package/tests/unit/mixins/config.spec.js +269 -0
  92. package/tests/unit/mixins/i18n.spec.js +115 -0
  93. package/tests/unit/mixins/keycodes.spec.js +37 -0
  94. package/tests/unit/mixins/utils.spec.js +624 -0
  95. package/vite.config.js +96 -26
  96. package/vitest.config.js +40 -0
  97. package/dist/index.mjs.map +0 -1
  98. package/dist/index.relative.html +0 -19
  99. package/dist/index.start.html +0 -20
  100. package/playwright.config.ts +0 -18
  101. package/public/index.relative.html +0 -19
  102. package/public/index.start.html +0 -20
  103. package/src/mixins/panzoom.js +0 -900
  104. package/test/snapshot.test.ts +0 -126
  105. package/vitest.config.ts +0 -6
@@ -0,0 +1,170 @@
1
+ <template>
2
+ <AlertClient
3
+ v-if="visible"
4
+ :refresh-interval="refreshIntervalNormalized"
5
+ :default-day="selectedDayNormalized"
6
+ :static-days="staticDaysNormalized"
7
+ :start-from="startFrom"
8
+ :region-list-enabled="regionListEnabledNormalized"
9
+ :gray-scale-selector="grayScaleSelectorNormalized"
10
+ :current-time="currentTime"
11
+ :warnings-data="warningsData"
12
+ :daily-warning-types="dailyWarningTypesNormalized"
13
+ :geometry-id="geometryIdNormalized"
14
+ :language="language"
15
+ :theme="themeClass"
16
+ :sleep="sleepNormalized"
17
+ :loading="loading"
18
+ :spinner-enabled="spinnerEnabledNormalized"
19
+ @loaded="onLoaded"
20
+ @theme-changed="onThemeChanged"
21
+ @update-warnings="fetchWarnings" />
22
+ </template>
23
+ <script>
24
+ /**
25
+ * Vue wrapper component for AlertClient.
26
+ * Accepts native JavaScript types (Number, Boolean) unlike the web component
27
+ * version which only accepts strings.
28
+ */
29
+ import AlertClient from './components/AlertClient.vue'
30
+ import alertClientCore, { toBool, toNum } from './mixins/alertClientCore'
31
+ import config from './mixins/config'
32
+ import utils from './mixins/utils'
33
+
34
+ export default {
35
+ name: 'AlertClientVue',
36
+ components: {
37
+ AlertClient,
38
+ },
39
+ mixins: [config, utils, alertClientCore],
40
+ props: {
41
+ currentDate: {
42
+ type: [String, Date],
43
+ default: null,
44
+ },
45
+ baseUrl: {
46
+ type: String,
47
+ default: 'https://www.ilmatieteenlaitos.fi/geoserver/alert/ows',
48
+ },
49
+ selectedDay: {
50
+ type: [String, Number],
51
+ default: 0,
52
+ },
53
+ regionListEnabled: {
54
+ type: [String, Boolean],
55
+ default: true,
56
+ },
57
+ spinnerEnabled: {
58
+ type: [String, Boolean],
59
+ default: true,
60
+ },
61
+ grayScaleSelector: {
62
+ type: [String, Boolean],
63
+ default: true,
64
+ },
65
+ staticDays: {
66
+ type: [String, Boolean],
67
+ default: true,
68
+ },
69
+ startFrom: {
70
+ type: String,
71
+ default: '',
72
+ },
73
+ weatherUpdated: {
74
+ type: String,
75
+ default: '',
76
+ },
77
+ floodUpdated: {
78
+ type: String,
79
+ default: '',
80
+ },
81
+ weatherWarnings: {
82
+ type: String,
83
+ default: '',
84
+ },
85
+ floodWarnings: {
86
+ type: String,
87
+ default: '',
88
+ },
89
+ warnings: {
90
+ type: [String, Object],
91
+ default: null,
92
+ },
93
+ dailyWarningTypes: {
94
+ type: [String, Array],
95
+ default: () => [],
96
+ },
97
+ refreshInterval: {
98
+ type: [String, Number],
99
+ default: 900000, // 1000 * 60 * 15
100
+ },
101
+ geometryId: {
102
+ type: [String, Number],
103
+ default: () => Number(config.props.defaultGeometryId) || 2021,
104
+ },
105
+ language: {
106
+ type: String,
107
+ default: import.meta.env.VITE_LANGUAGE || 'fi',
108
+ },
109
+ theme: {
110
+ type: String,
111
+ default: 'light',
112
+ },
113
+ fontScale: {
114
+ type: [String, Number],
115
+ default: 1,
116
+ },
117
+ sleep: {
118
+ type: [String, Boolean],
119
+ default: true,
120
+ },
121
+ debugMode: {
122
+ type: [String, Boolean],
123
+ default: false,
124
+ },
125
+ },
126
+ computed: {
127
+ // Type normalizers for mixed-type props
128
+ selectedDayNormalized() {
129
+ return toNum(this.selectedDay, 0)
130
+ },
131
+ regionListEnabledNormalized() {
132
+ return toBool(this.regionListEnabled, true)
133
+ },
134
+ grayScaleSelectorNormalized() {
135
+ return toBool(this.grayScaleSelector, true)
136
+ },
137
+ staticDaysNormalized() {
138
+ return toBool(this.staticDays, true)
139
+ },
140
+ dailyWarningTypesNormalized() {
141
+ if (Array.isArray(this.dailyWarningTypes)) return this.dailyWarningTypes
142
+ if (
143
+ typeof this.dailyWarningTypes === 'string' &&
144
+ this.dailyWarningTypes
145
+ ) {
146
+ return this.dailyWarningTypes.split(',').map((item) => item.trim())
147
+ }
148
+ return []
149
+ },
150
+ refreshIntervalNormalized() {
151
+ return toNum(this.refreshInterval, 900000)
152
+ },
153
+ geometryIdNormalized() {
154
+ return toNum(this.geometryId, 2021)
155
+ },
156
+ sleepNormalized() {
157
+ return toBool(this.sleep, true)
158
+ },
159
+ spinnerEnabledNormalized() {
160
+ return toBool(this.spinnerEnabled, true)
161
+ },
162
+ debugModeNormalized() {
163
+ return toBool(this.debugMode, false)
164
+ },
165
+ },
166
+ }
167
+ </script>
168
+ <style lang="scss">
169
+ @import './scss/utilities.scss';
170
+ </style>
package/src/App.vue CHANGED
@@ -1,29 +1,33 @@
1
1
  <template>
2
2
  <AlertClient
3
3
  v-if="visible"
4
- :refresh-interval="refreshIntervalParsed"
5
- :default-day="selectedDayParsed"
6
- :static-days="staticDaysParsed"
4
+ :refresh-interval="refreshIntervalNormalized"
5
+ :default-day="selectedDayNormalized"
6
+ :static-days="staticDaysNormalized"
7
7
  :start-from="startFrom"
8
- :region-list-enabled="regionListEnabledParsed"
9
- :gray-scale-selector="grayScaleSelectorParsed"
8
+ :region-list-enabled="regionListEnabledNormalized"
9
+ :gray-scale-selector="grayScaleSelectorNormalized"
10
10
  :current-time="currentTime"
11
11
  :warnings-data="warningsData"
12
- :daily-warning-types="dailyWarningTypesParsed"
13
- :geometry-id="geometryIdParsed"
12
+ :daily-warning-types="dailyWarningTypesNormalized"
13
+ :geometry-id="geometryIdNormalized"
14
14
  :language="language"
15
15
  :theme="themeClass"
16
- :sleep="sleepParsed"
16
+ :sleep="sleepNormalized"
17
17
  :loading="loading"
18
- :spinner-enabled="spinnerEnabledParsed"
18
+ :spinner-enabled="spinnerEnabledNormalized"
19
19
  @loaded="onLoaded"
20
- @themeChanged="onThemeChanged"
20
+ @theme-changed="onThemeChanged"
21
21
  @update-warnings="fetchWarnings" />
22
22
  </template>
23
23
  <script>
24
- import fetch from 'cross-fetch'
25
-
24
+ /**
25
+ * Web component wrapper for AlertClient.
26
+ * All props are strings (HTML attribute limitation).
27
+ * Use AlertClientVue.vue for native Vue usage with proper types.
28
+ */
26
29
  import AlertClient from './components/AlertClient.vue'
30
+ import alertClientCore, { toBool, toNum } from './mixins/alertClientCore'
27
31
  import config from './mixins/config'
28
32
  import utils from './mixins/utils'
29
33
 
@@ -32,7 +36,7 @@ export default {
32
36
  components: {
33
37
  AlertClient,
34
38
  },
35
- mixins: [config, utils],
39
+ mixins: [config, utils, alertClientCore],
36
40
  props: {
37
41
  currentDate: {
38
42
  type: String,
@@ -66,10 +70,22 @@ export default {
66
70
  type: String,
67
71
  default: '',
68
72
  },
69
- weatherUpdated: String,
70
- floodUpdated: String,
71
- weatherWarnings: String,
72
- floodWarnings: String,
73
+ weatherUpdated: {
74
+ type: String,
75
+ default: '',
76
+ },
77
+ floodUpdated: {
78
+ type: String,
79
+ default: '',
80
+ },
81
+ weatherWarnings: {
82
+ type: String,
83
+ default: '',
84
+ },
85
+ floodWarnings: {
86
+ type: String,
87
+ default: '',
88
+ },
73
89
  warnings: {
74
90
  type: String,
75
91
  default: '',
@@ -102,214 +118,48 @@ export default {
102
118
  type: String,
103
119
  default: 'true',
104
120
  },
105
- spinnerEnabled: {
106
- type: String,
107
- default: 'true',
108
- },
109
121
  debugMode: {
110
122
  type: String,
111
123
  default: 'false',
112
124
  },
113
125
  },
114
- data() {
115
- return {
116
- loading: 1,
117
- updatedAt: null,
118
- refreshedAt: null,
119
- themeClass: `${this.theme}-theme`,
120
- warningsData: null,
121
- visible: true,
122
- }
123
- },
124
126
  computed: {
125
- selectedDayParsed() {
126
- return Number(this.selectedDay)
127
+ // String-to-type normalizers for web component props
128
+ selectedDayNormalized() {
129
+ return toNum(this.selectedDay, 0)
127
130
  },
128
- regionListEnabledParsed() {
129
- return this.regionListEnabled.toLowerCase() !== 'false'
131
+ regionListEnabledNormalized() {
132
+ return toBool(this.regionListEnabled, true)
130
133
  },
131
- grayScaleSelectorParsed() {
132
- return this.grayScaleSelector.toLowerCase() !== 'false'
134
+ grayScaleSelectorNormalized() {
135
+ return toBool(this.grayScaleSelector, true)
133
136
  },
134
- staticDaysParsed() {
135
- return this.staticDays.toLowerCase() !== 'false'
137
+ staticDaysNormalized() {
138
+ return toBool(this.staticDays, true)
136
139
  },
137
- dailyWarningTypesParsed() {
140
+ dailyWarningTypesNormalized() {
138
141
  return this.dailyWarningTypes
139
142
  ? this.dailyWarningTypes.split(',').map((item) => item.trim())
140
143
  : []
141
144
  },
142
- refreshIntervalParsed() {
143
- return Number(this.refreshInterval)
144
- },
145
- geometryIdParsed() {
146
- return Number(this.geometryId)
147
- },
148
- sleepParsed() {
149
- return this.sleep.toLowerCase() !== 'false'
150
- },
151
- spinnerEnabledParsed() {
152
- return this.spinnerEnabled.toLowerCase() !== 'false'
153
- },
154
- weatherUpdatedType() {
155
- return 'weather_update_time'
156
- },
157
- floodUpdatedType() {
158
- return 'flood_update_time'
159
- },
160
- weatherWarningsType() {
161
- return 'weather_finland_active_all'
162
- },
163
- floodWarningsType() {
164
- return 'flood_finland_active_all'
165
- },
166
- weatherUpdatedQuery() {
167
- return this.weatherUpdated || `${this.query}${this.weatherUpdatedType}`
168
- },
169
- floodUpdatedQuery() {
170
- return this.floodUpdated || `${this.query}${this.floodUpdatedType}`
171
- },
172
- weatherWarningsQuery() {
173
- return this.weatherWarnings || `${this.query}${this.weatherWarningsType}`
174
- },
175
- floodWarningsQuery() {
176
- return (
177
- this.floodWarnings ||
178
- `${this.query}${this.floodWarningsType}${this.floodFilter}`
179
- )
180
- },
181
- query() {
182
- return '?service=WFS&version=1.0.0&request=GetFeature&maxFeatures=1000&outputFormat=application%2Fjson&typeName='
183
- },
184
- floodSupportedSeverities() {
185
- return ['moderate', 'severe', 'extreme']
186
- },
187
- floodFilter() {
188
- return `${this.floodSupportedSeverities.reduce(
189
- (filter, severity, index) =>
190
- `${filter + (index === 0 ? '' : ',')}%27${severity.toUpperCase()}%27`,
191
- '&cql_filter=severity%20IN%20('
192
- )})%20AND%20language=%27${this.capLanguage()}%27`
193
- },
194
- capLanguage() {
195
- return () =>
196
- ({
197
- fi: 'fi-FI',
198
- sv: 'sv-SV',
199
- en: 'en-US',
200
- })[this.language]
201
- },
202
- currentTime() {
203
- if (this.refreshedAt) {
204
- return this.refreshedAt
205
- }
206
- if (this.currentDate) {
207
- return new Date(this.currentDate).getTime()
208
- }
209
- return Date.now()
210
- },
211
- },
212
- created() {
213
- if (this.warnings) {
214
- this.warningsData = JSON.parse(this.warnings)
215
- }
216
- },
217
- mounted() {
218
- if (this.fontScale != null && this.fontScale.trim() !== ''
219
- && Number(this.fontScale) !== 1) {
220
- const newFontScale = Number(this.fontScale)
221
- if (!Number.isNaN(newFontScale)) {
222
- let originalFontSize
223
- if (
224
- typeof window !== 'undefined' &&
225
- typeof document !== 'undefined' &&
226
- document.documentElement &&
227
- window.getComputedStyle
228
- ) {
229
- const htmlElement = document.documentElement
230
- const computedStyle = window.getComputedStyle(htmlElement)
231
- originalFontSize = parseFloat(computedStyle.fontSize)
232
- }
233
- if (originalFontSize == null || Number.isNaN(originalFontSize)) {
234
- originalFontSize = 16 // Fallback
235
- }
236
- const scaledFontSize = newFontScale * originalFontSize
237
- const newFontSize = Math.round(scaledFontSize * 100) / 100
238
- document.documentElement.style.fontSize = `${newFontSize}px`
239
- }
240
- }
241
- },
242
- serverPrefetch() {
243
- if (!this.warnings) {
244
- return this.fetchWarnings()
245
- }
246
- },
247
- methods: {
248
- onLoaded(loaded) {
249
- if (loaded !== 0) {
250
- this.loading = loaded === -1 ? -1 : 0
251
- }
145
+ refreshIntervalNormalized() {
146
+ return toNum(this.refreshInterval, 900000)
252
147
  },
253
- onThemeChanged(newTheme) {
254
- this.themeClass = `${
255
- newTheme != null && newTheme.length > 0 ? newTheme : this.theme
256
- }-theme`
148
+ geometryIdNormalized() {
149
+ return toNum(this.geometryId, 2021)
257
150
  },
258
- fetchWarnings() {
259
- if (this.warnings) {
260
- return
261
- }
262
- this.loading = 1
263
- if (this.debugMode.toLowerCase() !== 'false') {
264
- console.log(`Updating warnings at ${new Date()}`)
265
- }
266
- const queries = new Map()
267
- .set(
268
- `${this.baseUrl}${this.weatherUpdatedQuery}`,
269
- this.weatherUpdatedType
270
- )
271
- .set(`${this.baseUrl}${this.floodUpdatedQuery}`, this.floodUpdatedType)
272
- .set(
273
- `${this.baseUrl}${this.weatherWarningsQuery}`,
274
- this.weatherWarningsType
275
- )
276
- .set(
277
- `${this.baseUrl}${this.floodWarningsQuery}`,
278
- this.floodWarningsType
279
- )
280
- const responseData = {}
281
- return Promise.allSettled(
282
- [...queries.keys()].map(async (query) =>
283
- fetch(query).then((response) =>
284
- response
285
- .json()
286
- .then((json) => {
287
- const currentTime = Date.now()
288
- if (this.updatedAt != null) {
289
- this.refreshedAt = currentTime
290
- }
291
- this.updatedAt = currentTime
292
- responseData[queries.get(query)] = json
293
- })
294
- .catch((error) => {
295
- this.loading = -1
296
- console.log(error)
297
- })
298
- )
299
- )
300
- ).then(() => {
301
- this.warningsData = responseData
302
- })
151
+ sleepNormalized() {
152
+ return toBool(this.sleep, true)
303
153
  },
304
- show() {
305
- this.visible = true
154
+ spinnerEnabledNormalized() {
155
+ return toBool(this.spinnerEnabled, true)
306
156
  },
307
- hide() {
308
- this.visible = false
157
+ debugModeNormalized() {
158
+ return toBool(this.debugMode, false)
309
159
  },
310
160
  },
311
161
  }
312
162
  </script>
313
- <style>
314
- @import 'bootstrap/dist/css/bootstrap.min.css';
163
+ <style lang="scss">
164
+ @import './scss/utilities.scss';
315
165
  </style>
@@ -1,11 +1,4 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <svg width="15px" height="8px" viewBox="0 0 15 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
- <title>arrow-down-symbol</title>
4
- <g id="icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
5
- <g id="Symbols" transform="translate(-732.000000, -738.000000)" stroke="#ffffff" stroke-width="1.5">
6
- <g id="arrow-down-symbol" transform="translate(733.000000, 739.000000)">
7
- <polyline id="fill-1" transform="translate(6.500000, 3.000000) rotate(-270.000000) translate(-6.500000, -3.000000) " points="3.5 -3.5 9.5 3 3.5 9.5"></polyline>
8
- </g>
9
- </g>
10
- </g>
11
- </svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="15" height="8">
2
+ <title>arrow-down-symbol</title>
3
+ <path fill="none" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M14 1 7.5 7 1 1"/>
4
+ </svg>
@@ -1,11 +1,4 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <svg width="15px" height="8px" viewBox="0 0 15 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
- <title>arrow-up-symbol</title>
4
- <g id="icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
5
- <g id="Symbols" transform="translate(-670.000000, -738.000000)" stroke="#ffffff" stroke-width="1.5">
6
- <g id="arrow-up-symbol" transform="translate(671.000000, 739.000000)">
7
- <polyline id="fill-1" transform="translate(6.500000, 3.000000) scale(1, -1) rotate(-270.000000) translate(-6.500000, -3.000000) " points="3.5 -3.5 9.5 3 3.5 9.5"></polyline>
8
- </g>
9
- </g>
10
- </g>
11
- </svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="15" height="8">
2
+ <title>arrow-up-symbol</title>
3
+ <path fill="none" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M14 7 7.5 1 1 7"/>
4
+ </svg>
@@ -1,21 +1,7 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
- <!-- Generator: Sketch 3.8.2 (29753) - http://www.bohemiancoding.com/sketch -->
4
- <title>close icon</title>
5
- <desc>Created with Sketch.</desc>
6
- <defs></defs>
7
- <g id="Layouts" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
8
- <g id="varoitukset-tablet-aktiivinen-varoitussymboli-v1" transform="translate(-710.000000, -241.000000)">
9
- <g id="legenda" transform="translate(514.000000, 240.000000)">
10
- <g id="poista-valinnat-linkki" transform="translate(106.000000, 1.000000)">
11
- <g id="close-icon" transform="translate(90.000000, 0.000000)">
12
- <circle id="oval" fill="#56B8E5" cx="7" cy="7" r="7"></circle>
13
- <g id="Group" transform="translate(7.156854, 7.156854) rotate(-315.000000) translate(-7.156854, -7.156854) translate(3.156854, 3.156854)" fill="#FFFFFF">
14
- <path d="M4.5,4.5 L4.5,7 C4.5,7.27614237 4.27614237,7.5 4,7.5 C3.72385763,7.5 3.5,7.27614237 3.5,7 L3.5,4.5 L1,4.5 C0.723857625,4.5 0.5,4.27614237 0.5,4 C0.5,3.72385763 0.723857625,3.5 1,3.5 L3.5,3.5 L3.5,1 C3.5,0.723857625 3.72385763,0.5 4,0.5 C4.27614237,0.5 4.5,0.723857625 4.5,1 L4.5,3.5 L7,3.5 C7.27614237,3.5 7.5,3.72385763 7.5,4 C7.5,4.27614237 7.27614237,4.5 7,4.5 L4.5,4.5 L4.5,4.5 Z" id="x"></path>
15
- </g>
16
- </g>
17
- </g>
18
- </g>
19
- </g>
20
- </g>
21
- </svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14">
2
+ <title>close icon</title>
3
+ <g fill="none" fill-rule="evenodd">
4
+ <circle cx="7" cy="7" r="7" fill="#56b8e5"/>
5
+ <path fill="#fff" d="M7.157 7.864 5.389 9.632a.5.5 0 0 1-.707-.707L6.45 7.157 4.682 5.389a.5.5 0 0 1 .707-.707L7.157 6.45l1.768-1.768a.5.5 0 0 1 .707.707L7.864 7.157l1.768 1.768a.5.5 0 0 1-.707.707z"/>
6
+ </g>
7
+ </svg>
@@ -1,15 +1,4 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <svg width="11px" height="11px" viewBox="0 0 11 11" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
- <!-- Generator: Sketch 3.7.1 (28215) - http://www.bohemiancoding.com/sketch -->
4
- <title>close-symbol</title>
5
- <desc>Created with Sketch.</desc>
6
- <defs></defs>
7
- <g id="icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
8
- <g id="Symbols" transform="translate(-793.000000, -735.000000)" stroke="#000000" stroke-width="1.5">
9
- <g id="close-symbol" transform="translate(794.000000, 736.000000)">
10
- <path d="M0,9.19238816 L9.19238816,0" id="fill-2"></path>
11
- <path d="M0,0 L9.19238816,9.19238816" id="fill-1"></path>
12
- </g>
13
- </g>
14
- </g>
15
- </svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="11" height="11">
2
+ <title>close-symbol</title>
3
+ <path fill="none" stroke="#000" stroke-linecap="round" stroke-width="1.5" d="M1 10.192 10.192 1M1 1l9.192 9.192"/>
4
+ </svg>
@@ -1,13 +1,12 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <svg width="55" height="30" viewBox="0 0 55 30" xmlns="http://www.w3.org/2000/svg">
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="55" height="30">
3
2
  <defs>
4
3
  <clipPath id="outer-clip">
5
- <rect x="0" y="5" width="55" height="20" rx="4" ry="4"/>
4
+ <rect width="55" height="20" y="5" rx="4" ry="4"/>
6
5
  </clipPath>
7
6
  <clipPath id="inner-clip">
8
- <path d="M 35 5 L 51 5 A 4 4 0 0 1 55 9 L 55 21 A 4 4 0 0 1 51 25 L 35 25 Z"/>
7
+ <path d="M35 5h16a4 4 0 0 1 4 4v12a4 4 0 0 1-4 4H35Z"/>
9
8
  </clipPath>
10
9
  </defs>
11
- <rect x="0" y="5" width="55" height="20" rx="4" ry="4" fill="#767676" stroke="#767676" stroke-width="1" clip-path="url(#outer-clip)"/>
12
- <path d="M 35 5 L 51 5 A 4 4 0 0 1 55 9 L 55 21 A 4 4 0 0 1 51 25 L 35 25 Z" fill="#ffffff" stroke="#767676" stroke-width="1" clip-path="url(#inner-clip)"/>
10
+ <rect width="55" height="20" y="5" fill="#767676" stroke="#767676" clip-path="url(#outer-clip)" rx="4" ry="4"/>
11
+ <path fill="#fff" stroke="#767676" d="M35 5h16a4 4 0 0 1 4 4v12a4 4 0 0 1-4 4H35Z" clip-path="url(#inner-clip)"/>
13
12
  </svg>
@@ -1,13 +1,12 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <svg width="55" height="30" viewBox="0 0 55 30" xmlns="http://www.w3.org/2000/svg">
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="55" height="30">
3
2
  <defs>
4
3
  <clipPath id="outer-clip">
5
- <rect x="0" y="5" width="55" height="20" rx="4" ry="4"/>
4
+ <rect width="55" height="20" y="5" rx="4" ry="4"/>
6
5
  </clipPath>
7
6
  <clipPath id="inner-clip">
8
- <path d="M 4 5 L 20 5 L 20 25 L 4 25 A 4 4 0 0 1 0 21 L 0 9 A 4 4 0 0 1 4 5 Z"/>
7
+ <path d="M4 5h16v20H4a4 4 0 0 1-4-4V9a4 4 0 0 1 4-4"/>
9
8
  </clipPath>
10
9
  </defs>
11
- <rect x="0" y="5" width="55" height="20" rx="4" ry="4" fill="#ebebeb" stroke="#767676" stroke-width="1" clip-path="url(#outer-clip)"/>
12
- <path d="M 4 5 L 20 5 L 20 25 L 4 25 A 4 4 0 0 1 0 21 L 0 9 A 4 4 0 0 1 4 5 Z" fill="#ffffff" stroke="#767676" stroke-width="1" clip-path="url(#inner-clip)"/>
10
+ <rect width="55" height="20" y="5" fill="#ebebeb" stroke="#767676" clip-path="url(#outer-clip)" rx="4" ry="4"/>
11
+ <path fill="#fff" stroke="#767676" d="M4 5h16v20H4a4 4 0 0 1-4-4V9a4 4 0 0 1 4-4Z" clip-path="url(#inner-clip)"/>
13
12
  </svg>
@@ -1,7 +1,4 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28px" height="28px" viewBox="0 0 28 28" version="1.1">
3
- <g id="surface1">
4
- <path style="stroke:rgba(255, 255, 255, 1.0);stroke-width: 2.5px;paint-order: stroke;fill-rule:evenodd;fill:rgb(13.333333%,12.156863%,12.54902%);fill-opacity:1;" d="M 13.828125 21.453125 C 12.722656 21.453125 11.820312 20.554688 11.820312 19.445312 C 11.820312 18.882812 12.050781 18.359375 12.46875 17.976562 L 12.46875 17.972656 C 12.589844 17.859375 12.667969 17.699219 12.667969 17.519531 L 12.667969 7.382812 C 12.667969 6.742188 13.1875 6.222656 13.828125 6.222656 C 14.46875 6.222656 14.992188 6.742188 14.992188 7.382812 L 14.992188 17.519531 C 14.992188 17.699219 15.070312 17.859375 15.191406 17.972656 L 15.191406 17.976562 C 15.609375 18.359375 15.835938 18.882812 15.835938 19.445312 C 15.835938 20.554688 14.9375 21.453125 13.828125 21.453125 Z M 17.503906 9.894531 C 17.792969 9.894531 18.023438 9.660156 18.023438 9.375 C 18.023438 9.089844 17.792969 8.855469 17.503906 8.855469 L 16.234375 8.855469 L 16.234375 8.203125 L 17.503906 8.203125 C 17.792969 8.203125 18.023438 7.96875 18.023438 7.683594 C 18.023438 7.398438 17.792969 7.164062 17.503906 7.164062 L 16.226562 7.164062 C 16.113281 5.941406 15.082031 4.976562 13.828125 4.976562 C 12.503906 4.976562 11.425781 6.058594 11.425781 7.382812 L 11.425781 17.265625 C 10.882812 17.859375 10.578125 18.640625 10.578125 19.445312 C 10.578125 21.238281 12.035156 22.699219 13.828125 22.699219 C 15.621094 22.699219 17.082031 21.238281 17.082031 19.445312 C 17.082031 18.640625 16.777344 17.859375 16.234375 17.265625 L 16.234375 11.585938 L 17.503906 11.585938 C 17.792969 11.585938 18.023438 11.355469 18.023438 11.066406 C 18.023438 10.78125 17.792969 10.550781 17.503906 10.550781 L 16.234375 10.550781 L 16.234375 9.894531 Z M 17.503906 9.894531 "/>
5
- <path style="stroke:rgba(255, 255, 255, 1.0);stroke-width: 1px;paint-order: stroke;fill-rule:evenodd;fill:rgb(13.333333%,12.156863%,12.54902%);fill-opacity:1;" d="M 14.367188 18.234375 L 14.367188 12.691406 C 14.367188 12.390625 14.128906 12.152344 13.828125 12.152344 C 13.53125 12.152344 13.289062 12.390625 13.289062 12.691406 L 13.289062 18.234375 C 12.824219 18.441406 12.5 18.90625 12.5 19.445312 C 12.5 20.179688 13.097656 20.773438 13.828125 20.773438 C 14.5625 20.773438 15.15625 20.179688 15.15625 19.445312 C 15.15625 18.90625 14.832031 18.441406 14.367188 18.234375 "/>
6
- </g>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="28" height="28">
2
+ <path fill="#221f20" fill-rule="evenodd" stroke="#fff" stroke-width="2.5" d="M13.828 21.453a2.01 2.01 0 0 1-2.008-2.008c0-.562.23-1.086.649-1.468v-.004a.62.62 0 0 0 .199-.453V7.383a1.16 1.16 0 0 1 2.324 0V17.52c0 .18.078.34.2.453v.004c.417.382.644.906.644 1.468 0 1.11-.899 2.008-2.008 2.008Zm3.676-11.558a.52.52 0 1 0 0-1.04h-1.27v-.652h1.27a.52.52 0 1 0 0-1.039h-1.277a2.414 2.414 0 0 0-2.399-2.187 2.41 2.41 0 0 0-2.402 2.406v9.883a3.24 3.24 0 0 0-.848 2.18 3.256 3.256 0 0 0 3.25 3.253 3.26 3.26 0 0 0 3.254-3.254 3.24 3.24 0 0 0-.848-2.18v-5.68h1.27a.517.517 0 1 0 0-1.034h-1.27v-.656Zm0 0" paint-order="stroke"/>
3
+ <path fill="#221f20" fill-rule="evenodd" stroke="#fff" d="M14.367 18.234v-5.543c0-.3-.238-.539-.539-.539a.54.54 0 0 0-.539.54v5.542a1.327 1.327 0 1 0 1.867 1.211c0-.539-.324-1.004-.789-1.21" paint-order="stroke"/>
7
4
  </svg>