From fd6ea294c1075561d683a75427f689079177b90a Mon Sep 17 00:00:00 2001 From: Joshua Kuan Date: Wed, 6 May 2026 21:26:30 -0400 Subject: [PATCH 01/35] chore(deps): modernize stack to Next 16, React 19, TS 5, Tailwind 4, DaisyUI 5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Comprehensive dependency upgrade and migration. All deps to latest, with explicit handling for breaking changes: - Pin next@16.2.5; React 19, TypeScript 5, Tailwind 4 (CSS-first config via @tailwindcss/postcss + @plugin daisyui in globals.css), DaisyUI 5, Luxon 3. - Node pinned to 22 via .nvmrc (Next 16 requires >=20.9). - Drop core-js (modern browser targets handle Array.prototype.at). - Migrate i18n: next-i18next was rewritten in v16 and dropped Pages-Router helpers. Replace with plain react-i18next + bundled translations in util/i18n.ts. No more serverSideTranslations / appWithTranslation. - Replace @olerichter00/use-localstorage with in-house hook (util/useLocalStorage.ts); the upstream lib was unmaintained since 2021 and SSR-unsafe. - Switch @tabler/icons (v1, dead) to @tabler/icons-react. - Replace next/image with plain for the three icon usages. Eliminates Vercel image-transformation quota burn — the icons are 20-38px so the loss of Next's optimization pipeline is negligible. - Move .mp3 alert sounds to /public/sounds and reference as URL strings; drop the bespoke webpack asset rule (Turbopack-friendly). - Add Luxon 3 nullability guards (Interval.start/end are now DateTime | null). - React 19: useRef(undefined), JSX namespace -> React.JSX. - Extract isWithinNotifyWindow predicate from pages/alarms.tsx into util/alarmTrigger.ts so the alarm-trigger logic is testable in isolation. - Restore DaisyUI 4 .label flex layout via globals.css compat block (v5 removed the default flex/justify-between/align-items styling). - Hydration fixes for clock cells (gate on mounted state). - Skip events whose IDs aren't in events.json instead of crashing (data.json drift symptom — will resolve with the data pipeline). --- .nvmrc | 1 + common/GameEvent.ts | 4 +- common/WanderingMerchant.ts | 12 +- components/GameEventTableCell.tsx | 37 +- components/MerchantTableCell.tsx | 17 +- components/NavBar.tsx | 4 +- components/SideBar.tsx | 2 +- components/modals/AlarmConfigModal.tsx | 10 +- components/modals/GitHubModal.tsx | 2 +- components/modals/MerchantConfigModal.tsx | 8 +- next-env.d.ts | 3 +- next-i18next.config.js | 6 - next.config.js | 13 - package-lock.json | 6154 ++++++++++++--------- package.json | 70 +- pages/_app.tsx | 6 +- pages/alarms.tsx | 195 +- pages/index.tsx | 1 - pages/merchants.tsx | 68 +- postcss.config.js | 2 +- public/sounds/alert_1.mp3 | Bin 0 -> 18043 bytes public/sounds/alert_2.mp3 | Bin 0 -> 11995 bytes public/sounds/alert_3.mp3 | Bin 0 -> 20107 bytes public/sounds/alert_4.mp3 | Bin 0 -> 23851 bytes public/sounds/alert_5.mp3 | Bin 0 -> 26683 bytes public/sounds/alert_6.mp3 | Bin 0 -> 83467 bytes sounds/index.js | 12 +- styles/globals.css | 28 +- tailwind.config.js | 15 - tsconfig.json | 29 +- util/alarmTrigger.ts | 19 + util/createTableData.tsx | 12 +- util/i18n.ts | 56 + util/useLocalStorage.ts | 46 + util/usePrevious.tsx | 2 +- 35 files changed, 4025 insertions(+), 2809 deletions(-) create mode 100644 .nvmrc delete mode 100644 next-i18next.config.js create mode 100644 public/sounds/alert_1.mp3 create mode 100644 public/sounds/alert_2.mp3 create mode 100644 public/sounds/alert_3.mp3 create mode 100644 public/sounds/alert_4.mp3 create mode 100644 public/sounds/alert_5.mp3 create mode 100644 public/sounds/alert_6.mp3 delete mode 100644 tailwind.config.js create mode 100644 util/alarmTrigger.ts create mode 100644 util/i18n.ts create mode 100644 util/useLocalStorage.ts diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..2bd5a0a9 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22 diff --git a/common/GameEvent.ts b/common/GameEvent.ts index 83e6bd26..215a0ca6 100644 --- a/common/GameEvent.ts +++ b/common/GameEvent.ts @@ -17,7 +17,9 @@ class GameEvent { this.times.push(t) } latest(t: DateTime): Interval { - return this.times.filter((ti) => ti.start.diff(t).valueOf() > 0)[0] + return this.times.filter( + (ti) => ti.start !== null && ti.start.diff(t).valueOf() > 0 + )[0] } } diff --git a/common/WanderingMerchant.ts b/common/WanderingMerchant.ts index b83e263d..90aef8b7 100644 --- a/common/WanderingMerchant.ts +++ b/common/WanderingMerchant.ts @@ -51,9 +51,11 @@ class WanderingMerchant { inProgress(serverTime: DateTime) { if (this.spawnTime != null) return true for (const interval of this.schedule) { + const { start, end } = interval + if (!start || !end) continue if ( - interval.start.diff(serverTime).toMillis() < 0 && - interval.end.diff(serverTime).toMillis() > 0 + start.diff(serverTime).toMillis() < 0 && + end.diff(serverTime).toMillis() > 0 ) return interval } @@ -62,8 +64,10 @@ class WanderingMerchant { nextSpawnTime(serverTime: DateTime) { for (let idx = 0; idx < this.schedule.length; idx++) { let interval = this.schedule[idx] - let startDiff = interval.start.diff(serverTime).toMillis() - let endDiff = interval.end.diff(serverTime).toMillis() + const { start, end } = interval + if (!start || !end) continue + let startDiff = start.diff(serverTime).toMillis() + let endDiff = end.diff(serverTime).toMillis() // case: time before first event of day if (startDiff > 0) return interval diff --git a/components/GameEventTableCell.tsx b/components/GameEventTableCell.tsx index 1816a581..d0eacc6d 100644 --- a/components/GameEventTableCell.tsx +++ b/components/GameEventTableCell.tsx @@ -1,12 +1,11 @@ import React, { useEffect, useState } from 'react' import { GameEvent } from '../common' -import Image from 'next/image' import { DateTime, Duration, Zone } from 'luxon' import classNames from 'classnames' -import useLocalStorage from '@olerichter00/use-localstorage' +import useLocalStorage from '../util/useLocalStorage' import { generateTimestampStrings } from '../util/createTableData' -import { useTranslation } from 'next-i18next' +import { useTranslation } from 'react-i18next' type CellProps = { gameEvent: GameEvent serverTime: DateTime @@ -24,21 +23,20 @@ const GameEventTableCell = (props: CellProps): React.ReactElement => { 'hideGrandPrix', false ) + const millisUntilLatest = (against: DateTime): number => { + const next = gameEvent.latest(serverTime) + if (!next || !next.start) return 0 + return next.start.diff(against).toMillis() + } const [timeUntil, setTimeUntil] = useState( - Duration.fromMillis( - gameEvent.latest(serverTime)?.start.diff(serverTime).toMillis() - ) + Duration.fromMillis(millisUntilLatest(serverTime)) ) useEffect(() => { if (!gameEvent.disabled) { const timer = setInterval(() => { - // setServerTime() setTimeUntil( Duration.fromMillis( - gameEvent - .latest(serverTime) - ?.start.diff(DateTime.now().setZone(serverTime.zone)) - .toMillis() + millisUntilLatest(DateTime.now().setZone(serverTime.zone)) ) ) }, 1000) @@ -66,10 +64,13 @@ const GameEventTableCell = (props: CellProps): React.ReactElement => { })} >
- {gameEvent.gameEvent.name}
@@ -144,7 +145,7 @@ const GameEventTableCell = (props: CellProps): React.ReactElement => {
  • { - let disabledUntil = gameEvent.latest(serverTime).end + let disabledUntil = gameEvent.latest(serverTime).end!! setDisabledAlarms({ ...disabledAlarms, [gameEvent.gameEvent.id]: disabledUntil.toMillis(), @@ -161,7 +162,7 @@ const GameEventTableCell = (props: CellProps): React.ReactElement => { onClick={(e) => { let disabledUntil = gameEvent .latest(serverTime) - .end.plus({ hours: 12 }) + .end!.plus({ hours: 12 }) setDisabledAlarms({ ...disabledAlarms, [gameEvent.gameEvent.id]: disabledUntil.toMillis(), @@ -228,7 +229,7 @@ const GameEventTableCell = (props: CellProps): React.ReactElement => { onClick={(e) => { let disabledUntil = gameEvent .latest(serverTime) - .end.plus({ hours: 336 }) + .end!.plus({ hours: 336 }) setDisabledAlarms({ ...disabledAlarms, [gameEvent.gameEvent.id]: disabledUntil.toMillis(), @@ -281,7 +282,7 @@ const GameEventTableCell = (props: CellProps): React.ReactElement => {
  • { - let disabledUntil = gameEvent.latest(serverTime).end + let disabledUntil = gameEvent.latest(serverTime).end! setDisabledAlarms({ ...disabledAlarms, [gameEvent.gameEvent.id]: disabledUntil.toMillis(), @@ -298,7 +299,7 @@ const GameEventTableCell = (props: CellProps): React.ReactElement => { onClick={(e) => { let disabledUntil = gameEvent .latest(serverTime) - .end.plus({ hours: 12 }) + .end!.plus({ hours: 12 }) setDisabledAlarms({ ...disabledAlarms, [gameEvent.gameEvent.id]: disabledUntil.toMillis(), @@ -365,7 +366,7 @@ const GameEventTableCell = (props: CellProps): React.ReactElement => { onClick={(e) => { let disabledUntil = gameEvent .latest(serverTime) - .end.plus({ hours: 336 }) + .end!.plus({ hours: 336 }) setDisabledAlarms({ ...disabledAlarms, [gameEvent.gameEvent.id]: disabledUntil.toMillis(), diff --git a/components/MerchantTableCell.tsx b/components/MerchantTableCell.tsx index 79003dad..7c004b09 100644 --- a/components/MerchantTableCell.tsx +++ b/components/MerchantTableCell.tsx @@ -3,12 +3,11 @@ import merchantSchedules from '../data/merchantSchedules.json' import itemMapping from '../data/itemMapping.json' import itemRarity from '../data/itemRarity.json' import { DateTime, Interval, Zone } from 'luxon' -import Image from 'next/image' import classNames from 'classnames' import { generateTimestampStrings } from '../util/createTableData' import WanderingMerchant from '../common/WanderingMerchant' -import useLocalStorage from '@olerichter00/use-localstorage' -import { useTranslation } from 'next-i18next' +import useLocalStorage from '../util/useLocalStorage' +import { useTranslation } from 'react-i18next' type ItemMappingKey = keyof typeof itemMapping @@ -36,7 +35,7 @@ const MerchantTableCell = (props: CellProps): React.ReactElement => { const [nextSpawnCountdown, setNextSpawnCountdown] = useState( merchant .nextSpawnTime(serverTime) - .start.setZone(serverTime.zone) + .start!.setZone(serverTime.zone) .diff(DateTime.now()) ) useEffect(() => { @@ -44,7 +43,7 @@ const MerchantTableCell = (props: CellProps): React.ReactElement => { setNextSpawnCountdown( merchant .nextSpawnTime(serverTime) - .start.setZone(serverTime.zone) + .start!.setZone(serverTime.zone) .diff(DateTime.now()) ) }, 1000) @@ -222,7 +221,7 @@ const MerchantTableCell = (props: CellProps): React.ReactElement => { {t('next-spawn')}:{' '} {merchant .nextSpawnTime(serverTime) - ?.start.setZone(localizedTZ) + ?.start?.setZone(localizedTZ) .toLocaleString( view24HrTime ? DateTime.TIME_24_SIMPLE : DateTime.TIME_SIMPLE )} @@ -290,12 +289,14 @@ const MerchantTableCell = (props: CellProps): React.ReactElement => { textColor(rarity(item)) )} > - {itemMapping[String(item) {t(`items.${item}.name`)} diff --git a/components/NavBar.tsx b/components/NavBar.tsx index 0f04754f..84d3d875 100644 --- a/components/NavBar.tsx +++ b/components/NavBar.tsx @@ -1,8 +1,8 @@ import classNames from 'classnames' import Link from 'next/link' import { useRouter } from 'next/router' -import { useTranslation } from 'next-i18next' -import { IconLanguage } from '@tabler/icons' +import { useTranslation } from 'react-i18next' +import { IconLanguage } from '@tabler/icons-react' const NavBar = () => { const { t } = useTranslation('common') diff --git a/components/SideBar.tsx b/components/SideBar.tsx index 16aa0f5c..2bf105ba 100644 --- a/components/SideBar.tsx +++ b/components/SideBar.tsx @@ -4,7 +4,7 @@ import { IconBrandPaypal, IconCoffee, IconFileCode, -} from '@tabler/icons' +} from '@tabler/icons-react' const SideBar = () => { return ( diff --git a/components/modals/AlarmConfigModal.tsx b/components/modals/AlarmConfigModal.tsx index 167acfbc..515146dd 100644 --- a/components/modals/AlarmConfigModal.tsx +++ b/components/modals/AlarmConfigModal.tsx @@ -1,9 +1,9 @@ import React from 'react' import { Howl, Howler } from 'howler' import { alert1, alert2, alert3, alert4, alert5, alert6 } from '../../sounds' -import useLocalStorage from '@olerichter00/use-localstorage' -import { IconVolume2, IconVolume3 } from '@tabler/icons' -import { useTranslation } from 'next-i18next' +import useLocalStorage from '../../util/useLocalStorage' +import { IconVolume2, IconVolume3 } from '@tabler/icons-react' +import { useTranslation } from 'react-i18next' const sounds = { 'Alert 1': alert1, @@ -33,8 +33,8 @@ const AlarmConfigModal = () => { 'view24HrTime', false ) - const defaultTheme = () => { - return (localStorage.getItem('darkMode') || window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) + const defaultTheme = (): boolean => { + return Boolean(localStorage.getItem('darkMode') || (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches)) } const [darkMode, setDarkMode] = useLocalStorage('darkMode', defaultTheme) const [alertSound, setAlertSound] = useLocalStorage( diff --git a/components/modals/GitHubModal.tsx b/components/modals/GitHubModal.tsx index 30f63d77..a980bc8f 100644 --- a/components/modals/GitHubModal.tsx +++ b/components/modals/GitHubModal.tsx @@ -1,4 +1,4 @@ -import { IconBrandDiscord } from '@tabler/icons' +import { IconBrandDiscord } from '@tabler/icons-react' import React from 'react' const GitHubModal = () => { diff --git a/components/modals/MerchantConfigModal.tsx b/components/modals/MerchantConfigModal.tsx index d1dfa60d..86817826 100644 --- a/components/modals/MerchantConfigModal.tsx +++ b/components/modals/MerchantConfigModal.tsx @@ -1,6 +1,6 @@ import React from 'react' -import useLocalStorage from '@olerichter00/use-localstorage' -import { useTranslation } from 'next-i18next' +import useLocalStorage from '../../util/useLocalStorage' +import { useTranslation } from 'react-i18next' const MerchantConfigModal = () => { const { t } = useTranslation('merchantConfig') @@ -12,8 +12,8 @@ const MerchantConfigModal = () => { 'view24HrTime', false ) - const defaultTheme = () => { - return (localStorage.getItem('darkMode') || window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) + const defaultTheme = (): boolean => { + return Boolean(localStorage.getItem('darkMode') || (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches)) } const [darkMode, setDarkMode] = useLocalStorage('darkMode', defaultTheme) const [alertSound, setAlertSound] = useLocalStorage( diff --git a/next-env.d.ts b/next-env.d.ts index 4f11a03d..19709046 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,5 +1,6 @@ /// /// +import "./.next/types/routes.d.ts"; // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/pages/api-reference/config/typescript for more information. diff --git a/next-i18next.config.js b/next-i18next.config.js deleted file mode 100644 index adac6e41..00000000 --- a/next-i18next.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - i18n: { - defaultLocale: 'en', - locales: ['en', 'zh'], - }, -} diff --git a/next.config.js b/next.config.js index 4eb2d2bc..e54020da 100644 --- a/next.config.js +++ b/next.config.js @@ -1,18 +1,6 @@ /** @type {import('next').NextConfig} */ -const { i18n } = require('./next-i18next.config') module.exports = { - webpack(config, options) { - config.module.rules.push({ - test: /\.(mp3)$/, - type: 'asset/resource', - generator: { - filename: 'static/chunks/[path][name].[hash][ext]', - }, - }) - return config - }, reactStrictMode: true, - images: { domains: ['lostarkcodex.com'] }, async redirects() { return [ { @@ -22,5 +10,4 @@ module.exports = { }, ] }, - i18n, } diff --git a/package-lock.json b/package-lock.json index debc63b6..354d089e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,3111 +1,4231 @@ { "name": "lostark-alarms", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "lostarktimer.app-web", - "dependencies": { - "@olerichter00/use-localstorage": "^0.1.1", - "@tabler/icons": "^1.55.0", - "@types/howler": "^2.2.6", - "@types/luxon": "^2.3.0", - "classnames": "^2.3.1", - "core-js": "^3.21.1", - "daisyui": "^2.8.0", - "howler": "^2.2.3", - "luxon": "^2.3.1", - "next": "latest", - "next-i18next": "^11.0.0", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "socket.io-client": "^4.4.1", - "swr": "^1.2.2", - "uuid": "^8.3.2" + "dependencies": { + "@tabler/icons-react": "latest", + "classnames": "latest", + "daisyui": "latest", + "howler": "latest", + "i18next": "^26.0.9", + "i18next-fs-backend": "^2.6.5", + "i18next-resources-to-backend": "^1.2.1", + "luxon": "latest", + "next": "16.2.5", + "react": "latest", + "react-dom": "latest", + "react-i18next": "^17.0.6", + "socket.io-client": "latest", + "swr": "latest", + "uuid": "latest" }, "devDependencies": { - "@types/node": "17.0.4", - "@types/react": "17.0.38", - "@types/uuid": "^8.3.4", - "autoprefixer": "^10.4.0", - "postcss": "^8.4.5", - "prettier": "^2.5.1", - "prettier-plugin-tailwindcss": "^0.1.1", - "tailwindcss": "^3.0.7", - "typescript": "4.5.4" + "@playwright/test": "latest", + "@tailwindcss/postcss": "latest", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "latest", + "@testing-library/react": "latest", + "@testing-library/user-event": "latest", + "@types/howler": "latest", + "@types/luxon": "latest", + "@types/node": "latest", + "@types/react": "latest", + "@types/react-dom": "latest", + "@types/uuid": "latest", + "@vitejs/plugin-react": "latest", + "@vitest/coverage-v8": "latest", + "autoprefixer": "latest", + "jsdom": "latest", + "postcss": "latest", + "prettier": "latest", + "prettier-plugin-tailwindcss": "latest", + "tailwindcss": "latest", + "typescript": "latest", + "vitest": "latest" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz", + "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@csstools/css-calc": "^3.2.0", + "@csstools/css-color-parser": "^4.1.0", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz", + "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.2.1", + "is-potential-custom-element-name": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/generational-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", + "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.16.7" + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" } }, - "node_modules/@babel/highlight/node_modules/chalk": { + "node_modules/@bramus/specificity": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "css-tree": "^3.0.0" }, + "bin": { + "specificity": "bin/cli.js" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">=4" + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.0.tgz", + "integrity": "sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" } }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@csstools/css-color-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.0.tgz", + "integrity": "sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.2.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" } }, - "node_modules/@babel/highlight/node_modules/color-name": { + "node_modules/@csstools/css-syntax-patches-for-csstree": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.3.tgz", + "integrity": "sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=20.19.0" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" } }, - "node_modules/@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "license": "MIT", + "optional": true, "dependencies": { - "regenerator-runtime": "^0.13.4" - }, + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", + "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } } }, - "node_modules/@next/env": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz", - "integrity": "sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ==" + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } }, - "node_modules/@next/swc-android-arm64": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.1.0.tgz", - "integrity": "sha512-/280MLdZe0W03stA69iL+v6I+J1ascrQ6FrXBlXGCsGzrfMaGr7fskMa0T5AhQIVQD4nA/46QQWxG//DYuFBcA==", + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", "cpu": [ "arm64" ], + "license": "Apache-2.0", "optional": true, "os": [ - "android" + "darwin" ], "engines": { - "node": ">= 10" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" } }, - "node_modules/@next/swc-darwin-arm64": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.0.tgz", - "integrity": "sha512-R8vcXE2/iONJ1Unf5Ptqjk6LRW3bggH+8drNkkzH4FLEQkHtELhvcmJwkXcuipyQCsIakldAXhRbZmm3YN1vXg==", + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", "cpu": [ - "arm64" + "x64" ], + "license": "Apache-2.0", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">= 10" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" } }, - "node_modules/@next/swc-darwin-x64": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.0.tgz", - "integrity": "sha512-ieAz0/J0PhmbZBB8+EA/JGdhRHBogF8BWaeqR7hwveb6SYEIJaDNQy0I+ZN8gF8hLj63bEDxJAs/cEhdnTq+ug==", + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", "cpu": [ "x64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "darwin" ], - "engines": { - "node": ">= 10" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@next/swc-linux-arm-gnueabihf": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.0.tgz", - "integrity": "sha512-njUd9hpl6o6A5d08dC0cKAgXKCzm5fFtgGe6i0eko8IAdtAPbtHxtpre3VeSxdZvuGFh+hb0REySQP9T1ttkog==", + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", "cpu": [ "arm" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">= 10" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.0.tgz", - "integrity": "sha512-OqangJLkRxVxMhDtcb7Qn1xjzFA3s50EIxY7mljbSCLybU+sByPaWAHY4px97ieOlr2y4S0xdPKkQ3BCAwyo6Q==", + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", "cpu": [ "arm64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">= 10" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.0.tgz", - "integrity": "sha512-hB8cLSt4GdmOpcwRe2UzI5UWn6HHO/vLkr5OTuNvCJ5xGDwpPXelVkYW/0+C3g5axbDW2Tym4S+MQCkkH9QfWA==", + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", "cpu": [ - "arm64" + "ppc64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">= 10" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.0.tgz", - "integrity": "sha512-OKO4R/digvrVuweSw/uBM4nSdyzsBV5EwkUeeG4KVpkIZEe64ZwRpnFB65bC6hGwxIBnTv5NMSnJ+0K/WmG78A==", + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", "cpu": [ - "x64" + "riscv64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">= 10" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.0.tgz", - "integrity": "sha512-JohhgAHZvOD3rQY7tlp7NlmvtvYHBYgY0x5ZCecUT6eCCcl9lv6iV3nfu82ErkxNk1H893fqH0FUpznZ/H3pSw==", + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", "cpu": [ "x64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">= 10" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.0.tgz", - "integrity": "sha512-T/3gIE6QEfKIJ4dmJk75v9hhNiYZhQYAoYm4iVo1TgcsuaKLFa+zMPh4056AHiG6n9tn2UQ1CFE8EoybEsqsSw==", + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", "cpu": [ "arm64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "win32" + "linux" ], - "engines": { - "node": ">= 10" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.0.tgz", - "integrity": "sha512-iwnKgHJdqhIW19H9PRPM9j55V6RdcOo6rX+5imx832BCWzkDbyomWnlzBfr6ByUYfhohb8QuH4hSGEikpPqI0Q==", + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", "cpu": [ - "ia32" + "x64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "win32" + "linux" ], - "engines": { - "node": ">= 10" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.0.tgz", - "integrity": "sha512-aBvcbMwuanDH4EMrL2TthNJy+4nP59Bimn8egqv6GHMVj0a44cU6Au4PjOhLNqEh9l+IpRGBqMTzec94UdC5xg==", + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", "cpu": [ - "x64" + "arm" ], + "license": "Apache-2.0", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">= 10" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@olerichter00/use-localstorage": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@olerichter00/use-localstorage/-/use-localstorage-0.1.1.tgz", - "integrity": "sha512-6yEHtP3EMm2cimWTdbNEAtDHSanypb2ZslBJf7is+3BLiCBsH8gPetq6Rt2LrS65EJrjT0zPtO+wD/zV3v39BQ==", - "peerDependencies": { - "react": ">=16.8.1" + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" } }, - "node_modules/@socket.io/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz", - "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==" - }, - "node_modules/@tabler/icons": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-1.55.0.tgz", - "integrity": "sha512-svozMn83K/93R8NZrklc8b0TtuzAVckKaYHgOu5ZRCeGwoyGPUCgeWd3/cTFoE0eUaJ4KwhqU1eXa2yJ8KcT5w==", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/codecalm" + "url": "https://opencollective.com/libvips" }, - "peerDependencies": { - "react": "^16.x || 17.x", - "react-dom": "^16.x || 17.x" - } - }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", - "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "node_modules/@types/howler": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@types/howler/-/howler-2.2.6.tgz", - "integrity": "sha512-9cLZICB6CFNIbwk0kJGvIvlEVI7D0dbbtcj00Uin81jQSMeKafaLq7r3v0RWQOX8BkM+KqboJaOeH5S/qpNqJg==" - }, - "node_modules/@types/luxon": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-2.3.0.tgz", - "integrity": "sha512-mWXdRlg+5dWvxU+uaijB2RY5NrJtMEXR6j+D6W66hPuezSVXrQqQvWa/JNHntgEYgjzeoVRrQVmMWAbKjUJiFQ==" - }, - "node_modules/@types/node": { - "version": "17.0.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.4.tgz", - "integrity": "sha512-6xwbrW4JJiJLgF+zNypN5wr2ykM9/jHcL7rQ8fZe2vuftggjzZeRSM4OwRc6Xk8qWjwJ99qVHo/JgOGmomWRog==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.4", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", - "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" - }, - "node_modules/@types/react": { - "version": "17.0.38", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz", - "integrity": "sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" } }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, - "node_modules/@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" } }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.4.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "url": "https://opencollective.com/libvips" }, - "engines": { - "node": ">= 8" + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" } }, - "node_modules/arg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", - "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" - }, - "node_modules/autoprefixer": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", - "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", - "dependencies": { - "browserslist": "^4.19.1", - "caniuse-lite": "^1.0.30001297", - "fraction.js": "^4.1.2", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^10 || ^12 || >=14" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "url": "https://opencollective.com/libvips" }, - "peerDependencies": { - "postcss": "^8.1.0" + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" } }, - "node_modules/backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" } }, - "node_modules/browserslist": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.0.tgz", - "integrity": "sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==", + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, "dependencies": { - "caniuse-lite": "^1.0.30001313", - "electron-to-chromium": "^1.4.76", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" + "@emnapi/runtime": "^1.7.0" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "url": "https://opencollective.com/libvips" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001316", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001316.tgz", - "integrity": "sha512-JgUdNoZKxPZFzbzJwy4hDSyGuH/gXz2rN51QmoR8cBQsVo58llD3A0vlRKKRt8FGf5u69P9eQyIH8/z9vN/S0Q==", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "url": "https://opencollective.com/libvips" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://opencollective.com/libvips" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, "engines": { - "node": ">= 8.10.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" - }, - "node_modules/color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.1.tgz", - "integrity": "sha512-MFJr0uY4RvTQUKvPq7dh9grVOTYSFeXja2mBXioCGjnjJoXrAp9jJ1NQTDR73c9nwBSAQiNKloKl5zq9WB9UPw==", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=7.0.0" + "node": ">=6.0.0" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" }, - "node_modules/color-string": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", - "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/core-js": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz", - "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "@tybys/wasm-util": "^0.10.1" }, - "engines": { - "node": ">=10" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" } }, - "node_modules/css-selector-tokenizer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", - "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", - "dependencies": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } + "node_modules/@next/env": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.5.tgz", + "integrity": "sha512-Lb9ElHD2klcyeVD25vW+siPFqz9QMzDUSgvFZNO+dZEKoMHex4viJhVuzBhrXKqb+UKnih7mVYbt50/7KLsSCA==", + "license": "MIT" }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.5.tgz", + "integrity": "sha512-BW+8PGVmsruomXHsitD8JG6gny9lEdobctjBwvtPF8AKtxGDR7nR35FOl/oK9UAPXBOBm+vx0k8qtpeHOXQMGQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=4" + "node": ">= 10" } }, - "node_modules/csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" + "node_modules/@next/swc-darwin-x64": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.5.tgz", + "integrity": "sha512-ZoCGnCl9LlQJWmqXrZAUlNxvuNmclvE+7zUif+nDydkkehl9FKxHJ+wxSQMj+C37BYFerKiEdX9s9o02ir975Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } }, - "node_modules/daisyui": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-2.8.0.tgz", - "integrity": "sha512-AU6JH6X5PI3ejM/w/1TdrWlyVGd7MgCweTCWVzmGvt5awoDSllg9fcsyXTfB48eDMRKUZ3IUC4KZv0Wde7MXjA==", - "dependencies": { - "color": "^4.2", - "css-selector-tokenizer": "^0.8.0", - "postcss-js": "^4.0.0", - "tailwindcss": "^3.0" - }, - "peerDependencies": { - "autoprefixer": "^10.0.2", - "postcss": "^8.1.6" + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.5.tgz", + "integrity": "sha512-AwcZzMChaWkOTZt3vu+2ZMIj8g4dYQY+B8VUVhlFSQ2JtvyZpefyYHTe00D6b6L7BysYw7vl3zsvs9jix8tl5Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.5.tgz", + "integrity": "sha512-QqMgqWbCBFsfiQ7BF3dUlW8HJy1LWhpcqbTpoHMWA9IV+TnWwDKozQJA5NdIAHjQ00yX2Q7AUkLr/XK4n77q8A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 10" } }, - "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "node_modules/detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "dependencies": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - }, - "bin": { - "detective": "bin/detective.js" - }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.5.tgz", + "integrity": "sha512-3hzeiFGZtyATVx9pCeuzTshXmh50vHZitqaeZiyJZaUmjQyrfjsVUgS8apOj1vEJCIpKJM/55F45yPAV2kpjsA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.8.0" + "node": ">= 10" } }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.5.tgz", + "integrity": "sha512-0mzZV/mAt7Qj2tYNdTB6AqrS8dwng/AQLSYC5Z1YLpZdi2wxqKDPK7RY2RvjB1fXyJfOfdA3l/yTF5yLi+WfuQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } }, - "node_modules/electron-to-chromium": { - "version": "1.4.82", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.82.tgz", - "integrity": "sha512-Ks+ANzLoIrFDUOJdjxYMH6CMKB8UQo5modAwvSZTxgF+vEs/U7G5IbWFUp6dS4klPkTDVdxbORuk8xAXXhMsWw==" + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.5.tgz", + "integrity": "sha512-f/H4nZ2zJBvA8/+HpsB9mNonF9zfQoAU6D0WxJrfzhJDvJLfngVN85oqxUyrDVK99DIFfFYhLpGa5K+c5uotSw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } }, - "node_modules/engine.io-client": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.1.1.tgz", - "integrity": "sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==", - "dependencies": { - "@socket.io/component-emitter": "~3.0.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.0", - "has-cors": "1.1.0", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~8.2.3", - "xmlhttprequest-ssl": "~2.0.0", - "yeast": "0.1.2" - } - }, - "node_modules/engine.io-client/node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.5.tgz", + "integrity": "sha512-nuP7DHs4koAojsIxVPkihNgKiRUKtCU65j5X6DAbSy8VBrfT/o90bCLLHPf51JEdOZwZMFzM6e0NiGWfIWjVAg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">= 10" } }, - "node_modules/engine.io-parser": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", - "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", + "node_modules/@oxc-project/types": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", + "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@playwright/test": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", + "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@socket.io/base64-arraybuffer": "~1.0.2" + "playwright": "1.59.1" + }, + "bin": { + "playwright": "cli.js" }, "engines": { - "node": ">=10.0.0" + "node": ">=18" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz", + "integrity": "sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.17.tgz", + "integrity": "sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.17.tgz", + "integrity": "sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.8.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.17.tgz", + "integrity": "sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8.6.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.17.tgz", + "integrity": "sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 6" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dependencies": { - "reusify": "^1.0.4" + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.17.tgz", + "integrity": "sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.17.tgz", + "integrity": "sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.17.tgz", + "integrity": "sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": ">=10.13.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.17.tgz", + "integrity": "sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "function-bind": "^1.1.1" + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" }, "engines": { - "node": ">= 0.4.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.17.tgz", + "integrity": "sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.17.tgz", + "integrity": "sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.7", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", + "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", + "dev": true, + "license": "MIT" }, - "node_modules/howler": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.3.tgz", - "integrity": "sha512-QM0FFkw0LRX1PR8pNzJVAY25JhIWvbKMBFM4gqk+QdV+kPXOhleWGCB6AiAF/goGjIHK2e/nIElplvjQwhr0jg==" + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" }, - "node_modules/html-parse-stringify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", - "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", "dependencies": { - "void-elements": "3.1.0" + "tslib": "^2.8.0" } }, - "node_modules/i18next": { - "version": "21.6.14", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.6.14.tgz", - "integrity": "sha512-XL6WyD+xlwQwbieXRlXhKWoLb/rkch50/rA+vl6untHnJ+aYnkQ0YDZciTWE78PPhOpbi2gR0LTJCJpiAhA+uQ==", - "funding": [ - { - "type": "individual", - "url": "https://locize.com" - }, - { - "type": "individual", - "url": "https://locize.com/i18next.html" - }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" - } - ], - "dependencies": { - "@babel/runtime": "^7.17.2" + "node_modules/@tabler/icons": { + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.43.0.tgz", + "integrity": "sha512-qXwS17Op9jqr3Asvu31fejyw8+OnRDKH7oR8nQXyUgW1pI44ET8OKG9kssy+XIvvAIyej6gZdGmviNUn1VMfPw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" } }, - "node_modules/i18next-fs-backend": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/i18next-fs-backend/-/i18next-fs-backend-1.1.4.tgz", - "integrity": "sha512-/MfAGMP0jHonV966uFf9PkWWuDjPYLIcsipnSO3NxpNtAgRUKLTwvm85fEmsF6hGeu0zbZiCQ3W74jwO6K9uXA==" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/@tabler/icons-react": { + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.43.0.tgz", + "integrity": "sha512-rXUuCQEeRbEk3lJxs3gwzdtaaITSwc/JUbp+AkqsGff5uBpzZw7eKPDk53xKoKLyjrbj82Ai4GuVG0kO89Jf5g==", + "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" + "@tabler/icons": "3.43.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/codecalm" + }, + "peerDependencies": { + "react": ">= 16" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/@tailwindcss/node": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.4.tgz", + "integrity": "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==", + "dev": true, + "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.4" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.4.tgz", + "integrity": "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.4", + "@tailwindcss/oxide-darwin-arm64": "4.2.4", + "@tailwindcss/oxide-darwin-x64": "4.2.4", + "@tailwindcss/oxide-freebsd-x64": "4.2.4", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.4", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.4", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.4", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.4", + "@tailwindcss/oxide-linux-x64-musl": "4.2.4", + "@tailwindcss/oxide-wasm32-wasi": "4.2.4", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.4", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.4" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.4.tgz", + "integrity": "sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">= 20" } }, - "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.4.tgz", + "integrity": "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.4.tgz", + "integrity": "sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.10.0" + "node": ">= 20" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.4.tgz", + "integrity": "sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=0.10.0" + "node": ">= 20" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.4.tgz", + "integrity": "sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.12.0" + "node": ">= 20" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.4.tgz", + "integrity": "sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } }, - "node_modules/lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.4.tgz", + "integrity": "sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">= 20" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.4.tgz", + "integrity": "sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.4.tgz", + "integrity": "sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.4.tgz", + "integrity": "sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" }, - "bin": { - "loose-envify": "cli.js" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/luxon": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.3.1.tgz", - "integrity": "sha512-I8vnjOmhXsMSlNMZlMkSOvgrxKJl0uOsEzdGgGNZuZPaS9KlefpE9KV95QFftlJSC+1UyCC9/I69R02cz/zcCA==", + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.4.tgz", + "integrity": "sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=12" + "node": ">= 20" } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.4.tgz", + "integrity": "sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 8" + "node": ">= 20" } }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "node_modules/@tailwindcss/postcss": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.4.tgz", + "integrity": "sha512-wgAVj6nUWAolAu8YFvzT2cTBIElWHkjZwFYovF+xsqKsW2ADxM/X2opxj5NsF/qVccAOjRNe8X2IdPzMsWyHTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.2.4", + "@tailwindcss/oxide": "4.2.4", + "postcss": "^8.5.6", + "tailwindcss": "4.2.4" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" }, "engines": { - "node": ">=8.6" + "node": ">=18" } }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/@testing-library/dom/node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" }, - "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "bin": { - "nanoid": "bin/nanoid.cjs" + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/next": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/next/-/next-12.1.0.tgz", - "integrity": "sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q==", + "node_modules/@testing-library/react": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", + "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", + "dev": true, + "license": "MIT", "dependencies": { - "@next/env": "12.1.0", - "caniuse-lite": "^1.0.30001283", - "postcss": "8.4.5", - "styled-jsx": "5.0.0", - "use-subscription": "1.5.1" - }, - "bin": { - "next": "dist/bin/next" + "@babel/runtime": "^7.12.5" }, "engines": { - "node": ">=12.22.0" - }, - "optionalDependencies": { - "@next/swc-android-arm64": "12.1.0", - "@next/swc-darwin-arm64": "12.1.0", - "@next/swc-darwin-x64": "12.1.0", - "@next/swc-linux-arm-gnueabihf": "12.1.0", - "@next/swc-linux-arm64-gnu": "12.1.0", - "@next/swc-linux-arm64-musl": "12.1.0", - "@next/swc-linux-x64-gnu": "12.1.0", - "@next/swc-linux-x64-musl": "12.1.0", - "@next/swc-win32-arm64-msvc": "12.1.0", - "@next/swc-win32-ia32-msvc": "12.1.0", - "@next/swc-win32-x64-msvc": "12.1.0" + "node": ">=18" }, "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^6.0.0 || ^7.0.0", - "react": "^17.0.2 || ^18.0.0-0", - "react-dom": "^17.0.2 || ^18.0.0-0", - "sass": "^1.3.0" + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { + "@types/react": { "optional": true }, - "sass": { + "@types/react-dom": { "optional": true } } }, - "node_modules/next-i18next": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/next-i18next/-/next-i18next-11.0.0.tgz", - "integrity": "sha512-phxbQiZGSJTTBE2FI4+BnqFZl88AI2V+6MrEQnT9aPFAXq/fATQ/F0pOUM3J7kU4nEeCfn3hjISq+ygGHlEz0g==", - "dependencies": { - "@babel/runtime": "^7.13.17", - "@types/hoist-non-react-statics": "^3.3.1", - "core-js": "^3", - "hoist-non-react-statics": "^3.2.0", - "i18next": "^21.6.14", - "i18next-fs-backend": "^1.1.4", - "react-i18next": "^11.16.2" - }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/isaachinman" + "node": ">=12", + "npm": ">=6" }, "peerDependencies": { - "next": ">= 10.0.0", - "react": ">= 16.8.0" + "@testing-library/dom": ">=7.21.4" } }, - "node_modules/next-i18next/node_modules/react-i18next": { - "version": "11.16.2", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.16.2.tgz", - "integrity": "sha512-1iuZduvARUelL5ux663FvIoDZExwFO+9QtRAAt4uvs1/aun4cUZt8XBrVg7iiDgNls9cOSORAhE7Ri5KA9RMvg==", + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "@babel/runtime": "^7.14.5", - "html-escaper": "^2.0.2", - "html-parse-stringify": "^3.0.1" - }, - "peerDependencies": { - "i18next": ">= 19.0.0", - "react": ">= 16.8.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } + "tslib": "^2.4.0" } }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", - "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", "dependencies": { - "nanoid": "^3.1.30", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, - "node_modules/node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/@types/howler": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@types/howler/-/howler-2.2.12.tgz", + "integrity": "sha512-hy769UICzOSdK0Kn1FBk4gN+lswcj1EKRkmiDtMkUGvFfYJzgaDXmVXkSShS2m89ERAatGIPnTUlp2HhfkVo5g==", + "dev": true, + "license": "MIT" }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/@types/luxon": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.1.tgz", + "integrity": "sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==", + "dev": true, + "license": "MIT" }, - "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "engines": { - "node": ">= 6" + "node_modules/@types/node": { + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.19.0" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" + "csstype": "^3.2.2" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" } }, - "node_modules/parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "node_modules/parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "node_modules/@types/uuid": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-11.0.0.tgz", + "integrity": "sha512-HVyk8nj2m+jcFRNazzqyVKiZezyhDKrGUA3jlEcg/nZ6Ms+qHwocba1Y/AaVaznJTAM9xpdFSh+ptbNrhOGvZA==", + "deprecated": "This is a stub types definition. uuid provides its own type definitions, so you do not need this installed.", + "dev": true, + "license": "MIT", + "dependencies": { + "uuid": "*" + } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/@vitejs/plugin-react": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", + "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.7" + }, "engines": { - "node": ">=8" + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" + "node_modules/@vitest/coverage-v8": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.5.tgz", + "integrity": "sha512-38C0/Ddb7HcRG0Z4/DUem8x57d2p9jYgp18mkaYswEOQBGsI1CG4f/hjm0ZCeaJfWhSZ4k7jgs29V1Zom7Ki9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^1.0.2", + "@vitest/utils": "4.1.5", + "ast-v8-to-istanbul": "^1.0.0", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.2", + "obug": "^2.1.1", + "std-env": "^4.0.0-rc.1", + "tinyrainbow": "^3.1.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "4.1.5", + "vitest": "4.1.5" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } } }, - "node_modules/postcss": { - "version": "8.4.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz", - "integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==", + "node_modules/@vitest/expect": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.5.tgz", + "integrity": "sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==", + "dev": true, + "license": "MIT", "dependencies": { - "nanoid": "^3.3.1", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.5", + "@vitest/utils": "4.1.5", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "url": "https://opencollective.com/vitest" } }, - "node_modules/postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "node_modules/@vitest/mocker": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.5.tgz", + "integrity": "sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==", + "dev": true, + "license": "MIT", "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" + "@vitest/spy": "4.1.5", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "postcss": "^8.3.3" + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "node_modules/@vitest/pretty-format": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.5.tgz", + "integrity": "sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.6" - }, - "engines": { - "node": ">=12.0" + "tinyrainbow": "^3.1.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.5.tgz", + "integrity": "sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.5", + "pathe": "^2.0.3" }, - "peerDependencies": { - "postcss": "^8.2.14" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", - "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", + "node_modules/@vitest/snapshot": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.5.tgz", + "integrity": "sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==", + "dev": true, + "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "@vitest/pretty-format": "4.1.5", + "@vitest/utils": "4.1.5", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "node_modules/@vitest/spy": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.5.tgz", + "integrity": "sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } }, - "node_modules/prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "node_modules/@vitest/utils": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.5.tgz", + "integrity": "sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==", "dev": true, - "bin": { - "prettier": "bin-prettier.js" + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.5", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "node_modules/prettier-plugin-tailwindcss": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.1.8.tgz", - "integrity": "sha512-hwarSBCswAXa+kqYtaAkFr3Vop9o04WOyZs0qo3NyvW8L7f1rif61wRyq0+ArmVThOuRBcJF5hjGXYk86cwemg==", + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12.17.0" + "node": ">=10" }, - "peerDependencies": { - "prettier": ">=2.2.0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-v8-to-istanbul": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.0.tgz", + "integrity": "sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^10.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", + "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", + "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "opencollective", + "url": "https://opencollective.com/postcss/" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "github", + "url": "https://github.com/sponsors/ai" } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + ], + "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "browserslist": "^4.28.2", + "caniuse-lite": "^1.0.30001787", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" + "node": "^10 || ^12 || >=14" }, "peerDependencies": { - "react": "17.0.2" + "postcss": "^8.1.0" } }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" + "node_modules/baseline-browser-mapping": { + "version": "2.10.27", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz", + "integrity": "sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" }, "engines": { - "node": ">=8.10.0" + "node": ">=6.0.0" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" }, "bin": { - "resolve": "bin/resolve" + "browserslist": "cli.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/caniuse-lite": { + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "dependencies": { - "queue-microtask": "^1.2.2" - } + "license": "CC-BY-4.0" }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" } }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dependencies": { - "is-arrayish": "^0.3.1" - } + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" }, - "node_modules/socket.io-client": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz", - "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", "dependencies": { - "@socket.io/component-emitter": "~3.0.0", - "backo2": "~1.0.2", - "debug": "~4.3.2", - "engine.io-client": "~6.1.1", - "parseuri": "0.0.6", - "socket.io-parser": "~4.1.1" + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=10.0.0" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "node_modules/socket.io-parser": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.2.tgz", - "integrity": "sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog==", - "dependencies": { - "@socket.io/component-emitter": "~3.0.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/daisyui": { + "version": "5.5.19", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.5.19.tgz", + "integrity": "sha512-pbFAkl1VCEh/MPCeclKL61I/MqRIFFhNU7yiXoDDRapXN4/qNCoMxeCCswyxEEhqL5eiTTfwHvucFtOE71C9sA==", + "license": "MIT", + "funding": { + "url": "https://github.com/saadeghi/daisyui?sponsor=1" } }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "node_modules/data-urls": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/styled-jsx": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz", - "integrity": "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==", - "engines": { - "node": ">= 12.0.0" + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || 18.x.x" + "engines": { + "node": ">=6.0" }, "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { + "supports-color": { "optional": true } } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/swr": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/swr/-/swr-1.2.2.tgz", - "integrity": "sha512-ky0BskS/V47GpW8d6RU7CPsr6J8cr7mQD6+do5eky3bM0IyJaoi3vO8UhvrzJaObuTlGhPl2szodeB2dUd76Xw==", - "peerDependencies": { - "react": "^16.11.0 || ^17.0.0 || ^18.0.0" - } + "node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" }, - "node_modules/tailwindcss": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz", - "integrity": "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==", - "dependencies": { - "arg": "^5.0.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "cosmiconfig": "^7.0.1", - "detective": "^5.2.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "normalize-path": "^3.0.0", - "object-hash": "^2.2.0", - "postcss": "^8.4.6", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.0", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "autoprefixer": "^10.0.2", - "postcss": "^8.0.9" - } + "node_modules/electron-to-chromium": { + "version": "1.5.352", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.352.tgz", + "integrity": "sha512-9wHk8x6dyuimoe18EdiDPWKExNdxYqo4fn4FwOVVper6RxT3cmpBwBkWWfSOCYJjQdIco/nPhJhNLmn4Ufg1Yg==", + "dev": true, + "license": "ISC" }, - "node_modules/tailwindcss/node_modules/postcss-load-config": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz", - "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==", + "node_modules/engine.io-client": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.4.tgz", + "integrity": "sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==", + "license": "MIT", "dependencies": { - "lilconfig": "^2.0.4", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.18.3", + "xmlhttprequest-ssl": "~2.1.1" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", "engines": { - "node": ">=8.0" + "node": ">=10.0.0" } }, - "node_modules/typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "node_modules/enhanced-resolve": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", + "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==", "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" }, "engines": { - "node": ">=4.2.0" + "node": ">=10.13.0" } }, - "node_modules/use-subscription": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", - "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", - "dependencies": { - "object-assign": "^4.1.1" + "node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0" + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" }, - "node_modules/void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", - "engines": { - "node": ">=0.4.0" + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=0.4" + "node": ">=12.0.0" } }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 6" - } - }, - "node_modules/yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@next/env": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz", - "integrity": "sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ==" - }, - "@next/swc-android-arm64": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.1.0.tgz", - "integrity": "sha512-/280MLdZe0W03stA69iL+v6I+J1ascrQ6FrXBlXGCsGzrfMaGr7fskMa0T5AhQIVQD4nA/46QQWxG//DYuFBcA==", - "optional": true - }, - "@next/swc-darwin-arm64": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.0.tgz", - "integrity": "sha512-R8vcXE2/iONJ1Unf5Ptqjk6LRW3bggH+8drNkkzH4FLEQkHtELhvcmJwkXcuipyQCsIakldAXhRbZmm3YN1vXg==", - "optional": true - }, - "@next/swc-darwin-x64": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.0.tgz", - "integrity": "sha512-ieAz0/J0PhmbZBB8+EA/JGdhRHBogF8BWaeqR7hwveb6SYEIJaDNQy0I+ZN8gF8hLj63bEDxJAs/cEhdnTq+ug==", - "optional": true - }, - "@next/swc-linux-arm-gnueabihf": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.0.tgz", - "integrity": "sha512-njUd9hpl6o6A5d08dC0cKAgXKCzm5fFtgGe6i0eko8IAdtAPbtHxtpre3VeSxdZvuGFh+hb0REySQP9T1ttkog==", - "optional": true - }, - "@next/swc-linux-arm64-gnu": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.0.tgz", - "integrity": "sha512-OqangJLkRxVxMhDtcb7Qn1xjzFA3s50EIxY7mljbSCLybU+sByPaWAHY4px97ieOlr2y4S0xdPKkQ3BCAwyo6Q==", - "optional": true - }, - "@next/swc-linux-arm64-musl": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.0.tgz", - "integrity": "sha512-hB8cLSt4GdmOpcwRe2UzI5UWn6HHO/vLkr5OTuNvCJ5xGDwpPXelVkYW/0+C3g5axbDW2Tym4S+MQCkkH9QfWA==", - "optional": true - }, - "@next/swc-linux-x64-gnu": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.0.tgz", - "integrity": "sha512-OKO4R/digvrVuweSw/uBM4nSdyzsBV5EwkUeeG4KVpkIZEe64ZwRpnFB65bC6hGwxIBnTv5NMSnJ+0K/WmG78A==", - "optional": true - }, - "@next/swc-linux-x64-musl": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.0.tgz", - "integrity": "sha512-JohhgAHZvOD3rQY7tlp7NlmvtvYHBYgY0x5ZCecUT6eCCcl9lv6iV3nfu82ErkxNk1H893fqH0FUpznZ/H3pSw==", - "optional": true - }, - "@next/swc-win32-arm64-msvc": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.0.tgz", - "integrity": "sha512-T/3gIE6QEfKIJ4dmJk75v9hhNiYZhQYAoYm4iVo1TgcsuaKLFa+zMPh4056AHiG6n9tn2UQ1CFE8EoybEsqsSw==", - "optional": true - }, - "@next/swc-win32-ia32-msvc": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.0.tgz", - "integrity": "sha512-iwnKgHJdqhIW19H9PRPM9j55V6RdcOo6rX+5imx832BCWzkDbyomWnlzBfr6ByUYfhohb8QuH4hSGEikpPqI0Q==", - "optional": true - }, - "@next/swc-win32-x64-msvc": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.0.tgz", - "integrity": "sha512-aBvcbMwuanDH4EMrL2TthNJy+4nP59Bimn8egqv6GHMVj0a44cU6Au4PjOhLNqEh9l+IpRGBqMTzec94UdC5xg==", - "optional": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@olerichter00/use-localstorage": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@olerichter00/use-localstorage/-/use-localstorage-0.1.1.tgz", - "integrity": "sha512-6yEHtP3EMm2cimWTdbNEAtDHSanypb2ZslBJf7is+3BLiCBsH8gPetq6Rt2LrS65EJrjT0zPtO+wD/zV3v39BQ==", - "requires": {} - }, - "@socket.io/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==" - }, - "@socket.io/component-emitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz", - "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==" - }, - "@tabler/icons": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-1.55.0.tgz", - "integrity": "sha512-svozMn83K/93R8NZrklc8b0TtuzAVckKaYHgOu5ZRCeGwoyGPUCgeWd3/cTFoE0eUaJ4KwhqU1eXa2yJ8KcT5w==", - "requires": {} - }, - "@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", - "requires": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "@types/howler": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@types/howler/-/howler-2.2.6.tgz", - "integrity": "sha512-9cLZICB6CFNIbwk0kJGvIvlEVI7D0dbbtcj00Uin81jQSMeKafaLq7r3v0RWQOX8BkM+KqboJaOeH5S/qpNqJg==" - }, - "@types/luxon": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-2.3.0.tgz", - "integrity": "sha512-mWXdRlg+5dWvxU+uaijB2RY5NrJtMEXR6j+D6W66hPuezSVXrQqQvWa/JNHntgEYgjzeoVRrQVmMWAbKjUJiFQ==" - }, - "@types/node": { - "version": "17.0.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.4.tgz", - "integrity": "sha512-6xwbrW4JJiJLgF+zNypN5wr2ykM9/jHcL7rQ8fZe2vuftggjzZeRSM4OwRc6Xk8qWjwJ99qVHo/JgOGmomWRog==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "@types/prop-types": { - "version": "15.7.4", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", - "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" - }, - "@types/react": { - "version": "17.0.38", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz", - "integrity": "sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==", - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, - "@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", - "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" - }, - "autoprefixer": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", - "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", - "requires": { - "browserslist": "^4.19.1", - "caniuse-lite": "^1.0.30001297", - "fraction.js": "^4.1.2", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.0.tgz", - "integrity": "sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==", - "requires": { - "caniuse-lite": "^1.0.30001313", - "electron-to-chromium": "^1.4.76", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" - }, - "caniuse-lite": { - "version": "1.0.30001316", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001316.tgz", - "integrity": "sha512-JgUdNoZKxPZFzbzJwy4hDSyGuH/gXz2rN51QmoR8cBQsVo58llD3A0vlRKKRt8FGf5u69P9eQyIH8/z9vN/S0Q==" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" - }, - "color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.1.tgz", - "integrity": "sha512-MFJr0uY4RvTQUKvPq7dh9grVOTYSFeXja2mBXioCGjnjJoXrAp9jJ1NQTDR73c9nwBSAQiNKloKl5zq9WB9UPw==", - "requires": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "color-string": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", - "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "core-js": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz", - "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==" - }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "css-selector-tokenizer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", - "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - }, - "csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" - }, - "daisyui": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-2.8.0.tgz", - "integrity": "sha512-AU6JH6X5PI3ejM/w/1TdrWlyVGd7MgCweTCWVzmGvt5awoDSllg9fcsyXTfB48eDMRKUZ3IUC4KZv0Wde7MXjA==", - "requires": { - "color": "^4.2", - "css-selector-tokenizer": "^0.8.0", - "postcss-js": "^4.0.0", - "tailwindcss": "^3.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "requires": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - } - }, - "didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "electron-to-chromium": { - "version": "1.4.82", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.82.tgz", - "integrity": "sha512-Ks+ANzLoIrFDUOJdjxYMH6CMKB8UQo5modAwvSZTxgF+vEs/U7G5IbWFUp6dS4klPkTDVdxbORuk8xAXXhMsWw==" - }, - "engine.io-client": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.1.1.tgz", - "integrity": "sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==", - "requires": { - "@socket.io/component-emitter": "~3.0.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.0", - "has-cors": "1.1.0", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~8.2.3", - "xmlhttprequest-ssl": "~2.0.0", - "yeast": "0.1.2" - }, - "dependencies": { - "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "requires": {} - } - } - }, - "engine.io-parser": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", - "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", - "requires": { - "@socket.io/base64-arraybuffer": "~1.0.2" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true } } }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" } }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" - }, - "fsevents": { + "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "requires": { - "is-glob": "^4.0.3" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" }, - "has-flag": { + "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "howler": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.3.tgz", - "integrity": "sha512-QM0FFkw0LRX1PR8pNzJVAY25JhIWvbKMBFM4gqk+QdV+kPXOhleWGCB6AiAF/goGjIHK2e/nIElplvjQwhr0jg==" + "node_modules/howler": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.4.tgz", + "integrity": "sha512-iARIBPgcQrwtEr+tALF+rapJ8qSc+Set2GJQl7xT1MQzWaVkFebdJhR3alVlSiUf5U7nAANKuj3aWpwerocD5w==", + "license": "MIT" + }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } }, - "html-escaper": { + "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" }, - "html-parse-stringify": { + "node_modules/html-parse-stringify": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", - "requires": { + "license": "MIT", + "dependencies": { "void-elements": "3.1.0" } }, - "i18next": { - "version": "21.6.14", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.6.14.tgz", - "integrity": "sha512-XL6WyD+xlwQwbieXRlXhKWoLb/rkch50/rA+vl6untHnJ+aYnkQ0YDZciTWE78PPhOpbi2gR0LTJCJpiAhA+uQ==", - "requires": { - "@babel/runtime": "^7.17.2" - } - }, - "i18next-fs-backend": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/i18next-fs-backend/-/i18next-fs-backend-1.1.4.tgz", - "integrity": "sha512-/MfAGMP0jHonV966uFf9PkWWuDjPYLIcsipnSO3NxpNtAgRUKLTwvm85fEmsF6hGeu0zbZiCQ3W74jwO6K9uXA==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "node_modules/i18next": { + "version": "26.0.9", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.0.9.tgz", + "integrity": "sha512-htjWlK5lGpjIDJxUdDLD6dO2jPl/RZHBpeZC80T5yr6Lci/tN3Oq9Doh9110ihliAIb4xmb45ngM76WcbP6GjA==", + "funding": [ + { + "type": "individual", + "url": "https://www.locize.com/i18next" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + }, + { + "type": "individual", + "url": "https://www.locize.com" + } + ], + "license": "MIT", + "peerDependencies": { + "typescript": "^5 || ^6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" + "node_modules/i18next-fs-backend": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/i18next-fs-backend/-/i18next-fs-backend-2.6.5.tgz", + "integrity": "sha512-+7HBrlaj3UFnNC9HqiXaIlNkwNINYkgQ2PS4h7qW/WGHC9/+OU9Xi0/tdvjjXATw3YCcpmNV7S3zDD9e10pTWg==", + "license": "MIT" + }, + "node_modules/i18next-resources-to-backend": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/i18next-resources-to-backend/-/i18next-resources-to-backend-1.2.1.tgz", + "integrity": "sha512-okHbVA+HZ7n1/76MsfhPqDou0fptl2dAlhRDu2ideXloRRduzHsqDOznJBef+R3DFZnbvWoBW+KxJ7fnFjd6Yw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" } }, - "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "requires": { - "has": "^1.0.3" + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==" - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" } }, - "luxon": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.3.1.tgz", - "integrity": "sha512-I8vnjOmhXsMSlNMZlMkSOvgrxKJl0uOsEzdGgGNZuZPaS9KlefpE9KV95QFftlJSC+1UyCC9/I69R02cz/zcCA==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" } }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "node_modules/js-tokens": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "dev": true, + "license": "MIT" }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==" - }, - "next": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/next/-/next-12.1.0.tgz", - "integrity": "sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q==", - "requires": { - "@next/env": "12.1.0", - "@next/swc-android-arm64": "12.1.0", - "@next/swc-darwin-arm64": "12.1.0", - "@next/swc-darwin-x64": "12.1.0", - "@next/swc-linux-arm-gnueabihf": "12.1.0", - "@next/swc-linux-arm64-gnu": "12.1.0", - "@next/swc-linux-arm64-musl": "12.1.0", - "@next/swc-linux-x64-gnu": "12.1.0", - "@next/swc-linux-x64-musl": "12.1.0", - "@next/swc-win32-arm64-msvc": "12.1.0", - "@next/swc-win32-ia32-msvc": "12.1.0", - "@next/swc-win32-x64-msvc": "12.1.0", - "caniuse-lite": "^1.0.30001283", - "postcss": "8.4.5", - "styled-jsx": "5.0.0", - "use-subscription": "1.5.1" - }, - "dependencies": { - "postcss": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", - "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", - "requires": { - "nanoid": "^3.1.30", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" - } + "node_modules/jsdom": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", + "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^5.1.11", + "@asamuzakjp/dom-selector": "^7.1.1", + "@bramus/specificity": "^2.4.2", + "@csstools/css-syntax-patches-for-csstree": "^1.1.3", + "@exodus/bytes": "^1.15.0", + "css-tree": "^3.2.1", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.3.5", + "parse5": "^8.0.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.1", + "undici": "^7.25.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.1", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true } } }, - "next-i18next": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/next-i18next/-/next-i18next-11.0.0.tgz", - "integrity": "sha512-phxbQiZGSJTTBE2FI4+BnqFZl88AI2V+6MrEQnT9aPFAXq/fATQ/F0pOUM3J7kU4nEeCfn3hjISq+ygGHlEz0g==", - "requires": { - "@babel/runtime": "^7.13.17", - "@types/hoist-non-react-statics": "^3.3.1", - "core-js": "^3", - "hoist-non-react-statics": "^3.2.0", - "i18next": "^21.6.14", - "i18next-fs-backend": "^1.1.4", - "react-i18next": "^11.16.2" - }, - "dependencies": { - "react-i18next": { - "version": "11.16.2", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.16.2.tgz", - "integrity": "sha512-1iuZduvARUelL5ux663FvIoDZExwFO+9QtRAAt4uvs1/aun4cUZt8XBrVg7iiDgNls9cOSORAhE7Ri5KA9RMvg==", - "requires": { - "@babel/runtime": "^7.14.5", - "html-escaper": "^2.0.2", - "html-parse-stringify": "^3.0.1" - } - } + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lru-cache": { + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.6.tgz", + "integrity": "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/luxon": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", + "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/next/-/next-16.2.5.tgz", + "integrity": "sha512-TkVTm9F2WEulkgGljm4wPwNgvCCWCVw6StUHsZb8WZpHFRjepoUWg3d7L4IMg7IyjcJ4Co9eVhpro8e8O+KarQ==", + "license": "MIT", + "dependencies": { + "@next/env": "16.2.5", + "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.9.19", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.2.5", + "@next/swc-darwin-x64": "16.2.5", + "@next/swc-linux-arm64-gnu": "16.2.5", + "@next/swc-linux-arm64-musl": "16.2.5", + "@next/swc-linux-x64-gnu": "16.2.5", + "@next/swc-linux-x64-musl": "16.2.5", + "@next/swc-win32-arm64-msvc": "16.2.5", + "@next/swc-win32-x64-msvc": "16.2.5", + "sharp": "^0.34.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-releases": { + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/playwright": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", + "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.59.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", + "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/postcss": { + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prettier": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.8.0.tgz", + "integrity": "sha512-V8ITGH87yuBDF6JpEZTOVlUz/saAwqb8f3HRgUj8Lh+tGCcrmorhsLpYqzygwFwK0PE2Ib6Mv3M7T/uE2tZV1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.19" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-hermes": "*", + "@prettier/plugin-oxc": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-multiline-arrays": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-hermes": { + "optional": true + }, + "@prettier/plugin-oxc": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-multiline-arrays": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", + "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz", + "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.6" + } + }, + "node_modules/react-i18next": { + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-17.0.6.tgz", + "integrity": "sha512-WzJ6SMKF+GTD7JZZqxSR1AKKmXjaSu39sClUrNlwxS4Tl7a99O+ltFy6yhPMO+wgZuxpQjJ2PZkfrQKmAqrLhw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "html-parse-stringify": "^3.0.1", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "i18next": ">= 26.0.1", + "react": ">= 16.8.0", + "typescript": "^5 || ^6" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.17.tgz", + "integrity": "sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.127.0", + "@rolldown/pluginutils": "1.0.0-rc.17" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.17", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.17", + "@rolldown/binding-darwin-x64": "1.0.0-rc.17", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.17", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.17", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.17", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.17", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.17", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.17", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.17", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.17" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.17.tgz", + "integrity": "sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/socket.io-client": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz", + "integrity": "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz", + "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", + "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" + "node_modules/swr": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.4.1.tgz", + "integrity": "sha512-2CC6CiKQtEwaEeNiqWTAw9PGykW8SR5zZX8MZk6TeAvEAnVS7Visz8WzphqgtQ8v2xz/4Q5K+j+SeMaKXeeQIA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + "node_modules/tailwindcss": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz", + "integrity": "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==", + "dev": true, + "license": "MIT" }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } }, - "object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" + "node_modules/tinyexec": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", + "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" } }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "postcss": { - "version": "8.4.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz", - "integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==", - "requires": { - "nanoid": "^3.3.1", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" } }, - "postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "requires": { - "camelcase-css": "^2.0.1" + "node_modules/tldts": { + "version": "7.0.30", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.30.tgz", + "integrity": "sha512-ELrFxuqsDdHUwoh0XxDbxuLD3Wnz49Z57IFvTtvWy1hJdcMZjXLIuonjilCiWHlT2GbE4Wlv1wKVTzDFnXH1aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.30" + }, + "bin": { + "tldts": "bin/cli.js" } }, - "postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", - "requires": { - "postcss-selector-parser": "^6.0.6" + "node_modules/tldts-core": { + "version": "7.0.30", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.30.tgz", + "integrity": "sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" } }, - "postcss-selector-parser": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", - "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" } }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, - "prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", - "dev": true + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", + "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } }, - "prettier-plugin-tailwindcss": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.1.8.tgz", - "integrity": "sha512-hwarSBCswAXa+kqYtaAkFr3Vop9o04WOyZs0qo3NyvW8L7f1rif61wRyq0+ArmVThOuRBcJF5hjGXYk86cwemg==", + "node_modules/undici-types": { + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", "dev": true, - "requires": {} + "license": "MIT" }, - "queue-microtask": { + "node_modules/update-browserslist-db": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } }, - "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "node_modules/uuid": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", + "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" } }, - "react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + "node_modules/vite": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.10.tgz", + "integrity": "sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.10", + "rolldown": "1.0.0-rc.17", + "tinyglobby": "^0.2.16" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "socket.io-client": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz", - "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==", - "requires": { - "@socket.io/component-emitter": "~3.0.0", - "backo2": "~1.0.2", - "debug": "~4.3.2", - "engine.io-client": "~6.1.1", - "parseuri": "0.0.6", - "socket.io-parser": "~4.1.1" + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "socket.io-parser": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.2.tgz", - "integrity": "sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog==", - "requires": { - "@socket.io/component-emitter": "~3.0.0", - "debug": "~4.3.1" + "node_modules/vitest": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.5.tgz", + "integrity": "sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.5", + "@vitest/mocker": "4.1.5", + "@vitest/pretty-format": "4.1.5", + "@vitest/runner": "4.1.5", + "@vitest/snapshot": "4.1.5", + "@vitest/spy": "4.1.5", + "@vitest/utils": "4.1.5", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.5", + "@vitest/browser-preview": "4.1.5", + "@vitest/browser-webdriverio": "4.1.5", + "@vitest/coverage-istanbul": "4.1.5", + "@vitest/coverage-v8": "4.1.5", + "@vitest/ui": "4.1.5", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } } }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "styled-jsx": { + "node_modules/w3c-xmlserializer": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz", - "integrity": "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==", - "requires": {} - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" } }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "swr": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/swr/-/swr-1.2.2.tgz", - "integrity": "sha512-ky0BskS/V47GpW8d6RU7CPsr6J8cr7mQD6+do5eky3bM0IyJaoi3vO8UhvrzJaObuTlGhPl2szodeB2dUd76Xw==", - "requires": {} - }, - "tailwindcss": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz", - "integrity": "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==", - "requires": { - "arg": "^5.0.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "cosmiconfig": "^7.0.1", - "detective": "^5.2.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "normalize-path": "^3.0.0", - "object-hash": "^2.2.0", - "postcss": "^8.4.6", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.0", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.0" - }, - "dependencies": { - "postcss-load-config": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz", - "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==", - "requires": { - "lilconfig": "^2.0.4", - "yaml": "^1.10.2" - } - } + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" } }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" + "node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" } }, - "typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", - "dev": true - }, - "use-subscription": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", - "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", - "requires": { - "object-assign": "^4.1.1" + "node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, - "void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=" + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } }, - "xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==" + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "engines": { + "node": ">=0.4.0" + } } } } diff --git a/package.json b/package.json index 1fa1fc49..f988e677 100644 --- a/package.json +++ b/package.json @@ -3,35 +3,53 @@ "scripts": { "dev": "next dev", "build": "next build", - "start": "next start" + "start": "next start", + "typecheck": "tsc --noEmit", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage", + "test:e2e": "playwright test", + "test:e2e:install": "playwright install chromium" }, "dependencies": { - "@olerichter00/use-localstorage": "^0.1.1", - "@tabler/icons": "^1.55.0", - "@types/howler": "^2.2.6", - "@types/luxon": "^2.3.0", - "classnames": "^2.3.1", - "core-js": "^3.21.1", - "daisyui": "^2.8.0", - "howler": "^2.2.3", - "luxon": "^2.3.1", - "next": "latest", - "next-i18next": "^11.0.0", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "socket.io-client": "^4.4.1", - "swr": "^1.2.2", - "uuid": "^8.3.2" + "@tabler/icons-react": "latest", + "classnames": "latest", + "daisyui": "latest", + "howler": "latest", + "i18next": "^26.0.9", + "i18next-fs-backend": "^2.6.5", + "i18next-resources-to-backend": "^1.2.1", + "luxon": "latest", + "next": "16.2.5", + "react": "latest", + "react-dom": "latest", + "react-i18next": "^17.0.6", + "socket.io-client": "latest", + "swr": "latest", + "uuid": "latest" }, "devDependencies": { - "@types/node": "17.0.4", - "@types/react": "17.0.38", - "@types/uuid": "^8.3.4", - "autoprefixer": "^10.4.0", - "postcss": "^8.4.5", - "prettier": "^2.5.1", - "prettier-plugin-tailwindcss": "^0.1.1", - "tailwindcss": "^3.0.7", - "typescript": "4.5.4" + "@playwright/test": "latest", + "@tailwindcss/postcss": "latest", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "latest", + "@testing-library/react": "latest", + "@testing-library/user-event": "latest", + "@types/howler": "latest", + "@types/luxon": "latest", + "@types/node": "latest", + "@types/react": "latest", + "@types/react-dom": "latest", + "@types/uuid": "latest", + "@vitejs/plugin-react": "latest", + "@vitest/coverage-v8": "latest", + "autoprefixer": "latest", + "jsdom": "latest", + "postcss": "latest", + "prettier": "latest", + "prettier-plugin-tailwindcss": "latest", + "tailwindcss": "latest", + "typescript": "latest", + "vitest": "latest" } } diff --git a/pages/_app.tsx b/pages/_app.tsx index 25b88f2a..d2e8e9ce 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -3,8 +3,8 @@ import type { AppProps } from 'next/app' import Head from 'next/head' import Script from 'next/script' import { ChangeLogModal, GitHubModal, SideBar } from '../components' -import { appWithTranslation } from 'next-i18next' -import { IconBrandTwitch } from '@tabler/icons' +import '../util/i18n' +import { IconBrandTwitch } from '@tabler/icons-react' import { SWRConfig } from 'swr' import NavBar from '../components/NavBar' @@ -99,4 +99,4 @@ function MyApp({ Component, pageProps, ...AppProps }: AppProps) { ) } -export default appWithTranslation(MyApp) +export default MyApp diff --git a/pages/alarms.tsx b/pages/alarms.tsx index 1affc9f2..066a2659 100644 --- a/pages/alarms.tsx +++ b/pages/alarms.tsx @@ -5,16 +5,16 @@ import { APIGameEvent, APIEventType } from '../common/api' import { GameEvent } from '../common' import { AlarmConfigModal } from '../components' import { DateTime, Duration, Interval } from 'luxon' -import useLocalStorage from '@olerichter00/use-localstorage' +import useLocalStorage from '../util/useLocalStorage' import { Howl, Howler } from 'howler' import { alert1, alert2, alert3, alert4, alert5, alert6 } from '../sounds' -import 'core-js/features/array/at' -import { IconSettings } from '@tabler/icons' +import { IconSettings } from '@tabler/icons-react' import usePrevious from '../util/usePrevious' import { createTableData } from '../util/createTableData' import { RegionKey } from '../util/types/types' import { RegionTimeZoneMapping } from '../util/static' -import { useTranslation } from 'next-i18next' +import { isWithinNotifyWindow } from '../util/alarmTrigger' +import { useTranslation } from 'react-i18next' var classNames = require('classnames') type AlertSoundKeys = @@ -86,9 +86,9 @@ const Alarms: NextPage = () => { 'US West' ) const isMounted = useRef(false) - const defaultTheme = () => { + const defaultTheme = (): boolean => { // Defaults to system theme if unconfigured - return ( + return Boolean( localStorage.getItem('darkMode') || (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) @@ -126,9 +126,9 @@ const Alarms: NextPage = () => { undefined ) const [todayEvents, setTodayEvents] = useState>([]) - const [fullEventsTable, setFullEventsTable] = useState>([]) + const [fullEventsTable, setFullEventsTable] = useState>([]) const [currentEventsTable, setCurrentEventsTable] = useState< - Array + Array >([]) const [selectedEventType, setSelectedEventType] = useState(-1) @@ -228,7 +228,8 @@ const Alarms: NextPage = () => { let disabledAlarmsKeys = Object.keys(disabledAlarms || {}) Object.entries(allEventData).forEach((eventType) => { const [type, monthDayMap] = eventType as [string, any] - let et = eventTypeIconMapping.find((et) => et.id.toString() === type)! + let et = eventTypeIconMapping.find((et) => et.id.toString() === type) + if (!et) return for (const [month, days] of Object.entries(monthDayMap) as [ string, any @@ -239,7 +240,8 @@ const Alarms: NextPage = () => { string, any ]) { - let gt = eventIDNameMapping.find((gt) => gt.id === eventId)! + let gt = eventIDNameMapping.find((gt) => gt.id === eventId) + if (!gt) continue let gameEvent = new GameEvent(et, gt) eventTime.forEach((time: string, idx: number) => { @@ -300,9 +302,9 @@ const Alarms: NextPage = () => { return t.start && t.start.day === selectedDate.day }) !== undefined && ge.times.length && - ge.times.at(0)?.start.day === selectedDate.day && - (ge.times.at(-1)?.start.day === selectedDate.plus({ days: 1 }).day || - ge.times.at(-1)?.start.day === selectedDate.day) + ge.times.at(0)?.start?.day === selectedDate.day && + (ge.times.at(-1)?.start?.day === selectedDate.plus({ days: 1 }).day || + ge.times.at(-1)?.start?.day === selectedDate.day) ) setGameEvents(gameEvents) @@ -374,12 +376,8 @@ const Alarms: NextPage = () => { } } - let latest = event.latest(serverTime) - if (latest) { - let value = latest.start.diff(serverTime).valueOf() - if (!event.disabled && 0 <= value && value <= ms) - currEventsTable.push(event) - else allEventsTable.push(event) + if (isWithinNotifyWindow(event, serverTime, ms)) { + currEventsTable.push(event) } else { allEventsTable.push(event) } @@ -395,8 +393,8 @@ const Alarms: NextPage = () => { let aTime = a.latest(serverTime) let bTime = b.latest(serverTime) if (aTime && bTime) { - let aTime = a.latest(serverTime).start.diff(serverTime).valueOf() - let bTime = b.latest(serverTime).start.diff(serverTime).valueOf() + let aTime = a.latest(serverTime).start!.diff(serverTime).valueOf() + let bTime = b.latest(serverTime).start!.diff(serverTime).valueOf() if (aTime < bTime) { finalCmp = -1 @@ -416,8 +414,8 @@ const Alarms: NextPage = () => { }) currEventsTable = currEventsTable.sort( (a, b) => - a.latest(serverTime).start.valueOf() - - b.latest(serverTime).start.valueOf() + a.latest(serverTime).start!.valueOf() - + b.latest(serverTime).start!.valueOf() ) const currentEventsTableData = createTableData({ events: currEventsTable, @@ -520,20 +518,7 @@ const Alarms: NextPage = () => {
    @@ -545,27 +530,14 @@ const Alarms: NextPage = () => { {selectedDate.monthLong} {selectedDate.day} {serverTime.hasSame(selectedDate, 'day') ? null : ( - + ({selectedDate.toRelative()}) )} @@ -604,15 +576,18 @@ const Alarms: NextPage = () => { {t('common:current-time')}: - {currDate.toLocaleString( - view24HrTime - ? DateTime.TIME_24_WITH_SHORT_OFFSET - : DateTime.TIME_WITH_SHORT_OFFSET - )} + {mounted + ? currDate.toLocaleString( + view24HrTime + ? DateTime.TIME_24_WITH_SHORT_OFFSET + : DateTime.TIME_WITH_SHORT_OFFSET + ) + : ''} @@ -626,15 +601,18 @@ const Alarms: NextPage = () => { {t('common:server-time')}: - {serverTime.toLocaleString( - view24HrTime - ? DateTime.TIME_24_WITH_SHORT_OFFSET - : DateTime.TIME_WITH_SHORT_OFFSET - )} + {mounted + ? serverTime.toLocaleString( + view24HrTime + ? DateTime.TIME_24_WITH_SHORT_OFFSET + : DateTime.TIME_WITH_SHORT_OFFSET + ) + : ''} @@ -720,50 +698,40 @@ const Alarms: NextPage = () => { - - - - - - - {eventTypeIconMapping.map((e: APIEventType, idx) => ( - - - - ))} - -
    - -
    - -
    +
    + + {eventTypeIconMapping.map((e: APIEventType) => ( + + ))} +
    {currentEventsTable.length > 0 ? ( @@ -786,19 +754,4 @@ const Alarms: NextPage = () => { ) } -import { serverSideTranslations } from 'next-i18next/serverSideTranslations' - -export async function getStaticProps({ locale }: { locale: string }) { - return { - props: { - ...(await serverSideTranslations(locale, [ - 'events', - 'alarms', - 'common', - 'alarmConfig', - ])), - // Will be passed to the page component as props - }, - } -} export default Alarms diff --git a/pages/index.tsx b/pages/index.tsx index e2a46df0..cb5b6ab9 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,7 +1,6 @@ import type { NextPage } from 'next' import React from 'react' -import 'core-js/features/array/at' type HomeProps = { isDown: boolean endTime: string diff --git a/pages/merchants.tsx b/pages/merchants.tsx index 7116d991..f2128c11 100644 --- a/pages/merchants.tsx +++ b/pages/merchants.tsx @@ -2,18 +2,17 @@ import type { NextPage } from 'next' import Head from 'next/head' import React, { useState, useRef, useEffect } from 'react' import merchantSchedules from '../data/merchantSchedules.json' -import saintbotImage from '../public/images/saint-bot.png' +const saintbotImage = '/images/saint-bot.png' import { DateTime, Interval } from 'luxon' -import useLocalStorage from '@olerichter00/use-localstorage' +import useLocalStorage from '../util/useLocalStorage' import regions from '../data/regions.json' import merchantsData from '../data/merchants.json' import { createTableData } from '../util/createTableData' import WanderingMerchant from '../common/WanderingMerchant' import io, { Socket } from 'socket.io-client' import { MerchantAPIData, RegionKey, ServerKey } from '../util/types/types' -import Image from 'next/image' import { RegionTimeZoneMapping } from '../util/static' -import { IconSettings } from '@tabler/icons' +import { IconSettings } from '@tabler/icons-react' import { MerchantConfigModal } from '../components' interface Merchant { @@ -33,9 +32,9 @@ const Merchants: NextPage = (props) => { 'Shandi' ) const isMounted = useRef(false); - const defaultTheme = () => { + const defaultTheme = (): boolean => { // Defaults to system theme if unconfigured - return (localStorage.getItem('darkMode') || window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) + return Boolean(localStorage.getItem('darkMode') || (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches)) } const [darkMode, setDarkMode] = useLocalStorage('darkMode', defaultTheme) useEffect(()=> { @@ -86,7 +85,7 @@ const Merchants: NextPage = (props) => { }>({}) const [socket, setSocket] = useState(null) const [merchantTableData, setMerchantTableData] = useState< - Array + Array >([]) const [wanderingMerchants, setWanderingMerchants] = useState< @@ -277,12 +276,14 @@ const Merchants: NextPage = (props) => { })} > {t('common:current-time')}: - - {currDate.toLocaleString( - view24HrTime - ? DateTime.TIME_24_WITH_SHORT_OFFSET - : DateTime.TIME_WITH_SHORT_OFFSET - )} + + {isMounted.current + ? currDate.toLocaleString( + view24HrTime + ? DateTime.TIME_24_WITH_SHORT_OFFSET + : DateTime.TIME_WITH_SHORT_OFFSET + ) + : ''} @@ -292,12 +293,14 @@ const Merchants: NextPage = (props) => { })} > {t('common:server-time')}: - - {serverTime.toLocaleString( - view24HrTime - ? DateTime.TIME_24_WITH_SHORT_OFFSET - : DateTime.TIME_WITH_SHORT_OFFSET - )} + + {isMounted.current + ? serverTime.toLocaleString( + view24HrTime + ? DateTime.TIME_24_WITH_SHORT_OFFSET + : DateTime.TIME_WITH_SHORT_OFFSET + ) + : ''} @@ -325,11 +328,14 @@ const Merchants: NextPage = (props) => { className="absolute right-4 top-2 flex items-center justify-center gap-2 text-indigo-500/90 hover:underline" > {t('data-by')} SaintBot{' '} - SaintBot
    @@ -359,7 +365,7 @@ const Merchants: NextPage = (props) => { mSchedules[1] .slice(0, (mSchedules[1].length - 1) / 2) .map((s) => - s.start.setZone( + s.start!.setZone( viewLocalizedTime ? currDate.zone : serverTime.zone @@ -400,7 +406,7 @@ const Merchants: NextPage = (props) => { mSchedules[2] .slice(0, (mSchedules[2].length - 1) / 2) .map((s) => - s.start.setZone( + s.start!.setZone( viewLocalizedTime ? currDate.zone : serverTime.zone @@ -441,7 +447,7 @@ const Merchants: NextPage = (props) => { mSchedules[3] .slice(0, (mSchedules[3].length - 1) / 2) .map((s) => - s.start.setZone( + s.start!.setZone( viewLocalizedTime ? currDate.zone : serverTime.zone @@ -490,21 +496,7 @@ const Merchants: NextPage = (props) => { ) } -import { serverSideTranslations } from 'next-i18next/serverSideTranslations' -import { useTranslation } from 'next-i18next' +import { useTranslation } from 'react-i18next' import classNames from 'classnames' -export async function getStaticProps({ locale }: { locale: string }) { - return { - props: { - ...(await serverSideTranslations(locale, [ - 'merchants', - 'common', - 'merchantConfig', - ])), - // Will be passed to the page component as props - }, - } -} - export default Merchants diff --git a/postcss.config.js b/postcss.config.js index 33ad091d..668a5b95 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,6 +1,6 @@ module.exports = { plugins: { - tailwindcss: {}, + '@tailwindcss/postcss': {}, autoprefixer: {}, }, } diff --git a/public/sounds/alert_1.mp3 b/public/sounds/alert_1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d3ff110ab75df4b89475b9c15f12a11554446361 GIT binary patch literal 18043 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 X|91KRNk8zvgY#dV^H2Q$pUVGVs=@=- literal 0 HcmV?d00001 diff --git a/public/sounds/alert_3.mp3 b/public/sounds/alert_3.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..f8c27eb17fbdc7bb84a2a19d63ff9bff9bf23bcb GIT binary patch literal 20107 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 literal 0 HcmV?d00001 diff --git a/public/sounds/alert_4.mp3 b/public/sounds/alert_4.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9ce5979062d30742389b71669abb1b7e799b6e65 GIT binary patch literal 23851 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 literal 0 HcmV?d00001 diff --git a/public/sounds/alert_5.mp3 b/public/sounds/alert_5.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0e07b43ecc0037d03a0d279b1362b5c7291e381e GIT binary patch literal 26683 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

    C=Xw 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 R`_upM`8$n&*8jWt{2SGIkE{Ry literal 0 HcmV?d00001 diff --git a/public/sounds/alert_6.mp3 b/public/sounds/alert_6.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b43a7e87fe3d0e404b4989b34f5b0b862887801f GIT binary patch literal 83467 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 literal 0 HcmV?d00001 diff --git a/sounds/index.js b/sounds/index.js index b77d7ce6..9f228eda 100644 --- a/sounds/index.js +++ b/sounds/index.js @@ -1,8 +1,8 @@ -const alert1 = require('./alert_1.mp3') -const alert2 = require('./alert_2.mp3') -const alert3 = require('./alert_3.mp3') -const alert4 = require('./alert_4.mp3') -const alert5 = require('./alert_5.mp3') -const alert6 = require('./alert_6.mp3') +const alert1 = '/sounds/alert_1.mp3' +const alert2 = '/sounds/alert_2.mp3' +const alert3 = '/sounds/alert_3.mp3' +const alert4 = '/sounds/alert_4.mp3' +const alert5 = '/sounds/alert_5.mp3' +const alert6 = '/sounds/alert_6.mp3' export { alert1, alert2, alert3, alert4, alert5, alert6 } diff --git a/styles/globals.css b/styles/globals.css index b5c61c95..2016a317 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -1,3 +1,25 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; +@import 'tailwindcss'; +@plugin "daisyui" { + themes: light --default, dark --prefersdark; +} + +@custom-variant dark (&:where(.dark, .dark *, [data-theme=dark], [data-theme=dark] *)); + +@source "../pages/**/*.{js,ts,jsx,tsx}"; +@source "../components/**/*.{js,ts,jsx,tsx}"; +@source "../util/**/*.{js,ts,jsx,tsx}"; + +/* DaisyUI 5 dropped the default flex layout on `.label`; restore the v4 behavior */ +@layer components { + .label { + display: flex; + align-items: center; + justify-content: space-between; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + user-select: none; + } + .label-text { + font-size: 0.875rem; + } +} diff --git a/tailwind.config.js b/tailwind.config.js deleted file mode 100644 index 2892d6c6..00000000 --- a/tailwind.config.js +++ /dev/null @@ -1,15 +0,0 @@ -module.exports = { - content: [ - './pages/**/*.{js,ts,jsx,tsx}', - './components/**/*.{js,ts,jsx,tsx}', - './util/**/*.{js,ts,jsx,tsx}', - ], - darkMode: 'class', - theme: { - extend: {}, - }, - plugins: [require('daisyui')], - daisyui: { - themes: ['light', 'dark'], - }, -} diff --git a/tsconfig.json b/tsconfig.json index 99710e85..a0cf552c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,11 @@ { "compilerOptions": { - "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], + "target": "ES2022", + "lib": [ + "dom", + "dom.iterable", + "ES2022" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -9,12 +13,23 @@ "noEmit": true, "esModuleInterop": true, "module": "esnext", - "moduleResolution": "node", + "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve", - "incremental": true + "jsx": "react-jsx", + "incremental": true, + "types": [ + "vitest/globals", + "@testing-library/jest-dom" + ] }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], - "exclude": ["node_modules"] + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "node_modules", + "test/e2e/**" + ] } diff --git a/util/alarmTrigger.ts b/util/alarmTrigger.ts new file mode 100644 index 00000000..90b009df --- /dev/null +++ b/util/alarmTrigger.ts @@ -0,0 +1,19 @@ +import { DateTime, Interval } from 'luxon' + +export interface AlarmEventLike { + disabled: DateTime | null + latest(t: DateTime): Interval | undefined +} + +export const isWithinNotifyWindow = ( + event: AlarmEventLike, + serverTime: DateTime, + notifyWindowMs: number +): boolean => { + if (event.disabled) return false + const next = event.latest(serverTime) + if (!next) return false + if (!next.start) return false + const diff = next.start.diff(serverTime).valueOf() + return diff >= 0 && diff <= notifyWindowMs +} diff --git a/util/createTableData.tsx b/util/createTableData.tsx index 4e2590b6..0fb8565b 100644 --- a/util/createTableData.tsx +++ b/util/createTableData.tsx @@ -3,7 +3,7 @@ import { GameEvent } from '../common' import { GameEventTableCell } from '../components' import { v4 as uuidv4 } from 'uuid' import { DateTime, Interval, Zone } from 'luxon' -import useLocalStorage from '@olerichter00/use-localstorage' +import useLocalStorage from './useLocalStorage' import { MerchantData } from './types/types' import MerchantTableCell from '../components/MerchantTableCell' import classNames from 'classnames' @@ -91,16 +91,16 @@ export const generateTimestampStrings = ( ) => { let eventTimes = (event as WanderingMerchant).schedule || (event as GameEvent).times - let diff = interval.start.diff(serverTime).valueOf() + let diff = interval.start!.diff(serverTime).valueOf() let inProgress = - interval.start.diff(serverTime).toMillis() < 0 && - interval.end.diff(serverTime).toMillis() > 0 - let startTime = interval.start + interval.start!.diff(serverTime).toMillis() < 0 && + interval.end!.diff(serverTime).toMillis() > 0 + let startTime = interval.start! .setZone(localizedTZ) .toLocaleString( view24HrTime ? DateTime.TIME_24_SIMPLE : DateTime.TIME_SIMPLE ) - let endTime = interval.end + let endTime = interval.end! .setZone(localizedTZ) .toLocaleString( view24HrTime ? DateTime.TIME_24_SIMPLE : DateTime.TIME_SIMPLE diff --git a/util/i18n.ts b/util/i18n.ts new file mode 100644 index 00000000..84fda174 --- /dev/null +++ b/util/i18n.ts @@ -0,0 +1,56 @@ +import i18n from 'i18next' +import { initReactI18next } from 'react-i18next' + +import enAlarmConfig from '../public/locales/en/alarmConfig.json' +import enAlarms from '../public/locales/en/alarms.json' +import enCommon from '../public/locales/en/common.json' +import enEvents from '../public/locales/en/events.json' +import enMerchantConfig from '../public/locales/en/merchantConfig.json' +import enMerchants from '../public/locales/en/merchants.json' + +import zhAlarmConfig from '../public/locales/zh/alarmConfig.json' +import zhAlarms from '../public/locales/zh/alarms.json' +import zhCommon from '../public/locales/zh/common.json' +import zhEvents from '../public/locales/zh/events.json' +import zhMerchantConfig from '../public/locales/zh/merchantConfig.json' +import zhMerchants from '../public/locales/zh/merchants.json' + +const resources = { + en: { + alarmConfig: enAlarmConfig, + alarms: enAlarms, + common: enCommon, + events: enEvents, + merchantConfig: enMerchantConfig, + merchants: enMerchants, + }, + zh: { + alarmConfig: zhAlarmConfig, + alarms: zhAlarms, + common: zhCommon, + events: zhEvents, + merchantConfig: zhMerchantConfig, + merchants: zhMerchants, + }, +} + +if (!i18n.isInitialized) { + i18n.use(initReactI18next).init({ + resources, + lng: 'en', + fallbackLng: 'en', + ns: [ + 'alarmConfig', + 'alarms', + 'common', + 'events', + 'merchantConfig', + 'merchants', + ], + defaultNS: 'common', + interpolation: { escapeValue: false }, + react: { useSuspense: false }, + }) +} + +export default i18n diff --git a/util/useLocalStorage.ts b/util/useLocalStorage.ts new file mode 100644 index 00000000..d25df838 --- /dev/null +++ b/util/useLocalStorage.ts @@ -0,0 +1,46 @@ +import { useEffect, useState, useCallback } from 'react' + +type Initial = T | (() => T) + +const resolveInitial = (init: Initial): T => + typeof init === 'function' ? (init as () => T)() : init + +export function useLocalStorage( + key: string, + initialValue: Initial +): [T | undefined, (value: T | undefined) => void] { + const [value, setValueState] = useState(undefined) + + useEffect(() => { + try { + const stored = window.localStorage.getItem(key) + if (stored !== null) { + setValueState(JSON.parse(stored) as T) + } else { + setValueState(resolveInitial(initialValue)) + } + } catch { + setValueState(resolveInitial(initialValue)) + } + }, [key]) + + const setValue = useCallback( + (newValue: T | undefined) => { + setValueState(newValue) + try { + if (newValue === undefined) { + window.localStorage.removeItem(key) + } else { + window.localStorage.setItem(key, JSON.stringify(newValue)) + } + } catch { + // swallow quota / private mode errors + } + }, + [key] + ) + + return [value, setValue] +} + +export default useLocalStorage diff --git a/util/usePrevious.tsx b/util/usePrevious.tsx index 5ec2d537..3bd45890 100644 --- a/util/usePrevious.tsx +++ b/util/usePrevious.tsx @@ -1,7 +1,7 @@ import { useEffect, useRef } from 'react' const usePrevious = (value: T): T | undefined => { - const ref = useRef() + const ref = useRef(undefined) useEffect(() => { ref.current = value }) From 5163669faabe88a39116ffc22b87b9a9a52db922 Mon Sep 17 00:00:00 2001 From: Joshua Kuan Date: Wed, 6 May 2026 21:26:45 -0400 Subject: [PATCH 02/35] test: add Vitest + Playwright with regression tests on critical-path logic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Test infrastructure for the modernized stack so future changes have a regression net. - Vitest 4 + jsdom + RTL + jest-dom matchers for component/unit tests. - Playwright config (chromium) for e2e — specs to be filled in next. - GitHub Actions: typecheck + Vitest on PRs/pushes; separate e2e job that builds and runs Playwright with artifact upload. Initial coverage focuses on load-bearing pure logic — not UI chrome: - GameEvent.latest(): next-interval semantics across boundary cases. - createTableData: structural row-pairing invariants (1/2/3/4 events, invisible-cell padding for odd counts). Cell components mocked so the test is about the math, not the GameEventTableCell render tree. - generateTimestampStrings: diff-based color-state classes (past/imminent/ in-progress/upcoming). - isWithinNotifyWindow: window math, disabled-event short-circuit, no upcoming-event short-circuit, exact-boundary inclusion. --- .github/workflows/ci.yml | 38 ++++++ playwright.config.ts | 23 ++++ test/unit/common/GameEvent.test.ts | 97 +++++++++++++++ test/unit/util/alarmTrigger.test.ts | 66 ++++++++++ test/unit/util/createTableData.test.tsx | 159 ++++++++++++++++++++++++ vitest.config.ts | 24 ++++ vitest.setup.ts | 1 + 7 files changed, 408 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 playwright.config.ts create mode 100644 test/unit/common/GameEvent.test.ts create mode 100644 test/unit/util/alarmTrigger.test.ts create mode 100644 test/unit/util/createTableData.test.tsx create mode 100644 vitest.config.ts create mode 100644 vitest.setup.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..ebe31d5f --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,38 @@ +name: CI + +on: + pull_request: + push: + branches: [main] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + - run: npm ci --legacy-peer-deps + - run: npm run typecheck + - run: npm run test + + e2e: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + - run: npm ci --legacy-peer-deps + - run: npx playwright install --with-deps chromium + - run: npm run build + - run: npm run test:e2e + - if: always() + uses: actions/upload-artifact@v4 + with: + name: playwright-report + path: playwright-report/ + retention-days: 7 diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 00000000..69105a31 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,23 @@ +import { defineConfig, devices } from '@playwright/test' + +export default defineConfig({ + testDir: './test/e2e', + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 1 : undefined, + reporter: process.env.CI ? [['github'], ['html', { open: 'never' }]] : 'list', + use: { + baseURL: 'http://localhost:3000', + trace: 'on-first-retry', + }, + projects: [ + { name: 'chromium', use: { ...devices['Desktop Chrome'] } }, + ], + webServer: { + command: 'npm run start', + url: 'http://localhost:3000', + reuseExistingServer: !process.env.CI, + timeout: 120_000, + }, +}) diff --git a/test/unit/common/GameEvent.test.ts b/test/unit/common/GameEvent.test.ts new file mode 100644 index 00000000..c172cbf9 --- /dev/null +++ b/test/unit/common/GameEvent.test.ts @@ -0,0 +1,97 @@ +import { describe, it, expect } from 'vitest' +import { DateTime, Interval } from 'luxon' +import GameEvent from '../../../common/GameEvent' +import APIEventType from '../../../common/api/APIEventType' +import APIGameEvent from '../../../common/api/APIGameEvent' + +const tz = 'America/New_York' + +const makeInterval = (startISO: string, endISO: string) => + Interval.fromDateTimes( + DateTime.fromISO(startISO, { zone: tz }), + DateTime.fromISO(endISO, { zone: tz }) + ) + +const makeEvent = () => { + const et = new APIEventType(0, 'Boss', 'icon.webp') + const ge = new APIGameEvent('4005', 'Proving Grounds', 'achieve.webp', 250) + return new GameEvent(et, ge) +} + +describe('GameEvent', () => { + describe('latest()', () => { + it('returns the first interval that starts strictly after the given time', () => { + const evt = makeEvent() + evt.addTime(makeInterval('2026-05-06T10:00', '2026-05-06T10:30')) + evt.addTime(makeInterval('2026-05-06T14:00', '2026-05-06T14:30')) + evt.addTime(makeInterval('2026-05-06T18:00', '2026-05-06T18:30')) + + const now = DateTime.fromISO('2026-05-06T11:00', { zone: tz }) + const next = evt.latest(now) + + expect(next.start?.toISO()).toBe( + DateTime.fromISO('2026-05-06T14:00', { zone: tz }).toISO() + ) + }) + + it('skips intervals that have already started, even if not yet ended', () => { + const evt = makeEvent() + evt.addTime(makeInterval('2026-05-06T10:00', '2026-05-06T12:00')) + evt.addTime(makeInterval('2026-05-06T14:00', '2026-05-06T14:30')) + + const now = DateTime.fromISO('2026-05-06T11:00', { zone: tz }) + const next = evt.latest(now) + + expect(next.start?.toISO()).toBe( + DateTime.fromISO('2026-05-06T14:00', { zone: tz }).toISO() + ) + }) + + it('returns undefined when no future interval exists', () => { + const evt = makeEvent() + evt.addTime(makeInterval('2026-05-06T08:00', '2026-05-06T08:30')) + + const now = DateTime.fromISO('2026-05-06T10:00', { zone: tz }) + expect(evt.latest(now)).toBeUndefined() + }) + + it('returns undefined for an event with no times', () => { + const evt = makeEvent() + const now = DateTime.fromISO('2026-05-06T10:00', { zone: tz }) + expect(evt.latest(now)).toBeUndefined() + }) + + it('treats an interval starting exactly at now as not-yet-started', () => { + const evt = makeEvent() + const now = DateTime.fromISO('2026-05-06T10:00', { zone: tz }) + evt.addTime(Interval.fromDateTimes(now, now.plus({ minutes: 30 }))) + evt.addTime(makeInterval('2026-05-06T14:00', '2026-05-06T14:30')) + + // diff(now).valueOf() > 0 is the gate, so an interval starting exactly at now is skipped + const next = evt.latest(now) + expect(next.start?.toISO()).toBe( + DateTime.fromISO('2026-05-06T14:00', { zone: tz }).toISO() + ) + }) + }) + + describe('addTime()', () => { + it('appends intervals in insertion order', () => { + const evt = makeEvent() + const a = makeInterval('2026-05-06T10:00', '2026-05-06T10:30') + const b = makeInterval('2026-05-06T14:00', '2026-05-06T14:30') + evt.addTime(a) + evt.addTime(b) + expect(evt.times).toEqual([a, b]) + }) + }) + + describe('uuid', () => { + it('assigns a unique uuid to each instance', () => { + const a = makeEvent() + const b = makeEvent() + expect(a.uuid).not.toBe(b.uuid) + expect(a.uuid).toMatch(/^[0-9a-f-]+$/i) + }) + }) +}) diff --git a/test/unit/util/alarmTrigger.test.ts b/test/unit/util/alarmTrigger.test.ts new file mode 100644 index 00000000..3e5ca2f2 --- /dev/null +++ b/test/unit/util/alarmTrigger.test.ts @@ -0,0 +1,66 @@ +import { describe, it, expect } from 'vitest' +import { DateTime, Duration, Interval } from 'luxon' +import { isWithinNotifyWindow, AlarmEventLike } from '../../../util/alarmTrigger' + +const tz = 'America/New_York' +const at = (iso: string) => DateTime.fromISO(iso, { zone: tz }) + +const eventStartingAt = (iso: string, durationMin = 30): AlarmEventLike => { + const start = at(iso) + const end = start.plus({ minutes: durationMin }) + return { + disabled: null, + latest: () => Interval.fromDateTimes(start, end), + } +} + +describe('isWithinNotifyWindow', () => { + const fiveMinMs = Duration.fromObject({ minutes: 5 }).toMillis() + + it('fires when event starts within the notify window', () => { + const now = at('2026-05-06T10:00') + const evt = eventStartingAt('2026-05-06T10:03') + expect(isWithinNotifyWindow(evt, now, fiveMinMs)).toBe(true) + }) + + it('fires at the exact window boundary (diff == window)', () => { + const now = at('2026-05-06T10:00') + const evt = eventStartingAt('2026-05-06T10:05') + expect(isWithinNotifyWindow(evt, now, fiveMinMs)).toBe(true) + }) + + it('fires at diff == 0 (event starting right now)', () => { + const now = at('2026-05-06T10:00') + const evt = eventStartingAt('2026-05-06T10:00') + expect(isWithinNotifyWindow(evt, now, fiveMinMs)).toBe(true) + }) + + it('does not fire when event is past the window', () => { + const now = at('2026-05-06T10:00') + const evt = eventStartingAt('2026-05-06T10:06') + expect(isWithinNotifyWindow(evt, now, fiveMinMs)).toBe(false) + }) + + it('does not fire when event is in the past (diff < 0)', () => { + const now = at('2026-05-06T10:00') + const evt: AlarmEventLike = { + disabled: null, + latest: () => + Interval.fromDateTimes(at('2026-05-06T09:55'), at('2026-05-06T10:25')), + } + expect(isWithinNotifyWindow(evt, now, fiveMinMs)).toBe(false) + }) + + it('does not fire when event has no upcoming interval', () => { + const now = at('2026-05-06T10:00') + const evt: AlarmEventLike = { disabled: null, latest: () => undefined } + expect(isWithinNotifyWindow(evt, now, fiveMinMs)).toBe(false) + }) + + it('does not fire when event is disabled, even if otherwise eligible', () => { + const now = at('2026-05-06T10:00') + const base = eventStartingAt('2026-05-06T10:03') + const evt: AlarmEventLike = { ...base, disabled: at('2026-12-31T23:59') } + expect(isWithinNotifyWindow(evt, now, fiveMinMs)).toBe(false) + }) +}) diff --git a/test/unit/util/createTableData.test.tsx b/test/unit/util/createTableData.test.tsx new file mode 100644 index 00000000..09e7dce8 --- /dev/null +++ b/test/unit/util/createTableData.test.tsx @@ -0,0 +1,159 @@ +/** + * These tests exercise the structural invariants of createTableData and the + * className-by-diff behavior of generateTimestampStrings without rendering the + * full GameEventTableCell tree (which depends on i18n + image contexts that + * aren't worth scaffolding for a math/structure test). + */ +import { describe, it, expect, vi } from 'vitest' +import React from 'react' +import { render } from '@testing-library/react' +import { DateTime, Interval } from 'luxon' + +vi.mock('../../../components', () => ({ + GameEventTableCell: ({ gameEvent }: any) => ( + + ), +})) +vi.mock('../../../components/MerchantTableCell', () => ({ + default: ({ merchant }: any) => ( + + ), +})) + +import { createTableData, generateTimestampStrings } from '../../../util/createTableData' +import GameEvent from '../../../common/GameEvent' +import APIEventType from '../../../common/api/APIEventType' +import APIGameEvent from '../../../common/api/APIGameEvent' + +const tz = 'America/New_York' +const at = (iso: string) => DateTime.fromISO(iso, { zone: tz }) + +const makeEvent = (id: string) => { + const et = new APIEventType(0, 'Boss', 'icon.webp') + const ge = new APIGameEvent(id, `Event ${id}`, 'achieve.webp', 250) + return new GameEvent(et, ge) +} + +const renderRows = (events: GameEvent[]) => { + const rows = createTableData({ + events, + serverTime: at('2026-05-06T10:00'), + currDate: at('2026-05-06T10:00'), + viewLocalizedTime: false, + view24HrTime: false, + isGameEvent: true, + }) + const { container } = render( + + {rows} +
    + ) + return container.querySelectorAll('tr') +} + +describe('createTableData', () => { + describe('row pairing', () => { + it('returns no rows for an empty input', () => { + expect(renderRows([])).toHaveLength(0) + }) + + it('pairs two events into a single row with two cells', () => { + const rows = renderRows([makeEvent('a'), makeEvent('b')]) + expect(rows).toHaveLength(1) + expect(rows[0].children).toHaveLength(2) + expect(rows[0].querySelectorAll('[data-testid="game-cell"]')).toHaveLength(2) + }) + + it('pads a single event with one invisible cell', () => { + const rows = renderRows([makeEvent('a')]) + expect(rows).toHaveLength(1) + expect(rows[0].children).toHaveLength(2) + expect(rows[0].querySelectorAll('[data-testid="game-cell"]')).toHaveLength(1) + // The padding cell uses the "invisible" Tailwind class + const cells = Array.from(rows[0].children) + const padded = cells.find((c) => c.className.includes('invisible')) + expect(padded).toBeDefined() + }) + + it('splits 3 events into 2 rows, second row padded', () => { + const rows = renderRows([makeEvent('a'), makeEvent('b'), makeEvent('c')]) + expect(rows).toHaveLength(2) + expect(rows[0].querySelectorAll('[data-testid="game-cell"]')).toHaveLength(2) + expect(rows[1].querySelectorAll('[data-testid="game-cell"]')).toHaveLength(1) + }) + + it('splits 4 events into 2 full rows', () => { + const rows = renderRows([ + makeEvent('a'), + makeEvent('b'), + makeEvent('c'), + makeEvent('d'), + ]) + expect(rows).toHaveLength(2) + rows.forEach((r) => + expect(r.querySelectorAll('[data-testid="game-cell"]')).toHaveLength(2) + ) + }) + }) +}) + +describe('generateTimestampStrings', () => { + const dummyEvent = (() => { + const e = makeEvent('x') + e.times = [ + Interval.fromDateTimes(at('2026-05-06T10:00'), at('2026-05-06T10:30')), + ] + return e + })() + + const intervalAt = (startISO: string, endISO: string) => + Interval.fromDateTimes(at(startISO), at(endISO)) + + const renderStrip = (interval: Interval, serverTime: DateTime) => { + const node = generateTimestampStrings( + dummyEvent, + interval, + serverTime, + serverTime.zone, + true, // 24h time so the renderer is deterministic + 0 + ) + const { container } = render(<>{node}) + return container + } + + it('marks past intervals with the past-color class', () => { + const c = renderStrip( + intervalAt('2026-05-06T09:00', '2026-05-06T09:30'), + at('2026-05-06T10:00') + ) + expect(c.querySelector('.text-slate-400\\/25')).toBeTruthy() + }) + + it('marks intervals starting within 15 minutes with the imminent-color class', () => { + const c = renderStrip( + intervalAt('2026-05-06T10:10', '2026-05-06T10:30'), + at('2026-05-06T10:00') + ) + const span = c.querySelector('span > span') + expect(span?.className).toMatch(/text-amber-500/) + }) + + it('marks an in-progress interval with the imminent-color class', () => { + const c = renderStrip( + intervalAt('2026-05-06T09:55', '2026-05-06T10:25'), + at('2026-05-06T10:00') + ) + const span = c.querySelector('span > span') + expect(span?.className).toMatch(/text-amber-500/) + }) + + it('marks distant-future intervals with the upcoming-color class', () => { + const c = renderStrip( + intervalAt('2026-05-06T14:00', '2026-05-06T14:30'), + at('2026-05-06T10:00') + ) + const span = c.querySelector('span > span') + expect(span?.className).toMatch(/text-green-700/) + }) +}) diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..fb828103 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,24 @@ +import { defineConfig } from 'vitest/config' +import react from '@vitejs/plugin-react' +import path from 'path' + +export default defineConfig({ + plugins: [react()], + test: { + environment: 'jsdom', + setupFiles: ['./vitest.setup.ts'], + globals: true, + include: ['test/unit/**/*.test.{ts,tsx}'], + coverage: { + provider: 'v8', + reporter: ['text', 'html'], + include: ['util/**', 'common/**', 'components/**', 'pages/**'], + exclude: ['**/*.d.ts', 'pages/api/**', 'pages/_*.tsx'], + }, + }, + resolve: { + alias: { + '@': path.resolve(__dirname, '.'), + }, + }, +}) diff --git a/vitest.setup.ts b/vitest.setup.ts new file mode 100644 index 00000000..a9d0dd31 --- /dev/null +++ b/vitest.setup.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom/vitest' From f5c9b8c0cdbeed21db0196be792f414a6c02b78c Mon Sep 17 00:00:00 2001 From: Joshua Kuan Date: Wed, 6 May 2026 21:41:01 -0400 Subject: [PATCH 03/35] =?UTF-8?q?feat(ui):=20scaffold=20shadcn=20=E2=80=94?= =?UTF-8?q?=20primitives,=20theme=20tokens,=20drop=20daisyui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase A of the planned shadcn rewrite. Sets up the foundation; no JSX has been migrated yet (DaisyUI classes still litter the pages). - Drop daisyui; add shadcn deps (Radix primitives, cva, clsx, tailwind- merge, lucide-react, tw-animate-css). - styles/globals.css: replace daisyui plugin block with shadcn CSS vars for light + dark, @theme inline mapping, .dark class variant. - Add components.json + lib/utils.ts (cn helper). - Add @/* path alias in tsconfig + Vitest alias. - Add primitive components/ui/{button,dialog,checkbox,label,select, slider,dropdown-menu,card,separator,scroll-area}.tsx. - Drop components/index.js barrel — Turbopack didn't like .js re-exporting .tsx and threw an opaque "Element type is invalid" during render. Switch to direct default-exports throughout. - Update one Vitest mock path that pointed at the barrel. Build, typecheck, and 23/23 unit tests stay green. --- components.json | 21 + components/index.js | 15 - components/ui/button.tsx | 59 + components/ui/card.tsx | 92 ++ components/ui/checkbox.tsx | 30 + components/ui/dialog.tsx | 141 +++ components/ui/dropdown-menu.tsx | 125 +++ components/ui/label.tsx | 22 + components/ui/scroll-area.tsx | 56 + components/ui/select.tsx | 183 +++ components/ui/separator.tsx | 26 + components/ui/slider.tsx | 61 + lib/utils.ts | 6 + package-lock.json | 1365 +++++++++++++++++++++-- package.json | 16 +- pages/_app.tsx | 4 +- pages/alarms.tsx | 2 +- pages/merchants.tsx | 2 +- styles/globals.css | 132 ++- test/unit/util/createTableData.test.tsx | 4 +- tsconfig.json | 6 +- util/createTableData.tsx | 2 +- vitest.config.ts | 4 +- 23 files changed, 2246 insertions(+), 128 deletions(-) create mode 100644 components.json delete mode 100644 components/index.js create mode 100644 components/ui/button.tsx create mode 100644 components/ui/card.tsx create mode 100644 components/ui/checkbox.tsx create mode 100644 components/ui/dialog.tsx create mode 100644 components/ui/dropdown-menu.tsx create mode 100644 components/ui/label.tsx create mode 100644 components/ui/scroll-area.tsx create mode 100644 components/ui/select.tsx create mode 100644 components/ui/separator.tsx create mode 100644 components/ui/slider.tsx create mode 100644 lib/utils.ts diff --git a/components.json b/components.json new file mode 100644 index 00000000..a084701a --- /dev/null +++ b/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "styles/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} diff --git a/components/index.js b/components/index.js deleted file mode 100644 index 23cd62b7..00000000 --- a/components/index.js +++ /dev/null @@ -1,15 +0,0 @@ -import AlarmConfigModal from './modals/AlarmConfigModal' -import ChangeLogModal from './modals/ChangeLogModal' -import GameEventTableCell from './GameEventTableCell' -import GitHubModal from './modals/GitHubModal' -import MerchantConfigModal from './modals/MerchantConfigModal' -import SideBar from './SideBar' - -export { - AlarmConfigModal, - MerchantConfigModal, - ChangeLogModal, - GameEventTableCell, - GitHubModal, - SideBar, -} diff --git a/components/ui/button.tsx b/components/ui/button.tsx new file mode 100644 index 00000000..5ae93f1f --- /dev/null +++ b/components/ui/button.tsx @@ -0,0 +1,59 @@ +import * as React from 'react' +import { Slot } from '@radix-ui/react-slot' +import { cva, type VariantProps } from 'class-variance-authority' + +import { cn } from '@/lib/utils' + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + { + variants: { + variant: { + default: + 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90', + destructive: + 'bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40', + outline: + 'border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50', + secondary: + 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80', + ghost: + 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50', + link: 'text-primary underline-offset-4 hover:underline', + }, + size: { + default: 'h-9 px-4 py-2 has-[>svg]:px-3', + sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5', + lg: 'h-10 rounded-md px-6 has-[>svg]:px-4', + icon: 'size-9', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + } +) + +function Button({ + className, + variant, + size, + asChild = false, + ...props +}: React.ComponentProps<'button'> & + VariantProps & { + asChild?: boolean + }) { + const Comp = asChild ? Slot : 'button' + + return ( + + ) +} + +export { Button, buttonVariants } diff --git a/components/ui/card.tsx b/components/ui/card.tsx new file mode 100644 index 00000000..de88d26d --- /dev/null +++ b/components/ui/card.tsx @@ -0,0 +1,92 @@ +import * as React from 'react' + +import { cn } from '@/lib/utils' + +function Card({ className, ...props }: React.ComponentProps<'div'>) { + return ( +

    + ) +} + +function CardHeader({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
    + ) +} + +function CardTitle({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
    + ) +} + +function CardDescription({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
    + ) +} + +function CardAction({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
    + ) +} + +function CardContent({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
    + ) +} + +function CardFooter({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
    + ) +} + +export { + Card, + CardAction, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} diff --git a/components/ui/checkbox.tsx b/components/ui/checkbox.tsx new file mode 100644 index 00000000..dfe61347 --- /dev/null +++ b/components/ui/checkbox.tsx @@ -0,0 +1,30 @@ +import * as React from 'react' +import * as CheckboxPrimitive from '@radix-ui/react-checkbox' +import { CheckIcon } from 'lucide-react' + +import { cn } from '@/lib/utils' + +function Checkbox({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + + + ) +} + +export { Checkbox } diff --git a/components/ui/dialog.tsx b/components/ui/dialog.tsx new file mode 100644 index 00000000..f9fdf0f6 --- /dev/null +++ b/components/ui/dialog.tsx @@ -0,0 +1,141 @@ +import * as React from 'react' +import * as DialogPrimitive from '@radix-ui/react-dialog' +import { XIcon } from 'lucide-react' + +import { cn } from '@/lib/utils' + +function Dialog({ + ...props +}: React.ComponentProps) { + return +} + +function DialogTrigger({ + ...props +}: React.ComponentProps) { + return +} + +function DialogPortal({ + ...props +}: React.ComponentProps) { + return +} + +function DialogClose({ + ...props +}: React.ComponentProps) { + return +} + +function DialogOverlay({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DialogContent({ + className, + children, + showCloseButton = true, + ...props +}: React.ComponentProps & { + showCloseButton?: boolean +}) { + return ( + + + + {children} + {showCloseButton && ( + + + Close + + )} + + + ) +} + +function DialogHeader({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
    + ) +} + +function DialogFooter({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
    + ) +} + +function DialogTitle({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DialogDescription({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogOverlay, + DialogPortal, + DialogTitle, + DialogTrigger, +} diff --git a/components/ui/dropdown-menu.tsx b/components/ui/dropdown-menu.tsx new file mode 100644 index 00000000..032c305c --- /dev/null +++ b/components/ui/dropdown-menu.tsx @@ -0,0 +1,125 @@ +import * as React from 'react' +import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu' +import { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react' + +import { cn } from '@/lib/utils' + +function DropdownMenu({ + ...props +}: React.ComponentProps) { + return +} + +function DropdownMenuPortal({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuContent({ + className, + sideOffset = 4, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +function DropdownMenuGroup({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuItem({ + className, + inset, + variant = 'default', + ...props +}: React.ComponentProps & { + inset?: boolean + variant?: 'default' | 'destructive' +}) { + return ( + + ) +} + +function DropdownMenuLabel({ + className, + inset, + ...props +}: React.ComponentProps & { + inset?: boolean +}) { + return ( + + ) +} + +function DropdownMenuSeparator({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuPortal, + DropdownMenuSeparator, + DropdownMenuTrigger, +} diff --git a/components/ui/label.tsx b/components/ui/label.tsx new file mode 100644 index 00000000..eaa82fa8 --- /dev/null +++ b/components/ui/label.tsx @@ -0,0 +1,22 @@ +import * as React from 'react' +import * as LabelPrimitive from '@radix-ui/react-label' + +import { cn } from '@/lib/utils' + +function Label({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { Label } diff --git a/components/ui/scroll-area.tsx b/components/ui/scroll-area.tsx new file mode 100644 index 00000000..bc29d516 --- /dev/null +++ b/components/ui/scroll-area.tsx @@ -0,0 +1,56 @@ +import * as React from 'react' +import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area' + +import { cn } from '@/lib/utils' + +function ScrollArea({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + {children} + + + + + ) +} + +function ScrollBar({ + className, + orientation = 'vertical', + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +export { ScrollArea, ScrollBar } diff --git a/components/ui/select.tsx b/components/ui/select.tsx new file mode 100644 index 00000000..0b69ddab --- /dev/null +++ b/components/ui/select.tsx @@ -0,0 +1,183 @@ +import * as React from 'react' +import * as SelectPrimitive from '@radix-ui/react-select' +import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react' + +import { cn } from '@/lib/utils' + +function Select({ + ...props +}: React.ComponentProps) { + return +} + +function SelectGroup({ + ...props +}: React.ComponentProps) { + return +} + +function SelectValue({ + ...props +}: React.ComponentProps) { + return +} + +function SelectTrigger({ + className, + size = 'default', + children, + ...props +}: React.ComponentProps & { + size?: 'sm' | 'default' +}) { + return ( + + {children} + + + + + ) +} + +function SelectContent({ + className, + children, + position = 'popper', + ...props +}: React.ComponentProps) { + return ( + + + + + {children} + + + + + ) +} + +function SelectLabel({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function SelectItem({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ) +} + +function SelectSeparator({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function SelectScrollUpButton({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +function SelectScrollDownButton({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +export { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectScrollDownButton, + SelectScrollUpButton, + SelectSeparator, + SelectTrigger, + SelectValue, +} diff --git a/components/ui/separator.tsx b/components/ui/separator.tsx new file mode 100644 index 00000000..89e6bcb7 --- /dev/null +++ b/components/ui/separator.tsx @@ -0,0 +1,26 @@ +import * as React from 'react' +import * as SeparatorPrimitive from '@radix-ui/react-separator' + +import { cn } from '@/lib/utils' + +function Separator({ + className, + orientation = 'horizontal', + decorative = true, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { Separator } diff --git a/components/ui/slider.tsx b/components/ui/slider.tsx new file mode 100644 index 00000000..af31ca2f --- /dev/null +++ b/components/ui/slider.tsx @@ -0,0 +1,61 @@ +import * as React from 'react' +import * as SliderPrimitive from '@radix-ui/react-slider' + +import { cn } from '@/lib/utils' + +function Slider({ + className, + defaultValue, + value, + min = 0, + max = 100, + ...props +}: React.ComponentProps) { + const _values = React.useMemo( + () => + Array.isArray(value) + ? value + : Array.isArray(defaultValue) + ? defaultValue + : [min, max], + [value, defaultValue, min, max] + ) + + return ( + + + + + {Array.from({ length: _values.length }, (_, index) => ( + + ))} + + ) +} + +export { Slider } diff --git a/lib/utils.ts b/lib/utils.ts new file mode 100644 index 00000000..fed2fe91 --- /dev/null +++ b/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from 'clsx' +import { twMerge } from 'tailwind-merge' + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/package-lock.json b/package-lock.json index 354d089e..3f53318f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,13 +5,25 @@ "packages": { "": { "dependencies": { + "@radix-ui/react-checkbox": "^1.3.3", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-label": "^2.1.8", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-separator": "^1.1.8", + "@radix-ui/react-slider": "^1.3.6", + "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-tabs": "^1.1.13", "@tabler/icons-react": "latest", + "class-variance-authority": "^0.7.1", "classnames": "latest", - "daisyui": "latest", + "clsx": "^2.1.1", "howler": "latest", "i18next": "^26.0.9", "i18next-fs-backend": "^2.6.5", "i18next-resources-to-backend": "^1.2.1", + "lucide-react": "^1.14.0", "luxon": "latest", "next": "16.2.5", "react": "latest", @@ -19,6 +31,8 @@ "react-i18next": "^17.0.6", "socket.io-client": "latest", "swr": "latest", + "tailwind-merge": "^3.5.0", + "tw-animate-css": "^1.4.0", "uuid": "latest" }, "devDependencies": { @@ -412,6 +426,44 @@ } } }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, "node_modules/@img/colour": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", @@ -1009,104 +1061,1066 @@ "arm64" ], "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.5.tgz", + "integrity": "sha512-3hzeiFGZtyATVx9pCeuzTshXmh50vHZitqaeZiyJZaUmjQyrfjsVUgS8apOj1vEJCIpKJM/55F45yPAV2kpjsA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.5.tgz", + "integrity": "sha512-0mzZV/mAt7Qj2tYNdTB6AqrS8dwng/AQLSYC5Z1YLpZdi2wxqKDPK7RY2RvjB1fXyJfOfdA3l/yTF5yLi+WfuQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.5.tgz", + "integrity": "sha512-f/H4nZ2zJBvA8/+HpsB9mNonF9zfQoAU6D0WxJrfzhJDvJLfngVN85oqxUyrDVK99DIFfFYhLpGa5K+c5uotSw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.5.tgz", + "integrity": "sha512-nuP7DHs4koAojsIxVPkihNgKiRUKtCU65j5X6DAbSy8VBrfT/o90bCLLHPf51JEdOZwZMFzM6e0NiGWfIWjVAg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", + "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@playwright/test": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", + "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.59.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", + "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", + "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.8.tgz", + "integrity": "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", + "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", + "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.8.tgz", + "integrity": "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz", + "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", + "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.5.tgz", - "integrity": "sha512-3hzeiFGZtyATVx9pCeuzTshXmh50vHZitqaeZiyJZaUmjQyrfjsVUgS8apOj1vEJCIpKJM/55F45yPAV2kpjsA==", - "cpu": [ - "x64" - ], + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "16.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.5.tgz", - "integrity": "sha512-0mzZV/mAt7Qj2tYNdTB6AqrS8dwng/AQLSYC5Z1YLpZdi2wxqKDPK7RY2RvjB1fXyJfOfdA3l/yTF5yLi+WfuQ==", - "cpu": [ - "x64" - ], + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.5.tgz", - "integrity": "sha512-f/H4nZ2zJBvA8/+HpsB9mNonF9zfQoAU6D0WxJrfzhJDvJLfngVN85oqxUyrDVK99DIFfFYhLpGa5K+c5uotSw==", - "cpu": [ - "arm64" - ], + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.5.tgz", - "integrity": "sha512-nuP7DHs4koAojsIxVPkihNgKiRUKtCU65j5X6DAbSy8VBrfT/o90bCLLHPf51JEdOZwZMFzM6e0NiGWfIWjVAg==", - "cpu": [ - "x64" - ], + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@oxc-project/types": { - "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", - "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", - "dev": true, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@playwright/test": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", - "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "license": "MIT", "dependencies": { - "playwright": "1.59.1" + "@radix-ui/react-primitive": "2.1.3" }, - "bin": { - "playwright": "cli.js" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": ">=18" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, "node_modules/@rolldown/binding-android-arm64": { "version": "1.0.0-rc.17", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz", @@ -2080,6 +3094,18 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/aria-query": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", @@ -2235,6 +3261,18 @@ "node": ">=18" } }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, "node_modules/classnames": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", @@ -2247,6 +3285,15 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -2282,15 +3329,6 @@ "dev": true, "license": "MIT" }, - "node_modules/daisyui": { - "version": "5.5.19", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.5.19.tgz", - "integrity": "sha512-pbFAkl1VCEh/MPCeclKL61I/MqRIFFhNU7yiXoDDRapXN4/qNCoMxeCCswyxEEhqL5eiTTfwHvucFtOE71C9sA==", - "license": "MIT", - "funding": { - "url": "https://github.com/saadeghi/daisyui?sponsor=1" - } - }, "node_modules/data-urls": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", @@ -2348,6 +3386,12 @@ "node": ">=8" } }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, "node_modules/dom-accessibility-api": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", @@ -2495,6 +3539,15 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -2975,6 +4028,15 @@ "node": "20 || >=22" } }, + "node_modules/lucide-react": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.14.0.tgz", + "integrity": "sha512-+1mdWcfSJVUsaTIjN9zoezmUhfXo5l0vP7ekBMPo3jcS/aIkxHnXqAPsByszMZx/Y8oQBRJxJx5xg+RH3urzxA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/luxon": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", @@ -3454,6 +4516,75 @@ "dev": true, "license": "MIT" }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -3723,6 +4854,16 @@ "dev": true, "license": "MIT" }, + "node_modules/tailwind-merge": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz", + "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz", @@ -3840,6 +4981,15 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/tw-animate-css": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", + "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, "node_modules/typescript": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", @@ -3902,6 +5052,49 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/use-sync-external-store": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", diff --git a/package.json b/package.json index f988e677..e3c4d0cc 100644 --- a/package.json +++ b/package.json @@ -12,13 +12,25 @@ "test:e2e:install": "playwright install chromium" }, "dependencies": { + "@radix-ui/react-checkbox": "^1.3.3", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-label": "^2.1.8", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-separator": "^1.1.8", + "@radix-ui/react-slider": "^1.3.6", + "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-tabs": "^1.1.13", "@tabler/icons-react": "latest", + "class-variance-authority": "^0.7.1", "classnames": "latest", - "daisyui": "latest", + "clsx": "^2.1.1", "howler": "latest", "i18next": "^26.0.9", "i18next-fs-backend": "^2.6.5", "i18next-resources-to-backend": "^1.2.1", + "lucide-react": "^1.14.0", "luxon": "latest", "next": "16.2.5", "react": "latest", @@ -26,6 +38,8 @@ "react-i18next": "^17.0.6", "socket.io-client": "latest", "swr": "latest", + "tailwind-merge": "^3.5.0", + "tw-animate-css": "^1.4.0", "uuid": "latest" }, "devDependencies": { diff --git a/pages/_app.tsx b/pages/_app.tsx index d2e8e9ce..12d30ea6 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -2,7 +2,9 @@ import '../styles/globals.css' import type { AppProps } from 'next/app' import Head from 'next/head' import Script from 'next/script' -import { ChangeLogModal, GitHubModal, SideBar } from '../components' +import ChangeLogModal from '../components/modals/ChangeLogModal' +import GitHubModal from '../components/modals/GitHubModal' +import SideBar from '../components/SideBar' import '../util/i18n' import { IconBrandTwitch } from '@tabler/icons-react' import { SWRConfig } from 'swr' diff --git a/pages/alarms.tsx b/pages/alarms.tsx index 066a2659..04955c2e 100644 --- a/pages/alarms.tsx +++ b/pages/alarms.tsx @@ -3,7 +3,7 @@ import Head from 'next/head' import React, { useState, useEffect, useRef } from 'react' import { APIGameEvent, APIEventType } from '../common/api' import { GameEvent } from '../common' -import { AlarmConfigModal } from '../components' +import AlarmConfigModal from '../components/modals/AlarmConfigModal' import { DateTime, Duration, Interval } from 'luxon' import useLocalStorage from '../util/useLocalStorage' import { Howl, Howler } from 'howler' diff --git a/pages/merchants.tsx b/pages/merchants.tsx index f2128c11..392bf71b 100644 --- a/pages/merchants.tsx +++ b/pages/merchants.tsx @@ -13,7 +13,7 @@ import io, { Socket } from 'socket.io-client' import { MerchantAPIData, RegionKey, ServerKey } from '../util/types/types' import { RegionTimeZoneMapping } from '../util/static' import { IconSettings } from '@tabler/icons-react' -import { MerchantConfigModal } from '../components' +import MerchantConfigModal from '../components/modals/MerchantConfigModal' interface Merchant { location: string diff --git a/styles/globals.css b/styles/globals.css index 2016a317..4abaacb4 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -1,25 +1,125 @@ @import 'tailwindcss'; -@plugin "daisyui" { - themes: light --default, dark --prefersdark; -} - -@custom-variant dark (&:where(.dark, .dark *, [data-theme=dark], [data-theme=dark] *)); +@import 'tw-animate-css'; @source "../pages/**/*.{js,ts,jsx,tsx}"; @source "../components/**/*.{js,ts,jsx,tsx}"; @source "../util/**/*.{js,ts,jsx,tsx}"; +@source "../lib/**/*.{js,ts,jsx,tsx}"; + +@custom-variant dark (&:is(.dark *)); + +:root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.922 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); +} + +@theme inline { + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} -/* DaisyUI 5 dropped the default flex layout on `.label`; restore the v4 behavior */ -@layer components { - .label { - display: flex; - align-items: center; - justify-content: space-between; - padding-top: 0.5rem; - padding-bottom: 0.5rem; - user-select: none; +@layer base { + * { + @apply border-border outline-ring/50; } - .label-text { - font-size: 0.875rem; + body { + @apply bg-background text-foreground; } } diff --git a/test/unit/util/createTableData.test.tsx b/test/unit/util/createTableData.test.tsx index 09e7dce8..b5c1a004 100644 --- a/test/unit/util/createTableData.test.tsx +++ b/test/unit/util/createTableData.test.tsx @@ -9,8 +9,8 @@ import React from 'react' import { render } from '@testing-library/react' import { DateTime, Interval } from 'luxon' -vi.mock('../../../components', () => ({ - GameEventTableCell: ({ gameEvent }: any) => ( +vi.mock('../../../components/GameEventTableCell', () => ({ + default: ({ gameEvent }: any) => ( ), })) diff --git a/tsconfig.json b/tsconfig.json index a0cf552c..f31e789d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,7 +21,11 @@ "types": [ "vitest/globals", "@testing-library/jest-dom" - ] + ], + "baseUrl": ".", + "paths": { + "@/*": ["./*"] + } }, "include": [ "next-env.d.ts", diff --git a/util/createTableData.tsx b/util/createTableData.tsx index 0fb8565b..83a053d6 100644 --- a/util/createTableData.tsx +++ b/util/createTableData.tsx @@ -1,6 +1,6 @@ import React, { ReactElement } from 'react' import { GameEvent } from '../common' -import { GameEventTableCell } from '../components' +import GameEventTableCell from '../components/GameEventTableCell' import { v4 as uuidv4 } from 'uuid' import { DateTime, Interval, Zone } from 'luxon' import useLocalStorage from './useLocalStorage' diff --git a/vitest.config.ts b/vitest.config.ts index fb828103..78a261f2 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -17,8 +17,6 @@ export default defineConfig({ }, }, resolve: { - alias: { - '@': path.resolve(__dirname, '.'), - }, + alias: [{ find: /^@\/(.*)$/, replacement: path.resolve(__dirname, '$1') }], }, }) From 58d239e9c861533ee397dac2eb8b66d7cffd877d Mon Sep 17 00:00:00 2001 From: Joshua Kuan Date: Wed, 6 May 2026 21:44:43 -0400 Subject: [PATCH 04/35] feat(ui): migrate modals to controlled shadcn Dialog Phase B. The four modals previously used a CSS-only checkbox-toggle pattern that DaisyUI provided (an +
    ) diff --git a/components/modals/AlarmConfigModal.tsx b/components/modals/AlarmConfigModal.tsx index 515146dd..482d998c 100644 --- a/components/modals/AlarmConfigModal.tsx +++ b/components/modals/AlarmConfigModal.tsx @@ -2,9 +2,30 @@ import React from 'react' import { Howl, Howler } from 'howler' import { alert1, alert2, alert3, alert4, alert5, alert6 } from '../../sounds' import useLocalStorage from '../../util/useLocalStorage' -import { IconVolume2, IconVolume3 } from '@tabler/icons-react' +import { Volume1, Volume2 } from 'lucide-react' import { useTranslation } from 'react-i18next' +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogFooter, + DialogClose, +} from '@/components/ui/dialog' +import { Button } from '@/components/ui/button' +import { Checkbox } from '@/components/ui/checkbox' +import { Label } from '@/components/ui/label' +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select' +import { Slider } from '@/components/ui/slider' +import { Separator } from '@/components/ui/separator' + const sounds = { 'Alert 1': alert1, 'Alert 2': alert2, @@ -20,7 +41,43 @@ type AlertSoundKeys = | 'Alert 4' | 'Alert 5' | 'Alert 6' -const AlarmConfigModal = () => { + +interface Props { + open: boolean + onOpenChange: (open: boolean) => void +} + +const Row = ({ + htmlFor, + label, + hint, + control, +}: { + htmlFor: string + label: React.ReactNode + hint?: React.ReactNode + control: React.ReactNode +}) => ( +
    + + {control} +
    +) + +const defaultTheme = (): boolean => + Boolean( + typeof window !== 'undefined' && + (localStorage.getItem('darkMode') || + (window.matchMedia && + window.matchMedia('(prefers-color-scheme: dark)').matches)) + ) + +const AlarmConfigModal = ({ open, onOpenChange }: Props) => { const { t } = useTranslation('alarmConfig') const [viewLocalizedTime, setViewLocalizedTime] = useLocalStorage( @@ -33,10 +90,10 @@ const AlarmConfigModal = () => { 'view24HrTime', false ) - const defaultTheme = (): boolean => { - return Boolean(localStorage.getItem('darkMode') || (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches)) - } - const [darkMode, setDarkMode] = useLocalStorage('darkMode', defaultTheme) + const [darkMode, setDarkMode] = useLocalStorage( + 'darkMode', + defaultTheme + ) const [alertSound, setAlertSound] = useLocalStorage( 'alertSound', 'muted' @@ -51,210 +108,195 @@ const AlarmConfigModal = () => { 'hideDisabledEvents', false ) - const [disabledAlarms, setDisabledAlarms] = useLocalStorage<{ - [key: string]: number - }>('disabledAlarms', {}) + const [, setDisabledAlarms] = useLocalStorage<{ [key: string]: number }>( + 'disabledAlarms', + {} + ) const [volume, setVolume] = useLocalStorage('volume', 0.4) + + const requestNotificationPermission = (checked: boolean) => { + if (typeof window === 'undefined') return + if (!('Notification' in window)) { + alert('This browser does not support desktop notification') + return + } + if (Notification.permission === 'granted') { + setDesktopNotifications(checked) + } else if (Notification.permission !== 'denied') { + Notification.requestPermission((permission) => { + if (permission === 'granted') setDesktopNotifications(checked) + }) + } + } + return ( - <> - -
    -
    -
    -

    - {t('alarm-settings')} -

    -
    -
    -
    -
    - + + + + + + + + ) } diff --git a/components/modals/ChangeLogModal.tsx b/components/modals/ChangeLogModal.tsx index 718d9989..d02788e5 100644 --- a/components/modals/ChangeLogModal.tsx +++ b/components/modals/ChangeLogModal.tsx @@ -1,79 +1,112 @@ import React from 'react' -const ChangeLogModal = () => { +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog' +import { ScrollArea } from '@/components/ui/scroll-area' + +interface Props { + open: boolean + onOpenChange: (open: boolean) => void +} + +const Entry = ({ + date, + items, + ordered = true, +}: { + date: string + items: string[] + ordered?: boolean +}) => { + const List = ordered ? 'ol' : 'ul' return ( - <> - -
  • {item}
  • + ))} + +
    + ) +} -

    3/19/2022:

    -
      -
    1. Fix: alarms should now work after correct user interaction.
    2. -
    3. Added actual alarm reminders, alerts and sounds.
    4. -
    5. Added hiding of events and customization of hidden events.
    6. -
    7. Moved settings into config modal.
    8. -
    +const ChangeLogModal = ({ open, onOpenChange }: Props) => { + return ( + + + + Changelog + + +
    +
    +

    Planned

    +
      +
    • Wandering Merchant Ships
    • +
    • Daily Reset Timer
    • +
    • Procyon Compass Checkboxes
    • +
    • Discord Bot
    • +
    +
    -

    3/18/2022:

    -
      -
    1. Fixed timers from morning's patch.
    2. -
    -
    -

    3/17/2022:

    -
      -
    1. Fixed somewhat borked timers from last night's patch.
    2. -
    3. Gesbroy and Chaos Gates now displays accurate times.
    4. -
    5. - Events should now automatically update when day passes 12AM. -
    6. -
    7. - Added text to show when selected day was not same as current - day. -
    8. -
    -
    -
    -

    3/16/2022:

    -
      -
    1. Added light mode colors.
    2. -
    3. Site is now more mobile friendly!
    4. -
    5. Added server timezone persistence.
    6. -
    + +
    -

    3/15/2022: Release v1.0!

    -
    - - +
    +
    +
    ) } diff --git a/components/modals/GitHubModal.tsx b/components/modals/GitHubModal.tsx index a980bc8f..cc0c5d02 100644 --- a/components/modals/GitHubModal.tsx +++ b/components/modals/GitHubModal.tsx @@ -1,38 +1,48 @@ -import { IconBrandDiscord } from '@tabler/icons-react' import React from 'react' -const GitHubModal = () => { +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog' + +interface Props { + open: boolean + onOpenChange: (open: boolean) => void +} + +const GitHubModal = ({ open, onOpenChange }: Props) => { return ( - <> - - - + + + + GitHub + +

    + + Looking to contribute? + +

    +

    + Feel free to send me a{' '} + + DM here + {' '} + (@josh.8746) if you want to report a bug or suggest something new! +

    +
    +
    ) } diff --git a/components/modals/MerchantConfigModal.tsx b/components/modals/MerchantConfigModal.tsx index 86817826..7f250ec2 100644 --- a/components/modals/MerchantConfigModal.tsx +++ b/components/modals/MerchantConfigModal.tsx @@ -2,7 +2,49 @@ import React from 'react' import useLocalStorage from '../../util/useLocalStorage' import { useTranslation } from 'react-i18next' -const MerchantConfigModal = () => { +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogFooter, + DialogClose, +} from '@/components/ui/dialog' +import { Button } from '@/components/ui/button' +import { Checkbox } from '@/components/ui/checkbox' +import { Label } from '@/components/ui/label' + +interface Props { + open: boolean + onOpenChange: (open: boolean) => void +} + +const Row = ({ + htmlFor, + label, + control, +}: { + htmlFor: string + label: React.ReactNode + control: React.ReactNode +}) => ( +
    + + {control} +
    +) + +const defaultTheme = (): boolean => + Boolean( + typeof window !== 'undefined' && + (localStorage.getItem('darkMode') || + (window.matchMedia && + window.matchMedia('(prefers-color-scheme: dark)').matches)) + ) + +const MerchantConfigModal = ({ open, onOpenChange }: Props) => { const { t } = useTranslation('merchantConfig') const [viewLocalizedTime, setViewLocalizedTime] = useLocalStorage( 'viewLocalizedTime', @@ -12,135 +54,96 @@ const MerchantConfigModal = () => { 'view24HrTime', false ) - const defaultTheme = (): boolean => { - return Boolean(localStorage.getItem('darkMode') || (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches)) - } - const [darkMode, setDarkMode] = useLocalStorage('darkMode', defaultTheme) - const [alertSound, setAlertSound] = useLocalStorage( - 'alertSound', - 'muted' - ) - const [hideGrandPrix, setHideGrandPrix] = useLocalStorage( - 'hideGrandPrix', - false - ) - const [moveDisabledEventsBottom, setMoveDisabledEventsBottom] = - useLocalStorage('moveDisabledEventsBottom', false) - const [hideDisabledEvents, setHideDisableEvents] = useLocalStorage( - 'hideDisabledEvents', - false + const [darkMode, setDarkMode] = useLocalStorage( + 'darkMode', + defaultTheme ) - const [hideMerchantItems, setHideMerchantItems] = useLocalStorage( 'hideMerchantItems', false ) - const [hidePotentialSpawns, sethidePotentialSpawns] = useLocalStorage( + const [hidePotentialSpawns, sethidePotentialSpawns] = useLocalStorage( 'hidePotentialMerchantLocationSpawns', false ) - const [disabledAlarms, setDisabledAlarms] = useLocalStorage<{ - [key: string]: number - }>('disabledAlarms', {}) - const [volume, setVolume] = useLocalStorage('volume', 0.4) + return ( - <> - -
    -
    -
    -

    - {t('merchant-settings')} -

    -
    -
    -
    -
    -
    - + + + + + + + + ) } diff --git a/pages/_app.tsx b/pages/_app.tsx index 12d30ea6..7c44df7d 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,4 +1,5 @@ import '../styles/globals.css' +import { useState } from 'react' import type { AppProps } from 'next/app' import Head from 'next/head' import Script from 'next/script' @@ -10,7 +11,10 @@ import { IconBrandTwitch } from '@tabler/icons-react' import { SWRConfig } from 'swr' import NavBar from '../components/NavBar' -function MyApp({ Component, pageProps, ...AppProps }: AppProps) { +function MyApp({ Component, pageProps }: AppProps) { + const [ghOpen, setGhOpen] = useState(false) + const [changelogOpen, setChangelogOpen] = useState(false) + return ( <> @@ -38,9 +42,12 @@ function MyApp({ Component, pageProps, ...AppProps }: AppProps) { - - - + + + setGhOpen(true)} + onOpenChangelog={() => setChangelogOpen(true)} + /> -
    + + -
    - {process.env.NEXT_PUBLIC_VERCEL_ENV === 'production' ? ( - {' '} + ) : null} diff --git a/pages/alarms.tsx b/pages/alarms.tsx index 04955c2e..c354a744 100644 --- a/pages/alarms.tsx +++ b/pages/alarms.tsx @@ -158,6 +158,7 @@ const Alarms: NextPage = () => { false ) const [unlockedAudio, setUnlockedAudio] = useState(false) + const [configOpen, setConfigOpen] = useState(false) const [moveDisabledEventsBottom, setMoveDisabledEventsBottom] = useLocalStorage('moveDisabledEventsBottom', false) const [hideDisabledEvents, setHideDisableEvents] = useLocalStorage( @@ -507,12 +508,7 @@ const Alarms: NextPage = () => { content="width=device-width, initial-scale=0.35" > - +
    @@ -541,12 +537,14 @@ const Alarms: NextPage = () => { > {'>>'} - +
    diff --git a/pages/merchants.tsx b/pages/merchants.tsx index 392bf71b..ea38fc21 100644 --- a/pages/merchants.tsx +++ b/pages/merchants.tsx @@ -87,6 +87,7 @@ const Merchants: NextPage = (props) => { const [merchantTableData, setMerchantTableData] = useState< Array >([]) + const [configOpen, setConfigOpen] = useState(false) const [wanderingMerchants, setWanderingMerchants] = useState< WanderingMerchant[] @@ -216,7 +217,7 @@ const Merchants: NextPage = (props) => { Merchants - Lost Ark Timer - +
    @@ -228,12 +229,14 @@ const Merchants: NextPage = (props) => { }} />
    - +
    i18n.changeLanguage(v)} + > + + + + + EN + ZH + + +
    -
    - - -
    -
    + ) } diff --git a/pages/alarms.tsx b/pages/alarms.tsx index c354a744..9abc2443 100644 --- a/pages/alarms.tsx +++ b/pages/alarms.tsx @@ -15,7 +15,17 @@ import { RegionKey } from '../util/types/types' import { RegionTimeZoneMapping } from '../util/static' import { isWithinNotifyWindow } from '../util/alarmTrigger' import { useTranslation } from 'react-i18next' -var classNames = require('classnames') +import { ChevronLeft, ChevronRight } from 'lucide-react' + +import { cn } from '@/lib/utils' +import { Button } from '@/components/ui/button' +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select' type AlertSoundKeys = | 'Alert 1' @@ -505,248 +515,216 @@ const Alarms: NextPage = () => { Alarms - Lost Ark Timer -
    -
    -
    - - + - + {!serverTime.hasSame(selectedDate, 'day') && ( + + {selectedDate.toRelative()} + + )} + + + +
    + +
    + +
    +
    + {t('common:current-time')}: + + {mounted + ? currDate.toLocaleString( + view24HrTime + ? DateTime.TIME_24_WITH_SHORT_OFFSET + : DateTime.TIME_WITH_SHORT_OFFSET + ) + : ''} + +
    +
    + {t('common:server-time')}: + + {mounted + ? serverTime.toLocaleString( + view24HrTime + ? DateTime.TIME_24_WITH_SHORT_OFFSET + : DateTime.TIME_WITH_SHORT_OFFSET + ) + : ''} + +
    +
    +
    +
    + + {alertSound !== 'muted' && !unlockedAudio && ( + )} + +
    +

    + {selectedDate.hasSame(serverTime, 'day') + ? 'Alarms' + : `Viewing events ${selectedDate.toRelative()}`} + + (Alerts {alertSound === 'muted' ? 'muted' : 'on'}) + +

    +
    -
    -
    - - - - - - - - - - - - - - - -
    - {t('common:current-time')}: - - {mounted - ? currDate.toLocaleString( - view24HrTime - ? DateTime.TIME_24_WITH_SHORT_OFFSET - : DateTime.TIME_WITH_SHORT_OFFSET - ) - : ''} -
    - {t('common:server-time')}: - - {mounted - ? serverTime.toLocaleString( - view24HrTime - ? DateTime.TIME_24_WITH_SHORT_OFFSET - : DateTime.TIME_WITH_SHORT_OFFSET - ) - : ''} -
    - -
    -
    -
    -
    - {alertSound !== 'muted' && !unlockedAudio && ( -
    { - setUnlockedAudio(true) - let s = new Howl({ - src: sounds[alertSound as AlertSoundKeys] as unknown as string, - }) - s.play() - }} - > -
    - + - Click on me to start receiving alert sounds! -
    -
    - )} -
    - - - - - - - - - - - - - - - -
    All + + {eventsInSection(-1)} + + + {eventTypeIconMapping.map((e: APIEventType) => ( +
    -
    - - {eventTypeIconMapping.map((e: APIEventType) => ( - - ))} -
    -
    - {currentEventsTable.length > 0 ? ( - - - {currentEventsTable} - -
    - ) : null} - - {fullEventsTable} + + + {t(`categories.${e.name}`)} + + + {eventsInSection(e.id)} + + + ))} + + +
    + {currentEventsTable.length > 0 ? ( +
    +
    + {currentEventsTable}
    -
    -
    +
    + ) : null} + + {fullEventsTable} +
    + +
    +
    ) diff --git a/pages/merchants.tsx b/pages/merchants.tsx index ea38fc21..f74e364b 100644 --- a/pages/merchants.tsx +++ b/pages/merchants.tsx @@ -14,6 +14,17 @@ import { MerchantAPIData, RegionKey, ServerKey } from '../util/types/types' import { RegionTimeZoneMapping } from '../util/static' import { IconSettings } from '@tabler/icons-react' import MerchantConfigModal from '../components/modals/MerchantConfigModal' +import { useTranslation } from 'react-i18next' + +import { cn } from '@/lib/utils' +import { Button } from '@/components/ui/button' +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select' interface Merchant { location: string @@ -218,99 +229,113 @@ const Merchants: NextPage = (props) => { Merchants - Lost Ark Timer -
    -
    -
    - -
    - -
    - - {regionTZName && ( - - )} + + +
    + +
    +
    + + {regionTZName && ( + + )} +
    +
    +
    + {t('common:current-time')}: + + {isMounted.current + ? currDate.toLocaleString( + view24HrTime + ? DateTime.TIME_24_WITH_SHORT_OFFSET + : DateTime.TIME_WITH_SHORT_OFFSET + ) + : ''} + +
    +
    + {t('common:server-time')}: + + {isMounted.current + ? serverTime.toLocaleString( + view24HrTime + ? DateTime.TIME_24_WITH_SHORT_OFFSET + : DateTime.TIME_WITH_SHORT_OFFSET + ) + : ''} + +
    +
    +
    - - - - - - - - - - - -
    {t('common:current-time')}: - {isMounted.current - ? currDate.toLocaleString( - view24HrTime - ? DateTime.TIME_24_WITH_SHORT_OFFSET - : DateTime.TIME_WITH_SHORT_OFFSET - ) - : ''} -
    {t('common:server-time')}: - {isMounted.current - ? serverTime.toLocaleString( - view24HrTime - ? DateTime.TIME_24_WITH_SHORT_OFFSET - : DateTime.TIME_WITH_SHORT_OFFSET - ) - : ''} -
    +

    -
    +
    @@ -499,7 +524,4 @@ const Merchants: NextPage = (props) => { ) } -import { useTranslation } from 'react-i18next' -import classNames from 'classnames' - export default Merchants From 2d5bc9810e476fd46a2f7cf1d103831794e8036f Mon Sep 17 00:00:00 2001 From: Joshua Kuan Date: Wed, 6 May 2026 21:54:35 -0400 Subject: [PATCH 06/35] feat(ui): rewrite event/merchant cells as cards with shadcn DropdownMenu Phase D. The dense table-cell layout with a permanently-visible DaisyUI dropdown menu is gone; cells are now real cards with a real controlled menu. GameEventTableCell: - Card layout: icon, title with item-level prefix, countdown on the right, time chips below. - Disable menu moves to a per-card MoreVertical button via shadcn DropdownMenu. Items: Disable Once / 12h / Daily reset / Weekly reset, plus a destructive "Disable all future". Disabled events show a single Enable item instead. - Repeated grand-prix events keep their group/show toggle but as the first dropdown item with a separator, not a parallel control flow. - Extract disable handlers (disableOnce / disable12Hours / disableDailyReset / disableWeeklyReset / disableThreeWeeks / enable) so the JSX no longer has six near-identical 8-line inline closures. - Drop the ~120 lines of dead bottom-of-file commented JSX. MerchantTableCell: - Card layout with bg-card / border / spacing. Spawned merchants get an amber accent (border + tinted bg in light/dark). Out-of-progress merchants fade to opacity-70. - Replace classnames with cn; drop unused imports (Interval, merchantSchedules, the inactive mSchedules side-effect). - Pull RARITY_TEXT, rarityFromId, goodItemRarityClass, iconURL, openLocationImage out as module-scope helpers. - Item lists use a real ul with rarity-color text and 20x20 icons. - Potential-spawns sidebar becomes a right-side column; hidden when hide-potential-spawns or merchant.spawned. createTableData: - generateTimestampStrings color tokens move off DaisyUI semantics (text-success / text-slate-400/25) onto Tailwind/shadcn-friendly colors (text-emerald-600 / text-muted-foreground/40). - Padding cell loses the now-unneeded flex/space-x-4 chrome. Updated 2 unit tests for the new color-class names. 23/23 still pass; build + typecheck clean. --- components/GameEventTableCell.tsx | 537 ++++++++---------------- components/MerchantTableCell.tsx | 467 ++++++++++----------- test/unit/util/createTableData.test.tsx | 5 +- util/createTableData.tsx | 10 +- 4 files changed, 402 insertions(+), 617 deletions(-) diff --git a/components/GameEventTableCell.tsx b/components/GameEventTableCell.tsx index d0eacc6d..8969644c 100644 --- a/components/GameEventTableCell.tsx +++ b/components/GameEventTableCell.tsx @@ -1,11 +1,22 @@ import React, { useEffect, useState } from 'react' import { GameEvent } from '../common' - import { DateTime, Duration, Zone } from 'luxon' -import classNames from 'classnames' +import { MoreVertical } from 'lucide-react' import useLocalStorage from '../util/useLocalStorage' import { generateTimestampStrings } from '../util/createTableData' import { useTranslation } from 'react-i18next' + +import { cn } from '@/lib/utils' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu' +import { Button } from '@/components/ui/button' + type CellProps = { gameEvent: GameEvent serverTime: DateTime @@ -13,6 +24,10 @@ type CellProps = { view24HrTime: boolean | undefined } +// Event IDs that the legacy code treated as "repeated grand-prix-style" +// events; toggling 'group repeated events' shows/hides duplicates. +const REPEATED_EVENT_IDS = new Set([945, 946, 947, 948, 949, 950, 951]) + const GameEventTableCell = (props: CellProps): React.ReactElement => { const { t } = useTranslation('events') const { gameEvent, serverTime, localizedTZ, view24HrTime } = props @@ -23,6 +38,7 @@ const GameEventTableCell = (props: CellProps): React.ReactElement => { 'hideGrandPrix', false ) + const millisUntilLatest = (against: DateTime): number => { const next = gameEvent.latest(serverTime) if (!next || !next.start) return 0 @@ -32,376 +48,181 @@ const GameEventTableCell = (props: CellProps): React.ReactElement => { Duration.fromMillis(millisUntilLatest(serverTime)) ) useEffect(() => { - if (!gameEvent.disabled) { - const timer = setInterval(() => { - setTimeUntil( - Duration.fromMillis( - millisUntilLatest(DateTime.now().setZone(serverTime.zone)) - ) + if (gameEvent.disabled) return + const timer = setInterval(() => { + setTimeUntil( + Duration.fromMillis( + millisUntilLatest(DateTime.now().setZone(serverTime.zone)) ) - }, 1000) - - return () => { - clearInterval(timer) // Return a funtion to clear the timer so that it will stop being called on unmount - } - } + ) + }, 1000) + return () => clearInterval(timer) + // eslint-disable-next-line react-hooks/exhaustive-deps }, []) - if (gameEvent === null) { - return ( - - ) + const applyDisable = (until: DateTime | null | undefined) => { + if (!until) return + setDisabledAlarms({ + ...(disabledAlarms ?? {}), + [gameEvent.gameEvent.id]: until.toMillis(), + }) + gameEvent.disabled = until + } + + const enable = () => { + if (!disabledAlarms) return + const next = { ...disabledAlarms } + delete next[gameEvent.gameEvent.id] + gameEvent.disabled = null + setDisabledAlarms(next) } + + const latestEnd = (): DateTime | null => { + const next = gameEvent.latest(serverTime) + return next?.end ?? null + } + + const disableOnce = () => applyDisable(latestEnd()) + const disable12Hours = () => applyDisable(latestEnd()?.plus({ hours: 12 })) + const disableThreeWeeks = () => + applyDisable(latestEnd()?.plus({ hours: 336 })) + + const disableDailyReset = () => { + let until = DateTime.now().set({ + hour: 5, + minute: 0, + second: 0, + millisecond: 0, + }) + if (until <= DateTime.now()) until = until.plus({ days: 1 }) + applyDisable(until) + } + + const disableWeeklyReset = () => { + let until = DateTime.now().set({ + weekday: 4, + hour: 5, + minute: 0, + second: 0, + millisecond: 0, + }) + if (until <= DateTime.now()) until = until.plus({ days: 7 }) + applyDisable(until) + } + + const isRepeatedEvent = REPEATED_EVENT_IDS.has(Number(gameEvent.gameEvent.id)) + const isGrouped = isRepeatedEvent && hideGrandPrix + const isDisabled = !!gameEvent.disabled + + const eventLabel = isGrouped + ? gameEvent.groupName + : t(`${gameEvent.gameEvent.id}`) + return ( - ) } -/**return ( - <> - - - - - className={`${ - t.start.diff(serverTime).valueOf() > 0 - ? 'text-success' - : 'text-slate-500' - }`} - >{`${t.start.toLocaleString(DateTime.TIME_24_SIMPLE)}${ - !t.isEmpty() - ? ` - ${t.end.toLocaleString(DateTime.TIME_24_SIMPLE)}` - : '' - } `}{' '} - {idx < gameEvent.times.length - 1 ? ' / ' : ''} - */ export default GameEventTableCell diff --git a/components/MerchantTableCell.tsx b/components/MerchantTableCell.tsx index 7c004b09..55ad70a0 100644 --- a/components/MerchantTableCell.tsx +++ b/components/MerchantTableCell.tsx @@ -1,14 +1,13 @@ import React, { useState, useEffect } from 'react' -import merchantSchedules from '../data/merchantSchedules.json' import itemMapping from '../data/itemMapping.json' import itemRarity from '../data/itemRarity.json' -import { DateTime, Interval, Zone } from 'luxon' -import classNames from 'classnames' -import { generateTimestampStrings } from '../util/createTableData' +import { DateTime, Zone } from 'luxon' import WanderingMerchant from '../common/WanderingMerchant' import useLocalStorage from '../util/useLocalStorage' import { useTranslation } from 'react-i18next' +import { cn } from '@/lib/utils' + type ItemMappingKey = keyof typeof itemMapping interface CellProps { @@ -17,48 +16,86 @@ interface CellProps { localizedTZ: Zone view24HrTime: boolean } -let mSchedules: { [key: number]: Interval[] } = {} + +const RARITY_TEXT: Record<0 | 1 | 2 | 3, string> = { + 0: 'text-[#6fc300]', + 1: 'text-[#00b5ff]', + 2: 'text-[#bf00fe]', + 3: 'text-[#f39303]', +} + +const rarityFromId = (id: number): 0 | 1 | 2 | 3 => { + const ir = itemRarity as { [key: string]: 0 | 1 | 2 | 3 } + return ir[String(id)] ?? 0 +} + +const goodItemRarityClass = (goodItem: string | null): string => { + if (!goodItem) return '' + switch (goodItem.split(' ')[0]) { + case 'No': + return RARITY_TEXT[0] + case 'Seria': + case 'Sian': + return RARITY_TEXT[1] + case 'Madnick': + case 'Mokamoka': + case 'Kaysarr': + return RARITY_TEXT[2] + case 'Wei': + case 'Legendary': + return RARITY_TEXT[3] + default: + return '' + } +} + +const iconURL = (item: number) => { + const mapping = itemMapping[String(item) as ItemMappingKey] + return mapping + ? `https://lostarkcodex.com/icons/${mapping.fileName}` + : '' +} + +const openLocationImage = (imageUrl: string, title: string) => { + if (!imageUrl) return + window.open( + `https://i.imgur.com/${imageUrl}`, + title, + 'left=20,top=20,width=1000,height=600,toolbar=0,resizable=1,noopener=1,noreferrer=1' + ) +} const MerchantTableCell = (props: CellProps): React.ReactElement => { const { t } = useTranslation('merchants') const { merchant, serverTime, localizedTZ, view24HrTime } = props - Object.entries(merchantSchedules).forEach( - ([key, schedule]) => - (mSchedules[Number(key)] = schedule.map(({ h, m }) => { - let start = DateTime.fromObject( - { hour: h, minute: m } - // { zone: serverZone } - ) - return Interval.fromDateTimes(start, start.plus({ minutes: 25 })) - })) - ) - const [nextSpawnCountdown, setNextSpawnCountdown] = useState( - merchant - .nextSpawnTime(serverTime) - .start!.setZone(serverTime.zone) - .diff(DateTime.now()) - ) - useEffect(() => { - const timer = setInterval(() => { - setNextSpawnCountdown( - merchant - .nextSpawnTime(serverTime) - .start!.setZone(serverTime.zone) - .diff(DateTime.now()) - ) - }, 1000) - return () => { - clearInterval(timer) - } - }) - const [hideMerchantItems, setHideMerchantItems] = useLocalStorage( + + const [hideMerchantItems] = useLocalStorage( 'hideMerchantItems', false ) - const [hidePotentialSpawns, sethidePotentialSpawns] = useLocalStorage( + const [hidePotentialSpawns] = useLocalStorage( 'hidePotentialMerchantLocationSpawns', false ) + + const computeCountdown = () => { + const next = merchant.nextSpawnTime(serverTime) + if (!next?.start) return null + return next.start.setZone(serverTime.zone).diff(DateTime.now()) + } + + const [nextSpawnCountdown, setNextSpawnCountdown] = useState( + computeCountdown() + ) + useEffect(() => { + const timer = setInterval(() => setNextSpawnCountdown(computeCountdown()), 1000) + return () => clearInterval(timer) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) + + const inProgress = !!merchant.inProgress(serverTime) + const localInProgress = !!merchant.inProgress(serverTime.setZone(localizedTZ)) + let imageUrl = '' if (merchant.location) { imageUrl = @@ -68,97 +105,45 @@ const MerchantTableCell = (props: CellProps): React.ReactElement => { ) || '' ] } - const gradientColor = (id: 0 | 1 | 2 | 3) => { - if (id === 0) return 'bg-gradient-to-br from-[#1e2f08] to-[#4c8204]' - if (id === 1) return 'bg-gradient-to-br from-[#082c3b] to-[#0479a9]' - if (id === 2) return 'bg-gradient-to-br from-[#2e083b] to-[#8004a9]' - if (id === 3) return 'bg-gradient-to-br from-[#392509] to-[#a16305]' - } - const textColor = (id: 0 | 1 | 2 | 3) => { - if (id === 0) return 'text-[#6fc300]' - if (id === 1) return 'text-[#00b5ff]' - if (id === 2) return 'text-[#bf00fe]' - if (id === 3) return 'text-[#f39303]' - } - const rarity = (id: number): 0 | 1 | 2 | 3 => { - let ir = itemRarity as { [key: string]: 0 | 1 | 2 | 3 } - return ir[String(id)] - } - const merchantGoodItemToRarity = (goodItem: string | null): string => { - if (goodItem) { - let first = goodItem.split(' ')[0] - switch (first) { - case 'No': - return 'text-[#6fc300]' - case 'Seria': - case 'Sian': - return 'text-[#00b5ff]' - case 'Madnick': - case 'Mokamoka': - case 'Kaysarr': - return 'text-[#bf00fe]' - case 'Wei': - case 'Legendary': - return 'text-[#f39303]' - default: - return '' - } - } - return '' - } - const onClickOpenWindow = (imageUrl: string, title: string) => { - window.open( - `https://i.imgur.com/${imageUrl}`, - title, - 'left=20,top=20,width=1000,height=600,toolbar=0,resizable=1,noopener=1,noreferrer=1' - ) - return false - } - const iconURL = (item: number) => { - let iconName = itemMapping[String(item) as ItemMappingKey].fileName - return `https://lostarkcodex.com/icons/${iconName}` - } - //class="dropdown m-2 flex basis-1/2 bg-stone-100 p-2 hover:cursor-pointer dark:bg-base-100 dark:hover:bg-base-100/70" - return ( - ) } diff --git a/test/unit/util/createTableData.test.tsx b/test/unit/util/createTableData.test.tsx index b5c1a004..a180077d 100644 --- a/test/unit/util/createTableData.test.tsx +++ b/test/unit/util/createTableData.test.tsx @@ -127,7 +127,8 @@ describe('generateTimestampStrings', () => { intervalAt('2026-05-06T09:00', '2026-05-06T09:30'), at('2026-05-06T10:00') ) - expect(c.querySelector('.text-slate-400\\/25')).toBeTruthy() + const span = c.querySelector('span > span') + expect(span?.className).toMatch(/text-muted-foreground/) }) it('marks intervals starting within 15 minutes with the imminent-color class', () => { @@ -154,6 +155,6 @@ describe('generateTimestampStrings', () => { at('2026-05-06T10:00') ) const span = c.querySelector('span > span') - expect(span?.className).toMatch(/text-green-700/) + expect(span?.className).toMatch(/text-emerald-600/) }) }) diff --git a/util/createTableData.tsx b/util/createTableData.tsx index 83a053d6..e86e0ec2 100644 --- a/util/createTableData.tsx +++ b/util/createTableData.tsx @@ -66,7 +66,7 @@ export const createTableData = ( children.push( ) } @@ -109,10 +109,10 @@ export const generateTimestampStrings = ( = 0 && diff < 900000), - 'text-green-700 dark:text-success': diff >= 900000, + 'text-emerald-600 dark:text-emerald-400': diff >= 900000, })} > {startTime} @@ -120,7 +120,7 @@ export const generateTimestampStrings = ( {idx < eventTimes.length - 1 ? ' / ' : ''} From 310abe09a897dbd2c2e63578e7d8de79ffaee4c5 Mon Sep 17 00:00:00 2001 From: Joshua Kuan Date: Wed, 6 May 2026 21:56:23 -0400 Subject: [PATCH 07/35] feat(ui): drop data-theme, polish merchants schedules section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase E. Wraps up the shadcn rewrite. Theme: - Switch dark-mode plumbing from DaisyUI's data-theme="dark" + .dark class double-toggle to a single classList.toggle('dark', ...). The custom-variant in globals.css already keys off .dark, and shadcn CSS vars propagate through the component tree. - One line each in pages/alarms.tsx and pages/merchants.tsx. Polish: - Drop dead buttonClick DOM manipulation in alarms.tsx — it added /removed btn-active classes that no longer exist; the active filter state is already driven by selectedEventType React state. - Rebuild merchants page schedules section: replace the giant table-of-tables with a top action row (data-by SaintBot, last-updated timestamp, vote button) above a 3-column grid of bg-card schedule reference cards. Schedule 1/2/3 each show its rotation times in one column and merchant→location in another, with proper tabular-nums. - Suppress hydration warning on the last-updated timestamp. - Replace last legacy bg-stone-400 / dark:bg-base-200 / btn-outline classes with shadcn-friendly equivalents. --- pages/alarms.tsx | 18 +-- pages/merchants.tsx | 296 ++++++++++++++++---------------------------- 2 files changed, 109 insertions(+), 205 deletions(-) diff --git a/pages/alarms.tsx b/pages/alarms.tsx index 9abc2443..33cf0758 100644 --- a/pages/alarms.tsx +++ b/pages/alarms.tsx @@ -115,16 +115,7 @@ const Alarms: NextPage = () => { return } - //Toggle Daisy UI colors (e.g. bg-base-###) - document.documentElement.setAttribute( - 'data-theme', - darkMode ? 'dark' : 'light' - ) - - //Toggle standard Tailwind colors (e.g. bg-sky-800) - darkMode - ? document.documentElement.classList.add('dark') - : document.documentElement.classList.remove('dark') + document.documentElement.classList.toggle('dark', !!darkMode) }, [darkMode]) const [serverTime, setServerTime] = useState( @@ -342,14 +333,7 @@ const Alarms: NextPage = () => { event: React.MouseEvent, id: number ) => { - buttons.forEach((b) => { - if (b.current) - (b.current as unknown as Element).classList.remove('btn-active') - }) - let button = event.target as Element - button.classList.add('btn-active') setSelectedEventType(id) - // generateFullEventsTable(id) } const generateEventsTable = (eventType: number) => { diff --git a/pages/merchants.tsx b/pages/merchants.tsx index f74e364b..e607dea0 100644 --- a/pages/merchants.tsx +++ b/pages/merchants.tsx @@ -52,13 +52,7 @@ const Merchants: NextPage = (props) => { //Prevents FoUC (Flash of Unstylized Content) by not refreshing on first mount if (!isMounted.current){ isMounted.current = true; return } - //Toggle Daisy UI colors (e.g. bg-base-###) - document.documentElement.setAttribute('data-theme', darkMode ? 'dark' : 'light') - - //Toggle standard Tailwind colors (e.g. bg-sky-800) - darkMode - ? document.documentElement.classList.add("dark") - : document.documentElement.classList.remove("dark") + document.documentElement.classList.toggle('dark', !!darkMode) }, [darkMode]) const [currDate, setCurrDate] = useState(DateTime.now()) @@ -335,188 +329,114 @@ const Merchants: NextPage = (props) => { /> -
    -
    +
    -
    - {gameEvent.gameEvent.name} -
    -
    -
    - - {!(hideGrandPrix && gameEvent.groupName) && - `[${gameEvent.gameEvent.minItemLevel}] `} - {(hideGrandPrix && gameEvent.groupName) || - t(`${gameEvent.gameEvent.id}`)} - - {gameEvent.disabled - ? null - : `-${timeUntil.toFormat('hh:mm:ss')}`} - - - - {gameEvent.times.map((t, idx) => - generateTimestampStrings( - gameEvent, - t, - serverTime, - localizedTZ, - view24HrTime || false, - idx - ) + {gameEvent.gameEvent.name} + +
    +
    +

    + {!isGrouped && ( + + [{gameEvent.gameEvent.minItemLevel}] + )} - + {eventLabel} +

    + {!isDisabled && ( + + -{timeUntil.toFormat('hh:mm:ss')} + + )}
    +

    + {gameEvent.times.map((interval, idx) => + generateTimestampStrings( + gameEvent, + interval, + serverTime, + localizedTZ, + view24HrTime || false, + idx + ) + )} +

    -
    - + + ) : ( + <> + {t('alarms:disable.until')} + + {t('alarms:disable.once')} + + + {t('alarms:disable.12hrs')} + + + {t('alarms:disable.daily-reset')} + + + {t('alarms:disable.weekly-reset')} + + + + {t('alarms:disable.all')} + + + )} + + +
    - {/*
    */} -
    -
    - - +
    +
    +
    +

    - {merchant.name} ({t(`locations.${merchant.continent}`)}){' '} - {merchant.inProgress(serverTime) ? ( - - {' '} + {merchant.name}{' '} + + ({t(`locations.${merchant.continent}`)}) + + {inProgress && ( + {serverTime - .set({ - minute: 30, - }) + .set({ minute: 30 }) .setZone(localizedTZ) .toLocaleString( view24HrTime ? DateTime.TIME_24_SIMPLE : DateTime.TIME_SIMPLE )}{' '} - -{' '} + –{' '} {serverTime .set({ minute: 55 }) .setZone(localizedTZ) @@ -168,147 +153,125 @@ const MerchantTableCell = (props: CellProps): React.ReactElement => { : DateTime.TIME_SIMPLE )} - ) : null} - + )} +

    - {merchant.inProgress(serverTime) ? ( -
    - - {t('location')}:{' '} - - {merchant.spawned ? ( - - onClickOpenWindow(imageUrl, merchant.location || '') - } - > - {t(`locations.${merchant.location}`)} - - ) : ( - 'Unknown' - )} - - -
    - Item:{' '} - {merchant.goodItems - ? merchant.goodItems.map((goodItem, index) => ( - - {goodItem} - {index === 0 ? , : ''} - - )) - : 'Unknown'} + {inProgress && ( +
    +
    + {t('location')}: + {merchant.spawned ? ( + + ) : ( + Unknown + )} +
    +
    + Item: + {merchant.goodItems + ? merchant.goodItems.map((goodItem, index) => ( + + {goodItem} + {index === 0 ? ', ' : ''} + + )) + : 'Unknown'} +
    - ) : null} - - - {t('next-spawn')}:{' '} - {merchant - .nextSpawnTime(serverTime) - ?.start?.setZone(localizedTZ) - .toLocaleString( - view24HrTime ? DateTime.TIME_24_SIMPLE : DateTime.TIME_SIMPLE - )} - - -{nextSpawnCountdown.toFormat('hh:mm:ss')} - - - {merchant.spawned}{' '} -
    -
    - {t('potential-spawns')} - {Object.entries(merchant.locationImages).map( - ([locationName, imgUrl], idx, arr) => ( - - onClickOpenWindow(imgUrl, locationName)} - > - {t(`locations.${locationName}`)} + )} + +
    + {t('next-spawn')}: + {nextSpawnLabel} + {!inProgress && nextSpawnCountdown && ( + + -{nextSpawnCountdown.toFormat('hh:mm:ss')} - {idx + 1 < arr.length ?
    : ''} - - ) + )} +
    +
    + + {!merchant.spawned && !hidePotentialSpawns && ( +
    +
    {t('potential-spawns')}
    +
    + {Object.entries(merchant.locationImages).map( + ([locationName, imgUrl]) => ( + + ) + )} +
    +
    )} -
    -
    -
    + {[ + { title: 'Rapport', items: merchant.items.rapport }, + { title: 'Cards', items: merchant.items.cards }, + { title: 'Cooking', items: merchant.items.cooking }, + ] + .filter(({ items }) => items.length > 0) + .map(({ title, items }) => ( +
    +

    + {title} +

    +
      + {items.map((item) => ( +
    • + { + + {t(`items.${item}.name`)} + +
    • + ))} +
    +
    + ))} +
    )} - > - {[ - { title: 'Rapport', items: merchant.items.rapport }, - { title: 'Cards', items: merchant.items.cards }, - { title: 'Cooking', items: merchant.items.cooking }, - ].map(({ title, items }, idx) => { - return items.length ? ( -
    -
    - {title} - {items.map((item) => ( -
    - {itemMapping[String(item) - - {t(`items.${item}.name`)} - -
    - ))} -
    -
    - ) : null - })}
    - {/*
    */}
    - - - - - - - - - - - - - + {sched === 2 && ( + <> +
  • Malone — {t('locations.West Luterra')}
  • +
  • Burt — {t('locations.East Luterra')}
  • +
  • Oliver — {t('locations.Tortoyk')}
  • +
  • Nox — {t('locations.Arthetine')}
  • +
  • Aricer — {t('locations.Rohendel')}
  • +
  • Rayni — {t('locations.Punika')}
  • + + )} + {sched === 3 && ( + <> +
  • Ben — {t('locations.Rethramis')}
  • +
  • Evan — {t('locations.South Vern')}
  • +
  • Peter — {t('locations.North Vern')}
  • +
  • Laitir — {t('locations.Yorn')}
  • + + )} + + + + ))} + + +
    - Wandering Merchants - - {t('vote')} - - - {t('data-by')} SaintBot{' '} - SaintBot - -
    - {t('last-updated')}:{' '} - {dataLastRefreshed.toLocaleString( - view24HrTime - ? DateTime.TIME_24_WITH_SECONDS - : DateTime.TIME_WITH_SECONDS +
    +
    + + {t('data-by')} SaintBot + + + · + + {t('last-updated')}:{' '} + {isMounted.current + ? dataLastRefreshed.toLocaleString( + view24HrTime + ? DateTime.TIME_24_WITH_SECONDS + : DateTime.TIME_WITH_SECONDS + ) + : ''} + + + {t('vote')} + +
    + +
    + {[1, 2, 3].map((sched) => ( +
    +

    + Schedule {sched} +

    +
    +
      + {mSchedules[sched] !== undefined && + mSchedules[sched] + .slice(0, (mSchedules[sched].length - 1) / 2) + .map((s) => + s.start!.setZone( + viewLocalizedTime ? currDate.zone : serverTime.zone + ) + ) + .sort((a, b) => a.hour - b.hour) + .map((schedule) => ( +
    • + {schedule + .toLocaleString(DateTime.TIME_SIMPLE) + .slice(0, -2)} +
    • + ))} +
    +
      + {sched === 1 && ( + <> +
    • Lucas — {t('locations.Yudia')}
    • +
    • Morris — {t('locations.East Luterra')}
    • +
    • Mac — {t('locations.Anikka')}
    • +
    • Jeffrey — {t('locations.Shushire')}
    • +
    • Dorella — {t('locations.Feiton')}
    • + )} -
    -
    -
    - Schedule 1 -
    -
    - -
      - {mSchedules[1] !== undefined && - mSchedules[1] - .slice(0, (mSchedules[1].length - 1) / 2) - .map((s) => - s.start!.setZone( - viewLocalizedTime - ? currDate.zone - : serverTime.zone - ) - ) - .sort((a, b) => a.hour - b.hour) - .map((schedule) => ( -
    • - {schedule - .toLocaleString(DateTime.TIME_SIMPLE) - .slice(0, -2)} -
    • - ))} -
    -
    -
    - -
      -
    • Lucas - {t('locations.Yudia')}
    • -
    • Morris - {t('locations.East Luterra')}
    • -
    • Mac - {t('locations.Anikka')}
    • -
    • Jeffrey - {t('locations.Shushire')}
    • -
    • Dorella - {t('locations.Feiton')}
    • -
    -
    -
    -
    -
    - Schedule 2 -
    -
    - -
      - {mSchedules[2] !== undefined && - mSchedules[2] - .slice(0, (mSchedules[2].length - 1) / 2) - .map((s) => - s.start!.setZone( - viewLocalizedTime - ? currDate.zone - : serverTime.zone - ) - ) - .sort((a, b) => a.hour - b.hour) - .map((schedule) => ( -
    • - {schedule - .toLocaleString(DateTime.TIME_SIMPLE) - .slice(0, -2)} -
    • - ))} -
    -
    - -
      -
    • Malone - {t('locations.West Luterra')}
    • -
    • Burt - {t('locations.East Luterra')}
    • -
    • Oliver - {t('locations.Tortoyk')}
    • -
    • Nox - {t('locations.Arthetine')}
    • -
    • Aricer - {t('locations.Rohendel')}
    • -
    • Rayni - {t('locations.Punika')}
    • -
    -
    -
    -
    -
    - Schedule 3 -
    -
    - -
      - {mSchedules[3] !== undefined && - mSchedules[3] - .slice(0, (mSchedules[3].length - 1) / 2) - .map((s) => - s.start!.setZone( - viewLocalizedTime - ? currDate.zone - : serverTime.zone - ) - ) - .sort((a, b) => a.hour - b.hour) - .map((schedule) => ( -
    • - {schedule - .toLocaleString(DateTime.TIME_SIMPLE) - .slice(0, -2)} -
    • - ))} -
    -
    - -
      -
    • Ben - {t('locations.Rethramis')}
    • -
    • Evan - {t('locations.South Vern')}
    • -
    • Peter - {t('locations.North Vern')}
    • -
    • Laitir - {t('locations.Yorn')}
    • -
    -
    -
    -
    -
    - - - - - {merchantTableData} -
    -
    + {merchantTableData}
    From b01822a0055c16157e64bd5225259f10761aa420 Mon Sep 17 00:00:00 2001 From: Joshua Kuan Date: Wed, 6 May 2026 22:08:28 -0400 Subject: [PATCH 08/35] fix(ui): dark-mode FOUC, cross-component toggle, layout polish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses several issues from a fresh-data review: - Dark-mode flash on reload: add an inline pre-hydration script in _document.tsx that reads localStorage.darkMode (or prefers-color- scheme as a fallback) and applies the .dark class before React paints. - Dark-mode toggle from the settings modal didn't take effect until reload because each useLocalStorage instance was an independent state. Add a custom 'lostark:localStorage' window event that the setter dispatches and other instances on the same key listen to. Also subscribe to the native 'storage' event for cross-tab sync. - Light-mode page background was pure white, leaving the cards/buttons flat. Drop --background to oklch(0.975) with a subtle blue tint; cards stay pure white so they layer visibly. Equivalent tweaks for --secondary, --muted, --accent, --border with the same tint. - Chrome too constrained: bump max-w-7xl (1280px) → max-w-[1800px] on NavBar / alarms / merchants containers and trim the lg padding. - Date arrows + settings cog feel small at 36x36; bump to 44x44 (size-11) with size-5 icons inside. - Filter sidebar was 220px with no narrow-screen story. On =md. - Modal rows weren't fully clickable: wrap each Row's content in the