From 0fd9fb097552686f2257c1aa689d797e80057bd1 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Wed, 19 Jul 2023 20:38:24 -0700 Subject: [PATCH] initial commit --- client/.eslintrc.js | 11 + client/.gitignore | 24 + client/.vscode/extensions.json | 3 + client/README.md | 47 + client/index.html | 19 + client/lib/Game.ts | 70 + client/lib/JumpStorm.ts | 54 + client/lib/components/BoundingBox.ts | 97 + client/lib/components/Collide.ts | 7 + client/lib/components/Component.ts | 7 + client/lib/components/Control.ts | 7 + client/lib/components/FacingDirection.ts | 13 + client/lib/components/Forces.ts | 17 + client/lib/components/Gravity.ts | 13 + client/lib/components/Jump.ts | 10 + client/lib/components/Mass.ts | 10 + client/lib/components/Moment.ts | 10 + client/lib/components/Sprite.ts | 92 + client/lib/components/TopCollidable.ts | 7 + client/lib/components/Velocity.ts | 15 + client/lib/components/WallBounded.ts | 7 + client/lib/components/index.ts | 15 + client/lib/components/names.ts | 15 + client/lib/config/assets.ts | 40 + client/lib/config/constants.ts | 34 + client/lib/config/index.ts | 3 + client/lib/config/sprites.ts | 49 + client/lib/entities/Entity.ts | 33 + client/lib/entities/Floor.ts | 31 + client/lib/entities/Player.ts | 68 + client/lib/entities/index.ts | 3 + client/lib/interfaces/Action.ts | 5 + client/lib/interfaces/Direction.ts | 6 + client/lib/interfaces/Draw.ts | 9 + client/lib/interfaces/LeaderBoardEntry.ts | 5 + client/lib/interfaces/Vec2.ts | 22 + client/lib/interfaces/index.ts | 5 + client/lib/structures/QuadTree.ts | 154 ++ client/lib/structures/index.ts | 1 + client/lib/systems/Collision.ts | 214 ++ client/lib/systems/FacingDirection.ts | 39 + client/lib/systems/Input.ts | 86 + client/lib/systems/Physics.ts | 94 + client/lib/systems/Render.ts | 41 + client/lib/systems/System.ts | 15 + client/lib/systems/WallBounds.ts | 35 + client/lib/systems/index.ts | 8 + client/lib/systems/names.ts | 8 + client/lib/utils/dotProduct.ts | 4 + client/lib/utils/index.ts | 3 + client/lib/utils/normalizeVector.ts | 8 + client/lib/utils/rotateVector.ts | 15 + client/package-lock.json | 2455 ++++++++++++++++++ client/package.json | 24 + client/public/assets/coffee_left.png | Bin 0 -> 1485 bytes client/public/assets/coffee_right.png | Bin 0 -> 2064 bytes client/public/assets/floor_tile_120.png | Bin 0 -> 1404 bytes client/public/assets/floor_tile_160.png | Bin 0 -> 1566 bytes client/public/assets/floor_tile_40.png | Bin 0 -> 750 bytes client/public/assets/floor_tile_80.png | Bin 0 -> 1104 bytes client/public/css/colors.css | 45 + client/public/css/style.css | 95 + client/public/css/tf.css | 33 + client/public/css/theme.css | 17 + client/public/fonts/CozetteVector.ttf | Bin 0 -> 294440 bytes client/public/fonts/scientifica.ttf | Bin 0 -> 120736 bytes client/public/img/kangaroo.svg | 18 + client/src/App.svelte | 31 + client/src/components/GameCanvas.svelte | 28 + client/src/components/LeaderBoard.svelte | 25 + client/src/components/LeaderBoardCard.svelte | 20 + client/src/main.ts | 7 + client/src/routes/Home.svelte | 12 + client/src/vite-env.d.ts | 2 + client/svelte.config.js | 7 + client/tsconfig.json | 28 + client/tsconfig.node.json | 9 + client/vite.config.ts | 7 + 78 files changed, 4471 insertions(+) create mode 100644 client/.eslintrc.js create mode 100644 client/.gitignore create mode 100644 client/.vscode/extensions.json create mode 100644 client/README.md create mode 100644 client/index.html create mode 100644 client/lib/Game.ts create mode 100644 client/lib/JumpStorm.ts create mode 100644 client/lib/components/BoundingBox.ts create mode 100644 client/lib/components/Collide.ts create mode 100644 client/lib/components/Component.ts create mode 100644 client/lib/components/Control.ts create mode 100644 client/lib/components/FacingDirection.ts create mode 100644 client/lib/components/Forces.ts create mode 100644 client/lib/components/Gravity.ts create mode 100644 client/lib/components/Jump.ts create mode 100644 client/lib/components/Mass.ts create mode 100644 client/lib/components/Moment.ts create mode 100644 client/lib/components/Sprite.ts create mode 100644 client/lib/components/TopCollidable.ts create mode 100644 client/lib/components/Velocity.ts create mode 100644 client/lib/components/WallBounded.ts create mode 100644 client/lib/components/index.ts create mode 100644 client/lib/components/names.ts create mode 100644 client/lib/config/assets.ts create mode 100644 client/lib/config/constants.ts create mode 100644 client/lib/config/index.ts create mode 100644 client/lib/config/sprites.ts create mode 100644 client/lib/entities/Entity.ts create mode 100644 client/lib/entities/Floor.ts create mode 100644 client/lib/entities/Player.ts create mode 100644 client/lib/entities/index.ts create mode 100644 client/lib/interfaces/Action.ts create mode 100644 client/lib/interfaces/Direction.ts create mode 100644 client/lib/interfaces/Draw.ts create mode 100644 client/lib/interfaces/LeaderBoardEntry.ts create mode 100644 client/lib/interfaces/Vec2.ts create mode 100644 client/lib/interfaces/index.ts create mode 100644 client/lib/structures/QuadTree.ts create mode 100644 client/lib/structures/index.ts create mode 100644 client/lib/systems/Collision.ts create mode 100644 client/lib/systems/FacingDirection.ts create mode 100644 client/lib/systems/Input.ts create mode 100644 client/lib/systems/Physics.ts create mode 100644 client/lib/systems/Render.ts create mode 100644 client/lib/systems/System.ts create mode 100644 client/lib/systems/WallBounds.ts create mode 100644 client/lib/systems/index.ts create mode 100644 client/lib/systems/names.ts create mode 100644 client/lib/utils/dotProduct.ts create mode 100644 client/lib/utils/index.ts create mode 100644 client/lib/utils/normalizeVector.ts create mode 100644 client/lib/utils/rotateVector.ts create mode 100644 client/package-lock.json create mode 100644 client/package.json create mode 100644 client/public/assets/coffee_left.png create mode 100644 client/public/assets/coffee_right.png create mode 100644 client/public/assets/floor_tile_120.png create mode 100644 client/public/assets/floor_tile_160.png create mode 100644 client/public/assets/floor_tile_40.png create mode 100644 client/public/assets/floor_tile_80.png create mode 100644 client/public/css/colors.css create mode 100644 client/public/css/style.css create mode 100644 client/public/css/tf.css create mode 100644 client/public/css/theme.css create mode 100644 client/public/fonts/CozetteVector.ttf create mode 100644 client/public/fonts/scientifica.ttf create mode 100644 client/public/img/kangaroo.svg create mode 100644 client/src/App.svelte create mode 100644 client/src/components/GameCanvas.svelte create mode 100644 client/src/components/LeaderBoard.svelte create mode 100644 client/src/components/LeaderBoardCard.svelte create mode 100644 client/src/main.ts create mode 100644 client/src/routes/Home.svelte create mode 100644 client/src/vite-env.d.ts create mode 100644 client/svelte.config.js create mode 100644 client/tsconfig.json create mode 100644 client/tsconfig.node.json create mode 100644 client/vite.config.ts diff --git a/client/.eslintrc.js b/client/.eslintrc.js new file mode 100644 index 0000000..f200fbf --- /dev/null +++ b/client/.eslintrc.js @@ -0,0 +1,11 @@ +module.exports = { + extends: [ + // add more generic rule sets here, such as: + "eslint:recommended", + "plugin:svelte/recommended", + ], + rules: { + // override/add rules settings here, such as: + // 'svelte/rule-name': 'error' + }, +}; diff --git a/client/.gitignore b/client/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/client/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/client/.vscode/extensions.json b/client/.vscode/extensions.json new file mode 100644 index 0000000..bdef820 --- /dev/null +++ b/client/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["svelte.svelte-vscode"] +} diff --git a/client/README.md b/client/README.md new file mode 100644 index 0000000..e6cd94f --- /dev/null +++ b/client/README.md @@ -0,0 +1,47 @@ +# Svelte + TS + Vite + +This template should help get you started developing with Svelte and TypeScript in Vite. + +## Recommended IDE Setup + +[VS Code](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. + +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) +``` diff --git a/client/index.html b/client/index.html new file mode 100644 index 0000000..00b94e7 --- /dev/null +++ b/client/index.html @@ -0,0 +1,19 @@ + + + + + + + + jumpstorm + + + +
+ + + diff --git a/client/lib/Game.ts b/client/lib/Game.ts new file mode 100644 index 0000000..d6ffb47 --- /dev/null +++ b/client/lib/Game.ts @@ -0,0 +1,70 @@ +import { Entity } from "./entities"; +import { System } from "./systems"; + +export class Game { + private entities: Map; + private systems: Map; + private systemOrder: string[]; + + private running: boolean; + private lastTimeStamp: number; + + constructor() { + this.running = false; + this.systemOrder = []; + this.systems = new Map(); + this.entities = new Map(); + } + + public start() { + this.lastTimeStamp = performance.now(); + this.running = true; + } + + public addEntity(entity: Entity) { + this.entities.set(entity.id, entity); + } + + public getEntity(id: number): Entity { + return this.entities.get(id); + } + + public removeEntity(id: number) { + this.entities.delete(id); + } + + public addSystem(system: System) { + if (!this.systemOrder.includes(system.name)) { + this.systemOrder.push(system.name); + } + this.systems.set(system.name, system); + } + + public getSystem(name: string): System { + return this.systems.get(name); + } + + public doGameLoop = (timeStamp: number) => { + if (!this.running) { + return; + } + + const dt = timeStamp - this.lastTimeStamp; + this.lastTimeStamp = timeStamp; + + const componentEntities = new Map>(); + this.entities.forEach((entity) => + entity.getComponents().forEach((component) => { + if (!componentEntities.has(component.name)) { + componentEntities.set(component.name, new Set([entity.id])); + return; + } + componentEntities.get(component.name).add(entity.id); + }) + ); + + this.systemOrder.forEach((systemName) => { + this.systems.get(systemName).update(dt, this.entities, componentEntities); + }); + }; +} diff --git a/client/lib/JumpStorm.ts b/client/lib/JumpStorm.ts new file mode 100644 index 0000000..c76d9bc --- /dev/null +++ b/client/lib/JumpStorm.ts @@ -0,0 +1,54 @@ +import { Floor, Player } from "./entities"; +import { Game } from "./Game"; +import { + WallBounds, + FacingDirection, + Render, + Physics, + Input, + Collision, +} from "./systems"; + +export class JumpStorm { + private game: Game; + + constructor(ctx: CanvasRenderingContext2D) { + this.game = new Game(); + + [ + this.createInputSystem(), + new FacingDirection(), + new Physics(), + new Collision(), + new WallBounds(ctx.canvas.width), + new Render(ctx), + ].forEach((system) => this.game.addSystem(system)); + + [new Floor(160), new Player()].forEach((entity) => + this.game.addEntity(entity) + ); + } + + public play() { + this.game.start(); + + const loop = (timestamp: number) => { + this.game.doGameLoop(timestamp); + requestAnimationFrame(loop); // tail call recursion! /s + }; + requestAnimationFrame(loop); + } + + private createInputSystem(): Input { + const inputSystem = new Input(); + + window.addEventListener("keydown", (e) => { + if (!e.repeat) { + inputSystem.keyPressed(e.key); + } + }); + window.addEventListener("keyup", (e) => inputSystem.keyReleased(e.key)); + + return inputSystem; + } +} diff --git a/client/lib/components/BoundingBox.ts b/client/lib/components/BoundingBox.ts new file mode 100644 index 0000000..2b1d648 --- /dev/null +++ b/client/lib/components/BoundingBox.ts @@ -0,0 +1,97 @@ +import { Component, ComponentNames } from "."; +import type { Coord2D, Dimension2D } from "../interfaces"; +import { dotProduct, rotateVector, normalizeVector } from "../utils"; + +export class BoundingBox extends Component { + public center: Coord2D; + public dimension: Dimension2D; + public rotation: number; + + constructor(center: Coord2D, dimension: Dimension2D, rotation?: number) { + super(ComponentNames.BoundingBox); + + this.center = center; + this.dimension = dimension; + this.rotation = rotation ?? 0; + } + + public isCollidingWith(box: BoundingBox): boolean { + const boxes = [this.getVertices(), box.getVertices()]; + for (const poly of boxes) { + for (let i = 0; i < poly.length; ++i) { + const [A, B] = [poly[i], poly[(i + 1) % poly.length]]; + const normal: Coord2D = { x: B.y - A.y, y: A.x - B.x }; + + const [[minThis, maxThis], [minBox, maxBox]] = boxes.map((box) => + box.reduce( + ([min, max], vertex) => { + const projection = dotProduct(normal, vertex); + return [Math.min(min, projection), Math.max(max, projection)]; + }, + [Infinity, -Infinity] + ) + ); + + if (maxThis < minBox || maxBox < minThis) return false; + } + } + + return true; + } + + public getVertices(): Coord2D[] { + return [ + { x: -this.dimension.width / 2, y: -this.dimension.height / 2 }, + { x: -this.dimension.width / 2, y: this.dimension.height / 2 }, + { x: this.dimension.width / 2, y: this.dimension.height / 2 }, + { x: this.dimension.width / 2, y: -this.dimension.height / 2 }, + ] + .map((vertex) => rotateVector(vertex, this.rotation)) + .map((vertex) => { + return { + x: vertex.x + this.center.x, + y: vertex.y + this.center.y, + }; + }); + } + + private getAxes() { + const corners: Coord2D[] = this.getVerticesRelativeToCenter(); + const axes: Coord2D[] = []; + + for (let i = 0; i < corners.length; ++i) { + const [cornerA, cornerB] = [ + corners[i], + corners[(i + 1) % corners.length], + ].map((corner) => rotateVector(corner, this.rotation)); + + axes.push( + normalizeVector({ + x: cornerB.y - cornerA.y, + y: -(cornerB.x - cornerA.x), + }) + ); + } + + return axes; + } + + private project(axis: Coord2D): [number, number] { + const corners = this.getCornersRelativeToCenter(); + let [min, max] = [Infinity, -Infinity]; + + for (const corner of corners) { + const rotated = rotateVector(corner, this.rotation); + const translated = { + x: rotated.x + this.center.x, + y: rotated.y + this.center.y, + }; + const projection = dotProduct(translated, axis); + + min = Math.min(projection, min); + max = Math.max(projection, max); + } + + return [min, max]; + } +} diff --git a/client/lib/components/Collide.ts b/client/lib/components/Collide.ts new file mode 100644 index 0000000..889ecf8 --- /dev/null +++ b/client/lib/components/Collide.ts @@ -0,0 +1,7 @@ +import { Component, ComponentNames } from "."; + +export class Collide extends Component { + constructor() { + super(ComponentNames.Collide); + } +} diff --git a/client/lib/components/Component.ts b/client/lib/components/Component.ts new file mode 100644 index 0000000..7331982 --- /dev/null +++ b/client/lib/components/Component.ts @@ -0,0 +1,7 @@ +export abstract class Component { + public readonly name: string; + + constructor(name: string) { + this.name = name; + } +} diff --git a/client/lib/components/Control.ts b/client/lib/components/Control.ts new file mode 100644 index 0000000..094ef1c --- /dev/null +++ b/client/lib/components/Control.ts @@ -0,0 +1,7 @@ +import { Component, ComponentNames } from "."; + +export class Control extends Component { + constructor() { + super(ComponentNames.Control); + } +} diff --git a/client/lib/components/FacingDirection.ts b/client/lib/components/FacingDirection.ts new file mode 100644 index 0000000..1c701a3 --- /dev/null +++ b/client/lib/components/FacingDirection.ts @@ -0,0 +1,13 @@ +import { Component, ComponentNames, Sprite } from "."; + +export class FacingDirection extends Component { + public readonly facingLeftSprite: Sprite; + public readonly facingRightSprite: Sprite; + + constructor(facingLeftSprite: Sprite, facingRightSprite: Sprite) { + super(ComponentNames.FacingDirection); + + this.facingLeftSprite = facingLeftSprite; + this.facingRightSprite = facingRightSprite; + } +} diff --git a/client/lib/components/Forces.ts b/client/lib/components/Forces.ts new file mode 100644 index 0000000..bf540a1 --- /dev/null +++ b/client/lib/components/Forces.ts @@ -0,0 +1,17 @@ +import type { Accel2D, Force2D } from "../interfaces"; +import { Component } from "./Component"; +import { ComponentNames } from "."; + +/** + * A list of forces and torque, (in newtons, and newton-meters respectively) + * to apply on one Physics system update (after which, they are cleared). + */ +export class Forces extends Component { + public forces: Force2D[]; + + constructor(forces?: Force2D[]) { + super(ComponentNames.Forces); + + this.forces = forces ?? []; + } +} diff --git a/client/lib/components/Gravity.ts b/client/lib/components/Gravity.ts new file mode 100644 index 0000000..89fcb67 --- /dev/null +++ b/client/lib/components/Gravity.ts @@ -0,0 +1,13 @@ +import { ComponentNames, Component } from "."; + +export class Gravity extends Component { + private static DEFAULT_TERMINAL_VELOCITY = 5; + + public terminalVelocity: number; + + constructor(terminalVelocity?: number) { + super(ComponentNames.Gravity); + this.terminalVelocity = + terminalVelocity ?? Gravity.DEFAULT_TERMINAL_VELOCITY; + } +} diff --git a/client/lib/components/Jump.ts b/client/lib/components/Jump.ts new file mode 100644 index 0000000..0b40767 --- /dev/null +++ b/client/lib/components/Jump.ts @@ -0,0 +1,10 @@ +import { Component, ComponentNames } from "."; + +export class Jump extends Component { + public canJump: boolean; + + constructor() { + super(ComponentNames.Jump); + this.canJump = false; + } +} diff --git a/client/lib/components/Mass.ts b/client/lib/components/Mass.ts new file mode 100644 index 0000000..daa2d71 --- /dev/null +++ b/client/lib/components/Mass.ts @@ -0,0 +1,10 @@ +import { Component, ComponentNames } from "."; + +export class Mass extends Component { + public mass: number; + + constructor(mass: number) { + super(ComponentNames.Mass); + this.mass = mass; + } +} diff --git a/client/lib/components/Moment.ts b/client/lib/components/Moment.ts new file mode 100644 index 0000000..3d0dd2f --- /dev/null +++ b/client/lib/components/Moment.ts @@ -0,0 +1,10 @@ +import { Component, ComponentNames } from "."; + +export class Moment extends Component { + public inertia: number; + + constructor(inertia: number) { + super(ComponentNames.Moment); + this.inertia = inertia; + } +} diff --git a/client/lib/components/Sprite.ts b/client/lib/components/Sprite.ts new file mode 100644 index 0000000..90e1389 --- /dev/null +++ b/client/lib/components/Sprite.ts @@ -0,0 +1,92 @@ +import { Component, ComponentNames } from "."; +import type { Dimension2D, DrawArgs, Coord2D } from "../interfaces"; + +export class Sprite extends Component { + private sheet: HTMLImageElement; + + private spriteImgPos: Coord2D; + private spriteImgDimensions: Dimension2D; + + private msPerFrame: number; + private msSinceLastFrame: number; + private currentFrame: number; + private numFrames: number; + + constructor( + sheet: HTMLImageElement, + spriteImgPos: Coord2D, + spriteImgDimensions: Dimension2D, + msPerFrame: number, + numFrames: number + ) { + super(ComponentNames.Sprite); + + this.sheet = sheet; + this.spriteImgPos = spriteImgPos; + this.spriteImgDimensions = spriteImgDimensions; + this.msPerFrame = msPerFrame; + this.numFrames = numFrames; + + this.msSinceLastFrame = 0; + this.currentFrame = 0; + } + + public update(dt: number) { + this.msSinceLastFrame += dt; + if (this.msSinceLastFrame >= this.msPerFrame) { + this.currentFrame = (this.currentFrame + 1) % this.numFrames; + this.msSinceLastFrame = 0; + } + } + + public draw(ctx: CanvasRenderingContext2D, drawArgs: DrawArgs) { + const { center, rotation, tint, opacity } = drawArgs; + + ctx.save(); + ctx.translate(center.x, center.y); + if (rotation != 0) { + ctx.rotate(rotation * (Math.PI / 180)); + } + ctx.translate(-center.x, -center.y); + + if (opacity) { + ctx.globalAlpha = opacity; + } + + ctx.drawImage( + this.sheet, + ...this.getSpriteArgs(), + ...this.getDrawArgs(drawArgs) + ); + + if (tint) { + ctx.globalAlpha = 0.5; + ctx.globalCompositeOperation = "source-atop"; + ctx.fillStyle = tint; + ctx.fillRect(...this.getDrawArgs(drawArgs)); + } + + ctx.restore(); + } + + private getSpriteArgs(): [sx: number, sy: number, sw: number, sh: number] { + return [ + this.spriteImgPos.x + this.currentFrame * this.spriteImgDimensions.width, + this.spriteImgPos.y, + this.spriteImgDimensions.width, + this.spriteImgDimensions.height, + ]; + } + + private getDrawArgs({ + center, + dimension, + }: DrawArgs): [dx: number, dy: number, dw: number, dh: number] { + return [ + center.x - dimension.width / 2, + center.y - dimension.height / 2, + dimension.width, + dimension.height, + ]; + } +} diff --git a/client/lib/components/TopCollidable.ts b/client/lib/components/TopCollidable.ts new file mode 100644 index 0000000..7fb147d --- /dev/null +++ b/client/lib/components/TopCollidable.ts @@ -0,0 +1,7 @@ +import { Component, ComponentNames } from "."; + +export class TopCollidable extends Component { + constructor() { + super(ComponentNames.TopCollidable); + } +} diff --git a/client/lib/components/Velocity.ts b/client/lib/components/Velocity.ts new file mode 100644 index 0000000..119427d --- /dev/null +++ b/client/lib/components/Velocity.ts @@ -0,0 +1,15 @@ +import type { Velocity2D } from "../interfaces"; +import { Component } from "./Component"; +import { ComponentNames } from "."; + +export class Velocity extends Component { + public dCartesian: Velocity2D; + public dTheta: number; + + constructor(dCartesian: Velocity2D, dTheta: number) { + super(ComponentNames.Velocity); + + this.dCartesian = dCartesian; + this.dTheta = dTheta; + } +} diff --git a/client/lib/components/WallBounded.ts b/client/lib/components/WallBounded.ts new file mode 100644 index 0000000..5f787e1 --- /dev/null +++ b/client/lib/components/WallBounded.ts @@ -0,0 +1,7 @@ +import { Component, ComponentNames } from "."; + +export class WallBounded extends Component { + constructor() { + super(ComponentNames.WallBounded); + } +} diff --git a/client/lib/components/index.ts b/client/lib/components/index.ts new file mode 100644 index 0000000..67f1259 --- /dev/null +++ b/client/lib/components/index.ts @@ -0,0 +1,15 @@ +export * from "./Component"; +export * from "./BoundingBox"; +export * from "./Velocity"; +export * from "./Forces"; +export * from "./Sprite"; +export * from "./FacingDirection"; +export * from "./Jump"; +export * from "./TopCollidable"; +export * from "./Collide"; +export * from "./Control"; +export * from "./WallBounded"; +export * from "./Gravity"; +export * from "./Mass"; +export * from "./Moment"; +export * from "./names"; diff --git a/client/lib/components/names.ts b/client/lib/components/names.ts new file mode 100644 index 0000000..e2ee3d3 --- /dev/null +++ b/client/lib/components/names.ts @@ -0,0 +1,15 @@ +export namespace ComponentNames { + export const Sprite = "Sprite"; + export const BoundingBox = "BoundingBox"; + export const Velocity = "Velocity"; + export const FacingDirection = "FacingDirection"; + export const Control = "Control"; + export const Jump = "Jump"; + export const TopCollidable = "TopCollidable"; + export const Collide = "Collide"; + export const WallBounded = "WallBounded"; + export const Gravity = "Gravity"; + export const Forces = "Forces"; + export const Mass = "Mass"; + export const Moment = "Moment"; +} diff --git a/client/lib/config/assets.ts b/client/lib/config/assets.ts new file mode 100644 index 0000000..51a5303 --- /dev/null +++ b/client/lib/config/assets.ts @@ -0,0 +1,40 @@ +import type { SpriteSpec } from "./sprites"; +import { SPRITE_SPECS } from "./sprites"; + +export const IMAGES = new Map(); + +export const loadSpritesIntoImageElements = ( + spriteSpecs: Partial[] +): Promise[] => { + const spritePromises: Promise[] = []; + + for (const spriteSpec of spriteSpecs) { + if (spriteSpec.sheet) { + const img = new Image(); + img.src = spriteSpec.sheet; + IMAGES.set(spriteSpec.sheet, img); + + spritePromises.push( + new Promise((resolve) => { + img.onload = () => resolve(); + }) + ); + } + + if (spriteSpec.states) { + spritePromises.push( + ...loadSpritesIntoImageElements(Object.values(spriteSpec.states)) + ); + } + } + + return spritePromises; +}; + +export const loadAssets = () => + Promise.all([ + ...loadSpritesIntoImageElements( + Array.from(SPRITE_SPECS.keys()).map((key) => SPRITE_SPECS.get(key)) + ), + // TODO: Sound + ]); diff --git a/client/lib/config/constants.ts b/client/lib/config/constants.ts new file mode 100644 index 0000000..27c8160 --- /dev/null +++ b/client/lib/config/constants.ts @@ -0,0 +1,34 @@ +import { Action } from "../interfaces"; + +export namespace KeyConstants { + export const KeyActions: Record = { + a: Action.MOVE_LEFT, + ArrowLeft: Action.MOVE_LEFT, + d: Action.MOVE_RIGHT, + ArrowRight: Action.MOVE_RIGHT, + w: Action.JUMP, + ArrowUp: Action.JUMP, + }; + + export const ActionKeys: Map = Object.keys( + KeyActions + ).reduce((acc: Map, key) => { + const action = KeyActions[key]; + + if (acc.has(action)) { + acc.get(action).push(key); + return acc; + } + + acc.set(action, [key]); + return acc; + }, new Map()); +} + +export namespace PhysicsConstants { + export const MAX_JUMP_TIME_MS = 150; + export const GRAVITY = 0.0075; + export const PLAYER_MOVE_VEL = 1; + export const PLAYER_JUMP_ACC = -0.01; + export const PLAYER_JUMP_INITIAL_VEL = -0.9; +} diff --git a/client/lib/config/index.ts b/client/lib/config/index.ts new file mode 100644 index 0000000..7a1052a --- /dev/null +++ b/client/lib/config/index.ts @@ -0,0 +1,3 @@ +export * from "./constants"; +export * from "./assets.ts"; +export * from "./sprites.ts"; diff --git a/client/lib/config/sprites.ts b/client/lib/config/sprites.ts new file mode 100644 index 0000000..18bec73 --- /dev/null +++ b/client/lib/config/sprites.ts @@ -0,0 +1,49 @@ +export enum Sprites { + FLOOR, + TRAMPOLINE, + COFFEE, +} + +export interface SpriteSpec { + sheet: string; + width: number; + height: number; + frames: number; + msPerFrame: number; + states?: Record>; +} + +export const SPRITE_SPECS: Map> = new Map< + Sprites, + SpriteSpec +>(); + +const floorSpriteSpec = { + height: 40, + frames: 3, + msPerFrame: 125, + states: {}, +}; +floorSpriteSpec.states = [40, 80, 120, 160].reduce((acc, cur) => { + acc[cur] = { + width: cur, + sheet: `/assets/floor_tile_${cur}.png`, + }; + return acc; +}, {}); +SPRITE_SPECS.set(Sprites.FLOOR, floorSpriteSpec); + +SPRITE_SPECS.set(Sprites.COFFEE, { + msPerFrame: 100, + width: 60, + height: 45, + frames: 3, + states: { + LEFT: { + sheet: "/assets/coffee_left.png", + }, + RIGHT: { + sheet: "/assets/coffee_right.png", + }, + }, +}); diff --git a/client/lib/entities/Entity.ts b/client/lib/entities/Entity.ts new file mode 100644 index 0000000..e57ccde --- /dev/null +++ b/client/lib/entities/Entity.ts @@ -0,0 +1,33 @@ +import type { Component } from "../components"; +import { ComponentNotFoundError } from "../exceptions"; + +export abstract class Entity { + private static ID = 0; + + public readonly id: number; + public readonly components: Map; + + constructor() { + this.id = Entity.ID++; + this.components = new Map(); + } + + public addComponent(component: Component) { + this.components.set(component.name, component); + } + + public getComponent(name: string): T { + if (!this.hasComponent(name)) { + throw new Error("Entity does not have component " + name); + } + return this.components.get(name) as T; + } + + public getComponents(): Component[] { + return Array.from(this.components.values()); + } + + public hasComponent(name: string): boolean { + return this.components.has(name); + } +} diff --git a/client/lib/entities/Floor.ts b/client/lib/entities/Floor.ts new file mode 100644 index 0000000..d51badc --- /dev/null +++ b/client/lib/entities/Floor.ts @@ -0,0 +1,31 @@ +import { IMAGES, SPRITE_SPECS, Sprites, type SpriteSpec } from "../config"; +import { BoundingBox, Sprite } from "../components"; +import { TopCollidable } from "../components/TopCollidable"; +import { Entity } from "../entities"; + +export class Floor extends Entity { + private static spriteSpec: SpriteSpec = SPRITE_SPECS.get(Sprites.FLOOR); + + constructor(width: number) { + super(); + + this.addComponent( + new Sprite( + IMAGES.get(Floor.spriteSpec.states[width].sheet), + { x: 0, y: 0 }, + { width, height: Floor.spriteSpec.height }, + Floor.spriteSpec.msPerFrame, + Floor.spriteSpec.frames + ) + ); + + this.addComponent( + new BoundingBox( + { x: 300, y: 300 }, + { width, height: Floor.spriteSpec.height } + ) + ); + + this.addComponent(new TopCollidable()); + } +} diff --git a/client/lib/entities/Player.ts b/client/lib/entities/Player.ts new file mode 100644 index 0000000..0ba5a41 --- /dev/null +++ b/client/lib/entities/Player.ts @@ -0,0 +1,68 @@ +import { Entity } from "."; +import { IMAGES, SPRITE_SPECS, Sprites, type SpriteSpec } from "../config"; +import { + Jump, + FacingDirection, + BoundingBox, + Sprite, + Velocity, + Gravity, + WallBounded, + Forces, + Collide, + Control, + Mass, + Moment, +} from "../components"; +import { PhysicsConstants } from "../config"; +import { Direction } from "../interfaces"; + +export class Player extends Entity { + private static MASS: number = 10; + private static MOI: number = 1000; + + private static spriteSpec: SpriteSpec = SPRITE_SPECS.get(Sprites.COFFEE); + + constructor() { + super(); + + this.addComponent( + new BoundingBox( + { x: 300, y: 100 }, + { width: Player.spriteSpec.width, height: Player.spriteSpec.height }, + 0 + ) + ); + + this.addComponent(new Velocity({ dx: 0, dy: 0 }, 0)); + + this.addComponent(new Mass(Player.MASS)); + this.addComponent(new Moment(Player.MOI)); + this.addComponent(new Forces()); + this.addComponent(new Gravity()); + + this.addComponent(new Jump()); + this.addComponent(new Control()); + + this.addComponent(new Collide()); + this.addComponent(new WallBounded()); + + this.addFacingDirectionComponents(); + } + + private addFacingDirectionComponents() { + const [leftSprite, rightSprite] = [Direction.LEFT, Direction.RIGHT].map( + (direction) => + new Sprite( + IMAGES.get(Player.spriteSpec.states[direction].sheet), + { x: 0, y: 0 }, + { width: Player.spriteSpec.width, height: Player.spriteSpec.height }, + Player.spriteSpec.msPerFrame, + Player.spriteSpec.frames + ) + ); + + this.addComponent(new FacingDirection(leftSprite, rightSprite)); + this.addComponent(leftSprite); // face Left by default + } +} diff --git a/client/lib/entities/index.ts b/client/lib/entities/index.ts new file mode 100644 index 0000000..a921512 --- /dev/null +++ b/client/lib/entities/index.ts @@ -0,0 +1,3 @@ +export * from "./Entity"; +export * from "./Floor"; +export * from "./Player"; diff --git a/client/lib/interfaces/Action.ts b/client/lib/interfaces/Action.ts new file mode 100644 index 0000000..61c89e1 --- /dev/null +++ b/client/lib/interfaces/Action.ts @@ -0,0 +1,5 @@ +export enum Action { + MOVE_LEFT, + MOVE_RIGHT, + JUMP, +} diff --git a/client/lib/interfaces/Direction.ts b/client/lib/interfaces/Direction.ts new file mode 100644 index 0000000..0bc6ef3 --- /dev/null +++ b/client/lib/interfaces/Direction.ts @@ -0,0 +1,6 @@ +export enum Direction { + UP = "UP", + DOWN = "DOWN", + LEFT = "LEFT", + RIGHT = "RIGHT", +} diff --git a/client/lib/interfaces/Draw.ts b/client/lib/interfaces/Draw.ts new file mode 100644 index 0000000..6561a01 --- /dev/null +++ b/client/lib/interfaces/Draw.ts @@ -0,0 +1,9 @@ +import type { Coord2D, Dimension2D } from "./"; + +export interface DrawArgs { + center: Coord2D; + dimension: Dimension2D; + tint?: string; + opacity?: number; + rotation?: number; +} diff --git a/client/lib/interfaces/LeaderBoardEntry.ts b/client/lib/interfaces/LeaderBoardEntry.ts new file mode 100644 index 0000000..1b1e7b3 --- /dev/null +++ b/client/lib/interfaces/LeaderBoardEntry.ts @@ -0,0 +1,5 @@ +export interface LeaderBoardEntry { + name: string; + score: number; + avatar: string; +} diff --git a/client/lib/interfaces/Vec2.ts b/client/lib/interfaces/Vec2.ts new file mode 100644 index 0000000..b2bae37 --- /dev/null +++ b/client/lib/interfaces/Vec2.ts @@ -0,0 +1,22 @@ +export interface Coord2D { + x: number; + y: number; +} + +export interface Dimension2D { + width: number; + height: number; +} + +export interface Velocity2D { + dx: number; + dy: number; +} + +export interface Force2D { + fCartesian: { + fx: number; + fy: number; + }; + torque: number; +} diff --git a/client/lib/interfaces/index.ts b/client/lib/interfaces/index.ts new file mode 100644 index 0000000..0398abd --- /dev/null +++ b/client/lib/interfaces/index.ts @@ -0,0 +1,5 @@ +export * from "./LeaderBoardEntry"; +export * from "./Vec2"; +export * from "./Draw"; +export * from "./Direction"; +export * from "./Action"; diff --git a/client/lib/structures/QuadTree.ts b/client/lib/structures/QuadTree.ts new file mode 100644 index 0000000..7913e59 --- /dev/null +++ b/client/lib/structures/QuadTree.ts @@ -0,0 +1,154 @@ +import type { Coord2D, Dimension2D } from "../interfaces"; +import { ComponentNames, BoundingBox } from "../components"; +import { Entity } from "../entities"; + +interface BoxedEntry { + id: number; + dimension: Dimension2D; + center: Coord2D; +} + +enum Quadrant { + I, + II, + III, + IV, +} + +export class QuadTree { + private maxLevels: number; + private splitThreshold: number; + private level: number; + private topLeft: Coord2D; + private dimension: Dimension2D; + + private children: Map; + private objects: BoxedEntry[]; + + constructor( + topLeft: Coord2D, + dimension: Dimension2D, + maxLevels: number, + splitThreshold: number, + level?: number + ) { + this.children = []; + this.objects = []; + + this.maxLevels = maxLevels; + this.splitThreshold = splitThreshold; + this.level = level ?? 0; + } + + public insert(id: number, dimension: Dimension2D, center: Coord2D): void { + if (this.hasChildren()) { + this.getIndices(boundingBox).forEach((i) => + this.children[i].insert(id, dimension, center) + ); + return; + } + + this.objects.push({ id, dimension, center }); + + if ( + this.objects.length > this.splitThreshold && + this.level < this.maxLevels + ) { + if (!this.hasChildren()) { + this.performSplit(); + } + this.realignObjects(); + } + } + + public clear(): void { + this.objects = []; + if (this.hasChildren()) { + this.children.forEach((child) => child.clear()); + this.children.clear(); + } + } + + public getNeighborIds(boxedEntry: BoxedEntry): number[] { + const neighbors: number[] = this.objects.map(({ id }) => id); + + if (this.hasChildren()) { + this.getQuadrants(boxedEntry).forEach((quadrant) => { + this.children + .get(quadrant) + .getNeighborIds(boxedEntry) + .forEach((id) => neighbors.push(id)); + }); + } + + return neighbors; + } + + private performSplit(): void { + const halfWidth = this.dimension.width / 2; + const halfHeight = this.dimension.height / 2; + + [ + [Quadrant.I, { x: this.topLeft.x + halfWidth, y: this.topLeft.y }], + [Quadrant.II, { ...this.topLeft }], + [Quadrant.III, { x: this.topLeft.x, y: this.topLeft.y + halfHeight }], + [ + Quadrant.IV, + { x: this.topLeft.x + halfWidth, y: this.topLeft.y + halfHeight }, + ], + ].forEach(([quadrant, pos]) => { + this.children.set( + quadrant, + new QuadTree( + pos, + { width: halfWidth, height: halfHeight }, + this.maxLevels, + this.splitThreshold, + this.level + 1 + ) + ); + }); + } + + private getQuandrants(boxedEntry: BoxedEntry): Quadrant[] { + const treeCenter: Coord2D = { + x: this.topLeft.x + this.dimension.width / 2, + y: this.topLeft.y + this.dimension.height / 2, + }; + + return [ + [Quadrant.I, (x, y) => x >= treeCenter.x && y < treeCenter.y], + [Quadrant.II, (x, y) => x < treeCenter.x && y < treeCenter.y], + [Quadrant.III, (x, y) => x < treeCenter.x && y >= treeCenter.y], + [Quadrant.IV, (x, y) => x >= treeCenter.x && y >= treeCenter.y], + ] + .filter( + ([_quadrant, condition]) => + condition( + boxedEntry.center.x + boxedEntry.dimension.width / 2, + boxedEntry.center.y + boxedEntry.dimension.height / 2 + ) || + condition( + boxedEntry.center.x - boxedEntry.dimension.width / 2, + boxedEntry.center.y - boxedEntry.dimension.height / 2 + ) + ) + .map(([quadrant]) => quadrant); + } + + private realignObjects(): void { + this.objects.forEach((boxedEntry) => { + this.getQuadrants(boxedEntry).forEach((direction) => { + this.children + .get(direction) + .insert(boxedEntry.id, boxedEntry.dimension, boxedEntry.center); + }); + }); + + this.objects = []; + } + + private hasChildren() { + return this.children && this.children.length > 0; + } +} diff --git a/client/lib/structures/index.ts b/client/lib/structures/index.ts new file mode 100644 index 0000000..605a82a --- /dev/null +++ b/client/lib/structures/index.ts @@ -0,0 +1 @@ +export * from "./QuadTree"; diff --git a/client/lib/systems/Collision.ts b/client/lib/systems/Collision.ts new file mode 100644 index 0000000..16ad8c6 --- /dev/null +++ b/client/lib/systems/Collision.ts @@ -0,0 +1,214 @@ +import { SystemNames, System } from "."; +import { + Mass, + BoundingBox, + ComponentNames, + Jump, + Velocity, + Moment, +} from "../components"; +import { PhysicsConstants } from "../config"; +import { Entity } from "../entities"; +import type { Dimension2D } from "../interfaces"; +import { QuadTree } from "../structures"; + +export class Collision extends System { + private static readonly COLLIDABLE_COMPONENTS = [ + ComponentNames.Collide, + ComponentNames.TopCollidable, + ]; + private static readonly QUADTREE_MAX_LEVELS = 10; + private static readonly QUADTREE_SPLIT_THRESHOLD = 10; + + private quadTree: QuadTree; + + constructor(screenDimensions: Dimension2D) { + super(SystemNames.Collision); + + this.quadTree = new QuadTree( + { x: 0, y: 0 }, + screenDimensions, + Collision.QUADTREE_MAX_LEVELS, + Collision.QUADTREE_SPLIT_THRESHOLD + ); + } + + public update( + dt: number, + entityMap: Map, + entityComponents: Map> + ) { + this.quadTree.clear(); + + const entitiesToAddToQuadtree: Entity[] = []; + Collision.COLLIDABLE_COMPONENTS.map((componentName) => + entityComponents.get(componentName) + ).forEach((entityIds: Set) => + entityIds.forEach((id) => { + const entity = entityMap.get(id); + if (!entity.hasComponent(ComponentNames.BoundingBox)) { + return; + } + entitiesToAddToQuadtree.push(entity); + }) + ); + + entitiesToAddToQuadtree.forEach((entity) => { + const boundingBox = entity.getComponent( + ComponentNames.BoundingBox + ); + + this.quadTree.insert( + entity.id, + boundingBox.dimension, + boundingBox.center + ); + }); + + const collidingEntities = this.getCollidingEntities( + entitiesToAddToQuadtree, + entityMap + ); + collidingEntities.forEach(([entityAId, entityBId]) => { + const [entityA, entityB] = [entityAId, entityBId].map((id) => + entityMap.get(id) + ); + this.performCollision(entityA, entityB); + }); + } + + private performCollision(entityA: Entity, entityB: Entity) { + const [entityABoundingBox, entityBBoundingBox] = [entityA, entityB].map( + (entity) => entity.getComponent(ComponentNames.BoundingBox) + ); + + let velocity: Velocity; + if (entityA.hasComponent(ComponentNames.Velocity)) { + velocity = entityA.getComponent(ComponentNames.Velocity); + } + + if ( + entityA.hasComponent(ComponentNames.Collide) && + entityB.hasComponent(ComponentNames.TopCollidable) && + entityABoundingBox.center.y <= entityBBoundingBox.center.y && + velocity && + velocity.dCartesian.dy >= 0 // don't apply floor logic when coming through the bottom + ) { + if (entityBBoundingBox.rotation != 0) { + throw new Error( + `entity with id ${entityB.id} has TopCollidable component and a non-zero rotation. that is not (yet) supported.` + ); + } + + // remove previous velocity in the y axis + velocity.dCartesian.dy = 0; + + // apply normal force + if (entityA.hasComponent(ComponentNames.Gravity)) { + const mass = entityA.getComponent(ComponentNames.Mass).mass; + const F_n = -mass * PhysicsConstants.GRAVITY; + + entityA.getComponent(ComponentNames.Forces).forces.push({ + fCartesian: { fy: F_n }, + }); + } + + // reset the entities' jump + if (entityA.hasComponent(ComponentNames.Jump)) { + entityA.getComponent(ComponentNames.Jump).canJump = true; + } + + entityABoundingBox.center.y = + entityBBoundingBox.center.y - + entityBBoundingBox.dimension.height / 2 - + this.getDyToPushOutOfFloor(entityABoundingBox, entityBBoundingBox); + } + } + + private getCollidingEntities( + collidableEntities: Entity[], + entityMap: Map + ): [number, number][] { + const collidingEntityIds: [number, number] = []; + + for (const entity of collidableEntities) { + const boundingBox = entity.getComponent( + ComponentNames.BoundingBox + ); + + this.quadTree + .getNeighborIds({ + id: entity.id, + dimension: boundingBox.dimension, + center: boundingBox.center, + }) + .filter((neighborId) => neighborId != entity.id) + .forEach((neighborId) => { + const neighborBoundingBox = entityMap + .get(neighborId) + .getComponent(ComponentNames.BoundingBox); + + if (boundingBox.isCollidingWith(neighborBoundingBox)) { + collidingEntityIds.push([entity.id, neighborId]); + } + }); + } + + return collidingEntityIds; + } + + private getDyToPushOutOfFloor( + entityBoundingBox: BoundingBox, + floorBoundingBox: BoundingBox + ): number { + // ramblings: https://excalidraw.com/#json=z-xD86Za4a3duZuV2Oky0,KaGe-5iHJu1Si8inEo4GLQ + const { + rotation, + center: { x, y }, + dimension: { width, height }, + } = entityBoundingBox; + + let rads = rotation * (Math.PI / 180); + if (rads >= Math.PI) { + rads -= Math.PI; // we have symmetry so we can skip two cases + } + + let boundedCollisionX = 0; // bounded x on the surface from width + let clippedX = 0; // x coordinate of the vertex below the surface + let outScribedRectangleHeight, dy, dx; + + if (rads <= Math.PI / 2) { + dx = (width * Math.cos(rads) - height * Math.sin(rads)) / 2; + outScribedRectangleHeight = + width * Math.sin(rads) + height * Math.cos(rads); + } else if (rads <= Math.PI) { + rads -= Math.PI / 2; + dx = (height * Math.cos(rads) - width * Math.sin(rads)) / 2; + outScribedRectangleHeight = + width * Math.cos(rads) + height * Math.sin(rads); + } + + if (x >= floorBoundingBox.center.x) { + clippedX = x + dx; + boundedCollisionX = Math.min( + floorBoundingBox.center.x + floorBoundingBox.dimension.width / 2, + clippedX + ); + return ( + outScribedRectangleHeight / 2 - + Math.max((clippedX - boundedCollisionX) * Math.tan(rads), 0) + ); + } + + clippedX = x - dx; + boundedCollisionX = Math.max( + floorBoundingBox.center.x - floorBoundingBox.dimension.width / 2, + clippedX + ); + + return ( + outScribedRectangleHeight / 2 - + Math.max((boundedCollisionX - clippedX) * Math.tan(rads), 0) + ); + } +} diff --git a/client/lib/systems/FacingDirection.ts b/client/lib/systems/FacingDirection.ts new file mode 100644 index 0000000..fbb4c7c --- /dev/null +++ b/client/lib/systems/FacingDirection.ts @@ -0,0 +1,39 @@ +import { + ComponentNames, + Velocity, + FacingDirection as FacingDirectionComponent, +} from "../components"; +import type { Entity } from "../entities"; +import { System, SystemNames } from "./"; + +export class FacingDirection extends System { + constructor() { + super(SystemNames.FacingDirection); + } + + public update( + _dt: number, + entityMap: Map, + componentEntities: Map> + ) { + componentEntities + .get(ComponentNames.FacingDirection) + ?.forEach((entityId) => { + const entity = entityMap.get(entityId); + if (!entity.hasComponent(ComponentNames.Velocity)) { + return; + } + + const velocity = entity.getComponent(ComponentNames.Velocity); + const facingDirection = entity.getComponent( + ComponentNames.FacingDirection + ); + + if (velocity.dCartesian.dx > 0) { + entity.addComponent(facingDirection.facingRightSprite); + } else if (velocity.dCartesian.dx < 0) { + entity.addComponent(facingDirection.facingLeftSprite); + } + }); + } +} diff --git a/client/lib/systems/Input.ts b/client/lib/systems/Input.ts new file mode 100644 index 0000000..92932dd --- /dev/null +++ b/client/lib/systems/Input.ts @@ -0,0 +1,86 @@ +import { + Jump, + Forces, + Acceleration, + ComponentNames, + Velocity, + Mass, +} from "../components"; +import { KeyConstants, PhysicsConstants } from "../config"; +import type { Entity } from "../entities"; +import { Action } from "../interfaces"; +import { System, SystemNames } from "./"; + +export class Input extends System { + private keys: Set; + private actionTimeStamps: Map; + + constructor() { + super(SystemNames.Input); + + this.keys = new Set(); + this.actionTimeStamps = new Map(); + } + + public keyPressed(key: string) { + this.keys.add(key); + } + + public keyReleased(key: string) { + this.keys.delete(key); + } + + private hasSomeKey(keys: string[]): boolean { + return keys.some((key) => this.keys.has(key)); + } + + public update( + dt: number, + entityMap: Map, + componentEntities: Map> + ) { + componentEntities.get(ComponentNames.Control)?.forEach((entityId) => { + const entity = entityMap.get(entityId); + if (!entity.hasComponent(ComponentNames.Velocity)) { + return; + } + + const velocity = entity.getComponent(ComponentNames.Velocity); + + if (this.hasSomeKey(KeyConstants.ActionKeys.get(Action.MOVE_RIGHT))) { + velocity.dCartesian.dx = PhysicsConstants.PLAYER_MOVE_VEL; + } else if ( + this.hasSomeKey(KeyConstants.ActionKeys.get(Action.MOVE_LEFT)) + ) { + velocity.dCartesian.dx = -PhysicsConstants.PLAYER_MOVE_VEL; + } else { + velocity.dCartesian.dx = 0; + } + }); + + componentEntities.get(ComponentNames.Jump)?.forEach((entityId) => { + const entity = entityMap.get(entityId); + const jump = entity.getComponent(ComponentNames.Jump); + const velocity = entity.getComponent(ComponentNames.Velocity); + + if (this.hasSomeKey(KeyConstants.ActionKeys.get(Action.JUMP))) { + if (jump.canJump) { + this.actionTimeStamps.set(Action.JUMP, performance.now()); + + velocity.dCartesian.dy = PhysicsConstants.PLAYER_JUMP_INITIAL_VEL; + jump.canJump = false; + } + + if ( + performance.now() - this.actionTimeStamps.get(Action.JUMP) < + PhysicsConstants.MAX_JUMP_TIME_MS + ) { + const mass = entity.getComponent(ComponentNames.Mass).mass; + entity.getComponent(ComponentNames.Forces)?.forces.push({ + fCartesian: { fy: mass * PhysicsConstants.PLAYER_JUMP_ACC }, + }); + } + } + }); + } +} diff --git a/client/lib/systems/Physics.ts b/client/lib/systems/Physics.ts new file mode 100644 index 0000000..319ae29 --- /dev/null +++ b/client/lib/systems/Physics.ts @@ -0,0 +1,94 @@ +import { System, SystemNames } from "."; +import { + Acceleration, + BoundingBox, + ComponentNames, + Forces, + Gravity, + Velocity, + Mass, + Jump, +} from "../components"; +import { PhysicsConstants } from "../config"; +import type { Entity } from "../entities"; +import type { Force2D } from "../interfaces"; + +export class Physics extends System { + constructor() { + super(SystemNames.Physics); + } + + public update( + dt: number, + entityMap: Map, + componentEntities: Map> + ): void { + componentEntities.get(ComponentNames.Forces)?.forEach((entityId) => { + const entity = entityMap.get(entityId); + + const mass = entity.getComponent(ComponentNames.Mass).mass; + const forces = entity.getComponent(ComponentNames.Forces).forces; + const velocity = entity.getComponent(ComponentNames.Velocity); + const inertia = entity.getComponent( + ComponentNames.Moment + ).inertia; + + // F_g = mg, applied only until terminal velocity is reached + if (entity.hasComponent(ComponentNames.Gravity)) { + const gravity = entity.getComponent(ComponentNames.Gravity); + if (velocity.dCartesian.dy <= gravity.terminalVelocity) { + forces.push({ + fCartesian: { + fy: mass * PhysicsConstants.GRAVITY, + }, + }); + } + } + + // ma = Σ(F), Iα = Σ(T) + const sumOfForces = forces.reduce( + (accum: Force2D, { fCartesian, torque }: Force2D) => ({ + fCartesian: { + fx: accum.fCartesian.fx + (fCartesian?.fx ?? 0), + fy: accum.fCartesian.fy + (fCartesian?.fy ?? 0), + }, + torque: accum.torque + (torque ?? 0), + }), + { fCartesian: { fx: 0, fy: 0 }, torque: 0 } + ); + + // integrate accelerations + const [ddy, ddx] = [ + sumOfForces.fCartesian.fy, + sumOfForces.fCartesian.fx, + ].map((x) => x / mass); + velocity.dCartesian.dx += ddx * dt; + velocity.dCartesian.dy += ddy * dt; + velocity.dTheta += (sumOfForces.torque * dt) / inertia; + // clear the forces + entity.getComponent(ComponentNames.Forces).forces = []; + + // maybe we fell off the floor + if (ddy > 0 && entity.hasComponent(ComponentNames.Jump)) { + entity.getComponent(ComponentNames.Jump).canJump = false; + } + }); + + componentEntities.get(ComponentNames.Velocity)?.forEach((entityId) => { + const entity = entityMap.get(entityId); + const velocity = entity.getComponent(ComponentNames.Velocity); + const boundingBox = entity.getComponent( + ComponentNames.BoundingBox + ); + + // integrate velocity + boundingBox.center.x += velocity.dCartesian.dx * dt; + boundingBox.center.y += velocity.dCartesian.dy * dt; + boundingBox.rotation += velocity.dTheta * dt; + boundingBox.rotation = + (boundingBox.rotation < 0 + ? 360 + boundingBox.rotation + : boundingBox.rotation) % 360; + }); + } +} diff --git a/client/lib/systems/Render.ts b/client/lib/systems/Render.ts new file mode 100644 index 0000000..0c76b00 --- /dev/null +++ b/client/lib/systems/Render.ts @@ -0,0 +1,41 @@ +import { System, SystemNames } from "."; +import { BoundingBox, ComponentNames, Sprite } from "../components"; +import type { Entity } from "../entities"; +import type { DrawArgs } from "../interfaces"; + +export class Render extends System { + private ctx: CanvasRenderingContext2D; + + constructor(ctx: CanvasRenderingContext2D) { + super(SystemNames.Render); + this.ctx = ctx; + } + + public update( + dt: number, + entityMap: Map, + componentEntities: Map> + ) { + this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); + + componentEntities.get(ComponentNames.Sprite)?.forEach((entityId) => { + const entity = entityMap.get(entityId); + const sprite = entity.getComponent(ComponentNames.Sprite); + sprite.update(dt); + + let drawArgs: DrawArgs; + if (entity.hasComponent(ComponentNames.BoundingBox)) { + const boundingBox = entity.getComponent( + ComponentNames.BoundingBox + ); + + drawArgs = { + center: boundingBox.center, + dimension: boundingBox.dimension, + rotation: boundingBox.rotation, + }; + } + sprite.draw(this.ctx, drawArgs); + }); + } +} diff --git a/client/lib/systems/System.ts b/client/lib/systems/System.ts new file mode 100644 index 0000000..2accc97 --- /dev/null +++ b/client/lib/systems/System.ts @@ -0,0 +1,15 @@ +import { Entity } from "../entities"; + +export abstract class System { + public readonly name: string; + + constructor(name: string) { + this.name = name; + } + + abstract update( + dt: number, + entityMap: Map, + componentEntities: Map> + ): void; +} diff --git a/client/lib/systems/WallBounds.ts b/client/lib/systems/WallBounds.ts new file mode 100644 index 0000000..3fd5dc4 --- /dev/null +++ b/client/lib/systems/WallBounds.ts @@ -0,0 +1,35 @@ +import { System, SystemNames } from "."; +import { BoundingBox, ComponentNames } from "../components"; +import type { Entity } from "../entities"; + +export class WallBounds extends System { + private screenWidth: number; + + constructor(screenWidth: number) { + super(SystemNames.WallBounds); + + this.screenWidth = screenWidth; + } + + public update( + _dt: number, + entityMap: Map, + componentEntities: Map> + ) { + componentEntities.get(ComponentNames.WallBounded)?.forEach((entityId) => { + const entity = entityMap.get(entityId); + if (!entity.hasComponent(ComponentNames.BoundingBox)) { + return; + } + + const boundingBox = entity.getComponent( + ComponentNames.BoundingBox + ); + + boundingBox.center.x = Math.min( + this.screenWidth - boundingBox.dimension.width / 2, + Math.max(boundingBox.dimension.width / 2, boundingBox.center.x) + ); + }); + } +} diff --git a/client/lib/systems/index.ts b/client/lib/systems/index.ts new file mode 100644 index 0000000..6cb6f35 --- /dev/null +++ b/client/lib/systems/index.ts @@ -0,0 +1,8 @@ +export * from "./names"; +export * from "./System"; +export * from "./Render"; +export * from "./Physics"; +export * from "./Input"; +export * from "./FacingDirection"; +export * from "./Collision"; +export * from "./WallBounds"; diff --git a/client/lib/systems/names.ts b/client/lib/systems/names.ts new file mode 100644 index 0000000..23f31fc --- /dev/null +++ b/client/lib/systems/names.ts @@ -0,0 +1,8 @@ +export namespace SystemNames { + export const Render = "Render"; + export const Physics = "Physics"; + export const FacingDirection = "FacingDirection"; + export const Input = "Input"; + export const Collision = "Collision"; + export const WallBounds = "WallBounds"; +} diff --git a/client/lib/utils/dotProduct.ts b/client/lib/utils/dotProduct.ts new file mode 100644 index 0000000..59f8857 --- /dev/null +++ b/client/lib/utils/dotProduct.ts @@ -0,0 +1,4 @@ +import type { Coord2D } from "../interfaces"; + +export const dotProduct = (vector1: Coord2D, vector2: Coord2D): number => + vector1.x * vector2.x + vector1.y * vector2.y; diff --git a/client/lib/utils/index.ts b/client/lib/utils/index.ts new file mode 100644 index 0000000..1f8e2f0 --- /dev/null +++ b/client/lib/utils/index.ts @@ -0,0 +1,3 @@ +export * from "./rotateVector"; +export * from "./normalizeVector"; +export * from "./dotProduct"; diff --git a/client/lib/utils/normalizeVector.ts b/client/lib/utils/normalizeVector.ts new file mode 100644 index 0000000..e6dfd7f --- /dev/null +++ b/client/lib/utils/normalizeVector.ts @@ -0,0 +1,8 @@ +import type { Coord2D } from "../interfaces"; + +export const normalizeVector = (vector: Coord2D): Coord2D => { + const { x, y } = vector; + const length = Math.sqrt(x * x + y * y); + + return { x: x / length, y: y / length }; +}; diff --git a/client/lib/utils/rotateVector.ts b/client/lib/utils/rotateVector.ts new file mode 100644 index 0000000..82bb54d --- /dev/null +++ b/client/lib/utils/rotateVector.ts @@ -0,0 +1,15 @@ +import type { Coord2D } from "../interfaces"; + +/** + * ([[cos(θ), -sin(θ),]) ([x,) + * ([sin(θ), cos(θ)] ]) ( y]) + */ +export const rotateVector = (vector: Coord2D, theta: number): Coord2D => { + const rads = (theta * Math.PI) / 180; + const [cos, sin] = [Math.cos(rads), Math.sin(rads)]; + + return { + x: vector.x * cos - vector.y * sin, + y: vector.x * sin + vector.y * cos, + }; +}; diff --git a/client/package-lock.json b/client/package-lock.json new file mode 100644 index 0000000..641f566 --- /dev/null +++ b/client/package-lock.json @@ -0,0 +1,2455 @@ +{ + "name": "client", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "client", + "version": "0.0.0", + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^2.0.4", + "@tsconfig/svelte": "^4.0.1", + "eslint": "^8.43.0", + "eslint-plugin-svelte": "^2.31.1", + "svelte": "^3.59.2", + "svelte-check": "^3.3.1", + "svelte-routing": "^1.10.0", + "tslib": "^2.5.0", + "typescript": "^5.0.2", + "vite": "^4.3.9" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", + "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.4.2.tgz", + "integrity": "sha512-ePfcC48ftMKhkT0OFGdOyycYKnnkT6i/buzey+vHRTR/JpQvuPzzhf1PtKqCDQfJRgoPSN2vscXs6gLigx/zGw==", + "dev": true, + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^1.0.3", + "debug": "^4.3.4", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.0", + "svelte-hmr": "^0.15.2", + "vitefu": "^0.2.4" + }, + "engines": { + "node": "^14.18.0 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.54.0 || ^4.0.0", + "vite": "^4.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.3.tgz", + "integrity": "sha512-Khdl5jmmPN6SUsVuqSXatKpQTMIifoQPDanaxC84m9JxIibWvSABJyHpyys0Z+1yYrxY5TTEQm+6elh0XCMaOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": "^14.18.0 || >= 16" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^2.2.0", + "svelte": "^3.54.0 || ^4.0.0", + "vite": "^4.0.0" + } + }, + "node_modules/@tsconfig/svelte": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-4.0.1.tgz", + "integrity": "sha512-B+XlGpmuAQzJqDoBATNCvEPqQg0HkO7S8pM14QDI5NsmtymzRexQ1N+nX2H6RTtFbuFgaZD4I8AAi8voGg0GLg==", + "dev": true + }, + "node_modules/@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", + "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.43.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-svelte": { + "version": "2.31.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.31.1.tgz", + "integrity": "sha512-08v+DqzHiwIVEbi+266D7+BDhayp9OSqCwa/lHaZlZOlFY0vZLYs/h7SkkUPzA5fTVt8OUJBtvCxFiWEYOvvGg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@jridgewell/sourcemap-codec": "^1.4.14", + "debug": "^4.3.1", + "esutils": "^2.0.3", + "known-css-properties": "^0.27.0", + "postcss": "^8.4.5", + "postcss-load-config": "^3.1.4", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.11", + "semver": "^7.5.3", + "svelte-eslint-parser": "^0.31.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0-0", + "svelte": "^3.37.0 || ^4.0.0-0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/espree": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "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" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/known-css-properties": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz", + "integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==", + "dev": true + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-safe-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", + "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "dev": true, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz", + "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + } + ], + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.19" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rollup": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.2.tgz", + "integrity": "sha512-VLnkxZMDr3jpxgtmS8pQZ0UvhslmF4ADq/9w4erkctbgjCqLW9oa89fJuXEs4ZmgyoF7Dm8rMDKSS5b5u2hHUg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "dependencies": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sorcery": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", + "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.14", + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0" + }, + "bin": { + "sorcery": "bin/sorcery" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svelte": { + "version": "3.59.2", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.59.2.tgz", + "integrity": "sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/svelte-check": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.4.4.tgz", + "integrity": "sha512-Uys9+R65cj8TmP8f5UpS7B2xKpNLYNxEWJsA5ZoKcWq/uwvABFF7xS6iPQGLoa7hxz0DS6xU60YFpmq06E4JxA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "chokidar": "^3.4.1", + "fast-glob": "^3.2.7", + "import-fresh": "^3.2.1", + "picocolors": "^1.0.0", + "sade": "^1.7.4", + "svelte-preprocess": "^5.0.3", + "typescript": "^5.0.3" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "peerDependencies": { + "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0" + } + }, + "node_modules/svelte-eslint-parser": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.31.0.tgz", + "integrity": "sha512-/31RpBf/e3YjoFphjsyo3JRyN1r4UalGAGafXrZ6EJK4h4COOO0rbfBoen5byGsXnIJKsrlC1lkEd2Vzpq2IDg==", + "dev": true, + "dependencies": { + "eslint-scope": "^7.0.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "postcss": "^8.4.23", + "postcss-scss": "^4.0.6" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "svelte": "^3.37.0 || ^4.0.0-0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/svelte-hmr": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.2.tgz", + "integrity": "sha512-q/bAruCvFLwvNbeE1x3n37TYFb3mTBJ6TrCq6p2CoFbSTNhDE9oAtEfpy+wmc9So8AG0Tja+X0/mJzX9tSfvIg==", + "dev": true, + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.19.0 || ^4.0.0-next.0" + } + }, + "node_modules/svelte-preprocess": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.4.tgz", + "integrity": "sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/pug": "^2.0.6", + "detect-indent": "^6.1.0", + "magic-string": "^0.27.0", + "sorcery": "^0.11.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">= 14.10.0" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": "^0.55.0", + "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0", + "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/svelte-preprocess/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-routing": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/svelte-routing/-/svelte-routing-1.10.0.tgz", + "integrity": "sha512-ZYQEj7FK03iVHpzNg1Uk7svlD8siFks0a+IPUxn7ckaEL7H1uQl17gTdYRMjuEw2f7ZtgE77l6WDjmGql14JbA==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "dev": true, + "dependencies": { + "esbuild": "^0.17.5", + "postcss": "^8.4.23", + "rollup": "^3.21.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", + "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", + "dev": true, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/client/package.json b/client/package.json new file mode 100644 index 0000000..1ddd2b8 --- /dev/null +++ b/client/package.json @@ -0,0 +1,24 @@ +{ + "name": "client", + "private": true, + "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": "^2.0.4", + "@tsconfig/svelte": "^4.0.1", + "eslint": "^8.43.0", + "eslint-plugin-svelte": "^2.31.1", + "svelte": "^3.59.2", + "svelte-check": "^3.3.1", + "svelte-routing": "^1.10.0", + "tslib": "^2.5.0", + "typescript": "^5.0.2", + "vite": "^4.3.9" + } +} diff --git a/client/public/assets/coffee_left.png b/client/public/assets/coffee_left.png new file mode 100644 index 0000000000000000000000000000000000000000..1c5859107ebc834fd3ccfc8a29f669b9e67c2173 GIT binary patch literal 1485 zcmV;;1v2`HP)yU5XCp#fg%z;(9m!JD%waK0cfd_H~63yZN)>wuTA8rxYS%MlgQ95=qMm0E;2S7fL>c&#fSLI=T`9h&& zT&g3-YEws;xpy(lW|_$>HE>y-S<$y>Xv8gLq$+gX;${jhX}ePB);SejlFE0yxRHph zecrxvy8HR#@}Ea6_da|Ct36Jc3>_gdy2+0&O{}oxT#TV57dP)Q$;kPyHniul!_t*B z2`Y_~R9iPgOExyDY?@%Ss+C6E`pEI%?9nyOm-EjOH1{#3f$Pb8hEC(8!lPrBI}kCU zMOVturOv- zCUJVtvokSC+KLq7>~$iup(P@t&6PlGAj-KDWLL<8#?`a zB`@;KQbR|H+`H|U0&5JNlIrx~-T$^7A@JFUSJ&&DKYa~DRVQ$MLBm|1qgzL<2xbIn zN!lqD8UbjZOAIY-!KESCE}`9jdhaF}+QL}sC+S3#p(BN6p%bX2T4@ZO-jT9u_FX0b z`@V!(+Lh`G9d+!mFdhwk6#+>m*HyKCXO^Lv>OT5H#pB446S+KY)khB2oNO18GWH6U zYlYUpWDPe(kjjFn=x=XwslD=E3wwlttvfA=4f84uA4D5E41hNxplFU8k*g= zc0BsJ`w$IXADtwfmohXGIXZi@8Kh>Go}WvTt-2f{qgyK%ntu!2Owzg>Igp`I&^(^^ zT5s=LFXn>8wqGmHn~(2zFP}Vv(|8Dt7SY}z(7gFMVns))S{s+op}h=^;CewqAGX); zv1V==I)XX#OXI+FBu!U}NaVy;{-MNWI?#v_9yy|56JUl$uxSr7%$x;iReR~D9=&8N zSxd1IyW~rTa!pMV_qZ+03}Z{**0;VA&Si#XvX?QmMbMFY3Rp9$LS5Cbv{Av}XNWYG$ukM06&^EM?5|AXc@ZJt`K0U1jFzN{zS~ zk&(b?t@`;aQ%5n14c)5JIT#UDs|V~YphWO!ktO2J;-1l&5U+*R#n3%duttvrl^C}- zM)E^=2`l0o?a?AK%P!$%=S1VZ_$WhC7C&o18Sj+!B(XKgqulE}Qtw)70`#W*Sm-fLK5;Hib@TrDPZg^t`{BG+jdJSy<3K2eb* n@jj1H8+xCik9$Ad2>by%!Dng>*sY@g0000=f literal 0 HcmV?d00001 diff --git a/client/public/assets/coffee_right.png b/client/public/assets/coffee_right.png new file mode 100644 index 0000000000000000000000000000000000000000..fc7f00da85bb744cb2b0dd1b09de0971dbe6be89 GIT binary patch literal 2064 zcmY*a3p|s1ADtLyl%XC~~ zG1s@|QiM)LteDfq{cbj zCIA2cy1P01C}OqZw$xBl%<4sl?OtHGji;wK`vQ9a}1iSq7gKekueS4$r}R9z}*mMM8o} zQ6XeVOe9lD0H9)!3K&V|1RKUgMljgO7zgkg1F68uG!$&OM&ZyMzSCRkfIFs3-EEdeIM_Z%TnE#ji=7WMN&Hv{xUprmPDq2NrqM+-K4XwF{ zII0c+sBLz4K8%Y|na;7U40O>-0&Ne-|JgaOs32HX^c*AEaisrcIv%jY#xi(w`g0$$ zDvg?GuzwRzqwPr3oddjyrQTdN?9T#zj3d&z3NkR`J9_6)|*seypPiEdfjrc3*P03UNsQ4v@FhD*q0eg+OerNPMY;5 z*B8BbThhMV7|k^(N}IXi+}m{hq2B~ycbe#P{-vId-RCBIyGs`E2n#x)nMwrrbGBAA z5{5FoiJ>C~x^JE20%QR}V~bqR0dHZdDdn9$%w^q9l2ONvC7#wc4c*Z=h~M7^)I@Q@ zt;dojx5;w1!baDf%%b-CZqfH0Vxe4CQ%0lyRzi60pCj;6OOR*PNtavKu-=$J2cRocr6$&D71uFbw0S+x8vCt>YLVy8n+Acxyf@m zlipB90&jH`#`p4@LYBTL>2qDaSx;Gfl(d-NCxXDLK)w-a{4_XvY<73W0))}`*er)) z8+t4L@h-9`{KPLdtk?Cx)I^@UIJqLSaPy00lbDV8Wzk9s)4x^zmkHrc&D2X#d;_oo zSmyZjqD#Ev%Hna(7LqsLJX?2L78AvX^mOSt#e_|yVC(qhEp4cleuD0XoIXj84mPjKi6`iK;i z96&wMP1Sf^`6MO1bD(Awwk=%tYmu*Z0OB@U2;*an5k(@`<+3W;%+}Q*X{)SYCwYr) zHCkAxQuTX+ZRp}H*C?t|2a`M!!A3Gg*q@m=B1*3#E(|T!gWDB_4ocN*Y zHMsurs(he&nCrM0yGnv-{rNz8u0lOw}i-b^&u;e>9Ak=G&1vyH!_k zvEYH$xkT}_gt}8(#U-Smd?>}ItOeUsmPI~bSI3IpYb&vjlBb#)#Cr69>%d96lX%1FE7 zQy_H94VaCqV4?10bFC$D`t4X`TF|Y#$7eny4Xc1I?e)~J8gfBjh_W*c6%8 zXQ9>D-AA=LO+KM6(KWeS^N?yE2$PN2%(M&C7l>j8)gpRl7jp9-QcBmhS8=D_VRcVv z_lLKwhK6vXr&ea##%HqnVuZk<^gjbT&WB4)^-|e>4O2himg#hvN5QX6rMkj^fV$PG zINZmldOE`9aoN#?;`hnmL3L1|jbU@PY14Q2nyrUlXsv7kjf_-HCwW>Z|F7;YUe1+A Hg3kX3n;4@U literal 0 HcmV?d00001 diff --git a/client/public/assets/floor_tile_120.png b/client/public/assets/floor_tile_120.png new file mode 100644 index 0000000000000000000000000000000000000000..3658e2eb810061212fe7e0f8fecb07544b402733 GIT binary patch literal 1404 zcmV-?1%vvDP)5C000F-Nklt@_qouw@Agh9sNEpZ>pRe~8wK@CUCq5`om1GK&!6d!2Mp;p@cM%(KwgS&i1V8^s@7`wU-jLvq{34ErnMSI(j{gL z;9N9lX411Z*$UhZq5sPbcm?OHax^yJkGAUDRciR>srBy5pw+zod~b<}8nhaDi#*dw zEBeZyrQ6^PS9##7p}JjkwI^x zeo5liy{dY5i3DLuN~h>AgOS zBZKDC#2t|u*qu_UfYO&r4p%TTXjeKpgQW+s$sU=v;G220;`l9>P(4f+*9 z@8mG?NISUIz|xskHW-);8m21cKpAvO*>KP@Xq>BzBW2JTRl_k?4O*uwoJ8i4GH7OX z=CJ9LqI3MQ&#t~mcmUTm2fKuAe3b@%@4e@l(mAKjGU%MTp{QlhC{szt$)J-82f{8q z9er)S+IT@CNr#m_s3L($#TtQCY2eQTlAe@CSml``gXYm90*MSdf>olJs6oGXzMp`Vv^oD^p-*A z&}jx`t#|dU-ZQKc%>|lR22G@w1q!h7YSXn4N;noW==Zad-Wy9OpZVl`eFQ!S&}$CK z6xOv>GQo^+TN|+Mpp9g*4X>P>VT0DD%%A85cwk z^XMY&#eM1C=#uKk2S@QV7TO!eOx#)>B@Slu0K7uxQyXN(*K6KWo|~qYT+ww~NVDL! z#AO@X;r!FTw-2hIh0GAiupnmempJmOsfNoCzh%zVtBz|;C_e^V#iiv?FS=wY#|_k9 z(zm$jA{x%>7fmWs1BwBu^_4GT^Y0yEPBnb#J8aM>DH^wo0o0gblU{~giBJZHo{Z4o zgX660&h-z#oDCc?;K3SKOe^wOd@tn+G!r>W*D{O?_grEW&(`KB(eBzX{}M#iI z3(aGVYpr+3c(nFtZfl2#9h_WqS~;>{Mz4vAuhCf&RmQ?=`Y&f{2tT0g!JYsB002ov KPDHLkV1fYpK&{pQ literal 0 HcmV?d00001 diff --git a/client/public/assets/floor_tile_160.png b/client/public/assets/floor_tile_160.png new file mode 100644 index 0000000000000000000000000000000000000000..b0941509da65c865923c967a6679ced9bfcbc5dc GIT binary patch literal 1566 zcmV+(2I2XMP)z3Of41}Baf9Ty4_hgS_a}hEKA-?`=i_vIi%oyVAzW&|+{9OL&l^B!zr|Y#1mzoZ3 z>B$tBgJQije8O=K!;?83Pz!_&80dBX^rUKs`$ochD-Y*6&(}(7<@Ec)a0T>a;+}@_ zHdm`~UhvP>Q^Q+N%$oYG+V#ZST6^?(3;t3)^yaizAH8vn)~_~yFJ5YOO8>tSrysta zV*ca3SE@G)@bjbZ;q~(1o3EBF0qKcrR;hf!TSK81QhqFY^Ms|dA|}&G`8$KL&{f)e zEBHz9TeVkQa%_rhk?U~LjqW1Dhm!UuAF79h6Rpm3*T*_`(Qvfxo(UUF;Mg3 zXA*VzYVRKrdf}iQ@0%3wBY0@hH&eeJz}F|XmZCzBxE?k_xET#w>!t|dZ1`&UnxUID z#~NOw*UaEAc@F*Hl)#`!79Qgolom|sY zgllFRc?FGfrb}r5wdjrLO{>)iEGv3n%b%A;wzLa5Va$dvK3LJUelQcjeze#IiDuDb zq1(nDrj2U6_;(KNcz0$>BE{4U)BQf(=t#ye#V1ZX1Pwv00AszigDc;Ab`75%7j7&IDruo#jv3a5Wqv}W%3dO z1Tg-X#Q*_3i+SpP7~nHtyfB@C#4+IU5)8+G)1?UwfVc2N%ezE#1n?3v#Rf?L$JW@W^*5b5WucviVubWj<2!T4*5xJUX_WBtMLB8u>(Ff9%l;J zg~T?*%!YOxs=jF5M zJ(xNFg>8CVK08gQvqA3OlV0LriF~_C0ibH$jwO zB?}(=3g7Gw7!w9_gp+n!0~jAV5iSsn(szN+ZE^w=NOZ$iDi3%BaH|%QCuVNkGOI05 zgzwX5_-u9Q`0=gx!4;8*Kx=&fe1ciR*OU3jEAF>Kidzp{wubL@2YhTeG>f0aY(3>1 zO}2GEIc`Sxd9Ew%xfN4m_})CI@ncV~Y3GvishPi315J&Q_$7F>JvQP_ehseXxyBmV zcC|f9_*-pEFHTc^TktITyf=mIx+T7S4!4?+yW(v%S#QH%>kH<;9mkxs!-pM>T=RxN ztBz>gOqKEcZ9-Ae2PE~rIciWw_mit{-RBucZ%;_( zuIVt7j~X_~|M&9IEFOB{mvGgq$ETPjI9h8+=9F+0c}y#(B`#+1E$-nLMQRyGHlqR8 Q00000NkvXXu0mjf0AE_!$p8QV literal 0 HcmV?d00001 diff --git a/client/public/assets/floor_tile_40.png b/client/public/assets/floor_tile_40.png new file mode 100644 index 0000000000000000000000000000000000000000..3d15fece8a5eaa401f9790e5ea059fa36037acd9 GIT binary patch literal 750 zcmVNMH0@yNe5&L;h6ESB8RD2wce8OIwRZLbC@@<>&Ny@s4!OA5rg6{_7ApKNI zLGY9KPOOpvHG(ZtMjz)e=Anl5!qFfcA%<-_gWMx;)GCH?KFtYX2o{W3kvxlF244`| zqkf?xOkD-Rx>bq&inud1M7QMSndG)8cs4!`BUFf1a>;RMwgIU+kP0lxc5rz_BRL4R zlO9cRL9lJJ)IzAFVNx3>4oHHfLJLg6N6OnX$7$Hv_?iet0EtSlP-snGgrPwww_l~; zAlP>qk}DXY5Ts66-E0VggJ4Hl(${pc5Pb+2DG$>S4V^=B7XghfaD|pgFoFS@LMCyH zfNzCMr69O3b4b_2YbY2&9h!PkDpc!I3Biu6f)RjO1f!75tV!b+SwV1n+zx`aQU zK%DCkj9@&g$U?xlWDY)~*6aljf#5>LvoRtQ%x$`>9_*TFz!eBaU5w%GqqCdtW~w;| z?yCT$O%m+J_k4(_)f@zu1Z$7-oZKjF_(xZ$4?RgTGQol&hcBmUq&oCnJOEyZmg}U! zTiCHZ&LQlUNEyTHc!LaO*;Gt(EpxvKWATm-mQQO|-s9F}4Ruu4!rt+3YHy~vf#a(6 z(svyCYKdcKzV_*QwZjdQ5>-5KEN@p&yr;wB$HZ)PU=ggHZ=Gv_llt!I*P5q=#dEv| g-`@W%7=HjN=&&DbO5B(L0000i_@% literal 0 HcmV?d00001 diff --git a/client/public/assets/floor_tile_80.png b/client/public/assets/floor_tile_80.png new file mode 100644 index 0000000000000000000000000000000000000000..52b36a2ee8e494ebb1a86efa615fac20a381057b GIT binary patch literal 1104 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 Zuu}q=Fz%UD-HR-p)z@u(Z10$4 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

4WujDDguVB>2a8s=?0^4tr2 z;_P^Q3ee(8m5@F4iIV)k+BoJSloFfgRm2^&tGL@Z^sKP(G)6H|mW-=J9pf*g&NyIs zn-*AN{@@!p0ZT1U4*$TRIJ7eVYFUrm76+RA!#F@K1GD5dcK1dd%dJhyEUPR)G9LGS zgVyDsW9n^;HB9kszL2v+WN8CKvkh=e>SXbF10~1EC3eO>X)9*gK;XF>oXN3qP0WM$ zQew?CwzNk#NUutt{7D%fa->#upEC>gtDv4}O&1Yqq`wY-8@uxoj5&$QB2J*Mx_+%M zO)L?fV$y2*>dt^kYY~?!Pp;uXy3uFM9qo@%-*kj4Yhmb%;Tc35JlTqznjX=!jRnim zMR)l)EYaECngcDA;(znjwazryn$NH=sJ*Ba+0^X zCyvE&zCCec2cg?S$)umh!rQuteBp`++&sdnCsp3wr^b5BCz!+C&a~tM?%%GTF_m@R z(^mA=PwN_Fa9-IsQ;HF9mV|B+YiP(=Joe1X@1(dMz4JKqZ_PH6 z$9^N9W(oCXZt`P2>x?lUUOX7_^E_nhTxBToS-NT|c>&%sVO+I7Ib+%HNulnen{RAD zKde82ZjJld<2yh_bF(o;4zGk3gbndjG`&}tJ8@+X?y>e3rZ@Jebd*di=pP5_k>?kXv);qEWii8QHz>p;|`5D zi5t&pyjR=Y-X{^>&}qutOC6dRSQuPMFL;cs?6pXoq5CwT-vxvWpkd0o3Vnx$LpQPk zMoRcm$59&G0lq|wcYHE$JG6h+HAzJiQW(onAH$v60*%OC)Brz{bC|;(W6gwTkZXE8 zRv-fnxqNNwq>gLwPx@WCB*YkDP1qAx_7v|A-Tu)nDN~LgzmZR$WsU6!3PT@S6eD_# zb-2)XpsfX3vMkEyG*o#{uhGC^AnyW81&>wM($#+vKSjgmXz@OjpRbKi_j>N&BkfZ6 zd2Ma?`C=_(&k0{a)C(y#fwtFP?Y-&IntFaMoiYUtpbIV4m`S40V)GSV%Zt>bezT+c zO4Kh{Q!k;0`1ad3rmZXiyu-Ic9wGdb$N>pNmFy) z#JBURKc~iErOtQB-#T;t$Pw~3-dvmH_p#~bR zTBIQi+FUKR-{tFkN}3`9>7`$936tM~>DO12D-q~J8tA2wCK63Z#S*qq8d#%~F4{Q0 zZLK~#9_1rBN!$M8xG7X<2MObU*^JzUL?VqzE2r$zO;QU3d{!O~d!II!lEVJ#}4A zdL?zp7EYABN|pO{jIE(xCO=tm?3Z~j>r@McrIX7^^h?KdN@0%l$+3SfvZ4JD7L^}* zZQyeICn)#pr_HI0x!DKp(rchgQmj52$Ycj`B37VeYw*rBRO}|zhb3xFJxi|m1vE>@ z+_MnZDfBnRR?dw)bsVnjDo>%p%1pK?7PBuWW7#5fp>Ad zd-M zJzZB0DvhsK%e_^bM~(QHKVpfjO=OSm@yY>rqVKoF(0T(>tdqL6B3sdV(K?Z{AMSdge|FiG%WzV((W~3e?p$ zYDMa?)MAGw@QfC)B^7V1?QwH?G{qCU!XkK3E&oT`Bw*s8&pLZ+Je<2$s**j=V`Ps zX5!qYTX~ZXF<4W)uC}6gu}=RRtq@~A81AT|4XD{K+Oyih&du19Zdk!jA;}A=mj&8F ziBRf)%jEe=-v{G4G2hc&LGwmEl!bIf5%P$~LB}=eJx(ZMoF_JolBO+?8%Tm%OBi#- z(3gxJ&0?Id!Dqyg+y_>u$a|j&n(@v?{Z<uBfLlXu%{!@NnTI7ciT_2!RzlytK~%)#-S1U}d4#+Gd+%&Gmc%;6=+_hXeK+HtQL z>Dbu!y)KoFd;&YQE)5OC_M{uM^Zyz_Q=2h=tPO8^&eOuHHpH{3xfd#wZ#4kz+jKa;z!3_?5OIjYJUi!Xm8IOn=Pdug)B8 zue|vCvCTK{kezK`G zRS_YMSZdpHVjeUGa%bwtkNH<>86P3}0vyzdJgL*nLZ2GieWVNH08gMH0{nipRx?r{;(37f7Vk}_gz#5jeXCr{z^s{(w2RLhV>m*Oe0Zwzj5n8#mXl%Z1O_A?^RXtVO=HVRF zB>Vh3Ki!(U`8=a|Td$-flmf_o#}P1)a84prTk?n-#Hl&4KXV$4uPRB;CpkjrRSL2; zZ9jGH=0C=fxu@DhE*aRFH2JYK^r?`qm4}5`16kW{1*00i(`1>m)Cz0ADxY}^0XTO! z0$Y={#!K`e#<{n%mPkzJG%+UI>0pkZImwb+uTjr&;Evkk`#Zk?eZ|6fFNPl9@A=f4 z2=Hl9AnwU0W|Pz}=GBi62PuGtll(lHm34`PdT=94#CW2_@eNR7cZfyXvz=N|*q zYL9&bX7Y#w1d1zth&s>Ctb4DytR;Vg$3BO4K4)1kAJ_LkZC`H8GM9@-fZ>tKZ}E`{kCx+|4UTMB~=vG#8iPzQttk zPTN_T@iTHX*~EvE3}k~IRMxCW>#b_RIwBel&zE(rQ}qiL!K3D>1K(S&wl08{)y5V@ zi|Dh7#I#;ye6a66tKi#1?Hfe2kvPWuOFdBTEOTw-U5p4_<(v)lx|bBBhr6J_`8@Ag z2Fi6;z>&|ktH$~8mguea!CO8_nG>(`kX?7}?QU?2^7I@ajQf4QI|1#H8⪙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�EqQ|4(Ao{3>quHpCemUNmEl(_m%@Q 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 Na}JqsCd~f~=HIgVDsKP) literal 0 HcmV?d00001 diff --git a/client/public/img/kangaroo.svg b/client/public/img/kangaroo.svg new file mode 100644 index 0000000..f23ddec --- /dev/null +++ b/client/public/img/kangaroo.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/client/src/App.svelte b/client/src/App.svelte new file mode 100644 index 0000000..e76c187 --- /dev/null +++ b/client/src/App.svelte @@ -0,0 +1,31 @@ + + + +

+ diff --git a/client/src/components/GameCanvas.svelte b/client/src/components/GameCanvas.svelte new file mode 100644 index 0000000..766a08a --- /dev/null +++ b/client/src/components/GameCanvas.svelte @@ -0,0 +1,28 @@ + + + diff --git a/client/src/components/LeaderBoard.svelte b/client/src/components/LeaderBoard.svelte new file mode 100644 index 0000000..d6e4ce3 --- /dev/null +++ b/client/src/components/LeaderBoard.svelte @@ -0,0 +1,25 @@ + + +
+ {#each entries + .sort((a, b) => b.score - a.score) + .slice(0, MAX_ENTRIES) as entry} + + {/each} +
+ + diff --git a/client/src/components/LeaderBoardCard.svelte b/client/src/components/LeaderBoardCard.svelte new file mode 100644 index 0000000..446d734 --- /dev/null +++ b/client/src/components/LeaderBoardCard.svelte @@ -0,0 +1,20 @@ + + +
+ {entry.name} + {entry.score} +
+ + diff --git a/client/src/main.ts b/client/src/main.ts new file mode 100644 index 0000000..5332616 --- /dev/null +++ b/client/src/main.ts @@ -0,0 +1,7 @@ +import App from "./App.svelte"; + +const app = new App({ + target: document.getElementById("app"), +}); + +export default app; diff --git a/client/src/routes/Home.svelte b/client/src/routes/Home.svelte new file mode 100644 index 0000000..935ed69 --- /dev/null +++ b/client/src/routes/Home.svelte @@ -0,0 +1,12 @@ + + +
+ + +
diff --git a/client/src/vite-env.d.ts b/client/src/vite-env.d.ts new file mode 100644 index 0000000..4078e74 --- /dev/null +++ b/client/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/client/svelte.config.js b/client/svelte.config.js new file mode 100644 index 0000000..b0683fd --- /dev/null +++ b/client/svelte.config.js @@ -0,0 +1,7 @@ +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' + +export default { + // Consult https://svelte.dev/docs#compile-time-svelte-preprocess + // for more information about preprocessors + preprocess: vitePreprocess(), +} diff --git a/client/tsconfig.json b/client/tsconfig.json new file mode 100644 index 0000000..eabe862 --- /dev/null +++ b/client/tsconfig.json @@ -0,0 +1,28 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "resolveJsonModule": true, + /** + * 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, + "isolatedModules": true + }, + "include": [ + "lib/**/*.d.ts", + "lib/**/*.ts", + "lib/**/*.js", + "src/**/*.d.ts", + "src/**/*.ts", + "src/**/*.js", + "src/**/*.svelte" + ], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/client/tsconfig.node.json b/client/tsconfig.node.json new file mode 100644 index 0000000..494bfe0 --- /dev/null +++ b/client/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler" + }, + "include": ["vite.config.ts"] +} diff --git a/client/vite.config.ts b/client/vite.config.ts new file mode 100644 index 0000000..d701969 --- /dev/null +++ b/client/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import { svelte } from '@sveltejs/vite-plugin-svelte' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [svelte()], +})