diff --git a/staff/marti-herms/project/dodge/data/index.js b/staff/marti-herms/project/dodge/data/index.js
new file mode 100644
index 000000000..eb68aee11
--- /dev/null
+++ b/staff/marti-herms/project/dodge/data/index.js
@@ -0,0 +1,9 @@
+import player from './player.js'
+import obstacles from './obstacles.js'
+
+const data = {
+ player,
+ obstacles
+}
+
+export default data
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/data/obstacles.js b/staff/marti-herms/project/dodge/data/obstacles.js
new file mode 100644
index 000000000..485ce58c8
--- /dev/null
+++ b/staff/marti-herms/project/dodge/data/obstacles.js
@@ -0,0 +1,70 @@
+import randomNumberGenerator from '../util/randomNumberGenerator.js'
+import { SCREEN_WIDTH, SCREEN_HEIGHT } from '../util/constants'
+
+import player from './player.js'
+
+class Obstacle {
+ constructor(id) {
+ this.id = id
+ const type = randomNumberGenerator(1, 3)
+ const side = randomNumberGenerator(1, 4)
+
+ switch (type) {
+ case 1:
+ this.width = 15
+ this.height = 15
+ this.color = 'blue'
+ break
+ case 2:
+ this.width = 25
+ this.height = 25
+ this.color = 'red'
+ break
+ case 3:
+ this.width = 35
+ this.height = 35
+ this.color = 'purple'
+ break
+ default:
+ break
+ }
+
+ switch (side) {
+ case 1:
+ this.top = randomNumberGenerator(50, SCREEN_HEIGHT - this.height - 50)
+ this.left = 50
+ break
+ case 2:
+ this.top = 50
+ this.left = randomNumberGenerator(50, SCREEN_WIDTH - this.width - 50)
+ break
+ case 3:
+ this.top = SCREEN_HEIGHT - this.height - 50
+ this.left = randomNumberGenerator(50, SCREEN_WIDTH - this.width - 50)
+ break
+ case 4:
+ this.top = randomNumberGenerator(50, SCREEN_HEIGHT - this.height - 50)
+ this.left = SCREEN_WIDTH - this.width - 50
+ break
+ default:
+ break
+ }
+
+ const dirY = player.item.top - this.top
+ const dirX = player.item.left - this.left
+
+ const magnitude = Math.sqrt(dirY ** 2 + dirX ** 2)
+
+ this.yMovement = dirY / magnitude
+ this.xMovement = dirX / magnitude
+ }
+}
+
+const obstacles = {
+ items: [],
+ addObstacle: function (id) { this.items.push(new Obstacle(id)) },
+ removeObstacle: function (id) { this.items = this.items.filter(obstacle => obstacle.id !== id) },
+ clear: function () { this.items = [] }
+}
+
+export default obstacles
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/data/player.js b/staff/marti-herms/project/dodge/data/player.js
new file mode 100644
index 000000000..72c1b6bbe
--- /dev/null
+++ b/staff/marti-herms/project/dodge/data/player.js
@@ -0,0 +1,18 @@
+import { SCREEN_WIDTH, SCREEN_HEIGHT } from '../util/constants'
+
+class Player {
+ constructor() {
+ this.width = 25
+ this.height = 25
+ this.top = (SCREEN_HEIGHT - 25) / 2
+ this.left = (SCREEN_WIDTH - 25) / 2
+ this.points = 0
+ }
+}
+
+const player = {
+ item: new Player(),
+ clear: function () { this.item = new Player() }
+}
+
+export default player
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/index.html b/staff/marti-herms/project/dodge/index.html
index 8e1e7c09e..878152065 100644
--- a/staff/marti-herms/project/dodge/index.html
+++ b/staff/marti-herms/project/dodge/index.html
@@ -4,7 +4,7 @@
- Space Invaders
+ Dodge
diff --git a/staff/marti-herms/project/dodge/logic/checkCollision.js b/staff/marti-herms/project/dodge/logic/checkCollision.js
new file mode 100644
index 000000000..8a866528a
--- /dev/null
+++ b/staff/marti-herms/project/dodge/logic/checkCollision.js
@@ -0,0 +1,27 @@
+import data from '../data'
+
+import { OBS_SIZE, PLAYER_SIZE } from '../util/constants'
+
+export default () => {
+ const boolean = data.obstacles.items.some(obstacle => {
+ const obsTop = obstacle.top
+ const obsLeft = obstacle.left
+ const obsRight = obstacle.left + obstacle.width
+ const obsBottom = obstacle.top + obstacle.height
+
+ const playerTop = data.player.item.top
+ const playerLeft = data.player.item.left
+ const playerRight = data.player.item.left + PLAYER_SIZE
+ const playerBottom = data.player.item.top + PLAYER_SIZE
+
+ if (obsTop > playerTop && obsTop < playerBottom && obsLeft > playerLeft && obsLeft < playerRight ||
+ obsBottom > playerTop && obsBottom < playerBottom && obsLeft > playerLeft && obsLeft < playerRight ||
+ obsTop > playerTop && obsTop < playerBottom && obsRight > playerLeft && obsRight < playerRight ||
+ obsBottom > playerTop && obsBottom < playerBottom && obsRight > playerLeft && obsRight < playerRight) {
+ return true
+ }
+ return false
+ })
+
+ return boolean
+}
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/logic/checkOutOfBounds.js b/staff/marti-herms/project/dodge/logic/checkOutOfBounds.js
new file mode 100644
index 000000000..f028f40c6
--- /dev/null
+++ b/staff/marti-herms/project/dodge/logic/checkOutOfBounds.js
@@ -0,0 +1,12 @@
+import data from '../data'
+
+import { SCREEN_WIDTH, SCREEN_HEIGHT } from '../util/constants'
+
+export default (id) => {
+ const obstacle = data.obstacles.items.find(obstacle => obstacle.id === id)
+
+ if (obstacle.top >= SCREEN_HEIGHT - obstacle.height - 10 || obstacle.top < 0 || obstacle.left >= SCREEN_WIDTH - obstacle.width - 10 || obstacle.left < 0) {
+ return true
+ }
+ return false
+}
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/logic/clearObstacles.js b/staff/marti-herms/project/dodge/logic/clearObstacles.js
new file mode 100644
index 000000000..a6c3a81e6
--- /dev/null
+++ b/staff/marti-herms/project/dodge/logic/clearObstacles.js
@@ -0,0 +1,5 @@
+import data from '../data'
+
+export default () => {
+ data.obstacles.clear()
+}
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/logic/clearPlayer.js b/staff/marti-herms/project/dodge/logic/clearPlayer.js
new file mode 100644
index 000000000..8833b7adb
--- /dev/null
+++ b/staff/marti-herms/project/dodge/logic/clearPlayer.js
@@ -0,0 +1,5 @@
+import data from '../data'
+
+export default () => {
+ data.player.clear()
+}
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/logic/createObstacle.js b/staff/marti-herms/project/dodge/logic/createObstacle.js
new file mode 100644
index 000000000..67ecfa1bf
--- /dev/null
+++ b/staff/marti-herms/project/dodge/logic/createObstacle.js
@@ -0,0 +1,5 @@
+import data from '../data'
+
+export default (id) => {
+ data.obstacles.addObstacle(id)
+}
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/logic/getObstacles.js b/staff/marti-herms/project/dodge/logic/getObstacles.js
new file mode 100644
index 000000000..e779b3c5f
--- /dev/null
+++ b/staff/marti-herms/project/dodge/logic/getObstacles.js
@@ -0,0 +1,5 @@
+import data from '../data'
+
+export default () => {
+ return data.obstacles.items
+}
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/logic/getPlayer.js b/staff/marti-herms/project/dodge/logic/getPlayer.js
new file mode 100644
index 000000000..add98ca79
--- /dev/null
+++ b/staff/marti-herms/project/dodge/logic/getPlayer.js
@@ -0,0 +1,5 @@
+import data from '../data'
+
+export default () => {
+ return data.player.item
+}
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/logic/getPoints.js b/staff/marti-herms/project/dodge/logic/getPoints.js
new file mode 100644
index 000000000..69ace4615
--- /dev/null
+++ b/staff/marti-herms/project/dodge/logic/getPoints.js
@@ -0,0 +1,5 @@
+import data from '../data'
+
+export default () => {
+ return data.player.item.points
+}
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/logic/index.js b/staff/marti-herms/project/dodge/logic/index.js
new file mode 100644
index 000000000..03c08e648
--- /dev/null
+++ b/staff/marti-herms/project/dodge/logic/index.js
@@ -0,0 +1,29 @@
+import getPlayer from './getPlayer'
+import movePlayer from './movePlayer'
+import createObstacle from './createObstacle'
+import clearPlayer from './clearPlayer'
+import clearObstacles from './clearObstacles'
+import removeObstacle from './removeObstacle'
+import getObstacles from './getObstacles'
+import checkCollision from './checkCollision'
+import moveObstacles from './moveObstacles'
+import checkOutOfBounds from './checkOutOfBounds'
+import getPoints from './getPoints'
+import setPoints from './setPoints'
+
+const logic = {
+ movePlayer,
+ getPlayer,
+ createObstacle,
+ clearObstacles,
+ clearPlayer,
+ removeObstacle,
+ getObstacles,
+ checkCollision,
+ moveObstacles,
+ checkOutOfBounds,
+ getPoints,
+ setPoints
+}
+
+export default logic
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/logic/moveObstacles.js b/staff/marti-herms/project/dodge/logic/moveObstacles.js
new file mode 100644
index 000000000..a1e4a886b
--- /dev/null
+++ b/staff/marti-herms/project/dodge/logic/moveObstacles.js
@@ -0,0 +1,12 @@
+import data from '../data'
+
+import { OBS_PACE } from '../util/constants'
+
+export default () => {
+ data.obstacles.items = data.obstacles.items.map(obstacle => {
+ obstacle.top += obstacle.yMovement * OBS_PACE
+ obstacle.left += obstacle.xMovement * OBS_PACE
+
+ return obstacle
+ })
+}
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/logic/movePlayer.js b/staff/marti-herms/project/dodge/logic/movePlayer.js
new file mode 100644
index 000000000..6800141f0
--- /dev/null
+++ b/staff/marti-herms/project/dodge/logic/movePlayer.js
@@ -0,0 +1,61 @@
+import data from '../data'
+
+import { SCREEN_WIDTH, SCREEN_HEIGHT } from '../util/constants'
+
+export default (e) => {
+ const moveUp = () => {
+ data.player.item.top = Math.max(0, data.player.item.top - 10)
+ }
+
+ const moveLeft = () => {
+ data.player.item.left = Math.max(0, data.player.item.left - 10)
+ }
+
+ const moveRight = () => {
+ data.player.item.left = Math.min(SCREEN_WIDTH - 25, data.player.item.left + 10)
+ }
+
+ const moveDown = () => {
+ data.player.item.top = Math.min(SCREEN_HEIGHT - 25, data.player.item.top + 10)
+ }
+
+ if (typeof e === 'object')
+ switch (e.key) {
+ case 'ArrowUp':
+ case 'w':
+ moveUp()
+ break
+ case 'ArrowLeft':
+ case 'a':
+ moveLeft()
+ break
+ case 'ArrowRight':
+ case 'd':
+ moveRight()
+ break
+ case 'ArrowDown':
+ case 's':
+ moveDown()
+ break
+ default:
+ break
+ }
+ else {
+ switch (e) {
+ case 'up':
+ moveUp()
+ break
+ case 'left':
+ moveLeft()
+ break
+ case 'right':
+ moveRight()
+ break
+ case 'down':
+ moveDown()
+ break
+ default:
+ break
+ }
+ }
+}
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/logic/removeObstacle.js b/staff/marti-herms/project/dodge/logic/removeObstacle.js
new file mode 100644
index 000000000..e42862d4c
--- /dev/null
+++ b/staff/marti-herms/project/dodge/logic/removeObstacle.js
@@ -0,0 +1,5 @@
+import data from '../data'
+
+export default (id) => {
+ data.obstacles.removeObstacle(id)
+}
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/logic/setPoints.js b/staff/marti-herms/project/dodge/logic/setPoints.js
new file mode 100644
index 000000000..ba540ccf6
--- /dev/null
+++ b/staff/marti-herms/project/dodge/logic/setPoints.js
@@ -0,0 +1,18 @@
+import data from '../data'
+
+export default (seconds) => {
+ if (seconds === 0)
+ data.player.item.points = 0
+ else if (seconds < 20)
+ data.player.item.points += 1
+ else if (seconds < 30)
+ data.player.item.points += 5
+ else if (seconds < 60)
+ data.player.item.points += 10
+ else if (seconds < 120)
+ data.player.item.points += 20
+ else if (seconds < 240)
+ data.player.item.points += 40
+ else if (seconds >= 240)
+ data.player.item.points += 100
+}
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/package-lock.json b/staff/marti-herms/project/dodge/package-lock.json
index b1a566d42..08f553d10 100644
--- a/staff/marti-herms/project/dodge/package-lock.json
+++ b/staff/marti-herms/project/dodge/package-lock.json
@@ -1,11 +1,11 @@
{
- "name": "space_invaders",
+ "name": "dodge",
"version": "0.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "space_invaders",
+ "name": "dodge",
"version": "0.0.0",
"dependencies": {
"@emotion/react": "^11.13.3",
@@ -68,9 +68,9 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz",
- "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz",
+ "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==",
"dev": true,
"engines": {
"node": ">=6.9.0"
@@ -106,12 +106,18 @@
"url": "https://opencollective.com/babel"
}
},
+ "node_modules/@babel/core/node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
"node_modules/@babel/generator": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz",
- "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==",
+ "version": "7.25.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.5.tgz",
+ "integrity": "sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==",
"dependencies": {
- "@babel/types": "^7.25.0",
+ "@babel/types": "^7.25.4",
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25",
"jsesc": "^2.5.1"
@@ -241,11 +247,11 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.25.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz",
- "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz",
+ "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==",
"dependencies": {
- "@babel/types": "^7.25.2"
+ "@babel/types": "^7.25.4"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -285,9 +291,9 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz",
- "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz",
+ "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==",
"dependencies": {
"regenerator-runtime": "^0.14.0"
},
@@ -309,15 +315,15 @@
}
},
"node_modules/@babel/traverse": {
- "version": "7.25.3",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz",
- "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz",
+ "integrity": "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==",
"dependencies": {
"@babel/code-frame": "^7.24.7",
- "@babel/generator": "^7.25.0",
- "@babel/parser": "^7.25.3",
+ "@babel/generator": "^7.25.4",
+ "@babel/parser": "^7.25.4",
"@babel/template": "^7.25.0",
- "@babel/types": "^7.25.2",
+ "@babel/types": "^7.25.4",
"debug": "^4.3.1",
"globals": "^11.1.0"
},
@@ -325,18 +331,10 @@
"node": ">=6.9.0"
}
},
- "node_modules/@babel/traverse/node_modules/globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/@babel/types": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz",
- "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==",
+ "version": "7.25.4",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz",
+ "integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==",
"dependencies": {
"@babel/helper-string-parser": "^7.24.8",
"@babel/helper-validator-identifier": "^7.24.7",
@@ -364,22 +362,6 @@
"stylis": "4.2.0"
}
},
- "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
- },
- "node_modules/@emotion/babel-plugin/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==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/@emotion/cache": {
"version": "11.13.1",
"resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz",
@@ -910,6 +892,21 @@
"url": "https://opencollective.com/eslint"
}
},
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@eslint/js": {
"version": "8.57.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
@@ -1094,11 +1091,6 @@
}
}
},
- "node_modules/@mui/material/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
- },
"node_modules/@mui/private-theming": {
"version": "5.16.6",
"resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz",
@@ -1237,11 +1229,6 @@
}
}
},
- "node_modules/@mui/utils/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
- },
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -1904,22 +1891,6 @@
"npm": ">=6"
}
},
- "node_modules/babel-plugin-macros/node_modules/resolve": {
- "version": "1.22.8",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
- "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
- "dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -2029,9 +2000,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001651",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz",
- "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==",
+ "version": "1.0.30001653",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz",
+ "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==",
"dev": true,
"funding": [
{
@@ -2061,6 +2032,14 @@
"node": ">=4"
}
},
+ "node_modules/chalk/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
"node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@@ -2134,10 +2113,9 @@
"dev": true
},
"node_modules/convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "dev": true
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
},
"node_modules/cosmiconfig": {
"version": "7.1.0",
@@ -2154,14 +2132,6 @@
"node": ">=10"
}
},
- "node_modules/cosmiconfig/node_modules/yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -2313,15 +2283,15 @@
"dev": true
},
"node_modules/doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "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": ">=0.10.0"
+ "node": ">=6.0.0"
}
},
"node_modules/dom-helpers": {
@@ -2565,11 +2535,14 @@
}
},
"node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"engines": {
- "node": ">=0.8.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint": {
@@ -2672,14 +2645,43 @@
}
},
"node_modules/eslint-plugin-react-refresh": {
- "version": "0.4.10",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.10.tgz",
- "integrity": "sha512-I39s6G9We7ZxbCRxTTM5XX4KJV2cfWhFbHF4kTuL0ygdEVdQXtCNGqUQ43sBOCbTC/N6dEZXoQKFHr8gp1VHrQ==",
+ "version": "0.4.11",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.11.tgz",
+ "integrity": "sha512-wrAKxMbVr8qhXTtIKfXqAn5SAtRZt0aXxe5P23Fh4pUAdC6XEsybGLB8P0PI4j1yYqOgUEUlzKAGDfo7rJOjcw==",
"dev": true,
"peerDependencies": {
"eslint": ">=7"
}
},
+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/eslint-scope": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
@@ -2757,25 +2759,16 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
- "node_modules/eslint/node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
"dev": true,
"dependencies": {
- "esutils": "^2.0.2"
+ "type-fest": "^0.20.2"
},
"engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/eslint/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"
+ "node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -3120,20 +3113,21 @@
}
},
"node_modules/glob": {
- "version": "10.4.5",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
"dev": true,
"dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^3.1.2",
- "minimatch": "^9.0.4",
- "minipass": "^7.1.2",
- "package-json-from-dist": "^1.0.0",
- "path-scurry": "^1.11.1"
+ "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"
},
- "bin": {
- "glob": "dist/esm/bin.mjs"
+ "engines": {
+ "node": "*"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -3151,43 +3145,12 @@
"node": ">=10.13.0"
}
},
- "node_modules/glob/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/glob/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/globals": {
- "version": "13.24.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
- "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
- "dev": true,
- "dependencies": {
- "type-fest": "^0.20.2"
- },
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=4"
}
},
"node_modules/globalthis": {
@@ -3311,6 +3274,11 @@
"react-is": "^16.7.0"
}
},
+ "node_modules/hoist-non-react-statics/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
"node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -3464,9 +3432,9 @@
}
},
"node_modules/is-core-module": {
- "version": "2.15.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz",
- "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==",
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
+ "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
"dependencies": {
"hasown": "^2.0.2"
},
@@ -3963,9 +3931,9 @@
}
},
"node_modules/micromatch": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
- "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
"dependencies": {
"braces": "^3.0.3",
@@ -4406,23 +4374,6 @@
"postcss": "^8.0.0"
}
},
- "node_modules/postcss-import/node_modules/resolve": {
- "version": "1.22.8",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
- "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/postcss-js": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
@@ -4489,6 +4440,18 @@
"url": "https://github.com/sponsors/antonk52"
}
},
+ "node_modules/postcss-load-config/node_modules/yaml": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz",
+ "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==",
+ "dev": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/postcss-nested": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
@@ -4552,6 +4515,11 @@
"react-is": "^16.13.1"
}
},
+ "node_modules/prop-types/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -4613,9 +4581,9 @@
}
},
"node_modules/react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
},
"node_modules/react-refresh": {
"version": "0.14.2",
@@ -4737,10 +4705,9 @@
}
},
"node_modules/resolve": {
- "version": "2.0.0-next.5",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
- "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
- "dev": true,
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
"dependencies": {
"is-core-module": "^2.13.0",
"path-parse": "^1.0.7",
@@ -4787,27 +4754,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/rimraf/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
- "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/rollup": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.0.tgz",
@@ -5232,6 +5178,50 @@
"node": ">=16 || 14 >=14.17"
}
},
+ "node_modules/sucrase/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/sucrase/node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "dev": true,
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/sucrase/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -5291,23 +5281,6 @@
"node": ">=14.0.0"
}
},
- "node_modules/tailwindcss/node_modules/resolve": {
- "version": "1.22.8",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
- "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -5820,15 +5793,11 @@
"dev": true
},
"node_modules/yaml": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz",
- "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==",
- "dev": true,
- "bin": {
- "yaml": "bin.mjs"
- },
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
"engines": {
- "node": ">= 14"
+ "node": ">= 6"
}
},
"node_modules/yocto-queue": {
diff --git a/staff/marti-herms/project/dodge/package.json b/staff/marti-herms/project/dodge/package.json
index 2944d8c36..c01f03e5b 100644
--- a/staff/marti-herms/project/dodge/package.json
+++ b/staff/marti-herms/project/dodge/package.json
@@ -10,9 +10,6 @@
"preview": "vite preview"
},
"dependencies": {
- "@emotion/react": "^11.13.3",
- "@emotion/styled": "^11.13.0",
- "@mui/material": "^5.16.7",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-icons": "^5.3.0",
diff --git a/staff/marti-herms/project/dodge/src/game/Controller.jsx b/staff/marti-herms/project/dodge/src/game/Controller.jsx
index ed65ccce9..0ff7b38fa 100644
--- a/staff/marti-herms/project/dodge/src/game/Controller.jsx
+++ b/staff/marti-herms/project/dodge/src/game/Controller.jsx
@@ -4,52 +4,41 @@ import { FaArrowDown, FaArrowLeft, FaArrowRight, FaArrowUp } from 'react-icons/f
import Container from '../library/Container'
import Button from '../library/Button'
-export default function Controller({ position, setPosition }) {
+import logic from '../../logic'
+
+export default function Controller({ setPlayer, pause, end }) {
useEffect(() => {
- window.addEventListener('keydown', handleKeyDown)
- return () => {
- window.removeEventListener('keydown', handleKeyDown)
- }
- }, [position])
-
- const handleKeyDown = (e) => {
- switch (e.key) {
- case 'ArrowUp':
- case 'w':
- handleUp()
- break
- case 'ArrowLeft':
- case 'a':
- handleLeft()
- break
- case 'ArrowRight':
- case 'd':
- handleRight()
- break
- case 'ArrowDown':
- case 's':
- handleDown()
- break
- default:
- break
+ if (!pause && !end) {
+ window.addEventListener('keydown', handleMovement)
+
+ return () => window.removeEventListener('keydown', handleMovement)
+ } else if (end) {
+ logic.clearPlayer()
}
+ }, [pause, end])
+
+ const handleMovement = (event) => {
+ logic.movePlayer(event)
+
+ const player = logic.getPlayer()
+
+ setPlayer(prev => ({ ...prev, top: player.top, left: player.left }))
}
const handleUp = () => {
- setPosition({ top: Math.max(0, position.top - 10), left: position.left })
+ handleMovement('up')
}
const handleLeft = () => {
- setPosition({ top: position.top, left: Math.max(0, position.left - 10) })
+ handleMovement('left')
}
const handleRight = () => {
- setPosition({ top: position.top, left: Math.min(window.innerWidth - 25, position.left + 10) })
+ handleMovement('right')
}
const handleDown = () => {
- setPosition({ top: Math.min(window.innerHeight - 25, position.top + 10), left: position.left })
-
+ handleMovement('down')
}
return
diff --git a/staff/marti-herms/project/dodge/src/game/GameOver.jsx b/staff/marti-herms/project/dodge/src/game/GameOver.jsx
index 1efabc7c8..1b783aa44 100644
--- a/staff/marti-herms/project/dodge/src/game/GameOver.jsx
+++ b/staff/marti-herms/project/dodge/src/game/GameOver.jsx
@@ -1,14 +1,17 @@
import Container from '../library/Container'
import Button from '../library/Button'
-export default function GameOver({ points, onHomeClick }) {
+import logic from '../../logic'
+
+export default function GameOver({ onHomeClick, onRestartClick }) {
return <>
GAME OVER
- Points: {points}
+ Points: {logic.getPoints()}
+
>
diff --git a/staff/marti-herms/project/dodge/src/game/Obstacle.jsx b/staff/marti-herms/project/dodge/src/game/Obstacle.jsx
index 92e0fa4b8..9902cabee 100644
--- a/staff/marti-herms/project/dodge/src/game/Obstacle.jsx
+++ b/staff/marti-herms/project/dodge/src/game/Obstacle.jsx
@@ -1,68 +1,20 @@
-import { useEffect, useState } from 'react'
+import { useEffect } from 'react'
import Container from '../library/Container'
-import { OBS_PACE, OBS_RATE, OBS_SIZE, PLAYER_SIZE } from '../../util/constants.js'
-
-export default function Obstacle({ playerPosition, obstacle, pause, onOutOfBounds, setEnd, clearField }) {
- const [obstaclePosition, setObstaclePosition] = useState({ top: obstacle.top, left: obstacle.left })
- const [intervalId, setIntervalId] = useState(null)
- const [moveY] = useState(playerPosition.top - obstaclePosition.top)
- const [moveX] = useState(playerPosition.left - obstaclePosition.left)
-
- const obsTop = obstaclePosition.top
- const obsLeft = obstaclePosition.left
- const obsRight = obstaclePosition.left + OBS_SIZE
- const obsBottom = obstaclePosition.top + OBS_SIZE
-
- const playerTop = playerPosition.top
- const playerLeft = playerPosition.left
- const playerRight = playerPosition.left + PLAYER_SIZE
- const playerBottom = playerPosition.top + PLAYER_SIZE
-
- const modifier = Math.abs(moveX) / Math.abs(moveY)
+import logic from '../../logic/index.js'
+export default function Obstacle({ player, obstacle, onOutOfBounds, setEnd }) {
useEffect(() => {
- if (pause)
- clearInterval(intervalId)
- else
- handleMovement()
- }, [pause])
-
- useEffect(() => {
- if (obstaclePosition.top >= window.innerHeight - OBS_SIZE - 10 || obstaclePosition.top < 0 || obstaclePosition.left >= window.innerWidth - OBS_SIZE - 10 || obstaclePosition.left < 0) {
- obstacle.top = obstaclePosition.top
- obstacle.left = obstaclePosition.left
- onOutOfBounds(obstacle)
+ if (logic.checkOutOfBounds(obstacle.id)) {
+ onOutOfBounds(obstacle.id)
}
- }, [obstaclePosition])
+ }, [obstacle.top, obstacle.left])
useEffect(() => {
- if (obsTop > playerTop && obsTop < playerBottom && obsLeft > playerLeft && obsLeft < playerRight ||
- obsBottom > playerTop && obsBottom < playerBottom && obsLeft > playerLeft && obsLeft < playerRight ||
- obsTop > playerTop && obsTop < playerBottom && obsRight > playerLeft && obsRight < playerRight ||
- obsBottom > playerTop && obsBottom < playerBottom && obsRight > playerLeft && obsRight < playerRight) {
+ if (logic.checkCollision())
setEnd(true)
- clearField()
- }
- }, [obstaclePosition, playerPosition])
-
- const handleMovement = () => {
- if (intervalId)
- clearInterval(intervalId)
-
- setIntervalId(setInterval(() => {
- modifier >= 1 ?
- setObstaclePosition(prev => ({
- top: moveY > 0 ? prev.top + Math.floor(OBS_PACE * (1 / modifier)) : prev.top - Math.floor(OBS_PACE * (1 / modifier)),
- left: moveX > 0 ? prev.left + Math.floor(OBS_PACE * (1 - (1 / modifier))) : prev.left - Math.floor(OBS_PACE * (1 - (1 / modifier)))
- })) :
- setObstaclePosition(prev => ({
- top: moveY > 0 ? prev.top + Math.floor(OBS_PACE * (1 - modifier)) : prev.top - Math.floor(OBS_PACE * (1 - modifier)),
- left: moveX > 0 ? prev.left + Math.floor(OBS_PACE * modifier) : prev.left - Math.floor(OBS_PACE * modifier)
- }))
- }, OBS_RATE))
- }
+ }, [obstacle.top, obstacle.left, player.top, player.left])
- return {obstacle.id}
+ return {obstacle.id}
}
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/src/game/Obstacles.jsx b/staff/marti-herms/project/dodge/src/game/Obstacles.jsx
new file mode 100644
index 000000000..2c6a294b9
--- /dev/null
+++ b/staff/marti-herms/project/dodge/src/game/Obstacles.jsx
@@ -0,0 +1,77 @@
+import { useEffect, useState } from 'react'
+
+import Obstacle from './Obstacle'
+
+import logic from '../../logic'
+
+import { SPAWN_RATE, OBS_RATE } from '../../util/constants.js'
+
+let obstacleCount = 0
+
+export default function Obstacles({ player, pause, end, setEnd }) {
+ const [obstacles, setObstacles] = useState([])
+ const [spawnIntervalId, setSpawnIntervalId] = useState(null)
+ const [movementIntervalId, setMovementIntervalId] = useState(null)
+
+ useEffect(() => {
+ if (end) {
+ clearInterval(spawnIntervalId)
+ clearInterval(movementIntervalId)
+ clearField()
+ obstacleCount = 0
+ } else if (pause) {
+ clearInterval(spawnIntervalId)
+ clearInterval(movementIntervalId)
+ } else {
+ handleSpawn()
+ handleMovement()
+ }
+ }, [pause, end])
+
+ const handleSpawn = () => {
+ setSpawnIntervalId(setInterval(() => {
+ logic.createObstacle(obstacleCount++)
+
+ const items = logic.getObstacles()
+
+ setObstacles(prev => ([...items]))
+ }, SPAWN_RATE))
+ }
+
+ const handleMovement = () => {
+ if (movementIntervalId)
+ clearInterval(movementIntervalId)
+
+ setMovementIntervalId(setInterval(() => {
+ logic.moveObstacles()
+
+ const items = logic.getObstacles()
+
+ setObstacles(prev => ([...items]))
+ }, OBS_RATE))
+ }
+
+ const handleOutOfBounds = (id) => {
+ logic.removeObstacle(id)
+
+ const items = logic.getObstacles()
+
+ setObstacles(prev => [...items])
+ }
+
+ const clearField = () => {
+ clearInterval(spawnIntervalId)
+ logic.clearObstacles()
+ setObstacles([])
+ }
+
+ return <>
+ {obstacles.map(obstacle =>
+ )}
+ >
+}
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/src/game/PauseMenu.jsx b/staff/marti-herms/project/dodge/src/game/PauseMenu.jsx
index 6d9c6f0de..daf67119c 100644
--- a/staff/marti-herms/project/dodge/src/game/PauseMenu.jsx
+++ b/staff/marti-herms/project/dodge/src/game/PauseMenu.jsx
@@ -1,14 +1,16 @@
import Container from '../library/Container'
import Button from '../library/Button'
-export default function PauseMenu({ points, onResumeClick, onHomeClick }) {
+import logic from '../../logic'
+
+export default function PauseMenu({ onResumeClick, onHomeClick }) {
return <>
PAUSE
- Points: {points}
+ Points: {logic.getPoints()}
diff --git a/staff/marti-herms/project/dodge/src/game/Player.jsx b/staff/marti-herms/project/dodge/src/game/Player.jsx
index 463033397..bb5098aaf 100644
--- a/staff/marti-herms/project/dodge/src/game/Player.jsx
+++ b/staff/marti-herms/project/dodge/src/game/Player.jsx
@@ -2,6 +2,8 @@ import Container from '../library/Container'
import { PLAYER_SIZE } from '../../util/constants.js'
-export default function Player({ position }) {
- return
+export default function Player({ player }) {
+ // console.log(player.top, player.left)
+
+ return
}
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/src/game/Screen.jsx b/staff/marti-herms/project/dodge/src/game/Screen.jsx
deleted file mode 100644
index 2e4dc26bc..000000000
--- a/staff/marti-herms/project/dodge/src/game/Screen.jsx
+++ /dev/null
@@ -1,82 +0,0 @@
-import { useEffect, useState } from 'react'
-
-import Container from '../library/Container'
-
-import Player from './Player'
-import Controller from './Controller'
-import Obstacle from './Obstacle'
-
-import randomNumberGenerator from '../../util/randomNumberGenerator.js'
-import { SPAWN_RATE } from '../../util/constants.js'
-
-let obstacleCount = 0
-
-export default function Screen({ pause, end, setEnd }) {
- const [position, setPosition] = useState({ top: window.innerHeight / 2 - 25, left: window.innerWidth / 2 - 25 })
- const [obstacles, setObstacles] = useState([])
- const [intervalId, setIntervalId] = useState(null)
-
- useEffect(() => {
- if (end) {
- clearInterval(intervalId)
- obstacleCount = 0
- } else if (pause) {
- clearInterval(intervalId)
- } else {
- handleSpawn()
- }
- }, [pause, end])
-
- const handleOutOfBounds = (obstacle) => {
- const newArray = obstacles.filter(_obstacle => _obstacle.id !== obstacle.id)
-
- setObstacles(newArray)
- }
-
- const clearField = () => {
- setObstacles([])
- }
-
- const handleSpawn = () => {
- setIntervalId(setInterval(() => {
- const side = randomNumberGenerator(1, 4)
- let x, y
- switch (side) {
- case 1:
- x = randomNumberGenerator(50, 700)
- y = 50
- break
- case 2:
- x = 50
- y = randomNumberGenerator(50, 300)
- break
- case 3:
- x = 700
- y = randomNumberGenerator(50, 300)
- break
- case 4:
- x = randomNumberGenerator(50, 700)
- y = 300
- break
- default:
- break
- }
-
- setObstacles(prev => ([...prev, { top: y, left: x, id: obstacleCount++ }]))
- }, SPAWN_RATE))
- }
-
- return
- {obstacles.map(obstacle =>
- )}
-
-
-
-}
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/src/game/Timer.jsx b/staff/marti-herms/project/dodge/src/game/Timer.jsx
index 5340061a3..aba462e4e 100644
--- a/staff/marti-herms/project/dodge/src/game/Timer.jsx
+++ b/staff/marti-herms/project/dodge/src/game/Timer.jsx
@@ -1,23 +1,45 @@
-import { useEffect } from 'react'
+import { useEffect, useState } from 'react'
-import { TIME } from '../../util/constants.js'
+import logic from '../../logic/index.js'
+
+export default function Timer({ pause, end }) {
+ const [seconds, setSeconds] = useState(0)
+ const [points, setPoints] = useState(0)
-export default function Timer({ pause, seconds, setSeconds, end }) {
useEffect(() => {
let intervalId = null
- if (!pause && !end) {
- intervalId = setInterval(() => {
- setSeconds((prevSeconds) => prevSeconds + 1)
- }, 1000)
- } else if (pause && seconds !== 0) {
- clearInterval(intervalId)
- } else if (end) {
- clearInterval(intervalId)
+ try {
+ if (!pause && !end) {
+ intervalId = setInterval(() => {
+ setSeconds((prevSeconds) => prevSeconds + 1)
+ }, 1000)
+ } else if (pause && seconds !== 0) {
+ clearInterval(intervalId)
+ } else if (end) {
+ setSeconds(0)
+ setPoints(logic.getPoints())
+ clearInterval(intervalId)
+ }
+
+ return () => clearInterval(intervalId)
+ } catch (error) {
+ console.error
}
+ }, [pause, end])
- return () => clearInterval(intervalId)
- }, [pause, seconds, end])
+ useEffect(() => {
+ try {
+ logic.setPoints(seconds)
+
+ setPoints(logic.getPoints())
+ } catch (error) {
+ console.error(error)
+ }
+ }, [seconds])
- return Time: {seconds}
+ return <>
+ Points: {points}
+ Time: {seconds}
+ >
}
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/src/game/index.jsx b/staff/marti-herms/project/dodge/src/game/index.jsx
index d24a0d655..1d5288629 100644
--- a/staff/marti-herms/project/dodge/src/game/index.jsx
+++ b/staff/marti-herms/project/dodge/src/game/index.jsx
@@ -2,33 +2,19 @@ import { useState, useEffect } from 'react'
import Button from '../library/Button'
-import Screen from './Screen'
+import Player from './Player'
+import Controller from './Controller'
+import Obstacles from './Obstacles'
import Timer from './Timer'
import PauseMenu from './PauseMenu'
import GameOver from './GameOver'
+import logic from '../../logic'
+
export default function Game({ username, onHomeClick }) {
const [pause, setPause] = useState(false)
- const [seconds, setSeconds] = useState(0)
- const [points, setPoints] = useState(0)
const [end, setEnd] = useState(false)
-
- useEffect(() => {
- if (seconds === 0)
- setPoints(0)
- else if (seconds < 20)
- setPoints(prev => (prev + 1))
- else if (seconds < 30)
- setPoints(prev => (prev + 5))
- else if (seconds < 60)
- setPoints(prev => (prev + 10))
- else if (seconds < 120)
- setPoints(prev => (prev + 20))
- else if (seconds < 240)
- setPoints(prev => (prev + 40))
- else if (seconds >= 240)
- setPoints(prev => (prev + 100))
- }, [seconds])
+ const [player, setPlayer] = useState(logic.getPlayer())
const handleHomeClick = () => {
sessionStorage.username = ''
@@ -40,12 +26,17 @@ export default function Game({ username, onHomeClick }) {
setPause(!pause)
}
+ const handleRestartClick = () => {
+ setEnd(false)
+
+ setPlayer(prev => (logic.getPlayer()))
+ }
+
return <>
{username}
@@ -54,10 +45,11 @@ export default function Game({ username, onHomeClick }) {
- {pause && }
- {end && }
-
+ {pause && }
+ {end && }
+
+
+
-
>
}
\ No newline at end of file
diff --git a/staff/marti-herms/project/dodge/util/constants.js b/staff/marti-herms/project/dodge/util/constants.js
index 566068258..c4a4b17ce 100644
--- a/staff/marti-herms/project/dodge/util/constants.js
+++ b/staff/marti-herms/project/dodge/util/constants.js
@@ -1,9 +1,11 @@
const TIME = 10000
-const OBS_PACE = 5
-const OBS_RATE = 50
+const OBS_PACE = 2
+const OBS_RATE = 1000 / 60 // => 60 fps
const PLAYER_SIZE = 25
const OBS_SIZE = 35
-const SPAWN_RATE = 1000
+const SPAWN_RATE = 5000
+const SCREEN_WIDTH = window.innerWidth
+const SCREEN_HEIGHT = window.innerHeight
export {
TIME,
@@ -11,5 +13,7 @@ export {
OBS_RATE,
PLAYER_SIZE,
OBS_SIZE,
- SPAWN_RATE
+ SPAWN_RATE,
+ SCREEN_WIDTH,
+ SCREEN_HEIGHT
}
\ No newline at end of file