Compare commits
11 Commits
master
...
7f287c45a6
Author | SHA1 | Date | |
---|---|---|---|
|
7f287c45a6 | ||
|
9f4ae1baac | ||
|
79f26fce25 | ||
|
7fa0e9dd9d | ||
|
765c8e549c | ||
|
2ac1cb3943 | ||
|
ce97671da3 | ||
|
66d44c0774 | ||
|
6bcee39e63 | ||
|
fde5b5e318 | ||
|
372943801d |
11
.env.example
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
PORT=3000
|
||||||
|
NODE_ENV=development
|
||||||
|
SUPABASE_URL=your_supabase_url
|
||||||
|
SUPABASE_KEY=your_supabase_key
|
||||||
|
OLLAMA_URL=http://localhost:11434
|
||||||
|
OLLAMA_MODEL=llama2
|
||||||
|
SEARXNG_URL=http://localhost:4000
|
||||||
|
SEARXNG_INSTANCES=["http://localhost:4000"]
|
||||||
|
MAX_RESULTS_PER_QUERY=50
|
||||||
|
CACHE_DURATION_HOURS=24
|
||||||
|
CACHE_DURATION_DAYS=7
|
29
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
name: CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: '18'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: npm test
|
||||||
|
|
||||||
|
- name: Run type check
|
||||||
|
run: npm run build
|
127
.github/workflows/docker-build.yaml
vendored
@@ -8,12 +8,18 @@ on:
|
|||||||
types: [published]
|
types: [published]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-amd64:
|
build-and-push:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
service: [backend, app]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v2
|
uses: docker/setup-buildx-action@v2
|
||||||
with:
|
with:
|
||||||
@@ -30,109 +36,38 @@ jobs:
|
|||||||
id: version
|
id: version
|
||||||
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
|
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Build and push AMD64 Docker image
|
- name: Build and push Docker image for ${{ matrix.service }}
|
||||||
if: github.ref == 'refs/heads/master' && github.event_name == 'push'
|
if: github.ref == 'refs/heads/master' && github.event_name == 'push'
|
||||||
run: |
|
run: |
|
||||||
DOCKERFILE=app.dockerfile
|
docker buildx create --use
|
||||||
IMAGE_NAME=perplexica
|
if [[ "${{ matrix.service }}" == "backend" ]]; then \
|
||||||
docker buildx build --platform linux/amd64 \
|
DOCKERFILE=backend.dockerfile; \
|
||||||
--cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:amd64 \
|
IMAGE_NAME=perplexica-backend; \
|
||||||
|
else \
|
||||||
|
DOCKERFILE=app.dockerfile; \
|
||||||
|
IMAGE_NAME=perplexica-frontend; \
|
||||||
|
fi
|
||||||
|
docker buildx build --platform linux/amd64,linux/arm64 \
|
||||||
|
--cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:main \
|
||||||
--cache-to=type=inline \
|
--cache-to=type=inline \
|
||||||
--provenance false \
|
|
||||||
-f $DOCKERFILE \
|
-f $DOCKERFILE \
|
||||||
-t itzcrazykns1337/${IMAGE_NAME}:amd64 \
|
-t itzcrazykns1337/${IMAGE_NAME}:main \
|
||||||
--push .
|
--push .
|
||||||
|
|
||||||
- name: Build and push AMD64 release Docker image
|
- name: Build and push release Docker image for ${{ matrix.service }}
|
||||||
if: github.event_name == 'release'
|
if: github.event_name == 'release'
|
||||||
run: |
|
run: |
|
||||||
DOCKERFILE=app.dockerfile
|
docker buildx create --use
|
||||||
IMAGE_NAME=perplexica
|
if [[ "${{ matrix.service }}" == "backend" ]]; then \
|
||||||
docker buildx build --platform linux/amd64 \
|
DOCKERFILE=backend.dockerfile; \
|
||||||
--cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-amd64 \
|
IMAGE_NAME=perplexica-backend; \
|
||||||
|
else \
|
||||||
|
DOCKERFILE=app.dockerfile; \
|
||||||
|
IMAGE_NAME=perplexica-frontend; \
|
||||||
|
fi
|
||||||
|
docker buildx build --platform linux/amd64,linux/arm64 \
|
||||||
|
--cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }} \
|
||||||
--cache-to=type=inline \
|
--cache-to=type=inline \
|
||||||
--provenance false \
|
|
||||||
-f $DOCKERFILE \
|
-f $DOCKERFILE \
|
||||||
-t itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-amd64 \
|
-t itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }} \
|
||||||
--push .
|
--push .
|
||||||
|
|
||||||
build-arm64:
|
|
||||||
runs-on: ubuntu-24.04-arm
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
with:
|
|
||||||
install: true
|
|
||||||
|
|
||||||
- name: Log in to DockerHub
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Extract version from release tag
|
|
||||||
if: github.event_name == 'release'
|
|
||||||
id: version
|
|
||||||
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Build and push ARM64 Docker image
|
|
||||||
if: github.ref == 'refs/heads/master' && github.event_name == 'push'
|
|
||||||
run: |
|
|
||||||
DOCKERFILE=app.dockerfile
|
|
||||||
IMAGE_NAME=perplexica
|
|
||||||
docker buildx build --platform linux/arm64 \
|
|
||||||
--cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:arm64 \
|
|
||||||
--cache-to=type=inline \
|
|
||||||
--provenance false \
|
|
||||||
-f $DOCKERFILE \
|
|
||||||
-t itzcrazykns1337/${IMAGE_NAME}:arm64 \
|
|
||||||
--push .
|
|
||||||
|
|
||||||
- name: Build and push ARM64 release Docker image
|
|
||||||
if: github.event_name == 'release'
|
|
||||||
run: |
|
|
||||||
DOCKERFILE=app.dockerfile
|
|
||||||
IMAGE_NAME=perplexica
|
|
||||||
docker buildx build --platform linux/arm64 \
|
|
||||||
--cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-arm64 \
|
|
||||||
--cache-to=type=inline \
|
|
||||||
--provenance false \
|
|
||||||
-f $DOCKERFILE \
|
|
||||||
-t itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-arm64 \
|
|
||||||
--push .
|
|
||||||
|
|
||||||
manifest:
|
|
||||||
needs: [build-amd64, build-arm64]
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Log in to DockerHub
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Extract version from release tag
|
|
||||||
if: github.event_name == 'release'
|
|
||||||
id: version
|
|
||||||
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Create and push multi-arch manifest for main
|
|
||||||
if: github.ref == 'refs/heads/master' && github.event_name == 'push'
|
|
||||||
run: |
|
|
||||||
IMAGE_NAME=perplexica
|
|
||||||
docker manifest create itzcrazykns1337/${IMAGE_NAME}:main \
|
|
||||||
--amend itzcrazykns1337/${IMAGE_NAME}:amd64 \
|
|
||||||
--amend itzcrazykns1337/${IMAGE_NAME}:arm64
|
|
||||||
docker manifest push itzcrazykns1337/${IMAGE_NAME}:main
|
|
||||||
|
|
||||||
- name: Create and push multi-arch manifest for releases
|
|
||||||
if: github.event_name == 'release'
|
|
||||||
run: |
|
|
||||||
IMAGE_NAME=perplexica
|
|
||||||
docker manifest create itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }} \
|
|
||||||
--amend itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-amd64 \
|
|
||||||
--amend itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-arm64
|
|
||||||
docker manifest push itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}
|
|
||||||
|
53
.gitignore
vendored
@@ -1,41 +1,32 @@
|
|||||||
# Node.js
|
|
||||||
node_modules/
|
|
||||||
npm-debug.log
|
|
||||||
yarn-error.log
|
|
||||||
|
|
||||||
# Build output
|
|
||||||
.next/
|
|
||||||
out/
|
|
||||||
dist/
|
|
||||||
|
|
||||||
# IDE/Editor specific
|
|
||||||
.vscode/
|
|
||||||
.idea/
|
|
||||||
*.iml
|
|
||||||
|
|
||||||
# Environment variables
|
# Environment variables
|
||||||
.env
|
.env
|
||||||
.env.local
|
.env.*
|
||||||
.env.development.local
|
!.env.example
|
||||||
.env.test.local
|
|
||||||
.env.production.local
|
|
||||||
|
|
||||||
# Config files
|
# Dependencies
|
||||||
config.toml
|
node_modules/
|
||||||
|
yarn-error.log
|
||||||
|
npm-debug.log
|
||||||
|
|
||||||
# Log files
|
# Build outputs
|
||||||
logs/
|
dist/
|
||||||
*.log
|
build/
|
||||||
|
.next/
|
||||||
|
|
||||||
# Testing
|
# IDE/Editor
|
||||||
/coverage/
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
|
||||||
# Miscellaneous
|
# OS
|
||||||
.DS_Store
|
.DS_Store
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
|
||||||
# Db
|
# Logs
|
||||||
db.sqlite
|
logs/
|
||||||
/searxng
|
*.log
|
||||||
|
|
||||||
certificates
|
# Cache
|
||||||
|
.cache/
|
||||||
|
.npm/
|
||||||
|
@@ -6,6 +6,7 @@ const config = {
|
|||||||
endOfLine: 'auto',
|
endOfLine: 'auto',
|
||||||
singleQuote: true,
|
singleQuote: true,
|
||||||
tabWidth: 2,
|
tabWidth: 2,
|
||||||
|
semi: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = config;
|
module.exports = config;
|
||||||
|
@@ -1,43 +1,32 @@
|
|||||||
# How to Contribute to Perplexica
|
# How to Contribute to Perplexica
|
||||||
|
|
||||||
Thanks for your interest in contributing to Perplexica! Your help makes this project better. This guide explains how to contribute effectively.
|
Hey there, thanks for deciding to contribute to Perplexica. Anything you help with will support the development of Perplexica and will make it better. Let's walk you through the key aspects to ensure your contributions are effective and in harmony with the project's setup.
|
||||||
|
|
||||||
Perplexica is a modern AI chat application with advanced search capabilities.
|
|
||||||
|
|
||||||
## Project Structure
|
## Project Structure
|
||||||
|
|
||||||
Perplexica's codebase is organized as follows:
|
Perplexica's design consists of two main domains:
|
||||||
|
|
||||||
- **UI Components and Pages**:
|
- **Frontend (`ui` directory)**: This is a Next.js application holding all user interface components. It's a self-contained environment that manages everything the user interacts with.
|
||||||
- **Components (`src/components`)**: Reusable UI components.
|
- **Backend (root and `src` directory)**: The backend logic is situated in the `src` folder, but the root directory holds the main `package.json` for backend dependency management.
|
||||||
- **Pages and Routes (`src/app`)**: Next.js app directory structure with page components.
|
- All of the focus modes are created using the Meta Search Agent class present in `src/search/metaSearchAgent.ts`. The main logic behind Perplexica lies there.
|
||||||
- Main app routes include: home (`/`), chat (`/c`), discover (`/discover`), library (`/library`), and settings (`/settings`).
|
|
||||||
- **API Routes (`src/app/api`)**: API endpoints implemented with Next.js API routes.
|
|
||||||
- `/api/chat`: Handles chat interactions.
|
|
||||||
- `/api/search`: Provides direct access to Perplexica's search capabilities.
|
|
||||||
- Other endpoints for models, files, and suggestions.
|
|
||||||
- **Backend Logic (`src/lib`)**: Contains all the backend functionality including search, database, and API logic.
|
|
||||||
- The search functionality is present inside `src/lib/search` directory.
|
|
||||||
- All of the focus modes are implemented using the Meta Search Agent class in `src/lib/search/metaSearchAgent.ts`.
|
|
||||||
- Database functionality is in `src/lib/db`.
|
|
||||||
- Chat model and embedding model providers are managed in `src/lib/providers`.
|
|
||||||
- Prompt templates and LLM chain definitions are in `src/lib/prompts` and `src/lib/chains` respectively.
|
|
||||||
|
|
||||||
## API Documentation
|
|
||||||
|
|
||||||
Perplexica exposes several API endpoints for programmatic access, including:
|
|
||||||
|
|
||||||
- **Search API**: Access Perplexica's advanced search capabilities directly via the `/api/search` endpoint. For detailed documentation, see `docs/api/search.md`.
|
|
||||||
|
|
||||||
## Setting Up Your Environment
|
## Setting Up Your Environment
|
||||||
|
|
||||||
Before diving into coding, setting up your local environment is key. Here's what you need to do:
|
Before diving into coding, setting up your local environment is key. Here's what you need to do:
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
|
||||||
1. In the root directory, locate the `sample.config.toml` file.
|
1. In the root directory, locate the `sample.config.toml` file.
|
||||||
2. Rename it to `config.toml` and fill in the necessary configuration fields.
|
2. Rename it to `config.toml` and fill in the necessary configuration fields specific to the backend.
|
||||||
3. Run `npm install` to install all dependencies.
|
3. Run `npm install` to install dependencies.
|
||||||
4. Run `npm run db:push` to set up the local sqlite database.
|
4. Run `npm run db:push` to set up the local sqlite.
|
||||||
5. Use `npm run dev` to start the application in development mode.
|
5. Use `npm run dev` to start the backend in development mode.
|
||||||
|
|
||||||
|
### Frontend
|
||||||
|
|
||||||
|
1. Navigate to the `ui` folder and repeat the process of renaming `.env.example` to `.env`, making sure to provide the frontend-specific variables.
|
||||||
|
2. Execute `npm install` within the `ui` directory to get the frontend dependencies ready.
|
||||||
|
3. Launch the frontend development server with `npm run dev`.
|
||||||
|
|
||||||
**Please note**: Docker configurations are present for setting up production environments, whereas `npm run dev` is used for development purposes.
|
**Please note**: Docker configurations are present for setting up production environments, whereas `npm run dev` is used for development purposes.
|
||||||
|
|
||||||
|
258
README.md
@@ -1,208 +1,120 @@
|
|||||||
# 🚀 Perplexica - An AI-powered search engine 🔎 <!-- omit in toc -->
|
# BizSearch
|
||||||
|
|
||||||
<div align="center" markdown="1">
|
A tool for finding and analyzing local businesses using AI-powered data extraction.
|
||||||
<sup>Special thanks to:</sup>
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
<a href="https://www.warp.dev/perplexica">
|
|
||||||
<img alt="Warp sponsorship" width="400" src="https://github.com/user-attachments/assets/775dd593-9b5f-40f1-bf48-479faff4c27b">
|
|
||||||
</a>
|
|
||||||
|
|
||||||
### [Warp, the AI Devtool that lives in your terminal](https://www.warp.dev/perplexica)
|
## Prerequisites
|
||||||
|
|
||||||
[Available for MacOS, Linux, & Windows](https://www.warp.dev/perplexica)
|
- Node.js 16+
|
||||||
|
- Ollama (for local LLM)
|
||||||
</div>
|
- SearxNG instance
|
||||||
|
|
||||||
<hr/>
|
|
||||||
|
|
||||||
[](https://discord.gg/26aArMy8tT)
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Table of Contents <!-- omit in toc -->
|
|
||||||
|
|
||||||
- [Overview](#overview)
|
|
||||||
- [Preview](#preview)
|
|
||||||
- [Features](#features)
|
|
||||||
- [Installation](#installation)
|
|
||||||
- [Getting Started with Docker (Recommended)](#getting-started-with-docker-recommended)
|
|
||||||
- [Non-Docker Installation](#non-docker-installation)
|
|
||||||
- [Ollama Connection Errors](#ollama-connection-errors)
|
|
||||||
- [Using as a Search Engine](#using-as-a-search-engine)
|
|
||||||
- [Using Perplexica's API](#using-perplexicas-api)
|
|
||||||
- [Expose Perplexica to a network](#expose-perplexica-to-network)
|
|
||||||
- [One-Click Deployment](#one-click-deployment)
|
|
||||||
- [Upcoming Features](#upcoming-features)
|
|
||||||
- [Support Us](#support-us)
|
|
||||||
- [Donations](#donations)
|
|
||||||
- [Contribution](#contribution)
|
|
||||||
- [Help and Support](#help-and-support)
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
Perplexica is an open-source AI-powered searching tool or an AI-powered search engine that goes deep into the internet to find answers. Inspired by Perplexity AI, it's an open-source option that not just searches the web but understands your questions. It uses advanced machine learning algorithms like similarity searching and embeddings to refine results and provides clear answers with sources cited.
|
|
||||||
|
|
||||||
Using SearxNG to stay current and fully open source, Perplexica ensures you always get the most up-to-date information without compromising your privacy.
|
|
||||||
|
|
||||||
Want to know more about its architecture and how it works? You can read it [here](https://github.com/ItzCrazyKns/Perplexica/tree/master/docs/architecture/README.md).
|
|
||||||
|
|
||||||
## Preview
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
- **Local LLMs**: You can utilize local LLMs such as Qwen, DeepSeek, Llama, and Mistral.
|
|
||||||
- **Two Main Modes:**
|
|
||||||
- **Copilot Mode:** (In development) Boosts search by generating different queries to find more relevant internet sources. Like normal search instead of just using the context by SearxNG, it visits the top matches and tries to find relevant sources to the user's query directly from the page.
|
|
||||||
- **Normal Mode:** Processes your query and performs a web search.
|
|
||||||
- **Focus Modes:** Special modes to better answer specific types of questions. Perplexica currently has 6 focus modes:
|
|
||||||
- **All Mode:** Searches the entire web to find the best results.
|
|
||||||
- **Writing Assistant Mode:** Helpful for writing tasks that do not require searching the web.
|
|
||||||
- **Academic Search Mode:** Finds articles and papers, ideal for academic research.
|
|
||||||
- **YouTube Search Mode:** Finds YouTube videos based on the search query.
|
|
||||||
- **Wolfram Alpha Search Mode:** Answers queries that need calculations or data analysis using Wolfram Alpha.
|
|
||||||
- **Reddit Search Mode:** Searches Reddit for discussions and opinions related to the query.
|
|
||||||
- **Current Information:** Some search tools might give you outdated info because they use data from crawling bots and convert them into embeddings and store them in a index. Unlike them, Perplexica uses SearxNG, a metasearch engine to get the results and rerank and get the most relevant source out of it, ensuring you always get the latest information without the overhead of daily data updates.
|
|
||||||
- **API**: Integrate Perplexica into your existing applications and make use of its capibilities.
|
|
||||||
|
|
||||||
It has many more features like image and video search. Some of the planned features are mentioned in [upcoming features](#upcoming-features).
|
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
There are mainly 2 ways of installing Perplexica - With Docker, Without Docker. Using Docker is highly recommended.
|
1. Install Ollama:
|
||||||
|
|
||||||
### Getting Started with Docker (Recommended)
|
|
||||||
|
|
||||||
1. Ensure Docker is installed and running on your system.
|
|
||||||
2. Clone the Perplexica repository:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/ItzCrazyKns/Perplexica.git
|
# On macOS
|
||||||
|
brew install ollama
|
||||||
```
|
```
|
||||||
|
|
||||||
3. After cloning, navigate to the directory containing the project files.
|
2. Start Ollama:
|
||||||
|
|
||||||
4. Rename the `sample.config.toml` file to `config.toml`. For Docker setups, you need only fill in the following fields:
|
|
||||||
|
|
||||||
- `OPENAI`: Your OpenAI API key. **You only need to fill this if you wish to use OpenAI's models**.
|
|
||||||
- `CUSTOM_OPENAI`: Your OpenAI-API-compliant local server URL, model name, and API key. You should run your local server with host set to `0.0.0.0`, take note of which port number it is running on, and then use that port number to set `API_URL = http://host.docker.internal:PORT_NUMBER`. You must specify the model name, such as `MODEL_NAME = "unsloth/DeepSeek-R1-0528-Qwen3-8B-GGUF:Q4_K_XL"`. Finally, set `API_KEY` to the appropriate value. If you have not defined an API key, just put anything you want in-between the quotation marks: `API_KEY = "whatever-you-want-but-not-blank"` **You only need to configure these settings if you want to use a local OpenAI-compliant server, such as Llama.cpp's [`llama-server`](https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md)**.
|
|
||||||
- `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**.
|
|
||||||
- `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.
|
|
||||||
|
|
||||||
- `SIMILARITY_MEASURE`: The similarity measure to use (This is filled by default; you can leave it as is if you are unsure about it.)
|
|
||||||
|
|
||||||
5. Ensure you are in the directory containing the `docker-compose.yaml` file and execute:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker compose up -d
|
# Start and enable on login
|
||||||
|
brew services start ollama
|
||||||
|
|
||||||
|
# Or run without auto-start
|
||||||
|
/usr/local/opt/ollama/bin/ollama serve
|
||||||
```
|
```
|
||||||
|
|
||||||
6. Wait a few minutes for the setup to complete. You can access Perplexica at http://localhost:3000 in your web browser.
|
3. Pull the required model:
|
||||||
|
```bash
|
||||||
|
ollama pull mistral
|
||||||
|
```
|
||||||
|
|
||||||
**Note**: After the containers are built, you can start Perplexica directly from Docker without having to open a terminal.
|
4. Clone and set up the project:
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/yourusername/bizsearch.git
|
||||||
|
cd bizsearch
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
### Non-Docker Installation
|
5. Configure environment:
|
||||||
|
```bash
|
||||||
|
cp .env.example .env
|
||||||
|
# Edit .env with your settings
|
||||||
|
```
|
||||||
|
|
||||||
1. Install SearXNG and allow `JSON` format in the SearXNG settings.
|
6. Start the application:
|
||||||
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.
|
```bash
|
||||||
3. After populating the configuration run `npm i`.
|
npm run dev
|
||||||
4. Install the dependencies and then execute `npm run build`.
|
```
|
||||||
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.
|
7. Open http://localhost:3000 in your browser
|
||||||
|
|
||||||
See the [installation documentation](https://github.com/ItzCrazyKns/Perplexica/tree/master/docs/installation) for more information like updating, etc.
|
## Troubleshooting
|
||||||
|
|
||||||
### Troubleshooting
|
If Ollama fails to start:
|
||||||
|
```bash
|
||||||
|
# Stop any existing instance
|
||||||
|
brew services stop ollama
|
||||||
|
# Wait a few seconds
|
||||||
|
sleep 5
|
||||||
|
# Start again
|
||||||
|
brew services start ollama
|
||||||
|
```
|
||||||
|
|
||||||
#### Local OpenAI-API-Compliant Servers
|
To verify Ollama is running:
|
||||||
|
```bash
|
||||||
|
curl http://localhost:11434/api/version
|
||||||
|
```
|
||||||
|
|
||||||
If Perplexica tells you that you haven't configured any chat model providers, ensure that:
|
## Features
|
||||||
|
|
||||||
1. Your server is running on `0.0.0.0` (not `127.0.0.1`) and on the same port you put in the API URL.
|
- Business search with location filtering
|
||||||
2. You have specified the correct model name loaded by your local LLM server.
|
- Contact information extraction
|
||||||
3. You have specified the correct API key, or if one is not defined, you have put *something* in the API key field and not left it empty.
|
- AI-powered data validation
|
||||||
|
- Clean, user-friendly interface
|
||||||
|
- Service health monitoring
|
||||||
|
|
||||||
#### Ollama Connection Errors
|
## Configuration
|
||||||
|
|
||||||
If you're encountering an Ollama connection error, it is likely due to the backend being unable to connect to Ollama's API. To fix this issue you can:
|
Key environment variables:
|
||||||
|
- `SEARXNG_URL`: Your SearxNG instance URL
|
||||||
|
- `OLLAMA_URL`: Ollama API endpoint (default: http://localhost:11434)
|
||||||
|
- `SUPABASE_URL`: Your Supabase project URL
|
||||||
|
- `SUPABASE_ANON_KEY`: Your Supabase anonymous key
|
||||||
|
- `CACHE_DURATION_DAYS`: How long to cache results (default: 7)
|
||||||
|
|
||||||
1. **Check your Ollama API URL:** Ensure that the API URL is correctly set in the settings menu.
|
## Supabase Setup
|
||||||
2. **Update API URL Based on OS:**
|
|
||||||
|
|
||||||
- **Windows:** Use `http://host.docker.internal:11434`
|
1. Create a new Supabase project
|
||||||
- **Mac:** Use `http://host.docker.internal:11434`
|
2. Run the SQL commands in `db/init.sql` to create the cache table
|
||||||
- **Linux:** Use `http://<private_ip_of_host>:11434`
|
3. Copy your project URL and anon key to `.env`
|
||||||
|
|
||||||
Adjust the port number if you're using a different one.
|
## License
|
||||||
|
|
||||||
3. **Linux Users - Expose Ollama to Network:**
|
MIT
|
||||||
|
|
||||||
- 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)
|
## Cache Management
|
||||||
|
|
||||||
- Ensure that the port (default is 11434) is not blocked by your firewall.
|
The application uses Supabase for caching search results. Cache entries expire after 7 days.
|
||||||
|
|
||||||
## Using as a Search Engine
|
### Manual Cache Cleanup
|
||||||
|
|
||||||
If you wish to use Perplexica as an alternative to traditional search engines like Google or Bing, or if you want to add a shortcut for quick access from your browser's search bar, follow these steps:
|
If automatic cleanup is not available, you can manually clean up expired entries:
|
||||||
|
|
||||||
1. Open your browser's settings.
|
1. Using the API:
|
||||||
2. Navigate to the 'Search Engines' section.
|
```bash
|
||||||
3. Add a new site search with the following URL: `http://localhost:3000/?q=%s`. Replace `localhost` with your IP address or domain name, and `3000` with the port number if Perplexica is not hosted locally.
|
curl -X POST http://localhost:3000/api/cleanup
|
||||||
4. Click the add button. Now, you can use Perplexica directly from your browser's search bar.
|
```
|
||||||
|
|
||||||
## Using Perplexica's API
|
2. Using SQL:
|
||||||
|
```sql
|
||||||
|
select manual_cleanup();
|
||||||
|
```
|
||||||
|
|
||||||
Perplexica also provides an API for developers looking to integrate its powerful search engine into their own applications. You can run searches, use multiple models and get answers to your queries.
|
### Cache Statistics
|
||||||
|
|
||||||
For more details, check out the full documentation [here](https://github.com/ItzCrazyKns/Perplexica/tree/master/docs/API/SEARCH.md).
|
View cache statistics using:
|
||||||
|
```sql
|
||||||
## Expose Perplexica to network
|
select * from cache_stats;
|
||||||
|
```
|
||||||
Perplexica runs on Next.js and handles all API requests. It works right away on the same network and stays accessible even with port forwarding.
|
|
||||||
|
|
||||||
## One-Click Deployment
|
|
||||||
|
|
||||||
[](https://usw.sealos.io/?openapp=system-template%3FtemplateName%3Dperplexica)
|
|
||||||
[](https://repocloud.io/details/?app_id=267)
|
|
||||||
[](https://template.run.claw.cloud/?referralCode=U11MRQ8U9RM4&openapp=system-fastdeploy%3FtemplateName%3Dperplexica)
|
|
||||||
|
|
||||||
## Upcoming Features
|
|
||||||
|
|
||||||
- [x] Add settings page
|
|
||||||
- [x] Adding support for local LLMs
|
|
||||||
- [x] History Saving features
|
|
||||||
- [x] Introducing various Focus Modes
|
|
||||||
- [x] Adding API support
|
|
||||||
- [x] Adding Discover
|
|
||||||
- [ ] Finalizing Copilot Mode
|
|
||||||
|
|
||||||
## Support Us
|
|
||||||
|
|
||||||
If you find Perplexica useful, consider giving us a star on GitHub. This helps more people discover Perplexica and supports the development of new features. Your support is greatly appreciated.
|
|
||||||
|
|
||||||
### Donations
|
|
||||||
|
|
||||||
We also accept donations to help sustain our project. If you would like to contribute, you can use the following options to donate. Thank you for your support!
|
|
||||||
|
|
||||||
| Ethereum |
|
|
||||||
| ----------------------------------------------------- |
|
|
||||||
| Address: `0xB025a84b2F269570Eb8D4b05DEdaA41D8525B6DD` |
|
|
||||||
|
|
||||||
## Contribution
|
|
||||||
|
|
||||||
Perplexica is built on the idea that AI and large language models should be easy for everyone to use. If you find bugs or have ideas, please share them in via GitHub Issues. For more information on contributing to Perplexica you can read the [CONTRIBUTING.md](CONTRIBUTING.md) file to learn more about Perplexica and how you can contribute to it.
|
|
||||||
|
|
||||||
## Help and Support
|
|
||||||
|
|
||||||
If you have any questions or feedback, please feel free to reach out to us. You can create an issue on GitHub or join our Discord server. There, you can connect with other users, share your experiences and reviews, and receive more personalized help. [Click here](https://discord.gg/EFwsmQDgAu) to join the Discord server. To discuss matters outside of regular support, feel free to contact me on Discord at `itzcrazykns`.
|
|
||||||
|
|
||||||
Thank you for exploring Perplexica, the AI-powered search engine designed to enhance your search experience. We are constantly working to improve Perplexica and expand its capabilities. We value your feedback and contributions which help us make Perplexica even better. Don't forget to check back for updates and new features!
|
|
||||||
|
@@ -1,35 +1,15 @@
|
|||||||
FROM node:20.18.0-slim AS builder
|
FROM node:20.18.0-alpine
|
||||||
|
|
||||||
|
ARG NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001
|
||||||
|
ARG NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api
|
||||||
|
ENV NEXT_PUBLIC_WS_URL=${NEXT_PUBLIC_WS_URL}
|
||||||
|
ENV NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL}
|
||||||
|
|
||||||
WORKDIR /home/perplexica
|
WORKDIR /home/perplexica
|
||||||
|
|
||||||
COPY package.json yarn.lock ./
|
COPY ui /home/perplexica/
|
||||||
RUN yarn install --frozen-lockfile --network-timeout 600000
|
|
||||||
|
|
||||||
COPY tsconfig.json next.config.mjs next-env.d.ts postcss.config.js drizzle.config.ts tailwind.config.ts ./
|
RUN yarn install --frozen-lockfile
|
||||||
COPY src ./src
|
|
||||||
COPY public ./public
|
|
||||||
|
|
||||||
RUN mkdir -p /home/perplexica/data
|
|
||||||
RUN yarn build
|
RUN yarn build
|
||||||
|
|
||||||
RUN yarn add --dev @vercel/ncc
|
CMD ["yarn", "start"]
|
||||||
RUN yarn ncc build ./src/lib/db/migrate.ts -o migrator
|
|
||||||
|
|
||||||
FROM node:20.18.0-slim
|
|
||||||
|
|
||||||
WORKDIR /home/perplexica
|
|
||||||
|
|
||||||
COPY --from=builder /home/perplexica/public ./public
|
|
||||||
COPY --from=builder /home/perplexica/.next/static ./public/_next/static
|
|
||||||
|
|
||||||
COPY --from=builder /home/perplexica/.next/standalone ./
|
|
||||||
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
|
|
||||||
|
|
||||||
COPY entrypoint.sh ./entrypoint.sh
|
|
||||||
RUN chmod +x ./entrypoint.sh
|
|
||||||
CMD ["./entrypoint.sh"]
|
|
17
backend.dockerfile
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
FROM node:18-slim
|
||||||
|
|
||||||
|
WORKDIR /home/perplexica
|
||||||
|
|
||||||
|
COPY src /home/perplexica/src
|
||||||
|
COPY tsconfig.json /home/perplexica/
|
||||||
|
COPY drizzle.config.ts /home/perplexica/
|
||||||
|
COPY package.json /home/perplexica/
|
||||||
|
COPY yarn.lock /home/perplexica/
|
||||||
|
|
||||||
|
RUN mkdir /home/perplexica/data
|
||||||
|
RUN mkdir /home/perplexica/uploads
|
||||||
|
|
||||||
|
RUN yarn install --frozen-lockfile --network-timeout 600000
|
||||||
|
RUN yarn build
|
||||||
|
|
||||||
|
CMD ["yarn", "start"]
|
14
config.toml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
[GENERAL]
|
||||||
|
PORT = 3001 # Port to run the server on
|
||||||
|
SIMILARITY_MEASURE = "cosine" # "cosine" or "dot"
|
||||||
|
KEEP_ALIVE = "5m" # How long to keep Ollama models loaded into memory. (Instead of using -1 use "-1m")
|
||||||
|
|
||||||
|
[API_KEYS]
|
||||||
|
OPENAI = "" # OpenAI API key - sk-1234567890abcdef1234567890abcdef
|
||||||
|
GROQ = "" # Groq API key - gsk_1234567890abcdef1234567890abcdef
|
||||||
|
ANTHROPIC = "" # Anthropic API key - sk-ant-1234567890abcdef1234567890abcdef
|
||||||
|
GEMINI = "" # Gemini API key - sk-1234567890abcdef1234567890abcdef
|
||||||
|
|
||||||
|
[API_ENDPOINTS]
|
||||||
|
SEARXNG = "http://localhost:32768" # SearxNG API URL
|
||||||
|
OLLAMA = "" # Ollama API URL - http://host.docker.internal:11434
|
189
db/init.sql
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
-- Enable required extensions
|
||||||
|
create extension if not exists "uuid-ossp"; -- For UUID generation
|
||||||
|
create extension if not exists pg_cron; -- For scheduled jobs
|
||||||
|
|
||||||
|
-- Create the search_cache table
|
||||||
|
create table public.search_cache (
|
||||||
|
id uuid default uuid_generate_v4() primary key,
|
||||||
|
query text not null,
|
||||||
|
results jsonb not null,
|
||||||
|
location text not null,
|
||||||
|
category text not null,
|
||||||
|
created_at timestamp with time zone default timezone('utc'::text, now()) not null,
|
||||||
|
updated_at timestamp with time zone default timezone('utc'::text, now()) not null,
|
||||||
|
expires_at timestamp with time zone default timezone('utc'::text, now() + interval '7 days') not null
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Create indexes
|
||||||
|
create index search_cache_query_idx on public.search_cache (query);
|
||||||
|
create index search_cache_location_category_idx on public.search_cache (location, category);
|
||||||
|
create index search_cache_expires_at_idx on public.search_cache (expires_at);
|
||||||
|
|
||||||
|
-- Enable RLS
|
||||||
|
alter table public.search_cache enable row level security;
|
||||||
|
|
||||||
|
-- Create policies
|
||||||
|
create policy "Allow public read access"
|
||||||
|
on public.search_cache for select
|
||||||
|
using (true);
|
||||||
|
|
||||||
|
create policy "Allow service write access"
|
||||||
|
on public.search_cache for insert
|
||||||
|
with check (true);
|
||||||
|
|
||||||
|
create policy "Allow service update access"
|
||||||
|
on public.search_cache for update
|
||||||
|
using (true)
|
||||||
|
with check (true);
|
||||||
|
|
||||||
|
create policy "Allow delete expired records"
|
||||||
|
on public.search_cache for delete
|
||||||
|
using (expires_at < now());
|
||||||
|
|
||||||
|
-- Create function to clean up expired records
|
||||||
|
create or replace function cleanup_expired_cache()
|
||||||
|
returns void
|
||||||
|
language plpgsql
|
||||||
|
security definer
|
||||||
|
as $$
|
||||||
|
begin
|
||||||
|
delete from public.search_cache
|
||||||
|
where expires_at < now();
|
||||||
|
end;
|
||||||
|
$$;
|
||||||
|
|
||||||
|
-- Create a manual cleanup function since pg_cron might not be available
|
||||||
|
create or replace function manual_cleanup()
|
||||||
|
returns void
|
||||||
|
language plpgsql
|
||||||
|
security definer
|
||||||
|
as $$
|
||||||
|
begin
|
||||||
|
delete from public.search_cache
|
||||||
|
where expires_at < now();
|
||||||
|
end;
|
||||||
|
$$;
|
||||||
|
|
||||||
|
-- Create a view for cache statistics
|
||||||
|
create or replace view cache_stats as
|
||||||
|
select
|
||||||
|
count(*) as total_entries,
|
||||||
|
count(*) filter (where expires_at < now()) as expired_entries,
|
||||||
|
count(*) filter (where expires_at >= now()) as valid_entries,
|
||||||
|
min(created_at) as oldest_entry,
|
||||||
|
max(created_at) as newest_entry,
|
||||||
|
count(distinct category) as unique_categories,
|
||||||
|
count(distinct location) as unique_locations
|
||||||
|
from public.search_cache;
|
||||||
|
|
||||||
|
-- Grant permissions to access the view
|
||||||
|
grant select on cache_stats to postgres;
|
||||||
|
|
||||||
|
-- Create table if not exists businesses
|
||||||
|
create table if not exists businesses (
|
||||||
|
id text primary key,
|
||||||
|
name text not null,
|
||||||
|
phone text,
|
||||||
|
email text,
|
||||||
|
address text,
|
||||||
|
rating numeric,
|
||||||
|
website text,
|
||||||
|
logo text,
|
||||||
|
source text,
|
||||||
|
description text,
|
||||||
|
latitude numeric,
|
||||||
|
longitude numeric,
|
||||||
|
last_updated timestamp with time zone default timezone('utc'::text, now()),
|
||||||
|
search_count integer default 1,
|
||||||
|
created_at timestamp with time zone default timezone('utc'::text, now())
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Create indexes for common queries
|
||||||
|
create index if not exists businesses_name_idx on businesses (name);
|
||||||
|
create index if not exists businesses_rating_idx on businesses (rating desc);
|
||||||
|
create index if not exists businesses_search_count_idx on businesses (search_count desc);
|
||||||
|
create index if not exists businesses_last_updated_idx on businesses (last_updated desc);
|
||||||
|
|
||||||
|
-- Create tables if they don't exist
|
||||||
|
CREATE TABLE IF NOT EXISTS businesses (
|
||||||
|
id TEXT PRIMARY KEY,
|
||||||
|
name TEXT NOT NULL,
|
||||||
|
phone TEXT,
|
||||||
|
email TEXT,
|
||||||
|
address TEXT,
|
||||||
|
rating INTEGER,
|
||||||
|
website TEXT,
|
||||||
|
logo TEXT,
|
||||||
|
source TEXT,
|
||||||
|
description TEXT,
|
||||||
|
location JSONB,
|
||||||
|
place_id TEXT,
|
||||||
|
photos TEXT[],
|
||||||
|
opening_hours TEXT[],
|
||||||
|
distance JSONB,
|
||||||
|
last_updated TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
search_count INTEGER DEFAULT 0
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS searches (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
query TEXT NOT NULL,
|
||||||
|
location TEXT NOT NULL,
|
||||||
|
timestamp TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
results_count INTEGER
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS cache (
|
||||||
|
key TEXT PRIMARY KEY,
|
||||||
|
value JSONB NOT NULL,
|
||||||
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
expires_at TIMESTAMP WITH TIME ZONE NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Create indexes
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_businesses_location ON businesses USING GIN (location);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_businesses_search ON businesses USING GIN (to_tsvector('english', name || ' ' || COALESCE(description, '')));
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_cache_expires ON cache (expires_at);
|
||||||
|
|
||||||
|
-- Set up RLS (Row Level Security)
|
||||||
|
ALTER TABLE businesses ENABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE searches ENABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE cache ENABLE ROW LEVEL SECURITY;
|
||||||
|
|
||||||
|
-- Create policies
|
||||||
|
CREATE POLICY "Allow anonymous select" ON businesses FOR SELECT USING (true);
|
||||||
|
CREATE POLICY "Allow service role insert" ON businesses FOR INSERT WITH CHECK (true);
|
||||||
|
CREATE POLICY "Allow service role update" ON businesses FOR UPDATE USING (true);
|
||||||
|
|
||||||
|
CREATE POLICY "Allow anonymous select" ON searches FOR SELECT USING (true);
|
||||||
|
CREATE POLICY "Allow service role insert" ON searches FOR INSERT WITH CHECK (true);
|
||||||
|
|
||||||
|
CREATE POLICY "Allow anonymous select" ON cache FOR SELECT USING (true);
|
||||||
|
CREATE POLICY "Allow service role all" ON cache USING (true);
|
||||||
|
|
||||||
|
-- Add place_id column to businesses table if it doesn't exist
|
||||||
|
ALTER TABLE businesses ADD COLUMN IF NOT EXISTS place_id TEXT;
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_businesses_place_id ON businesses(place_id);
|
||||||
|
|
||||||
|
-- Create a unique constraint on place_id (excluding nulls)
|
||||||
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_businesses_place_id_unique
|
||||||
|
ON businesses(place_id)
|
||||||
|
WHERE place_id IS NOT NULL;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS businesses (
|
||||||
|
id TEXT PRIMARY KEY,
|
||||||
|
name TEXT NOT NULL,
|
||||||
|
address TEXT NOT NULL,
|
||||||
|
phone TEXT NOT NULL,
|
||||||
|
description TEXT NOT NULL,
|
||||||
|
website TEXT,
|
||||||
|
source TEXT NOT NULL,
|
||||||
|
rating REAL,
|
||||||
|
lat REAL,
|
||||||
|
lng REAL,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_businesses_source ON businesses(source);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_businesses_rating ON businesses(rating);
|
44
db/schema.sql
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
-- Create the businesses table
|
||||||
|
create table businesses (
|
||||||
|
id uuid primary key,
|
||||||
|
name text not null,
|
||||||
|
phone text,
|
||||||
|
address text,
|
||||||
|
city text,
|
||||||
|
state text,
|
||||||
|
zip text,
|
||||||
|
category text[],
|
||||||
|
rating numeric,
|
||||||
|
review_count integer,
|
||||||
|
license text,
|
||||||
|
services text[],
|
||||||
|
hours jsonb,
|
||||||
|
website text,
|
||||||
|
email text,
|
||||||
|
verified boolean default false,
|
||||||
|
last_updated timestamp with time zone,
|
||||||
|
search_query text,
|
||||||
|
search_location text,
|
||||||
|
search_timestamp timestamp with time zone,
|
||||||
|
reliability_score integer,
|
||||||
|
|
||||||
|
-- Create a composite index for deduplication
|
||||||
|
constraint unique_business unique (phone, address)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Create indexes for common queries
|
||||||
|
create index idx_business_location on businesses (city, state);
|
||||||
|
create index idx_business_category on businesses using gin (category);
|
||||||
|
create index idx_search_query on businesses using gin (search_query gin_trgm_ops);
|
||||||
|
create index idx_search_location on businesses using gin (search_location gin_trgm_ops);
|
||||||
|
create index idx_reliability on businesses (reliability_score);
|
||||||
|
|
||||||
|
-- Enable full text search
|
||||||
|
alter table businesses add column search_vector tsvector
|
||||||
|
generated always as (
|
||||||
|
setweight(to_tsvector('english', coalesce(name, '')), 'A') ||
|
||||||
|
setweight(to_tsvector('english', coalesce(search_query, '')), 'B') ||
|
||||||
|
setweight(to_tsvector('english', coalesce(search_location, '')), 'C')
|
||||||
|
) stored;
|
||||||
|
|
||||||
|
create index idx_business_search on businesses using gin(search_vector);
|
15
db/verify.sql
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
-- Check if table exists
|
||||||
|
SELECT EXISTS (
|
||||||
|
SELECT FROM information_schema.tables
|
||||||
|
WHERE table_schema = 'public'
|
||||||
|
AND table_name = 'businesses'
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Check table structure
|
||||||
|
SELECT column_name, data_type, is_nullable
|
||||||
|
FROM information_schema.columns
|
||||||
|
WHERE table_schema = 'public'
|
||||||
|
AND table_name = 'businesses';
|
||||||
|
|
||||||
|
-- Check row count
|
||||||
|
SELECT COUNT(*) as count FROM businesses;
|
@@ -9,22 +9,41 @@ services:
|
|||||||
- perplexica-network
|
- perplexica-network
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
app:
|
perplexica-backend:
|
||||||
image: itzcrazykns1337/perplexica:main
|
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: app.dockerfile
|
dockerfile: backend.dockerfile
|
||||||
|
image: itzcrazykns1337/perplexica-backend:main
|
||||||
environment:
|
environment:
|
||||||
- SEARXNG_API_URL=http://searxng:8080
|
- SEARXNG_API_URL=http://searxng:8080
|
||||||
- DATA_DIR=/home/perplexica
|
depends_on:
|
||||||
|
- searxng
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3001:3001
|
||||||
networks:
|
|
||||||
- perplexica-network
|
|
||||||
volumes:
|
volumes:
|
||||||
- backend-dbstore:/home/perplexica/data
|
- backend-dbstore:/home/perplexica/data
|
||||||
- uploads:/home/perplexica/uploads
|
- uploads:/home/perplexica/uploads
|
||||||
- ./config.toml:/home/perplexica/config.toml
|
- ./config.toml:/home/perplexica/config.toml
|
||||||
|
extra_hosts:
|
||||||
|
- 'host.docker.internal:host-gateway'
|
||||||
|
networks:
|
||||||
|
- perplexica-network
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
perplexica-frontend:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: app.dockerfile
|
||||||
|
args:
|
||||||
|
- NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api
|
||||||
|
- NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001
|
||||||
|
image: itzcrazykns1337/perplexica-frontend:main
|
||||||
|
depends_on:
|
||||||
|
- perplexica-backend
|
||||||
|
ports:
|
||||||
|
- 3000:3000
|
||||||
|
networks:
|
||||||
|
- perplexica-network
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
|
26
docker-compose.yml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
searxng:
|
||||||
|
image: searxng/searxng
|
||||||
|
ports:
|
||||||
|
- "4000:8080"
|
||||||
|
volumes:
|
||||||
|
- ./searxng:/etc/searxng
|
||||||
|
environment:
|
||||||
|
- INSTANCE_NAME=perplexica-searxng
|
||||||
|
- BASE_URL=http://localhost:4000/
|
||||||
|
- SEARXNG_SECRET=your_secret_key_here
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
app:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: backend.dockerfile
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
|
environment:
|
||||||
|
- SEARXNG_URL=http://searxng:8080
|
||||||
|
volumes:
|
||||||
|
- ./config.toml:/home/perplexica/config.toml
|
||||||
|
depends_on:
|
||||||
|
- searxng
|
@@ -6,9 +6,9 @@ Perplexica’s Search API makes it easy to use our AI-powered search engine. You
|
|||||||
|
|
||||||
## Endpoint
|
## Endpoint
|
||||||
|
|
||||||
### **POST** `http://localhost:3000/api/search`
|
### **POST** `http://localhost:3001/api/search`
|
||||||
|
|
||||||
**Note**: Replace `3000` with any other port if you've changed the default PORT
|
**Note**: Replace `3001` with any other port if you've changed the default PORT
|
||||||
|
|
||||||
### Request
|
### Request
|
||||||
|
|
||||||
@@ -20,11 +20,11 @@ The API accepts a JSON object in the request body, where you define the focus mo
|
|||||||
{
|
{
|
||||||
"chatModel": {
|
"chatModel": {
|
||||||
"provider": "openai",
|
"provider": "openai",
|
||||||
"name": "gpt-4o-mini"
|
"model": "gpt-4o-mini"
|
||||||
},
|
},
|
||||||
"embeddingModel": {
|
"embeddingModel": {
|
||||||
"provider": "openai",
|
"provider": "openai",
|
||||||
"name": "text-embedding-3-large"
|
"model": "text-embedding-3-large"
|
||||||
},
|
},
|
||||||
"optimizationMode": "speed",
|
"optimizationMode": "speed",
|
||||||
"focusMode": "webSearch",
|
"focusMode": "webSearch",
|
||||||
@@ -32,26 +32,24 @@ The API accepts a JSON object in the request body, where you define the focus mo
|
|||||||
"history": [
|
"history": [
|
||||||
["human", "Hi, how are you?"],
|
["human", "Hi, how are you?"],
|
||||||
["assistant", "I am doing well, how can I help you today?"]
|
["assistant", "I am doing well, how can I help you today?"]
|
||||||
],
|
]
|
||||||
"systemInstructions": "Focus on providing technical details about Perplexica's architecture.",
|
|
||||||
"stream": false
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Request Parameters
|
### Request Parameters
|
||||||
|
|
||||||
- **`chatModel`** (object, optional): Defines the chat model to be used for the query. For model details you can send a GET request at `http://localhost:3000/api/models`. Make sure to use the key value (For example "gpt-4o-mini" instead of the display name "GPT 4 omni mini").
|
- **`chatModel`** (object, optional): Defines the chat model to be used for the query. For model details you can send a GET request at `http://localhost:3001/api/models`. Make sure to use the key value (For example "gpt-4o-mini" instead of the display name "GPT 4 omni mini").
|
||||||
|
|
||||||
- `provider`: Specifies the provider for the chat model (e.g., `openai`, `ollama`).
|
- `provider`: Specifies the provider for the chat model (e.g., `openai`, `ollama`).
|
||||||
- `name`: The specific model from the chosen provider (e.g., `gpt-4o-mini`).
|
- `model`: The specific model from the chosen provider (e.g., `gpt-4o-mini`).
|
||||||
- Optional fields for custom OpenAI configuration:
|
- Optional fields for custom OpenAI configuration:
|
||||||
- `customOpenAIBaseURL`: If you’re using a custom OpenAI instance, provide the base URL.
|
- `customOpenAIBaseURL`: If you’re using a custom OpenAI instance, provide the base URL.
|
||||||
- `customOpenAIKey`: The API key for a custom OpenAI instance.
|
- `customOpenAIKey`: The API key for a custom OpenAI instance.
|
||||||
|
|
||||||
- **`embeddingModel`** (object, optional): Defines the embedding model for similarity-based searching. For model details you can send a GET request at `http://localhost:3000/api/models`. Make sure to use the key value (For example "text-embedding-3-large" instead of the display name "Text Embedding 3 Large").
|
- **`embeddingModel`** (object, optional): Defines the embedding model for similarity-based searching. For model details you can send a GET request at `http://localhost:3001/api/models`. Make sure to use the key value (For example "text-embedding-3-large" instead of the display name "Text Embedding 3 Large").
|
||||||
|
|
||||||
- `provider`: The provider for the embedding model (e.g., `openai`).
|
- `provider`: The provider for the embedding model (e.g., `openai`).
|
||||||
- `name`: The specific embedding model (e.g., `text-embedding-3-large`).
|
- `model`: The specific embedding model (e.g., `text-embedding-3-large`).
|
||||||
|
|
||||||
- **`focusMode`** (string, required): Specifies which focus mode to use. Available modes:
|
- **`focusMode`** (string, required): Specifies which focus mode to use. Available modes:
|
||||||
|
|
||||||
@@ -64,8 +62,6 @@ The API accepts a JSON object in the request body, where you define the focus mo
|
|||||||
|
|
||||||
- **`query`** (string, required): The search query or question.
|
- **`query`** (string, required): The search query or question.
|
||||||
|
|
||||||
- **`systemInstructions`** (string, optional): Custom instructions provided by the user to guide the AI's response. These instructions are treated as user preferences and have lower priority than the system's core instructions. For example, you can specify a particular writing style, format, or focus area.
|
|
||||||
|
|
||||||
- **`history`** (array, optional): An array of message pairs representing the conversation history. Each pair consists of a role (either 'human' or 'assistant') and the message content. This allows the system to use the context of the conversation to refine results. Example:
|
- **`history`** (array, optional): An array of message pairs representing the conversation history. Each pair consists of a role (either 'human' or 'assistant') and the message content. This allows the system to use the context of the conversation to refine results. Example:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
@@ -75,13 +71,11 @@ The API accepts a JSON object in the request body, where you define the focus mo
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
- **`stream`** (boolean, optional): When set to `true`, enables streaming responses. Default is `false`.
|
|
||||||
|
|
||||||
### Response
|
### Response
|
||||||
|
|
||||||
The response from the API includes both the final message and the sources used to generate that message.
|
The response from the API includes both the final message and the sources used to generate that message.
|
||||||
|
|
||||||
#### Standard Response (stream: false)
|
#### Example Response
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
@@ -106,28 +100,6 @@ The response from the API includes both the final message and the sources used t
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Streaming Response (stream: true)
|
|
||||||
|
|
||||||
When streaming is enabled, the API returns a stream of newline-delimited JSON objects. Each line contains a complete, valid JSON object. The response has Content-Type: application/json.
|
|
||||||
|
|
||||||
Example of streamed response objects:
|
|
||||||
|
|
||||||
```
|
|
||||||
{"type":"init","data":"Stream connected"}
|
|
||||||
{"type":"sources","data":[{"pageContent":"...","metadata":{"title":"...","url":"..."}},...]}
|
|
||||||
{"type":"response","data":"Perplexica is an "}
|
|
||||||
{"type":"response","data":"innovative, open-source "}
|
|
||||||
{"type":"response","data":"AI-powered search engine..."}
|
|
||||||
{"type":"done"}
|
|
||||||
```
|
|
||||||
|
|
||||||
Clients should process each line as a separate JSON object. The different message types include:
|
|
||||||
|
|
||||||
- **`init`**: Initial connection message
|
|
||||||
- **`sources`**: All sources used for the response
|
|
||||||
- **`response`**: Chunks of the generated answer text
|
|
||||||
- **`done`**: Indicates the stream is complete
|
|
||||||
|
|
||||||
### Fields in the Response
|
### Fields in the Response
|
||||||
|
|
||||||
- **`message`** (string): The search result, generated based on the query and focus mode.
|
- **`message`** (string): The search result, generated based on the query and focus mode.
|
||||||
|
108
docs/ETHICAL_SCRAPING.md
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
# Ethical Web Scraping Guidelines
|
||||||
|
|
||||||
|
## Core Principles
|
||||||
|
|
||||||
|
1. **Respect Robots.txt**
|
||||||
|
- Always check and honor robots.txt directives
|
||||||
|
- Cache robots.txt to reduce server load
|
||||||
|
- Default to conservative behavior when uncertain
|
||||||
|
|
||||||
|
2. **Proper Identification**
|
||||||
|
- Use clear, identifiable User-Agent strings
|
||||||
|
- Provide contact information
|
||||||
|
- Be transparent about your purpose
|
||||||
|
|
||||||
|
3. **Rate Limiting**
|
||||||
|
- Implement conservative rate limits
|
||||||
|
- Use exponential backoff for errors
|
||||||
|
- Distribute requests over time
|
||||||
|
|
||||||
|
4. **Data Usage**
|
||||||
|
- Only collect publicly available business information
|
||||||
|
- Respect privacy and data protection laws
|
||||||
|
- Provide clear opt-out mechanisms
|
||||||
|
- Keep data accurate and up-to-date
|
||||||
|
|
||||||
|
5. **Technical Considerations**
|
||||||
|
- Cache results to minimize requests
|
||||||
|
- Handle errors gracefully
|
||||||
|
- Monitor and log access patterns
|
||||||
|
- Use structured data when available
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
|
||||||
|
1. **Request Headers**
|
||||||
|
```typescript
|
||||||
|
const headers = {
|
||||||
|
'User-Agent': 'BizSearch/1.0 (+https://bizsearch.com/about)',
|
||||||
|
'Accept': 'text/html,application/xhtml+xml',
|
||||||
|
'From': 'contact@bizsearch.com'
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Rate Limiting**
|
||||||
|
```typescript
|
||||||
|
const rateLimits = {
|
||||||
|
requestsPerMinute: 10,
|
||||||
|
requestsPerHour: 100,
|
||||||
|
requestsPerDomain: 20
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Caching**
|
||||||
|
```typescript
|
||||||
|
const cacheSettings = {
|
||||||
|
ttl: 24 * 60 * 60, // 24 hours
|
||||||
|
maxSize: 1000 // entries
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
## Opt-Out Process
|
||||||
|
|
||||||
|
1. Business owners can opt-out by:
|
||||||
|
- Submitting a form on our website
|
||||||
|
- Emailing opt-out@bizsearch.com
|
||||||
|
- Adding a meta tag: `<meta name="bizsearch" content="noindex">`
|
||||||
|
|
||||||
|
2. We honor opt-outs within:
|
||||||
|
- 24 hours for direct requests
|
||||||
|
- 72 hours for cached data
|
||||||
|
|
||||||
|
## Legal Compliance
|
||||||
|
|
||||||
|
1. **Data Protection**
|
||||||
|
- GDPR compliance for EU businesses
|
||||||
|
- CCPA compliance for California businesses
|
||||||
|
- Regular data audits and cleanup
|
||||||
|
|
||||||
|
2. **Attribution**
|
||||||
|
- Clear source attribution
|
||||||
|
- Last-updated timestamps
|
||||||
|
- Data accuracy disclaimers
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
1. **Before Scraping**
|
||||||
|
- Check robots.txt
|
||||||
|
- Verify site status
|
||||||
|
- Review terms of service
|
||||||
|
- Look for API alternatives
|
||||||
|
|
||||||
|
2. **During Scraping**
|
||||||
|
- Monitor response codes
|
||||||
|
- Respect server hints
|
||||||
|
- Implement backoff strategies
|
||||||
|
- Log access patterns
|
||||||
|
|
||||||
|
3. **After Scraping**
|
||||||
|
- Verify data accuracy
|
||||||
|
- Update cache entries
|
||||||
|
- Clean up old data
|
||||||
|
- Monitor opt-out requests
|
||||||
|
|
||||||
|
## Contact
|
||||||
|
|
||||||
|
For questions or concerns about our scraping practices:
|
||||||
|
- Email: ethics@bizsearch.com
|
||||||
|
- Phone: (555) 123-4567
|
||||||
|
- Web: https://bizsearch.com/ethics
|
@@ -4,7 +4,7 @@ Curious about how Perplexica works? Don't worry, we'll cover it here. Before we
|
|||||||
|
|
||||||
We'll understand how Perplexica works by taking an example of a scenario where a user asks: "How does an A.C. work?". We'll break down the process into steps to make it easier to understand. The steps are as follows:
|
We'll understand how Perplexica works by taking an example of a scenario where a user asks: "How does an A.C. work?". We'll break down the process into steps to make it easier to understand. The steps are as follows:
|
||||||
|
|
||||||
1. The message is sent to the `/api/chat` route where it invokes the chain. The chain will depend on your focus mode. For this example, let's assume we use the "webSearch" focus mode.
|
1. The message is sent via WS to the backend server where it invokes the chain. The chain will depend on your focus mode. For this example, let's assume we use the "webSearch" focus mode.
|
||||||
2. The chain is now invoked; first, the message is passed to another chain where it first predicts (using the chat history and the question) whether there is a need for sources and searching the web. If there is, it will generate a query (in accordance with the chat history) for searching the web that we'll take up later. If not, the chain will end there, and then the answer generator chain, also known as the response generator, will be started.
|
2. The chain is now invoked; first, the message is passed to another chain where it first predicts (using the chat history and the question) whether there is a need for sources and searching the web. If there is, it will generate a query (in accordance with the chat history) for searching the web that we'll take up later. If not, the chain will end there, and then the answer generator chain, also known as the response generator, will be started.
|
||||||
3. The query returned by the first chain is passed to SearXNG to search the web for information.
|
3. The query returned by the first chain is passed to SearXNG to search the web for information.
|
||||||
4. After the information is retrieved, it is based on keyword-based search. We then convert the information into embeddings and the query as well, then we perform a similarity search to find the most relevant sources to answer the query.
|
4. After the information is retrieved, it is based on keyword-based search. We then convert the information into embeddings and the query as well, then we perform a similarity search to find the most relevant sources to answer the query.
|
||||||
|
109
docs/installation/NETWORKING.md
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
# Expose Perplexica to a network
|
||||||
|
|
||||||
|
This guide will show you how to make Perplexica available over a network. Follow these steps to allow computers on the same network to interact with Perplexica. Choose the instructions that match the operating system you are using.
|
||||||
|
|
||||||
|
## Windows
|
||||||
|
|
||||||
|
1. Open PowerShell as Administrator
|
||||||
|
|
||||||
|
2. Navigate to the directory containing the `docker-compose.yaml` file
|
||||||
|
|
||||||
|
3. Stop and remove the existing Perplexica containers and images:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose down --rmi all
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Open the `docker-compose.yaml` file in a text editor like Notepad++
|
||||||
|
|
||||||
|
5. Replace `127.0.0.1` with the IP address of the server Perplexica is running on in these two lines:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
args:
|
||||||
|
- NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api
|
||||||
|
- NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001
|
||||||
|
```
|
||||||
|
|
||||||
|
6. Save and close the `docker-compose.yaml` file
|
||||||
|
|
||||||
|
7. Rebuild and restart the Perplexica container:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
## macOS
|
||||||
|
|
||||||
|
1. Open the Terminal application
|
||||||
|
|
||||||
|
2. Navigate to the directory with the `docker-compose.yaml` file:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /path/to/docker-compose.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Stop and remove existing containers and images:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose down --rmi all
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Open `docker-compose.yaml` in a text editor like Sublime Text:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nano docker-compose.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Replace `127.0.0.1` with the server IP in these lines:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
args:
|
||||||
|
- NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api
|
||||||
|
- NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001
|
||||||
|
```
|
||||||
|
|
||||||
|
6. Save and exit the editor
|
||||||
|
|
||||||
|
7. Rebuild and restart Perplexica:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
## Linux
|
||||||
|
|
||||||
|
1. Open the terminal
|
||||||
|
|
||||||
|
2. Navigate to the `docker-compose.yaml` directory:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /path/to/docker-compose.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Stop and remove containers and images:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose down --rmi all
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Edit `docker-compose.yaml`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nano docker-compose.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Replace `127.0.0.1` with the server IP:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
args:
|
||||||
|
- NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api
|
||||||
|
- NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001
|
||||||
|
```
|
||||||
|
|
||||||
|
6. Save and exit the editor
|
||||||
|
|
||||||
|
7. Rebuild and restart Perplexica:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d --build
|
||||||
|
```
|
@@ -10,25 +10,23 @@ To update Perplexica to the latest version, follow these steps:
|
|||||||
git clone https://github.com/ItzCrazyKns/Perplexica.git
|
git clone https://github.com/ItzCrazyKns/Perplexica.git
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Navigate to the project directory.
|
2. Navigate to the Project Directory.
|
||||||
|
|
||||||
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. Pull latest images from registry.
|
||||||
|
|
||||||
4. Pull the latest images from the registry.
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker compose pull
|
docker compose pull
|
||||||
```
|
```
|
||||||
|
|
||||||
5. Update and recreate the containers.
|
4. Update and Recreate containers.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker compose up -d
|
docker compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
6. Once the command completes, go to http://localhost:3000 and verify the latest changes.
|
5. Once the command completes running go to http://localhost:3000 and verify the latest changes.
|
||||||
|
|
||||||
## For non-Docker users
|
## For non Docker users
|
||||||
|
|
||||||
1. Clone the latest version of Perplexica from GitHub:
|
1. Clone the latest version of Perplexica from GitHub:
|
||||||
|
|
||||||
@@ -36,11 +34,7 @@ To update Perplexica to the latest version, follow these steps:
|
|||||||
git clone https://github.com/ItzCrazyKns/Perplexica.git
|
git clone https://github.com/ItzCrazyKns/Perplexica.git
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Navigate to the project directory.
|
2. Navigate to the Project Directory
|
||||||
|
3. Execute `npm i` in both the `ui` folder and the root directory.
|
||||||
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. Once packages are updated, execute `npm run build` in both the `ui` folder and the root directory.
|
||||||
4. After populating the configuration run `npm i`.
|
5. Finally, start both the frontend and the backend by running `npm run start` in both the `ui` folder and the root directory.
|
||||||
5. Install the dependencies and then execute `npm run build`.
|
|
||||||
6. Finally, start the app by running `npm run start`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
@@ -1,11 +1,10 @@
|
|||||||
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/db/schema.ts',
|
||||||
out: './drizzle',
|
out: './drizzle',
|
||||||
dbCredentials: {
|
dbCredentials: {
|
||||||
url: path.join(process.cwd(), 'data', 'db.sqlite'),
|
url: './data/db.sqlite',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@@ -1,16 +0,0 @@
|
|||||||
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
|
|
||||||
);
|
|
@@ -1,116 +0,0 @@
|
|||||||
{
|
|
||||||
"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": {}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "7",
|
|
||||||
"dialect": "sqlite",
|
|
||||||
"entries": [
|
|
||||||
{
|
|
||||||
"idx": 0,
|
|
||||||
"version": "6",
|
|
||||||
"when": 1748405503809,
|
|
||||||
"tag": "0000_fuzzy_randall",
|
|
||||||
"breakpoints": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
|
|
||||||
node migrate.js
|
|
||||||
|
|
||||||
exec node server.js
|
|
41
frontend/.gitignore
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||||
|
|
||||||
|
# dependencies
|
||||||
|
/node_modules
|
||||||
|
/.pnp
|
||||||
|
.pnp.*
|
||||||
|
.yarn/*
|
||||||
|
!.yarn/patches
|
||||||
|
!.yarn/plugins
|
||||||
|
!.yarn/releases
|
||||||
|
!.yarn/versions
|
||||||
|
|
||||||
|
# testing
|
||||||
|
/coverage
|
||||||
|
|
||||||
|
# next.js
|
||||||
|
/.next/
|
||||||
|
/out/
|
||||||
|
|
||||||
|
# production
|
||||||
|
/build
|
||||||
|
|
||||||
|
# misc
|
||||||
|
.DS_Store
|
||||||
|
*.pem
|
||||||
|
|
||||||
|
# debug
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
.pnpm-debug.log*
|
||||||
|
|
||||||
|
# env files (can opt-in for committing if needed)
|
||||||
|
.env*
|
||||||
|
|
||||||
|
# vercel
|
||||||
|
.vercel
|
||||||
|
|
||||||
|
# typescript
|
||||||
|
*.tsbuildinfo
|
||||||
|
next-env.d.ts
|
36
frontend/README.md
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
First, run the development server:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run dev
|
||||||
|
# or
|
||||||
|
yarn dev
|
||||||
|
# or
|
||||||
|
pnpm dev
|
||||||
|
# or
|
||||||
|
bun dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
||||||
|
|
||||||
|
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
|
||||||
|
|
||||||
|
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
|
||||||
|
|
||||||
|
## Learn More
|
||||||
|
|
||||||
|
To learn more about Next.js, take a look at the following resources:
|
||||||
|
|
||||||
|
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
|
||||||
|
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
||||||
|
|
||||||
|
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
|
||||||
|
|
||||||
|
## Deploy on Vercel
|
||||||
|
|
||||||
|
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
|
||||||
|
|
||||||
|
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
|
16
frontend/eslint.config.mjs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import { dirname } from "path";
|
||||||
|
import { fileURLToPath } from "url";
|
||||||
|
import { FlatCompat } from "@eslint/eslintrc";
|
||||||
|
|
||||||
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
|
const __dirname = dirname(__filename);
|
||||||
|
|
||||||
|
const compat = new FlatCompat({
|
||||||
|
baseDirectory: __dirname,
|
||||||
|
});
|
||||||
|
|
||||||
|
const eslintConfig = [
|
||||||
|
...compat.extends("next/core-web-vitals", "next/typescript"),
|
||||||
|
];
|
||||||
|
|
||||||
|
export default eslintConfig;
|
13
frontend/next.config.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/** @type {import('next').NextConfig} */
|
||||||
|
const nextConfig = {
|
||||||
|
async rewrites() {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
source: '/api/:path*',
|
||||||
|
destination: 'http://localhost:3000/api/:path*',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = nextConfig
|
7
frontend/next.config.ts
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
import type { NextConfig } from "next";
|
||||||
|
|
||||||
|
const nextConfig: NextConfig = {
|
||||||
|
/* config options here */
|
||||||
|
};
|
||||||
|
|
||||||
|
export default nextConfig;
|
5848
frontend/package-lock.json
generated
Normal file
33
frontend/package.json
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"name": "frontend",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"dev": "next dev",
|
||||||
|
"build": "next build",
|
||||||
|
"start": "next start",
|
||||||
|
"lint": "next lint"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@radix-ui/react-icons": "^1.3.2",
|
||||||
|
"class-variance-authority": "^0.7.1",
|
||||||
|
"clsx": "^2.1.1",
|
||||||
|
"lucide-react": "^0.469.0",
|
||||||
|
"next": "15.1.3",
|
||||||
|
"react": "^19.0.0",
|
||||||
|
"react-dom": "^19.0.0",
|
||||||
|
"tailwind-merge": "^2.6.0",
|
||||||
|
"tailwindcss-animate": "^1.0.7"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@eslint/eslintrc": "^3",
|
||||||
|
"@types/node": "^20",
|
||||||
|
"@types/react": "^19",
|
||||||
|
"@types/react-dom": "^19",
|
||||||
|
"eslint": "^9",
|
||||||
|
"eslint-config-next": "15.1.3",
|
||||||
|
"postcss": "^8",
|
||||||
|
"tailwindcss": "^3.4.1",
|
||||||
|
"typescript": "^5"
|
||||||
|
}
|
||||||
|
}
|
8
frontend/postcss.config.mjs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
/** @type {import('postcss-load-config').Config} */
|
||||||
|
const config = {
|
||||||
|
plugins: {
|
||||||
|
tailwindcss: {},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default config;
|
1
frontend/public/file.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
|
After Width: | Height: | Size: 391 B |
1
frontend/public/globe.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
|
After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
1
frontend/public/vercel.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>
|
After Width: | Height: | Size: 128 B |
1
frontend/public/window.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>
|
After Width: | Height: | Size: 385 B |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
76
frontend/src/app/globals.css
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
@tailwind base;
|
||||||
|
@tailwind components;
|
||||||
|
@tailwind utilities;
|
||||||
|
|
||||||
|
@layer base {
|
||||||
|
:root {
|
||||||
|
--background: 0 0% 100%;
|
||||||
|
--foreground: 222.2 84% 4.9%;
|
||||||
|
|
||||||
|
--card: 0 0% 100%;
|
||||||
|
--card-foreground: 222.2 84% 4.9%;
|
||||||
|
|
||||||
|
--popover: 0 0% 100%;
|
||||||
|
--popover-foreground: 222.2 84% 4.9%;
|
||||||
|
|
||||||
|
--primary: 222.2 47.4% 11.2%;
|
||||||
|
--primary-foreground: 210 40% 98%;
|
||||||
|
|
||||||
|
--secondary: 210 40% 96.1%;
|
||||||
|
--secondary-foreground: 222.2 47.4% 11.2%;
|
||||||
|
|
||||||
|
--muted: 210 40% 96.1%;
|
||||||
|
--muted-foreground: 215.4 16.3% 46.9%;
|
||||||
|
|
||||||
|
--accent: 210 40% 96.1%;
|
||||||
|
--accent-foreground: 222.2 47.4% 11.2%;
|
||||||
|
|
||||||
|
--destructive: 0 84.2% 60.2%;
|
||||||
|
--destructive-foreground: 210 40% 98%;
|
||||||
|
|
||||||
|
--border: 214.3 31.8% 91.4%;
|
||||||
|
--input: 214.3 31.8% 91.4%;
|
||||||
|
--ring: 222.2 84% 4.9%;
|
||||||
|
|
||||||
|
--radius: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark {
|
||||||
|
--background: 222.2 84% 4.9%;
|
||||||
|
--foreground: 210 40% 98%;
|
||||||
|
|
||||||
|
--card: 222.2 84% 4.9%;
|
||||||
|
--card-foreground: 210 40% 98%;
|
||||||
|
|
||||||
|
--popover: 222.2 84% 4.9%;
|
||||||
|
--popover-foreground: 210 40% 98%;
|
||||||
|
|
||||||
|
--primary: 210 40% 98%;
|
||||||
|
--primary-foreground: 222.2 47.4% 11.2%;
|
||||||
|
|
||||||
|
--secondary: 217.2 32.6% 17.5%;
|
||||||
|
--secondary-foreground: 210 40% 98%;
|
||||||
|
|
||||||
|
--muted: 217.2 32.6% 17.5%;
|
||||||
|
--muted-foreground: 215 20.2% 65.1%;
|
||||||
|
|
||||||
|
--accent: 217.2 32.6% 17.5%;
|
||||||
|
--accent-foreground: 210 40% 98%;
|
||||||
|
|
||||||
|
--destructive: 0 62.8% 30.6%;
|
||||||
|
--destructive-foreground: 210 40% 98%;
|
||||||
|
|
||||||
|
--border: 217.2 32.6% 17.5%;
|
||||||
|
--input: 217.2 32.6% 17.5%;
|
||||||
|
--ring: 212.7 26.8% 83.9%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@layer base {
|
||||||
|
* {
|
||||||
|
@apply border-border;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
@apply bg-background text-foreground;
|
||||||
|
}
|
||||||
|
}
|
34
frontend/src/app/layout.tsx
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import type { Metadata } from "next";
|
||||||
|
import { Geist, Geist_Mono } from "next/font/google";
|
||||||
|
import "./globals.css";
|
||||||
|
|
||||||
|
const geistSans = Geist({
|
||||||
|
variable: "--font-geist-sans",
|
||||||
|
subsets: ["latin"],
|
||||||
|
});
|
||||||
|
|
||||||
|
const geistMono = Geist_Mono({
|
||||||
|
variable: "--font-geist-mono",
|
||||||
|
subsets: ["latin"],
|
||||||
|
});
|
||||||
|
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: "Create Next App",
|
||||||
|
description: "Generated by create next app",
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function RootLayout({
|
||||||
|
children,
|
||||||
|
}: Readonly<{
|
||||||
|
children: React.ReactNode;
|
||||||
|
}>) {
|
||||||
|
return (
|
||||||
|
<html lang="en">
|
||||||
|
<body
|
||||||
|
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
);
|
||||||
|
}
|
26
frontend/src/app/page.tsx
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
'use client'
|
||||||
|
|
||||||
|
import { ServerStatus } from "@/components/server-status"
|
||||||
|
import { SearchForm } from "@/components/search-form"
|
||||||
|
import { SearchResults } from "@/components/search-results"
|
||||||
|
import { useState } from "react"
|
||||||
|
|
||||||
|
export default function Home() {
|
||||||
|
const [searchResults, setSearchResults] = useState([])
|
||||||
|
const [isSearching, setIsSearching] = useState(false)
|
||||||
|
|
||||||
|
const services = [
|
||||||
|
{ name: "Ollama", status: "running" as const },
|
||||||
|
{ name: "SearxNG", status: "running" as const },
|
||||||
|
{ name: "Supabase", status: "running" as const }
|
||||||
|
]
|
||||||
|
|
||||||
|
return (
|
||||||
|
<main className="container mx-auto p-4">
|
||||||
|
<h1 className="text-4xl font-bold text-center mb-8">Business Search</h1>
|
||||||
|
<SearchForm onSearch={setSearchResults} onSearchingChange={setIsSearching} />
|
||||||
|
<SearchResults results={searchResults} isLoading={isSearching} />
|
||||||
|
<ServerStatus services={services} />
|
||||||
|
</main>
|
||||||
|
)
|
||||||
|
}
|
79
frontend/src/components/search-form.tsx
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
import { Search } from "lucide-react"
|
||||||
|
import { useState } from "react"
|
||||||
|
|
||||||
|
interface SearchFormProps {
|
||||||
|
onSearch: (results: any[]) => void;
|
||||||
|
onSearchingChange: (isSearching: boolean) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function SearchForm({ onSearch, onSearchingChange }: SearchFormProps) {
|
||||||
|
const [query, setQuery] = useState("")
|
||||||
|
const [error, setError] = useState<string | null>(null)
|
||||||
|
|
||||||
|
const handleSearch = async (e: React.FormEvent) => {
|
||||||
|
e.preventDefault()
|
||||||
|
if (!query.trim()) return
|
||||||
|
|
||||||
|
setError(null)
|
||||||
|
onSearchingChange(true)
|
||||||
|
try {
|
||||||
|
const response = await fetch("/api/search", {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
body: JSON.stringify({ query: query.trim() }),
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error("Search failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await response.json()
|
||||||
|
onSearch(data.results || [])
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Search error:", error)
|
||||||
|
onSearch([])
|
||||||
|
setError("Failed to perform search. Please try again.")
|
||||||
|
} finally {
|
||||||
|
onSearchingChange(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="w-full max-w-2xl mx-auto mt-8 mb-12">
|
||||||
|
<div className="flex flex-col gap-4">
|
||||||
|
<div className="flex flex-col gap-2">
|
||||||
|
<label htmlFor="search" className="text-lg font-medium text-center">
|
||||||
|
Find local businesses
|
||||||
|
</label>
|
||||||
|
<form onSubmit={handleSearch} className="relative">
|
||||||
|
<input
|
||||||
|
id="search"
|
||||||
|
type="text"
|
||||||
|
value={query}
|
||||||
|
onChange={(e) => setQuery(e.target.value)}
|
||||||
|
placeholder="e.g. plumbers in Denver, CO"
|
||||||
|
className="w-full px-4 py-3 text-lg rounded-lg border border-border bg-background focus:outline-none focus:ring-2 focus:ring-primary"
|
||||||
|
/>
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
disabled={!query.trim()}
|
||||||
|
className="absolute right-2 top-1/2 -translate-y-1/2 p-3 rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
||||||
|
aria-label="Search"
|
||||||
|
>
|
||||||
|
<Search className="h-5 w-5" />
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
{error && (
|
||||||
|
<p className="text-sm text-destructive text-center">{error}</p>
|
||||||
|
)}
|
||||||
|
<p className="text-sm text-muted-foreground text-center mt-2">
|
||||||
|
Try searching for: restaurants, dentists, electricians, etc.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
76
frontend/src/components/search-results.tsx
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
interface Business {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
address: string;
|
||||||
|
phone: string;
|
||||||
|
website?: string;
|
||||||
|
email?: string;
|
||||||
|
description?: string;
|
||||||
|
rating?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SearchResultsProps {
|
||||||
|
results: Business[];
|
||||||
|
isLoading: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function SearchResults({ results, isLoading }: SearchResultsProps) {
|
||||||
|
if (isLoading) {
|
||||||
|
return (
|
||||||
|
<div className="w-full max-w-4xl mx-auto mt-8">
|
||||||
|
<div className="animate-pulse space-y-4">
|
||||||
|
{[...Array(3)].map((_, i) => (
|
||||||
|
<div key={i} className="bg-muted rounded-lg p-6">
|
||||||
|
<div className="h-4 bg-muted-foreground/20 rounded w-3/4 mb-4"></div>
|
||||||
|
<div className="h-3 bg-muted-foreground/20 rounded w-1/2"></div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!results.length) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="w-full max-w-4xl mx-auto mt-8">
|
||||||
|
<div className="space-y-4">
|
||||||
|
{results.map((business) => (
|
||||||
|
<div key={business.id} className="bg-card rounded-lg p-6 shadow-sm">
|
||||||
|
<h3 className="text-xl font-semibold mb-2">{business.name}</h3>
|
||||||
|
{business.address && (
|
||||||
|
<p className="text-muted-foreground mb-2">{business.address}</p>
|
||||||
|
)}
|
||||||
|
<div className="flex flex-wrap gap-4 text-sm">
|
||||||
|
{business.phone && (
|
||||||
|
<a
|
||||||
|
href={`tel:${business.phone}`}
|
||||||
|
className="text-primary hover:underline"
|
||||||
|
>
|
||||||
|
{business.phone}
|
||||||
|
</a>
|
||||||
|
)}
|
||||||
|
{business.website && (
|
||||||
|
<a
|
||||||
|
href={business.website}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="text-primary hover:underline"
|
||||||
|
>
|
||||||
|
Visit Website
|
||||||
|
</a>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
{business.description && (
|
||||||
|
<p className="mt-4 text-sm text-muted-foreground">
|
||||||
|
{business.description}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
59
frontend/src/components/server-status.tsx
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
import { CheckCircle2, XCircle, AlertCircle } from "lucide-react"
|
||||||
|
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"
|
||||||
|
|
||||||
|
interface ServiceStatus {
|
||||||
|
name: string
|
||||||
|
status: "running" | "error" | "warning"
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ServerStatusProps {
|
||||||
|
services: ServiceStatus[]
|
||||||
|
error?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export function ServerStatus({ services, error }: ServerStatusProps) {
|
||||||
|
if (error) {
|
||||||
|
return (
|
||||||
|
<Alert variant="destructive" className="max-w-md mx-auto mt-4">
|
||||||
|
<XCircle className="h-4 w-4" />
|
||||||
|
<AlertTitle>Server Error</AlertTitle>
|
||||||
|
<AlertDescription>{error}</AlertDescription>
|
||||||
|
</Alert>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="space-y-4 max-w-md mx-auto mt-4">
|
||||||
|
<h2 className="text-xl font-semibold text-center mb-6">Service Status</h2>
|
||||||
|
<div className="space-y-3">
|
||||||
|
{services.map((service) => (
|
||||||
|
<Alert
|
||||||
|
key={service.name}
|
||||||
|
variant={service.status === "error" ? "destructive" : "default"}
|
||||||
|
className="flex items-center justify-between hover:bg-accent/50 transition-colors"
|
||||||
|
>
|
||||||
|
<div className="flex items-center gap-3">
|
||||||
|
{service.status === "running" && (
|
||||||
|
<CheckCircle2 className="h-5 w-5 text-green-500 shrink-0" />
|
||||||
|
)}
|
||||||
|
{service.status === "error" && (
|
||||||
|
<XCircle className="h-5 w-5 text-red-500 shrink-0" />
|
||||||
|
)}
|
||||||
|
{service.status === "warning" && (
|
||||||
|
<AlertCircle className="h-5 w-5 text-yellow-500 shrink-0" />
|
||||||
|
)}
|
||||||
|
<AlertTitle className="font-medium">{service.name}</AlertTitle>
|
||||||
|
</div>
|
||||||
|
<span className={`text-sm ${
|
||||||
|
service.status === "running" ? "text-green-600" :
|
||||||
|
service.status === "error" ? "text-red-600" :
|
||||||
|
"text-yellow-600"
|
||||||
|
}`}>
|
||||||
|
{service.status.charAt(0).toUpperCase() + service.status.slice(1)}
|
||||||
|
</span>
|
||||||
|
</Alert>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
58
frontend/src/components/ui/alert.tsx
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
import * as React from "react"
|
||||||
|
import { cva, type VariantProps } from "class-variance-authority"
|
||||||
|
import { cn } from "@/lib/utils"
|
||||||
|
|
||||||
|
const alertVariants = cva(
|
||||||
|
"relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground",
|
||||||
|
{
|
||||||
|
variants: {
|
||||||
|
variant: {
|
||||||
|
default: "bg-background text-foreground",
|
||||||
|
destructive:
|
||||||
|
"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
defaultVariants: {
|
||||||
|
variant: "default",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
const Alert = React.forwardRef<
|
||||||
|
HTMLDivElement,
|
||||||
|
React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>
|
||||||
|
>(({ className, variant, ...props }, ref) => (
|
||||||
|
<div
|
||||||
|
ref={ref}
|
||||||
|
role="alert"
|
||||||
|
className={cn(alertVariants({ variant }), className)}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
))
|
||||||
|
Alert.displayName = "Alert"
|
||||||
|
|
||||||
|
const AlertTitle = React.forwardRef<
|
||||||
|
HTMLParagraphElement,
|
||||||
|
React.HTMLAttributes<HTMLHeadingElement>
|
||||||
|
>(({ className, ...props }, ref) => (
|
||||||
|
<h5
|
||||||
|
ref={ref}
|
||||||
|
className={cn("mb-1 font-medium leading-none tracking-tight", className)}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
))
|
||||||
|
AlertTitle.displayName = "AlertTitle"
|
||||||
|
|
||||||
|
const AlertDescription = React.forwardRef<
|
||||||
|
HTMLParagraphElement,
|
||||||
|
React.HTMLAttributes<HTMLParagraphElement>
|
||||||
|
>(({ className, ...props }, ref) => (
|
||||||
|
<div
|
||||||
|
ref={ref}
|
||||||
|
className={cn("text-sm [&_p]:leading-relaxed", className)}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
))
|
||||||
|
AlertDescription.displayName = "AlertDescription"
|
||||||
|
|
||||||
|
export { Alert, AlertTitle, AlertDescription }
|
6
frontend/src/lib/utils.ts
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import { type ClassValue, clsx } from "clsx"
|
||||||
|
import { twMerge } from "tailwind-merge"
|
||||||
|
|
||||||
|
export function cn(...inputs: ClassValue[]) {
|
||||||
|
return twMerge(clsx(inputs))
|
||||||
|
}
|
79
frontend/tailwind.config.ts
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
import type { Config } from "tailwindcss";
|
||||||
|
|
||||||
|
const config: Config = {
|
||||||
|
darkMode: ["class"],
|
||||||
|
content: [
|
||||||
|
'./pages/**/*.{ts,tsx}',
|
||||||
|
'./components/**/*.{ts,tsx}',
|
||||||
|
'./app/**/*.{ts,tsx}',
|
||||||
|
'./src/**/*.{ts,tsx}',
|
||||||
|
],
|
||||||
|
theme: {
|
||||||
|
container: {
|
||||||
|
center: true,
|
||||||
|
padding: "2rem",
|
||||||
|
screens: {
|
||||||
|
"2xl": "1400px",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
extend: {
|
||||||
|
colors: {
|
||||||
|
border: "hsl(var(--border))",
|
||||||
|
input: "hsl(var(--input))",
|
||||||
|
ring: "hsl(var(--ring))",
|
||||||
|
background: "hsl(var(--background))",
|
||||||
|
foreground: "hsl(var(--foreground))",
|
||||||
|
primary: {
|
||||||
|
DEFAULT: "hsl(var(--primary))",
|
||||||
|
foreground: "hsl(var(--primary-foreground))",
|
||||||
|
},
|
||||||
|
secondary: {
|
||||||
|
DEFAULT: "hsl(var(--secondary))",
|
||||||
|
foreground: "hsl(var(--secondary-foreground))",
|
||||||
|
},
|
||||||
|
destructive: {
|
||||||
|
DEFAULT: "hsl(var(--destructive))",
|
||||||
|
foreground: "hsl(var(--destructive-foreground))",
|
||||||
|
},
|
||||||
|
muted: {
|
||||||
|
DEFAULT: "hsl(var(--muted))",
|
||||||
|
foreground: "hsl(var(--muted-foreground))",
|
||||||
|
},
|
||||||
|
accent: {
|
||||||
|
DEFAULT: "hsl(var(--accent))",
|
||||||
|
foreground: "hsl(var(--accent-foreground))",
|
||||||
|
},
|
||||||
|
popover: {
|
||||||
|
DEFAULT: "hsl(var(--popover))",
|
||||||
|
foreground: "hsl(var(--popover-foreground))",
|
||||||
|
},
|
||||||
|
card: {
|
||||||
|
DEFAULT: "hsl(var(--card))",
|
||||||
|
foreground: "hsl(var(--card-foreground))",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
borderRadius: {
|
||||||
|
lg: "var(--radius)",
|
||||||
|
md: "calc(var(--radius) - 2px)",
|
||||||
|
sm: "calc(var(--radius) - 4px)",
|
||||||
|
},
|
||||||
|
keyframes: {
|
||||||
|
"accordion-down": {
|
||||||
|
from: { height: "0" },
|
||||||
|
to: { height: "var(--radix-accordion-content-height)" },
|
||||||
|
},
|
||||||
|
"accordion-up": {
|
||||||
|
from: { height: "var(--radix-accordion-content-height)" },
|
||||||
|
to: { height: "0" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
animation: {
|
||||||
|
"accordion-down": "accordion-down 0.2s ease-out",
|
||||||
|
"accordion-up": "accordion-up 0.2s ease-out",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
plugins: [require("tailwindcss-animate")],
|
||||||
|
}
|
||||||
|
|
||||||
|
export default config;
|
27
frontend/tsconfig.json
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ES2017",
|
||||||
|
"lib": ["dom", "dom.iterable", "esnext"],
|
||||||
|
"allowJs": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"strict": true,
|
||||||
|
"noEmit": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"module": "esnext",
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"jsx": "preserve",
|
||||||
|
"incremental": true,
|
||||||
|
"plugins": [
|
||||||
|
{
|
||||||
|
"name": "next"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"paths": {
|
||||||
|
"@/*": ["./src/*"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
||||||
|
"exclude": ["node_modules"]
|
||||||
|
}
|
17
jest.config.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
module.exports = {
|
||||||
|
preset: 'ts-jest',
|
||||||
|
testEnvironment: 'node',
|
||||||
|
roots: ['<rootDir>/src'],
|
||||||
|
testMatch: ['**/__tests__/**/*.ts', '**/?(*.)+(spec|test).ts'],
|
||||||
|
transform: {
|
||||||
|
'^.+\\.ts$': 'ts-jest',
|
||||||
|
},
|
||||||
|
moduleFileExtensions: ['ts', 'js', 'json', 'node'],
|
||||||
|
collectCoverageFrom: [
|
||||||
|
'src/**/*.{ts,js}',
|
||||||
|
'!src/tests/**',
|
||||||
|
'!**/node_modules/**',
|
||||||
|
],
|
||||||
|
coverageDirectory: 'coverage',
|
||||||
|
setupFilesAfterEnv: ['<rootDir>/src/tests/setup.ts'],
|
||||||
|
};
|
5
next-env.d.ts
vendored
@@ -1,5 +0,0 @@
|
|||||||
/// <reference types="next" />
|
|
||||||
/// <reference types="next/image-types/global" />
|
|
||||||
|
|
||||||
// NOTE: This file should not be edited
|
|
||||||
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
|
|
14318
package-lock.json
generated
Normal file
126
package.json
@@ -1,70 +1,80 @@
|
|||||||
{
|
{
|
||||||
"name": "perplexica-frontend",
|
"name": "perplexica-backend",
|
||||||
"version": "1.11.0-rc2",
|
"version": "1.10.0-rc2",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"author": "ItzCrazyKns",
|
"author": "ItzCrazyKns",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev",
|
"start": "ts-node src/index.ts",
|
||||||
"build": "npm run db:push && next build",
|
"build": "tsc",
|
||||||
"start": "next start",
|
"dev": "nodemon src/index.ts",
|
||||||
"lint": "next lint",
|
"db:push": "drizzle-kit push sqlite",
|
||||||
|
"format": "prettier . --check",
|
||||||
"format:write": "prettier . --write",
|
"format:write": "prettier . --write",
|
||||||
"db:push": "drizzle-kit push"
|
"test:search": "ts-node src/tests/testSearch.ts",
|
||||||
},
|
"test:supabase": "ts-node src/tests/supabaseTest.ts",
|
||||||
"dependencies": {
|
"test:deepseek": "ts-node src/tests/testDeepseek.ts",
|
||||||
"@headlessui/react": "^2.2.0",
|
"test:ollama": "ts-node src/tests/testOllama.ts",
|
||||||
"@iarna/toml": "^2.2.5",
|
"test": "jest",
|
||||||
"@icons-pack/react-simple-icons": "^12.3.0",
|
"test:watch": "jest --watch",
|
||||||
"@langchain/anthropic": "^0.3.24",
|
"test:coverage": "jest --coverage",
|
||||||
"@langchain/community": "^0.3.49",
|
"build:css": "tailwindcss -i ./src/styles/input.css -o ./public/styles/output.css",
|
||||||
"@langchain/core": "^0.3.66",
|
"watch:css": "tailwindcss -i ./src/styles/input.css -o ./public/styles/output.css --watch"
|
||||||
"@langchain/google-genai": "^0.2.15",
|
|
||||||
"@langchain/groq": "^0.2.3",
|
|
||||||
"@langchain/ollama": "^0.2.3",
|
|
||||||
"@langchain/openai": "^0.6.2",
|
|
||||||
"@langchain/textsplitters": "^0.1.0",
|
|
||||||
"@tailwindcss/typography": "^0.5.12",
|
|
||||||
"@xenova/transformers": "^2.17.2",
|
|
||||||
"axios": "^1.8.3",
|
|
||||||
"better-sqlite3": "^11.9.1",
|
|
||||||
"clsx": "^2.1.0",
|
|
||||||
"compute-cosine-similarity": "^1.1.0",
|
|
||||||
"compute-dot": "^1.1.0",
|
|
||||||
"drizzle-orm": "^0.40.1",
|
|
||||||
"html-to-text": "^9.0.5",
|
|
||||||
"jspdf": "^3.0.1",
|
|
||||||
"langchain": "^0.3.30",
|
|
||||||
"lucide-react": "^0.363.0",
|
|
||||||
"mammoth": "^1.9.1",
|
|
||||||
"markdown-to-jsx": "^7.7.2",
|
|
||||||
"next": "^15.2.2",
|
|
||||||
"next-themes": "^0.3.0",
|
|
||||||
"pdf-parse": "^1.1.1",
|
|
||||||
"react": "^18",
|
|
||||||
"react-dom": "^18",
|
|
||||||
"react-text-to-speech": "^0.14.5",
|
|
||||||
"react-textarea-autosize": "^8.5.3",
|
|
||||||
"sonner": "^1.4.41",
|
|
||||||
"tailwind-merge": "^2.2.2",
|
|
||||||
"winston": "^3.17.0",
|
|
||||||
"yet-another-react-lightbox": "^3.17.2",
|
|
||||||
"zod": "^3.22.4"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/better-sqlite3": "^7.6.12",
|
"@testing-library/jest-dom": "^6.1.5",
|
||||||
|
"@types/better-sqlite3": "^7.6.10",
|
||||||
|
"@types/cors": "^2.8.17",
|
||||||
|
"@types/express": "^4.17.21",
|
||||||
"@types/html-to-text": "^9.0.4",
|
"@types/html-to-text": "^9.0.4",
|
||||||
"@types/jspdf": "^2.0.0",
|
"@types/jest": "^29.5.11",
|
||||||
"@types/node": "^20",
|
"@types/multer": "^1.4.12",
|
||||||
|
"@types/node-fetch": "^2.6.12",
|
||||||
"@types/pdf-parse": "^1.1.4",
|
"@types/pdf-parse": "^1.1.4",
|
||||||
"@types/react": "^18",
|
"@types/readable-stream": "^4.0.11",
|
||||||
"@types/react-dom": "^18",
|
"@types/supertest": "^6.0.2",
|
||||||
"autoprefixer": "^10.0.1",
|
"@types/ws": "^8.5.12",
|
||||||
"drizzle-kit": "^0.30.5",
|
"autoprefixer": "^10.4.20",
|
||||||
"eslint": "^8",
|
"drizzle-kit": "^0.22.7",
|
||||||
"eslint-config-next": "14.1.4",
|
"jest": "^29.7.0",
|
||||||
"postcss": "^8",
|
"nodemon": "^3.1.0",
|
||||||
|
"postcss": "^8.4.49",
|
||||||
"prettier": "^3.2.5",
|
"prettier": "^3.2.5",
|
||||||
"tailwindcss": "^3.3.0",
|
"supertest": "^7.0.0",
|
||||||
"typescript": "^5"
|
"tailwindcss": "^3.4.17",
|
||||||
|
"ts-jest": "^29.1.1",
|
||||||
|
"ts-node": "^10.9.2",
|
||||||
|
"typescript": "^5.4.3"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@huggingface/transformers": "latest",
|
||||||
|
"@iarna/toml": "^2.2.5",
|
||||||
|
"@langchain/anthropic": "^0.2.3",
|
||||||
|
"@langchain/community": "^0.2.16",
|
||||||
|
"@langchain/google-genai": "^0.0.23",
|
||||||
|
"@langchain/openai": "^0.0.25",
|
||||||
|
"@shadcn/ui": "^0.0.4",
|
||||||
|
"@supabase/supabase-js": "^2.47.10",
|
||||||
|
"@xenova/transformers": "^2.17.1",
|
||||||
|
"axios": "^1.6.8",
|
||||||
|
"better-sqlite3": "^11.7.0",
|
||||||
|
"cheerio": "^1.0.0",
|
||||||
|
"compute-cosine-similarity": "^1.1.0",
|
||||||
|
"compute-dot": "^1.1.0",
|
||||||
|
"cors": "^2.8.5",
|
||||||
|
"dotenv": "^16.4.7",
|
||||||
|
"drizzle-orm": "^0.31.2",
|
||||||
|
"express": "^4.19.2",
|
||||||
|
"html-to-text": "^9.0.5",
|
||||||
|
"langchain": "^0.1.30",
|
||||||
|
"mammoth": "^1.8.0",
|
||||||
|
"multer": "^1.4.5-lts.1",
|
||||||
|
"node-fetch": "^2.7.0",
|
||||||
|
"pdf-parse": "^1.1.1",
|
||||||
|
"robots-parser": "^3.0.1",
|
||||||
|
"tesseract.js": "^4.1.4",
|
||||||
|
"torch": "latest",
|
||||||
|
"winston": "^3.13.0",
|
||||||
|
"ws": "^8.17.1",
|
||||||
|
"zod": "^3.24.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -3,4 +3,4 @@ module.exports = {
|
|||||||
tailwindcss: {},
|
tailwindcss: {},
|
||||||
autoprefixer: {},
|
autoprefixer: {},
|
||||||
},
|
},
|
||||||
};
|
}
|
||||||
|
Before Width: | Height: | Size: 916 B |
Before Width: | Height: | Size: 515 B |
BIN
public/icon.png
Before Width: | Height: | Size: 30 KiB |
214
public/index.html
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en" class="h-full bg-gray-50">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>OffMarket Pro - Business Search</title>
|
||||||
|
<link href="/styles/output.css" rel="stylesheet">
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body class="min-h-full">
|
||||||
|
<div class="bg-white">
|
||||||
|
<!-- Navigation -->
|
||||||
|
<nav class="bg-white shadow-sm">
|
||||||
|
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||||
|
<div class="flex h-16 justify-between items-center">
|
||||||
|
<div class="flex-shrink-0 flex items-center">
|
||||||
|
<h1 class="text-xl font-bold text-gray-900">OffMarket Pro</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<!-- Main Content -->
|
||||||
|
<main class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 py-8">
|
||||||
|
<!-- Search Form -->
|
||||||
|
<div class="mb-8">
|
||||||
|
<h2 class="text-2xl font-bold text-gray-900 mb-6">Find Off-Market Property Services</h2>
|
||||||
|
<div class="grid grid-cols-1 gap-4 sm:grid-cols-2">
|
||||||
|
<div>
|
||||||
|
<label for="searchQuery" class="block text-sm font-medium text-gray-700">Service Type</label>
|
||||||
|
<input type="text" id="searchQuery" class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-primary focus:ring-primary sm:text-sm" placeholder="e.g. plumber, electrician">
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="searchLocation" class="block text-sm font-medium text-gray-700">Location</label>
|
||||||
|
<input type="text" id="searchLocation" class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-primary focus:ring-primary sm:text-sm" placeholder="e.g. Denver, CO">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-4">
|
||||||
|
<button onclick="performSearch()" class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary hover:bg-primary-hover focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary">
|
||||||
|
Search
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Progress Indicator -->
|
||||||
|
<div id="searchProgress" class="hidden mb-8">
|
||||||
|
<div class="bg-white shadow sm:rounded-lg">
|
||||||
|
<div class="px-4 py-5 sm:p-6">
|
||||||
|
<h3 class="text-lg font-medium leading-6 text-gray-900">Search Progress</h3>
|
||||||
|
<div class="mt-4">
|
||||||
|
<div class="relative pt-1">
|
||||||
|
<div class="overflow-hidden h-2 mb-4 text-xs flex rounded bg-gray-200">
|
||||||
|
<div id="progressBar" class="shadow-none flex flex-col text-center whitespace-nowrap text-white justify-center bg-primary transition-all duration-500" style="width: 0%"></div>
|
||||||
|
</div>
|
||||||
|
<div id="progressText" class="text-sm text-gray-600"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Error Display -->
|
||||||
|
<div id="errorDisplay" class="hidden mb-8">
|
||||||
|
<div class="rounded-md bg-red-50 p-4">
|
||||||
|
<div class="flex">
|
||||||
|
<div class="flex-shrink-0">
|
||||||
|
<svg class="h-5 w-5 text-red-400" viewBox="0 0 20 20" fill="currentColor">
|
||||||
|
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<div class="ml-3">
|
||||||
|
<h3 class="text-sm font-medium text-red-800">Error</h3>
|
||||||
|
<div class="mt-2 text-sm text-red-700">
|
||||||
|
<p id="errorMessage"></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Results Table -->
|
||||||
|
<div id="resultsContainer" class="hidden">
|
||||||
|
<div class="bg-white shadow overflow-hidden sm:rounded-lg">
|
||||||
|
<div class="px-4 py-5 sm:px-6">
|
||||||
|
<h3 class="text-lg leading-6 font-medium text-gray-900">Search Results</h3>
|
||||||
|
</div>
|
||||||
|
<div class="border-t border-gray-200">
|
||||||
|
<div class="overflow-x-auto">
|
||||||
|
<table class="min-w-full divide-y divide-gray-200">
|
||||||
|
<thead class="bg-gray-50">
|
||||||
|
<tr>
|
||||||
|
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Business</th>
|
||||||
|
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Contact</th>
|
||||||
|
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Actions</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody id="resultsBody" class="bg-white divide-y divide-gray-200">
|
||||||
|
<!-- Results will be inserted here -->
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
class SearchProgress {
|
||||||
|
constructor() {
|
||||||
|
this.progressBar = document.getElementById('progressBar');
|
||||||
|
this.progressText = document.getElementById('progressText');
|
||||||
|
this.container = document.getElementById('searchProgress');
|
||||||
|
}
|
||||||
|
|
||||||
|
show() {
|
||||||
|
this.container.classList.remove('hidden');
|
||||||
|
this.setProgress(0, 'Starting search...');
|
||||||
|
}
|
||||||
|
|
||||||
|
hide() {
|
||||||
|
this.container.classList.add('hidden');
|
||||||
|
}
|
||||||
|
|
||||||
|
setProgress(percent, message) {
|
||||||
|
this.progressBar.style.width = `${percent}%`;
|
||||||
|
this.progressText.textContent = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
showError(message) {
|
||||||
|
this.setProgress(100, `Error: ${message}`);
|
||||||
|
this.progressBar.classList.remove('bg-primary');
|
||||||
|
this.progressBar.classList.add('bg-red-500');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function performSearch() {
|
||||||
|
const query = document.getElementById('searchQuery').value;
|
||||||
|
const location = document.getElementById('searchLocation').value;
|
||||||
|
|
||||||
|
if (!query || !location) {
|
||||||
|
showError('Please enter both search query and location');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const progress = new SearchProgress();
|
||||||
|
progress.show();
|
||||||
|
|
||||||
|
try {
|
||||||
|
document.getElementById('errorDisplay').classList.add('hidden');
|
||||||
|
document.getElementById('resultsContainer').classList.add('hidden');
|
||||||
|
|
||||||
|
const response = await fetch('/api/search', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify({ query, location })
|
||||||
|
});
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
|
||||||
|
if (!data.success) {
|
||||||
|
throw new Error(data.error || 'Search failed');
|
||||||
|
}
|
||||||
|
|
||||||
|
displayResults(data.results);
|
||||||
|
progress.hide();
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Search error:', error);
|
||||||
|
progress.showError(error.message);
|
||||||
|
showError(error.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showError(message) {
|
||||||
|
const errorDisplay = document.getElementById('errorDisplay');
|
||||||
|
const errorMessage = document.getElementById('errorMessage');
|
||||||
|
errorMessage.textContent = message;
|
||||||
|
errorDisplay.classList.remove('hidden');
|
||||||
|
}
|
||||||
|
|
||||||
|
function displayResults(results) {
|
||||||
|
const container = document.getElementById('resultsContainer');
|
||||||
|
const tbody = document.getElementById('resultsBody');
|
||||||
|
|
||||||
|
tbody.innerHTML = results.map(business => `
|
||||||
|
<tr>
|
||||||
|
<td class="px-6 py-4">
|
||||||
|
<div class="text-sm font-medium text-gray-900">${business.name}</div>
|
||||||
|
<div class="text-sm text-gray-500">${business.description}</div>
|
||||||
|
</td>
|
||||||
|
<td class="px-6 py-4">
|
||||||
|
<div class="text-sm text-gray-900">${business.address}</div>
|
||||||
|
<div class="text-sm text-gray-500">${business.phone}</div>
|
||||||
|
</td>
|
||||||
|
<td class="px-6 py-4">
|
||||||
|
${business.website ?
|
||||||
|
`<a href="${business.website}" target="_blank"
|
||||||
|
class="inline-flex items-center px-3 py-2 border border-transparent text-sm leading-4 font-medium rounded-md text-white bg-primary hover:bg-primary-hover focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary">
|
||||||
|
Visit Website
|
||||||
|
</a>` :
|
||||||
|
'<span class="text-sm text-gray-500">No website available</span>'
|
||||||
|
}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
`).join('');
|
||||||
|
|
||||||
|
container.classList.remove('hidden');
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
Before Width: | Height: | Size: 183 KiB |
Before Width: | Height: | Size: 130 KiB |
Before Width: | Height: | Size: 627 KiB |
Before Width: | Height: | Size: 202 KiB |
@@ -1,131 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 4.9 KiB |
@@ -1,159 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 6.7 KiB |
@@ -1,178 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 6.8 KiB |
@@ -1,206 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 8.6 KiB |
@@ -1,244 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 8.0 KiB |
@@ -1,309 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 11 KiB |
@@ -1,204 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 7.3 KiB |
@@ -1,269 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 11 KiB |
@@ -1,141 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 7.6 KiB |
@@ -1,179 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 7.4 KiB |
@@ -1,243 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 10 KiB |
@@ -1,204 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 8.8 KiB |
@@ -1,256 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 11 KiB |
@@ -1,206 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 9.3 KiB |
@@ -1,270 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 12 KiB |
@@ -1,374 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 13 KiB |
@@ -1,283 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 11 KiB |
@@ -1,307 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 13 KiB |
@@ -1,241 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 9.6 KiB |
@@ -1,269 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 11 KiB |
@@ -1,273 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 11 KiB |
@@ -1,301 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 13 KiB |
@@ -1,334 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 15 KiB |
@@ -1,361 +0,0 @@
|
|||||||
<?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>
|
|
Before Width: | Height: | Size: 17 KiB |
@@ -1,35 +1,14 @@
|
|||||||
[GENERAL]
|
[GENERAL]
|
||||||
|
PORT = 3001 # Port to run the server on
|
||||||
SIMILARITY_MEASURE = "cosine" # "cosine" or "dot"
|
SIMILARITY_MEASURE = "cosine" # "cosine" or "dot"
|
||||||
KEEP_ALIVE = "5m" # How long to keep Ollama models loaded into memory. (Instead of using -1 use "-1m")
|
KEEP_ALIVE = "5m" # How long to keep Ollama models loaded into memory. (Instead of using -1 use "-1m")
|
||||||
|
|
||||||
[MODELS.OPENAI]
|
[API_KEYS]
|
||||||
API_KEY = ""
|
OPENAI = "" # OpenAI API key - sk-1234567890abcdef1234567890abcdef
|
||||||
|
GROQ = "" # Groq API key - gsk_1234567890abcdef1234567890abcdef
|
||||||
[MODELS.GROQ]
|
ANTHROPIC = "" # Anthropic API key - sk-ant-1234567890abcdef1234567890abcdef
|
||||||
API_KEY = ""
|
GEMINI = "" # Gemini API key - sk-1234567890abcdef1234567890abcdef
|
||||||
|
|
||||||
[MODELS.ANTHROPIC]
|
|
||||||
API_KEY = ""
|
|
||||||
|
|
||||||
[MODELS.GEMINI]
|
|
||||||
API_KEY = ""
|
|
||||||
|
|
||||||
[MODELS.CUSTOM_OPENAI]
|
|
||||||
API_KEY = ""
|
|
||||||
API_URL = ""
|
|
||||||
MODEL_NAME = ""
|
|
||||||
|
|
||||||
[MODELS.OLLAMA]
|
|
||||||
API_URL = "" # Ollama API URL - http://host.docker.internal:11434
|
|
||||||
|
|
||||||
[MODELS.DEEPSEEK]
|
|
||||||
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 = "http://localhost:32768" # SearxNG API URL
|
||||||
|
OLLAMA = "" # Ollama API URL - http://host.docker.internal:11434
|
@@ -11,7 +11,49 @@ search:
|
|||||||
|
|
||||||
server:
|
server:
|
||||||
secret_key: 'a2fb23f1b02e6ee83875b09826990de0f6bd908b6638e8c10277d415f6ab852b' # Is overwritten by ${SEARXNG_SECRET}
|
secret_key: 'a2fb23f1b02e6ee83875b09826990de0f6bd908b6638e8c10277d415f6ab852b' # Is overwritten by ${SEARXNG_SECRET}
|
||||||
|
port: 8080
|
||||||
|
bind_address: "0.0.0.0"
|
||||||
|
base_url: http://localhost:8080/
|
||||||
|
|
||||||
engines:
|
engines:
|
||||||
- name: wolframalpha
|
- name: wolframalpha
|
||||||
disabled: false
|
disabled: false
|
||||||
|
|
||||||
|
- name: google
|
||||||
|
engine: google
|
||||||
|
shortcut: g
|
||||||
|
disabled: false
|
||||||
|
|
||||||
|
- name: bing
|
||||||
|
engine: bing
|
||||||
|
shortcut: b
|
||||||
|
disabled: false
|
||||||
|
|
||||||
|
- name: duckduckgo
|
||||||
|
engine: duckduckgo
|
||||||
|
shortcut: d
|
||||||
|
disabled: false
|
||||||
|
|
||||||
|
- name: yelp
|
||||||
|
engine: yelp
|
||||||
|
shortcut: y
|
||||||
|
disabled: false
|
||||||
|
|
||||||
|
ui:
|
||||||
|
static_path: ""
|
||||||
|
templates_path: ""
|
||||||
|
default_theme: simple
|
||||||
|
default_locale: en
|
||||||
|
results_on_new_tab: false
|
||||||
|
|
||||||
|
outgoing:
|
||||||
|
request_timeout: 6.0
|
||||||
|
max_request_timeout: 10.0
|
||||||
|
pool_connections: 100
|
||||||
|
pool_maxsize: 10
|
||||||
|
enable_http2: true
|
||||||
|
|
||||||
|
server:
|
||||||
|
limiter: false
|
||||||
|
image_proxy: false
|
||||||
|
http_protocol_version: "1.0"
|
||||||
|
16
src/app.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import express from 'express';
|
||||||
|
import cors from 'cors';
|
||||||
|
import searchRoutes from './routes/search';
|
||||||
|
import businessRoutes from './routes/business';
|
||||||
|
|
||||||
|
const app = express();
|
||||||
|
|
||||||
|
// Middleware
|
||||||
|
app.use(cors());
|
||||||
|
app.use(express.json());
|
||||||
|
|
||||||
|
// Routes
|
||||||
|
app.use('/api/search', searchRoutes);
|
||||||
|
app.use('/api/business', businessRoutes);
|
||||||
|
|
||||||
|
export default app;
|
@@ -1,310 +0,0 @@
|
|||||||
import crypto from 'crypto';
|
|
||||||
import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages';
|
|
||||||
import { EventEmitter } from 'stream';
|
|
||||||
import {
|
|
||||||
getAvailableChatModelProviders,
|
|
||||||
getAvailableEmbeddingModelProviders,
|
|
||||||
} from '@/lib/providers';
|
|
||||||
import db from '@/lib/db';
|
|
||||||
import { chats, messages as messagesSchema } from '@/lib/db/schema';
|
|
||||||
import { and, eq, gt } from 'drizzle-orm';
|
|
||||||
import { getFileDetails } from '@/lib/utils/files';
|
|
||||||
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
|
||||||
import { ChatOpenAI } from '@langchain/openai';
|
|
||||||
import {
|
|
||||||
getCustomOpenaiApiKey,
|
|
||||||
getCustomOpenaiApiUrl,
|
|
||||||
getCustomOpenaiModelName,
|
|
||||||
} from '@/lib/config';
|
|
||||||
import { searchHandlers } from '@/lib/search';
|
|
||||||
|
|
||||||
export const runtime = 'nodejs';
|
|
||||||
export const dynamic = 'force-dynamic';
|
|
||||||
|
|
||||||
type Message = {
|
|
||||||
messageId: string;
|
|
||||||
chatId: string;
|
|
||||||
content: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
type ChatModel = {
|
|
||||||
provider: string;
|
|
||||||
name: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
type EmbeddingModel = {
|
|
||||||
provider: string;
|
|
||||||
name: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
type Body = {
|
|
||||||
message: Message;
|
|
||||||
optimizationMode: 'speed' | 'balanced' | 'quality';
|
|
||||||
focusMode: string;
|
|
||||||
history: Array<[string, string]>;
|
|
||||||
files: Array<string>;
|
|
||||||
chatModel: ChatModel;
|
|
||||||
embeddingModel: EmbeddingModel;
|
|
||||||
systemInstructions: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleEmitterEvents = async (
|
|
||||||
stream: EventEmitter,
|
|
||||||
writer: WritableStreamDefaultWriter,
|
|
||||||
encoder: TextEncoder,
|
|
||||||
aiMessageId: string,
|
|
||||||
chatId: string,
|
|
||||||
) => {
|
|
||||||
let recievedMessage = '';
|
|
||||||
let sources: any[] = [];
|
|
||||||
|
|
||||||
stream.on('data', (data) => {
|
|
||||||
const parsedData = JSON.parse(data);
|
|
||||||
if (parsedData.type === 'response') {
|
|
||||||
writer.write(
|
|
||||||
encoder.encode(
|
|
||||||
JSON.stringify({
|
|
||||||
type: 'message',
|
|
||||||
data: parsedData.data,
|
|
||||||
messageId: aiMessageId,
|
|
||||||
}) + '\n',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
recievedMessage += parsedData.data;
|
|
||||||
} else if (parsedData.type === 'sources') {
|
|
||||||
writer.write(
|
|
||||||
encoder.encode(
|
|
||||||
JSON.stringify({
|
|
||||||
type: 'sources',
|
|
||||||
data: parsedData.data,
|
|
||||||
messageId: aiMessageId,
|
|
||||||
}) + '\n',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
sources = parsedData.data;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
stream.on('end', () => {
|
|
||||||
writer.write(
|
|
||||||
encoder.encode(
|
|
||||||
JSON.stringify({
|
|
||||||
type: 'messageEnd',
|
|
||||||
messageId: aiMessageId,
|
|
||||||
}) + '\n',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
writer.close();
|
|
||||||
|
|
||||||
db.insert(messagesSchema)
|
|
||||||
.values({
|
|
||||||
content: recievedMessage,
|
|
||||||
chatId: chatId,
|
|
||||||
messageId: aiMessageId,
|
|
||||||
role: 'assistant',
|
|
||||||
metadata: JSON.stringify({
|
|
||||||
createdAt: new Date(),
|
|
||||||
...(sources && sources.length > 0 && { sources }),
|
|
||||||
}),
|
|
||||||
})
|
|
||||||
.execute();
|
|
||||||
});
|
|
||||||
stream.on('error', (data) => {
|
|
||||||
const parsedData = JSON.parse(data);
|
|
||||||
writer.write(
|
|
||||||
encoder.encode(
|
|
||||||
JSON.stringify({
|
|
||||||
type: 'error',
|
|
||||||
data: parsedData.data,
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
writer.close();
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleHistorySave = async (
|
|
||||||
message: Message,
|
|
||||||
humanMessageId: string,
|
|
||||||
focusMode: string,
|
|
||||||
files: string[],
|
|
||||||
) => {
|
|
||||||
const chat = await db.query.chats.findFirst({
|
|
||||||
where: eq(chats.id, message.chatId),
|
|
||||||
});
|
|
||||||
|
|
||||||
const fileData = files.map(getFileDetails);
|
|
||||||
|
|
||||||
if (!chat) {
|
|
||||||
await db
|
|
||||||
.insert(chats)
|
|
||||||
.values({
|
|
||||||
id: message.chatId,
|
|
||||||
title: message.content,
|
|
||||||
createdAt: new Date().toString(),
|
|
||||||
focusMode: focusMode,
|
|
||||||
files: fileData,
|
|
||||||
})
|
|
||||||
.execute();
|
|
||||||
} else if (JSON.stringify(chat.files ?? []) != JSON.stringify(fileData)) {
|
|
||||||
db.update(chats)
|
|
||||||
.set({
|
|
||||||
files: files.map(getFileDetails),
|
|
||||||
})
|
|
||||||
.where(eq(chats.id, message.chatId));
|
|
||||||
}
|
|
||||||
|
|
||||||
const messageExists = await db.query.messages.findFirst({
|
|
||||||
where: eq(messagesSchema.messageId, humanMessageId),
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!messageExists) {
|
|
||||||
await db
|
|
||||||
.insert(messagesSchema)
|
|
||||||
.values({
|
|
||||||
content: message.content,
|
|
||||||
chatId: message.chatId,
|
|
||||||
messageId: humanMessageId,
|
|
||||||
role: 'user',
|
|
||||||
metadata: JSON.stringify({
|
|
||||||
createdAt: new Date(),
|
|
||||||
}),
|
|
||||||
})
|
|
||||||
.execute();
|
|
||||||
} else {
|
|
||||||
await db
|
|
||||||
.delete(messagesSchema)
|
|
||||||
.where(
|
|
||||||
and(
|
|
||||||
gt(messagesSchema.id, messageExists.id),
|
|
||||||
eq(messagesSchema.chatId, message.chatId),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.execute();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const POST = async (req: Request) => {
|
|
||||||
try {
|
|
||||||
const body = (await req.json()) as Body;
|
|
||||||
const { message } = body;
|
|
||||||
|
|
||||||
if (message.content === '') {
|
|
||||||
return Response.json(
|
|
||||||
{
|
|
||||||
message: 'Please provide a message to process',
|
|
||||||
},
|
|
||||||
{ status: 400 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const [chatModelProviders, embeddingModelProviders] = await Promise.all([
|
|
||||||
getAvailableChatModelProviders(),
|
|
||||||
getAvailableEmbeddingModelProviders(),
|
|
||||||
]);
|
|
||||||
|
|
||||||
const chatModelProvider =
|
|
||||||
chatModelProviders[
|
|
||||||
body.chatModel?.provider || Object.keys(chatModelProviders)[0]
|
|
||||||
];
|
|
||||||
const chatModel =
|
|
||||||
chatModelProvider[
|
|
||||||
body.chatModel?.name || Object.keys(chatModelProvider)[0]
|
|
||||||
];
|
|
||||||
|
|
||||||
const embeddingProvider =
|
|
||||||
embeddingModelProviders[
|
|
||||||
body.embeddingModel?.provider || Object.keys(embeddingModelProviders)[0]
|
|
||||||
];
|
|
||||||
const embeddingModel =
|
|
||||||
embeddingProvider[
|
|
||||||
body.embeddingModel?.name || Object.keys(embeddingProvider)[0]
|
|
||||||
];
|
|
||||||
|
|
||||||
let llm: BaseChatModel | undefined;
|
|
||||||
let embedding = embeddingModel.model;
|
|
||||||
|
|
||||||
if (body.chatModel?.provider === 'custom_openai') {
|
|
||||||
llm = new ChatOpenAI({
|
|
||||||
apiKey: getCustomOpenaiApiKey(),
|
|
||||||
modelName: getCustomOpenaiModelName(),
|
|
||||||
temperature: 0.7,
|
|
||||||
configuration: {
|
|
||||||
baseURL: getCustomOpenaiApiUrl(),
|
|
||||||
},
|
|
||||||
}) as unknown as BaseChatModel;
|
|
||||||
} else if (chatModelProvider && chatModel) {
|
|
||||||
llm = chatModel.model;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!llm) {
|
|
||||||
return Response.json({ error: 'Invalid chat model' }, { status: 400 });
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!embedding) {
|
|
||||||
return Response.json(
|
|
||||||
{ error: 'Invalid embedding model' },
|
|
||||||
{ status: 400 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const humanMessageId =
|
|
||||||
message.messageId ?? crypto.randomBytes(7).toString('hex');
|
|
||||||
const aiMessageId = crypto.randomBytes(7).toString('hex');
|
|
||||||
|
|
||||||
const history: BaseMessage[] = body.history.map((msg) => {
|
|
||||||
if (msg[0] === 'human') {
|
|
||||||
return new HumanMessage({
|
|
||||||
content: msg[1],
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
return new AIMessage({
|
|
||||||
content: msg[1],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const handler = searchHandlers[body.focusMode];
|
|
||||||
|
|
||||||
if (!handler) {
|
|
||||||
return Response.json(
|
|
||||||
{
|
|
||||||
message: 'Invalid focus mode',
|
|
||||||
},
|
|
||||||
{ status: 400 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const stream = await handler.searchAndAnswer(
|
|
||||||
message.content,
|
|
||||||
history,
|
|
||||||
llm,
|
|
||||||
embedding,
|
|
||||||
body.optimizationMode,
|
|
||||||
body.files,
|
|
||||||
body.systemInstructions,
|
|
||||||
);
|
|
||||||
|
|
||||||
const responseStream = new TransformStream();
|
|
||||||
const writer = responseStream.writable.getWriter();
|
|
||||||
const encoder = new TextEncoder();
|
|
||||||
|
|
||||||
handleEmitterEvents(stream, writer, encoder, aiMessageId, message.chatId);
|
|
||||||
handleHistorySave(message, humanMessageId, body.focusMode, body.files);
|
|
||||||
|
|
||||||
return new Response(responseStream.readable, {
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'text/event-stream',
|
|
||||||
Connection: 'keep-alive',
|
|
||||||
'Cache-Control': 'no-cache, no-transform',
|
|
||||||
},
|
|
||||||
});
|
|
||||||
} catch (err) {
|
|
||||||
console.error('An error occurred while processing chat request:', err);
|
|
||||||
return Response.json(
|
|
||||||
{ message: 'An error occurred while processing chat request' },
|
|
||||||
{ status: 500 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
@@ -1,69 +0,0 @@
|
|||||||
import db from '@/lib/db';
|
|
||||||
import { chats, messages } from '@/lib/db/schema';
|
|
||||||
import { eq } from 'drizzle-orm';
|
|
||||||
|
|
||||||
export const GET = async (
|
|
||||||
req: Request,
|
|
||||||
{ params }: { params: Promise<{ id: string }> },
|
|
||||||
) => {
|
|
||||||
try {
|
|
||||||
const { id } = await params;
|
|
||||||
|
|
||||||
const chatExists = await db.query.chats.findFirst({
|
|
||||||
where: eq(chats.id, id),
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!chatExists) {
|
|
||||||
return Response.json({ message: 'Chat not found' }, { status: 404 });
|
|
||||||
}
|
|
||||||
|
|
||||||
const chatMessages = await db.query.messages.findMany({
|
|
||||||
where: eq(messages.chatId, id),
|
|
||||||
});
|
|
||||||
|
|
||||||
return Response.json(
|
|
||||||
{
|
|
||||||
chat: chatExists,
|
|
||||||
messages: chatMessages,
|
|
||||||
},
|
|
||||||
{ status: 200 },
|
|
||||||
);
|
|
||||||
} catch (err) {
|
|
||||||
console.error('Error in getting chat by id: ', err);
|
|
||||||
return Response.json(
|
|
||||||
{ message: 'An error has occurred.' },
|
|
||||||
{ status: 500 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const DELETE = async (
|
|
||||||
req: Request,
|
|
||||||
{ params }: { params: Promise<{ id: string }> },
|
|
||||||
) => {
|
|
||||||
try {
|
|
||||||
const { id } = await params;
|
|
||||||
|
|
||||||
const chatExists = await db.query.chats.findFirst({
|
|
||||||
where: eq(chats.id, id),
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!chatExists) {
|
|
||||||
return Response.json({ message: 'Chat not found' }, { status: 404 });
|
|
||||||
}
|
|
||||||
|
|
||||||
await db.delete(chats).where(eq(chats.id, id)).execute();
|
|
||||||
await db.delete(messages).where(eq(messages.chatId, id)).execute();
|
|
||||||
|
|
||||||
return Response.json(
|
|
||||||
{ message: 'Chat deleted successfully' },
|
|
||||||
{ status: 200 },
|
|
||||||
);
|
|
||||||
} catch (err) {
|
|
||||||
console.error('Error in deleting chat by id: ', err);
|
|
||||||
return Response.json(
|
|
||||||
{ message: 'An error has occurred.' },
|
|
||||||
{ status: 500 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
@@ -1,15 +0,0 @@
|
|||||||
import db from '@/lib/db';
|
|
||||||
|
|
||||||
export const GET = async (req: Request) => {
|
|
||||||
try {
|
|
||||||
let chats = await db.query.chats.findMany();
|
|
||||||
chats = chats.reverse();
|
|
||||||
return Response.json({ chats: chats }, { status: 200 });
|
|
||||||
} catch (err) {
|
|
||||||
console.error('Error in getting chats: ', err);
|
|
||||||
return Response.json(
|
|
||||||
{ message: 'An error has occurred.' },
|
|
||||||
{ status: 500 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
@@ -1,127 +0,0 @@
|
|||||||
import {
|
|
||||||
getAnthropicApiKey,
|
|
||||||
getCustomOpenaiApiKey,
|
|
||||||
getCustomOpenaiApiUrl,
|
|
||||||
getCustomOpenaiModelName,
|
|
||||||
getGeminiApiKey,
|
|
||||||
getGroqApiKey,
|
|
||||||
getOllamaApiEndpoint,
|
|
||||||
getOpenaiApiKey,
|
|
||||||
getDeepseekApiKey,
|
|
||||||
getAimlApiKey,
|
|
||||||
getLMStudioApiEndpoint,
|
|
||||||
updateConfig,
|
|
||||||
getOllamaApiKey,
|
|
||||||
} from '@/lib/config';
|
|
||||||
import {
|
|
||||||
getAvailableChatModelProviders,
|
|
||||||
getAvailableEmbeddingModelProviders,
|
|
||||||
} from '@/lib/providers';
|
|
||||||
|
|
||||||
export const GET = async (req: Request) => {
|
|
||||||
try {
|
|
||||||
const config: Record<string, any> = {};
|
|
||||||
|
|
||||||
const [chatModelProviders, embeddingModelProviders] = await Promise.all([
|
|
||||||
getAvailableChatModelProviders(),
|
|
||||||
getAvailableEmbeddingModelProviders(),
|
|
||||||
]);
|
|
||||||
|
|
||||||
config['chatModelProviders'] = {};
|
|
||||||
config['embeddingModelProviders'] = {};
|
|
||||||
|
|
||||||
for (const provider in chatModelProviders) {
|
|
||||||
config['chatModelProviders'][provider] = Object.keys(
|
|
||||||
chatModelProviders[provider],
|
|
||||||
).map((model) => {
|
|
||||||
return {
|
|
||||||
name: model,
|
|
||||||
displayName: chatModelProviders[provider][model].displayName,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const provider in embeddingModelProviders) {
|
|
||||||
config['embeddingModelProviders'][provider] = Object.keys(
|
|
||||||
embeddingModelProviders[provider],
|
|
||||||
).map((model) => {
|
|
||||||
return {
|
|
||||||
name: model,
|
|
||||||
displayName: embeddingModelProviders[provider][model].displayName,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
config['openaiApiKey'] = getOpenaiApiKey();
|
|
||||||
config['ollamaApiUrl'] = getOllamaApiEndpoint();
|
|
||||||
config['ollamaApiKey'] = getOllamaApiKey();
|
|
||||||
config['lmStudioApiUrl'] = getLMStudioApiEndpoint();
|
|
||||||
config['anthropicApiKey'] = getAnthropicApiKey();
|
|
||||||
config['groqApiKey'] = getGroqApiKey();
|
|
||||||
config['geminiApiKey'] = getGeminiApiKey();
|
|
||||||
config['deepseekApiKey'] = getDeepseekApiKey();
|
|
||||||
config['aimlApiKey'] = getAimlApiKey();
|
|
||||||
config['customOpenaiApiUrl'] = getCustomOpenaiApiUrl();
|
|
||||||
config['customOpenaiApiKey'] = getCustomOpenaiApiKey();
|
|
||||||
config['customOpenaiModelName'] = getCustomOpenaiModelName();
|
|
||||||
|
|
||||||
return Response.json({ ...config }, { status: 200 });
|
|
||||||
} catch (err) {
|
|
||||||
console.error('An error occurred while getting config:', err);
|
|
||||||
return Response.json(
|
|
||||||
{ message: 'An error occurred while getting config' },
|
|
||||||
{ status: 500 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const POST = async (req: Request) => {
|
|
||||||
try {
|
|
||||||
const config = await req.json();
|
|
||||||
|
|
||||||
const updatedConfig = {
|
|
||||||
MODELS: {
|
|
||||||
OPENAI: {
|
|
||||||
API_KEY: config.openaiApiKey,
|
|
||||||
},
|
|
||||||
GROQ: {
|
|
||||||
API_KEY: config.groqApiKey,
|
|
||||||
},
|
|
||||||
ANTHROPIC: {
|
|
||||||
API_KEY: config.anthropicApiKey,
|
|
||||||
},
|
|
||||||
GEMINI: {
|
|
||||||
API_KEY: config.geminiApiKey,
|
|
||||||
},
|
|
||||||
OLLAMA: {
|
|
||||||
API_URL: config.ollamaApiUrl,
|
|
||||||
API_KEY: config.ollamaApiKey,
|
|
||||||
},
|
|
||||||
DEEPSEEK: {
|
|
||||||
API_KEY: config.deepseekApiKey,
|
|
||||||
},
|
|
||||||
AIMLAPI: {
|
|
||||||
API_KEY: config.aimlApiKey,
|
|
||||||
},
|
|
||||||
LM_STUDIO: {
|
|
||||||
API_URL: config.lmStudioApiUrl,
|
|
||||||
},
|
|
||||||
CUSTOM_OPENAI: {
|
|
||||||
API_URL: config.customOpenaiApiUrl,
|
|
||||||
API_KEY: config.customOpenaiApiKey,
|
|
||||||
MODEL_NAME: config.customOpenaiModelName,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
updateConfig(updatedConfig);
|
|
||||||
|
|
||||||
return Response.json({ message: 'Config updated' }, { status: 200 });
|
|
||||||
} catch (err) {
|
|
||||||
console.error('An error occurred while updating config:', err);
|
|
||||||
return Response.json(
|
|
||||||
{ message: 'An error occurred while updating config' },
|
|
||||||
{ status: 500 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
@@ -1,98 +0,0 @@
|
|||||||
import { searchSearxng } from '@/lib/searxng';
|
|
||||||
|
|
||||||
const websitesForTopic = {
|
|
||||||
tech: {
|
|
||||||
query: ['technology news', 'latest tech', 'AI', 'science and innovation'],
|
|
||||||
links: ['techcrunch.com', 'wired.com', 'theverge.com'],
|
|
||||||
},
|
|
||||||
finance: {
|
|
||||||
query: ['finance news', 'economy', 'stock market', 'investing'],
|
|
||||||
links: ['bloomberg.com', 'cnbc.com', 'marketwatch.com'],
|
|
||||||
},
|
|
||||||
art: {
|
|
||||||
query: ['art news', 'culture', 'modern art', 'cultural events'],
|
|
||||||
links: ['artnews.com', 'hyperallergic.com', 'theartnewspaper.com'],
|
|
||||||
},
|
|
||||||
sports: {
|
|
||||||
query: ['sports news', 'latest sports', 'cricket football tennis'],
|
|
||||||
links: ['espn.com', 'bbc.com/sport', 'skysports.com'],
|
|
||||||
},
|
|
||||||
entertainment: {
|
|
||||||
query: ['entertainment news', 'movies', 'TV shows', 'celebrities'],
|
|
||||||
links: ['hollywoodreporter.com', 'variety.com', 'deadline.com'],
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
type Topic = keyof typeof websitesForTopic;
|
|
||||||
|
|
||||||
export const GET = async (req: Request) => {
|
|
||||||
try {
|
|
||||||
const params = new URL(req.url).searchParams;
|
|
||||||
|
|
||||||
const mode: 'normal' | 'preview' =
|
|
||||||
(params.get('mode') as 'normal' | 'preview') || 'normal';
|
|
||||||
const topic: Topic = (params.get('topic') as Topic) || 'tech';
|
|
||||||
|
|
||||||
const selectedTopic = websitesForTopic[topic];
|
|
||||||
|
|
||||||
let data = [];
|
|
||||||
|
|
||||||
if (mode === 'normal') {
|
|
||||||
const seenUrls = new Set();
|
|
||||||
|
|
||||||
data = (
|
|
||||||
await Promise.all(
|
|
||||||
selectedTopic.links.flatMap((link) =>
|
|
||||||
selectedTopic.query.map(async (query) => {
|
|
||||||
return (
|
|
||||||
await searchSearxng(`site:${link} ${query}`, {
|
|
||||||
engines: ['bing news'],
|
|
||||||
pageno: 1,
|
|
||||||
language: 'en',
|
|
||||||
})
|
|
||||||
).results;
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.flat()
|
|
||||||
.filter((item) => {
|
|
||||||
const url = item.url?.toLowerCase().trim();
|
|
||||||
if (seenUrls.has(url)) return false;
|
|
||||||
seenUrls.add(url);
|
|
||||||
return true;
|
|
||||||
})
|
|
||||||
.sort(() => Math.random() - 0.5);
|
|
||||||
} else {
|
|
||||||
data = (
|
|
||||||
await searchSearxng(
|
|
||||||
`site:${selectedTopic.links[Math.floor(Math.random() * selectedTopic.links.length)]} ${selectedTopic.query[Math.floor(Math.random() * selectedTopic.query.length)]}`,
|
|
||||||
{
|
|
||||||
engines: ['bing news'],
|
|
||||||
pageno: 1,
|
|
||||||
language: 'en',
|
|
||||||
},
|
|
||||||
)
|
|
||||||
).results;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Response.json(
|
|
||||||
{
|
|
||||||
blogs: data,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
status: 200,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
} catch (err) {
|
|
||||||
console.error(`An error occurred in discover route: ${err}`);
|
|
||||||
return Response.json(
|
|
||||||
{
|
|
||||||
message: 'An error has occurred',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
status: 500,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
@@ -1,83 +0,0 @@
|
|||||||
import handleImageSearch from '@/lib/chains/imageSearchAgent';
|
|
||||||
import {
|
|
||||||
getCustomOpenaiApiKey,
|
|
||||||
getCustomOpenaiApiUrl,
|
|
||||||
getCustomOpenaiModelName,
|
|
||||||
} from '@/lib/config';
|
|
||||||
import { getAvailableChatModelProviders } from '@/lib/providers';
|
|
||||||
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
|
||||||
import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages';
|
|
||||||
import { ChatOpenAI } from '@langchain/openai';
|
|
||||||
|
|
||||||
interface ChatModel {
|
|
||||||
provider: string;
|
|
||||||
model: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ImageSearchBody {
|
|
||||||
query: string;
|
|
||||||
chatHistory: any[];
|
|
||||||
chatModel?: ChatModel;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const POST = async (req: Request) => {
|
|
||||||
try {
|
|
||||||
const body: ImageSearchBody = await req.json();
|
|
||||||
|
|
||||||
const chatHistory = body.chatHistory
|
|
||||||
.map((msg: any) => {
|
|
||||||
if (msg.role === 'user') {
|
|
||||||
return new HumanMessage(msg.content);
|
|
||||||
} else if (msg.role === 'assistant') {
|
|
||||||
return new AIMessage(msg.content);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.filter((msg) => msg !== undefined) as BaseMessage[];
|
|
||||||
|
|
||||||
const chatModelProviders = await getAvailableChatModelProviders();
|
|
||||||
|
|
||||||
const chatModelProvider =
|
|
||||||
chatModelProviders[
|
|
||||||
body.chatModel?.provider || Object.keys(chatModelProviders)[0]
|
|
||||||
];
|
|
||||||
const chatModel =
|
|
||||||
chatModelProvider[
|
|
||||||
body.chatModel?.model || Object.keys(chatModelProvider)[0]
|
|
||||||
];
|
|
||||||
|
|
||||||
let llm: BaseChatModel | undefined;
|
|
||||||
|
|
||||||
if (body.chatModel?.provider === 'custom_openai') {
|
|
||||||
llm = new ChatOpenAI({
|
|
||||||
apiKey: getCustomOpenaiApiKey(),
|
|
||||||
modelName: getCustomOpenaiModelName(),
|
|
||||||
temperature: 0.7,
|
|
||||||
configuration: {
|
|
||||||
baseURL: getCustomOpenaiApiUrl(),
|
|
||||||
},
|
|
||||||
}) as unknown as BaseChatModel;
|
|
||||||
} else if (chatModelProvider && chatModel) {
|
|
||||||
llm = chatModel.model;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!llm) {
|
|
||||||
return Response.json({ error: 'Invalid chat model' }, { status: 400 });
|
|
||||||
}
|
|
||||||
|
|
||||||
const images = await handleImageSearch(
|
|
||||||
{
|
|
||||||
chat_history: chatHistory,
|
|
||||||
query: body.query,
|
|
||||||
},
|
|
||||||
llm,
|
|
||||||
);
|
|
||||||
|
|
||||||
return Response.json({ images }, { status: 200 });
|
|
||||||
} catch (err) {
|
|
||||||
console.error(`An error occurred while searching images: ${err}`);
|
|
||||||
return Response.json(
|
|
||||||
{ message: 'An error occurred while searching images' },
|
|
||||||
{ status: 500 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
@@ -1,47 +0,0 @@
|
|||||||
import {
|
|
||||||
getAvailableChatModelProviders,
|
|
||||||
getAvailableEmbeddingModelProviders,
|
|
||||||
} from '@/lib/providers';
|
|
||||||
|
|
||||||
export const GET = async (req: Request) => {
|
|
||||||
try {
|
|
||||||
const [chatModelProviders, embeddingModelProviders] = await Promise.all([
|
|
||||||
getAvailableChatModelProviders(),
|
|
||||||
getAvailableEmbeddingModelProviders(),
|
|
||||||
]);
|
|
||||||
|
|
||||||
Object.keys(chatModelProviders).forEach((provider) => {
|
|
||||||
Object.keys(chatModelProviders[provider]).forEach((model) => {
|
|
||||||
delete (chatModelProviders[provider][model] as { model?: unknown })
|
|
||||||
.model;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
Object.keys(embeddingModelProviders).forEach((provider) => {
|
|
||||||
Object.keys(embeddingModelProviders[provider]).forEach((model) => {
|
|
||||||
delete (embeddingModelProviders[provider][model] as { model?: unknown })
|
|
||||||
.model;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
return Response.json(
|
|
||||||
{
|
|
||||||
chatModelProviders,
|
|
||||||
embeddingModelProviders,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
status: 200,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
} catch (err) {
|
|
||||||
console.error('An error occurred while fetching models', err);
|
|
||||||
return Response.json(
|
|
||||||
{
|
|
||||||
message: 'An error has occurred.',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
status: 500,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
@@ -1,269 +0,0 @@
|
|||||||
import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
|
||||||
import type { Embeddings } from '@langchain/core/embeddings';
|
|
||||||
import { ChatOpenAI } from '@langchain/openai';
|
|
||||||
import {
|
|
||||||
getAvailableChatModelProviders,
|
|
||||||
getAvailableEmbeddingModelProviders,
|
|
||||||
} from '@/lib/providers';
|
|
||||||
import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages';
|
|
||||||
import { MetaSearchAgentType } from '@/lib/search/metaSearchAgent';
|
|
||||||
import {
|
|
||||||
getCustomOpenaiApiKey,
|
|
||||||
getCustomOpenaiApiUrl,
|
|
||||||
getCustomOpenaiModelName,
|
|
||||||
} from '@/lib/config';
|
|
||||||
import { searchHandlers } from '@/lib/search';
|
|
||||||
|
|
||||||
interface chatModel {
|
|
||||||
provider: string;
|
|
||||||
name: string;
|
|
||||||
customOpenAIKey?: string;
|
|
||||||
customOpenAIBaseURL?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface embeddingModel {
|
|
||||||
provider: string;
|
|
||||||
name: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ChatRequestBody {
|
|
||||||
optimizationMode: 'speed' | 'balanced';
|
|
||||||
focusMode: string;
|
|
||||||
chatModel?: chatModel;
|
|
||||||
embeddingModel?: embeddingModel;
|
|
||||||
query: string;
|
|
||||||
history: Array<[string, string]>;
|
|
||||||
stream?: boolean;
|
|
||||||
systemInstructions?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const POST = async (req: Request) => {
|
|
||||||
try {
|
|
||||||
const body: ChatRequestBody = await req.json();
|
|
||||||
|
|
||||||
if (!body.focusMode || !body.query) {
|
|
||||||
return Response.json(
|
|
||||||
{ message: 'Missing focus mode or query' },
|
|
||||||
{ status: 400 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
body.history = body.history || [];
|
|
||||||
body.optimizationMode = body.optimizationMode || 'balanced';
|
|
||||||
body.stream = body.stream || false;
|
|
||||||
|
|
||||||
const history: BaseMessage[] = body.history.map((msg) => {
|
|
||||||
return msg[0] === 'human'
|
|
||||||
? new HumanMessage({ content: msg[1] })
|
|
||||||
: new AIMessage({ content: msg[1] });
|
|
||||||
});
|
|
||||||
|
|
||||||
const [chatModelProviders, embeddingModelProviders] = await Promise.all([
|
|
||||||
getAvailableChatModelProviders(),
|
|
||||||
getAvailableEmbeddingModelProviders(),
|
|
||||||
]);
|
|
||||||
|
|
||||||
const chatModelProvider =
|
|
||||||
body.chatModel?.provider || Object.keys(chatModelProviders)[0];
|
|
||||||
const chatModel =
|
|
||||||
body.chatModel?.name ||
|
|
||||||
Object.keys(chatModelProviders[chatModelProvider])[0];
|
|
||||||
|
|
||||||
const embeddingModelProvider =
|
|
||||||
body.embeddingModel?.provider || Object.keys(embeddingModelProviders)[0];
|
|
||||||
const embeddingModel =
|
|
||||||
body.embeddingModel?.name ||
|
|
||||||
Object.keys(embeddingModelProviders[embeddingModelProvider])[0];
|
|
||||||
|
|
||||||
let llm: BaseChatModel | undefined;
|
|
||||||
let embeddings: Embeddings | undefined;
|
|
||||||
|
|
||||||
if (body.chatModel?.provider === 'custom_openai') {
|
|
||||||
llm = new ChatOpenAI({
|
|
||||||
modelName: body.chatModel?.name || getCustomOpenaiModelName(),
|
|
||||||
apiKey: body.chatModel?.customOpenAIKey || getCustomOpenaiApiKey(),
|
|
||||||
temperature: 0.7,
|
|
||||||
configuration: {
|
|
||||||
baseURL:
|
|
||||||
body.chatModel?.customOpenAIBaseURL || getCustomOpenaiApiUrl(),
|
|
||||||
},
|
|
||||||
}) as unknown as BaseChatModel;
|
|
||||||
} else if (
|
|
||||||
chatModelProviders[chatModelProvider] &&
|
|
||||||
chatModelProviders[chatModelProvider][chatModel]
|
|
||||||
) {
|
|
||||||
llm = chatModelProviders[chatModelProvider][chatModel]
|
|
||||||
.model as unknown as BaseChatModel | undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
|
||||||
embeddingModelProviders[embeddingModelProvider] &&
|
|
||||||
embeddingModelProviders[embeddingModelProvider][embeddingModel]
|
|
||||||
) {
|
|
||||||
embeddings = embeddingModelProviders[embeddingModelProvider][
|
|
||||||
embeddingModel
|
|
||||||
].model as Embeddings | undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!llm || !embeddings) {
|
|
||||||
return Response.json(
|
|
||||||
{ message: 'Invalid model selected' },
|
|
||||||
{ status: 400 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const searchHandler: MetaSearchAgentType = searchHandlers[body.focusMode];
|
|
||||||
|
|
||||||
if (!searchHandler) {
|
|
||||||
return Response.json({ message: 'Invalid focus mode' }, { status: 400 });
|
|
||||||
}
|
|
||||||
|
|
||||||
const emitter = await searchHandler.searchAndAnswer(
|
|
||||||
body.query,
|
|
||||||
history,
|
|
||||||
llm,
|
|
||||||
embeddings,
|
|
||||||
body.optimizationMode,
|
|
||||||
[],
|
|
||||||
body.systemInstructions || '',
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!body.stream) {
|
|
||||||
return new Promise(
|
|
||||||
(
|
|
||||||
resolve: (value: Response) => void,
|
|
||||||
reject: (value: Response) => void,
|
|
||||||
) => {
|
|
||||||
let message = '';
|
|
||||||
let sources: any[] = [];
|
|
||||||
|
|
||||||
emitter.on('data', (data: string) => {
|
|
||||||
try {
|
|
||||||
const parsedData = JSON.parse(data);
|
|
||||||
if (parsedData.type === 'response') {
|
|
||||||
message += parsedData.data;
|
|
||||||
} else if (parsedData.type === 'sources') {
|
|
||||||
sources = parsedData.data;
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
reject(
|
|
||||||
Response.json(
|
|
||||||
{ message: 'Error parsing data' },
|
|
||||||
{ status: 500 },
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
emitter.on('end', () => {
|
|
||||||
resolve(Response.json({ message, sources }, { status: 200 }));
|
|
||||||
});
|
|
||||||
|
|
||||||
emitter.on('error', (error: any) => {
|
|
||||||
reject(
|
|
||||||
Response.json(
|
|
||||||
{ message: 'Search error', error },
|
|
||||||
{ status: 500 },
|
|
||||||
),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const encoder = new TextEncoder();
|
|
||||||
|
|
||||||
const abortController = new AbortController();
|
|
||||||
const { signal } = abortController;
|
|
||||||
|
|
||||||
const stream = new ReadableStream({
|
|
||||||
start(controller) {
|
|
||||||
let sources: any[] = [];
|
|
||||||
|
|
||||||
controller.enqueue(
|
|
||||||
encoder.encode(
|
|
||||||
JSON.stringify({
|
|
||||||
type: 'init',
|
|
||||||
data: 'Stream connected',
|
|
||||||
}) + '\n',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
signal.addEventListener('abort', () => {
|
|
||||||
emitter.removeAllListeners();
|
|
||||||
|
|
||||||
try {
|
|
||||||
controller.close();
|
|
||||||
} catch (error) {}
|
|
||||||
});
|
|
||||||
|
|
||||||
emitter.on('data', (data: string) => {
|
|
||||||
if (signal.aborted) return;
|
|
||||||
|
|
||||||
try {
|
|
||||||
const parsedData = JSON.parse(data);
|
|
||||||
|
|
||||||
if (parsedData.type === 'response') {
|
|
||||||
controller.enqueue(
|
|
||||||
encoder.encode(
|
|
||||||
JSON.stringify({
|
|
||||||
type: 'response',
|
|
||||||
data: parsedData.data,
|
|
||||||
}) + '\n',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
} else if (parsedData.type === 'sources') {
|
|
||||||
sources = parsedData.data;
|
|
||||||
controller.enqueue(
|
|
||||||
encoder.encode(
|
|
||||||
JSON.stringify({
|
|
||||||
type: 'sources',
|
|
||||||
data: sources,
|
|
||||||
}) + '\n',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
controller.error(error);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
emitter.on('end', () => {
|
|
||||||
if (signal.aborted) return;
|
|
||||||
|
|
||||||
controller.enqueue(
|
|
||||||
encoder.encode(
|
|
||||||
JSON.stringify({
|
|
||||||
type: 'done',
|
|
||||||
}) + '\n',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
controller.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
emitter.on('error', (error: any) => {
|
|
||||||
if (signal.aborted) return;
|
|
||||||
|
|
||||||
controller.error(error);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
cancel() {
|
|
||||||
abortController.abort();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return new Response(stream, {
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'text/event-stream',
|
|
||||||
'Cache-Control': 'no-cache, no-transform',
|
|
||||||
Connection: 'keep-alive',
|
|
||||||
},
|
|
||||||
});
|
|
||||||
} catch (err: any) {
|
|
||||||
console.error(`Error in getting search results: ${err.message}`);
|
|
||||||
return Response.json(
|
|
||||||
{ message: 'An error has occurred.' },
|
|
||||||
{ status: 500 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
@@ -1,81 +0,0 @@
|
|||||||
import generateSuggestions from '@/lib/chains/suggestionGeneratorAgent';
|
|
||||||
import {
|
|
||||||
getCustomOpenaiApiKey,
|
|
||||||
getCustomOpenaiApiUrl,
|
|
||||||
getCustomOpenaiModelName,
|
|
||||||
} from '@/lib/config';
|
|
||||||
import { getAvailableChatModelProviders } from '@/lib/providers';
|
|
||||||
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
|
||||||
import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages';
|
|
||||||
import { ChatOpenAI } from '@langchain/openai';
|
|
||||||
|
|
||||||
interface ChatModel {
|
|
||||||
provider: string;
|
|
||||||
model: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface SuggestionsGenerationBody {
|
|
||||||
chatHistory: any[];
|
|
||||||
chatModel?: ChatModel;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const POST = async (req: Request) => {
|
|
||||||
try {
|
|
||||||
const body: SuggestionsGenerationBody = await req.json();
|
|
||||||
|
|
||||||
const chatHistory = body.chatHistory
|
|
||||||
.map((msg: any) => {
|
|
||||||
if (msg.role === 'user') {
|
|
||||||
return new HumanMessage(msg.content);
|
|
||||||
} else if (msg.role === 'assistant') {
|
|
||||||
return new AIMessage(msg.content);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.filter((msg) => msg !== undefined) as BaseMessage[];
|
|
||||||
|
|
||||||
const chatModelProviders = await getAvailableChatModelProviders();
|
|
||||||
|
|
||||||
const chatModelProvider =
|
|
||||||
chatModelProviders[
|
|
||||||
body.chatModel?.provider || Object.keys(chatModelProviders)[0]
|
|
||||||
];
|
|
||||||
const chatModel =
|
|
||||||
chatModelProvider[
|
|
||||||
body.chatModel?.model || Object.keys(chatModelProvider)[0]
|
|
||||||
];
|
|
||||||
|
|
||||||
let llm: BaseChatModel | undefined;
|
|
||||||
|
|
||||||
if (body.chatModel?.provider === 'custom_openai') {
|
|
||||||
llm = new ChatOpenAI({
|
|
||||||
apiKey: getCustomOpenaiApiKey(),
|
|
||||||
modelName: getCustomOpenaiModelName(),
|
|
||||||
temperature: 0.7,
|
|
||||||
configuration: {
|
|
||||||
baseURL: getCustomOpenaiApiUrl(),
|
|
||||||
},
|
|
||||||
}) as unknown as BaseChatModel;
|
|
||||||
} else if (chatModelProvider && chatModel) {
|
|
||||||
llm = chatModel.model;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!llm) {
|
|
||||||
return Response.json({ error: 'Invalid chat model' }, { status: 400 });
|
|
||||||
}
|
|
||||||
|
|
||||||
const suggestions = await generateSuggestions(
|
|
||||||
{
|
|
||||||
chat_history: chatHistory,
|
|
||||||
},
|
|
||||||
llm,
|
|
||||||
);
|
|
||||||
|
|
||||||
return Response.json({ suggestions }, { status: 200 });
|
|
||||||
} catch (err) {
|
|
||||||
console.error(`An error occurred while generating suggestions: ${err}`);
|
|
||||||
return Response.json(
|
|
||||||
{ message: 'An error occurred while generating suggestions' },
|
|
||||||
{ status: 500 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
@@ -1,134 +0,0 @@
|
|||||||
import { NextResponse } from 'next/server';
|
|
||||||
import fs from 'fs';
|
|
||||||
import path from 'path';
|
|
||||||
import crypto from 'crypto';
|
|
||||||
import { getAvailableEmbeddingModelProviders } from '@/lib/providers';
|
|
||||||
import { PDFLoader } from '@langchain/community/document_loaders/fs/pdf';
|
|
||||||
import { DocxLoader } from '@langchain/community/document_loaders/fs/docx';
|
|
||||||
import { RecursiveCharacterTextSplitter } from '@langchain/textsplitters';
|
|
||||||
import { Document } from 'langchain/document';
|
|
||||||
|
|
||||||
interface FileRes {
|
|
||||||
fileName: string;
|
|
||||||
fileExtension: string;
|
|
||||||
fileId: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
const uploadDir = path.join(process.cwd(), 'uploads');
|
|
||||||
|
|
||||||
if (!fs.existsSync(uploadDir)) {
|
|
||||||
fs.mkdirSync(uploadDir, { recursive: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
const splitter = new RecursiveCharacterTextSplitter({
|
|
||||||
chunkSize: 500,
|
|
||||||
chunkOverlap: 100,
|
|
||||||
});
|
|
||||||
|
|
||||||
export async function POST(req: Request) {
|
|
||||||
try {
|
|
||||||
const formData = await req.formData();
|
|
||||||
|
|
||||||
const files = formData.getAll('files') as File[];
|
|
||||||
const embedding_model = formData.get('embedding_model');
|
|
||||||
const embedding_model_provider = formData.get('embedding_model_provider');
|
|
||||||
|
|
||||||
if (!embedding_model || !embedding_model_provider) {
|
|
||||||
return NextResponse.json(
|
|
||||||
{ message: 'Missing embedding model or provider' },
|
|
||||||
{ status: 400 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const embeddingModels = await getAvailableEmbeddingModelProviders();
|
|
||||||
const provider =
|
|
||||||
embedding_model_provider ?? Object.keys(embeddingModels)[0];
|
|
||||||
const embeddingModel =
|
|
||||||
embedding_model ?? Object.keys(embeddingModels[provider as string])[0];
|
|
||||||
|
|
||||||
let embeddingsModel =
|
|
||||||
embeddingModels[provider as string]?.[embeddingModel as string]?.model;
|
|
||||||
if (!embeddingsModel) {
|
|
||||||
return NextResponse.json(
|
|
||||||
{ message: 'Invalid embedding model selected' },
|
|
||||||
{ status: 400 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const processedFiles: FileRes[] = [];
|
|
||||||
|
|
||||||
await Promise.all(
|
|
||||||
files.map(async (file: any) => {
|
|
||||||
const fileExtension = file.name.split('.').pop();
|
|
||||||
if (!['pdf', 'docx', 'txt'].includes(fileExtension!)) {
|
|
||||||
return NextResponse.json(
|
|
||||||
{ message: 'File type not supported' },
|
|
||||||
{ status: 400 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const uniqueFileName = `${crypto.randomBytes(16).toString('hex')}.${fileExtension}`;
|
|
||||||
const filePath = path.join(uploadDir, uniqueFileName);
|
|
||||||
|
|
||||||
const buffer = Buffer.from(await file.arrayBuffer());
|
|
||||||
fs.writeFileSync(filePath, new Uint8Array(buffer));
|
|
||||||
|
|
||||||
let docs: any[] = [];
|
|
||||||
if (fileExtension === 'pdf') {
|
|
||||||
const loader = new PDFLoader(filePath);
|
|
||||||
docs = await loader.load();
|
|
||||||
} else if (fileExtension === 'docx') {
|
|
||||||
const loader = new DocxLoader(filePath);
|
|
||||||
docs = await loader.load();
|
|
||||||
} else if (fileExtension === 'txt') {
|
|
||||||
const text = fs.readFileSync(filePath, 'utf-8');
|
|
||||||
docs = [
|
|
||||||
new Document({ pageContent: text, metadata: { title: file.name } }),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
const splitted = await splitter.splitDocuments(docs);
|
|
||||||
|
|
||||||
const extractedDataPath = filePath.replace(/\.\w+$/, '-extracted.json');
|
|
||||||
fs.writeFileSync(
|
|
||||||
extractedDataPath,
|
|
||||||
JSON.stringify({
|
|
||||||
title: file.name,
|
|
||||||
contents: splitted.map((doc) => doc.pageContent),
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
const embeddings = await embeddingsModel.embedDocuments(
|
|
||||||
splitted.map((doc) => doc.pageContent),
|
|
||||||
);
|
|
||||||
const embeddingsDataPath = filePath.replace(
|
|
||||||
/\.\w+$/,
|
|
||||||
'-embeddings.json',
|
|
||||||
);
|
|
||||||
fs.writeFileSync(
|
|
||||||
embeddingsDataPath,
|
|
||||||
JSON.stringify({
|
|
||||||
title: file.name,
|
|
||||||
embeddings,
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
processedFiles.push({
|
|
||||||
fileName: file.name,
|
|
||||||
fileExtension: fileExtension,
|
|
||||||
fileId: uniqueFileName.replace(/\.\w+$/, ''),
|
|
||||||
});
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
return NextResponse.json({
|
|
||||||
files: processedFiles,
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Error uploading file:', error);
|
|
||||||
return NextResponse.json(
|
|
||||||
{ message: 'An error has occurred.' },
|
|
||||||
{ status: 500 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|