submit form.
| @@ -9,9 +9,11 @@ | ||||
|     "start": "node __sapper__/build" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "body-parser": "^1.19.0", | ||||
|     "compression": "^1.7.1", | ||||
|     "date-fns": "^2.16.1", | ||||
|     "dompurify": "^2.2.2", | ||||
|     "form-data": "^3.0.0", | ||||
|     "isomorphic-fetch": "^3.0.0", | ||||
|     "jsdom": "^16.4.0", | ||||
|     "lodash": "^4.17.20", | ||||
|   | ||||
| @@ -6,11 +6,16 @@ | ||||
|   const { page } = stores(); | ||||
|  | ||||
|   let search; | ||||
|   let isSearching; | ||||
|  | ||||
|   let handleSearch = debounce(_handleSearch, 300, { | ||||
|   let __handleSearch = debounce(_handleSearch, 300, { | ||||
|     trailing: true, | ||||
|     leading: false, | ||||
|   }); | ||||
|   let handleSearch = (e) => { | ||||
|     isSearching = true; | ||||
|     __handleSearch(e); | ||||
|   }; | ||||
|  | ||||
|   page.subscribe((page) => { | ||||
|     setTimeout(() => { | ||||
| @@ -24,6 +29,7 @@ | ||||
|     const url = `/search?q=${event.target.value}`; | ||||
|     await prefetch(url); | ||||
|     await goto(url); | ||||
|     isSearching = false; | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| @@ -57,6 +63,12 @@ | ||||
|     flex-direction: row; | ||||
|     justify-content: space-between; | ||||
|   } | ||||
|  | ||||
|   /* @media (max-device-width: 480px) { | ||||
|     .navigation-container { | ||||
|       justify-content: space-evenly; | ||||
|     } | ||||
|   } */ | ||||
|   .navigation-container > * { | ||||
|     vertical-align: middle; | ||||
|   } | ||||
| @@ -77,29 +89,61 @@ | ||||
|   } | ||||
|   .navigation-input { | ||||
|     line-height: 2; | ||||
|     margin: 1em; | ||||
|     vertical-align: middle; | ||||
|     width: 20rem; | ||||
|     max-width: 50vw; | ||||
|     width: 30rem; | ||||
|     max-width: 45vw; | ||||
|     font-size: 1.1rem; | ||||
|     padding: 0.25em 0.5em; | ||||
|     margin: 0.25em 0.5em; | ||||
|     border-radius: 5px; | ||||
|     border: solid 1px #aaa; | ||||
|   } | ||||
|   input:focus { | ||||
|     box-shadow: 0 0 0.25rem rgba(0, 0, 0, 0.25); | ||||
|   } | ||||
|  | ||||
|   .is-searching { | ||||
|     padding-right: 0.5rem; | ||||
|     background-image: url(/svg-loaders/black/grid.svg); | ||||
|     background-size: 1.2em 1.2em; | ||||
|     background-position: right 0.5em center; | ||||
|     background-repeat: no-repeat; | ||||
|   } | ||||
| </style> | ||||
|  | ||||
| <svelte:head> | ||||
|   <link rel="preload" href="/svg-loaders/black/grid.svg" as="image" /> | ||||
| </svelte:head> | ||||
|  | ||||
| <nav class="navigation"> | ||||
|   <div class="navigation-container"> | ||||
|     <ul class="navigation-list" role="menubar"> | ||||
|     <ul class="navigation-list" role="menu"> | ||||
|       <li class="navigation-item"> | ||||
|         <a | ||||
|           class="navigation-link" | ||||
|           aria-current={segment === undefined ? 'page' : undefined} | ||||
|           rel="prefetch" | ||||
|           href="."> | ||||
|           {#if segment === undefined}Qot.{:else}← News feed{/if} | ||||
|           {#if [undefined, 'submit'].includes(segment)} | ||||
|             Qot. news | ||||
|           {:else}← News feed{/if} | ||||
|         </a> | ||||
|       </li> | ||||
|       {#if [undefined, 'submit'].includes(segment)} | ||||
|         <li class="navigation-item"> | ||||
|           <a | ||||
|             class="navigation-link" | ||||
|             aria-current={segment === 'submit' ? 'page' : undefined} | ||||
|             rel="prefetch" | ||||
|             href="/submit"> | ||||
|             Submit | ||||
|           </a> | ||||
|         </li> | ||||
|       {/if} | ||||
|     </ul> | ||||
|     <form action="/search" method="GET" rel="prefetch" role="search"> | ||||
|       <input | ||||
|         class="navigation-input" | ||||
|         class="navigation-input {(isSearching && 'is-searching') || ''}" | ||||
|         id="search" | ||||
|         bind:this={search} | ||||
|         type="text" | ||||
|   | ||||
| @@ -37,6 +37,14 @@ | ||||
|     flex-direction: row; | ||||
|     justify-content: space-between; | ||||
|   } | ||||
|  | ||||
|   .pagination-link { | ||||
|     font-size: 1.5rem; | ||||
|     text-decoration: none; | ||||
|   } | ||||
|   .pagination-link:hover { | ||||
|     text-decoration: underline; | ||||
|   } | ||||
|   .pagination-link.is-next { | ||||
|     margin-left: auto; | ||||
|   } | ||||
| @@ -44,12 +52,11 @@ | ||||
|  | ||||
| <div class="pagination"> | ||||
|   {#if skip > 0} | ||||
|     <a | ||||
|       class="pagination-link is-prev" | ||||
|       href={prevLink} | ||||
|       rel="prefetch">Previous</a> | ||||
|     <a class="pagination-link is-prev" href={prevLink} rel="prefetch">← | ||||
|       Previous</a> | ||||
|   {/if} | ||||
|   {#if count >= limit} | ||||
|     <a class="pagination-link is-next" href={nextLink} rel="prefetch">Next</a> | ||||
|     <a class="pagination-link is-next" href={nextLink} rel="prefetch">Next | ||||
|       →</a> | ||||
|   {/if} | ||||
| </div> | ||||
|   | ||||
							
								
								
									
										12
									
								
								webapp/src/routes/submit.json.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,12 @@ | ||||
| import FormData from 'form-data'; | ||||
| import fetch from 'isomorphic-fetch'; | ||||
|  | ||||
| const API_URL = process.env.API_URL || 'http://localhost:33842'; | ||||
|  | ||||
| export async function post(req, res) { | ||||
| 	const data = new FormData(); | ||||
| 	data.append('url', req.body.url); | ||||
| 	const response = await fetch(`${API_URL}/api/submit`, { method: "POST", body: data }); | ||||
| 	res.writeHead(response.status, { 'Content-Type': 'application/json' }); | ||||
| 	res.end(await response.text()); | ||||
| } | ||||
							
								
								
									
										143
									
								
								webapp/src/routes/submit.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,143 @@ | ||||
| <script> | ||||
|   import { onMount } from "svelte"; | ||||
|   import { goto, prefetch } from "@sapper/app"; | ||||
|  | ||||
|   let input; | ||||
|   let handleSubmit; | ||||
|   let hasError; | ||||
|   let isLoading; | ||||
|  | ||||
|   onMount(() => { | ||||
|     setTimeout(() => { | ||||
|       input && input.focus(); | ||||
|     }, 0); | ||||
|     handleSubmit = async () => { | ||||
|       isLoading = true; | ||||
|       hasError = false; | ||||
|       const url = input.value; | ||||
|       const response = await fetch(`submit.json`, { | ||||
|         headers: { "Content-Type": "application/json" }, | ||||
|         method: "POST", | ||||
|         body: JSON.stringify({ url }), | ||||
|       }); | ||||
|       if (!response.ok) { | ||||
|         hasError = true; | ||||
|         isLoading = false; | ||||
|         return; | ||||
|       } | ||||
|       const { nid } = await response.json(); | ||||
|       await prefetch(`/${nid}`); | ||||
|       await goto(`/${nid}`); | ||||
|     }; | ||||
|   }); | ||||
| </script> | ||||
|  | ||||
| <style> | ||||
|   section { | ||||
|     max-width: 45rem; | ||||
|     margin: 5rem auto 0; | ||||
|   } | ||||
|   form { | ||||
|     text-align: center; | ||||
|     width: 95%; | ||||
|     border: solid 1px #aaa; | ||||
|     margin: 3.5rem auto; | ||||
|     border-radius: 5px; | ||||
|     overflow: hidden; | ||||
|  | ||||
|     display: flex; | ||||
|     flex-direction: row; | ||||
|   } | ||||
|  | ||||
|   form:focus-within { | ||||
|     box-shadow: 0 0 0.25rem rgba(0, 0, 0, 0.25); | ||||
|   } | ||||
|  | ||||
|   input { | ||||
|     width: 85%; | ||||
|     box-sizing: border-box; | ||||
|     padding: 0.5rem; | ||||
|     margin: 0; | ||||
|     font-size: 1.25rem; | ||||
|     line-height: 1.5; | ||||
|     border: none; | ||||
|     border-radius: 0; | ||||
|     background: #fff; | ||||
|     vertical-align: middle; | ||||
|   } | ||||
|  | ||||
|   form:has(input:focus) { | ||||
|     box-shadow: inset 0 0 0.2rem rgba(0, 0, 0, 0.2); | ||||
|   } | ||||
|  | ||||
|   button { | ||||
|     width: 15%; | ||||
|     box-sizing: border-box; | ||||
|     padding: 0.5rem; | ||||
|     margin: 0; | ||||
|     font-size: 1.25rem; | ||||
|     line-height: 1.5; | ||||
|     border: none; | ||||
|     border-left: solid 1px #aaa; | ||||
|     border-radius: 0; | ||||
|     background: #f1f1f1; | ||||
|     vertical-align: middle; | ||||
|   } | ||||
|  | ||||
|   .loading, | ||||
|   .is-loading form, | ||||
|   .is-loading .error { | ||||
|     display: none; | ||||
|   } | ||||
|  | ||||
|   .is-loading .loading { | ||||
|     display: block; | ||||
|     margin: 3.5rem auto 0; | ||||
|   } | ||||
|  | ||||
|   .error { | ||||
|     display: none; | ||||
|   } | ||||
|  | ||||
|   .has-error .error { | ||||
|     box-sizing: border-box; | ||||
|     height: 3rem; | ||||
|     padding: 0; | ||||
|     margin: 0; | ||||
|     color: darkred; | ||||
|     display: block; | ||||
|   } | ||||
|   .has-error form { | ||||
|     margin-top: 5rem; | ||||
|   } | ||||
| </style> | ||||
|  | ||||
| <svelte:head> | ||||
|   <title>QotNews</title> | ||||
|   <meta property="og:title" content="QotNews" /> | ||||
|   <meta property="og:type" content="website" /> | ||||
|   <link rel="preload" href="/loading.svg" as="image" /> | ||||
| </svelte:head> | ||||
|  | ||||
| <section class="{isLoading ? 'is-loading' : ''} {hasError ? 'has-error' : ''}"> | ||||
|   <img | ||||
|     class="loading" | ||||
|     src="/loading.svg" | ||||
|     alt="loading..." | ||||
|     width="200" | ||||
|     height="200" /> | ||||
|  | ||||
|   <form on:submit|preventDefault={handleSubmit} autocomplete="off"> | ||||
|     <input | ||||
|       type="text" | ||||
|       name="url" | ||||
|       placeholder="Enter article link" | ||||
|       pattern="^https?:\/\/(www\.)?.*" | ||||
|       value="" | ||||
|       bind:this={input} | ||||
|       required /> | ||||
|     <button type="submit">Go</button> | ||||
|   </form> | ||||
|  | ||||
|   <p class="error">Something went wrong.</p> | ||||
| </section> | ||||
| @@ -2,12 +2,14 @@ import sirv from 'sirv'; | ||||
| import polka from 'polka'; | ||||
| import compression from 'compression'; | ||||
| import * as sapper from '@sapper/server'; | ||||
| import { json } from 'body-parser'; | ||||
|  | ||||
| const { PORT, NODE_ENV } = process.env; | ||||
| const dev = NODE_ENV === 'development'; | ||||
|  | ||||
| polka() // You can also use Express | ||||
| 	.use( | ||||
| 		json(), | ||||
| 		compression({ threshold: 0 }), | ||||
| 		sirv('static', { dev }), | ||||
| 		sapper.middleware(), | ||||
|   | ||||
							
								
								
									
										9
									
								
								webapp/static/loading.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,9 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <svg class="lds-double-ring" width="200px" height="200px" style="background:rgba(0, 0, 0, 0) none repeat scroll 0% 0%" preserveAspectRatio="xMidYMid" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"> | ||||
| <circle cx="50" cy="50" r="45" fill="none" stroke="#000" stroke-dasharray="70.68583470577035 70.68583470577035" stroke-linecap="round" stroke-width="3" ng-attr-r="{{config.radius}}" ng-attr-stroke="{{config.c1}}" ng-attr-stroke-dasharray="{{config.dasharray}}" ng-attr-stroke-width="{{config.width}}"> | ||||
| <animateTransform attributeName="transform" begin="0s" calcMode="linear" dur="3.6s" keyTimes="0;1" repeatCount="indefinite" type="rotate" values="0 50 50;360 50 50"/> | ||||
| </circle> | ||||
| <circle cx="50" cy="50" r="41" fill="none" stroke="#000" stroke-dasharray="64.40264939859075 64.40264939859075" stroke-dashoffset="64.403" stroke-linecap="round" stroke-width="3" ng-attr-r="{{config.radius2}}" ng-attr-stroke="{{config.c2}}" ng-attr-stroke-dasharray="{{config.dasharray2}}" ng-attr-stroke-dashoffset="{{config.dashoffset2}}" ng-attr-stroke-width="{{config.width}}"> | ||||
| <animateTransform attributeName="transform" begin="0s" calcMode="linear" dur="3.6s" keyTimes="0;1" repeatCount="indefinite" type="rotate" values="0 50 50;-360 50 50"/> | ||||
| </circle> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										21
									
								
								webapp/static/svg-loaders/LICENSE.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,21 @@ | ||||
| The MIT License (MIT) | ||||
|  | ||||
| Copyright (c) 2014 Sam Herbert | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
| in the Software without restriction, including without limitation the rights | ||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| copies of the Software, and to permit persons to whom the Software is | ||||
| furnished to do so, subject to the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE. | ||||
							
								
								
									
										29
									
								
								webapp/static/svg-loaders/audio.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,29 @@ | ||||
| <!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL --> | ||||
| <svg width="55" height="80" viewBox="0 0 55 80" xmlns="http://www.w3.org/2000/svg" fill="#FFF"> | ||||
|     <g transform="matrix(1 0 0 -1 0 80)"> | ||||
|         <rect width="10" height="20" rx="3"> | ||||
|             <animate attributeName="height" | ||||
|                  begin="0s" dur="4.3s" | ||||
|                  values="20;45;57;80;64;32;66;45;64;23;66;13;64;56;34;34;2;23;76;79;20" calcMode="linear" | ||||
|                  repeatCount="indefinite" /> | ||||
|         </rect> | ||||
|         <rect x="15" width="10" height="80" rx="3"> | ||||
|             <animate attributeName="height" | ||||
|                  begin="0s" dur="2s" | ||||
|                  values="80;55;33;5;75;23;73;33;12;14;60;80" calcMode="linear" | ||||
|                  repeatCount="indefinite" /> | ||||
|         </rect> | ||||
|         <rect x="30" width="10" height="50" rx="3"> | ||||
|             <animate attributeName="height" | ||||
|                  begin="0s" dur="1.4s" | ||||
|                  values="50;34;78;23;56;23;34;76;80;54;21;50" calcMode="linear" | ||||
|                  repeatCount="indefinite" /> | ||||
|         </rect> | ||||
|         <rect x="45" width="10" height="30" rx="3"> | ||||
|             <animate attributeName="height" | ||||
|                  begin="0s" dur="2s" | ||||
|                  values="30;45;13;80;56;72;45;76;34;23;67;30" calcMode="linear" | ||||
|                  repeatCount="indefinite" /> | ||||
|         </rect> | ||||
|     </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										47
									
								
								webapp/static/svg-loaders/ball-triangle.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,47 @@ | ||||
| <!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL --> | ||||
| <!-- Todo: add easing --> | ||||
| <svg width="57" height="57" viewBox="0 0 57 57" xmlns="http://www.w3.org/2000/svg" stroke="#fff"> | ||||
|     <g fill="none" fill-rule="evenodd"> | ||||
|         <g transform="translate(1 1)" stroke-width="2"> | ||||
|             <circle cx="5" cy="50" r="5"> | ||||
|                 <animate attributeName="cy" | ||||
|                      begin="0s" dur="2.2s" | ||||
|                      values="50;5;50;50" | ||||
|                      calcMode="linear" | ||||
|                      repeatCount="indefinite" /> | ||||
|                 <animate attributeName="cx" | ||||
|                      begin="0s" dur="2.2s" | ||||
|                      values="5;27;49;5" | ||||
|                      calcMode="linear" | ||||
|                      repeatCount="indefinite" /> | ||||
|             </circle> | ||||
|             <circle cx="27" cy="5" r="5"> | ||||
|                 <animate attributeName="cy" | ||||
|                      begin="0s" dur="2.2s" | ||||
|                      from="5" to="5" | ||||
|                      values="5;50;50;5" | ||||
|                      calcMode="linear" | ||||
|                      repeatCount="indefinite" /> | ||||
|                 <animate attributeName="cx" | ||||
|                      begin="0s" dur="2.2s" | ||||
|                      from="27" to="27" | ||||
|                      values="27;49;5;27" | ||||
|                      calcMode="linear" | ||||
|                      repeatCount="indefinite" /> | ||||
|             </circle> | ||||
|             <circle cx="49" cy="50" r="5"> | ||||
|                 <animate attributeName="cy" | ||||
|                      begin="0s" dur="2.2s" | ||||
|                      values="50;50;5;50" | ||||
|                      calcMode="linear" | ||||
|                      repeatCount="indefinite" /> | ||||
|                 <animate attributeName="cx" | ||||
|                      from="49" to="49" | ||||
|                      begin="0s" dur="2.2s" | ||||
|                      values="49;5;27;49" | ||||
|                      calcMode="linear" | ||||
|                      repeatCount="indefinite" /> | ||||
|             </circle> | ||||
|         </g> | ||||
|     </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										52
									
								
								webapp/static/svg-loaders/bars.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,52 @@ | ||||
| <svg width="135" height="140" viewBox="0 0 135 140" xmlns="http://www.w3.org/2000/svg" fill="#fff"> | ||||
|     <rect y="10" width="15" height="120" rx="6"> | ||||
|         <animate attributeName="height" | ||||
|              begin="0.5s" dur="1s" | ||||
|              values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear" | ||||
|              repeatCount="indefinite" /> | ||||
|         <animate attributeName="y" | ||||
|              begin="0.5s" dur="1s" | ||||
|              values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear" | ||||
|              repeatCount="indefinite" /> | ||||
|     </rect> | ||||
|     <rect x="30" y="10" width="15" height="120" rx="6"> | ||||
|         <animate attributeName="height" | ||||
|              begin="0.25s" dur="1s" | ||||
|              values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear" | ||||
|              repeatCount="indefinite" /> | ||||
|         <animate attributeName="y" | ||||
|              begin="0.25s" dur="1s" | ||||
|              values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear" | ||||
|              repeatCount="indefinite" /> | ||||
|     </rect> | ||||
|     <rect x="60" width="15" height="140" rx="6"> | ||||
|         <animate attributeName="height" | ||||
|              begin="0s" dur="1s" | ||||
|              values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear" | ||||
|              repeatCount="indefinite" /> | ||||
|         <animate attributeName="y" | ||||
|              begin="0s" dur="1s" | ||||
|              values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear" | ||||
|              repeatCount="indefinite" /> | ||||
|     </rect> | ||||
|     <rect x="90" y="10" width="15" height="120" rx="6"> | ||||
|         <animate attributeName="height" | ||||
|              begin="0.25s" dur="1s" | ||||
|              values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear" | ||||
|              repeatCount="indefinite" /> | ||||
|         <animate attributeName="y" | ||||
|              begin="0.25s" dur="1s" | ||||
|              values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear" | ||||
|              repeatCount="indefinite" /> | ||||
|     </rect> | ||||
|     <rect x="120" y="10" width="15" height="120" rx="6"> | ||||
|         <animate attributeName="height" | ||||
|              begin="0.5s" dur="1s" | ||||
|              values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear" | ||||
|              repeatCount="indefinite" /> | ||||
|         <animate attributeName="y" | ||||
|              begin="0.5s" dur="1s" | ||||
|              values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear" | ||||
|              repeatCount="indefinite" /> | ||||
|     </rect> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.3 KiB | 
							
								
								
									
										56
									
								
								webapp/static/svg-loaders/black/grid.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,56 @@ | ||||
| <svg width="105" height="105" viewBox="0 0 105 105" xmlns="http://www.w3.org/2000/svg" fill="#000"> | ||||
|     <circle cx="12.5" cy="12.5" r="12.5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|          begin="0s" dur="1s" | ||||
|          values="1;.2;1" calcMode="linear" | ||||
|          repeatCount="indefinite" /> | ||||
|     </circle> | ||||
|     <circle cx="12.5" cy="52.5" r="12.5" fill-opacity=".5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|          begin="100ms" dur="1s" | ||||
|          values="1;.2;1" calcMode="linear" | ||||
|          repeatCount="indefinite" /> | ||||
|     </circle> | ||||
|     <circle cx="52.5" cy="12.5" r="12.5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|          begin="300ms" dur="1s" | ||||
|          values="1;.2;1" calcMode="linear" | ||||
|          repeatCount="indefinite" /> | ||||
|     </circle> | ||||
|     <circle cx="52.5" cy="52.5" r="12.5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|          begin="600ms" dur="1s" | ||||
|          values="1;.2;1" calcMode="linear" | ||||
|          repeatCount="indefinite" /> | ||||
|     </circle> | ||||
|     <circle cx="92.5" cy="12.5" r="12.5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|          begin="800ms" dur="1s" | ||||
|          values="1;.2;1" calcMode="linear" | ||||
|          repeatCount="indefinite" /> | ||||
|     </circle> | ||||
|     <circle cx="92.5" cy="52.5" r="12.5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|          begin="400ms" dur="1s" | ||||
|          values="1;.2;1" calcMode="linear" | ||||
|          repeatCount="indefinite" /> | ||||
|     </circle> | ||||
|     <circle cx="12.5" cy="92.5" r="12.5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|          begin="700ms" dur="1s" | ||||
|          values="1;.2;1" calcMode="linear" | ||||
|          repeatCount="indefinite" /> | ||||
|     </circle> | ||||
|     <circle cx="52.5" cy="92.5" r="12.5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|          begin="500ms" dur="1s" | ||||
|          values="1;.2;1" calcMode="linear" | ||||
|          repeatCount="indefinite" /> | ||||
|     </circle> | ||||
|     <circle cx="92.5" cy="92.5" r="12.5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|          begin="200ms" dur="1s" | ||||
|          values="1;.2;1" calcMode="linear" | ||||
|          repeatCount="indefinite" /> | ||||
|     </circle> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.0 KiB | 
							
								
								
									
										20
									
								
								webapp/static/svg-loaders/circles.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,20 @@ | ||||
| <svg width="135" height="135" viewBox="0 0 135 135" xmlns="http://www.w3.org/2000/svg" fill="#fff"> | ||||
|     <path d="M67.447 58c5.523 0 10-4.477 10-10s-4.477-10-10-10-10 4.477-10 10 4.477 10 10 10zm9.448 9.447c0 5.523 4.477 10 10 10 5.522 0 10-4.477 10-10s-4.478-10-10-10c-5.523 0-10 4.477-10 10zm-9.448 9.448c-5.523 0-10 4.477-10 10 0 5.522 4.477 10 10 10s10-4.478 10-10c0-5.523-4.477-10-10-10zM58 67.447c0-5.523-4.477-10-10-10s-10 4.477-10 10 4.477 10 10 10 10-4.477 10-10z"> | ||||
|         <animateTransform | ||||
|             attributeName="transform" | ||||
|             type="rotate" | ||||
|             from="0 67 67" | ||||
|             to="-360 67 67" | ||||
|             dur="2.5s" | ||||
|             repeatCount="indefinite"/> | ||||
|     </path> | ||||
|     <path d="M28.19 40.31c6.627 0 12-5.374 12-12 0-6.628-5.373-12-12-12-6.628 0-12 5.372-12 12 0 6.626 5.372 12 12 12zm30.72-19.825c4.686 4.687 12.284 4.687 16.97 0 4.686-4.686 4.686-12.284 0-16.97-4.686-4.687-12.284-4.687-16.97 0-4.687 4.686-4.687 12.284 0 16.97zm35.74 7.705c0 6.627 5.37 12 12 12 6.626 0 12-5.373 12-12 0-6.628-5.374-12-12-12-6.63 0-12 5.372-12 12zm19.822 30.72c-4.686 4.686-4.686 12.284 0 16.97 4.687 4.686 12.285 4.686 16.97 0 4.687-4.686 4.687-12.284 0-16.97-4.685-4.687-12.283-4.687-16.97 0zm-7.704 35.74c-6.627 0-12 5.37-12 12 0 6.626 5.373 12 12 12s12-5.374 12-12c0-6.63-5.373-12-12-12zm-30.72 19.822c-4.686-4.686-12.284-4.686-16.97 0-4.686 4.687-4.686 12.285 0 16.97 4.686 4.687 12.284 4.687 16.97 0 4.687-4.685 4.687-12.283 0-16.97zm-35.74-7.704c0-6.627-5.372-12-12-12-6.626 0-12 5.373-12 12s5.374 12 12 12c6.628 0 12-5.373 12-12zm-19.823-30.72c4.687-4.686 4.687-12.284 0-16.97-4.686-4.686-12.284-4.686-16.97 0-4.687 4.686-4.687 12.284 0 16.97 4.686 4.687 12.284 4.687 16.97 0z"> | ||||
|         <animateTransform | ||||
|             attributeName="transform" | ||||
|             type="rotate" | ||||
|             from="0 67 67" | ||||
|             to="360 67 67" | ||||
|             dur="8s" | ||||
|             repeatCount="indefinite"/> | ||||
|     </path> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										56
									
								
								webapp/static/svg-loaders/grid.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,56 @@ | ||||
| <svg width="105" height="105" viewBox="0 0 105 105" xmlns="http://www.w3.org/2000/svg" fill="#fff"> | ||||
|     <circle cx="12.5" cy="12.5" r="12.5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|          begin="0s" dur="1s" | ||||
|          values="1;.2;1" calcMode="linear" | ||||
|          repeatCount="indefinite" /> | ||||
|     </circle> | ||||
|     <circle cx="12.5" cy="52.5" r="12.5" fill-opacity=".5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|          begin="100ms" dur="1s" | ||||
|          values="1;.2;1" calcMode="linear" | ||||
|          repeatCount="indefinite" /> | ||||
|     </circle> | ||||
|     <circle cx="52.5" cy="12.5" r="12.5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|          begin="300ms" dur="1s" | ||||
|          values="1;.2;1" calcMode="linear" | ||||
|          repeatCount="indefinite" /> | ||||
|     </circle> | ||||
|     <circle cx="52.5" cy="52.5" r="12.5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|          begin="600ms" dur="1s" | ||||
|          values="1;.2;1" calcMode="linear" | ||||
|          repeatCount="indefinite" /> | ||||
|     </circle> | ||||
|     <circle cx="92.5" cy="12.5" r="12.5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|          begin="800ms" dur="1s" | ||||
|          values="1;.2;1" calcMode="linear" | ||||
|          repeatCount="indefinite" /> | ||||
|     </circle> | ||||
|     <circle cx="92.5" cy="52.5" r="12.5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|          begin="400ms" dur="1s" | ||||
|          values="1;.2;1" calcMode="linear" | ||||
|          repeatCount="indefinite" /> | ||||
|     </circle> | ||||
|     <circle cx="12.5" cy="92.5" r="12.5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|          begin="700ms" dur="1s" | ||||
|          values="1;.2;1" calcMode="linear" | ||||
|          repeatCount="indefinite" /> | ||||
|     </circle> | ||||
|     <circle cx="52.5" cy="92.5" r="12.5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|          begin="500ms" dur="1s" | ||||
|          values="1;.2;1" calcMode="linear" | ||||
|          repeatCount="indefinite" /> | ||||
|     </circle> | ||||
|     <circle cx="92.5" cy="92.5" r="12.5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|          begin="200ms" dur="1s" | ||||
|          values="1;.2;1" calcMode="linear" | ||||
|          repeatCount="indefinite" /> | ||||
|     </circle> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.0 KiB | 
							
								
								
									
										18
									
								
								webapp/static/svg-loaders/hearts.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,18 @@ | ||||
| <!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL --> | ||||
| <svg width="140" height="64" viewBox="0 0 140 64" xmlns="http://www.w3.org/2000/svg" fill="#fff"> | ||||
|     <path d="M30.262 57.02L7.195 40.723c-5.84-3.976-7.56-12.06-3.842-18.063 3.715-6 11.467-7.65 17.306-3.68l4.52 3.76 2.6-5.274c3.717-6.002 11.47-7.65 17.305-3.68 5.84 3.97 7.56 12.054 3.842 18.062L34.49 56.118c-.897 1.512-2.793 1.915-4.228.9z" fill-opacity=".5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|              begin="0s" dur="1.4s" | ||||
|              values="0.5;1;0.5" | ||||
|              calcMode="linear" | ||||
|              repeatCount="indefinite" /> | ||||
|     </path> | ||||
|     <path d="M105.512 56.12l-14.44-24.272c-3.716-6.008-1.996-14.093 3.843-18.062 5.835-3.97 13.588-2.322 17.306 3.68l2.6 5.274 4.52-3.76c5.84-3.97 13.592-2.32 17.307 3.68 3.718 6.003 1.998 14.088-3.842 18.064L109.74 57.02c-1.434 1.014-3.33.61-4.228-.9z" fill-opacity=".5"> | ||||
|         <animate attributeName="fill-opacity" | ||||
|              begin="0.7s" dur="1.4s" | ||||
|              values="0.5;1;0.5" | ||||
|              calcMode="linear" | ||||
|              repeatCount="indefinite" /> | ||||
|     </path> | ||||
|     <path d="M67.408 57.834l-23.01-24.98c-5.864-6.15-5.864-16.108 0-22.248 5.86-6.14 15.37-6.14 21.234 0L70 16.168l4.368-5.562c5.863-6.14 15.375-6.14 21.235 0 5.863 6.14 5.863 16.098 0 22.247l-23.007 24.98c-1.43 1.556-3.757 1.556-5.188 0z" /> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										17
									
								
								webapp/static/svg-loaders/oval.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,17 @@ | ||||
| <!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL --> | ||||
| <svg width="38" height="38" viewBox="0 0 38 38" xmlns="http://www.w3.org/2000/svg" stroke="#fff"> | ||||
|     <g fill="none" fill-rule="evenodd"> | ||||
|         <g transform="translate(1 1)" stroke-width="2"> | ||||
|             <circle stroke-opacity=".5" cx="18" cy="18" r="18"/> | ||||
|             <path d="M36 18c0-9.94-8.06-18-18-18"> | ||||
|                 <animateTransform | ||||
|                     attributeName="transform" | ||||
|                     type="rotate" | ||||
|                     from="0 18 18" | ||||
|                     to="360 18 18" | ||||
|                     dur="1s" | ||||
|                     repeatCount="indefinite"/> | ||||
|             </path> | ||||
|         </g> | ||||
|     </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 694 B | 
							
								
								
									
										37
									
								
								webapp/static/svg-loaders/puff.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,37 @@ | ||||
| <!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL --> | ||||
| <svg width="44" height="44" viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg" stroke="#fff"> | ||||
|     <g fill="none" fill-rule="evenodd" stroke-width="2"> | ||||
|         <circle cx="22" cy="22" r="1"> | ||||
|             <animate attributeName="r" | ||||
|                 begin="0s" dur="1.8s" | ||||
|                 values="1; 20" | ||||
|                 calcMode="spline" | ||||
|                 keyTimes="0; 1" | ||||
|                 keySplines="0.165, 0.84, 0.44, 1" | ||||
|                 repeatCount="indefinite" /> | ||||
|             <animate attributeName="stroke-opacity" | ||||
|                 begin="0s" dur="1.8s" | ||||
|                 values="1; 0" | ||||
|                 calcMode="spline" | ||||
|                 keyTimes="0; 1" | ||||
|                 keySplines="0.3, 0.61, 0.355, 1" | ||||
|                 repeatCount="indefinite" /> | ||||
|         </circle> | ||||
|         <circle cx="22" cy="22" r="1"> | ||||
|             <animate attributeName="r" | ||||
|                 begin="-0.9s" dur="1.8s" | ||||
|                 values="1; 20" | ||||
|                 calcMode="spline" | ||||
|                 keyTimes="0; 1" | ||||
|                 keySplines="0.165, 0.84, 0.44, 1" | ||||
|                 repeatCount="indefinite" /> | ||||
|             <animate attributeName="stroke-opacity" | ||||
|                 begin="-0.9s" dur="1.8s" | ||||
|                 values="1; 0" | ||||
|                 calcMode="spline" | ||||
|                 keyTimes="0; 1" | ||||
|                 keySplines="0.3, 0.61, 0.355, 1" | ||||
|                 repeatCount="indefinite" /> | ||||
|         </circle> | ||||
|     </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.4 KiB | 
							
								
								
									
										42
									
								
								webapp/static/svg-loaders/rings.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,42 @@ | ||||
| <!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL --> | ||||
| <svg width="45" height="45" viewBox="0 0 45 45" xmlns="http://www.w3.org/2000/svg" stroke="#fff"> | ||||
|     <g fill="none" fill-rule="evenodd" transform="translate(1 1)" stroke-width="2"> | ||||
|         <circle cx="22" cy="22" r="6" stroke-opacity="0"> | ||||
|             <animate attributeName="r" | ||||
|                  begin="1.5s" dur="3s" | ||||
|                  values="6;22" | ||||
|                  calcMode="linear" | ||||
|                  repeatCount="indefinite" /> | ||||
|             <animate attributeName="stroke-opacity" | ||||
|                  begin="1.5s" dur="3s" | ||||
|                  values="1;0" calcMode="linear" | ||||
|                  repeatCount="indefinite" /> | ||||
|             <animate attributeName="stroke-width" | ||||
|                  begin="1.5s" dur="3s" | ||||
|                  values="2;0" calcMode="linear" | ||||
|                  repeatCount="indefinite" /> | ||||
|         </circle> | ||||
|         <circle cx="22" cy="22" r="6" stroke-opacity="0"> | ||||
|             <animate attributeName="r" | ||||
|                  begin="3s" dur="3s" | ||||
|                  values="6;22" | ||||
|                  calcMode="linear" | ||||
|                  repeatCount="indefinite" /> | ||||
|             <animate attributeName="stroke-opacity" | ||||
|                  begin="3s" dur="3s" | ||||
|                  values="1;0" calcMode="linear" | ||||
|                  repeatCount="indefinite" /> | ||||
|             <animate attributeName="stroke-width" | ||||
|                  begin="3s" dur="3s" | ||||
|                  values="2;0" calcMode="linear" | ||||
|                  repeatCount="indefinite" /> | ||||
|         </circle> | ||||
|         <circle cx="22" cy="22" r="8"> | ||||
|             <animate attributeName="r" | ||||
|                  begin="0s" dur="1.5s" | ||||
|                  values="6;1;2;3;4;5;6" | ||||
|                  calcMode="linear" | ||||
|                  repeatCount="indefinite" /> | ||||
|         </circle> | ||||
|     </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.7 KiB | 
							
								
								
									
										55
									
								
								webapp/static/svg-loaders/spinning-circles.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,55 @@ | ||||
| <!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL --> | ||||
| <svg width="58" height="58" viewBox="0 0 58 58" xmlns="http://www.w3.org/2000/svg"> | ||||
|     <g fill="none" fill-rule="evenodd"> | ||||
|         <g transform="translate(2 1)" stroke="#FFF" stroke-width="1.5"> | ||||
|             <circle cx="42.601" cy="11.462" r="5" fill-opacity="1" fill="#fff"> | ||||
|                 <animate attributeName="fill-opacity" | ||||
|                      begin="0s" dur="1.3s" | ||||
|                      values="1;0;0;0;0;0;0;0" calcMode="linear" | ||||
|                      repeatCount="indefinite" /> | ||||
|             </circle> | ||||
|             <circle cx="49.063" cy="27.063" r="5" fill-opacity="0" fill="#fff"> | ||||
|                 <animate attributeName="fill-opacity" | ||||
|                      begin="0s" dur="1.3s" | ||||
|                      values="0;1;0;0;0;0;0;0" calcMode="linear" | ||||
|                      repeatCount="indefinite" /> | ||||
|             </circle> | ||||
|             <circle cx="42.601" cy="42.663" r="5" fill-opacity="0" fill="#fff"> | ||||
|                 <animate attributeName="fill-opacity" | ||||
|                      begin="0s" dur="1.3s" | ||||
|                      values="0;0;1;0;0;0;0;0" calcMode="linear" | ||||
|                      repeatCount="indefinite" /> | ||||
|             </circle> | ||||
|             <circle cx="27" cy="49.125" r="5" fill-opacity="0" fill="#fff"> | ||||
|                 <animate attributeName="fill-opacity" | ||||
|                      begin="0s" dur="1.3s" | ||||
|                      values="0;0;0;1;0;0;0;0" calcMode="linear" | ||||
|                      repeatCount="indefinite" /> | ||||
|             </circle> | ||||
|             <circle cx="11.399" cy="42.663" r="5" fill-opacity="0" fill="#fff"> | ||||
|                 <animate attributeName="fill-opacity" | ||||
|                      begin="0s" dur="1.3s" | ||||
|                      values="0;0;0;0;1;0;0;0" calcMode="linear" | ||||
|                      repeatCount="indefinite" /> | ||||
|             </circle> | ||||
|             <circle cx="4.938" cy="27.063" r="5" fill-opacity="0" fill="#fff"> | ||||
|                 <animate attributeName="fill-opacity" | ||||
|                      begin="0s" dur="1.3s" | ||||
|                      values="0;0;0;0;0;1;0;0" calcMode="linear" | ||||
|                      repeatCount="indefinite" /> | ||||
|             </circle> | ||||
|             <circle cx="11.399" cy="11.462" r="5" fill-opacity="0" fill="#fff"> | ||||
|                 <animate attributeName="fill-opacity" | ||||
|                      begin="0s" dur="1.3s" | ||||
|                      values="0;0;0;0;0;0;1;0" calcMode="linear" | ||||
|                      repeatCount="indefinite" /> | ||||
|             </circle> | ||||
|             <circle cx="27" cy="5" r="5" fill-opacity="0" fill="#fff"> | ||||
|                 <animate attributeName="fill-opacity" | ||||
|                      begin="0s" dur="1.3s" | ||||
|                      values="0;0;0;0;0;0;0;1" calcMode="linear" | ||||
|                      repeatCount="indefinite" /> | ||||
|             </circle> | ||||
|         </g> | ||||
|     </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.7 KiB | 
							
								
								
									
										32
									
								
								webapp/static/svg-loaders/tail-spin.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,32 @@ | ||||
| <!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL --> | ||||
| <svg width="38" height="38" viewBox="0 0 38 38" xmlns="http://www.w3.org/2000/svg"> | ||||
|     <defs> | ||||
|         <linearGradient x1="8.042%" y1="0%" x2="65.682%" y2="23.865%" id="a"> | ||||
|             <stop stop-color="#fff" stop-opacity="0" offset="0%"/> | ||||
|             <stop stop-color="#fff" stop-opacity=".631" offset="63.146%"/> | ||||
|             <stop stop-color="#fff" offset="100%"/> | ||||
|         </linearGradient> | ||||
|     </defs> | ||||
|     <g fill="none" fill-rule="evenodd"> | ||||
|         <g transform="translate(1 1)"> | ||||
|             <path d="M36 18c0-9.94-8.06-18-18-18" id="Oval-2" stroke="url(#a)" stroke-width="2"> | ||||
|                 <animateTransform | ||||
|                     attributeName="transform" | ||||
|                     type="rotate" | ||||
|                     from="0 18 18" | ||||
|                     to="360 18 18" | ||||
|                     dur="0.9s" | ||||
|                     repeatCount="indefinite" /> | ||||
|             </path> | ||||
|             <circle fill="#fff" cx="36" cy="18" r="1"> | ||||
|                 <animateTransform | ||||
|                     attributeName="transform" | ||||
|                     type="rotate" | ||||
|                     from="0 18 18" | ||||
|                     to="360 18 18" | ||||
|                     dur="0.9s" | ||||
|                     repeatCount="indefinite" /> | ||||
|             </circle> | ||||
|         </g> | ||||
|     </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										33
									
								
								webapp/static/svg-loaders/three-dots.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,33 @@ | ||||
| <!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL --> | ||||
| <svg width="120" height="30" viewBox="0 0 120 30" xmlns="http://www.w3.org/2000/svg" fill="#fff"> | ||||
|     <circle cx="15" cy="15" r="15"> | ||||
|         <animate attributeName="r" from="15" to="15" | ||||
|                  begin="0s" dur="0.8s" | ||||
|                  values="15;9;15" calcMode="linear" | ||||
|                  repeatCount="indefinite" /> | ||||
|         <animate attributeName="fill-opacity" from="1" to="1" | ||||
|                  begin="0s" dur="0.8s" | ||||
|                  values="1;.5;1" calcMode="linear" | ||||
|                  repeatCount="indefinite" /> | ||||
|     </circle> | ||||
|     <circle cx="60" cy="15" r="9" fill-opacity="0.3"> | ||||
|         <animate attributeName="r" from="9" to="9" | ||||
|                  begin="0s" dur="0.8s" | ||||
|                  values="9;15;9" calcMode="linear" | ||||
|                  repeatCount="indefinite" /> | ||||
|         <animate attributeName="fill-opacity" from="0.5" to="0.5" | ||||
|                  begin="0s" dur="0.8s" | ||||
|                  values=".5;1;.5" calcMode="linear" | ||||
|                  repeatCount="indefinite" /> | ||||
|     </circle> | ||||
|     <circle cx="105" cy="15" r="15"> | ||||
|         <animate attributeName="r" from="15" to="15" | ||||
|                  begin="0s" dur="0.8s" | ||||
|                  values="15;9;15" calcMode="linear" | ||||
|                  repeatCount="indefinite" /> | ||||
|         <animate attributeName="fill-opacity" from="1" to="1" | ||||
|                  begin="0s" dur="0.8s" | ||||
|                  values="1;.5;1" calcMode="linear" | ||||
|                  repeatCount="indefinite" /> | ||||
|     </circle> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.5 KiB | 
							
								
								
									
										113
									
								
								webapp/yarn.lock
									
									
									
									
									
								
							
							
						
						| @@ -391,6 +391,22 @@ bn.js@^5.0.0, bn.js@^5.1.1: | ||||
|   resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" | ||||
|   integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== | ||||
|  | ||||
| body-parser@^1.19.0: | ||||
|   version "1.19.0" | ||||
|   resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" | ||||
|   integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== | ||||
|   dependencies: | ||||
|     bytes "3.1.0" | ||||
|     content-type "~1.0.4" | ||||
|     debug "2.6.9" | ||||
|     depd "~1.1.2" | ||||
|     http-errors "1.7.2" | ||||
|     iconv-lite "0.4.24" | ||||
|     on-finished "~2.3.0" | ||||
|     qs "6.7.0" | ||||
|     raw-body "2.4.0" | ||||
|     type-is "~1.6.17" | ||||
|  | ||||
| brace-expansion@^1.1.7: | ||||
|   version "1.1.11" | ||||
|   resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" | ||||
| @@ -522,6 +538,11 @@ bytes@3.0.0: | ||||
|   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" | ||||
|   integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= | ||||
|  | ||||
| bytes@3.1.0: | ||||
|   version "3.1.0" | ||||
|   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" | ||||
|   integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== | ||||
|  | ||||
| cacache@^12.0.2: | ||||
|   version "12.0.4" | ||||
|   resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" | ||||
| @@ -650,7 +671,7 @@ collection-visit@^1.0.0: | ||||
|     map-visit "^1.0.0" | ||||
|     object-visit "^1.0.0" | ||||
|  | ||||
| combined-stream@^1.0.6, combined-stream@~1.0.6: | ||||
| combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: | ||||
|   version "1.0.8" | ||||
|   resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" | ||||
|   integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== | ||||
| @@ -717,6 +738,11 @@ constants-browserify@^1.0.0: | ||||
|   resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" | ||||
|   integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= | ||||
|  | ||||
| content-type@~1.0.4: | ||||
|   version "1.0.4" | ||||
|   resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" | ||||
|   integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== | ||||
|  | ||||
| copy-concurrently@^1.0.0: | ||||
|   version "1.0.5" | ||||
|   resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" | ||||
| @@ -879,6 +905,11 @@ delayed-stream@~1.0.0: | ||||
|   resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" | ||||
|   integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= | ||||
|  | ||||
| depd@~1.1.2: | ||||
|   version "1.1.2" | ||||
|   resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" | ||||
|   integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= | ||||
|  | ||||
| des.js@^1.0.0: | ||||
|   version "1.0.1" | ||||
|   resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" | ||||
| @@ -931,6 +962,11 @@ ecc-jsbn@~0.1.1: | ||||
|     jsbn "~0.1.0" | ||||
|     safer-buffer "^2.1.0" | ||||
|  | ||||
| ee-first@1.1.1: | ||||
|   version "1.1.1" | ||||
|   resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" | ||||
|   integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= | ||||
|  | ||||
| elliptic@^6.5.3: | ||||
|   version "6.5.3" | ||||
|   resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" | ||||
| @@ -1173,6 +1209,15 @@ forever-agent@~0.6.1: | ||||
|   resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" | ||||
|   integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= | ||||
|  | ||||
| form-data@^3.0.0: | ||||
|   version "3.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" | ||||
|   integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== | ||||
|   dependencies: | ||||
|     asynckit "^0.4.0" | ||||
|     combined-stream "^1.0.8" | ||||
|     mime-types "^2.1.12" | ||||
|  | ||||
| form-data@~2.3.2: | ||||
|   version "2.3.3" | ||||
|   resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" | ||||
| @@ -1364,6 +1409,17 @@ html-minifier@^4.0.0: | ||||
|     relateurl "^0.2.7" | ||||
|     uglify-js "^3.5.1" | ||||
|  | ||||
| http-errors@1.7.2: | ||||
|   version "1.7.2" | ||||
|   resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" | ||||
|   integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== | ||||
|   dependencies: | ||||
|     depd "~1.1.2" | ||||
|     inherits "2.0.3" | ||||
|     setprototypeof "1.1.1" | ||||
|     statuses ">= 1.5.0 < 2" | ||||
|     toidentifier "1.0.0" | ||||
|  | ||||
| http-link-header@^1.0.2: | ||||
|   version "1.0.3" | ||||
|   resolved "https://registry.yarnpkg.com/http-link-header/-/http-link-header-1.0.3.tgz#abbc2cdc5e06dd7e196a4983adac08a2d085ec90" | ||||
| @@ -1798,6 +1854,11 @@ md5.js@^1.3.4: | ||||
|     inherits "^2.0.1" | ||||
|     safe-buffer "^5.1.2" | ||||
|  | ||||
| media-typer@0.3.0: | ||||
|   version "0.3.0" | ||||
|   resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" | ||||
|   integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= | ||||
|  | ||||
| memory-fs@^0.4.1: | ||||
|   version "0.4.1" | ||||
|   resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" | ||||
| @@ -2056,6 +2117,13 @@ object.pick@^1.3.0: | ||||
|   dependencies: | ||||
|     isobject "^3.0.1" | ||||
|  | ||||
| on-finished@~2.3.0: | ||||
|   version "2.3.0" | ||||
|   resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" | ||||
|   integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= | ||||
|   dependencies: | ||||
|     ee-first "1.1.1" | ||||
|  | ||||
| on-headers@~1.0.2: | ||||
|   version "1.0.2" | ||||
|   resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" | ||||
| @@ -2294,6 +2362,11 @@ punycode@^2.1.0, punycode@^2.1.1: | ||||
|   resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" | ||||
|   integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== | ||||
|  | ||||
| qs@6.7.0: | ||||
|   version "6.7.0" | ||||
|   resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" | ||||
|   integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== | ||||
|  | ||||
| qs@~6.5.2: | ||||
|   version "6.5.2" | ||||
|   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" | ||||
| @@ -2324,6 +2397,16 @@ randomfill@^1.0.3: | ||||
|     randombytes "^2.0.5" | ||||
|     safe-buffer "^5.1.0" | ||||
|  | ||||
| raw-body@2.4.0: | ||||
|   version "2.4.0" | ||||
|   resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" | ||||
|   integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== | ||||
|   dependencies: | ||||
|     bytes "3.1.0" | ||||
|     http-errors "1.7.2" | ||||
|     iconv-lite "0.4.24" | ||||
|     unpipe "1.0.0" | ||||
|  | ||||
| "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: | ||||
|   version "2.3.7" | ||||
|   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" | ||||
| @@ -2555,6 +2638,11 @@ setimmediate@^1.0.4: | ||||
|   resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" | ||||
|   integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= | ||||
|  | ||||
| setprototypeof@1.1.1: | ||||
|   version "1.1.1" | ||||
|   resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" | ||||
|   integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== | ||||
|  | ||||
| sha.js@^2.4.0, sha.js@^2.4.8: | ||||
|   version "2.4.11" | ||||
|   resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" | ||||
| @@ -2688,6 +2776,11 @@ static-extend@^0.1.1: | ||||
|     define-property "^0.2.5" | ||||
|     object-copy "^0.1.0" | ||||
|  | ||||
| "statuses@>= 1.5.0 < 2": | ||||
|   version "1.5.0" | ||||
|   resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" | ||||
|   integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= | ||||
|  | ||||
| stealthy-require@^1.1.1: | ||||
|   version "1.1.1" | ||||
|   resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" | ||||
| @@ -2848,6 +2941,11 @@ to-regex@^3.0.1, to-regex@^3.0.2: | ||||
|     regex-not "^1.0.2" | ||||
|     safe-regex "^1.1.0" | ||||
|  | ||||
| toidentifier@1.0.0: | ||||
|   version "1.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" | ||||
|   integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== | ||||
|  | ||||
| totalist@^1.0.0: | ||||
|   version "1.1.0" | ||||
|   resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" | ||||
| @@ -2913,6 +3011,14 @@ type-check@~0.3.2: | ||||
|   dependencies: | ||||
|     prelude-ls "~1.1.2" | ||||
|  | ||||
| type-is@~1.6.17: | ||||
|   version "1.6.18" | ||||
|   resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" | ||||
|   integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== | ||||
|   dependencies: | ||||
|     media-typer "0.3.0" | ||||
|     mime-types "~2.1.24" | ||||
|  | ||||
| typedarray@^0.0.6: | ||||
|   version "0.0.6" | ||||
|   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" | ||||
| @@ -2947,6 +3053,11 @@ unique-slug@^2.0.0: | ||||
|   dependencies: | ||||
|     imurmurhash "^0.1.4" | ||||
|  | ||||
| unpipe@1.0.0: | ||||
|   version "1.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" | ||||
|   integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= | ||||
|  | ||||
| unset-value@^1.0.0: | ||||
|   version "1.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" | ||||
|   | ||||