Compare commits
	
		
			70 Commits
		
	
	
		
			8b2f1b9c49
			...
			feat/struc
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					df33229934 | ||
| 
						 | 
					49fafaa096 | ||
| 
						 | 
					ca9b32a23b | ||
| 
						 | 
					76e3ff4e02 | ||
| 
						 | 
					eabf3ca7d3 | ||
| 
						 | 
					94e6db10bb | ||
| 
						 | 
					26e1d5fec3 | ||
| 
						 | 
					66be87b688 | ||
| 
						 | 
					f7b4e32218 | ||
| 
						 | 
					57407112fb | ||
| 
						 | 
					b280cc2e01 | ||
| 
						 | 
					e6ebf892c5 | ||
| 
						 | 
					b754641058 | ||
| 
						 | 
					722f4f760e | ||
| 
						 | 
					01e04a209f | ||
| 
						 | 
					0299fd1ea0 | ||
| 
						 | 
					cf8dec53ca | ||
| 
						 | 
					d5c012d748 | ||
| 
						 | 
					2ccbd9a44c | ||
| 
						 | 
					ccd89d48d9 | ||
| 
						 | 
					87d788ddef | ||
| 
						 | 
					809b625a34 | ||
| 
						 | 
					95c753a549 | ||
| 
						 | 
					0bb8b7ec5c | ||
| 
						 | 
					c6d084f5dc | ||
| 
						 | 
					0024ce36c8 | ||
| 
						 | 
					c44e746807 | ||
| 
						 | 
					b1826066f4 | ||
| 
						 | 
					b0b8acc45b | ||
| 
						 | 
					e2b9ffc072 | ||
| 
						 | 
					68c43ea372 | ||
| 
						 | 
					3b46baca4f | ||
| 
						 | 
					772e461c08 | ||
| 
						 | 
					5c6018a0f9 | ||
| 
						 | 
					0b7989c3d3 | ||
| 
						 | 
					8cfcc3e39c | ||
| 
						 | 
					3a57261590 | ||
| 
						 | 
					a86a1a461c | ||
| 
						 | 
					2257e1df0c | ||
| 
						 | 
					ccb72c8970 | ||
| 
						 | 
					740ff941a5 | ||
| 
						 | 
					117a683d9a | ||
| 
						 | 
					9eba4b7373 | ||
| 
						 | 
					91306dc0c7 | ||
| 
						 | 
					1716dd5a65 | ||
| 
						 | 
					66f9a674f1 | ||
| 
						 | 
					41fc5274ff | ||
| 
						 | 
					bcebdb5fd9 | ||
| 
						 | 
					876487ad11 | ||
| 
						 | 
					18da75ad97 | ||
| 
						 | 
					c80ac1415d | ||
| 
						 | 
					bb21184ea2 | ||
| 
						 | 
					0c3740fdf2 | ||
| 
						 | 
					701819d018 | ||
| 
						 | 
					68e151b2bd | ||
| 
						 | 
					06ff272541 | ||
| 
						 | 
					4154d5e4b1 | ||
| 
						 | 
					1862491496 | ||
| 
						 | 
					073b5e897c | ||
| 
						 | 
					7e1d6ebd19 | ||
| 
						 | 
					9a332e79e4 | ||
| 
						 | 
					72450b9217 | ||
| 
						 | 
					7e1dc33a08 | ||
| 
						 | 
					aa240009ab | ||
| 
						 | 
					41b258e4d8 | ||
| 
						 | 
					da1123d84b | ||
| 
						 | 
					627775c430 | ||
| 
						 | 
					245573efca | ||
| 
						 | 
					28b9cca413 | ||
| 
						 | 
					8aaee2c40c | 
							
								
								
									
										0
									
								
								.assets/manifest.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -37,3 +37,5 @@ Thumbs.db
 | 
				
			|||||||
# Db
 | 
					# Db
 | 
				
			||||||
db.sqlite
 | 
					db.sqlite
 | 
				
			||||||
/searxng
 | 
					/searxng
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					certificates
 | 
				
			||||||
							
								
								
									
										10
									
								
								README.md
									
									
									
									
									
								
							
							
						
						@@ -16,7 +16,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
