Initial layout
|
@ -1,9 +0,0 @@
|
|||
{
|
||||
"extends": "next/core-web-vitals",
|
||||
"plugins": ["unused-imports"],
|
||||
"rules": {
|
||||
"react/display-name": "off",
|
||||
"react/no-unescaped-entities": "off",
|
||||
"unused-imports/no-unused-imports": "warn"
|
||||
}
|
||||
}
|
49
.gitignore
vendored
|
@ -1,45 +1,24 @@
|
|||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
# build output
|
||||
dist/
|
||||
|
||||
# various IDEs and backup files
|
||||
.vscode/
|
||||
.idea/
|
||||
**/*~
|
||||
# generated types
|
||||
.astro/
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
/.pnp
|
||||
.pnp.js
|
||||
.yarn/install-state.gz
|
||||
pnpm-lock.yaml
|
||||
node_modules/
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
|
||||
# next.js
|
||||
/.next/
|
||||
/out/
|
||||
|
||||
# production
|
||||
/build
|
||||
.env
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
*.pem
|
||||
|
||||
# debug
|
||||
# logs
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# local env files
|
||||
.env*.local
|
||||
# environment variables
|
||||
.env
|
||||
.env.production
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
# macOS-specific files
|
||||
.DS_Store
|
||||
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
|
||||
!src/app/.env/
|
||||
# jetbrains setting folder
|
||||
.idea/
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
{
|
||||
"tabWidth": 2,
|
||||
"useTabs": true,
|
||||
"semi": true,
|
||||
"trailingComma": "all",
|
||||
"plugins": ["prettier-plugin-tailwindcss"]
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"bracketSameLine": true,
|
||||
"endOfLine": "lf",
|
||||
"trailingComma": "es5",
|
||||
"singleQuote": true,
|
||||
"tabWidth": 2,
|
||||
"useTabs": false,
|
||||
"jsxSingleQuote": false,
|
||||
"semi": true,
|
||||
"printWidth": 128,
|
||||
"plugins": []
|
||||
}
|
4
.vscode/extensions.json
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"recommendations": ["astro-build.astro-vscode"],
|
||||
"unwantedRecommendations": []
|
||||
}
|
11
.vscode/launch.json
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"command": "./node_modules/.bin/astro dev",
|
||||
"name": "Development server",
|
||||
"request": "launch",
|
||||
"type": "node-terminal"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,61 +0,0 @@
|
|||
# Zen Browser Website
|
||||
|
||||
Thank you for wanting to contribute to Zen Browser Website. We are thrilled to welcome you to our community. Before you start, please read this document to understand how you can contribute to this project.
|
||||
|
||||
## How to Contribute
|
||||
|
||||
1. Fork the Zen Browser Website repository.
|
||||
2. Clone the Zen Browser Website repository to your local machine.
|
||||
|
||||
```bash
|
||||
git clone git@github.com:<YOUR_GITHUB_USERNAME>/www.git # SSH
|
||||
git clone https://github.com/<YOUR_GITHUB_USERNAME>/www.git # HTTPS
|
||||
gh repo clone <YOUR_GITHUB_USERNAME>/www # GitHub CLI
|
||||
```
|
||||
|
||||
3. Change directory to the cloned repository.
|
||||
|
||||
```bash
|
||||
cd www
|
||||
```
|
||||
|
||||
4. Create a branch for your contribution.
|
||||
|
||||
```bash
|
||||
git checkout -b <BRANCH_NAME>
|
||||
```
|
||||
|
||||
5. Start the development environment.
|
||||
|
||||
```bash
|
||||
npm install # or your favorite package manager
|
||||
npm run dev
|
||||
```
|
||||
|
||||
6. Make your changes.
|
||||
|
||||
7. Once you're done, commit your changes.
|
||||
|
||||
```bash
|
||||
git add .
|
||||
git commit -m "Your commit message"
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> Please follow the commit guidelines described below.
|
||||
|
||||
## Commit Guidelines
|
||||
|
||||
This project follows the [Conventional Commits][] specification.
|
||||
|
||||
Commits must be signed. You can learn more about [Commit Signing][] here.
|
||||
|
||||
### Commit Message Guidelines
|
||||
|
||||
- Commit messages must include a "type" as described in Conventional Commits
|
||||
- Commit messages **must** start with a capital letter
|
||||
- Commit messages **must not** end with a period `.`
|
||||
- Commit messages **must** be in English _sorry for the constraint_
|
||||
|
||||
[Conventional Commits]: https://www.conventionalcommits.org/
|
||||
[Commit Signing]: https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits
|
62
README.md
|
@ -1,18 +1,54 @@
|
|||
<div align="center">
|
||||
<picture>
|
||||
<img src="./public/logos/zen-alpha-white.svg" width="128px">
|
||||
</picture>
|
||||
</div>
|
||||
<h1 align="center">
|
||||
Zen Browser Website
|
||||
</h1>
|
||||
# Astro Starter Kit: Basics
|
||||
|
||||
[](https://www.jsdelivr.com/package/gh/zen-browser/www)
|
||||
```sh
|
||||
npm create astro@latest -- --template basics
|
||||
```
|
||||
|
||||
[Uptime-Phare](https://uptime.zen-browser.app)
|
||||
[](https://stackblitz.com/github/withastro/astro/tree/latest/examples/basics)
|
||||
[](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/basics)
|
||||
[](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/basics/devcontainer.json)
|
||||
|
||||
This repository contains the source code for the Zen Browser Website. We are thrilled to welcome you to our community. Before you start, please read this document to understand how you can contribute to this project.
|
||||
> 🧑🚀 **Seasoned astronaut?** Delete this file. Have fun!
|
||||
|
||||
Zen Browser's website is built with [Next.js](https://nextjs.org/), [TypeScript](https://www.typescriptlang.org/), and [Tailwind CSS](https://tailwindcss.com/).
|
||||

|
||||
|
||||
If you are interested in contributing to this project, please read the [Contributing Guidelines](./CONTRIBUTING.md).
|
||||
## 🚀 Project Structure
|
||||
|
||||
Inside of your Astro project, you'll see the following folders and files:
|
||||
|
||||
```text
|
||||
/
|
||||
├── public/
|
||||
│ └── favicon.svg
|
||||
├── src/
|
||||
│ ├── components/
|
||||
│ │ └── Card.astro
|
||||
│ ├── layouts/
|
||||
│ │ └── Layout.astro
|
||||
│ └── pages/
|
||||
│ └── index.astro
|
||||
└── package.json
|
||||
```
|
||||
|
||||
Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
|
||||
|
||||
There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components.
|
||||
|
||||
Any static assets, like images, can be placed in the `public/` directory.
|
||||
|
||||
## 🧞 Commands
|
||||
|
||||
All commands are run from the root of the project, from a terminal:
|
||||
|
||||
| Command | Action |
|
||||
| :------------------------ | :----------------------------------------------- |
|
||||
| `npm install` | Installs dependencies |
|
||||
| `npm run dev` | Starts local dev server at `localhost:4321` |
|
||||
| `npm run build` | Build your production site to `./dist/` |
|
||||
| `npm run preview` | Preview your build locally, before deploying |
|
||||
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
|
||||
| `npm run astro -- --help` | Get help using the Astro CLI |
|
||||
|
||||
## 👀 Want to learn more?
|
||||
|
||||
Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).
|
||||
|
|
5
astro.config.mjs
Normal file
|
@ -0,0 +1,5 @@
|
|||
// @ts-check
|
||||
import { defineConfig } from 'astro/config';
|
||||
|
||||
// https://astro.build/config
|
||||
export default defineConfig({});
|
|
@ -1,44 +0,0 @@
|
|||
const { PHASE_DEVELOPMENT_SERVER } = require("next/constants");
|
||||
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = (phase, { defaultConfig }) => {
|
||||
const defaultConfigWWW = {
|
||||
images: {
|
||||
remotePatterns: [
|
||||
{
|
||||
protocol: "https",
|
||||
hostname: "raw.githubusercontent.com",
|
||||
},
|
||||
{
|
||||
protocol: "https",
|
||||
hostname: "cdn.jsdelivr.net",
|
||||
port: "",
|
||||
pathname: "/gh/zen-browser/**",
|
||||
},
|
||||
],
|
||||
domains: ["localhost", "cdn.jsdelivr.net", "raw.githubusercontent.com"], // Allow images from jsDelivr
|
||||
},
|
||||
experimental: {
|
||||
serverActions: {
|
||||
// edit: updated to new key. Was previously `allowedForwardedHosts`
|
||||
allowedOrigins: ["localhost:3000", "get-zen.vercel.app"],
|
||||
},
|
||||
},
|
||||
compiler: {
|
||||
styledComponents: true,
|
||||
},
|
||||
};
|
||||
if (phase === PHASE_DEVELOPMENT_SERVER) {
|
||||
return {
|
||||
...defaultConfigWWW,
|
||||
// development only config options here
|
||||
};
|
||||
}
|
||||
return {
|
||||
...defaultConfigWWW,
|
||||
// production only config options here
|
||||
output: "export",
|
||||
};
|
||||
};
|
||||
|
||||
module.exports = nextConfig;
|
17
nyxbui.json
|
@ -1,17 +0,0 @@
|
|||
{
|
||||
"$schema": "https://nyxbui.design/schema.json",
|
||||
"style": "miami",
|
||||
"rsc": true,
|
||||
"tsx": true,
|
||||
"tailwind": {
|
||||
"config": "tailwind.config.ts",
|
||||
"css": "src/app/globals.css",
|
||||
"baseColor": "neutral",
|
||||
"cssVariables": true,
|
||||
"prefix": ""
|
||||
},
|
||||
"aliases": {
|
||||
"components": "@/components",
|
||||
"utils": "@/lib/utils"
|
||||
}
|
||||
}
|
26819
package-lock.json
generated
88
package.json
|
@ -1,75 +1,17 @@
|
|||
{
|
||||
"name": "zen-website",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"engines": {
|
||||
"node": ">=20.0.0"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "next dev --turbo",
|
||||
"build": "next build",
|
||||
"start": "next start",
|
||||
"format": "prettier --write .",
|
||||
"lint": "next lint",
|
||||
"pages:build": "npx @cloudflare/next-on-pages",
|
||||
"preview": "npm run pages:build && wrangler pages dev",
|
||||
"deploy": "npm run pages:build && wrangler pages deploy"
|
||||
},
|
||||
"dependencies": {
|
||||
"@hookform/resolvers": "^3.9.0",
|
||||
"@radix-ui/react-accordion": "^1.2.0",
|
||||
"@radix-ui/react-alert-dialog": "^1.1.2",
|
||||
"@radix-ui/react-checkbox": "^1.1.1",
|
||||
"@radix-ui/react-dialog": "^1.1.1",
|
||||
"@radix-ui/react-dropdown-menu": "^2.1.1",
|
||||
"@radix-ui/react-icons": "^1.3.0",
|
||||
"@radix-ui/react-label": "^2.1.0",
|
||||
"@radix-ui/react-navigation-menu": "^1.2.0",
|
||||
"@radix-ui/react-scroll-area": "^1.1.0",
|
||||
"@radix-ui/react-select": "^2.1.1",
|
||||
"@radix-ui/react-slider": "^1.2.0",
|
||||
"@radix-ui/react-slot": "^1.1.0",
|
||||
"@radix-ui/react-tabs": "^1.1.0",
|
||||
"@supabase/supabase-js": "^2.45.1",
|
||||
"@vercel/postgres": "^0.9.0",
|
||||
"canvas-confetti": "^1.9.3",
|
||||
"class-variance-authority": "^0.7.0",
|
||||
"clsx": "^2.1.1",
|
||||
"cobe": "^0.6.3",
|
||||
"dotenv": "^16.4.5",
|
||||
"feed": "^4.2.2",
|
||||
"framer-motion": "^11.11.9",
|
||||
"lucide-react": "^0.454.0",
|
||||
"moment": "^2.30.1",
|
||||
"next": "14.2.10",
|
||||
"next-themes": "^0.4.3",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-hook-form": "^7.52.2",
|
||||
"react-markdown": "^9.0.1",
|
||||
"react-spring": "^9.7.4",
|
||||
"react-sticky-box": "^2.0.5",
|
||||
"react-sticky-el": "^2.1.0",
|
||||
"styled-components": "^6.1.12",
|
||||
"tailwind-merge": "^2.5.1",
|
||||
"tailwindcss-animate": "^1.0.7",
|
||||
"zen-website": "file:",
|
||||
"zod": "^3.23.8"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@cloudflare/next-on-pages": "^1.13.2",
|
||||
"@types/canvas-confetti": "^1.6.4",
|
||||
"@types/node": "^20.14.15",
|
||||
"@types/react": "^18.3.3",
|
||||
"@types/react-dom": "^18.3.0",
|
||||
"@types/sync-fetch": "^0.4.3",
|
||||
"eslint": "^8.57.0",
|
||||
"eslint-config-next": "14.2.4",
|
||||
"eslint-plugin-unused-imports": "^3.2.0",
|
||||
"postcss": "^8.4.41",
|
||||
"prettier": "^3.3.3",
|
||||
"prettier-plugin-tailwindcss": "^0.6.6",
|
||||
"tailwindcss": "^3.4.9",
|
||||
"typescript": "^5.5.4"
|
||||
}
|
||||
"name": "www",
|
||||
"type": "module",
|
||||
"version": "0.0.1",
|
||||
"scripts": {
|
||||
"dev": "astro dev",
|
||||
"start": "astro dev",
|
||||
"build": "astro check && astro build",
|
||||
"preview": "astro preview",
|
||||
"astro": "astro"
|
||||
},
|
||||
"dependencies": {
|
||||
"astro": "^4.16.13",
|
||||
"@astrojs/check": "^0.9.4",
|
||||
"typescript": "^5.6.3"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
/** @type {import('postcss-load-config').Config} */
|
||||
const config = {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
},
|
||||
};
|
||||
|
||||
export default config;
|
|
@ -1 +0,0 @@
|
|||
did:plc:laszs2gm3kpkzbf7wst2spqq
|
|
@ -1 +0,0 @@
|
|||
dh=82966252249f886c1aa4aff42de252604c2315f3
|
|
@ -1,2 +0,0 @@
|
|||
/themes/:themeId /mods/:themeId 301
|
||||
/themes /mods 301
|
Before Width: | Height: | Size: 352 KiB |
Before Width: | Height: | Size: 397 KiB |
Before Width: | Height: | Size: 343 KiB |
Before Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 305 KiB |
Before Width: | Height: | Size: 728 KiB |
Before Width: | Height: | Size: 310 KiB |
Before Width: | Height: | Size: 326 KiB |
Before Width: | Height: | Size: 427 KiB |
Before Width: | Height: | Size: 420 KiB |
Before Width: | Height: | Size: 2.8 MiB |
Before Width: | Height: | Size: 104 KiB |
9
public/favicon.svg
Normal file
|
@ -0,0 +1,9 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128">
|
||||
<path d="M50.4 78.5a75.1 75.1 0 0 0-28.5 6.9l24.2-65.7c.7-2 1.9-3.2 3.4-3.2h29c1.5 0 2.7 1.2 3.4 3.2l24.2 65.7s-11.6-7-28.5-7L67 45.5c-.4-1.7-1.6-2.8-2.9-2.8-1.3 0-2.5 1.1-2.9 2.7L50.4 78.5Zm-1.1 28.2Zm-4.2-20.2c-2 6.6-.6 15.8 4.2 20.2a17.5 17.5 0 0 1 .2-.7 5.5 5.5 0 0 1 5.7-4.5c2.8.1 4.3 1.5 4.7 4.7.2 1.1.2 2.3.2 3.5v.4c0 2.7.7 5.2 2.2 7.4a13 13 0 0 0 5.7 4.9v-.3l-.2-.3c-1.8-5.6-.5-9.5 4.4-12.8l1.5-1a73 73 0 0 0 3.2-2.2 16 16 0 0 0 6.8-11.4c.3-2 .1-4-.6-6l-.8.6-1.6 1a37 37 0 0 1-22.4 2.7c-5-.7-9.7-2-13.2-6.2Z" />
|
||||
<style>
|
||||
path { fill: #000; }
|
||||
@media (prefers-color-scheme: dark) {
|
||||
path { fill: #FFF; }
|
||||
}
|
||||
</style>
|
||||
</svg>
|
After Width: | Height: | Size: 749 B |
Before Width: | Height: | Size: 1 MiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:#000;}.g,.h{stroke-width:0px;}.i{fill:none;stroke:#fff;stroke-linejoin:round;stroke-width:4.375px;}.h{fill:url(#e);}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity=".02"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="g" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="i" d="M33.3917,50.625h22.5458c2.9642,0,5.3614,2.4276,5.3117,5.4032-.0486,2.9129-2.4859,5.2218-5.3992,5.2218h-31.7886"/><path class="i" d="M46.2859,29.375h-22.136c-2.9133,0-5.3506-2.3089-5.3992-5.2218-.0496-2.9756,2.3475-5.4032,5.3117-5.4032h31.8763"/><path class="i" d="M24.0615,61.25c-.6775,0-1.3659-.1303-2.0307-.4057-2.7105-1.1227-3.9977-4.2302-2.875-6.9406,1.7267-4.1686,4.2017-7.9058,7.3563-11.1076,3.268-3.3171,7.122-5.9089,11.4551-7.7038,5.956-2.4672,10.5947-7.1058,13.0615-13.0615,1.1227-2.7107,4.2303-3.9976,6.9406-2.875,2.7105,1.1227,3.9977,4.2302,2.875,6.9406-1.7267,4.1686-4.2017,7.9058-7.3563,11.1076-3.268,3.3171-7.122,5.9089-11.4551,7.7038-5.956,2.4672-10.5947,7.1058-13.0615,13.0615-.8473,2.0457-2.8255,3.2808-4.9099,3.2808Z"/></g></svg>
|
Before Width: | Height: | Size: 1.4 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:none;stroke:#fff;stroke-linejoin:round;stroke-width:4.375px;}.h{fill:url(#e);}.h,.i{stroke-width:0px;}.i{fill:#70a0ff;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="i" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="g" d="M33.3917,50.625h22.5458c2.9642,0,5.3614,2.4276,5.3117,5.4032-.0486,2.9129-2.4859,5.2218-5.3992,5.2218h-31.7886"/><path class="g" d="M46.2859,29.375h-22.136c-2.9133,0-5.3506-2.3089-5.3992-5.2218-.0496-2.9756,2.3475-5.4032,5.3117-5.4032h31.8763"/><path class="g" d="M24.0615,61.25c-.6775,0-1.3659-.1303-2.0307-.4057-2.7105-1.1227-3.9977-4.2302-2.875-6.9406,1.7267-4.1686,4.2017-7.9058,7.3563-11.1076,3.268-3.3171,7.122-5.9089,11.4551-7.7038,5.956-2.4672,10.5947-7.1058,13.0615-13.0615,1.1227-2.7107,4.2303-3.9976,6.9406-2.875,2.7105,1.1227,3.9977,4.2302,2.875,6.9406-1.7267,4.1686-4.2017,7.9058-7.3563,11.1076-3.268,3.3171-7.122,5.9089-11.4551,7.7038-5.956,2.4672-10.5947,7.1058-13.0615,13.0615-.8473,2.0457-2.8255,3.2808-4.9099,3.2808Z"/></g></svg>
|
Before Width: | Height: | Size: 1.4 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:none;stroke:#fff;stroke-linejoin:round;stroke-width:4.375px;}.h{fill:url(#e);}.h,.i{stroke-width:0px;}.i{fill:#c7949b;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="i" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="g" d="M33.3917,50.625h22.5458c2.9642,0,5.3614,2.4276,5.3117,5.4032-.0486,2.9129-2.4859,5.2218-5.3992,5.2218h-31.7886"/><path class="g" d="M46.2859,29.375h-22.136c-2.9133,0-5.3506-2.3089-5.3992-5.2218-.0496-2.9756,2.3475-5.4032,5.3117-5.4032h31.8763"/><path class="g" d="M24.0615,61.25c-.6775,0-1.3659-.1303-2.0307-.4057-2.7105-1.1227-3.9977-4.2302-2.875-6.9406,1.7267-4.1686,4.2017-7.9058,7.3563-11.1076,3.268-3.3171,7.122-5.9089,11.4551-7.7038,5.956-2.4672,10.5947-7.1058,13.0615-13.0615,1.1227-2.7107,4.2303-3.9976,6.9406-2.875,2.7105,1.1227,3.9977,4.2302,2.875,6.9406-1.7267,4.1686-4.2017,7.9058-7.3563,11.1076-3.268,3.3171-7.122,5.9089-11.4551,7.7038-5.956,2.4672-10.5947,7.1058-13.0615,13.0615-.8473,2.0457-2.8255,3.2808-4.9099,3.2808Z"/></g></svg>
|
Before Width: | Height: | Size: 1.4 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:none;stroke:#fff;stroke-linejoin:round;stroke-width:4.375px;}.h{fill:url(#e);}.h,.i{stroke-width:0px;}.i{fill:#c9987e;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="i" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="g" d="M33.3917,50.625h22.5458c2.9642,0,5.3614,2.4276,5.3117,5.4032-.0486,2.9129-2.4859,5.2218-5.3992,5.2218h-31.7886"/><path class="g" d="M46.2859,29.375h-22.136c-2.9133,0-5.3506-2.3089-5.3992-5.2218-.0496-2.9756,2.3475-5.4032,5.3117-5.4032h31.8763"/><path class="g" d="M24.0615,61.25c-.6775,0-1.3659-.1303-2.0307-.4057-2.7105-1.1227-3.9977-4.2302-2.875-6.9406,1.7267-4.1686,4.2017-7.9058,7.3563-11.1076,3.268-3.3171,7.122-5.9089,11.4551-7.7038,5.956-2.4672,10.5947-7.1058,13.0615-13.0615,1.1227-2.7107,4.2303-3.9976,6.9406-2.875,2.7105,1.1227,3.9977,4.2302,2.875,6.9406-1.7267,4.1686-4.2017,7.9058-7.3563,11.1076-3.268,3.3171-7.122,5.9089-11.4551,7.7038-5.956,2.4672-10.5947,7.1058-13.0615,13.0615-.8473,2.0457-2.8255,3.2808-4.9099,3.2808Z"/></g></svg>
|
Before Width: | Height: | Size: 1.4 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:none;stroke:#fff;stroke-linejoin:round;stroke-width:4.375px;}.h{fill:url(#e);}.h,.i{stroke-width:0px;}.i{fill:#a570ff;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="i" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="g" d="M33.3917,50.625h22.5458c2.9642,0,5.3614,2.4276,5.3117,5.4032-.0486,2.9129-2.4859,5.2218-5.3992,5.2218h-31.7886"/><path class="g" d="M46.2859,29.375h-22.136c-2.9133,0-5.3506-2.3089-5.3992-5.2218-.0496-2.9756,2.3475-5.4032,5.3117-5.4032h31.8763"/><path class="g" d="M24.0615,61.25c-.6775,0-1.3659-.1303-2.0307-.4057-2.7105-1.1227-3.9977-4.2302-2.875-6.9406,1.7267-4.1686,4.2017-7.9058,7.3563-11.1076,3.268-3.3171,7.122-5.9089,11.4551-7.7038,5.956-2.4672,10.5947-7.1058,13.0615-13.0615,1.1227-2.7107,4.2303-3.9976,6.9406-2.875,2.7105,1.1227,3.9977,4.2302,2.875,6.9406-1.7267,4.1686-4.2017,7.9058-7.3563,11.1076-3.268,3.3171-7.122,5.9089-11.4551,7.7038-5.956,2.4672-10.5947,7.1058-13.0615,13.0615-.8473,2.0457-2.8255,3.2808-4.9099,3.2808Z"/></g></svg>
|
Before Width: | Height: | Size: 1.4 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:none;stroke:#fff;stroke-linejoin:round;stroke-width:4.375px;}.h{fill:url(#e);}.h,.i{stroke-width:0px;}.i{fill:#81c66c;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="i" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="g" d="M33.3917,50.625h22.5458c2.9642,0,5.3614,2.4276,5.3117,5.4032-.0486,2.9129-2.4859,5.2218-5.3992,5.2218h-31.7886"/><path class="g" d="M46.2859,29.375h-22.136c-2.9133,0-5.3506-2.3089-5.3992-5.2218-.0496-2.9756,2.3475-5.4032,5.3117-5.4032h31.8763"/><path class="g" d="M24.0615,61.25c-.6775,0-1.3659-.1303-2.0307-.4057-2.7105-1.1227-3.9977-4.2302-2.875-6.9406,1.7267-4.1686,4.2017-7.9058,7.3563-11.1076,3.268-3.3171,7.122-5.9089,11.4551-7.7038,5.956-2.4672,10.5947-7.1058,13.0615-13.0615,1.1227-2.7107,4.2303-3.9976,6.9406-2.875,2.7105,1.1227,3.9977,4.2302,2.875,6.9406-1.7267,4.1686-4.2017,7.9058-7.3563,11.1076-3.268,3.3171-7.122,5.9089-11.4551,7.7038-5.956,2.4672-10.5947,7.1058-13.0615,13.0615-.8473,2.0457-2.8255,3.2808-4.9099,3.2808Z"/></g></svg>
|
Before Width: | Height: | Size: 1.4 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:none;stroke:#fff;stroke-linejoin:round;stroke-width:4.375px;}.h{fill:url(#e);}.h,.i{stroke-width:0px;}.i{fill:#ef6cd9;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="i" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="g" d="M33.3917,50.625h22.5458c2.9642,0,5.3614,2.4276,5.3117,5.4032-.0486,2.9129-2.4859,5.2218-5.3992,5.2218h-31.7886"/><path class="g" d="M46.2859,29.375h-22.136c-2.9133,0-5.3506-2.3089-5.3992-5.2218-.0496-2.9756,2.3475-5.4032,5.3117-5.4032h31.8763"/><path class="g" d="M24.0615,61.25c-.6775,0-1.3659-.1303-2.0307-.4057-2.7105-1.1227-3.9977-4.2302-2.875-6.9406,1.7267-4.1686,4.2017-7.9058,7.3563-11.1076,3.268-3.3171,7.122-5.9089,11.4551-7.7038,5.956-2.4672,10.5947-7.1058,13.0615-13.0615,1.1227-2.7107,4.2303-3.9976,6.9406-2.875,2.7105,1.1227,3.9977,4.2302,2.875,6.9406-1.7267,4.1686-4.2017,7.9058-7.3563,11.1076-3.268,3.3171-7.122,5.9089-11.4551,7.7038-5.956,2.4672-10.5947,7.1058-13.0615,13.0615-.8473,2.0457-2.8255,3.2808-4.9099,3.2808Z"/></g></svg>
|
Before Width: | Height: | Size: 1.4 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:none;stroke:#fff;stroke-linejoin:round;stroke-width:4.375px;}.h{fill:url(#e);}.h,.i{stroke-width:0px;}.i{fill:#ff708d;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="i" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="g" d="M33.3917,50.625h22.5458c2.9642,0,5.3614,2.4276,5.3117,5.4032-.0486,2.9129-2.4859,5.2218-5.3992,5.2218h-31.7886"/><path class="g" d="M46.2859,29.375h-22.136c-2.9133,0-5.3506-2.3089-5.3992-5.2218-.0496-2.9756,2.3475-5.4032,5.3117-5.4032h31.8763"/><path class="g" d="M24.0615,61.25c-.6775,0-1.3659-.1303-2.0307-.4057-2.7105-1.1227-3.9977-4.2302-2.875-6.9406,1.7267-4.1686,4.2017-7.9058,7.3563-11.1076,3.268-3.3171,7.122-5.9089,11.4551-7.7038,5.956-2.4672,10.5947-7.1058,13.0615-13.0615,1.1227-2.7107,4.2303-3.9976,6.9406-2.875,2.7105,1.1227,3.9977,4.2302,2.875,6.9406-1.7267,4.1686-4.2017,7.9058-7.3563,11.1076-3.268,3.3171-7.122,5.9089-11.4551,7.7038-5.956,2.4672-10.5947,7.1058-13.0615,13.0615-.8473,2.0457-2.8255,3.2808-4.9099,3.2808Z"/></g></svg>
|
Before Width: | Height: | Size: 1.4 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:none;stroke:#fff;stroke-linejoin:round;stroke-width:4.375px;}.h{fill:url(#e);}.h,.i{stroke-width:0px;}.i{fill:#ff9147;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="i" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="g" d="M33.3917,50.625h22.5458c2.9642,0,5.3614,2.4276,5.3117,5.4032-.0486,2.9129-2.4859,5.2218-5.3992,5.2218h-31.7886"/><path class="g" d="M46.2859,29.375h-22.136c-2.9133,0-5.3506-2.3089-5.3992-5.2218-.0496-2.9756,2.3475-5.4032,5.3117-5.4032h31.8763"/><path class="g" d="M24.0615,61.25c-.6775,0-1.3659-.1303-2.0307-.4057-2.7105-1.1227-3.9977-4.2302-2.875-6.9406,1.7267-4.1686,4.2017-7.9058,7.3563-11.1076,3.268-3.3171,7.122-5.9089,11.4551-7.7038,5.956-2.4672,10.5947-7.1058,13.0615-13.0615,1.1227-2.7107,4.2303-3.9976,6.9406-2.875,2.7105,1.1227,3.9977,4.2302,2.875,6.9406-1.7267,4.1686-4.2017,7.9058-7.3563,11.1076-3.268,3.3171-7.122,5.9089-11.4551,7.7038-5.956,2.4672-10.5947,7.1058-13.0615,13.0615-.8473,2.0457-2.8255,3.2808-4.9099,3.2808Z"/></g></svg>
|
Before Width: | Height: | Size: 1.4 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:none;stroke:#fff;stroke-linejoin:round;stroke-width:4.375px;}.h{fill:url(#e);}.h,.i{stroke-width:0px;}.i{fill:#41c8b8;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="i" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="g" d="M33.3917,50.625h22.5458c2.9642,0,5.3614,2.4276,5.3117,5.4032-.0486,2.9129-2.4859,5.2218-5.3992,5.2218h-31.7886"/><path class="g" d="M46.2859,29.375h-22.136c-2.9133,0-5.3506-2.3089-5.3992-5.2218-.0496-2.9756,2.3475-5.4032,5.3117-5.4032h31.8763"/><path class="g" d="M24.0615,61.25c-.6775,0-1.3659-.1303-2.0307-.4057-2.7105-1.1227-3.9977-4.2302-2.875-6.9406,1.7267-4.1686,4.2017-7.9058,7.3563-11.1076,3.268-3.3171,7.122-5.9089,11.4551-7.7038,5.956-2.4672,10.5947-7.1058,13.0615-13.0615,1.1227-2.7107,4.2303-3.9976,6.9406-2.875,2.7105,1.1227,3.9977,4.2302,2.875,6.9406-1.7267,4.1686-4.2017,7.9058-7.3563,11.1076-3.268,3.3171-7.122,5.9089-11.4551,7.7038-5.956,2.4672-10.5947,7.1058-13.0615,13.0615-.8473,2.0457-2.8255,3.2808-4.9099,3.2808Z"/></g></svg>
|
Before Width: | Height: | Size: 1.4 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:url(#d);}.g,.h{stroke-width:0px;}.i{fill:none;stroke:#141414;stroke-linejoin:round;stroke-width:4.375px;}.h{fill:#fff;}</style><linearGradient id="d" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#000" stop-opacity=".05"/><stop offset=".9" stop-color="#000" stop-opacity="0"/></linearGradient></defs><g id="c"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/><rect class="g" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="i" d="M33.3917,50.625h22.5458c2.9642,0,5.3614,2.4276,5.3117,5.4032-.0486,2.9129-2.4859,5.2218-5.3992,5.2218h-31.7886"/><path class="i" d="M46.2859,29.375h-22.136c-2.9133,0-5.3506-2.3089-5.3992-5.2218-.0496-2.9756,2.3475-5.4032,5.3117-5.4032h31.8763"/><path class="i" d="M24.0615,61.25c-.6775,0-1.3659-.1303-2.0307-.4057-2.7105-1.1227-3.9977-4.2302-2.875-6.9406,1.7267-4.1686,4.2017-7.9058,7.3563-11.1076,3.268-3.3171,7.122-5.9089,11.4551-7.7038,5.956-2.4672,10.5947-7.1058,13.0615-13.0615,1.1227-2.7107,4.2303-3.9976,6.9406-2.875,2.7105,1.1227,3.9977,4.2302,2.875,6.9406-1.7267,4.1686-4.2017,7.9058-7.3563,11.1076-3.268,3.3171-7.122,5.9089-11.4551,7.7038-5.956,2.4672-10.5947,7.1058-13.0615,13.0615-.8473,2.0457-2.8255,3.2808-4.9099,3.2808Z"/></g></svg>
|
Before Width: | Height: | Size: 1.4 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:none;stroke:#fff;stroke-linejoin:round;stroke-width:4.375px;}.h{fill:url(#e);}.h,.i{stroke-width:0px;}.i{fill:#d4b435;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="i" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="g" d="M33.3917,50.625h22.5458c2.9642,0,5.3614,2.4276,5.3117,5.4032-.0486,2.9129-2.4859,5.2218-5.3992,5.2218h-31.7886"/><path class="g" d="M46.2859,29.375h-22.136c-2.9133,0-5.3506-2.3089-5.3992-5.2218-.0496-2.9756,2.3475-5.4032,5.3117-5.4032h31.8763"/><path class="g" d="M24.0615,61.25c-.6775,0-1.3659-.1303-2.0307-.4057-2.7105-1.1227-3.9977-4.2302-2.875-6.9406,1.7267-4.1686,4.2017-7.9058,7.3563-11.1076,3.268-3.3171,7.122-5.9089,11.4551-7.7038,5.956-2.4672,10.5947-7.1058,13.0615-13.0615,1.1227-2.7107,4.2303-3.9976,6.9406-2.875,2.7105,1.1227,3.9977,4.2302,2.875,6.9406-1.7267,4.1686-4.2017,7.9058-7.3563,11.1076-3.268,3.3171-7.122,5.9089-11.4551,7.7038-5.956,2.4672-10.5947,7.1058-13.0615,13.0615-.8473,2.0457-2.8255,3.2808-4.9099,3.2808Z"/></g></svg>
|
Before Width: | Height: | Size: 1.4 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:#000;}.g,.h,.i{stroke-width:0px;}.h{fill:url(#e);}.i{fill:#fef9fe;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity=".02"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="g" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="i" d="M63.4352,57.677c-.0536,3.2125-2.7416,5.7589-5.9546,5.7589h-22.0762c-1.1221,0-1.8295-1.2103-1.2751-2.1859,1.4628-2.5738,4.3202-6.7829,8.5529-9.1539.4406-.2468.9366-.3783,1.4416-.3783h13.4532c3.2692,0,5.9129,2.6774,5.8582,5.9591Z"/><path class="i" d="M45.8707,18.7498c-1.4628,2.5738-4.3202,6.7829-8.5529,9.1539-.4406.2468-.9366.3783-1.4416.3783h-13.3567c-3.213,0-5.901-2.5464-5.9546-5.7589-.0547-3.2817,2.589-5.9591,5.8582-5.9591h22.1726c1.1221,0,1.8295,1.2103,1.2751,2.1859Z"/><path class="i" d="M22.4207,63.4375c-.7473,0-1.5065-.1438-2.2398-.4475-2.9896-1.2383-4.4093-4.6657-3.171-7.6551,1.9045-4.5977,4.6342-8.7196,8.1136-12.2511,3.6044-3.6585,7.8551-6.5172,12.6343-8.4968,6.5691-2.7211,11.6853-7.8373,14.4061-14.4061,1.2383-2.9896,4.6658-4.409,7.6551-3.171,2.9896,1.2383,4.4093,4.6657,3.171,7.6551-1.9045,4.5977-4.6342,8.7196-8.1136,12.2511-3.6044,3.6585-7.8551,6.5172-12.6343,8.4968-6.5691,2.7211-11.6853,7.8373-14.4061,14.4061-.9345,2.2562-3.1164,3.6185-5.4153,3.6185Z"/></g></svg>
|
Before Width: | Height: | Size: 1.6 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:url(#e);}.g,.h,.i{stroke-width:0px;}.h{fill:#70a0ff;}.i{fill:#fef9fe;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="g" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="i" d="M63.4352,57.677c-.0536,3.2125-2.7416,5.7589-5.9546,5.7589h-22.0762c-1.1221,0-1.8295-1.2103-1.2751-2.1859,1.4628-2.5738,4.3202-6.7829,8.5529-9.1539.4406-.2468.9366-.3783,1.4416-.3783h13.4532c3.2692,0,5.9129,2.6774,5.8582,5.9591Z"/><path class="i" d="M45.8707,18.7498c-1.4628,2.5738-4.3202,6.7829-8.5529,9.1539-.4406.2468-.9366.3783-1.4416.3783h-13.3567c-3.213,0-5.901-2.5464-5.9546-5.7589-.0547-3.2817,2.589-5.9591,5.8582-5.9591h22.1726c1.1221,0,1.8295,1.2103,1.2751,2.1859Z"/><path class="i" d="M22.4207,63.4375c-.7473,0-1.5065-.1438-2.2398-.4475-2.9896-1.2383-4.4093-4.6657-3.171-7.6551,1.9045-4.5977,4.6342-8.7196,8.1136-12.2511,3.6044-3.6585,7.8551-6.5172,12.6343-8.4968,6.5691-2.7211,11.6853-7.8373,14.4061-14.4061,1.2383-2.9896,4.6658-4.409,7.6551-3.171,2.9896,1.2383,4.4093,4.6657,3.171,7.6551-1.9045,4.5977-4.6342,8.7196-8.1136,12.2511-3.6044,3.6585-7.8551,6.5172-12.6343,8.4968-6.5691,2.7211-11.6853,7.8373-14.4061,14.4061-.9345,2.2562-3.1164,3.6185-5.4153,3.6185Z"/></g></svg>
|
Before Width: | Height: | Size: 1.6 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:url(#e);}.g,.h,.i{stroke-width:0px;}.h{fill:#fef9fe;}.i{fill:#c7949b;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="i" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="g" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="h" d="M63.4352,57.677c-.0536,3.2125-2.7416,5.7589-5.9546,5.7589h-22.0762c-1.1221,0-1.8295-1.2103-1.2751-2.1859,1.4628-2.5738,4.3202-6.7829,8.5529-9.1539.4406-.2468.9366-.3783,1.4416-.3783h13.4532c3.2692,0,5.9129,2.6774,5.8582,5.9591Z"/><path class="h" d="M45.8707,18.7498c-1.4628,2.5738-4.3202,6.7829-8.5529,9.1539-.4406.2468-.9366.3783-1.4416.3783h-13.3567c-3.213,0-5.901-2.5464-5.9546-5.7589-.0547-3.2817,2.589-5.9591,5.8582-5.9591h22.1726c1.1221,0,1.8295,1.2103,1.2751,2.1859Z"/><path class="h" d="M22.4207,63.4375c-.7473,0-1.5065-.1438-2.2398-.4475-2.9896-1.2383-4.4093-4.6657-3.171-7.6551,1.9045-4.5977,4.6342-8.7196,8.1136-12.2511,3.6044-3.6585,7.8551-6.5172,12.6343-8.4968,6.5691-2.7211,11.6853-7.8373,14.4061-14.4061,1.2383-2.9896,4.6658-4.409,7.6551-3.171,2.9896,1.2383,4.4093,4.6657,3.171,7.6551-1.9045,4.5977-4.6342,8.7196-8.1136,12.2511-3.6044,3.6585-7.8551,6.5172-12.6343,8.4968-6.5691,2.7211-11.6853,7.8373-14.4061,14.4061-.9345,2.2562-3.1164,3.6185-5.4153,3.6185Z"/></g></svg>
|
Before Width: | Height: | Size: 1.6 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:url(#e);}.g,.h,.i{stroke-width:0px;}.h{fill:#c9987e;}.i{fill:#fef9fe;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="g" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="i" d="M63.4352,57.677c-.0536,3.2125-2.7416,5.7589-5.9546,5.7589h-22.0762c-1.1221,0-1.8295-1.2103-1.2751-2.1859,1.4628-2.5738,4.3202-6.7829,8.5529-9.1539.4406-.2468.9366-.3783,1.4416-.3783h13.4532c3.2692,0,5.9129,2.6774,5.8582,5.9591Z"/><path class="i" d="M45.8707,18.7498c-1.4628,2.5738-4.3202,6.7829-8.5529,9.1539-.4406.2468-.9366.3783-1.4416.3783h-13.3567c-3.213,0-5.901-2.5464-5.9546-5.7589-.0547-3.2817,2.589-5.9591,5.8582-5.9591h22.1726c1.1221,0,1.8295,1.2103,1.2751,2.1859Z"/><path class="i" d="M22.4207,63.4375c-.7473,0-1.5065-.1438-2.2398-.4475-2.9896-1.2383-4.4093-4.6657-3.171-7.6551,1.9045-4.5977,4.6342-8.7196,8.1136-12.2511,3.6044-3.6585,7.8551-6.5172,12.6343-8.4968,6.5691-2.7211,11.6853-7.8373,14.4061-14.4061,1.2383-2.9896,4.6658-4.409,7.6551-3.171,2.9896,1.2383,4.4093,4.6657,3.171,7.6551-1.9045,4.5977-4.6342,8.7196-8.1136,12.2511-3.6044,3.6585-7.8551,6.5172-12.6343,8.4968-6.5691,2.7211-11.6853,7.8373-14.4061,14.4061-.9345,2.2562-3.1164,3.6185-5.4153,3.6185Z"/></g></svg>
|
Before Width: | Height: | Size: 1.6 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:url(#e);}.g,.h,.i{stroke-width:0px;}.h{fill:#a570ff;}.i{fill:#fef9fe;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="g" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="i" d="M63.4352,57.677c-.0536,3.2125-2.7416,5.7589-5.9546,5.7589h-22.0762c-1.1221,0-1.8295-1.2103-1.2751-2.1859,1.4628-2.5738,4.3202-6.7829,8.5529-9.1539.4406-.2468.9366-.3783,1.4416-.3783h13.4532c3.2692,0,5.9129,2.6774,5.8582,5.9591Z"/><path class="i" d="M45.8707,18.7498c-1.4628,2.5738-4.3202,6.7829-8.5529,9.1539-.4406.2468-.9366.3783-1.4416.3783h-13.3567c-3.213,0-5.901-2.5464-5.9546-5.7589-.0547-3.2817,2.589-5.9591,5.8582-5.9591h22.1726c1.1221,0,1.8295,1.2103,1.2751,2.1859Z"/><path class="i" d="M22.4207,63.4375c-.7473,0-1.5065-.1438-2.2398-.4475-2.9896-1.2383-4.4093-4.6657-3.171-7.6551,1.9045-4.5977,4.6342-8.7196,8.1136-12.2511,3.6044-3.6585,7.8551-6.5172,12.6343-8.4968,6.5691-2.7211,11.6853-7.8373,14.4061-14.4061,1.2383-2.9896,4.6658-4.409,7.6551-3.171,2.9896,1.2383,4.4093,4.6657,3.171,7.6551-1.9045,4.5977-4.6342,8.7196-8.1136,12.2511-3.6044,3.6585-7.8551,6.5172-12.6343,8.4968-6.5691,2.7211-11.6853,7.8373-14.4061,14.4061-.9345,2.2562-3.1164,3.6185-5.4153,3.6185Z"/></g></svg>
|
Before Width: | Height: | Size: 1.6 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:url(#e);}.g,.h,.i{stroke-width:0px;}.h{fill:#81c66c;}.i{fill:#fef9fe;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="g" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="i" d="M63.4352,57.677c-.0536,3.2125-2.7416,5.7589-5.9546,5.7589h-22.0762c-1.1221,0-1.8295-1.2103-1.2751-2.1859,1.4628-2.5738,4.3202-6.7829,8.5529-9.1539.4406-.2468.9366-.3783,1.4416-.3783h13.4532c3.2692,0,5.9129,2.6774,5.8582,5.9591Z"/><path class="i" d="M45.8707,18.7498c-1.4628,2.5738-4.3202,6.7829-8.5529,9.1539-.4406.2468-.9366.3783-1.4416.3783h-13.3567c-3.213,0-5.901-2.5464-5.9546-5.7589-.0547-3.2817,2.589-5.9591,5.8582-5.9591h22.1726c1.1221,0,1.8295,1.2103,1.2751,2.1859Z"/><path class="i" d="M22.4207,63.4375c-.7473,0-1.5065-.1438-2.2398-.4475-2.9896-1.2383-4.4093-4.6657-3.171-7.6551,1.9045-4.5977,4.6342-8.7196,8.1136-12.2511,3.6044-3.6585,7.8551-6.5172,12.6343-8.4968,6.5691-2.7211,11.6853-7.8373,14.4061-14.4061,1.2383-2.9896,4.6658-4.409,7.6551-3.171,2.9896,1.2383,4.4093,4.6657,3.171,7.6551-1.9045,4.5977-4.6342,8.7196-8.1136,12.2511-3.6044,3.6585-7.8551,6.5172-12.6343,8.4968-6.5691,2.7211-11.6853,7.8373-14.4061,14.4061-.9345,2.2562-3.1164,3.6185-5.4153,3.6185Z"/></g></svg>
|
Before Width: | Height: | Size: 1.6 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:url(#e);}.g,.h,.i{stroke-width:0px;}.h{fill:#fef9fe;}.i{fill:#ef6cd9;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="i" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="g" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="h" d="M63.4352,57.677c-.0536,3.2125-2.7416,5.7589-5.9546,5.7589h-22.0762c-1.1221,0-1.8295-1.2103-1.2751-2.1859,1.4628-2.5738,4.3202-6.7829,8.5529-9.1539.4406-.2468.9366-.3783,1.4416-.3783h13.4532c3.2692,0,5.9129,2.6774,5.8582,5.9591Z"/><path class="h" d="M45.8707,18.7498c-1.4628,2.5738-4.3202,6.7829-8.5529,9.1539-.4406.2468-.9366.3783-1.4416.3783h-13.3567c-3.213,0-5.901-2.5464-5.9546-5.7589-.0547-3.2817,2.589-5.9591,5.8582-5.9591h22.1726c1.1221,0,1.8295,1.2103,1.2751,2.1859Z"/><path class="h" d="M22.4207,63.4375c-.7473,0-1.5065-.1438-2.2398-.4475-2.9896-1.2383-4.4093-4.6657-3.171-7.6551,1.9045-4.5977,4.6342-8.7196,8.1136-12.2511,3.6044-3.6585,7.8551-6.5172,12.6343-8.4968,6.5691-2.7211,11.6853-7.8373,14.4061-14.4061,1.2383-2.9896,4.6658-4.409,7.6551-3.171,2.9896,1.2383,4.4093,4.6657,3.171,7.6551-1.9045,4.5977-4.6342,8.7196-8.1136,12.2511-3.6044,3.6585-7.8551,6.5172-12.6343,8.4968-6.5691,2.7211-11.6853,7.8373-14.4061,14.4061-.9345,2.2562-3.1164,3.6185-5.4153,3.6185Z"/></g></svg>
|
Before Width: | Height: | Size: 1.6 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:url(#e);}.g,.h,.i{stroke-width:0px;}.h{fill:#fef9fe;}.i{fill:#ff708d;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="i" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="g" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="h" d="M63.4352,57.677c-.0536,3.2125-2.7416,5.7589-5.9546,5.7589h-22.0762c-1.1221,0-1.8295-1.2103-1.2751-2.1859,1.4628-2.5738,4.3202-6.7829,8.5529-9.1539.4406-.2468.9366-.3783,1.4416-.3783h13.4532c3.2692,0,5.9129,2.6774,5.8582,5.9591Z"/><path class="h" d="M45.8707,18.7498c-1.4628,2.5738-4.3202,6.7829-8.5529,9.1539-.4406.2468-.9366.3783-1.4416.3783h-13.3567c-3.213,0-5.901-2.5464-5.9546-5.7589-.0547-3.2817,2.589-5.9591,5.8582-5.9591h22.1726c1.1221,0,1.8295,1.2103,1.2751,2.1859Z"/><path class="h" d="M22.4207,63.4375c-.7473,0-1.5065-.1438-2.2398-.4475-2.9896-1.2383-4.4093-4.6657-3.171-7.6551,1.9045-4.5977,4.6342-8.7196,8.1136-12.2511,3.6044-3.6585,7.8551-6.5172,12.6343-8.4968,6.5691-2.7211,11.6853-7.8373,14.4061-14.4061,1.2383-2.9896,4.6658-4.409,7.6551-3.171,2.9896,1.2383,4.4093,4.6657,3.171,7.6551-1.9045,4.5977-4.6342,8.7196-8.1136,12.2511-3.6044,3.6585-7.8551,6.5172-12.6343,8.4968-6.5691,2.7211-11.6853,7.8373-14.4061,14.4061-.9345,2.2562-3.1164,3.6185-5.4153,3.6185Z"/></g></svg>
|
Before Width: | Height: | Size: 1.6 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:url(#e);}.g,.h,.i{stroke-width:0px;}.h{fill:#ff9147;}.i{fill:#fef9fe;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="g" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="i" d="M63.4352,57.677c-.0536,3.2125-2.7416,5.7589-5.9546,5.7589h-22.0762c-1.1221,0-1.8295-1.2103-1.2751-2.1859,1.4628-2.5738,4.3202-6.7829,8.5529-9.1539.4406-.2468.9366-.3783,1.4416-.3783h13.4532c3.2692,0,5.9129,2.6774,5.8582,5.9591Z"/><path class="i" d="M45.8707,18.7498c-1.4628,2.5738-4.3202,6.7829-8.5529,9.1539-.4406.2468-.9366.3783-1.4416.3783h-13.3567c-3.213,0-5.901-2.5464-5.9546-5.7589-.0547-3.2817,2.589-5.9591,5.8582-5.9591h22.1726c1.1221,0,1.8295,1.2103,1.2751,2.1859Z"/><path class="i" d="M22.4207,63.4375c-.7473,0-1.5065-.1438-2.2398-.4475-2.9896-1.2383-4.4093-4.6657-3.171-7.6551,1.9045-4.5977,4.6342-8.7196,8.1136-12.2511,3.6044-3.6585,7.8551-6.5172,12.6343-8.4968,6.5691-2.7211,11.6853-7.8373,14.4061-14.4061,1.2383-2.9896,4.6658-4.409,7.6551-3.171,2.9896,1.2383,4.4093,4.6657,3.171,7.6551-1.9045,4.5977-4.6342,8.7196-8.1136,12.2511-3.6044,3.6585-7.8551,6.5172-12.6343,8.4968-6.5691,2.7211-11.6853,7.8373-14.4061,14.4061-.9345,2.2562-3.1164,3.6185-5.4153,3.6185Z"/></g></svg>
|
Before Width: | Height: | Size: 1.6 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:url(#e);}.g,.h,.i{stroke-width:0px;}.h{fill:#41c8b8;}.i{fill:#fef9fe;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="h" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="g" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="i" d="M63.4352,57.677c-.0536,3.2125-2.7416,5.7589-5.9546,5.7589h-22.0762c-1.1221,0-1.8295-1.2103-1.2751-2.1859,1.4628-2.5738,4.3202-6.7829,8.5529-9.1539.4406-.2468.9366-.3783,1.4416-.3783h13.4532c3.2692,0,5.9129,2.6774,5.8582,5.9591Z"/><path class="i" d="M45.8707,18.7498c-1.4628,2.5738-4.3202,6.7829-8.5529,9.1539-.4406.2468-.9366.3783-1.4416.3783h-13.3567c-3.213,0-5.901-2.5464-5.9546-5.7589-.0547-3.2817,2.589-5.9591,5.8582-5.9591h22.1726c1.1221,0,1.8295,1.2103,1.2751,2.1859Z"/><path class="i" d="M22.4207,63.4375c-.7473,0-1.5065-.1438-2.2398-.4475-2.9896-1.2383-4.4093-4.6657-3.171-7.6551,1.9045-4.5977,4.6342-8.7196,8.1136-12.2511,3.6044-3.6585,7.8551-6.5172,12.6343-8.4968,6.5691-2.7211,11.6853-7.8373,14.4061-14.4061,1.2383-2.9896,4.6658-4.409,7.6551-3.171,2.9896,1.2383,4.4093,4.6657,3.171,7.6551-1.9045,4.5977-4.6342,8.7196-8.1136,12.2511-3.6044,3.6585-7.8551,6.5172-12.6343,8.4968-6.5691,2.7211-11.6853,7.8373-14.4061,14.4061-.9345,2.2562-3.1164,3.6185-5.4153,3.6185Z"/></g></svg>
|
Before Width: | Height: | Size: 1.6 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:url(#e);}.g,.h,.i{stroke-width:0px;}.h{fill:#141414;}.i{fill:#fff;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity=".02"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="i" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="g" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="h" d="M63.4352,57.677c-.0536,3.2125-2.7416,5.7589-5.9546,5.7589h-22.0762c-1.1221,0-1.8295-1.2103-1.2751-2.1859,1.4628-2.5738,4.3202-6.7829,8.5529-9.1539.4406-.2468.9366-.3783,1.4416-.3783h13.4532c3.2692,0,5.9129,2.6774,5.8582,5.9591Z"/><path class="h" d="M45.8707,18.7498c-1.4628,2.5738-4.3202,6.7829-8.5529,9.1539-.4406.2468-.9366.3783-1.4416.3783h-13.3567c-3.213,0-5.901-2.5464-5.9546-5.7589-.0547-3.2817,2.589-5.9591,5.8582-5.9591h22.1726c1.1221,0,1.8295,1.2103,1.2751,2.1859Z"/><path class="h" d="M22.4207,63.4375c-.7473,0-1.5065-.1438-2.2398-.4475-2.9896-1.2383-4.4093-4.6657-3.171-7.6551,1.9045-4.5977,4.6342-8.7196,8.1136-12.2511,3.6044-3.6585,7.8551-6.5172,12.6343-8.4968,6.5691-2.7211,11.6853-7.8373,14.4061-14.4061,1.2383-2.9896,4.6658-4.409,7.6551-3.171,2.9896,1.2383,4.4093,4.6657,3.171,7.6551-1.9045,4.5977-4.6342,8.7196-8.1136,12.2511-3.6044,3.6585-7.8551,6.5172-12.6343,8.4968-6.5691,2.7211-11.6853,7.8373-14.4061,14.4061-.9345,2.2562-3.1164,3.6185-5.4153,3.6185Z"/></g></svg>
|
Before Width: | Height: | Size: 1.6 KiB |
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80"><defs><style>.g{fill:url(#e);}.g,.h,.i{stroke-width:0px;}.h{fill:#fef9fe;}.i{fill:#d4b435;}</style><linearGradient id="e" x1="40" y1="80" x2="40" y2="0" gradientUnits="userSpaceOnUse"><stop offset=".1" stop-color="#fff" stop-opacity="0"/><stop offset=".9" stop-color="#fff" stop-opacity=".1"/></linearGradient></defs><g id="c"><rect class="i" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="d"><rect class="g" width="80" height="80" rx="18.25" ry="18.25"/></g><g id="f"><path class="h" d="M63.4352,57.677c-.0536,3.2125-2.7416,5.7589-5.9546,5.7589h-22.0762c-1.1221,0-1.8295-1.2103-1.2751-2.1859,1.4628-2.5738,4.3202-6.7829,8.5529-9.1539.4406-.2468.9366-.3783,1.4416-.3783h13.4532c3.2692,0,5.9129,2.6774,5.8582,5.9591Z"/><path class="h" d="M45.8707,18.7498c-1.4628,2.5738-4.3202,6.7829-8.5529,9.1539-.4406.2468-.9366.3783-1.4416.3783h-13.3567c-3.213,0-5.901-2.5464-5.9546-5.7589-.0547-3.2817,2.589-5.9591,5.8582-5.9591h22.1726c1.1221,0,1.8295,1.2103,1.2751,2.1859Z"/><path class="h" d="M22.4207,63.4375c-.7473,0-1.5065-.1438-2.2398-.4475-2.9896-1.2383-4.4093-4.6657-3.171-7.6551,1.9045-4.5977,4.6342-8.7196,8.1136-12.2511,3.6044-3.6585,7.8551-6.5172,12.6343-8.4968,6.5691-2.7211,11.6853-7.8373,14.4061-14.4061,1.2383-2.9896,4.6658-4.409,7.6551-3.171,2.9896,1.2383,4.4093,4.6657,3.171,7.6551-1.9045,4.5977-4.6342,8.7196-8.1136,12.2511-3.6044,3.6585-7.8551,6.5172-12.6343,8.4968-6.5691,2.7211-11.6853,7.8373-14.4061,14.4061-.9345,2.2562-3.1164,3.6185-5.4153,3.6185Z"/></g></svg>
|
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 667 KiB |
Before Width: | Height: | Size: 1.3 MiB |
Before Width: | Height: | Size: 719 KiB |
Before Width: | Height: | Size: 850 KiB |
Before Width: | Height: | Size: 515 KiB |
Before Width: | Height: | Size: 692 KiB |
Before Width: | Height: | Size: 351 KiB |
Before Width: | Height: | Size: 851 KiB |
Before Width: | Height: | Size: 677 KiB |
Before Width: | Height: | Size: 661 KiB |
Before Width: | Height: | Size: 156 KiB |
|
@ -1,3 +0,0 @@
|
|||
User-agent: *
|
||||
Allow: /
|
||||
Disallow: /welcome
|
Before Width: | Height: | Size: 118 KiB |
|
@ -1 +0,0 @@
|
|||
{ "ZenBot": 200 }
|
Before Width: | Height: | Size: 155 KiB |
|
@ -1,6 +0,0 @@
|
|||
import { redirect } from "next/navigation";
|
||||
|
||||
export default function WhyAreYouEvenHere() {
|
||||
redirect("https://www.youtube.com/watch?v=dQw4w9WgXcQ");
|
||||
return null;
|
||||
}
|
|
@ -1,43 +0,0 @@
|
|||
"use client";
|
||||
|
||||
import Markdown from "react-markdown";
|
||||
import "../privacy-policy/markdown.css";
|
||||
|
||||
export default function PrivacyPolicy() {
|
||||
return (
|
||||
<div
|
||||
id="policy"
|
||||
className="py-42 mx-auto my-52 flex min-h-screen w-full flex-col p-10 lg:w-1/3 lg:p-0"
|
||||
>
|
||||
<Markdown>
|
||||
{`
|
||||
# Main Developer Team
|
||||
|
||||
These are the most active developers in the project. Awesome people that make Zen Browser possible, the order is not important, all of them are a big part of the project.
|
||||
|
||||
* [**Mauro Baladés**](https://github.com/mauro-balades): Creator, Main Developer, and a funny guy.
|
||||
* **Oscar Gonzalez**: Site Reliability Engineer (SRE) and code signing.
|
||||
* [**Jan Heres**](https://janheres.eu/): Active contributor and helps with MacOS builds, known as \`mr. macos\`.
|
||||
* [**BrhmDev**](https://github.com/BrhmDev): Active contributor with great contributions, known as \`mr. black magic\`.
|
||||
* [**Canoa**](https://thatcanoa.org/) Active contributor, and very active in issue handling and website management, known as \`mr. site & benchmarker\`.
|
||||
* [**kristijanribaric**](https://github.com/kristijanribaric): Active contributor, known as \`mr. workspaces\`.
|
||||
* [**n7itro**](https://github.com/n7itro): Active contributor and release notes writer, known as \`mr. discord\`. (Also discord moderator, but who would want to be that?)
|
||||
* [**Bryan Galdámez**](https://josuegalre.netlify.app/): Huge contributor on theme functionalities, known as \`mr. themes\`.
|
||||
* [**Jafeth Garro**](https://iamjafeth.com/): Documentation writer, known as \`mr. docs\`.
|
||||
* [**Larvey**](https://github.com/LarveyOfficial/): AUR maintainer, known as \`mr. AUR manager\`.
|
||||
* [**Gunir**](https://github.com/gunir): Helps a lot with firefox's configuration and knowledge, known as \`mr. optimizations\`.
|
||||
|
||||
> These contributors have a "mr." nickname because it resembles their main contributions to the project, and it's a fun way to recognize them.
|
||||
|
||||
# Many more contributors! 🎉
|
||||
|
||||
*These are the desktop contributors:*
|
||||

|
||||
|
||||
*These are the site contributors:*
|
||||

|
||||
`}
|
||||
</Markdown>
|
||||
</div>
|
||||
);
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
import { BrandingAssets } from "@/components/branding-assets";
|
||||
|
||||
export default function BrandingAssetsPage() {
|
||||
return <BrandingAssets />;
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
import CreateThemePage from "@/components/create-theme";
|
||||
|
||||
export default function BrandingAssetsPage() {
|
||||
return <CreateThemePage />;
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
import DownloadPage from "@/components/download/download";
|
||||
|
||||
export default function Download() {
|
||||
return <DownloadPage />;
|
||||
}
|
|
@ -1,136 +0,0 @@
|
|||
import { Feed } from "feed";
|
||||
import { releaseNotes } from "@/lib/release-notes";
|
||||
import type { ReleaseNote } from "@/lib/release-notes";
|
||||
|
||||
// Force feed.xml to be cached as static and remain constant for the lifetime of the current site build.
|
||||
// The supplied releaseNotes array is constant per build, so this will always be the latest release notes.
|
||||
export const dynamic = "force-static";
|
||||
|
||||
/** The default number of entries to include in the RSS feed. */
|
||||
const RSS_ENTRY_LIMIT = 20;
|
||||
|
||||
/**
|
||||
* Handles the GET request for the `feed.xml` endpoint.
|
||||
* @returns The RSS feed for the Zen Browser release notes.
|
||||
*/
|
||||
export async function GET() {
|
||||
// Just in case the release notes array is empty for whatever reason.
|
||||
const latestDate =
|
||||
releaseNotes.length > 0 ? formatRssDate(releaseNotes[0].date) : new Date();
|
||||
|
||||
const feed = new Feed({
|
||||
id: "https://www.zen-browser.app/release-notes",
|
||||
link: "https://www.zen-browser.app/release-notes",
|
||||
title: "Zen Browser Release Notes",
|
||||
description: "Release Notes for the Zen Browser",
|
||||
language: "en",
|
||||
favicon: "https://www.zen-browser.app/favicon.ico",
|
||||
copyright: `Zen Browser © ${new Date().getFullYear()} - Made with ❤️ by the Zen team.`,
|
||||
updated: latestDate,
|
||||
});
|
||||
|
||||
for (const releaseNote of releaseNotes.slice(0, RSS_ENTRY_LIMIT)) {
|
||||
feed.addItem({
|
||||
title: `Release notes for version ${releaseNote.version}`,
|
||||
id: `https://www.zen-browser.app/release-notes/${releaseNote.version}`,
|
||||
link: `https://www.zen-browser.app/release-notes/${releaseNote.version}`,
|
||||
date: formatRssDate(releaseNote.date),
|
||||
description: releaseNote.extra,
|
||||
content: formatReleaseNote(releaseNote),
|
||||
});
|
||||
}
|
||||
|
||||
return new Response(feed.rss2(), {
|
||||
headers: {
|
||||
"Content-Type": "application/xml; charset=utf-8",
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats a date string in the format day/month/year.
|
||||
*
|
||||
* Note: If release notes change to ISO format, this will need to be updated.
|
||||
* @param dateStr The date string to format.
|
||||
* @returns The passed in date string as a Date object.
|
||||
*/
|
||||
function formatRssDate(dateStr: string) {
|
||||
const splitDate = dateStr.split("/");
|
||||
if (splitDate.length !== 3) {
|
||||
throw new Error("Invalid date format");
|
||||
}
|
||||
|
||||
const day = Number(splitDate[0]);
|
||||
const month = Number(splitDate[1]) - 1;
|
||||
const year = Number(splitDate[2]);
|
||||
return new Date(year, month, day);
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats the release note entry for use as the content of the RSS feed.
|
||||
* @param releaseNote The release note to format.
|
||||
* @returns The formatted release note as a HTML string.
|
||||
*/
|
||||
function formatReleaseNote(releaseNote: ReleaseNote) {
|
||||
let content = `<p>
|
||||
If you encounter any issues, please report them on <a href="https://github.com/zen-browser/desktop/issues/">the issues page</a>.
|
||||
Thanks everyone for your feedback! ❤️
|
||||
</p>`;
|
||||
|
||||
if (releaseNote.image) {
|
||||
content += `<img src="https://cdn.jsdelivr.net/gh/zen-browser/www/public/releases/${releaseNote.version}.png"
|
||||
alt="Release Image for version ${releaseNote.version}"
|
||||
style="max-width: 30em; width: 100%; border-radius: 0.5rem;"
|
||||
/>`;
|
||||
}
|
||||
|
||||
if (releaseNote.extra) {
|
||||
content += `<p>${releaseNote.extra.replace(/(\n)/g, "<br />")}</p>`;
|
||||
}
|
||||
|
||||
content += addReleaseNoteSection(
|
||||
"⚠️ Breaking changes",
|
||||
releaseNote.breakingChanges,
|
||||
);
|
||||
content += addReleaseNoteSection(
|
||||
"✓ Fixes",
|
||||
releaseNote.fixes?.map(fixToReleaseNote),
|
||||
);
|
||||
content += addReleaseNoteSection(
|
||||
"🖌 Theme Changes",
|
||||
releaseNote.themeChanges,
|
||||
);
|
||||
content += addReleaseNoteSection("⭐ Features", releaseNote.features);
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
function addReleaseNoteSection(title: string, items?: string[]): string {
|
||||
if (!items) {
|
||||
return "";
|
||||
}
|
||||
|
||||
let content = `<h2>${title}</h2>`;
|
||||
content += `<ul>`;
|
||||
for (const item of items) {
|
||||
if (item && item.length > 0) {
|
||||
content += `<li>${item}</li>`;
|
||||
}
|
||||
}
|
||||
content += `</ul>`;
|
||||
return content;
|
||||
}
|
||||
|
||||
function fixToReleaseNote(
|
||||
fix?: Exclude<ReleaseNote["fixes"], undefined>[number],
|
||||
) {
|
||||
if (!fix || !fix.description || fix.description.length === 0) {
|
||||
return "";
|
||||
}
|
||||
|
||||
let note = fix.description;
|
||||
if (fix.issue) {
|
||||
note += ` (<a href="https://github.com/zen-browser/desktop/issues/${fix.issue}" target="_blank">#${fix.issue}</a>)`;
|
||||
}
|
||||
return note;
|
||||
}
|
|
@ -1,114 +0,0 @@
|
|||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
@layer base {
|
||||
:root {
|
||||
--background: 0 0% 100%;
|
||||
--foreground: 0 0% 3.9%;
|
||||
|
||||
--card: 0 0% 100%;
|
||||
--card-foreground: 0 0% 3.9%;
|
||||
|
||||
--popover: 0 0% 100%;
|
||||
--popover-foreground: 0 0% 3.9%;
|
||||
|
||||
--primary: 0 0% 9%;
|
||||
--primary-foreground: 0 0% 98%;
|
||||
|
||||
--secondary: 0 0% 96.1%;
|
||||
--secondary-foreground: 0 0% 9%;
|
||||
|
||||
--muted: 0 0% 96.1%;
|
||||
--muted-foreground: 0 0% 45.1%;
|
||||
|
||||
--accent: 0 0% 96.1%;
|
||||
--accent-foreground: 0 0% 9%;
|
||||
|
||||
--destructive: 0 84.2% 60.2%;
|
||||
--destructive-foreground: 0 0% 98%;
|
||||
|
||||
--border: 0 0% 89.8%;
|
||||
--input: 0 0% 89.8%;
|
||||
--ring: 0 0% 3.9%;
|
||||
|
||||
--radius: 0.5rem;
|
||||
|
||||
/* Custom properties */
|
||||
--navigation-height: 3.5rem;
|
||||
--color-one: #ffbd7a;
|
||||
|
||||
--color-two: #fe8bbb;
|
||||
--color-three: #9e7aff;
|
||||
|
||||
--surface: rgb(245, 245, 245);
|
||||
|
||||
/*
|
||||
--color-one: #37ecba;
|
||||
--color-two: #72afd3;
|
||||
--color-three: #ff2e63;
|
||||
*/
|
||||
|
||||
--color-1: 0 100% 63%;
|
||||
--color-2: 270 100% 63%;
|
||||
--color-3: 210 100% 63%;
|
||||
--color-4: 195 100% 63%;
|
||||
--color-5: 90 100% 63%;
|
||||
}
|
||||
|
||||
[data-theme="dark"],
|
||||
.dark {
|
||||
--background: 5 5 5;
|
||||
--foreground: 0 0% 98%;
|
||||
|
||||
--surface: rgb(23, 23, 23);
|
||||
|
||||
--card: 0 0% 3.9%;
|
||||
--card-foreground: 0 0% 98%;
|
||||
|
||||
--popover: 0 0% 3.9%;
|
||||
--popover-foreground: 0 0% 98%;
|
||||
|
||||
--primary: 0 0% 98%;
|
||||
--primary-foreground: 0 0% 9%;
|
||||
|
||||
--secondary: 0 0% 14.9%;
|
||||
--secondary-foreground: 0 0% 98%;
|
||||
|
||||
--muted: 0 0% 14.9%;
|
||||
--muted-foreground: 0 0% 63.9%;
|
||||
|
||||
--accent: 0 0% 14.9%;
|
||||
--accent-foreground: 0 0% 98%;
|
||||
|
||||
--destructive: 0 62.8% 30.6%;
|
||||
--destructive-foreground: 0 0% 98%;
|
||||
|
||||
--border: 0 0% 14.9%;
|
||||
--input: 0 0% 14.9%;
|
||||
--ring: 0 0% 83.1%;
|
||||
--color-one: #6aa8e2;
|
||||
}
|
||||
}
|
||||
|
||||
@layer base {
|
||||
html {
|
||||
@apply scroll-smooth;
|
||||
}
|
||||
* {
|
||||
@apply border-border;
|
||||
}
|
||||
body {
|
||||
@apply bg-background text-foreground;
|
||||
}
|
||||
}
|
||||
|
||||
::selection {
|
||||
color: hsl(var(--primary-foreground));
|
||||
background: hsl(var(--primary));
|
||||
}
|
||||
|
||||
::-moz-selection {
|
||||
color: hsl(var(--primary-foreground));
|
||||
background: hsl(var(--primary));
|
||||
}
|
|
@ -1,79 +0,0 @@
|
|||
import type { Metadata } from "next";
|
||||
import { Inter } from "next/font/google";
|
||||
import "./globals.css";
|
||||
import { ThemeProvider } from "@/components/theme-provider";
|
||||
import StyledComponentsRegistry from "@/lib/styled-components-registry";
|
||||
import Footer from "@/components/footer";
|
||||
import { Navigation } from "@/components/navigation";
|
||||
import { ny } from "@/lib/utils";
|
||||
|
||||
const inter = Inter({ subsets: ["latin"] });
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Zen Browser",
|
||||
description: "Download now and experience the Zen Browser",
|
||||
keywords: ["Zen", "Browser", "Zen Browser", "Web", "Internet", "Fast"],
|
||||
applicationName: "Zen Browser",
|
||||
generator: "Next.js",
|
||||
creator: "Zen Team",
|
||||
robots: "index, follow",
|
||||
openGraph: {
|
||||
title: "Zen Browser",
|
||||
description: "Download now and experience the Zen Browser",
|
||||
locale: "en_US",
|
||||
url: "https://zen-browser.app/",
|
||||
siteName: "Zen Browser",
|
||||
},
|
||||
twitter: {
|
||||
creator: "@zen_browser",
|
||||
site: "@zen_browser",
|
||||
},
|
||||
appLinks: {
|
||||
web: {
|
||||
url: "https://zen-browser.app/download",
|
||||
},
|
||||
windows: {
|
||||
url: "https://zen-browser.app/download",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default async function RootLayout({
|
||||
children,
|
||||
}: Readonly<{
|
||||
children: React.ReactNode;
|
||||
}>) {
|
||||
return (
|
||||
<html suppressHydrationWarning>
|
||||
<head>
|
||||
<link rel="me" href="https://fosstodon.org/@zenbrowser"></link>
|
||||
<link rel="canonical" href="https://zen-browser.app/"></link>
|
||||
<link
|
||||
rel="alternate"
|
||||
type="application/rss+xml"
|
||||
title="Zen Browser Release Notes"
|
||||
href="https://www.zen-browser.app/feed.xml"
|
||||
/>
|
||||
</head>
|
||||
<body className={ny("bg-background", inter.className)}>
|
||||
<ThemeProvider
|
||||
attribute="class"
|
||||
defaultTheme="system"
|
||||
enableSystem
|
||||
disableTransitionOnChange
|
||||
scriptProps={{ "data-cfasync": "false" }}
|
||||
>
|
||||
<StyledComponentsRegistry>
|
||||
<div className="flex min-h-screen flex-col">
|
||||
<Navigation />
|
||||
<main className="flex h-full min-h-[1000px] flex-1 flex-col items-center justify-center py-4">
|
||||
{children}
|
||||
</main>
|
||||
<Footer />
|
||||
</div>
|
||||
</StyledComponentsRegistry>
|
||||
</ThemeProvider>
|
||||
</body>
|
||||
</html>
|
||||
);
|
||||
}
|
|
@ -1,51 +0,0 @@
|
|||
import ThemePage from "@/components/theme-page";
|
||||
import { getAllThemes, getThemeFromId } from "@/lib/mods";
|
||||
import { Metadata, ResolvingMetadata } from "next";
|
||||
|
||||
export async function generateMetadata(
|
||||
{ params, searchParams }: any,
|
||||
parent: ResolvingMetadata,
|
||||
): Promise<Metadata> {
|
||||
const theme = params.theme;
|
||||
const themeData = await getThemeFromId(theme);
|
||||
if (!themeData) {
|
||||
return {
|
||||
title: "Theme not found",
|
||||
description: "Theme not found",
|
||||
};
|
||||
}
|
||||
return {
|
||||
title: themeData.name,
|
||||
description: themeData.description,
|
||||
keywords: [themeData.name, themeData.description],
|
||||
openGraph: {
|
||||
title: themeData.name,
|
||||
description: themeData.description,
|
||||
images: [
|
||||
{
|
||||
url: themeData.image,
|
||||
width: 500,
|
||||
height: 500,
|
||||
alt: themeData.name,
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export async function generateStaticParams() {
|
||||
const themes = await getAllThemes();
|
||||
console.log(themes);
|
||||
return themes.map((theme) => ({
|
||||
theme: theme.id,
|
||||
}));
|
||||
}
|
||||
|
||||
export default async function ThemeInfoPage({
|
||||
params,
|
||||
}: {
|
||||
params: { theme: string };
|
||||
}) {
|
||||
const { theme } = params;
|
||||
return <ThemePage themeID={theme} />;
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
import MarketplacePage from "@/components/marketplace";
|
||||
import { getAllThemes } from "@/lib/mods";
|
||||
|
||||
export default async function ThemesMarketplace() {
|
||||
return <MarketplacePage themes={await getAllThemes()} />;
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
import { Button } from "@/components/ui/button";
|
||||
import { HomeIcon } from "@radix-ui/react-icons";
|
||||
|
||||
export default function NotFoundPage() {
|
||||
return (
|
||||
<main className="grid min-h-screen place-items-center">
|
||||
<div className="flex flex-col items-center justify-center text-center">
|
||||
<h1 className="-translate-y-4 animate-fade-in text-balance bg-gradient-to-br from-black from-30% to-black/40 bg-clip-text py-6 text-5xl font-semibold leading-none tracking-tighter text-transparent opacity-0 [--animation-delay:200ms] dark:from-white dark:to-white/40 sm:text-6xl md:text-7xl lg:text-8xl">
|
||||
Page Not Found!
|
||||
</h1>
|
||||
<a href="/">
|
||||
<Button className="flex -translate-y-4 animate-fade-in items-center justify-center gap-1 font-medium text-white opacity-0 ease-in-out [--animation-delay:600ms] dark:text-black">
|
||||
<span>Back to Home</span>
|
||||
<HomeIcon className="ml-1 size-4 transition-transform duration-300 ease-in-out group-hover:translate-x-1" />
|
||||
</Button>
|
||||
</a>
|
||||
</div>
|
||||
</main>
|
||||
);
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
import Features from "@/components/features";
|
||||
import Header from "@/components/header";
|
||||
|
||||
export default function Home() {
|
||||
return (
|
||||
<>
|
||||
<Header />
|
||||
<Features />
|
||||
</>
|
||||
);
|
||||
}
|
|
@ -1,65 +0,0 @@
|
|||
#policy h1 {
|
||||
font-size: 2.5em;
|
||||
margin: 0.67em 0;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#policy {
|
||||
padding-top: 2.5em;
|
||||
margin-top: 4em;
|
||||
}
|
||||
|
||||
#policy h1:first-child {
|
||||
margin-top: 0 !important;
|
||||
}
|
||||
|
||||
#policy h2 {
|
||||
font-size: 2em;
|
||||
margin: 0.83em 0;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#policy h3 {
|
||||
font-size: 1.5em;
|
||||
margin: 1em 0;
|
||||
font-weight: semi-bold;
|
||||
}
|
||||
|
||||
#policy ul {
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
#policy li {
|
||||
list-style: circle;
|
||||
margin-left: 1.1em;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
/* Link styles */
|
||||
#policy a {
|
||||
color: #007bff;
|
||||
transition: color 0.2s ease-in-out;
|
||||
}
|
||||
|
||||
#policy a:hover {
|
||||
text-decoration: underline;
|
||||
color: #0056b3;
|
||||
}
|
||||
|
||||
#policy hr {
|
||||
margin: 2em 0;
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
|
||||
#policy p {
|
||||
margin: 1em 0;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
code {
|
||||
font-size: 0.8em;
|
||||
background-color: var(--surface);
|
||||
padding: 0.2em 0.4em;
|
||||
border: 1px solid light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.2));
|
||||
border-radius: 0.3em;
|
||||
}
|
|
@ -1,93 +0,0 @@
|
|||
"use client";
|
||||
import Markdown from "react-markdown";
|
||||
import "./markdown.css";
|
||||
|
||||
export default function PrivacyPolicy() {
|
||||
return (
|
||||
<div
|
||||
id="policy"
|
||||
className="py-42 mx-auto my-52 flex w-full flex-col p-10 lg:w-1/3 lg:p-0"
|
||||
>
|
||||
<Markdown>
|
||||
{`
|
||||
# Privacy Policy
|
||||
* Last updated: 2024-08-12
|
||||
|
||||
## Introduction
|
||||
Welcome to Zen Browser! Your privacy is our priority. This Privacy Policy outlines the types of personal information we collect, how we use it, and the steps we take to protect your data when you use Zen Browser.
|
||||
|
||||
## 1. Information We Do Not Collect
|
||||
Zen Browser is designed with privacy in mind. We do not collect, store, or share any of your personal data. Here’s what that means:
|
||||
|
||||
* Crash reports can be sent to Mozilla Firefox. But, we do not collect any crash reports. Crash reports are sent securely to Mozilla Firefox to help improve the stability of the browser. They do not contain any personal information.
|
||||
|
||||
### **1.1. No Telemetry**
|
||||
We do not collect any telemetry data.
|
||||
|
||||
However, you can opt-in to share telemetry data to Mozilla for the improvement of FireFox (the base upon which the Zen Browser is built). It will be treated in accordance with their Privacy Policy which you can read about [here](https://www.mozilla.org/en-US/privacy/).
|
||||
|
||||
### **1.2. No Personal Data Collection**
|
||||
Zen Browser does not collect any personal information such as your IP address, browsing history, search queries, or form data.
|
||||
|
||||
### **1.3. No Third-Party Tracking**
|
||||
We do not allow third-party trackers or analytics tools to operate within Zen Browser. Your browsing activity remains entirely private and is not shared with any third party. Mozilla is not considered a third party as it is the base of Zen Browser.
|
||||
|
||||
## 2. Information Stored Locally on Your Device
|
||||
### **2.1. Browsing Data**
|
||||
Zen Browser stores certain data locally on your device to enhance your browsing experience. This includes:
|
||||
|
||||
* **Cookies**: Cookies are stored locally on your device and are not shared with Zen Browser or any third party. You have full control over the management of cookies through the browser’s settings.
|
||||
* **Cache and Temporary Files**: Zen Browser may store cache files and other temporary data locally to improve performance. These files can be cleared at any time through the browser’s settings.
|
||||
|
||||
### **2.2. Settings and Preferences**
|
||||
Any customizations, settings, and preferences you make within Zen Browser are stored locally on your device. We do not have access to or control over this data.
|
||||
|
||||
## 3. Sync Feature
|
||||
Zen Browser offers a "Sync" feature, this is implemented using Mozilla Firefox's Sync feature. This feature allows you to synchronize your bookmarks, history, passwords, and other data across multiple devices. For this feature to work, your data is encrypted and stored on Mozilla’s servers and is treated in accordance with their Privacy Policy. We, at Zen, cannot view any of this data.
|
||||
|
||||
* [Mozilla Firefox Sync](https://www.mozilla.org/en-US/privacy/mozilla-accounts/)
|
||||
* [This is how we store your passwords](https://support.mozilla.org/en-US/kb/how-firefox-securely-saves-passwords#:~:text=Firefox%20Desktop%20encrypts%20your%20passwords,cryptography%20to%20obscure%20your%20passwords.)
|
||||
|
||||
## 4. Data Security
|
||||
Although Zen Browser does not collect your data, we are committed to protecting the information that is stored locally on your device and, if you use the Sync feature, the encrypted data stored on Mozilla's servers. We recommend that you use secure passwords, enable device encryption, and regularly update your software to ensure your data remains safe.
|
||||
|
||||
* Note that most of the security measures are taken care by Mozilla Firefox.
|
||||
|
||||
## 5. Your Control
|
||||
### **5.1. Data Deletion**
|
||||
You have full control over all data stored locally on your device by Zen Browser. You can clear your browsing data, cookies, and cache at any time using the browser’s settings.
|
||||
|
||||
### **5.2. Do Not Track**
|
||||
Zen Browser automatically honors "Do Not Track" requests by default. We ensure that no tracking of your activity occurs, in compliance with this setting.
|
||||
|
||||
## 6. Our Website and Services
|
||||
|
||||
When you click on the "Download" button on our website, a number in the database is incremented to track the number of downloads. This is done to understand the popularity of the browser. No personal data is collected during the process.
|
||||
|
||||
### **6.1. External links**
|
||||
Zen Browser may contain links to external websites or services that are not owned or operated by us. We are not responsible for the content or privacy practices of these sites. We recommend that you review the privacy policies of these sites before providing them with any personal information.
|
||||
|
||||
## 7. Changes to This Privacy Policy
|
||||
We may update this Privacy Policy from time to time to reflect changes in our practices or legal requirements. We will notify you of any significant changes by updating the effective date at the top of this policy. Continued use of Zen Browser after such changes constitutes your acceptance of the new terms.
|
||||
|
||||
## 8. Other telemetry done by Mozilla Firefox
|
||||
|
||||
We try to disable all telemetry data collection in Zen Browser. But, we may have missed some. Check the below links for more information.
|
||||
|
||||
You can also optionally enable telemetry data collection and other Mozilla Research Studies in Zen Browser. This is disabled by default. You can enable it by going to the settings page.
|
||||
|
||||
* Please check [Firefox Privacy Notice](https://www.mozilla.org/en-US/privacy/) for more information.
|
||||
|
||||
## 9. Contact Us
|
||||
If you have any questions or concerns about this Privacy Policy or Zen Browser, please contact us at:
|
||||
|
||||
* Discord: [Zen Browser's Discord](https://discord.gg/zen-browser)
|
||||
* GitHub: [Organization](https://github.com/zen-browser)
|
||||
|
||||
---
|
||||
|
||||
By using Zen Browser, you agree to this Privacy Policy. Remember, with Zen, your privacy is in your hands.`}
|
||||
</Markdown>
|
||||
</div>
|
||||
);
|
||||
}
|
|
@ -1,43 +0,0 @@
|
|||
import React from "react";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { releaseNotes } from "@/lib/release-notes";
|
||||
import { redirect } from "next/navigation";
|
||||
|
||||
export async function generateStaticParams() {
|
||||
return [
|
||||
{ version: "latest" },
|
||||
...releaseNotes.map((note) => ({ version: note.version })),
|
||||
];
|
||||
}
|
||||
|
||||
export default function ReleaseNotePage({
|
||||
params,
|
||||
}: {
|
||||
params: { version: string };
|
||||
}) {
|
||||
const { version } = params;
|
||||
|
||||
if (version === "latest") {
|
||||
return redirect(`/release-notes/${releaseNotes[0].version}`);
|
||||
}
|
||||
|
||||
const currentIndex = releaseNotes.findIndex(
|
||||
(note) => note.version === version,
|
||||
);
|
||||
const releaseNote = releaseNotes[currentIndex];
|
||||
|
||||
if (!releaseNote) {
|
||||
return (
|
||||
<div className="flex flex-wrap items-center justify-center">
|
||||
<h1 className="mt-12 text-4xl font-bold">Release note not found</h1>
|
||||
<a href="/release-notes">
|
||||
<Button className="mt-4 items-center justify-center">
|
||||
Back to release notes
|
||||
</Button>
|
||||
</a>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return redirect(`/release-notes#${version}`);
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
import ReleaseNoteElement from "@/components/release-note";
|
||||
import { releaseNotes } from "@/lib/release-notes";
|
||||
import { Metadata } from "next";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Release Notes",
|
||||
description: "Stay up to date with the latest changes to Zen Browser",
|
||||
keywords: [
|
||||
"Zen",
|
||||
"Browser",
|
||||
"Zen Browser",
|
||||
"Web",
|
||||
"Internet",
|
||||
"Fast",
|
||||
"Release",
|
||||
"Notes",
|
||||
],
|
||||
};
|
||||
|
||||
export default function ReleaseNotes() {
|
||||
return (
|
||||
<div className="py-42 flex min-h-screen flex-col justify-center px-10 lg:px-10 xl:px-10 2xl:w-3/5">
|
||||
<h1 className="mt-48 text-4xl font-bold">Release Notes</h1>
|
||||
<p className="mt-8 text-lg text-muted-foreground">
|
||||
Stay up to date with the latest changes to Zen Browser! Since the{" "}
|
||||
<a className="text-blue-500" href="#1.0.0-a.1">
|
||||
first release
|
||||
</a>{" "}
|
||||
till{" "}
|
||||
<a
|
||||
className="text-blue-500"
|
||||
href={`/release-notes/${releaseNotes[0].version}`}
|
||||
>
|
||||
{releaseNotes[0].version}
|
||||
</a>
|
||||
, we've been working hard to make Zen Browser the best it can be.
|
||||
<br />
|
||||
<br /> Thanks everyone for your feedback! ❤️
|
||||
</p>
|
||||
{releaseNotes.map((releaseNote) => (
|
||||
<ReleaseNoteElement key={releaseNote.version} data={releaseNote} />
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
"use client";
|
||||
|
||||
import { useEffect } from "react";
|
||||
import { useRouter } from "next/navigation";
|
||||
|
||||
export default function ThemesPage() {
|
||||
const router = useRouter();
|
||||
|
||||
useEffect(() => {
|
||||
router.replace("/mods");
|
||||
}, [router]);
|
||||
|
||||
return null;
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
import WelcomePage from "@/components/welcome";
|
||||
|
||||
export default function Download() {
|
||||
return <WelcomePage />;
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
"use client";
|
||||
import React from "react";
|
||||
import { releaseNotes } from "@/lib/release-notes";
|
||||
|
||||
export default function ReleaseNotePage() {
|
||||
React.useEffect(() => {
|
||||
const searchParams = new URLSearchParams(window.location.search);
|
||||
const version = searchParams.get("v");
|
||||
if (version === "latest") {
|
||||
return window.location.replace(
|
||||
`/release-notes/${releaseNotes[0].version}`,
|
||||
);
|
||||
}
|
||||
window.location.replace(`/release-notes#${version}`);
|
||||
}, []);
|
||||
|
||||
return null;
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
"use client";
|
||||
|
||||
import Image from "next/image";
|
||||
|
||||
const inDev = process.env.NODE_ENV === "development";
|
||||
function imageLoader({ src }: { src: string }) {
|
||||
// Load locally if we are in development
|
||||
if (inDev) {
|
||||
return src.replace(/^www\/public/, "");
|
||||
}
|
||||
return `https://cdn.jsdelivr.net/gh/zen-browser/${src.replace(/^www\//, "www@latest/")}`;
|
||||
}
|
||||
|
||||
export default function CachedImage({ ...props }: any) {
|
||||
return <Image {...props} loader={imageLoader} />;
|
||||
}
|
61
src/components/Card.astro
Normal file
|
@ -0,0 +1,61 @@
|
|||
---
|
||||
interface Props {
|
||||
title: string;
|
||||
body: string;
|
||||
href: string;
|
||||
}
|
||||
|
||||
const { href, title, body } = Astro.props;
|
||||
---
|
||||
|
||||
<li class="link-card">
|
||||
<a href={href}>
|
||||
<h2>
|
||||
{title}
|
||||
<span>→</span>
|
||||
</h2>
|
||||
<p>
|
||||
{body}
|
||||
</p>
|
||||
</a>
|
||||
</li>
|
||||
<style>
|
||||
.link-card {
|
||||
list-style: none;
|
||||
display: flex;
|
||||
padding: 1px;
|
||||
background-color: #23262d;
|
||||
background-image: none;
|
||||
background-size: 400%;
|
||||
border-radius: 7px;
|
||||
background-position: 100%;
|
||||
transition: background-position 0.6s cubic-bezier(0.22, 1, 0.36, 1);
|
||||
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
.link-card > a {
|
||||
width: 100%;
|
||||
text-decoration: none;
|
||||
line-height: 1.4;
|
||||
padding: calc(1.5rem - 1px);
|
||||
border-radius: 8px;
|
||||
color: white;
|
||||
background-color: #23262d;
|
||||
opacity: 0.8;
|
||||
}
|
||||
h2 {
|
||||
margin: 0;
|
||||
font-size: 1.25rem;
|
||||
transition: color 0.6s cubic-bezier(0.22, 1, 0.36, 1);
|
||||
}
|
||||
p {
|
||||
margin-top: 0.5rem;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.link-card:is(:hover, :focus-within) {
|
||||
background-position: 0;
|
||||
background-image: var(--accent-gradient);
|
||||
}
|
||||
.link-card:is(:hover, :focus-within) h2 {
|
||||
color: rgb(var(--accent-light));
|
||||
}
|
||||
</style>
|
|
@ -1,53 +0,0 @@
|
|||
"use client";
|
||||
|
||||
import { Button } from "@/components/ui/button";
|
||||
import * as AlertDialog from "@radix-ui/react-alert-dialog";
|
||||
import { ExclamationTriangleIcon } from "@radix-ui/react-icons";
|
||||
|
||||
interface AlertDialogProps {
|
||||
open: boolean;
|
||||
onOpenChange: (open: boolean) => void;
|
||||
onConfirm: () => void;
|
||||
}
|
||||
|
||||
export const AlertModal = ({
|
||||
open,
|
||||
onOpenChange,
|
||||
onConfirm,
|
||||
}: AlertDialogProps) => {
|
||||
return (
|
||||
<AlertDialog.Root open={open} onOpenChange={onOpenChange}>
|
||||
<AlertDialog.Portal>
|
||||
<AlertDialog.Overlay className="fixed inset-0 bg-black opacity-40" />
|
||||
<AlertDialog.Content className="fixed left-[50%] top-[50%] max-w-[450px] translate-x-[-50%] translate-y-[-50%] rounded-xl bg-surface p-8">
|
||||
<AlertDialog.Title>
|
||||
<div className="mb-2 flex flex-col items-center gap-4">
|
||||
<span>
|
||||
<ExclamationTriangleIcon className="size-12 text-yellow-500" />
|
||||
</span>
|
||||
<p className="text-center font-bold text-yellow-500">
|
||||
Flatpak will install the Generic version!
|
||||
</p>
|
||||
</div>
|
||||
</AlertDialog.Title>
|
||||
<AlertDialog.Description asChild>
|
||||
<p className="mb-6 text-center text-sm text-muted-foreground">
|
||||
Please select other formats if you want to install the Optimized
|
||||
version.
|
||||
</p>
|
||||
</AlertDialog.Description>
|
||||
<div className="flex gap-4">
|
||||
<AlertDialog.Cancel className="flex-1" asChild>
|
||||
<Button variant={"outline"} className="bg-transparent">
|
||||
Cancel
|
||||
</Button>
|
||||
</AlertDialog.Cancel>
|
||||
<AlertDialog.Action className="flex-1" onClick={onConfirm} asChild>
|
||||
<Button variant={"default"}>Download Generic</Button>
|
||||
</AlertDialog.Action>
|
||||
</div>
|
||||
</AlertDialog.Content>
|
||||
</AlertDialog.Portal>
|
||||
</AlertDialog.Root>
|
||||
);
|
||||
};
|
|
@ -1,98 +0,0 @@
|
|||
import { LOGO_COLORS } from "@/lib/logos";
|
||||
|
||||
export function BrandingAssets() {
|
||||
return (
|
||||
<div className="mx-auto mt-36 flex h-full w-full flex-col items-center justify-center p-5 lg:w-1/2 lg:p-0">
|
||||
<div className="mx-auto w-full text-center">
|
||||
<h1 className="text-4xl font-bold lg:text-7xl">Branding Assets</h1>
|
||||
<p className="mt-2 text-muted-foreground">
|
||||
Download Zen Browser branding assets for your website or project.
|
||||
</p>
|
||||
</div>
|
||||
<div className="mt-10 flex w-full flex-col lg:w-2/3">
|
||||
<h2 className="mt-10 text-2xl font-bold">Logos</h2>
|
||||
<p className="mt-2 text-muted-foreground">
|
||||
Download the Zen Browser logo in different colors.
|
||||
</p>
|
||||
<div className="mt-10 grid w-full grid-cols-2 gap-10 lg:grid-cols-3 xl:grid-cols-4">
|
||||
{LOGO_COLORS.map((color) => (
|
||||
<div key={color} className="flex flex-col items-center">
|
||||
<img
|
||||
src={`https://cdn.jsdelivr.net/gh/zen-browser/www/public/logos/zen-${color}.svg`}
|
||||
alt={`Zen Browser ${color} logo`}
|
||||
className="mt-4 h-24 w-24"
|
||||
/>
|
||||
<div className="my-2 flex items-center">
|
||||
<a
|
||||
href={`/logos/zen-${color}.svg`}
|
||||
download={`zen-${color}.svg`}
|
||||
className="text-md ml-2 text-blue-500"
|
||||
>
|
||||
{color}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
<div className="mt-10 flex w-full flex-col lg:w-2/3">
|
||||
<h2 className="mt-10 text-2xl font-bold">Empty Logos</h2>
|
||||
<p className="mt-2 text-muted-foreground">
|
||||
Download the Zen Browser logo in different colors without a filled Zen
|
||||
letter.
|
||||
</p>
|
||||
<div className="mt-10 grid w-full grid-cols-2 gap-10 lg:grid-cols-3 xl:grid-cols-4">
|
||||
{LOGO_COLORS.map((color) => (
|
||||
<div key={color} className="flex flex-col items-center">
|
||||
<img
|
||||
src={`https://cdn.jsdelivr.net/gh/zen-browser/www/public/logos/zen-alpha-${color}.svg`}
|
||||
alt={`Zen Browser ${color} logo`}
|
||||
className="mt-4 h-24 w-24"
|
||||
/>
|
||||
<div className="my-2 flex items-center">
|
||||
<a
|
||||
href={`/logos/zen-alpha-${color}.svg`}
|
||||
download={`zen-alpha-${color}.svg`}
|
||||
className="text-md ml-2 text-blue-500"
|
||||
>
|
||||
{color}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
<div className="mt-10">
|
||||
<h2 className="text-2xl font-bold">License</h2>
|
||||
<p className="mt-2 text-muted-foreground">
|
||||
All branding assets are licensed under the{" "}
|
||||
<a
|
||||
href="https://creativecommons.org/licenses/by-sa/4.0/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-blue-500"
|
||||
>
|
||||
CC BY-SA 4.0
|
||||
</a>
|
||||
. Thanks to{" "}
|
||||
<a
|
||||
href="https://www.onnno.nl/"
|
||||
rel="noopener noreferrer"
|
||||
target="_blank"
|
||||
className="text-blue-500"
|
||||
>
|
||||
Donno (mr. Logos)
|
||||
</a>{" "}
|
||||
for the assets.
|
||||
<br />
|
||||
These logos however shall not be modified in a way that suggests the
|
||||
licensor endorses you or your use.
|
||||
<br />
|
||||
<br />
|
||||
You are free to share and adapt the assets for any purpose, even
|
||||
commercially.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
|
@ -1,51 +0,0 @@
|
|||
"use client";
|
||||
|
||||
import { ny } from "@/lib/utils";
|
||||
import CachedImage from "./CachedImage";
|
||||
import { Slider } from "./ui/slider";
|
||||
import React from "react";
|
||||
|
||||
export default function BrowserComplexityExample() {
|
||||
const [selectedImage, setSelectedImage] = React.useState([1]);
|
||||
return (
|
||||
<div className="mx-auto mb-32 flex h-screen w-full flex-col items-center md:w-5/6 lg:w-3/4 xl:mb-64">
|
||||
<h2 className="text-center text-4xl font-bold md:text-5xl">
|
||||
How much browser do you want?
|
||||
</h2>
|
||||
<p className="text-md mx-auto mt-4 w-2/3 text-center text-muted-foreground">
|
||||
Zen is designed to be simple and easy to use. We believe that the best
|
||||
software is the one that you don't notice. However, we can assure you
|
||||
that if you want customization, we have you covered
|
||||
</p>
|
||||
<div className="mb-6 mt-12 flex w-64 gap-4">
|
||||
<span className="opacity-90">🌱</span>
|
||||
<Slider
|
||||
step={1}
|
||||
max={3}
|
||||
showSteps="half"
|
||||
value={selectedImage}
|
||||
onValueChange={setSelectedImage}
|
||||
/>
|
||||
<span className="opacity-90">🌳</span>
|
||||
</div>
|
||||
<div className="mx-auto flex justify-center md:mb-36">
|
||||
{[...Array(4)].map((_, i) => (
|
||||
<CachedImage
|
||||
width={1620}
|
||||
height={900}
|
||||
loading="lazy"
|
||||
key={i}
|
||||
src={`www/public/browsers/image${i + 1}.png`}
|
||||
alt="Zen Browser"
|
||||
className={ny(
|
||||
"mx-12 w-full rounded-md object-cover object-right shadow",
|
||||
selectedImage[0] === i
|
||||
? "" //"animate-fade-up duration-500 !opacity-100"
|
||||
: "hidden",
|
||||
)}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
|
||||
export default function CoolHeaderText() {
|
||||
return (
|
||||
<>
|
||||
<div className="my-5">
|
||||
<h1 className="text-6xl font-bold text-muted-foreground duration-200">
|
||||
The browser made for <i className="text-blue-500">you</i>,<br />
|
||||
not your data.
|
||||
</h1>
|
||||
</div>
|
||||
<div className="pointer-events-none absolute right-[-125px] top-[-140px] mt-12 hidden h-fit w-fit !rotate-[15deg] transform animate-fade-in rounded-full border-2 bg-surface px-3 py-1 opacity-0 shadow [--animation-delay:400ms] md:block">
|
||||
Alpha Version
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
@keyframes hueShift {
|
||||
0% {
|
||||
filter: hue-rotate(0deg);
|
||||
}
|
||||
50% {
|
||||
filter: hue-rotate(170deg);
|
||||
}
|
||||
100% {
|
||||
filter: hue-rotate(0deg);
|
||||
}
|
||||
}
|
|
@ -1,349 +0,0 @@
|
|||
"use client";
|
||||
|
||||
import { ny } from "@/lib/utils";
|
||||
import { Button } from "./ui/button";
|
||||
import React from "react";
|
||||
import styled from "styled-components";
|
||||
|
||||
import {
|
||||
Sheet,
|
||||
SheetContent,
|
||||
SheetDescription,
|
||||
SheetFooter,
|
||||
SheetHeader,
|
||||
SheetTitle,
|
||||
SheetTrigger,
|
||||
} from "./ui/sheet";
|
||||
|
||||
export const COLORS = ["#ffaa40", "#9c40ff", "#ff40aa", "#40ffaa", "#40aaff"];
|
||||
|
||||
const ThemeFormWrapper = styled.div<{
|
||||
primaryColor: string;
|
||||
accentColor: string;
|
||||
secondaryColor: string;
|
||||
tertiaryColor: string;
|
||||
colorsBorder: string;
|
||||
dialogBg: string;
|
||||
}>`
|
||||
${({
|
||||
primaryColor,
|
||||
accentColor,
|
||||
secondaryColor,
|
||||
tertiaryColor,
|
||||
colorsBorder,
|
||||
dialogBg,
|
||||
}: {
|
||||
primaryColor: string;
|
||||
accentColor: string;
|
||||
secondaryColor: string;
|
||||
tertiaryColor: string;
|
||||
colorsBorder: string;
|
||||
dialogBg: string;
|
||||
}) => `
|
||||
--zen-primary-color: ${accentColor};
|
||||
|
||||
--zen-colors-primary: ${primaryColor};
|
||||
--zen-colors-secondary: ${secondaryColor};
|
||||
--zen-colors-tertiary: ${tertiaryColor};
|
||||
|
||||
--zen-colors-border: ${colorsBorder};
|
||||
--zen-dialog-background: ${dialogBg};
|
||||
`}
|
||||
`;
|
||||
|
||||
const defaultStyles = {
|
||||
primaryColor: {
|
||||
light: "color-mix(in srgb, var(--zen-primary-color) 50%, black 50%)",
|
||||
dark: "color-mix(in srgb, var(--zen-primary-color) 50%, black 50%)",
|
||||
},
|
||||
secondaryColor: {
|
||||
light: "color-mix(in srgb, var(--zen-primary-color) 40%, white 60%)",
|
||||
dark: "color-mix(in srgb, var(--zen-primary-color) 40%, black 60%)",
|
||||
},
|
||||
tertiaryColor: {
|
||||
light: "color-mix(in srgb, var(--zen-primary-color) 7%, white 93%)",
|
||||
dark: "color-mix(in srgb, var(--zen-primary-color) 15%, black 85%)",
|
||||
},
|
||||
colorsBorder: {
|
||||
light: "color-mix(in srgb, var(--zen-colors-secondary) 90%, black 10%)",
|
||||
dark: "color-mix(in srgb, var(--zen-colors-secondary) 80%, black 20%)",
|
||||
},
|
||||
dialogBg: {
|
||||
light: "var(--zen-colors-tertiary)",
|
||||
dark: "color-mix(in srgb, var(--zen-primary-color) 10%, black 90%)",
|
||||
},
|
||||
};
|
||||
|
||||
export default function CreateThemePage() {
|
||||
const [selectedColor, setSelectedColor] = React.useState(COLORS[0]);
|
||||
const [isDarkMode, setIsDarkMode] = React.useState(false);
|
||||
|
||||
const [primaryColor, setPrimaryColor] = React.useState(
|
||||
defaultStyles.primaryColor.dark,
|
||||
);
|
||||
const [secondaryColor, setSecondaryColor] = React.useState(
|
||||
defaultStyles.secondaryColor.dark,
|
||||
);
|
||||
const [tertiaryColor, setTertiaryColor] = React.useState(
|
||||
defaultStyles.tertiaryColor.dark,
|
||||
);
|
||||
const [colorsBorder, setColorsBorder] = React.useState(
|
||||
defaultStyles.colorsBorder.dark,
|
||||
);
|
||||
const [dialogBg, setDialogBg] = React.useState(defaultStyles.dialogBg.dark);
|
||||
|
||||
React.useEffect(() => {
|
||||
setPrimaryColor(
|
||||
isDarkMode
|
||||
? defaultStyles.primaryColor.dark
|
||||
: defaultStyles.primaryColor.light,
|
||||
);
|
||||
setSecondaryColor(
|
||||
isDarkMode
|
||||
? defaultStyles.secondaryColor.dark
|
||||
: defaultStyles.secondaryColor.light,
|
||||
);
|
||||
setTertiaryColor(
|
||||
isDarkMode
|
||||
? defaultStyles.tertiaryColor.dark
|
||||
: defaultStyles.tertiaryColor.light,
|
||||
);
|
||||
setColorsBorder(
|
||||
isDarkMode
|
||||
? defaultStyles.colorsBorder.dark
|
||||
: defaultStyles.colorsBorder.light,
|
||||
);
|
||||
setDialogBg(
|
||||
isDarkMode ? defaultStyles.dialogBg.dark : defaultStyles.dialogBg.light,
|
||||
);
|
||||
}, [isDarkMode]);
|
||||
|
||||
const generateThemeData = () => {
|
||||
let theme: any = {
|
||||
isDarkMode,
|
||||
};
|
||||
// Dont add the default values
|
||||
if (
|
||||
primaryColor !==
|
||||
(isDarkMode
|
||||
? defaultStyles.primaryColor.dark
|
||||
: defaultStyles.primaryColor.light)
|
||||
) {
|
||||
theme["primaryColor"] = primaryColor;
|
||||
}
|
||||
if (
|
||||
secondaryColor !==
|
||||
(isDarkMode
|
||||
? defaultStyles.secondaryColor.dark
|
||||
: defaultStyles.secondaryColor.light)
|
||||
) {
|
||||
theme["secondaryColor"] = secondaryColor;
|
||||
}
|
||||
if (
|
||||
tertiaryColor !==
|
||||
(isDarkMode
|
||||
? defaultStyles.tertiaryColor.dark
|
||||
: defaultStyles.tertiaryColor.light)
|
||||
) {
|
||||
theme["tertiaryColor"] = tertiaryColor;
|
||||
}
|
||||
if (
|
||||
colorsBorder !==
|
||||
(isDarkMode
|
||||
? defaultStyles.colorsBorder.dark
|
||||
: defaultStyles.colorsBorder.light)
|
||||
) {
|
||||
theme["colorsBorder"] = colorsBorder;
|
||||
}
|
||||
if (
|
||||
dialogBg !==
|
||||
(isDarkMode ? defaultStyles.dialogBg.dark : defaultStyles.dialogBg.light)
|
||||
) {
|
||||
theme["dialogBg"] = dialogBg;
|
||||
}
|
||||
if (COLORS.indexOf(selectedColor) !== 0) {
|
||||
theme["accentColor"] = selectedColor;
|
||||
}
|
||||
return JSON.stringify(theme, null, 4);
|
||||
};
|
||||
|
||||
return (
|
||||
<ThemeFormWrapper
|
||||
primaryColor={primaryColor}
|
||||
accentColor={selectedColor}
|
||||
secondaryColor={secondaryColor}
|
||||
tertiaryColor={tertiaryColor}
|
||||
colorsBorder={colorsBorder}
|
||||
dialogBg={dialogBg}
|
||||
className="mt-32 flex min-h-screen w-full flex-col items-center justify-center"
|
||||
>
|
||||
<div className="lg:px-none mx-auto w-full px-2 lg:w-1/2 xl:w-1/2">
|
||||
<h1 className="text-4xl font-bold lg:text-7xl">Create your theme</h1>
|
||||
<p className="mt-2 text-lg opacity-40">
|
||||
Create your own theme for Zen Browser and share it with the community.
|
||||
</p>
|
||||
<div className="mt-8 text-xs text-muted-foreground">
|
||||
If the color is chosen from the palette, the accent color will be set
|
||||
to the user's selection in the preferences. However, if the color is
|
||||
chosen from the color picker, the accent color will be the color
|
||||
selected.
|
||||
</div>
|
||||
<div className="mt-2 flex items-center">
|
||||
{COLORS.map((color) => (
|
||||
<div
|
||||
key={color}
|
||||
onClick={() => setSelectedColor(color)}
|
||||
className={ny(
|
||||
`mx-2 h-6 w-6 cursor-pointer rounded-md text-white shadow-sm`,
|
||||
selectedColor === color
|
||||
? "ring-2 ring-black dark:ring-white"
|
||||
: "",
|
||||
)}
|
||||
style={{ backgroundColor: color }}
|
||||
></div>
|
||||
))}
|
||||
<div className="mx-4">or</div>
|
||||
<input
|
||||
type="color"
|
||||
value={selectedColor}
|
||||
onChange={(e) => setSelectedColor(e.target.value)}
|
||||
className="h-7 w-9 cursor-pointer rounded outline-none"
|
||||
/>
|
||||
</div>
|
||||
<div className="flex flex-col lg:flex-row">
|
||||
<div className="w-full">
|
||||
<div className="mt-10 flex select-none items-center">
|
||||
<input
|
||||
type="checkbox"
|
||||
className="mr-2"
|
||||
checked={isDarkMode}
|
||||
onChange={(e) => setIsDarkMode(e.target.checked)}
|
||||
id="dark-mode"
|
||||
/>
|
||||
<label
|
||||
htmlFor="dark-mode"
|
||||
className="text-md font-bold opacity-60"
|
||||
>
|
||||
Dark mode
|
||||
</label>
|
||||
</div>
|
||||
<h2 className="mt-8 text-lg font-bold opacity-70">Primary color</h2>
|
||||
<div className="mt-2 flex items-center">
|
||||
<input
|
||||
type="text"
|
||||
className="w-2/3 rounded-lg border p-2 text-gray-500"
|
||||
value={primaryColor}
|
||||
onChange={(e) => setPrimaryColor(e.target.value)}
|
||||
/>
|
||||
<div className="ml-4 h-11 w-11 rounded-lg border bg-[var(--zen-colors-primary)]"></div>
|
||||
</div>
|
||||
<h2 className="mt-8 text-lg font-bold opacity-70">
|
||||
Secondary color
|
||||
</h2>
|
||||
<div className="mt-2 flex items-center">
|
||||
<input
|
||||
type="text"
|
||||
className="w-2/3 rounded-lg border p-2 text-gray-500"
|
||||
value={secondaryColor}
|
||||
onChange={(e) => setSecondaryColor(e.target.value)}
|
||||
/>
|
||||
<div className="ml-4 h-11 w-11 rounded-lg border bg-[var(--zen-colors-secondary)]"></div>
|
||||
</div>
|
||||
<h2 className="mt-8 text-lg font-bold opacity-70">
|
||||
Tertiary color
|
||||
</h2>
|
||||
<div className="mt-2 flex items-center">
|
||||
<input
|
||||
type="text"
|
||||
className="w-2/3 rounded-lg border p-2 text-gray-500"
|
||||
value={tertiaryColor}
|
||||
onChange={(e) => setTertiaryColor(e.target.value)}
|
||||
/>
|
||||
<div className="ml-4 h-11 w-11 rounded-lg border bg-[var(--zen-colors-tertiary)]"></div>
|
||||
</div>
|
||||
<h2 className="mt-8 text-lg font-bold opacity-70">Border color</h2>
|
||||
<div className="mt-2 flex items-center">
|
||||
<input
|
||||
type="text"
|
||||
className="w-2/3 rounded-lg border p-2 text-gray-500"
|
||||
value={colorsBorder}
|
||||
onChange={(e) => setColorsBorder(e.target.value)}
|
||||
/>
|
||||
<div className="ml-4 h-11 w-11 rounded-lg border bg-[var(--zen-colors-border)]"></div>
|
||||
</div>
|
||||
<h2 className="mt-8 text-lg font-bold opacity-70">
|
||||
Dialog background color
|
||||
</h2>
|
||||
<div className="mt-2 flex items-center">
|
||||
<input
|
||||
type="text"
|
||||
className="w-2/3 rounded-lg border p-2 text-gray-500"
|
||||
value={dialogBg}
|
||||
onChange={(e) => setDialogBg(e.target.value)}
|
||||
/>
|
||||
<div className="ml-4 h-11 w-11 rounded-lg border bg-[var(--zen-dialog-background)]"></div>
|
||||
</div>
|
||||
<div className="text-md mt-8 font-bold text-muted-foreground">
|
||||
Right now, we aren't taking more color Mods for the browser, until
|
||||
we find a way to make it more accessible for everyone. However,
|
||||
you can still create your own theme and share it with the
|
||||
community.
|
||||
</div>
|
||||
<Sheet>
|
||||
<SheetTrigger asChild>
|
||||
<Button disabled className="mt-8">
|
||||
Create theme
|
||||
</Button>
|
||||
</SheetTrigger>
|
||||
<SheetContent className="!w-[600px] !max-w-lg">
|
||||
<SheetHeader>
|
||||
<SheetTitle>Theme data</SheetTitle>
|
||||
<SheetDescription>
|
||||
Copy the following JSON object and paste it into your Zen
|
||||
Browser theme format.
|
||||
</SheetDescription>
|
||||
</SheetHeader>
|
||||
<pre className="mt-6 text-wrap rounded-lg bg-gray-100 p-4 font-mono text-sm dark:bg-gray-800">
|
||||
{generateThemeData()}
|
||||
</pre>
|
||||
<SheetFooter className="mt-4">
|
||||
<Button
|
||||
onClick={() =>
|
||||
navigator.clipboard.writeText(generateThemeData())
|
||||
}
|
||||
variant="ghost"
|
||||
>
|
||||
Copy to clipboard
|
||||
</Button>
|
||||
<Button
|
||||
onClick={() => {
|
||||
window.open(
|
||||
"https://github.com/zen-browser/theme-store/issues/new?assignees=&labels=new-theme&projects=&template=create-theme.yml&title=%5Bcreate-theme%5D%3A+",
|
||||
"_blank",
|
||||
);
|
||||
}}
|
||||
>
|
||||
Submit theme
|
||||
</Button>
|
||||
</SheetFooter>
|
||||
</SheetContent>
|
||||
</Sheet>
|
||||
</div>
|
||||
{/* Preview */}
|
||||
<div className="relative h-48 w-72 overflow-hidden rounded-xl border-2 border-[var(--zen-colors-border)] bg-[var(--zen-colors-tertiary)] p-4 pb-0 pr-0">
|
||||
<div className="flex h-full w-full items-center justify-center rounded-tl-xl border-2 border-b-0 border-r-0 border-[var(--zen-colors-border)] bg-[var(--zen-dialog-background)] p-4">
|
||||
<Button
|
||||
className={ny(
|
||||
"bg-[var(--zen-colors-secondary)]",
|
||||
isDarkMode ? "text-white" : "text-black",
|
||||
)}
|
||||
>
|
||||
Button
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ThemeFormWrapper>
|
||||
);
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
import { CopyButton } from "@/components/ui/copy-button";
|
||||
import { InfoIcon } from "lucide-react";
|
||||
|
||||
const linuxAppimageBashScript =
|
||||
"bash <(curl https://updates.zen-browser.app/appimage.sh)";
|
||||
|
||||
const linuxAppimageTwilightBashScript =
|
||||
"bash <(curl https://updates.zen-browser.app/appimage.sh) twilight";
|
||||
|
||||
export const AppImageInstaller = ({ isTwilight }: { isTwilight: boolean }) => {
|
||||
const script = isTwilight
|
||||
? linuxAppimageTwilightBashScript
|
||||
: linuxAppimageBashScript;
|
||||
return (
|
||||
<div className="mt-10 rounded-md border bg-surface p-5 shadow">
|
||||
<div className="flex items-center">
|
||||
<InfoIcon className="size-4" />
|
||||
<p className="ml-3 font-bold">AppImage users?</p>
|
||||
</div>
|
||||
<p className="mt-2 text-muted-foreground">
|
||||
If you're using an AppImage, you can use the automatic installer, check
|
||||
it out{" "}
|
||||
</p>
|
||||
<pre className="mt-2 flex items-center justify-between rounded-md bg-background p-2 text-muted-foreground">
|
||||
{script}
|
||||
<CopyButton valueToCopy={script} />
|
||||
</pre>
|
||||
</div>
|
||||
);
|
||||
};
|