@abreen/tada 1.16.0 → 1.16.2

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 (55) hide show
  1. package/README.md +19 -0
  2. package/assets/material-symbols/celebration_24px.svg +1 -1
  3. package/assets/material-symbols/close_24px.svg +1 -1
  4. package/assets/material-symbols/contrast_20px.svg +1 -0
  5. package/assets/material-symbols/contrast_rtl_off_20px.svg +1 -0
  6. package/assets/material-symbols/info_20px.svg +1 -0
  7. package/assets/material-symbols/info_40px.svg +1 -0
  8. package/assets/material-symbols/menu_24px.svg +1 -1
  9. package/assets/material-symbols/open_in_new_20px.svg +1 -0
  10. package/assets/material-symbols/search_20px.svg +1 -0
  11. package/assets/material-symbols/smart_display_24px.svg +1 -0
  12. package/assets/material-symbols/south_east_20px.svg +1 -0
  13. package/assets/material-symbols/warning_20px.svg +1 -0
  14. package/assets/material-symbols/warning_40px.svg +1 -0
  15. package/bin/validators.ts +2 -0
  16. package/build/bundle.ts +23 -4
  17. package/build/custom-fonts.ts +300 -0
  18. package/build/generate-fonts.ts +43 -0
  19. package/build/material-symbols.ts +58 -20
  20. package/build/pipeline.ts +1 -1
  21. package/build/site-variables.ts +2 -0
  22. package/build/types.d.ts +29 -0
  23. package/build/utils/render.ts +36 -12
  24. package/build/watch/assets.ts +3 -3
  25. package/build/watch/build-full.ts +1 -1
  26. package/build/watch/build-incremental.ts +1 -1
  27. package/build/watch/validation.ts +18 -7
  28. package/package.json +1 -1
  29. package/schema/site.schema.json +77 -0
  30. package/src/_alerts.scss +17 -12
  31. package/src/_layout.scss +2 -2
  32. package/src/anchor/index.ts +2 -35
  33. package/src/anchor/style.scss +4 -28
  34. package/src/appearance-picker/index.ts +78 -19
  35. package/src/appearance-picker/style.scss +9 -11
  36. package/src/header/_base.scss +14 -6
  37. package/src/header/style.scss +8 -0
  38. package/src/material-symbols.scss +16 -3
  39. package/src/navigate/runtime.ts +13 -0
  40. package/src/question/style.scss +1 -2
  41. package/src/search/style.scss +5 -3
  42. package/src/style.scss +11 -5
  43. package/src/toc/style.scss +14 -10
  44. package/templates/_appearance-picker.html +4 -4
  45. package/templates/_theme.scss +14 -4
  46. package/templates/_top.html +42 -6
  47. package/templates/code.html +1 -1
  48. package/assets/material-symbols/contrast_24px.svg +0 -1
  49. package/assets/material-symbols/contrast_rtl_off_24px.svg +0 -1
  50. package/assets/material-symbols/info_24px.svg +0 -1
  51. package/assets/material-symbols/north_east_24px.svg +0 -1
  52. package/assets/material-symbols/search_24px.svg +0 -1
  53. package/assets/material-symbols/south_east_24px.svg +0 -1
  54. package/assets/material-symbols/tag_24px.svg +0 -1
  55. package/assets/material-symbols/warning_24px.svg +0 -1
@@ -75,8 +75,10 @@
75
75
  }
76
76
 
77
77
  .font-picker-option-sans {
78
- font-family: var(--sans-font);
79
- font-feature-settings: var(--sans-font-feature-settings);
78
+ font-family:
79
+ -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial,
80
+ sans-serif;
81
+ font-feature-settings: normal;
80
82
  }
81
83
 
82
84
  .font-picker-option-serif {
@@ -86,17 +88,13 @@
86
88
  font-feature-settings: var(--serif-font-feature-settings);
87
89
  }
88
90
 
