diff --git a/markdown/chapters/meandeck/basics.md b/markdown/chapters/01-meandeck/01-basics.md similarity index 99% rename from markdown/chapters/meandeck/basics.md rename to markdown/chapters/01-meandeck/01-basics.md index e7ed7c36..4056fa8a 100644 --- a/markdown/chapters/meandeck/basics.md +++ b/markdown/chapters/01-meandeck/01-basics.md @@ -1,7 +1,6 @@ --- authors: Doishy banner: DD -order: 0 title: Core Concepts --- diff --git a/markdown/chapters/meandeck/simple-piles.md b/markdown/chapters/01-meandeck/02-simple-piles.md similarity index 99% rename from markdown/chapters/meandeck/simple-piles.md rename to markdown/chapters/01-meandeck/02-simple-piles.md index 3bd2fd47..df28c9a1 100644 --- a/markdown/chapters/meandeck/simple-piles.md +++ b/markdown/chapters/01-meandeck/02-simple-piles.md @@ -1,7 +1,6 @@ --- authors: angrybacon, Labman13, 7TeenWriters, Doishy banner: IU -order: 1 title: Simple Piles --- diff --git a/markdown/chapters/meandeck/brainstorm.md b/markdown/chapters/01-meandeck/03-brainstorm.md similarity index 99% rename from markdown/chapters/meandeck/brainstorm.md rename to markdown/chapters/01-meandeck/03-brainstorm.md index b90bb3f3..ded2af92 100644 --- a/markdown/chapters/meandeck/brainstorm.md +++ b/markdown/chapters/01-meandeck/03-brainstorm.md @@ -1,7 +1,6 @@ --- authors: angrybacon, Doishy banner: BS | MMQ -order: 2 title: Brainstorm Piles --- diff --git a/markdown/chapters/meandeck/ptt.md b/markdown/chapters/01-meandeck/04-ptt.md similarity index 99% rename from markdown/chapters/meandeck/ptt.md rename to markdown/chapters/01-meandeck/04-ptt.md index f48d9262..f5ab4cd6 100644 --- a/markdown/chapters/meandeck/ptt.md +++ b/markdown/chapters/01-meandeck/04-ptt.md @@ -1,7 +1,6 @@ --- authors: Doishy banner: Sundial of the Infinite -order: 3 title: Pass-the-Turn Piles --- diff --git a/markdown/chapters/meandeck/interaction.md b/markdown/chapters/01-meandeck/05-interaction.md similarity index 99% rename from markdown/chapters/meandeck/interaction.md rename to markdown/chapters/01-meandeck/05-interaction.md index aa6405d1..6d0a6970 100644 --- a/markdown/chapters/meandeck/interaction.md +++ b/markdown/chapters/01-meandeck/05-interaction.md @@ -1,7 +1,6 @@ --- authors: angrybacon, Labman13, Doishy banner: Counterspell | TMP -order: 4 title: Playing Around Interaction --- diff --git a/markdown/chapters/meandeck/deck-construction.md b/markdown/chapters/01-meandeck/06-deck-construction.md similarity index 99% rename from markdown/chapters/meandeck/deck-construction.md rename to markdown/chapters/01-meandeck/06-deck-construction.md index 0f4c4e23..8a81bcb3 100644 --- a/markdown/chapters/meandeck/deck-construction.md +++ b/markdown/chapters/01-meandeck/06-deck-construction.md @@ -1,7 +1,6 @@ --- authors: Otterlady, Doishy banner: Urza's Blueprints -order: 5 title: Deck Construction --- diff --git a/markdown/chapters/meandeck/sideboard.md b/markdown/chapters/01-meandeck/07-sideboard.md similarity index 99% rename from markdown/chapters/meandeck/sideboard.md rename to markdown/chapters/01-meandeck/07-sideboard.md index 410ac756..88a4933f 100644 --- a/markdown/chapters/meandeck/sideboard.md +++ b/markdown/chapters/01-meandeck/07-sideboard.md @@ -1,7 +1,6 @@ --- authors: Nevilshute, Hulahula, Emidln, Monkeyscantcry, Romariovidal, Doishy banner: Pyroblast -order: 6 title: Sideboarding --- diff --git a/markdown/chapters/meandeck/practice.md b/markdown/chapters/01-meandeck/08-practice.md similarity index 99% rename from markdown/chapters/meandeck/practice.md rename to markdown/chapters/01-meandeck/08-practice.md index 21ab1c5c..a9a08427 100644 --- a/markdown/chapters/meandeck/practice.md +++ b/markdown/chapters/01-meandeck/08-practice.md @@ -1,7 +1,6 @@ --- authors: Doishy banner: Unburden -order: 7 title: Practice --- diff --git a/markdown/chapters/ddft/basics.md b/markdown/chapters/02-ddft/01-basics.md similarity index 99% rename from markdown/chapters/ddft/basics.md rename to markdown/chapters/02-ddft/01-basics.md index 807515b3..f8347814 100644 --- a/markdown/chapters/ddft/basics.md +++ b/markdown/chapters/02-ddft/01-basics.md @@ -1,6 +1,5 @@ --- banner: ToA -order: 0 title: The Basics --- diff --git a/markdown/chapters/ddft/brainstorm.md b/markdown/chapters/02-ddft/02-brainstorm.md similarity index 100% rename from markdown/chapters/ddft/brainstorm.md rename to markdown/chapters/02-ddft/02-brainstorm.md diff --git a/markdown/chapters/ddft/dd-vs-hate.md b/markdown/chapters/02-ddft/03-dd-vs-hate.md similarity index 100% rename from markdown/chapters/ddft/dd-vs-hate.md rename to markdown/chapters/02-ddft/03-dd-vs-hate.md diff --git a/markdown/chapters/ddft/echo.md b/markdown/chapters/02-ddft/04-echo.md similarity index 100% rename from markdown/chapters/ddft/echo.md rename to markdown/chapters/02-ddft/04-echo.md diff --git a/markdown/chapters/ddft/pass-the-turn.md b/markdown/chapters/02-ddft/05-pass-the-turn.md similarity index 100% rename from markdown/chapters/ddft/pass-the-turn.md rename to markdown/chapters/02-ddft/05-pass-the-turn.md diff --git a/markdown/chapters/ddft/uncommon-piles.md b/markdown/chapters/02-ddft/06-uncommon-piles.md similarity index 100% rename from markdown/chapters/ddft/uncommon-piles.md rename to markdown/chapters/02-ddft/06-uncommon-piles.md diff --git a/markdown/chapters/ddft/winning-without-dd.md b/markdown/chapters/02-ddft/07-winning-without-dd.md similarity index 100% rename from markdown/chapters/ddft/winning-without-dd.md rename to markdown/chapters/02-ddft/07-winning-without-dd.md diff --git a/markdown/chapters/ddeft/basics.md b/markdown/chapters/03-ddeft/basics.md similarity index 99% rename from markdown/chapters/ddeft/basics.md rename to markdown/chapters/03-ddeft/basics.md index 957e1e9d..097faa66 100644 --- a/markdown/chapters/ddeft/basics.md +++ b/markdown/chapters/03-ddeft/basics.md @@ -1,7 +1,6 @@ --- authors: UnOrthodoxBird banner: EF -order: 0 title: The Basics --- diff --git a/markdown/chapters/entombsday/basics.md b/markdown/chapters/04-entombsday/01-basics.md similarity index 99% rename from markdown/chapters/entombsday/basics.md rename to markdown/chapters/04-entombsday/01-basics.md index 9ae25b5d..2a362427 100644 --- a/markdown/chapters/entombsday/basics.md +++ b/markdown/chapters/04-entombsday/01-basics.md @@ -1,7 +1,6 @@ --- authors: drynne banner: Dark Petition -order: 0 title: The Basics --- diff --git a/markdown/chapters/entombsday/gameplay.md b/markdown/chapters/04-entombsday/02-gameplay.md similarity index 99% rename from markdown/chapters/entombsday/gameplay.md rename to markdown/chapters/04-entombsday/02-gameplay.md index da215cf5..398f2d11 100644 --- a/markdown/chapters/entombsday/gameplay.md +++ b/markdown/chapters/04-entombsday/02-gameplay.md @@ -1,7 +1,6 @@ --- authors: drynne banner: Entomb -order: 1 title: Playing the Deck --- diff --git a/markdown/chapters/entombsday/deck-construction.md b/markdown/chapters/04-entombsday/03-deck-construction.md similarity index 99% rename from markdown/chapters/entombsday/deck-construction.md rename to markdown/chapters/04-entombsday/03-deck-construction.md index ba1b1cbf..75863682 100644 --- a/markdown/chapters/entombsday/deck-construction.md +++ b/markdown/chapters/04-entombsday/03-deck-construction.md @@ -1,7 +1,6 @@ --- authors: drynne banner: Em -order: 2 title: Deck Construction --- diff --git a/markdown/chapters/entombsday/interaction.md b/markdown/chapters/04-entombsday/04-interaction.md similarity index 99% rename from markdown/chapters/entombsday/interaction.md rename to markdown/chapters/04-entombsday/04-interaction.md index 773f2a64..73c57ec1 100644 --- a/markdown/chapters/entombsday/interaction.md +++ b/markdown/chapters/04-entombsday/04-interaction.md @@ -1,7 +1,6 @@ --- authors: drynne banner: SE -order: 3 title: Playing Around Interaction --- diff --git a/markdown/partials/license.md b/markdown/partials/license.md index 76bebd27..3694c9c5 100644 --- a/markdown/partials/license.md +++ b/markdown/partials/license.md @@ -5,10 +5,10 @@ title: Licenses and Resources The Wiki is unofficial _Magic: the Gathering_ fan content permitted under the [Fan Content Policy][wizards:fcp]. Portions of the materials used such as mana symbols and game mechanics are property of _Wizards of the Coast_. Card arts are -made available from unaltered [Scryfall's API][scryfall:api] and are copyright -_Wizard of the Coast_ or their respective artist for older sets. For cropped -arts where the artist line of a card is not visible, the artists are mentioned -in the accessible text. +made available from the unaltered [Scryfall's API][scryfall:api] and are +copyright _Wizard of the Coast_ or their respective artists for older sets. For +cropped arts where the artist line of a card is not visible, the artists are +mentioned in the accessible text. Mana symbols are rendered using the _Mana_ icon font made available by [Andrew Gioia][mana]. See their section about licensing for more details. diff --git a/next-env.d.ts b/next-env.d.ts index 4f11a03d..a4a7b3f5 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. diff --git a/package.json b/package.json index 3b3aa528..cd2c5856 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,9 @@ "dev": "concurrently 'pnpm:dev:*' --names --prefix-colors auto", "dev:next": "next dev", "dev:scryfall": "pnpm run scryfall:dev", - "lint": "pnpm run '/^lint:\\w+$/'", + "lint": "pnpm run '/^lint:[^:]+$/'", "lint:code": "eslint", - "lint:format": "pnpm run '/^lint:format:\\w+$/'", + "lint:format": "pnpm run '/^lint:format:[^:]+$/'", "lint:format:code": "prettier --check --log-level warn puzzles/ scryfall/ src/", "lint:format:wiki": "prettier --check --log-level warn markdown/", "lint:prune": "knip", @@ -28,60 +28,60 @@ "test:watch": "pnpm run test --verbose --watchAll" }, "dependencies": { - "@emotion/react": "11.13.0", + "@emotion/react": "11.13.3", "@emotion/styled": "11.13.0", - "@fontsource/libre-baskerville": "5.0.13", - "@korumite/kiwi": "2.13.0", + "@fontsource/libre-baskerville": "5.1.0", + "@korumite/kiwi": "3.1.0", "@mdi/js": "7.4.47", "@mdi/react": "1.6.1", - "@mui/material": "5.16.6", - "@mui/system": "5.16.6", - "@mui/utils": "5.16.6", + "@mui/material": "6.1.1", + "@mui/system": "6.1.1", + "@mui/utils": "6.1.1", "@vercel/analytics": "1.3.1", "async-sema": "3.1.1", "mana-font": "1.15.9", "mdast-util-find-and-replace": "3.0.1", - "next": "14.2.5", + "next": "14.2.13", "plaiceholder": "3.0.0", "react": "18.3.1", "react-dom": "18.3.1", - "react-intersection-observer": "9.13.0", + "react-intersection-observer": "9.13.1", "react-markdown": "9.0.1", "react-syntax-highlighter": "15.5.0", "rehype-slug": "6.0.0", "remark-directive": "3.0.0", "remark-gfm": "4.0.0", "remark-toc": "9.0.0", - "simple-icons": "13.3.0", + "simple-icons": "13.11.0", "unified": "11.0.4", "unist-util-select": "5.1.0", "unist-util-visit": "5.0.0", "zod": "3.23.8" }, "devDependencies": { - "@eslint/js": "9.8.0", + "@eslint/js": "9.11.1", "@ianvs/prettier-plugin-sort-imports": "4.3.1", "@korumite/ts": "1.1.0", - "@testing-library/jest-dom": "6.4.8", - "@testing-library/react": "16.0.0", - "@types/jest": "29.5.12", + "@testing-library/jest-dom": "6.5.0", + "@testing-library/react": "16.0.1", + "@types/jest": "29.5.13", "@types/mdast": "4.0.4", - "@types/node": "20.14.13", - "@types/react": "18.3.3", + "@types/node": "20.16.9", + "@types/react": "18.3.10", "@types/react-dom": "18.3.0", "@types/react-syntax-highlighter": "15.5.13", - "@types/unist": "3.0.2", - "concurrently": "8.2.2", - "eslint": "9.8.0", - "eslint-plugin-import": "2.29.1", + "@types/unist": "3.0.3", + "concurrently": "9.0.1", + "eslint": "9.11.1", + "eslint-plugin-import": "2.30.0", "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", - "knip": "5.27.0", - "markdownlint-cli": "0.41.0", + "knip": "5.30.6", + "markdownlint-cli": "0.42.0", "mdast-util-directive": "3.0.0", "prettier": "3.3.3", "ts-node": "10.9.2", - "typescript": "5.5.4", - "typescript-eslint": "7.18.0" + "typescript": "5.6.2", + "typescript-eslint": "8.7.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5cdce4c5..746c2fcd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,17 +9,17 @@ importers: .: dependencies: '@emotion/react': - specifier: 11.13.0 - version: 11.13.0(@types/react@18.3.3)(react@18.3.1) + specifier: 11.13.3 + version: 11.13.3(@types/react@18.3.10)(react@18.3.1) '@emotion/styled': specifier: 11.13.0 - version: 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1) '@fontsource/libre-baskerville': - specifier: 5.0.13 - version: 5.0.13 + specifier: 5.1.0 + version: 5.1.0 '@korumite/kiwi': - specifier: 2.13.0 - version: 2.13.0 + specifier: 3.1.0 + version: 3.1.0 '@mdi/js': specifier: 7.4.47 version: 7.4.47 @@ -27,17 +27,17 @@ importers: specifier: 1.6.1 version: 1.6.1 '@mui/material': - specifier: 5.16.6 - version: 5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 6.1.1 + version: 6.1.1(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': - specifier: 5.16.6 - version: 5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + specifier: 6.1.1 + version: 6.1.1(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1) '@mui/utils': - specifier: 5.16.6 - version: 5.16.6(@types/react@18.3.3)(react@18.3.1) + specifier: 6.1.1 + version: 6.1.1(@types/react@18.3.10)(react@18.3.1) '@vercel/analytics': specifier: 1.3.1 - version: 1.3.1(next@14.2.5(@babel/core@7.24.6)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 1.3.1(next@14.2.13(@babel/core@7.24.6)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) async-sema: specifier: 3.1.1 version: 3.1.1 @@ -48,11 +48,11 @@ importers: specifier: 3.0.1 version: 3.0.1 next: - specifier: 14.2.5 - version: 14.2.5(@babel/core@7.24.6)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 14.2.13 + version: 14.2.13(@babel/core@7.24.6)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) plaiceholder: specifier: 3.0.0 - version: 3.0.0(sharp@0.33.4) + version: 3.0.0(sharp@0.33.5) react: specifier: 18.3.1 version: 18.3.1 @@ -60,11 +60,11 @@ importers: specifier: 18.3.1 version: 18.3.1(react@18.3.1) react-intersection-observer: - specifier: 9.13.0 - version: 9.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 9.13.1 + version: 9.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-markdown: specifier: 9.0.1 - version: 9.0.1(@types/react@18.3.3)(react@18.3.1) + version: 9.0.1(@types/react@18.3.10)(react@18.3.1) react-syntax-highlighter: specifier: 15.5.0 version: 15.5.0(react@18.3.1) @@ -81,8 +81,8 @@ importers: specifier: 9.0.0 version: 9.0.0 simple-icons: - specifier: 13.3.0 - version: 13.3.0 + specifier: 13.11.0 + version: 13.11.0 unified: specifier: 11.0.4 version: 11.0.4 @@ -97,8 +97,8 @@ importers: version: 3.23.8 devDependencies: '@eslint/js': - specifier: 9.8.0 - version: 9.8.0 + specifier: 9.11.1 + version: 9.11.1 '@ianvs/prettier-plugin-sort-imports': specifier: 4.3.1 version: 4.3.1(prettier@3.3.3) @@ -106,23 +106,23 @@ importers: specifier: 1.1.0 version: 1.1.0 '@testing-library/jest-dom': - specifier: 6.4.8 - version: 6.4.8 + specifier: 6.5.0 + version: 6.5.0 '@testing-library/react': - specifier: 16.0.0 - version: 16.0.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 16.0.1 + version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/jest': - specifier: 29.5.12 - version: 29.5.12 + specifier: 29.5.13 + version: 29.5.13 '@types/mdast': specifier: 4.0.4 version: 4.0.4 '@types/node': - specifier: 20.14.13 - version: 20.14.13 + specifier: 20.16.9 + version: 20.16.9 '@types/react': - specifier: 18.3.3 - version: 18.3.3 + specifier: 18.3.10 + version: 18.3.10 '@types/react-dom': specifier: 18.3.0 version: 18.3.0 @@ -130,29 +130,29 @@ importers: specifier: 15.5.13 version: 15.5.13 '@types/unist': - specifier: 3.0.2 - version: 3.0.2 + specifier: 3.0.3 + version: 3.0.3 concurrently: - specifier: 8.2.2 - version: 8.2.2 + specifier: 9.0.1 + version: 9.0.1 eslint: - specifier: 9.8.0 - version: 9.8.0 + specifier: 9.11.1 + version: 9.11.1(jiti@2.0.0) eslint-plugin-import: - specifier: 2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0) + specifier: 2.30.0 + version: 2.30.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2))(eslint@9.11.1(jiti@2.0.0)) jest: specifier: 29.7.0 - version: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) + version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) jest-environment-jsdom: specifier: 29.7.0 version: 29.7.0 knip: - specifier: 5.27.0 - version: 5.27.0(@types/node@20.14.13)(typescript@5.5.4) + specifier: 5.30.6 + version: 5.30.6(@types/node@20.16.9)(typescript@5.6.2) markdownlint-cli: - specifier: 0.41.0 - version: 0.41.0 + specifier: 0.42.0 + version: 0.42.0 mdast-util-directive: specifier: 3.0.0 version: 3.0.0 @@ -161,13 +161,13 @@ importers: version: 3.3.3 ts-node: specifier: 10.9.2 - version: 10.9.2(@types/node@20.14.13)(typescript@5.5.4) + version: 10.9.2(@types/node@20.16.9)(typescript@5.6.2) typescript: - specifier: 5.5.4 - version: 5.5.4 + specifier: 5.6.2 + version: 5.6.2 typescript-eslint: - specifier: 7.18.0 - version: 7.18.0(eslint@9.8.0)(typescript@5.5.4) + specifier: 8.7.0 + version: 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) packages: @@ -397,6 +397,10 @@ packages: resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.25.6': + resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} + engines: {node: '>=6.9.0'} + '@babel/template@7.24.6': resolution: {integrity: sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==} engines: {node: '>=6.9.0'} @@ -446,8 +450,8 @@ packages: '@emotion/memoize@0.9.0': resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} - '@emotion/react@11.13.0': - resolution: {integrity: sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==} + '@emotion/react@11.13.3': + resolution: {integrity: sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==} peerDependencies: '@types/react': '*' react: '>=16.8.0' @@ -458,6 +462,9 @@ packages: '@emotion/serialize@1.3.0': resolution: {integrity: sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==} + '@emotion/serialize@1.3.2': + resolution: {integrity: sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==} + '@emotion/sheet@1.4.0': resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} @@ -471,6 +478,9 @@ packages: '@types/react': optional: true + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + '@emotion/unitless@0.9.0': resolution: {integrity: sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ==} @@ -482,6 +492,9 @@ packages: '@emotion/utils@1.4.0': resolution: {integrity: sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==} + '@emotion/utils@1.4.1': + resolution: {integrity: sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==} + '@emotion/weak-memoize@0.4.0': resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} @@ -491,28 +504,36 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.11.0': - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + '@eslint-community/regexpp@4.11.1': + resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.17.1': - resolution: {integrity: sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==} + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.6.0': + resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.1.0': resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.8.0': - resolution: {integrity: sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA==} + '@eslint/js@9.11.1': + resolution: {integrity: sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@fontsource/libre-baskerville@5.0.13': - resolution: {integrity: sha512-4RmjVL+W0Y0HbPz2jVXykFXpeu+NnE2xplGNcLEGSMkjSWM5fHH6tu3Vmzskfjp9j47/EQVfuQ0uIDEFmUd6iA==} + '@eslint/plugin-kit@0.2.0': + resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@fontsource/libre-baskerville@5.1.0': + resolution: {integrity: sha512-+NWyl39FNbrJDQixcJJAnnGMWBJZWtnLWjH2OLp+0VnHdsuVH2jnBPIqID0xschDYC497oKtQiVy0s0UUjb5/g==} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} @@ -531,116 +552,108 @@ packages: '@vue/compiler-sfc': optional: true - '@img/sharp-darwin-arm64@0.33.4': - resolution: {integrity: sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.33.4': - resolution: {integrity: sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.0.2': - resolution: {integrity: sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==} - engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.0.2': - resolution: {integrity: sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==} - engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.0.2': - resolution: {integrity: sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==} - engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.0.2': - resolution: {integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==} - engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-s390x@1.0.2': - resolution: {integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==} - engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.0.2': - resolution: {integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==} - engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.0.2': - resolution: {integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==} - engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.0.2': - resolution: {integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==} - engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.33.4': - resolution: {integrity: sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.33.4': - resolution: {integrity: sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==} - engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.33.4': - resolution: {integrity: sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==} - engines: {glibc: '>=2.31', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.33.4': - resolution: {integrity: sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.33.4': - resolution: {integrity: sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==} - engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.33.4': - resolution: {integrity: sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==} - engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.33.4': - resolution: {integrity: sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-ia32@0.33.4': - resolution: {integrity: sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.33.4': - resolution: {integrity: sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -743,8 +756,8 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@korumite/kiwi@2.13.0': - resolution: {integrity: sha512-uOLjZDR/N2t9RJh0HIJauJmgaJ3IfZyuSIJ9/2UQ18LKOhRhNmEllKPN/jNubXg1RJ8vrA6BF3e7HYeJc8cFuA==} + '@korumite/kiwi@3.1.0': + resolution: {integrity: sha512-jol7S2qHaa/Gn+rOvtXmlatfgiCkZkREhF/jZ0Tx4sz5pPPclSd+Eoowb46prvor9rdO/9Pm/rh99YBHg6RkWQ==} '@korumite/ts@1.1.0': resolution: {integrity: sha512-qLSpsUXfuo7rkmx0bYtdCkt4jG9XaCzMVjATPEE2l39mSN4p1ncWMlejWottaDS/+JQaigmHEed+MujbuxjZDw==} @@ -755,57 +768,60 @@ packages: '@mdi/react@1.6.1': resolution: {integrity: sha512-4qZeDcluDFGFTWkHs86VOlHkm6gnKaMql13/gpIcUQ8kzxHgpj31NuCkD8abECVfbULJ3shc7Yt4HJ6Wu6SN4w==} - '@mui/core-downloads-tracker@5.16.6': - resolution: {integrity: sha512-kytg6LheUG42V8H/o/Ptz3olSO5kUXW9zF0ox18VnblX6bO2yif1FPItgc3ey1t5ansb1+gbe7SatntqusQupg==} + '@mui/core-downloads-tracker@6.1.1': + resolution: {integrity: sha512-VdQC1tPIIcZAnf62L2M1eQif0x2vlKg3YK4kGYbtijSH4niEgI21GnstykW1vQIs+Bc6L+Hua2GATYVjilJ22A==} - '@mui/material@5.16.6': - resolution: {integrity: sha512-0LUIKBOIjiFfzzFNxXZBRAyr9UQfmTAFzbt6ziOU2FDXhorNN2o3N9/32mNJbCA8zJo2FqFU6d3dtoqUDyIEfA==} - engines: {node: '>=12.0.0'} + '@mui/material@6.1.1': + resolution: {integrity: sha512-b+eULldTqtqTCbN++2BtBWCir/1LwEYw+2mIlOt2GiEUh1EBBw4/wIukGKKNt3xrCZqRA80yLLkV6tF61Lq3cA==} + engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 + '@mui/material-pigment-css': ^6.1.1 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@emotion/react': optional: true '@emotion/styled': optional: true + '@mui/material-pigment-css': + optional: true '@types/react': optional: true - '@mui/private-theming@5.16.6': - resolution: {integrity: sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==} - engines: {node: '>=12.0.0'} + '@mui/private-theming@6.1.1': + resolution: {integrity: sha512-JlrjIdhyZUtewtdAuUsvi3ZnO0YS49IW4Mfz19ZWTlQ0sDGga6LNPVwHClWr2/zJK2we2BQx9/i8M32rgKuzrg==} + engines: {node: '>=14.0.0'} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true - '@mui/styled-engine@5.16.6': - resolution: {integrity: sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==} - engines: {node: '>=12.0.0'} + '@mui/styled-engine@6.1.1': + resolution: {integrity: sha512-HJyIoMpFb11fnHuRtUILOXgq6vj4LhIlE8maG4SwP/W+E5sa7HFexhnB3vOMT7bKys4UKNxhobC8jwWxYilGsA==} + engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.4.1 '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@emotion/react': optional: true '@emotion/styled': optional: true - '@mui/system@5.16.6': - resolution: {integrity: sha512-5xgyJjBIMPw8HIaZpfbGAaFYPwImQn7Nyh+wwKWhvkoIeDosQ1ZMVrbTclefi7G8hNmqhip04duYwYpbBFnBgw==} - engines: {node: '>=12.0.0'} + '@mui/system@6.1.1': + resolution: {integrity: sha512-PaYsCz2tUOcpu3T0okDEsSuP/yCDIj9JZ4Tox1JovRSKIjltHpXPsXZSGr3RiWdtM1MTQMFMCZzu0+CKbyy+Kw==} + engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@emotion/react': optional: true @@ -814,77 +830,77 @@ packages: '@types/react': optional: true - '@mui/types@7.2.15': - resolution: {integrity: sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==} + '@mui/types@7.2.17': + resolution: {integrity: sha512-oyumoJgB6jDV8JFzRqjBo2daUuHpzDjoO/e3IrRhhHo/FxJlaVhET6mcNrKHUq2E+R+q3ql0qAtvQ4rfWHhAeQ==} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true - '@mui/utils@5.16.6': - resolution: {integrity: sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==} - engines: {node: '>=12.0.0'} + '@mui/utils@6.1.1': + resolution: {integrity: sha512-HlRrgdJSPbYDXPpoVMWZV8AE7WcFtAk13rWNWAEVWKSanzBBkymjz3km+Th/Srowsh4pf1fTSP1B0L116wQBYw==} + engines: {node: '>=14.0.0'} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true - '@next/env@14.2.5': - resolution: {integrity: sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==} + '@next/env@14.2.13': + resolution: {integrity: sha512-s3lh6K8cbW1h5Nga7NNeXrbe0+2jIIYK9YaA9T7IufDWnZpozdFUp6Hf0d5rNWUKu4fEuSX2rCKlGjCrtylfDw==} - '@next/swc-darwin-arm64@14.2.5': - resolution: {integrity: sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==} + '@next/swc-darwin-arm64@14.2.13': + resolution: {integrity: sha512-IkAmQEa2Htq+wHACBxOsslt+jMoV3msvxCn0WFSfJSkv/scy+i/EukBKNad36grRxywaXUYJc9mxEGkeIs8Bzg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.5': - resolution: {integrity: sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==} + '@next/swc-darwin-x64@14.2.13': + resolution: {integrity: sha512-Dv1RBGs2TTjkwEnFMVL5XIfJEavnLqqwYSD6LXgTPdEy/u6FlSrLBSSfe1pcfqhFEXRAgVL3Wpjibe5wXJzWog==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.5': - resolution: {integrity: sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==} + '@next/swc-linux-arm64-gnu@14.2.13': + resolution: {integrity: sha512-yB1tYEFFqo4ZNWkwrJultbsw7NPAAxlPXURXioRl9SdW6aIefOLS+0TEsKrWBtbJ9moTDgU3HRILL6QBQnMevg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@14.2.5': - resolution: {integrity: sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==} + '@next/swc-linux-arm64-musl@14.2.13': + resolution: {integrity: sha512-v5jZ/FV/eHGoWhMKYrsAweQ7CWb8xsWGM/8m1mwwZQ/sutJjoFaXchwK4pX8NqwImILEvQmZWyb8pPTcP7htWg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@14.2.5': - resolution: {integrity: sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==} + '@next/swc-linux-x64-gnu@14.2.13': + resolution: {integrity: sha512-aVc7m4YL7ViiRv7SOXK3RplXzOEe/qQzRA5R2vpXboHABs3w8vtFslGTz+5tKiQzWUmTmBNVW0UQdhkKRORmGA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@14.2.5': - resolution: {integrity: sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==} + '@next/swc-linux-x64-musl@14.2.13': + resolution: {integrity: sha512-4wWY7/OsSaJOOKvMsu1Teylku7vKyTuocvDLTZQq0TYv9OjiYYWt63PiE1nTuZnqQ4RPvME7Xai+9enoiN0Wrg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@14.2.5': - resolution: {integrity: sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==} + '@next/swc-win32-arm64-msvc@14.2.13': + resolution: {integrity: sha512-uP1XkqCqV2NVH9+g2sC7qIw+w2tRbcMiXFEbMihkQ8B1+V6m28sshBwAB0SDmOe0u44ne1vFU66+gx/28RsBVQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.5': - resolution: {integrity: sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==} + '@next/swc-win32-ia32-msvc@14.2.13': + resolution: {integrity: sha512-V26ezyjPqQpDBV4lcWIh8B/QICQ4v+M5Bo9ykLN+sqeKKBxJVDpEc6biDVyluTXTC40f5IqCU0ttth7Es2ZuMw==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@next/swc-win32-x64-msvc@14.2.5': - resolution: {integrity: sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==} + '@next/swc-win32-x64-msvc@14.2.13': + resolution: {integrity: sha512-WwzOEAFBGhlDHE5Z73mNU8CO8mqMNLqaG+AO9ETmzdCQlJhVtWZnOl2+rqgVQS+YHunjOWptdFmNfbpwcUuEsw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -901,13 +917,12 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -932,12 +947,12 @@ packages: resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} - '@testing-library/jest-dom@6.4.8': - resolution: {integrity: sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw==} + '@testing-library/jest-dom@6.5.0': + resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@testing-library/react@16.0.0': - resolution: {integrity: sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==} + '@testing-library/react@16.0.1': + resolution: {integrity: sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==} engines: {node: '>=18'} peerDependencies: '@testing-library/dom': ^10.0.0 @@ -991,6 +1006,9 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -1009,12 +1027,15 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/jest@29.5.12': - resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + '@types/jest@29.5.13': + resolution: {integrity: sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==} '@types/jsdom@20.0.1': resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -1024,14 +1045,14 @@ packages: '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/node@20.14.13': - resolution: {integrity: sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w==} + '@types/node@20.16.9': + resolution: {integrity: sha512-rkvIVJxsOfBejxK7I0FO5sa2WxFmJCzoDwcd88+fq/CUfynNywTo/1/T6hyFz22CyztsnLS9nVlHOnTI36RH5w==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - '@types/prop-types@15.7.12': - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + '@types/prop-types@15.7.13': + resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} '@types/react-dom@18.3.0': resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} @@ -1039,11 +1060,11 @@ packages: '@types/react-syntax-highlighter@15.5.13': resolution: {integrity: sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==} - '@types/react-transition-group@4.4.10': - resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} + '@types/react-transition-group@4.4.11': + resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} - '@types/react@18.3.3': - resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + '@types/react@18.3.10': + resolution: {integrity: sha512-02sAAlBnP39JgXwkAq3PeU9DVaaGpZyF3MGcC0MKgQVkZor5IiiDAipVaxQHtDJAmO4GIy/rVBy/LzVj76Cyqg==} '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -1054,11 +1075,11 @@ packages: '@types/ungap__structured-clone@1.2.0': resolution: {integrity: sha512-ZoaihZNLeZSxESbk9PUAPZOlSpcKx81I1+4emtULDVmBLkYutTcMlCj2K9VNlf9EWODxdO6gkAqEaLorXwZQVA==} - '@types/unist@2.0.10': - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - '@types/unist@3.0.2': - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -1066,63 +1087,62 @@ packages: '@types/yargs@17.0.32': resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} - '@typescript-eslint/eslint-plugin@7.18.0': - resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/eslint-plugin@8.7.0': + resolution: {integrity: sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/parser@7.18.0': - resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/parser@8.7.0': + resolution: {integrity: sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/scope-manager@7.18.0': - resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@8.7.0': + resolution: {integrity: sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@7.18.0': - resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/type-utils@8.7.0': + resolution: {integrity: sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/types@7.18.0': - resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/types@8.7.0': + resolution: {integrity: sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@7.18.0': - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/typescript-estree@8.7.0': + resolution: {integrity: sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/utils@7.18.0': - resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/utils@8.7.0': + resolution: {integrity: sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@7.18.0': - resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@8.7.0': + resolution: {integrity: sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -1183,8 +1203,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} ansi-styles@3.2.1: @@ -1219,6 +1239,10 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} @@ -1227,10 +1251,6 @@ packages: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - array.prototype.findlastindex@1.2.5: resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} @@ -1347,6 +1367,9 @@ packages: caniuse-lite@1.0.30001643: resolution: {integrity: sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==} + caniuse-lite@1.0.30001664: + resolution: {integrity: sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1461,9 +1484,9 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concurrently@8.2.2: - resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} - engines: {node: ^14.13.0 || >=16.0.0} + concurrently@9.0.1: + resolution: {integrity: sha512-wYKvCd/f54sTXJMSfV6Ln/B8UrfLBKOYa+lzc6CHay3Qek+LorVSBdMVfyewFhRbH0Rbabsk4D+3PL/VjQ5gzg==} + engines: {node: '>=18'} hasBin: true convert-source-map@1.9.0: @@ -1523,10 +1546,6 @@ packages: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -1553,6 +1572,15 @@ packages: supports-color: optional: true + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} @@ -1616,10 +1644,6 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -1660,6 +1684,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1722,8 +1750,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + eslint-module-utils@2.11.1: + resolution: {integrity: sha512-EwcbfLOhwVMAfatfqLecR2yv3dE5+kQ8kx+Rrt0DvDXEVwW86KQ/xbMDQhtp5l42VXukD5SOF8mQQHbaNtO0CQ==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -1743,8 +1771,8 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + eslint-plugin-import@2.30.0: + resolution: {integrity: sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -1765,10 +1793,15 @@ packages: resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.8.0: - resolution: {integrity: sha512-K8qnZ/QJzT2dLKdZJVX6W4XOwBzutMYmt0lqUS+JdXgd+HTYFlonFgkJ8s44d/zMPPCnOOk0kMWCApCPhiOy9A==} + eslint@9.11.1: + resolution: {integrity: sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true espree@10.1.0: resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} @@ -1867,8 +1900,8 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - foreground-child@3.2.1: - resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} form-data@4.0.0: @@ -1936,8 +1969,9 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + glob@11.0.0: + resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + engines: {node: 20 || >=22} hasBin: true glob@7.2.3: @@ -1956,10 +1990,6 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} @@ -2049,8 +2079,12 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@6.0.2: + resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==} engines: {node: '>= 4'} import-fresh@3.3.0: @@ -2124,6 +2158,10 @@ packages: is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + is-data-view@1.0.1: resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} engines: {node: '>= 0.4'} @@ -2240,8 +2278,9 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@4.0.2: + resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} + engines: {node: 20 || >=22} jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} @@ -2385,6 +2424,10 @@ packages: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true + jiti@2.0.0: + resolution: {integrity: sha512-CJ7e7Abb779OTRv3lomfp7Mns/Sy1+U4pcAx5VbjxCZD5ZM/VJaXPpPjNKjtSvWQy/H86E49REXR34dl1JEz9w==} + hasBin: true + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2431,8 +2474,8 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} @@ -2445,8 +2488,8 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - knip@5.27.0: - resolution: {integrity: sha512-W8+jhO7i5pXRUqOzhJGm2DT5/d9aQjyrYTCSojqJxFOvi7ku/nHKzpBO3WNf4eflJo0t3zitmUkM69g53qoZQw==} + knip@5.30.6: + resolution: {integrity: sha512-YkcnRVl0N99xZ7eaXE7KlH/4cPTCn6BGuk9KxINEdCMFN3yita2vGBizApy97ZOHgghy8tb589gQ3xvLMFIO4w==} engines: {node: '>=18.6.0'} hasBin: true peerDependencies: @@ -2491,8 +2534,9 @@ packages: lowlight@1.20.0: resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.0.1: + resolution: {integrity: sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==} + engines: {node: 20 || >=22} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -2521,17 +2565,17 @@ packages: markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - markdownlint-cli@0.41.0: - resolution: {integrity: sha512-kp29tKrMKdn+xonfefjp3a/MsNzAd9c5ke0ydMEI9PR98bOjzglYN4nfMSaIs69msUf1DNkgevAIAPtK2SeX0Q==} + markdownlint-cli@0.42.0: + resolution: {integrity: sha512-AjkzhhZa3TmEGi/CE2Wpmny69x1IrzqK2gPB0k8SmNMRgnSAJfyEO5FgZdWTHtJ6Nrdv5FWt5c4C5pkG6Dk30A==} engines: {node: '>=18'} hasBin: true - markdownlint-micromark@0.1.9: - resolution: {integrity: sha512-5hVs/DzAFa8XqYosbEAEg6ok6MF2smDj89ztn9pKkCtdKHVdPQuGMH7frFfYL9mLkvfFe4pTyAMffLbjf3/EyA==} + markdownlint-micromark@0.1.10: + resolution: {integrity: sha512-no5ZfdqAdWGxftCLlySHSgddEjyW4kui4z7amQcGsSKfYC5v/ou+8mIQVyg9KQMeEZLNtz9OPDTj7nnTnoR4FQ==} engines: {node: '>=18'} - markdownlint@0.34.0: - resolution: {integrity: sha512-qwGyuyKwjkEMOJ10XN6OTKNOVYvOIi35RNvDLNxTof5s8UmyGHlCdpngRHoRGNvQVGuxO3BJ7uNSgdeX166WXw==} + markdownlint@0.35.0: + resolution: {integrity: sha512-wgp8yesWjFBL7bycA3hxwHRdsZGJhjhyP1dSxKVKrza0EPFYtn+mHtkVy6dvP1kGSjovyG5B8yNP6Frj0UFUJg==} engines: {node: '>=18'} mdast-util-directive@3.0.0: @@ -2714,6 +2758,10 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -2742,8 +2790,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - next@14.2.5: - resolution: {integrity: sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==} + next@14.2.13: + resolution: {integrity: sha512-BseY9YNw8QJSwLYD7hlZzl6QVDoSFHL/URN5K64kVEVpCsSOWeyjbIGK+dZUaRViHTaMQX8aqmnn0PHBbGZezg==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -2787,8 +2835,9 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} @@ -2884,9 +2933,9 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -2895,6 +2944,9 @@ packages: picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -2991,8 +3043,8 @@ packages: peerDependencies: react: ^18.3.1 - react-intersection-observer@9.13.0: - resolution: {integrity: sha512-y0UvBfjDiXqC8h0EWccyaj4dVBWMxgEx0t5RGNzQsvkfvZwugnKwxpu70StY4ivzYuMajavwUDjH4LJyIki9Lw==} + react-intersection-observer@9.13.1: + resolution: {integrity: sha512-tSzDaTy0qwNPLJHg8XZhlyHTgGW6drFKTtvjdL+p6um12rcnp8Z5XstE+QNBJ7c64n5o0Lj4ilUleA41bmDoMw==} peerDependencies: react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -3158,9 +3210,9 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} - sharp@0.33.4: - resolution: {integrity: sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==} - engines: {libvips: '>=8.15.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -3184,8 +3236,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-icons@13.3.0: - resolution: {integrity: sha512-Ls7JP+S0Gg4ZDEb07R9URp7Sk3d5UWY/dZm06jrbIezqIl0H4M780Cy49T3QTxZlFEXv/T8MNDRW5b45EJw9Bg==} + simple-icons@13.11.0: + resolution: {integrity: sha512-7MevuibJInmGRsq3PdLN/vpa+ifv/4/SoZQHpJ08aaB8/Ab17ZfZbm+j/K5PMwxkemSVZWpm4cqRlMXHDCEMww==} engines: {node: '>=0.12.18'} simple-swizzle@0.2.2: @@ -3198,16 +3250,12 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - smol-toml@1.2.2: - resolution: {integrity: sha512-fVEjX2ybKdJKzFL46VshQbj9PuA4IUKivalgp48/3zwS9vXzyykzQ6AX92UxHSvWJagziMRLeHMgEzoGO7A8hQ==} - engines: {node: '>= 18'} - smol-toml@1.3.0: resolution: {integrity: sha512-tWpi2TsODPScmi48b/OQZGi2lgUmBCHy6SZrhi/FdnnHiU1GwebbCfuQuxsC3nHaLwtYeJGPrDZDIeodDOc4pA==} engines: {node: '>= 18'} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} source-map-support@0.5.13: @@ -3227,9 +3275,6 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - spawn-command@0.0.2: - resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} - sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -3340,6 +3385,10 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -3399,11 +3448,8 @@ packages: tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -3433,18 +3479,17 @@ packages: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} - typescript-eslint@7.18.0: - resolution: {integrity: sha512-PonBkP603E3tt05lDkbOMyaxJjvKqQrXsnow72sVeOFINDE/qNmnnd+f9b4N+U7W6MXnnYyrhtmF2t08QWwUbA==} - engines: {node: ^18.18.0 || >=20.0.0} + typescript-eslint@8.7.0: + resolution: {integrity: sha512-nEHbEYJyHwsuf7c3V3RS7Saq+1+la3i0ieR3qP0yjqWSzVmh8Drp47uOl9LjbPANac4S7EFSqvcYIKXUUwIfIQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + typescript@5.6.2: + resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} engines: {node: '>=14.17'} hasBin: true @@ -3454,8 +3499,8 @@ packages: unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} unified@11.0.4: resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} @@ -3525,6 +3570,9 @@ packages: vfile@6.0.2: resolution: {integrity: sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==} + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + w3c-xmlserializer@4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} engines: {node: '>=14'} @@ -3616,8 +3664,8 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.5.0: - resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + yaml@2.5.1: + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} engines: {node: '>= 14'} hasBin: true @@ -3637,8 +3685,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod-validation-error@3.3.0: - resolution: {integrity: sha512-Syib9oumw1NTqEv4LT0e6U83Td9aVRk9iTXPUQr1otyV1PuXQKOvOwhMNqZIq5hluzHP2pMgnOmHEo7kPdI2mw==} + zod-validation-error@3.4.0: + resolution: {integrity: sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==} engines: {node: '>=18.0.0'} peerDependencies: zod: ^3.18.0 @@ -3922,6 +3970,10 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 + '@babel/runtime@7.25.6': + dependencies: + regenerator-runtime: 0.14.1 + '@babel/template@7.24.6': dependencies: '@babel/code-frame': 7.24.6 @@ -3981,7 +4033,7 @@ snapshots: '@emnapi/runtime@1.2.0': dependencies: - tslib: 2.6.3 + tslib: 2.7.0 optional: true '@emotion/babel-plugin@11.12.0': @@ -4016,19 +4068,19 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1)': + '@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 '@emotion/babel-plugin': 11.12.0 '@emotion/cache': 11.13.1 - '@emotion/serialize': 1.3.0 + '@emotion/serialize': 1.3.2 '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) - '@emotion/utils': 1.4.0 + '@emotion/utils': 1.4.1 '@emotion/weak-memoize': 0.4.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.10 transitivePeerDependencies: - supports-color @@ -4040,23 +4092,33 @@ snapshots: '@emotion/utils': 1.4.0 csstype: 3.1.3 + '@emotion/serialize@1.3.2': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.1 + csstype: 3.1.3 + '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': + '@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 '@emotion/babel-plugin': 11.12.0 '@emotion/is-prop-valid': 1.3.0 - '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) + '@emotion/react': 11.13.3(@types/react@18.3.10)(react@18.3.1) '@emotion/serialize': 1.3.0 '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) '@emotion/utils': 1.4.0 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.10 transitivePeerDependencies: - supports-color + '@emotion/unitless@0.10.0': {} + '@emotion/unitless@0.9.0': {} '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@18.3.1)': @@ -4065,30 +4127,34 @@ snapshots: '@emotion/utils@1.4.0': {} + '@emotion/utils@1.4.1': {} + '@emotion/weak-memoize@0.4.0': {} - '@eslint-community/eslint-utils@4.4.0(eslint@9.8.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@9.11.1(jiti@2.0.0))': dependencies: - eslint: 9.8.0 + eslint: 9.11.1(jiti@2.0.0) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.11.0': {} + '@eslint-community/regexpp@4.11.1': {} - '@eslint/config-array@0.17.1': + '@eslint/config-array@0.18.0': dependencies: '@eslint/object-schema': 2.1.4 - debug: 4.3.6 + debug: 4.3.7 minimatch: 3.1.2 transitivePeerDependencies: - supports-color + '@eslint/core@0.6.0': {} + '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.6 + debug: 4.3.7 espree: 10.1.0 globals: 14.0.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -4096,11 +4162,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.8.0': {} + '@eslint/js@9.11.1': {} '@eslint/object-schema@2.1.4': {} - '@fontsource/libre-baskerville@5.0.13': {} + '@eslint/plugin-kit@0.2.0': + dependencies: + levn: 0.4.1 + + '@fontsource/libre-baskerville@5.1.0': {} '@humanwhocodes/module-importer@1.0.1': {} @@ -4118,79 +4188,79 @@ snapshots: transitivePeerDependencies: - supports-color - '@img/sharp-darwin-arm64@0.33.4': + '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.2 + '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true - '@img/sharp-darwin-x64@0.33.4': + '@img/sharp-darwin-x64@0.33.5': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.2 + '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true - '@img/sharp-libvips-darwin-arm64@1.0.2': + '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true - '@img/sharp-libvips-darwin-x64@1.0.2': + '@img/sharp-libvips-darwin-x64@1.0.4': optional: true - '@img/sharp-libvips-linux-arm64@1.0.2': + '@img/sharp-libvips-linux-arm64@1.0.4': optional: true - '@img/sharp-libvips-linux-arm@1.0.2': + '@img/sharp-libvips-linux-arm@1.0.5': optional: true - '@img/sharp-libvips-linux-s390x@1.0.2': + '@img/sharp-libvips-linux-s390x@1.0.4': optional: true - '@img/sharp-libvips-linux-x64@1.0.2': + '@img/sharp-libvips-linux-x64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.0.2': + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.0.2': + '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true - '@img/sharp-linux-arm64@0.33.4': + '@img/sharp-linux-arm64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.2 + '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true - '@img/sharp-linux-arm@0.33.4': + '@img/sharp-linux-arm@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.2 + '@img/sharp-libvips-linux-arm': 1.0.5 optional: true - '@img/sharp-linux-s390x@0.33.4': + '@img/sharp-linux-s390x@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.2 + '@img/sharp-libvips-linux-s390x': 1.0.4 optional: true - '@img/sharp-linux-x64@0.33.4': + '@img/sharp-linux-x64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.2 + '@img/sharp-libvips-linux-x64': 1.0.4 optional: true - '@img/sharp-linuxmusl-arm64@0.33.4': + '@img/sharp-linuxmusl-arm64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true - '@img/sharp-linuxmusl-x64@0.33.4': + '@img/sharp-linuxmusl-x64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true - '@img/sharp-wasm32@0.33.4': + '@img/sharp-wasm32@0.33.5': dependencies: '@emnapi/runtime': 1.2.0 optional: true - '@img/sharp-win32-ia32@0.33.4': + '@img/sharp-win32-ia32@0.33.5': optional: true - '@img/sharp-win32-x64@0.33.4': + '@img/sharp-win32-x64@0.33.5': optional: true '@isaacs/cliui@8.0.2': @@ -4215,27 +4285,27 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 20.14.13 + '@types/node': 20.16.9 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.13 + '@types/node': 20.16.9 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -4260,7 +4330,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.13 + '@types/node': 20.16.9 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -4278,7 +4348,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.14.13 + '@types/node': 20.16.9 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -4300,7 +4370,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.14.13 + '@types/node': 20.16.9 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -4370,7 +4440,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.14.13 + '@types/node': 20.16.9 '@types/yargs': 17.0.32 chalk: 4.1.2 @@ -4396,7 +4466,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@korumite/kiwi@2.13.0': + '@korumite/kiwi@3.1.0': dependencies: mdast-util-toc: 7.1.0 reading-time: 1.5.0 @@ -4420,17 +4490,17 @@ snapshots: dependencies: prop-types: 15.8.1 - '@mui/core-downloads-tracker@5.16.6': {} + '@mui/core-downloads-tracker@6.1.1': {} - '@mui/material@5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/material@6.1.1(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.0 - '@mui/core-downloads-tracker': 5.16.6 - '@mui/system': 5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@mui/types': 7.2.15(@types/react@18.3.3) - '@mui/utils': 5.16.6(@types/react@18.3.3)(react@18.3.1) + '@babel/runtime': 7.25.6 + '@mui/core-downloads-tracker': 6.1.1 + '@mui/system': 6.1.1(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1) + '@mui/types': 7.2.17(@types/react@18.3.10) + '@mui/utils': 6.1.1(@types/react@18.3.10)(react@18.3.1) '@popperjs/core': 2.11.8 - '@types/react-transition-group': 4.4.10 + '@types/react-transition-group': 4.4.11 clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 @@ -4439,89 +4509,90 @@ snapshots: react-is: 18.3.1 react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: - '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@types/react': 18.3.3 + '@emotion/react': 11.13.3(@types/react@18.3.10)(react@18.3.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1) + '@types/react': 18.3.10 - '@mui/private-theming@5.16.6(@types/react@18.3.3)(react@18.3.1)': + '@mui/private-theming@6.1.1(@types/react@18.3.10)(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.0 - '@mui/utils': 5.16.6(@types/react@18.3.3)(react@18.3.1) + '@babel/runtime': 7.25.6 + '@mui/utils': 6.1.1(@types/react@18.3.10)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.10 - '@mui/styled-engine@5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@6.1.1(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 '@emotion/cache': 11.13.1 + '@emotion/sheet': 1.4.0 csstype: 3.1.3 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + '@emotion/react': 11.13.3(@types/react@18.3.10)(react@18.3.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1) - '@mui/system@5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': + '@mui/system@6.1.1(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.0 - '@mui/private-theming': 5.16.6(@types/react@18.3.3)(react@18.3.1) - '@mui/styled-engine': 5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.15(@types/react@18.3.3) - '@mui/utils': 5.16.6(@types/react@18.3.3)(react@18.3.1) + '@babel/runtime': 7.25.6 + '@mui/private-theming': 6.1.1(@types/react@18.3.10)(react@18.3.1) + '@mui/styled-engine': 6.1.1(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1))(react@18.3.1) + '@mui/types': 7.2.17(@types/react@18.3.10) + '@mui/utils': 6.1.1(@types/react@18.3.10)(react@18.3.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@types/react': 18.3.3 + '@emotion/react': 11.13.3(@types/react@18.3.10)(react@18.3.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1) + '@types/react': 18.3.10 - '@mui/types@7.2.15(@types/react@18.3.3)': + '@mui/types@7.2.17(@types/react@18.3.10)': optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.10 - '@mui/utils@5.16.6(@types/react@18.3.3)(react@18.3.1)': + '@mui/utils@6.1.1(@types/react@18.3.10)(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.0 - '@mui/types': 7.2.15(@types/react@18.3.3) - '@types/prop-types': 15.7.12 + '@babel/runtime': 7.25.6 + '@mui/types': 7.2.17(@types/react@18.3.10) + '@types/prop-types': 15.7.13 clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-is: 18.3.1 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.10 - '@next/env@14.2.5': {} + '@next/env@14.2.13': {} - '@next/swc-darwin-arm64@14.2.5': + '@next/swc-darwin-arm64@14.2.13': optional: true - '@next/swc-darwin-x64@14.2.5': + '@next/swc-darwin-x64@14.2.13': optional: true - '@next/swc-linux-arm64-gnu@14.2.5': + '@next/swc-linux-arm64-gnu@14.2.13': optional: true - '@next/swc-linux-arm64-musl@14.2.5': + '@next/swc-linux-arm64-musl@14.2.13': optional: true - '@next/swc-linux-x64-gnu@14.2.5': + '@next/swc-linux-x64-gnu@14.2.13': optional: true - '@next/swc-linux-x64-musl@14.2.5': + '@next/swc-linux-x64-musl@14.2.13': optional: true - '@next/swc-win32-arm64-msvc@14.2.5': + '@next/swc-win32-arm64-msvc@14.2.13': optional: true - '@next/swc-win32-ia32-msvc@14.2.5': + '@next/swc-win32-ia32-msvc@14.2.13': optional: true - '@next/swc-win32-x64-msvc@14.2.5': + '@next/swc-win32-x64-msvc@14.2.13': optional: true '@nodelib/fs.scandir@2.1.5': @@ -4536,11 +4607,10 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@pkgjs/parseargs@0.11.0': - optional: true - '@popperjs/core@2.11.8': {} + '@rtsao/scc@1.1.0': {} + '@sinclair/typebox@0.27.8': {} '@sinonjs/commons@3.0.1': @@ -4554,7 +4624,7 @@ snapshots: '@snyk/github-codeowners@1.1.0': dependencies: commander: 4.1.1 - ignore: 5.3.1 + ignore: 5.3.2 p-map: 4.0.0 '@swc/counter@0.1.3': {} @@ -4562,12 +4632,12 @@ snapshots: '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 - tslib: 2.6.3 + tslib: 2.7.0 '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.24.7 - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -4575,25 +4645,24 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.8': + '@testing-library/jest-dom@6.5.0': dependencies: '@adobe/css-tools': 4.4.0 - '@babel/runtime': 7.25.0 - aria-query: 5.3.0 + aria-query: 5.3.2 chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@16.0.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 '@testing-library/dom': 10.4.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 '@tootallnate/once@2.0.0': {} @@ -4639,17 +4708,19 @@ snapshots: '@types/estree@1.0.5': {} + '@types/estree@1.0.6': {} + '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.14.13 + '@types/node': 20.16.9 '@types/hast@2.3.10': dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.11 '@types/hast@3.0.4': dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 '@types/istanbul-lib-coverage@2.0.6': {} @@ -4661,48 +4732,50 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 - '@types/jest@29.5.12': + '@types/jest@29.5.13': dependencies: expect: 29.7.0 pretty-format: 29.7.0 '@types/jsdom@20.0.1': dependencies: - '@types/node': 20.14.13 + '@types/node': 20.16.9 '@types/tough-cookie': 4.0.5 parse5: 7.1.2 + '@types/json-schema@7.0.15': {} + '@types/json5@0.0.29': {} '@types/mdast@4.0.4': dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 '@types/ms@0.7.34': {} - '@types/node@20.14.13': + '@types/node@20.16.9': dependencies: - undici-types: 5.26.5 + undici-types: 6.19.8 '@types/parse-json@4.0.2': {} - '@types/prop-types@15.7.12': {} + '@types/prop-types@15.7.13': {} '@types/react-dom@18.3.0': dependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.10 '@types/react-syntax-highlighter@15.5.13': dependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.10 - '@types/react-transition-group@4.4.10': + '@types/react-transition-group@4.4.11': dependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.10 - '@types/react@18.3.3': + '@types/react@18.3.10': dependencies: - '@types/prop-types': 15.7.12 + '@types/prop-types': 15.7.13 csstype: 3.1.3 '@types/stack-utils@2.0.3': {} @@ -4711,9 +4784,9 @@ snapshots: '@types/ungap__structured-clone@1.2.0': {} - '@types/unist@2.0.10': {} + '@types/unist@2.0.11': {} - '@types/unist@3.0.2': {} + '@types/unist@3.0.3': {} '@types/yargs-parser@21.0.3': {} @@ -4721,94 +4794,94 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2))(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.18.0(eslint@9.8.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@9.8.0)(typescript@5.5.4) - '@typescript-eslint/utils': 7.18.0(eslint@9.8.0)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 9.8.0 + '@eslint-community/regexpp': 4.11.1 + '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.7.0 + '@typescript-eslint/type-utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.7.0 + eslint: 9.11.1(jiti@2.0.0) graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.4) + ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4)': + '@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': dependencies: - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.6 - eslint: 9.8.0 + '@typescript-eslint/scope-manager': 8.7.0 + '@typescript-eslint/types': 8.7.0 + '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.7.0 + debug: 4.3.7 + eslint: 9.11.1(jiti@2.0.0) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.18.0': + '@typescript-eslint/scope-manager@8.7.0': dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/types': 8.7.0 + '@typescript-eslint/visitor-keys': 8.7.0 - '@typescript-eslint/type-utils@7.18.0(eslint@9.8.0)(typescript@5.5.4)': + '@typescript-eslint/type-utils@8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) - '@typescript-eslint/utils': 7.18.0(eslint@9.8.0)(typescript@5.5.4) - debug: 4.3.6 - eslint: 9.8.0 - ts-api-utils: 1.3.0(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) + '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + debug: 4.3.7 + ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.2 transitivePeerDependencies: + - eslint - supports-color - '@typescript-eslint/types@7.18.0': {} + '@typescript-eslint/types@8.7.0': {} - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': + '@typescript-eslint/typescript-estree@8.7.0(typescript@5.6.2)': dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.6 - globby: 11.1.0 + '@typescript-eslint/types': 8.7.0 + '@typescript-eslint/visitor-keys': 8.7.0 + debug: 4.3.7 + fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.5.4) + ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@9.8.0)(typescript@5.5.4)': + '@typescript-eslint/utils@8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) - eslint: 9.8.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@2.0.0)) + '@typescript-eslint/scope-manager': 8.7.0 + '@typescript-eslint/types': 8.7.0 + '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) + eslint: 9.11.1(jiti@2.0.0) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.18.0': + '@typescript-eslint/visitor-keys@8.7.0': dependencies: - '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/types': 8.7.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} - '@vercel/analytics@1.3.1(next@14.2.5(@babel/core@7.24.6)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@vercel/analytics@1.3.1(next@14.2.13(@babel/core@7.24.6)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: server-only: 0.0.1 optionalDependencies: - next: 14.2.5(@babel/core@7.24.6)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.13(@babel/core@7.24.6)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 abab@2.0.6: {} @@ -4852,7 +4925,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} + ansi-regex@6.1.0: {} ansi-styles@3.2.1: dependencies: @@ -4883,6 +4956,8 @@ snapshots: dependencies: dequal: 2.0.3 + aria-query@5.3.2: {} + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 @@ -4897,8 +4972,6 @@ snapshots: get-intrinsic: 1.2.4 is-string: 1.0.7 - array-union@2.1.0: {} - array.prototype.findlastindex@1.2.5: dependencies: call-bind: 1.0.7 @@ -5060,6 +5133,8 @@ snapshots: caniuse-lite@1.0.30001643: {} + caniuse-lite@1.0.30001664: {} + ccount@2.0.1: {} chalk@2.4.2: @@ -5153,14 +5228,12 @@ snapshots: concat-map@0.0.1: {} - concurrently@8.2.2: + concurrently@9.0.1: dependencies: chalk: 4.1.2 - date-fns: 2.30.0 lodash: 4.17.21 rxjs: 7.8.1 shell-quote: 1.8.1 - spawn-command: 0.0.2 supports-color: 8.1.1 tree-kill: 1.2.2 yargs: 17.7.2 @@ -5177,13 +5250,13 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - create-jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)): + create-jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -5238,10 +5311,6 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.1 - date-fns@2.30.0: - dependencies: - '@babel/runtime': 7.24.6 - debug@3.2.7: dependencies: ms: 2.1.3 @@ -5254,6 +5323,10 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.3.7: + dependencies: + ms: 2.1.3 + decimal.js@10.4.3: {} decode-named-character-reference@1.0.2: @@ -5303,10 +5376,6 @@ snapshots: diff@4.0.2: {} - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -5317,7 +5386,7 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 csstype: 3.1.3 domexception@4.0.0: @@ -5342,6 +5411,11 @@ snapshots: emoji-regex@9.2.2: {} + enhanced-resolve@5.17.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + entities@4.5.0: {} error-ex@1.3.2: @@ -5381,7 +5455,7 @@ snapshots: is-string: 1.0.7 is-typed-array: 1.1.13 is-weakref: 1.0.2 - object-inspect: 1.13.1 + object-inspect: 1.13.2 object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.2 @@ -5444,34 +5518,35 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.13.1 + is-core-module: 2.15.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.8.0): + eslint-module-utils@2.11.1(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.11.1(jiti@2.0.0)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@9.8.0)(typescript@5.5.4) - eslint: 9.8.0 + '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + eslint: 9.11.1(jiti@2.0.0) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2))(eslint@9.11.1(jiti@2.0.0)): dependencies: + '@rtsao/scc': 1.1.0 array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.8.0 + eslint: 9.11.1(jiti@2.0.0) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.8.0) + eslint-module-utils: 2.11.1(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.11.1(jiti@2.0.0)) hasown: 2.0.2 - is-core-module: 2.13.1 + is-core-module: 2.15.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 @@ -5480,7 +5555,7 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -5495,20 +5570,24 @@ snapshots: eslint-visitor-keys@4.0.0: {} - eslint@9.8.0: + eslint@9.11.1(jiti@2.0.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) - '@eslint-community/regexpp': 4.11.0 - '@eslint/config-array': 0.17.1 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@2.0.0)) + '@eslint-community/regexpp': 4.11.1 + '@eslint/config-array': 0.18.0 + '@eslint/core': 0.6.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.8.0 + '@eslint/js': 9.11.1 + '@eslint/plugin-kit': 0.2.0 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.6 + debug: 4.3.7 escape-string-regexp: 4.0.0 eslint-scope: 8.0.2 eslint-visitor-keys: 4.0.0 @@ -5519,18 +5598,19 @@ snapshots: file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 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.4 strip-ansi: 6.0.1 text-table: 0.2.0 + optionalDependencies: + jiti: 2.0.0 transitivePeerDependencies: - supports-color @@ -5641,7 +5721,7 @@ snapshots: dependencies: is-callable: 1.2.7 - foreground-child@3.2.1: + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 @@ -5704,14 +5784,14 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.5: + glob@11.0.0: dependencies: - foreground-child: 3.2.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 + foreground-child: 3.3.0 + jackspeak: 4.0.2 + minimatch: 10.0.1 minipass: 7.1.2 package-json-from-dist: 1.0.0 - path-scurry: 1.11.1 + path-scurry: 2.0.0 glob@7.2.3: dependencies: @@ -5731,15 +5811,6 @@ snapshots: define-properties: 1.2.1 gopd: 1.0.1 - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 3.0.0 - gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 @@ -5780,7 +5851,7 @@ snapshots: dependencies: '@types/estree': 1.0.5 '@types/hast': 3.0.4 - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 @@ -5847,7 +5918,9 @@ snapshots: dependencies: safer-buffer: 2.1.2 - ignore@5.3.1: {} + ignore@5.3.2: {} + + ignore@6.0.2: {} import-fresh@3.3.0: dependencies: @@ -5918,6 +5991,10 @@ snapshots: dependencies: hasown: 2.0.2 + is-core-module@2.15.1: + dependencies: + hasown: 2.0.2 + is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 @@ -6030,11 +6107,9 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - jackspeak@3.4.3: + jackspeak@4.0.2: dependencies: '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 jest-changed-files@29.7.0: dependencies: @@ -6048,7 +6123,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.13 + '@types/node': 20.16.9 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3(babel-plugin-macros@3.1.0) @@ -6068,16 +6143,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)): + jest-cli@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) + create-jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -6087,7 +6162,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)): + jest-config@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): dependencies: '@babel/core': 7.24.6 '@jest/test-sequencer': 29.7.0 @@ -6112,8 +6187,8 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.14.13 - ts-node: 10.9.2(@types/node@20.14.13)(typescript@5.5.4) + '@types/node': 20.16.9 + ts-node: 10.9.2(@types/node@20.16.9)(typescript@5.6.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -6143,7 +6218,7 @@ snapshots: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 20.14.13 + '@types/node': 20.16.9 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -6157,7 +6232,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.13 + '@types/node': 20.16.9 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -6167,7 +6242,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.14.13 + '@types/node': 20.16.9 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -6206,7 +6281,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.14.13 + '@types/node': 20.16.9 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -6241,7 +6316,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.13 + '@types/node': 20.16.9 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -6269,7 +6344,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.13 + '@types/node': 20.16.9 chalk: 4.1.2 cjs-module-lexer: 1.3.1 collect-v8-coverage: 1.0.2 @@ -6315,7 +6390,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.14.13 + '@types/node': 20.16.9 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -6334,7 +6409,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.13 + '@types/node': 20.16.9 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -6343,17 +6418,17 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 20.14.13 + '@types/node': 20.16.9 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)): + jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) + jest-cli: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -6362,6 +6437,9 @@ snapshots: jiti@1.21.6: {} + jiti@2.0.0: + optional: true + js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -6422,7 +6500,7 @@ snapshots: json5@2.2.3: {} - jsonc-parser@3.2.1: {} + jsonc-parser@3.3.1: {} jsonpointer@5.0.1: {} @@ -6432,26 +6510,26 @@ snapshots: kleur@3.0.3: {} - knip@5.27.0(@types/node@20.14.13)(typescript@5.5.4): + knip@5.30.6(@types/node@20.16.9)(typescript@5.6.2): dependencies: '@nodelib/fs.walk': 1.2.8 '@snyk/github-codeowners': 1.1.0 - '@types/node': 20.14.13 + '@types/node': 20.16.9 easy-table: 1.2.0 + enhanced-resolve: 5.17.1 fast-glob: 3.3.2 jiti: 1.21.6 js-yaml: 4.1.0 minimist: 1.2.8 - picocolors: 1.0.1 + picocolors: 1.1.0 picomatch: 4.0.2 pretty-ms: 9.1.0 - resolve: 1.22.8 smol-toml: 1.3.0 strip-json-comments: 5.0.1 summary: 2.1.0 - typescript: 5.5.4 + typescript: 5.6.2 zod: 3.23.8 - zod-validation-error: 3.3.0(zod@3.23.8) + zod-validation-error: 3.4.0(zod@3.23.8) leven@3.1.0: {} @@ -6489,7 +6567,7 @@ snapshots: fault: 1.0.4 highlight.js: 10.7.3 - lru-cache@10.4.3: {} + lru-cache@11.0.1: {} lru-cache@5.1.1: dependencies: @@ -6520,31 +6598,31 @@ snapshots: markdown-table@3.0.3: {} - markdownlint-cli@0.41.0: + markdownlint-cli@0.42.0: dependencies: commander: 12.1.0 get-stdin: 9.0.0 - glob: 10.4.5 - ignore: 5.3.1 + glob: 11.0.0 + ignore: 6.0.2 js-yaml: 4.1.0 - jsonc-parser: 3.2.1 + jsonc-parser: 3.3.1 jsonpointer: 5.0.1 - markdownlint: 0.34.0 - minimatch: 9.0.5 + markdownlint: 0.35.0 + minimatch: 10.0.1 run-con: 1.3.2 - smol-toml: 1.2.2 + smol-toml: 1.3.0 - markdownlint-micromark@0.1.9: {} + markdownlint-micromark@0.1.10: {} - markdownlint@0.34.0: + markdownlint@0.35.0: dependencies: markdown-it: 14.1.0 - markdownlint-micromark: 0.1.9 + markdownlint-micromark: 0.1.10 mdast-util-directive@3.0.0: dependencies: '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 devlop: 1.1.0 mdast-util-from-markdown: 2.0.0 mdast-util-to-markdown: 2.1.0 @@ -6564,7 +6642,7 @@ snapshots: mdast-util-from-markdown@2.0.0: dependencies: '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 decode-named-character-reference: 1.0.2 devlop: 1.1.0 mdast-util-to-string: 4.0.0 @@ -6581,7 +6659,7 @@ snapshots: mdast-util-from-markdown@2.0.1: dependencies: '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 decode-named-character-reference: 1.0.2 devlop: 1.1.0 mdast-util-to-string: 4.0.0 @@ -6618,7 +6696,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 micromark-util-normalize-identifier: 2.0.0 transitivePeerDependencies: @@ -6627,7 +6705,7 @@ snapshots: mdast-util-gfm-strikethrough@2.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -6637,7 +6715,7 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 markdown-table: 3.0.3 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -6646,14 +6724,14 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color mdast-util-gfm@3.0.0: dependencies: - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-gfm-autolink-literal: 2.0.0 mdast-util-gfm-footnote: 2.0.0 mdast-util-gfm-strikethrough: 2.0.0 @@ -6669,7 +6747,7 @@ snapshots: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -6679,10 +6757,10 @@ snapshots: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 parse-entities: 4.0.1 stringify-entities: 4.0.4 @@ -6698,7 +6776,7 @@ snapshots: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -6723,7 +6801,7 @@ snapshots: mdast-util-to-markdown@2.1.0: dependencies: '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 longest-streak: 3.1.0 mdast-util-phrasing: 4.1.0 mdast-util-to-string: 4.0.0 @@ -6950,7 +7028,7 @@ snapshots: micromark@4.0.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.4 + debug: 4.3.7 decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 @@ -6984,6 +7062,10 @@ snapshots: min-indent@1.0.1: {} + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -7004,27 +7086,27 @@ snapshots: natural-compare@1.4.0: {} - next@14.2.5(@babel/core@7.24.6)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.13(@babel/core@7.24.6)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 14.2.5 + '@next/env': 14.2.13 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001643 + caniuse-lite: 1.0.30001664 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) styled-jsx: 5.1.1(@babel/core@7.24.6)(babel-plugin-macros@3.1.0)(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.5 - '@next/swc-darwin-x64': 14.2.5 - '@next/swc-linux-arm64-gnu': 14.2.5 - '@next/swc-linux-arm64-musl': 14.2.5 - '@next/swc-linux-x64-gnu': 14.2.5 - '@next/swc-linux-x64-musl': 14.2.5 - '@next/swc-win32-arm64-msvc': 14.2.5 - '@next/swc-win32-ia32-msvc': 14.2.5 - '@next/swc-win32-x64-msvc': 14.2.5 + '@next/swc-darwin-arm64': 14.2.13 + '@next/swc-darwin-x64': 14.2.13 + '@next/swc-linux-arm64-gnu': 14.2.13 + '@next/swc-linux-arm64-musl': 14.2.13 + '@next/swc-linux-x64-gnu': 14.2.13 + '@next/swc-linux-x64-musl': 14.2.13 + '@next/swc-win32-arm64-msvc': 14.2.13 + '@next/swc-win32-ia32-msvc': 14.2.13 + '@next/swc-win32-x64-msvc': 14.2.13 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -7049,7 +7131,7 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.13.1: {} + object-inspect@1.13.2: {} object-keys@1.1.1: {} @@ -7135,7 +7217,7 @@ snapshots: parse-entities@4.0.1: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.11 character-entities: 2.0.2 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 @@ -7165,15 +7247,17 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.11.1: + path-scurry@2.0.0: dependencies: - lru-cache: 10.4.3 + lru-cache: 11.0.1 minipass: 7.1.2 path-type@4.0.0: {} picocolors@1.0.1: {} + picocolors@1.1.0: {} + picomatch@2.3.1: {} picomatch@4.0.2: {} @@ -7184,17 +7268,17 @@ snapshots: dependencies: find-up: 4.1.0 - plaiceholder@3.0.0(sharp@0.33.4): + plaiceholder@3.0.0(sharp@0.33.5): dependencies: - sharp: 0.33.4 + sharp: 0.33.5 possible-typed-array-names@1.0.0: {} postcss@8.4.31: dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + picocolors: 1.1.0 + source-map-js: 1.2.1 prelude-ls@1.2.1: {} @@ -7255,7 +7339,7 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-intersection-observer@9.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-intersection-observer@9.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 optionalDependencies: @@ -7267,10 +7351,10 @@ snapshots: react-is@18.3.1: {} - react-markdown@9.0.1(@types/react@18.3.3)(react@18.3.1): + react-markdown@9.0.1(@types/react@18.3.10)(react@18.3.1): dependencies: '@types/hast': 3.0.4 - '@types/react': 18.3.3 + '@types/react': 18.3.10 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.0 html-url-attributes: 3.0.0 @@ -7295,7 +7379,7 @@ snapshots: react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -7368,7 +7452,7 @@ snapshots: remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 micromark-util-types: 2.0.0 unified: 11.0.4 transitivePeerDependencies: @@ -7437,7 +7521,7 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.6.2 + tslib: 2.7.0 safe-array-concat@1.1.2: dependencies: @@ -7486,31 +7570,31 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - sharp@0.33.4: + sharp@0.33.5: dependencies: color: 4.2.3 detect-libc: 2.0.3 semver: 7.6.3 optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.4 - '@img/sharp-darwin-x64': 0.33.4 - '@img/sharp-libvips-darwin-arm64': 1.0.2 - '@img/sharp-libvips-darwin-x64': 1.0.2 - '@img/sharp-libvips-linux-arm': 1.0.2 - '@img/sharp-libvips-linux-arm64': 1.0.2 - '@img/sharp-libvips-linux-s390x': 1.0.2 - '@img/sharp-libvips-linux-x64': 1.0.2 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 - '@img/sharp-libvips-linuxmusl-x64': 1.0.2 - '@img/sharp-linux-arm': 0.33.4 - '@img/sharp-linux-arm64': 0.33.4 - '@img/sharp-linux-s390x': 0.33.4 - '@img/sharp-linux-x64': 0.33.4 - '@img/sharp-linuxmusl-arm64': 0.33.4 - '@img/sharp-linuxmusl-x64': 0.33.4 - '@img/sharp-wasm32': 0.33.4 - '@img/sharp-win32-ia32': 0.33.4 - '@img/sharp-win32-x64': 0.33.4 + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 shebang-command@2.0.0: dependencies: @@ -7525,13 +7609,13 @@ snapshots: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - object-inspect: 1.13.1 + object-inspect: 1.13.2 signal-exit@3.0.7: {} signal-exit@4.1.0: {} - simple-icons@13.3.0: {} + simple-icons@13.11.0: {} simple-swizzle@0.2.2: dependencies: @@ -7541,11 +7625,9 @@ snapshots: slash@3.0.0: {} - smol-toml@1.2.2: {} - smol-toml@1.3.0: {} - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} source-map-support@0.5.13: dependencies: @@ -7560,8 +7642,6 @@ snapshots: space-separated-tokens@2.0.2: {} - spawn-command@0.0.2: {} - sprintf-js@1.0.3: {} stack-utils@2.0.6: @@ -7617,7 +7697,7 @@ snapshots: strip-ansi@7.1.0: dependencies: - ansi-regex: 6.0.1 + ansi-regex: 6.1.0 strip-bom@3.0.0: {} @@ -7665,6 +7745,8 @@ snapshots: symbol-tree@3.2.4: {} + tapable@2.2.1: {} + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 @@ -7698,25 +7780,25 @@ snapshots: trough@2.2.0: {} - ts-api-utils@1.3.0(typescript@5.5.4): + ts-api-utils@1.3.0(typescript@5.6.2): dependencies: - typescript: 5.5.4 + typescript: 5.6.2 - ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4): + ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.14.13 + '@types/node': 20.16.9 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.5.4 + typescript: 5.6.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -7727,9 +7809,7 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tslib@2.6.2: {} - - tslib@2.6.3: {} + tslib@2.7.0: {} type-check@0.4.0: dependencies: @@ -7771,18 +7851,18 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - typescript-eslint@7.18.0(eslint@9.8.0)(typescript@5.5.4): + typescript-eslint@8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2): dependencies: - '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4) - '@typescript-eslint/parser': 7.18.0(eslint@9.8.0)(typescript@5.5.4) - '@typescript-eslint/utils': 7.18.0(eslint@9.8.0)(typescript@5.5.4) - eslint: 9.8.0 + '@typescript-eslint/eslint-plugin': 8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2))(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.2 transitivePeerDependencies: + - eslint - supports-color - typescript@5.5.4: {} + typescript@5.6.2: {} uc.micro@2.1.0: {} @@ -7793,11 +7873,11 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - undici-types@5.26.5: {} + undici-types@6.19.8: {} unified@11.0.4: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 bail: 2.0.2 devlop: 1.1.0 extend: 3.0.2 @@ -7807,26 +7887,26 @@ snapshots: unist-util-is@6.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-position@5.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-remove-position@5.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-visit: 5.0.0 unist-util-remove@4.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 unist-util-select@5.1.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 css-selector-parser: 3.0.5 devlop: 1.1.0 nth-check: 2.1.1 @@ -7834,16 +7914,16 @@ snapshots: unist-util-stringify-position@4.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-visit-parents@6.0.1: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-is: 6.0.0 unist-util-visit@5.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 @@ -7880,26 +7960,31 @@ snapshots: vfile-matter@5.0.0: dependencies: - vfile: 6.0.2 - yaml: 2.5.0 + vfile: 6.0.3 + yaml: 2.5.1 vfile-message@4.0.2: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 vfile@6.0.1: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 vfile@6.0.2: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + w3c-xmlserializer@4.0.0: dependencies: xml-name-validator: 4.0.0 @@ -7981,7 +8066,7 @@ snapshots: yaml@1.10.2: {} - yaml@2.5.0: {} + yaml@2.5.1: {} yargs-parser@21.1.1: {} @@ -7999,7 +8084,7 @@ snapshots: yocto-queue@0.1.0: {} - zod-validation-error@3.3.0(zod@3.23.8): + zod-validation-error@3.4.0(zod@3.23.8): dependencies: zod: 3.23.8 diff --git a/src/components/ArticleCard/ArticleCard.test.tsx b/src/components/ArticleCard/ArticleCard.test.tsx index 3dc6670e..e235d571 100644 --- a/src/components/ArticleCard/ArticleCard.test.tsx +++ b/src/components/ArticleCard/ArticleCard.test.tsx @@ -19,7 +19,7 @@ describe(ArticleCard.name, () => { title: '', }, date: null, - day: '23', + href: '/path/to/article', matter: { authors: 'Firstname Lastname', banner: 'banner', @@ -27,10 +27,6 @@ describe(ArticleCard.name, () => { tags: [], title: 'Article Title', }, - month: '04', - route: '/path/to/article', - slug: 'article', - year: '2023', }; }); diff --git a/src/components/ArticleCard/ArticleCard.tsx b/src/components/ArticleCard/ArticleCard.tsx index 0254c983..f7fda6db 100644 --- a/src/components/ArticleCard/ArticleCard.tsx +++ b/src/components/ArticleCard/ArticleCard.tsx @@ -1,7 +1,11 @@ -import { Card, CardActionArea, CardContent, Typography } from '@mui/material'; -import { alpha } from '@mui/material/styles'; +import { + alpha, + Card, + CardActionArea, + CardContent, + Typography, +} from '@mui/material'; import NextLink from 'next/link'; -import { type FunctionComponent } from 'react'; import { ArticleMeta } from '@/components/ArticleMeta/ArticleMeta'; import { type ArticleCard as ArticleCardModel } from '@/tools/markdown/types'; @@ -9,14 +13,12 @@ import { type ArticleCard as ArticleCardModel } from '@/tools/markdown/types'; /** Vertical height that should be added for the banner. */ const BANNER_OFFSET = 90; -type Props = ArticleCardModel; - -export const ArticleCard: FunctionComponent = ({ +export const ArticleCard = ({ banner, date, + href, matter, - route, -}) => ( +}: ArticleCardModel) => ( = ({ > ; + sx: SxProps; }; export const BackToTop: FunctionComponent = ({ sx }) => { - const [hasBeenDisplayed, setHasBeenDisplayed] = useState(false); + const [hasBeenDisplayed, setHasBeenDisplayed] = useState(false); const trigger = useScrollTrigger({ disableHysteresis: true, threshold: 500 }); - const onClick = () => { + const onClick = () => document.body.scrollIntoView({ behavior: 'smooth', block: 'start' }); - }; useEffect(() => { if (trigger) { diff --git a/src/components/Banner/Banner.tsx b/src/components/Banner/Banner.tsx index e5576d53..76576f4c 100644 --- a/src/components/Banner/Banner.tsx +++ b/src/components/Banner/Banner.tsx @@ -1,5 +1,4 @@ -import { Box, Divider, Typography } from '@mui/material'; -import { alpha } from '@mui/material/styles'; +import { alpha, Box, Divider, Typography } from '@mui/material'; import Image from 'next/image'; import { type FunctionComponent } from 'react'; @@ -111,11 +110,7 @@ export const Banner: FunctionComponent = ({ })} > {footer.map((line) => ( - + {line} ))} diff --git a/src/components/Card/Card.tsx b/src/components/Card/Card.tsx index bf722e7f..9106902f 100644 --- a/src/components/Card/Card.tsx +++ b/src/components/Card/Card.tsx @@ -1,7 +1,6 @@ import { mdiCached } from '@mdi/js'; import Icon from '@mdi/react'; -import { Box, IconButton } from '@mui/material'; -import { alpha } from '@mui/material/styles'; +import { alpha, Box, IconButton } from '@mui/material'; import { useState, type FunctionComponent, type ReactNode } from 'react'; import { CardFace } from '@/components/Card/CardFace'; @@ -12,7 +11,7 @@ type Props = { }; export const Card: FunctionComponent = ({ data }) => { - const [selectedFace, setSelectedFace] = useState(0); + const [selectedFace, setSelectedFace] = useState(0); /** Toggle index between 0 and 1. */ const onFlip = () => setSelectedFace((previous) => 1 - previous); diff --git a/src/components/Card/CardFace.tsx b/src/components/Card/CardFace.tsx index 6de4f194..609f7de5 100644 --- a/src/components/Card/CardFace.tsx +++ b/src/components/Card/CardFace.tsx @@ -1,14 +1,12 @@ -import { Box, Fade, Tooltip } from '@mui/material'; -import { type Theme } from '@mui/material/styles'; -import { type SxProps } from '@mui/system'; -import { type FunctionComponent, type ReactNode } from 'react'; +import { Box, Fade, Tooltip, type SxProps } from '@mui/material'; +import { type FunctionComponent } from 'react'; import { type ScryCard } from '@/tools/scryfall/types'; type Props = { active: boolean; data: ScryCard; - sx?: SxProps; + sx?: SxProps; }; export const CardFace: FunctionComponent = ({ active, data, sx }) => { @@ -17,20 +15,14 @@ export const CardFace: FunctionComponent = ({ active, data, sx }) => { if (!image) return null; - const titleLines: string[] = [ - `"${name}" from ${setName}`, - `Art by ${artist}`, - ]; - - const title: ReactNode = titleLines.map((line, index) => ( -
{line}
- )); + const description = [`"${name}" from ${setName}`, `Art by ${artist}`]; + const title = description.map((line) =>
{line}
); return ( = ({ cards }) => { sx={{ listStyleType: 'none', m: 0, minWidth: 170, p: 0 }} > {cards.map(([quantity, name]) => ( - + = ({ {main.map((cards, index) => ( - + ))} diff --git a/src/components/Footer/Footer.tsx b/src/components/Footer/Footer.tsx index 474e9a97..6395043b 100644 --- a/src/components/Footer/Footer.tsx +++ b/src/components/Footer/Footer.tsx @@ -1,9 +1,9 @@ -import { Box, Typography } from '@mui/material'; import { + Box, ThemeProvider as MuiThemeProvider, - type Theme, -} from '@mui/material/styles'; -import { type SxProps } from '@mui/system'; + Typography, + type SxProps, +} from '@mui/material'; import { type FunctionComponent, type ReactNode } from 'react'; import { Link } from '@/components/Link/Link'; @@ -11,7 +11,7 @@ import { darkTheme } from '@/theme/theme'; type Props = { isClear: boolean; - sx?: SxProps; + sx?: SxProps; }; export const Footer: FunctionComponent = ({ isClear, sx }) => { diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index 63188384..8212ac36 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -1,7 +1,13 @@ import { mdiMenu } from '@mdi/js'; import Icon from '@mdi/react'; -import { AppBar, Box, IconButton, Toolbar } from '@mui/material'; -import { alpha, useTheme } from '@mui/material/styles'; +import { + alpha, + AppBar, + Box, + IconButton, + Toolbar, + useTheme, +} from '@mui/material'; import { type FunctionComponent } from 'react'; import { Progress } from '@/components/Progress/Progress'; diff --git a/src/components/Layout/Layout.tsx b/src/components/Layout/Layout.tsx index 2553745f..ce5dcde9 100644 --- a/src/components/Layout/Layout.tsx +++ b/src/components/Layout/Layout.tsx @@ -1,42 +1,36 @@ -import { Box, Container } from '@mui/material'; -import { useTheme, type Theme } from '@mui/material/styles'; -import useMediaQuery from '@mui/material/useMediaQuery'; -import { type SxProps } from '@mui/system'; +import { Box, Container, useMediaQuery, useTheme } from '@mui/material'; import { useRouter } from 'next/router'; import { useCallback, useEffect, useState, - type FunctionComponent, type PropsWithChildren, } from 'react'; -import { z } from 'zod'; import { BackToTop } from '@/components/BackToTop/BackToTop'; import { Footer } from '@/components/Footer/Footer'; import { Header } from '@/components/Header/Header'; import { Sidebar } from '@/components/Sidebar/Sidebar'; import { Title } from '@/components/Title/Title'; -import { CATEGORIES } from '@/tools/markdown/constants'; -import { type MenuEntry } from '@/tools/markdown/types'; -import { union } from '@/tools/z/union'; +import { type MENU } from '@/tools/markdown/menu'; +import { zCategory } from '@/tools/z/schemas'; -type Props = PropsWithChildren & { +type Props = { background?: string; - menu: MenuEntry[]; + menu: typeof MENU; title: string; withBackToTop?: boolean; withProgress?: boolean; }; -export const Layout: FunctionComponent = ({ +export const Layout = ({ background, children, menu, title, withBackToTop = false, withProgress = false, -}) => { +}: PropsWithChildren) => { const router = useRouter(); const theme = useTheme(); // NOTE Prefer `up` over `down` to avoid flickering @@ -44,12 +38,7 @@ export const Layout: FunctionComponent = ({ const [isSidebarOpen, setIsSidebarOpen] = useState(false); const isClear = !!background; // TODO Pretty sure this can fail client side until migration to `app` router - const category = z - .preprocess( - (value) => (typeof value === 'string' ? value.toUpperCase() : value), - union(CATEGORIES).optional(), - ) - .parse(router.query.category); + const category = zCategory.optional().parse(router.query.category); const closeSidebar = useCallback(() => setIsSidebarOpen(false), []); @@ -60,30 +49,30 @@ export const Layout: FunctionComponent = ({ return () => router.events.off('routeChangeStart', closeSidebar); }, [closeSidebar, router]); - const sx: SxProps = [ - { display: 'flex', flexDirection: 'column', minHeight: '100%' }, - background !== undefined && { - backgroundImage: `url(${background})`, - backgroundPosition: 'center', - backgroundRepeat: 'no-repeat', - backgroundSize: 'cover', - color: 'white', - position: 'relative', - '&:before': { - backdropFilter: 'blur(4px)', - bottom: 0, - content: '""', - display: 'block', - left: 0, - position: 'absolute', - right: 0, - top: 0, - }, - }, - ]; - return ( - + <Header isMobile={!isDesktop} diff --git a/src/components/Markdown/renderers/Code.tsx b/src/components/Markdown/renderers/Code.tsx index 7e3909e1..abe0644f 100644 --- a/src/components/Markdown/renderers/Code.tsx +++ b/src/components/Markdown/renderers/Code.tsx @@ -1,5 +1,4 @@ -import { Box, type PaletteMode } from '@mui/material'; -import { alpha, useTheme } from '@mui/material/styles'; +import { alpha, Box, useTheme, type PaletteMode } from '@mui/material'; import { type Component, type FunctionComponent, diff --git a/src/components/Markdown/renderers/Row.tsx b/src/components/Markdown/renderers/Row.tsx index b8941fa8..9bcbfd02 100644 --- a/src/components/Markdown/renderers/Row.tsx +++ b/src/components/Markdown/renderers/Row.tsx @@ -1,5 +1,4 @@ -import { Box } from '@mui/material'; -import { alpha, type Theme } from '@mui/material/styles'; +import { alpha, Box, type Theme } from '@mui/material'; import { type SystemStyleObject } from '@mui/system'; import { type FunctionComponent } from 'react'; import { type ExtraProps } from 'react-markdown'; diff --git a/src/components/Markdown/renderers/Table.tsx b/src/components/Markdown/renderers/Table.tsx index 85caaf79..0686b0d2 100644 --- a/src/components/Markdown/renderers/Table.tsx +++ b/src/components/Markdown/renderers/Table.tsx @@ -1,4 +1,5 @@ import { + alpha, Table as MuiTable, TableBody as MuiTableBody, TableCell as MuiTableCell, @@ -6,7 +7,6 @@ import { TableHead as MuiTableHead, TableRow as MuiTableRow, } from '@mui/material'; -import { alpha } from '@mui/material/styles'; import { type ReactElement } from 'react'; import { type Components, type ExtraProps } from 'react-markdown'; diff --git a/src/components/Markdown/renderers/Tweet.tsx b/src/components/Markdown/renderers/Tweet.tsx index e3fc1324..48e938b5 100644 --- a/src/components/Markdown/renderers/Tweet.tsx +++ b/src/components/Markdown/renderers/Tweet.tsx @@ -22,9 +22,9 @@ type Props = ExtraProps & { }; export const Tweet: FunctionComponent<Props> = ({ id, node }) => { - const [hasError, setHasError] = useState<boolean>(false); - const [height, setHeight] = useState<number>(700); - const [isLoading, setIsLoading] = useState<boolean>(true); + const [hasError, setHasError] = useState(false); + const [height, setHeight] = useState(700); + const [isLoading, setIsLoading] = useState(true); const tweet = useRef<HTMLDivElement>(null); const { inView, ref: root } = useInView({ fallbackInView: true, diff --git a/src/components/Progress/Progress.tsx b/src/components/Progress/Progress.tsx index 6da27f74..74af53fb 100644 --- a/src/components/Progress/Progress.tsx +++ b/src/components/Progress/Progress.tsx @@ -1,12 +1,10 @@ -import { Box } from '@mui/material'; -import { type Theme } from '@mui/material/styles'; -import { type SxProps } from '@mui/system'; +import { Box, type SxProps } from '@mui/material'; import { type FunctionComponent } from 'react'; import { useScroll } from '@/hooks/useScroll'; type Props = { - sx?: SxProps<Theme>; + sx?: SxProps; }; export const Progress: FunctionComponent<Props> = ({ sx }) => { diff --git a/src/components/Sidebar/Entry.tsx b/src/components/Sidebar/Entry.tsx new file mode 100644 index 00000000..89e6447a --- /dev/null +++ b/src/components/Sidebar/Entry.tsx @@ -0,0 +1,76 @@ +import { mdiChevronDown } from '@mdi/js'; +import Icon from '@mdi/react'; +import { + Box, + Collapse, + List, + ListItemButton, + ListItemText, +} from '@mui/material'; +import NextLink from 'next/link'; +import { useRouter } from 'next/router'; +import { useState } from 'react'; + +import { type MENU } from '@/tools/markdown/menu'; + +type Props = { + chapter: string; + pages: (typeof MENU)[number]['pages']; + subtitle?: string; + title?: string; +}; + +export const Entry = ({ chapter, pages, subtitle, title }: Props) => { + const { query } = useRouter(); + const currentChapter = `${query.category}`.toUpperCase(); + const currentSlug = `${query.chapter}`; + const [isOpen, setIsOpen] = useState(chapter === currentChapter); + + if (!subtitle || !title) return null; + + const onToggle = () => setIsOpen((previous) => !previous); + + return ( + <> + <ListItemButton onClick={onToggle}> + <ListItemText + primary={title} + secondary={subtitle} + secondaryTypographyProps={{ variant: 'caption' }} + /> + <Box + component={Icon} + path={mdiChevronDown} + rotate={isOpen ? -180 : 0} + size={1} + sx={({ transitions }) => ({ + transition: transitions.create('transform'), + })} + /> + </ListItemButton> + <Collapse in={isOpen} timeout="auto"> + <List + component="div" + dense + sx={{ + backgroundColor: 'background.default', + borderBottom: 1, + borderTop: 1, + borderColor: 'divider', + }} + > + {pages.map(({ href, slug, title }) => ( + <ListItemButton + component={NextLink} + href={href} + key={slug} + selected={chapter === currentChapter && slug === currentSlug} + > + <ListItemText primary={title} /> + </ListItemButton> + ))} + </List> + </Collapse> + </> + ); +}; diff --git a/src/components/Sidebar/EntryAsLink.tsx b/src/components/Sidebar/EntryAsLink.tsx new file mode 100644 index 00000000..b55da78a --- /dev/null +++ b/src/components/Sidebar/EntryAsLink.tsx @@ -0,0 +1,22 @@ +import { ListItemButton, ListItemText } from '@mui/material'; +import NextLink from 'next/link'; +import { useRouter } from 'next/router'; + +type Props = { + href: string; + subtitle: string; + title: string; +}; + +export const EntryAsLink = ({ href, subtitle, title }: Props) => { + const { asPath } = useRouter(); + return ( + <ListItemButton component={NextLink} href={href} selected={href === asPath}> + <ListItemText + primary={title} + secondary={subtitle} + secondaryTypographyProps={{ variant: 'caption' }} + /> + </ListItemButton> + ); +}; diff --git a/src/components/Sidebar/Sidebar.tsx b/src/components/Sidebar/Sidebar.tsx index 82900e1e..98235110 100644 --- a/src/components/Sidebar/Sidebar.tsx +++ b/src/components/Sidebar/Sidebar.tsx @@ -4,29 +4,40 @@ import { Drawer, drawerClasses, List, + ThemeProvider as MuiThemeProvider, type DrawerProps, } from '@mui/material'; -import { - ThemeProvider as MuiThemeProvider, - type Theme, -} from '@mui/material/styles'; -import { type SxProps } from '@mui/system'; -import NextLink from 'next/link'; -import { type FunctionComponent, type ReactNode } from 'react'; +import { type FunctionComponent } from 'react'; -import { SidebarEntry } from '@/components/Sidebar/SidebarEntry'; +import { Entry } from '@/components/Sidebar/Entry'; +import { EntryAsLink } from '@/components/Sidebar/EntryAsLink'; import { SidebarHeader } from '@/components/Sidebar/SidebarHeader'; import { SidebarRosetta } from '@/components/Sidebar/SidebarRosetta'; import { darkTheme } from '@/theme/theme'; import { type CATEGORIES } from '@/tools/markdown/constants'; -import { type MenuEntry } from '@/tools/markdown/types'; +import { type MENU } from '@/tools/markdown/menu'; + +/** + * Decorate menu entries with a pretty title and subtitle. + * Omitting an entry simply hides it from the menu. + */ +const DECORATIONS: Partial< + Record<(typeof CATEGORIES)[number], { subtitle: string; title: string }> +> = + // prettier-ignore + { + APPENDICES: { subtitle: 'Other Resources', title: 'Appendices' }, + DDFT: { subtitle: 'Doomsday Fetchland Tendrils', title: 'DDFT' }, + ENTOMBSDAY: { subtitle: 'Tin Fins Hybrid', title: 'Entombsday' }, + MEANDECK: { subtitle: 'Force of Will Doomsday', title: 'Doomsday' }, +}; type Props = { category: (typeof CATEGORIES)[number] | undefined; isClear: boolean; isMobile?: boolean; isOpen?: boolean; - menu: MenuEntry[]; + menu: typeof MENU; onClose: () => void; }; @@ -38,27 +49,6 @@ export const Sidebar: FunctionComponent<Props> = ({ menu, onClose, }) => { - const sx: SxProps<Theme> = ({ drawer }) => ({ - [`.${drawerClasses.paper}`]: [ - { width: drawer.width }, - isClear && !isMobile && { background: 'none' }, - ], - }); - - const sxBody: SxProps<Theme> = [ - { color: 'text.primary', flexGrow: 1, overflowY: 'auto' }, - isClear && !isMobile && { backdropFilter: 'blur(24px)' }, - ]; - - const sxHeader: SxProps<Theme> = [ - { backgroundColor: ({ palette }) => palette.background.paper }, - (!isClear || isMobile) && { - borderBottomColor: ({ palette }) => palette.divider, - borderBottomStyle: 'solid', - borderBottomWidth: 1, - }, - ]; - const drawerProps: DrawerProps = isMobile ? { ModalProps: { keepMounted: true }, @@ -68,14 +58,26 @@ export const Sidebar: FunctionComponent<Props> = ({ } : { open: true, variant: 'permanent' }; - const body: ReactNode = ( - <Box sx={sxBody}> + const body = ( + <Box + sx={[ + { color: 'text.primary', flexGrow: 1, overflowY: 'auto' }, + isClear && !isMobile && { backdropFilter: 'blur(24px)' }, + ]} + > <List component="nav" dense> - {menu.map((entry) => ( - <SidebarEntry key={`entry-${entry.category}`} {...entry} /> - ))} - <SidebarEntry - component={NextLink} + {menu.map( + (entry) => + DECORATIONS[entry.id] && ( + <Entry + chapter={entry.id} + key={entry.id} + pages={entry.pages} + {...DECORATIONS[entry.id]} + /> + ), + )} + <EntryAsLink href="/articles" subtitle="Article Archive" title="Articles" @@ -87,8 +89,22 @@ export const Sidebar: FunctionComponent<Props> = ({ ); return ( - <Drawer sx={sx} {...drawerProps}> - <SidebarHeader sx={sxHeader} onClose={onClose} /> + <Drawer + sx={({ drawer }) => ({ + [`.${drawerClasses.paper}`]: [ + { width: drawer.width }, + isClear && !isMobile && { background: 'none' }, + ], + })} + {...drawerProps} + > + <SidebarHeader + sx={[ + { backgroundColor: 'background.paper' }, + (!isClear || isMobile) && { borderBottom: 1, borderColor: 'divider' }, + ]} + onClose={onClose} + /> {isClear && !isMobile ? ( <MuiThemeProvider theme={darkTheme}>{body}</MuiThemeProvider> ) : ( diff --git a/src/components/Sidebar/SidebarEntry.tsx b/src/components/Sidebar/SidebarEntry.tsx deleted file mode 100644 index 567b3670..00000000 --- a/src/components/Sidebar/SidebarEntry.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { mdiChevronDown } from '@mdi/js'; -import Icon from '@mdi/react'; -import { - Collapse, - Divider, - List, - ListItemButton, - ListItemText, -} from '@mui/material'; -import NextLink from 'next/link'; -import { useRouter } from 'next/router'; -import { - forwardRef, - useState, - type ElementType, - type FunctionComponent, -} from 'react'; - -import { type CATEGORIES } from '@/tools/markdown/constants'; -import { type ChapterCard, type MenuEntry } from '@/tools/markdown/types'; - -type Props = Omit<MenuEntry, 'category' | 'pages'> & { - category?: (typeof CATEGORIES)[number]; - children?: never; - component?: ElementType; - href?: string; - pages?: ChapterCard[]; -}; - -export const SidebarEntry: FunctionComponent<Props> = forwardRef< - HTMLDivElement, - Props ->(({ category, pages = [], subtitle, title, ...rest }, ref) => { - const { asPath, query } = useRouter(); - const routeCategory = `${query.category}`.toUpperCase(); - const routeChapter = `${query.chapter}`; - const hasPages = pages.length > 0; - const [isOpen, setIsOpen] = useState(hasPages && category === routeCategory); - - /** Toggle the drawer in mobile viewport. */ - const onToggle = () => setIsOpen((previous) => !previous); - - return ( - <> - <ListItemButton - ref={ref} - selected={rest.href === asPath} - sx={({ transitions }) => ({ - '> svg': { transition: transitions.create('transform') }, - })} - {...rest} - {...(hasPages && { onClick: onToggle })} - > - <ListItemText - primary={title} - secondary={subtitle} - secondaryTypographyProps={{ variant: 'caption' }} - /> - {hasPages && ( - <Icon path={mdiChevronDown} rotate={isOpen ? -180 : 0} size={1} /> - )} - </ListItemButton> - {hasPages && ( - <Collapse in={isOpen} timeout="auto"> - <Divider /> - <List - component="div" - dense - sx={{ backgroundColor: 'background.default' }} - > - {pages.map(({ category, matter, route, slug }) => ( - <ListItemButton - component={NextLink} - href={route} - key={`page-${route}`} - selected={category === routeCategory && slug === routeChapter} - > - <ListItemText primary={matter?.title || route} /> - </ListItemButton> - ))} - </List> - <Divider /> - </Collapse> - )} - </> - ); -}); diff --git a/src/components/Sidebar/SidebarHeader.tsx b/src/components/Sidebar/SidebarHeader.tsx index 05c780aa..9ad68b5b 100644 --- a/src/components/Sidebar/SidebarHeader.tsx +++ b/src/components/Sidebar/SidebarHeader.tsx @@ -1,8 +1,13 @@ import { mdiLightbulbOff, mdiLightbulbOn } from '@mdi/js'; import { Icon } from '@mdi/react'; -import { Box, Button, IconButton, Toolbar, Tooltip } from '@mui/material'; -import { type Theme } from '@mui/material/styles'; -import { type SxProps } from '@mui/system'; +import { + Box, + Button, + IconButton, + Toolbar, + Tooltip, + type SxProps, +} from '@mui/material'; import NextLink from 'next/link'; import { useContext, type FunctionComponent } from 'react'; import { siDiscord } from 'simple-icons'; @@ -11,7 +16,7 @@ import { ThemeContext } from '@/theme/ThemeContext'; type Props = { onClose: () => void; - sx?: SxProps<Theme>; + sx?: SxProps; }; export const SidebarHeader: FunctionComponent<Props> = ({ onClose, sx }) => { diff --git a/src/components/Sidebar/SidebarRosetta.tsx b/src/components/Sidebar/SidebarRosetta.tsx index bb431f7c..25804387 100644 --- a/src/components/Sidebar/SidebarRosetta.tsx +++ b/src/components/Sidebar/SidebarRosetta.tsx @@ -5,9 +5,8 @@ import { tableCellClasses, TableHead, TableRow, + type SxProps, } from '@mui/material'; -import { type Theme } from '@mui/material/styles'; -import { type SxProps } from '@mui/system'; import { useEffect, useState, type FunctionComponent } from 'react'; import { getRosetta, type Rosetta } from '@/tools/game/getRosetta'; @@ -15,7 +14,7 @@ import { type CATEGORIES } from '@/tools/markdown/constants'; type Props = { category: (typeof CATEGORIES)[number] | undefined; - sx?: SxProps<Theme>; + sx?: SxProps; }; export const SidebarRosetta: FunctionComponent<Props> = ({ category, sx }) => { @@ -45,7 +44,7 @@ export const SidebarRosetta: FunctionComponent<Props> = ({ category, sx }) => { </TableHead> <TableBody> {rosetta.map(([notation, card]) => ( - <TableRow key={`rosetta-${notation}-${card}`}> + <TableRow key={notation}> <TableCell component="th" scope="row"> {notation} </TableCell> diff --git a/src/components/SpoilsCalculator/SpoilsCalculator.tsx b/src/components/SpoilsCalculator/SpoilsCalculator.tsx index e1017994..36d61a0c 100644 --- a/src/components/SpoilsCalculator/SpoilsCalculator.tsx +++ b/src/components/SpoilsCalculator/SpoilsCalculator.tsx @@ -5,7 +5,7 @@ import { Button, ButtonGroup, Divider, - Unstable_Grid2 as Grid, + Grid2 as Grid, Table, TableBody, TableCell, @@ -109,7 +109,7 @@ export const SpoilsCalculator: FunctionComponent<unknown> = () => { return ( <Box> <Grid container spacing={2}> - <Grid xs={6} sm={3}> + <Grid size={{ xs: 6, sm: 3 }}> <TextField fullWidth label="Deck size" @@ -118,7 +118,7 @@ export const SpoilsCalculator: FunctionComponent<unknown> = () => { value={input.deck} /> </Grid> - <Grid xs={6} sm={3}> + <Grid size={{ xs: 6, sm: 3 }}> <TextField fullWidth label="Copies left" @@ -127,7 +127,7 @@ export const SpoilsCalculator: FunctionComponent<unknown> = () => { value={input.copies} /> </Grid> - <Grid xs={6} sm={3}> + <Grid size={{ xs: 6, sm: 3 }}> <TextField fullWidth label="Life total" @@ -136,7 +136,7 @@ export const SpoilsCalculator: FunctionComponent<unknown> = () => { value={input.life} /> </Grid> - <Grid xs={6} sm={3}> + <Grid size={{ xs: 6, sm: 3 }}> <TextField fullWidth helperText={input.samples > 10000 && 'Not suited for above 10,000'} diff --git a/src/hooks/useScroll.ts b/src/hooks/useScroll.ts index 29a6f041..8ec9a7e5 100644 --- a/src/hooks/useScroll.ts +++ b/src/hooks/useScroll.ts @@ -1,7 +1,7 @@ import { useEffect, useState } from 'react'; export const useScroll = (): number => { - const [scroll, setScroll] = useState<number>(0); + const [scroll, setScroll] = useState(0); const onScroll = () => { const { documentElement } = document; diff --git a/src/pages/404.tsx b/src/pages/404.tsx index 4f710c21..4d10ed67 100644 --- a/src/pages/404.tsx +++ b/src/pages/404.tsx @@ -2,11 +2,10 @@ import { Box } from '@mui/material'; import { type GetStaticProps, type NextPage } from 'next'; import { Layout } from '@/components/Layout/Layout'; -import { MENU } from '@/tools/markdown/getMenu'; -import { type MenuEntry } from '@/tools/markdown/types'; +import { MENU } from '@/tools/markdown/menu'; type Props = { - menu: MenuEntry[]; + menu: typeof MENU; }; const Page: NextPage<Props> = ({ menu }) => ( diff --git a/src/pages/[category]/[chapter].tsx b/src/pages/[category]/[chapter].tsx index 3790112a..c9bfaf63 100644 --- a/src/pages/[category]/[chapter].tsx +++ b/src/pages/[category]/[chapter].tsx @@ -5,13 +5,13 @@ import { Banner } from '@/components/Banner/Banner'; import { Layout } from '@/components/Layout/Layout'; import { Markdown } from '@/components/Markdown/Markdown'; import { CHAPTERS } from '@/tools/markdown/files'; -import { getChapter } from '@/tools/markdown/getMarkdown'; -import { MENU } from '@/tools/markdown/getMenu'; -import { type Chapter, type MenuEntry } from '@/tools/markdown/types'; +import { getChapter } from '@/tools/markdown/getChapter'; +import { MENU } from '@/tools/markdown/menu'; +import { type Chapter } from '@/tools/markdown/types'; type Props = { chapter: Chapter; - menu: MenuEntry[]; + menu: typeof MENU; }; const Page: NextPage<Props> = ({ chapter, menu }) => ( diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index b094bfd2..d7d9d9fd 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,4 +1,4 @@ -import CssBaseline from '@mui/material/CssBaseline'; +import { CssBaseline } from '@mui/material'; import { Analytics } from '@vercel/analytics/react'; import { type AppProps } from 'next/app'; import Head from 'next/head'; diff --git a/src/pages/articles.tsx b/src/pages/articles.tsx index f8297e92..e61f0183 100644 --- a/src/pages/articles.tsx +++ b/src/pages/articles.tsx @@ -11,24 +11,24 @@ import NextLink from 'next/link'; import { ArticleMeta } from '@/components/ArticleMeta/ArticleMeta'; import { Layout } from '@/components/Layout/Layout'; import { getArticleCards } from '@/tools/markdown/getArticleCards'; -import { MENU } from '@/tools/markdown/getMenu'; -import { type ArticleCard, type MenuEntry } from '@/tools/markdown/types'; +import { MENU } from '@/tools/markdown/menu'; +import { type ArticleCard } from '@/tools/markdown/types'; type Props = { articles: ArticleCard[]; - menu: MenuEntry[]; + menu: typeof MENU; }; const Page: NextPage<Props> = ({ articles, menu }) => ( <Layout menu={menu} title="Articles" withBackToTop> <Card> <List disablePadding> - {articles.map(({ date, matter, route }, index) => ( + {articles.map(({ date, href, matter }, index) => ( <ListItemButton component={NextLink} divider={index < articles.length - 1} - href={route} - key={route} + href={href} + key={href} > <ListItemText disableTypography diff --git a/src/pages/articles/[year]/[month]/[day]/[article].tsx b/src/pages/articles/[year]/[month]/[day]/[article].tsx index 449280ca..5467f2e4 100644 --- a/src/pages/articles/[year]/[month]/[day]/[article].tsx +++ b/src/pages/articles/[year]/[month]/[day]/[article].tsx @@ -5,18 +5,15 @@ import { Banner } from '@/components/Banner/Banner'; import { Layout } from '@/components/Layout/Layout'; import { Markdown } from '@/components/Markdown/Markdown'; import { ARTICLES } from '@/tools/markdown/files'; -import { getArticle, getMarkdown } from '@/tools/markdown/getMarkdown'; -import { MENU } from '@/tools/markdown/getMenu'; -import { - type Article, - type MenuEntry, - type Partial, -} from '@/tools/markdown/types'; +import { getArticle } from '@/tools/markdown/getArticle'; +import { getMarkdown } from '@/tools/markdown/getMarkdown'; +import { MENU } from '@/tools/markdown/menu'; +import { type Article, type Partial } from '@/tools/markdown/types'; type Props = { article: Article; footer: Partial; - menu: MenuEntry[]; + menu: typeof MENU; }; const Page: NextPage<Props> = ({ article, footer, menu }) => ( diff --git a/src/pages/index.tsx b/src/pages/index.tsx index cde0ce51..bb63190f 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,4 +1,10 @@ -import { Button, ButtonGroup, Card, CardContent, Grid } from '@mui/material'; +import { + Button, + ButtonGroup, + Card, + CardContent, + Grid2 as Grid, +} from '@mui/material'; import { type GetStaticProps, type NextPage } from 'next'; import { useEffect, useRef, useState } from 'react'; @@ -7,10 +13,9 @@ import { Layout } from '@/components/Layout/Layout'; import { Markdown } from '@/components/Markdown/Markdown'; import { getArticleCards } from '@/tools/markdown/getArticleCards'; import { getMarkdown } from '@/tools/markdown/getMarkdown'; -import { MENU } from '@/tools/markdown/getMenu'; +import { MENU } from '@/tools/markdown/menu'; import { type ArticleCard as ArticleCardModel, - type MenuEntry, type Partial, } from '@/tools/markdown/types'; @@ -18,7 +23,7 @@ const ARTICLES_INITIAL_SIZE = 5; type Props = { articles: ArticleCardModel[]; - menu: MenuEntry[]; + menu: typeof MENU; welcome: Partial; }; @@ -43,14 +48,14 @@ const Page: NextPage<Props> = ({ articles, menu, welcome }) => { return ( <Layout menu={menu} title="Welcome"> <Grid container spacing={3}> - <Grid item lg={7}> + <Grid size={{ lg: 7 }}> <Card> <CardContent> <Markdown markdown={welcome} /> </CardContent> </Card> </Grid> - <Grid item xs> + <Grid size="grow"> <Grid container ref={articlesRoot} @@ -58,11 +63,11 @@ const Page: NextPage<Props> = ({ articles, menu, welcome }) => { sx={{ flexDirection: 'column', pb: 2 }} > {articles.slice(0, size).map((article) => ( - <Grid item key={`article-${article.route}`} xs={12}> + <Grid key={article.href}> <ArticleCard {...article} /> </Grid> ))} - <Grid item sx={{ display: 'flex', justifyContent: 'center' }}> + <Grid sx={{ display: 'flex', justifyContent: 'center' }}> <ButtonGroup disabled={size >= articles.length} variant="outlined" diff --git a/src/pages/license.tsx b/src/pages/license.tsx index 39cd3730..3fc93296 100644 --- a/src/pages/license.tsx +++ b/src/pages/license.tsx @@ -4,12 +4,12 @@ import { type GetStaticProps, type NextPage } from 'next'; import { Layout } from '@/components/Layout/Layout'; import { Markdown } from '@/components/Markdown/Markdown'; import { getMarkdown } from '@/tools/markdown/getMarkdown'; -import { MENU } from '@/tools/markdown/getMenu'; -import { type MenuEntry, type Partial } from '@/tools/markdown/types'; +import { MENU } from '@/tools/markdown/menu'; +import { type Partial } from '@/tools/markdown/types'; type Props = { license: Partial; - menu: MenuEntry[]; + menu: typeof MENU; }; const Page: NextPage<Props> = ({ license, menu }) => ( diff --git a/src/pages/sandbox/index.tsx b/src/pages/sandbox/index.tsx index 5b885a31..a22efd54 100644 --- a/src/pages/sandbox/index.tsx +++ b/src/pages/sandbox/index.tsx @@ -3,18 +3,17 @@ import { Card, CardContent, Divider, + Stack, TextField, Typography, } from '@mui/material'; -import { Stack } from '@mui/system'; import { type GetStaticProps, type NextPage } from 'next'; import { useEffect, useState, type ChangeEvent } from 'react'; import { Layout } from '@/components/Layout/Layout'; import { SpoilsCalculator } from '@/components/SpoilsCalculator/SpoilsCalculator'; import { phyrexian } from '@/fonts/fonts'; -import { MENU } from '@/tools/markdown/getMenu'; -import { type MenuEntry } from '@/tools/markdown/types'; +import { MENU } from '@/tools/markdown/menu'; // NOTE Flavor text from "Dark Ritual" in "Urza's Saga" const DEFAULT_INPUT = `From void evolved Phyrexia. @@ -22,11 +21,11 @@ Great Yawgmoth, Father of Machines, saw its perfection. Thus the Grand Evolution began.`; type Props = { - menu: MenuEntry[]; + menu: typeof MENU; }; const Page: NextPage<Props> = ({ menu }) => { - const [input, setInput] = useState<string>(DEFAULT_INPUT); + const [input, setInput] = useState(DEFAULT_INPUT); const [output, setOutput] = useState<{ id: number; text: string }[]>([]); const onChange = ({ target }: ChangeEvent<HTMLInputElement>) => diff --git a/src/pages/sandbox/markdown.tsx b/src/pages/sandbox/markdown.tsx index fa7d677a..dc11c2b6 100644 --- a/src/pages/sandbox/markdown.tsx +++ b/src/pages/sandbox/markdown.tsx @@ -4,12 +4,12 @@ import { type GetStaticProps, type NextPage } from 'next'; import { Layout } from '@/components/Layout/Layout'; import { Markdown } from '@/components/Markdown/Markdown'; import { getMarkdown } from '@/tools/markdown/getMarkdown'; -import { MENU } from '@/tools/markdown/getMenu'; -import { type MenuEntry, type Partial } from '@/tools/markdown/types'; +import { MENU } from '@/tools/markdown/menu'; +import { type Partial } from '@/tools/markdown/types'; type Props = { markdown: Partial; - menu: MenuEntry[]; + menu: typeof MENU; }; const Page: NextPage<Props> = ({ markdown, menu }) => ( diff --git a/src/theme/ThemeContext.tsx b/src/theme/ThemeContext.tsx index 3e8a086a..596b3c7f 100644 --- a/src/theme/ThemeContext.tsx +++ b/src/theme/ThemeContext.tsx @@ -1,4 +1,4 @@ -import { ThemeProvider as MuiThemeProvider } from '@mui/material/styles'; +import { ThemeProvider as MuiThemeProvider } from '@mui/material'; import { createContext, useEffect, diff --git a/src/theme/theme.ts b/src/theme/theme.ts index da7b5ac3..80fd2f8d 100644 --- a/src/theme/theme.ts +++ b/src/theme/theme.ts @@ -1,3 +1,4 @@ +import { alpha, createTheme, type ThemeOptions } from '@mui/material'; import { amber as article, grey, @@ -6,12 +7,6 @@ import { purple as report, pink as secondary, } from '@mui/material/colors'; -import { - alpha, - createTheme, - type Theme, - type ThemeOptions, -} from '@mui/material/styles'; import { deepmerge } from '@mui/utils'; import { barf } from '@/theme/tools/barf'; @@ -59,7 +54,7 @@ declare module '@mui/system/createTheme/shape' { /* eslint-enable @typescript-eslint/consistent-type-definitions */ -const customizeTheme = (options: ThemeOptions): Theme => { +const customizeTheme = (options: ThemeOptions) => { const theme = createTheme(options); const { breakpoints, palette, spacing, typography } = theme; const { mode } = palette; @@ -198,7 +193,7 @@ const customizeTheme = (options: ThemeOptions): Theme => { ); }; -export const darkTheme: Theme = customizeTheme({ +export const darkTheme = customizeTheme({ palette: { background: { default: '#121212', paper: grey[900] }, dividerOpaque: grey[800], @@ -213,7 +208,7 @@ export const darkTheme: Theme = customizeTheme({ }, }); -export const lightTheme: Theme = customizeTheme({ +export const lightTheme = customizeTheme({ palette: { background: { default: grey[100] }, dividerOpaque: grey[300], diff --git a/src/theme/tools/barf.ts b/src/theme/tools/barf.ts index 11ce5b51..7cd28ca2 100644 --- a/src/theme/tools/barf.ts +++ b/src/theme/tools/barf.ts @@ -1,7 +1,7 @@ -import { type Theme } from '@mui/material/styles'; -import { type CSSProperties } from '@mui/material/styles/createMixins'; +import { type Theme } from '@mui/material'; +import { type SystemStyleObject } from '@mui/system'; -export const barf = ({ breakpoints, spacing }: Theme): CSSProperties => ({ +export const barf = ({ breakpoints, spacing }: Theme): SystemStyleObject => ({ marginLeft: spacing(-4), marginRight: spacing(-4), width: 'auto', diff --git a/src/theme/tools/gutters.ts b/src/theme/tools/gutters.ts index b95ea9be..21afdb6d 100644 --- a/src/theme/tools/gutters.ts +++ b/src/theme/tools/gutters.ts @@ -1,7 +1,10 @@ -import { type Theme } from '@mui/material/styles'; -import { type CSSProperties } from '@mui/material/styles/createMixins'; +import { type Theme } from '@mui/material'; +import { type SystemStyleObject } from '@mui/system'; -export const gutters = ({ breakpoints, spacing }: Theme): CSSProperties => ({ +export const gutters = ({ + breakpoints, + spacing, +}: Theme): SystemStyleObject => ({ paddingLeft: spacing(4), paddingRight: spacing(4), [breakpoints.down('sm')]: { diff --git a/src/theme/tools/toolbarMargin.ts b/src/theme/tools/toolbarMargin.ts index 6c1e51a0..7ccf80ab 100644 --- a/src/theme/tools/toolbarMargin.ts +++ b/src/theme/tools/toolbarMargin.ts @@ -1,8 +1,8 @@ -import { type Theme } from '@mui/material/styles'; -import { type CSSProperties } from '@mui/material/styles/createMixins'; +import { type Theme } from '@mui/material'; +import { type SystemStyleObject } from '@mui/system'; /** Add top scroll margin to account for the sticky toolbar. */ -export const toolbarMargin = ({ breakpoints }: Theme): CSSProperties => ({ +export const toolbarMargin = ({ breakpoints }: Theme): SystemStyleObject => ({ // NOTE Values are hardcoded to follow that of the MUI built-in `toolbar` // mixin for simplicity. If the toolbar is customized, these values // should be updated. diff --git a/src/tools/markdown/files.ts b/src/tools/markdown/files.ts index 47c3c0cc..ac61d3c3 100644 --- a/src/tools/markdown/files.ts +++ b/src/tools/markdown/files.ts @@ -1,11 +1,14 @@ import { join } from 'node:path'; -import { makeNextRoutes, walk } from '@korumite/kiwi/server'; +import { makeCards, makeNextRoutes, walk } from '@korumite/kiwi/server'; import { z } from 'zod'; +import { formatDate } from '@/tools/io/formatDate'; +import { zCategory, zChapter } from '@/tools/z/schemas'; + /** @deprecated Use `BASE_URLS.ROOT` instead. */ const BASE_URL = join(process.cwd(), 'markdown'); -/** Base file URLs for Markdown content categories. */ +/** Base file URLs for Markdown content. */ export const BASE_URLS = { ARTICLES: join(BASE_URL, 'articles'), CHAPTERS: join(BASE_URL, 'chapters'), @@ -19,6 +22,16 @@ const ARTICLES_TREE = z .parse(walk(BASE_URLS.ARTICLES)); export const ARTICLES = { + CARDS: ( + await makeCards( + { paths: ARTICLES_TREE, root: BASE_URLS.ARTICLES }, + { + banner: ({ matter }) => z.string().parse(matter.banner), + date: ({ crumbs: [y, m, d] }) => formatDate(y, m, d), + slug: ({ crumbs }) => z.string().parse(crumbs[3]), + }, + ) + ).reverse(), ROUTES: makeNextRoutes(ARTICLES_TREE, ['year', 'month', 'day', 'article']), TREE: ARTICLES_TREE, } as const; @@ -30,6 +43,15 @@ const CHAPTERS_TREE = z .parse(walk(BASE_URLS.CHAPTERS)); export const CHAPTERS = { + CARDS: await makeCards( + { paths: CHAPTERS_TREE, root: BASE_URLS.CHAPTERS }, + { + banner: ({ matter }) => z.string().parse(matter.banner), + category: ({ crumbs }) => zCategory.parse(crumbs[0]), + chapter: ({ crumbs }) => zChapter.parse(crumbs[0]), + slug: ({ crumbs }) => z.string().parse(crumbs[1]), + }, + ), ROUTES: makeNextRoutes(CHAPTERS_TREE, ['category', 'chapter']), TREE: CHAPTERS_TREE, } as const; diff --git a/src/tools/markdown/getArticle.ts b/src/tools/markdown/getArticle.ts new file mode 100644 index 00000000..67c59c4e --- /dev/null +++ b/src/tools/markdown/getArticle.ts @@ -0,0 +1,35 @@ +import { read } from '@korumite/kiwi/server'; + +import { ARTICLES } from '@/tools/markdown/files'; +import { getBanner } from '@/tools/markdown/getBanner'; +import { type Article } from '@/tools/markdown/types'; +import { remarkDecklists } from '@/tools/remark/remarkDecklists.server'; +import { remarkMana } from '@/tools/remark/remarkMana.server'; +import { remarkScries } from '@/tools/remark/remarkScries.server'; +import { zArticleMatter, zMetadata } from '@/tools/z/schemas'; + +export const getArticle = async ( + ...crumbs: [year: string, month: string, day: string, article: string] +): Promise<Article> => { + const id = crumbs.join('!'); + const card = ARTICLES.CARDS.find((card) => card.id === id); + try { + if (!card) throw new Error('Missing article card'); + const { data, ...markdown } = await read( + [card.path], + remarkDecklists, + remarkMana, + remarkScries, + ); + const matter = zArticleMatter.parse(markdown.matter); + return { + ...markdown, + ...zMetadata.parse(data), + banner: await getBanner(matter.banner), + matter, + }; + } catch (error) { + const message = error instanceof Error ? error.message : error; + throw new Error(`${message} in "${id}"`); + } +}; diff --git a/src/tools/markdown/getArticleCards.ts b/src/tools/markdown/getArticleCards.ts index 9e837109..9e264a8e 100644 --- a/src/tools/markdown/getArticleCards.ts +++ b/src/tools/markdown/getArticleCards.ts @@ -1,62 +1,21 @@ -import { join } from 'node:path'; import { read } from '@korumite/kiwi/server'; -import { formatDate } from '@/tools/io/formatDate'; -import { ARTICLES, BASE_URLS } from '@/tools/markdown/files'; +import { ARTICLES } from '@/tools/markdown/files'; import { getBanner } from '@/tools/markdown/getBanner'; -import { readArticleMatter } from '@/tools/markdown/readMatter'; -import { - type ArticleCard, - type ArticleMatter, - type Banner, -} from '@/tools/markdown/types'; - -const MARKDOWN_EXTENSION = '.md'; - -/** Represent an article card for which the banner hasn't resolved yet. */ -type ArticleCardPending = Omit<ArticleCard, 'banner'> & { - banner?: ArticleCard['banner']; -}; +import { type ArticleCard } from '@/tools/markdown/types'; +import { zArticleMatter } from '@/tools/z/schemas'; /** Read file system and return a list of all articles. */ -export const getArticleCards = async (): Promise<ArticleCard[]> => { - /** Warmup array for banner promises. */ - const banners: Promise<Banner>[] = []; - // NOTE Reduce rightwards to sort descending - const cards = await ARTICLES.TREE.reduceRight<Promise<ArticleCardPending[]>>( - async (accumulator, crumbs) => { - const path = join(...crumbs) + MARKDOWN_EXTENSION; - const markdown = await read([BASE_URLS.ARTICLES, path]); - let matter: ArticleMatter; - try { - matter = readArticleMatter(markdown.matter); - } catch (error) { - const message = error instanceof Error ? error.message : `${error}`; - throw new Error(`${message} in "${path}"`); - } - const [year, month, day, slug] = crumbs; - const card: ArticleCardPending = { - date: formatDate(year, month, day), - day, +export const getArticleCards = async (): Promise<ArticleCard[]> => + Promise.all( + ARTICLES.CARDS.map(async (card) => { + const markdown = await read([card.path]); + const matter = zArticleMatter.parse(markdown.matter); + return { + banner: await getBanner(matter.banner), + date: card.date, + href: '/articles' + card.href, matter, - month, - route: ['/articles', ...crumbs].join('/'), - slug, - year, }; - banners.push( - getBanner(matter.banner).then( - (banner) => (card.banner = banner), - (error) => { - const message = `Failed to scry banner "${matter.banner}" (${error})`; - throw new Error(message); - }, - ), - ); - return [...(await accumulator), card]; - }, - Promise.resolve([]), + }), ); - await Promise.all(banners); - return cards as ArticleCard[]; -}; diff --git a/src/tools/markdown/getChapter.ts b/src/tools/markdown/getChapter.ts new file mode 100644 index 00000000..2e03704c --- /dev/null +++ b/src/tools/markdown/getChapter.ts @@ -0,0 +1,35 @@ +import { read } from '@korumite/kiwi/server'; + +import { CHAPTERS } from '@/tools/markdown/files'; +import { getBanner } from '@/tools/markdown/getBanner'; +import { type Chapter } from '@/tools/markdown/types'; +import { remarkDecklists } from '@/tools/remark/remarkDecklists.server'; +import { remarkMana } from '@/tools/remark/remarkMana.server'; +import { remarkScries } from '@/tools/remark/remarkScries.server'; +import { zChapterMatter, zMetadata } from '@/tools/z/schemas'; + +export const getChapter = async ( + ...crumbs: [chapter: string, slug: string] +): Promise<Chapter> => { + const id = crumbs.join('!'); + const card = CHAPTERS.CARDS.find((card) => card.id === id); + try { + if (!card) throw new Error('Missing chapter card'); + const { data, ...markdown } = await read( + [card.path], + remarkDecklists, + remarkMana, + remarkScries, + ); + const matter = zChapterMatter.parse(markdown.matter); + return { + ...markdown, + ...zMetadata.parse(data), + banner: await getBanner(matter.banner), + matter, + }; + } catch (error) { + const message = error instanceof Error ? error.message : error; + throw new Error(`${message} in "${id}"`); + } +}; diff --git a/src/tools/markdown/getChapterCards.ts b/src/tools/markdown/getChapterCards.ts deleted file mode 100644 index 4403245b..00000000 --- a/src/tools/markdown/getChapterCards.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { join } from 'node:path'; -import { read } from '@korumite/kiwi/server'; -import { z } from 'zod'; - -import { CATEGORIES } from '@/tools/markdown/constants'; -import { BASE_URLS, CHAPTERS } from '@/tools/markdown/files'; -import { readChapterMatter } from '@/tools/markdown/readMatter'; -import { type ChapterCard, type ChapterMatter } from '@/tools/markdown/types'; -import { union } from '@/tools/z/union'; - -const MARKDOWN_EXTENSION = '.md'; - -/** Read file system and return a list of all chapters. */ -export const getChapterCards = (): Promise<ChapterCard[]> => - CHAPTERS.TREE.reduce<Promise<ChapterCard[]>>(async (accumulator, crumbs) => { - const category = z - .preprocess( - (value) => (typeof value === 'string' ? value.toUpperCase() : value), - union(CATEGORIES), - ) - .parse(crumbs[0]); - const path = join(...crumbs) + MARKDOWN_EXTENSION; - const markdown = await read([BASE_URLS.CHAPTERS, path]); - let matter: ChapterMatter; - try { - matter = readChapterMatter(markdown.matter); - } catch (error) { - const message = error instanceof Error ? error.message : `${error}`; - throw new Error(`${message} in "${path}"`); - } - const card: ChapterCard = { - category, - matter, - route: ['', ...crumbs].join('/'), - slug: crumbs[1], - }; - return [...(await accumulator), card]; - }, Promise.resolve([])); diff --git a/src/tools/markdown/getMarkdown.ts b/src/tools/markdown/getMarkdown.ts index 7f941497..7c9e16bc 100644 --- a/src/tools/markdown/getMarkdown.ts +++ b/src/tools/markdown/getMarkdown.ts @@ -1,54 +1,12 @@ import { join } from 'node:path'; import { read } from '@korumite/kiwi/server'; -import { type Decklists } from '@/tools/decklists/types'; import { BASE_URLS } from '@/tools/markdown/files'; -import { getBanner } from '@/tools/markdown/getBanner'; -import { - readArticleMatter, - readChapterMatter, -} from '@/tools/markdown/readMatter'; -import { - type Article, - type Chapter, - type Partial, -} from '@/tools/markdown/types'; +import { type Partial } from '@/tools/markdown/types'; import { remarkDecklists } from '@/tools/remark/remarkDecklists.server'; import { remarkMana } from '@/tools/remark/remarkMana.server'; import { remarkScries } from '@/tools/remark/remarkScries.server'; -import { type Scries } from '@/tools/scryfall/types'; - -/** Convenience helper to read an article. See `getMarkdown`. */ -export const getArticle = async ( - ...crumbs: [year: string, month: string, day: string, article: string] -): Promise<Article> => { - const path = join('articles', ...crumbs); - const markdown = await getMarkdown(path); - try { - const matter = readArticleMatter(markdown.matter); - const banner = await getBanner(matter.banner); - return { ...markdown, banner, matter }; - } catch (error) { - const message = error instanceof Error ? error.message : `${error}`; - throw new Error(`${message} in "${path}"`); - } -}; - -/** Convenience helper to read a chapter. See `getMarkdown`. */ -export const getChapter = async ( - ...crumbs: [category: string, chapter: string] -): Promise<Chapter> => { - const path = join('chapters', ...crumbs); - const markdown = await getMarkdown(path); - try { - const matter = readChapterMatter(markdown.matter); - const banner = await getBanner(matter.banner); - return { ...markdown, banner, matter }; - } catch (error) { - const message = error instanceof Error ? error.message : `${error}`; - throw new Error(`${message} in "${path}"`); - } -}; +import { zMetadata } from '@/tools/z/schemas'; /** * Read the Markdown content found at the provided path crumbs. @@ -57,23 +15,17 @@ export const getChapter = async ( * The path is relative to the root of the project. */ export const getMarkdown = async (...crumbs: string[]): Promise<Partial> => { - const path = join(...crumbs) + '.md'; + const id = crumbs.join('!'); try { - const { data, ...rest } = await read( - [BASE_URLS.ROOT, path], + const { data, ...markdown } = await read( + [BASE_URLS.ROOT, join(...crumbs) + '.md'], remarkDecklists, remarkMana, remarkScries, ); - if (!data.decklists) throw new Error('Missing decklists'); - if (!data.scries) throw new Error('Missing scries'); - return { - decklists: data.decklists as Decklists, - scries: data.scries as Scries, - ...rest, - }; + return { ...markdown, ...zMetadata.parse(data) }; } catch (error) { - const message = error instanceof Error ? error.message : `${error}`; - throw new Error(`${message} in "${path}"`); + const message = error instanceof Error ? error.message : error; + throw new Error(`${message} in "${id}"`); } }; diff --git a/src/tools/markdown/getMenu.ts b/src/tools/markdown/getMenu.ts deleted file mode 100644 index ac592328..00000000 --- a/src/tools/markdown/getMenu.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { getChapterCards } from '@/tools/markdown/getChapterCards'; -import { - type ChapterCard, - type MenuDecoration, - type MenuEntry, -} from '@/tools/markdown/types'; - -/** List the menu entries and their corresponding decorations in order. */ -const DECORATIONS: MenuDecoration[] = [ - { - category: 'MEANDECK', - subtitle: 'Force of Will Doomsday', - title: 'Doomsday', - }, - { - category: 'DDFT', - subtitle: 'Doomsday Fetchland Tendrils', - title: 'DDFT', - }, - { - category: 'ENTOMBSDAY', - subtitle: 'Tin Fins Hybrid', - title: 'Entombsday', - }, - { - category: 'APPENDICES', - subtitle: 'Other Resources', - title: 'Appendices', - }, -]; - -/** - * Read file system and return a structured list of all chapters within their - * respective categories. - */ -const getMenu = async (): Promise<MenuEntry[]> => { - const cards = await getChapterCards(); - const menu = cards.reduce< - Partial<Record<ChapterCard['category'], ChapterCard[]>> - >((accumulator, card) => { - const { category } = card; - accumulator[category] = accumulator[category] || []; - accumulator[category].push(card); - return accumulator; - }, {}); - return DECORATIONS.map(({ category, subtitle, title }) => { - const pages = menu[category]; - if (!pages) { - throw new Error(`Could not find pages under '${category}' menu`); - } - // NOTE Sort chapters by the `order` frontmatter, no support above 99 - pages.sort((a, b) => (a.matter.order ?? 99) - (b.matter.order ?? 99)); - return { category, subtitle, title, pages }; - }); -}; - -/** A structured list of all chapters within their respective categories. */ -export const MENU = await getMenu(); diff --git a/src/tools/markdown/menu.ts b/src/tools/markdown/menu.ts new file mode 100644 index 00000000..843f2c30 --- /dev/null +++ b/src/tools/markdown/menu.ts @@ -0,0 +1,6 @@ +import { makeMenu } from '@korumite/kiwi/server'; + +import { CHAPTERS } from '@/tools/markdown/files'; + +/** A structured list of all chapters within their respective categories. */ +export const MENU = makeMenu(CHAPTERS.CARDS); diff --git a/src/tools/markdown/readMatter.ts b/src/tools/markdown/readMatter.ts deleted file mode 100644 index d8c67976..00000000 --- a/src/tools/markdown/readMatter.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { z } from 'zod'; - -import { KINDS, TAGS } from '@/tools/markdown/constants'; -import { type ArticleMatter, type ChapterMatter } from '@/tools/markdown/types'; -import { union } from '@/tools/z/union'; - -type ReadMatter<TMatter> = (data: Record<string, unknown>) => TMatter; - -export const readArticleMatter: ReadMatter<ArticleMatter> = (data) => - z - .object({ - authors: z.string(), - banner: z.string(), - kind: union(KINDS), - tags: z.preprocess( - (value) => (Array.isArray(value) ? value : [value]), - union(TAGS).array(), - ), - title: z.string(), - }) - .parse(data); - -export const readChapterMatter: ReadMatter<ChapterMatter> = (data) => - z - .object({ - banner: z.string(), - order: z.number().nonnegative().optional(), - title: z.string(), - }) - .parse(data); diff --git a/src/tools/markdown/types.ts b/src/tools/markdown/types.ts index d9ae2651..a49f1042 100644 --- a/src/tools/markdown/types.ts +++ b/src/tools/markdown/types.ts @@ -1,9 +1,5 @@ import { type Decklists } from '@/tools/decklists/types'; -import { - type CATEGORIES, - type KINDS, - type TAGS, -} from '@/tools/markdown/constants'; +import { type KINDS, type TAGS } from '@/tools/markdown/constants'; import { type Scries } from '@/tools/scryfall/types'; export type Banner = { @@ -13,47 +9,32 @@ export type Banner = { title: string; }; -// Cards /////////////////////////////////////////////////////////////////////// - -type Card<TMatter> = { - matter: TMatter; - route: string; - slug: string; -}; - -export type ArticleCard = Card<ArticleMatter> & { - banner: Banner; - date: string | null; - day: string; - month: string; - year: string; -}; - -export type ChapterCard = Card<ChapterMatter> & { - category: (typeof CATEGORIES)[number]; -}; - -// Documents /////////////////////////////////////////////////////////////////// - export type Partial = { decklists: Decklists; - matter: Record<string, unknown>; minutes: number; scries: Scries; text: string; }; -export type Article = Omit<Partial, 'matter'> & { +export type Article = Partial & { banner: Banner; matter: ArticleMatter; }; -export type Chapter = Omit<Partial, 'matter'> & { +export type ArticleCard = { banner: Banner; - matter: ChapterMatter; + date: string | null; + href: string; + matter: ArticleMatter; }; -// Matter ////////////////////////////////////////////////////////////////////// +export type Chapter = Partial & { + banner: Banner; + matter: { + banner: string; + title: string; + }; +}; export type ArticleMatter = { authors: string; @@ -62,21 +43,3 @@ export type ArticleMatter = { tags: (typeof TAGS)[number][]; title: string; }; - -export type ChapterMatter = { - banner: string; - order?: number; - title: string; -}; - -// Menu //////////////////////////////////////////////////////////////////////// - -export type MenuDecoration = { - category: (typeof CATEGORIES)[number]; - subtitle: string; - title: string; -}; - -export type MenuEntry = MenuDecoration & { - pages: ChapterCard[]; -}; diff --git a/src/tools/scryfall/parse.ts b/src/tools/scryfall/parse.ts index d1bb1107..0d8a6757 100644 --- a/src/tools/scryfall/parse.ts +++ b/src/tools/scryfall/parse.ts @@ -29,7 +29,7 @@ export const parse = async (options: { try { artPreview = await makePreview(art); } catch (error) { - const message = error instanceof Error ? error.message : `${error}`; + const message = error instanceof Error ? error.message : error; throw new Error(`${message} for "${art}"`); } } diff --git a/src/tools/z/schemas.test.ts b/src/tools/z/schemas.test.ts new file mode 100644 index 00000000..cbd8c15f --- /dev/null +++ b/src/tools/z/schemas.test.ts @@ -0,0 +1,70 @@ +import { zCategory, zChapter } from '@/tools/z/schemas'; + +describe('zCategory', () => { + it('should not validate an unknown category', () => { + // When + const test = () => zCategory.parse('unknown'); + // Then + expect(test).toThrow(); + }); + + it('should uppercase the parsed value', () => { + // When + const output = zCategory.parse('DdFt'); + // Then + expect(output).toEqual('DDFT'); + }); + + describe('Known categories', () => { + const tests: [input: string, expected: string][] = [ + ['appendices', 'APPENDICES'], + ['ddft', 'DDFT'], + ['ddeft', 'DDEFT'], + ['entombsday', 'ENTOMBSDAY'], + ['meandeck', 'MEANDECK'], + ]; + + it.each(tests)( + 'should validate known cateories: "%s"', + (input, expected) => { + // When + const output = zCategory.parse(input); + // Then + expect(output).toEqual(expected); + }, + ); + }); +}); + +describe('zChapter', () => { + it('should not validate an unknown chapter', () => { + // When + const test = () => zChapter.parse('unknown'); + // Then + expect(test).toThrow(); + }); + + it('should not validate a known chapter with the wrong case', () => { + // When + const test = () => zChapter.parse('Meandeck'); + // Then + expect(test).toThrow(); + }); + + describe('Known categories', () => { + const tests: string[] = [ + 'appendices', + 'ddft', + 'ddeft', + 'entombsday', + 'meandeck', + ]; + + it.each(tests)('should validate known cateories: "%s"', (value) => { + // When + const output = zChapter.parse(value); + // Then + expect(output).toEqual(value); + }); + }); +}); diff --git a/src/tools/z/schemas.ts b/src/tools/z/schemas.ts new file mode 100644 index 00000000..945b94dc --- /dev/null +++ b/src/tools/z/schemas.ts @@ -0,0 +1,65 @@ +import { z } from 'zod'; + +import { CATEGORIES, KINDS, TAGS } from '@/tools/markdown/constants'; +import { union } from '@/tools/z/union'; + +export const zArticleMatter = z.object({ + authors: z.string(), + banner: z.string(), + kind: union(KINDS), + tags: z.preprocess( + (value) => (Array.isArray(value) ? value : [value]), + union(TAGS).array(), + ), + title: z.string(), +}); + +/** A Zod schema to describe chapter categories. */ +export const zCategory = z.preprocess( + (value) => (typeof value === 'string' ? value.toUpperCase() : value), + union(CATEGORIES), +); + +/** A Zod schema to describe chapter path crumbs. */ +export const zChapter = union(CATEGORIES.map((it) => it.toLowerCase())); + +export const zChapterMatter = z.object({ + banner: z.string(), + title: z.string(), +}); + +const zCard = z + .tuple([z.number(), z.string()]) + .refine((_): _ is [quantity: number, name: string] => true); + +const zDecklist = z.object({ + // NOTE Formerly `Decklist` type + authors: z.string().nullable(), + colors: z.string().array().nullable(), + main: zCard.array().array(), + mainCount: z.number(), + side: zCard.array().array(), + sideCount: z.number(), + title: z.string().nullable(), + // NOTE Formerly `DecklistExtra` type + date: z.string().nullable(), + titleFromPath: z.string(), +}); + +const zScry = z.object({ + artist: z.string(), + flavor: z.string().nullable(), + images: z.object({ + art: z.string().nullable(), + artPreview: z.string().nullable(), + full: z.string().nullable(), + }), + name: z.string(), + setCode: z.string(), + setName: z.string(), +}); + +export const zMetadata = z.object({ + decklists: z.record(z.string(), zDecklist), + scries: z.record(z.string(), zScry.array()), +}); diff --git a/typings.d.ts b/typings.d.ts index 88dba3fb..eef7858f 100644 --- a/typings.d.ts +++ b/typings.d.ts @@ -3,6 +3,8 @@ interface ObjectConstructor { } interface String { + toLowerCase<T extends string>(this: T): Lowercase<T>; + toUpperCase<T extends string>(this: T): Uppercase<T>; split(separator: ''): string[]; split(separator: string): [first: string, ...rest: string[]]; }