├── .gitattributes
├── .eslintrc.json
├── public
├── favicon.ico
├── img
│ ├── not-found.png
│ ├── screenshot.jpg
│ ├── screenshot.png
│ ├── profile_alpha.svg
│ └── ui
│ │ ├── wb_logo.svg
│ │ └── wb_brand.svg
├── ports
│ ├── dwm
│ │ ├── screenshots
│ │ │ └── dwm.png
│ │ └── install.md
│ ├── gtk
│ │ ├── screenshots
│ │ │ └── gtk.png
│ │ ├── assets
│ │ │ └── gtk.zip
│ │ └── install.md
│ ├── zsh
│ │ ├── screenshots
│ │ │ └── zsh.png
│ │ ├── install.md
│ │ └── assets
│ │ │ └── wildberries.zsh-theme
│ ├── dmenu
│ │ ├── screenshots
│ │ │ └── dmenu.png
│ │ └── install.md
│ ├── slack
│ │ ├── screenshots
│ │ │ └── slack.png
│ │ └── install.md
│ ├── vscode
│ │ ├── screenshots
│ │ │ ├── vscode.png
│ │ │ └── vscode-darker.png
│ │ ├── assets
│ │ │ └── wildberries-0.0.1.vsix
│ │ └── install.md
│ ├── duckduckgo
│ │ ├── screenshots
│ │ │ └── duckduckgo.png
│ │ └── install.md
│ ├── telegram-x
│ │ ├── screenshots
│ │ │ └── telegram-x.png
│ │ ├── install.md
│ │ └── assets
│ │ │ └── Wildberries.tgx-theme
│ ├── xresources
│ │ ├── screenshots
│ │ │ └── xresources.png
│ │ └── install.md
│ ├── json-reader
│ │ ├── screenshots
│ │ │ └── json-reader.png
│ │ └── install.md
│ ├── sync-for-reddit
│ │ ├── screenshots
│ │ │ └── sync-for-reddit.png
│ │ └── install.md
│ ├── papirus-wildberries
│ │ ├── screenshots
│ │ │ └── papirus-wildberries.png
│ │ ├── assets
│ │ │ └── papirus-wildberries.zip
│ │ └── install.md
│ ├── firefox
│ │ └── install.md
│ ├── tmux
│ │ ├── install.md
│ │ └── assets
│ │ │ └── wildberries.tmuxtheme
│ ├── fzf
│ │ └── install.md
│ └── xscreensaver
│ │ └── install.md
├── fonts
│ └── JetBrainsMono-Medium.ttf
└── manifest.json
├── postcss.config.js
├── next-env.d.ts
├── next.config.js
├── global.d.ts
├── pages
├── _app.tsx
├── 404.tsx
├── api
│ └── og.tsx
├── [port].tsx
├── index.tsx
└── about.tsx
├── .prettierrc.js
├── components
├── index.ts
├── ExtendedFab.tsx
├── Logo.tsx
├── Topbar.tsx
├── Footer.tsx
├── Button.tsx
├── Layout.tsx
├── BioCard.tsx
├── Code.tsx
├── Hero.tsx
├── Slider.tsx
└── og
│ ├── index.tsx
│ └── port.tsx
├── .gitignore
├── tsconfig.json
├── package.json
├── tailwind.config.js
├── lib
└── ports.ts
├── styles
├── highlight.ts
├── globals.css
└── Slider.module.css
└── README.md
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.zip filter=lfs diff=lfs merge=lfs -text
2 |
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "next/core-web-vitals"
3 | }
4 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/public/img/not-found.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/img/not-found.png
--------------------------------------------------------------------------------
/public/img/screenshot.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/img/screenshot.jpg
--------------------------------------------------------------------------------
/public/img/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/img/screenshot.png
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/public/ports/dwm/screenshots/dwm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/ports/dwm/screenshots/dwm.png
--------------------------------------------------------------------------------
/public/ports/gtk/screenshots/gtk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/ports/gtk/screenshots/gtk.png
--------------------------------------------------------------------------------
/public/ports/zsh/screenshots/zsh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/ports/zsh/screenshots/zsh.png
--------------------------------------------------------------------------------
/public/fonts/JetBrainsMono-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/fonts/JetBrainsMono-Medium.ttf
--------------------------------------------------------------------------------
/public/ports/dmenu/screenshots/dmenu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/ports/dmenu/screenshots/dmenu.png
--------------------------------------------------------------------------------
/public/ports/slack/screenshots/slack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/ports/slack/screenshots/slack.png
--------------------------------------------------------------------------------
/public/ports/vscode/screenshots/vscode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/ports/vscode/screenshots/vscode.png
--------------------------------------------------------------------------------
/public/ports/duckduckgo/screenshots/duckduckgo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/ports/duckduckgo/screenshots/duckduckgo.png
--------------------------------------------------------------------------------
/public/ports/telegram-x/screenshots/telegram-x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/ports/telegram-x/screenshots/telegram-x.png
--------------------------------------------------------------------------------
/public/ports/vscode/assets/wildberries-0.0.1.vsix:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/ports/vscode/assets/wildberries-0.0.1.vsix
--------------------------------------------------------------------------------
/public/ports/vscode/screenshots/vscode-darker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/ports/vscode/screenshots/vscode-darker.png
--------------------------------------------------------------------------------
/public/ports/xresources/screenshots/xresources.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/ports/xresources/screenshots/xresources.png
--------------------------------------------------------------------------------
/public/ports/json-reader/screenshots/json-reader.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/ports/json-reader/screenshots/json-reader.png
--------------------------------------------------------------------------------
/public/ports/gtk/assets/gtk.zip:
--------------------------------------------------------------------------------
1 | version https://git-lfs.github.com/spec/v1
2 | oid sha256:ed7918480dbbb926166880e2fde5b53e206e66d859dc69b45bf6668175c63af0
3 | size 386298
4 |
--------------------------------------------------------------------------------
/public/ports/sync-for-reddit/screenshots/sync-for-reddit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/ports/sync-for-reddit/screenshots/sync-for-reddit.png
--------------------------------------------------------------------------------
/public/ports/papirus-wildberries/screenshots/papirus-wildberries.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gbgabo/wildberries-nextjs/HEAD/public/ports/papirus-wildberries/screenshots/papirus-wildberries.png
--------------------------------------------------------------------------------
/public/ports/papirus-wildberries/assets/papirus-wildberries.zip:
--------------------------------------------------------------------------------
1 | version https://git-lfs.github.com/spec/v1
2 | oid sha256:e9ca45e2a3c4e37af2f2575f8043c67a849c4de5c7b8f6bcf9463894768973ef
3 | size 219071213
4 |
--------------------------------------------------------------------------------
/next-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | ///
3 |
4 | // NOTE: This file should not be edited
5 | // see https://nextjs.org/docs/basic-features/typescript for more information.
6 |
--------------------------------------------------------------------------------
/next.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | module.exports = {
3 | reactStrictMode: true,
4 | };
5 |
6 | module.exports = {
7 | i18n: {
8 | locales: ["en"],
9 | defaultLocale: "en",
10 | },
11 | };
12 |
--------------------------------------------------------------------------------
/global.d.ts:
--------------------------------------------------------------------------------
1 | interface Port {
2 | port: string;
3 | title: string;
4 | screenshots: string[] | null;
5 | platform: Array<"all" | "mac" | "windows" | "linux" | "android" | "IOS">;
6 | instructions: string;
7 | assets: string[] | null;
8 | }
9 |
--------------------------------------------------------------------------------
/public/ports/gtk/install.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: GTK
3 | platform: ["linux"]
4 | ---
5 |
6 | 1. Download `gtk.zip`;
7 | 2. Extract the .zip file;
8 | 3. Move the extracted folder to .theme i.e. `/usr/share/themes/` or `~/.themes/` (create it if necessary);
9 |
--------------------------------------------------------------------------------
/pages/_app.tsx:
--------------------------------------------------------------------------------
1 | import '../styles/globals.css';
2 | import type { AppProps } from 'next/app';
3 | import '@fontsource-variable/jetbrains-mono';
4 |
5 | function MyApp({ Component, pageProps }: AppProps) {
6 | return ;
7 | }
8 | export default MyApp;
9 |
--------------------------------------------------------------------------------
/public/ports/papirus-wildberries/install.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Wildberries Icons
3 | platform: ["linux"]
4 | ---
5 |
6 | 1. Download `papirus-wildberries.zip`;
7 | 2. Extract the .zip file;
8 | 3. Move the extracted folder to .theme i.e. `/usr/share/icons/` or `~/.icons/` (create it if necessary);
9 |
--------------------------------------------------------------------------------
/public/ports/telegram-x/install.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Telegram X
3 | platform: ["android"]
4 | ---
5 |
6 | 1. Download telegram-x.zip;
7 | 2. Extract the .zip file;
8 | 3. Send It to yourself on a telegram chat, like on `Saved Messages`;
9 | 4. Click on the message including the file;
10 | 5. Click on `Apply`;
11 |
--------------------------------------------------------------------------------
/.prettierrc.js:
--------------------------------------------------------------------------------
1 | /** @type {import('prettier').Config} */
2 | module.exports = {
3 | printWidth: 120,
4 | semi: true,
5 | singleQuote: true,
6 | tabWidth: 2,
7 | trailingComma: "es5",
8 | useTabs: false,
9 |
10 | plugins: [
11 | require.resolve("prettier-plugin-tailwindcss"),
12 | ],
13 | };
14 |
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "Wildberries",
3 | "name": "Wildberries - A theme for purple lovers",
4 | "start_url": "/",
5 | "display": "standalone",
6 | "theme_color": "#19002e",
7 | "background_color": "#ffffff",
8 | "icons": [
9 | {
10 | "src": "favicon.ico",
11 | "sizes": "64x64 32x32 24x24 16x16",
12 | "type": "image/x-icon"
13 | }
14 | ]
15 | }
16 |
--------------------------------------------------------------------------------
/public/ports/firefox/install.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Firefox
3 | platform: ['windows', 'linux', 'mac']
4 | ---
5 |
6 | ## Install from Firefox Addon:
7 |
8 | Install the theme directly from [Firefox Addons](https://addons.mozilla.org/en-US/firefox/addon/wildberries/).
9 |
10 | ## Activating the theme:
11 |
12 | To activate and manage your themes at any time, go to your command palette and type `Preferences: Color Theme`.
13 |
--------------------------------------------------------------------------------
/public/ports/tmux/install.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: tmux
3 | platform: ['windows', 'linux', 'mac']
4 | ---
5 |
6 | 1. Download the `wildberries.tmuxtheme` file available below in this page;
7 | 2. Source it on your `tmux.conf`;
8 |
9 | ```bash
10 | #tmux.conf
11 | source-file "${HOME}/.dotfiles/config/tmux/wildberries.tmuxtheme"
12 | ```
13 |
14 | 3. Relaunch your tmux or just type the previous command on your prompt and the theme should be visible;
15 |
--------------------------------------------------------------------------------
/components/index.ts:
--------------------------------------------------------------------------------
1 | import Footer from './Footer';
2 | import Hero from './Hero';
3 | import Slider from './Slider';
4 | import ExtendedFab from './ExtendedFab';
5 | import TopBar from './Topbar';
6 | import BioCard from './BioCard';
7 | import Code from './Code';
8 | import Button from './Button';
9 | import Logo from './Logo';
10 | import Layout from './Layout';
11 |
12 | export { Hero, Footer, Slider, ExtendedFab, TopBar, BioCard, Code, Button, Logo, Layout };
13 |
--------------------------------------------------------------------------------
/components/ExtendedFab.tsx:
--------------------------------------------------------------------------------
1 | import React, { ReactElement } from 'react';
2 | import Button, { Props } from './Button';
3 |
4 | export default function ExtendedFab({ href, children, variant = 'primary', icon }: Props): ReactElement {
5 | return (
6 |
7 |
8 | {children}
9 |
10 |
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/public/ports/dwm/install.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: dwm
3 | platform: ["linux"]
4 | ---
5 |
6 | 1. On your config.h or config.def.h, replace the `colors` array values to:
7 |
8 | ```c
9 | // config.def.h
10 | static const char _colors[][3] = {
11 | /* fg bg border */
12 | [SchemeNorm] = { "#c79bff", "#240041", "#444444" },
13 | [SchemeSel] = { "#00ffb7", "#900048", "#900048" },
14 | };
15 | ```
16 |
17 | 2. Rebuild your dwm fork
18 |
19 | ```bash
20 | sudo make clean install
21 | ```
22 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # next.js
12 | /.next/
13 | /out/
14 |
15 | # production
16 | /build
17 |
18 | # misc
19 | .DS_Store
20 | *.pem
21 |
22 | # debug
23 | npm-debug.log*
24 | yarn-debug.log*
25 | yarn-error.log*
26 |
27 | # local env files
28 | .env.local
29 | .env.development.local
30 | .env.test.local
31 | .env.production.local
32 |
33 | # vercel
34 | .vercel
35 |
--------------------------------------------------------------------------------
/public/ports/dmenu/install.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: dmenu
3 | platform: ["linux"]
4 | ---
5 |
6 | 1. On your **config.h** or **config.def.h**, replace the `colors` array values to:
7 | ```c
8 | // config.def.h
9 | static const char *colors[SchemeLast][2] = {
10 | /* fg bg */
11 | [SchemeNorm] = { "#c79bff", "#240041" },
12 | [SchemeSel] = { "#00ffb7", "#900048" },
13 | [SchemeOut] = { "#000000", "#00ffff" },
14 | };
15 | ```
16 | 2. Rebuild your dmenu fork;
17 | ```bash
18 | sudo make clean install
19 | ```
20 |
--------------------------------------------------------------------------------
/public/ports/slack/install.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Slack
3 | platform: ["web", "android", "ios"]
4 | ---
5 |
6 | 1. On your Slack app opened, go to `Preferences > Themes`;
7 | 2. On Colors section, click on `Create a custom theme`
8 | 3. Paste the values below on the field presented to set the theme color:
9 | ```
10 | #19002E,#241D2E,#900048,#00FFB7,#240041,#C79BFF,#00FFB7,#FF0E82,#240041,#FF0E82
11 | ```
12 |
13 | - It's also possible to set the theme by pasting the values and sending to a chat.
14 | - Send it to any channel or conversation, such as Slackbot, and click on the `Switch sidebar theme` button to install;
15 |
--------------------------------------------------------------------------------
/public/ports/fzf/install.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: fzf
3 | platform: ['windows', 'linux', 'mac']
4 | ---
5 |
6 | 1. On your **bashrc**, **zshrc**, or any other shell init file, export the `FZF_DEFAULT_OPTS` enviroment variable:
7 | ```bash
8 | export FZF_DEFAULT_OPTS="--color=bg+:#900048,bg:-1,spinner:#ff0e82,hl:#00ffb7 \
9 | --color=fg:#cdd6f4,header:#ff0e82,info:#cba6f7,pointer:#00ffb7 \
10 | --color=marker:#900048,fg+:#00ffb7,prompt:#cba6f7,hl+:#00ffb7"
11 | ```
12 | 2. Restart your shell by sourcing its updated rc file;
13 | ```bash
14 | source bashrc #or zshrc and etc...
15 | ```
16 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5",
4 | "lib": [
5 | "dom",
6 | "dom.iterable",
7 | "esnext"
8 | ],
9 | "allowJs": true,
10 | "skipLibCheck": true,
11 | "strict": true,
12 | "forceConsistentCasingInFileNames": true,
13 | "noEmit": true,
14 | "esModuleInterop": true,
15 | "module": "esnext",
16 | "moduleResolution": "node",
17 | "resolveJsonModule": true,
18 | "isolatedModules": true,
19 | "jsx": "preserve",
20 | "incremental": true
21 | },
22 | "include": [
23 | "next-env.d.ts",
24 | "**/*.ts",
25 | "**/*.tsx"
26 | ],
27 | "exclude": [
28 | "node_modules"
29 | ]
30 | }
31 |
--------------------------------------------------------------------------------
/public/ports/sync-for-reddit/install.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Sync for Reddit
3 | platform: ["android", "ios"]
4 | ---
5 |
6 | 1. On your Sync for reddit app opened, go to `Settings > Theme customization`;
7 | 2. At the bottom of the page, click on `load`
8 | 3. Paste the data below on the `Theme data` field that is presented:
9 | ```json
10 | {
11 | "name": "wildberries",
12 | "primary_color": "#240041",
13 | "accent_color": "#ff0e82",
14 | "highlight_color": "#00ffb7",
15 | "primary_text_color": "#ffffff",
16 | "secondary_text_color": "#c79bff",
17 | "window_color": "#400074",
18 | "content_color": "#900048",
19 | "sticky_text_color": "#03a5c9"
20 | }
21 | ```
22 |
--------------------------------------------------------------------------------
/components/Logo.tsx:
--------------------------------------------------------------------------------
1 | import { ReactElement } from 'react';
2 |
3 | interface Props {
4 | concat?: string | ReactElement;
5 | }
6 | export default function Logo({ concat }: Props) {
7 | return (
8 |
9 |
10 |
11 | Wildberries
12 | {concat && concat}
13 |
14 |
15 | );
16 | }
17 |
--------------------------------------------------------------------------------
/public/ports/vscode/install.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: VScode
3 | platform: ["windows", "linux", "mac"]
4 | ---
5 |
6 | ## From the marketplace:
7 |
8 | 1. On vscode, go to `View -> Command Palette` or press `Ctrl+Shift+P`;
9 | 2. Type `Install Extension`;
10 | 3. Then Type `Wildberries`;
11 | 4. Click on `Set Color Theme`;
12 |
13 | ## Manually from VSIX:
14 |
15 | 1. Download the VSIX file found on this page;
16 | 2. On vscode, go to `View -> Command Palette` or press `Ctrl+Shift+P`;
17 | 3. Type `Install from VSIX...`;
18 | 4. Select the downloaded VSIX file to install it;
19 |
20 | ## Activating the theme:
21 |
22 | To activate and manage your themes at any time, go to your command palette and type `Preferences: Color Theme`.
23 |
--------------------------------------------------------------------------------
/components/Topbar.tsx:
--------------------------------------------------------------------------------
1 | import React, { ReactElement } from 'react';
2 | import Link from 'next/link';
3 | import Logo from './Logo';
4 |
5 | interface Props {
6 | port?: string;
7 | }
8 |
9 | export default function TopBar({ port }: Props): ReactElement {
10 | return (
11 |
26 | );
27 | }
28 |
--------------------------------------------------------------------------------
/components/Footer.tsx:
--------------------------------------------------------------------------------
1 | import React, { ReactElement } from 'react';
2 | import { BioCard } from '../components';
3 |
4 | interface Props {
5 | variant?: 'primary' | 'secondary';
6 | }
7 |
8 | const variants = {
9 | primary: 'bg-gradient-to-t from-cherry to-darker-purple to-40%',
10 | secondary: 'bg-gradient-to-t from-dark-purple to-darker-purple from-[-50%] to-40%',
11 | };
12 |
13 | export default function Footer({ variant = 'primary' }: Props): ReactElement {
14 | return (
15 |
21 | );
22 | }
23 |
--------------------------------------------------------------------------------
/public/ports/zsh/install.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: zsh
3 | platform: ['linux', 'mac']
4 | ---
5 |
6 | #### This port requires:
7 |
8 | - [oh-my-zsh](https://ohmyz.sh/);
9 | - [nerd-fonts](https://www.nerdfonts.com/);
10 |
11 | 1. Download the `wildberries.zsh-theme` file available below in this page;
12 | 2. Add the line below it on your `.zshrc` file to source the theme;
13 |
14 | ```bash
15 | source "$PATH_TO_FILE/wildberries.zsh-theme"
16 | ```
17 |
18 | 3. Restart your shell by sourcing its updated rc file just type the previous command on your prompt and the theme should be visible;
19 | ```bash
20 | source zshrc
21 | ```
22 |
23 | - If you want to use the theme colors on other prompt layout, you can use the following **ANSI escape codes to represent 256-colors**:
24 |
25 | | Color | Code |
26 | | ------- | ---- |
27 | | #900048 | 013 |
28 | | #00ffb7 | 014 |
29 | | #19002E | 016 |
30 | | #240041 | 053 |
31 | | #c79bff | 171 |
32 |
--------------------------------------------------------------------------------
/public/ports/xresources/install.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Xresources
3 | platform: ["linux"]
4 | ---
5 |
6 | On your home directory find a `.Xresources` file, or else create it, and paste the snippet below:
7 |
8 | ```bash
9 | # .Xresources
10 | ! special
11 | *.foreground: #ff0e82
12 | *.background: #19002e
13 | *.cursorColor: #ff0e82
14 |
15 | ! black
16 | *.color0: #151515
17 | *.color8: #505050
18 |
19 | ! red
20 | *.color1: #900048
21 | *.color9: #900048
22 |
23 | ! green
24 | *.color2: #00ff40
25 | *.color10: #00ff40
26 |
27 | ! yellow
28 | *.color3: #f4cc53
29 | *.color11: #f4cc53
30 |
31 | ! blue
32 | *.color4: #00ffff
33 | *.color12: #00ffff
34 |
35 | ! magenta
36 | *.color5: #c79bff
37 | *.color13: #c79bff
38 |
39 | ! cyan
40 | *.color6: #00ffb7
41 | *.color14: #00ffb7
42 |
43 | ! white
44 | *.color7: #d0d0d0
45 | *.color15: #f5f5f5
46 | ```
47 |
48 | To apply the changes run the following command:
49 |
50 | ```bash
51 | xrdb .Xresources
52 | ```
53 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "wildberries",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "dependencies": {
12 | "@fontsource-variable/jetbrains-mono": "^5.0.19",
13 | "@vercel/og": "^0.0.20",
14 | "gray-matter": "^4.0.3",
15 | "next": "^12.2.3",
16 | "react": "17.0.2",
17 | "react-copy-to-clipboard": "^5.0.4",
18 | "react-dom": "17.0.2",
19 | "react-markdown": "^7.1.0",
20 | "react-syntax-highlighter": "^15.4.4",
21 | "remark-gfm": "^3.0.1"
22 | },
23 | "devDependencies": {
24 | "@iconify/react": "^4.1.1",
25 | "@types/node": "^18.7.2",
26 | "@types/react": "^18.0.17",
27 | "@types/react-copy-to-clipboard": "^5.0.2",
28 | "@types/react-syntax-highlighter": "^13.5.2",
29 | "autoprefixer": "^10.4.16",
30 | "eslint": "^8.53.0",
31 | "eslint-config-next": "^14.0.2",
32 | "postcss": "^8.4.31",
33 | "prettier": "^3.1.0",
34 | "prettier-plugin-tailwindcss": "^0.5.7",
35 | "tailwindcss": "^3.3.5",
36 | "typescript": "^5.2.2"
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/public/ports/json-reader/install.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: JSON Reader
3 | ---
4 |
5 | 1. Once you have JSON Reader extension installed on your web browser, access the options page for the extension.
6 |
7 | 2. On the **custom style** section, add the following css properties:
8 |
9 | ```css
10 | .CodeMirror {
11 | font-family: monaco, Consolas, Menlo, Courier, monospace;
12 | font-size: 16px;
13 | line-height: 1.5em;
14 | background-color: #19002e !important;
15 | color: #8d659c !important;
16 | border: none;
17 | }
18 | .CodeMirror-gutters {
19 | background-color: #19002e !important;
20 | }
21 | .CodeMirror-linenumber {
22 | color: #00ffb7 !important;
23 | }
24 |
25 | span {
26 | color: #399ee6 !important;
27 | }
28 | span.cm-property {
29 | color: #ff0e82 !important;
30 | }
31 | span.cm-atom {
32 | color: #ff0e82 !important;
33 | }
34 | span.cm-number {
35 | color: #bd93f9 !important;
36 | }
37 | span.cm-variable {
38 | color: #50fa7b !important;
39 | }
40 | span.cm-string {
41 | color: #a470d8 !important;
42 | }
43 | span.cm-comment {
44 | color: #620ca2 !important;
45 | }
46 |
47 | .extras .icon svg {
48 | fill: #00ffb7 !important;
49 | }
50 | ```
51 |
--------------------------------------------------------------------------------
/public/ports/xscreensaver/install.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Xscreensaver
3 | platform: ["linux"]
4 | ---
5 |
6 | On your home directory find a `.Xresources` file, or else create it, and paste the snippet below:
7 |
8 | ```bash
9 | !general dialog box (affects main hostname, username, password text)
10 | xscreensaver.Dialog.foreground: #00ffb7
11 | xscreensaver.Dialog.background: #240048
12 |
13 | xscreensaver.Dialog.topShadowColor: #240048
14 | xscreensaver.Dialog.bottomShadowColor: #240048
15 |
16 | xscreensaver.Dialog.Button.foreground: #00ffb7
17 | xscreensaver.Dialog.Button.background: #900042
18 |
19 | !username/password input box and date text colour
20 | xscreensaver.Dialog.text.foreground: #00ffb7
21 | xscreensaver.Dialog.text.background: #900042
22 | xscreensaver.Dialog.internalBorderWidth:25
23 | xscreensaver.Dialog.borderWidth: 0
24 | xscreensaver.Dialog.shadowThickness: 0
25 |
26 | !timeout bar (background is actually determined by Dialog.text.background)
27 | xscreensaver.passwd.thermometer.foreground: #00ffb7
28 | xscreensaver.passwd.thermometer.background: #2040e0
29 | xscreensaver.passwd.thermometer.width: 0
30 | ```
31 |
--------------------------------------------------------------------------------
/components/Button.tsx:
--------------------------------------------------------------------------------
1 | import React, { ReactElement } from 'react';
2 | import { Icon } from '@iconify/react';
3 | import Link from 'next/link';
4 |
5 | export type Props = {
6 | href: string;
7 | children: string;
8 | variant?: 'primary' | 'secondary';
9 | icon?: string;
10 | fab?: boolean;
11 | };
12 |
13 | const variants = {
14 | primary: 'bg-cherry text-acid-green hover:bg-acid-green hover:text-cherry ',
15 | secondary: 'bg-light-purple text-darker-purple hover:bg-darker-purple hover:text-light-purple ',
16 | };
17 |
18 | export default function Button({ href, children, variant = 'primary', icon, fab }: Props): ReactElement {
19 | return (
20 |
21 |
26 | {icon && }
27 | {children}
28 |
29 |
30 | );
31 | }
32 |
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: [
4 | "./app/**/*.{js,ts,jsx,tsx,mdx}",
5 | "./pages/**/*.{js,ts,jsx,tsx,mdx}",
6 | "./components/**/*.{js,ts,jsx,tsx,mdx}",
7 |
8 | // Or if using `src` directory:
9 | "./src/**/*.{js,ts,jsx,tsx,mdx}",
10 | ],
11 | theme: {
12 | extend: {
13 | colors: {
14 | primary: "var(--aw-color-primary)",
15 | secondary: "var(--aw-color-secondary)",
16 | accent: "var(--aw-color-accent)",
17 | "dark-purple": "var(--wb-dark-purple)",
18 | //TODO: Tailwind apparently can't handle classes with /xx opacity syntax
19 | //currently declaring these colors from their direct color value (but also still storing on CustomStyle global scope)
20 | "darker-purple": "#19002e",
21 | "acid-green": "var(--wb-acid-green)",
22 | cherry: "var(--wb-cherry)",
23 | pink: "var(--wb-pink)",
24 | "light-purple": "#c79bff",
25 | grape: "var(--wb-grape)",
26 | "pastel-purple": "#e7d4ff",
27 | "muted-purple": "var(--wb-muted-purple)",
28 | },
29 | },
30 | },
31 | plugins: [],
32 | };
33 |
--------------------------------------------------------------------------------
/components/Layout.tsx:
--------------------------------------------------------------------------------
1 | import Head from 'next/head';
2 | import { TopBar, Footer } from './';
3 | import React, { ReactElement, ReactNode } from 'react';
4 |
5 | interface CallToAction {
6 | text: string;
7 | href: string;
8 | icon?: string;
9 | }
10 |
11 | interface MetaTags {
12 | title: string;
13 | description: string;
14 | image: string;
15 | }
16 |
17 | interface Props {
18 | meta: MetaTags;
19 | children?: ReactNode;
20 | port?: string;
21 | variant?: 'primary' | 'secondary';
22 | }
23 |
24 | export default function Layout({ meta, children, port, variant = 'primary' }: Props): ReactElement {
25 | return (
26 | <>
27 |
28 |
29 |
30 |
31 | {meta.title}
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 | {children}
40 |
41 | >
42 | );
43 | }
44 |
--------------------------------------------------------------------------------
/public/ports/duckduckgo/install.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: DuckDuckGo
3 | ---
4 |
5 | - Before installation, you can try this DuckDuckGo theme [here](https://duckduckgo.com/?kae=t&ko=1&kax=v185-4&kn=1&kbc=1&k5=2&kah=br-pt&kl=br-pt&kaq=-1&ku=-1&ks=m&k21=240041&kx=00ffb7&kf=1&k9=ff0e82&k7=19002e&kaa=c79bff&k8=c79bff&km=l&kj=900048&kt=p);
6 |
7 | 1. To save the theme, go to [https://duckduckgo.com/](https://duckduckgo.com/);
8 | 2. Open the browser devtools (`Ctrl+Shift+I` in most browsers);
9 | 3. Paste the following snippet on the **console** tab;
10 | ```js
11 | var wildberries = [
12 | "7=19002e",
13 | "8=c79bff",
14 | "9=ff0e82",
15 | "ae=t",
16 | "t=p",
17 | "s=m",
18 | "w=n",
19 | "m=l",
20 | "o=s",
21 | "j=900048",
22 | "a=p",
23 | "aa=c79bff",
24 | "u=-1",
25 | "x=00ffb7",
26 | "y=44475a",
27 | "af=1",
28 | "ai=1",
29 | "f=1",
30 | ];
31 | for (var i = 0; i < wildberries.length; i++)
32 | document.cookie = wildberries[i];
33 | alert("Appearance settings have successfully been updated!");
34 | location.reload();
35 | ```
36 |
37 | - To make your own changes on the applied theme, go to [https://duckduckgo.com/settings](https://duckduckgo.com/settings);
38 |
--------------------------------------------------------------------------------
/pages/404.tsx:
--------------------------------------------------------------------------------
1 | import Head from 'next/head';
2 | import { Button } from '../components';
3 |
4 | export default function FourOhFour() {
5 | return (
6 | <>
7 |
8 | 404: Nothing fruitful here!
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
404
18 |
Nothing fruitful to find here
19 |
20 |
21 | Available ports
22 |
23 |
24 | About Wildberries
25 |
26 |
27 |
28 |
29 | >
30 | );
31 | }
32 |
--------------------------------------------------------------------------------
/components/BioCard.tsx:
--------------------------------------------------------------------------------
1 | import { Icon } from '@iconify/react';
2 |
3 | interface Props {
4 | top?: string;
5 | bottom?: string;
6 | image?: string;
7 | href: string;
8 | variant?: 'primary' | 'secondary';
9 | }
10 |
11 | const variants = {
12 | primary: {
13 | text: 'text-acid-green',
14 | button: 'bg-cherry text-acid-green group-hover:bg-acid-green group-hover:text-cherry',
15 | },
16 | secondary: {
17 | text: 'text-light-purple',
18 | button: 'bg-light-purple text-darker-purple group-hover:bg-darker-purple group-hover:text-acid-green',
19 | },
20 | };
21 |
22 | export default function BioCard({ top, bottom, image, href, variant = 'secondary' }: Props) {
23 | return (
24 |
28 | {top}
29 |
30 | {image ? (
31 |
32 | ) : (
33 |
34 | )}
35 |
36 |
37 | {bottom}
38 |
39 |
40 | );
41 | }
42 |
--------------------------------------------------------------------------------
/components/Code.tsx:
--------------------------------------------------------------------------------
1 | import React, { ReactElement, ReactNode, useState } from 'react';
2 | import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
3 | import { prism } from '../styles/highlight';
4 | import { CopyToClipboard } from 'react-copy-to-clipboard';
5 | import { Icon } from '@iconify/react';
6 |
7 | interface Props {
8 | children: ReactNode;
9 | className: string | undefined;
10 | style?: any;
11 | }
12 |
13 | export default function Code({ children, className = '', style = prism }: Props): ReactElement {
14 | const [copied, setCopied] = useState(false);
15 | const code = String(children).replace(/\n$/, '');
16 |
17 | const codeLanguage = /language-(\w+)/.exec(className);
18 |
19 | return (
20 |
21 |
22 | {
25 | setCopied(true);
26 | setTimeout(() => {
27 | setCopied(false);
28 | }, 1000);
29 | }}
30 | >
31 |
36 |
37 |
38 |
39 | {code}
40 |
41 |
42 | );
43 | }
44 |
--------------------------------------------------------------------------------
/components/Hero.tsx:
--------------------------------------------------------------------------------
1 | import React, { ReactElement, ReactNode } from 'react';
2 | import { Button, Slider } from './';
3 | interface CallToAction {
4 | text: string;
5 | href: string;
6 | icon?: string;
7 | }
8 | interface Props {
9 | children?: ReactNode;
10 | subtitle?: string | ReactNode;
11 | cta?: CallToAction;
12 | title?: ReactNode;
13 | slides?: string[] | null;
14 | }
15 |
16 | export default function Hero({ children, title, subtitle, slides, cta }: Props): ReactElement {
17 | const content = slides ? (
18 | {
20 | return {
21 | element: ,
22 | };
23 | })}
24 | />
25 | ) : (
26 | children
27 | );
28 |
29 | return (
30 |
35 |
36 |
{title}
37 | {subtitle &&
{subtitle}
}
38 | {cta &&
{cta?.text} }
39 |
40 | {content && content}
41 |
42 | );
43 | }
44 |
--------------------------------------------------------------------------------
/lib/ports.ts:
--------------------------------------------------------------------------------
1 | import fs from "fs";
2 | import path from "path";
3 | import matter from "gray-matter";
4 |
5 | const portsDirectory = path.join(process.cwd(), "public/ports");
6 | const portNames = fs.readdirSync(portsDirectory);
7 |
8 | export async function getPort(slug: string) {
9 | const ports = getPorts();
10 | const port = ports.find((port) => port.port === slug);
11 | const portDirectory = path.join(portsDirectory, slug);
12 |
13 | const instructionsPath = path.join(portDirectory, "install.md");
14 | const instructionsFile = fs.readFileSync(instructionsPath, "utf8");
15 | const { content } = matter(instructionsFile);
16 | const instructions = content;
17 |
18 | const assetsDirectory = path.join(portDirectory, "assets");
19 | let assets;
20 | try {
21 | assets = fs.readdirSync(assetsDirectory);
22 | } catch (err) {
23 | assets = null;
24 | }
25 |
26 | const screenshotsDirectory = path.join(portDirectory, "screenshots");
27 | let screenshots;
28 | try {
29 | screenshots = fs.readdirSync(screenshotsDirectory);
30 | } catch (err) {
31 | screenshots = null;
32 | }
33 |
34 | return {
35 | ...port,
36 | screenshots,
37 | instructions,
38 | assets,
39 | };
40 | }
41 |
42 | export function getPorts() {
43 | return portNames.map((slug) => {
44 | const installPath = path.join(portsDirectory, slug, "install.md");
45 | const fileContent = fs.readFileSync(installPath, "utf8");
46 | const { data } = matter(fileContent);
47 | return {
48 | port: slug,
49 | title: data.title,
50 | };
51 | });
52 | }
53 |
--------------------------------------------------------------------------------
/components/Slider.tsx:
--------------------------------------------------------------------------------
1 | import React, { Fragment, ReactElement } from "react";
2 | import styles from "../styles/Slider.module.css";
3 |
4 | interface Props {
5 | slides: {
6 | element: any;
7 | }[];
8 | }
9 |
10 | export default function Slider({ slides }: Props): ReactElement {
11 | return (
12 | 2 ? styles.infinity : ""
15 | }`}
16 | >
17 | {slides.map((slide, index) => {
18 | return (
19 |
26 | );
27 | })}
28 |
29 | {slides.map((slide, index) => {
30 | return (
31 |
32 | {slide.element}
33 |
34 | );
35 | })}
36 |
37 | {slides.length > 1 && (
38 | <>
39 |
40 | {slides.map((slide, index) => {
41 | return (
42 |
43 | );
44 | })}
45 |
46 |
47 |
48 | {slides.map((slide, index) => {
49 | return (
50 |
51 | );
52 | })}
53 |
54 |
55 | >
56 | )}
57 |
58 | );
59 | }
60 |
--------------------------------------------------------------------------------
/public/ports/telegram-x/assets/Wildberries.tgx-theme:
--------------------------------------------------------------------------------
1 | !
2 | name: "Wildberries"
3 | time: 1644788132
4 | author: "gb_gabo"
5 | @
6 | parentTheme: 2
7 | #
8 | attachContact, attachFile, attachInlineBot, attachLocation, attachPhoto, fileAttach, togglerActive: #900048
9 | avatarArchive, circleButtonTheme, seekDone: #900042
10 | avatarSavedMessages, avatarSavedMessages_big, background_text, background_textLight, badgeMuted, bubbleIn_time, bubbleOut_chatVerticalLine, bubbleOut_messageAuthor, bubbleOut_time, chatListIcon, chatListMute, chatListVerify, headerTabInactiveText, messageAuthor, messageVerticalLine, playerButtonActive, textLight: #C79BFF
11 | background, bubbleOut_background, file, filling, playerCoverPlaceholder, seekEmpty, togglerInactiveBackground: #240041
12 | badge, bubbleIn_textLink, bubbleOut_outline, bubbleOut_ticks, bubbleOut_ticksRead, bubbleOut_waveformActive, chatSendButton, checkActive, circleButtonChatIcon, circleButtonOverlayIcon, circleButtonRegularIcon, circleButtonThemeIcon, controlActive, headerButtonIcon, headerIcon, icon, iconActive, iconLight, introSectionActive, online, playerButton, progress, sliderActive, textLink, ticks, ticksRead, waveformActive: #00FFB7
13 | bubble_messageCheckOutline: #00FFB7B6
14 | bubble_messageSelection: #24004185
15 | bubbleIn_background, bubbleOut_file, circleButtonChat, circleButtonOverlay, circleButtonRegular, headerButton, headerLightBackground, headerTabActive, playerCoverIcon, textSelectionHighlight: #900041
16 | bubbleOut_waveformInactive, controlInactive, introSection, sliderInactive, waveformInactive: #246A56
17 | headerBackground, separator: #19002E
18 | headerText, text: #FF0E82
19 | seekReady: #8C3D62
20 | togglerActiveBackground, togglerInactive: #51003D
21 |
--------------------------------------------------------------------------------
/pages/api/og.tsx:
--------------------------------------------------------------------------------
1 | import { ImageResponse } from "@vercel/og";
2 | import { NextRequest } from "next/server";
3 | import Port from "../../components/og/port";
4 | import Index from "../../components/og/index";
5 |
6 | export const config = {
7 | runtime: "experimental-edge",
8 | };
9 |
10 | const url = new URL(
11 | "../../public/fonts/JetBrainsMono-Medium.ttf",
12 | import.meta.url
13 | ) as unknown as RequestInfo;
14 |
15 | // Make sure the font exists in the specified path:
16 | const font = fetch(url).then((res) => res.arrayBuffer());
17 |
18 | export default async function handler(req: NextRequest) {
19 | const fontData = await font;
20 | try {
21 | const { searchParams } = new URL(req.url);
22 |
23 | const hasTitle = searchParams.has("title");
24 | const title = hasTitle ? searchParams.get("title") : "port title";
25 |
26 | const hasPort = searchParams.has("port");
27 | const port = searchParams.get("port");
28 |
29 | const hasImage = searchParams.has("image");
30 | const image = searchParams.get("image");
31 |
32 | const isIndex = !hasImage && !hasPort && !hasTitle;
33 |
34 | return new ImageResponse(
35 | (
36 | <>
37 | {isIndex ? (
38 |
39 | ) : (
40 |
41 | )}
42 | >
43 | ),
44 | {
45 | width: 1200,
46 | height: 630,
47 | fonts: [
48 | {
49 | name: "JetBrains Mono",
50 | data: fontData,
51 | weight: 400,
52 | },
53 | ],
54 | }
55 | );
56 | } catch (e: any) {
57 | console.log(`${e.message}`);
58 | return new Response(`Failed to generate the image`, {
59 | status: 500,
60 | });
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/public/ports/zsh/assets/wildberries.zsh-theme:
--------------------------------------------------------------------------------
1 | right_triangle() {
2 | echo $'\ue0b0'
3 | }
4 |
5 | prompt_indicator() {
6 | echo $'%B╰→%b'
7 | }
8 |
9 | arrow_start() {
10 | echo "%{$FG[$ARROW_FG]%}%{$BG[$ARROW_BG]%}%B"
11 | }
12 |
13 | arrow_end() {
14 | echo "%b%{$reset_color%}%{$FG[$NEXT_ARROW_FG]%}%{$BG[$NEXT_ARROW_BG]%}$(right_triangle)%{$reset_color%}"
15 | }
16 |
17 | ok_username() {
18 | ARROW_FG="197"
19 | ARROW_BG="053"
20 | NEXT_ARROW_BG="013"
21 | NEXT_ARROW_FG="053"
22 | echo "$(arrow_start) $(arrow_end)"
23 | }
24 |
25 | err_username() {
26 | ARROW_FG="016"
27 | ARROW_BG="009"
28 | NEXT_ARROW_BG="013"
29 | NEXT_ARROW_FG="009"
30 | echo "$(arrow_start) $(arrow_end)"
31 | }
32 |
33 | # return err_username if there are errors, ok_username otherwise
34 | username() {
35 | echo "%(?.$(ok_username).$(err_username))"
36 | }
37 |
38 | directory() {
39 | ARROW_FG="014"
40 | ARROW_BG="013"
41 | [[ -n "$(git_prompt_info)" ]] && NEXT_ARROW_BG="171" || NEXT_ARROW_BG=""
42 | NEXT_ARROW_FG="013"
43 | [[ "$PWD" = "$HOME" ]] && DIR_PATH="" || DIR_PATH=" %2~"
44 | echo "$(arrow_start) $DIR_PATH $(arrow_end)"
45 | }
46 |
47 | current_time() {
48 | echo "%{$fg[white]%}%*%{$reset_color%}"
49 | }
50 |
51 | git_prompt() {
52 | ARROW_FG="016"
53 | ARROW_BG="171"
54 | NEXT_ARROW_BG=""
55 | NEXT_ARROW_FG="171"
56 | [[ -n "$(git_prompt_info)" ]] && prompt="$(arrow_start) $(git_prompt_info) $(arrow_end)" || prompt=""
57 | echo $prompt
58 | }
59 |
60 | # set the git_prompt_info text
61 | ZSH_THEME_GIT_PROMPT_PREFIX=""
62 | ZSH_THEME_GIT_PROMPT_SUFFIX=""
63 | ZSH_THEME_GIT_PROMPT_DIRTY=" *"
64 | ZSH_THEME_GIT_PROMPT_CLEAN=""
65 |
66 | # set the git_prompt_status text
67 | ZSH_THEME_GIT_PROMPT_ADDED="%{$fg[cyan]%} ✈%{$reset_color%}"
68 | ZSH_THEME_GIT_PROMPT_MODIFIED="%{$fg[yellow]%} ✭%{$reset_color%}"
69 | ZSH_THEME_GIT_PROMPT_DELETED="%{$fg[red]%} ✗%{$reset_color%}"
70 | ZSH_THEME_GIT_PROMPT_RENAMED="%{$fg[blue]%} ➦%{$reset_color%}"
71 | ZSH_THEME_GIT_PROMPT_UNMERGED="%{$fg[magenta]%} ✂%{$reset_color%}"
72 | ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$fg[white]%} ✱%{$reset_color%}"
73 |
74 | PROMPT='$(username)$(directory)$(git_prompt) '
75 | RPROMPT='$(git_prompt_status) $(current_time)'
76 |
--------------------------------------------------------------------------------
/components/og/index.tsx:
--------------------------------------------------------------------------------
1 | const styles = {
2 | container: {
3 | display: "flex",
4 | flexDirection: "row" as "row",
5 | background: "linear-gradient(180deg,#19002e, #240041 70%)",
6 | minHeight: "100vh",
7 | },
8 | imageContainer: {
9 | display: "flex",
10 | width: "30vw",
11 | overflow: "hidden",
12 | },
13 | description: {
14 | display: "flex",
15 | flexDirection: "column" as "column",
16 | justifyContent: "center",
17 | alignItems: "center",
18 | width: "40vw",
19 | minWidth: "500px",
20 | height: "100vh",
21 | boxShadow: "0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23)",
22 | background: "linear-gradient(180deg,#900048,#19002e 70%)",
23 | },
24 | logo: {
25 | marginBottom: "40px",
26 | width: "200px",
27 | height: "200px",
28 | },
29 | heading: {
30 | margin: 0,
31 | lineHeight: "55.2px",
32 | fontSize: "48px",
33 | textAlign: "center" as "center",
34 | color: "#ff0e82",
35 | },
36 | subheading: {
37 | margin: "30px auto",
38 | lineHeight: "40.8px",
39 | fontSize: "27.2px",
40 | color: "#c79bff",
41 | maxWidth: "75%",
42 | alignItems: "center",
43 | justifyContent: "center",
44 | textAlign: "center" as "center",
45 | },
46 | };
47 |
48 | export default function Index() {
49 | return (
50 |
51 |
52 |
56 |
57 |
58 |
63 |
Wildberries
64 |
65 | An experimental dark theme for people who love purple
66 |
67 |
68 |
69 |
73 |
74 |
75 | );
76 | }
77 |
--------------------------------------------------------------------------------
/components/og/port.tsx:
--------------------------------------------------------------------------------
1 | interface Props {
2 | port: string | null;
3 | title: string | null;
4 | image: string | null;
5 | }
6 |
7 | const styles = {
8 | container: {
9 | display: "flex",
10 | flexDirection: "row" as "row",
11 | background: "linear-gradient(180deg,#19002e, #240041 70%)",
12 | minHeight: "100vh",
13 | },
14 | description: {
15 | display: "flex",
16 | flexDirection: "column" as "column",
17 | justifyContent: "center",
18 | alignItems: "center",
19 | minWidth: "50vw",
20 | height: "100vh",
21 | boxShadow: "0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23)",
22 | background: "linear-gradient(180deg,#900048,#19002e 70%)",
23 | },
24 | logo: {
25 | marginBottom: "40px",
26 | width: "200px",
27 | height: "200px",
28 | },
29 | heading: {
30 | margin: 0,
31 | lineHeight: "64.4px",
32 | fontSize: "56px",
33 | textAlign: "center" as "center",
34 | color: "#ff0e82",
35 | },
36 | subheading: {
37 | margin: "30px auto",
38 | lineHeight: "48px",
39 | fontSize: "32px",
40 | color: "#c79bff",
41 | maxWidth: "75%",
42 | alignItems: "center",
43 | justifyContent: "center",
44 | },
45 | highlight: {
46 | backgroundColor: "#c79bff",
47 | color: "#19002e",
48 | borderRadius: "5px",
49 | padding: "5px 10px",
50 | whiteSpace: "pre" as "pre",
51 | marginLeft: "20px",
52 | },
53 | imageContainer: {
54 | display: "flex",
55 | margin: "auto",
56 | width: "50vw",
57 | },
58 | };
59 |
60 | export default function Port({ port, title, image }: Props) {
61 | return (
62 |
63 |
69 |
74 |
Wildberries
75 |
76 | {`theme for `}
77 | {title}
78 |
79 |
80 | {image && port && (
81 |
82 |
86 |
87 | )}
88 |
89 | );
90 | }
91 |
--------------------------------------------------------------------------------
/public/ports/tmux/assets/wildberries.tmuxtheme:
--------------------------------------------------------------------------------
1 | # NOTE: you can use vars with $ and ${} as long as the str is double quoted: ""
2 | # WARNING: hex colors can't contain capital letters
3 |
4 | # --> Wildberries
5 | thm_black_berry="#19002e"
6 | thm_grape="#240041"
7 | thm_cherry="#900048"
8 | thm_purple="#c79bff"
9 | thm_red="#d70040"
10 | thm_pink="#ff0e82"
11 | thm_green="#00ffb7"
12 | thm_orange="#ff4500"
13 | thm_yellow="#ffd700"
14 | thm_blue="#399ee6"
15 | thm_gray="#332e41"
16 |
17 | thm_bg="${thm_black_berry}"
18 | thm_fg="${thm_pink}"
19 |
20 | # ----------------------------=== Theme ===--------------------------
21 |
22 | # status
23 | set -g status-position bottom
24 | set -g status "on"
25 | set -g status-bg "${thm_bg}"
26 | set -g status-justify "left"
27 | set -g status-left-length "100"
28 | set -g status-right-length "100"
29 |
30 | # messages
31 | set -g message-style fg="${thm_green}",bg="${thm_cherry}",align="centre"
32 | set -g message-command-style fg="${thm_green}",bg="${thm_cherry}",align="centre"
33 |
34 | # panes
35 | set -g pane-border-style fg="${thm_purple}"
36 | set -g pane-active-border-style fg="${thm_pink}"
37 |
38 | # windows
39 | setw -g window-status-activity-style fg="${thm_fg}",bg="${thm_bg}",none
40 | setw -g window-status-separator ""
41 | setw -g window-status-style fg="${thm_fg}",bg="${thm_bg}",none
42 |
43 | # --------=== Statusline
44 |
45 | set -g status-left ""
46 | set -g status-right "#[fg=$thm_pink,bg=$thm_bg,nobold,nounderscore,noitalics]#[fg=$thm_bg,bg=$thm_purple,nobold,nounderscore,noitalics] 缾#[fg=$thm_purple,bg=$thm_grape] #W #{?client_prefix,#[fg=$thm_cherry],#[fg=$thm_green]}#[bg=$thm_grape]#{?client_prefix,#[bg=$thm_pink],#[bg=$thm_green]}#[fg=$thm_bg] #[fg=$thm_purple,bg=$thm_grape] #S "
47 |
48 | # current_dir
49 | setw -g window-status-format "#[fg=$thm_black_berry,bg=$thm_purple] #I #[fg=$thm_purple,bg=$thm_black_berry] #{b:pane_current_path} "
50 | setw -g window-status-current-format "#[fg=$thm_green,bg=$thm_cherry] #I #[fg=$thm_fg,bg=$thm_grape] #{b:pane_current_path} "
51 |
52 | # parent_dir/current_dir
53 | # setw -g window-status-format "#[fg=colour232,bg=colour111] #I #[fg=colour222,bg=colour235] #(echo '#{pane_current_path}' | rev | cut -d'/' -f-2 | rev) "
54 | # setw -g window-status-current-format "#[fg=colour232,bg=colour208] #I #[fg=colour255,bg=colour237] #(echo '#{pane_current_path}' | rev | cut -d'/' -f-2 | rev) "
55 |
56 | # --------=== Modes
57 | setw -g clock-mode-colour "${thm_pink}"
58 | setw -g mode-style "fg=${thm_pink} bg=${thm_black_berry} bold"
--------------------------------------------------------------------------------
/pages/[port].tsx:
--------------------------------------------------------------------------------
1 | import { GetStaticPaths, GetStaticProps } from 'next';
2 | import { getPort, getPorts } from '../lib/ports';
3 | import { ExtendedFab, Code, Layout, Hero, Button } from '../components';
4 | import ReactMarkdown from 'react-markdown';
5 | import remarkGfm from 'remark-gfm';
6 | import { Icon } from '@iconify/react';
7 |
8 | export const getStaticProps: GetStaticProps = async (context) => {
9 | const port = context.params!.port as string;
10 | const portProps = await getPort(port);
11 | return {
12 | props: {
13 | ...portProps,
14 | },
15 | };
16 | };
17 |
18 | export const getStaticPaths: GetStaticPaths = async () => {
19 | const ports = getPorts();
20 | const paths = ports.map((port) => {
21 | return {
22 | params: {
23 | port: port.port,
24 | },
25 | };
26 | });
27 | return {
28 | paths,
29 | fallback: false,
30 | };
31 | };
32 |
33 | export default function Port({ port, title, platform, screenshots, instructions, assets }: Port) {
34 | const meta = {
35 | title: `${port} theme - Wildberries`,
36 | description: `A dark purple theme for ${port} and many other apps`,
37 | image: `https://wildberries.style/api/og?port=${port}&title=${title}${
38 | screenshots ? `&image=${screenshots[0]}` : null
39 | }`,
40 | };
41 |
42 | const hero = {
43 | title: 'Wildberries',
44 | subtitle: (
45 |
46 | {`A dark purple theme for `}
47 | {title}
48 | {` and many other apps`}
49 |
50 | ),
51 | cta: { text: 'Apply Theme', href: '#instructions', icon: 'material-symbols:brush' },
52 | slides: screenshots?.map((screenshot) => {
53 | return `/ports/${port}/screenshots/${screenshot}`;
54 | }),
55 | };
56 |
57 | return (
58 | <>
59 |
60 |
61 |
62 |
63 |
64 |
65 |
Instalation
66 |
67 |
68 |
{children}
75 | ) : (
76 | {children}
77 | );
78 | },
79 | a({ children, ...props }) {
80 | return (
81 |
82 | {children}
83 |
84 | );
85 | },
86 | }}
87 | >
88 | {instructions}
89 |
90 |
91 | {assets &&
92 | assets.map((asset, index) => {
93 | return (
94 |
95 |
{asset}
96 |
97 | Download
98 |
99 |
100 | );
101 | })}
102 |
103 |
104 |
105 | Check all ports
106 |
107 |
108 | >
109 | );
110 | }
111 |
--------------------------------------------------------------------------------
/pages/index.tsx:
--------------------------------------------------------------------------------
1 | import type { GetStaticProps } from 'next';
2 | import Link from 'next/link';
3 | import { getPorts } from '../lib/ports';
4 | import { ExtendedFab, Hero, Layout, Logo } from '../components';
5 |
6 | interface Props {
7 | portsData: {
8 | port: string;
9 | title: string;
10 | }[];
11 | }
12 |
13 | export const getStaticProps: GetStaticProps = async () => {
14 | const portsData = getPorts();
15 | return {
16 | props: {
17 | portsData,
18 | },
19 | };
20 | };
21 |
22 | const meta = {
23 | title: 'Wildberries',
24 | description: 'A dark theme for purple lovers',
25 | image: 'https://wildberries.style/api/og',
26 | };
27 |
28 | const hero = {
29 | title: (
30 |
31 |
32 |
33 | ),
34 | subtitle: 'An experimental dark theme for people who love purple',
35 | cta: { text: 'Apply Theme', href: '#ports', icon: 'material-symbols:brush' },
36 | slides: [
37 | '/ports/vscode/screenshots/vscode.png',
38 | '/ports/duckduckgo/screenshots/duckduckgo.png',
39 | '/ports/gtk/screenshots/gtk.png',
40 | ],
41 | };
42 |
43 | export default function Home({ portsData }: Props) {
44 | return (
45 | <>
46 |
47 |
48 | ")`,
53 | }}
54 | >
55 |
56 |
Check all apps wilberries is available for:
57 |
68 |
69 |
70 |
71 | About Wildberries
72 |
73 |
74 | >
75 | );
76 | }
77 |
--------------------------------------------------------------------------------
/public/img/profile_alpha.svg:
--------------------------------------------------------------------------------
1 |
2 |
17 |
19 |
20 |
22 | image/svg+xml
23 |
25 |
26 |
27 |
28 |
29 |
31 |
56 |
61 |
64 |
68 |
72 |
73 |
74 |
75 |
--------------------------------------------------------------------------------
/styles/highlight.ts:
--------------------------------------------------------------------------------
1 | const prism = {
2 | 'code[class*="language-"]': {
3 | color: "#FF0E82",
4 | background: "none",
5 | textShadow: "0 1px rgba(0, 0, 0, 0.3)",
6 | fontFamily: "Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",
7 | textAlign: "left",
8 | whiteSpace: "pre",
9 | wordSpacing: "normal",
10 | wordBreak: "normal",
11 | wordWrap: "normal",
12 | lineHeight: "1.5",
13 | MozTabSize: "4",
14 | OTabSize: "4",
15 | tabSize: "4",
16 | WebkitHyphens: "none",
17 | MozHyphens: "none",
18 | msHyphens: "none",
19 | hyphens: "none",
20 | },
21 | 'pre[class*="language-"]': {
22 | color: "#f8f8f2",
23 | background: "#19002E",
24 | textShadow: "0 1px rgba(0, 0, 0, 0.3)",
25 | fontFamily: "Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",
26 | textAlign: "left",
27 | whiteSpace: "pre",
28 | wordSpacing: "normal",
29 | wordBreak: "normal",
30 | wordWrap: "normal",
31 | lineHeight: "1.5",
32 | MozTabSize: "4",
33 | OTabSize: "4",
34 | tabSize: "4",
35 | WebkitHyphens: "none",
36 | MozHyphens: "none",
37 | msHyphens: "none",
38 | hyphens: "none",
39 | padding: "1em",
40 | margin: ".5em 0",
41 | overflow: "auto",
42 | borderRadius: "0.3em",
43 | },
44 | ':not(pre) > code[class*="language-"]': {
45 | background: "#19002E",
46 | padding: ".1em",
47 | borderRadius: ".3em",
48 | whiteSpace: "normal",
49 | },
50 | comment: {
51 | color: "#6272a4",
52 | },
53 | prolog: {
54 | color: "#6272a4",
55 | },
56 | doctype: {
57 | color: "#6272a4",
58 | },
59 | cdata: {
60 | color: "#6272a4",
61 | },
62 | punctuation: {
63 | color: "#AC4EA4",
64 | },
65 | ".namespace": {
66 | Opacity: ".7",
67 | },
68 | property: {
69 | color: "#ff79c6",
70 | },
71 | tag: {
72 | color: "#ff79c6",
73 | },
74 | constant: {
75 | color: "#ff79c6",
76 | },
77 | symbol: {
78 | color: "#ff79c6",
79 | },
80 | deleted: {
81 | color: "#ff79c6",
82 | },
83 | boolean: {
84 | color: "#bd93f9",
85 | },
86 | number: {
87 | color: "#bd93f9",
88 | },
89 | selector: {
90 | color: "#A470D8",
91 | },
92 | "attr-name": {
93 | color: "#A470D8",
94 | },
95 | string: {
96 | color: "#A470D8",
97 | },
98 | char: {
99 | color: "#A470D8",
100 | },
101 | builtin: {
102 | color: "#A470D8",
103 | },
104 | inserted: {
105 | color: "#A470D8",
106 | },
107 | operator: {
108 | color: "#FFB86C",
109 | },
110 | entity: {
111 | color: "#f8f8f2",
112 | cursor: "help",
113 | },
114 | url: {
115 | color: "#f8f8f2",
116 | },
117 | ".language-css .token.string .token": {
118 | color: "#00ffb7",
119 | },
120 | ".style .token.string": {
121 | color: "#00ffb7",
122 | },
123 | variable: {
124 | color: "#FFB86C",
125 | },
126 | atrule: {
127 | color: "#00ffb7",
128 | },
129 | "attr-value": {
130 | color: "#00ffb7",
131 | },
132 | function: {
133 | color: "#00ffb7",
134 | },
135 | "class-name": {
136 | color: "#00ffb7",
137 | },
138 | keyword: {
139 | color: "#03A5C9",
140 | },
141 | regex: {
142 | color: "#ffb86c",
143 | },
144 | important: {
145 | color: "#ffb86c",
146 | fontWeight: "bold",
147 | },
148 | bold: {
149 | fontWeight: "bold",
150 | },
151 | italic: {
152 | fontStyle: "italic",
153 | },
154 | };
155 |
156 | const hljs = {
157 | hljs: {
158 | display: "block",
159 | overflowX: "auto",
160 | padding: "0.5em",
161 | background: "#19002E",
162 | color: "#f8f8f2",
163 | },
164 | "hljs-keyword": {
165 | color: "#8be9fd",
166 | fontWeight: "bold",
167 | },
168 | "hljs-selector-tag": {
169 | color: "#8be9fd",
170 | fontWeight: "bold",
171 | },
172 | "hljs-literal": {
173 | color: "#8be9fd",
174 | fontWeight: "bold",
175 | },
176 | "hljs-section": {
177 | color: "#8be9fd",
178 | fontWeight: "bold",
179 | },
180 | "hljs-link": {
181 | color: "#8be9fd",
182 | },
183 | "hljs-function .hljs-keyword": {
184 | color: "#ff79c6",
185 | },
186 | "hljs-subst": {
187 | color: "#f8f8f2",
188 | },
189 | "hljs-string": {
190 | color: "#f1fa8c",
191 | },
192 | "hljs-title": {
193 | color: "#f1fa8c",
194 | fontWeight: "bold",
195 | },
196 | "hljs-name": {
197 | color: "#f1fa8c",
198 | fontWeight: "bold",
199 | },
200 | "hljs-type": {
201 | color: "#f1fa8c",
202 | fontWeight: "bold",
203 | },
204 | "hljs-attribute": {
205 | color: "#f1fa8c",
206 | },
207 | "hljs-symbol": {
208 | color: "#f1fa8c",
209 | },
210 | "hljs-bullet": {
211 | color: "#f1fa8c",
212 | },
213 | "hljs-addition": {
214 | color: "#f1fa8c",
215 | },
216 | "hljs-variable": {
217 | color: "#f1fa8c",
218 | },
219 | "hljs-template-tag": {
220 | color: "#f1fa8c",
221 | },
222 | "hljs-template-variable": {
223 | color: "#f1fa8c",
224 | },
225 | "hljs-comment": {
226 | color: "#6272a4",
227 | },
228 | "hljs-quote": {
229 | color: "#6272a4",
230 | },
231 | "hljs-deletion": {
232 | color: "#6272a4",
233 | },
234 | "hljs-meta": {
235 | color: "#6272a4",
236 | },
237 | "hljs-doctag": {
238 | fontWeight: "bold",
239 | },
240 | "hljs-strong": {
241 | fontWeight: "bold",
242 | },
243 | "hljs-emphasis": {
244 | fontStyle: "italic",
245 | },
246 | };
247 |
248 | export { hljs, prism };
249 |
--------------------------------------------------------------------------------
/pages/about.tsx:
--------------------------------------------------------------------------------
1 | import { ExtendedFab, Layout } from '../components';
2 |
3 | const Pallete = ({
4 | colors,
5 | gridClasses = 'grid-cols-3',
6 | spanClasses = 'col-span-1',
7 | label = false,
8 | className = 'h-full w-full',
9 | }: {
10 | colors: string[];
11 | gridClasses?: string;
12 | spanClasses?: string;
13 | label?: boolean;
14 | className?: string;
15 | }) => {
16 | return (
17 |
18 |
19 | {colors.map((color) => {
20 | return (
21 |
22 | {label && (
23 |
24 | {color}
25 |
26 | )}
27 |
28 | );
29 | })}
30 |
31 |
32 | );
33 | };
34 |
35 | const meta = {
36 | title: 'About Wildberries',
37 | description: 'A dark theme for purple lovers',
38 | image: 'https://wildberries.style/api/og',
39 | };
40 |
41 | export default function About() {
42 | const backgroundColors = ['#19002e', '#240041', '#900048'];
43 | const foregroundColors = ['#ff0e82', '#c79bff', '#00ffb7'];
44 | const auxiliarColors = ['#399ee6', '#ffd700', '#d70040', '#ff4500'];
45 |
46 | return (
47 | ")`,
50 | backgroundAttachment: 'fixed',
51 | }}
52 | >
53 |
54 |
55 |
56 |
If you like purple
57 |
58 |
59 |
60 | And some neon bright accents
61 |
62 |
63 |
64 |
65 |
68 |
74 |
75 |
76 |
77 |
Wildberries can be the color theme for you
78 |
79 | And yeah, it's not for everyone, but once I couldn't find any color theme for my daily
80 | applications in such style, I started to customize everything on a common color scheme, now called{' '}
81 | wildberries
82 |
83 |
84 | Being just a developer and not a graphic designer, I came up with this color scheme by pure personal
85 | taste, however, by time passing and many applications being customized, I tried to follow some
86 | consistencies.
87 |
88 |
Wildberries is a dark theme, with additional bright accents, almost in a cyberpunkish way.
89 |
90 |
91 |
92 |
Background Colors
93 |
94 |
95 |
96 |
Foreground Colors
97 |
98 |
99 |
100 |
Auxiliar Colors
101 |
102 |
103 |
104 |
105 |
106 | Check all theme ports
107 |
108 |
109 |
110 | );
111 | }
112 |
--------------------------------------------------------------------------------
/styles/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | :root {
6 | --wb-dark-purple: #240041;
7 | --wb-darker-purple: #19002e;
8 | --wb-acid-green: #00ffb7;
9 | --wb-cherry: #900048;
10 | --wb-pink: #ff0e82;
11 | --wb-light-purple: #c79bff;
12 | --wb-grape: #752dce;
13 | --wb-pastel-purple: #e7d4ff;
14 | --wb-muted-purple: #ecdeff;
15 |
16 |
17 |
18 | --black-berry: #19002e;
19 | --grape: #240041;
20 | --cherry: #900048;
21 | --purple: #c79bff;
22 | --red: #d70040;
23 | --pink: #ff0e82;
24 | --green: #00ffb7;
25 | --orange: #ff4500;
26 | --yellow: #ffd700;
27 | --blue: #399ee6;
28 |
29 | --background-dark: var(--grape);
30 | --background-darker: var(--black-berry);
31 | --foreground: var(--pink);
32 | --secondary-foreground: var(--purple);
33 |
34 | --element-background: var(--cherry);
35 | --element-foreground: var(--green);
36 | }
37 |
38 | html,
39 | body {
40 | padding: 0;
41 | margin: 0;
42 | font-family: 'JetBrains Mono Variable', sans-serif, monospace, -apple-system, BlinkMacSystemFont,
43 | Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans,
44 | Helvetica Neue, sans-serif;
45 | background-color: var(--background-dark);
46 | color: var(--foreground);
47 | }
48 |
49 | html {
50 | scroll-behavior: smooth;
51 | }
52 |
53 | h2 {
54 | color: var(--secondary-foreground);
55 | font-size: 1.125rem;
56 | font-weight: 500;
57 | margin-bottom: 40px;
58 | margin-top: 40px;
59 | }
60 |
61 | h3 {
62 | color: var(--secondary-foreground);
63 | font-weight: bold;
64 | }
65 |
66 | a {
67 | color: var(--wb-acid-green);
68 | text-decoration: none;
69 | line-break: anywhere;
70 | }
71 |
72 | * {
73 | box-sizing: border-box;
74 | }
75 |
76 | code {
77 | background: var(--background-darker);
78 | color: var(--secondary-foreground);
79 | border-radius: 5px;
80 | padding: 0.15rem;
81 | font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono,
82 | Bitstream Vera Sans Mono, Courier New, monospace;
83 | }
84 |
85 | @media only screen and (max-width: 820px) {
86 | pre {
87 | left: 50%;
88 | margin-left: calc(-50vw - 1.5rem);
89 | margin-right: -50vw;
90 | right: 50%;
91 | margin-top: 2em;
92 | }
93 | }
94 |
95 | pre {
96 | position: relative;
97 | max-width: 100vw;
98 | }
99 |
100 | body::-webkit-scrollbar {
101 | width: 6px;
102 | height: 6px;
103 | }
104 |
105 | body::-webkit-scrollbar-track {
106 | border-radius: 10px;
107 | background: rgba(0, 0, 0, 0.1);
108 | }
109 |
110 | body::-webkit-scrollbar-thumb {
111 | border-radius: 10px;
112 | background: rgba(199, 155, 255, 0.4);
113 | }
114 |
115 | body::-webkit-scrollbar-thumb:hover {
116 | background: rgba(199, 155, 255, 1);
117 | }
118 |
119 | body::-webkit-scrollbar-thumb:active {
120 | background: rgba(0, 255, 183, 0.6);
121 | }
122 |
123 | .highlight {
124 | @apply bg-light-purple text-darker-purple rounded px-2 py-1 whitespace-pre;
125 | }
126 |
127 | .berry {
128 | background-color: var(--element-background);
129 | color: var(--element-foreground);
130 | border-radius: 5px;
131 | padding: 5px 10px;
132 | white-space: pre;
133 | }
134 |
135 | /* List items style */
136 |
137 | #instructions ol,
138 | #instructions ul {
139 | counter-reset: li;
140 | /* Initiate a counter */
141 | margin-left: 0;
142 | /* Remove the default left margin */
143 | padding-left: 0;
144 | /* Remove the default left padding */
145 | }
146 |
147 | #instructions ol>li,
148 | #instructions ul>li {
149 | position: relative;
150 | /* Create a positioning context */
151 | margin: 20px 0px 20px 2em;
152 | /* Give each list item a left margin to make room for the numbers */
153 | padding: 4px 0px 4px 16px;
154 | /* Add some spacing around the content */
155 | list-style: none;
156 | /* Disable the normal item numbering */
157 | }
158 |
159 | #instructions ol>li::before,
160 | #instructions ul>li:before {
161 | position: absolute;
162 | -moz-box-sizing: border-box;
163 | -webkit-box-sizing: border-box;
164 | box-sizing: border-box;
165 | color: var(--background-darker);
166 | background: var(--secondary-foreground);
167 | font-weight: bold;
168 | text-align: center;
169 | margin-right: 8px;
170 | }
171 |
172 | #instructions ol>li:before {
173 | content: counter(li);
174 | /* Use the counter as content */
175 | counter-increment: li;
176 | /* Increment the counter by 1 */
177 | top: -3px;
178 | left: -2em;
179 | /* Some space between the number and the content in browsers that support
180 | generated content but not positioning it (Camino 2 is one example) */
181 | padding: 8px;
182 | border-radius: 10px;
183 | width: 2em;
184 | }
185 |
186 | #instructions ul>li:before {
187 | content: "•";
188 | left: -1.6em;
189 | border-radius: 35%;
190 | width: 1.2em;
191 | height: 1.2em;
192 | }
193 |
194 | #instructions li ol,
195 | #instructions li ul {
196 | margin-top: 6px;
197 | }
198 |
199 | #instructions ol ol li:last-child {
200 | margin-bottom: 0;
201 | }
202 |
203 | #instructions li>p {
204 | margin: 0;
205 | }
206 |
207 | #instructions hr {
208 | border: 0;
209 | border-top: 1px solid var(--purple);
210 | margin: 15px 40px;
211 | }
212 |
213 | /* Table styles */
214 |
215 | table {
216 | margin: auto;
217 | width: 100%;
218 | }
219 |
220 | thead {
221 | background-color: var(--element-background);
222 | color: var(--element-foreground);
223 | }
224 |
225 | th {
226 | padding: 10px;
227 | }
228 |
229 | td {
230 | text-align: center;
231 | color: var(--secondary-foreground);
232 | padding: 5px;
233 | }
234 |
235 | tr:nth-child(even) {
236 | background-color: var(--background-darker);
237 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | > ## ⚠️ Notice: Legacy project, [active project available at gbgabo/wildberries](https://github.com/gbgabo/wildberries)
2 |
3 |
4 |
5 |
An experimental dark theme for people who love purple 🍒
6 |
7 |
8 |
9 |
10 |
11 |
12 | Wildberries is a purple dark theme, with additional
13 | bright accents, almost in a cyberpunkish way.
14 |
15 | Being just a developer and not a graphic designer, I came up with this
16 | color scheme by pure personal taste, however, by time passing and many
17 | applications being customized, I tried to follow some consistencies, and came up with the colors below:
18 |
19 | ### `Background Colors`
20 |
21 | | Palette | Hex | RGB | HSL | 🎨 |
22 | | ----------- | --------- | ----------- | ------------------- | ------------------------------------------------------------------- |
23 | | Black Berry | `#19002E` | `25 00 46` | `272.6° 100% 9%` |  |
24 | | Grape | `#240041` | `36 00 65` | `273.2° 100% 12.7%` |  |
25 | | Cherry | `#900048` | `144 00 72` | `330° 100% 28.2%` |  |
26 |
27 | ### `Foreground Colors`
28 |
29 | | Palette | Hex | RGB | HSL | 🎨 |
30 | | ------- | --------- | ------------- | ------------------- | -------------------------------------------------------------------- |
31 | | Pink | `#ff0e82` | `255 14 130` | `331.1° 100% 52.7%` |  |
32 | | Green | `#00ffb7` | `0 255 183` | `163.1° 100% 50%` |  |
33 | | Purple | `#c79bff` | `199 155 255` | `266.4° 100% 80.4%` |  |
34 |
35 | ### `Auxiliar Colors`
36 |
37 | | Palette | Hex | RGB | HSL | 🎨 |
38 | | ------- | --------- | ------------ | ------------------- | -------------------------------------------------------------------- |
39 | | Orange | `#ff4500` | `250 141 62` | `25.2° 94.9% 61.2%` |  |
40 | | Red | `#d70040` | `215 0 64` | `342.1° 100% 42.2%` |  |
41 | | Yellow | `#ffd700` | `255 215 0` | `50.6° 100% 50%` |  |
42 | | Blue | `#399ee6` | `57 158 230` | `205° 77.6% 56.3%` |  |
43 |
44 |
45 |
46 |
47 | ## ⚙️ Install the theme
48 |
49 | All instructions can be found at [wildberries.style](https://wildberries.style/).
50 |
51 | ## 🗃️ About this repository
52 |
53 | This repository is:
54 |
55 | - The **next.js project** of the [wildberries.style](https://wildberries.style/) website, with minimum javascript on the client-side (only for clipboard);
56 | - The original **ports' source files** and install instructions, on [/public/ports](https://github.com/gbgabo/wildberries/tree/main/ports);
57 |
58 | ### 🪄 A boilerplate for any custom theme repository/website:
59 |
60 | If you like to customize your system with your personal color palette, this project is designed to **easily store, document and publish everything necessary to reproduce your theme**.
61 |
62 | The generated website offers:
63 |
64 | - A **Home** page, indexing all theme ports available to install;
65 | - Dedicated **Instruction** pages for each application port, accessible in `custom-domain.com/{port-name}`
66 | - An **About** page, to describe the theme and display colors;
67 | - **Open Graph images** for every page;
68 |
69 |
70 | ⚙️ Running/Deploying the project
71 |
72 | **Running**
73 |
74 | First, run the Next.js development server:
75 |
76 | ```bash
77 | yarn dev
78 | ```
79 |
80 | And open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
81 |
82 | **Building the project**
83 |
84 | ```bash
85 | yarn build
86 | ```
87 |
88 | To learn more, take a look at the [Next.js Documentation](https://nextjs.org/docs)
89 |
90 |
91 |
92 |
93 | ➕ Adding a new port
94 |
95 | All ports are located on `public/ports`, each one is contained within a directory named by the port's application name, like `vim`, `chrome`, `slack`, etc...
96 |
97 | A port directory is expected to have three main files:
98 |
99 | ```
100 | public/ports
101 | ├── doom-emacs
102 | │ ├── install.md
103 | │ ├── screenshots
104 | │ │ ├── image.png
105 | │ │ └── image2.png
106 | │ └── assets
107 | │ ├── windows.zip
108 | │ └── linux.conf
109 | ├── chrome
110 | │ └── ...
111 | ├── slack
112 | │ └── ...
113 | └── ...
114 | ```
115 |
116 | - A **install.md** file, containing instruction steps to install the theme for that application, you can write anything necessary to guide in the instalation process. A header with the port formal `title` and `platform` suported is expected:
117 |
118 | ```md
119 | ---
120 | title: Doom Emacs
121 | platform: ["linux", "windows"]
122 | ---
123 |
124 | 1. step one
125 | 2. step two
126 | ```
127 |
128 | - A **screenshots folder**, to store the images to be displayed in the port instruction page
129 |
130 | - **Installation assets**, in the case it's needed to install the port. All assets need to be stored in an "assets" folder. If the assets need to be contained within a dedicated folder name, zip it to be listed as one file. For each file, a download button is created on the port page.
131 |
132 |
133 |
134 | 🎨 Customising the theme
135 |
136 | On `styles/globals.css`, the `:root` selector contains all the color variables the website is based on:
137 |
138 | ```css
139 | :root {
140 | --black-berry: #19002e;
141 | --grape: #240041;
142 | --cherry: #900048;
143 | --purple: #c79bff;
144 | --red: #d70040;
145 | --pink: #ff0e82;
146 | --green: #00ffb7;
147 | --orange: #ff4500;
148 | --yellow: #ffd700;
149 | --blue: #399ee6;
150 |
151 | --background-dark: var(--grape);
152 | --background-darker: var(--black-berry);
153 | --foreground: var(--pink);
154 | --secondary-foreground: var(--purple);
155 |
156 | --element-background: var(--cherry);
157 | --element-foreground: var(--green);
158 | }
159 | ```
160 |
161 |
162 |
163 | ## 🌟 Credits
164 |
165 | - Website inspired by [dracula theme](http://draculatheme.com/) by Zeno Rocha.
166 |
167 | ## ⚖️ License
168 |
169 | [MIT License](./LICENSE) - Wildberries Theme
170 |
--------------------------------------------------------------------------------
/styles/Slider.module.css:
--------------------------------------------------------------------------------
1 | .csslider {
2 | -moz-perspective: 1300px;
3 | -ms-perspective: 1300px;
4 | -webkit-perspective: 1300px;
5 | perspective: 1300px;
6 | display: inline-block;
7 | text-align: left;
8 | position: relative;
9 | margin-bottom: 22px;
10 | }
11 | .csslider > input {
12 | display: none;
13 | }
14 | .csslider > input:nth-of-type(10):checked ~ ul li:first-of-type {
15 | margin-left: -900%;
16 | }
17 | .csslider > input:nth-of-type(9):checked ~ ul li:first-of-type {
18 | margin-left: -800%;
19 | }
20 | .csslider > input:nth-of-type(8):checked ~ ul li:first-of-type {
21 | margin-left: -700%;
22 | }
23 | .csslider > input:nth-of-type(7):checked ~ ul li:first-of-type {
24 | margin-left: -600%;
25 | }
26 | .csslider > input:nth-of-type(6):checked ~ ul li:first-of-type {
27 | margin-left: -500%;
28 | }
29 | .csslider > input:nth-of-type(5):checked ~ ul li:first-of-type {
30 | margin-left: -400%;
31 | }
32 | .csslider > input:nth-of-type(4):checked ~ ul li:first-of-type {
33 | margin-left: -300%;
34 | }
35 | .csslider > input:nth-of-type(3):checked ~ ul li:first-of-type {
36 | margin-left: -200%;
37 | }
38 | .csslider > input:nth-of-type(2):checked ~ ul li:first-of-type {
39 | margin-left: -100%;
40 | }
41 | .csslider > input:nth-of-type(1):checked ~ ul li:first-of-type {
42 | margin-left: 0%;
43 | }
44 | .csslider > ul {
45 | position: relative;
46 | max-width: 80vw;
47 | width: 820px;
48 | height: 420px;
49 | z-index: 1;
50 | font-size: 0;
51 | line-height: 0;
52 | margin: 0 auto;
53 | padding: 0;
54 | overflow: hidden;
55 | white-space: nowrap;
56 | -moz-box-sizing: border-box;
57 | -webkit-box-sizing: border-box;
58 | box-sizing: border-box;
59 | }
60 | .csslider > ul > li {
61 | position: relative;
62 | display: inline-block;
63 | width: 100%;
64 | height: 100%;
65 | overflow: hidden;
66 | font-size: 15px;
67 | font-size: initial;
68 | line-height: normal;
69 | -moz-transition: all 0.5s cubic-bezier(0.4, 1.3, 0.65, 1);
70 | -o-transition: all 0.5s ease-out;
71 | -webkit-transition: all 0.5s cubic-bezier(0.4, 1.3, 0.65, 1);
72 | transition: all 0.5s cubic-bezier(0.4, 1.3, 0.65, 1);
73 | -moz-background-size: cover;
74 | -o-background-size: cover;
75 | -webkit-background-size: cover;
76 | background-size: cover;
77 | vertical-align: top;
78 | -moz-box-sizing: border-box;
79 | -webkit-box-sizing: border-box;
80 | box-sizing: border-box;
81 | white-space: normal;
82 | }
83 | .csslider > ul > li.scrollable {
84 | overflow-y: scroll;
85 | }
86 | .csslider > .navigation {
87 | position: absolute;
88 | bottom: -8px;
89 | left: 50%;
90 | z-index: 10;
91 | margin-bottom: -10px;
92 | font-size: 0;
93 | line-height: 0;
94 | text-align: center;
95 | -webkit-touch-callout: none;
96 | -webkit-user-select: none;
97 | -khtml-user-select: none;
98 | -moz-user-select: none;
99 | -ms-user-select: none;
100 | user-select: none;
101 | }
102 | .csslider > .navigation > div {
103 | margin-left: -100%;
104 | }
105 | .csslider > .navigation label {
106 | position: relative;
107 | display: inline-block;
108 | cursor: pointer;
109 | border-radius: 50%;
110 | margin: 0 4px;
111 | padding: 4px;
112 | background: #3a3a3a;
113 | }
114 | .csslider > .navigation label:hover:after {
115 | opacity: 1;
116 | }
117 | .csslider > .navigation label:after {
118 | content: '';
119 | position: absolute;
120 | left: 50%;
121 | top: 50%;
122 | margin-left: -6px;
123 | margin-top: -6px;
124 | background: var(--secondary-foreground);
125 | border-radius: 50%;
126 | padding: 6px;
127 | opacity: 0;
128 | }
129 | .csslider > .arrows {
130 | -webkit-touch-callout: none;
131 | -webkit-user-select: none;
132 | -khtml-user-select: none;
133 | -moz-user-select: none;
134 | -ms-user-select: none;
135 | user-select: none;
136 | }
137 | .csslider.inside .navigation {
138 | bottom: 10px;
139 | margin-bottom: 10px;
140 | }
141 | .csslider.inside .navigation label {
142 | border: 1px solid #7e7e7e;
143 | }
144 | .csslider > input:nth-of-type(1):checked ~ .navigation label:nth-of-type(1):after,
145 | .csslider > input:nth-of-type(2):checked ~ .navigation label:nth-of-type(2):after,
146 | .csslider > input:nth-of-type(3):checked ~ .navigation label:nth-of-type(3):after,
147 | .csslider > input:nth-of-type(4):checked ~ .navigation label:nth-of-type(4):after,
148 | .csslider > input:nth-of-type(5):checked ~ .navigation label:nth-of-type(5):after,
149 | .csslider > input:nth-of-type(6):checked ~ .navigation label:nth-of-type(6):after,
150 | .csslider > input:nth-of-type(7):checked ~ .navigation label:nth-of-type(7):after,
151 | .csslider > input:nth-of-type(8):checked ~ .navigation label:nth-of-type(8):after,
152 | .csslider > input:nth-of-type(9):checked ~ .navigation label:nth-of-type(9):after,
153 | .csslider > input:nth-of-type(10):checked ~ .navigation label:nth-of-type(10):after,
154 | .csslider > input:nth-of-type(11):checked ~ .navigation label:nth-of-type(11):after {
155 | opacity: 1;
156 | }
157 | .csslider > .arrows {
158 | position: absolute;
159 | left: -31px;
160 | top: 50%;
161 | width: 100%;
162 | height: 26px;
163 | padding: 0 31px;
164 | z-index: 0;
165 | -moz-box-sizing: content-box;
166 | -webkit-box-sizing: content-box;
167 | box-sizing: content-box;
168 | }
169 | .csslider > .arrows label {
170 | display: none;
171 | position: absolute;
172 | top: -50%;
173 | padding: 13px;
174 | box-shadow: inset 2px -2px 0 1px var(--secondary-foreground);
175 | cursor: pointer;
176 | /* -moz-transition: .15s;
177 | -o-transition: .15s;
178 | -webkit-transition: .15s;
179 | transition: .15s; */
180 | }
181 | .csslider > .arrows label:hover {
182 | box-shadow: inset 3px -3px 0 2px var(--secondary-foreground);
183 | margin: 0 0px;
184 | }
185 | .csslider > .arrows label:before {
186 | content: '';
187 | position: absolute;
188 | top: -201%;
189 | left: -0%;
190 | height: 300%;
191 | width: 300%;
192 | }
193 | .csslider.infinity > input:first-of-type:checked ~ .arrows label:last-of-type,
194 | .csslider > input:nth-of-type(1):checked ~ .arrows label:nth-of-type(0),
195 | .csslider > input:nth-of-type(2):checked ~ .arrows label:nth-of-type(1),
196 | .csslider > input:nth-of-type(3):checked ~ .arrows label:nth-of-type(2),
197 | .csslider > input:nth-of-type(4):checked ~ .arrows label:nth-of-type(3),
198 | .csslider > input:nth-of-type(5):checked ~ .arrows label:nth-of-type(4),
199 | .csslider > input:nth-of-type(6):checked ~ .arrows label:nth-of-type(5),
200 | .csslider > input:nth-of-type(7):checked ~ .arrows label:nth-of-type(6),
201 | .csslider > input:nth-of-type(8):checked ~ .arrows label:nth-of-type(7),
202 | .csslider > input:nth-of-type(9):checked ~ .arrows label:nth-of-type(8),
203 | .csslider > input:nth-of-type(10):checked ~ .arrows label:nth-of-type(9),
204 | .csslider > input:nth-of-type(11):checked ~ .arrows label:nth-of-type(10) {
205 | display: block;
206 | left: 0;
207 | -moz-transform: rotate(45deg);
208 | -ms-transform: rotate(45deg);
209 | -o-transform: rotate(45deg);
210 | -webkit-transform: rotate(45deg);
211 | transform: rotate(45deg);
212 | }
213 | .csslider.infinity > input:last-of-type:checked ~ .arrows label:first-of-type,
214 | .csslider > input:nth-of-type(1):checked ~ .arrows label:nth-of-type(2),
215 | .csslider > input:nth-of-type(2):checked ~ .arrows label:nth-of-type(3),
216 | .csslider > input:nth-of-type(3):checked ~ .arrows label:nth-of-type(4),
217 | .csslider > input:nth-of-type(4):checked ~ .arrows label:nth-of-type(5),
218 | .csslider > input:nth-of-type(5):checked ~ .arrows label:nth-of-type(6),
219 | .csslider > input:nth-of-type(6):checked ~ .arrows label:nth-of-type(7),
220 | .csslider > input:nth-of-type(7):checked ~ .arrows label:nth-of-type(8),
221 | .csslider > input:nth-of-type(8):checked ~ .arrows label:nth-of-type(9),
222 | .csslider > input:nth-of-type(9):checked ~ .arrows label:nth-of-type(10),
223 | .csslider > input:nth-of-type(10):checked ~ .arrows label:nth-of-type(11),
224 | .csslider > input:nth-of-type(11):checked ~ .arrows label:nth-of-type(12) {
225 | display: block;
226 | right: 0;
227 | -moz-transform: rotate(225deg);
228 | -ms-transform: rotate(225deg);
229 | -o-transform: rotate(225deg);
230 | -webkit-transform: rotate(225deg);
231 | transform: rotate(225deg);
232 | }
233 | /*#region MODULES */
234 | /*#endregion */
235 |
236 | .csslider > ul > li > * > img {
237 | max-width: 100%;
238 | max-height: 100%;
239 | }
240 |
241 | .csslider > ul > li > .container {
242 | display: flex;
243 | align-items: center;
244 | justify-content: center;
245 | height: 100%;
246 | }
--------------------------------------------------------------------------------
/public/img/ui/wb_logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
17 |
19 |
46 |
55 |
56 |
58 |
59 |
61 | image/svg+xml
62 |
64 |
65 |
66 |
67 |
73 |
82 |
91 |
95 |
99 |
102 |
106 |
110 |
111 |
112 |
116 |
122 |
126 |
127 |
131 |
135 |
139 |
140 |
144 |
150 |
154 |
156 |
172 |
190 |
191 |
192 |
196 |
202 |
206 |
210 |
226 |
244 |
245 |
246 |
247 |
248 |
249 |
--------------------------------------------------------------------------------
/public/img/ui/wb_brand.svg:
--------------------------------------------------------------------------------
1 |
2 |
18 |
20 |
26 |
27 |
51 |
56 |
57 |
59 |
60 |
62 | image/svg+xml
63 |
65 |
66 |
67 |
68 |
69 |
74 |
80 |
87 |
95 |
100 |
108 |
111 |
113 |
121 |
129 |
130 |
133 |
136 |
139 |
143 |
147 |
148 |
149 |
152 |
158 |
162 |
163 |
166 |
170 |
174 |
175 |
178 |
184 |
188 |
190 |
206 |
224 |
225 |
226 |
229 |
235 |
239 |
243 |
259 |
277 |
278 |
279 |
280 |
281 |
286 |
290 |
294 |
298 |
302 |
306 |
310 |
314 |
318 |
322 |
326 |
330 |
331 |
335 |
336 |
337 |
--------------------------------------------------------------------------------