89
- .material-symbol-icon {
90
- width: 1.25rem;
91
- height: 1.25rem;
92
- }
93
-
94
- .material-symbol-icon-contrast-standard {
95
- --material-symbol-icon: var(--icon-contrast-standard);
91
+ :root:not([data-font-preference='serif']) .font-picker-option-sans {
92
+ font-family: var(--sans-font);
93
+ font-feature-settings: var(--sans-font-feature-settings);
96
94
  }
97
95
 
98
- .material-symbol-icon-contrast-high {
99
- --material-symbol-icon: var(--icon-contrast-high);
96
+ :root[data-font-preference='serif'] .font-picker-option-serif {
97
+ font-family: var(--serif-font);
100
98
  }
101
99
 
102
100
  .preference-picker-option[aria-pressed='true'] {
@@ -16,6 +16,10 @@ header {
16
16
  view-transition-name: site-header;
17
17
  }
18
18
 
19
+ :root[data-contrast-preference='high'] header {
20
+ background: var(--bg-color);
21
+ }
22
+
19
23
  header details summary {
20
24
  position: relative;
21
25
  display: flex;
@@ -56,10 +60,10 @@ header details summary::marker {
56
60
  }
57
61
 
58
62
  header summary::after {
59
- flex: 0 0 24px;
63
+ flex: 0 0 var(--icon-header-menu-size);
60
64
  order: -1;
61
- width: 24px;
62
- height: 24px;
65
+ width: var(--icon-header-menu-size);
66
+ height: var(--icon-header-menu-size);
63
67
  margin-right: 8px;
64
68
  margin-left: var(--gap);
65
69
  content: '';
@@ -93,7 +97,10 @@ header summary .site-title {
93
97
  margin: 0 8px 0 0;
94
98
  overflow: hidden;
95
99
  text-overflow: ellipsis;
96
- font-weight: 500;
100
+
101
+ // Values above 500 resolve to the supplied bold face when a custom family
102
+ // provides only fixed 400 and 700 weights.
103
+ font-weight: 600;
97
104
  white-space: nowrap;
98
105
  pointer-events: none;
99
106
  }
@@ -150,8 +157,8 @@ header .search-controls {
150
157
  top: 50%;
151
158
  left: 7px;
152
159
  z-index: 1;
153
- width: 22px;
154
- height: 22px;
160
+ width: var(--icon-search-size);
161
+ height: var(--icon-search-size);
155
162
  pointer-events: none;
156
163
  content: '';
157
164
  transform: translateY(-50%);
@@ -165,6 +172,7 @@ header .search-controls {
165
172
 
166
173
  input.search {
167
174
  width: 180px;
175
+ padding-left: calc(2rem - 1px);
168
176
  }
169
177
  }
170
178
 
@@ -50,10 +50,18 @@ header nav div > p {
50
50
  @include user-select(none);
51
51
  }
52
52
 
53
+ :root[data-contrast-preference='high'] header:has(details[open]) {
54
+ background: var(--bg2-color);
55
+ }
56
+
53
57
  @media (hover: hover) {
54
58
  header:has(details[open]):hover {
55
59
  background: var(--bg-color-translucent);
56
60
  }
61
+
62
+ :root[data-contrast-preference='high'] header:hover {
63
+ background: var(--bg2-color);
64
+ }
57
65
  }
58
66
 
59
67
  header .results-container {
@@ -1,11 +1,24 @@
1
1
  @use 'mixins' as *;
2
2
 
3
3
  .material-symbol-icon {
4
+ display: block;
5
+ width: var(--material-symbol-icon-size);
6
+ height: var(--material-symbol-icon-size);
7
+
4
8
  @include contained-mask(var(--material-symbol-icon));
9
+ }
5
10
 
6
- display: block;
11
+ .material-symbol-icon-heading-present {
12
+ --material-symbol-icon: var(--icon-heading-present);
13
+ --material-symbol-icon-size: var(--icon-heading-present-size);
14
+ }
15
+
16
+ .material-symbol-icon-contrast-standard {
17
+ --material-symbol-icon: var(--icon-contrast-standard);
18
+ --material-symbol-icon-size: var(--icon-contrast-standard-size);
7
19
  }
8
20
 
9
- .material-symbol-icon-heading-anchor {
10
- --material-symbol-icon: var(--icon-heading-anchor);
21
+ .material-symbol-icon-contrast-high {
22
+ --material-symbol-icon: var(--icon-contrast-high);
23
+ --material-symbol-icon-size: var(--icon-contrast-high-size);
11
24
  }
@@ -138,6 +138,18 @@ function isActiveNavigation(controller: AbortController): boolean {
138
138
  return currentAbortController === controller && !controller.signal.aborted;
139
139
  }
140
140
 
141
+ function prefersReducedMotion(window: Window): boolean {
142
+ if (typeof window.matchMedia !== 'function') {
143
+ return false;
144
+ }
145
+
146
+ try {
147
+ return window.matchMedia('(prefers-reduced-motion: reduce)').matches;
148
+ } catch {
149
+ return false;
150
+ }
151
+ }
152
+
141
153
  export function initNavigation(window: Window): void {
142
154
  currentAbortController = null;
143
155
  historyIndex = 0;
@@ -305,6 +317,7 @@ export async function navigateToUrl(
305
317
 
306
318
  if (
307
319
  useViewTransition &&
320
+ !prefersReducedMotion(window) &&
308
321
  typeof transitionDoc.startViewTransition === 'function'
309
322
  ) {
310
323
  const titleEl = document.querySelector('.title-and-info');
@@ -62,8 +62,7 @@
62
62
  margin-bottom: 0;
63
63
  }
64
64
 
65
- .question-a-body > *,
66
- .question-a-body > * * {
65
+ .question-a-body > * {
67
66
  @media (prefers-reduced-motion: no-preference) {
68
67
  transition:
69
68
  color 0.25s,
@@ -127,7 +127,9 @@ header {
127
127
  }
128
128
 
129
129
  ol a .title {
130
- font-weight: 500;
130
+ // Values above 500 resolve to the supplied bold face when a custom
131
+ // family provides only fixed 400 and 700 weights.
132
+ font-weight: 600;
131
133
  line-height: var(--heading-line-height);
132
134
  }
133
135
 
@@ -138,10 +140,10 @@ header {
138
140
 
139
141
  ol li .excerpt {
140
142
  grid-row-start: 3;
141
- height: 7.5ex;
143
+ height: 4.2em;
142
144
  overflow: hidden;
143
145
  font-size: var(--font-size-small);
144
- line-height: 2.5ex;
146
+ line-height: 1.4;
145
147
  color: var(--fg2-color);
146
148
 
147
149
  mark {
package/src/style.scss CHANGED
@@ -3,6 +3,8 @@
3
3
  @use 'base';
4
4
  @use 'layout';
5
5
  @use 'alerts';
6
+ @include theme.custom-font-faces;
7
+ @include theme.custom-font-tuning;
6
8
 
7
9
  @font-face {
8
10
  font-family: Inter;
@@ -93,9 +95,9 @@ a.disabled {
93
95
  .external-link-tail::after,
94
96
  a.external:not(:has(.external-link-tail))::after {
95
97
  display: inline-block;
96
- width: 1em;
97
- height: 1em;
98
- vertical-align: middle;
98
+ width: var(--icon-external-link-size);
99
+ height: var(--icon-external-link-size);
100
+ vertical-align: text-top;
99
101
  content: '';
100
102
 
101
103
  @include contained-mask(var(--icon-external-link));
@@ -272,6 +274,10 @@ ol {
272
274
  list-style-type: decimal;
273
275
  }
274
276
 
277
+ :root[data-font-preference='serif'] ol > li::marker {
278
+ font-variant-numeric: oldstyle-nums;
279
+ }
280
+
275
281
  ol ol {
276
282
  list-style-type: lower-alpha;
277
283
  }
@@ -413,8 +419,8 @@ a.breadcrumb {
413
419
 
414
420
  &::after {
415
421
  display: inline-block;
416
- width: 1em;
417
- height: 1em;
422
+ width: var(--icon-parent-size);
423
+ height: var(--icon-parent-size);
418
424
  vertical-align: middle;
419
425
  content: '';
420
426
 
@@ -131,22 +131,26 @@ body.code .toc ol a {
131
131
  position: relative;
132
132
  }
133
133
 
134
+ .toc ol li.alert-item.warning {
135
+ --toc-alert-icon: var(--icon-warning-compact);
136
+ --toc-alert-icon-size: var(--icon-warning-compact-size);
137
+ }
138
+
139
+ .toc ol li.alert-item.note {
140
+ --toc-alert-icon: var(--icon-info-compact);
141
+ --toc-alert-icon-size: var(--icon-info-compact-size);
142
+ }
143
+
134
144
  .toc ol li.alert-item.warning a::before,
135
145
  .toc ol li.alert-item.note a::before {
136
146
  display: inline-block;
137
- width: 20px;
138
- height: 20px;
147
+ width: var(--toc-alert-icon-size);
148
+ height: var(--toc-alert-icon-size);
139
149
  margin-right: 4px;
140
- vertical-align: bottom;
150
+ vertical-align: sub;
141
151
  content: '';
142
- }
143
-
144
- .toc ol li.alert-item.warning a::before {
145
- @include contained-mask(var(--icon-warning));
146
- }
147
152
 
148
- .toc ol li.alert-item.note a::before {
149
- @include contained-mask(var(--icon-info));
153
+ @include contained-mask(var(--toc-alert-icon));
150
154
  }
151
155
 
152
156
  .toc ol li.label {
@@ -1,17 +1,17 @@
1
1
  <div class="appearance-pickers" data-pagefind-ignore>
2
2
  <div class="preference-picker font-picker" role="group" aria-label="Font style">
3
- <button type="button" class="preference-picker-option font-picker-option-sans" data-font-preference-value="sans" aria-label="Use sans-serif fonts" aria-pressed="true" disabled>
3
+ <button type="button" class="preference-picker-option font-picker-option-sans" data-font-preference-value="sans" aria-label="Use sans-serif fonts" aria-pressed="<%= site.defaultFont === 'sans' %>" disabled>
4
4
  <span aria-hidden="true">Aa</span>
5
5
  </button>
6
- <button type="button" class="preference-picker-option font-picker-option-serif" data-font-preference-value="serif" aria-label="Use serif fonts" aria-pressed="false" disabled>
6
+ <button type="button" class="preference-picker-option font-picker-option-serif" data-font-preference-value="serif" aria-label="Use serif fonts" aria-pressed="<%= site.defaultFont === 'serif' %>" disabled>
7
7
  <span aria-hidden="true">Aa</span>
8
8
  </button>
9
9
  </div>
10
10
  <div class="preference-picker contrast-picker" role="group" aria-label="Contrast">
11
- <button type="button" class="preference-picker-option contrast-picker-option-standard" data-contrast-preference-value="standard" aria-label="Use standard contrast" aria-pressed="true" disabled>
11
+ <button type="button" class="preference-picker-option contrast-picker-option-standard" data-contrast-preference-value="standard" aria-label="Use standard contrast" aria-pressed="<%= site.defaultContrast === 'standard' %>" disabled>
12
12
  <span class="material-symbol-icon material-symbol-icon-contrast-standard" aria-hidden="true"></span>
13
13
  </button>
14
- <button type="button" class="preference-picker-option contrast-picker-option-high" data-contrast-preference-value="high" aria-label="Use high contrast" aria-pressed="false" disabled>
14
+ <button type="button" class="preference-picker-option contrast-picker-option-high" data-contrast-preference-value="high" aria-label="Use high contrast" aria-pressed="<%= site.defaultContrast === 'high' %>" disabled>
15
15
  <span class="material-symbol-icon material-symbol-icon-contrast-high" aria-hidden="true"></span>
16
16
  </button>
17
17
  </div>
@@ -1,3 +1,13 @@
1
+ @mixin custom-font-faces {
2
+ /* Site-configured font faces are inserted below. */
3
+ /* TADA_CUSTOM_FONT_FACES */
4
+ }
5
+
6
+ @mixin custom-font-tuning {
7
+ /* Site-configured font tuning is inserted below. */
8
+ /* TADA_CUSTOM_FONT_TUNING */
9
+ }
10
+
1
11
  :root {
2
12
  --theme-color: <%= themeColorLight %>;
3
13
  --theme-color-text: <%= themeColorTextLight %>;
@@ -41,14 +51,14 @@
41
51
  'Helvetica', 'Arial', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
42
52
  'Segoe UI Symbol';
43
53
  --sans-mono-font: 'Google Sans Code', 'Consolas', 'Courier', monospace;
44
- --serif-font: 'Source Serif 4', 'Times New Roman', 'Times', serif;
54
+ --serif-font: <%= serifFontStack %>;
45
55
  --serif-preview-font: 'Times New Roman', 'Times', serif;
46
- --serif-mono-font: 'Libertinus Mono', 'Courier New', 'Courier', monospace;
56
+ --serif-mono-font: <%= serifMonoFontStack %>;
47
57
  --sans-font-feature-settings:
48
58
  'liga', 'calt', 'ss07', 'ss08', 'cv01', 'cv08', 'cv10';
49
59
  --sans-mono-font-feature-settings: normal;
50
- --serif-font-feature-settings: normal;
51
- --serif-mono-font-feature-settings: normal;
60
+ --serif-font-feature-settings: <%= serifFontFeatureSettings %>;
61
+ --serif-mono-font-feature-settings: <%= serifMonoFontFeatureSettings %>;
52
62
  --font: var(--sans-font);
53
63
  --heading-font: var(--font);
54
64
  --heading-line-height: 1.3;
@@ -1,5 +1,9 @@
1
1
  <!doctype html>
2
- <html lang="en">
2
+ <html lang="en"
3
+ data-default-font-preference="<%= site.defaultFont %>"
4
+ data-default-contrast-preference="<%= site.defaultContrast %>"<% if (site.defaultFont === 'serif') { %>
5
+ data-font-preference="serif"<% } %><% if (site.defaultContrast === 'high') { %>
6
+ data-contrast-preference="high"<% } %>>
3
7
  <head>
4
8
  <% if (site.features.favicon) { %>
5
9
  <link rel="icon" href="/favicon.ico" sizes="any" />
@@ -36,15 +40,47 @@
36
40
  <script>
37
41
  document.documentElement.classList.add('js');
38
42
  try {
39
- if (window.localStorage.getItem('fontPreference') === 'serif') {
40
- document.documentElement.dataset.fontPreference = 'serif';
43
+ const preference = window.localStorage.getItem('fontPreference');
44
+ const configured =
45
+ document.documentElement.dataset.defaultFontPreference;
46
+ if (
47
+ (preference === 'serif' || preference === 'sans') &&
48
+ preference !== configured
49
+ ) {
50
+ if (preference === 'serif') {
51
+ document.documentElement.dataset.fontPreference = 'serif';
52
+ } else {
53
+ delete document.documentElement.dataset.fontPreference;
54
+ }
41
55
  }
42
56
  } catch {}
57
+ let contrastPreference;
43
58
  try {
44
- if (window.localStorage.getItem('contrastPreference') === 'high') {
45
- document.documentElement.dataset.contrastPreference = 'high';
46
- }
59
+ contrastPreference = window.localStorage.getItem('contrastPreference');
47
60
  } catch {}
61
+ const configuredContrast =
62
+ document.documentElement.dataset.defaultContrastPreference;
63
+ if (
64
+ contrastPreference !== 'high' &&
65
+ contrastPreference !== 'standard'
66
+ ) {
67
+ contrastPreference = configuredContrast;
68
+ if (
69
+ configuredContrast !== 'high' &&
70
+ typeof window.matchMedia === 'function'
71
+ ) {
72
+ try {
73
+ if (window.matchMedia('(prefers-contrast: more)').matches) {
74
+ contrastPreference = 'high';
75
+ }
76
+ } catch {}
77
+ }
78
+ }
79
+ if (contrastPreference === 'high') {
80
+ document.documentElement.dataset.contrastPreference = 'high';
81
+ } else {
82
+ delete document.documentElement.dataset.contrastPreference;
83
+ }
48
84
  </script>
49
85
  <% if (!isWatchMode) { %>
50
86
  <script type="speculationrules">
@@ -3,7 +3,7 @@
3
3
  <div class="main-content">
4
4
  <main class="body" data-pagefind-body>
5
5
  <div class="file-header">
6
- <h1 data-pagefind-weight="10" data-pagefind-meta="title_html[data-title-html]" data-title-html="<%- page.titleHtml %>"><%= page.titleHtml %></h1>
6
+ <h1 class="file-title" data-pagefind-weight="10" data-pagefind-meta="title_html[data-title-html]" data-title-html="<%- page.titleHtml %>"><%= page.titleHtml %></h1>
7
7
  <%= render('_download.html') %>
8
8
  </div>
9
9
  <div class="code-body">
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm40-83q119-15 199.5-104.5T800-480q0-123-80.5-212.5T520-797v634Z"/></svg>
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M819-28 701-146q-48 32-103.5 49T480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-62 17-117.5T146-701L27-820l57-57L876-85l-57 57ZM480-160q45 0 85.5-12t76.5-33L480-367v207Zm335-100-59-59q21-35 32.5-75.5T800-480q0-133-93.5-226.5T480-800v205L260-815q48-31 103.5-48T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 61-17 116.5T815-260Z"/></svg>
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="m216-160-56-56 464-464H360v-80h400v400h-80v-264L216-160Z"/></svg>
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z"/></svg>
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M360-200v-80h264L160-744l56-56 464 464v-264h80v400H360Z"/></svg>
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="m240-160 40-160H120l20-80h160l40-160H180l20-80h160l40-160h80l-40 160h160l40-160h80l-40 160h160l-20 80H660l-40 160h160l-20 80H600l-40 160h-80l40-160H360l-40 160h-80Zm140-240h160l40-160H420l-40 160Z"/></svg>
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="m40-120 440-760 440 760H40Zm138-80h604L480-720 178-200Zm302-40q17 0 28.5-11.5T520-280q0-17-11.5-28.5T480-320q-17 0-28.5 11.5T440-280q0 17 11.5 28.5T480-240Zm-40-120h80v-200h-80v200Zm40-100Z"/></svg>