@digital-ai/dot-illustrations 2.0.20 → 2.0.22

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.
package/demo/script.js CHANGED
@@ -1,3 +1,7 @@
1
+ // Make currentTab and root globally accessible
2
+ const root = document.documentElement;
3
+ let currentTab = 'all';
4
+
1
5
  function myFunction() {
2
6
  var input, filter, divs, i, div, txtValue;
3
7
  input = document.getElementById('myInput');
@@ -15,113 +19,6 @@ function myFunction() {
15
19
  }
16
20
  }
17
21
 
18
- function doMagic() {
19
- const list = document.getElementById("illustration-list");
20
- const illustrations = [
21
- // Global arrange from A-Z
22
- "add-new",
23
- "ai",
24
- "add-new-grid",
25
- "add-team",
26
- "add-user",
27
- "assets",
28
- "analysis-circle",
29
- "community",
30
- "chart",
31
- "custom-dashboards",
32
- "dependency-down",
33
- "dependency-up",
34
- "disconnected",
35
- "done",
36
- "dora-metrics-circle",
37
- "download",
38
- "empty",
39
- "error-fourhundredfour",
40
- "error-fivehundred",
41
- "error-fivehundredthree",
42
- "error-fourhundredthree",
43
- "favorite",
44
- "features",
45
- "folder-versioning",
46
- "filter-empty",
47
- "launch",
48
- "no-files",
49
- "no-filters",
50
- "nothing-defined",
51
- "password-token",
52
- "protection-in-progress",
53
- "reports",
54
- "scan-document",
55
- "survey",
56
- "user",
57
- "ui-ux-improvements",
58
- "upload",
59
- "work-item",
60
- "workflows-main",
61
- "research",
62
- "commitrepo",
63
-
64
-
65
- // Dashboards arrange from A-Z
66
- "analysis",
67
- "automation",
68
- "burn-down",
69
- "burn-up",
70
- "change-credit-score",
71
- "change-data-quality",
72
- "change-executive",
73
- "change-impact-detection",
74
- "change-impact-hotspots",
75
- "change-failure-factors",
76
- "change-failure-prediction",
77
- "CRP-failure-prediction-monitoring",
78
- "custom",
79
- "defect",
80
- "dependency",
81
- "dora",
82
- "executive",
83
- "change-impact",
84
- "item",
85
- "late-task",
86
- "onboarding",
87
- "data-extraction",
88
- "workflow"
89
- ];
90
- illustrations.forEach(illustration => {
91
- const div = document.createElement("div");
92
- div.setAttribute("class", "copy-container");
93
- div.innerHTML = `
94
- <img class="${illustration} light"></img>
95
- <!-- Inner div wrapping only the buttons -->
96
- <!-- Button for copying ID -->
97
- <div class="button-group">
98
- <button id="CopyID" class="button" onmouseover="showTooltip(this)" onmouseout="hideTooltip(this)"
99
- onclick="copyText(this)">Copy ID
100
- <span class="tooltiptext">Copy ID</span>
101
- </button>
102
- <!-- Button for copying Code -->
103
- <button class="button" onmouseover="showTooltip(this)" onmouseout="hideTooltip(this)" onclick="copyCode(this)">
104
- Copy Code
105
- <span class="tooltiptext">Copy Code</span>
106
- </button>
107
- </div>
108
- <span class="iconID">${illustration}</span>
109
- <!-- Code block to be copied -->
110
- <pre class="codeBlock">
111
- <code class="codeBlock">
112
- <span class="dot-illustration">
113
- <img class="${illustration} light"/>
114
- </span>
115
- </code>
116
- </pre>
117
- `;
118
- list.appendChild(div);
119
- });
120
- }
121
-
122
- document.addEventListener("DOMContentLoaded", doMagic);
123
-
124
-
125
22
  function showTooltip(button) {
126
23
  var tooltip = button.querySelector('.tooltiptext');
127
24
  tooltip.style.visibility = 'visible';
@@ -132,59 +29,57 @@ function hideTooltip(button) {
132
29
  tooltip.style.visibility = 'hidden';
133
30
  }
134
31
 
135
- function copyCode(button) {
32
+ // Toast logic
33
+ function showToast(message) {
34
+ let toast = document.getElementById('toast-message');
35
+ if (!toast) {
36
+ toast = document.createElement('div');
37
+ toast.id = 'toast-message';
38
+ toast.className = 'fixed bottom-6 left-1/2 -translate-x-1/2 z-50 bg-gray-900 text-white px-6 py-3 rounded-lg shadow-lg flex items-center gap-2 text-base animate-fade-in';
39
+ document.body.appendChild(toast);
40
+ }
41
+ toast.textContent = message;
42
+ toast.style.display = 'flex';
43
+ clearTimeout(window._toastTimeout);
44
+ window._toastTimeout = setTimeout(() => {
45
+ toast.style.display = 'none';
46
+ }, 2000);
47
+ }
48
+
49
+ // Patch copyCode and copyText to show toast
50
+ const origCopyCode = window.copyCode;
51
+ window.copyCode = function(button) {
136
52
  // Find the closest div with class 'copy-container'
137
53
  var parentDiv = button.closest('.copy-container');
138
-
139
- // Find the code block element within the same parent div
140
54
  var copyCode = parentDiv.querySelector('.codeBlock code');
141
-
142
- // Get the HTML content inside the code block as a string
143
55
  var codeToCopy = copyCode.innerHTML;
144
-
145
-
146
-
147
- // Use the Clipboard API to copy the text
148
56
  navigator.clipboard.writeText(codeToCopy).then(function() {
149
- // Show the tooltip with the copied code message
150
57
  var tooltip = button.querySelector('.tooltiptext');
151
58
  tooltip.innerHTML = "Copied code block";
152
59
  tooltip.style.visibility = 'visible';
153
-
154
- // Reset the tooltip back to "Copy Code" after 2 seconds
155
60
  setTimeout(function() {
156
- tooltip.innerHTML = "Copy Code:";
61
+ tooltip.innerHTML = "Copy Code";
157
62
  tooltip.style.visibility = 'hidden';
158
63
  }, 2000);
159
-
64
+ showToast('Copied code: ' + codeToCopy);
160
65
  }, function(err) {
161
66
  console.error('Failed to copy code block: ', err);
162
67
  });
163
68
  }
164
-
165
- function copyText(button) {
166
- // Find the closest div with class 'copy-container'
69
+ const origCopyText = window.copyText;
70
+ window.copyText = function(button) {
167
71
  var parentDiv = button.closest('.copy-container');
168
-
169
- // Find the span with the class 'iconID'
170
72
  var copyText = parentDiv.querySelector('.iconID');
171
-
172
- // Get the text content of the span
173
73
  var textToCopy = copyText.textContent;
174
-
175
- // Use the Clipboard API to copy the text
176
74
  navigator.clipboard.writeText(textToCopy).then(function() {
177
- // Show the tooltip with the copied ID message
178
75
  var tooltip = button.querySelector('.tooltiptext');
179
76
  tooltip.innerHTML = "Copied: " + textToCopy;
180
77
  tooltip.style.visibility = 'visible';
181
-
182
- // Reset the tooltip back to "Copy ID" after 2 seconds
183
78
  setTimeout(function() {
184
79
  tooltip.innerHTML = "Copy ID";
185
80
  tooltip.style.visibility = 'hidden';
186
81
  }, 2000);
187
-
82
+ showToast('Copied ID: ' + textToCopy);
188
83
  }, function(err) {
189
84
  console.error('Failed to copy text: ', err);
190
85
  });
@@ -221,3 +116,260 @@ button.addEventListener('click', () => {
221
116
  button.textContent = 'Switch to dark mode';
222
117
  }
223
118
  });
119
+
120
+ // --- THEME SWITCHER & TABS ---
121
+ document.addEventListener('DOMContentLoaded', () => {
122
+ // Theme Switcher
123
+ const themeToggle = document.getElementById('theme-toggle');
124
+ const themeIcon = document.getElementById('theme-icon');
125
+ const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
126
+
127
+ function setTheme(dark) {
128
+ const imgs = document.querySelectorAll('img');
129
+ if (dark) {
130
+ root.classList.add('dark');
131
+ localStorage.setItem('theme', 'dark');
132
+ themeIcon.innerHTML = `<svg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' fill='none' viewBox='0 0 24 24' stroke='currentColor'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M21 12.79A9 9 0 1111.21 3a7 7 0 109.79 9.79z' /></svg>`;
133
+ imgs.forEach(img => {
134
+ img.classList.remove('light');
135
+ img.classList.add('dark');
136
+ });
137
+ } else {
138
+ root.classList.remove('dark');
139
+ localStorage.setItem('theme', 'light');
140
+ themeIcon.innerHTML = `<svg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' fill='none' viewBox='0 0 24 24' stroke='currentColor'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M12 3v1m0 16v1m8.66-13.66l-.71.71M4.05 19.07l-.71.71M21 12h-1M4 12H3m16.66 6.66l-.71-.71M4.05 4.93l-.71-.71M16 12a4 4 0 11-8 0 4 4 0 018 0z' /></svg>`;
141
+ imgs.forEach(img => {
142
+ img.classList.remove('dark');
143
+ img.classList.add('light');
144
+ });
145
+ }
146
+ }
147
+
148
+ // Initial theme
149
+ const savedTheme = localStorage.getItem('theme');
150
+ setTheme(savedTheme === 'dark' || (!savedTheme && prefersDark));
151
+
152
+ themeToggle.addEventListener('click', () => {
153
+ setTheme(!root.classList.contains('dark'));
154
+ });
155
+
156
+ // --- TABS ---
157
+ const mainTabs = document.querySelectorAll('.tab-btn');
158
+ const floatingTabs = document.querySelectorAll('.floating-tab');
159
+
160
+ function setTab(tab) {
161
+ currentTab = tab;
162
+ // Update main tabs
163
+ mainTabs.forEach(t => {
164
+ t.classList.remove('text-blue-600', 'dark:text-blue-400', 'bg-blue-100', 'dark:bg-blue-900');
165
+ t.classList.add('text-gray-700', 'dark:text-gray-300');
166
+ t.setAttribute('aria-selected', 'false');
167
+ if (t.dataset.tab === tab) {
168
+ t.classList.add('text-blue-600', 'dark:text-blue-400', 'bg-blue-100', 'dark:bg-blue-900');
169
+ t.classList.remove('text-gray-700', 'dark:text-gray-300');
170
+ t.setAttribute('aria-selected', 'true');
171
+ }
172
+ });
173
+ // Update floating tabs
174
+ floatingTabs.forEach(t => {
175
+ t.classList.remove('text-blue-600', 'dark:text-blue-400', 'bg-blue-100', 'dark:bg-blue-900');
176
+ t.classList.add('text-gray-700', 'dark:text-gray-300');
177
+ t.setAttribute('aria-selected', 'false');
178
+ if (t.dataset.tab === tab) {
179
+ t.classList.add('text-blue-600', 'dark:text-blue-400', 'bg-blue-100', 'dark:bg-blue-900');
180
+ t.classList.remove('text-gray-700', 'dark:text-gray-300');
181
+ t.setAttribute('aria-selected', 'true');
182
+ }
183
+ });
184
+ renderIllustrations();
185
+ }
186
+
187
+ mainTabs.forEach(tab => {
188
+ tab.addEventListener('click', function() {
189
+ setTab(this.dataset.tab);
190
+ });
191
+ });
192
+ floatingTabs.forEach(tab => {
193
+ tab.addEventListener('click', function() {
194
+ setTab(this.dataset.tab);
195
+ });
196
+ });
197
+
198
+ // --- ILLUSTRATION DATA ---
199
+ const globalList = [
200
+ "add-new","ai","add-new-grid","add-team","add-user","assets","analysis-circle","community","chart","custom-dashboards","dependency-down","dependency-up","disconnected","done","dora-metrics-circle","download","empty","error-fourhundredfour","error-fivehundred","error-fivehundredthree","error-fourhundredthree","favorite","features","folder-versioning","forbiden-access","filter-empty","launch","no-files","no-filters","nothing-defined","password-token","protection-in-progress","reports","scan-document","survey","user","ui-ux-improvements","upload","work-item","workflows-main","research","commitrepo"
201
+ ];
202
+ const dashboardsList = [
203
+ "analysis","automation","burn-down","burn-up","change-credit-score","change-data-quality","change-executive","change-impact-detection","change-impact-hotspots","change-failure-factors","change-failure-prediction","CRP-failure-prediction-monitoring","custom","defect","dependency","dora","executive","change-impact","item","late-task","onboarding","data-extraction","workflow"
204
+ ];
205
+ const illustrations = [...globalList, ...dashboardsList, "my-new-illustration"];
206
+
207
+ // --- FAVOURITES LOGIC ---
208
+ function getFavourites() {
209
+ try {
210
+ return JSON.parse(localStorage.getItem('dot-illustration-favourites') || '[]');
211
+ } catch {
212
+ return [];
213
+ }
214
+ }
215
+ function setFavourites(favs) {
216
+ localStorage.setItem('dot-illustration-favourites', JSON.stringify(favs));
217
+ }
218
+ window.toggleFavourite = function(id) {
219
+ let favs = getFavourites();
220
+ if (favs.includes(id)) {
221
+ favs = favs.filter(f => f !== id);
222
+ } else {
223
+ favs.push(id);
224
+ }
225
+ setFavourites(favs);
226
+ renderIllustrations();
227
+ };
228
+
229
+ function renderIllustrations() {
230
+ const list = document.getElementById("illustration-list");
231
+ list.innerHTML = "";
232
+ let toShow = [];
233
+ if (currentTab === 'all') {
234
+ toShow = illustrations;
235
+ } else if (currentTab === 'global') {
236
+ toShow = globalList;
237
+ } else if (currentTab === 'dashboards') {
238
+ toShow = dashboardsList;
239
+ } else if (currentTab === 'favourites') {
240
+ const favs = getFavourites();
241
+ toShow = illustrations.filter(id => favs.includes(id));
242
+ }
243
+ const filter = (document.getElementById('myInput')?.value || '').toUpperCase();
244
+ toShow = toShow.filter(id => id.toUpperCase().includes(filter));
245
+ if (toShow.length === 0) {
246
+ list.innerHTML = '<div class="col-span-full text-center text-gray-500 dark:text-gray-400">No illustrations found.</div>';
247
+ return;
248
+ }
249
+ const favs = getFavourites();
250
+ const themeClass = root.classList.contains('dark') ? 'dark' : 'light';
251
+ toShow.forEach(illustration => {
252
+ let categoryClass = "";
253
+ if (globalList.includes(illustration)) categoryClass = "global-illustration";
254
+ else if (dashboardsList.includes(illustration)) categoryClass = "dashboards-illustration";
255
+ const isFav = favs.includes(illustration);
256
+ const div = document.createElement("div");
257
+ div.setAttribute("class", "copy-container relative group flex flex-col items-center justify-between bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-xl shadow-lg p-2 md:p-3 transition-transform duration-200 hover:scale-105 hover:shadow-2xl h-[302px] w-full justify-center");
258
+ div.innerHTML = `
259
+ <button class="absolute top-2 right-2 z-10 p-1 rounded-full bg-white/80 dark:bg-gray-800/80 hover:bg-yellow-100 dark:hover:bg-yellow-300 transition" title="Toggle favourite" onclick="event.stopPropagation(); window.toggleFavourite && window.toggleFavourite('${illustration}')">
260
+ <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="${isFav ? 'gold' : 'none'}" viewBox="0 0 24 24" stroke="gold">
261
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l2.036 6.29a1 1 0 00.95.69h6.631c.969 0 1.371 1.24.588 1.81l-5.37 3.905a1 1 0 00-.364 1.118l2.036 6.29c.3.921-.755 1.688-1.54 1.118l-5.37-3.905a1 1 0 00-1.176 0l-5.37 3.905c-.784.57-1.838-.197-1.54-1.118l2.036-6.29a1 1 0 00-.364-1.118L2.342 11.717c-.783-.57-.38-1.81.588-1.81h6.631a1 1 0 00.95-.69l2.036-6.29z"/>
262
+ </svg>
263
+ </button>
264
+ <div class="flex-1 flex flex-col justify-center items-center">
265
+ <span class="dot-illustration">
266
+ <img src="./svgs/${illustration}.svg" class="${illustration} ${themeClass} ${categoryClass}"/>
267
+ </span>
268
+ <span class="iconID block text-center text-base font-medium text-gray-800 dark:text-gray-200 my-2">${illustration}</span>
269
+ </div>
270
+ <div class="button-group flex flex-row items-center justify-center gap-2 mt-2">
271
+ <button id="CopyID" class="button flex items-center justify-center min-w-[80px] px-1.5 py-0.5 text-[11px] text-gray-400 border border-gray-300 dark:border-gray-700 rounded bg-white dark:bg-gray-800 font-normal hover:bg-blue-100 dark:hover:bg-blue-900 transition relative text-center" onmouseover="showTooltip(this)" onmouseout="hideTooltip(this)" onclick="copyText(this)">
272
+ Copy ID
273
+ <span class="tooltiptext left-1/2 -translate-x-1/2 bottom-10 shadow-md">Copy ID</span>
274
+ </button>
275
+ <button class="button flex items-center justify-center min-w-[80px] px-1.5 py-0.5 text-[11px] text-gray-400 border border-gray-300 dark:border-gray-700 rounded bg-white dark:bg-gray-800 font-normal hover:bg-blue-100 dark:hover:bg-blue-900 transition relative text-center" onmouseover="showTooltip(this)" onmouseout="hideTooltip(this)" onclick="copyCode(this)">
276
+ Copy Code
277
+ <span class="tooltiptext left-1/2 -translate-x-1/2 bottom-10 shadow-md">Copy Code</span>
278
+ </button>
279
+ </div>
280
+ <pre class="codeBlock"><code class="codeBlock"><span class="dot-illustration"><img src="./svgs/${illustration}.svg" class="${illustration} ${themeClass} ${categoryClass}"/></span></code></pre>
281
+ `;
282
+ list.appendChild(div);
283
+ });
284
+ }
285
+
286
+ // Search input
287
+ document.getElementById('myInput').addEventListener('input', renderIllustrations);
288
+ document.getElementById('floatingInput').addEventListener('input', () => {
289
+ document.getElementById('myInput').value = document.getElementById('floatingInput').value;
290
+ renderIllustrations();
291
+ });
292
+
293
+ // Clear both search inputs on load
294
+ document.getElementById('myInput').value = '';
295
+ document.getElementById('floatingInput').value = '';
296
+
297
+ // Set initial tab state to 'all' and update UI (this will also render illustrations)
298
+ setTab('all');
299
+
300
+ // --- FLOATING BAR LOGIC ---
301
+ const floatingBar = document.getElementById('floating-bar');
302
+ window.addEventListener('scroll', () => {
303
+ if (window.scrollY > 80) {
304
+ floatingBar.classList.add('floating-bar-visible');
305
+ } else {
306
+ floatingBar.classList.remove('floating-bar-visible');
307
+ }
308
+ });
309
+ });
310
+
311
+ // --- FUZZY SEARCH SUGGESTIONS ---
312
+ const searchInput = document.getElementById('myInput');
313
+ const suggestionsBox = document.getElementById('search-suggestions');
314
+
315
+ function fuzzyMatch(str, query) {
316
+ // Simple fuzzy: all query chars in order in str
317
+ query = query.toLowerCase();
318
+ str = str.toLowerCase();
319
+ let qIdx = 0;
320
+ for (let s = 0; s < str.length && qIdx < query.length; s++) {
321
+ if (str[s] === query[qIdx]) qIdx++;
322
+ }
323
+ return qIdx === query.length;
324
+ }
325
+
326
+ function getSuggestions(query) {
327
+ if (!query) return [];
328
+ // Use current tab's list
329
+ let pool = [];
330
+ if (currentTab === 'all') pool = illustrations;
331
+ else if (currentTab === 'global') pool = globalList;
332
+ else if (currentTab === 'dashboards') pool = dashboardsList;
333
+ else if (currentTab === 'favourites') pool = getFavourites();
334
+ // Fuzzy match, sort by closeness (shorter index of first match, then length)
335
+ let scored = pool
336
+ .map(id => {
337
+ let idx = id.toLowerCase().indexOf(query.toLowerCase());
338
+ let fuzzy = fuzzyMatch(id, query);
339
+ return fuzzy ? {id, idx: idx === -1 ? 999 : idx, len: id.length} : null;
340
+ })
341
+ .filter(Boolean)
342
+ .sort((a, b) => a.idx - b.idx || a.len - b.len)
343
+ .slice(0, 7);
344
+ return scored.map(s => s.id);
345
+ }
346
+
347
+ function showSuggestions() {
348
+ const val = searchInput.value.trim();
349
+ const suggestions = getSuggestions(val);
350
+ if (!val || suggestions.length === 0) {
351
+ suggestionsBox.classList.add('hidden');
352
+ suggestionsBox.innerHTML = '';
353
+ return;
354
+ }
355
+ suggestionsBox.innerHTML = suggestions.map(s => `<div class="px-4 py-2 cursor-pointer hover:bg-blue-100 dark:hover:bg-blue-900 transition" data-suggestion="${s}">${s}</div>`).join('');
356
+ suggestionsBox.classList.remove('hidden');
357
+ }
358
+
359
+ searchInput.addEventListener('input', () => {
360
+ renderIllustrations();
361
+ showSuggestions();
362
+ });
363
+ searchInput.addEventListener('focus', showSuggestions);
364
+ searchInput.addEventListener('blur', () => setTimeout(() => suggestionsBox.classList.add('hidden'), 150));
365
+ suggestionsBox.addEventListener('mousedown', e => {
366
+ if (e.target.dataset.suggestion) {
367
+ searchInput.value = e.target.dataset.suggestion;
368
+ renderIllustrations();
369
+ suggestionsBox.classList.add('hidden');
370
+ }
371
+ });
372
+
373
+ // Remove classic grid rendering to avoid conflicts with tabbed UI
374
+ // document.addEventListener("DOMContentLoaded", doMagic);
375
+
@@ -0,0 +1,24 @@
1
+ <svg width="249" height="249" viewBox="0 0 249 249" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <circle cx="124.019" cy="124.5" r="93" fill="#494F60" fill-opacity="0.3"/>
3
+ <g clip-path="url(#clip0_4423_5023)">
4
+ <g filter="url(#filter0_d_4423_5023)">
5
+ <path d="M151.616 77.7472C143.487 75.3147 129.532 67.2694 123.571 63.5508L123.368 189.69C126.349 189.149 136.537 184.539 153.445 170.424C170.353 156.309 176.206 134.799 177.019 125.809L176.816 83.6268C171.803 82.6805 159.745 80.1796 151.616 77.7472Z" fill="#555F77"/>
6
+ <path d="M96.1878 77.7472C104.242 75.3147 118.068 67.2694 123.974 63.5508L124.175 189.69C121.222 189.149 111.128 184.539 94.3755 170.424C77.6232 156.309 71.8244 134.799 71.019 125.809L71.2203 83.6268C76.1869 82.6805 88.1337 80.1796 96.1878 77.7472Z" fill="#3D465C"/>
7
+ <path d="M124.019 94.9648C132.01 94.9649 138.488 101.443 138.488 109.434V120.395C142.927 124.368 145.722 130.142 145.722 136.569C145.722 148.555 136.005 158.272 124.019 158.272C112.033 158.272 102.316 148.555 102.316 136.569C102.316 130.142 105.111 124.368 109.55 120.395V109.434C109.55 101.443 116.028 94.9648 124.019 94.9648ZM124.019 125.715C120.595 125.715 117.818 128.492 117.818 131.916C117.818 134.21 119.066 136.212 120.918 137.284V144.319C120.919 146.031 122.307 147.42 124.019 147.42C125.731 147.42 127.118 146.031 127.119 144.319V137.284C128.971 136.212 130.219 134.211 130.219 131.916C130.219 128.492 127.443 125.715 124.019 125.715ZM124.019 100.391C119.025 100.391 114.976 104.439 114.976 109.434V116.836C117.729 115.572 120.792 114.867 124.019 114.867C127.246 114.867 130.309 115.572 133.062 116.836V109.434C133.062 104.439 129.013 100.391 124.019 100.391Z" fill="#AAB2C5"/>
8
+ </g>
9
+ </g>
10
+ <defs>
11
+ <filter id="filter0_d_4423_5023" x="7.01904" y="31.5508" width="234" height="254.141" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
12
+ <feFlood flood-opacity="0" result="BackgroundImageFix"/>
13
+ <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
14
+ <feOffset dy="32"/>
15
+ <feGaussianBlur stdDeviation="32"/>
16
+ <feColorMatrix type="matrix" values="0 0 0 0 0.231373 0 0 0 0 0.282353 0 0 0 0 0.360784 0 0 0 0.24 0"/>
17
+ <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_4423_5023"/>
18
+ <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_4423_5023" result="shape"/>
19
+ </filter>
20
+ <clipPath id="clip0_4423_5023">
21
+ <rect x="31.019" y="31.5" width="186" height="186" rx="93" fill="white"/>
22
+ </clipPath>
23
+ </defs>
24
+ </svg>
@@ -0,0 +1,24 @@
1
+ <svg width="249" height="249" viewBox="0 0 249 249" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <circle cx="124.438" cy="124.5" r="93" fill="#94A8E1" fill-opacity="0.2"/>
3
+ <g clip-path="url(#clip0_4423_5036)">
4
+ <g filter="url(#filter0_d_4423_5036)">
5
+ <path d="M152.035 77.7472C143.906 75.3147 129.951 67.2694 123.99 63.5508L123.787 189.69C126.768 189.149 136.956 184.539 153.864 170.424C170.772 156.309 176.625 134.799 177.438 125.809L177.235 83.6268C172.222 82.6805 160.164 80.1796 152.035 77.7472Z" fill="#F8F9FC"/>
6
+ <path d="M96.6067 77.7472C104.661 75.3147 118.487 67.2694 124.393 63.5508L124.594 189.69C121.641 189.149 111.547 184.539 94.7945 170.424C78.0422 156.309 72.2433 134.799 71.4379 125.809L71.6393 83.6268C76.6059 82.6805 88.5527 80.1796 96.6067 77.7472Z" fill="#D6DCE8"/>
7
+ <path d="M124.438 94.9648C132.429 94.9649 138.907 101.443 138.907 109.434V120.395C143.346 124.368 146.141 130.142 146.141 136.569C146.141 148.555 136.424 158.272 124.438 158.272C112.452 158.272 102.735 148.555 102.735 136.569C102.735 130.142 105.53 124.368 109.969 120.395V109.434C109.969 101.443 116.447 94.9648 124.438 94.9648ZM124.438 125.715C121.014 125.715 118.237 128.492 118.237 131.916C118.237 134.21 119.485 136.212 121.337 137.284V144.319C121.338 146.031 122.726 147.42 124.438 147.42C126.15 147.42 127.537 146.031 127.538 144.319V137.284C129.39 136.212 130.638 134.211 130.638 131.916C130.638 128.492 127.862 125.715 124.438 125.715ZM124.438 100.391C119.444 100.391 115.395 104.439 115.395 109.434V116.836C118.148 115.572 121.211 114.867 124.438 114.867C127.665 114.867 130.728 115.572 133.481 116.836V109.434C133.481 104.439 129.432 100.391 124.438 100.391Z" fill="#8591AE"/>
8
+ </g>
9
+ </g>
10
+ <defs>
11
+ <filter id="filter0_d_4423_5036" x="7.43799" y="31.5508" width="234" height="254.141" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
12
+ <feFlood flood-opacity="0" result="BackgroundImageFix"/>
13
+ <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
14
+ <feOffset dy="32"/>
15
+ <feGaussianBlur stdDeviation="32"/>
16
+ <feColorMatrix type="matrix" values="0 0 0 0 0.231373 0 0 0 0 0.282353 0 0 0 0 0.360784 0 0 0 0.24 0"/>
17
+ <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_4423_5036"/>
18
+ <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_4423_5036" result="shape"/>
19
+ </filter>
20
+ <clipPath id="clip0_4423_5036">
21
+ <rect x="31.438" y="31.5" width="186" height="186" rx="93" fill="white"/>
22
+ </clipPath>
23
+ </defs>
24
+ </svg>