<hr/>
 | 
					<hr/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[](https://discord.gg/26aArMy8tT)
 | 
					[](https://discord.gg/26aArMy8tT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||

 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -90,6 +90,9 @@ There are mainly 2 ways of installing Perplexica - With Docker, Without Docker.
 | 
				
			|||||||
   - `OLLAMA`: Your Ollama API URL. You should enter it as `http://host.docker.internal:PORT_NUMBER`. If you installed Ollama on port 11434, use `http://host.docker.internal:11434`. For other ports, adjust accordingly. **You need to fill this if you wish to use Ollama's models instead of OpenAI's**.
 | 
					   - `OLLAMA`: Your Ollama API URL. You should enter it as `http://host.docker.internal:PORT_NUMBER`. If you installed Ollama on port 11434, use `http://host.docker.internal:11434`. For other ports, adjust accordingly. **You need to fill this if you wish to use Ollama's models instead of OpenAI's**.
 | 
				
			||||||
   - `GROQ`: Your Groq API key. **You only need to fill this if you wish to use Groq's hosted models**.
 | 
					   - `GROQ`: Your Groq API key. **You only need to fill this if you wish to use Groq's hosted models**.
 | 
				
			||||||
   - `ANTHROPIC`: Your Anthropic API key. **You only need to fill this if you wish to use Anthropic models**.
 | 
					   - `ANTHROPIC`: Your Anthropic API key. **You only need to fill this if you wish to use Anthropic models**.
 | 
				
			||||||
 | 
					   - `Gemini`: Your Gemini API key. **You only need to fill this if you wish to use Google's models**.
 | 
				
			||||||
 | 
					   - `DEEPSEEK`: Your Deepseek API key. **Only needed if you want Deepseek models.**
 | 
				
			||||||
 | 
					   - `AIMLAPI`: Your AI/ML API key. **Only needed if you want to use AI/ML API models and embeddings.**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
     **Note**: You can change these after starting Perplexica from the settings dialog.
 | 
					     **Note**: You can change these after starting Perplexica from the settings dialog.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -111,7 +114,7 @@ There are mainly 2 ways of installing Perplexica - With Docker, Without Docker.
 | 
				
			|||||||
2. Clone the repository and rename the `sample.config.toml` file to `config.toml` in the root directory. Ensure you complete all required fields in this file.
 | 
					2. Clone the repository and rename the `sample.config.toml` file to `config.toml` in the root directory. Ensure you complete all required fields in this file.
 | 
				
			||||||
3. After populating the configuration run `npm i`.
 | 
					3. After populating the configuration run `npm i`.
 | 
				
			||||||
4. Install the dependencies and then execute `npm run build`.
 | 
					4. Install the dependencies and then execute `npm run build`.
 | 
				
			||||||
5. Finally, start the app by running `npm rum start`
 | 
					5. Finally, start the app by running `npm run start`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**Note**: Using Docker is recommended as it simplifies the setup process, especially for managing environment variables and dependencies.
 | 
					**Note**: Using Docker is recommended as it simplifies the setup process, especially for managing environment variables and dependencies.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -132,7 +135,7 @@ If you're encountering an Ollama connection error, it is likely due to the backe
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
3. **Linux Users - Expose Ollama to Network:**
 | 
					3. **Linux Users - Expose Ollama to Network:**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   - Inside `/etc/systemd/system/ollama.service`, you need to add `Environment="OLLAMA_HOST=0.0.0.0"`. Then restart Ollama by `systemctl restart ollama`. For more information see [Ollama docs](https://github.com/ollama/ollama/blob/main/docs/faq.md#setting-environment-variables-on-linux)
 | 
					   - Inside `/etc/systemd/system/ollama.service`, you need to add `Environment="OLLAMA_HOST=0.0.0.0:11434"`. (Change the port number if you are using a different one.) Then reload the systemd manager configuration with `systemctl daemon-reload`, and restart Ollama by `systemctl restart ollama`. For more information see [Ollama docs](https://github.com/ollama/ollama/blob/main/docs/faq.md#setting-environment-variables-on-linux)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   - Ensure that the port (default is 11434) is not blocked by your firewall.
 | 
					   - Ensure that the port (default is 11434) is not blocked by your firewall.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -159,6 +162,7 @@ Perplexica runs on Next.js and handles all API requests. It works right away on
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[](https://usw.sealos.io/?openapp=system-template%3FtemplateName%3Dperplexica)
 | 
					[](https://usw.sealos.io/?openapp=system-template%3FtemplateName%3Dperplexica)
 | 
				
			||||||
[](https://repocloud.io/details/?app_id=267)
 | 
					[](https://repocloud.io/details/?app_id=267)
 | 
				
			||||||
 | 
					[](https://template.run.claw.cloud/?referralCode=U11MRQ8U9RM4&openapp=system-fastdeploy%3FtemplateName%3Dperplexica)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Upcoming Features
 | 
					## Upcoming Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,9 @@ COPY public ./public
 | 
				
			|||||||
RUN mkdir -p /home/perplexica/data
 | 
					RUN mkdir -p /home/perplexica/data
 | 
				
			||||||
RUN yarn build
 | 
					RUN yarn build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RUN yarn add --dev @vercel/ncc
 | 
				
			||||||
 | 
					RUN yarn ncc build ./src/lib/db/migrate.ts -o migrator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FROM node:20.18.0-slim
 | 
					FROM node:20.18.0-slim
 | 
				
			||||||
 | 
					
 | 
				
			||||||
WORKDIR /home/perplexica
 | 
					WORKDIR /home/perplexica
 | 
				
			||||||
@@ -21,7 +24,12 @@ COPY --from=builder /home/perplexica/.next/static ./public/_next/static
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
COPY --from=builder /home/perplexica/.next/standalone ./
 | 
					COPY --from=builder /home/perplexica/.next/standalone ./
 | 
				
			||||||
COPY --from=builder /home/perplexica/data ./data
 | 
					COPY --from=builder /home/perplexica/data ./data
 | 
				
			||||||
 | 
					COPY drizzle ./drizzle
 | 
				
			||||||
 | 
					COPY --from=builder /home/perplexica/migrator/build ./build
 | 
				
			||||||
 | 
					COPY --from=builder /home/perplexica/migrator/index.js ./migrate.js
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN mkdir /home/perplexica/uploads
 | 
					RUN mkdir /home/perplexica/uploads
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CMD ["node", "server.js"]
 | 
					COPY entrypoint.sh ./entrypoint.sh
 | 
				
			||||||
 | 
					RUN chmod +x ./entrypoint.sh
 | 
				
			||||||
 | 
					CMD ["./entrypoint.sh"]
 | 
				
			||||||
@@ -16,6 +16,7 @@ services:
 | 
				
			|||||||
      dockerfile: app.dockerfile
 | 
					      dockerfile: app.dockerfile
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - SEARXNG_API_URL=http://searxng:8080
 | 
					      - SEARXNG_API_URL=http://searxng:8080
 | 
				
			||||||
 | 
					      - DATA_DIR=/home/perplexica
 | 
				
			||||||
    ports:
 | 
					    ports:
 | 
				
			||||||
      - 3000:3000
 | 
					      - 3000:3000
 | 
				
			||||||
    networks:
 | 
					    networks:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,6 +41,6 @@ To update Perplexica to the latest version, follow these steps:
 | 
				
			|||||||
3. Check for changes in the configuration files. If the `sample.config.toml` file contains new fields, delete your existing `config.toml` file, rename `sample.config.toml` to `config.toml`, and update the configuration accordingly.
 | 
					3. Check for changes in the configuration files. If the `sample.config.toml` file contains new fields, delete your existing `config.toml` file, rename `sample.config.toml` to `config.toml`, and update the configuration accordingly.
 | 
				
			||||||
4. After populating the configuration run `npm i`.
 | 
					4. After populating the configuration run `npm i`.
 | 
				
			||||||
5. Install the dependencies and then execute `npm run build`.
 | 
					5. Install the dependencies and then execute `npm run build`.
 | 
				
			||||||
6. Finally, start the app by running `npm rum start`
 | 
					6. Finally, start the app by running `npm run start`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,11 @@
 | 
				
			|||||||
import { defineConfig } from 'drizzle-kit';
 | 
					import { defineConfig } from 'drizzle-kit';
 | 
				
			||||||
 | 
					import path from 'path';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineConfig({
 | 
					export default defineConfig({
 | 
				
			||||||
  dialect: 'sqlite',
 | 
					  dialect: 'sqlite',
 | 
				
			||||||
  schema: './src/lib/db/schema.ts',
 | 
					  schema: './src/lib/db/schema.ts',
 | 
				
			||||||
  out: './drizzle',
 | 
					  out: './drizzle',
 | 
				
			||||||
  dbCredentials: {
 | 
					  dbCredentials: {
 | 
				
			||||||
    url: './data/db.sqlite',
 | 
					    url: path.join(process.cwd(), 'data', 'db.sqlite'),
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								drizzle/0000_fuzzy_randall.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					CREATE TABLE IF NOT EXISTS `chats` (
 | 
				
			||||||
 | 
						`id` text PRIMARY KEY NOT NULL,
 | 
				
			||||||
 | 
						`title` text NOT NULL,
 | 
				
			||||||
 | 
						`createdAt` text NOT NULL,
 | 
				
			||||||
 | 
						`focusMode` text NOT NULL,
 | 
				
			||||||
 | 
						`files` text DEFAULT '[]'
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					--> statement-breakpoint
 | 
				
			||||||
 | 
					CREATE TABLE IF NOT EXISTS `messages` (
 | 
				
			||||||
 | 
						`id` integer PRIMARY KEY NOT NULL,
 | 
				
			||||||
 | 
						`content` text NOT NULL,
 | 
				
			||||||
 | 
						`chatId` text NOT NULL,
 | 
				
			||||||
 | 
						`messageId` text NOT NULL,
 | 
				
			||||||
 | 
						`type` text,
 | 
				
			||||||
 | 
						`metadata` text
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
							
								
								
									
										116
									
								
								drizzle/meta/0000_snapshot.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,116 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "version": "6",
 | 
				
			||||||
 | 
					  "dialect": "sqlite",
 | 
				
			||||||
 | 
					  "id": "ef3a044b-0f34-40b5-babb-2bb3a909ba27",
 | 
				
			||||||
 | 
					  "prevId": "00000000-0000-0000-0000-000000000000",
 | 
				
			||||||
 | 
					  "tables": {
 | 
				
			||||||
 | 
					    "chats": {
 | 
				
			||||||
 | 
					      "name": "chats",
 | 
				
			||||||
 | 
					      "columns": {
 | 
				
			||||||
 | 
					        "id": {
 | 
				
			||||||
 | 
					          "name": "id",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": true,
 | 
				
			||||||
 | 
					          "notNull": true,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "title": {
 | 
				
			||||||
 | 
					          "name": "title",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": false,
 | 
				
			||||||
 | 
					          "notNull": true,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "createdAt": {
 | 
				
			||||||
 | 
					          "name": "createdAt",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": false,
 | 
				
			||||||
 | 
					          "notNull": true,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "focusMode": {
 | 
				
			||||||
 | 
					          "name": "focusMode",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": false,
 | 
				
			||||||
 | 
					          "notNull": true,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "files": {
 | 
				
			||||||
 | 
					          "name": "files",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": false,
 | 
				
			||||||
 | 
					          "notNull": false,
 | 
				
			||||||
 | 
					          "autoincrement": false,
 | 
				
			||||||
 | 
					          "default": "'[]'"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "indexes": {},
 | 
				
			||||||
 | 
					      "foreignKeys": {},
 | 
				
			||||||
 | 
					      "compositePrimaryKeys": {},
 | 
				
			||||||
 | 
					      "uniqueConstraints": {},
 | 
				
			||||||
 | 
					      "checkConstraints": {}
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "messages": {
 | 
				
			||||||
 | 
					      "name": "messages",
 | 
				
			||||||
 | 
					      "columns": {
 | 
				
			||||||
 | 
					        "id": {
 | 
				
			||||||
 | 
					          "name": "id",
 | 
				
			||||||
 | 
					          "type": "integer",
 | 
				
			||||||
 | 
					          "primaryKey": true,
 | 
				
			||||||
 | 
					          "notNull": true,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "content": {
 | 
				
			||||||
 | 
					          "name": "content",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": false,
 | 
				
			||||||
 | 
					          "notNull": true,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "chatId": {
 | 
				
			||||||
 | 
					          "name": "chatId",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": false,
 | 
				
			||||||
 | 
					          "notNull": true,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "messageId": {
 | 
				
			||||||
 | 
					          "name": "messageId",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": false,
 | 
				
			||||||
 | 
					          "notNull": true,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "type": {
 | 
				
			||||||
 | 
					          "name": "type",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": false,
 | 
				
			||||||
 | 
					          "notNull": false,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "metadata": {
 | 
				
			||||||
 | 
					          "name": "metadata",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": false,
 | 
				
			||||||
 | 
					          "notNull": false,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "indexes": {},
 | 
				
			||||||
 | 
					      "foreignKeys": {},
 | 
				
			||||||
 | 
					      "compositePrimaryKeys": {},
 | 
				
			||||||
 | 
					      "uniqueConstraints": {},
 | 
				
			||||||
 | 
					      "checkConstraints": {}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "views": {},
 | 
				
			||||||
 | 
					  "enums": {},
 | 
				
			||||||
 | 
					  "_meta": {
 | 
				
			||||||
 | 
					    "schemas": {},
 | 
				
			||||||
 | 
					    "tables": {},
 | 
				
			||||||
 | 
					    "columns": {}
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "internal": {
 | 
				
			||||||
 | 
					    "indexes": {}
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										13
									
								
								drizzle/meta/_journal.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "version": "7",
 | 
				
			||||||
 | 
					  "dialect": "sqlite",
 | 
				
			||||||
 | 
					  "entries": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "idx": 0,
 | 
				
			||||||
 | 
					      "version": "6",
 | 
				
			||||||
 | 
					      "when": 1748405503809,
 | 
				
			||||||
 | 
					      "tag": "0000_fuzzy_randall",
 | 
				
			||||||
 | 
					      "breakpoints": true
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										6
									
								
								entrypoint.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					node migrate.js
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exec node server.js
 | 
				
			||||||
							
								
								
									
										18
									
								
								package.json
									
									
									
									
									
								
							
							
						
						@@ -1,6 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "perplexica-frontend",
 | 
					  "name": "perplexica-frontend",
 | 
				
			||||||
  "version": "1.10.2",
 | 
					  "version": "1.11.0-rc2",
 | 
				
			||||||
  "license": "MIT",
 | 
					  "license": "MIT",
 | 
				
			||||||
  "author": "ItzCrazyKns",
 | 
					  "author": "ItzCrazyKns",
 | 
				
			||||||
  "scripts": {
 | 
					  "scripts": {
 | 
				
			||||||
@@ -15,11 +15,12 @@
 | 
				
			|||||||
    "@headlessui/react": "^2.2.0",
 | 
					    "@headlessui/react": "^2.2.0",
 | 
				
			||||||
    "@iarna/toml": "^2.2.5",
 | 
					    "@iarna/toml": "^2.2.5",
 | 
				
			||||||
    "@icons-pack/react-simple-icons": "^12.3.0",
 | 
					    "@icons-pack/react-simple-icons": "^12.3.0",
 | 
				
			||||||
    "@langchain/anthropic": "^0.3.15",
 | 
					    "@langchain/anthropic": "^0.3.24",
 | 
				
			||||||
    "@langchain/community": "^0.3.36",
 | 
					    "@langchain/community": "^0.3.49",
 | 
				
			||||||
    "@langchain/core": "^0.3.42",
 | 
					    "@langchain/core": "^0.3.66",
 | 
				
			||||||
    "@langchain/google-genai": "^0.1.12",
 | 
					    "@langchain/google-genai": "^0.2.15",
 | 
				
			||||||
    "@langchain/openai": "^0.0.25",
 | 
					    "@langchain/ollama": "^0.2.3",
 | 
				
			||||||
 | 
					    "@langchain/openai": "^0.6.2",
 | 
				
			||||||
    "@langchain/textsplitters": "^0.1.0",
 | 
					    "@langchain/textsplitters": "^0.1.0",
 | 
				
			||||||
    "@tailwindcss/typography": "^0.5.12",
 | 
					    "@tailwindcss/typography": "^0.5.12",
 | 
				
			||||||
    "@xenova/transformers": "^2.17.2",
 | 
					    "@xenova/transformers": "^2.17.2",
 | 
				
			||||||
@@ -30,8 +31,10 @@
 | 
				
			|||||||
    "compute-dot": "^1.1.0",
 | 
					    "compute-dot": "^1.1.0",
 | 
				
			||||||
    "drizzle-orm": "^0.40.1",
 | 
					    "drizzle-orm": "^0.40.1",
 | 
				
			||||||
    "html-to-text": "^9.0.5",
 | 
					    "html-to-text": "^9.0.5",
 | 
				
			||||||
    "langchain": "^0.1.30",
 | 
					    "jspdf": "^3.0.1",
 | 
				
			||||||
 | 
					    "langchain": "^0.3.30",
 | 
				
			||||||
    "lucide-react": "^0.363.0",
 | 
					    "lucide-react": "^0.363.0",
 | 
				
			||||||
 | 
					    "mammoth": "^1.9.1",
 | 
				
			||||||
    "markdown-to-jsx": "^7.7.2",
 | 
					    "markdown-to-jsx": "^7.7.2",
 | 
				
			||||||
    "next": "^15.2.2",
 | 
					    "next": "^15.2.2",
 | 
				
			||||||
    "next-themes": "^0.3.0",
 | 
					    "next-themes": "^0.3.0",
 | 
				
			||||||
@@ -49,6 +52,7 @@
 | 
				
			|||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
    "@types/better-sqlite3": "^7.6.12",
 | 
					    "@types/better-sqlite3": "^7.6.12",
 | 
				
			||||||
    "@types/html-to-text": "^9.0.4",
 | 
					    "@types/html-to-text": "^9.0.4",
 | 
				
			||||||
 | 
					    "@types/jspdf": "^2.0.0",
 | 
				
			||||||
    "@types/node": "^20",
 | 
					    "@types/node": "^20",
 | 
				
			||||||
    "@types/pdf-parse": "^1.1.4",
 | 
					    "@types/pdf-parse": "^1.1.4",
 | 
				
			||||||
    "@types/react": "^18",
 | 
					    "@types/react": "^18",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								public/icon-100.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 916 B  | 
							
								
								
									
										
											BIN
										
									
								
								public/icon-50.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 515 B  | 
							
								
								
									
										
											BIN
										
									
								
								public/icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 30 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/screenshots/p1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 183 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/screenshots/p1_small.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 130 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/screenshots/p2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 627 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/screenshots/p2_small.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 202 KiB  | 
							
								
								
									
										131
									
								
								public/weather-ico/clear-day.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,131 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.34167" y="-.34167" width="1.6833" height="1.85">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** SUN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-sun {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          transform: rotate(360deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-sun {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 9s;
 | 
				
			||||||
 | 
					        animation-duration: 9s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-sun-shiny {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          stroke-dasharray: 3px 10px;
 | 
				
			||||||
 | 
					          stroke-dashoffset: 0px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          stroke-dasharray: 0.1px 10px;
 | 
				
			||||||
 | 
					          stroke-dashoffset: -1px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          stroke-dasharray: 3px 10px;
 | 
				
			||||||
 | 
					          stroke-dashoffset: 0px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-sun-shiny line {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 2s;
 | 
				
			||||||
 | 
					        animation-duration: 2s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="translate(0,16)">
 | 
				
			||||||
 | 
					      <g class="am-weather-sun"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" stroke-width="2" />
 | 
				
			||||||
 | 
					        <g transform="rotate(45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(135)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="scale(-1)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(225)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 4.9 KiB  | 
							
								
								
									
										159
									
								
								public/weather-ico/clear-night.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,159 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.3038" y="-.3318" width="1.6076" height="1.894">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** MOON
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          transform: rotate(15deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 6s;
 | 
				
			||||||
 | 
					        animation-duration: 6s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -webkit-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        -moz-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        -ms-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 3s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 3s;
 | 
				
			||||||
 | 
					        animation-delay: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 5s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 5s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 5s;
 | 
				
			||||||
 | 
					        animation-duration: 5s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        animation-iteration-count: 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 5s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 5s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 5s;
 | 
				
			||||||
 | 
					        animation-delay: 5s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 4s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 4s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 4s;
 | 
				
			||||||
 | 
					        animation-duration: 4s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        animation-iteration-count: 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g id="night" transform="translate(-4,-18)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="matrix(.8 0 0 .78534 36 20.022)" stroke-width="1.2616">
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-1"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon points="4 2.7 5.2 3.3 4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5" fill="#ffa500" stroke-miterlimit="10"
 | 
				
			||||||
 | 
					          stroke-width="1.4105" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-2"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon transform="translate(20,10)" points="4 2.7 5.2 3.3 4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5"
 | 
				
			||||||
 | 
					          fill="#ffa500" stroke-miterlimit="10" stroke-width="1.4105" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0">
 | 
				
			||||||
 | 
					        <path
 | 
				
			||||||
 | 
					          d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z"
 | 
				
			||||||
 | 
					          fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2.5232" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 6.7 KiB  | 
							
								
								
									
										178
									
								
								public/weather-ico/cloudy-1-day.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,178 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.20655" y="-.28472" width="1.403" height="1.6944">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** CLOUDS
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 3s;
 | 
				
			||||||
 | 
					        animation-duration: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** SUN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-sun {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          transform: rotate(360deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-sun {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 9s;
 | 
				
			||||||
 | 
					        animation-duration: 9s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-sun-shiny {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          stroke-dasharray: 3px 10px;
 | 
				
			||||||
 | 
					          stroke-dashoffset: 0px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          stroke-dasharray: 0.1px 10px;
 | 
				
			||||||
 | 
					          stroke-dashoffset: -1px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          stroke-dasharray: 3px 10px;
 | 
				
			||||||
 | 
					          stroke-dashoffset: 0px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-sun-shiny line {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 2s;
 | 
				
			||||||
 | 
					        animation-duration: 2s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="translate(0,16)">
 | 
				
			||||||
 | 
					      <g class="am-weather-sun"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" stroke-width="2" />
 | 
				
			||||||
 | 
					        <g transform="rotate(45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(135)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="scale(-1)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(225)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-cloud-2"
 | 
				
			||||||
 | 
					      style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <path transform="translate(-20,-11)"
 | 
				
			||||||
 | 
					        d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					        fill="#c6deff" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 6.8 KiB  | 
							
								
								
									
										206
									
								
								public/weather-ico/cloudy-1-night.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,206 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.19471" y="-.26087" width="1.3744" height="1.6884">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** CLOUDS
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 3s;
 | 
				
			||||||
 | 
					        animation-duration: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** MOON
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          transform: rotate(15deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 6s;
 | 
				
			||||||
 | 
					        animation-duration: 6s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -webkit-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        -moz-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        -ms-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 3s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 3s;
 | 
				
			||||||
 | 
					        animation-delay: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 5s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 5s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 5s;
 | 
				
			||||||
 | 
					        animation-duration: 5s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        animation-iteration-count: 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 5s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 5s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 5s;
 | 
				
			||||||
 | 
					        animation-delay: 5s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 4s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 4s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 4s;
 | 
				
			||||||
 | 
					        animation-duration: 4s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        animation-iteration-count: 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="matrix(.8 0 0 .8 16 4)">
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-1"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon points="1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3 4 4 3.3 5.2 2.7 4" fill="#ffa500"
 | 
				
			||||||
 | 
					          stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-2"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon transform="translate(20,10)" points="1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3 4 4 3.3 5.2 2.7 4"
 | 
				
			||||||
 | 
					          fill="#ffa500" stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0">
 | 
				
			||||||
 | 
					        <path
 | 
				
			||||||
 | 
					          d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z"
 | 
				
			||||||
 | 
					          fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-cloud-2"
 | 
				
			||||||
 | 
					      style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <path transform="translate(-20,-11)"
 | 
				
			||||||
 | 
					        d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					        fill="#c6deff" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 8.6 KiB  | 
							
								
								
									
										244
									
								
								public/weather-ico/fog-day.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,244 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.20655" y="-.21122" width="1.403" height="1.4997">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** SUN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-sun {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          transform: rotate(360deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-sun {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 9s;
 | 
				
			||||||
 | 
					        animation-duration: 9s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** FOG
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-fog-1 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          transform: translate(7px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-fog-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-fog-1;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-fog-1;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-fog-1;
 | 
				
			||||||
 | 
					        animation-name: am-weather-fog-1;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 8s;
 | 
				
			||||||
 | 
					        animation-duration: 8s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-fog-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        21.05% {
 | 
				
			||||||
 | 
					          transform: translate(-6px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        78.95% {
 | 
				
			||||||
 | 
					          transform: translate(9px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-fog-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-fog-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-fog-2;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-fog-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-fog-2;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 20s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 20s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 20s;
 | 
				
			||||||
 | 
					        animation-duration: 20s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-fog-3 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        25% {
 | 
				
			||||||
 | 
					          transform: translate(4px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        75% {
 | 
				
			||||||
 | 
					          transform: translate(-4px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-fog-3 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-fog-3;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-fog-3;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-fog-3;
 | 
				
			||||||
 | 
					        animation-name: am-weather-fog-3;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 6s;
 | 
				
			||||||
 | 
					        animation-duration: 6s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-fog-4 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          transform: translate(-4px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-fog-4 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-fog-4;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-fog-4;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-fog-4;
 | 
				
			||||||
 | 
					        animation-name: am-weather-fog-4;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 6s;
 | 
				
			||||||
 | 
					        animation-duration: 6s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="translate(0,16)">
 | 
				
			||||||
 | 
					      <g class="am-weather-sun" transform="translate(0,16)">
 | 
				
			||||||
 | 
					        <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" stroke-width="2" />
 | 
				
			||||||
 | 
					        <g transform="rotate(45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(135)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="scale(-1)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />F
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(225)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <circle r="5" fill="#ffc04a" stroke="#ffc04a" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-fog" transform="translate(-10,20)" fill="none" stroke="#c6deff" stroke-linecap="round"
 | 
				
			||||||
 | 
					      stroke-width="2">
 | 
				
			||||||
 | 
					      <line class="am-weather-fog-1" y1="0" y2="0" x1="1" x2="37" stroke-dasharray="3, 5, 17, 5, 7" />
 | 
				
			||||||
 | 
					      <line class="am-weather-fog-2" y1="5" y2="5" x1="9" x2="33" stroke-dasharray="11, 7, 15" />
 | 
				
			||||||
 | 
					      <line class="am-weather-fog-3" y1="10" y2="10" x1="5" x2="40" stroke-dasharray="11, 7, 3, 5, 9" />
 | 
				
			||||||
 | 
					      <line class="am-weather-fog-4" y1="15" y2="15" x1="7" x2="42" stroke-dasharray="13, 5, 9, 5, 3" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 8.0 KiB  | 
							
								
								
									
										309
									
								
								public/weather-ico/fog-night.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,309 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.20655" y="-.21122" width="1.403" height="1.4997">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** MOON
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          transform: rotate(15deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 6s;
 | 
				
			||||||
 | 
					        animation-duration: 6s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -webkit-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        -moz-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        -ms-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 3s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 3s;
 | 
				
			||||||
 | 
					        animation-delay: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 5s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 5s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 5s;
 | 
				
			||||||
 | 
					        animation-duration: 5s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        animation-iteration-count: 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 5s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 5s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 5s;
 | 
				
			||||||
 | 
					        animation-delay: 5s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 4s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 4s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 4s;
 | 
				
			||||||
 | 
					        animation-duration: 4s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        animation-iteration-count: 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** FOG
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-fog-1 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          transform: translate(7px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-fog-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-fog-1;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-fog-1;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-fog-1;
 | 
				
			||||||
 | 
					        animation-name: am-weather-fog-1;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 8s;
 | 
				
			||||||
 | 
					        animation-duration: 8s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-fog-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        21.05% {
 | 
				
			||||||
 | 
					          transform: translate(-6px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        78.95% {
 | 
				
			||||||
 | 
					          transform: translate(9px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-fog-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-fog-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-fog-2;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-fog-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-fog-2;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 20s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 20s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 20s;
 | 
				
			||||||
 | 
					        animation-duration: 20s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-fog-3 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        25% {
 | 
				
			||||||
 | 
					          transform: translate(4px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        75% {
 | 
				
			||||||
 | 
					          transform: translate(-4px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-fog-3 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-fog-3;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-fog-3;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-fog-3;
 | 
				
			||||||
 | 
					        animation-name: am-weather-fog-3;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 6s;
 | 
				
			||||||
 | 
					        animation-duration: 6s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-fog-4 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          transform: translate(-4px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-fog-4 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-fog-4;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-fog-4;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-fog-4;
 | 
				
			||||||
 | 
					        animation-name: am-weather-fog-4;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 6s;
 | 
				
			||||||
 | 
					        animation-duration: 6s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="matrix(.8 0 0 .8 16 4)">
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-1"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffc04a"
 | 
				
			||||||
 | 
					          stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-2"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3"
 | 
				
			||||||
 | 
					          fill="#ffc04a" stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0">
 | 
				
			||||||
 | 
					        <path
 | 
				
			||||||
 | 
					          d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z"
 | 
				
			||||||
 | 
					          fill="#ffc04a" stroke="#ffc04a" stroke-linejoin="round" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-fog" transform="translate(-10,20)" fill="none" stroke="#c6deff" stroke-linecap="round"
 | 
				
			||||||
 | 
					      stroke-width="2">
 | 
				
			||||||
 | 
					      <line class="am-weather-fog-1" y1="0" y2="0" x1="1" x2="37" stroke-dasharray="3, 5, 17, 5, 7" />
 | 
				
			||||||
 | 
					      <line class="am-weather-fog-2" y1="5" y2="5" x1="9" x2="33" stroke-dasharray="11, 7, 15" />
 | 
				
			||||||
 | 
					      <line class="am-weather-fog-3" y1="10" y2="10" x1="5" x2="40" stroke-dasharray="11, 7, 3, 5, 9" />
 | 
				
			||||||
 | 
					      <line class="am-weather-fog-4" y1="15" y2="15" x1="7" x2="42" stroke-dasharray="13, 5, 9, 5, 3" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 11 KiB  | 
							
								
								
									
										204
									
								
								public/weather-ico/frost-day.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,204 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.20655" y="-.21122" width="1.403" height="1.4997">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** SUN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-sun {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          transform: rotate(360deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-sun {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 9s;
 | 
				
			||||||
 | 
					        animation-duration: 9s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** FROST
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-frost {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        1% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        3% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        5% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        7% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        9% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        11% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        13% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        15% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        16% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-frost {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-frost;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-frost;
 | 
				
			||||||
 | 
					        animation-name: am-weather-frost;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 1.11s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 1.11s;
 | 
				
			||||||
 | 
					        animation-duration: 1.11s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="translate(0,16)">
 | 
				
			||||||
 | 
					      <g class="am-weather-sun" transform="translate(0,16)">
 | 
				
			||||||
 | 
					        <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" stroke-width="2" />
 | 
				
			||||||
 | 
					        <g transform="rotate(45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(135)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="scale(-1)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />F
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(225)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <circle r="5" fill="#ffc04a" stroke="#ffc04a" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g transform="translate(-16,4)">
 | 
				
			||||||
 | 
					      <g class="am-weather-frost" stroke="#57a0ee" transform="translate(0,2)" fill="none" stroke-width="2"
 | 
				
			||||||
 | 
					        stroke-linecap="round"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:1.11s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-frost;-moz-animation-timing-function:linear;-webkit-animation-duration:1.11s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-frost;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <path d="M11,32H45" />
 | 
				
			||||||
 | 
					        <path d="M15.5,37H40.5" />
 | 
				
			||||||
 | 
					        <path d="M22.5,42H33.5" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g>
 | 
				
			||||||
 | 
					        <path stroke="#57a0ee" transform="translate(0,0)" fill="none" stroke-width="2" stroke-linecap="round"
 | 
				
			||||||
 | 
					          d="M28,31V9M28,22l11,-3.67M34,20l2,-4M34,20l4,2M28,22l-11,-3.67M22,20l-2,-4M22,20l-4,2M28,14.27l3.01,-3.02M28,14.27l-3.01,-3.02" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 7.3 KiB  | 
							
								
								
									
										269
									
								
								public/weather-ico/frost-night.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,269 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.20655" y="-.21122" width="1.403" height="1.4997">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** MOON
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          transform: rotate(15deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 6s;
 | 
				
			||||||
 | 
					        animation-duration: 6s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -webkit-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        -moz-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        -ms-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 3s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 3s;
 | 
				
			||||||
 | 
					        animation-delay: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 5s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 5s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 5s;
 | 
				
			||||||
 | 
					        animation-duration: 5s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        animation-iteration-count: 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 5s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 5s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 5s;
 | 
				
			||||||
 | 
					        animation-delay: 5s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 4s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 4s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 4s;
 | 
				
			||||||
 | 
					        animation-duration: 4s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        animation-iteration-count: 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** FROST
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-frost {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        1% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        3% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        5% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        7% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        9% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        11% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        13% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        15% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(-0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        16% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-frost {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-frost;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-frost;
 | 
				
			||||||
 | 
					        animation-name: am-weather-frost;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 1.11s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 1.11s;
 | 
				
			||||||
 | 
					        animation-duration: 1.11s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="matrix(.8 0 0 .8 16 4)">
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-1"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffc04a"
 | 
				
			||||||
 | 
					          stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-2"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3"
 | 
				
			||||||
 | 
					          fill="#ffc04a" stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0">
 | 
				
			||||||
 | 
					        <path
 | 
				
			||||||
 | 
					          d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z"
 | 
				
			||||||
 | 
					          fill="#ffc04a" stroke="#ffc04a" stroke-linejoin="round" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g transform="translate(-16,4)">
 | 
				
			||||||
 | 
					      <g class="am-weather-frost" stroke="#57a0ee" transform="translate(0,2)" fill="none" stroke-width="2"
 | 
				
			||||||
 | 
					        stroke-linecap="round"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:1.11s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-frost;-moz-animation-timing-function:linear;-webkit-animation-duration:1.11s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-frost;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <path d="M11,32H45" />
 | 
				
			||||||
 | 
					        <path d="M15.5,37H40.5" />
 | 
				
			||||||
 | 
					        <path d="M22.5,42H33.5" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g>
 | 
				
			||||||
 | 
					        <path stroke="#57a0ee" transform="translate(0,0)" fill="none" stroke-width="2" stroke-linecap="round"
 | 
				
			||||||
 | 
					          d="M28,31V9M28,22l11,-3.67M34,20l2,-4M34,20l4,2M28,22l-11,-3.67M22,20l-2,-4M22,20l-4,2M28,14.27l3.01,-3.02M28,14.27l-3.01,-3.02" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 11 KiB  | 
							
								
								
									
										141
									
								
								public/weather-ico/rain-and-sleet-mix.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,141 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<!-- Mix of Rain and Sleet | Contributed by hsoJ95 on GitHub: https://github.com/hsoj95 -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.24684" y="-.22776" width="1.4937" height="1.5756">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** RAIN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-rain {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          stroke-dashoffset: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          stroke-dashoffset: -100;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-rain-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 8s;
 | 
				
			||||||
 | 
					        animation-duration: 8s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-rain-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 8s;
 | 
				
			||||||
 | 
					        animation-duration: 8s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** CLOUDS
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-cloud-3 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-cloud-3 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-cloud-3;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-cloud-3;
 | 
				
			||||||
 | 
					        animation-name: am-weather-cloud-3;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 3s;
 | 
				
			||||||
 | 
					        animation-duration: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g class="am-weather-cloud-3"
 | 
				
			||||||
 | 
					      style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-3;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-3;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <path transform="translate(-20,-11)"
 | 
				
			||||||
 | 
					        d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					        fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-sleet-2" transform="translate(-20,-10) rotate(10,-247.39,200.17)" fill="none" stroke="#91c0f8"
 | 
				
			||||||
 | 
					      stroke-linecap="round">
 | 
				
			||||||
 | 
					      <line class="am-weather-rain-1" transform="translate(-5,1)" y2="8" stroke-dasharray="0.1, 7" stroke-width="2"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					      <line class="am-weather-rain-1" transform="translate(5)" y2="8" stroke-dasharray="0.1, 7" stroke-width="2"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-rain-3" transform="translate(-20,-10) rotate(10,-245.89,217.31)" fill="none" stroke="#91c0f8"
 | 
				
			||||||
 | 
					      stroke-dasharray="4, 7" stroke-linecap="round" stroke-width="2">
 | 
				
			||||||
 | 
					      <line class="am-weather-rain-1" transform="translate(-13,1)" y2="8"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					      <line class="am-weather-rain-1" transform="translate(-3,2)" y2="8"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					      <line class="am-weather-rain-2" transform="translate(7,-1)" y2="8"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:0.25s;-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-delay:0.25s;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-delay:0.25s;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 7.6 KiB  | 
							
								
								
									
										179
									
								
								public/weather-ico/rainy-1-day.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,179 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.20655" y="-.21122" width="1.403" height="1.4997">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** SUN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-sun {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          transform: rotate(360deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-sun {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 9s;
 | 
				
			||||||
 | 
					        animation-duration: 9s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** CLOUDS
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 3s;
 | 
				
			||||||
 | 
					        animation-duration: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** RAIN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-rain {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          stroke-dashoffset: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          stroke-dashoffset: -100;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-rain-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 8s;
 | 
				
			||||||
 | 
					        animation-duration: 8s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="translate(0,16)">
 | 
				
			||||||
 | 
					      <g class="am-weather-sun"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" stroke-width="2" />
 | 
				
			||||||
 | 
					        <g transform="rotate(45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(135)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="scale(-1)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(225)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-cloud-3"
 | 
				
			||||||
 | 
					      style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <path transform="translate(-20,-11)"
 | 
				
			||||||
 | 
					        d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					        fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-rain-1" transform="translate(-20,-10) rotate(10,-238.68,233.96)">
 | 
				
			||||||
 | 
					      <line class="am-weather-rain-1" transform="translate(-6,1)" y2="8" fill="none" stroke="#91c0f8"
 | 
				
			||||||
 | 
					        stroke-dasharray="4, 7" stroke-linecap="round" stroke-width="2"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 7.4 KiB  | 
							
								
								
									
										243
									
								
								public/weather-ico/rainy-1-night.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,243 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.20655" y="-.21122" width="1.403" height="1.4997">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** MOON
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          transform: rotate(15deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 6s;
 | 
				
			||||||
 | 
					        animation-duration: 6s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -webkit-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        -moz-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        -ms-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 3s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 3s;
 | 
				
			||||||
 | 
					        animation-delay: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 5s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 5s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 5s;
 | 
				
			||||||
 | 
					        animation-duration: 5s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        animation-iteration-count: 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 5s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 5s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 5s;
 | 
				
			||||||
 | 
					        animation-delay: 5s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 4s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 4s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 4s;
 | 
				
			||||||
 | 
					        animation-duration: 4s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        animation-iteration-count: 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** CLOUDS
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 3s;
 | 
				
			||||||
 | 
					        animation-duration: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** RAIN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-rain {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          stroke-dashoffset: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          stroke-dashoffset: -100;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-rain-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 8s;
 | 
				
			||||||
 | 
					        animation-duration: 8s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="matrix(.8 0 0 .8 16 4)">
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-1"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffa500"
 | 
				
			||||||
 | 
					          stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-2"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3"
 | 
				
			||||||
 | 
					          fill="#ffa500" stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0">
 | 
				
			||||||
 | 
					        <path
 | 
				
			||||||
 | 
					          d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z"
 | 
				
			||||||
 | 
					          fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-cloud-3"
 | 
				
			||||||
 | 
					      style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <path transform="translate(-20,-11)"
 | 
				
			||||||
 | 
					        d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					        fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weaher-rain-1" transform="translate(-20,-10) rotate(10,-238.68,233.96)">
 | 
				
			||||||
 | 
					      <line class="am-weather-rain-1" transform="translate(-6,1)" y2="8" fill="none" stroke="#91c0f8"
 | 
				
			||||||
 | 
					        stroke-dasharray="4, 7" stroke-linecap="round" stroke-width="2"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 10 KiB  | 
							
								
								
									
										204
									
								
								public/weather-ico/rainy-2-day.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,204 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.20655" y="-.20592" width="1.403" height="1.4872">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** SUN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-sun {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          transform: rotate(360deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-sun {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 9s;
 | 
				
			||||||
 | 
					        animation-duration: 9s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** CLOUDS
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 3s;
 | 
				
			||||||
 | 
					        animation-duration: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** RAIN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-rain {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          stroke-dashoffset: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          stroke-dashoffset: -100;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-rain-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 8s;
 | 
				
			||||||
 | 
					        animation-duration: 8s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-rain-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 8s;
 | 
				
			||||||
 | 
					        animation-duration: 8s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="translate(0,16)">
 | 
				
			||||||
 | 
					      <g class="am-weather-sun"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <line transform="translate(0,9)" y2="3" stroke="#ffa500" stroke-linecap="round" stroke-width="2" fifll="none" />
 | 
				
			||||||
 | 
					        <g transform="rotate(45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(135)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="scale(-1)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(225)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-cloud-3"
 | 
				
			||||||
 | 
					      style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <path transform="translate(-20,-11)"
 | 
				
			||||||
 | 
					        d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					        fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g transform="translate(-20,-10) rotate(10,-245.89,217.31)" fill="none" stroke="#91c0f8" stroke-dasharray="4, 7" stroke-linecap="round"
 | 
				
			||||||
 | 
					      stroke-width="2">
 | 
				
			||||||
 | 
					      <line class="am-weather-rain-1" transform="translate(-6,1)" y2="8"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					      <line class="am-weather-rain-2" transform="translate(0,-1)" y2="8"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:0.25s;-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-delay:0.25s;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-delay:0.25s;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 8.8 KiB  | 
							
								
								
									
										256
									
								
								public/weather-ico/rainy-2-night.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,256 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** CLOUDS
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 3s;
 | 
				
			||||||
 | 
					        animation-duration: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** MOON
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          transform: rotate(15deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 6s;
 | 
				
			||||||
 | 
					        animation-duration: 6s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -webkit-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        -moz-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        -ms-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 3s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 3s;
 | 
				
			||||||
 | 
					        animation-delay: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 5s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 5s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 5s;
 | 
				
			||||||
 | 
					        animation-duration: 5s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        animation-iteration-count: 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 5s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 5s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 5s;
 | 
				
			||||||
 | 
					        animation-delay: 5s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 4s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 4s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 4s;
 | 
				
			||||||
 | 
					        animation-duration: 4s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        animation-iteration-count: 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** RAIN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-rain {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          stroke-dashoffset: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          stroke-dashoffset: -100;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-rain-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 8s;
 | 
				
			||||||
 | 
					        animation-duration: 8s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-rain-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 8s;
 | 
				
			||||||
 | 
					        animation-duration: 8s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g class="layer" transform="translate(16,-2)">
 | 
				
			||||||
 | 
					    <g transform="matrix(.8 0 0 .8 16 4)">
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-1"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffa500"
 | 
				
			||||||
 | 
					          stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-2"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3"
 | 
				
			||||||
 | 
					          fill="#ffa500" stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0">
 | 
				
			||||||
 | 
					        <path
 | 
				
			||||||
 | 
					          d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z"
 | 
				
			||||||
 | 
					          fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-cloud-3"
 | 
				
			||||||
 | 
					      style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <path transform="translate(-20,-11)"
 | 
				
			||||||
 | 
					        d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					        fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-rain-2" transform="translate(-20,-10) rotate(10,34,46)" fill="none" stroke="#91c0f8"
 | 
				
			||||||
 | 
					      stroke-dasharray="4, 7" stroke-linecap="round" stroke-width="2">
 | 
				
			||||||
 | 
					      <line class="am-weather-rain-1" transform="translate(-6,1)" x1="34" x2="34" y1="46" y2="54"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					      <line class="am-weather-rain-2" transform="translate(0,-1)" x1="34" x2="34" y1="46" y2="54"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:0.25s;-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-delay:0.25s;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-delay:0.25s;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 11 KiB  | 
							
								
								
									
										206
									
								
								public/weather-ico/rainy-3-day.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,206 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.24684" y="-.22892" width="1.4937" height="1.5576">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** SUN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-sun {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          transform: rotate(360deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-sun {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 9s;
 | 
				
			||||||
 | 
					        animation-duration: 9s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** RAIN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-rain {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          stroke-dashoffset: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          stroke-dashoffset: -100;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-rain-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 8s;
 | 
				
			||||||
 | 
					        animation-duration: 8s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-rain-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 8s;
 | 
				
			||||||
 | 
					        animation-duration: 8s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** CLOUDS
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 3s;
 | 
				
			||||||
 | 
					        animation-duration: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="translate(0,16)">
 | 
				
			||||||
 | 
					      <g class="am-weather-sun"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <line transform="translate(0,9)" y2="3" stroke="#ffa500" stroke-linecap="round" stroke-width="2" fifll="none" />
 | 
				
			||||||
 | 
					        <g transform="rotate(45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(135)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="scale(-1)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(225)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-cloud-3"
 | 
				
			||||||
 | 
					      style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <path transform="translate(-20,-11)"
 | 
				
			||||||
 | 
					        d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					        fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g transform="translate(-20,-10) rotate(10,-247.39,200.17)" fill="none" stroke="#91c0f8" stroke-dasharray="4, 4"
 | 
				
			||||||
 | 
					      stroke-linecap="round" stroke-width="2">
 | 
				
			||||||
 | 
					      <line class="am-weather-rain-1" transform="translate(-4,1)" y2="8"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					      <line class="am-weather-rain-2" transform="translate(0,-1)" y2="8"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:0.25s;-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-delay:0.25s;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-delay:0.25s;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					      <line class="am-weather-rain-1" transform="translate(4)" y2="8"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 9.3 KiB  | 
							
								
								
									
										270
									
								
								public/weather-ico/rainy-3-night.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,270 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.24684" y="-.22892" width="1.4937" height="1.5576">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** RAIN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-rain {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          stroke-dashoffset: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          stroke-dashoffset: -100;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-rain-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 8s;
 | 
				
			||||||
 | 
					        animation-duration: 8s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-rain-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        animation-name: am-weather-rain;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        animation-delay: 0.25s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 8s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 8s;
 | 
				
			||||||
 | 
					        animation-duration: 8s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** MOON
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          transform: rotate(15deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 6s;
 | 
				
			||||||
 | 
					        animation-duration: 6s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -webkit-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        -moz-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        -ms-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 3s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 3s;
 | 
				
			||||||
 | 
					        animation-delay: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 5s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 5s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 5s;
 | 
				
			||||||
 | 
					        animation-duration: 5s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        animation-iteration-count: 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 5s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 5s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 5s;
 | 
				
			||||||
 | 
					        animation-delay: 5s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 4s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 4s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 4s;
 | 
				
			||||||
 | 
					        animation-duration: 4s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        animation-iteration-count: 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** CLOUDS
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 3s;
 | 
				
			||||||
 | 
					        animation-duration: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="matrix(.8 0 0 .8 16 4)">
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-1"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffa500"
 | 
				
			||||||
 | 
					          stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-2"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3"
 | 
				
			||||||
 | 
					          fill="#ffa500" stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0">
 | 
				
			||||||
 | 
					        <path
 | 
				
			||||||
 | 
					          d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z"
 | 
				
			||||||
 | 
					          fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-cloud-3"
 | 
				
			||||||
 | 
					      style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <path transform="translate(-20,-11)"
 | 
				
			||||||
 | 
					        d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					        fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g transform="translate(-20,-10) rotate(10,-247.39,200.17)" fill="none" stroke="#91c0f8" stroke-dasharray="4, 4"
 | 
				
			||||||
 | 
					      stroke-linecap="round" stroke-width="2">
 | 
				
			||||||
 | 
					      <line class="am-weather-rain-1" transform="translate(-4,1)" y2="8"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					      <line class="am-weather-rain-2" transform="translate(0,-1)" y2="8"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:0.25s;-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-delay:0.25s;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-delay:0.25s;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					      <line class="am-weather-rain-1" transform="translate(4)" y2="8"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 12 KiB  | 
							
								
								
									
										374
									
								
								public/weather-ico/scattered-thunderstorms-day.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,374 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<!-- Scattered Thunderstorms | Contributed by hsoJ95 on GitHub: https://github.com/hsoj95 -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.20655" y="-.1975" width="1.403" height="1.4766">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** CLOUDS
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-cloud-3 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(10px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(10px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(10px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(10px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-cloud-3 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-cloud-3;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-cloud-3;
 | 
				
			||||||
 | 
					        animation-name: am-weather-cloud-3;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 7s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 7s;
 | 
				
			||||||
 | 
					        animation-duration: 7s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 3s;
 | 
				
			||||||
 | 
					        animation-duration: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** SUN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-sun {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          transform: rotate(360deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-sun {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 9s;
 | 
				
			||||||
 | 
					        animation-duration: 9s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-sun-shiny {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          stroke-dasharray: 3px 10px;
 | 
				
			||||||
 | 
					          stroke-dashoffset: 0px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          stroke-dasharray: 0.1px 10px;
 | 
				
			||||||
 | 
					          stroke-dashoffset: -1px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          stroke-dasharray: 3px 10px;
 | 
				
			||||||
 | 
					          stroke-dashoffset: 0px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-sun-shiny line {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 2s;
 | 
				
			||||||
 | 
					        animation-duration: 2s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** STROKE
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-stroke {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        2% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        4% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        6% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.5px, 0.4px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.5px, 0.4px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.5px, 0.4px);
 | 
				
			||||||
 | 
					          transform: translate(0.5px, 0.4px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        8% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        10% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        12% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        14% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        16% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        18% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        20% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        22% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(1px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(1px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(1px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(1px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        24% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        26% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(-1px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(-1px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(-1px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(-1px, 0.0px);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        28% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        40% {
 | 
				
			||||||
 | 
					          fill: orange;
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        65% {
 | 
				
			||||||
 | 
					          fill: white;
 | 
				
			||||||
 | 
					          -webkit-transform: translate(-1px, 5.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(-1px, 5.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(-1px, 5.0px);
 | 
				
			||||||
 | 
					          transform: translate(-1px, 5.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        61% {
 | 
				
			||||||
 | 
					          fill: orange;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-stroke {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-stroke;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-stroke;
 | 
				
			||||||
 | 
					        animation-name: am-weather-stroke;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 1.11s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 1.11s;
 | 
				
			||||||
 | 
					        animation-duration: 1.11s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g id="thunder" transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="translate(0,16)">
 | 
				
			||||||
 | 
					      <g class="am-weather-sun"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" stroke-width="2" />
 | 
				
			||||||
 | 
					        <g transform="rotate(45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(135)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="scale(-1)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(225)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-cloud-3">
 | 
				
			||||||
 | 
					      <path transform="translate(-20,-11)"
 | 
				
			||||||
 | 
					        d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					        fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-lightning" transform="matrix(1.2,0,0,1.2,-4,28)">
 | 
				
			||||||
 | 
					      <polygon class="am-weather-stroke" points="11.1 6.9 14.3 -2.9 20.5 -2.9 16.4 4.3 20.3 4.3 11.5 14.6 14.9 6.9"
 | 
				
			||||||
 | 
					        fill="#ffa500" stroke="#fff"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:1.11s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-stroke;-moz-animation-timing-function:linear;-webkit-animation-duration:1.11s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-stroke;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 13 KiB  | 
							
								
								
									
										283
									
								
								public/weather-ico/scattered-thunderstorms-night.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,283 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<!-- Scattered Thunderstorms | Contributed by hsoJ95 on GitHub: https://github.com/hsoj95 -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.20655" y="-.1975" width="1.403" height="1.4766">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** CLOUDS
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-cloud-3 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(10px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(10px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(10px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(10px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-cloud-3 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-cloud-3;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-cloud-3;
 | 
				
			||||||
 | 
					        animation-name: am-weather-cloud-3;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 7s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 7s;
 | 
				
			||||||
 | 
					        animation-duration: 7s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 3s;
 | 
				
			||||||
 | 
					        animation-duration: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** STROKE
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-stroke {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        2% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        4% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        6% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.5px, 0.4px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.5px, 0.4px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.5px, 0.4px);
 | 
				
			||||||
 | 
					          transform: translate(0.5px, 0.4px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        8% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        10% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        12% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        14% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        16% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        18% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        20% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        22% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(1px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(1px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(1px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(1px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        24% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        26% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(-1px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(-1px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(-1px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(-1px, 0.0px);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        28% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        40% {
 | 
				
			||||||
 | 
					          fill: orange;
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        65% {
 | 
				
			||||||
 | 
					          fill: white;
 | 
				
			||||||
 | 
					          -webkit-transform: translate(-1px, 5.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(-1px, 5.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(-1px, 5.0px);
 | 
				
			||||||
 | 
					          transform: translate(-1px, 5.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        61% {
 | 
				
			||||||
 | 
					          fill: orange;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					          transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-stroke {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-stroke;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-stroke;
 | 
				
			||||||
 | 
					        animation-name: am-weather-stroke;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 1.11s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 1.11s;
 | 
				
			||||||
 | 
					        animation-duration: 1.11s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g id="thunder" transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="matrix(.8 0 0 .8 16 4)">
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-1"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon points="3.3 1.5 4 2.7 5.2 3.3 4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7" fill="#ffa500"
 | 
				
			||||||
 | 
					          stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-2"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon transform="translate(20,10)" points="3.3 1.5 4 2.7 5.2 3.3 4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7"
 | 
				
			||||||
 | 
					          fill="#ffa500" stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0">
 | 
				
			||||||
 | 
					        <path
 | 
				
			||||||
 | 
					          d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z"
 | 
				
			||||||
 | 
					          fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-cloud-3">
 | 
				
			||||||
 | 
					      <path transform="translate(-20,-11)"
 | 
				
			||||||
 | 
					        d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					        fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-lightning" transform="matrix(1.2,0,0,1.2,-4,28)">
 | 
				
			||||||
 | 
					      <polygon class="am-weather-stroke" points="11.1 6.9 14.3 -2.9 20.5 -2.9 16.4 4.3 20.3 4.3 11.5 14.6 14.9 6.9"
 | 
				
			||||||
 | 
					        fill="#ffa500" stroke="#fff"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:1.11s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-stroke;-moz-animation-timing-function:linear;-webkit-animation-duration:1.11s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-stroke;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 11 KiB  | 
							
								
								
									
										307
									
								
								public/weather-ico/severe-thunderstorm.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,307 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<!-- Severe Thunderstorm | Contributed by hsoJ95 on GitHub: https://github.com/hsoj95 -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					    <defs>
 | 
				
			||||||
 | 
					        <filter id="blur" x="-.17571" y="-.19575" width="1.3379" height="1.4959">
 | 
				
			||||||
 | 
					            <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					            <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					            <feComponentTransfer>
 | 
				
			||||||
 | 
					                <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					            </feComponentTransfer>
 | 
				
			||||||
 | 
					            <feMerge>
 | 
				
			||||||
 | 
					                <feMergeNode />
 | 
				
			||||||
 | 
					                <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					            </feMerge>
 | 
				
			||||||
 | 
					        </filter>
 | 
				
			||||||
 | 
					        <style type="text/css">
 | 
				
			||||||
 | 
					            <![CDATA[
 | 
				
			||||||
 | 
					            /*
 | 
				
			||||||
 | 
					** CLOUDS
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					            @keyframes am-weather-cloud-3 {
 | 
				
			||||||
 | 
					                0% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					                    transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                50% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(10px, 0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(10px, 0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(10px, 0px);
 | 
				
			||||||
 | 
					                    transform: translate(10px, 0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                100% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					                    transform: translate(-5px, 0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            .am-weather-cloud-3 {
 | 
				
			||||||
 | 
					                -webkit-animation-name: am-weather-cloud-3;
 | 
				
			||||||
 | 
					                -moz-animation-name: am-weather-cloud-3;
 | 
				
			||||||
 | 
					                animation-name: am-weather-cloud-3;
 | 
				
			||||||
 | 
					                -webkit-animation-duration: 7s;
 | 
				
			||||||
 | 
					                -moz-animation-duration: 7s;
 | 
				
			||||||
 | 
					                animation-duration: 7s;
 | 
				
			||||||
 | 
					                -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					                -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					                animation-timing-function: linear;
 | 
				
			||||||
 | 
					                -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					                -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					                animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            @keyframes am-weather-cloud-1 {
 | 
				
			||||||
 | 
					                0% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					                    transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                50% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					                    transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                100% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					                    transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            .am-weather-cloud-1 {
 | 
				
			||||||
 | 
					                -webkit-animation-name: am-weather-cloud-1;
 | 
				
			||||||
 | 
					                -moz-animation-name: am-weather-cloud-1;
 | 
				
			||||||
 | 
					                animation-name: am-weather-cloud-1;
 | 
				
			||||||
 | 
					                -webkit-animation-duration: 3s;
 | 
				
			||||||
 | 
					                -moz-animation-duration: 3s;
 | 
				
			||||||
 | 
					                animation-duration: 3s;
 | 
				
			||||||
 | 
					                -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					                -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					                animation-timing-function: linear;
 | 
				
			||||||
 | 
					                -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					                -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					                animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /*
 | 
				
			||||||
 | 
					** STROKE
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            @keyframes am-weather-stroke {
 | 
				
			||||||
 | 
					                0% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                2% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					                    transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                4% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                6% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(0.5px, 0.4px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(0.5px, 0.4px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(0.5px, 0.4px);
 | 
				
			||||||
 | 
					                    transform: translate(0.5px, 0.4px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                8% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                10% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					                    transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                12% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                14% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					                    transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                16% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                18% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					                    transform: translate(0.3px, 0.0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                20% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                22% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(1px, 0.0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(1px, 0.0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(1px, 0.0px);
 | 
				
			||||||
 | 
					                    transform: translate(1px, 0.0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                24% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                26% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(-1px, 0.0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(-1px, 0.0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(-1px, 0.0px);
 | 
				
			||||||
 | 
					                    transform: translate(-1px, 0.0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                28% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                40% {
 | 
				
			||||||
 | 
					                    fill: orange;
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                65% {
 | 
				
			||||||
 | 
					                    fill: white;
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(-1px, 5.0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(-1px, 5.0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(-1px, 5.0px);
 | 
				
			||||||
 | 
					                    transform: translate(-1px, 5.0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                61% {
 | 
				
			||||||
 | 
					                    fill: orange;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                100% {
 | 
				
			||||||
 | 
					                    -webkit-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -moz-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    -ms-transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                    transform: translate(0.0px, 0.0px);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            .am-weather-stroke {
 | 
				
			||||||
 | 
					                -webkit-animation-name: am-weather-stroke;
 | 
				
			||||||
 | 
					                -moz-animation-name: am-weather-stroke;
 | 
				
			||||||
 | 
					                animation-name: am-weather-stroke;
 | 
				
			||||||
 | 
					                -webkit-animation-duration: 1.11s;
 | 
				
			||||||
 | 
					                -moz-animation-duration: 1.11s;
 | 
				
			||||||
 | 
					                animation-duration: 1.11s;
 | 
				
			||||||
 | 
					                -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					                -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					                animation-timing-function: linear;
 | 
				
			||||||
 | 
					                -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					                -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					                animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            @keyframes error {
 | 
				
			||||||
 | 
					                0% {
 | 
				
			||||||
 | 
					                    fill: #cc0000;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                50% {
 | 
				
			||||||
 | 
					                    fill: #ff0000;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                100% {
 | 
				
			||||||
 | 
					                    fill: #cc0000;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            #Shape {
 | 
				
			||||||
 | 
					                -webkit-animation-name: error;
 | 
				
			||||||
 | 
					                -moz-animation-name: error;
 | 
				
			||||||
 | 
					                animation-name: error;
 | 
				
			||||||
 | 
					                -webkit-animation-duration: 1s;
 | 
				
			||||||
 | 
					                -moz-animation-duration: 1s;
 | 
				
			||||||
 | 
					                animation-duration: 1s;
 | 
				
			||||||
 | 
					                -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					                -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					                animation-timing-function: linear;
 | 
				
			||||||
 | 
					                -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					                -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					                animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            ]]>
 | 
				
			||||||
 | 
					        </style>
 | 
				
			||||||
 | 
					    </defs>
 | 
				
			||||||
 | 
					    <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					        <g class="am-weather-cloud-1"
 | 
				
			||||||
 | 
					            style="-moz-animation-duration:7s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-1;-moz-animation-timing-function:linear;-webkit-animation-duration:7s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-1;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					            <path transform="matrix(.6 0 0 .6 -10 -6)"
 | 
				
			||||||
 | 
					                d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					                fill="#666" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g class="am-weather-cloud-3">
 | 
				
			||||||
 | 
					            <path transform="translate(-20,-11)"
 | 
				
			||||||
 | 
					                d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					                fill="#333" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="matrix(1.2,0,0,1.2,-4,28)">
 | 
				
			||||||
 | 
					            <polygon class="am-weather-stroke"
 | 
				
			||||||
 | 
					                points="11.1 6.9 14.3 -2.9 20.5 -2.9 16.4 4.3 20.3 4.3 11.5 14.6 14.9 6.9" fill="#ffa500" stroke="#fff"
 | 
				
			||||||
 | 
					                style="-moz-animation-duration:1.11s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-stroke;-moz-animation-timing-function:linear;-webkit-animation-duration:1.11s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-stroke;-webkit-animation-timing-function:linear" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g class="warning" transform="translate(20,30)">
 | 
				
			||||||
 | 
					            <path
 | 
				
			||||||
 | 
					                d="m7.7791 2.906-5.9912 10.117c-0.56283 0.95042-0.24862 2.1772 0.7018 2.74 0.30853 0.18271 0.66051 0.27911 1.0191 0.27911h11.982c1.1046 0 2-0.89543 2-2 0-0.35857-0.0964-0.71056-0.27911-1.0191l-5.9912-10.117c-0.56283-0.95042-1.7896-1.2646-2.74-0.7018-0.28918 0.17125-0.53055 0.41262-0.7018 0.7018z"
 | 
				
			||||||
 | 
					                fill="#c00" />
 | 
				
			||||||
 | 
					            <path d="m9.5 10.5v-5" stroke="#fff" stroke-linecap="round" stroke-width="1.5" />
 | 
				
			||||||
 | 
					            <circle cx="9.5" cy="13" r="1" fill="#fff" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 13 KiB  | 
							
								
								
									
										241
									
								
								public/weather-ico/snowy-1-day.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,241 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.20655" y="-.23099" width="1.403" height="1.5634">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** CLOUDS
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 3s;
 | 
				
			||||||
 | 
					        animation-duration: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** SUN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-sun {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          transform: rotate(360deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-sun {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 9s;
 | 
				
			||||||
 | 
					        animation-duration: 9s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-sun-shiny {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          stroke-dasharray: 3px 10px;
 | 
				
			||||||
 | 
					          stroke-dashoffset: 0px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          stroke-dasharray: 0.1px 10px;
 | 
				
			||||||
 | 
					          stroke-dashoffset: -1px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          stroke-dasharray: 3px 10px;
 | 
				
			||||||
 | 
					          stroke-dashoffset: 0px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-sun-shiny line {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 2s;
 | 
				
			||||||
 | 
					        animation-duration: 2s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** SNOW
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-snow {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					          -moz-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					          -ms-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					          transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        33.33% {
 | 
				
			||||||
 | 
					          -webkit-transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					          -moz-transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					          -ms-transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					          transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        66.66% {
 | 
				
			||||||
 | 
					          -webkit-transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					          -moz-transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					          -ms-transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					          transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					          -moz-transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					          -ms-transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					          transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-snow-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 2s;
 | 
				
			||||||
 | 
					        animation-duration: 2s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="translate(0,16)">
 | 
				
			||||||
 | 
					      <g class="am-weather-sun" transform="translate(0,16)"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" stroke-width="2" />
 | 
				
			||||||
 | 
					        <g transform="rotate(45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(135)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="scale(-1)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(225)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-cloud-3"
 | 
				
			||||||
 | 
					      style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <path transform="translate(-20,-11)"
 | 
				
			||||||
 | 
					        d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					        fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-snow-1"
 | 
				
			||||||
 | 
					      style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <g transform="translate(12,28)" fill="none" stroke="#57a0ee" stroke-linecap="round">
 | 
				
			||||||
 | 
					        <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" />
 | 
				
			||||||
 | 
					        <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					        <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					        <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 9.6 KiB  | 
							
								
								
									
										269
									
								
								public/weather-ico/snowy-1-night.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,269 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.20655" y="-.23099" width="1.403" height="1.5634">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** CLOUDS
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 3s;
 | 
				
			||||||
 | 
					        animation-duration: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** MOON
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          transform: rotate(15deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 6s;
 | 
				
			||||||
 | 
					        animation-duration: 6s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -webkit-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        -moz-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        -ms-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 3s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 3s;
 | 
				
			||||||
 | 
					        animation-delay: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 5s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 5s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 5s;
 | 
				
			||||||
 | 
					        animation-duration: 5s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        animation-iteration-count: 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 5s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 5s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 5s;
 | 
				
			||||||
 | 
					        animation-delay: 5s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 4s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 4s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 4s;
 | 
				
			||||||
 | 
					        animation-duration: 4s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        animation-iteration-count: 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** SNOW
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-snow {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					          -moz-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					          -ms-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					          transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        33.33% {
 | 
				
			||||||
 | 
					          -webkit-transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					          -moz-transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					          -ms-transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					          transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        66.66% {
 | 
				
			||||||
 | 
					          -webkit-transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					          -moz-transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					          -ms-transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					          transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					          -moz-transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					          -ms-transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					          transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-snow-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 2s;
 | 
				
			||||||
 | 
					        animation-duration: 2s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="matrix(.8 0 0 .8 16 4)">
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-1"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffa500"
 | 
				
			||||||
 | 
					          stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-2"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3"
 | 
				
			||||||
 | 
					          fill="#ffa500" stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0">
 | 
				
			||||||
 | 
					        <path
 | 
				
			||||||
 | 
					          d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z"
 | 
				
			||||||
 | 
					          fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-cloud-3"
 | 
				
			||||||
 | 
					      style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <path transform="translate(-20,-11)"
 | 
				
			||||||
 | 
					        d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					        fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-snow-1"
 | 
				
			||||||
 | 
					      style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <g transform="translate(12,28)" fill="none" stroke="#57a0ee" stroke-linecap="round">
 | 
				
			||||||
 | 
					        <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" />
 | 
				
			||||||
 | 
					        <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					        <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					        <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 11 KiB  | 
							
								
								
									
										273
									
								
								public/weather-ico/snowy-2-day.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,273 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.20655" y="-.23099" width="1.403" height="1.5634">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** CLOUDS
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 3s;
 | 
				
			||||||
 | 
					        animation-duration: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** SUN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-sun {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(360deg);
 | 
				
			||||||
 | 
					          transform: rotate(360deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-sun {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 9s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 9s;
 | 
				
			||||||
 | 
					        animation-duration: 9s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-sun-shiny {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          stroke-dasharray: 3px 10px;
 | 
				
			||||||
 | 
					          stroke-dashoffset: 0px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          stroke-dasharray: 0.1px 10px;
 | 
				
			||||||
 | 
					          stroke-dashoffset: -1px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          stroke-dasharray: 3px 10px;
 | 
				
			||||||
 | 
					          stroke-dashoffset: 0px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-sun-shiny line {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 2s;
 | 
				
			||||||
 | 
					        animation-duration: 2s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** SNOW
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-snow {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					          -moz-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					          -ms-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					          transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        33.33% {
 | 
				
			||||||
 | 
					          -webkit-transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					          -moz-transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					          -ms-transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					          transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        66.66% {
 | 
				
			||||||
 | 
					          -webkit-transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					          -moz-transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					          -ms-transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					          transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					          -moz-transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					          -ms-transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					          transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-snow-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 2s;
 | 
				
			||||||
 | 
					        animation-duration: 2s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-snow-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 1.2s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 1.2s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 1.2s;
 | 
				
			||||||
 | 
					        animation-delay: 1.2s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 2s;
 | 
				
			||||||
 | 
					        animation-duration: 2s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="translate(0,16)">
 | 
				
			||||||
 | 
					      <g class="am-weather-sun"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" stroke-width="2" />
 | 
				
			||||||
 | 
					        <g transform="rotate(45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(135)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="scale(-1)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(225)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-90)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					        <g transform="rotate(-45)">
 | 
				
			||||||
 | 
					          <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					            stroke-width="2" />
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-cloud-3"
 | 
				
			||||||
 | 
					      style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <path transform="translate(-20,-11)"
 | 
				
			||||||
 | 
					        d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					        fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-snow-1"
 | 
				
			||||||
 | 
					      style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <g transform="translate(7,28)" fill="none" stroke="#57a0ee" stroke-linecap="round">
 | 
				
			||||||
 | 
					        <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" />
 | 
				
			||||||
 | 
					        <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					        <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					        <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-snow-2"
 | 
				
			||||||
 | 
					      style="-moz-animation-delay:1.2s;-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-delay:1.2s;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-delay:1.2s;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <g transform="translate(16,28)" fill="none" stroke="#57a0ee" stroke-linecap="round">
 | 
				
			||||||
 | 
					        <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" />
 | 
				
			||||||
 | 
					        <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					        <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					        <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 11 KiB  | 
							
								
								
									
										301
									
								
								public/weather-ico/snowy-2-night.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,301 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <defs>
 | 
				
			||||||
 | 
					    <filter id="blur" x="-.20655" y="-.23099" width="1.403" height="1.5634">
 | 
				
			||||||
 | 
					      <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					      <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					      <feComponentTransfer>
 | 
				
			||||||
 | 
					        <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					      </feComponentTransfer>
 | 
				
			||||||
 | 
					      <feMerge>
 | 
				
			||||||
 | 
					        <feMergeNode />
 | 
				
			||||||
 | 
					        <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					      </feMerge>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					      <![CDATA[
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** CLOUDS
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					          transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-cloud-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 3s;
 | 
				
			||||||
 | 
					        animation-duration: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** MOON
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(15deg);
 | 
				
			||||||
 | 
					          transform: rotate(15deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					          transform: rotate(0deg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 6s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 6s;
 | 
				
			||||||
 | 
					        animation-duration: 6s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -webkit-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        -moz-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        -ms-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					        transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					        /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 3s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 3s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 3s;
 | 
				
			||||||
 | 
					        animation-delay: 3s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 5s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 5s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 5s;
 | 
				
			||||||
 | 
					        animation-duration: 5s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        animation-iteration-count: 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @keyframes am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 5s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 5s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 5s;
 | 
				
			||||||
 | 
					        animation-delay: 5s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 4s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 4s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 4s;
 | 
				
			||||||
 | 
					        animation-duration: 4s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					        animation-iteration-count: 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					** SNOW
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					      @keyframes am-weather-snow {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					          -webkit-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					          -moz-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					          -ms-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					          transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        33.33% {
 | 
				
			||||||
 | 
					          -webkit-transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					          -moz-transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					          -ms-transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					          transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        66.66% {
 | 
				
			||||||
 | 
					          -webkit-transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					          -moz-transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					          -ms-transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					          transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					          opacity: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					          -webkit-transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					          -moz-transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					          -ms-transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					          transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					          opacity: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-snow-1 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 2s;
 | 
				
			||||||
 | 
					        animation-duration: 2s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .am-weather-snow-2 {
 | 
				
			||||||
 | 
					        -webkit-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        -moz-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        -ms-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					        -webkit-animation-delay: 1.2s;
 | 
				
			||||||
 | 
					        -moz-animation-delay: 1.2s;
 | 
				
			||||||
 | 
					        -ms-animation-delay: 1.2s;
 | 
				
			||||||
 | 
					        animation-delay: 1.2s;
 | 
				
			||||||
 | 
					        -webkit-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -moz-animation-duration: 2s;
 | 
				
			||||||
 | 
					        -ms-animation-duration: 2s;
 | 
				
			||||||
 | 
					        animation-duration: 2s;
 | 
				
			||||||
 | 
					        -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					        animation-timing-function: linear;
 | 
				
			||||||
 | 
					        -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					        animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ]]>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </defs>
 | 
				
			||||||
 | 
					  <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					    <g transform="matrix(.8 0 0 .8 16 4)">
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-1"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffa500"
 | 
				
			||||||
 | 
					          stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon-star-2"
 | 
				
			||||||
 | 
					        style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					        <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3"
 | 
				
			||||||
 | 
					          fill="#ffa500" stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-moon"
 | 
				
			||||||
 | 
					        style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0">
 | 
				
			||||||
 | 
					        <path
 | 
				
			||||||
 | 
					          d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z"
 | 
				
			||||||
 | 
					          fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-cloud-3"
 | 
				
			||||||
 | 
					      style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <path transform="translate(-20,-11)"
 | 
				
			||||||
 | 
					        d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					        fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-snow-1"
 | 
				
			||||||
 | 
					      style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <g transform="translate(7,28)" fill="none" stroke="#57a0ee" stroke-linecap="round">
 | 
				
			||||||
 | 
					        <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" />
 | 
				
			||||||
 | 
					        <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					        <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					        <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g class="am-weather-snow-2"
 | 
				
			||||||
 | 
					      style="-moz-animation-delay:1.2s;-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-delay:1.2s;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-delay:1.2s;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					      <g transform="translate(16,28)" fill="none" stroke="#57a0ee" stroke-linecap="round">
 | 
				
			||||||
 | 
					        <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" />
 | 
				
			||||||
 | 
					        <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					        <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					        <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 13 KiB  | 
							
								
								
									
										334
									
								
								public/weather-ico/snowy-3-day.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,334 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					   <defs>
 | 
				
			||||||
 | 
					      <filter id="blur" x="-.24684" y="-.26897" width="1.4937" height="1.6759">
 | 
				
			||||||
 | 
					         <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					         <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					         <feComponentTransfer>
 | 
				
			||||||
 | 
					            <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					         </feComponentTransfer>
 | 
				
			||||||
 | 
					         <feMerge>
 | 
				
			||||||
 | 
					            <feMergeNode />
 | 
				
			||||||
 | 
					            <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					         </feMerge>
 | 
				
			||||||
 | 
					      </filter>
 | 
				
			||||||
 | 
					      <style type="text/css">
 | 
				
			||||||
 | 
					         <![CDATA[
 | 
				
			||||||
 | 
					         /*
 | 
				
			||||||
 | 
					** CLOUDS
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					         @keyframes am-weather-cloud-2 {
 | 
				
			||||||
 | 
					            0% {
 | 
				
			||||||
 | 
					               -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					               -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					               -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					               transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            50% {
 | 
				
			||||||
 | 
					               -webkit-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					               -moz-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					               -ms-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					               transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            100% {
 | 
				
			||||||
 | 
					               -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					               -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					               -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					               transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         .am-weather-cloud-2 {
 | 
				
			||||||
 | 
					            -webkit-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					            -moz-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					            animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					            -webkit-animation-duration: 3s;
 | 
				
			||||||
 | 
					            -moz-animation-duration: 3s;
 | 
				
			||||||
 | 
					            animation-duration: 3s;
 | 
				
			||||||
 | 
					            -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         /*
 | 
				
			||||||
 | 
					** SUN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					         @keyframes am-weather-sun {
 | 
				
			||||||
 | 
					            0% {
 | 
				
			||||||
 | 
					               -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					               -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					               -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					               transform: rotate(0deg);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            100% {
 | 
				
			||||||
 | 
					               -webkit-transform: rotate(360deg);
 | 
				
			||||||
 | 
					               -moz-transform: rotate(360deg);
 | 
				
			||||||
 | 
					               -ms-transform: rotate(360deg);
 | 
				
			||||||
 | 
					               transform: rotate(360deg);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         .am-weather-sun {
 | 
				
			||||||
 | 
					            -webkit-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					            -moz-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					            -ms-animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					            animation-name: am-weather-sun;
 | 
				
			||||||
 | 
					            -webkit-animation-duration: 9s;
 | 
				
			||||||
 | 
					            -moz-animation-duration: 9s;
 | 
				
			||||||
 | 
					            -ms-animation-duration: 9s;
 | 
				
			||||||
 | 
					            animation-duration: 9s;
 | 
				
			||||||
 | 
					            -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         @keyframes am-weather-sun-shiny {
 | 
				
			||||||
 | 
					            0% {
 | 
				
			||||||
 | 
					               stroke-dasharray: 3px 10px;
 | 
				
			||||||
 | 
					               stroke-dashoffset: 0px;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            50% {
 | 
				
			||||||
 | 
					               stroke-dasharray: 0.1px 10px;
 | 
				
			||||||
 | 
					               stroke-dashoffset: -1px;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            100% {
 | 
				
			||||||
 | 
					               stroke-dasharray: 3px 10px;
 | 
				
			||||||
 | 
					               stroke-dashoffset: 0px;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         .am-weather-sun-shiny line {
 | 
				
			||||||
 | 
					            -webkit-animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					            -moz-animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					            -ms-animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					            animation-name: am-weather-sun-shiny;
 | 
				
			||||||
 | 
					            -webkit-animation-duration: 2s;
 | 
				
			||||||
 | 
					            -moz-animation-duration: 2s;
 | 
				
			||||||
 | 
					            -ms-animation-duration: 2s;
 | 
				
			||||||
 | 
					            animation-duration: 2s;
 | 
				
			||||||
 | 
					            -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         /*
 | 
				
			||||||
 | 
					** SNOW
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					         @keyframes am-weather-snow {
 | 
				
			||||||
 | 
					            0% {
 | 
				
			||||||
 | 
					               -webkit-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					               -moz-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					               -ms-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					               transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            33.33% {
 | 
				
			||||||
 | 
					               -webkit-transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					               -moz-transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					               -ms-transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					               transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            66.66% {
 | 
				
			||||||
 | 
					               -webkit-transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					               -moz-transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					               -ms-transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					               transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					               opacity: 1;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            100% {
 | 
				
			||||||
 | 
					               -webkit-transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					               -moz-transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					               -ms-transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					               transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					               opacity: 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         @keyframes am-weather-snow-reverse {
 | 
				
			||||||
 | 
					            0% {
 | 
				
			||||||
 | 
					               -webkit-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					               -moz-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					               -ms-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					               transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            33.33% {
 | 
				
			||||||
 | 
					               -webkit-transform: translateX(1.2px) translateY(2px);
 | 
				
			||||||
 | 
					               -moz-transform: translateX(1.2px) translateY(2px);
 | 
				
			||||||
 | 
					               -ms-transform: translateX(1.2px) translateY(2px);
 | 
				
			||||||
 | 
					               transform: translateX(1.2px) translateY(2px);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            66.66% {
 | 
				
			||||||
 | 
					               -webkit-transform: translateX(-1.4px) translateY(4px);
 | 
				
			||||||
 | 
					               -moz-transform: translateX(-1.4px) translateY(4px);
 | 
				
			||||||
 | 
					               -ms-transform: translateX(-1.4px) translateY(4px);
 | 
				
			||||||
 | 
					               transform: translateX(-1.4px) translateY(4px);
 | 
				
			||||||
 | 
					               opacity: 1;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            100% {
 | 
				
			||||||
 | 
					               -webkit-transform: translateX(1.6px) translateY(6px);
 | 
				
			||||||
 | 
					               -moz-transform: translateX(1.6px) translateY(6px);
 | 
				
			||||||
 | 
					               -ms-transform: translateX(1.6px) translateY(6px);
 | 
				
			||||||
 | 
					               transform: translateX(1.6px) translateY(6px);
 | 
				
			||||||
 | 
					               opacity: 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         .am-weather-snow-1 {
 | 
				
			||||||
 | 
					            -webkit-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					            -moz-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					            -ms-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					            animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					            -webkit-animation-duration: 2s;
 | 
				
			||||||
 | 
					            -moz-animation-duration: 2s;
 | 
				
			||||||
 | 
					            -ms-animation-duration: 2s;
 | 
				
			||||||
 | 
					            animation-duration: 2s;
 | 
				
			||||||
 | 
					            -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         .am-weather-snow-2 {
 | 
				
			||||||
 | 
					            -webkit-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					            -moz-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					            -ms-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					            animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					            -webkit-animation-delay: 1.2s;
 | 
				
			||||||
 | 
					            -moz-animation-delay: 1.2s;
 | 
				
			||||||
 | 
					            -ms-animation-delay: 1.2s;
 | 
				
			||||||
 | 
					            animation-delay: 1.2s;
 | 
				
			||||||
 | 
					            -webkit-animation-duration: 2s;
 | 
				
			||||||
 | 
					            -moz-animation-duration: 2s;
 | 
				
			||||||
 | 
					            -ms-animation-duration: 2s;
 | 
				
			||||||
 | 
					            animation-duration: 2s;
 | 
				
			||||||
 | 
					            -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         .am-weather-snow-3 {
 | 
				
			||||||
 | 
					            -webkit-animation-name: am-weather-snow-reverse;
 | 
				
			||||||
 | 
					            -moz-animation-name: am-weather-snow-reverse;
 | 
				
			||||||
 | 
					            -ms-animation-name: am-weather-snow-reverse;
 | 
				
			||||||
 | 
					            animation-name: am-weather-snow-reverse;
 | 
				
			||||||
 | 
					            -webkit-animation-duration: 2s;
 | 
				
			||||||
 | 
					            -moz-animation-duration: 2s;
 | 
				
			||||||
 | 
					            -ms-animation-duration: 2s;
 | 
				
			||||||
 | 
					            animation-duration: 2s;
 | 
				
			||||||
 | 
					            -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					         ]]>
 | 
				
			||||||
 | 
					      </style>
 | 
				
			||||||
 | 
					   </defs>
 | 
				
			||||||
 | 
					   <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					      <g transform="translate(0,16)">
 | 
				
			||||||
 | 
					         <g class="am-weather-sun"
 | 
				
			||||||
 | 
					            style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					            <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					               stroke-width="2" />
 | 
				
			||||||
 | 
					            <g transform="rotate(45)">
 | 
				
			||||||
 | 
					               <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					                  stroke-width="2" />
 | 
				
			||||||
 | 
					            </g>
 | 
				
			||||||
 | 
					            <g transform="rotate(90)">
 | 
				
			||||||
 | 
					               <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					                  stroke-width="2" />
 | 
				
			||||||
 | 
					            </g>
 | 
				
			||||||
 | 
					            <g transform="rotate(135)">
 | 
				
			||||||
 | 
					               <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					                  stroke-width="2" />
 | 
				
			||||||
 | 
					            </g>
 | 
				
			||||||
 | 
					            <g transform="scale(-1)">
 | 
				
			||||||
 | 
					               <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					                  stroke-width="2" />
 | 
				
			||||||
 | 
					            </g>
 | 
				
			||||||
 | 
					            <g transform="rotate(225)">
 | 
				
			||||||
 | 
					               <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					                  stroke-width="2" />
 | 
				
			||||||
 | 
					            </g>
 | 
				
			||||||
 | 
					            <g transform="rotate(-90)">
 | 
				
			||||||
 | 
					               <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					                  stroke-width="2" />
 | 
				
			||||||
 | 
					            </g>
 | 
				
			||||||
 | 
					            <g transform="rotate(-45)">
 | 
				
			||||||
 | 
					               <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round"
 | 
				
			||||||
 | 
					                  stroke-width="2" />
 | 
				
			||||||
 | 
					            </g>
 | 
				
			||||||
 | 
					         </g>
 | 
				
			||||||
 | 
					         <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-cloud-2"
 | 
				
			||||||
 | 
					         style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					         <path transform="translate(-20,-11)"
 | 
				
			||||||
 | 
					            d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					            fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-snow-1"
 | 
				
			||||||
 | 
					         style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					         <g transform="translate(3,28)" fill="none" stroke="#57a0ee" stroke-linecap="round">
 | 
				
			||||||
 | 
					            <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" />
 | 
				
			||||||
 | 
					            <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					            <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					            <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					         </g>
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-snow-2"
 | 
				
			||||||
 | 
					         style="-moz-animation-delay:1.2s;-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-delay:1.2s;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-delay:1.2s;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					         <g transform="translate(11,28)" fill="none" stroke="#57a0ee" stroke-linecap="round">
 | 
				
			||||||
 | 
					            <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" />
 | 
				
			||||||
 | 
					            <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					            <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					            <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					         </g>
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-snow-3"
 | 
				
			||||||
 | 
					         style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow-reverse;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow-reverse;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow-reverse;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					         <g transform="translate(20,28)" fill="none" stroke="#57a0ee" stroke-linecap="round">
 | 
				
			||||||
 | 
					            <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" />
 | 
				
			||||||
 | 
					            <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					            <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					            <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					         </g>
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					   </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 15 KiB  | 
							
								
								
									
										361
									
								
								public/weather-ico/snowy-3-night.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,361 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!-- (c) ammap.com | SVG weather icons -->
 | 
				
			||||||
 | 
					<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					   <defs>
 | 
				
			||||||
 | 
					      <filter id="blur" x="-.24684" y="-.26897" width="1.4937" height="1.6759">
 | 
				
			||||||
 | 
					         <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
 | 
				
			||||||
 | 
					         <feOffset dx="0" dy="4" result="offsetblur" />
 | 
				
			||||||
 | 
					         <feComponentTransfer>
 | 
				
			||||||
 | 
					            <feFuncA slope="0.05" type="linear" />
 | 
				
			||||||
 | 
					         </feComponentTransfer>
 | 
				
			||||||
 | 
					         <feMerge>
 | 
				
			||||||
 | 
					            <feMergeNode />
 | 
				
			||||||
 | 
					            <feMergeNode in="SourceGraphic" />
 | 
				
			||||||
 | 
					         </feMerge>
 | 
				
			||||||
 | 
					      </filter>
 | 
				
			||||||
 | 
					      <style type="text/css">
 | 
				
			||||||
 | 
					         <![CDATA[
 | 
				
			||||||
 | 
					         /*
 | 
				
			||||||
 | 
					** CLOUDS
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					         @keyframes am-weather-cloud-2 {
 | 
				
			||||||
 | 
					            0% {
 | 
				
			||||||
 | 
					               -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					               -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					               -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					               transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            50% {
 | 
				
			||||||
 | 
					               -webkit-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					               -moz-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					               -ms-transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					               transform: translate(2px, 0px);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            100% {
 | 
				
			||||||
 | 
					               -webkit-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					               -moz-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					               -ms-transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					               transform: translate(0px, 0px);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         .am-weather-cloud-2 {
 | 
				
			||||||
 | 
					            -webkit-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					            -moz-animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					            animation-name: am-weather-cloud-2;
 | 
				
			||||||
 | 
					            -webkit-animation-duration: 3s;
 | 
				
			||||||
 | 
					            -moz-animation-duration: 3s;
 | 
				
			||||||
 | 
					            animation-duration: 3s;
 | 
				
			||||||
 | 
					            -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         /*
 | 
				
			||||||
 | 
					** MOON
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					         @keyframes am-weather-moon {
 | 
				
			||||||
 | 
					            0% {
 | 
				
			||||||
 | 
					               -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					               -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					               -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					               transform: rotate(0deg);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            50% {
 | 
				
			||||||
 | 
					               -webkit-transform: rotate(15deg);
 | 
				
			||||||
 | 
					               -moz-transform: rotate(15deg);
 | 
				
			||||||
 | 
					               -ms-transform: rotate(15deg);
 | 
				
			||||||
 | 
					               transform: rotate(15deg);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            100% {
 | 
				
			||||||
 | 
					               -webkit-transform: rotate(0deg);
 | 
				
			||||||
 | 
					               -moz-transform: rotate(0deg);
 | 
				
			||||||
 | 
					               -ms-transform: rotate(0deg);
 | 
				
			||||||
 | 
					               transform: rotate(0deg);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         .am-weather-moon {
 | 
				
			||||||
 | 
					            -webkit-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					            -moz-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					            -ms-animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					            animation-name: am-weather-moon;
 | 
				
			||||||
 | 
					            -webkit-animation-duration: 6s;
 | 
				
			||||||
 | 
					            -moz-animation-duration: 6s;
 | 
				
			||||||
 | 
					            -ms-animation-duration: 6s;
 | 
				
			||||||
 | 
					            animation-duration: 6s;
 | 
				
			||||||
 | 
					            -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -webkit-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					            /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					            -moz-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					            /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					            -ms-transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					            /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					            transform-origin: 12.5px 15.15px 0;
 | 
				
			||||||
 | 
					            /* TODO FF CENTER ISSUE */
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         @keyframes am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					            0% {
 | 
				
			||||||
 | 
					               opacity: 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            100% {
 | 
				
			||||||
 | 
					               opacity: 1;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         .am-weather-moon-star-1 {
 | 
				
			||||||
 | 
					            -webkit-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					            -moz-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					            -ms-animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					            animation-name: am-weather-moon-star-1;
 | 
				
			||||||
 | 
					            -webkit-animation-delay: 3s;
 | 
				
			||||||
 | 
					            -moz-animation-delay: 3s;
 | 
				
			||||||
 | 
					            -ms-animation-delay: 3s;
 | 
				
			||||||
 | 
					            animation-delay: 3s;
 | 
				
			||||||
 | 
					            -webkit-animation-duration: 5s;
 | 
				
			||||||
 | 
					            -moz-animation-duration: 5s;
 | 
				
			||||||
 | 
					            -ms-animation-duration: 5s;
 | 
				
			||||||
 | 
					            animation-duration: 5s;
 | 
				
			||||||
 | 
					            -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					            -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					            -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					            animation-iteration-count: 1;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         @keyframes am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					            0% {
 | 
				
			||||||
 | 
					               opacity: 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            100% {
 | 
				
			||||||
 | 
					               opacity: 1;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         .am-weather-moon-star-2 {
 | 
				
			||||||
 | 
					            -webkit-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					            -moz-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					            -ms-animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					            animation-name: am-weather-moon-star-2;
 | 
				
			||||||
 | 
					            -webkit-animation-delay: 5s;
 | 
				
			||||||
 | 
					            -moz-animation-delay: 5s;
 | 
				
			||||||
 | 
					            -ms-animation-delay: 5s;
 | 
				
			||||||
 | 
					            animation-delay: 5s;
 | 
				
			||||||
 | 
					            -webkit-animation-duration: 4s;
 | 
				
			||||||
 | 
					            -moz-animation-duration: 4s;
 | 
				
			||||||
 | 
					            -ms-animation-duration: 4s;
 | 
				
			||||||
 | 
					            animation-duration: 4s;
 | 
				
			||||||
 | 
					            -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -webkit-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					            -moz-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					            -ms-animation-iteration-count: 1;
 | 
				
			||||||
 | 
					            animation-iteration-count: 1;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         /*
 | 
				
			||||||
 | 
					** SNOW
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					         @keyframes am-weather-snow {
 | 
				
			||||||
 | 
					            0% {
 | 
				
			||||||
 | 
					               -webkit-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					               -moz-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					               -ms-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					               transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            33.33% {
 | 
				
			||||||
 | 
					               -webkit-transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					               -moz-transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					               -ms-transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					               transform: translateX(-1.2px) translateY(2px);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            66.66% {
 | 
				
			||||||
 | 
					               -webkit-transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					               -moz-transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					               -ms-transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					               transform: translateX(1.4px) translateY(4px);
 | 
				
			||||||
 | 
					               opacity: 1;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            100% {
 | 
				
			||||||
 | 
					               -webkit-transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					               -moz-transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					               -ms-transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					               transform: translateX(-1.6px) translateY(6px);
 | 
				
			||||||
 | 
					               opacity: 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         @keyframes am-weather-snow-reverse {
 | 
				
			||||||
 | 
					            0% {
 | 
				
			||||||
 | 
					               -webkit-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					               -moz-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					               -ms-transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					               transform: translateX(0) translateY(0);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            33.33% {
 | 
				
			||||||
 | 
					               -webkit-transform: translateX(1.2px) translateY(2px);
 | 
				
			||||||
 | 
					               -moz-transform: translateX(1.2px) translateY(2px);
 | 
				
			||||||
 | 
					               -ms-transform: translateX(1.2px) translateY(2px);
 | 
				
			||||||
 | 
					               transform: translateX(1.2px) translateY(2px);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            66.66% {
 | 
				
			||||||
 | 
					               -webkit-transform: translateX(-1.4px) translateY(4px);
 | 
				
			||||||
 | 
					               -moz-transform: translateX(-1.4px) translateY(4px);
 | 
				
			||||||
 | 
					               -ms-transform: translateX(-1.4px) translateY(4px);
 | 
				
			||||||
 | 
					               transform: translateX(-1.4px) translateY(4px);
 | 
				
			||||||
 | 
					               opacity: 1;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            100% {
 | 
				
			||||||
 | 
					               -webkit-transform: translateX(1.6px) translateY(6px);
 | 
				
			||||||
 | 
					               -moz-transform: translateX(1.6px) translateY(6px);
 | 
				
			||||||
 | 
					               -ms-transform: translateX(1.6px) translateY(6px);
 | 
				
			||||||
 | 
					               transform: translateX(1.6px) translateY(6px);
 | 
				
			||||||
 | 
					               opacity: 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         .am-weather-snow-1 {
 | 
				
			||||||
 | 
					            -webkit-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					            -moz-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					            -ms-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					            animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					            -webkit-animation-duration: 2s;
 | 
				
			||||||
 | 
					            -moz-animation-duration: 2s;
 | 
				
			||||||
 | 
					            -ms-animation-duration: 2s;
 | 
				
			||||||
 | 
					            animation-duration: 2s;
 | 
				
			||||||
 | 
					            -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         .am-weather-snow-2 {
 | 
				
			||||||
 | 
					            -webkit-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					            -moz-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					            -ms-animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					            animation-name: am-weather-snow;
 | 
				
			||||||
 | 
					            -webkit-animation-delay: 1.2s;
 | 
				
			||||||
 | 
					            -moz-animation-delay: 1.2s;
 | 
				
			||||||
 | 
					            -ms-animation-delay: 1.2s;
 | 
				
			||||||
 | 
					            animation-delay: 1.2s;
 | 
				
			||||||
 | 
					            -webkit-animation-duration: 2s;
 | 
				
			||||||
 | 
					            -moz-animation-duration: 2s;
 | 
				
			||||||
 | 
					            -ms-animation-duration: 2s;
 | 
				
			||||||
 | 
					            animation-duration: 2s;
 | 
				
			||||||
 | 
					            -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         .am-weather-snow-3 {
 | 
				
			||||||
 | 
					            -webkit-animation-name: am-weather-snow-reverse;
 | 
				
			||||||
 | 
					            -moz-animation-name: am-weather-snow-reverse;
 | 
				
			||||||
 | 
					            -ms-animation-name: am-weather-snow-reverse;
 | 
				
			||||||
 | 
					            animation-name: am-weather-snow-reverse;
 | 
				
			||||||
 | 
					            -webkit-animation-duration: 2s;
 | 
				
			||||||
 | 
					            -moz-animation-duration: 2s;
 | 
				
			||||||
 | 
					            -ms-animation-duration: 2s;
 | 
				
			||||||
 | 
					            animation-duration: 2s;
 | 
				
			||||||
 | 
					            -webkit-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -moz-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -ms-animation-timing-function: linear;
 | 
				
			||||||
 | 
					            animation-timing-function: linear;
 | 
				
			||||||
 | 
					            -webkit-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -moz-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            -ms-animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					            animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					         ]]>
 | 
				
			||||||
 | 
					      </style>
 | 
				
			||||||
 | 
					   </defs>
 | 
				
			||||||
 | 
					   <g transform="translate(16,-2)" filter="url(#blur)">
 | 
				
			||||||
 | 
					      <g transform="matrix(.8 0 0 .8 16 4)">
 | 
				
			||||||
 | 
					         <g class="am-weather-moon-star-1"
 | 
				
			||||||
 | 
					            style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					            <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffa500"
 | 
				
			||||||
 | 
					               stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					         </g>
 | 
				
			||||||
 | 
					         <g class="am-weather-moon-star-2"
 | 
				
			||||||
 | 
					            style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					            <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3"
 | 
				
			||||||
 | 
					               fill="#ffa500" stroke-miterlimit="10" />
 | 
				
			||||||
 | 
					         </g>
 | 
				
			||||||
 | 
					         <g class="am-weather-moon"
 | 
				
			||||||
 | 
					            style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0">
 | 
				
			||||||
 | 
					            <path
 | 
				
			||||||
 | 
					               d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z"
 | 
				
			||||||
 | 
					               fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" />
 | 
				
			||||||
 | 
					         </g>
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-cloud-2"
 | 
				
			||||||
 | 
					         style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					         <path transform="translate(-20,-11)"
 | 
				
			||||||
 | 
					            d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z"
 | 
				
			||||||
 | 
					            fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" />
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-snow-1"
 | 
				
			||||||
 | 
					         style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					         <g transform="translate(3,28)" fill="none" stroke="#57a0ee" stroke-linecap="round">
 | 
				
			||||||
 | 
					            <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" />
 | 
				
			||||||
 | 
					            <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					            <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					            <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					         </g>
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-snow-2"
 | 
				
			||||||
 | 
					         style="-moz-animation-delay:1.2s;-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-delay:1.2s;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-delay:1.2s;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					         <g transform="translate(11,28)" fill="none" stroke="#57a0ee" stroke-linecap="round">
 | 
				
			||||||
 | 
					            <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" />
 | 
				
			||||||
 | 
					            <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					            <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					            <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					         </g>
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					      <g class="am-weather-snow-3"
 | 
				
			||||||
 | 
					         style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow-reverse;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow-reverse;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow-reverse;-webkit-animation-timing-function:linear">
 | 
				
			||||||
 | 
					         <g transform="translate(20,28)" fill="none" stroke="#57a0ee" stroke-linecap="round">
 | 
				
			||||||
 | 
					            <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" />
 | 
				
			||||||
 | 
					            <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					            <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					            <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" />
 | 
				
			||||||
 | 
					         </g>
 | 
				
			||||||
 | 
					      </g>
 | 
				
			||||||
 | 
					   </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 17 KiB  | 
@@ -25,5 +25,11 @@ API_URL = "" # Ollama API URL - http://host.docker.internal:11434
 | 
				
			|||||||
[MODELS.DEEPSEEK]
 | 
					[MODELS.DEEPSEEK]
 | 
				
			||||||
API_KEY = ""
 | 
					API_KEY = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[MODELS.AIMLAPI]
 | 
				
			||||||
 | 
					API_KEY = "" # Required to use AI/ML API chat and embedding models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[MODELS.LM_STUDIO]
 | 
				
			||||||
 | 
					API_URL = "" # LM Studio API URL - http://host.docker.internal:1234
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[API_ENDPOINTS]
 | 
					[API_ENDPOINTS]
 | 
				
			||||||
SEARXNG = "" # SearxNG API URL - http://localhost:32768
 | 
					SEARXNG = "" # SearxNG API URL - http://localhost:32768
 | 
				
			||||||
@@ -223,7 +223,7 @@ export const POST = async (req: Request) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (body.chatModel?.provider === 'custom_openai') {
 | 
					    if (body.chatModel?.provider === 'custom_openai') {
 | 
				
			||||||
      llm = new ChatOpenAI({
 | 
					      llm = new ChatOpenAI({
 | 
				
			||||||
        openAIApiKey: getCustomOpenaiApiKey(),
 | 
					        apiKey: getCustomOpenaiApiKey(),
 | 
				
			||||||
        modelName: getCustomOpenaiModelName(),
 | 
					        modelName: getCustomOpenaiModelName(),
 | 
				
			||||||
        temperature: 0.7,
 | 
					        temperature: 0.7,
 | 
				
			||||||
        configuration: {
 | 
					        configuration: {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,6 +8,8 @@ import {
 | 
				
			|||||||
  getOllamaApiEndpoint,
 | 
					  getOllamaApiEndpoint,
 | 
				
			||||||
  getOpenaiApiKey,
 | 
					  getOpenaiApiKey,
 | 
				
			||||||
  getDeepseekApiKey,
 | 
					  getDeepseekApiKey,
 | 
				
			||||||
 | 
					  getAimlApiKey,
 | 
				
			||||||
 | 
					  getLMStudioApiEndpoint,
 | 
				
			||||||
  updateConfig,
 | 
					  updateConfig,
 | 
				
			||||||
} from '@/lib/config';
 | 
					} from '@/lib/config';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
@@ -51,10 +53,12 @@ export const GET = async (req: Request) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    config['openaiApiKey'] = getOpenaiApiKey();
 | 
					    config['openaiApiKey'] = getOpenaiApiKey();
 | 
				
			||||||
    config['ollamaApiUrl'] = getOllamaApiEndpoint();
 | 
					    config['ollamaApiUrl'] = getOllamaApiEndpoint();
 | 
				
			||||||
 | 
					    config['lmStudioApiUrl'] = getLMStudioApiEndpoint();
 | 
				
			||||||
    config['anthropicApiKey'] = getAnthropicApiKey();
 | 
					    config['anthropicApiKey'] = getAnthropicApiKey();
 | 
				
			||||||
    config['groqApiKey'] = getGroqApiKey();
 | 
					    config['groqApiKey'] = getGroqApiKey();
 | 
				
			||||||
    config['geminiApiKey'] = getGeminiApiKey();
 | 
					    config['geminiApiKey'] = getGeminiApiKey();
 | 
				
			||||||
    config['deepseekApiKey'] = getDeepseekApiKey();
 | 
					    config['deepseekApiKey'] = getDeepseekApiKey();
 | 
				
			||||||
 | 
					    config['aimlApiKey'] = getAimlApiKey();
 | 
				
			||||||
    config['customOpenaiApiUrl'] = getCustomOpenaiApiUrl();
 | 
					    config['customOpenaiApiUrl'] = getCustomOpenaiApiUrl();
 | 
				
			||||||
    config['customOpenaiApiKey'] = getCustomOpenaiApiKey();
 | 
					    config['customOpenaiApiKey'] = getCustomOpenaiApiKey();
 | 
				
			||||||
    config['customOpenaiModelName'] = getCustomOpenaiModelName();
 | 
					    config['customOpenaiModelName'] = getCustomOpenaiModelName();
 | 
				
			||||||
@@ -93,6 +97,12 @@ export const POST = async (req: Request) => {
 | 
				
			|||||||
        DEEPSEEK: {
 | 
					        DEEPSEEK: {
 | 
				
			||||||
          API_KEY: config.deepseekApiKey,
 | 
					          API_KEY: config.deepseekApiKey,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        AIMLAPI: {
 | 
				
			||||||
 | 
					          API_KEY: config.aimlApiKey,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        LM_STUDIO: {
 | 
				
			||||||
 | 
					          API_URL: config.lmStudioApiUrl,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        CUSTOM_OPENAI: {
 | 
					        CUSTOM_OPENAI: {
 | 
				
			||||||
          API_URL: config.customOpenaiApiUrl,
 | 
					          API_URL: config.customOpenaiApiUrl,
 | 
				
			||||||
          API_KEY: config.customOpenaiApiKey,
 | 
					          API_KEY: config.customOpenaiApiKey,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,28 +16,48 @@ const topics = ['AI', 'tech']; /* TODO: Add UI to customize this */
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export const GET = async (req: Request) => {
 | 
					export const GET = async (req: Request) => {
 | 
				
			||||||
  try {
 | 
					  try {
 | 
				
			||||||
    const data = (
 | 
					    const params = new URL(req.url).searchParams;
 | 
				
			||||||
      await Promise.all([
 | 
					    const mode: 'normal' | 'preview' =
 | 
				
			||||||
        ...new Array(articleWebsites.length * topics.length)
 | 
					      (params.get('mode') as 'normal' | 'preview') || 'normal';
 | 
				
			||||||
          .fill(0)
 | 
					
 | 
				
			||||||
          .map(async (_, i) => {
 | 
					    let data = [];
 | 
				
			||||||
            return (
 | 
					
 | 
				
			||||||
              await searchSearxng(
 | 
					    if (mode === 'normal') {
 | 
				
			||||||
                `site:${articleWebsites[i % articleWebsites.length]} ${
 | 
					      data = (
 | 
				
			||||||
                  topics[i % topics.length]
 | 
					        await Promise.all([
 | 
				
			||||||
                }`,
 | 
					          ...new Array(articleWebsites.length * topics.length)
 | 
				
			||||||
                {
 | 
					            .fill(0)
 | 
				
			||||||
                  engines: ['bing news'],
 | 
					            .map(async (_, i) => {
 | 
				
			||||||
                  pageno: 1,
 | 
					              return (
 | 
				
			||||||
                },
 | 
					                await searchSearxng(
 | 
				
			||||||
              )
 | 
					                  `site:${articleWebsites[i % articleWebsites.length]} ${
 | 
				
			||||||
            ).results;
 | 
					                    topics[i % topics.length]
 | 
				
			||||||
          }),
 | 
					                  }`,
 | 
				
			||||||
      ])
 | 
					                  {
 | 
				
			||||||
    )
 | 
					                    engines: ['bing news'],
 | 
				
			||||||
      .map((result) => result)
 | 
					                    pageno: 1,
 | 
				
			||||||
      .flat()
 | 
					                    language: 'en',
 | 
				
			||||||
      .sort(() => Math.random() - 0.5);
 | 
					                  },
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					              ).results;
 | 
				
			||||||
 | 
					            }),
 | 
				
			||||||
 | 
					        ])
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					        .map((result) => result)
 | 
				
			||||||
 | 
					        .flat()
 | 
				
			||||||
 | 
					        .sort(() => Math.random() - 0.5);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      data = (
 | 
				
			||||||
 | 
					        await searchSearxng(
 | 
				
			||||||
 | 
					          `site:${articleWebsites[Math.floor(Math.random() * articleWebsites.length)]} ${topics[Math.floor(Math.random() * topics.length)]}`,
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            engines: ['bing news'],
 | 
				
			||||||
 | 
					            pageno: 1,
 | 
				
			||||||
 | 
					            language: 'en',
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					      ).results;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return Response.json(
 | 
					    return Response.json(
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -49,7 +49,7 @@ export const POST = async (req: Request) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (body.chatModel?.provider === 'custom_openai') {
 | 
					    if (body.chatModel?.provider === 'custom_openai') {
 | 
				
			||||||
      llm = new ChatOpenAI({
 | 
					      llm = new ChatOpenAI({
 | 
				
			||||||
        openAIApiKey: getCustomOpenaiApiKey(),
 | 
					        apiKey: getCustomOpenaiApiKey(),
 | 
				
			||||||
        modelName: getCustomOpenaiModelName(),
 | 
					        modelName: getCustomOpenaiModelName(),
 | 
				
			||||||
        temperature: 0.7,
 | 
					        temperature: 0.7,
 | 
				
			||||||
        configuration: {
 | 
					        configuration: {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -81,7 +81,7 @@ export const POST = async (req: Request) => {
 | 
				
			|||||||
    if (body.chatModel?.provider === 'custom_openai') {
 | 
					    if (body.chatModel?.provider === 'custom_openai') {
 | 
				
			||||||
      llm = new ChatOpenAI({
 | 
					      llm = new ChatOpenAI({
 | 
				
			||||||
        modelName: body.chatModel?.name || getCustomOpenaiModelName(),
 | 
					        modelName: body.chatModel?.name || getCustomOpenaiModelName(),
 | 
				
			||||||
        openAIApiKey:
 | 
					        apiKey:
 | 
				
			||||||
          body.chatModel?.customOpenAIKey || getCustomOpenaiApiKey(),
 | 
					          body.chatModel?.customOpenAIKey || getCustomOpenaiApiKey(),
 | 
				
			||||||
        temperature: 0.7,
 | 
					        temperature: 0.7,
 | 
				
			||||||
        configuration: {
 | 
					        configuration: {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -48,7 +48,7 @@ export const POST = async (req: Request) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (body.chatModel?.provider === 'custom_openai') {
 | 
					    if (body.chatModel?.provider === 'custom_openai') {
 | 
				
			||||||
      llm = new ChatOpenAI({
 | 
					      llm = new ChatOpenAI({
 | 
				
			||||||
        openAIApiKey: getCustomOpenaiApiKey(),
 | 
					        apiKey: getCustomOpenaiApiKey(),
 | 
				
			||||||
        modelName: getCustomOpenaiModelName(),
 | 
					        modelName: getCustomOpenaiModelName(),
 | 
				
			||||||
        temperature: 0.7,
 | 
					        temperature: 0.7,
 | 
				
			||||||
        configuration: {
 | 
					        configuration: {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -49,7 +49,7 @@ export const POST = async (req: Request) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (body.chatModel?.provider === 'custom_openai') {
 | 
					    if (body.chatModel?.provider === 'custom_openai') {
 | 
				
			||||||
      llm = new ChatOpenAI({
 | 
					      llm = new ChatOpenAI({
 | 
				
			||||||
        openAIApiKey: getCustomOpenaiApiKey(),
 | 
					        apiKey: getCustomOpenaiApiKey(),
 | 
				
			||||||
        modelName: getCustomOpenaiModelName(),
 | 
					        modelName: getCustomOpenaiModelName(),
 | 
				
			||||||
        temperature: 0.7,
 | 
					        temperature: 0.7,
 | 
				
			||||||
        configuration: {
 | 
					        configuration: {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										167
									
								
								src/app/api/weather/route.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,167 @@
 | 
				
			|||||||
 | 
					export const POST = async (req: Request) => {
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    const body: { lat: number; lng: number; temperatureUnit: 'C' | 'F' } =
 | 
				
			||||||
 | 
					      await req.json();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!body.lat || !body.lng) {
 | 
				
			||||||
 | 
					      return Response.json(
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          message: 'Invalid request.',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        { status: 400 },
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const res = await fetch(
 | 
				
			||||||
 | 
					      `https://api.open-meteo.com/v1/forecast?latitude=${body.lat}&longitude=${body.lng}¤t=weather_code,temperature_2m,is_day,relative_humidity_2m,wind_speed_10m&timezone=auto${body.temperatureUnit === 'C' ? '' : '&temperature_unit=fahrenheit'}`,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const data = await res.json();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (data.error) {
 | 
				
			||||||
 | 
					      console.error(`Error fetching weather data: ${data.reason}`);
 | 
				
			||||||
 | 
					      return Response.json(
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          message: 'An error has occurred.',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        { status: 500 },
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const weather: {
 | 
				
			||||||
 | 
					      temperature: number;
 | 
				
			||||||
 | 
					      condition: string;
 | 
				
			||||||
 | 
					      humidity: number;
 | 
				
			||||||
 | 
					      windSpeed: number;
 | 
				
			||||||
 | 
					      icon: string;
 | 
				
			||||||
 | 
					      temperatureUnit: 'C' | 'F';
 | 
				
			||||||
 | 
					    } = {
 | 
				
			||||||
 | 
					      temperature: data.current.temperature_2m,
 | 
				
			||||||
 | 
					      condition: '',
 | 
				
			||||||
 | 
					      humidity: data.current.relative_humidity_2m,
 | 
				
			||||||
 | 
					      windSpeed: data.current.wind_speed_10m,
 | 
				
			||||||
 | 
					      icon: '',
 | 
				
			||||||
 | 
					      temperatureUnit: body.temperatureUnit,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const code = data.current.weather_code;
 | 
				
			||||||
 | 
					    const isDay = data.current.is_day === 1;
 | 
				
			||||||
 | 
					    const dayOrNight = isDay ? 'day' : 'night';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (code) {
 | 
				
			||||||
 | 
					      case 0:
 | 
				
			||||||
 | 
					        weather.icon = `clear-${dayOrNight}`;
 | 
				
			||||||
 | 
					        weather.condition = 'Clear';
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case 1:
 | 
				
			||||||
 | 
					        weather.condition = 'Mainly Clear';
 | 
				
			||||||
 | 
					      case 2:
 | 
				
			||||||
 | 
					        weather.condition = 'Partly Cloudy';
 | 
				
			||||||
 | 
					      case 3:
 | 
				
			||||||
 | 
					        weather.icon = `cloudy-1-${dayOrNight}`;
 | 
				
			||||||
 | 
					        weather.condition = 'Cloudy';
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case 45:
 | 
				
			||||||
 | 
					        weather.condition = 'Fog';
 | 
				
			||||||
 | 
					      case 48:
 | 
				
			||||||
 | 
					        weather.icon = `fog-${dayOrNight}`;
 | 
				
			||||||
 | 
					        weather.condition = 'Fog';
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case 51:
 | 
				
			||||||
 | 
					        weather.condition = 'Light Drizzle';
 | 
				
			||||||
 | 
					      case 53:
 | 
				
			||||||
 | 
					        weather.condition = 'Moderate Drizzle';
 | 
				
			||||||
 | 
					      case 55:
 | 
				
			||||||
 | 
					        weather.icon = `rainy-1-${dayOrNight}`;
 | 
				
			||||||
 | 
					        weather.condition = 'Dense Drizzle';
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case 56:
 | 
				
			||||||
 | 
					        weather.condition = 'Light Freezing Drizzle';
 | 
				
			||||||
 | 
					      case 57:
 | 
				
			||||||
 | 
					        weather.icon = `frost-${dayOrNight}`;
 | 
				
			||||||
 | 
					        weather.condition = 'Dense Freezing Drizzle';
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case 61:
 | 
				
			||||||
 | 
					        weather.condition = 'Slight Rain';
 | 
				
			||||||
 | 
					      case 63:
 | 
				
			||||||
 | 
					        weather.condition = 'Moderate Rain';
 | 
				
			||||||
 | 
					      case 65:
 | 
				
			||||||
 | 
					        weather.condition = 'Heavy Rain';
 | 
				
			||||||
 | 
					        weather.icon = `rainy-2-${dayOrNight}`;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case 66:
 | 
				
			||||||
 | 
					        weather.condition = 'Light Freezing Rain';
 | 
				
			||||||
 | 
					      case 67:
 | 
				
			||||||
 | 
					        weather.condition = 'Heavy Freezing Rain';
 | 
				
			||||||
 | 
					        weather.icon = 'rain-and-sleet-mix';
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case 71:
 | 
				
			||||||
 | 
					        weather.condition = 'Slight Snow Fall';
 | 
				
			||||||
 | 
					      case 73:
 | 
				
			||||||
 | 
					        weather.condition = 'Moderate Snow Fall';
 | 
				
			||||||
 | 
					      case 75:
 | 
				
			||||||
 | 
					        weather.condition = 'Heavy Snow Fall';
 | 
				
			||||||
 | 
					        weather.icon = `snowy-2-${dayOrNight}`;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case 77:
 | 
				
			||||||
 | 
					        weather.condition = 'Snow';
 | 
				
			||||||
 | 
					        weather.icon = `snowy-1-${dayOrNight}`;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case 80:
 | 
				
			||||||
 | 
					        weather.condition = 'Slight Rain Showers';
 | 
				
			||||||
 | 
					      case 81:
 | 
				
			||||||
 | 
					        weather.condition = 'Moderate Rain Showers';
 | 
				
			||||||
 | 
					      case 82:
 | 
				
			||||||
 | 
					        weather.condition = 'Heavy Rain Showers';
 | 
				
			||||||
 | 
					        weather.icon = `rainy-3-${dayOrNight}`;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case 85:
 | 
				
			||||||
 | 
					        weather.condition = 'Slight Snow Showers';
 | 
				
			||||||
 | 
					      case 86:
 | 
				
			||||||
 | 
					        weather.condition = 'Moderate Snow Showers';
 | 
				
			||||||
 | 
					      case 87:
 | 
				
			||||||
 | 
					        weather.condition = 'Heavy Snow Showers';
 | 
				
			||||||
 | 
					        weather.icon = `snowy-3-${dayOrNight}`;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case 95:
 | 
				
			||||||
 | 
					        weather.condition = 'Thunderstorm';
 | 
				
			||||||
 | 
					        weather.icon = `scattered-thunderstorms-${dayOrNight}`;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case 96:
 | 
				
			||||||
 | 
					        weather.condition = 'Thunderstorm with Slight Hail';
 | 
				
			||||||
 | 
					      case 99:
 | 
				
			||||||
 | 
					        weather.condition = 'Thunderstorm with Heavy Hail';
 | 
				
			||||||
 | 
					        weather.icon = 'severe-thunderstorm';
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      default:
 | 
				
			||||||
 | 
					        weather.icon = `clear-${dayOrNight}`;
 | 
				
			||||||
 | 
					        weather.condition = 'Clear';
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return Response.json(weather);
 | 
				
			||||||
 | 
					  } catch (err) {
 | 
				
			||||||
 | 
					    console.error('An error occurred while getting home widgets', err);
 | 
				
			||||||
 | 
					    return Response.json(
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        message: 'An error has occurred.',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        status: 500,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@@ -11,3 +11,11 @@
 | 
				
			|||||||
    display: none;
 | 
					    display: none;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@media screen and (-webkit-min-device-pixel-ratio: 0) {
 | 
				
			||||||
 | 
					  select,
 | 
				
			||||||
 | 
					  textarea,
 | 
				
			||||||
 | 
					  input {
 | 
				
			||||||
 | 
					    font-size: 16px !important;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										54
									
								
								src/app/manifest.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,54 @@
 | 
				
			|||||||
 | 
					import type { MetadataRoute } from 'next';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default function manifest(): MetadataRoute.Manifest {
 | 
				
			||||||
 | 
					  return {
 | 
				
			||||||
 | 
					    name: 'Perplexica - Chat with the internet',
 | 
				
			||||||
 | 
					    short_name: 'Perplexica',
 | 
				
			||||||
 | 
					    description:
 | 
				
			||||||
 | 
					      'Perplexica is an AI powered chatbot that is connected to the internet.',
 | 
				
			||||||
 | 
					    start_url: '/',
 | 
				
			||||||
 | 
					    display: 'standalone',
 | 
				
			||||||
 | 
					    background_color: '#0a0a0a',
 | 
				
			||||||
 | 
					    theme_color: '#0a0a0a',
 | 
				
			||||||
 | 
					    screenshots: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        src: '/screenshots/p1.png',
 | 
				
			||||||
 | 
					        form_factor: 'wide',
 | 
				
			||||||
 | 
					        sizes: '2560x1600',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        src: '/screenshots/p2.png',
 | 
				
			||||||
 | 
					        form_factor: 'wide',
 | 
				
			||||||
 | 
					        sizes: '2560x1600',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        src: '/screenshots/p1_small.png',
 | 
				
			||||||
 | 
					        form_factor: 'narrow',
 | 
				
			||||||
 | 
					        sizes: '828x1792',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        src: '/screenshots/p2_small.png',
 | 
				
			||||||
 | 
					        form_factor: 'narrow',
 | 
				
			||||||
 | 
					        sizes: '828x1792',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    icons: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        src: '/icon-50.png',
 | 
				
			||||||
 | 
					        sizes: '50x50',
 | 
				
			||||||
 | 
					        type: 'image/png' as const,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        src: '/icon-100.png',
 | 
				
			||||||
 | 
					        sizes: '100x100',
 | 
				
			||||||
 | 
					        type: 'image/png',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        src: '/icon.png',
 | 
				
			||||||
 | 
					        sizes: '440x440',
 | 
				
			||||||
 | 
					        type: 'image/png',
 | 
				
			||||||
 | 
					        purpose: 'any',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -7,6 +7,7 @@ import { Switch } from '@headlessui/react';
 | 
				
			|||||||
import ThemeSwitcher from '@/components/theme/Switcher';
 | 
					import ThemeSwitcher from '@/components/theme/Switcher';
 | 
				
			||||||
import { ImagesIcon, VideoIcon } from 'lucide-react';
 | 
					import { ImagesIcon, VideoIcon } from 'lucide-react';
 | 
				
			||||||
import Link from 'next/link';
 | 
					import Link from 'next/link';
 | 
				
			||||||
 | 
					import { PROVIDER_METADATA } from '@/lib/providers';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface SettingsType {
 | 
					interface SettingsType {
 | 
				
			||||||
  chatModelProviders: {
 | 
					  chatModelProviders: {
 | 
				
			||||||
@@ -20,7 +21,9 @@ interface SettingsType {
 | 
				
			|||||||
  anthropicApiKey: string;
 | 
					  anthropicApiKey: string;
 | 
				
			||||||
  geminiApiKey: string;
 | 
					  geminiApiKey: string;
 | 
				
			||||||
  ollamaApiUrl: string;
 | 
					  ollamaApiUrl: string;
 | 
				
			||||||
 | 
					  lmStudioApiUrl: string;
 | 
				
			||||||
  deepseekApiKey: string;
 | 
					  deepseekApiKey: string;
 | 
				
			||||||
 | 
					  aimlApiKey: string;
 | 
				
			||||||
  customOpenaiApiKey: string;
 | 
					  customOpenaiApiKey: string;
 | 
				
			||||||
  customOpenaiApiUrl: string;
 | 
					  customOpenaiApiUrl: string;
 | 
				
			||||||
  customOpenaiModelName: string;
 | 
					  customOpenaiModelName: string;
 | 
				
			||||||
@@ -141,15 +144,15 @@ const Page = () => {
 | 
				
			|||||||
  const [selectedEmbeddingModel, setSelectedEmbeddingModel] = useState<
 | 
					  const [selectedEmbeddingModel, setSelectedEmbeddingModel] = useState<
 | 
				
			||||||
    string | null
 | 
					    string | null
 | 
				
			||||||
  >(null);
 | 
					  >(null);
 | 
				
			||||||
  const [isLoading, setIsLoading] = useState(false);
 | 
					  const [isLoading, setIsLoading] = useState(true);
 | 
				
			||||||
  const [automaticImageSearch, setAutomaticImageSearch] = useState(false);
 | 
					  const [automaticImageSearch, setAutomaticImageSearch] = useState(false);
 | 
				
			||||||
  const [automaticVideoSearch, setAutomaticVideoSearch] = useState(false);
 | 
					  const [automaticVideoSearch, setAutomaticVideoSearch] = useState(false);
 | 
				
			||||||
  const [systemInstructions, setSystemInstructions] = useState<string>('');
 | 
					  const [systemInstructions, setSystemInstructions] = useState<string>('');
 | 
				
			||||||
 | 
					  const [temperatureUnit, setTemperatureUnit] = useState<'C' | 'F'>('C');
 | 
				
			||||||
  const [savingStates, setSavingStates] = useState<Record<string, boolean>>({});
 | 
					  const [savingStates, setSavingStates] = useState<Record<string, boolean>>({});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  useEffect(() => {
 | 
					  useEffect(() => {
 | 
				
			||||||
    const fetchConfig = async () => {
 | 
					    const fetchConfig = async () => {
 | 
				
			||||||
      setIsLoading(true);
 | 
					 | 
				
			||||||
      const res = await fetch(`/api/config`, {
 | 
					      const res = await fetch(`/api/config`, {
 | 
				
			||||||
        headers: {
 | 
					        headers: {
 | 
				
			||||||
          'Content-Type': 'application/json',
 | 
					          'Content-Type': 'application/json',
 | 
				
			||||||
@@ -208,6 +211,8 @@ const Page = () => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      setSystemInstructions(localStorage.getItem('systemInstructions')!);
 | 
					      setSystemInstructions(localStorage.getItem('systemInstructions')!);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      setTemperatureUnit(localStorage.getItem('temperatureUnit')! as 'C' | 'F');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      setIsLoading(false);
 | 
					      setIsLoading(false);
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -366,6 +371,8 @@ const Page = () => {
 | 
				
			|||||||
        localStorage.setItem('embeddingModel', value);
 | 
					        localStorage.setItem('embeddingModel', value);
 | 
				
			||||||
      } else if (key === 'systemInstructions') {
 | 
					      } else if (key === 'systemInstructions') {
 | 
				
			||||||
        localStorage.setItem('systemInstructions', value);
 | 
					        localStorage.setItem('systemInstructions', value);
 | 
				
			||||||
 | 
					      } else if (key === 'temperatureUnit') {
 | 
				
			||||||
 | 
					        localStorage.setItem('temperatureUnit', value.toString());
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } catch (err) {
 | 
					    } catch (err) {
 | 
				
			||||||
      console.error('Failed to save:', err);
 | 
					      console.error('Failed to save:', err);
 | 
				
			||||||
@@ -414,13 +421,35 @@ const Page = () => {
 | 
				
			|||||||
      ) : (
 | 
					      ) : (
 | 
				
			||||||
        config && (
 | 
					        config && (
 | 
				
			||||||
          <div className="flex flex-col space-y-6 pb-28 lg:pb-8">
 | 
					          <div className="flex flex-col space-y-6 pb-28 lg:pb-8">
 | 
				
			||||||
            <SettingsSection title="Appearance">
 | 
					            <SettingsSection title="Preferences">
 | 
				
			||||||
              <div className="flex flex-col space-y-1">
 | 
					              <div className="flex flex-col space-y-1">
 | 
				
			||||||
                <p className="text-black/70 dark:text-white/70 text-sm">
 | 
					                <p className="text-black/70 dark:text-white/70 text-sm">
 | 
				
			||||||
                  Theme
 | 
					                  Theme
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
                <ThemeSwitcher />
 | 
					                <ThemeSwitcher />
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
 | 
					              <div className="flex flex-col space-y-1">
 | 
				
			||||||
 | 
					                <p className="text-black/70 dark:text-white/70 text-sm">
 | 
				
			||||||
 | 
					                  Temperature Unit
 | 
				
			||||||
 | 
					                </p>
 | 
				
			||||||
 | 
					                <Select
 | 
				
			||||||
 | 
					                  value={temperatureUnit ?? undefined}
 | 
				
			||||||
 | 
					                  onChange={(e) => {
 | 
				
			||||||
 | 
					                    setTemperatureUnit(e.target.value as 'C' | 'F');
 | 
				
			||||||
 | 
					                    saveConfig('temperatureUnit', e.target.value);
 | 
				
			||||||
 | 
					                  }}
 | 
				
			||||||
 | 
					                  options={[
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                      label: 'Celsius',
 | 
				
			||||||
 | 
					                      value: 'C',
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                      label: 'Fahrenheit',
 | 
				
			||||||
 | 
					                      value: 'F',
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                  ]}
 | 
				
			||||||
 | 
					                />
 | 
				
			||||||
 | 
					              </div>
 | 
				
			||||||
            </SettingsSection>
 | 
					            </SettingsSection>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            <SettingsSection title="Automatic Search">
 | 
					            <SettingsSection title="Automatic Search">
 | 
				
			||||||
@@ -514,7 +543,7 @@ const Page = () => {
 | 
				
			|||||||
            <SettingsSection title="System Instructions">
 | 
					            <SettingsSection title="System Instructions">
 | 
				
			||||||
              <div className="flex flex-col space-y-4">
 | 
					              <div className="flex flex-col space-y-4">
 | 
				
			||||||
                <Textarea
 | 
					                <Textarea
 | 
				
			||||||
                  value={systemInstructions}
 | 
					                  value={systemInstructions ?? undefined}
 | 
				
			||||||
                  isSaving={savingStates['systemInstructions']}
 | 
					                  isSaving={savingStates['systemInstructions']}
 | 
				
			||||||
                  onChange={(e) => {
 | 
					                  onChange={(e) => {
 | 
				
			||||||
                    setSystemInstructions(e.target.value);
 | 
					                    setSystemInstructions(e.target.value);
 | 
				
			||||||
@@ -548,8 +577,9 @@ const Page = () => {
 | 
				
			|||||||
                        (provider) => ({
 | 
					                        (provider) => ({
 | 
				
			||||||
                          value: provider,
 | 
					                          value: provider,
 | 
				
			||||||
                          label:
 | 
					                          label:
 | 
				
			||||||
 | 
					                            (PROVIDER_METADATA as any)[provider]?.displayName ||
 | 
				
			||||||
                            provider.charAt(0).toUpperCase() +
 | 
					                            provider.charAt(0).toUpperCase() +
 | 
				
			||||||
                            provider.slice(1),
 | 
					                              provider.slice(1),
 | 
				
			||||||
                        }),
 | 
					                        }),
 | 
				
			||||||
                      )}
 | 
					                      )}
 | 
				
			||||||
                    />
 | 
					                    />
 | 
				
			||||||
@@ -690,8 +720,9 @@ const Page = () => {
 | 
				
			|||||||
                        (provider) => ({
 | 
					                        (provider) => ({
 | 
				
			||||||
                          value: provider,
 | 
					                          value: provider,
 | 
				
			||||||
                          label:
 | 
					                          label:
 | 
				
			||||||
 | 
					                            (PROVIDER_METADATA as any)[provider]?.displayName ||
 | 
				
			||||||
                            provider.charAt(0).toUpperCase() +
 | 
					                            provider.charAt(0).toUpperCase() +
 | 
				
			||||||
                            provider.slice(1),
 | 
					                              provider.slice(1),
 | 
				
			||||||
                        }),
 | 
					                        }),
 | 
				
			||||||
                      )}
 | 
					                      )}
 | 
				
			||||||
                    />
 | 
					                    />
 | 
				
			||||||
@@ -858,6 +889,44 @@ const Page = () => {
 | 
				
			|||||||
                    onSave={(value) => saveConfig('deepseekApiKey', value)}
 | 
					                    onSave={(value) => saveConfig('deepseekApiKey', value)}
 | 
				
			||||||
                  />
 | 
					                  />
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <div className="flex flex-col space-y-1">
 | 
				
			||||||
 | 
					                  <p className="text-black/70 dark:text-white/70 text-sm">
 | 
				
			||||||
 | 
					                    AI/ML API Key
 | 
				
			||||||
 | 
					                  </p>
 | 
				
			||||||
 | 
					                  <Input
 | 
				
			||||||
 | 
					                    type="text"
 | 
				
			||||||
 | 
					                    placeholder="AI/ML API Key"
 | 
				
			||||||
 | 
					                    value={config.aimlApiKey}
 | 
				
			||||||
 | 
					                    isSaving={savingStates['aimlApiKey']}
 | 
				
			||||||
 | 
					                    onChange={(e) => {
 | 
				
			||||||
 | 
					                      setConfig((prev) => ({
 | 
				
			||||||
 | 
					                        ...prev!,
 | 
				
			||||||
 | 
					                        aimlApiKey: e.target.value,
 | 
				
			||||||
 | 
					                      }));
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                    onSave={(value) => saveConfig('aimlApiKey', value)}
 | 
				
			||||||
 | 
					                  />
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <div className="flex flex-col space-y-1">
 | 
				
			||||||
 | 
					                  <p className="text-black/70 dark:text-white/70 text-sm">
 | 
				
			||||||
 | 
					                    LM Studio API URL
 | 
				
			||||||
 | 
					                  </p>
 | 
				
			||||||
 | 
					                  <Input
 | 
				
			||||||
 | 
					                    type="text"
 | 
				
			||||||
 | 
					                    placeholder="LM Studio API URL"
 | 
				
			||||||
 | 
					                    value={config.lmStudioApiUrl}
 | 
				
			||||||
 | 
					                    isSaving={savingStates['lmStudioApiUrl']}
 | 
				
			||||||
 | 
					                    onChange={(e) => {
 | 
				
			||||||
 | 
					                      setConfig((prev) => ({
 | 
				
			||||||
 | 
					                        ...prev!,
 | 
				
			||||||
 | 
					                        lmStudioApiUrl: e.target.value,
 | 
				
			||||||
 | 
					                      }));
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                    onSave={(value) => saveConfig('lmStudioApiUrl', value)}
 | 
				
			||||||
 | 
					                  />
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
            </SettingsSection>
 | 
					            </SettingsSection>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -82,14 +82,29 @@ const checkConfig = async (
 | 
				
			|||||||
    ) {
 | 
					    ) {
 | 
				
			||||||
      if (!chatModel || !chatModelProvider) {
 | 
					      if (!chatModel || !chatModelProvider) {
 | 
				
			||||||
        const chatModelProviders = providers.chatModelProviders;
 | 
					        const chatModelProviders = providers.chatModelProviders;
 | 
				
			||||||
 | 
					        const chatModelProvidersKeys = Object.keys(chatModelProviders);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        chatModelProvider =
 | 
					        if (!chatModelProviders || chatModelProvidersKeys.length === 0) {
 | 
				
			||||||
          chatModelProvider || Object.keys(chatModelProviders)[0];
 | 
					          return toast.error('No chat models available');
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          chatModelProvider =
 | 
				
			||||||
 | 
					            chatModelProvidersKeys.find(
 | 
				
			||||||
 | 
					              (provider) =>
 | 
				
			||||||
 | 
					                Object.keys(chatModelProviders[provider]).length > 0,
 | 
				
			||||||
 | 
					            ) || chatModelProvidersKeys[0];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (
 | 
				
			||||||
 | 
					          chatModelProvider === 'custom_openai' &&
 | 
				
			||||||
 | 
					          Object.keys(chatModelProviders[chatModelProvider]).length === 0
 | 
				
			||||||
 | 
					        ) {
 | 
				
			||||||
 | 
					          toast.error(
 | 
				
			||||||
 | 
					            "Looks like you haven't configured any chat model providers. Please configure them from the settings page or the config file.",
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					          return setHasError(true);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        chatModel = Object.keys(chatModelProviders[chatModelProvider])[0];
 | 
					        chatModel = Object.keys(chatModelProviders[chatModelProvider])[0];
 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (!chatModelProviders || Object.keys(chatModelProviders).length === 0)
 | 
					 | 
				
			||||||
          return toast.error('No chat models available');
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (!embeddingModel || !embeddingModelProvider) {
 | 
					      if (!embeddingModel || !embeddingModelProvider) {
 | 
				
			||||||
@@ -117,7 +132,8 @@ const checkConfig = async (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      if (
 | 
					      if (
 | 
				
			||||||
        Object.keys(chatModelProviders).length > 0 &&
 | 
					        Object.keys(chatModelProviders).length > 0 &&
 | 
				
			||||||
        !chatModelProviders[chatModelProvider]
 | 
					        (!chatModelProviders[chatModelProvider] ||
 | 
				
			||||||
 | 
					          Object.keys(chatModelProviders[chatModelProvider]).length === 0)
 | 
				
			||||||
      ) {
 | 
					      ) {
 | 
				
			||||||
        const chatModelProvidersKeys = Object.keys(chatModelProviders);
 | 
					        const chatModelProvidersKeys = Object.keys(chatModelProviders);
 | 
				
			||||||
        chatModelProvider =
 | 
					        chatModelProvider =
 | 
				
			||||||
@@ -132,6 +148,16 @@ const checkConfig = async (
 | 
				
			|||||||
        chatModelProvider &&
 | 
					        chatModelProvider &&
 | 
				
			||||||
        !chatModelProviders[chatModelProvider][chatModel]
 | 
					        !chatModelProviders[chatModelProvider][chatModel]
 | 
				
			||||||
      ) {
 | 
					      ) {
 | 
				
			||||||
 | 
					        if (
 | 
				
			||||||
 | 
					          chatModelProvider === 'custom_openai' &&
 | 
				
			||||||
 | 
					          Object.keys(chatModelProviders[chatModelProvider]).length === 0
 | 
				
			||||||
 | 
					        ) {
 | 
				
			||||||
 | 
					          toast.error(
 | 
				
			||||||
 | 
					            "Looks like you haven't configured any chat model providers. Please configure them from the settings page or the config file.",
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					          return setHasError(true);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        chatModel = Object.keys(
 | 
					        chatModel = Object.keys(
 | 
				
			||||||
          chatModelProviders[
 | 
					          chatModelProviders[
 | 
				
			||||||
            Object.keys(chatModelProviders[chatModelProvider]).length > 0
 | 
					            Object.keys(chatModelProviders[chatModelProvider]).length > 0
 | 
				
			||||||
@@ -139,6 +165,7 @@ const checkConfig = async (
 | 
				
			|||||||
              : Object.keys(chatModelProviders)[0]
 | 
					              : Object.keys(chatModelProviders)[0]
 | 
				
			||||||
          ],
 | 
					          ],
 | 
				
			||||||
        )[0];
 | 
					        )[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        localStorage.setItem('chatModel', chatModel);
 | 
					        localStorage.setItem('chatModel', chatModel);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,9 @@
 | 
				
			|||||||
import { Settings } from 'lucide-react';
 | 
					import { Settings } from 'lucide-react';
 | 
				
			||||||
import EmptyChatMessageInput from './EmptyChatMessageInput';
 | 
					import EmptyChatMessageInput from './EmptyChatMessageInput';
 | 
				
			||||||
import { useState } from 'react';
 | 
					 | 
				
			||||||
import { File } from './ChatWindow';
 | 
					import { File } from './ChatWindow';
 | 
				
			||||||
import Link from 'next/link';
 | 
					import Link from 'next/link';
 | 
				
			||||||
 | 
					import WeatherWidget from './WeatherWidget';
 | 
				
			||||||
 | 
					import NewsArticleWidget from './NewsArticleWidget';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const EmptyChat = ({
 | 
					const EmptyChat = ({
 | 
				
			||||||
  sendMessage,
 | 
					  sendMessage,
 | 
				
			||||||
@@ -25,8 +26,6 @@ const EmptyChat = ({
 | 
				
			|||||||
  files: File[];
 | 
					  files: File[];
 | 
				
			||||||
  setFiles: (files: File[]) => void;
 | 
					  setFiles: (files: File[]) => void;
 | 
				
			||||||
}) => {
 | 
					}) => {
 | 
				
			||||||
  const [isSettingsOpen, setIsSettingsOpen] = useState(false);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div className="relative">
 | 
					    <div className="relative">
 | 
				
			||||||
      <div className="absolute w-full flex flex-row items-center justify-end mr-5 mt-5">
 | 
					      <div className="absolute w-full flex flex-row items-center justify-end mr-5 mt-5">
 | 
				
			||||||
@@ -34,21 +33,31 @@ const EmptyChat = ({
 | 
				
			|||||||
          <Settings className="cursor-pointer lg:hidden" />
 | 
					          <Settings className="cursor-pointer lg:hidden" />
 | 
				
			||||||
        </Link>
 | 
					        </Link>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
      <div className="flex flex-col items-center justify-center min-h-screen max-w-screen-sm mx-auto p-2 space-y-8">
 | 
					      <div className="flex flex-col items-center justify-center min-h-screen max-w-screen-sm mx-auto p-2 space-y-4">
 | 
				
			||||||
        <h2 className="text-black/70 dark:text-white/70 text-3xl font-medium -mt-8">
 | 
					        <div className="flex flex-col items-center justify-center w-full space-y-8">
 | 
				
			||||||
          Research begins here.
 | 
					          <h2 className="text-black/70 dark:text-white/70 text-3xl font-medium -mt-8">
 | 
				
			||||||
        </h2>
 | 
					            Research begins here.
 | 
				
			||||||
        <EmptyChatMessageInput
 | 
					          </h2>
 | 
				
			||||||
          sendMessage={sendMessage}
 | 
					          <EmptyChatMessageInput
 | 
				
			||||||
          focusMode={focusMode}
 | 
					            sendMessage={sendMessage}
 | 
				
			||||||
          setFocusMode={setFocusMode}
 | 
					            focusMode={focusMode}
 | 
				
			||||||
          optimizationMode={optimizationMode}
 | 
					            setFocusMode={setFocusMode}
 | 
				
			||||||
          setOptimizationMode={setOptimizationMode}
 | 
					            optimizationMode={optimizationMode}
 | 
				
			||||||
          fileIds={fileIds}
 | 
					            setOptimizationMode={setOptimizationMode}
 | 
				
			||||||
          setFileIds={setFileIds}
 | 
					            fileIds={fileIds}
 | 
				
			||||||
          files={files}
 | 
					            setFileIds={setFileIds}
 | 
				
			||||||
          setFiles={setFiles}
 | 
					            files={files}
 | 
				
			||||||
        />
 | 
					            setFiles={setFiles}
 | 
				
			||||||
 | 
					          />
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					        <div className="flex flex-col w-full gap-4 mt-2 sm:flex-row sm:justify-center">
 | 
				
			||||||
 | 
					          <div className="flex-1 w-full">
 | 
				
			||||||
 | 
					            <WeatherWidget />
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					          <div className="flex-1 w-full">
 | 
				
			||||||
 | 
					            <NewsArticleWidget />
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -97,6 +97,7 @@ const MessageBox = ({
 | 
				
			|||||||
          },
 | 
					          },
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
 | 
					      setSpeechMessage(message.content.replace(regex, ''));
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,122 @@
 | 
				
			|||||||
import { Clock, Edit, Share, Trash } from 'lucide-react';
 | 
					import { Clock, Edit, Share, Trash, FileText, FileDown } from 'lucide-react';
 | 
				
			||||||
import { Message } from './ChatWindow';
 | 
					import { Message } from './ChatWindow';
 | 
				
			||||||
import { useEffect, useState } from 'react';
 | 
					import { useEffect, useState, Fragment } from 'react';
 | 
				
			||||||
import { formatTimeDifference } from '@/lib/utils';
 | 
					import { formatTimeDifference } from '@/lib/utils';
 | 
				
			||||||
import DeleteChat from './DeleteChat';
 | 
					import DeleteChat from './DeleteChat';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  Popover,
 | 
				
			||||||
 | 
					  PopoverButton,
 | 
				
			||||||
 | 
					  PopoverPanel,
 | 
				
			||||||
 | 
					  Transition,
 | 
				
			||||||
 | 
					} from '@headlessui/react';
 | 
				
			||||||
 | 
					import jsPDF from 'jspdf';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const downloadFile = (filename: string, content: string, type: string) => {
 | 
				
			||||||
 | 
					  const blob = new Blob([content], { type });
 | 
				
			||||||
 | 
					  const url = URL.createObjectURL(blob);
 | 
				
			||||||
 | 
					  const a = document.createElement('a');
 | 
				
			||||||
 | 
					  a.href = url;
 | 
				
			||||||
 | 
					  a.download = filename;
 | 
				
			||||||
 | 
					  document.body.appendChild(a);
 | 
				
			||||||
 | 
					  a.click();
 | 
				
			||||||
 | 
					  setTimeout(() => {
 | 
				
			||||||
 | 
					    document.body.removeChild(a);
 | 
				
			||||||
 | 
					    URL.revokeObjectURL(url);
 | 
				
			||||||
 | 
					  }, 0);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const exportAsMarkdown = (messages: Message[], title: string) => {
 | 
				
			||||||
 | 
					  const date = new Date(messages[0]?.createdAt || Date.now()).toLocaleString();
 | 
				
			||||||
 | 
					  let md = `# 💬 Chat Export: ${title}\n\n`;
 | 
				
			||||||
 | 
					  md += `*Exported on: ${date}*\n\n---\n`;
 | 
				
			||||||
 | 
					  messages.forEach((msg, idx) => {
 | 
				
			||||||
 | 
					    md += `\n---\n`;
 | 
				
			||||||
 | 
					    md += `**${msg.role === 'user' ? '🧑 User' : '🤖 Assistant'}**  
 | 
				
			||||||
 | 
					`;
 | 
				
			||||||
 | 
					    md += `*${new Date(msg.createdAt).toLocaleString()}*\n\n`;
 | 
				
			||||||
 | 
					    md += `> ${msg.content.replace(/\n/g, '\n> ')}\n`;
 | 
				
			||||||
 | 
					    if (msg.sources && msg.sources.length > 0) {
 | 
				
			||||||
 | 
					      md += `\n**Citations:**\n`;
 | 
				
			||||||
 | 
					      msg.sources.forEach((src: any, i: number) => {
 | 
				
			||||||
 | 
					        const url = src.metadata?.url || '';
 | 
				
			||||||
 | 
					        md += `- [${i + 1}] [${url}](${url})\n`;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  md += '\n---\n';
 | 
				
			||||||
 | 
					  downloadFile(`${title || 'chat'}.md`, md, 'text/markdown');
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const exportAsPDF = (messages: Message[], title: string) => {
 | 
				
			||||||
 | 
					  const doc = new jsPDF();
 | 
				
			||||||
 | 
					  const date = new Date(messages[0]?.createdAt || Date.now()).toLocaleString();
 | 
				
			||||||
 | 
					  let y = 15;
 | 
				
			||||||
 | 
					  const pageHeight = doc.internal.pageSize.height;
 | 
				
			||||||
 | 
					  doc.setFontSize(18);
 | 
				
			||||||
 | 
					  doc.text(`Chat Export: ${title}`, 10, y);
 | 
				
			||||||
 | 
					  y += 8;
 | 
				
			||||||
 | 
					  doc.setFontSize(11);
 | 
				
			||||||
 | 
					  doc.setTextColor(100);
 | 
				
			||||||
 | 
					  doc.text(`Exported on: ${date}`, 10, y);
 | 
				
			||||||
 | 
					  y += 8;
 | 
				
			||||||
 | 
					  doc.setDrawColor(200);
 | 
				
			||||||
 | 
					  doc.line(10, y, 200, y);
 | 
				
			||||||
 | 
					  y += 6;
 | 
				
			||||||
 | 
					  doc.setTextColor(30);
 | 
				
			||||||
 | 
					  messages.forEach((msg, idx) => {
 | 
				
			||||||
 | 
					    if (y > pageHeight - 30) {
 | 
				
			||||||
 | 
					      doc.addPage();
 | 
				
			||||||
 | 
					      y = 15;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    doc.setFont('helvetica', 'bold');
 | 
				
			||||||
 | 
					    doc.text(`${msg.role === 'user' ? 'User' : 'Assistant'}`, 10, y);
 | 
				
			||||||
 | 
					    doc.setFont('helvetica', 'normal');
 | 
				
			||||||
 | 
					    doc.setFontSize(10);
 | 
				
			||||||
 | 
					    doc.setTextColor(120);
 | 
				
			||||||
 | 
					    doc.text(`${new Date(msg.createdAt).toLocaleString()}`, 40, y);
 | 
				
			||||||
 | 
					    y += 6;
 | 
				
			||||||
 | 
					    doc.setTextColor(30);
 | 
				
			||||||
 | 
					    doc.setFontSize(12);
 | 
				
			||||||
 | 
					    const lines = doc.splitTextToSize(msg.content, 180);
 | 
				
			||||||
 | 
					    for (let i = 0; i < lines.length; i++) {
 | 
				
			||||||
 | 
					      if (y > pageHeight - 20) {
 | 
				
			||||||
 | 
					        doc.addPage();
 | 
				
			||||||
 | 
					        y = 15;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      doc.text(lines[i], 12, y);
 | 
				
			||||||
 | 
					      y += 6;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (msg.sources && msg.sources.length > 0) {
 | 
				
			||||||
 | 
					      doc.setFontSize(11);
 | 
				
			||||||
 | 
					      doc.setTextColor(80);
 | 
				
			||||||
 | 
					      if (y > pageHeight - 20) {
 | 
				
			||||||
 | 
					        doc.addPage();
 | 
				
			||||||
 | 
					        y = 15;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      doc.text('Citations:', 12, y);
 | 
				
			||||||
 | 
					      y += 5;
 | 
				
			||||||
 | 
					      msg.sources.forEach((src: any, i: number) => {
 | 
				
			||||||
 | 
					        const url = src.metadata?.url || '';
 | 
				
			||||||
 | 
					        if (y > pageHeight - 15) {
 | 
				
			||||||
 | 
					          doc.addPage();
 | 
				
			||||||
 | 
					          y = 15;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        doc.text(`- [${i + 1}] ${url}`, 15, y);
 | 
				
			||||||
 | 
					        y += 5;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      doc.setTextColor(30);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    y += 6;
 | 
				
			||||||
 | 
					    doc.setDrawColor(230);
 | 
				
			||||||
 | 
					    if (y > pageHeight - 10) {
 | 
				
			||||||
 | 
					      doc.addPage();
 | 
				
			||||||
 | 
					      y = 15;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    doc.line(10, y, 200, y);
 | 
				
			||||||
 | 
					    y += 4;
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  doc.save(`${title || 'chat'}.pdf`);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const Navbar = ({
 | 
					const Navbar = ({
 | 
				
			||||||
  chatId,
 | 
					  chatId,
 | 
				
			||||||
@@ -59,10 +173,39 @@ const Navbar = ({
 | 
				
			|||||||
      <p className="hidden lg:flex">{title}</p>
 | 
					      <p className="hidden lg:flex">{title}</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <div className="flex flex-row items-center space-x-4">
 | 
					      <div className="flex flex-row items-center space-x-4">
 | 
				
			||||||
        <Share
 | 
					        <Popover className="relative">
 | 
				
			||||||
          size={17}
 | 
					          <PopoverButton className="active:scale-95 transition duration-100 cursor-pointer p-2 rounded-full hover:bg-light-secondary dark:hover:bg-dark-secondary">
 | 
				
			||||||
          className="active:scale-95 transition duration-100 cursor-pointer"
 | 
					            <Share size={17} />
 | 
				
			||||||
        />
 | 
					          </PopoverButton>
 | 
				
			||||||
 | 
					          <Transition
 | 
				
			||||||
 | 
					            as={Fragment}
 | 
				
			||||||
 | 
					            enter="transition ease-out duration-100"
 | 
				
			||||||
 | 
					            enterFrom="opacity-0 translate-y-1"
 | 
				
			||||||
 | 
					            enterTo="opacity-100 translate-y-0"
 | 
				
			||||||
 | 
					            leave="transition ease-in duration-75"
 | 
				
			||||||
 | 
					            leaveFrom="opacity-100 translate-y-0"
 | 
				
			||||||
 | 
					            leaveTo="opacity-0 translate-y-1"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            <PopoverPanel className="absolute right-0 mt-2 w-64 rounded-xl shadow-xl bg-light-primary dark:bg-dark-primary border border-light-200 dark:border-dark-200 z-50">
 | 
				
			||||||
 | 
					              <div className="flex flex-col py-3 px-3 gap-2">
 | 
				
			||||||
 | 
					                <button
 | 
				
			||||||
 | 
					                  className="flex items-center gap-2 px-4 py-2 text-left hover:bg-light-secondary dark:hover:bg-dark-secondary transition-colors text-black dark:text-white rounded-lg font-medium"
 | 
				
			||||||
 | 
					                  onClick={() => exportAsMarkdown(messages, title || '')}
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                  <FileText size={17} className="text-[#24A0ED]" />
 | 
				
			||||||
 | 
					                  Export as Markdown
 | 
				
			||||||
 | 
					                </button>
 | 
				
			||||||
 | 
					                <button
 | 
				
			||||||
 | 
					                  className="flex items-center gap-2 px-4 py-2 text-left hover:bg-light-secondary dark:hover:bg-dark-secondary transition-colors text-black dark:text-white rounded-lg font-medium"
 | 
				
			||||||
 | 
					                  onClick={() => exportAsPDF(messages, title || '')}
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                  <FileDown size={17} className="text-[#24A0ED]" />
 | 
				
			||||||
 | 
					                  Export as PDF
 | 
				
			||||||
 | 
					                </button>
 | 
				
			||||||
 | 
					              </div>
 | 
				
			||||||
 | 
					            </PopoverPanel>
 | 
				
			||||||
 | 
					          </Transition>
 | 
				
			||||||
 | 
					        </Popover>
 | 
				
			||||||
        <DeleteChat redirect chatId={chatId} chats={[]} setChats={() => {}} />
 | 
					        <DeleteChat redirect chatId={chatId} chats={[]} setChats={() => {}} />
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										71
									
								
								src/components/NewsArticleWidget.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,71 @@
 | 
				
			|||||||
 | 
					import { useEffect, useState } from 'react';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface Article {
 | 
				
			||||||
 | 
					  title: string;
 | 
				
			||||||
 | 
					  content: string;
 | 
				
			||||||
 | 
					  url: string;
 | 
				
			||||||
 | 
					  thumbnail: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const NewsArticleWidget = () => {
 | 
				
			||||||
 | 
					  const [article, setArticle] = useState<Article | null>(null);
 | 
				
			||||||
 | 
					  const [loading, setLoading] = useState(true);
 | 
				
			||||||
 | 
					  const [error, setError] = useState(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  useEffect(() => {
 | 
				
			||||||
 | 
					    fetch('/api/discover?mode=preview')
 | 
				
			||||||
 | 
					      .then((res) => res.json())
 | 
				
			||||||
 | 
					      .then((data) => {
 | 
				
			||||||
 | 
					        const articles = (data.blogs || []).filter((a: Article) => a.thumbnail);
 | 
				
			||||||
 | 
					        setArticle(articles[Math.floor(Math.random() * articles.length)]);
 | 
				
			||||||
 | 
					        setLoading(false);
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      .catch(() => {
 | 
				
			||||||
 | 
					        setError(true);
 | 
				
			||||||
 | 
					        setLoading(false);
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					  }, []);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <div className="bg-light-secondary dark:bg-dark-secondary rounded-xl border border-light-200 dark:border-dark-200 shadow-sm flex flex-row items-center w-full h-24 min-h-[96px] max-h-[96px] px-3 py-2 gap-3 overflow-hidden">
 | 
				
			||||||
 | 
					      {loading ? (
 | 
				
			||||||
 | 
					        <>
 | 
				
			||||||
 | 
					          <div className="animate-pulse flex flex-row items-center w-full h-full">
 | 
				
			||||||
 | 
					            <div className="rounded-lg w-16 min-w-16 max-w-16 h-16 min-h-16 max-h-16 bg-light-200 dark:bg-dark-200 mr-3" />
 | 
				
			||||||
 | 
					            <div className="flex flex-col justify-center flex-1 h-full w-0 gap-2">
 | 
				
			||||||
 | 
					              <div className="h-4 w-3/4 rounded bg-light-200 dark:bg-dark-200" />
 | 
				
			||||||
 | 
					              <div className="h-3 w-1/2 rounded bg-light-200 dark:bg-dark-200" />
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </>
 | 
				
			||||||
 | 
					      ) : error ? (
 | 
				
			||||||
 | 
					        <div className="w-full text-xs text-red-400">Could not load news.</div>
 | 
				
			||||||
 | 
					      ) : article ? (
 | 
				
			||||||
 | 
					        <a
 | 
				
			||||||
 | 
					          href={`/?q=Summary: ${article.url}`}
 | 
				
			||||||
 | 
					          className="flex flex-row items-center w-full h-full group"
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
 | 
					          <img
 | 
				
			||||||
 | 
					            className="object-cover rounded-lg w-16 min-w-16 max-w-16 h-16 min-h-16 max-h-16 border border-light-200 dark:border-dark-200 bg-light-200 dark:bg-dark-200 group-hover:opacity-90 transition"
 | 
				
			||||||
 | 
					            src={
 | 
				
			||||||
 | 
					              new URL(article.thumbnail).origin +
 | 
				
			||||||
 | 
					              new URL(article.thumbnail).pathname +
 | 
				
			||||||
 | 
					              `?id=${new URL(article.thumbnail).searchParams.get('id')}`
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            alt={article.title}
 | 
				
			||||||
 | 
					          />
 | 
				
			||||||
 | 
					          <div className="flex flex-col justify-center flex-1 h-full pl-3 w-0">
 | 
				
			||||||
 | 
					            <div className="font-bold text-xs text-black dark:text-white leading-tight truncate overflow-hidden whitespace-nowrap">
 | 
				
			||||||
 | 
					              {article.title}
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					            <p className="text-black/70 dark:text-white/70 text-xs leading-snug truncate overflow-hidden whitespace-nowrap">
 | 
				
			||||||
 | 
					              {article.content}
 | 
				
			||||||
 | 
					            </p>
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </a>
 | 
				
			||||||
 | 
					      ) : null}
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default NewsArticleWidget;
 | 
				
			||||||
							
								
								
									
										159
									
								
								src/components/WeatherWidget.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,159 @@
 | 
				
			|||||||
 | 
					import { Cloud, Sun, CloudRain, CloudSnow, Wind } from 'lucide-react';
 | 
				
			||||||
 | 
					import { useEffect, useState } from 'react';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const WeatherWidget = () => {
 | 
				
			||||||
 | 
					  const [data, setData] = useState({
 | 
				
			||||||
 | 
					    temperature: 0,
 | 
				
			||||||
 | 
					    condition: '',
 | 
				
			||||||
 | 
					    location: '',
 | 
				
			||||||
 | 
					    humidity: 0,
 | 
				
			||||||
 | 
					    windSpeed: 0,
 | 
				
			||||||
 | 
					    icon: '',
 | 
				
			||||||
 | 
					    temperatureUnit: 'C',
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const [loading, setLoading] = useState(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  useEffect(() => {
 | 
				
			||||||
 | 
					    const getApproxLocation = async () => {
 | 
				
			||||||
 | 
					      const res = await fetch('https://ipwhois.app/json/');
 | 
				
			||||||
 | 
					      const data = await res.json();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return {
 | 
				
			||||||
 | 
					        latitude: data.latitude,
 | 
				
			||||||
 | 
					        longitude: data.longitude,
 | 
				
			||||||
 | 
					        city: data.city,
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const getLocation = async (
 | 
				
			||||||
 | 
					      callback: (location: {
 | 
				
			||||||
 | 
					        latitude: number;
 | 
				
			||||||
 | 
					        longitude: number;
 | 
				
			||||||
 | 
					        city: string;
 | 
				
			||||||
 | 
					      }) => void,
 | 
				
			||||||
 | 
					    ) => {
 | 
				
			||||||
 | 
					      if (navigator.geolocation) {
 | 
				
			||||||
 | 
					        const result = await navigator.permissions.query({
 | 
				
			||||||
 | 
					          name: 'geolocation',
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (result.state === 'granted') {
 | 
				
			||||||
 | 
					          navigator.geolocation.getCurrentPosition(async (position) => {
 | 
				
			||||||
 | 
					            const res = await fetch(
 | 
				
			||||||
 | 
					              `https://api-bdc.io/data/reverse-geocode-client?latitude=${position.coords.latitude}&longitude=${position.coords.longitude}&localityLanguage=en`,
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                method: 'GET',
 | 
				
			||||||
 | 
					                headers: {
 | 
				
			||||||
 | 
					                  'Content-Type': 'application/json',
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            const data = await res.json();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            callback({
 | 
				
			||||||
 | 
					              latitude: position.coords.latitude,
 | 
				
			||||||
 | 
					              longitude: position.coords.longitude,
 | 
				
			||||||
 | 
					              city: data.locality,
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					        } else if (result.state === 'prompt') {
 | 
				
			||||||
 | 
					          callback(await getApproxLocation());
 | 
				
			||||||
 | 
					          navigator.geolocation.getCurrentPosition((position) => {});
 | 
				
			||||||
 | 
					        } else if (result.state === 'denied') {
 | 
				
			||||||
 | 
					          callback(await getApproxLocation());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        callback(await getApproxLocation());
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getLocation(async (location) => {
 | 
				
			||||||
 | 
					      const res = await fetch(`/api/weather`, {
 | 
				
			||||||
 | 
					        method: 'POST',
 | 
				
			||||||
 | 
					        body: JSON.stringify({
 | 
				
			||||||
 | 
					          lat: location.latitude,
 | 
				
			||||||
 | 
					          lng: location.longitude,
 | 
				
			||||||
 | 
					          temperatureUnit: localStorage.getItem('temperatureUnit') ?? 'C',
 | 
				
			||||||
 | 
					        }),
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const data = await res.json();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (res.status !== 200) {
 | 
				
			||||||
 | 
					        console.error('Error fetching weather data');
 | 
				
			||||||
 | 
					        setLoading(false);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      setData({
 | 
				
			||||||
 | 
					        temperature: data.temperature,
 | 
				
			||||||
 | 
					        condition: data.condition,
 | 
				
			||||||
 | 
					        location: location.city,
 | 
				
			||||||
 | 
					        humidity: data.humidity,
 | 
				
			||||||
 | 
					        windSpeed: data.windSpeed,
 | 
				
			||||||
 | 
					        icon: data.icon,
 | 
				
			||||||
 | 
					        temperatureUnit: data.temperatureUnit,
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      setLoading(false);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  }, []);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <div className="bg-light-secondary dark:bg-dark-secondary rounded-xl border border-light-200 dark:border-dark-200 shadow-sm flex flex-row items-center w-full h-24 min-h-[96px] max-h-[96px] px-3 py-2 gap-3">
 | 
				
			||||||
 | 
					      {loading ? (
 | 
				
			||||||
 | 
					        <>
 | 
				
			||||||
 | 
					          <div className="flex flex-col items-center justify-center w-16 min-w-16 max-w-16 h-full animate-pulse">
 | 
				
			||||||
 | 
					            <div className="h-10 w-10 rounded-full bg-light-200 dark:bg-dark-200 mb-2" />
 | 
				
			||||||
 | 
					            <div className="h-4 w-10 rounded bg-light-200 dark:bg-dark-200" />
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					          <div className="flex flex-col justify-between flex-1 h-full py-1 animate-pulse">
 | 
				
			||||||
 | 
					            <div className="flex flex-row items-center justify-between">
 | 
				
			||||||
 | 
					              <div className="h-3 w-20 rounded bg-light-200 dark:bg-dark-200" />
 | 
				
			||||||
 | 
					              <div className="h-3 w-12 rounded bg-light-200 dark:bg-dark-200" />
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					            <div className="h-3 w-16 rounded bg-light-200 dark:bg-dark-200 mt-1" />
 | 
				
			||||||
 | 
					            <div className="flex flex-row justify-between w-full mt-auto pt-1 border-t border-light-200 dark:border-dark-200">
 | 
				
			||||||
 | 
					              <div className="h-3 w-16 rounded bg-light-200 dark:bg-dark-200" />
 | 
				
			||||||
 | 
					              <div className="h-3 w-8 rounded bg-light-200 dark:bg-dark-200" />
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </>
 | 
				
			||||||
 | 
					      ) : (
 | 
				
			||||||
 | 
					        <>
 | 
				
			||||||
 | 
					          <div className="flex flex-col items-center justify-center w-16 min-w-16 max-w-16 h-full">
 | 
				
			||||||
 | 
					            <img
 | 
				
			||||||
 | 
					              src={`/weather-ico/${data.icon}.svg`}
 | 
				
			||||||
 | 
					              alt={data.condition}
 | 
				
			||||||
 | 
					              className="h-10 w-auto"
 | 
				
			||||||
 | 
					            />
 | 
				
			||||||
 | 
					            <span className="text-base font-semibold text-black dark:text-white">
 | 
				
			||||||
 | 
					              {data.temperature}°{data.temperatureUnit}
 | 
				
			||||||
 | 
					            </span>
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					          <div className="flex flex-col justify-between flex-1 h-full py-1">
 | 
				
			||||||
 | 
					            <div className="flex flex-row items-center justify-between">
 | 
				
			||||||
 | 
					              <span className="text-xs font-medium text-black dark:text-white">
 | 
				
			||||||
 | 
					                {data.location}
 | 
				
			||||||
 | 
					              </span>
 | 
				
			||||||
 | 
					              <span className="flex items-center text-xs text-black/60 dark:text-white/60">
 | 
				
			||||||
 | 
					                <Wind className="w-3 h-3 mr-1" />
 | 
				
			||||||
 | 
					                {data.windSpeed} km/h
 | 
				
			||||||
 | 
					              </span>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					            <span className="text-xs text-black/60 dark:text-white/60 mt-1">
 | 
				
			||||||
 | 
					              {data.condition}
 | 
				
			||||||
 | 
					            </span>
 | 
				
			||||||
 | 
					            <div className="flex flex-row justify-between w-full mt-auto pt-1 border-t border-light-200 dark:border-dark-200 text-xs text-black/60 dark:text-white/60">
 | 
				
			||||||
 | 
					              <span>Humidity: {data.humidity}%</span>
 | 
				
			||||||
 | 
					              <span>Now</span>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </>
 | 
				
			||||||
 | 
					      )}
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default WeatherWidget;
 | 
				
			||||||
@@ -1,7 +1,14 @@
 | 
				
			|||||||
import fs from 'fs';
 | 
					 | 
				
			||||||
import path from 'path';
 | 
					 | 
				
			||||||
import toml from '@iarna/toml';
 | 
					import toml from '@iarna/toml';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Use dynamic imports for Node.js modules to prevent client-side errors
 | 
				
			||||||
 | 
					let fs: any;
 | 
				
			||||||
 | 
					let path: any;
 | 
				
			||||||
 | 
					if (typeof window === 'undefined') {
 | 
				
			||||||
 | 
					  // We're on the server
 | 
				
			||||||
 | 
					  fs = require('fs');
 | 
				
			||||||
 | 
					  path = require('path');
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const configFileName = 'config.toml';
 | 
					const configFileName = 'config.toml';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface Config {
 | 
					interface Config {
 | 
				
			||||||
@@ -28,6 +35,12 @@ interface Config {
 | 
				
			|||||||
    DEEPSEEK: {
 | 
					    DEEPSEEK: {
 | 
				
			||||||
      API_KEY: string;
 | 
					      API_KEY: string;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    AIMLAPI: {
 | 
				
			||||||
 | 
					      API_KEY: string;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    LM_STUDIO: {
 | 
				
			||||||
 | 
					      API_URL: string;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    CUSTOM_OPENAI: {
 | 
					    CUSTOM_OPENAI: {
 | 
				
			||||||
      API_URL: string;
 | 
					      API_URL: string;
 | 
				
			||||||
      API_KEY: string;
 | 
					      API_KEY: string;
 | 
				
			||||||
@@ -43,10 +56,17 @@ type RecursivePartial<T> = {
 | 
				
			|||||||
  [P in keyof T]?: RecursivePartial<T[P]>;
 | 
					  [P in keyof T]?: RecursivePartial<T[P]>;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const loadConfig = () =>
 | 
					const loadConfig = () => {
 | 
				
			||||||
  toml.parse(
 | 
					  // Server-side only
 | 
				
			||||||
    fs.readFileSync(path.join(process.cwd(), `${configFileName}`), 'utf-8'),
 | 
					  if (typeof window === 'undefined') {
 | 
				
			||||||
  ) as any as Config;
 | 
					    return toml.parse(
 | 
				
			||||||
 | 
					      fs.readFileSync(path.join(process.cwd(), `${configFileName}`), 'utf-8'),
 | 
				
			||||||
 | 
					    ) as any as Config;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Client-side fallback - settings will be loaded via API
 | 
				
			||||||
 | 
					  return {} as Config;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getSimilarityMeasure = () =>
 | 
					export const getSimilarityMeasure = () =>
 | 
				
			||||||
  loadConfig().GENERAL.SIMILARITY_MEASURE;
 | 
					  loadConfig().GENERAL.SIMILARITY_MEASURE;
 | 
				
			||||||
@@ -68,6 +88,8 @@ export const getOllamaApiEndpoint = () => loadConfig().MODELS.OLLAMA.API_URL;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export const getDeepseekApiKey = () => loadConfig().MODELS.DEEPSEEK.API_KEY;
 | 
					export const getDeepseekApiKey = () => loadConfig().MODELS.DEEPSEEK.API_KEY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const getAimlApiKey = () => loadConfig().MODELS.AIMLAPI.API_KEY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getCustomOpenaiApiKey = () =>
 | 
					export const getCustomOpenaiApiKey = () =>
 | 
				
			||||||
  loadConfig().MODELS.CUSTOM_OPENAI.API_KEY;
 | 
					  loadConfig().MODELS.CUSTOM_OPENAI.API_KEY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -77,6 +99,9 @@ export const getCustomOpenaiApiUrl = () =>
 | 
				
			|||||||
export const getCustomOpenaiModelName = () =>
 | 
					export const getCustomOpenaiModelName = () =>
 | 
				
			||||||
  loadConfig().MODELS.CUSTOM_OPENAI.MODEL_NAME;
 | 
					  loadConfig().MODELS.CUSTOM_OPENAI.MODEL_NAME;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const getLMStudioApiEndpoint = () =>
 | 
				
			||||||
 | 
					  loadConfig().MODELS.LM_STUDIO.API_URL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const mergeConfigs = (current: any, update: any): any => {
 | 
					const mergeConfigs = (current: any, update: any): any => {
 | 
				
			||||||
  if (update === null || update === undefined) {
 | 
					  if (update === null || update === undefined) {
 | 
				
			||||||
    return current;
 | 
					    return current;
 | 
				
			||||||
@@ -109,10 +134,13 @@ const mergeConfigs = (current: any, update: any): any => {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const updateConfig = (config: RecursivePartial<Config>) => {
 | 
					export const updateConfig = (config: RecursivePartial<Config>) => {
 | 
				
			||||||
  const currentConfig = loadConfig();
 | 
					  // Server-side only
 | 
				
			||||||
  const mergedConfig = mergeConfigs(currentConfig, config);
 | 
					  if (typeof window === 'undefined') {
 | 
				
			||||||
  fs.writeFileSync(
 | 
					    const currentConfig = loadConfig();
 | 
				
			||||||
    path.join(path.join(process.cwd(), `${configFileName}`)),
 | 
					    const mergedConfig = mergeConfigs(currentConfig, config);
 | 
				
			||||||
    toml.stringify(mergedConfig),
 | 
					    fs.writeFileSync(
 | 
				
			||||||
  );
 | 
					      path.join(path.join(process.cwd(), `${configFileName}`)),
 | 
				
			||||||
 | 
					      toml.stringify(mergedConfig),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,8 @@ import Database from 'better-sqlite3';
 | 
				
			|||||||
import * as schema from './schema';
 | 
					import * as schema from './schema';
 | 
				
			||||||
import path from 'path';
 | 
					import path from 'path';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const sqlite = new Database(path.join(process.cwd(), 'data/db.sqlite'));
 | 
					const DATA_DIR = process.env.DATA_DIR || process.cwd();
 | 
				
			||||||
 | 
					const sqlite = new Database(path.join(DATA_DIR, './data/db.sqlite'));
 | 
				
			||||||
const db = drizzle(sqlite, {
 | 
					const db = drizzle(sqlite, {
 | 
				
			||||||
  schema: schema,
 | 
					  schema: schema,
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								src/lib/db/migrate.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					import db from './';
 | 
				
			||||||
 | 
					import { migrate } from 'drizzle-orm/better-sqlite3/migrator';
 | 
				
			||||||
 | 
					import path from 'path';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					migrate(db, { migrationsFolder: path.join(process.cwd(), 'drizzle') });
 | 
				
			||||||
@@ -1,63 +1,41 @@
 | 
				
			|||||||
export const webSearchRetrieverPrompt = `
 | 
					export const webSearchRetrieverPrompt = `
 | 
				
			||||||
You are an AI question rephraser. You will be given a conversation and a follow-up question,  you will have to rephrase the follow up question so it is a standalone question and can be used by another LLM to search the web for information to answer it.
 | 
					You are an AI question rephraser. You will be given a conversation and a follow-up question; rephrase it into a standalone question that another LLM can use to search the web.
 | 
				
			||||||
If it is a simple writing task or a greeting (unless the greeting contains a question after it) like Hi, Hello, How are you, etc. than a question then you need to return \`not_needed\` as the response (This is because the LLM won't need to search the web for finding information on this topic).
 | 
					 | 
				
			||||||
If the user asks some question from some URL or wants you to summarize a PDF or a webpage (via URL) you need to return the links inside the \`links\` XML block and the question inside the \`question\` XML block. If the user wants to you to summarize the webpage or the PDF you need to return \`summarize\` inside the \`question\` XML block in place of a question and the link to summarize in the \`links\` XML block.
 | 
					 | 
				
			||||||
You must always return the rephrased question inside the \`question\` XML block, if there are no links in the follow-up question then don't insert a \`links\` XML block in your response.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
There are several examples attached for your reference inside the below \`examples\` XML block
 | 
					Return ONLY a JSON object that matches this schema:
 | 
				
			||||||
 | 
					query: string   // the standalone question (or "summarize")
 | 
				
			||||||
 | 
					links: string[] // URLs extracted from the user query (empty if none)
 | 
				
			||||||
 | 
					searchRequired: boolean // true if web search is needed, false for greetings/simple writing tasks
 | 
				
			||||||
 | 
					searchMode: "" | "normal" | "news" // "" when searchRequired is false; "news" if the user asks for news/articles, otherwise "normal"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<examples>
 | 
					Rules
 | 
				
			||||||
1. Follow up question: What is the capital of France
 | 
					- Greetings / simple writing tasks → query:"", links:[], searchRequired:false, searchMode:""
 | 
				
			||||||
Rephrased question:\`
 | 
					- Summarizing a URL → query:"summarize", links:[url...], searchRequired:true, searchMode:"normal"
 | 
				
			||||||
<question>
 | 
					- Asking for news/articles → searchMode:"news"
 | 
				
			||||||
Capital of france
 | 
					
 | 
				
			||||||
</question>
 | 
					Examples
 | 
				
			||||||
\`
 | 
					1. Follow-up: What is the capital of France?
 | 
				
			||||||
 | 
					"query":"capital of France","links":[],"searchRequired":true,"searchMode":"normal"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
2. Hi, how are you?
 | 
					2. Hi, how are you?
 | 
				
			||||||
Rephrased question\`
 | 
					"query":"","links":[],"searchRequired":false,"searchMode":""
 | 
				
			||||||
<question>
 | 
					 | 
				
			||||||
not_needed
 | 
					 | 
				
			||||||
</question>
 | 
					 | 
				
			||||||
\`
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
3. Follow up question: What is Docker?
 | 
					3. Follow-up: What is Docker?
 | 
				
			||||||
Rephrased question: \`
 | 
					"query":"what is Docker","links":[],"searchRequired":true,"searchMode":"normal"
 | 
				
			||||||
<question>
 | 
					 | 
				
			||||||
What is Docker
 | 
					 | 
				
			||||||
</question>
 | 
					 | 
				
			||||||
\`
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
4. Follow up question: Can you tell me what is X from https://example.com
 | 
					4. Follow-up: Can you tell me what is X from https://example.com?
 | 
				
			||||||
Rephrased question: \`
 | 
					"query":"what is X","links":["https://example.com"],"searchRequired":true,"searchMode":"normal"
 | 
				
			||||||
<question>
 | 
					 | 
				
			||||||
Can you tell me what is X?
 | 
					 | 
				
			||||||
</question>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
<links>
 | 
					5. Follow-up: Summarize the content from https://example.com
 | 
				
			||||||
https://example.com
 | 
					"query":"summarize","links":["https://example.com"],"searchRequired":true,"searchMode":"normal"
 | 
				
			||||||
</links>
 | 
					 | 
				
			||||||
\`
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
5. Follow up question: Summarize the content from https://example.com
 | 
					6. Follow-up: Latest news about AI
 | 
				
			||||||
Rephrased question: \`
 | 
					"query":"latest news about AI","links":[],"searchRequired":true,"searchMode":"news"
 | 
				
			||||||
<question>
 | 
					 | 
				
			||||||
summarize
 | 
					 | 
				
			||||||
</question>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<links>
 | 
					 | 
				
			||||||
https://example.com
 | 
					 | 
				
			||||||
</links>
 | 
					 | 
				
			||||||
\`
 | 
					 | 
				
			||||||
</examples>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Anything below is the part of the actual conversation and you need to use conversation and the follow-up question to rephrase the follow-up question as a standalone question based on the guidelines shared above.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
<conversation>
 | 
					<conversation>
 | 
				
			||||||
{chat_history}
 | 
					{chat_history}
 | 
				
			||||||
</conversation>
 | 
					</conversation>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Follow up question: {query}
 | 
					Follow-up question: {query}
 | 
				
			||||||
Rephrased question:
 | 
					Rephrased question:
 | 
				
			||||||
`;
 | 
					`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										94
									
								
								src/lib/providers/aimlapi.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,94 @@
 | 
				
			|||||||
 | 
					import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai';
 | 
				
			||||||
 | 
					import { getAimlApiKey } from '../config';
 | 
				
			||||||
 | 
					import { ChatModel, EmbeddingModel } from '.';
 | 
				
			||||||
 | 
					import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
				
			||||||
 | 
					import { Embeddings } from '@langchain/core/embeddings';
 | 
				
			||||||
 | 
					import axios from 'axios';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const PROVIDER_INFO = {
 | 
				
			||||||
 | 
					  key: 'aimlapi',
 | 
				
			||||||
 | 
					  displayName: 'AI/ML API',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface AimlApiModel {
 | 
				
			||||||
 | 
					  id: string;
 | 
				
			||||||
 | 
					  name?: string;
 | 
				
			||||||
 | 
					  type?: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const API_URL = 'https://api.aimlapi.com';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const loadAimlApiChatModels = async () => {
 | 
				
			||||||
 | 
					  const apiKey = getAimlApiKey();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!apiKey) return {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    const response = await axios.get(`${API_URL}/models`, {
 | 
				
			||||||
 | 
					      headers: {
 | 
				
			||||||
 | 
					        'Content-Type': 'application/json',
 | 
				
			||||||
 | 
					        Authorization: `Bearer ${apiKey}`,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const chatModels: Record<string, ChatModel> = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    response.data.data.forEach((model: AimlApiModel) => {
 | 
				
			||||||
 | 
					      if (model.type === 'chat-completion') {
 | 
				
			||||||
 | 
					        chatModels[model.id] = {
 | 
				
			||||||
 | 
					          displayName: model.name || model.id,
 | 
				
			||||||
 | 
					          model: new ChatOpenAI({
 | 
				
			||||||
 | 
					            apiKey: apiKey,
 | 
				
			||||||
 | 
					            modelName: model.id,
 | 
				
			||||||
 | 
					            temperature: 0.7,
 | 
				
			||||||
 | 
					            configuration: {
 | 
				
			||||||
 | 
					              baseURL: API_URL,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          }) as unknown as BaseChatModel,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return chatModels;
 | 
				
			||||||
 | 
					  } catch (err) {
 | 
				
			||||||
 | 
					    console.error(`Error loading AI/ML API models: ${err}`);
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const loadAimlApiEmbeddingModels = async () => {
 | 
				
			||||||
 | 
					  const apiKey = getAimlApiKey();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!apiKey) return {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    const response = await axios.get(`${API_URL}/models`, {
 | 
				
			||||||
 | 
					      headers: {
 | 
				
			||||||
 | 
					        'Content-Type': 'application/json',
 | 
				
			||||||
 | 
					        Authorization: `Bearer ${apiKey}`,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const embeddingModels: Record<string, EmbeddingModel> = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    response.data.data.forEach((model: AimlApiModel) => {
 | 
				
			||||||
 | 
					      if (model.type === 'embedding') {
 | 
				
			||||||
 | 
					        embeddingModels[model.id] = {
 | 
				
			||||||
 | 
					          displayName: model.name || model.id,
 | 
				
			||||||
 | 
					          model: new OpenAIEmbeddings({
 | 
				
			||||||
 | 
					            apiKey: apiKey,
 | 
				
			||||||
 | 
					            modelName: model.id,
 | 
				
			||||||
 | 
					            configuration: {
 | 
				
			||||||
 | 
					              baseURL: API_URL,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          }) as unknown as Embeddings,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return embeddingModels;
 | 
				
			||||||
 | 
					  } catch (err) {
 | 
				
			||||||
 | 
					    console.error(`Error loading AI/ML API embeddings models: ${err}`);
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@@ -1,6 +1,11 @@
 | 
				
			|||||||
import { ChatAnthropic } from '@langchain/anthropic';
 | 
					import { ChatAnthropic } from '@langchain/anthropic';
 | 
				
			||||||
import { ChatModel } from '.';
 | 
					import { ChatModel } from '.';
 | 
				
			||||||
import { getAnthropicApiKey } from '../config';
 | 
					import { getAnthropicApiKey } from '../config';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const PROVIDER_INFO = {
 | 
				
			||||||
 | 
					  key: 'anthropic',
 | 
				
			||||||
 | 
					  displayName: 'Anthropic',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
					import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const anthropicChatModels: Record<string, string>[] = [
 | 
					const anthropicChatModels: Record<string, string>[] = [
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,11 @@ import { getDeepseekApiKey } from '../config';
 | 
				
			|||||||
import { ChatModel } from '.';
 | 
					import { ChatModel } from '.';
 | 
				
			||||||
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
					import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const PROVIDER_INFO = {
 | 
				
			||||||
 | 
					  key: 'deepseek',
 | 
				
			||||||
 | 
					  displayName: 'Deepseek AI',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const deepseekChatModels: Record<string, string>[] = [
 | 
					const deepseekChatModels: Record<string, string>[] = [
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    displayName: 'Deepseek Chat (Deepseek V3)',
 | 
					    displayName: 'Deepseek Chat (Deepseek V3)',
 | 
				
			||||||
@@ -26,7 +31,7 @@ export const loadDeepseekChatModels = async () => {
 | 
				
			|||||||
      chatModels[model.key] = {
 | 
					      chatModels[model.key] = {
 | 
				
			||||||
        displayName: model.displayName,
 | 
					        displayName: model.displayName,
 | 
				
			||||||
        model: new ChatOpenAI({
 | 
					        model: new ChatOpenAI({
 | 
				
			||||||
          openAIApiKey: deepseekApiKey,
 | 
					          apiKey: deepseekApiKey,
 | 
				
			||||||
          modelName: model.key,
 | 
					          modelName: model.key,
 | 
				
			||||||
          temperature: 0.7,
 | 
					          temperature: 0.7,
 | 
				
			||||||
          configuration: {
 | 
					          configuration: {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,13 +4,26 @@ import {
 | 
				
			|||||||
} from '@langchain/google-genai';
 | 
					} from '@langchain/google-genai';
 | 
				
			||||||
import { getGeminiApiKey } from '../config';
 | 
					import { getGeminiApiKey } from '../config';
 | 
				
			||||||
import { ChatModel, EmbeddingModel } from '.';
 | 
					import { ChatModel, EmbeddingModel } from '.';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const PROVIDER_INFO = {
 | 
				
			||||||
 | 
					  key: 'gemini',
 | 
				
			||||||
 | 
					  displayName: 'Google Gemini',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
					import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
				
			||||||
import { Embeddings } from '@langchain/core/embeddings';
 | 
					import { Embeddings } from '@langchain/core/embeddings';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const geminiChatModels: Record<string, string>[] = [
 | 
					const geminiChatModels: Record<string, string>[] = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    displayName: 'Gemini 2.5 Flash Preview 05-20',
 | 
				
			||||||
 | 
					    key: 'gemini-2.5-flash-preview-05-20',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    displayName: 'Gemini 2.5 Pro Preview',
 | 
				
			||||||
 | 
					    key: 'gemini-2.5-pro-preview-05-06',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    displayName: 'Gemini 2.5 Pro Experimental',
 | 
					    displayName: 'Gemini 2.5 Pro Experimental',
 | 
				
			||||||
    key: 'gemini-2.5-pro-exp-03-25',
 | 
					    key: 'gemini-2.5-pro-preview-05-06',
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    displayName: 'Gemini 2.0 Flash',
 | 
					    displayName: 'Gemini 2.0 Flash',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,97 +1,43 @@
 | 
				
			|||||||
import { ChatOpenAI } from '@langchain/openai';
 | 
					import { ChatOpenAI } from '@langchain/openai';
 | 
				
			||||||
import { getGroqApiKey } from '../config';
 | 
					import { getGroqApiKey } from '../config';
 | 
				
			||||||
import { ChatModel } from '.';
 | 
					import { ChatModel } from '.';
 | 
				
			||||||
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const groqChatModels: Record<string, string>[] = [
 | 
					export const PROVIDER_INFO = {
 | 
				
			||||||
  {
 | 
					  key: 'groq',
 | 
				
			||||||
    displayName: 'Gemma2 9B IT',
 | 
					  displayName: 'Groq',
 | 
				
			||||||
    key: 'gemma2-9b-it',
 | 
					};
 | 
				
			||||||
  },
 | 
					
 | 
				
			||||||
  {
 | 
					import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
				
			||||||
    displayName: 'Llama 3.3 70B Versatile',
 | 
					 | 
				
			||||||
    key: 'llama-3.3-70b-versatile',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Llama 3.1 8B Instant',
 | 
					 | 
				
			||||||
    key: 'llama-3.1-8b-instant',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Llama3 70B 8192',
 | 
					 | 
				
			||||||
    key: 'llama3-70b-8192',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Llama3 8B 8192',
 | 
					 | 
				
			||||||
    key: 'llama3-8b-8192',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Mixtral 8x7B 32768',
 | 
					 | 
				
			||||||
    key: 'mixtral-8x7b-32768',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Qwen QWQ 32B (Preview)',
 | 
					 | 
				
			||||||
    key: 'qwen-qwq-32b',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Mistral Saba 24B (Preview)',
 | 
					 | 
				
			||||||
    key: 'mistral-saba-24b',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Qwen 2.5 Coder 32B (Preview)',
 | 
					 | 
				
			||||||
    key: 'qwen-2.5-coder-32b',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Qwen 2.5 32B (Preview)',
 | 
					 | 
				
			||||||
    key: 'qwen-2.5-32b',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'DeepSeek R1 Distill Qwen 32B (Preview)',
 | 
					 | 
				
			||||||
    key: 'deepseek-r1-distill-qwen-32b',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'DeepSeek R1 Distill Llama 70B (Preview)',
 | 
					 | 
				
			||||||
    key: 'deepseek-r1-distill-llama-70b',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Llama 3.3 70B SpecDec (Preview)',
 | 
					 | 
				
			||||||
    key: 'llama-3.3-70b-specdec',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Llama 3.2 1B Preview (Preview)',
 | 
					 | 
				
			||||||
    key: 'llama-3.2-1b-preview',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Llama 3.2 3B Preview (Preview)',
 | 
					 | 
				
			||||||
    key: 'llama-3.2-3b-preview',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Llama 3.2 11B Vision Preview (Preview)',
 | 
					 | 
				
			||||||
    key: 'llama-3.2-11b-vision-preview',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Llama 3.2 90B Vision Preview (Preview)',
 | 
					 | 
				
			||||||
    key: 'llama-3.2-90b-vision-preview',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const loadGroqChatModels = async () => {
 | 
					export const loadGroqChatModels = async () => {
 | 
				
			||||||
  const groqApiKey = getGroqApiKey();
 | 
					  const groqApiKey = getGroqApiKey();
 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (!groqApiKey) return {};
 | 
					  if (!groqApiKey) return {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  try {
 | 
					  try {
 | 
				
			||||||
 | 
					    const res = await fetch('https://api.groq.com/openai/v1/models', {
 | 
				
			||||||
 | 
					      method: 'GET',
 | 
				
			||||||
 | 
					      headers: {
 | 
				
			||||||
 | 
					        Authorization: `bearer ${groqApiKey}`,
 | 
				
			||||||
 | 
					        'Content-Type': 'application/json',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const groqChatModels = (await res.json()).data;
 | 
				
			||||||
    const chatModels: Record<string, ChatModel> = {};
 | 
					    const chatModels: Record<string, ChatModel> = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    groqChatModels.forEach((model) => {
 | 
					    groqChatModels.forEach((model: any) => {
 | 
				
			||||||
      chatModels[model.key] = {
 | 
					      chatModels[model.id] = {
 | 
				
			||||||
        displayName: model.displayName,
 | 
					        displayName: model.id,
 | 
				
			||||||
        model: new ChatOpenAI({
 | 
					        model: new ChatOpenAI({
 | 
				
			||||||
          openAIApiKey: groqApiKey,
 | 
					          apiKey: groqApiKey,
 | 
				
			||||||
          modelName: model.key,
 | 
					          modelName: model.id,
 | 
				
			||||||
          temperature: 0.7,
 | 
					          temperature: 0.7,
 | 
				
			||||||
          configuration: {
 | 
					          configuration: {
 | 
				
			||||||
            baseURL: 'https://api.groq.com/openai/v1',
 | 
					            baseURL: 'https://api.groq.com/openai/v1',
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
 | 
					          metadata: {
 | 
				
			||||||
 | 
					            'model-type': 'groq',
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
        }) as unknown as BaseChatModel,
 | 
					        }) as unknown as BaseChatModel,
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,18 +1,66 @@
 | 
				
			|||||||
import { Embeddings } from '@langchain/core/embeddings';
 | 
					import { Embeddings } from '@langchain/core/embeddings';
 | 
				
			||||||
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
					import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
				
			||||||
import { loadOpenAIChatModels, loadOpenAIEmbeddingModels } from './openai';
 | 
					import {
 | 
				
			||||||
 | 
					  loadOpenAIChatModels,
 | 
				
			||||||
 | 
					  loadOpenAIEmbeddingModels,
 | 
				
			||||||
 | 
					  PROVIDER_INFO as OpenAIInfo,
 | 
				
			||||||
 | 
					  PROVIDER_INFO,
 | 
				
			||||||
 | 
					} from './openai';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  getCustomOpenaiApiKey,
 | 
					  getCustomOpenaiApiKey,
 | 
				
			||||||
  getCustomOpenaiApiUrl,
 | 
					  getCustomOpenaiApiUrl,
 | 
				
			||||||
  getCustomOpenaiModelName,
 | 
					  getCustomOpenaiModelName,
 | 
				
			||||||
} from '../config';
 | 
					} from '../config';
 | 
				
			||||||
import { ChatOpenAI } from '@langchain/openai';
 | 
					import { ChatOpenAI } from '@langchain/openai';
 | 
				
			||||||
import { loadOllamaChatModels, loadOllamaEmbeddingModels } from './ollama';
 | 
					import {
 | 
				
			||||||
import { loadGroqChatModels } from './groq';
 | 
					  loadOllamaChatModels,
 | 
				
			||||||
import { loadAnthropicChatModels } from './anthropic';
 | 
					  loadOllamaEmbeddingModels,
 | 
				
			||||||
import { loadGeminiChatModels, loadGeminiEmbeddingModels } from './gemini';
 | 
					  PROVIDER_INFO as OllamaInfo,
 | 
				
			||||||
import { loadTransformersEmbeddingsModels } from './transformers';
 | 
					} from './ollama';
 | 
				
			||||||
import { loadDeepseekChatModels } from './deepseek';
 | 
					import { loadGroqChatModels, PROVIDER_INFO as GroqInfo } from './groq';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  loadAnthropicChatModels,
 | 
				
			||||||
 | 
					  PROVIDER_INFO as AnthropicInfo,
 | 
				
			||||||
 | 
					} from './anthropic';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  loadGeminiChatModels,
 | 
				
			||||||
 | 
					  loadGeminiEmbeddingModels,
 | 
				
			||||||
 | 
					  PROVIDER_INFO as GeminiInfo,
 | 
				
			||||||
 | 
					} from './gemini';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  loadTransformersEmbeddingsModels,
 | 
				
			||||||
 | 
					  PROVIDER_INFO as TransformersInfo,
 | 
				
			||||||
 | 
					} from './transformers';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  loadDeepseekChatModels,
 | 
				
			||||||
 | 
					  PROVIDER_INFO as DeepseekInfo,
 | 
				
			||||||
 | 
					} from './deepseek';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  loadAimlApiChatModels,
 | 
				
			||||||
 | 
					  loadAimlApiEmbeddingModels,
 | 
				
			||||||
 | 
					  PROVIDER_INFO as AimlApiInfo,
 | 
				
			||||||
 | 
					} from './aimlapi';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  loadLMStudioChatModels,
 | 
				
			||||||
 | 
					  loadLMStudioEmbeddingsModels,
 | 
				
			||||||
 | 
					  PROVIDER_INFO as LMStudioInfo,
 | 
				
			||||||
 | 
					} from './lmstudio';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const PROVIDER_METADATA = {
 | 
				
			||||||
 | 
					  openai: OpenAIInfo,
 | 
				
			||||||
 | 
					  ollama: OllamaInfo,
 | 
				
			||||||
 | 
					  groq: GroqInfo,
 | 
				
			||||||
 | 
					  anthropic: AnthropicInfo,
 | 
				
			||||||
 | 
					  gemini: GeminiInfo,
 | 
				
			||||||
 | 
					  transformers: TransformersInfo,
 | 
				
			||||||
 | 
					  deepseek: DeepseekInfo,
 | 
				
			||||||
 | 
					  aimlapi: AimlApiInfo,
 | 
				
			||||||
 | 
					  lmstudio: LMStudioInfo,
 | 
				
			||||||
 | 
					  custom_openai: {
 | 
				
			||||||
 | 
					    key: 'custom_openai',
 | 
				
			||||||
 | 
					    displayName: 'Custom OpenAI',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface ChatModel {
 | 
					export interface ChatModel {
 | 
				
			||||||
  displayName: string;
 | 
					  displayName: string;
 | 
				
			||||||
@@ -34,6 +82,8 @@ export const chatModelProviders: Record<
 | 
				
			|||||||
  anthropic: loadAnthropicChatModels,
 | 
					  anthropic: loadAnthropicChatModels,
 | 
				
			||||||
  gemini: loadGeminiChatModels,
 | 
					  gemini: loadGeminiChatModels,
 | 
				
			||||||
  deepseek: loadDeepseekChatModels,
 | 
					  deepseek: loadDeepseekChatModels,
 | 
				
			||||||
 | 
					  aimlapi: loadAimlApiChatModels,
 | 
				
			||||||
 | 
					  lmstudio: loadLMStudioChatModels,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const embeddingModelProviders: Record<
 | 
					export const embeddingModelProviders: Record<
 | 
				
			||||||
@@ -44,6 +94,8 @@ export const embeddingModelProviders: Record<
 | 
				
			|||||||
  ollama: loadOllamaEmbeddingModels,
 | 
					  ollama: loadOllamaEmbeddingModels,
 | 
				
			||||||
  gemini: loadGeminiEmbeddingModels,
 | 
					  gemini: loadGeminiEmbeddingModels,
 | 
				
			||||||
  transformers: loadTransformersEmbeddingsModels,
 | 
					  transformers: loadTransformersEmbeddingsModels,
 | 
				
			||||||
 | 
					  aimlapi: loadAimlApiEmbeddingModels,
 | 
				
			||||||
 | 
					  lmstudio: loadLMStudioEmbeddingsModels,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getAvailableChatModelProviders = async () => {
 | 
					export const getAvailableChatModelProviders = async () => {
 | 
				
			||||||
@@ -66,7 +118,7 @@ export const getAvailableChatModelProviders = async () => {
 | 
				
			|||||||
          [customOpenAiModelName]: {
 | 
					          [customOpenAiModelName]: {
 | 
				
			||||||
            displayName: customOpenAiModelName,
 | 
					            displayName: customOpenAiModelName,
 | 
				
			||||||
            model: new ChatOpenAI({
 | 
					            model: new ChatOpenAI({
 | 
				
			||||||
              openAIApiKey: customOpenAiApiKey,
 | 
					              apiKey: customOpenAiApiKey,
 | 
				
			||||||
              modelName: customOpenAiModelName,
 | 
					              modelName: customOpenAiModelName,
 | 
				
			||||||
              temperature: 0.7,
 | 
					              temperature: 0.7,
 | 
				
			||||||
              configuration: {
 | 
					              configuration: {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										100
									
								
								src/lib/providers/lmstudio.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,100 @@
 | 
				
			|||||||
 | 
					import { getKeepAlive, getLMStudioApiEndpoint } from '../config';
 | 
				
			||||||
 | 
					import axios from 'axios';
 | 
				
			||||||
 | 
					import { ChatModel, EmbeddingModel } from '.';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const PROVIDER_INFO = {
 | 
				
			||||||
 | 
					  key: 'lmstudio',
 | 
				
			||||||
 | 
					  displayName: 'LM Studio',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					import { ChatOpenAI } from '@langchain/openai';
 | 
				
			||||||
 | 
					import { OpenAIEmbeddings } from '@langchain/openai';
 | 
				
			||||||
 | 
					import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
				
			||||||
 | 
					import { Embeddings } from '@langchain/core/embeddings';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface LMStudioModel {
 | 
				
			||||||
 | 
					  id: string;
 | 
				
			||||||
 | 
					  name?: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ensureV1Endpoint = (endpoint: string): string =>
 | 
				
			||||||
 | 
					  endpoint.endsWith('/v1') ? endpoint : `${endpoint}/v1`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const checkServerAvailability = async (endpoint: string): Promise<boolean> => {
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    await axios.get(`${ensureV1Endpoint(endpoint)}/models`, {
 | 
				
			||||||
 | 
					      headers: { 'Content-Type': 'application/json' },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					  } catch {
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const loadLMStudioChatModels = async () => {
 | 
				
			||||||
 | 
					  const endpoint = getLMStudioApiEndpoint();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!endpoint) return {};
 | 
				
			||||||
 | 
					  if (!(await checkServerAvailability(endpoint))) return {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    const response = await axios.get(`${ensureV1Endpoint(endpoint)}/models`, {
 | 
				
			||||||
 | 
					      headers: { 'Content-Type': 'application/json' },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const chatModels: Record<string, ChatModel> = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    response.data.data.forEach((model: LMStudioModel) => {
 | 
				
			||||||
 | 
					      chatModels[model.id] = {
 | 
				
			||||||
 | 
					        displayName: model.name || model.id,
 | 
				
			||||||
 | 
					        model: new ChatOpenAI({
 | 
				
			||||||
 | 
					          apiKey: 'lm-studio',
 | 
				
			||||||
 | 
					          configuration: {
 | 
				
			||||||
 | 
					            baseURL: ensureV1Endpoint(endpoint),
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          modelName: model.id,
 | 
				
			||||||
 | 
					          temperature: 0.7,
 | 
				
			||||||
 | 
					          streaming: true,
 | 
				
			||||||
 | 
					          maxRetries: 3,
 | 
				
			||||||
 | 
					        }) as unknown as BaseChatModel,
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return chatModels;
 | 
				
			||||||
 | 
					  } catch (err) {
 | 
				
			||||||
 | 
					    console.error(`Error loading LM Studio models: ${err}`);
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const loadLMStudioEmbeddingsModels = async () => {
 | 
				
			||||||
 | 
					  const endpoint = getLMStudioApiEndpoint();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!endpoint) return {};
 | 
				
			||||||
 | 
					  if (!(await checkServerAvailability(endpoint))) return {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    const response = await axios.get(`${ensureV1Endpoint(endpoint)}/models`, {
 | 
				
			||||||
 | 
					      headers: { 'Content-Type': 'application/json' },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const embeddingsModels: Record<string, EmbeddingModel> = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    response.data.data.forEach((model: LMStudioModel) => {
 | 
				
			||||||
 | 
					      embeddingsModels[model.id] = {
 | 
				
			||||||
 | 
					        displayName: model.name || model.id,
 | 
				
			||||||
 | 
					        model: new OpenAIEmbeddings({
 | 
				
			||||||
 | 
					          apiKey: 'lm-studio',
 | 
				
			||||||
 | 
					          configuration: {
 | 
				
			||||||
 | 
					            baseURL: ensureV1Endpoint(endpoint),
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          modelName: model.id,
 | 
				
			||||||
 | 
					        }) as unknown as Embeddings,
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return embeddingsModels;
 | 
				
			||||||
 | 
					  } catch (err) {
 | 
				
			||||||
 | 
					    console.error(`Error loading LM Studio embeddings model: ${err}`);
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@@ -1,8 +1,13 @@
 | 
				
			|||||||
import axios from 'axios';
 | 
					import axios from 'axios';
 | 
				
			||||||
import { getKeepAlive, getOllamaApiEndpoint } from '../config';
 | 
					import { getKeepAlive, getOllamaApiEndpoint } from '../config';
 | 
				
			||||||
import { ChatModel, EmbeddingModel } from '.';
 | 
					import { ChatModel, EmbeddingModel } from '.';
 | 
				
			||||||
import { ChatOllama } from '@langchain/community/chat_models/ollama';
 | 
					
 | 
				
			||||||
import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama';
 | 
					export const PROVIDER_INFO = {
 | 
				
			||||||
 | 
					  key: 'ollama',
 | 
				
			||||||
 | 
					  displayName: 'Ollama',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					import { ChatOllama } from '@langchain/ollama';
 | 
				
			||||||
 | 
					import { OllamaEmbeddings } from '@langchain/ollama';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const loadOllamaChatModels = async () => {
 | 
					export const loadOllamaChatModels = async () => {
 | 
				
			||||||
  const ollamaApiEndpoint = getOllamaApiEndpoint();
 | 
					  const ollamaApiEndpoint = getOllamaApiEndpoint();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,11 @@
 | 
				
			|||||||
import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai';
 | 
					import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai';
 | 
				
			||||||
import { getOpenaiApiKey } from '../config';
 | 
					import { getOpenaiApiKey } from '../config';
 | 
				
			||||||
import { ChatModel, EmbeddingModel } from '.';
 | 
					import { ChatModel, EmbeddingModel } from '.';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const PROVIDER_INFO = {
 | 
				
			||||||
 | 
					  key: 'openai',
 | 
				
			||||||
 | 
					  displayName: 'OpenAI',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
					import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
				
			||||||
import { Embeddings } from '@langchain/core/embeddings';
 | 
					import { Embeddings } from '@langchain/core/embeddings';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -25,6 +30,18 @@ const openaiChatModels: Record<string, string>[] = [
 | 
				
			|||||||
    displayName: 'GPT-4 omni mini',
 | 
					    displayName: 'GPT-4 omni mini',
 | 
				
			||||||
    key: 'gpt-4o-mini',
 | 
					    key: 'gpt-4o-mini',
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    displayName: 'GPT 4.1 nano',
 | 
				
			||||||
 | 
					    key: 'gpt-4.1-nano',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    displayName: 'GPT 4.1 mini',
 | 
				
			||||||
 | 
					    key: 'gpt-4.1-mini',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    displayName: 'GPT 4.1',
 | 
				
			||||||
 | 
					    key: 'gpt-4.1',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const openaiEmbeddingModels: Record<string, string>[] = [
 | 
					const openaiEmbeddingModels: Record<string, string>[] = [
 | 
				
			||||||
@@ -50,7 +67,7 @@ export const loadOpenAIChatModels = async () => {
 | 
				
			|||||||
      chatModels[model.key] = {
 | 
					      chatModels[model.key] = {
 | 
				
			||||||
        displayName: model.displayName,
 | 
					        displayName: model.displayName,
 | 
				
			||||||
        model: new ChatOpenAI({
 | 
					        model: new ChatOpenAI({
 | 
				
			||||||
          openAIApiKey: openaiApiKey,
 | 
					          apiKey: openaiApiKey,
 | 
				
			||||||
          modelName: model.key,
 | 
					          modelName: model.key,
 | 
				
			||||||
          temperature: 0.7,
 | 
					          temperature: 0.7,
 | 
				
			||||||
        }) as unknown as BaseChatModel,
 | 
					        }) as unknown as BaseChatModel,
 | 
				
			||||||
@@ -76,7 +93,7 @@ export const loadOpenAIEmbeddingModels = async () => {
 | 
				
			|||||||
      embeddingModels[model.key] = {
 | 
					      embeddingModels[model.key] = {
 | 
				
			||||||
        displayName: model.displayName,
 | 
					        displayName: model.displayName,
 | 
				
			||||||
        model: new OpenAIEmbeddings({
 | 
					        model: new OpenAIEmbeddings({
 | 
				
			||||||
          openAIApiKey: openaiApiKey,
 | 
					          apiKey: openaiApiKey,
 | 
				
			||||||
          modelName: model.key,
 | 
					          modelName: model.key,
 | 
				
			||||||
        }) as unknown as Embeddings,
 | 
					        }) as unknown as Embeddings,
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,10 @@
 | 
				
			|||||||
import { HuggingFaceTransformersEmbeddings } from '../huggingfaceTransformer';
 | 
					import { HuggingFaceTransformersEmbeddings } from '../huggingfaceTransformer';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const PROVIDER_INFO = {
 | 
				
			||||||
 | 
					  key: 'transformers',
 | 
				
			||||||
 | 
					  displayName: 'Hugging Face',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const loadTransformersEmbeddingsModels = async () => {
 | 
					export const loadTransformersEmbeddingsModels = async () => {
 | 
				
			||||||
  try {
 | 
					  try {
 | 
				
			||||||
    const embeddingModels = {
 | 
					    const embeddingModels = {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,6 +24,7 @@ import computeSimilarity from '../utils/computeSimilarity';
 | 
				
			|||||||
import formatChatHistoryAsString from '../utils/formatHistory';
 | 
					import formatChatHistoryAsString from '../utils/formatHistory';
 | 
				
			||||||
import eventEmitter from 'events';
 | 
					import eventEmitter from 'events';
 | 
				
			||||||
import { StreamEvent } from '@langchain/core/tracers/log_stream';
 | 
					import { StreamEvent } from '@langchain/core/tracers/log_stream';
 | 
				
			||||||
 | 
					import { z } from 'zod';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface MetaSearchAgentType {
 | 
					export interface MetaSearchAgentType {
 | 
				
			||||||
  searchAndAnswer: (
 | 
					  searchAndAnswer: (
 | 
				
			||||||
@@ -52,6 +53,17 @@ type BasicChainInput = {
 | 
				
			|||||||
  query: string;
 | 
					  query: string;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const retrieverLLMOutputSchema = z.object({
 | 
				
			||||||
 | 
					  query: z.string().describe('The query to search the web for.'),
 | 
				
			||||||
 | 
					  links: z
 | 
				
			||||||
 | 
					    .array(z.string())
 | 
				
			||||||
 | 
					    .describe('The links to search/summarize if present'),
 | 
				
			||||||
 | 
					  searchRequired: z
 | 
				
			||||||
 | 
					    .boolean()
 | 
				
			||||||
 | 
					    .describe('Wether there is a need to search the web'),
 | 
				
			||||||
 | 
					  searchMode: z.enum(['', 'normal', 'news']).describe('The search mode.'),
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class MetaSearchAgent implements MetaSearchAgentType {
 | 
					class MetaSearchAgent implements MetaSearchAgentType {
 | 
				
			||||||
  private config: Config;
 | 
					  private config: Config;
 | 
				
			||||||
  private strParser = new StringOutputParser();
 | 
					  private strParser = new StringOutputParser();
 | 
				
			||||||
@@ -62,73 +74,71 @@ class MetaSearchAgent implements MetaSearchAgentType {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  private async createSearchRetrieverChain(llm: BaseChatModel) {
 | 
					  private async createSearchRetrieverChain(llm: BaseChatModel) {
 | 
				
			||||||
    (llm as unknown as ChatOpenAI).temperature = 0;
 | 
					    (llm as unknown as ChatOpenAI).temperature = 0;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    return RunnableSequence.from([
 | 
					    return RunnableSequence.from([
 | 
				
			||||||
      PromptTemplate.fromTemplate(this.config.queryGeneratorPrompt),
 | 
					      PromptTemplate.fromTemplate(this.config.queryGeneratorPrompt),
 | 
				
			||||||
      llm,
 | 
					      Object.assign(
 | 
				
			||||||
      this.strParser,
 | 
					        Object.create(Object.getPrototypeOf(llm)),
 | 
				
			||||||
      RunnableLambda.from(async (input: string) => {
 | 
					        llm,
 | 
				
			||||||
        const linksOutputParser = new LineListOutputParser({
 | 
					      ).withStructuredOutput(retrieverLLMOutputSchema, {
 | 
				
			||||||
          key: 'links',
 | 
					        ...(llm.metadata?.['model-type'] === 'groq'
 | 
				
			||||||
        });
 | 
					          ? {
 | 
				
			||||||
 | 
					              method: 'json-object',
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          : {}),
 | 
				
			||||||
 | 
					      }),
 | 
				
			||||||
 | 
					      RunnableLambda.from(
 | 
				
			||||||
 | 
					        async (input: z.infer<typeof retrieverLLMOutputSchema>) => {
 | 
				
			||||||
 | 
					          let question = input.query;
 | 
				
			||||||
 | 
					          const links = input.links;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const questionOutputParser = new LineOutputParser({
 | 
					          if (!input.searchRequired) {
 | 
				
			||||||
          key: 'question',
 | 
					            return { query: '', docs: [] };
 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        const links = await linksOutputParser.parse(input);
 | 
					 | 
				
			||||||
        let question = this.config.summarizer
 | 
					 | 
				
			||||||
          ? await questionOutputParser.parse(input)
 | 
					 | 
				
			||||||
          : input;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (question === 'not_needed') {
 | 
					 | 
				
			||||||
          return { query: '', docs: [] };
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (links.length > 0) {
 | 
					 | 
				
			||||||
          if (question.length === 0) {
 | 
					 | 
				
			||||||
            question = 'summarize';
 | 
					 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          let docs: Document[] = [];
 | 
					          if (links.length > 0) {
 | 
				
			||||||
 | 
					            if (question.length === 0) {
 | 
				
			||||||
          const linkDocs = await getDocumentsFromLinks({ links });
 | 
					              question = 'summarize';
 | 
				
			||||||
 | 
					 | 
				
			||||||
          const docGroups: Document[] = [];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          linkDocs.map((doc) => {
 | 
					 | 
				
			||||||
            const URLDocExists = docGroups.find(
 | 
					 | 
				
			||||||
              (d) =>
 | 
					 | 
				
			||||||
                d.metadata.url === doc.metadata.url &&
 | 
					 | 
				
			||||||
                d.metadata.totalDocs < 10,
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (!URLDocExists) {
 | 
					 | 
				
			||||||
              docGroups.push({
 | 
					 | 
				
			||||||
                ...doc,
 | 
					 | 
				
			||||||
                metadata: {
 | 
					 | 
				
			||||||
                  ...doc.metadata,
 | 
					 | 
				
			||||||
                  totalDocs: 1,
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
              });
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            const docIndex = docGroups.findIndex(
 | 
					            let docs: Document[] = [];
 | 
				
			||||||
              (d) =>
 | 
					 | 
				
			||||||
                d.metadata.url === doc.metadata.url &&
 | 
					 | 
				
			||||||
                d.metadata.totalDocs < 10,
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (docIndex !== -1) {
 | 
					            const linkDocs = await getDocumentsFromLinks({ links });
 | 
				
			||||||
              docGroups[docIndex].pageContent =
 | 
					 | 
				
			||||||
                docGroups[docIndex].pageContent + `\n\n` + doc.pageContent;
 | 
					 | 
				
			||||||
              docGroups[docIndex].metadata.totalDocs += 1;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          });
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
          await Promise.all(
 | 
					            const docGroups: Document[] = [];
 | 
				
			||||||
            docGroups.map(async (doc) => {
 | 
					
 | 
				
			||||||
              const res = await llm.invoke(`
 | 
					            linkDocs.map((doc) => {
 | 
				
			||||||
 | 
					              const URLDocExists = docGroups.find(
 | 
				
			||||||
 | 
					                (d) =>
 | 
				
			||||||
 | 
					                  d.metadata.url === doc.metadata.url &&
 | 
				
			||||||
 | 
					                  d.metadata.totalDocs < 10,
 | 
				
			||||||
 | 
					              );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              if (!URLDocExists) {
 | 
				
			||||||
 | 
					                docGroups.push({
 | 
				
			||||||
 | 
					                  ...doc,
 | 
				
			||||||
 | 
					                  metadata: {
 | 
				
			||||||
 | 
					                    ...doc.metadata,
 | 
				
			||||||
 | 
					                    totalDocs: 1,
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              const docIndex = docGroups.findIndex(
 | 
				
			||||||
 | 
					                (d) =>
 | 
				
			||||||
 | 
					                  d.metadata.url === doc.metadata.url &&
 | 
				
			||||||
 | 
					                  d.metadata.totalDocs < 10,
 | 
				
			||||||
 | 
					              );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              if (docIndex !== -1) {
 | 
				
			||||||
 | 
					                docGroups[docIndex].pageContent =
 | 
				
			||||||
 | 
					                  docGroups[docIndex].pageContent + `\n\n` + doc.pageContent;
 | 
				
			||||||
 | 
					                docGroups[docIndex].metadata.totalDocs += 1;
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            await Promise.all(
 | 
				
			||||||
 | 
					              docGroups.map(async (doc) => {
 | 
				
			||||||
 | 
					                const res = await llm.invoke(`
 | 
				
			||||||
            You are a web search summarizer, tasked with summarizing a piece of text retrieved from a web search. Your job is to summarize the 
 | 
					            You are a web search summarizer, tasked with summarizing a piece of text retrieved from a web search. Your job is to summarize the 
 | 
				
			||||||
            text into a detailed, 2-4 paragraph explanation that captures the main ideas and provides a comprehensive answer to the query.
 | 
					            text into a detailed, 2-4 paragraph explanation that captures the main ideas and provides a comprehensive answer to the query.
 | 
				
			||||||
            If the query is \"summarize\", you should provide a detailed summary of the text. If the query is a specific question, you should answer it in the summary.
 | 
					            If the query is \"summarize\", you should provide a detailed summary of the text. If the query is a specific question, you should answer it in the summary.
 | 
				
			||||||
@@ -189,46 +199,50 @@ class MetaSearchAgent implements MetaSearchAgentType {
 | 
				
			|||||||
            Make sure to answer the query in the summary.
 | 
					            Make sure to answer the query in the summary.
 | 
				
			||||||
          `);
 | 
					          `);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
              const document = new Document({
 | 
					                const document = new Document({
 | 
				
			||||||
                pageContent: res.content as string,
 | 
					                  pageContent: res.content as string,
 | 
				
			||||||
                metadata: {
 | 
					                  metadata: {
 | 
				
			||||||
                  title: doc.metadata.title,
 | 
					                    title: doc.metadata.title,
 | 
				
			||||||
                  url: doc.metadata.url,
 | 
					                    url: doc.metadata.url,
 | 
				
			||||||
                },
 | 
					                  },
 | 
				
			||||||
              });
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
              docs.push(document);
 | 
					                docs.push(document);
 | 
				
			||||||
            }),
 | 
					 | 
				
			||||||
          );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          return { query: question, docs: docs };
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
          question = question.replace(/<think>.*?<\/think>/g, '');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          const res = await searchSearxng(question, {
 | 
					 | 
				
			||||||
            language: 'en',
 | 
					 | 
				
			||||||
            engines: this.config.activeEngines,
 | 
					 | 
				
			||||||
          });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          const documents = res.results.map(
 | 
					 | 
				
			||||||
            (result) =>
 | 
					 | 
				
			||||||
              new Document({
 | 
					 | 
				
			||||||
                pageContent:
 | 
					 | 
				
			||||||
                  result.content ||
 | 
					 | 
				
			||||||
                  (this.config.activeEngines.includes('youtube')
 | 
					 | 
				
			||||||
                    ? result.title
 | 
					 | 
				
			||||||
                    : '') /* Todo: Implement transcript grabbing using Youtubei (source: https://www.npmjs.com/package/youtubei) */,
 | 
					 | 
				
			||||||
                metadata: {
 | 
					 | 
				
			||||||
                  title: result.title,
 | 
					 | 
				
			||||||
                  url: result.url,
 | 
					 | 
				
			||||||
                  ...(result.img_src && { img_src: result.img_src }),
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
              }),
 | 
					              }),
 | 
				
			||||||
          );
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          return { query: question, docs: documents };
 | 
					            return { query: question, docs: docs };
 | 
				
			||||||
        }
 | 
					          } else {
 | 
				
			||||||
      }),
 | 
					            question = question.replace(/<think>.*?<\/think>/g, '');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            const res = await searchSearxng(question, {
 | 
				
			||||||
 | 
					              language: 'en',
 | 
				
			||||||
 | 
					              engines:
 | 
				
			||||||
 | 
					                input.searchMode === 'normal'
 | 
				
			||||||
 | 
					                  ? this.config.activeEngines
 | 
				
			||||||
 | 
					                  : ['bing news'],
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            const documents = res.results.map(
 | 
				
			||||||
 | 
					              (result) =>
 | 
				
			||||||
 | 
					                new Document({
 | 
				
			||||||
 | 
					                  pageContent:
 | 
				
			||||||
 | 
					                    result.content ||
 | 
				
			||||||
 | 
					                    (this.config.activeEngines.includes('youtube')
 | 
				
			||||||
 | 
					                      ? result.title
 | 
				
			||||||
 | 
					                      : '') /* Todo: Implement transcript grabbing using Youtubei (source: https://www.npmjs.com/package/youtubei) */,
 | 
				
			||||||
 | 
					                  metadata: {
 | 
				
			||||||
 | 
					                    title: result.title,
 | 
				
			||||||
 | 
					                    url: result.url,
 | 
				
			||||||
 | 
					                    ...(result.img_src && { img_src: result.img_src }),
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                }),
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return { query: question, docs: documents };
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
    ]);
 | 
					    ]);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -64,7 +64,7 @@ export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => {
 | 
				
			|||||||
        const splittedText = await splitter.splitText(parsedText);
 | 
					        const splittedText = await splitter.splitText(parsedText);
 | 
				
			||||||
        const title = res.data
 | 
					        const title = res.data
 | 
				
			||||||
          .toString('utf8')
 | 
					          .toString('utf8')
 | 
				
			||||||
          .match(/<title>(.*?)<\/title>/)?.[1];
 | 
					          .match(/<title.*>(.*?)<\/title>/)?.[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const linkDocs = splittedText.map((text) => {
 | 
					        const linkDocs = splittedText.map((text) => {
 | 
				
			||||||
          return new Document({
 | 
					          return new Document({
 | 
				
			||||||
 
 | 
				
			|||||||