Merge branch 'svelte'
This commit is contained in:
		
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
			
		||||
/node_modules/
 | 
			
		||||
/dist/
 | 
			
		||||
/.vscode/
 | 
			
		||||
.DS_Store
 | 
			
		||||
							
								
								
									
										48
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
# Svelte + TS + Vite
 | 
			
		||||
 | 
			
		||||
This template should help get you started developing with Svelte and TypeScript in Vite.
 | 
			
		||||
 | 
			
		||||
## Recommended IDE Setup
 | 
			
		||||
 | 
			
		||||
[VSCode](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode).
 | 
			
		||||
 | 
			
		||||
## Need an official Svelte framework?
 | 
			
		||||
 | 
			
		||||
Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more.
 | 
			
		||||
 | 
			
		||||
## Technical considerations
 | 
			
		||||
 | 
			
		||||
**Why use this over SvelteKit?**
 | 
			
		||||
 | 
			
		||||
- It brings its own routing solution which might not be preferable for some users.
 | 
			
		||||
- It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app.
 | 
			
		||||
  `vite dev` and `vite build` wouldn't work in a SvelteKit environment, for example.
 | 
			
		||||
 | 
			
		||||
This template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project.
 | 
			
		||||
 | 
			
		||||
Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate.
 | 
			
		||||
 | 
			
		||||
**Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?**
 | 
			
		||||
 | 
			
		||||
Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information.
 | 
			
		||||
 | 
			
		||||
**Why include `.vscode/extensions.json`?**
 | 
			
		||||
 | 
			
		||||
Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project.
 | 
			
		||||
 | 
			
		||||
**Why enable `allowJs` in the TS template?**
 | 
			
		||||
 | 
			
		||||
While `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant.
 | 
			
		||||
 | 
			
		||||
**Why is HMR not preserving my local component state?**
 | 
			
		||||
 | 
			
		||||
HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr).
 | 
			
		||||
 | 
			
		||||
If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR.
 | 
			
		||||
 | 
			
		||||
```ts
 | 
			
		||||
// store.ts
 | 
			
		||||
// An extremely simple external store
 | 
			
		||||
import { writable } from 'svelte/store'
 | 
			
		||||
export default writable(0)
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										15
									
								
								index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								index.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset="UTF-8" />
 | 
			
		||||
    <link rel="icon" href="/myriad.png" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
			
		||||
    <title>pk-webs | home</title>
 | 
			
		||||
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-dark-5@1.1.3/dist/css/bootstrap-night.min.css" />
 | 
			
		||||
    <link rel="stylesheet" href="http://localhost:3000/style.css" />
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
    <div id="app"></div>
 | 
			
		||||
    <script type="module" src="/src/main.ts"></script>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										32
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "pk-webs-2",
 | 
			
		||||
  "version": "0.0.0",
 | 
			
		||||
  "type": "module",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "dev": "vite",
 | 
			
		||||
    "build": "vite build",
 | 
			
		||||
    "preview": "vite preview",
 | 
			
		||||
    "check": "svelte-check --tsconfig ./tsconfig.json"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@sveltejs/vite-plugin-svelte": "^1.0.0-next.30",
 | 
			
		||||
    "@tsconfig/svelte": "^2.0.1",
 | 
			
		||||
    "svelte": "^3.44.0",
 | 
			
		||||
    "svelte-check": "^2.2.7",
 | 
			
		||||
    "svelte-preprocess": "^4.9.8",
 | 
			
		||||
    "svelte-toggle": "^3.1.0",
 | 
			
		||||
    "tslib": "^2.3.1",
 | 
			
		||||
    "typescript": "^4.4.4",
 | 
			
		||||
    "vite": "^2.7.0"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "axios": "^0.24.0",
 | 
			
		||||
    "discord-markdown": "^2.5.1",
 | 
			
		||||
    "moment": "^2.29.1",
 | 
			
		||||
    "moment-timezone": "^0.5.34",
 | 
			
		||||
    "svelte-autosize": "^1.0.1",
 | 
			
		||||
    "svelte-icons": "^2.1.0",
 | 
			
		||||
    "svelte-navigator": "^3.1.5",
 | 
			
		||||
    "sveltestrap": "^5.6.3"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								public/myriad.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								public/myriad.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 174 KiB  | 
							
								
								
									
										76
									
								
								src/App.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								src/App.svelte
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,76 @@
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
  import { Router, Route } from "svelte-navigator";
 | 
			
		||||
  import Navigation from "./lib/Navigation.svelte";
 | 
			
		||||
  import Dash from "./pages/Dash.svelte";
 | 
			
		||||
  import Home from "./pages/Home.svelte";
 | 
			
		||||
  import Settings from './pages/Settings.svelte';
 | 
			
		||||
  import Footer from './lib/Footer.svelte';
 | 
			
		||||
  import Public from "./pages/Public.svelte";
 | 
			
		||||
  import System from "./pages/profiles/System.svelte";
 | 
			
		||||
  
 | 
			
		||||
  // theme cdns (I might make some myself too)
 | 
			
		||||
  let light = "https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css";
 | 
			
		||||
  let dark = "https://cdn.jsdelivr.net/npm/bootstrap-dark-5@1.1.3/dist/css/bootstrap-night.min.css";
 | 
			
		||||
 | 
			
		||||
  let styleSrc = dark;
 | 
			
		||||
 | 
			
		||||
  // if there's a style already set, retrieve it
 | 
			
		||||
  let style = localStorage.getItem("pk-style") && localStorage.getItem("pk-style");
 | 
			
		||||
 | 
			
		||||
  // this automatically applies the style every time it is updated
 | 
			
		||||
  $: setStyle(style);
 | 
			
		||||
 | 
			
		||||
  // not sure if there's a better way to handle this
 | 
			
		||||
  function setStyle(style) {
 | 
			
		||||
    switch (style) {
 | 
			
		||||
      case "light": styleSrc = light;
 | 
			
		||||
      localStorage.setItem("pk-style", "light");
 | 
			
		||||
      break;
 | 
			
		||||
      case "dark": styleSrc = dark;
 | 
			
		||||
      localStorage.setItem("pk-style", "dark");
 | 
			
		||||
      break;
 | 
			
		||||
      default: styleSrc = dark;
 | 
			
		||||
      localStorage.setItem("pk-style", "dark");
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<svelte:head>
 | 
			
		||||
  <link rel="stylesheet" href={styleSrc}>
 | 
			
		||||
</svelte:head>
 | 
			
		||||
 | 
			
		||||
<Router>
 | 
			
		||||
  <Navigation bind:style={style}/>
 | 
			
		||||
    <Route path="/"><Home /></Route>
 | 
			
		||||
    <Route path="/dash"><Dash /></Route>
 | 
			
		||||
    <Route path="/settings"><Settings /></Route>
 | 
			
		||||
    <Route path="/public/*">
 | 
			
		||||
      <Route path="/"><Public /></Route>
 | 
			
		||||
      <Route path="/s/*">
 | 
			
		||||
        <Route path = "/:id">
 | 
			
		||||
          <System />
 | 
			
		||||
        </Route>
 | 
			
		||||
        <Route path = "/">
 | 
			
		||||
          hey please provide a system
 | 
			
		||||
        </Route>
 | 
			
		||||
      </Route>
 | 
			
		||||
      <Route path="/m/*">
 | 
			
		||||
        <Route path = "/:id">
 | 
			
		||||
          member
 | 
			
		||||
        </Route>
 | 
			
		||||
        <Route path = "/">
 | 
			
		||||
          hey please provide a member
 | 
			
		||||
        </Route>
 | 
			
		||||
      </Route>
 | 
			
		||||
      <Route path="/g/*">
 | 
			
		||||
        <Route path = "/:id">
 | 
			
		||||
          group
 | 
			
		||||
        </Route>
 | 
			
		||||
        <Route path = "/">
 | 
			
		||||
          hey please provide a group
 | 
			
		||||
        </Route>
 | 
			
		||||
      </Route>
 | 
			
		||||
    </Route>
 | 
			
		||||
  <Footer />
 | 
			
		||||
</Router>
 | 
			
		||||
							
								
								
									
										36
									
								
								src/api/group.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								src/api/group.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
interface GroupPrivacy {
 | 
			
		||||
    description_privacy?: string | boolean | null;
 | 
			
		||||
    icon_privacy?: string | boolean | null;
 | 
			
		||||
    list_privacy?: string | boolean | null;
 | 
			
		||||
    visibility?: string | boolean | null;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default class Group {
 | 
			
		||||
    id?: string;
 | 
			
		||||
    uuid?: string;
 | 
			
		||||
    name?: string;
 | 
			
		||||
    display_name?: string;
 | 
			
		||||
    description?: string;
 | 
			
		||||
    icon?: string;
 | 
			
		||||
    banner?: string;
 | 
			
		||||
    color?: string;
 | 
			
		||||
    privacy?: GroupPrivacy;
 | 
			
		||||
 | 
			
		||||
    constructor(data: any) {
 | 
			
		||||
        this.id = data.id;
 | 
			
		||||
        this.uuid = data.uuid;
 | 
			
		||||
        this.name = data.name;
 | 
			
		||||
        this.display_name = data.display_name;
 | 
			
		||||
        this.description = data.description;
 | 
			
		||||
        this.icon = data.icon;
 | 
			
		||||
        this.banner = data.banner;
 | 
			
		||||
        this.color = data.color;
 | 
			
		||||
        if (data.privacy) {
 | 
			
		||||
            this.privacy = {}
 | 
			
		||||
            this.privacy.description_privacy = data.privacy.description_privacy;
 | 
			
		||||
            this.privacy.icon_privacy = data.privacy.icon_privacy;
 | 
			
		||||
            this.privacy.list_privacy = data.privacy.list_privacy;
 | 
			
		||||
            this.privacy.visibility = data.privacy.visibility;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										176
									
								
								src/api/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								src/api/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,176 @@
 | 
			
		||||
import axios, { AxiosInstance, Method, AxiosResponse, AxiosRequestConfig } from 'axios';
 | 
			
		||||
import Sys from './system';
 | 
			
		||||
import Member from './member';
 | 
			
		||||
import Group from './group';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
type FieldError = {
 | 
			
		||||
    message: string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default class PKAPI {
 | 
			
		||||
 | 
			
		||||
    ROUTES = {
 | 
			
		||||
        GET_SYSTEM: (sid?: string) => sid ? `/systems/${sid}` : `/systems/@me`,
 | 
			
		||||
        GET_MEMBER_LIST: (sid?: string) => sid ? `/systems/${sid}/members` : `/systems/@me/members`,
 | 
			
		||||
        GET_MEMBER: (mid: string) => `/members/${mid}`,
 | 
			
		||||
        GET_GROUP_LIST: (sid?: string) => sid ? `/systems/${sid}/groups` : `/systems/@me/groups`,
 | 
			
		||||
 | 
			
		||||
        PATCH_SYSTEM: () => `/systems/@me`,
 | 
			
		||||
        
 | 
			
		||||
        POST_MEMBER: () => `/members`
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    baseUrl: string;
 | 
			
		||||
    instance: AxiosInstance
 | 
			
		||||
    
 | 
			
		||||
    constructor(baseUrl?: string) {
 | 
			
		||||
        this.baseUrl = baseUrl || 'https://api.pluralkit.me';
 | 
			
		||||
 | 
			
		||||
        this.instance = axios.create({
 | 
			
		||||
            baseURL: this.baseUrl + '/v2'
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async getSystem(options: { token?: string, id?: any}) {
 | 
			
		||||
        if (!options.token && !options.id) {
 | 
			
		||||
            throw new Error("Must pass a token or id.")
 | 
			
		||||
        }
 | 
			
		||||
        var system: Sys;
 | 
			
		||||
        var res: AxiosResponse;
 | 
			
		||||
        try {
 | 
			
		||||
            res = await this.handle(this.ROUTES.GET_SYSTEM(options.id ? options.id : ""), 'GET', {token: !options.id ? options.token : ""});
 | 
			
		||||
            if (res.status === 200) system = new Sys(res.data);
 | 
			
		||||
            else this.handleErrors(res);
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            throw new Error(error.message);
 | 
			
		||||
        }
 | 
			
		||||
        return system;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async patchSystem(options: {token: string, data: any}) {
 | 
			
		||||
        var body = new Sys(options.data);
 | 
			
		||||
        var system: Sys;
 | 
			
		||||
        var res: AxiosResponse;
 | 
			
		||||
        try {
 | 
			
		||||
            res = await this.handle(this.ROUTES.PATCH_SYSTEM(), 'PATCH', {token: options.token, body: body});
 | 
			
		||||
            if (res.status === 200) system = new Sys(res.data);
 | 
			
		||||
            else this.handleErrors(res);
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            throw new Error(error.message);
 | 
			
		||||
        }
 | 
			
		||||
        return system;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async getMemberList(options: { token?: string, id?: any}) {
 | 
			
		||||
        if (!options.token && !options.id) {
 | 
			
		||||
            throw new Error("Must pass a token or id.")
 | 
			
		||||
        }
 | 
			
		||||
        var members: Member[] = [];
 | 
			
		||||
        var res: AxiosResponse;
 | 
			
		||||
        try {
 | 
			
		||||
            res = await this.handle(this.ROUTES.GET_MEMBER_LIST(options.id ? options.id : ""), 'GET', {token: !options.id ? options.token : ""});
 | 
			
		||||
            if (res.status === 200) {
 | 
			
		||||
                let resObject: any = res.data;
 | 
			
		||||
                resObject.forEach(m => {
 | 
			
		||||
                    let member = new Member(m);
 | 
			
		||||
                    members.push(member);
 | 
			
		||||
                })
 | 
			
		||||
            }
 | 
			
		||||
            else this.handleErrors(res);
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            throw new Error(error.message);
 | 
			
		||||
        }
 | 
			
		||||
        return members;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async getMember(options: {id: any}) {
 | 
			
		||||
        if (!options.id) {
 | 
			
		||||
            throw new Error("Must pass an id.")
 | 
			
		||||
        }
 | 
			
		||||
        var member: Member;
 | 
			
		||||
        var res: AxiosResponse;
 | 
			
		||||
        try {
 | 
			
		||||
            res = await this.handle(this.ROUTES.GET_MEMBER(options.id), 'GET', {});
 | 
			
		||||
            if (res.status === 200) member = new Member(res.data);
 | 
			
		||||
            else this.handleErrors(res);
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            throw new Error(error.message);
 | 
			
		||||
        }
 | 
			
		||||
        return member;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async postMember(options: {token: any, data: any}) {
 | 
			
		||||
        if (!options.token) throw new Error("Must pass a token.");
 | 
			
		||||
        var body = new Member(options.data);
 | 
			
		||||
        var member: Member;
 | 
			
		||||
        var res: AxiosResponse;
 | 
			
		||||
        try {
 | 
			
		||||
            res = await this.handle(this.ROUTES.POST_MEMBER(), 'POST', {token: options.token, body: body});
 | 
			
		||||
            if (res.status === 200) member = new Member(res.data);
 | 
			
		||||
            else this.handleErrors(res);
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            throw new Error(error.message);
 | 
			
		||||
        }
 | 
			
		||||
        return member;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async getGroupList(options: {token?: string, id?: any}) {
 | 
			
		||||
        if (!options.token && !options.id) {
 | 
			
		||||
            throw new Error("Must pass a token or id.");
 | 
			
		||||
        }
 | 
			
		||||
        var groups: Group[] = [];
 | 
			
		||||
        var res: AxiosResponse;
 | 
			
		||||
        try {
 | 
			
		||||
            res = await this.handle(this.ROUTES.GET_GROUP_LIST(options.id ? options.id : ""), 'GET', {token: !options.id ? options.token : ""});
 | 
			
		||||
                if (res.status === 200) {
 | 
			
		||||
                    let resObject: any = res.data;
 | 
			
		||||
                    resObject.forEach(g => {
 | 
			
		||||
                        let group = new Group(g);
 | 
			
		||||
                        groups.push(group);
 | 
			
		||||
                    })
 | 
			
		||||
                }
 | 
			
		||||
                else this.handleErrors(res);
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            throw new Error(error.message);
 | 
			
		||||
        }
 | 
			
		||||
        return groups;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    handleErrors(res: any) {
 | 
			
		||||
        if (res.status === 500) throw new Error("500: Internal server error.");
 | 
			
		||||
        else if (res.status === 401) throw new Error("401: Your token is invalid.");
 | 
			
		||||
        else {
 | 
			
		||||
            let errorObject: any = res.data
 | 
			
		||||
            if (errorObject.code) {
 | 
			
		||||
                if (errorObject.code === 40001) {
 | 
			
		||||
                    var message: string;
 | 
			
		||||
                    for (var key in errorObject.errors) {
 | 
			
		||||
                        var val = errorObject.errors[key];
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    throw new Error(errorObject.message);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async handle(url: string, method: Method, options: {token?: string, body?: object}) {
 | 
			
		||||
        var headers = {}
 | 
			
		||||
        var request: AxiosRequestConfig = {url, method, headers}
 | 
			
		||||
 | 
			
		||||
        if(options.token) request.headers["Authorization"] = options.token;
 | 
			
		||||
        if (options.body) {
 | 
			
		||||
            request.headers["Content-Type"] = "application/json";
 | 
			
		||||
            request.data = JSON.stringify(options.body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            var res = await this.instance(request);
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            res = error.response;
 | 
			
		||||
        }
 | 
			
		||||
        return res;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										55
									
								
								src/api/member.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								src/api/member.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
interface MemberPrivacy {
 | 
			
		||||
    visibility?: string | boolean | null,
 | 
			
		||||
    description_privacy?: string | boolean | null,
 | 
			
		||||
    name_privacy?: string | boolean | null,
 | 
			
		||||
    birthday_privacy?: string | boolean | null,
 | 
			
		||||
    pronoun_privacy?: string | boolean | null,
 | 
			
		||||
    avatar_privacy?: string | boolean | null,
 | 
			
		||||
    metadata_privacy?: string | boolean | null
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default class Member {
 | 
			
		||||
    id?: string;
 | 
			
		||||
    uuid?: string;
 | 
			
		||||
    name?: string;
 | 
			
		||||
    display_name?: string;
 | 
			
		||||
    color?: string;
 | 
			
		||||
    birthday?: string;
 | 
			
		||||
    pronouns?: string;
 | 
			
		||||
    avatar_url?: string;
 | 
			
		||||
    banner?: string;
 | 
			
		||||
    description?: string;
 | 
			
		||||
    created?: string;
 | 
			
		||||
    keep_proxy?: boolean
 | 
			
		||||
    system?: string;
 | 
			
		||||
    proxy_tags?: Array<object>;
 | 
			
		||||
    privacy?: MemberPrivacy
 | 
			
		||||
 | 
			
		||||
    constructor(data: any) {
 | 
			
		||||
        this.id = data.id;
 | 
			
		||||
        this.uuid = data.uuid;
 | 
			
		||||
        this.name = data.name;
 | 
			
		||||
        this.display_name = data.display_name;
 | 
			
		||||
        this.color = data.color;
 | 
			
		||||
        this.birthday = data.birthday;
 | 
			
		||||
        this.pronouns = data.pronouns;
 | 
			
		||||
        this.avatar_url = data.avatar_url;
 | 
			
		||||
        this.banner = data.banner;
 | 
			
		||||
        this.description = data.description;
 | 
			
		||||
        this.created = data.created;
 | 
			
		||||
        this.system = data.system;
 | 
			
		||||
        this.proxy_tags = data.proxy_tags;
 | 
			
		||||
        this.keep_proxy = data.keep_proxy;
 | 
			
		||||
        if (data.privacy) {
 | 
			
		||||
            this.privacy = {
 | 
			
		||||
                visibility: data.privacy.visibility,
 | 
			
		||||
                description_privacy: data.privacy.description_privacy,
 | 
			
		||||
                name_privacy: data.privacy.name_privacy,
 | 
			
		||||
                birthday_privacy: data.privacy.birthday_privacy,
 | 
			
		||||
                pronoun_privacy: data.privacy.pronouns_privacy,
 | 
			
		||||
                avatar_privacy: data.privacy.avatar_privacy,
 | 
			
		||||
                metadata_privacy: data.privacy.metadata_privacy
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										43
									
								
								src/api/system.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								src/api/system.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
interface SystemPrivacy {
 | 
			
		||||
    description_privacy?: string,
 | 
			
		||||
    member_list_privacy?: string,
 | 
			
		||||
    front_privacy?: string,
 | 
			
		||||
    front_history_privacy?: string,
 | 
			
		||||
    group_list_privacy?: string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default class Sys {
 | 
			
		||||
    id?: string;
 | 
			
		||||
    uuid?: string;
 | 
			
		||||
    name?: string;
 | 
			
		||||
    description?: string;
 | 
			
		||||
    tag?: string;
 | 
			
		||||
    avatar_url?: string;
 | 
			
		||||
    banner?: string;
 | 
			
		||||
    timezone?: string;
 | 
			
		||||
    created?: string;
 | 
			
		||||
    privacy?: SystemPrivacy;
 | 
			
		||||
    color?: string;
 | 
			
		||||
 | 
			
		||||
    constructor(data: any) {
 | 
			
		||||
        this.id = data.id;
 | 
			
		||||
        this.uuid = data.uuid;
 | 
			
		||||
        this.name = data.name;
 | 
			
		||||
        this.description = data.description;
 | 
			
		||||
        this.tag = data.tag;
 | 
			
		||||
        this.avatar_url = data.avatar_url;
 | 
			
		||||
        this.banner = data.banner;
 | 
			
		||||
        this.timezone = data.timezone;
 | 
			
		||||
        this.created = data.created;
 | 
			
		||||
        this.color = data.color;
 | 
			
		||||
        if (data.privacy) {
 | 
			
		||||
            this.privacy = {
 | 
			
		||||
                description_privacy: data.privacy.description_privacy,
 | 
			
		||||
                member_list_privacy: data.privacy.member_list_privacy,
 | 
			
		||||
                front_privacy: data.privacy.front_privacy,
 | 
			
		||||
                front_history_privacy: data.privacy.front_history_privacy,
 | 
			
		||||
                group_list_privacy: data.privacy.group_list_privacy
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								src/assets/default_avatar.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/default_avatar.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 3.4 KiB  | 
							
								
								
									
										38
									
								
								src/lib/CardsHeader.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/lib/CardsHeader.svelte
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
    import { Modal, CardHeader, CardTitle, Image, Spinner } from 'sveltestrap';
 | 
			
		||||
    import FaUserCircle from 'svelte-icons/fa/FaUserCircle.svelte'
 | 
			
		||||
    import default_avatar from '../assets/default_avatar.png';
 | 
			
		||||
 | 
			
		||||
    export let item: any;
 | 
			
		||||
 | 
			
		||||
    let avatarOpen = false;
 | 
			
		||||
    const toggleAvatarModal = () => (avatarOpen = !avatarOpen);
 | 
			
		||||
    
 | 
			
		||||
    export let loading: boolean;
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<CardHeader>
 | 
			
		||||
    <CardTitle style="margin-top: 0px; margin-bottom: 0px; outline: none; align-items: center;" class="d-flex justify-content-between align-middle">
 | 
			
		||||
        <div>
 | 
			
		||||
            <div class="icon d-inline-block">
 | 
			
		||||
                <FaUserCircle />
 | 
			
		||||
            </div>
 | 
			
		||||
            <span style="vertical-align: middle;">{item.name} ({item.id})</span>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div>
 | 
			
		||||
        {#if loading}
 | 
			
		||||
        <div class="d-inline-block mr-5" style="vertical-align: middle;"><Spinner color="primary" /></div>
 | 
			
		||||
        {/if}
 | 
			
		||||
        {#if item && item.avatar_url}
 | 
			
		||||
        <img tabindex={0} on:keyup={(event) => {if (event.key === "Enter") avatarOpen = true}} on:click={toggleAvatarModal} class="rounded-circle avatar" src={item.avatar_url} alt="Your system avatar" />
 | 
			
		||||
        {:else}
 | 
			
		||||
        <img class="rounded-circle avatar" src={default_avatar} alt="your system avatar (default)" />
 | 
			
		||||
        {/if}
 | 
			
		||||
        </div>
 | 
			
		||||
        <Modal isOpen={avatarOpen} toggle={toggleAvatarModal}>
 | 
			
		||||
            <div slot="external" on:click={toggleAvatarModal} style="height: 100%; width: max-content; max-width: 100%; margin-left: auto; margin-right: auto; display: flex;">
 | 
			
		||||
                <Image style="display: block; margin: auto;" src={item.avatar_url} thumbnail alt="Your system avatar" />
 | 
			
		||||
            </div>
 | 
			
		||||
        </Modal>
 | 
			
		||||
    </CardTitle>
 | 
			
		||||
</CardHeader>
 | 
			
		||||
							
								
								
									
										13
									
								
								src/lib/Footer.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/lib/Footer.svelte
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
    import {Navbar, Nav, NavItem, NavLink} from 'sveltestrap';
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<div style="background-color: #292929">
 | 
			
		||||
    <Navbar color="dark" dark>
 | 
			
		||||
        <Nav>
 | 
			
		||||
            <NavItem>
 | 
			
		||||
                <NavLink href="https://pluralkit.me/">pluralkit.me</NavLink>
 | 
			
		||||
            </NavItem>
 | 
			
		||||
        </Nav>
 | 
			
		||||
    </Navbar>
 | 
			
		||||
</div>
 | 
			
		||||
							
								
								
									
										62
									
								
								src/lib/Navigation.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								src/lib/Navigation.svelte
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
    import {Navbar, NavbarBrand, Nav, NavItem, NavLink, Collapse, NavbarToggler, Dropdown, DropdownItem, DropdownMenu, DropdownToggle, Button} from 'sveltestrap';
 | 
			
		||||
    import { loggedIn } from '../stores';
 | 
			
		||||
    import { Link, navigate } from 'svelte-navigator';
 | 
			
		||||
import { get } from 'svelte/store';
 | 
			
		||||
 | 
			
		||||
    export let style: string;
 | 
			
		||||
 | 
			
		||||
    let isOpen = false;
 | 
			
		||||
    const toggle = () => (isOpen = !isOpen);
 | 
			
		||||
 | 
			
		||||
    let loggedIn_value: boolean;
 | 
			
		||||
 | 
			
		||||
    loggedIn.subscribe(value => {
 | 
			
		||||
		loggedIn_value = value;
 | 
			
		||||
	});
 | 
			
		||||
    
 | 
			
		||||
    function logout() {
 | 
			
		||||
        localStorage.removeItem("pk-token");
 | 
			
		||||
        localStorage.removeItem("pk-user");
 | 
			
		||||
        loggedIn.update(() => false);
 | 
			
		||||
        navigate("/");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
<div style="background-color: #292929" class="mb-4">
 | 
			
		||||
    <Navbar color="light" light expand="lg">
 | 
			
		||||
        <NavbarBrand>pk-webs</NavbarBrand>
 | 
			
		||||
        <NavbarToggler on:click={toggle}></NavbarToggler>
 | 
			
		||||
        <Collapse {isOpen} navbar expand="lg">
 | 
			
		||||
            <Nav class="ms-auto" navbar>
 | 
			
		||||
                <Dropdown nav inNavbar>
 | 
			
		||||
                    <DropdownToggle color="transparent">Styles</DropdownToggle>
 | 
			
		||||
                    <DropdownMenu end>
 | 
			
		||||
                        <DropdownItem on:click={() => style = "light"}>Light</DropdownItem>
 | 
			
		||||
                        <DropdownItem on:click={() => style = "dark"}>Dark</DropdownItem>
 | 
			
		||||
                    </DropdownMenu>
 | 
			
		||||
                </Dropdown>
 | 
			
		||||
                {#if loggedIn_value || localStorage.getItem("pk-token")}
 | 
			
		||||
                <Dropdown nav inNavbar>
 | 
			
		||||
                    <DropdownToggle color="transparent">Dash</DropdownToggle>
 | 
			
		||||
                    <DropdownMenu end>
 | 
			
		||||
                        <Link style="text-decoration: none;" to="/dash" state={{tab: "system"}}><DropdownItem>System</DropdownItem></Link>
 | 
			
		||||
                        <Link style="text-decoration: none;" to="/dash" state={{tab: "members"}}><DropdownItem>Members</DropdownItem></Link>
 | 
			
		||||
                        <DropdownItem divider />
 | 
			
		||||
                        <DropdownItem on:click={logout}>Log out</DropdownItem>
 | 
			
		||||
                    </DropdownMenu>
 | 
			
		||||
                </Dropdown>
 | 
			
		||||
                {/if}
 | 
			
		||||
                <NavItem>
 | 
			
		||||
                    <NavLink href="/settings">Settings</NavLink>
 | 
			
		||||
                </NavItem>
 | 
			
		||||
                <NavItem>
 | 
			
		||||
                    <NavLink href="/templates">Templates</NavLink>
 | 
			
		||||
                </NavItem>
 | 
			
		||||
                <NavItem>
 | 
			
		||||
                    <NavLink href="/public">Public</NavLink>
 | 
			
		||||
                </NavItem>
 | 
			
		||||
            </Nav>
 | 
			
		||||
        </Collapse>
 | 
			
		||||
    </Navbar>
 | 
			
		||||
</div>
 | 
			
		||||
							
								
								
									
										77
									
								
								src/lib/system/Body.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								src/lib/system/Body.svelte
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
    import { Row, Col, Modal, Image, Button } from 'sveltestrap';
 | 
			
		||||
    import moment from 'moment';
 | 
			
		||||
    import { toHTML } from 'discord-markdown';
 | 
			
		||||
    import type Sys from '../../api/system';
 | 
			
		||||
   
 | 
			
		||||
    export let user: Sys;
 | 
			
		||||
    export let editMode: boolean;
 | 
			
		||||
    export let isPublic: boolean;
 | 
			
		||||
 | 
			
		||||
    let htmlDescription: string;
 | 
			
		||||
    if (user.description) { 
 | 
			
		||||
        htmlDescription = toHTML(user.description, {embed: true});
 | 
			
		||||
    } else {
 | 
			
		||||
        htmlDescription = "(no description)";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let created = moment(user.created).format("MMM D, YYYY");
 | 
			
		||||
 | 
			
		||||
    let bannerOpen = false;
 | 
			
		||||
    const toggleBannerModal = () => (bannerOpen = !bannerOpen);
 | 
			
		||||
 | 
			
		||||
    let settings = JSON.parse(localStorage.getItem("pk-settings"));
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<Row>
 | 
			
		||||
    {#if user.id}
 | 
			
		||||
    <Col xs={12} lg={4} class="mb-2">
 | 
			
		||||
        <b>ID:</b> {user.id}
 | 
			
		||||
    </Col>
 | 
			
		||||
    {/if}
 | 
			
		||||
    {#if user.name}
 | 
			
		||||
    <Col xs={12} lg={4} class="mb-2">
 | 
			
		||||
        <b>Name:</b> {user.name}
 | 
			
		||||
    </Col>
 | 
			
		||||
    {/if}
 | 
			
		||||
    {#if user.tag}
 | 
			
		||||
    <Col xs={12} lg={4} class="mb-2">
 | 
			
		||||
        <b>Tag:</b> {user.tag}
 | 
			
		||||
    </Col>
 | 
			
		||||
    {/if}
 | 
			
		||||
    {#if user.created}
 | 
			
		||||
    <Col xs={12} lg={4} class="mb-2">
 | 
			
		||||
        <b>Created:</b> {created}
 | 
			
		||||
    </Col>
 | 
			
		||||
    {/if}
 | 
			
		||||
    {#if user.timezone}
 | 
			
		||||
    <Col xs={12} lg={4} class="mb-2">
 | 
			
		||||
        <b>Timezone:</b> {user.timezone}
 | 
			
		||||
    </Col>
 | 
			
		||||
    {/if}
 | 
			
		||||
    {#if user.color}
 | 
			
		||||
    <Col xs={12} lg={4} class="mb-2">
 | 
			
		||||
        <b>Color:</b> {user.color}
 | 
			
		||||
    </Col>
 | 
			
		||||
    {/if}
 | 
			
		||||
    {#if user.banner}
 | 
			
		||||
    <Col xs={12} lg={3} class="mb-2">
 | 
			
		||||
        <b>Banner:</b> <Button size="sm" color="light" on:click={toggleBannerModal}>View</Button>
 | 
			
		||||
        <Modal isOpen={bannerOpen} toggle={toggleBannerModal}>
 | 
			
		||||
            <div slot="external" on:click={toggleBannerModal} style="height: 100%; width: max-content; max-width: 100%; margin-left: auto; margin-right: auto; display: flex;">
 | 
			
		||||
                <Image style="display: block; margin: auto;" src={user.banner} thumbnail alt="Your system banner" />
 | 
			
		||||
            </div>
 | 
			
		||||
        </Modal>
 | 
			
		||||
    </Col>
 | 
			
		||||
    {/if}
 | 
			
		||||
</Row>
 | 
			
		||||
<div class="my-2">
 | 
			
		||||
    <b>Description:</b><br />
 | 
			
		||||
    {@html htmlDescription}
 | 
			
		||||
</div>
 | 
			
		||||
{#if user.banner && settings && settings.appearance.banner_bottom}
 | 
			
		||||
<img src={user.banner} alt="your system banner" class="w-100 mb-3 rounded" style="max-height: 12em; object-fit: cover"/>
 | 
			
		||||
{/if}
 | 
			
		||||
{#if !isPublic}
 | 
			
		||||
<Button style="flex: 0" color="primary" on:click={() => editMode = true}>Edit</Button>
 | 
			
		||||
{/if}
 | 
			
		||||
							
								
								
									
										87
									
								
								src/lib/system/Edit.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								src/lib/system/Edit.svelte
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,87 @@
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
    import { Row, Col, Input, Button, Label, Alert } from 'sveltestrap';
 | 
			
		||||
    import Sys from '../../api/system';
 | 
			
		||||
    import PKAPI from '../../api';
 | 
			
		||||
    import autosize from 'svelte-autosize';
 | 
			
		||||
    import moment from 'moment-timezone';
 | 
			
		||||
    import { currentUser } from '../../stores';
 | 
			
		||||
 | 
			
		||||
    export let editMode: boolean;
 | 
			
		||||
    export let user: Sys;
 | 
			
		||||
    export let loading: boolean;
 | 
			
		||||
 | 
			
		||||
    let err: string[] = [];
 | 
			
		||||
 | 
			
		||||
    let input = new Sys(user);
 | 
			
		||||
    
 | 
			
		||||
    async function submit() {
 | 
			
		||||
        let data = input;
 | 
			
		||||
        err = [];
 | 
			
		||||
 | 
			
		||||
        if (data.color && !/^#?[A-Fa-f0-9]{6}$/.test(input.color)) {
 | 
			
		||||
            err.push(`"${data.color}" is not a valid color, the color must be a 6-digit hex code. (example: #ff0000)`);
 | 
			
		||||
        } else if (data.color) {
 | 
			
		||||
            if (data.color.startsWith("#")) {
 | 
			
		||||
                data.color = input.color.slice(1, input.color.length);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (data.timezone && !moment.tz.zone(data.timezone)) {
 | 
			
		||||
            err.push(`"${data.timezone}" is not a valid timezone, check out <a target="_blank" style="color: var(--bs-body-color);" href="https://xske.github.io/tz/">this site</a> to see your current timezone!`);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        err = err;
 | 
			
		||||
        if (err.length > 0) return;
 | 
			
		||||
 | 
			
		||||
        loading = true;
 | 
			
		||||
        const api = new PKAPI();
 | 
			
		||||
        try {
 | 
			
		||||
            let res = await api.patchSystem({token: localStorage.getItem("pk-token"), data: data});
 | 
			
		||||
            user = res;
 | 
			
		||||
            currentUser.update(() => res);
 | 
			
		||||
            err = [];
 | 
			
		||||
            editMode = false;
 | 
			
		||||
            loading = false;
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            console.log(error);
 | 
			
		||||
            err.push(error.message);
 | 
			
		||||
            err = err;
 | 
			
		||||
            loading = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
{#each err as error}
 | 
			
		||||
    <Alert color="danger">{@html error}</Alert>
 | 
			
		||||
{/each}
 | 
			
		||||
<Row>
 | 
			
		||||
    <Col xs={12} lg={4} class="mb-2">
 | 
			
		||||
        <Label>Name:</Label>
 | 
			
		||||
        <Input bind:value={input.name} maxlength={100} type="text" placeholder={user.name} />
 | 
			
		||||
    </Col>
 | 
			
		||||
    <Col xs={12} lg={4} class="mb-2">
 | 
			
		||||
        <Label>Tag:</Label>
 | 
			
		||||
        <Input bind:value={input.tag} maxlength={100} type="text" placeholder={user.tag} />
 | 
			
		||||
    </Col>
 | 
			
		||||
    <Col xs={12} lg={4} class="mb-2">
 | 
			
		||||
        <Label>Timezone:</Label>
 | 
			
		||||
        <Input bind:value={input.timezone} type="text" placeholder={user.timezone} />
 | 
			
		||||
    </Col>
 | 
			
		||||
    <Col xs={12} lg={4} class="mb-2">
 | 
			
		||||
        <Label>Color:</Label>
 | 
			
		||||
        <Input bind:value={input.color} type="text" placeholder={user.color}/>
 | 
			
		||||
    </Col>
 | 
			
		||||
    <Col xs={12} lg={4} class="mb-2">
 | 
			
		||||
        <Label>Avatar url:</Label>
 | 
			
		||||
        <Input bind:value={input.avatar_url} maxlength={256} type="url" placeholder={user.avatar_url}/>
 | 
			
		||||
    </Col>
 | 
			
		||||
    <Col xs={12} lg={4} class="mb-2">
 | 
			
		||||
        <Label>Banner url:</Label>
 | 
			
		||||
        <Input bind:value={input.banner} maxlength={256} type="url" placeholder={user.banner}/>
 | 
			
		||||
    </Col>
 | 
			
		||||
</Row>
 | 
			
		||||
<div class="my-2">
 | 
			
		||||
    <b>Description:</b><br />
 | 
			
		||||
    <textarea class="form-control" bind:value={input.description} maxlength={1000} use:autosize placeholder={user.description}/>
 | 
			
		||||
</div>
 | 
			
		||||
<Button style="flex: 0" color="primary" on:click={submit}>Submit</Button> <Button style="flex: 0" color="light" on:click={() => editMode = false}>Back</Button>
 | 
			
		||||
							
								
								
									
										29
									
								
								src/lib/system/Main.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/lib/system/Main.svelte
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
    import { Card, CardBody } from 'sveltestrap';
 | 
			
		||||
    import CardsHeader from '../CardsHeader.svelte';
 | 
			
		||||
    import Body from './Body.svelte';
 | 
			
		||||
    import Privacy from './Privacy.svelte';
 | 
			
		||||
    import Edit from './Edit.svelte';
 | 
			
		||||
    import type Sys from '../../api/system';
 | 
			
		||||
 | 
			
		||||
    export let user: Sys;
 | 
			
		||||
    export let isPublic = true;
 | 
			
		||||
    let loading = false;
 | 
			
		||||
 | 
			
		||||
    let editMode = false;
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<Card class="mb-4">
 | 
			
		||||
    <CardsHeader bind:item={user} bind:loading/>
 | 
			
		||||
    <CardBody style="border-left: 4px solid #{user.color}">
 | 
			
		||||
        {#if !editMode}
 | 
			
		||||
        <Body bind:user bind:editMode bind:isPublic/>
 | 
			
		||||
        {:else}
 | 
			
		||||
        <Edit bind:user bind:editMode bind:loading />
 | 
			
		||||
        {/if}
 | 
			
		||||
    </CardBody>
 | 
			
		||||
</Card>
 | 
			
		||||
 | 
			
		||||
{#if !isPublic}
 | 
			
		||||
    <Privacy bind:user />
 | 
			
		||||
{/if}
 | 
			
		||||
							
								
								
									
										46
									
								
								src/lib/system/Privacy.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/lib/system/Privacy.svelte
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
    import { Card, CardHeader, CardBody, CardTitle, Row, Col, Button, Spinner } from 'sveltestrap';
 | 
			
		||||
    import FaUserLock from 'svelte-icons/fa/FaUserLock.svelte';
 | 
			
		||||
    import type Sys from '../../api/system';
 | 
			
		||||
    import PrivacyEdit from './PrivacyEdit.svelte';
 | 
			
		||||
 | 
			
		||||
    export let user: Sys;
 | 
			
		||||
    let editMode = false;
 | 
			
		||||
 | 
			
		||||
    let loading: boolean;
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<Card class="mb-4">
 | 
			
		||||
    <CardHeader>
 | 
			
		||||
        <CardTitle style="margin-top: 8px; outline: none;">
 | 
			
		||||
            <div class="icon d-inline-block">
 | 
			
		||||
                <FaUserLock />
 | 
			
		||||
            </div> System privacy
 | 
			
		||||
            {#if loading}<div class="d-inline-block mr-5" style="float: right;"><Spinner color="primary" /></div>{/if}
 | 
			
		||||
        </CardTitle>
 | 
			
		||||
    </CardHeader>
 | 
			
		||||
    <CardBody style="border-left: 4px solid #{user.color}">
 | 
			
		||||
        {#if editMode}
 | 
			
		||||
        <PrivacyEdit bind:loading bind:user={user} bind:editMode/>
 | 
			
		||||
        {:else}
 | 
			
		||||
        <Row>
 | 
			
		||||
            <Col xs={12} lg={4} class="mb-3">
 | 
			
		||||
                <b>Description:</b> {user.privacy.description_privacy}
 | 
			
		||||
            </Col>
 | 
			
		||||
            <Col xs={12} lg={4} class="mb-3">
 | 
			
		||||
                <b>Member list:</b> {user.privacy.member_list_privacy}
 | 
			
		||||
            </Col>
 | 
			
		||||
            <Col xs={12} lg={4} class="mb-3">
 | 
			
		||||
                <b>Group list:</b> {user.privacy.group_list_privacy}
 | 
			
		||||
            </Col>
 | 
			
		||||
            <Col xs={12} lg={4} class="mb-3">
 | 
			
		||||
                <b>Current front:</b> {user.privacy.front_privacy}
 | 
			
		||||
            </Col>
 | 
			
		||||
            <Col xs={12} lg={4} class="mb-3">
 | 
			
		||||
                <b>Front history:</b> {user.privacy.front_history_privacy}
 | 
			
		||||
            </Col>
 | 
			
		||||
        </Row>
 | 
			
		||||
        <Button style="flex: 0" color="primary" on:click={() => editMode = true}>Edit</Button>
 | 
			
		||||
        {/if}
 | 
			
		||||
    </CardBody>
 | 
			
		||||
</Card>
 | 
			
		||||
							
								
								
									
										79
									
								
								src/lib/system/PrivacyEdit.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								src/lib/system/PrivacyEdit.svelte
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,79 @@
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
    import Sys from '../../api/system';
 | 
			
		||||
    import { Input, Row, Col, Button, Label } from 'sveltestrap';
 | 
			
		||||
    import { currentUser } from '../../stores';
 | 
			
		||||
    import PKAPI from '../../api';
 | 
			
		||||
 | 
			
		||||
    export let loading = false;
 | 
			
		||||
    export let user: Sys;
 | 
			
		||||
    export let editMode: boolean;
 | 
			
		||||
 | 
			
		||||
    let err: string;
 | 
			
		||||
 | 
			
		||||
    let input = new Sys(user);
 | 
			
		||||
 | 
			
		||||
    async function submit() {
 | 
			
		||||
        let data = input;
 | 
			
		||||
        err = null;
 | 
			
		||||
 | 
			
		||||
        loading = true;
 | 
			
		||||
        const api = new PKAPI();
 | 
			
		||||
        try {
 | 
			
		||||
            let res = await api.patchSystem({token: localStorage.getItem("pk-token"), data: data});
 | 
			
		||||
            user = res;
 | 
			
		||||
            currentUser.update(() => res);
 | 
			
		||||
            editMode = false;
 | 
			
		||||
            loading = false;
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            console.log(error);
 | 
			
		||||
            err = error.message;
 | 
			
		||||
            err = err;
 | 
			
		||||
            loading = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<Label><b>Set all to:</b></Label>
 | 
			
		||||
<Input type="select" bind:value={input.privacy.description_privacy}>
 | 
			
		||||
    <option default>public</option>
 | 
			
		||||
    <option>private</option>
 | 
			
		||||
</Input>
 | 
			
		||||
<hr />
 | 
			
		||||
<Row>
 | 
			
		||||
    <Col xs={12} lg={4} class="mb-3">
 | 
			
		||||
        <Label>Description:</Label>
 | 
			
		||||
        <Input type="select" bind:value={input.privacy.description_privacy}>
 | 
			
		||||
            <option default={user.privacy.description_privacy === "public"}>public</option>
 | 
			
		||||
            <option default={user.privacy.description_privacy === "private"}>private</option>
 | 
			
		||||
        </Input>
 | 
			
		||||
    </Col>
 | 
			
		||||
    <Col xs={12} lg={4} class="mb-3">
 | 
			
		||||
        <Label>Member list:</Label>
 | 
			
		||||
        <Input type="select" bind:value={input.privacy.member_list_privacy}>
 | 
			
		||||
            <option default={user.privacy.member_list_privacy === "public"}>public</option>
 | 
			
		||||
            <option default={user.privacy.member_list_privacy === "private"}>private</option>
 | 
			
		||||
        </Input>
 | 
			
		||||
    </Col>
 | 
			
		||||
    <Col xs={12} lg={4} class="mb-3">
 | 
			
		||||
        <Label>Group list:</Label>
 | 
			
		||||
        <Input type="select" bind:value={input.privacy.group_list_privacy}>
 | 
			
		||||
            <option default={user.privacy.group_list_privacy === "public"}>public</option>
 | 
			
		||||
            <option default={user.privacy.group_list_privacy === "private"}>private</option>
 | 
			
		||||
        </Input>
 | 
			
		||||
    </Col>
 | 
			
		||||
    <Col xs={12} lg={4} class="mb-3">
 | 
			
		||||
        <Label>Current front:</Label>
 | 
			
		||||
        <Input type="select" bind:value={input.privacy.front_privacy}>
 | 
			
		||||
            <option default={user.privacy.front_privacy === "public"}>public</option>
 | 
			
		||||
            <option default={user.privacy.front_privacy === "private"}>private</option>
 | 
			
		||||
        </Input>
 | 
			
		||||
    </Col>
 | 
			
		||||
    <Col xs={12} lg={4} class="mb-3">
 | 
			
		||||
        <Label>Front history:</Label>
 | 
			
		||||
        <Input type="select" bind:value={input.privacy.front_history_privacy}>
 | 
			
		||||
            <option default={user.privacy.front_history_privacy === "public"}>public</option>
 | 
			
		||||
            <option default={user.privacy.front_history_privacy === "private"}>private</option>
 | 
			
		||||
        </Input>
 | 
			
		||||
    </Col>
 | 
			
		||||
</Row>
 | 
			
		||||
<Button style="flex: 0" color="primary" on:click={submit}>Submit</Button> <Button style="flex: 0" color="light" on:click={() => editMode = false}>Back</Button>
 | 
			
		||||
							
								
								
									
										7
									
								
								src/main.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/main.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
import App from './App.svelte'
 | 
			
		||||
 | 
			
		||||
const app = new App({
 | 
			
		||||
  target: document.getElementById('app')
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
export default app
 | 
			
		||||
							
								
								
									
										85
									
								
								src/pages/Dash.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								src/pages/Dash.svelte
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,85 @@
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
    import { Container, Col, Row, TabContent, TabPane } from 'sveltestrap';
 | 
			
		||||
    import { navigate, useLocation } from "svelte-navigator";
 | 
			
		||||
    import { currentUser, loggedIn } from '../stores';
 | 
			
		||||
    
 | 
			
		||||
    import System from '../lib/system/Main.svelte';
 | 
			
		||||
    import PKAPI from '../api';
 | 
			
		||||
    import Sys from '../api/system';
 | 
			
		||||
 | 
			
		||||
    let isPublic = false;
 | 
			
		||||
 | 
			
		||||
    // get the state from the navigator so that we know which tab to start on
 | 
			
		||||
    let location = useLocation();
 | 
			
		||||
    let tabPane = $location.state && $location.state.tab;
 | 
			
		||||
    // if there is no state, default to system
 | 
			
		||||
    if (tabPane === undefined) {
 | 
			
		||||
        tabPane = "system";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // subscribe to the cached user in the store
 | 
			
		||||
    let current;
 | 
			
		||||
    currentUser.subscribe(value => {
 | 
			
		||||
        current = value;
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
    // if there is no cached user, get the user from localstorage
 | 
			
		||||
    let user = new Sys(current ? current : JSON.parse(localStorage.getItem("pk-user")));
 | 
			
		||||
    // since the user in localstorage can be outdated, fetch the user from the api again
 | 
			
		||||
    if (!current) {
 | 
			
		||||
        login(localStorage.getItem("pk-token"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // if there's no user, and there's no token, assume the login failed and send us back to the homepage.
 | 
			
		||||
    if (!localStorage.getItem("pk-token") && !user) {
 | 
			
		||||
        navigate("/");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let settings = JSON.parse(localStorage.getItem("pk-settings"));
 | 
			
		||||
 | 
			
		||||
    // just the login function
 | 
			
		||||
    async function login(token: string) {
 | 
			
		||||
        const api = new PKAPI();
 | 
			
		||||
        try {
 | 
			
		||||
            if (!token) {
 | 
			
		||||
                throw new Error("Token cannot be empty.")
 | 
			
		||||
            }
 | 
			
		||||
            const res: Sys = await api.getSystem({token: token});
 | 
			
		||||
            localStorage.setItem("pk-token", token);
 | 
			
		||||
            localStorage.setItem("pk-user", JSON.stringify(res));
 | 
			
		||||
            loggedIn.update(() => true);
 | 
			
		||||
            currentUser.update(() => res);
 | 
			
		||||
            user = res;
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            console.log(error);
 | 
			
		||||
            localStorage.removeItem("pk-token");
 | 
			
		||||
            localStorage.removeItem("pk-user");
 | 
			
		||||
            currentUser.update(() => null);
 | 
			
		||||
            navigate("/");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<!-- display the banner if there's a banner set, and if the current settings allow for it-->
 | 
			
		||||
{#if user && user.banner && settings && settings.appearance.banner_top}
 | 
			
		||||
<div class="banner" style="background-image: url({user.banner})" />
 | 
			
		||||
{/if}
 | 
			
		||||
<Container>
 | 
			
		||||
    <Row>
 | 
			
		||||
        <Col class="mx-auto" xs={12} lg={10}>
 | 
			
		||||
            <TabContent class="mt-3">
 | 
			
		||||
                <TabPane tabId="system" tab="System" active={tabPane === "system"}>
 | 
			
		||||
                        <System bind:user={user} bind:isPublic={isPublic} />
 | 
			
		||||
                </TabPane>
 | 
			
		||||
                <TabPane tabId="members" tab="Members" active={tabPane === "members"}>
 | 
			
		||||
                        alo
 | 
			
		||||
                </TabPane> 
 | 
			
		||||
            </TabContent>
 | 
			
		||||
        </Col>
 | 
			
		||||
    </Row>
 | 
			
		||||
</Container>
 | 
			
		||||
 | 
			
		||||
<svelte:head>
 | 
			
		||||
    <title>pk-webs | dash</title>
 | 
			
		||||
</svelte:head>
 | 
			
		||||
							
								
								
									
										112
									
								
								src/pages/Home.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								src/pages/Home.svelte
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,112 @@
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
    import { onMount } from 'svelte';
 | 
			
		||||
    import { Container, Card, CardHeader, CardBody, CardTitle, Col, Row, Spinner, Input, Button, Label, Alert } from 'sveltestrap';
 | 
			
		||||
    import FaLockOpen from 'svelte-icons/fa/FaLockOpen.svelte';
 | 
			
		||||
    import { loggedIn, currentUser } from '../stores';
 | 
			
		||||
    import { Link } from 'svelte-navigator';
 | 
			
		||||
 | 
			
		||||
    import PKAPI from '../api/index';
 | 
			
		||||
    import type Sys from '../api/system';
 | 
			
		||||
 | 
			
		||||
    let loading = false;
 | 
			
		||||
    let err: string;
 | 
			
		||||
    let token: string;
 | 
			
		||||
 | 
			
		||||
    let isLoggedIn: boolean;
 | 
			
		||||
    let user;
 | 
			
		||||
 | 
			
		||||
    loggedIn.subscribe(value => {
 | 
			
		||||
		isLoggedIn = value;
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
    currentUser.subscribe(value => {
 | 
			
		||||
        user = value;
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    onMount(() => { 
 | 
			
		||||
        if (localStorage.getItem("pk-token")) {
 | 
			
		||||
            login(localStorage.getItem("pk-token"));
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    async function login(token: string) {
 | 
			
		||||
        loading = true;
 | 
			
		||||
        const api = new PKAPI();
 | 
			
		||||
        try {
 | 
			
		||||
            if (!token) {
 | 
			
		||||
                throw new Error("Token cannot be empty.")
 | 
			
		||||
            }
 | 
			
		||||
            const res: Sys = await api.getSystem({token: token});
 | 
			
		||||
            localStorage.setItem("pk-token", token);
 | 
			
		||||
            localStorage.setItem("pk-user", JSON.stringify(res));
 | 
			
		||||
            err = null;
 | 
			
		||||
            loggedIn.update(() => true);
 | 
			
		||||
            currentUser.update(() => res);
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            console.log(error);
 | 
			
		||||
            localStorage.removeItem("pk-token");
 | 
			
		||||
            localStorage.removeItem("pk-user");
 | 
			
		||||
            currentUser.update(() => null);
 | 
			
		||||
            err = error.message;
 | 
			
		||||
        }
 | 
			
		||||
        loading = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    function logout() {
 | 
			
		||||
        token = null;
 | 
			
		||||
        localStorage.removeItem("pk-token");
 | 
			
		||||
        localStorage.removeItem("pk-user");
 | 
			
		||||
        loggedIn.update(() => false);
 | 
			
		||||
        currentUser.update(() => null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<Container>
 | 
			
		||||
    <Row>
 | 
			
		||||
        <Col class="mx-auto" xs={12} lg={10}>
 | 
			
		||||
            {#if err}
 | 
			
		||||
                <Alert color="danger" >{err}</Alert>
 | 
			
		||||
            {/if}
 | 
			
		||||
            <Card class="mb-4">
 | 
			
		||||
                <CardHeader>
 | 
			
		||||
                    <CardTitle style="margin-top: 8px; outline: none;">
 | 
			
		||||
                        <div class="icon d-inline-block">
 | 
			
		||||
                            <FaLockOpen />
 | 
			
		||||
                        </div>Log in {#if loading} <div style="float: right"><Spinner color="primary" /></div> {/if}
 | 
			
		||||
                    </CardTitle>
 | 
			
		||||
                </CardHeader>
 | 
			
		||||
                <CardBody>
 | 
			
		||||
                    {#if loading}
 | 
			
		||||
                        verifying login...
 | 
			
		||||
                    {:else if isLoggedIn}
 | 
			
		||||
                        {#if user && user.name}
 | 
			
		||||
                            <p>Welcome back, <b>{user.name}</b>!</p>
 | 
			
		||||
                        {:else}
 | 
			
		||||
                            <p>Welcome back!</p>
 | 
			
		||||
                        {/if}
 | 
			
		||||
                        <Link to="/dash"><Button style="float: left;" color='primary'>Go to dash</Button></Link><Button style="float: right;" color='danger' on:click={logout}>Log out</Button>
 | 
			
		||||
                    {:else}
 | 
			
		||||
                        <Row>
 | 
			
		||||
                            <Label>Enter your token here. You can get this by using <b>pk;token</b></Label>
 | 
			
		||||
                            <Col xs={12} md={10}>
 | 
			
		||||
                                <Input class="mb-2" type="text" bind:value={token}/>
 | 
			
		||||
                            </Col>
 | 
			
		||||
                            <Col xs={12} md={2}>
 | 
			
		||||
                                <Button style="width: 100%" color="primary" on:click={() => login(token)}>Submit</Button>
 | 
			
		||||
                            </Col>
 | 
			
		||||
                        </Row>
 | 
			
		||||
                    {/if}
 | 
			
		||||
                </CardBody>
 | 
			
		||||
            </Card>
 | 
			
		||||
            {#if isLoggedIn}
 | 
			
		||||
            <Card class="mb-4">
 | 
			
		||||
                <CardBody>
 | 
			
		||||
                    Some cool stuff will go here.
 | 
			
		||||
                </CardBody>
 | 
			
		||||
            </Card>
 | 
			
		||||
            {/if}
 | 
			
		||||
        </Col>
 | 
			
		||||
    </Row>
 | 
			
		||||
</Container>
 | 
			
		||||
							
								
								
									
										38
									
								
								src/pages/Public.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/pages/Public.svelte
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
    import { Container, Row, Col, Card, CardHeader, CardTitle, CardBody, Input, Button } from 'sveltestrap';
 | 
			
		||||
    import { Link } from 'svelte-navigator';
 | 
			
		||||
    import FaRocket from 'svelte-icons/fa/FaRocket.svelte';
 | 
			
		||||
 | 
			
		||||
    let sysInput: string = "";
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<Container>
 | 
			
		||||
    <Row>
 | 
			
		||||
        <Col class="mx-auto" xs={12} lg={10}>
 | 
			
		||||
            <Card>
 | 
			
		||||
                <CardHeader>
 | 
			
		||||
                    <CardTitle style="margin-top: 8px; outline: none;">
 | 
			
		||||
                        <div class="icon d-inline-block">
 | 
			
		||||
                            <FaRocket />
 | 
			
		||||
                        </div>Profile
 | 
			
		||||
                    </CardTitle>
 | 
			
		||||
                </CardHeader>
 | 
			
		||||
                <CardBody>
 | 
			
		||||
                    Submit a <b>system ID</b> to view that system's profile.
 | 
			
		||||
                    <Row>
 | 
			
		||||
                        <Col xs={12} lg={9} class="my-2">
 | 
			
		||||
                            <Input bind:value={sysInput} />
 | 
			
		||||
                        </Col>
 | 
			
		||||
                        <Col xs={12} lg={3} class="my-2 d-flex">
 | 
			
		||||
                            {#if sysInput !== ""}
 | 
			
		||||
                            <Link style="text-decoration: none; flex: 1 0 auto" to="/public/s/{sysInput.trim()}"><Button class="w-100" color="primary">View</Button></Link>
 | 
			
		||||
                            {:else}
 | 
			
		||||
                                <Button class="w-100" disabled color="primary">View</Button>
 | 
			
		||||
                            {/if}
 | 
			
		||||
                        </Col>
 | 
			
		||||
                    </Row>
 | 
			
		||||
                </CardBody>
 | 
			
		||||
            </Card>
 | 
			
		||||
        </Col>
 | 
			
		||||
    </Row>
 | 
			
		||||
</Container>
 | 
			
		||||
							
								
								
									
										56
									
								
								src/pages/Settings.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								src/pages/Settings.svelte
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
    import { Card, CardHeader, CardBody, Container, Row, Col, CardTitle, Tooltip } from 'sveltestrap';
 | 
			
		||||
    import Toggle from 'svelte-toggle';
 | 
			
		||||
    import FaCogs from 'svelte-icons/fa/FaCogs.svelte'
 | 
			
		||||
 | 
			
		||||
    let savedSettings = JSON.parse(localStorage.getItem("pk-settings"));
 | 
			
		||||
 | 
			
		||||
    let settings = {
 | 
			
		||||
        appearance: {
 | 
			
		||||
            banner_top: true,
 | 
			
		||||
            banner_bottom: true,
 | 
			
		||||
            gradient_background: false,
 | 
			
		||||
            no_background: false
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    if (savedSettings) {
 | 
			
		||||
        settings = {...settings, ...savedSettings}
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<Container>
 | 
			
		||||
    <Row>
 | 
			
		||||
        <Col class="mx-auto" xs={12} lg={10}>
 | 
			
		||||
            <Card class="mb-4">
 | 
			
		||||
                <CardHeader>
 | 
			
		||||
                    <CardTitle style="margin-top: 8px; outline: none;">
 | 
			
		||||
                        <div class="icon d-inline-block">
 | 
			
		||||
                            <FaCogs />
 | 
			
		||||
                        </div>Personal settings
 | 
			
		||||
                    </CardTitle>
 | 
			
		||||
                </CardHeader>
 | 
			
		||||
                <CardBody>
 | 
			
		||||
                    <p>These settings are saved in your localstorage. This means that you have to reapply these every time you visit in a different browser, or clear your browser's cookies.</p>
 | 
			
		||||
                    <h4>Appearance</h4>
 | 
			
		||||
                    <hr/>
 | 
			
		||||
                    <Row>
 | 
			
		||||
                        <Col xs={12} lg={4}>
 | 
			
		||||
                            <span id="s-bannertop">Show banners in the background?</span> <Toggle hideLabel style="display: inline" label="Remove banner from background" toggled={settings.appearance.banner_top} on:toggle={() => {settings.appearance.banner_top = !settings.appearance.banner_top; localStorage.setItem("pk-settings", JSON.stringify(settings));}}/>
 | 
			
		||||
                            <Tooltip target="s-bannertop" placement="bottom">Toggles banners from the top of the system, member and group pages.</Tooltip>
 | 
			
		||||
                        </Col>
 | 
			
		||||
                        <Col xs={12} lg={4}>
 | 
			
		||||
                            <span id="s-bannerbottom">Show banners at the bottom of cards?</span> <Toggle hideLabel style="display: inline" label="Remove banner from bottom" toggled={settings.appearance.banner_bottom} on:toggle={() => {settings.appearance.banner_bottom = !settings.appearance.banner_bottom; localStorage.setItem("pk-settings", JSON.stringify(settings));}}/>
 | 
			
		||||
                            <Tooltip target="s-bannerbottom" placement="bottom">Toggles banners at the bottom of the system, member and group cards.</Tooltip>
 | 
			
		||||
                        </Col>
 | 
			
		||||
                    </Row>
 | 
			
		||||
                </CardBody>
 | 
			
		||||
            </Card>
 | 
			
		||||
        </Col>
 | 
			
		||||
    </Row>
 | 
			
		||||
</Container>
 | 
			
		||||
 | 
			
		||||
<svelte:head>
 | 
			
		||||
    <title>pk-webs | settings</title>
 | 
			
		||||
</svelte:head>
 | 
			
		||||
							
								
								
									
										71
									
								
								src/pages/profiles/System.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								src/pages/profiles/System.svelte
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,71 @@
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
    import { Container, Col, Row, TabContent, TabPane, Alert, Spinner } from 'sveltestrap';
 | 
			
		||||
    import { useParams } from "svelte-navigator";
 | 
			
		||||
    import { onMount } from 'svelte';
 | 
			
		||||
    
 | 
			
		||||
    import System from '../../lib/system/Main.svelte';
 | 
			
		||||
    import PKAPI from '../../api';
 | 
			
		||||
    import Sys from '../../api/system';
 | 
			
		||||
 | 
			
		||||
    let isPublic = true;
 | 
			
		||||
 | 
			
		||||
    let user = new Sys({});
 | 
			
		||||
    let settings = JSON.parse(localStorage.getItem("pk-settings"));
 | 
			
		||||
 | 
			
		||||
    let params = useParams();
 | 
			
		||||
    $: id = $params.id;
 | 
			
		||||
    
 | 
			
		||||
    let err: string;
 | 
			
		||||
    
 | 
			
		||||
    const api = new PKAPI();
 | 
			
		||||
 | 
			
		||||
    let title = "system"
 | 
			
		||||
 | 
			
		||||
    onMount(() => {
 | 
			
		||||
        getSystem();
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    async function getSystem() {
 | 
			
		||||
        try {
 | 
			
		||||
            let res: Sys = await api.getSystem({id: id})
 | 
			
		||||
            user = res;
 | 
			
		||||
            title = user.name;
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            console.log(error);
 | 
			
		||||
            err = error.message;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<!-- display the banner if there's a banner set, and if the current settings allow for it-->
 | 
			
		||||
{#if user && user.banner && settings && settings.appearance.banner_top}
 | 
			
		||||
<div class="banner" style="background-image: url({user.banner})" />
 | 
			
		||||
{/if}
 | 
			
		||||
<Container>
 | 
			
		||||
    <Row>
 | 
			
		||||
        <Col class="mx-auto" xs={12} lg={10}>
 | 
			
		||||
            {#if !user.id && !err}
 | 
			
		||||
            <div class="mx-auto text-center">
 | 
			
		||||
                <Spinner class="d-inline-block" />
 | 
			
		||||
            </div>
 | 
			
		||||
            {:else if err}
 | 
			
		||||
                <Alert color="danger">{err}</Alert>
 | 
			
		||||
            {:else}
 | 
			
		||||
            <Alert color="info">You are currently <b>viewing</b> a system.</Alert>
 | 
			
		||||
            <TabContent class="mt-3">
 | 
			
		||||
                <TabPane tabId="system" tab="System" active>
 | 
			
		||||
                        <System bind:user={user} bind:isPublic={isPublic} />
 | 
			
		||||
                </TabPane>
 | 
			
		||||
                <TabPane tabId="members" tab="Members">
 | 
			
		||||
                        alo
 | 
			
		||||
                </TabPane> 
 | 
			
		||||
            </TabContent>
 | 
			
		||||
            {/if}
 | 
			
		||||
        </Col>
 | 
			
		||||
    </Row>
 | 
			
		||||
</Container>
 | 
			
		||||
 | 
			
		||||
<svelte:head>
 | 
			
		||||
    <title>pk-webs | {title}</title>
 | 
			
		||||
</svelte:head>
 | 
			
		||||
							
								
								
									
										25
									
								
								src/stores.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/stores.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
import { writable } from 'svelte/store';
 | 
			
		||||
 | 
			
		||||
export const loggedIn = writable(false);
 | 
			
		||||
 | 
			
		||||
/* export const user = writable({
 | 
			
		||||
    id: null,
 | 
			
		||||
    uuid: null,
 | 
			
		||||
    name: null,
 | 
			
		||||
    description: null,
 | 
			
		||||
    tag: null,
 | 
			
		||||
    avatar_url: null,
 | 
			
		||||
    banner: null,
 | 
			
		||||
    timezone: null,
 | 
			
		||||
    created: null,
 | 
			
		||||
    color: null,
 | 
			
		||||
    privacy: {
 | 
			
		||||
        description_privacy: null,
 | 
			
		||||
        member_list_privacy: null,
 | 
			
		||||
        front_privacy: null,
 | 
			
		||||
        front_history_privacy: null,
 | 
			
		||||
        group_list_privacy: null
 | 
			
		||||
    }
 | 
			
		||||
}); */
 | 
			
		||||
 | 
			
		||||
export const currentUser = writable(null);
 | 
			
		||||
							
								
								
									
										2
									
								
								src/vite-env.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								src/vite-env.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
/// <reference types="svelte" />
 | 
			
		||||
/// <reference types="vite/client" />
 | 
			
		||||
							
								
								
									
										87
									
								
								style.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								style.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,87 @@
 | 
			
		||||
#app {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    flex-direction: column;
 | 
			
		||||
    min-height: 100vh;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.icon {
 | 
			
		||||
    height: 1.5em;
 | 
			
		||||
    width: 1.5em;
 | 
			
		||||
    margin-right: 0.5em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.avatar {
 | 
			
		||||
    height: 2.5em;
 | 
			
		||||
    width: 2.5em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.modal-content {
 | 
			
		||||
    border: none !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.modal {
 | 
			
		||||
    display: flex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.banner {
 | 
			
		||||
    z-index: -200;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    height: 40vh;
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    top: 0;
 | 
			
		||||
    left: 0;
 | 
			
		||||
    background-size: cover;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
blockquote {
 | 
			
		||||
    padding-left: 0.5em;
 | 
			
		||||
    margin: 0.25em 0 0.25em 0 !important;
 | 
			
		||||
    border-left: 4px solid rgba(128, 128, 128, 0.3);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.nav-tabs * .nav-link {
 | 
			
		||||
    background-color: var(--bs-body-bg) !important;
 | 
			
		||||
    border-color: rgba(128, 128, 128, 0.3) !important;
 | 
			
		||||
    border-bottom-color: transparent !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.nav-tabs {
 | 
			
		||||
    gap: 0.25em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.nav-tabs {
 | 
			
		||||
    border-bottom: none !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.container {
 | 
			
		||||
    flex: 1 0 auto !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.d-spoiler {
 | 
			
		||||
    color: var(--bs-dark);
 | 
			
		||||
    background-color: var(--bs-dark);
 | 
			
		||||
    border-radius: 2px;
 | 
			
		||||
    transition-delay: 6000s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.d-spoiler::selection {
 | 
			
		||||
    color: var(--bs-dark);
 | 
			
		||||
    background-color: transparent;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.d-spoiler:active {
 | 
			
		||||
    background-color: rgba(128, 128, 128, 0.3);
 | 
			
		||||
    color: var(--bs-body-color);
 | 
			
		||||
    transition-delay: 0s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.d-emoji {
 | 
			
		||||
    height: 1em;
 | 
			
		||||
    width: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media (min-width: 768px) {
 | 
			
		||||
    .banner {
 | 
			
		||||
        height: 50vh;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								svelte.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								svelte.config.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
import sveltePreprocess from 'svelte-preprocess'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  // Consult https://github.com/sveltejs/svelte-preprocess
 | 
			
		||||
  // for more information about preprocessors
 | 
			
		||||
  preprocess: sveltePreprocess()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
{
 | 
			
		||||
  "extends": "@tsconfig/svelte/tsconfig.json",
 | 
			
		||||
  "compilerOptions": {
 | 
			
		||||
    "target": "esnext",
 | 
			
		||||
    "useDefineForClassFields": true,
 | 
			
		||||
    "module": "esnext",
 | 
			
		||||
    "resolveJsonModule": true,
 | 
			
		||||
    "baseUrl": ".",
 | 
			
		||||
    /**
 | 
			
		||||
     * Typecheck JS in `.svelte` and `.js` files by default.
 | 
			
		||||
     * Disable checkJs if you'd like to use dynamic types in JS.
 | 
			
		||||
     * Note that setting allowJs false does not prevent the use
 | 
			
		||||
     * of JS in `.svelte` files.
 | 
			
		||||
     */
 | 
			
		||||
    "allowJs": true,
 | 
			
		||||
    "checkJs": true
 | 
			
		||||
  },
 | 
			
		||||
  "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte"]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										8
									
								
								vite.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								vite.config.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
import { defineConfig } from 'vite'
 | 
			
		||||
import { svelte } from '@sveltejs/vite-plugin-svelte'
 | 
			
		||||
 | 
			
		||||
// https://vitejs.dev/config/
 | 
			
		||||
export default defineConfig({
 | 
			
		||||
  plugins: [svelte()],
 | 
			
		||||
  optimizeDeps: { exclude: ["svelte-navigator"] }
 | 
			
		||||
})
 | 
			
		||||
							
								
								
									
										854
									
								
								yarn.lock
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										854
									
								
								yarn.lock
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,854 @@
 | 
			
		||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
 | 
			
		||||
# yarn lockfile v1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
"@nodelib/fs.scandir@2.1.5":
 | 
			
		||||
  version "2.1.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
 | 
			
		||||
  integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@nodelib/fs.stat" "2.0.5"
 | 
			
		||||
    run-parallel "^1.1.9"
 | 
			
		||||
 | 
			
		||||
"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
 | 
			
		||||
  version "2.0.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
 | 
			
		||||
  integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
 | 
			
		||||
 | 
			
		||||
"@nodelib/fs.walk@^1.2.3":
 | 
			
		||||
  version "1.2.8"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
 | 
			
		||||
  integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@nodelib/fs.scandir" "2.1.5"
 | 
			
		||||
    fastq "^1.6.0"
 | 
			
		||||
 | 
			
		||||
"@popperjs/core@^2.9.2":
 | 
			
		||||
  version "2.11.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.0.tgz#6734f8ebc106a0860dff7f92bf90df193f0935d7"
 | 
			
		||||
  integrity sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ==
 | 
			
		||||
 | 
			
		||||
"@rollup/pluginutils@^4.1.1":
 | 
			
		||||
  version "4.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.1.1.tgz#1d4da86dd4eded15656a57d933fda2b9a08d47ec"
 | 
			
		||||
  integrity sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    estree-walker "^2.0.1"
 | 
			
		||||
    picomatch "^2.2.2"
 | 
			
		||||
 | 
			
		||||
"@sveltejs/vite-plugin-svelte@^1.0.0-next.30":
 | 
			
		||||
  version "1.0.0-next.31"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.31.tgz#5d0d5445ed85a1af613224eacff78c69f14c7fad"
 | 
			
		||||
  integrity sha512-8K3DcGP1V+XBv389u32S6wt8xiun6hHd5wn28AKLSoNTIhOmJOA2RJUJzp0seTRI86Shme4lzHI2Fgq4qz1wXQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@rollup/pluginutils" "^4.1.1"
 | 
			
		||||
    debug "^4.3.3"
 | 
			
		||||
    kleur "^4.1.4"
 | 
			
		||||
    magic-string "^0.25.7"
 | 
			
		||||
    require-relative "^0.8.7"
 | 
			
		||||
    svelte-hmr "^0.14.7"
 | 
			
		||||
 | 
			
		||||
"@tsconfig/svelte@^2.0.1":
 | 
			
		||||
  version "2.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@tsconfig/svelte/-/svelte-2.0.1.tgz#0e8d7caa693e9b2afce5e622c0475bb0fd89c12c"
 | 
			
		||||
  integrity sha512-aqkICXbM1oX5FfgZd2qSSAGdyo/NRxjWCamxoyi3T8iVQnzGge19HhDYzZ6NrVOW7bhcWNSq9XexWFtMzbB24A==
 | 
			
		||||
 | 
			
		||||
"@types/node@*":
 | 
			
		||||
  version "16.11.12"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.12.tgz#ac7fb693ac587ee182c3780c26eb65546a1a3c10"
 | 
			
		||||
  integrity sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==
 | 
			
		||||
 | 
			
		||||
"@types/prop-types@*":
 | 
			
		||||
  version "15.7.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11"
 | 
			
		||||
  integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==
 | 
			
		||||
 | 
			
		||||
"@types/pug@^2.0.4":
 | 
			
		||||
  version "2.0.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.5.tgz#69bc700934dd473c7ab97270bd2dbacefe562231"
 | 
			
		||||
  integrity sha512-LOnASQoeNZMkzexRuyqcBBDZ6rS+rQxUMkmj5A0PkhhiSZivLIuz6Hxyr1mkGoEZEkk66faROmpMi4fFkrKsBA==
 | 
			
		||||
 | 
			
		||||
"@types/react@>=16.0.0":
 | 
			
		||||
  version "17.0.37"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.37.tgz#6884d0aa402605935c397ae689deed115caad959"
 | 
			
		||||
  integrity sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/prop-types" "*"
 | 
			
		||||
    "@types/scheduler" "*"
 | 
			
		||||
    csstype "^3.0.2"
 | 
			
		||||
 | 
			
		||||
"@types/sass@^1.16.0":
 | 
			
		||||
  version "1.43.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/sass/-/sass-1.43.1.tgz#86bb0168e9e881d7dade6eba16c9ed6d25dc2f68"
 | 
			
		||||
  integrity sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/node" "*"
 | 
			
		||||
 | 
			
		||||
"@types/scheduler@*":
 | 
			
		||||
  version "0.16.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39"
 | 
			
		||||
  integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==
 | 
			
		||||
 | 
			
		||||
ansi-styles@^4.1.0:
 | 
			
		||||
  version "4.3.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
 | 
			
		||||
  integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    color-convert "^2.0.1"
 | 
			
		||||
 | 
			
		||||
anymatch@~3.1.2:
 | 
			
		||||
  version "3.1.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
 | 
			
		||||
  integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    normalize-path "^3.0.0"
 | 
			
		||||
    picomatch "^2.0.4"
 | 
			
		||||
 | 
			
		||||
autosize@*:
 | 
			
		||||
  version "5.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/autosize/-/autosize-5.0.1.tgz#ed269b0fa9b7eb47627048a1bb3299e99e003a0f"
 | 
			
		||||
  integrity sha512-UIWUlE4TOVPNNj2jjrU39wI4hEYbneUypEqcyRmRFIx5CC2gNdg3rQr+Zh7/3h6egbBvm33TDQjNQKtj9Tk1HA==
 | 
			
		||||
 | 
			
		||||
axios@^0.24.0:
 | 
			
		||||
  version "0.24.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6"
 | 
			
		||||
  integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    follow-redirects "^1.14.4"
 | 
			
		||||
 | 
			
		||||
balanced-match@^1.0.0:
 | 
			
		||||
  version "1.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
 | 
			
		||||
  integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
 | 
			
		||||
 | 
			
		||||
binary-extensions@^2.0.0:
 | 
			
		||||
  version "2.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
 | 
			
		||||
  integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
 | 
			
		||||
 | 
			
		||||
brace-expansion@^1.1.7:
 | 
			
		||||
  version "1.1.11"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
 | 
			
		||||
  integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    balanced-match "^1.0.0"
 | 
			
		||||
    concat-map "0.0.1"
 | 
			
		||||
 | 
			
		||||
braces@^3.0.1, braces@~3.0.2:
 | 
			
		||||
  version "3.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
 | 
			
		||||
  integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    fill-range "^7.0.1"
 | 
			
		||||
 | 
			
		||||
buffer-crc32@^0.2.5:
 | 
			
		||||
  version "0.2.13"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
 | 
			
		||||
  integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
 | 
			
		||||
 | 
			
		||||
callsites@^3.0.0:
 | 
			
		||||
  version "3.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
 | 
			
		||||
  integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
 | 
			
		||||
 | 
			
		||||
chalk@^4.0.0:
 | 
			
		||||
  version "4.1.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
 | 
			
		||||
  integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    ansi-styles "^4.1.0"
 | 
			
		||||
    supports-color "^7.1.0"
 | 
			
		||||
 | 
			
		||||
chokidar@^3.4.1:
 | 
			
		||||
  version "3.5.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
 | 
			
		||||
  integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    anymatch "~3.1.2"
 | 
			
		||||
    braces "~3.0.2"
 | 
			
		||||
    glob-parent "~5.1.2"
 | 
			
		||||
    is-binary-path "~2.1.0"
 | 
			
		||||
    is-glob "~4.0.1"
 | 
			
		||||
    normalize-path "~3.0.0"
 | 
			
		||||
    readdirp "~3.6.0"
 | 
			
		||||
  optionalDependencies:
 | 
			
		||||
    fsevents "~2.3.2"
 | 
			
		||||
 | 
			
		||||
color-convert@^2.0.1:
 | 
			
		||||
  version "2.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
 | 
			
		||||
  integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    color-name "~1.1.4"
 | 
			
		||||
 | 
			
		||||
color-name@~1.1.4:
 | 
			
		||||
  version "1.1.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
 | 
			
		||||
  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
 | 
			
		||||
 | 
			
		||||
concat-map@0.0.1:
 | 
			
		||||
  version "0.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
 | 
			
		||||
  integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
 | 
			
		||||
 | 
			
		||||
csstype@^3.0.2:
 | 
			
		||||
  version "3.0.10"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5"
 | 
			
		||||
  integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==
 | 
			
		||||
 | 
			
		||||
debug@^4.3.3:
 | 
			
		||||
  version "4.3.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
 | 
			
		||||
  integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    ms "2.1.2"
 | 
			
		||||
 | 
			
		||||
dedent-js@^1.0.1:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/dedent-js/-/dedent-js-1.0.1.tgz#bee5fb7c9e727d85dffa24590d10ec1ab1255305"
 | 
			
		||||
  integrity sha1-vuX7fJ5yfYXf+iRZDRDsGrElUwU=
 | 
			
		||||
 | 
			
		||||
detect-indent@^6.0.0:
 | 
			
		||||
  version "6.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6"
 | 
			
		||||
  integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==
 | 
			
		||||
 | 
			
		||||
discord-markdown@^2.5.1:
 | 
			
		||||
  version "2.5.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/discord-markdown/-/discord-markdown-2.5.1.tgz#d18773c6e3cff8df90f305654ecbbc5e38c507eb"
 | 
			
		||||
  integrity sha512-SGNlL1Y8NYjY2MA5Vj1SI5+Ue5GUW2HkkDAq5jPQ6fI5j/rwOB814lFNhfs2AJMT72Jij8usTEqWZfdU8C3uag==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    highlight.js "^11.2.0"
 | 
			
		||||
    simple-markdown "^0.7.3"
 | 
			
		||||
 | 
			
		||||
es6-promise@^3.1.2:
 | 
			
		||||
  version "3.3.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613"
 | 
			
		||||
  integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=
 | 
			
		||||
 | 
			
		||||
esbuild-android-arm64@0.13.15:
 | 
			
		||||
  version "0.13.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.13.15.tgz#3fc3ff0bab76fe35dd237476b5d2b32bb20a3d44"
 | 
			
		||||
  integrity sha512-m602nft/XXeO8YQPUDVoHfjyRVPdPgjyyXOxZ44MK/agewFFkPa8tUo6lAzSWh5Ui5PB4KR9UIFTSBKh/RrCmg==
 | 
			
		||||
 | 
			
		||||
esbuild-darwin-64@0.13.15:
 | 
			
		||||
  version "0.13.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.13.15.tgz#8e9169c16baf444eacec60d09b24d11b255a8e72"
 | 
			
		||||
  integrity sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ==
 | 
			
		||||
 | 
			
		||||
esbuild-darwin-arm64@0.13.15:
 | 
			
		||||
  version "0.13.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.15.tgz#1b07f893b632114f805e188ddfca41b2b778229a"
 | 
			
		||||
  integrity sha512-i1FZssTVxUqNlJ6cBTj5YQj4imWy3m49RZRnHhLpefFIh0To05ow9DTrXROTE1urGTQCloFUXTX8QfGJy1P8dQ==
 | 
			
		||||
 | 
			
		||||
esbuild-freebsd-64@0.13.15:
 | 
			
		||||
  version "0.13.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.15.tgz#0b8b7eca1690c8ec94c75680c38c07269c1f4a85"
 | 
			
		||||
  integrity sha512-G3dLBXUI6lC6Z09/x+WtXBXbOYQZ0E8TDBqvn7aMaOCzryJs8LyVXKY4CPnHFXZAbSwkCbqiPuSQ1+HhrNk7EA==
 | 
			
		||||
 | 
			
		||||
esbuild-freebsd-arm64@0.13.15:
 | 
			
		||||
  version "0.13.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.15.tgz#2e1a6c696bfdcd20a99578b76350b41db1934e52"
 | 
			
		||||
  integrity sha512-KJx0fzEDf1uhNOZQStV4ujg30WlnwqUASaGSFPhznLM/bbheu9HhqZ6mJJZM32lkyfGJikw0jg7v3S0oAvtvQQ==
 | 
			
		||||
 | 
			
		||||
esbuild-linux-32@0.13.15:
 | 
			
		||||
  version "0.13.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.13.15.tgz#6fd39f36fc66dd45b6b5f515728c7bbebc342a69"
 | 
			
		||||
  integrity sha512-ZvTBPk0YWCLMCXiFmD5EUtB30zIPvC5Itxz0mdTu/xZBbbHJftQgLWY49wEPSn2T/TxahYCRDWun5smRa0Tu+g==
 | 
			
		||||
 | 
			
		||||
esbuild-linux-64@0.13.15:
 | 
			
		||||
  version "0.13.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.13.15.tgz#9cb8e4bcd7574e67946e4ee5f1f1e12386bb6dd3"
 | 
			
		||||
  integrity sha512-eCKzkNSLywNeQTRBxJRQ0jxRCl2YWdMB3+PkWFo2BBQYC5mISLIVIjThNtn6HUNqua1pnvgP5xX0nHbZbPj5oA==
 | 
			
		||||
 | 
			
		||||
esbuild-linux-arm64@0.13.15:
 | 
			
		||||
  version "0.13.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.15.tgz#3891aa3704ec579a1b92d2a586122e5b6a2bfba1"
 | 
			
		||||
  integrity sha512-bYpuUlN6qYU9slzr/ltyLTR9YTBS7qUDymO8SV7kjeNext61OdmqFAzuVZom+OLW1HPHseBfJ/JfdSlx8oTUoA==
 | 
			
		||||
 | 
			
		||||
esbuild-linux-arm@0.13.15:
 | 
			
		||||
  version "0.13.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.13.15.tgz#8a00e99e6a0c6c9a6b7f334841364d8a2b4aecfe"
 | 
			
		||||
  integrity sha512-wUHttDi/ol0tD8ZgUMDH8Ef7IbDX+/UsWJOXaAyTdkT7Yy9ZBqPg8bgB/Dn3CZ9SBpNieozrPRHm0BGww7W/jA==
 | 
			
		||||
 | 
			
		||||
esbuild-linux-mips64le@0.13.15:
 | 
			
		||||
  version "0.13.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.15.tgz#36b07cc47c3d21e48db3bb1f4d9ef8f46aead4f7"
 | 
			
		||||
  integrity sha512-KlVjIG828uFPyJkO/8gKwy9RbXhCEUeFsCGOJBepUlpa7G8/SeZgncUEz/tOOUJTcWMTmFMtdd3GElGyAtbSWg==
 | 
			
		||||
 | 
			
		||||
esbuild-linux-ppc64le@0.13.15:
 | 
			
		||||
  version "0.13.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.15.tgz#f7e6bba40b9a11eb9dcae5b01550ea04670edad2"
 | 
			
		||||
  integrity sha512-h6gYF+OsaqEuBjeesTBtUPw0bmiDu7eAeuc2OEH9S6mV9/jPhPdhOWzdeshb0BskRZxPhxPOjqZ+/OqLcxQwEQ==
 | 
			
		||||
 | 
			
		||||
esbuild-netbsd-64@0.13.15:
 | 
			
		||||
  version "0.13.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.15.tgz#a2fedc549c2b629d580a732d840712b08d440038"
 | 
			
		||||
  integrity sha512-3+yE9emwoevLMyvu+iR3rsa+Xwhie7ZEHMGDQ6dkqP/ndFzRHkobHUKTe+NCApSqG5ce2z4rFu+NX/UHnxlh3w==
 | 
			
		||||
 | 
			
		||||
esbuild-openbsd-64@0.13.15:
 | 
			
		||||
  version "0.13.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.15.tgz#b22c0e5806d3a1fbf0325872037f885306b05cd7"
 | 
			
		||||
  integrity sha512-wTfvtwYJYAFL1fSs8yHIdf5GEE4NkbtbXtjLWjM3Cw8mmQKqsg8kTiqJ9NJQe5NX/5Qlo7Xd9r1yKMMkHllp5g==
 | 
			
		||||
 | 
			
		||||
esbuild-sunos-64@0.13.15:
 | 
			
		||||
  version "0.13.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.13.15.tgz#d0b6454a88375ee8d3964daeff55c85c91c7cef4"
 | 
			
		||||
  integrity sha512-lbivT9Bx3t1iWWrSnGyBP9ODriEvWDRiweAs69vI+miJoeKwHWOComSRukttbuzjZ8r1q0mQJ8Z7yUsDJ3hKdw==
 | 
			
		||||
 | 
			
		||||
esbuild-windows-32@0.13.15:
 | 
			
		||||
  version "0.13.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.13.15.tgz#c96d0b9bbb52f3303322582ef8e4847c5ad375a7"
 | 
			
		||||
  integrity sha512-fDMEf2g3SsJ599MBr50cY5ve5lP1wyVwTe6aLJsM01KtxyKkB4UT+fc5MXQFn3RLrAIAZOG+tHC+yXObpSn7Nw==
 | 
			
		||||
 | 
			
		||||
esbuild-windows-64@0.13.15:
 | 
			
		||||
  version "0.13.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.13.15.tgz#1f79cb9b1e1bb02fb25cd414cb90d4ea2892c294"
 | 
			
		||||
  integrity sha512-9aMsPRGDWCd3bGjUIKG/ZOJPKsiztlxl/Q3C1XDswO6eNX/Jtwu4M+jb6YDH9hRSUflQWX0XKAfWzgy5Wk54JQ==
 | 
			
		||||
 | 
			
		||||
esbuild-windows-arm64@0.13.15:
 | 
			
		||||
  version "0.13.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.15.tgz#482173070810df22a752c686509c370c3be3b3c3"
 | 
			
		||||
  integrity sha512-zzvyCVVpbwQQATaf3IG8mu1IwGEiDxKkYUdA4FpoCHi1KtPa13jeScYDjlW0Qh+ebWzpKfR2ZwvqAQkSWNcKjA==
 | 
			
		||||
 | 
			
		||||
esbuild@^0.13.12:
 | 
			
		||||
  version "0.13.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.13.15.tgz#db56a88166ee373f87dbb2d8798ff449e0450cdf"
 | 
			
		||||
  integrity sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw==
 | 
			
		||||
  optionalDependencies:
 | 
			
		||||
    esbuild-android-arm64 "0.13.15"
 | 
			
		||||
    esbuild-darwin-64 "0.13.15"
 | 
			
		||||
    esbuild-darwin-arm64 "0.13.15"
 | 
			
		||||
    esbuild-freebsd-64 "0.13.15"
 | 
			
		||||
    esbuild-freebsd-arm64 "0.13.15"
 | 
			
		||||
    esbuild-linux-32 "0.13.15"
 | 
			
		||||
    esbuild-linux-64 "0.13.15"
 | 
			
		||||
    esbuild-linux-arm "0.13.15"
 | 
			
		||||
    esbuild-linux-arm64 "0.13.15"
 | 
			
		||||
    esbuild-linux-mips64le "0.13.15"
 | 
			
		||||
    esbuild-linux-ppc64le "0.13.15"
 | 
			
		||||
    esbuild-netbsd-64 "0.13.15"
 | 
			
		||||
    esbuild-openbsd-64 "0.13.15"
 | 
			
		||||
    esbuild-sunos-64 "0.13.15"
 | 
			
		||||
    esbuild-windows-32 "0.13.15"
 | 
			
		||||
    esbuild-windows-64 "0.13.15"
 | 
			
		||||
    esbuild-windows-arm64 "0.13.15"
 | 
			
		||||
 | 
			
		||||
estree-walker@^2.0.1:
 | 
			
		||||
  version "2.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
 | 
			
		||||
  integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
 | 
			
		||||
 | 
			
		||||
fast-glob@^3.2.7:
 | 
			
		||||
  version "3.2.7"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1"
 | 
			
		||||
  integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@nodelib/fs.stat" "^2.0.2"
 | 
			
		||||
    "@nodelib/fs.walk" "^1.2.3"
 | 
			
		||||
    glob-parent "^5.1.2"
 | 
			
		||||
    merge2 "^1.3.0"
 | 
			
		||||
    micromatch "^4.0.4"
 | 
			
		||||
 | 
			
		||||
fastq@^1.6.0:
 | 
			
		||||
  version "1.13.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c"
 | 
			
		||||
  integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    reusify "^1.0.4"
 | 
			
		||||
 | 
			
		||||
fill-range@^7.0.1:
 | 
			
		||||
  version "7.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
 | 
			
		||||
  integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    to-regex-range "^5.0.1"
 | 
			
		||||
 | 
			
		||||
follow-redirects@^1.14.4:
 | 
			
		||||
  version "1.14.6"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.6.tgz#8cfb281bbc035b3c067d6cd975b0f6ade6e855cd"
 | 
			
		||||
  integrity sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==
 | 
			
		||||
 | 
			
		||||
fs.realpath@^1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
 | 
			
		||||
  integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
 | 
			
		||||
 | 
			
		||||
fsevents@~2.3.2:
 | 
			
		||||
  version "2.3.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
 | 
			
		||||
  integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
 | 
			
		||||
 | 
			
		||||
function-bind@^1.1.1:
 | 
			
		||||
  version "1.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
 | 
			
		||||
  integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
 | 
			
		||||
 | 
			
		||||
glob-parent@^5.1.2, glob-parent@~5.1.2:
 | 
			
		||||
  version "5.1.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
 | 
			
		||||
  integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    is-glob "^4.0.1"
 | 
			
		||||
 | 
			
		||||
glob@^7.1.3:
 | 
			
		||||
  version "7.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
 | 
			
		||||
  integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    fs.realpath "^1.0.0"
 | 
			
		||||
    inflight "^1.0.4"
 | 
			
		||||
    inherits "2"
 | 
			
		||||
    minimatch "^3.0.4"
 | 
			
		||||
    once "^1.3.0"
 | 
			
		||||
    path-is-absolute "^1.0.0"
 | 
			
		||||
 | 
			
		||||
graceful-fs@^4.1.3:
 | 
			
		||||
  version "4.2.8"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
 | 
			
		||||
  integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
 | 
			
		||||
 | 
			
		||||
has-flag@^4.0.0:
 | 
			
		||||
  version "4.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
 | 
			
		||||
  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
 | 
			
		||||
 | 
			
		||||
has@^1.0.3:
 | 
			
		||||
  version "1.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
 | 
			
		||||
  integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    function-bind "^1.1.1"
 | 
			
		||||
 | 
			
		||||
highlight.js@^11.2.0:
 | 
			
		||||
  version "11.3.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.3.1.tgz#813078ef3aa519c61700f84fe9047231c5dc3291"
 | 
			
		||||
  integrity sha512-PUhCRnPjLtiLHZAQ5A/Dt5F8cWZeMyj9KRsACsWT+OD6OP0x6dp5OmT5jdx0JgEyPxPZZIPQpRN2TciUT7occw==
 | 
			
		||||
 | 
			
		||||
import-fresh@^3.2.1:
 | 
			
		||||
  version "3.3.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
 | 
			
		||||
  integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    parent-module "^1.0.0"
 | 
			
		||||
    resolve-from "^4.0.0"
 | 
			
		||||
 | 
			
		||||
inflight@^1.0.4:
 | 
			
		||||
  version "1.0.6"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
 | 
			
		||||
  integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    once "^1.3.0"
 | 
			
		||||
    wrappy "1"
 | 
			
		||||
 | 
			
		||||
inherits@2:
 | 
			
		||||
  version "2.0.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
 | 
			
		||||
  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
 | 
			
		||||
 | 
			
		||||
is-binary-path@~2.1.0:
 | 
			
		||||
  version "2.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
 | 
			
		||||
  integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    binary-extensions "^2.0.0"
 | 
			
		||||
 | 
			
		||||
is-core-module@^2.2.0:
 | 
			
		||||
  version "2.8.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548"
 | 
			
		||||
  integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    has "^1.0.3"
 | 
			
		||||
 | 
			
		||||
is-extglob@^2.1.1:
 | 
			
		||||
  version "2.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
 | 
			
		||||
  integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
 | 
			
		||||
 | 
			
		||||
is-glob@^4.0.1, is-glob@~4.0.1:
 | 
			
		||||
  version "4.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
 | 
			
		||||
  integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    is-extglob "^2.1.1"
 | 
			
		||||
 | 
			
		||||
is-number@^7.0.0:
 | 
			
		||||
  version "7.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
 | 
			
		||||
  integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
 | 
			
		||||
 | 
			
		||||
kleur@^4.1.4:
 | 
			
		||||
  version "4.1.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d"
 | 
			
		||||
  integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==
 | 
			
		||||
 | 
			
		||||
lower-case@^2.0.2:
 | 
			
		||||
  version "2.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28"
 | 
			
		||||
  integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    tslib "^2.0.3"
 | 
			
		||||
 | 
			
		||||
magic-string@^0.25.7:
 | 
			
		||||
  version "0.25.7"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051"
 | 
			
		||||
  integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    sourcemap-codec "^1.4.4"
 | 
			
		||||
 | 
			
		||||
merge2@^1.3.0:
 | 
			
		||||
  version "1.4.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
 | 
			
		||||
  integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
 | 
			
		||||
 | 
			
		||||
micromatch@^4.0.4:
 | 
			
		||||
  version "4.0.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
 | 
			
		||||
  integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    braces "^3.0.1"
 | 
			
		||||
    picomatch "^2.2.3"
 | 
			
		||||
 | 
			
		||||
min-indent@^1.0.0:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
 | 
			
		||||
  integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
 | 
			
		||||
 | 
			
		||||
minimatch@^3.0.4:
 | 
			
		||||
  version "3.0.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
 | 
			
		||||
  integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    brace-expansion "^1.1.7"
 | 
			
		||||
 | 
			
		||||
minimist@^1.2.0, minimist@^1.2.5:
 | 
			
		||||
  version "1.2.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
 | 
			
		||||
  integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
 | 
			
		||||
 | 
			
		||||
mkdirp@^0.5.1:
 | 
			
		||||
  version "0.5.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
 | 
			
		||||
  integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    minimist "^1.2.5"
 | 
			
		||||
 | 
			
		||||
moment-timezone@^0.5.34:
 | 
			
		||||
  version "0.5.34"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.34.tgz#a75938f7476b88f155d3504a9343f7519d9a405c"
 | 
			
		||||
  integrity sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    moment ">= 2.9.0"
 | 
			
		||||
 | 
			
		||||
"moment@>= 2.9.0", moment@^2.29.1:
 | 
			
		||||
  version "2.29.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
 | 
			
		||||
  integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
 | 
			
		||||
 | 
			
		||||
mri@^1.1.0:
 | 
			
		||||
  version "1.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b"
 | 
			
		||||
  integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==
 | 
			
		||||
 | 
			
		||||
ms@2.1.2:
 | 
			
		||||
  version "2.1.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
 | 
			
		||||
  integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
 | 
			
		||||
 | 
			
		||||
nanoid@^3.1.30:
 | 
			
		||||
  version "3.1.30"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362"
 | 
			
		||||
  integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==
 | 
			
		||||
 | 
			
		||||
no-case@^3.0.4:
 | 
			
		||||
  version "3.0.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d"
 | 
			
		||||
  integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    lower-case "^2.0.2"
 | 
			
		||||
    tslib "^2.0.3"
 | 
			
		||||
 | 
			
		||||
normalize-path@^3.0.0, normalize-path@~3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
 | 
			
		||||
  integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
 | 
			
		||||
 | 
			
		||||
once@^1.3.0:
 | 
			
		||||
  version "1.4.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
 | 
			
		||||
  integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    wrappy "1"
 | 
			
		||||
 | 
			
		||||
parent-module@^1.0.0:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
 | 
			
		||||
  integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    callsites "^3.0.0"
 | 
			
		||||
 | 
			
		||||
pascal-case@^3.1.1:
 | 
			
		||||
  version "3.1.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb"
 | 
			
		||||
  integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    no-case "^3.0.4"
 | 
			
		||||
    tslib "^2.0.3"
 | 
			
		||||
 | 
			
		||||
path-is-absolute@^1.0.0:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
 | 
			
		||||
  integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
 | 
			
		||||
 | 
			
		||||
path-parse@^1.0.6:
 | 
			
		||||
  version "1.0.7"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
 | 
			
		||||
  integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
 | 
			
		||||
 | 
			
		||||
picocolors@^1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
 | 
			
		||||
  integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
 | 
			
		||||
 | 
			
		||||
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3:
 | 
			
		||||
  version "2.3.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
 | 
			
		||||
  integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
 | 
			
		||||
 | 
			
		||||
postcss@^8.3.11:
 | 
			
		||||
  version "8.4.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.4.tgz#d53d4ec6a75fd62557a66bb41978bf47ff0c2869"
 | 
			
		||||
  integrity sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    nanoid "^3.1.30"
 | 
			
		||||
    picocolors "^1.0.0"
 | 
			
		||||
    source-map-js "^1.0.1"
 | 
			
		||||
 | 
			
		||||
queue-microtask@^1.2.2:
 | 
			
		||||
  version "1.2.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
 | 
			
		||||
  integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
 | 
			
		||||
 | 
			
		||||
readdirp@~3.6.0:
 | 
			
		||||
  version "3.6.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
 | 
			
		||||
  integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    picomatch "^2.2.1"
 | 
			
		||||
 | 
			
		||||
require-relative@^0.8.7:
 | 
			
		||||
  version "0.8.7"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de"
 | 
			
		||||
  integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=
 | 
			
		||||
 | 
			
		||||
resolve-from@^4.0.0:
 | 
			
		||||
  version "4.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
 | 
			
		||||
  integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
 | 
			
		||||
 | 
			
		||||
resolve@^1.20.0:
 | 
			
		||||
  version "1.20.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
 | 
			
		||||
  integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    is-core-module "^2.2.0"
 | 
			
		||||
    path-parse "^1.0.6"
 | 
			
		||||
 | 
			
		||||
reusify@^1.0.4:
 | 
			
		||||
  version "1.0.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
 | 
			
		||||
  integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
 | 
			
		||||
 | 
			
		||||
rimraf@^2.5.2:
 | 
			
		||||
  version "2.7.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
 | 
			
		||||
  integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    glob "^7.1.3"
 | 
			
		||||
 | 
			
		||||
rollup@^2.59.0:
 | 
			
		||||
  version "2.61.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.61.0.tgz#ccd927bcd6cc0c78a4689c918627a717977208f4"
 | 
			
		||||
  integrity sha512-teQ+T1mUYbyvGyUavCodiyA9hD4DxwYZJwr/qehZGhs1Z49vsmzelMVYMxGU4ZhGRKxYPupHuz5yzm/wj7VpWA==
 | 
			
		||||
  optionalDependencies:
 | 
			
		||||
    fsevents "~2.3.2"
 | 
			
		||||
 | 
			
		||||
run-parallel@^1.1.9:
 | 
			
		||||
  version "1.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
 | 
			
		||||
  integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    queue-microtask "^1.2.2"
 | 
			
		||||
 | 
			
		||||
sade@^1.7.4:
 | 
			
		||||
  version "1.7.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/sade/-/sade-1.7.4.tgz#ea681e0c65d248d2095c90578c03ca0bb1b54691"
 | 
			
		||||
  integrity sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    mri "^1.1.0"
 | 
			
		||||
 | 
			
		||||
sander@^0.5.0:
 | 
			
		||||
  version "0.5.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/sander/-/sander-0.5.1.tgz#741e245e231f07cafb6fdf0f133adfa216a502ad"
 | 
			
		||||
  integrity sha1-dB4kXiMfB8r7b98PEzrfohalAq0=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    es6-promise "^3.1.2"
 | 
			
		||||
    graceful-fs "^4.1.3"
 | 
			
		||||
    mkdirp "^0.5.1"
 | 
			
		||||
    rimraf "^2.5.2"
 | 
			
		||||
 | 
			
		||||
simple-markdown@^0.7.3:
 | 
			
		||||
  version "0.7.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/simple-markdown/-/simple-markdown-0.7.3.tgz#e32150b2ec6f8287197d09869fd928747a9c5640"
 | 
			
		||||
  integrity sha512-uGXIc13NGpqfPeFJIt/7SHHxd6HekEJYtsdoCM06mEBPL9fQH/pSD7LRM6PZ7CKchpSvxKL4tvwMamqAaNDAyg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/react" ">=16.0.0"
 | 
			
		||||
 | 
			
		||||
sorcery@^0.10.0:
 | 
			
		||||
  version "0.10.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/sorcery/-/sorcery-0.10.0.tgz#8ae90ad7d7cb05fc59f1ab0c637845d5c15a52b7"
 | 
			
		||||
  integrity sha1-iukK19fLBfxZ8asMY3hF1cFaUrc=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    buffer-crc32 "^0.2.5"
 | 
			
		||||
    minimist "^1.2.0"
 | 
			
		||||
    sander "^0.5.0"
 | 
			
		||||
    sourcemap-codec "^1.3.0"
 | 
			
		||||
 | 
			
		||||
source-map-js@^1.0.1:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf"
 | 
			
		||||
  integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==
 | 
			
		||||
 | 
			
		||||
source-map@^0.7.3:
 | 
			
		||||
  version "0.7.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
 | 
			
		||||
  integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
 | 
			
		||||
 | 
			
		||||
sourcemap-codec@^1.3.0, sourcemap-codec@^1.4.4:
 | 
			
		||||
  version "1.4.8"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
 | 
			
		||||
  integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
 | 
			
		||||
 | 
			
		||||
strip-indent@^3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
 | 
			
		||||
  integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    min-indent "^1.0.0"
 | 
			
		||||
 | 
			
		||||
supports-color@^7.1.0:
 | 
			
		||||
  version "7.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
 | 
			
		||||
  integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    has-flag "^4.0.0"
 | 
			
		||||
 | 
			
		||||
svelte-autosize@^1.0.1:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/svelte-autosize/-/svelte-autosize-1.0.1.tgz#2121b2373ab89191a58aaa9a3aec957ca475e812"
 | 
			
		||||
  integrity sha512-HBk7Xrt5bS0rpp5zSUZvuXNKc0UhAxvJGLNy1eTHMDK/KkHb0UsgWpbyn60jW3tE2ZfuXfLttnHvvb1H4zZZ0Q==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    autosize "*"
 | 
			
		||||
 | 
			
		||||
svelte-check@^2.2.7:
 | 
			
		||||
  version "2.2.10"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/svelte-check/-/svelte-check-2.2.10.tgz#ca2e4fde2d077e703792d8301a643c36375f646c"
 | 
			
		||||
  integrity sha512-UVLd/N7hUIG2v6dytofsw8MxYn2iS2hpNSglsGz9Z9b8ZfbJ5jayl4Mm1SXhNwiFs5aklG90zSBJtd7NTK8dTg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    chalk "^4.0.0"
 | 
			
		||||
    chokidar "^3.4.1"
 | 
			
		||||
    fast-glob "^3.2.7"
 | 
			
		||||
    import-fresh "^3.2.1"
 | 
			
		||||
    minimist "^1.2.5"
 | 
			
		||||
    sade "^1.7.4"
 | 
			
		||||
    source-map "^0.7.3"
 | 
			
		||||
    svelte-preprocess "^4.0.0"
 | 
			
		||||
    typescript "*"
 | 
			
		||||
 | 
			
		||||
svelte-hmr@^0.14.7:
 | 
			
		||||
  version "0.14.7"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/svelte-hmr/-/svelte-hmr-0.14.7.tgz#7fa8261c7b225d9409f0a86f3b9ea5c3ca6f6607"
 | 
			
		||||
  integrity sha512-pDrzgcWSoMaK6AJkBWkmgIsecW0GChxYZSZieIYfCP0v2oPyx2CYU/zm7TBIcjLVUPP714WxmViE9Thht4etog==
 | 
			
		||||
 | 
			
		||||
svelte-icons@^2.1.0:
 | 
			
		||||
  version "2.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/svelte-icons/-/svelte-icons-2.1.0.tgz#6f2ec72f1d5c8b2de1a4b8a822c95bcb2f701aca"
 | 
			
		||||
  integrity sha512-rHPQjweEc9fGSnvM0/4gA3pDHwyZyYsC5KhttCZRhSMJfLttJST5Uq0B16Czhw+HQ+HbSOk8kLigMlPs7gZtfg==
 | 
			
		||||
 | 
			
		||||
svelte-navigator@^3.1.5:
 | 
			
		||||
  version "3.1.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/svelte-navigator/-/svelte-navigator-3.1.5.tgz#f79d78b2c2c5ad907d8b1d3748d3fbe12c32195c"
 | 
			
		||||
  integrity sha512-CGTaexasSLpUaTSN2AlYqii0JeisIgg7uZbm8XCLKlpM9Qv3IltlJ7Nvh90Xw9ND97KqtGOjNJ3LNwMN1ABV0w==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    svelte2tsx "^0.1.151"
 | 
			
		||||
 | 
			
		||||
svelte-preprocess@^4.0.0, svelte-preprocess@^4.9.8:
 | 
			
		||||
  version "4.9.8"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-4.9.8.tgz#fd40afebfb352f469beab289667485ebf0d811da"
 | 
			
		||||
  integrity sha512-EQS/oRZzMtYdAprppZxY3HcysKh11w54MgA63ybtL+TAZ4hVqYOnhw41JVJjWN9dhPnNjjLzvbZ2tMhTsla1Og==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/pug" "^2.0.4"
 | 
			
		||||
    "@types/sass" "^1.16.0"
 | 
			
		||||
    detect-indent "^6.0.0"
 | 
			
		||||
    magic-string "^0.25.7"
 | 
			
		||||
    sorcery "^0.10.0"
 | 
			
		||||
    strip-indent "^3.0.0"
 | 
			
		||||
 | 
			
		||||
svelte-toggle@^3.1.0:
 | 
			
		||||
  version "3.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/svelte-toggle/-/svelte-toggle-3.1.0.tgz#bce1efb71fb96ab3921374023c95ffd3ad5cbf3d"
 | 
			
		||||
  integrity sha512-2gzDDMDhM+ImDaLEZVlnlHVY1340Y368tT4Qk5IwLnCeRJ4zV3cVwliVGacoHy7iCDukcGXzKwDzG/hTTcaljg==
 | 
			
		||||
 | 
			
		||||
svelte2tsx@^0.1.151:
 | 
			
		||||
  version "0.1.193"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/svelte2tsx/-/svelte2tsx-0.1.193.tgz#16fe594898ef455e4f715ac317d219c9c757656b"
 | 
			
		||||
  integrity sha512-vzy4YQNYDnoqp2iZPnJy7kpPAY6y121L0HKrSBjU/IWW7DQ6T7RMJed2VVHFmVYm0zAGYMDl9urPc6R4DDUyhg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    dedent-js "^1.0.1"
 | 
			
		||||
    pascal-case "^3.1.1"
 | 
			
		||||
 | 
			
		||||
svelte@^3.44.0:
 | 
			
		||||
  version "3.44.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.44.2.tgz#3e69be2598308dfc8354ba584cec54e648a50f7f"
 | 
			
		||||
  integrity sha512-jrZhZtmH3ZMweXg1Q15onb8QlWD+a5T5Oca4C1jYvSURp2oD35h4A5TV6t6MEa93K4LlX6BkafZPdQoFjw/ylA==
 | 
			
		||||
 | 
			
		||||
sveltestrap@^5.6.3:
 | 
			
		||||
  version "5.6.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/sveltestrap/-/sveltestrap-5.6.3.tgz#afb81b00d0b378719988e5339f92254dce41194f"
 | 
			
		||||
  integrity sha512-/geTKJbPmJGzwHFKYC3NkUNDk/GKxrppgdSxcg58w/qcxs0S6RiN4PaQ1tgBKsdSrZDfbHfkFF+dybHAyUlV0A==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@popperjs/core" "^2.9.2"
 | 
			
		||||
 | 
			
		||||
to-regex-range@^5.0.1:
 | 
			
		||||
  version "5.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
 | 
			
		||||
  integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    is-number "^7.0.0"
 | 
			
		||||
 | 
			
		||||
tslib@^2.0.3, tslib@^2.3.1:
 | 
			
		||||
  version "2.3.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
 | 
			
		||||
  integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
 | 
			
		||||
 | 
			
		||||
typescript@*, typescript@^4.4.4:
 | 
			
		||||
  version "4.5.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.2.tgz#8ac1fba9f52256fdb06fb89e4122fa6a346c2998"
 | 
			
		||||
  integrity sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==
 | 
			
		||||
 | 
			
		||||
vite@^2.7.0:
 | 
			
		||||
  version "2.7.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/vite/-/vite-2.7.1.tgz#be50ad13214290ecbebbe5ad389ed423cb5f137e"
 | 
			
		||||
  integrity sha512-TDXXhcu5lyQ6uosK4ZWaOyB4VzOiizk0biitRzDzaEtgSUi8rVYPc4k1xgOjLSf0OuceDJmojFKXHOX9DB1WuQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    esbuild "^0.13.12"
 | 
			
		||||
    postcss "^8.3.11"
 | 
			
		||||
    resolve "^1.20.0"
 | 
			
		||||
    rollup "^2.59.0"
 | 
			
		||||
  optionalDependencies:
 | 
			
		||||
    fsevents "~2.3.2"
 | 
			
		||||
 | 
			
		||||
wrappy@1:
 | 
			
		||||
  version "1.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
 | 
			
		||||
  integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
 | 
			
		||||
		Reference in New Issue
	
	Block a user