From 0576f17083538f4483558f01864b63028922f037 Mon Sep 17 00:00:00 2001 From: Jack Date: Sun, 15 Mar 2026 12:32:52 +0100 Subject: [PATCH 01/10] refactor: util cleanup (@miodec) (#7648) --- .../url-handler.spec.ts | 2 +- frontend/__tests__/root/config.spec.ts | 3 +- frontend/__tests__/utils/misc.spec.ts | 2 +- frontend/scripts/import-tree.ts | 54 +++++++++++++++++++ frontend/src/ts/auth.tsx | 2 +- .../ts/commandline/commandline-metadata.ts | 2 +- frontend/src/ts/commandline/commandline.ts | 6 +-- frontend/src/ts/commandline/lists.ts | 7 ++- frontend/src/ts/commandline/lists/themes.ts | 7 ++- frontend/src/ts/commandline/types.ts | 2 +- .../src/ts/components/common/AsyncContent.tsx | 3 +- frontend/src/ts/components/core/FavIcon.tsx | 2 +- .../layout/footer/VersionButton.tsx | 2 +- .../src/ts/components/layout/header/Logo.tsx | 2 +- .../layout/overlays/MediaQueryDebugger.tsx | 2 +- .../components/layout/overlays/Overlays.tsx | 2 +- .../ts/components/modals/DevOptionsModal.tsx | 2 +- .../pages/leaderboard/Navigation.tsx | 2 +- frontend/src/ts/config-metadata.ts | 3 +- .../ts/controllers/analytics-controller.ts | 2 +- .../ts/{utils => controllers}/url-handler.tsx | 4 +- .../account-settings/ape-key-table.ts | 2 +- frontend/src/ts/{utils => elements}/caret.ts | 8 +-- frontend/src/ts/elements/input-validation.ts | 36 +------------ frontend/src/ts/elements/modes-notice.ts | 2 +- frontend/src/ts/elements/psa.tsx | 2 +- .../ts/elements/settings/settings-group.ts | 7 +-- .../ts/{utils => elements}/simple-modal.ts | 17 +++--- frontend/src/ts/event-handlers/global.ts | 5 +- frontend/src/ts/firebase.ts | 8 ++- frontend/src/ts/index.ts | 2 +- frontend/src/ts/modals/edit-tag.ts | 4 +- .../src/ts/modals/last-signed-out-result.ts | 3 +- frontend/src/ts/modals/new-filter-preset.ts | 2 +- frontend/src/ts/modals/pb-tables.ts | 2 +- frontend/src/ts/modals/quote-filter.ts | 2 +- frontend/src/ts/modals/simple-modals-base.ts | 2 +- frontend/src/ts/modals/simple-modals.ts | 10 ++-- frontend/src/ts/pages/account.ts | 2 +- frontend/src/ts/pages/friends.ts | 4 +- frontend/src/ts/pages/login.ts | 2 +- frontend/src/ts/ready.ts | 3 +- frontend/src/ts/singletons/format.ts | 4 ++ frontend/src/ts/stores/notifications.ts | 2 +- frontend/src/ts/test/caret.ts | 2 +- frontend/src/ts/test/live-burst.ts | 2 +- frontend/src/ts/test/live-speed.ts | 2 +- frontend/src/ts/test/pace-caret.ts | 2 +- frontend/src/ts/test/result.ts | 2 +- frontend/src/ts/test/test-logic.ts | 39 +++++++++++++- frontend/src/ts/test/test-ui.ts | 2 +- frontend/src/ts/types/validation.d.ts | 34 ++++++++++++ frontend/src/ts/ui.ts | 2 +- frontend/src/ts/utils/env.ts | 5 ++ frontend/src/ts/utils/error.ts | 35 ++++++++++++ frontend/src/ts/utils/format.ts | 3 -- frontend/src/ts/utils/json-data.ts | 2 +- frontend/src/ts/utils/logger.ts | 2 +- frontend/src/ts/utils/misc.ts | 42 +-------------- frontend/src/ts/utils/remote-validation.ts | 2 +- frontend/src/ts/utils/results.ts | 47 ---------------- frontend/src/ts/utils/version.ts | 3 +- 62 files changed, 263 insertions(+), 209 deletions(-) rename frontend/__tests__/{utils => controllers}/url-handler.spec.ts (99%) rename frontend/src/ts/{utils => controllers}/url-handler.tsx (98%) rename frontend/src/ts/{utils => elements}/caret.ts (98%) rename frontend/src/ts/{utils => elements}/simple-modal.ts (98%) create mode 100644 frontend/src/ts/singletons/format.ts create mode 100644 frontend/src/ts/types/validation.d.ts create mode 100644 frontend/src/ts/utils/env.ts create mode 100644 frontend/src/ts/utils/error.ts delete mode 100644 frontend/src/ts/utils/results.ts diff --git a/frontend/__tests__/utils/url-handler.spec.ts b/frontend/__tests__/controllers/url-handler.spec.ts similarity index 99% rename from frontend/__tests__/utils/url-handler.spec.ts rename to frontend/__tests__/controllers/url-handler.spec.ts index 0c77df0da9c2..b6bf72d5bcb6 100644 --- a/frontend/__tests__/utils/url-handler.spec.ts +++ b/frontend/__tests__/controllers/url-handler.spec.ts @@ -6,9 +6,9 @@ import * as Notifications from "../../src/ts/stores/notifications"; import * as TestLogic from "../../src/ts/test/test-logic"; import * as TestState from "../../src/ts/test/test-state"; import * as Misc from "../../src/ts/utils/misc"; -import { loadTestSettingsFromUrl } from "../../src/ts/utils/url-handler"; import { FunboxName } from "@monkeytype/schemas/configs"; import { CustomTextSettings } from "@monkeytype/schemas/results"; +import { loadTestSettingsFromUrl } from "../../src/ts/controllers/url-handler"; //mock modules to avoid dependencies vi.mock("../../src/ts/test/test-logic", () => ({ diff --git a/frontend/__tests__/root/config.spec.ts b/frontend/__tests__/root/config.spec.ts index d946db05dd33..f6e0c46126ba 100644 --- a/frontend/__tests__/root/config.spec.ts +++ b/frontend/__tests__/root/config.spec.ts @@ -1,6 +1,7 @@ import { describe, it, expect, beforeEach, afterAll, vi } from "vitest"; import * as Config from "../../src/ts/config"; import * as Misc from "../../src/ts/utils/misc"; +import * as Env from "../../src/ts/utils/env"; import { ConfigKey, Config as ConfigType, @@ -14,7 +15,7 @@ import * as Notifications from "../../src/ts/stores/notifications"; const { replaceConfig, getConfig } = Config.__testing; describe("Config", () => { - const isDevEnvironmentMock = vi.spyOn(Misc, "isDevEnvironment"); + const isDevEnvironmentMock = vi.spyOn(Env, "isDevEnvironment"); beforeEach(() => { isDevEnvironmentMock.mockClear(); replaceConfig({}); diff --git a/frontend/__tests__/utils/misc.spec.ts b/frontend/__tests__/utils/misc.spec.ts index 669371c46147..84f6c10d258a 100644 --- a/frontend/__tests__/utils/misc.spec.ts +++ b/frontend/__tests__/utils/misc.spec.ts @@ -1,6 +1,5 @@ import { describe, it, expect, vi } from "vitest"; import { - getErrorMessage, isObject, escapeHTML, promiseWithResolvers, @@ -10,6 +9,7 @@ import { removeLanguageSize, } from "../../src/ts/utils/strings"; import { Language } from "@monkeytype/schemas/languages"; +import { getErrorMessage } from "../../src/ts/utils/error"; describe("misc.ts", () => { describe("getLanguageDisplayString", () => { diff --git a/frontend/scripts/import-tree.ts b/frontend/scripts/import-tree.ts index bfced5702b35..6ad90054044e 100644 --- a/frontend/scripts/import-tree.ts +++ b/frontend/scripts/import-tree.ts @@ -282,3 +282,57 @@ for (const entry of entryPoints) { printTree(entry, new Set([entry]), "", true, true); if (entryPoints.length > 1) console.log(); } + +// --- Summary --- + +let totalDirect = 0; +let totalTransitive = 0; +const uniqueDirect = new Set(); +const uniqueTransitive = new Set(); +let maxDirect = 0; +let maxDirectFile = ""; +let maxTransitive = 0; +let maxTransitiveFile = ""; +let maxDepthSeen = 0; +let maxDepthFile = ""; + +for (const entry of entryPoints) { + const info = cache.get(entry); + if (!info) continue; + totalDirect += info.directImports.length; + totalTransitive += info.totalReachable; + for (const dep of info.directImports) { + uniqueDirect.add(dep); + } + for (const dep of getAllReachable(entry, new Set())) { + uniqueTransitive.add(dep); + } + if (info.directImports.length > maxDirect) { + maxDirect = info.directImports.length; + maxDirectFile = entry; + } + if (info.totalReachable > maxTransitive) { + maxTransitive = info.totalReachable; + maxTransitiveFile = entry; + } + if (info.maxDepth > maxDepthSeen) { + maxDepthSeen = info.maxDepth; + maxDepthFile = entry; + } +} + +console.log(`${c.dim}───────────────────────────${c.reset}`); +console.log(`Target: ${c.bold}${displayPath(resolved)}${c.reset}`); +console.log(`Total direct: ${c.bold}${totalDirect}${c.reset}`); +console.log(`Total transitive: ${c.bold}${totalTransitive}${c.reset}`); +console.log(`Unique direct: ${c.bold}${uniqueDirect.size}${c.reset}`); +console.log(`Unique transitive: ${c.bold}${uniqueTransitive.size}${c.reset}`); +console.log( + `Max direct: ${c.bold}${maxDirect}${c.reset} ${c.dim}(${displayPath(maxDirectFile)})${c.reset}`, +); +console.log( + `Max transitive: ${c.bold}${maxTransitive}${c.reset} ${c.dim}(${displayPath(maxTransitiveFile)})${c.reset}`, +); +console.log( + `Max depth: ${c.bold}${maxDepthSeen}${c.reset} ${c.dim}(${displayPath(maxDepthFile)})${c.reset}`, +); diff --git a/frontend/src/ts/auth.tsx b/frontend/src/ts/auth.tsx index ccc5faedc6bd..e0dcd87ee26f 100644 --- a/frontend/src/ts/auth.tsx +++ b/frontend/src/ts/auth.tsx @@ -32,7 +32,7 @@ import { showErrorNotification, showSuccessNotification, } from "./stores/notifications"; -import { createErrorMessage } from "./utils/misc"; +import { createErrorMessage } from "./utils/error"; export const gmailProvider = new GoogleAuthProvider(); export const githubProvider = new GithubAuthProvider(); diff --git a/frontend/src/ts/commandline/commandline-metadata.ts b/frontend/src/ts/commandline/commandline-metadata.ts index fe3cfa710276..da716eb100ae 100644 --- a/frontend/src/ts/commandline/commandline-metadata.ts +++ b/frontend/src/ts/commandline/commandline-metadata.ts @@ -8,12 +8,12 @@ import * as ManualRestart from "../test/manual-restart-tracker"; import { areUnsortedArraysEqual } from "../utils/arrays"; import Config from "../config"; import { get as getTypingSpeedUnit } from "../utils/typing-speed-units"; -import { Validation } from "../elements/input-validation"; import { getActivePage } from "../signals/core"; import { Fonts } from "../constants/fonts"; import { KnownFontName } from "@monkeytype/schemas/fonts"; import * as UI from "../ui"; import { typedKeys } from "../utils/misc"; +import { Validation } from "../types/validation"; type ConfigKeysWithoutCommands = | "minWpmCustomSpeed" diff --git a/frontend/src/ts/commandline/commandline.ts b/frontend/src/ts/commandline/commandline.ts index 224c1999e5b0..8b44850f4f56 100644 --- a/frontend/src/ts/commandline/commandline.ts +++ b/frontend/src/ts/commandline/commandline.ts @@ -18,10 +18,7 @@ import { areSortedArraysEqual, areUnsortedArraysEqual } from "../utils/arrays"; import { parseIntOptional } from "../utils/numbers"; import { debounce } from "throttle-debounce"; import { intersect } from "@monkeytype/util/arrays"; -import { - createInputEventHandler, - ValidationResult, -} from "../elements/input-validation"; +import { createInputEventHandler } from "../elements/input-validation"; import { isInputElementFocused } from "../input/input-element"; import { qs } from "../utils/dom"; import { ConfigKey } from "@monkeytype/schemas/configs"; @@ -32,6 +29,7 @@ import { hideModalAndClearChain as storeClearChain, isModalOpen, } from "../stores/modals"; +import { ValidationResult } from "../types/validation"; type CommandlineMode = "search" | "input"; type InputModeParams = { diff --git a/frontend/src/ts/commandline/lists.ts b/frontend/src/ts/commandline/lists.ts index c4ebc260c5fc..6466518c6765 100644 --- a/frontend/src/ts/commandline/lists.ts +++ b/frontend/src/ts/commandline/lists.ts @@ -17,7 +17,7 @@ import LoadChallengeCommands, { } from "./lists/load-challenge"; import Config, { applyConfigFromJson, setConfig } from "../config"; -import * as Misc from "../utils/misc"; +import * as getErrorMessage from "../utils/error"; import * as JSONData from "../utils/json-data"; import { randomizeTheme } from "../controllers/theme-controller"; import * as CustomTextPopup from "../modals/custom-text"; @@ -47,7 +47,10 @@ challengesPromise }) .catch((e: unknown) => { console.error( - Misc.createErrorMessage(e, "Failed to update challenges commands"), + getErrorMessage.createErrorMessage( + e, + "Failed to update challenges commands", + ), ); }); diff --git a/frontend/src/ts/commandline/lists/themes.ts b/frontend/src/ts/commandline/lists/themes.ts index 8bafb873677c..ec4d4d296008 100644 --- a/frontend/src/ts/commandline/lists/themes.ts +++ b/frontend/src/ts/commandline/lists/themes.ts @@ -5,7 +5,7 @@ import { Command, CommandsSubgroup } from "../types"; import { ThemesList, ThemeWithName } from "../../constants/themes"; import { not } from "@monkeytype/util/predicates"; import * as ConfigEvent from "../../observables/config-event"; -import * as Misc from "../../utils/misc"; +import * as getErrorMessage from "../../utils/error"; const isFavorite = (theme: ThemeWithName): boolean => Config.favThemes.includes(theme.name); @@ -83,7 +83,10 @@ ConfigEvent.subscribe(({ key }) => { update(ThemesList); } catch (e: unknown) { console.error( - Misc.createErrorMessage(e, "Failed to update themes commands"), + getErrorMessage.createErrorMessage( + e, + "Failed to update themes commands", + ), ); } } diff --git a/frontend/src/ts/commandline/types.ts b/frontend/src/ts/commandline/types.ts index 0a96eac36ce2..8fd01a9741a1 100644 --- a/frontend/src/ts/commandline/types.ts +++ b/frontend/src/ts/commandline/types.ts @@ -1,6 +1,6 @@ import { Config } from "@monkeytype/schemas/configs"; import AnimatedModal from "../utils/animated-modal"; -import { Validation } from "../elements/input-validation"; +import { Validation } from "../types/validation"; // this file is needed becauase otherwise it would produce a circular dependency diff --git a/frontend/src/ts/components/common/AsyncContent.tsx b/frontend/src/ts/components/common/AsyncContent.tsx index fcc50d0d756e..49da2e478ce7 100644 --- a/frontend/src/ts/components/common/AsyncContent.tsx +++ b/frontend/src/ts/components/common/AsyncContent.tsx @@ -10,7 +10,8 @@ import { } from "solid-js"; import { showErrorNotification } from "../../stores/notifications"; -import { createErrorMessage, typedKeys } from "../../utils/misc"; +import { createErrorMessage } from "../../utils/error"; +import { typedKeys } from "../../utils/misc"; import { Conditional } from "./Conditional"; import { LoadingCircle } from "./LoadingCircle"; diff --git a/frontend/src/ts/components/core/FavIcon.tsx b/frontend/src/ts/components/core/FavIcon.tsx index 69f061836b05..2c8392b9bf6f 100644 --- a/frontend/src/ts/components/core/FavIcon.tsx +++ b/frontend/src/ts/components/core/FavIcon.tsx @@ -2,7 +2,7 @@ import { Link } from "@solidjs/meta"; import { createMemo, JSXElement } from "solid-js"; import { Theme } from "../../constants/themes"; -import { isDevEnvironment } from "../../utils/misc"; +import { isDevEnvironment } from "../../utils/env"; export function FavIcon(props: { theme: Theme }): JSXElement { const icon = createMemo(() => { diff --git a/frontend/src/ts/components/layout/footer/VersionButton.tsx b/frontend/src/ts/components/layout/footer/VersionButton.tsx index f8d4aeded4c4..58cabe9a6256 100644 --- a/frontend/src/ts/components/layout/footer/VersionButton.tsx +++ b/frontend/src/ts/components/layout/footer/VersionButton.tsx @@ -5,7 +5,7 @@ import { envConfig } from "virtual:env-config"; import { lastSeenServerCompatibility } from "../../../ape/adapters/ts-rest-adapter"; import { getVersion } from "../../../signals/core"; import { showModal } from "../../../stores/modals"; -import { isDevEnvironment } from "../../../utils/misc"; +import { isDevEnvironment } from "../../../utils/env"; import { Fa } from "../../common/Fa"; export function VersionButton(): JSXElement { diff --git a/frontend/src/ts/components/layout/header/Logo.tsx b/frontend/src/ts/components/layout/header/Logo.tsx index f8a7c106443b..b2dc7c1821fc 100644 --- a/frontend/src/ts/components/layout/header/Logo.tsx +++ b/frontend/src/ts/components/layout/header/Logo.tsx @@ -3,7 +3,7 @@ import { JSXElement } from "solid-js"; import { getActivePage, getFocus } from "../../../signals/core"; import { restart } from "../../../test/test-logic"; import { cn } from "../../../utils/cn"; -import { isDevEnvironment } from "../../../utils/misc"; +import { isDevEnvironment } from "../../../utils/env"; export function Logo(): JSXElement { return ( diff --git a/frontend/src/ts/components/layout/overlays/MediaQueryDebugger.tsx b/frontend/src/ts/components/layout/overlays/MediaQueryDebugger.tsx index f91063a0be34..98454936d2d5 100644 --- a/frontend/src/ts/components/layout/overlays/MediaQueryDebugger.tsx +++ b/frontend/src/ts/components/layout/overlays/MediaQueryDebugger.tsx @@ -1,7 +1,7 @@ import { JSXElement, Match, Show, Switch } from "solid-js"; import { bp } from "../../../signals/breakpoints"; -import { isDevEnvironment } from "../../../utils/misc"; +import { isDevEnvironment } from "../../../utils/env"; export function MediaQueryDebugger(): JSXElement { return ( diff --git a/frontend/src/ts/components/layout/overlays/Overlays.tsx b/frontend/src/ts/components/layout/overlays/Overlays.tsx index 463db2dd4a48..b9e5c5556ac1 100644 --- a/frontend/src/ts/components/layout/overlays/Overlays.tsx +++ b/frontend/src/ts/components/layout/overlays/Overlays.tsx @@ -4,7 +4,7 @@ import { envConfig } from "virtual:env-config"; import { getIsScreenshotting } from "../../../signals/core"; import { showModal } from "../../../stores/modals"; import { cn } from "../../../utils/cn"; -import { isDevEnvironment } from "../../../utils/misc"; +import { isDevEnvironment } from "../../../utils/env"; import { Button } from "../../common/Button"; import { Fa } from "../../common/Fa"; import { ScrollToTop } from "../footer/ScrollToTop"; diff --git a/frontend/src/ts/components/modals/DevOptionsModal.tsx b/frontend/src/ts/components/modals/DevOptionsModal.tsx index ed37fb978ab4..849dfa580945 100644 --- a/frontend/src/ts/components/modals/DevOptionsModal.tsx +++ b/frontend/src/ts/components/modals/DevOptionsModal.tsx @@ -5,6 +5,7 @@ import Ape from "../../ape"; import { signIn } from "../../auth"; import { inboxCollection } from "../../collections/inbox"; import { addXp } from "../../db"; +import { toggleCaretDebug } from "../../elements/caret"; import { getInputElement } from "../../input/input-element"; import { showPopup } from "../../modals/simple-modals"; import { showLoaderBar, hideLoaderBar } from "../../signals/loader-bar"; @@ -18,7 +19,6 @@ import { toggleUserFakeChartData } from "../../test/result"; import { disableSlowTimerFail } from "../../test/test-timer"; import { FaSolidIcon } from "../../types/font-awesome"; import { setMediaQueryDebugLevel } from "../../ui"; -import { toggleCaretDebug } from "../../utils/caret"; import { AnimatedModal } from "../common/AnimatedModal"; import { Button } from "../common/Button"; diff --git a/frontend/src/ts/components/pages/leaderboard/Navigation.tsx b/frontend/src/ts/components/pages/leaderboard/Navigation.tsx index c68b950b21b0..80e20f21b527 100644 --- a/frontend/src/ts/components/pages/leaderboard/Navigation.tsx +++ b/frontend/src/ts/components/pages/leaderboard/Navigation.tsx @@ -1,8 +1,8 @@ import { JSXElement, Setter, Show } from "solid-js"; +import { ExecReturn, SimpleModal } from "../../../elements/simple-modal"; import { setPage } from "../../../stores/leaderboard-selection"; import { cn } from "../../../utils/cn"; -import { ExecReturn, SimpleModal } from "../../../utils/simple-modal"; import { Button } from "../../common/Button"; import { LoadingCircle } from "../../common/LoadingCircle"; diff --git a/frontend/src/ts/config-metadata.ts b/frontend/src/ts/config-metadata.ts index 86b8c0ec735f..f894b6993dd0 100644 --- a/frontend/src/ts/config-metadata.ts +++ b/frontend/src/ts/config-metadata.ts @@ -3,7 +3,8 @@ import * as DB from "./db"; import { showNoticeNotification } from "./stores/notifications"; import { isAuthenticated } from "./firebase"; import { canSetFunboxWithConfig } from "./test/funbox/funbox-validation"; -import { isDevEnvironment, reloadAfter } from "./utils/misc"; +import { reloadAfter } from "./utils/misc"; +import { isDevEnvironment } from "./utils/env"; import * as ConfigSchemas from "@monkeytype/schemas/configs"; import { roundTo1 } from "@monkeytype/util/numbers"; import { capitalizeFirstLetter } from "./utils/strings"; diff --git a/frontend/src/ts/controllers/analytics-controller.ts b/frontend/src/ts/controllers/analytics-controller.ts index 51eefe265d33..354c67930799 100644 --- a/frontend/src/ts/controllers/analytics-controller.ts +++ b/frontend/src/ts/controllers/analytics-controller.ts @@ -4,7 +4,7 @@ import { setAnalyticsCollectionEnabled, } from "firebase/analytics"; import { getAnalytics } from "../firebase"; -import { createErrorMessage } from "../utils/misc"; +import { createErrorMessage } from "../utils/error"; import { qs } from "../utils/dom"; let analytics: AnalyticsType; diff --git a/frontend/src/ts/utils/url-handler.tsx b/frontend/src/ts/controllers/url-handler.tsx similarity index 98% rename from frontend/src/ts/utils/url-handler.tsx rename to frontend/src/ts/controllers/url-handler.tsx index 4fa86c539a55..50e106f22477 100644 --- a/frontend/src/ts/utils/url-handler.tsx +++ b/frontend/src/ts/controllers/url-handler.tsx @@ -22,7 +22,6 @@ import { z } from "zod"; import Ape from "../ape"; import Config, { setConfig } from "../config"; -import * as ChallengeController from "../controllers/challenge-controller"; import * as DB from "../db"; import * as AuthEvent from "../observables/auth-event"; import { showLoaderBar, hideLoaderBar } from "../signals/loader-bar"; @@ -35,7 +34,8 @@ import * as CustomText from "../test/custom-text"; import * as ManualRestart from "../test/manual-restart-tracker"; import { restart as restartTest } from "../test/test-logic"; import * as TestState from "../test/test-state"; -import * as Misc from "./misc"; +import * as Misc from "../utils/misc"; +import * as ChallengeController from "./challenge-controller"; export async function linkDiscord(hashOverride: string): Promise { if (!hashOverride) return; diff --git a/frontend/src/ts/elements/account-settings/ape-key-table.ts b/frontend/src/ts/elements/account-settings/ape-key-table.ts index bd32d0efc48a..332faa4ee87a 100644 --- a/frontend/src/ts/elements/account-settings/ape-key-table.ts +++ b/frontend/src/ts/elements/account-settings/ape-key-table.ts @@ -6,7 +6,7 @@ import { import Ape from "../../ape"; import { ApeKey, ApeKeys } from "@monkeytype/schemas/ape-keys"; import { format } from "date-fns/format"; -import { SimpleModal, TextArea } from "../../utils/simple-modal"; +import { SimpleModal, TextArea } from "../simple-modal"; import { isAuthenticated } from "../../firebase"; import { qs, qsr } from "../../utils/dom"; diff --git a/frontend/src/ts/utils/caret.ts b/frontend/src/ts/elements/caret.ts similarity index 98% rename from frontend/src/ts/utils/caret.ts rename to frontend/src/ts/elements/caret.ts index 1a2552897e21..836a1d047421 100644 --- a/frontend/src/ts/utils/caret.ts +++ b/frontend/src/ts/elements/caret.ts @@ -1,11 +1,11 @@ import { CaretStyle } from "@monkeytype/schemas/configs"; import Config from "../config"; import * as TestWords from "../test/test-words"; -import { getTotalInlineMargin } from "./misc"; -import { isWordRightToLeft } from "./strings"; -import { requestDebouncedAnimationFrame } from "./debounced-animation-frame"; +import { getTotalInlineMargin } from "../utils/misc"; +import { isWordRightToLeft } from "../utils/strings"; +import { requestDebouncedAnimationFrame } from "../utils/debounced-animation-frame"; import { EasingParam, JSAnimation } from "animejs"; -import { ElementWithUtils, qsr } from "./dom"; +import { ElementWithUtils, qsr } from "../utils/dom"; const wordsCache = qsr("#words"); const wordsWrapperCache = qsr("#wordsWrapper"); diff --git a/frontend/src/ts/elements/input-validation.ts b/frontend/src/ts/elements/input-validation.ts index 6e008465cfac..04d72391037a 100644 --- a/frontend/src/ts/elements/input-validation.ts +++ b/frontend/src/ts/elements/input-validation.ts @@ -1,5 +1,5 @@ import { debounce } from "throttle-debounce"; -import { z, ZodType } from "zod"; +import { ZodType } from "zod"; import { InputIndicator } from "./input-indicator"; import { ConfigKey, @@ -9,39 +9,7 @@ import { import Config, { setConfig } from "../config"; import { showSuccessNotification } from "../stores/notifications"; import { ElementWithUtils } from "../utils/dom"; - -export type ValidationResult = - | { - status: "checking" | "failed" | "warning"; - errorMessage?: string; - success: false; - } - | { - status: "success"; - success: true; - }; - -export type IsValidResponse = true | string | { warning: string }; - -export type Validation = { - /** - * Zod schema to validate the input value against. - * The indicator will show the error messages from the schema. - */ - schema?: z.Schema; - - /** - * Custom async validation method. - * This is intended to be used for validations that cannot be handled with a Zod schema like server-side validations. - * @param value current input value - * @param thisPopup the current modal - * @returns true if the `value` is valid, an errorMessage as string if it is invalid. - */ - isValid?: (value: T) => Promise; - - /** custom debounce delay for `isValid` call. defaults to 100 */ - debounceDelay?: number; -}; +import { Validation, ValidationResult } from "../types/validation"; // oxlint-disable-next-line no-explicit-any export function debounceIfNeeded any>( diff --git a/frontend/src/ts/elements/modes-notice.ts b/frontend/src/ts/elements/modes-notice.ts index c699089f9e51..1f9479f8da2b 100644 --- a/frontend/src/ts/elements/modes-notice.ts +++ b/frontend/src/ts/elements/modes-notice.ts @@ -8,7 +8,7 @@ import * as ConfigEvent from "../observables/config-event"; import { isAuthenticated } from "../firebase"; import * as CustomTextState from "../states/custom-text-name"; import { getLanguageDisplayString } from "../utils/strings"; -import Format from "../utils/format"; +import Format from "../singletons/format"; import { getActiveFunboxes, getActiveFunboxNames } from "../test/funbox/list"; import { escapeHTML, getMode2 } from "../utils/misc"; import { qsr } from "../utils/dom"; diff --git a/frontend/src/ts/elements/psa.tsx b/frontend/src/ts/elements/psa.tsx index efa73e3d20ed..787f6acc2807 100644 --- a/frontend/src/ts/elements/psa.tsx +++ b/frontend/src/ts/elements/psa.tsx @@ -10,8 +10,8 @@ import * as AuthEvent from "../observables/auth-event"; import { addBanner } from "../stores/banners"; import { addPsa } from "../stores/psas"; import { secondsToString } from "../utils/date-and-time"; +import { isDevEnvironment } from "../utils/env"; import { LocalStorageWithSchema } from "../utils/local-storage-with-schema"; -import { isDevEnvironment } from "../utils/misc"; const confirmedPSAs = new LocalStorageWithSchema({ key: "confirmedPSAs", diff --git a/frontend/src/ts/elements/settings/settings-group.ts b/frontend/src/ts/elements/settings/settings-group.ts index bbd2b9ce8896..0e6538132fff 100644 --- a/frontend/src/ts/elements/settings/settings-group.ts +++ b/frontend/src/ts/elements/settings/settings-group.ts @@ -4,12 +4,9 @@ import Config, { setConfig } from "../../config"; import { showErrorNotification } from "../../stores/notifications"; import SlimSelect from "slim-select"; import { debounce } from "throttle-debounce"; -import { - handleConfigInput, - ConfigInputOptions, - Validation, -} from "../input-validation"; +import { handleConfigInput, ConfigInputOptions } from "../input-validation"; import { ElementWithUtils, qs, qsa } from "../../utils/dom"; +import { Validation } from "../../types/validation"; type Mode = "select" | "button" | "range" | "input"; diff --git a/frontend/src/ts/utils/simple-modal.ts b/frontend/src/ts/elements/simple-modal.ts similarity index 98% rename from frontend/src/ts/utils/simple-modal.ts rename to frontend/src/ts/elements/simple-modal.ts index 1f5528480f2e..97641fb59059 100644 --- a/frontend/src/ts/utils/simple-modal.ts +++ b/frontend/src/ts/elements/simple-modal.ts @@ -1,5 +1,8 @@ -import AnimatedModal, { HideOptions, ShowOptions } from "./animated-modal"; -import { Attributes, buildTag } from "./tag-builder"; +import AnimatedModal, { + HideOptions, + ShowOptions, +} from "../utils/animated-modal"; +import { Attributes, buildTag } from "../utils/tag-builder"; import { format as dateFormat } from "date-fns/format"; import { showLoaderBar, hideLoaderBar } from "../signals/loader-bar"; @@ -9,13 +12,15 @@ import { AddNotificationOptions, } from "../stores/notifications"; import { - IsValidResponse, ValidatedHtmlInputElement, - Validation, ValidationOptions, +} from "./input-validation"; +import { ElementWithUtils, qsr } from "../utils/dom"; +import { + IsValidResponse, + Validation, ValidationResult, -} from "../elements/input-validation"; -import { ElementWithUtils, qsr } from "./dom"; +} from "../types/validation"; const simpleModalEl = qsr("#simpleModal"); diff --git a/frontend/src/ts/event-handlers/global.ts b/frontend/src/ts/event-handlers/global.ts index 8d730a29b02a..f0ed7564cf7b 100644 --- a/frontend/src/ts/event-handlers/global.ts +++ b/frontend/src/ts/event-handlers/global.ts @@ -12,6 +12,7 @@ import { navigate } from "../controllers/route-controller"; import { isInputElementFocused } from "../input/input-element"; import * as ManualRestart from "../test/manual-restart-tracker"; import * as TestState from "../test/test-state"; +import { isDevEnvironment } from "../utils/env"; document.addEventListener("keydown", (e) => { if (PageTransition.get()) return; @@ -97,7 +98,7 @@ window.addEventListener("keydown", function (e) { }); window.onerror = function (message, url, line, column, error): void { - if (Misc.isDevEnvironment()) { + if (isDevEnvironment()) { showErrorNotification(error?.message ?? "Undefined message", { customTitle: "DEV: Unhandled error", durationMs: 5000, @@ -108,7 +109,7 @@ window.onerror = function (message, url, line, column, error): void { }; window.onunhandledrejection = function (e): void { - if (Misc.isDevEnvironment()) { + if (isDevEnvironment()) { showErrorNotification( (e.reason as Error).message ?? e.reason ?? "Undefined message", { diff --git a/frontend/src/ts/firebase.ts b/frontend/src/ts/firebase.ts index 1d0c58c1f1f4..535837f55014 100644 --- a/frontend/src/ts/firebase.ts +++ b/frontend/src/ts/firebase.ts @@ -22,11 +22,9 @@ import { indexedDBLocalPersistence, getAdditionalUserInfo, } from "firebase/auth"; -import { - createErrorMessage, - isDevEnvironment, - promiseWithResolvers, -} from "./utils/misc"; +import { promiseWithResolvers } from "./utils/misc"; +import { isDevEnvironment } from "./utils/env"; +import { createErrorMessage } from "./utils/error"; import { Analytics as AnalyticsType, diff --git a/frontend/src/ts/index.ts b/frontend/src/ts/index.ts index 8d63f0176c8a..4157078fe02b 100644 --- a/frontend/src/ts/index.ts +++ b/frontend/src/ts/index.ts @@ -36,7 +36,7 @@ import { fetchLatestVersion } from "./utils/version"; import * as Sentry from "./sentry"; import * as Cookies from "./cookies"; import "./elements/psa"; -import "./utils/url-handler"; +import "./controllers/url-handler"; import "./modals/last-signed-out-result"; import { applyEngineSettings } from "./anim"; import { qs, qsa, qsr } from "./utils/dom"; diff --git a/frontend/src/ts/modals/edit-tag.ts b/frontend/src/ts/modals/edit-tag.ts index 83f466a7727d..41bda4879a13 100644 --- a/frontend/src/ts/modals/edit-tag.ts +++ b/frontend/src/ts/modals/edit-tag.ts @@ -1,11 +1,11 @@ import Ape from "../ape"; import * as DB from "../db"; -import { IsValidResponse } from "../elements/input-validation"; import * as Settings from "../pages/settings"; import AnimatedModal, { ShowOptions } from "../utils/animated-modal"; -import { SimpleModal, TextInput } from "../utils/simple-modal"; +import { SimpleModal, TextInput } from "../elements/simple-modal"; import { TagNameSchema } from "@monkeytype/schemas/users"; import { SnapshotUserTag } from "../constants/default-snapshot"; +import { IsValidResponse } from "../types/validation"; function getTagFromSnapshot(tagId: string): SnapshotUserTag | undefined { return DB.getSnapshot()?.tags.find((tag) => tag._id === tagId); diff --git a/frontend/src/ts/modals/last-signed-out-result.ts b/frontend/src/ts/modals/last-signed-out-result.ts index 901136acee12..e0635772fcd6 100644 --- a/frontend/src/ts/modals/last-signed-out-result.ts +++ b/frontend/src/ts/modals/last-signed-out-result.ts @@ -7,7 +7,6 @@ import { } from "../stores/notifications"; import { CompletedEvent } from "@monkeytype/schemas/results"; import { getAuthenticatedUser } from "../firebase"; -import { syncNotSignedInLastResult } from "../utils/results"; import * as AuthEvent from "../observables/auth-event"; function reset(): void { @@ -132,7 +131,7 @@ const modal = new AnimatedModal({ modalEl.qs("button.save")?.on("click", async () => { const user = getAuthenticatedUser(); if (user !== null) { - void syncNotSignedInLastResult(user.uid); + void TestLogic.syncNotSignedInLastResult(user.uid); } hide(); }); diff --git a/frontend/src/ts/modals/new-filter-preset.ts b/frontend/src/ts/modals/new-filter-preset.ts index aea866b6369d..3cd94d5b6e23 100644 --- a/frontend/src/ts/modals/new-filter-preset.ts +++ b/frontend/src/ts/modals/new-filter-preset.ts @@ -1,6 +1,6 @@ import { ResultFiltersSchema } from "@monkeytype/schemas/users"; import { createFilterPreset } from "../elements/account/result-filters"; -import { SimpleModal } from "../utils/simple-modal"; +import { SimpleModal } from "../elements/simple-modal"; export function show(): void { newFilterPresetModal.show(undefined, {}); diff --git a/frontend/src/ts/modals/pb-tables.ts b/frontend/src/ts/modals/pb-tables.ts index ff92a1b97b53..232fb7b93f35 100644 --- a/frontend/src/ts/modals/pb-tables.ts +++ b/frontend/src/ts/modals/pb-tables.ts @@ -2,7 +2,7 @@ import * as DB from "../db"; import { format } from "date-fns/format"; import { getLanguageDisplayString } from "../utils/strings"; import Config from "../config"; -import Format from "../utils/format"; +import Format from "../singletons/format"; import AnimatedModal from "../utils/animated-modal"; import { Mode, Mode2, PersonalBest } from "@monkeytype/schemas/shared"; diff --git a/frontend/src/ts/modals/quote-filter.ts b/frontend/src/ts/modals/quote-filter.ts index f6e3a2cbbe3b..1a7ef5529eda 100644 --- a/frontend/src/ts/modals/quote-filter.ts +++ b/frontend/src/ts/modals/quote-filter.ts @@ -1,4 +1,4 @@ -import { SimpleModal } from "../utils/simple-modal"; +import { SimpleModal } from "../elements/simple-modal"; export let minFilterLength: number = 0; export let maxFilterLength: number = 0; diff --git a/frontend/src/ts/modals/simple-modals-base.ts b/frontend/src/ts/modals/simple-modals-base.ts index 380bb726d473..b1a55164d53a 100644 --- a/frontend/src/ts/modals/simple-modals-base.ts +++ b/frontend/src/ts/modals/simple-modals-base.ts @@ -1,6 +1,6 @@ import { showErrorNotification } from "../stores/notifications"; import { ShowOptions } from "../utils/animated-modal"; -import { SimpleModal } from "../utils/simple-modal"; +import { SimpleModal } from "../elements/simple-modal"; export type PopupKey = | "updateEmail" diff --git a/frontend/src/ts/modals/simple-modals.ts b/frontend/src/ts/modals/simple-modals.ts index 2bec8913a94e..667a7c561b97 100644 --- a/frontend/src/ts/modals/simple-modals.ts +++ b/frontend/src/ts/modals/simple-modals.ts @@ -20,11 +20,9 @@ import { reauthenticateWithPopup, unlink, } from "firebase/auth"; -import { - createErrorMessage, - isDevEnvironment, - reloadAfter, -} from "../utils/misc"; +import { reloadAfter } from "../utils/misc"; +import { isDevEnvironment } from "../utils/env"; +import { createErrorMessage } from "../utils/error"; import * as CustomTextState from "../states/custom-text-name"; import * as ThemeController from "../controllers/theme-controller"; import * as AccountSettings from "../pages/account-settings"; @@ -33,7 +31,7 @@ import { PasswordInput, SimpleModal, TextInput, -} from "../utils/simple-modal"; +} from "../elements/simple-modal"; import { GenerateDataRequest } from "@monkeytype/contracts/dev"; import { diff --git a/frontend/src/ts/pages/account.ts b/frontend/src/ts/pages/account.ts index 5b30ae3ebe8b..ff0f632b6408 100644 --- a/frontend/src/ts/pages/account.ts +++ b/frontend/src/ts/pages/account.ts @@ -24,7 +24,7 @@ import { getAuthenticatedUser } from "../firebase"; import { showLoaderBar, hideLoaderBar } from "../signals/loader-bar"; import * as ResultBatches from "../elements/result-batches"; -import Format from "../utils/format"; +import Format from "../singletons/format"; import { ChartData } from "@monkeytype/schemas/results"; import { Mode, Mode2, Mode2Custom } from "@monkeytype/schemas/shared"; import { ResultFiltersGroupItem } from "@monkeytype/schemas/users"; diff --git a/frontend/src/ts/pages/friends.ts b/frontend/src/ts/pages/friends.ts index 4d26ca15a7b8..0b6da1a5f960 100644 --- a/frontend/src/ts/pages/friends.ts +++ b/frontend/src/ts/pages/friends.ts @@ -1,6 +1,6 @@ import Page from "./page"; import * as Skeleton from "../utils/skeleton"; -import { SimpleModal } from "../utils/simple-modal"; +import { SimpleModal } from "../elements/simple-modal"; import Ape from "../ape"; import { intervalToDuration, @@ -19,7 +19,7 @@ import { getHTMLById as getBadgeHTMLbyId } from "../controllers/badge-controller import { formatXp, getXpDetails } from "../utils/levels"; import { secondsToString } from "../utils/date-and-time"; import { PersonalBest } from "@monkeytype/schemas/shared"; -import Format from "../utils/format"; +import Format from "../singletons/format"; import { getHtmlByUserFlags } from "../controllers/user-flag-controller"; import { SortedTable, SortSchema } from "../utils/sorted-table"; import { getAvatarElement } from "../utils/discord-avatar"; diff --git a/frontend/src/ts/pages/login.ts b/frontend/src/ts/pages/login.ts index 446e4bc7b9c5..d546b02409fd 100644 --- a/frontend/src/ts/pages/login.ts +++ b/frontend/src/ts/pages/login.ts @@ -8,7 +8,7 @@ import { UserNameSchema, } from "@monkeytype/schemas/users"; import { ValidatedHtmlInputElement } from "../elements/input-validation"; -import { isDevEnvironment } from "../utils/misc"; +import { isDevEnvironment } from "../utils/env"; import { z } from "zod"; import { remoteValidation } from "../utils/remote-validation"; import { qs, qsa, qsr, onDOMReady } from "../utils/dom"; diff --git a/frontend/src/ts/ready.ts b/frontend/src/ts/ready.ts index 2788d8ef3fbf..117a81051a75 100644 --- a/frontend/src/ts/ready.ts +++ b/frontend/src/ts/ready.ts @@ -8,6 +8,7 @@ import { configLoadPromise } from "./config"; import { authPromise } from "./firebase"; import { animate } from "animejs"; import { onDOMReady, qs } from "./utils/dom"; +import { isDevEnvironment } from "./utils/env"; onDOMReady(async () => { await configLoadPromise; @@ -41,7 +42,7 @@ onDOMReady(async () => { // oxlint-disable-next-line no-unsafe-call new Konami("https://keymash.io/"); - if (Misc.isDevEnvironment()) { + if (isDevEnvironment()) { void navigator.serviceWorker .getRegistrations() .then(function (registrations) { diff --git a/frontend/src/ts/singletons/format.ts b/frontend/src/ts/singletons/format.ts new file mode 100644 index 000000000000..ae447cb31db8 --- /dev/null +++ b/frontend/src/ts/singletons/format.ts @@ -0,0 +1,4 @@ +import { Formatting } from "../utils/format"; +import Config from "../config"; + +export default new Formatting(Config); diff --git a/frontend/src/ts/stores/notifications.ts b/frontend/src/ts/stores/notifications.ts index ca046c8dc0b7..d003750fb3d8 100644 --- a/frontend/src/ts/stores/notifications.ts +++ b/frontend/src/ts/stores/notifications.ts @@ -1,7 +1,7 @@ import { createStore } from "solid-js/store"; import { CommonResponsesType } from "@monkeytype/contracts/util/api"; -import { createErrorMessage } from "../utils/misc"; +import { createErrorMessage } from "../utils/error"; export type NotificationLevel = "error" | "notice" | "success"; diff --git a/frontend/src/ts/test/caret.ts b/frontend/src/ts/test/caret.ts index d2cb2d259d97..5011495e8df7 100644 --- a/frontend/src/ts/test/caret.ts +++ b/frontend/src/ts/test/caret.ts @@ -2,7 +2,7 @@ import Config from "../config"; import * as TestInput from "./test-input"; import * as TestState from "../test/test-state"; import { subscribe } from "../observables/config-event"; -import { Caret } from "../utils/caret"; +import { Caret } from "../elements/caret"; import * as CompositionState from "../states/composition"; import { qsr } from "../utils/dom"; diff --git a/frontend/src/ts/test/live-burst.ts b/frontend/src/ts/test/live-burst.ts index be9d9190d04e..38170e179ece 100644 --- a/frontend/src/ts/test/live-burst.ts +++ b/frontend/src/ts/test/live-burst.ts @@ -1,7 +1,7 @@ import Config from "../config"; import * as TestState from "../test/test-state"; import * as ConfigEvent from "../observables/config-event"; -import Format from "../utils/format"; +import Format from "../singletons/format"; import { applyReducedMotion } from "../utils/misc"; import { requestDebouncedAnimationFrame } from "../utils/debounced-animation-frame"; import { qs } from "../utils/dom"; diff --git a/frontend/src/ts/test/live-speed.ts b/frontend/src/ts/test/live-speed.ts index a5a929bd6034..fdc4d0cf027a 100644 --- a/frontend/src/ts/test/live-speed.ts +++ b/frontend/src/ts/test/live-speed.ts @@ -1,7 +1,7 @@ import Config from "../config"; import * as TestState from "./test-state"; import * as ConfigEvent from "../observables/config-event"; -import Format from "../utils/format"; +import Format from "../singletons/format"; import { applyReducedMotion } from "../utils/misc"; import { requestDebouncedAnimationFrame } from "../utils/debounced-animation-frame"; import { qs } from "../utils/dom"; diff --git a/frontend/src/ts/test/pace-caret.ts b/frontend/src/ts/test/pace-caret.ts index da0b4d01cd40..0319f9a8e270 100644 --- a/frontend/src/ts/test/pace-caret.ts +++ b/frontend/src/ts/test/pace-caret.ts @@ -5,7 +5,7 @@ import * as Misc from "../utils/misc"; import * as TestState from "./test-state"; import * as ConfigEvent from "../observables/config-event"; import { getActiveFunboxes } from "./funbox/list"; -import { Caret } from "../utils/caret"; +import { Caret } from "../elements/caret"; import { qsr } from "../utils/dom"; type Settings = { diff --git a/frontend/src/ts/test/result.ts b/frontend/src/ts/test/result.ts index e3ff39006628..2ae72538ccf8 100644 --- a/frontend/src/ts/test/result.ts +++ b/frontend/src/ts/test/result.ts @@ -34,7 +34,7 @@ import * as Focus from "./focus"; import * as CustomText from "./custom-text"; import * as CustomTextState from "./../states/custom-text-name"; import * as Funbox from "./funbox/funbox"; -import Format from "../utils/format"; +import Format from "../singletons/format"; import confetti from "canvas-confetti"; import type { AnnotationOptions, diff --git a/frontend/src/ts/test/test-logic.ts b/frontend/src/ts/test/test-logic.ts index 9a3047c1d2a8..8fd285f25f07 100644 --- a/frontend/src/ts/test/test-logic.ts +++ b/frontend/src/ts/test/test-logic.ts @@ -42,7 +42,7 @@ import { getAuthenticatedUser, isAuthenticated } from "../firebase"; import * as ConnectionState from "../states/connection"; import * as KeymapEvent from "../observables/keymap-event"; import * as LazyModeState from "../states/remember-lazy-mode"; -import Format from "../utils/format"; +import Format from "../singletons/format"; import { QuoteLength, QuoteLengthConfig } from "@monkeytype/schemas/configs"; import { Mode } from "@monkeytype/schemas/shared"; import { @@ -75,6 +75,43 @@ import { setAccountButtonSpinner } from "../signals/header"; let failReason = ""; +export async function syncNotSignedInLastResult(uid: string): Promise { + if (notSignedInLastResult === null) return; + setNotSignedInUidAndHash(uid); + + const response = await Ape.results.add({ + body: { result: notSignedInLastResult }, + }); + if (response.status !== 200) { + showErrorNotification("Failed to save last result", { response }); + return; + } + + //TODO - this type cast was not needed before because we were using JSON cloning + // but now with the stronger types it shows that we are forcing completed event + // into a snapshot result - might not cause issues but worth investigating + const result = structuredClone( + notSignedInLastResult, + ) as unknown as SnapshotResult; + + const dataToSave: DB.SaveLocalResultData = { + xp: response.body.data.xp, + streak: response.body.data.streak, + result, + isPb: response.body.data.isPb, + }; + + result._id = response.body.data.insertedId; + if (response.body.data.isPb) { + result.isPb = true; + } + DB.saveLocalResult(dataToSave); + clearNotSignedInResult(); + showSuccessNotification( + `Last test result saved ${response.body.data.isPb ? `(new pb!)` : ""}`, + ); +} + export let notSignedInLastResult: CompletedEvent | null = null; export function clearNotSignedInResult(): void { diff --git a/frontend/src/ts/test/test-ui.ts b/frontend/src/ts/test/test-ui.ts index 240562290a07..4a8d7d61e87e 100644 --- a/frontend/src/ts/test/test-ui.ts +++ b/frontend/src/ts/test/test-ui.ts @@ -17,7 +17,7 @@ import * as ConfigEvent from "../observables/config-event"; import * as Hangul from "hangul-js"; import * as ResultWordHighlight from "../elements/result-word-highlight"; import { getActivePage } from "../signals/core"; -import Format from "../utils/format"; +import Format from "../singletons/format"; import { TimerColor, TimerOpacity } from "@monkeytype/schemas/configs"; import { convertRemToPixels } from "../utils/numbers"; import { diff --git a/frontend/src/ts/types/validation.d.ts b/frontend/src/ts/types/validation.d.ts new file mode 100644 index 000000000000..52712a17431b --- /dev/null +++ b/frontend/src/ts/types/validation.d.ts @@ -0,0 +1,34 @@ +import { z } from "zod"; + +export type ValidationResult = + | { + status: "checking" | "failed" | "warning"; + errorMessage?: string; + success: false; + } + | { + status: "success"; + success: true; + }; + +export type IsValidResponse = true | string | { warning: string }; + +export type Validation = { + /** + * Zod schema to validate the input value against. + * The indicator will show the error messages from the schema. + */ + schema?: z.Schema; + + /** + * Custom async validation method. + * This is intended to be used for validations that cannot be handled with a Zod schema like server-side validations. + * @param value current input value + * @param thisPopup the current modal + * @returns true if the `value` is valid, an errorMessage as string if it is invalid. + */ + isValid?: (value: T) => Promise; + + /** custom debounce delay for `isValid` call. defaults to 100 */ + debounceDelay?: number; +}; diff --git a/frontend/src/ts/ui.ts b/frontend/src/ts/ui.ts index e5739d97334d..374ba7e89566 100644 --- a/frontend/src/ts/ui.ts +++ b/frontend/src/ts/ui.ts @@ -6,7 +6,7 @@ import * as ConfigEvent from "./observables/config-event"; import { debounce, throttle } from "throttle-debounce"; import * as TestUI from "./test/test-ui"; import { getActivePage, getGlobalOffsetTop } from "./signals/core"; -import { isDevEnvironment } from "./utils/misc"; +import { isDevEnvironment } from "./utils/env"; import { isCustomTextLong } from "./states/custom-text-name"; import { canQuickRestart } from "./utils/quick-restart"; import { FontName } from "@monkeytype/schemas/fonts"; diff --git a/frontend/src/ts/utils/env.ts b/frontend/src/ts/utils/env.ts new file mode 100644 index 000000000000..6e62b3d542a8 --- /dev/null +++ b/frontend/src/ts/utils/env.ts @@ -0,0 +1,5 @@ +import { envConfig } from "virtual:env-config"; + +export function isDevEnvironment(): boolean { + return envConfig.isDevelopment; +} diff --git a/frontend/src/ts/utils/error.ts b/frontend/src/ts/utils/error.ts new file mode 100644 index 000000000000..9f2564890663 --- /dev/null +++ b/frontend/src/ts/utils/error.ts @@ -0,0 +1,35 @@ +export function getErrorMessage(error: unknown): string | undefined { + let message = ""; + + if (error instanceof Error) { + message = error.message; + } else if ( + error !== null && + typeof error === "object" && + "message" in error && + (typeof error.message === "string" || typeof error.message === "number") + ) { + message = `${error.message}`; + } else if (typeof error === "string") { + message = error; + } else if (typeof error === "number") { + message = `${error}`; + } + + if (message === "") { + return undefined; + } + + return message; +} + +export function createErrorMessage(error: unknown, message: string): string { + const errorMessage = getErrorMessage(error); + + if (errorMessage === undefined) { + console.error("Could not get error message from error", error); + return `${message}: Unknown error`; + } + + return `${message}: ${errorMessage}`; +} diff --git a/frontend/src/ts/utils/format.ts b/frontend/src/ts/utils/format.ts index bf50d649b47a..475f03cce9ac 100644 --- a/frontend/src/ts/utils/format.ts +++ b/frontend/src/ts/utils/format.ts @@ -4,7 +4,6 @@ import { Config as ConfigType, TypingSpeedUnit, } from "@monkeytype/schemas/configs"; -import Config from "../config"; export type FormatOptions = { showDecimalPlaces?: boolean; @@ -121,5 +120,3 @@ export class Formatting { return position + numend; } } - -export default new Formatting(Config); diff --git a/frontend/src/ts/utils/json-data.ts b/frontend/src/ts/utils/json-data.ts index da5aeb820465..3151e9ce5daa 100644 --- a/frontend/src/ts/utils/json-data.ts +++ b/frontend/src/ts/utils/json-data.ts @@ -3,7 +3,7 @@ import { Challenge } from "@monkeytype/schemas/challenges"; import { LayoutObject } from "@monkeytype/schemas/layouts"; import { toHex } from "./strings"; import { languageHashes } from "virtual:language-hashes"; -import { isDevEnvironment } from "./misc"; +import { isDevEnvironment } from "./env"; //pin implementation const fetch = window.fetch; diff --git a/frontend/src/ts/utils/logger.ts b/frontend/src/ts/utils/logger.ts index 478f5189258a..1415471d3fe8 100644 --- a/frontend/src/ts/utils/logger.ts +++ b/frontend/src/ts/utils/logger.ts @@ -1,6 +1,6 @@ import { z } from "zod"; import { LocalStorageWithSchema } from "./local-storage-with-schema"; -import { isDevEnvironment } from "./misc"; +import { isDevEnvironment } from "./env"; const nativeLog = console.log; const nativeWarn = console.warn; diff --git a/frontend/src/ts/utils/misc.ts b/frontend/src/ts/utils/misc.ts index 302f40e36766..9d3458922ec2 100644 --- a/frontend/src/ts/utils/misc.ts +++ b/frontend/src/ts/utils/misc.ts @@ -1,5 +1,4 @@ import { showLoaderBar, hideLoaderBar } from "../signals/loader-bar"; -import { envConfig } from "virtual:env-config"; import { lastElementFromArray } from "./arrays"; import { Config } from "@monkeytype/schemas/configs"; import { Mode, Mode2, PersonalBests } from "@monkeytype/schemas/shared"; @@ -8,6 +7,7 @@ import { RankAndCount } from "@monkeytype/schemas/users"; import { roundTo2 } from "@monkeytype/util/numbers"; import { animate, AnimationParams } from "animejs"; import { ElementWithUtils } from "./dom"; +import { isDevEnvironment } from "./env"; export function whorf(speed: number, wordlen: number): number { return Math.min( @@ -341,42 +341,6 @@ export async function downloadResultsCSV(array: Result[]): Promise { hideLoaderBar(); } -export function getErrorMessage(error: unknown): string | undefined { - let message = ""; - - if (error instanceof Error) { - message = error.message; - } else if ( - error !== null && - typeof error === "object" && - "message" in error && - (typeof error.message === "string" || typeof error.message === "number") - ) { - message = `${error.message}`; - } else if (typeof error === "string") { - message = error; - } else if (typeof error === "number") { - message = `${error}`; - } - - if (message === "") { - return undefined; - } - - return message; -} - -export function createErrorMessage(error: unknown, message: string): string { - const errorMessage = getErrorMessage(error); - - if (errorMessage === undefined) { - console.error("Could not get error message from error", error); - return `${message}: Unknown error`; - } - - return `${message}: ${errorMessage}`; -} - export function isElementVisible(query: string): boolean { const el = document.querySelector(query); if (!el) { @@ -460,10 +424,6 @@ export function loadCSS(href: string, prepend = false): void { } } -export function isDevEnvironment(): boolean { - return envConfig.isDevelopment; -} - export function zipfyRandomArrayIndex(dictLength: number): number { /** * get random index based on probability distribution of Zipf's law, diff --git a/frontend/src/ts/utils/remote-validation.ts b/frontend/src/ts/utils/remote-validation.ts index 3aac4366e4b1..ce34428401ed 100644 --- a/frontend/src/ts/utils/remote-validation.ts +++ b/frontend/src/ts/utils/remote-validation.ts @@ -1,4 +1,4 @@ -import { IsValidResponse } from "../elements/input-validation"; +import { IsValidResponse } from "../types/validation"; type IsValidResonseOrFunction = | ((message: string) => IsValidResponse) diff --git a/frontend/src/ts/utils/results.ts b/frontend/src/ts/utils/results.ts deleted file mode 100644 index bb55140c45ed..000000000000 --- a/frontend/src/ts/utils/results.ts +++ /dev/null @@ -1,47 +0,0 @@ -import Ape from "../ape"; -import { - showErrorNotification, - showSuccessNotification, -} from "../stores/notifications"; -import * as DB from "../db"; -import * as TestLogic from "../test/test-logic"; -import { Mode } from "@monkeytype/schemas/shared"; -import { SnapshotResult } from "../constants/default-snapshot"; - -export async function syncNotSignedInLastResult(uid: string): Promise { - const notSignedInLastResult = TestLogic.notSignedInLastResult; - if (notSignedInLastResult === null) return; - TestLogic.setNotSignedInUidAndHash(uid); - - const response = await Ape.results.add({ - body: { result: notSignedInLastResult }, - }); - if (response.status !== 200) { - showErrorNotification("Failed to save last result", { response }); - return; - } - - //TODO - this type cast was not needed before because we were using JSON cloning - // but now with the stronger types it shows that we are forcing completed event - // into a snapshot result - might not cause issues but worth investigating - const result = structuredClone( - notSignedInLastResult, - ) as unknown as SnapshotResult; - - const dataToSave: DB.SaveLocalResultData = { - xp: response.body.data.xp, - streak: response.body.data.streak, - result, - isPb: response.body.data.isPb, - }; - - result._id = response.body.data.insertedId; - if (response.body.data.isPb) { - result.isPb = true; - } - DB.saveLocalResult(dataToSave); - TestLogic.clearNotSignedInResult(); - showSuccessNotification( - `Last test result saved ${response.body.data.isPb ? `(new pb!)` : ""}`, - ); -} diff --git a/frontend/src/ts/utils/version.ts b/frontend/src/ts/utils/version.ts index 2227057c256b..b7c020425353 100644 --- a/frontend/src/ts/utils/version.ts +++ b/frontend/src/ts/utils/version.ts @@ -2,7 +2,8 @@ import { z } from "zod"; import { getLatestReleaseFromGitHub } from "./json-data"; import { LocalStorageWithSchema } from "./local-storage-with-schema"; import { tryCatch } from "@monkeytype/util/trycatch"; -import { createErrorMessage, isDevEnvironment } from "./misc"; +import { isDevEnvironment } from "./env"; +import { createErrorMessage } from "./error"; import { setVersion } from "../signals/core"; const memoryLS = new LocalStorageWithSchema({ From 2d558d10f3b004c9866008f958aaea89d59ae41f Mon Sep 17 00:00:00 2001 From: Christian Fehmer Date: Sun, 15 Mar 2026 12:40:48 +0100 Subject: [PATCH 02/10] refactor(chart): better theme handling for ChartJs component (@fehmer) (#7600) Co-authored-by: Miodec --- frontend/package.json | 2 +- frontend/src/ts/components/common/ChartJs.tsx | 48 +- .../src/ts/components/pages/AboutPage.tsx | 3 + pnpm-lock.yaml | 1391 ++++++----------- 4 files changed, 541 insertions(+), 903 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index d1362797941c..7bd5c4ea1bef 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -48,7 +48,7 @@ "chart.js": "3.7.1", "chartjs-adapter-date-fns": "3.0.0", "chartjs-plugin-annotation": "2.2.1", - "chartjs-plugin-trendline": "1.0.2", + "chartjs-plugin-trendline": "3.2.0", "clsx": "2.1.1", "color-blend": "4.0.0", "damerau-levenshtein": "1.0.8", diff --git a/frontend/src/ts/components/common/ChartJs.tsx b/frontend/src/ts/components/common/ChartJs.tsx index 3cdf5bdf2a06..966fd0134459 100644 --- a/frontend/src/ts/components/common/ChartJs.tsx +++ b/frontend/src/ts/components/common/ChartJs.tsx @@ -1,17 +1,20 @@ import { + CartesianScaleOptions, Chart, ChartData, ChartOptions, ChartType, DefaultDataPoint, + ScaleChartOptions, } from "chart.js"; +import chartTrendline from "chartjs-plugin-trendline"; import { createEffect, JSXElement, onCleanup, onMount } from "solid-js"; -import { ChartWithUpdateColors } from "../../controllers/chart-controller"; -import { createDebouncedEffectOn } from "../../hooks/effects"; +import { Theme } from "../../constants/themes"; import { useRefWithUtils } from "../../hooks/useRefWithUtils"; import { getTheme } from "../../signals/theme"; +Chart.register(chartTrendline); type ChartJSProps< T extends ChartType = ChartType, TData = DefaultDataPoint, @@ -28,15 +31,15 @@ export function ChartJs>( // Refs are assigned by SolidJS via the ref attribute const [canvasRef, canvasEl] = useRefWithUtils(); - let chart: ChartWithUpdateColors | undefined; + let chart: Chart | undefined; onMount(() => { const canvas = canvasEl(); if (canvas === undefined) return; - chart = new ChartWithUpdateColors(canvas.native, { + chart = new Chart(canvas.native, { type: props.type, data: props.data, - options: props.options, + options: addColorsToOptions(props.options as ChartOptions, getTheme), }); props.onChartInit?.(chart); @@ -48,20 +51,41 @@ export function ChartJs>( chart.config.type = props.type; chart.data = props.data; if (props.options) { - chart.options = props.options; + chart.options = addColorsToOptions(props.options, getTheme); } chart.update(); }); - createDebouncedEffectOn( - 125, - getTheme, - (theme) => void chart?.updateColors(theme), - ); - onCleanup(() => { chart?.destroy(); }); return ; } + +function addColorsToOptions( + options: ChartOptions, + theme: () => Theme, +): ChartOptions { + //axis colors + const chartScaleOptions = options as ScaleChartOptions; + Object.keys(chartScaleOptions.scales).forEach((scaleID) => { + const axis = chartScaleOptions.scales[scaleID] as CartesianScaleOptions; + axis.ticks = { + ...axis.ticks, + color: theme().sub, + }; + axis.title = { + ...axis.title, + color: theme().sub, + }; + axis.grid = { + ...axis.grid, + color: theme().subAlt, + tickColor: theme().subAlt, + borderColor: theme().subAlt, + }; + }); + + return options; +} diff --git a/frontend/src/ts/components/pages/AboutPage.tsx b/frontend/src/ts/components/pages/AboutPage.tsx index 4ebab71b5e0e..fe1152b47e40 100644 --- a/frontend/src/ts/components/pages/AboutPage.tsx +++ b/frontend/src/ts/components/pages/AboutPage.tsx @@ -10,6 +10,7 @@ import { } from "../../queries/public"; import { getConfig } from "../../signals/config"; import { getActivePage } from "../../signals/core"; +import { getTheme } from "../../signals/theme"; import { showModal } from "../../stores/modals"; import { getNumberWithMagnitude } from "../../utils/numbers"; import AsyncContent from "../common/AsyncContent"; @@ -113,6 +114,8 @@ export function AboutPage(): JSXElement { label: "Users", data: data?.data ?? [], minBarLength: 2, + backgroundColor: getTheme().main, + borderColor: getTheme().main, }, ], }} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db1ec753b36a..4b1afafd9263 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,7 +22,7 @@ importers: version: link:packages/release '@vitest/coverage-v8': specifier: 4.0.15 - version: 4.0.15(vitest@4.1.0(@types/node@20.5.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@20.5.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))) + version: 4.0.15(vitest@4.1.0(@types/node@20.5.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@20.5.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))) caniuse-lite: specifier: 1.0.30001778 version: 1.0.30001778 @@ -58,7 +58,7 @@ importers: version: 2.7.5 vitest: specifier: 4.1.0 - version: 4.1.0(@types/node@20.5.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@20.5.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.1.0(@types/node@20.5.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@20.5.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) backend: dependencies: @@ -230,7 +230,7 @@ importers: version: 10.0.0 '@vitest/coverage-v8': specifier: 4.0.15 - version: 4.0.15(vitest@4.1.0(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))) + version: 4.0.15(vitest@4.1.0(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))) concurrently: specifier: 8.2.2 version: 8.2.2 @@ -260,7 +260,7 @@ importers: version: 6.0.0-beta vitest: specifier: 4.1.0 - version: 4.1.0(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.1.0(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) frontend: dependencies: @@ -337,8 +337,8 @@ importers: specifier: 2.2.1 version: 2.2.1(chart.js@3.7.1) chartjs-plugin-trendline: - specifier: 1.0.2 - version: 1.0.2 + specifier: 3.2.0 + version: 3.2.0 clsx: specifier: 2.1.1 version: 2.1.1 @@ -414,7 +414,7 @@ importers: version: 0.8.10(solid-js@1.9.10) '@tailwindcss/vite': specifier: 4.2.1 - version: 4.2.1(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.2.1(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) '@tanstack/eslint-plugin-query': specifier: 5.91.4 version: 5.91.4(eslint@9.39.1(jiti@2.6.1))(typescript@6.0.0-beta) @@ -453,7 +453,7 @@ importers: version: 5.0.2 '@vitest/coverage-v8': specifier: 4.0.15 - version: 4.0.15(vitest@4.1.0(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))) + version: 4.0.15(vitest@4.1.0(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))) autoprefixer: specifier: 10.4.27 version: 10.4.27(postcss@8.5.8) @@ -525,28 +525,28 @@ importers: version: 3.0.0 vite: specifier: 8.0.0 - version: 8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + version: 8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) vite-bundle-visualizer: specifier: 1.2.1 - version: 1.2.1(rollup@2.80.0) + version: 1.2.1(rollup@2.79.2) vite-plugin-html-inject: specifier: 1.1.2 version: 1.1.2 vite-plugin-inspect: specifier: 11.3.3 - version: 11.3.3(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 11.3.3(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) vite-plugin-minify: specifier: 2.1.0 - version: 2.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) vite-plugin-pwa: specifier: 1.1.0 - version: 1.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.1.0) + version: 1.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.1.0) vite-plugin-solid: specifier: 2.11.11 - version: 2.11.11(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.11.11(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.1.0 - version: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) frontend/storybook: devDependencies: @@ -558,7 +558,7 @@ importers: version: 10.2.16(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@storybook/addon-docs': specifier: ^10.2.14 - version: 10.2.16(@types/react@19.2.14)(esbuild@0.27.4)(rollup@4.52.5)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 10.2.16(@types/react@19.2.14)(esbuild@0.27.3)(rollup@4.52.5)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) '@storybook/addon-links': specifier: ^10.2.14 version: 10.2.16(react@18.3.1)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) @@ -567,22 +567,22 @@ importers: version: 10.2.16(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@storybook/addon-vitest': specifier: ^10.2.14 - version: 10.2.16(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0))(@vitest/runner@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vitest@4.1.0) + version: 10.2.16(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0))(@vitest/runner@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vitest@4.1.0) '@storybook/builder-vite': specifier: ^10.2.14 - version: 10.2.16(esbuild@0.27.4)(rollup@4.52.5)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 10.2.16(esbuild@0.27.3)(rollup@4.52.5)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) '@tailwindcss/vite': specifier: ^4.2.1 - version: 4.2.1(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.2.1(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitest/browser': specifier: ^4.0.18 - version: 4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0) + version: 4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0) '@vitest/browser-playwright': specifier: ^4.0.18 - version: 4.0.18(playwright@1.58.2)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0) + version: 4.0.18(playwright@1.58.2)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0) '@vitest/coverage-v8': specifier: ^4.0.18 - version: 4.0.18(@vitest/browser@4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0))(vitest@4.1.0) + version: 4.0.18(@vitest/browser@4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0))(vitest@4.1.0) playwright: specifier: ^1.58.2 version: 1.58.2 @@ -594,10 +594,10 @@ importers: version: 10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) storybook-solidjs-vite: specifier: ^10.0.9 - version: 10.0.9(@testing-library/jest-dom@6.9.1)(esbuild@0.27.4)(rollup@4.52.5)(solid-js@1.9.11)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@6.0.0-beta)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 10.0.9(@testing-library/jest-dom@6.9.1)(esbuild@0.27.3)(rollup@4.52.5)(solid-js@1.9.11)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@6.0.0-beta)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) packages/contracts: dependencies: @@ -668,7 +668,7 @@ importers: version: 6.0.0-beta vitest: specifier: 4.1.0 - version: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) packages/oxlint-config: devDependencies: @@ -727,7 +727,7 @@ importers: version: 6.0.0-beta vitest: specifier: 4.1.0 - version: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) packages/tsup-config: dependencies: @@ -775,7 +775,7 @@ importers: version: 6.0.0-beta vitest: specifier: 4.1.0 - version: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) zod: specifier: 3.23.8 version: 3.23.8 @@ -816,34 +816,18 @@ packages: resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} engines: {node: '>=6.9.0'} - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} - engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.6': resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.0': - resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} - engines: {node: '>=6.9.0'} - '@babel/core@7.28.6': resolution: {integrity: sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==} engines: {node: '>=6.9.0'} - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} - engines: {node: '>=6.9.0'} - '@babel/generator@7.28.6': resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.1': - resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} - engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} @@ -864,8 +848,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.7': - resolution: {integrity: sha512-6Fqi8MtQ/PweQ9xvux65emkLQ83uB+qAVtfHkC9UodyHMIZdxNI01HjLCLUtybElp2KY2XNE0nOgyP1E1vXw9w==} + '@babel/helper-define-polyfill-provider@0.6.5': + resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -940,11 +924,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.29.0': - resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} engines: {node: '>=6.9.0'} @@ -993,8 +972,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.28.6': - resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1011,8 +990,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.29.0': - resolution: {integrity: sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==} + '@babel/plugin-transform-async-generator-functions@7.28.6': + resolution: {integrity: sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1077,8 +1056,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0': - resolution: {integrity: sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6': + resolution: {integrity: sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1155,8 +1134,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.29.0': - resolution: {integrity: sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==} + '@babel/plugin-transform-modules-systemjs@7.28.5': + resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1167,8 +1146,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.29.0': - resolution: {integrity: sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==} + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1239,8 +1218,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.29.0': - resolution: {integrity: sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==} + '@babel/plugin-transform-regenerator@7.28.6': + resolution: {integrity: sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1311,8 +1290,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.29.0': - resolution: {integrity: sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w==} + '@babel/preset-env@7.28.6': + resolution: {integrity: sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1334,18 +1313,10 @@ packages: resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} - engines: {node: '>=6.9.0'} - '@babel/types@7.28.6': resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} - engines: {node: '>=6.9.0'} - '@balena/dockerignore@1.0.2': resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} @@ -1533,12 +1504,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.27.4': - resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/android-arm64@0.25.11': resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} engines: {node: '>=18'} @@ -1551,12 +1516,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.27.4': - resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm@0.25.11': resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} engines: {node: '>=18'} @@ -1569,12 +1528,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.27.4': - resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-x64@0.25.11': resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} engines: {node: '>=18'} @@ -1587,12 +1540,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.27.4': - resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/darwin-arm64@0.25.11': resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} engines: {node: '>=18'} @@ -1605,12 +1552,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.27.4': - resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-x64@0.25.11': resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} engines: {node: '>=18'} @@ -1623,12 +1564,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.27.4': - resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/freebsd-arm64@0.25.11': resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} engines: {node: '>=18'} @@ -1641,12 +1576,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.27.4': - resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-x64@0.25.11': resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} engines: {node: '>=18'} @@ -1659,12 +1588,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.4': - resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/linux-arm64@0.25.11': resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} engines: {node: '>=18'} @@ -1677,12 +1600,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.27.4': - resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm@0.25.11': resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} engines: {node: '>=18'} @@ -1695,12 +1612,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.27.4': - resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-ia32@0.25.11': resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} engines: {node: '>=18'} @@ -1713,12 +1624,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.27.4': - resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-loong64@0.25.11': resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} engines: {node: '>=18'} @@ -1731,12 +1636,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.4': - resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-mips64el@0.25.11': resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} engines: {node: '>=18'} @@ -1749,12 +1648,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.27.4': - resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-ppc64@0.25.11': resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} engines: {node: '>=18'} @@ -1767,12 +1660,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.4': - resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-riscv64@0.25.11': resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} engines: {node: '>=18'} @@ -1785,12 +1672,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.27.4': - resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-s390x@0.25.11': resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} engines: {node: '>=18'} @@ -1803,12 +1684,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.4': - resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-x64@0.25.11': resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} engines: {node: '>=18'} @@ -1821,12 +1696,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.27.4': - resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/netbsd-arm64@0.25.11': resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} engines: {node: '>=18'} @@ -1839,12 +1708,6 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.27.4': - resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-x64@0.25.11': resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} engines: {node: '>=18'} @@ -1857,12 +1720,6 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.4': - resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/openbsd-arm64@0.25.11': resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} engines: {node: '>=18'} @@ -1875,12 +1732,6 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.27.4': - resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-x64@0.25.11': resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} engines: {node: '>=18'} @@ -1893,12 +1744,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.4': - resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openharmony-arm64@0.25.11': resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} engines: {node: '>=18'} @@ -1911,12 +1756,6 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.27.4': - resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - '@esbuild/sunos-x64@0.25.11': resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} engines: {node: '>=18'} @@ -1929,12 +1768,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.4': - resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/win32-arm64@0.25.11': resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} engines: {node: '>=18'} @@ -1947,12 +1780,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.27.4': - resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-ia32@0.25.11': resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} engines: {node: '>=18'} @@ -1965,12 +1792,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.27.4': - resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-x64@0.25.11': resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} engines: {node: '>=18'} @@ -1983,12 +1804,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.4': - resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4283,11 +4098,8 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} - - ajv@8.18.0: - resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} animejs@4.2.2: resolution: {integrity: sha512-Ys3RuvLdAeI14fsdKCQy7ytu4057QX6Bb7m4jwmfd6iKmUmLquTwk1ut0e4NtRQgCeq/s2Lv5+oMBjz6c7ZuIg==} @@ -4491,23 +4303,23 @@ packages: b4a@1.6.6: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} - babel-plugin-jsx-dom-expressions@0.40.5: - resolution: {integrity: sha512-8TFKemVLDYezqqv4mWz+PhRrkryTzivTGu0twyLrOkVZ0P63COx2Y04eVsUjFlwSOXui1z3P3Pn209dokWnirg==} + babel-plugin-jsx-dom-expressions@0.40.3: + resolution: {integrity: sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w==} peerDependencies: '@babel/core': ^7.20.12 - babel-plugin-polyfill-corejs2@0.4.16: - resolution: {integrity: sha512-xaVwwSfebXf0ooE11BJovZYKhFjIvQo7TsyVpETuIeH2JHv0k/T6Y5j22pPTvqYqmpkxdlPAJlyJ0tfOJAoMxw==} + babel-plugin-polyfill-corejs2@0.4.14: + resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.14.1: - resolution: {integrity: sha512-ENp89vM9Pw4kv/koBb5N2f9bDZsR0hpf3BdPMOg/pkS3pwO4dzNnQZVXtBbeyAadgm865DmQG2jMMLqmZXvuCw==} + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.7: - resolution: {integrity: sha512-OTYbUlSwXhNgr4g6efMZgsO8//jA61P7ZbRX3iTT53VON8l+WQS8IAUEVo4a4cWknrg2W8Cj4gQhRYNCJ8GkAA==} + babel-plugin-polyfill-regenerator@0.6.5: + resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -4797,8 +4609,8 @@ packages: peerDependencies: chart.js: '>=3.7.0' - chartjs-plugin-trendline@1.0.2: - resolution: {integrity: sha512-1yaWvaW3WvaikITgrc6JEyvWZWDN9Opjz65fCkgQr/dRdKuXcYzOMl45jylPiJyC9dWWL6HCYiL2HuwItjI8RQ==} + chartjs-plugin-trendline@3.2.0: + resolution: {integrity: sha512-UQ309v67EPc6KQsEIfn8YEBOclsZGvfddjbK8ZIN9QhEHQKzUrtJPpMc1F8o5G7ErgIFvmtFnt5YP9vkTPswSg==} check-error@2.1.3: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} @@ -5153,8 +4965,8 @@ packages: resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} engines: {node: '>= 0.8'} - core-js-compat@3.48.0: - resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==} + core-js-compat@3.47.0: + resolution: {integrity: sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==} core-js@3.37.1: resolution: {integrity: sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==} @@ -5428,10 +5240,6 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} @@ -5692,11 +5500,6 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.27.4: - resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} - engines: {node: '>=18'} - hasBin: true - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -7354,9 +7157,6 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - lodash@4.17.23: - resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} - log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} @@ -8270,9 +8070,6 @@ packages: parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - parse5@7.3.0: - resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - parse5@8.0.0: resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} @@ -8904,8 +8701,8 @@ packages: rollup: optional: true - rollup@2.80.0: - resolution: {integrity: sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==} + rollup@2.79.2: + resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} engines: {node: '>=10.0.0'} hasBin: true @@ -9197,9 +8994,8 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - smob@1.6.1: - resolution: {integrity: sha512-KAkBqZl3c2GvNgNhcoyJae1aKldDW0LO279wF9bk1PnluRTETKBq0WyzRXxEhoQLk56yHaOY4JCBEKDuJIET5g==} - engines: {node: '>=20.0.0'} + smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} socks-proxy-agent@8.0.4: resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} @@ -9640,8 +9436,8 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.0.4: - resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} engines: {node: '>=18'} tinyglobby@0.2.15: @@ -9660,10 +9456,6 @@ packages: resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} - tinyrainbow@3.1.0: - resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} - engines: {node: '>=14.0.0'} - tinyspy@4.0.4: resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} @@ -10152,6 +9944,16 @@ packages: '@vite-pwa/assets-generator': optional: true + vite-plugin-solid@2.11.10: + resolution: {integrity: sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==} + peerDependencies: + '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* + solid-js: ^1.7.2 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + '@testing-library/jest-dom': + optional: true + vite-plugin-solid@2.11.11: resolution: {integrity: sha512-YMZCXsLw9kyuvQFEdwLP27fuTQJLmjNoHy90AOJnbRuJ6DwShUxKFo38gdFrWn9v11hnGicKCZEaeI/TFs6JKw==} peerDependencies: @@ -10205,10 +10007,10 @@ packages: yaml: optional: true - vitefu@1.1.2: - resolution: {integrity: sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==} + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 peerDependenciesMeta: vite: optional: true @@ -10584,9 +10386,9 @@ snapshots: ts-deepmerge: 6.2.1 zod: 3.23.8 - '@apideck/better-ajv-errors@0.3.6(ajv@8.18.0)': + '@apideck/better-ajv-errors@0.3.6(ajv@8.17.1)': dependencies: - ajv: 8.18.0 + ajv: 8.17.1 json-schema: 0.4.0 jsonpointer: 5.0.1 leven: 3.1.0 @@ -10622,16 +10424,8 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/code-frame@7.29.0': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - '@babel/compat-data@7.28.6': {} - '@babel/compat-data@7.29.0': {} - '@babel/core@7.28.6': dependencies: '@babel/code-frame': 7.28.6 @@ -10652,26 +10446,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/core@7.29.0': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.28.6 - '@babel/parser': 7.29.0 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@5.5.0) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/generator@7.28.6': dependencies: '@babel/parser': 7.28.6 @@ -10680,17 +10454,9 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/generator@7.29.1': - dependencies: - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.28.6 '@babel/helper-compilation-targets@7.28.6': dependencies: @@ -10700,29 +10466,29 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.29.0)': + '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.6) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.6 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.0)': + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-annotate-as-pure': 7.27.3 regexpu-core: 6.4.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.7(@babel/core@7.29.0)': + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 debug: 4.4.3(supports-color@5.5.0) @@ -10735,14 +10501,14 @@ snapshots: '@babel/helper-member-expression-to-functions@7.28.5': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.18.6': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.28.6 '@babel/helper-module-imports@7.28.6': dependencies: @@ -10760,43 +10526,34 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.6 - transitivePeerDependencies: - - supports-color - '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.28.6 '@babel/helper-plugin-utils@7.28.6': {} - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.29.0)': + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)': + '@babel/helper-replace-supers@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color @@ -10809,8 +10566,8 @@ snapshots: '@babel/helper-wrap-function@7.28.6': dependencies: '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color @@ -10823,484 +10580,480 @@ snapshots: dependencies: '@babel/types': 7.28.6 - '@babel/parser@7.29.0': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.6)': dependencies: - '@babel/types': 7.29.0 - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 - '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-async-generator-functions@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.6) + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-classes@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-globals': 7.28.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.6) + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/template': 7.28.6 - '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.29.0)': + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.6) + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.29.0)': + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-regenerator@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-spread@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-spread@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 - '@babel/preset-env@7.29.0(@babel/core@7.29.0)': + '@babel/preset-env@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/compat-data': 7.29.0 - '@babel/core': 7.29.0 + '@babel/compat-data': 7.28.6 + '@babel/core': 7.28.6 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.29.0) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0) - '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.0) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) - '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-modules-systemjs': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) - '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.29.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.0) - babel-plugin-polyfill-corejs2: 0.4.16(@babel/core@7.29.0) - babel-plugin-polyfill-corejs3: 0.14.1(@babel/core@7.29.0) - babel-plugin-polyfill-regenerator: 0.6.7(@babel/core@7.29.0) - core-js-compat: 3.48.0 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.6) + '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.6) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-async-generator-functions': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.6) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-regenerator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.28.6) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.6) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.6) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.6) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.6) + core-js-compat: 3.47.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.0)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/types': 7.29.0 + '@babel/types': 7.28.6 esutils: 2.0.3 '@babel/runtime@7.28.6': {} @@ -11323,28 +11076,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/traverse@7.29.0': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.0 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - debug: 4.4.3(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - '@babel/types@7.28.6': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@babel/types@7.29.0': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@balena/dockerignore@1.0.2': {} '@bcoe/v8-coverage@1.0.2': {} @@ -11390,7 +11126,7 @@ snapshots: '@commitlint/config-validator@17.8.1': dependencies: '@commitlint/types': 17.8.1 - ajv: 8.18.0 + ajv: 8.17.1 '@commitlint/ensure@17.8.1': dependencies: @@ -11585,234 +11321,156 @@ snapshots: '@esbuild/aix-ppc64@0.27.3': optional: true - '@esbuild/aix-ppc64@0.27.4': - optional: true - '@esbuild/android-arm64@0.25.11': optional: true '@esbuild/android-arm64@0.27.3': optional: true - '@esbuild/android-arm64@0.27.4': - optional: true - '@esbuild/android-arm@0.25.11': optional: true '@esbuild/android-arm@0.27.3': optional: true - '@esbuild/android-arm@0.27.4': - optional: true - '@esbuild/android-x64@0.25.11': optional: true '@esbuild/android-x64@0.27.3': optional: true - '@esbuild/android-x64@0.27.4': - optional: true - '@esbuild/darwin-arm64@0.25.11': optional: true '@esbuild/darwin-arm64@0.27.3': optional: true - '@esbuild/darwin-arm64@0.27.4': - optional: true - '@esbuild/darwin-x64@0.25.11': optional: true '@esbuild/darwin-x64@0.27.3': optional: true - '@esbuild/darwin-x64@0.27.4': - optional: true - '@esbuild/freebsd-arm64@0.25.11': optional: true '@esbuild/freebsd-arm64@0.27.3': optional: true - '@esbuild/freebsd-arm64@0.27.4': - optional: true - '@esbuild/freebsd-x64@0.25.11': optional: true '@esbuild/freebsd-x64@0.27.3': optional: true - '@esbuild/freebsd-x64@0.27.4': - optional: true - '@esbuild/linux-arm64@0.25.11': optional: true '@esbuild/linux-arm64@0.27.3': optional: true - '@esbuild/linux-arm64@0.27.4': - optional: true - '@esbuild/linux-arm@0.25.11': optional: true '@esbuild/linux-arm@0.27.3': optional: true - '@esbuild/linux-arm@0.27.4': - optional: true - '@esbuild/linux-ia32@0.25.11': optional: true '@esbuild/linux-ia32@0.27.3': optional: true - '@esbuild/linux-ia32@0.27.4': - optional: true - '@esbuild/linux-loong64@0.25.11': optional: true '@esbuild/linux-loong64@0.27.3': optional: true - '@esbuild/linux-loong64@0.27.4': - optional: true - '@esbuild/linux-mips64el@0.25.11': optional: true '@esbuild/linux-mips64el@0.27.3': optional: true - '@esbuild/linux-mips64el@0.27.4': - optional: true - '@esbuild/linux-ppc64@0.25.11': optional: true '@esbuild/linux-ppc64@0.27.3': optional: true - '@esbuild/linux-ppc64@0.27.4': - optional: true - '@esbuild/linux-riscv64@0.25.11': optional: true '@esbuild/linux-riscv64@0.27.3': optional: true - '@esbuild/linux-riscv64@0.27.4': - optional: true - '@esbuild/linux-s390x@0.25.11': optional: true '@esbuild/linux-s390x@0.27.3': optional: true - '@esbuild/linux-s390x@0.27.4': - optional: true - '@esbuild/linux-x64@0.25.11': optional: true '@esbuild/linux-x64@0.27.3': optional: true - '@esbuild/linux-x64@0.27.4': - optional: true - '@esbuild/netbsd-arm64@0.25.11': optional: true '@esbuild/netbsd-arm64@0.27.3': optional: true - '@esbuild/netbsd-arm64@0.27.4': - optional: true - '@esbuild/netbsd-x64@0.25.11': optional: true '@esbuild/netbsd-x64@0.27.3': optional: true - '@esbuild/netbsd-x64@0.27.4': - optional: true - '@esbuild/openbsd-arm64@0.25.11': optional: true '@esbuild/openbsd-arm64@0.27.3': optional: true - '@esbuild/openbsd-arm64@0.27.4': - optional: true - '@esbuild/openbsd-x64@0.25.11': optional: true '@esbuild/openbsd-x64@0.27.3': optional: true - '@esbuild/openbsd-x64@0.27.4': - optional: true - '@esbuild/openharmony-arm64@0.25.11': optional: true '@esbuild/openharmony-arm64@0.27.3': optional: true - '@esbuild/openharmony-arm64@0.27.4': - optional: true - '@esbuild/sunos-x64@0.25.11': optional: true '@esbuild/sunos-x64@0.27.3': optional: true - '@esbuild/sunos-x64@0.27.4': - optional: true - '@esbuild/win32-arm64@0.25.11': optional: true '@esbuild/win32-arm64@0.27.3': optional: true - '@esbuild/win32-arm64@0.27.4': - optional: true - '@esbuild/win32-ia32@0.25.11': optional: true '@esbuild/win32-ia32@0.27.3': optional: true - '@esbuild/win32-ia32@0.27.4': - optional: true - '@esbuild/win32-x64@0.25.11': optional: true '@esbuild/win32-x64@0.27.3': optional: true - '@esbuild/win32-x64@0.27.4': - optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.1(jiti@2.6.1))': dependencies: eslint: 9.39.1(jiti@2.6.1) @@ -11842,7 +11500,7 @@ snapshots: '@eslint/eslintrc@3.3.3': dependencies: - ajv: 6.14.0 + ajv: 6.12.6 debug: 4.4.3(supports-color@5.5.0) espree: 10.4.0 globals: 14.0.0 @@ -11883,7 +11541,7 @@ snapshots: '@fastify/ajv-compiler@1.1.0': dependencies: - ajv: 6.14.0 + ajv: 6.12.6 '@fastify/busboy@1.2.1': dependencies: @@ -12551,11 +12209,11 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4(typescript@6.0.0-beta)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4(typescript@6.0.0-beta)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: glob: 13.0.6 react-docgen-typescript: 2.4.0(typescript@6.0.0-beta) - vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) optionalDependencies: typescript: 6.0.0-beta @@ -13184,55 +12842,55 @@ snapshots: '@rolldown/pluginutils@1.0.0-rc.9': {} - '@rollup/plugin-babel@5.3.1(@babel/core@7.29.0)(@types/babel__core@7.20.5)(rollup@2.80.0)': + '@rollup/plugin-babel@5.3.1(@babel/core@7.28.6)(@types/babel__core@7.20.5)(rollup@2.79.2)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-module-imports': 7.28.6 - '@rollup/pluginutils': 3.1.0(rollup@2.80.0) - rollup: 2.80.0 + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + rollup: 2.79.2 optionalDependencies: '@types/babel__core': 7.20.5 transitivePeerDependencies: - supports-color - '@rollup/plugin-node-resolve@15.3.1(rollup@2.80.0)': + '@rollup/plugin-node-resolve@15.3.1(rollup@2.79.2)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@2.80.0) + '@rollup/pluginutils': 5.3.0(rollup@2.79.2) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.11 optionalDependencies: - rollup: 2.80.0 + rollup: 2.79.2 - '@rollup/plugin-replace@2.4.2(rollup@2.80.0)': + '@rollup/plugin-replace@2.4.2(rollup@2.79.2)': dependencies: - '@rollup/pluginutils': 3.1.0(rollup@2.80.0) + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) magic-string: 0.25.9 - rollup: 2.80.0 + rollup: 2.79.2 - '@rollup/plugin-terser@0.4.4(rollup@2.80.0)': + '@rollup/plugin-terser@0.4.4(rollup@2.79.2)': dependencies: serialize-javascript: 6.0.2 - smob: 1.6.1 + smob: 1.5.0 terser: 5.46.0 optionalDependencies: - rollup: 2.80.0 + rollup: 2.79.2 - '@rollup/pluginutils@3.1.0(rollup@2.80.0)': + '@rollup/pluginutils@3.1.0(rollup@2.79.2)': dependencies: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.1 - rollup: 2.80.0 + rollup: 2.79.2 - '@rollup/pluginutils@5.3.0(rollup@2.80.0)': + '@rollup/pluginutils@5.3.0(rollup@2.79.2)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 2.80.0 + rollup: 2.79.2 '@rollup/rollup-android-arm-eabi@4.52.5': optional: true @@ -13448,10 +13106,10 @@ snapshots: axe-core: 4.11.1 storybook: 10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/addon-docs@10.2.16(@types/react@19.2.14)(esbuild@0.27.4)(rollup@4.52.5)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))': + '@storybook/addon-docs@10.2.16(@types/react@19.2.14)(esbuild@0.27.3)(rollup@4.52.5)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@18.3.1) - '@storybook/csf-plugin': 10.2.16(esbuild@0.27.4)(rollup@4.52.5)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + '@storybook/csf-plugin': 10.2.16(esbuild@0.27.3)(rollup@4.52.5)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) '@storybook/icons': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@storybook/react-dom-shim': 10.2.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) react: 18.3.1 @@ -13476,39 +13134,39 @@ snapshots: dependencies: storybook: 10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/addon-vitest@10.2.16(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0))(@vitest/runner@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vitest@4.1.0)': + '@storybook/addon-vitest@10.2.16(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0))(@vitest/runner@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vitest@4.1.0)': dependencies: '@storybook/global': 5.0.0 '@storybook/icons': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) storybook: 10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: - '@vitest/browser': 4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0) - '@vitest/browser-playwright': 4.0.18(playwright@1.58.2)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0) + '@vitest/browser': 4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0) + '@vitest/browser-playwright': 4.0.18(playwright@1.58.2)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0) '@vitest/runner': 4.1.0 - vitest: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + vitest: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) transitivePeerDependencies: - react - react-dom - '@storybook/builder-vite@10.2.16(esbuild@0.27.4)(rollup@4.52.5)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))': + '@storybook/builder-vite@10.2.16(esbuild@0.27.3)(rollup@4.52.5)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: - '@storybook/csf-plugin': 10.2.16(esbuild@0.27.4)(rollup@4.52.5)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + '@storybook/csf-plugin': 10.2.16(esbuild@0.27.3)(rollup@4.52.5)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) storybook: 10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ts-dedent: 2.2.0 - vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - esbuild - rollup - webpack - '@storybook/csf-plugin@10.2.16(esbuild@0.27.4)(rollup@4.52.5)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))': + '@storybook/csf-plugin@10.2.16(esbuild@0.27.3)(rollup@4.52.5)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: storybook: 10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) unplugin: 2.3.11 optionalDependencies: - esbuild: 0.27.4 + esbuild: 0.27.3 rollup: 4.52.5 - vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) '@storybook/global@5.0.0': {} @@ -13591,12 +13249,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.2.1 '@tailwindcss/oxide-win32-x64-msvc': 4.2.1 - '@tailwindcss/vite@4.2.1(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))': + '@tailwindcss/vite@4.2.1(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@tailwindcss/node': 4.2.1 '@tailwindcss/oxide': 4.2.1 tailwindcss: 4.2.1 - vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) '@tanstack/db-ivm@0.1.17(typescript@6.0.0-beta)': dependencies: @@ -13738,24 +13396,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.28.6 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.28.6 '@types/bcrypt@5.0.2': dependencies: @@ -14067,29 +13725,29 @@ snapshots: '@typescript-eslint/types': 8.52.0 eslint-visitor-keys: 4.2.1 - '@vitest/browser-playwright@4.0.18(playwright@1.58.2)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0)': + '@vitest/browser-playwright@4.0.18(playwright@1.58.2)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0)': dependencies: - '@vitest/browser': 4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0) - '@vitest/mocker': 4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + '@vitest/browser': 4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0) + '@vitest/mocker': 4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) playwright: 1.58.2 tinyrainbow: 3.0.3 - vitest: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + vitest: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser@4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0)': + '@vitest/browser@4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0)': dependencies: - '@vitest/mocker': 4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + '@vitest/mocker': 4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitest/utils': 4.0.18 magic-string: 0.30.21 pixelmatch: 7.1.0 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.0.3 - vitest: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + vitest: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) ws: 8.19.0 transitivePeerDependencies: - bufferutil @@ -14097,7 +13755,7 @@ snapshots: - utf-8-validate - vite - '@vitest/coverage-v8@4.0.15(vitest@4.1.0(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)))': + '@vitest/coverage-v8@4.0.15(vitest@4.1.0(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.15 @@ -14110,11 +13768,11 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.1.0(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + vitest: 4.1.0(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.15(vitest@4.1.0(@types/node@20.5.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@20.5.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)))': + '@vitest/coverage-v8@4.0.15(vitest@4.1.0(@types/node@20.5.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@20.5.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.15 @@ -14127,11 +13785,11 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.1.0(@types/node@20.5.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@20.5.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + vitest: 4.1.0(@types/node@20.5.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@20.5.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.15(vitest@4.1.0(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)))': + '@vitest/coverage-v8@4.0.15(vitest@4.1.0(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.15 @@ -14144,11 +13802,11 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + vitest: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.18(@vitest/browser@4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0))(vitest@4.1.0)': + '@vitest/coverage-v8@4.0.18(@vitest/browser@4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0))(vitest@4.1.0)': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.18 @@ -14160,9 +13818,9 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + vitest: 4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) optionalDependencies: - '@vitest/browser': 4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0) + '@vitest/browser': 4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0) '@vitest/expect@3.2.4': dependencies: @@ -14179,23 +13837,23 @@ snapshots: '@vitest/spy': 4.1.0 '@vitest/utils': 4.1.0 chai: 6.2.2 - tinyrainbow: 3.1.0 + tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))': + '@vitest/mocker@4.0.18(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) - '@vitest/mocker@4.1.0(vite@8.0.0(@types/node@20.5.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))': + '@vitest/mocker@4.1.0(vite@8.0.0(@types/node@20.5.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.1.0 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.0(@types/node@20.5.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 8.0.0(@types/node@20.5.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) '@vitest/mocker@4.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.25.11)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: @@ -14205,13 +13863,13 @@ snapshots: optionalDependencies: vite: 8.0.0(@types/node@24.9.1)(esbuild@0.25.11)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) - '@vitest/mocker@4.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))': + '@vitest/mocker@4.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.1.0 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -14227,7 +13885,7 @@ snapshots: '@vitest/pretty-format@4.1.0': dependencies: - tinyrainbow: 3.1.0 + tinyrainbow: 3.0.3 '@vitest/runner@4.1.0': dependencies: @@ -14269,7 +13927,7 @@ snapshots: dependencies: '@vitest/pretty-format': 4.1.0 convert-source-map: 2.0.0 - tinyrainbow: 3.1.0 + tinyrainbow: 3.0.3 '@vue/compiler-core@3.4.37': dependencies: @@ -14353,9 +14011,9 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ajv-formats@2.1.1(ajv@8.18.0): + ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: - ajv: 8.18.0 + ajv: 8.17.1 ajv-formats@3.0.1(@redocly/ajv@8.17.1): optionalDependencies: @@ -14372,14 +14030,7 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@6.14.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ajv@8.18.0: + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 fast-uri: 3.1.0 @@ -14582,50 +14233,50 @@ snapshots: b4a@1.6.6: {} - babel-plugin-jsx-dom-expressions@0.40.5(@babel/core@7.29.0): + babel-plugin-jsx-dom-expressions@0.40.3(@babel/core@7.28.6): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/types': 7.29.0 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.6) + '@babel/types': 7.28.6 html-entities: 2.3.3 - parse5: 7.3.0 + parse5: 7.1.2 - babel-plugin-polyfill-corejs2@0.4.16(@babel/core@7.29.0): + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.6): dependencies: - '@babel/compat-data': 7.29.0 - '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.7(@babel/core@7.29.0) + '@babel/compat-data': 7.28.6 + '@babel/core': 7.28.6 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.6) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.14.1(@babel/core@7.29.0): + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.6): dependencies: - '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.7(@babel/core@7.29.0) - core-js-compat: 3.48.0 + '@babel/core': 7.28.6 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.6) + core-js-compat: 3.47.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.7(@babel/core@7.29.0): + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.6): dependencies: - '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.7(@babel/core@7.29.0) + '@babel/core': 7.28.6 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - babel-preset-solid@1.9.10(@babel/core@7.29.0)(solid-js@1.9.10): + babel-preset-solid@1.9.10(@babel/core@7.28.6)(solid-js@1.9.10): dependencies: - '@babel/core': 7.29.0 - babel-plugin-jsx-dom-expressions: 0.40.5(@babel/core@7.29.0) + '@babel/core': 7.28.6 + babel-plugin-jsx-dom-expressions: 0.40.3(@babel/core@7.28.6) optionalDependencies: solid-js: 1.9.10 - babel-preset-solid@1.9.10(@babel/core@7.29.0)(solid-js@1.9.11): + babel-preset-solid@1.9.10(@babel/core@7.28.6)(solid-js@1.9.11): dependencies: - '@babel/core': 7.29.0 - babel-plugin-jsx-dom-expressions: 0.40.5(@babel/core@7.29.0) + '@babel/core': 7.28.6 + babel-plugin-jsx-dom-expressions: 0.40.3(@babel/core@7.28.6) optionalDependencies: solid-js: 1.9.11 @@ -14933,7 +14584,7 @@ snapshots: dependencies: chart.js: 3.7.1 - chartjs-plugin-trendline@1.0.2: {} + chartjs-plugin-trendline@3.2.0: {} check-error@2.1.3: {} @@ -15300,7 +14951,7 @@ snapshots: depd: 2.0.0 keygrip: 1.1.0 - core-js-compat@3.48.0: + core-js-compat@3.47.0: dependencies: browserslist: 4.28.1 @@ -15547,8 +15198,6 @@ snapshots: detect-libc@2.0.3: {} - detect-libc@2.1.2: {} - detect-node@2.1.0: {} detective-amd@6.0.0: @@ -15933,36 +15582,6 @@ snapshots: '@esbuild/win32-ia32': 0.27.3 '@esbuild/win32-x64': 0.27.3 - esbuild@0.27.4: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.4 - '@esbuild/android-arm': 0.27.4 - '@esbuild/android-arm64': 0.27.4 - '@esbuild/android-x64': 0.27.4 - '@esbuild/darwin-arm64': 0.27.4 - '@esbuild/darwin-x64': 0.27.4 - '@esbuild/freebsd-arm64': 0.27.4 - '@esbuild/freebsd-x64': 0.27.4 - '@esbuild/linux-arm': 0.27.4 - '@esbuild/linux-arm64': 0.27.4 - '@esbuild/linux-ia32': 0.27.4 - '@esbuild/linux-loong64': 0.27.4 - '@esbuild/linux-mips64el': 0.27.4 - '@esbuild/linux-ppc64': 0.27.4 - '@esbuild/linux-riscv64': 0.27.4 - '@esbuild/linux-s390x': 0.27.4 - '@esbuild/linux-x64': 0.27.4 - '@esbuild/netbsd-arm64': 0.27.4 - '@esbuild/netbsd-x64': 0.27.4 - '@esbuild/openbsd-arm64': 0.27.4 - '@esbuild/openbsd-x64': 0.27.4 - '@esbuild/openharmony-arm64': 0.27.4 - '@esbuild/sunos-x64': 0.27.4 - '@esbuild/win32-arm64': 0.27.4 - '@esbuild/win32-ia32': 0.27.4 - '@esbuild/win32-x64': 0.27.4 - optional: true - escalade@3.2.0: {} escape-goat@2.1.1: {} @@ -16128,8 +15747,8 @@ snapshots: exegesis@4.2.0: dependencies: '@apidevtools/json-schema-ref-parser': 9.1.2 - ajv: 8.18.0 - ajv-formats: 2.1.1(ajv@8.18.0) + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) body-parser: 1.20.3 content-type: 1.0.5 deep-freeze: 0.0.1 @@ -16255,7 +15874,7 @@ snapshots: fast-json-stringify@2.7.13: dependencies: - ajv: 6.14.0 + ajv: 6.12.6 deepmerge: 4.3.1 rfdc: 1.4.1 string-similarity: 4.0.4 @@ -17737,7 +17356,7 @@ snapshots: light-my-request@4.12.0: dependencies: - ajv: 8.18.0 + ajv: 8.17.1 cookie: 0.5.0 process-warning: 1.0.0 set-cookie-parser: 2.6.0 @@ -17826,7 +17445,7 @@ snapshots: lightningcss@1.32.0: dependencies: - detect-libc: 2.1.2 + detect-libc: 2.0.3 optionalDependencies: lightningcss-android-arm64: 1.32.0 lightningcss-darwin-arm64: 1.32.0 @@ -17946,8 +17565,6 @@ snapshots: lodash@4.17.21: {} - lodash@4.17.23: {} - log-symbols@4.1.0: dependencies: chalk: 4.1.2 @@ -19115,10 +18732,6 @@ snapshots: dependencies: entities: 4.5.0 - parse5@7.3.0: - dependencies: - entities: 6.0.1 - parse5@8.0.0: dependencies: entities: 6.0.1 @@ -19783,16 +19396,16 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.9 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.9 - rollup-plugin-visualizer@5.14.0(rollup@2.80.0): + rollup-plugin-visualizer@5.14.0(rollup@2.79.2): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: - rollup: 2.80.0 + rollup: 2.79.2 - rollup@2.80.0: + rollup@2.79.2: optionalDependencies: fsevents: 2.3.3 @@ -20184,7 +19797,7 @@ snapshots: smart-buffer@4.2.0: {} - smob@1.6.1: {} + smob@1.5.0: {} socks-proxy-agent@8.0.4: dependencies: @@ -20213,18 +19826,18 @@ snapshots: solid-refresh@0.6.3(solid-js@1.9.10): dependencies: - '@babel/generator': 7.29.1 + '@babel/generator': 7.28.6 '@babel/helper-module-imports': 7.28.6 - '@babel/types': 7.29.0 + '@babel/types': 7.28.6 solid-js: 1.9.10 transitivePeerDependencies: - supports-color solid-refresh@0.6.3(solid-js@1.9.11): dependencies: - '@babel/generator': 7.29.1 + '@babel/generator': 7.28.6 '@babel/helper-module-imports': 7.28.6 - '@babel/types': 7.29.0 + '@babel/types': 7.28.6 solid-js: 1.9.11 transitivePeerDependencies: - supports-color @@ -20336,15 +19949,15 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - storybook-solidjs-vite@10.0.9(@testing-library/jest-dom@6.9.1)(esbuild@0.27.4)(rollup@4.52.5)(solid-js@1.9.11)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@6.0.0-beta)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): + storybook-solidjs-vite@10.0.9(@testing-library/jest-dom@6.9.1)(esbuild@0.27.3)(rollup@4.52.5)(solid-js@1.9.11)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@6.0.0-beta)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@6.0.0-beta)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) - '@storybook/builder-vite': 10.2.16(esbuild@0.27.4)(rollup@4.52.5)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@6.0.0-beta)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + '@storybook/builder-vite': 10.2.16(esbuild@0.27.3)(rollup@4.52.5)(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) '@storybook/global': 5.0.0 solid-js: 1.9.11 storybook: 10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) - vite-plugin-solid: 2.11.11(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + vite-plugin-solid: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) optionalDependencies: typescript: 6.0.0-beta transitivePeerDependencies: @@ -20784,7 +20397,7 @@ snapshots: tinyexec@0.3.2: {} - tinyexec@1.0.4: {} + tinyexec@1.0.2: {} tinyglobby@0.2.15: dependencies: @@ -20797,8 +20410,6 @@ snapshots: tinyrainbow@3.0.3: {} - tinyrainbow@3.1.0: {} - tinyspy@4.0.4: {} tldts-core@7.0.19: {} @@ -21212,30 +20823,30 @@ snapshots: vary@1.1.2: {} - vite-bundle-visualizer@1.2.1(rollup@2.80.0): + vite-bundle-visualizer@1.2.1(rollup@2.79.2): dependencies: cac: 6.7.14 import-from-esm: 1.3.4 - rollup-plugin-visualizer: 5.14.0(rollup@2.80.0) + rollup-plugin-visualizer: 5.14.0(rollup@2.79.2) tmp: 0.2.5 transitivePeerDependencies: - rolldown - rollup - supports-color - vite-dev-rpc@1.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-dev-rpc@1.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: birpc: 2.6.1 - vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) - vite-hot-client: 2.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + vite-hot-client: 2.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) - vite-hot-client@2.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-hot-client@2.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: - vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) vite-plugin-html-inject@1.1.2: {} - vite-plugin-inspect@11.3.3(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-inspect@11.3.3(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: ansis: 4.2.0 debug: 4.4.3(supports-color@5.5.0) @@ -21245,59 +20856,59 @@ snapshots: perfect-debounce: 2.0.0 sirv: 3.0.2 unplugin-utils: 0.3.1 - vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) - vite-dev-rpc: 1.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + vite-dev-rpc: 1.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) transitivePeerDependencies: - supports-color - vite-plugin-minify@2.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-minify@2.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: '@types/html-minifier-terser': 7.0.2 html-minifier-terser: 7.2.0 - vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) - vite-plugin-pwa@1.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.1.0): + vite-plugin-pwa@1.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.1.0): dependencies: debug: 4.4.3(supports-color@5.5.0) pretty-bytes: 6.1.1 tinyglobby: 0.2.15 - vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) workbox-build: 7.1.1(@types/babel__core@7.20.5) workbox-window: 7.1.0 transitivePeerDependencies: - supports-color - vite-plugin-solid@2.11.11(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@types/babel__core': 7.20.5 - babel-preset-solid: 1.9.10(@babel/core@7.29.0)(solid-js@1.9.10) + babel-preset-solid: 1.9.10(@babel/core@7.28.6)(solid-js@1.9.11) merge-anything: 5.1.7 - solid-js: 1.9.10 - solid-refresh: 0.6.3(solid-js@1.9.10) - vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) - vitefu: 1.1.2(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + solid-js: 1.9.11 + solid-refresh: 0.6.3(solid-js@1.9.11) + vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + vitefu: 1.1.1(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) optionalDependencies: '@testing-library/jest-dom': 6.9.1 transitivePeerDependencies: - supports-color - vite-plugin-solid@2.11.11(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-solid@2.11.11(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.6 '@types/babel__core': 7.20.5 - babel-preset-solid: 1.9.10(@babel/core@7.29.0)(solid-js@1.9.11) + babel-preset-solid: 1.9.10(@babel/core@7.28.6)(solid-js@1.9.10) merge-anything: 5.1.7 - solid-js: 1.9.11 - solid-refresh: 0.6.3(solid-js@1.9.11) - vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) - vitefu: 1.1.2(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + solid-js: 1.9.10 + solid-refresh: 0.6.3(solid-js@1.9.10) + vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + vitefu: 1.1.1(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) optionalDependencies: '@testing-library/jest-dom': 6.9.1 transitivePeerDependencies: - supports-color - vite@8.0.0(@types/node@20.5.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1): + vite@8.0.0(@types/node@20.5.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: '@oxc-project/runtime': 0.115.0 lightningcss: 1.32.0 @@ -21307,7 +20918,7 @@ snapshots: tinyglobby: 0.2.15 optionalDependencies: '@types/node': 20.5.1 - esbuild: 0.27.4 + esbuild: 0.27.3 fsevents: 2.3.3 jiti: 2.6.1 sass: 1.70.0 @@ -21333,7 +20944,7 @@ snapshots: tsx: 4.21.0 yaml: 2.8.1 - vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1): + vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: '@oxc-project/runtime': 0.115.0 lightningcss: 1.32.0 @@ -21343,7 +20954,7 @@ snapshots: tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.9.1 - esbuild: 0.27.4 + esbuild: 0.27.3 fsevents: 2.3.3 jiti: 2.6.1 sass: 1.70.0 @@ -21351,14 +20962,14 @@ snapshots: tsx: 4.21.0 yaml: 2.8.1 - vitefu@1.1.2(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): + vitefu@1.1.1(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): optionalDependencies: - vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) - vitest@4.1.0(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): + vitest@4.1.0(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: '@vitest/expect': 4.1.0 - '@vitest/mocker': 4.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + '@vitest/mocker': 4.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitest/pretty-format': 4.1.0 '@vitest/runner': 4.1.0 '@vitest/snapshot': 4.1.0 @@ -21372,10 +20983,10 @@ snapshots: picomatch: 4.0.3 std-env: 4.0.0 tinybench: 2.9.0 - tinyexec: 1.0.4 + tinyexec: 1.0.2 tinyglobby: 0.2.15 - tinyrainbow: 3.1.0 - vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + tinyrainbow: 3.0.3 + vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.8.0 @@ -21385,10 +20996,10 @@ snapshots: transitivePeerDependencies: - msw - vitest@4.1.0(@types/node@20.5.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@20.5.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): + vitest@4.1.0(@types/node@20.5.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@20.5.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: '@vitest/expect': 4.1.0 - '@vitest/mocker': 4.1.0(vite@8.0.0(@types/node@20.5.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + '@vitest/mocker': 4.1.0(vite@8.0.0(@types/node@20.5.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitest/pretty-format': 4.1.0 '@vitest/runner': 4.1.0 '@vitest/snapshot': 4.1.0 @@ -21402,10 +21013,10 @@ snapshots: picomatch: 4.0.3 std-env: 4.0.0 tinybench: 2.9.0 - tinyexec: 1.0.4 + tinyexec: 1.0.2 tinyglobby: 0.2.15 - tinyrainbow: 3.1.0 - vite: 8.0.0(@types/node@20.5.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + tinyrainbow: 3.0.3 + vite: 8.0.0(@types/node@20.5.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.5.1 @@ -21414,10 +21025,10 @@ snapshots: transitivePeerDependencies: - msw - vitest@4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): + vitest@4.1.0(@types/node@24.9.1)(@vitest/browser-playwright@4.0.18)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: '@vitest/expect': 4.1.0 - '@vitest/mocker': 4.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) + '@vitest/mocker': 4.1.0(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitest/pretty-format': 4.1.0 '@vitest/runner': 4.1.0 '@vitest/snapshot': 4.1.0 @@ -21431,14 +21042,14 @@ snapshots: picomatch: 4.0.3 std-env: 4.0.0 tinybench: 2.9.0 - tinyexec: 1.0.4 + tinyexec: 1.0.2 tinyglobby: 0.2.15 - tinyrainbow: 3.1.0 - vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) + tinyrainbow: 3.0.3 + vite: 8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.9.1 - '@vitest/browser-playwright': 4.0.18(playwright@1.58.2)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0) + '@vitest/browser-playwright': 4.0.18(playwright@1.58.2)(vite@8.0.0(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0) happy-dom: 20.0.10 jsdom: 27.4.0 transitivePeerDependencies: @@ -21461,9 +21072,9 @@ snapshots: picomatch: 4.0.3 std-env: 4.0.0 tinybench: 2.9.0 - tinyexec: 1.0.4 + tinyexec: 1.0.2 tinyglobby: 0.2.15 - tinyrainbow: 3.1.0 + tinyrainbow: 3.0.3 vite: 8.0.0(@types/node@24.9.1)(esbuild@0.25.11)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: @@ -21658,23 +21269,23 @@ snapshots: workbox-build@7.1.1(@types/babel__core@7.20.5): dependencies: - '@apideck/better-ajv-errors': 0.3.6(ajv@8.18.0) - '@babel/core': 7.29.0 - '@babel/preset-env': 7.29.0(@babel/core@7.29.0) + '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) + '@babel/core': 7.28.6 + '@babel/preset-env': 7.28.6(@babel/core@7.28.6) '@babel/runtime': 7.28.6 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.29.0)(@types/babel__core@7.20.5)(rollup@2.80.0) - '@rollup/plugin-node-resolve': 15.3.1(rollup@2.80.0) - '@rollup/plugin-replace': 2.4.2(rollup@2.80.0) - '@rollup/plugin-terser': 0.4.4(rollup@2.80.0) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.28.6)(@types/babel__core@7.20.5)(rollup@2.79.2) + '@rollup/plugin-node-resolve': 15.3.1(rollup@2.79.2) + '@rollup/plugin-replace': 2.4.2(rollup@2.79.2) + '@rollup/plugin-terser': 0.4.4(rollup@2.79.2) '@surma/rollup-plugin-off-main-thread': 2.2.3 - ajv: 8.18.0 + ajv: 8.17.1 common-tags: 1.8.2 fast-json-stable-stringify: 2.1.0 fs-extra: 9.1.0 glob: 7.2.3 - lodash: 4.17.23 + lodash: 4.17.21 pretty-bytes: 5.6.0 - rollup: 2.80.0 + rollup: 2.79.2 source-map: 0.8.0-beta.0 stringify-object: 3.3.0 strip-comments: 2.0.1 From aece24e7082d98798061c2bf89f410a3da342627 Mon Sep 17 00:00:00 2001 From: Miodec Date: Sun, 15 Mar 2026 13:16:08 +0100 Subject: [PATCH 03/10] chore: remove theme indicator commandline dependency --- frontend/src/ts/commandline/commandline.ts | 2 +- .../ts/components/layout/footer/ThemeIndicator.tsx | 12 +++++++----- frontend/src/ts/signals/core.ts | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/frontend/src/ts/commandline/commandline.ts b/frontend/src/ts/commandline/commandline.ts index 8b44850f4f56..75b94fb1f316 100644 --- a/frontend/src/ts/commandline/commandline.ts +++ b/frontend/src/ts/commandline/commandline.ts @@ -123,7 +123,7 @@ export function show( if (exists) { showLoaderBar(); subgroupOverride = await CommandlineLists.getList( - overrideStringOrGroup, + overrideStringOrGroup as CommandlineLists.ListsObjectKeys, ); hideLoaderBar(); } else { diff --git a/frontend/src/ts/components/layout/footer/ThemeIndicator.tsx b/frontend/src/ts/components/layout/footer/ThemeIndicator.tsx index 84ea93946ec0..ae2c81abffeb 100644 --- a/frontend/src/ts/components/layout/footer/ThemeIndicator.tsx +++ b/frontend/src/ts/components/layout/footer/ThemeIndicator.tsx @@ -1,9 +1,12 @@ import { JSXElement, Show } from "solid-js"; -import * as Commandline from "../../../commandline/commandline"; import Config, { setConfig } from "../../../config"; import { isAuthenticated } from "../../../firebase"; -import { getThemeIndicator } from "../../../signals/core"; +import { + getThemeIndicator, + setCommandlineSubgroup, +} from "../../../signals/core"; +import { showModal } from "../../../stores/modals"; import { showNoticeNotification } from "../../../stores/notifications"; import { getSnapshot } from "../../../stores/snapshot"; import { Fa } from "../../common/Fa"; @@ -23,9 +26,8 @@ export function ThemeIndicator(): JSXElement { setConfig("customTheme", true); } else { const subgroup = Config.customTheme ? "customTheme" : "themes"; - Commandline.show({ - subgroupOverride: subgroup, - }); + setCommandlineSubgroup(subgroup); + showModal("Commandline"); } }; diff --git a/frontend/src/ts/signals/core.ts b/frontend/src/ts/signals/core.ts index d3b51e8f4950..4fdd2803e925 100644 --- a/frontend/src/ts/signals/core.ts +++ b/frontend/src/ts/signals/core.ts @@ -23,7 +23,7 @@ export const [getThemeIndicator, setThemeIndicator] = createSignal<{ }); export const [getCommandlineSubgroup, setCommandlineSubgroup] = createSignal< - "ads" | null + string | null >(null); export const [getFocus, setFocus] = createSignal(false); From 0a7785b9326912299c1af1618c09e8cbd621c427 Mon Sep 17 00:00:00 2001 From: Christian Fehmer Date: Sun, 15 Mar 2026 13:23:38 +0100 Subject: [PATCH 04/10] fix(style): transparent table headers when custom background is used (@fehmer) (#7612) Table header used `bg-bg` but we want the header to be transparent if a custom background is set. - move row striping back to tbody - remove bg-bg from thead --- frontend/src/ts/components/ui/table/DataTable.tsx | 2 +- frontend/src/ts/components/ui/table/Table.tsx | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/frontend/src/ts/components/ui/table/DataTable.tsx b/frontend/src/ts/components/ui/table/DataTable.tsx index eb0a02cb8616..befe9384839c 100644 --- a/frontend/src/ts/components/ui/table/DataTable.tsx +++ b/frontend/src/ts/components/ui/table/DataTable.tsx @@ -181,7 +181,7 @@ export function DataTable( {(headerGroup) => ( - + {(header) => ( > = (props) => { const TableBody: Component> = (props) => { const [local, others] = splitProps(props, ["class"]); return ( - + tr:nth-child(odd)>td]:bg-sub-alt", + local.class, + )} + {...others} + > ); }; @@ -35,7 +41,7 @@ const TableFooter: Component> = (props) => { const TableRow: Component> = (props) => { const [local, others] = splitProps(props, ["class"]); - return ; + return ; }; const TableHead: Component> = (props) => { From 1254f2cfcf6fa959347e02800a0b7b17216c61ea Mon Sep 17 00:00:00 2001 From: Christian Fehmer Date: Sun, 15 Mar 2026 13:24:05 +0100 Subject: [PATCH 05/10] impr(leaderboard): don't show stale data for weekly/daily when entering leaderboard page (@fehmer) (#7597) --- .../pages/leaderboard/LeaderboardPage.tsx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/frontend/src/ts/components/pages/leaderboard/LeaderboardPage.tsx b/frontend/src/ts/components/pages/leaderboard/LeaderboardPage.tsx index 8c62a9d54d01..9368b9b26199 100644 --- a/frontend/src/ts/components/pages/leaderboard/LeaderboardPage.tsx +++ b/frontend/src/ts/components/pages/leaderboard/LeaderboardPage.tsx @@ -2,6 +2,7 @@ import { useQuery } from "@tanstack/solid-query"; import { createEffect, createSignal, JSXElement, Show } from "solid-js"; import { getSnapshot, updateLbMemory } from "../../../db"; +import { createEffectOn } from "../../../hooks/effects"; import { PageName } from "../../../pages/page"; import { queryClient } from "../../../queries"; import { @@ -39,6 +40,18 @@ export function LeaderboardPage(): JSXElement { const [scrollToUser, setScrollToUser] = createSignal(false); + //invalidate cache for daily and weekly lb on close + createEffectOn(isOpen, (open) => { + if (!open) { + void queryClient.invalidateQueries({ + predicate: (query) => + query.queryKey.length >= 3 && + query.queryKey[1] === "leaderboard" && + ["weekly", "daily"].includes(query.queryKey[2] as string), + }); + } + }); + //prefetch next page createEffect(() => { if (isOpen()) { From 3ec2cac17086eae5dfcb15e142c01e84f00b3d67 Mon Sep 17 00:00:00 2001 From: Jack Date: Sun, 15 Mar 2026 13:29:03 +0100 Subject: [PATCH 06/10] refactor: move some code to the constants directory, move constants to their own bundle chunk (@miodec) (#7650) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- frontend/src/ts/constants/british-english.ts | 681 +++++++++++++++++ frontend/src/ts/constants/keys.ts | 228 ++++++ frontend/src/ts/constants/themes.ts | 9 - .../src/ts/{utils => constants}/typo-list.ts | 0 .../src/ts/elements/settings/theme-picker.ts | 10 +- frontend/src/ts/input/handlers/keydown.ts | 3 +- frontend/src/ts/pages/login.ts | 2 +- frontend/src/ts/test/british-english.ts | 690 +----------------- frontend/src/ts/test/monkey.ts | 5 +- frontend/src/ts/test/shift-tracker.ts | 3 +- frontend/src/ts/utils/key-converter.ts | 235 +----- frontend/vite.config.ts | 4 + 12 files changed, 943 insertions(+), 927 deletions(-) create mode 100644 frontend/src/ts/constants/british-english.ts create mode 100644 frontend/src/ts/constants/keys.ts rename frontend/src/ts/{utils => constants}/typo-list.ts (100%) diff --git a/frontend/src/ts/constants/british-english.ts b/frontend/src/ts/constants/british-english.ts new file mode 100644 index 000000000000..7aec00333a47 --- /dev/null +++ b/frontend/src/ts/constants/british-english.ts @@ -0,0 +1,681 @@ +type ExceptionRule = { britishWord: string; exceptPreviousWords: string[] }; +type BritishEnglishReplacements = Record< + string /*EnglishWord*/, + string /*BritishWord*/ | ExceptionRule +>; +const britishEnglishReplacements: BritishEnglishReplacements = { + laborers: "labourers", + industrialized: "industrialised", + acclimatizing: "acclimatising", + acclimatized: "acclimatised", + behoove: "behove", + reorganization: "reorganisation", + galvanize: "galvanise", + demagogism: "demagoguism", + canceled: "cancelled", + baptize: "baptise", + revitalize: "revitalise", + skeptical: "sceptical", + piscine: "piscinae", + ionization: "ionisation", + chili: "chilli", + dexterous: "dextrous", + likable: "likeable", + neutralize: "neutralise", + meter: "metre", + meters: "metres", + centimeter: "centimetre", + hurrah: "hooray", + multicolor: "multicolour", + actualization: "actualisation", + fertilizing: "fertilising", + enamor: "enamour", + skepticism: "scepticism", + authorize: "authorise", + minimize: "minimise", + bandoleer: "bandolier", + rigor: "rigour", + fledgling: "fledgeling", + mesquite: "mesquit", + fogy: "fogey", + characterize: "characterise", + wagonette: "waggonette", + plagiarize: "plagiarise", + kilometers: "kilometres", + molt: "moult", + leveler: "leveller", + checkered: "chequered", + vendor: "vender", + candor: "candour", + moralize: "moralise", + denationalization: "denationalisation", + anemia: "anaemia", + caiman: "cayman", + chitterlings: "chitlins", + acclimated: "acclimatised", + acclimate: "acclimatise", + skillful: "skilful", + enamored: "enamoured", + watercolor: "watercolour", + extemporization: "extemporisation", + lackluster: "lacklustre", + equalizer: "equaliser", + cipher: "cypher", + polarization: "polarisation", + polymerization: "polymerisation", + ionize: "ionise", + anesthetic: "anaesthetic", + aerie: "eyrie", + lachrymal: "lacrimal", + decimeter: "decimetre", + rajah: "raja", + modernize: "modernise", + gasoline: "petrol", + alphabetized: "alphabetised", + saber: "sabre", + burglarize: "burglarise", + terrorize: "terrorise", + enthrall: "enthral", + mustachioed: "moustachioed", + anesthesia: "anaesthesia", + sepulcher: "sepulchre", + caftan: "kaftan", + organize: "organise", + manikin: "mannikin", + dexterously: "dextrously", + artifact: "artefact", + kilometer: "kilometre", + mommy: "mummy", + brant: "brent", + hyena: "hyaena", + fuze: "fuse", + victimize: "victimise", + jihad: "jehad", + airplane: "aeroplane", + laborer: "labourer", + vaporware: "vapourware", + worshiped: "worshipped", + taboret: "tabouret", + rationalize: "rationalise", + whimsy: "whimsey", + scandalize: "scandalise", + categorization: "categorisation", + centered: "centred", + kerosene: "kerosine", + specialize: "specialise", + specialized: "specialised", + cicatrix: "cicatrice", + jailer: "jailor", + unfavorable: "unfavourable", + guerrilla: "guerilla", + emphasize: "emphasise", + wacky: "whacky", + ionizing: "ionising", + czarina: "tzarina", + ratline: "ratlin", + abolitionize: "abolitionise", + subsidize: "subsidise", + plowing: "ploughing", + untrammeled: "untrammelled", + worshiping: "worshipping", + memorization: "memorisation", + anglicize: "anglicise", + finalize: "finalise", + gases: "gasses", + fertilization: "fertilisation", + libeling: "libelling", + kinesthetic: "kinaesthetic", + immunization: "immunisation", + coloration: "colouration", + overdraft: "overdraught", + lambaste: "lambast", + unpasteurized: "unpasteurised", + ascendance: "ascendence", + jeweler: "jeweller", + fervor: "fervour", + jeopardize: "jeopardise", + abridgment: "abridgement", + monopolize: "monopolise", + colorless: "colourless", + colorlessness: "colourlessness", + tumors: "tumours", + jinni: "jinn", + aluminum: "aluminium", + salable: "saleable", + bronco: "broncho", + lupine: "lupin", + linchpin: "lynchpin", + mesmerize: "mesmerise", + internationalization: "internationalisation", + anapestic: "anapaestic", + supersede: "supercede", + europeanize: "europeanise", + optimized: "optimised", + botanize: "botanise", + organizational: "organisational", + heme: "haem", + estivation: "aestivation", + edema: "oedema", + penalize: "penalise", + peddler: "pedlar", + biased: "biassed", + aggrandize: "aggrandise", + rationalizing: "rationalising", + deputize: "deputise", + centers: "centres", + unicolor: "unicolour", + hypnotized: "hypnotised", + anglicized: "anglicised", + initialization: "initialisation", + topee: "topi", + nightie: "nighty", + tricolor: "tricolour", + reorganize: "reorganise", + barbecue: "barbeque", + fertilized: "fertilised", + synthesize: "synthesise", + economize: "economise", + colter: "coulter", + paleontologist: "palaeontologist", + acclimatize: "acclimatise", + idealize: "idealise", + fossilization: "fossilisation", + lionize: "lionise", + acclimating: "acclimatising", + luster: "lustre", + demeanor: "demeanour", + unauthorized: "unauthorised", + smolder: "smoulder", + abettor: "abetter", + jewelry: "jewellery", + demoralization: "demoralisation", + fullness: "fulness", + neighbored: "neighboured", + neighbor: "neighbour", + neighbors: "neighbours", + neighboring: "neighbouring", + neighborly: "neighbourly", + neighborhood: "neighbourhood", + neighborhoods: "neighbourhoods", + magnetizer: "magnetiser", + appetizer: "appetiser", + hebraizing: "hebraising", + carbonization: "carbonisation", + favorably: "favourably", + favorite: "favourite", + behavioral: "behavioural", + cognizant: "cognisant", + skeptic: "sceptic", + fiber: "fibre", + fibers: "fibres", + labeled: "labelled", + analyze: "analyse", + disorganization: "disorganisation", + concenter: "concentre", + categorize: "categorise", + novelization: "novelisation", + proselytize: "proselytise", + draftsman: "draughtsman", + paralyze: "paralyse", + ostracize: "ostracise", + italicize: "italicise", + micrometer: "micrometre", + cognizance: "cognisance", + saltpeter: "saltpetre", + conceptualization: "conceptualisation", + containerization: "containerisation", + anapest: "anapaest", + leukemia: "leukaemia", + omelet: "omelette", + industrialize: "industrialise", + characterization: "characterisation", + amortize: "amortise", + mazurka: "mazourka", + macadamize: "macadamise", + stymie: "stymy", + analog: "analogue", + prizer: "priser", + cauterize: "cauterise", + dysmenorrhea: "dysmenorrhoea", + hippie: "hippy", + mechanization: "mechanisation", + commercialize: "commercialise", + unsavory: "unsavoury", + somber: "sombre", + esophageal: "oesophageal", + iodized: "iodised", + tyrannize: "tyrannise", + liberalize: "liberalise", + computerization: "computerisation", + synthesizer: "synthesiser", + fertilizes: "fertilises", + airdrome: "aerodrome", + uncivilized: "uncivilised", + mold: "mould", + nitrogenized: "nitrogenised", + legalize: "legalise", + tantalize: "tantalise", + eulogize: "eulogise", + depolarization: "depolarisation", + fecal: "faecal", + bastardize: "bastardise", + summarize: "summarise", + cony: "coney", + authorization: "authorisation", + colorful: "colourful", + temporized: "temporised", + adviser: "advisor", + tendinitis: "tendonitis", + crystallization: "crystallisation", + humor: "humour", + humorous: "humourous", + chanty: "shanty", + dyspnea: "dyspnoea", + aging: "ageing", + mousy: "mousey", + succor: "succour", + distill: "distil", + decentralization: "decentralisation", + cauterization: "cauterisation", + specter: "spectre", + snowplow: "snowplough", + pediatrics: "paediatrics", + discoloration: "discolouration", + tumor: "tumour", + empathize: "empathise", + pawpaw: "papaya", + aggrandizement: "aggrandisement", + fontanel: "fontanelle", + brunet: "brunette", + rumor: "rumour", + epaulet: "epaulette", + glycerin: "glycerine", + fraternize: "fraternise", + latinize: "latinise", + sniveling: "snivelling", + pasteurize: "pasteurise", + modernization: "modernisation", + patronize: "patronise", + totaled: "totalled", + normalization: "normalisation", + niter: "nitre", + shoveler: "shoveller", + flier: "flyer", + equalization: "equalisation", + meagerly: "meagrely", + favoritism: "favouritism", + libelous: "libellous", + popularized: "popularised", + armory: "armoury", + humanization: "humanisation", + minuscule: "miniscule", + collectible: "collectable", + tepee: "teepee", + stabilization: "stabilisation", + moldy: "mouldy", + colonize: "colonise", + idealized: "idealised", + meager: "meagre", + armorer: "armourer", + vitalize: "vitalise", + fossilized: "fossilised", + antagonize: "antagonise", + criticize: "criticise", + liter: "litre", + stigmatize: "stigmatise", + theorize: "theorise", + combated: "combatted", + desalination: "desalinisation", + evangelize: "evangelise", + idolization: "idolisation", + smoldering: "smouldering", + commercialization: "commercialisation", + laureled: "laurelled", + hematology: "haematology", + fulfill: "fulfil", + disorganized: "disorganised", + accouterments: "accoutrements", + busses: "buses", + utilize: "utilise", + enroll: "enrol", + goiter: "goitre", + stylized: "stylised", + diarrhea: "diarrhoea", + hypothesize: "hypothesise", + esthetic: "aesthetic", + dishonor: "dishonour", + victualer: "victualler", + paleolithic: "palaeolithic", + sanatorium: "sanitarium", + feminization: "feminisation", + flotation: "floatation", + teetotaler: "teetotaller", + feudalization: "feudalisation", + visualize: "visualise", + fertilize: "fertilise", + czar: "tzar", + nationalization: "nationalisation", + septicemia: "septicaemia", + organizer: "organiser", + recrystallization: "recrystallisation", + dolor: "dolour", + agonizing: "agonising", + romanization: "romanisation", + synchronize: "synchronise", + amorist: "amourist", + agonized: "agonised", + belabor: "belabour", + caster: "castor", + softy: "softie", + apothegm: "apophthegm", + demobilization: "demobilisation", + agonizes: "agonises", + misdemeanor: "misdemeanour", + recognizable: "recognisable", + asshole: "arsehole", + brutalization: "brutalisation", + chamois: "shammy", + clamor: "clamour", + fertilizer: "fertiliser", + deodorization: "deodorisation", + privatization: "privatisation", + tidbit: "titbit", + molding: "moulding", + alleluia: "halleluiah", + canonization: "canonisation", + customize: "customise", + customization: "customisations", + customizer: "customiser", + customizers: "customisers", + customizes: "customises", + customizing: "customising", + popularize: "popularise", + specialty: "speciality", + meagerness: "meagreness", + esophagus: "oesophagus", + millimeter: "millimetre", + harmonization: "harmonisation", + atomizer: "atomiser", + dieresis: "diaeresis", + maneuver: "manoeuvre", + capitalize: "capitalise", + gynecologist: "gynaecologist", + acclimation: "acclimatisation", + generalize: "generalise", + temporize: "temporise", + premunire: "praemunire", + estival: "aestival", + selvage: "selvedge", + brier: "briar", + hyperesthesia: "hyperaesthesia", + maximize: "maximise", + draftsmen: "draughtsmen", + colonization: "colonisation", + capitalization: "capitalisation", + tenia: "taenia", + paleontology: "palaeontology", + libeler: "libeller", + arytenoid: "arytaenoid", + wainscoting: "wainscotting", + globalization: "globalisation", + legalization: "legalisation", + magnetization: "magnetisation", + stabilize: "stabilise", + mesmerized: "mesmerised", + savory: "savoury", + reconnoiter: "reconnoitre", + bastardized: "bastardised", + rancor: "rancour", + checker: "chequer", + industrialization: "industrialisation", + epitomize: "epitomise", + socialize: "socialise", + externalization: "externalisation", + chivy: "chivvy", + optimize: "optimise", + romanize: "romanise", + vulcanize: "vulcanise", + plow: "plough", + memorize: "memorise", + sterilization: "sterilisation", + routing: "routeing", + raveling: "ravelling", + savor: "savour", + harmonize: "harmonise", + cannibalize: "cannibalise", + vaporize: "vaporise", + utilization: "utilisation", + hybridization: "hybridisation", + mechanize: "mechanise", + arbor: "arbour", + arbors: "arbours", + licorice: "liquorice", + counselor: "counsellor", + orthopedic: "orthopaedic", + lusterless: "lustreless", + numskull: "numbskull", + paleozoic: "palaeozoic", + malodor: "malodour", + amenorrhea: "amenorrhoea", + criticized: "criticised", + gonorrhea: "gonorrhoea", + fossilize: "fossilise", + revolutionize: "revolutionise", + woolen: "woollen", + dishabille: "deshabille", + organdy: "organdie", + asses: "arses", + furor: "furore", + paycheck: "paycheque", + pulverize: "pulverise", + dramatization: "dramatisation", + yodeler: "yodeller", + apologize: "apologise", + apologized: "apologised", + blond: "blonde", + oxidize: "oxidise", + extemporize: "extemporise", + whiz: "whizz", + edile: "aedile", + appall: "appal", + legitimize: "legitimise", + urbanization: "urbanisation", + magnetize: "magnetise", + womanize: "womanise", + orthopedics: "orthopaedics", + cognize: "cognise", + christianization: "christianisation", + vocalize: "vocalise", + individualization: "individualisation", + hemoglobin: "haemoglobin", + racket: "racquet", + agonize: "agonise", + aggrandizes: "aggrandises", + accouter: "accoutre", + mollusk: "mollusc", + publicize: "publicise", + fraternization: "fraternisation", + odorless: "odourless", + odor: "odour", + odorous: "odourous", + rationalization: "rationalisation", + pretense: "pretence", + louver: "louvre", + kopeck: "kopek", + lissome: "lissom", + idealization: "idealisation", + nosy: "nosey", + stogie: "stogy", + althea: "althaea", + immobilization: "immobilisation", + majolica: "maiolica", + savior: "saviour", + civilize: "civilise", + granddad: "grandad", + centralization: "centralisation", + localization: "localisation", + evangelization: "evangelisation", + ruble: "rouble", + pajamas: "pyjamas", + sterilize: "sterilise", + math: "maths", + localize: "localise", + hospitalization: "hospitalisation", + scrutinize: "scrutinise", + acclimatization: "acclimatisation", + misbehavior: "misbehaviour", + behavior: "behaviour", + color: "colour", + tire: { britishWord: "tyre", exceptPreviousWords: ["will"] }, + gray: "grey", + grays: "greys", + theater: "theatre", + amphitheater: "amphitheatre", + center: "centre", + realize: "realise", + realizing: "realising", + realization: "realisation", + license: "licence", + mom: "mum", + "mom'l": "mum'll", + favor: "favour", + favors: "favours", + favorites: "favourites", + analyzed: "analysed", + characterized: "characterised", + colored: "coloured", + colors: "colours", + counseling: "counselling", + customized: "customised", + defense: "defence", + offense: "offence", + enrollment: "enrolment", + flavor: "flavour", + flavors: "flavours", + flavoring: "flavouring", + harbor: "harbour", + harbored: "harboured", + honor: "honour", + honors: "honours", + labor: "labour", + licensed: "licenced", + licenses: "licences", + licensing: "licencing", + modeling: "modelling", + optimization: "optimisation", + organization: "organisation", + organizations: "organisations", + organized: "organised", + organizing: "organising", + pediatric: "paediatric", + personalized: "personalised", + practice: "practise", + realized: "realised", + recognize: "recognise", + recognized: "recognised", + specialties: "specialities", + specializing: "specialising", + theaters: "theatres", + travelers: "travellers", + traveler: "traveller", + traveling: "travelling", + authorized: "authorised", + behaviors: "behaviours", + traveled: "travelled", + utilizing: "utilising", + utilized: "utilised", + honored: "honoured", + specializes: "specialises", + practicing: "practising", + signaling: "signalling", + analyzing: "analysing", + recognizes: "recognises", + organizers: "organisers", + visualization: "visualisation", + standardized: "standardised", + favorable: "favourable", + analyzer: "analyser", + recognizing: "recognising", + uncategorized: "uncategorised", + categorized: "categorised", + vapor: "vapour", + synchronization: "synchronisation", + synchronized: "synchronised", + rumors: "rumours", + coloring: "colouring", + honorable: "honourable", + generalized: "generalised", + generalization: "generalisation", + mobilize: "mobilise", + armor: "armour", + armored: "armoured", + labeling: "labelling", + endeavor: "endeavour", + civilized: "civilised", + civilization: "civilisation", + parlor: "parlour", + tranquilize: "tranquilise", + tranquillized: "tranquillised", + tranquillization: "tranquillisation", + catalog: "catalogue", + cataloger: "cataloguer", + cataloging: "cataloguing", + catalogs: "catalogues", + cataloged: "catalogued", + uncataloged: "uncatalogued", + catalogers: "cataloguers", + discolored: "discoloured", + discolor: "discolour", + encyclopedias: "encyclopaedias", + endeavored: "endeavoured", + endeavors: "endeavours", + endeavoring: "endeavouring", + judgments: "judgements", + judgment: "judgement", + paneling: "panelling", + defenses: "defences", + criticizing: "criticising", + mustache: "moustache", + emphasized: "emphasised", + emphasizes: "emphasises", + emphasizing: "emphasising", + fetus: "foetus", + programs: "programmes", + yogurt: "yoghurt", + valor: "valour", + moisturize: "moisturise", + moisturized: "moisturised", + moisturizes: "moisturises", + moisturizing: "moisturising", + favoring: "favouring", + marvelous: "marvellous", + hematuria: "haematuria", + hemoptysis: "haemoptysis", + hemorrhoid: "haemorrhoid", + hemorrhagic: "haemorrhagic", + hypercalcemia: "hypercalcaemia", + hyperglycemia: "hyperglycaemia", + hypoglycemia: "hypoglycaemia", + toxemia: "toxaemia", + hypoxemia: "hypoxaemia", + bacteremia: "bacteraemia", + hypernatremia: "hypernatraemia", + hyponatremia: "hyponatraemia", + leukocytosis: "leucocytosis", + leukocyte: "leucocyte", + leukopenia: "leucopenia", + apnea: "apnoea", + bradypnea: "bradypnoea", + tachypnea: "tachypnoea", + orthopnea: "orthopnoea", + ileocecal: "ileocaecal", + metastasize: "metastasise", + lymphedema: "lymphoedema", + neuron: "neurone", + hemianopsia: "hemianopia", + galactorrhea: "galactorrhoea", + nebulizer: "nebuliser", + paresthesia: "paraesthesia", +}; + +export default britishEnglishReplacements; diff --git a/frontend/src/ts/constants/keys.ts b/frontend/src/ts/constants/keys.ts new file mode 100644 index 000000000000..6875e53d770a --- /dev/null +++ b/frontend/src/ts/constants/keys.ts @@ -0,0 +1,228 @@ +export type Keycode = + | "Backquote" + | "Digit1" + | "Digit2" + | "Digit3" + | "Digit4" + | "Digit5" + | "Digit6" + | "Digit7" + | "Digit8" + | "Digit9" + | "Digit0" + | "Minus" + | "Equal" + | "KeyQ" + | "KeyW" + | "KeyE" + | "KeyR" + | "KeyT" + | "KeyY" + | "KeyU" + | "KeyI" + | "KeyO" + | "KeyP" + | "BracketLeft" + | "BracketRight" + | "Backslash" + | "KeyA" + | "KeyS" + | "KeyD" + | "KeyF" + | "KeyG" + | "KeyH" + | "KeyJ" + | "KeyK" + | "KeyL" + | "Semicolon" + | "Quote" + | "KeyZ" + | "KeyX" + | "KeyC" + | "KeyV" + | "KeyB" + | "KeyN" + | "KeyM" + | "Comma" + | "Period" + | "Slash" + | "Space" + | "ShiftLeft" + | "IntlBackslash" + | "ShiftRight" + | "ArrowUp" + | "ArrowLeft" + | "ArrowDown" + | "ArrowRight" + | "NumpadMultiply" + | "NumpadSubtract" + | "NumpadAdd" + | "NumpadDecimal" + | "NumpadEqual" + | "NumpadDivide" + | "Numpad0" + | "Numpad1" + | "Numpad2" + | "Numpad3" + | "Numpad4" + | "Numpad5" + | "Numpad6" + | "Numpad7" + | "Numpad8" + | "Numpad9" + | "NumpadEnter" + | "Enter" + | "Backspace"; + +export const qwertyKeycodeKeymap: Keycode[][] = [ + [ + "Backquote", + "Digit1", + "Digit2", + "Digit3", + "Digit4", + "Digit5", + "Digit6", + "Digit7", + "Digit8", + "Digit9", + "Digit0", + "Minus", + "Equal", + ], + [ + "KeyQ", + "KeyW", + "KeyE", + "KeyR", + "KeyT", + "KeyY", + "KeyU", + "KeyI", + "KeyO", + "KeyP", + "BracketLeft", + "BracketRight", + "Backslash", + ], + [ + "KeyA", + "KeyS", + "KeyD", + "KeyF", + "KeyG", + "KeyH", + "KeyJ", + "KeyK", + "KeyL", + "Semicolon", + "Quote", + ], + [ + "KeyZ", + "KeyX", + "KeyC", + "KeyV", + "KeyB", + "KeyN", + "KeyM", + "Comma", + "Period", + "Slash", + ], + ["Space"], +]; + +export const leftSideKeys: Set = new Set([ + "Backquote", + "Digit1", + "Digit2", + "Digit3", + "Digit4", + "Digit5", + "Digit6", + + "KeyQ", + "KeyW", + "KeyE", + "KeyR", + "KeyT", + "KeyY", + + "KeyA", + "KeyS", + "KeyD", + "KeyF", + "KeyG", + + "ShiftLeft", + "IntlBackslash", + "KeyZ", + "KeyX", + "KeyC", + "KeyV", + "KeyB", + + "Space", +]); + +export const rightSideKeys: Set = new Set([ + "Digit6", + "Digit7", + "Digit8", + "Digit9", + "Digit0", + "Minus", + "Equal", + "Backspace", + + "KeyY", + "KeyU", + "KeyI", + "KeyO", + "KeyP", + "BracketLeft", + "BracketRight", + "Backslash", + + "KeyH", + "KeyJ", + "KeyK", + "KeyL", + "Semicolon", + "Quote", + "Enter", + + "KeyB", + "KeyN", + "KeyM", + "Comma", + "Period", + "Slash", + "ShiftRight", + + "ArrowUp", + "ArrowLeft", + "ArrowDown", + "ArrowRight", + + "NumpadMultiply", + "NumpadSubtract", + "NumpadAdd", + "NumpadDecimal", + "NumpadEqual", + "NumpadDivide", + "Numpad0", + "Numpad1", + "Numpad2", + "Numpad3", + "Numpad4", + "Numpad5", + "Numpad6", + "Numpad7", + "Numpad8", + "Numpad9", + "NumpadEnter", + + "Space", +]); diff --git a/frontend/src/ts/constants/themes.ts b/frontend/src/ts/constants/themes.ts index 760478636c7b..0bb86f625671 100644 --- a/frontend/src/ts/constants/themes.ts +++ b/frontend/src/ts/constants/themes.ts @@ -1,5 +1,4 @@ import { ThemeName } from "@monkeytype/schemas/configs"; -import { hexToHSL } from "../utils/colors"; import { z } from "zod"; const hexColorSchema = z @@ -2335,11 +2334,3 @@ export const ThemesList: ThemeWithName[] = Object.keys(themes) name: it as ThemeName, }) as Theme & { name: ThemeName }, ); - -export const ThemesListSorted: ThemeWithName[] = [ - ...ThemesList.sort((a, b) => { - const b1 = hexToHSL(a.bg); - const b2 = hexToHSL(b.bg); - return b2.lgt - b1.lgt; - }), -]; diff --git a/frontend/src/ts/utils/typo-list.ts b/frontend/src/ts/constants/typo-list.ts similarity index 100% rename from frontend/src/ts/utils/typo-list.ts rename to frontend/src/ts/constants/typo-list.ts diff --git a/frontend/src/ts/elements/settings/theme-picker.ts b/frontend/src/ts/elements/settings/theme-picker.ts index 4dc6538965e6..93c3a5d89b12 100644 --- a/frontend/src/ts/elements/settings/theme-picker.ts +++ b/frontend/src/ts/elements/settings/theme-picker.ts @@ -14,10 +14,16 @@ import { isAuthenticated } from "../../firebase"; import { getActivePage } from "../../signals/core"; import { ThemeName } from "@monkeytype/schemas/configs"; import { captureException } from "../../sentry"; -import { ColorName, ThemesListSorted } from "../../constants/themes"; +import { ColorName, ThemesList, ThemeWithName } from "../../constants/themes"; import { qs, qsa, qsr } from "../../utils/dom"; import { getTheme, updateThemeColor } from "../../signals/theme"; +export const sortedThemes: ThemeWithName[] = [...ThemesList].sort((a, b) => { + const b1 = Colors.hexToHSL(a.bg); + const b2 = Colors.hexToHSL(b.bg); + return b2.lgt - b1.lgt; +}); + function updateActiveButton(): void { let activeThemeName: string = Config.theme; if ( @@ -85,7 +91,7 @@ export async function fillPresetButtons(): Promise { activeThemeName = ThemeController.randomTheme; } - const themes = ThemesListSorted; + const themes = sortedThemes; //first show favourites if (Config.favThemes.length > 0) { diff --git a/frontend/src/ts/input/handlers/keydown.ts b/frontend/src/ts/input/handlers/keydown.ts index 647c55cadad1..4eabb48b2258 100644 --- a/frontend/src/ts/input/handlers/keydown.ts +++ b/frontend/src/ts/input/handlers/keydown.ts @@ -26,6 +26,7 @@ import { getActiveFunboxesWithFunction, getActiveFunboxNames, } from "../../test/funbox/list"; +import { Keycode } from "../../constants/keys"; export async function handleTab(e: KeyboardEvent, now: number): Promise { if (Config.quickRestart === "tab") { @@ -122,7 +123,7 @@ export async function handleOppositeShift(event: KeyboardEvent): Promise { ); } else { setCorrectShiftUsed( - ShiftTracker.isUsingOppositeShift(event.code as KeyConverter.Keycode), + ShiftTracker.isUsingOppositeShift(event.code as Keycode), ); } } diff --git a/frontend/src/ts/pages/login.ts b/frontend/src/ts/pages/login.ts index d546b02409fd..299bba8ddb5f 100644 --- a/frontend/src/ts/pages/login.ts +++ b/frontend/src/ts/pages/login.ts @@ -1,7 +1,7 @@ import Ape from "../ape"; import Page from "./page"; import * as Skeleton from "../utils/skeleton"; -import TypoList from "../utils/typo-list"; +import TypoList from "../constants/typo-list"; import { PasswordSchema, UserEmailSchema, diff --git a/frontend/src/ts/test/british-english.ts b/frontend/src/ts/test/british-english.ts index 4c7c51a4948d..3875d82e3bb8 100644 --- a/frontend/src/ts/test/british-english.ts +++ b/frontend/src/ts/test/british-english.ts @@ -1,686 +1,7 @@ import Config from "../config"; +import britishEnglishReplacements from "../constants/british-english"; import { capitalizeFirstLetterOfEachWord } from "../utils/strings"; -type ExceptionRule = { britishWord: string; exceptPreviousWords: string[] }; -type BritishEnglishReplacements = Record< - string /*EnglishWord*/, - string /*BritishWord*/ | ExceptionRule ->; -const replacementRules: BritishEnglishReplacements = { - laborers: "labourers", - industrialized: "industrialised", - acclimatizing: "acclimatising", - acclimatized: "acclimatised", - behoove: "behove", - reorganization: "reorganisation", - galvanize: "galvanise", - demagogism: "demagoguism", - canceled: "cancelled", - baptize: "baptise", - revitalize: "revitalise", - skeptical: "sceptical", - piscine: "piscinae", - ionization: "ionisation", - chili: "chilli", - dexterous: "dextrous", - likable: "likeable", - neutralize: "neutralise", - meter: "metre", - meters: "metres", - centimeter: "centimetre", - hurrah: "hooray", - multicolor: "multicolour", - actualization: "actualisation", - fertilizing: "fertilising", - enamor: "enamour", - skepticism: "scepticism", - authorize: "authorise", - minimize: "minimise", - bandoleer: "bandolier", - rigor: "rigour", - fledgling: "fledgeling", - mesquite: "mesquit", - fogy: "fogey", - characterize: "characterise", - wagonette: "waggonette", - plagiarize: "plagiarise", - kilometers: "kilometres", - molt: "moult", - leveler: "leveller", - checkered: "chequered", - vendor: "vender", - candor: "candour", - moralize: "moralise", - denationalization: "denationalisation", - anemia: "anaemia", - caiman: "cayman", - chitterlings: "chitlins", - acclimated: "acclimatised", - acclimate: "acclimatise", - skillful: "skilful", - enamored: "enamoured", - watercolor: "watercolour", - extemporization: "extemporisation", - lackluster: "lacklustre", - equalizer: "equaliser", - cipher: "cypher", - polarization: "polarisation", - polymerization: "polymerisation", - ionize: "ionise", - anesthetic: "anaesthetic", - aerie: "eyrie", - lachrymal: "lacrimal", - decimeter: "decimetre", - rajah: "raja", - modernize: "modernise", - gasoline: "petrol", - alphabetized: "alphabetised", - saber: "sabre", - burglarize: "burglarise", - terrorize: "terrorise", - enthrall: "enthral", - mustachioed: "moustachioed", - anesthesia: "anaesthesia", - sepulcher: "sepulchre", - caftan: "kaftan", - organize: "organise", - manikin: "mannikin", - dexterously: "dextrously", - artifact: "artefact", - kilometer: "kilometre", - mommy: "mummy", - brant: "brent", - hyena: "hyaena", - fuze: "fuse", - victimize: "victimise", - jihad: "jehad", - airplane: "aeroplane", - laborer: "labourer", - vaporware: "vapourware", - worshiped: "worshipped", - taboret: "tabouret", - rationalize: "rationalise", - whimsy: "whimsey", - scandalize: "scandalise", - categorization: "categorisation", - centered: "centred", - kerosene: "kerosine", - specialize: "specialise", - specialized: "specialised", - cicatrix: "cicatrice", - jailer: "jailor", - unfavorable: "unfavourable", - guerrilla: "guerilla", - emphasize: "emphasise", - wacky: "whacky", - ionizing: "ionising", - czarina: "tzarina", - ratline: "ratlin", - abolitionize: "abolitionise", - subsidize: "subsidise", - plowing: "ploughing", - untrammeled: "untrammelled", - worshiping: "worshipping", - memorization: "memorisation", - anglicize: "anglicise", - finalize: "finalise", - gases: "gasses", - fertilization: "fertilisation", - libeling: "libelling", - kinesthetic: "kinaesthetic", - immunization: "immunisation", - coloration: "colouration", - overdraft: "overdraught", - lambaste: "lambast", - unpasteurized: "unpasteurised", - ascendance: "ascendence", - jeweler: "jeweller", - fervor: "fervour", - jeopardize: "jeopardise", - abridgment: "abridgement", - monopolize: "monopolise", - colorless: "colourless", - colorlessness: "colourlessness", - tumors: "tumours", - jinni: "jinn", - aluminum: "aluminium", - salable: "saleable", - bronco: "broncho", - lupine: "lupin", - linchpin: "lynchpin", - mesmerize: "mesmerise", - internationalization: "internationalisation", - anapestic: "anapaestic", - supersede: "supercede", - europeanize: "europeanise", - optimized: "optimised", - botanize: "botanise", - organizational: "organisational", - heme: "haem", - estivation: "aestivation", - edema: "oedema", - penalize: "penalise", - peddler: "pedlar", - biased: "biassed", - aggrandize: "aggrandise", - rationalizing: "rationalising", - deputize: "deputise", - centers: "centres", - unicolor: "unicolour", - hypnotized: "hypnotised", - anglicized: "anglicised", - initialization: "initialisation", - topee: "topi", - nightie: "nighty", - tricolor: "tricolour", - reorganize: "reorganise", - barbecue: "barbeque", - fertilized: "fertilised", - synthesize: "synthesise", - economize: "economise", - colter: "coulter", - paleontologist: "palaeontologist", - acclimatize: "acclimatise", - idealize: "idealise", - fossilization: "fossilisation", - lionize: "lionise", - acclimating: "acclimatising", - luster: "lustre", - demeanor: "demeanour", - unauthorized: "unauthorised", - smolder: "smoulder", - abettor: "abetter", - jewelry: "jewellery", - demoralization: "demoralisation", - fullness: "fulness", - neighbored: "neighboured", - neighbor: "neighbour", - neighbors: "neighbours", - neighboring: "neighbouring", - neighborly: "neighbourly", - neighborhood: "neighbourhood", - neighborhoods: "neighbourhoods", - magnetizer: "magnetiser", - appetizer: "appetiser", - hebraizing: "hebraising", - carbonization: "carbonisation", - favorably: "favourably", - favorite: "favourite", - behavioral: "behavioural", - cognizant: "cognisant", - skeptic: "sceptic", - fiber: "fibre", - fibers: "fibres", - labeled: "labelled", - analyze: "analyse", - disorganization: "disorganisation", - concenter: "concentre", - categorize: "categorise", - novelization: "novelisation", - proselytize: "proselytise", - draftsman: "draughtsman", - paralyze: "paralyse", - ostracize: "ostracise", - italicize: "italicise", - micrometer: "micrometre", - cognizance: "cognisance", - saltpeter: "saltpetre", - conceptualization: "conceptualisation", - containerization: "containerisation", - anapest: "anapaest", - leukemia: "leukaemia", - omelet: "omelette", - industrialize: "industrialise", - characterization: "characterisation", - amortize: "amortise", - mazurka: "mazourka", - macadamize: "macadamise", - stymie: "stymy", - analog: "analogue", - prizer: "priser", - cauterize: "cauterise", - dysmenorrhea: "dysmenorrhoea", - hippie: "hippy", - mechanization: "mechanisation", - commercialize: "commercialise", - unsavory: "unsavoury", - somber: "sombre", - esophageal: "oesophageal", - iodized: "iodised", - tyrannize: "tyrannise", - liberalize: "liberalise", - computerization: "computerisation", - synthesizer: "synthesiser", - fertilizes: "fertilises", - airdrome: "aerodrome", - uncivilized: "uncivilised", - mold: "mould", - nitrogenized: "nitrogenised", - legalize: "legalise", - tantalize: "tantalise", - eulogize: "eulogise", - depolarization: "depolarisation", - fecal: "faecal", - bastardize: "bastardise", - summarize: "summarise", - cony: "coney", - authorization: "authorisation", - colorful: "colourful", - temporized: "temporised", - adviser: "advisor", - tendinitis: "tendonitis", - crystallization: "crystallisation", - humor: "humour", - humorous: "humourous", - chanty: "shanty", - dyspnea: "dyspnoea", - aging: "ageing", - mousy: "mousey", - succor: "succour", - distill: "distil", - decentralization: "decentralisation", - cauterization: "cauterisation", - specter: "spectre", - snowplow: "snowplough", - pediatrics: "paediatrics", - discoloration: "discolouration", - tumor: "tumour", - empathize: "empathise", - pawpaw: "papaya", - aggrandizement: "aggrandisement", - fontanel: "fontanelle", - brunet: "brunette", - rumor: "rumour", - epaulet: "epaulette", - glycerin: "glycerine", - fraternize: "fraternise", - latinize: "latinise", - sniveling: "snivelling", - pasteurize: "pasteurise", - modernization: "modernisation", - patronize: "patronise", - totaled: "totalled", - normalization: "normalisation", - niter: "nitre", - shoveler: "shoveller", - flier: "flyer", - equalization: "equalisation", - meagerly: "meagrely", - favoritism: "favouritism", - libelous: "libellous", - popularized: "popularised", - armory: "armoury", - humanization: "humanisation", - minuscule: "miniscule", - collectible: "collectable", - tepee: "teepee", - stabilization: "stabilisation", - moldy: "mouldy", - colonize: "colonise", - idealized: "idealised", - meager: "meagre", - armorer: "armourer", - vitalize: "vitalise", - fossilized: "fossilised", - antagonize: "antagonise", - criticize: "criticise", - liter: "litre", - stigmatize: "stigmatise", - theorize: "theorise", - combated: "combatted", - desalination: "desalinisation", - evangelize: "evangelise", - idolization: "idolisation", - smoldering: "smouldering", - commercialization: "commercialisation", - laureled: "laurelled", - hematology: "haematology", - fulfill: "fulfil", - disorganized: "disorganised", - accouterments: "accoutrements", - busses: "buses", - utilize: "utilise", - enroll: "enrol", - goiter: "goitre", - stylized: "stylised", - diarrhea: "diarrhoea", - hypothesize: "hypothesise", - esthetic: "aesthetic", - dishonor: "dishonour", - victualer: "victualler", - paleolithic: "palaeolithic", - sanatorium: "sanitarium", - feminization: "feminisation", - flotation: "floatation", - teetotaler: "teetotaller", - feudalization: "feudalisation", - visualize: "visualise", - fertilize: "fertilise", - czar: "tzar", - nationalization: "nationalisation", - septicemia: "septicaemia", - organizer: "organiser", - recrystallization: "recrystallisation", - dolor: "dolour", - agonizing: "agonising", - romanization: "romanisation", - synchronize: "synchronise", - amorist: "amourist", - agonized: "agonised", - belabor: "belabour", - caster: "castor", - softy: "softie", - apothegm: "apophthegm", - demobilization: "demobilisation", - agonizes: "agonises", - misdemeanor: "misdemeanour", - recognizable: "recognisable", - asshole: "arsehole", - brutalization: "brutalisation", - chamois: "shammy", - clamor: "clamour", - fertilizer: "fertiliser", - deodorization: "deodorisation", - privatization: "privatisation", - tidbit: "titbit", - molding: "moulding", - alleluia: "halleluiah", - canonization: "canonisation", - customize: "customise", - customization: "customisations", - customizer: "customiser", - customizers: "customisers", - customizes: "customises", - customizing: "customising", - popularize: "popularise", - specialty: "speciality", - meagerness: "meagreness", - esophagus: "oesophagus", - millimeter: "millimetre", - harmonization: "harmonisation", - atomizer: "atomiser", - dieresis: "diaeresis", - maneuver: "manoeuvre", - capitalize: "capitalise", - gynecologist: "gynaecologist", - acclimation: "acclimatisation", - generalize: "generalise", - temporize: "temporise", - premunire: "praemunire", - estival: "aestival", - selvage: "selvedge", - brier: "briar", - hyperesthesia: "hyperaesthesia", - maximize: "maximise", - draftsmen: "draughtsmen", - colonization: "colonisation", - capitalization: "capitalisation", - tenia: "taenia", - paleontology: "palaeontology", - libeler: "libeller", - arytenoid: "arytaenoid", - wainscoting: "wainscotting", - globalization: "globalisation", - legalization: "legalisation", - magnetization: "magnetisation", - stabilize: "stabilise", - mesmerized: "mesmerised", - savory: "savoury", - reconnoiter: "reconnoitre", - bastardized: "bastardised", - rancor: "rancour", - checker: "chequer", - industrialization: "industrialisation", - epitomize: "epitomise", - socialize: "socialise", - externalization: "externalisation", - chivy: "chivvy", - optimize: "optimise", - romanize: "romanise", - vulcanize: "vulcanise", - plow: "plough", - memorize: "memorise", - sterilization: "sterilisation", - routing: "routeing", - raveling: "ravelling", - savor: "savour", - harmonize: "harmonise", - cannibalize: "cannibalise", - vaporize: "vaporise", - utilization: "utilisation", - hybridization: "hybridisation", - mechanize: "mechanise", - arbor: "arbour", - arbors: "arbours", - licorice: "liquorice", - counselor: "counsellor", - orthopedic: "orthopaedic", - lusterless: "lustreless", - numskull: "numbskull", - paleozoic: "palaeozoic", - malodor: "malodour", - amenorrhea: "amenorrhoea", - criticized: "criticised", - gonorrhea: "gonorrhoea", - fossilize: "fossilise", - revolutionize: "revolutionise", - woolen: "woollen", - dishabille: "deshabille", - organdy: "organdie", - asses: "arses", - furor: "furore", - paycheck: "paycheque", - pulverize: "pulverise", - dramatization: "dramatisation", - yodeler: "yodeller", - apologize: "apologise", - apologized: "apologised", - blond: "blonde", - oxidize: "oxidise", - extemporize: "extemporise", - whiz: "whizz", - edile: "aedile", - appall: "appal", - legitimize: "legitimise", - urbanization: "urbanisation", - magnetize: "magnetise", - womanize: "womanise", - orthopedics: "orthopaedics", - cognize: "cognise", - christianization: "christianisation", - vocalize: "vocalise", - individualization: "individualisation", - hemoglobin: "haemoglobin", - racket: "racquet", - agonize: "agonise", - aggrandizes: "aggrandises", - accouter: "accoutre", - mollusk: "mollusc", - publicize: "publicise", - fraternization: "fraternisation", - odorless: "odourless", - odor: "odour", - odorous: "odourous", - rationalization: "rationalisation", - pretense: "pretence", - louver: "louvre", - kopeck: "kopek", - lissome: "lissom", - idealization: "idealisation", - nosy: "nosey", - stogie: "stogy", - althea: "althaea", - immobilization: "immobilisation", - majolica: "maiolica", - savior: "saviour", - civilize: "civilise", - granddad: "grandad", - centralization: "centralisation", - localization: "localisation", - evangelization: "evangelisation", - ruble: "rouble", - pajamas: "pyjamas", - sterilize: "sterilise", - math: "maths", - localize: "localise", - hospitalization: "hospitalisation", - scrutinize: "scrutinise", - acclimatization: "acclimatisation", - misbehavior: "misbehaviour", - behavior: "behaviour", - color: "colour", - tire: { britishWord: "tyre", exceptPreviousWords: ["will"] }, - gray: "grey", - grays: "greys", - theater: "theatre", - amphitheater: "amphitheatre", - center: "centre", - realize: "realise", - realizing: "realising", - realization: "realisation", - license: "licence", - mom: "mum", - "mom'l": "mum'll", - favor: "favour", - favors: "favours", - favorites: "favourites", - analyzed: "analysed", - characterized: "characterised", - colored: "coloured", - colors: "colours", - counseling: "counselling", - customized: "customised", - defense: "defence", - offense: "offence", - enrollment: "enrolment", - flavor: "flavour", - flavors: "flavours", - flavoring: "flavouring", - harbor: "harbour", - harbored: "harboured", - honor: "honour", - honors: "honours", - labor: "labour", - licensed: "licenced", - licenses: "licences", - licensing: "licencing", - modeling: "modelling", - optimization: "optimisation", - organization: "organisation", - organizations: "organisations", - organized: "organised", - organizing: "organising", - pediatric: "paediatric", - personalized: "personalised", - practice: "practise", - realized: "realised", - recognize: "recognise", - recognized: "recognised", - specialties: "specialities", - specializing: "specialising", - theaters: "theatres", - travelers: "travellers", - traveler: "traveller", - traveling: "travelling", - authorized: "authorised", - behaviors: "behaviours", - traveled: "travelled", - utilizing: "utilising", - utilized: "utilised", - honored: "honoured", - specializes: "specialises", - practicing: "practising", - signaling: "signalling", - analyzing: "analysing", - recognizes: "recognises", - organizers: "organisers", - visualization: "visualisation", - standardized: "standardised", - favorable: "favourable", - analyzer: "analyser", - recognizing: "recognising", - uncategorized: "uncategorised", - categorized: "categorised", - vapor: "vapour", - synchronization: "synchronisation", - synchronized: "synchronised", - rumors: "rumours", - coloring: "colouring", - honorable: "honourable", - generalized: "generalised", - generalization: "generalisation", - mobilize: "mobilise", - armor: "armour", - armored: "armoured", - labeling: "labelling", - endeavor: "endeavour", - civilized: "civilised", - civilization: "civilisation", - parlor: "parlour", - tranquilize: "tranquilise", - tranquillized: "tranquillised", - tranquillization: "tranquillisation", - catalog: "catalogue", - cataloger: "cataloguer", - cataloging: "cataloguing", - catalogs: "catalogues", - cataloged: "catalogued", - uncataloged: "uncatalogued", - catalogers: "cataloguers", - discolored: "discoloured", - discolor: "discolour", - encyclopedias: "encyclopaedias", - endeavored: "endeavoured", - endeavors: "endeavours", - endeavoring: "endeavouring", - judgments: "judgements", - judgment: "judgement", - paneling: "panelling", - defenses: "defences", - criticizing: "criticising", - mustache: "moustache", - emphasized: "emphasised", - emphasizes: "emphasises", - emphasizing: "emphasising", - fetus: "foetus", - programs: "programmes", - yogurt: "yoghurt", - valor: "valour", - moisturize: "moisturise", - moisturized: "moisturised", - moisturizes: "moisturises", - moisturizing: "moisturising", - favoring: "favouring", - marvelous: "marvellous", - hematuria: "haematuria", - hemoptysis: "haemoptysis", - hemorrhoid: "haemorrhoid", - hemorrhagic: "haemorrhagic", - hypercalcemia: "hypercalcaemia", - hyperglycemia: "hyperglycaemia", - hypoglycemia: "hypoglycaemia", - toxemia: "toxaemia", - hypoxemia: "hypoxaemia", - bacteremia: "bacteraemia", - hypernatremia: "hypernatraemia", - hyponatremia: "hyponatraemia", - leukocytosis: "leucocytosis", - leukocyte: "leucocyte", - leukopenia: "leucopenia", - apnea: "apnoea", - bradypnea: "bradypnoea", - tachypnea: "tachypnoea", - orthopnea: "orthopnoea", - ileocecal: "ileocaecal", - metastasize: "metastasise", - lymphedema: "lymphoedema", - neuron: "neurone", - hemianopsia: "hemianopia", - galactorrhea: "galactorrhoea", - nebulizer: "nebuliser", - paresthesia: "paraesthesia", -}; - export async function replace( word: string, previousWord: string, @@ -700,10 +21,15 @@ export async function replace( ).join("-"); } else { const cleanedWord = word.replace(/^[\W]+|[\W]+$/g, "").toLowerCase(); - if (!Object.prototype.hasOwnProperty.call(replacementRules, cleanedWord)) { + if ( + !Object.prototype.hasOwnProperty.call( + britishEnglishReplacements, + cleanedWord, + ) + ) { return word; } - const rule = replacementRules[cleanedWord]; + const rule = britishEnglishReplacements[cleanedWord]; if (rule === undefined) return word; diff --git a/frontend/src/ts/test/monkey.ts b/frontend/src/ts/test/monkey.ts index 17a19ba8adab..713b8002f1ce 100644 --- a/frontend/src/ts/test/monkey.ts +++ b/frontend/src/ts/test/monkey.ts @@ -4,6 +4,7 @@ import * as ConfigEvent from "../observables/config-event"; import * as TestState from "../test/test-state"; import * as KeyConverter from "../utils/key-converter"; import { qs } from "../utils/dom"; +import { Keycode } from "../constants/keys"; const monkeyEl = qs("#monkey"); const monkeyFastEl = qs("#monkey .fast"); @@ -63,7 +64,7 @@ export function type(event: KeyboardEvent): void { if (!Config.monkey) return; const { leftSide, rightSide } = KeyConverter.keycodeToKeyboardSide( - event.code as KeyConverter.Keycode, + event.code as Keycode, ); if (leftSide && rightSide) { // if its a middle key handle special case @@ -101,7 +102,7 @@ export function stop(event: KeyboardEvent): void { if (!Config.monkey) return; const { leftSide, rightSide } = KeyConverter.keycodeToKeyboardSide( - event.code as KeyConverter.Keycode, + event.code as Keycode, ); if (leftSide && rightSide) { // if middle key handle special case diff --git a/frontend/src/ts/test/shift-tracker.ts b/frontend/src/ts/test/shift-tracker.ts index 90a7feea29a5..9e9120e21c37 100644 --- a/frontend/src/ts/test/shift-tracker.ts +++ b/frontend/src/ts/test/shift-tracker.ts @@ -1,4 +1,5 @@ import Config from "../config"; +import { Keycode } from "../constants/keys"; import * as KeyConverter from "../utils/key-converter"; export let leftState = false; @@ -26,7 +27,7 @@ export function reset(): void { rightState = false; } -export function isUsingOppositeShift(keycode: KeyConverter.Keycode): boolean { +export function isUsingOppositeShift(keycode: Keycode): boolean { if (!leftState && !rightState) { return true; } diff --git a/frontend/src/ts/utils/key-converter.ts b/frontend/src/ts/utils/key-converter.ts index 328f0f144700..69f96220a6ed 100644 --- a/frontend/src/ts/utils/key-converter.ts +++ b/frontend/src/ts/utils/key-converter.ts @@ -1,233 +1,10 @@ import { LayoutObject } from "@monkeytype/schemas/layouts"; - -export type Keycode = - | "Backquote" - | "Digit1" - | "Digit2" - | "Digit3" - | "Digit4" - | "Digit5" - | "Digit6" - | "Digit7" - | "Digit8" - | "Digit9" - | "Digit0" - | "Minus" - | "Equal" - | "KeyQ" - | "KeyW" - | "KeyE" - | "KeyR" - | "KeyT" - | "KeyY" - | "KeyU" - | "KeyI" - | "KeyO" - | "KeyP" - | "BracketLeft" - | "BracketRight" - | "Backslash" - | "KeyA" - | "KeyS" - | "KeyD" - | "KeyF" - | "KeyG" - | "KeyH" - | "KeyJ" - | "KeyK" - | "KeyL" - | "Semicolon" - | "Quote" - | "KeyZ" - | "KeyX" - | "KeyC" - | "KeyV" - | "KeyB" - | "KeyN" - | "KeyM" - | "Comma" - | "Period" - | "Slash" - | "Space" - | "ShiftLeft" - | "IntlBackslash" - | "ShiftRight" - | "ArrowUp" - | "ArrowLeft" - | "ArrowDown" - | "ArrowRight" - | "NumpadMultiply" - | "NumpadSubtract" - | "NumpadAdd" - | "NumpadDecimal" - | "NumpadEqual" - | "NumpadDivide" - | "Numpad0" - | "Numpad1" - | "Numpad2" - | "Numpad3" - | "Numpad4" - | "Numpad5" - | "Numpad6" - | "Numpad7" - | "Numpad8" - | "Numpad9" - | "NumpadEnter" - | "Enter" - | "Backspace"; - -const qwertyKeycodeKeymap: Keycode[][] = [ - [ - "Backquote", - "Digit1", - "Digit2", - "Digit3", - "Digit4", - "Digit5", - "Digit6", - "Digit7", - "Digit8", - "Digit9", - "Digit0", - "Minus", - "Equal", - ], - [ - "KeyQ", - "KeyW", - "KeyE", - "KeyR", - "KeyT", - "KeyY", - "KeyU", - "KeyI", - "KeyO", - "KeyP", - "BracketLeft", - "BracketRight", - "Backslash", - ], - [ - "KeyA", - "KeyS", - "KeyD", - "KeyF", - "KeyG", - "KeyH", - "KeyJ", - "KeyK", - "KeyL", - "Semicolon", - "Quote", - ], - [ - "KeyZ", - "KeyX", - "KeyC", - "KeyV", - "KeyB", - "KeyN", - "KeyM", - "Comma", - "Period", - "Slash", - ], - ["Space"], -]; - -const leftSideKeys: Set = new Set([ - "Backquote", - "Digit1", - "Digit2", - "Digit3", - "Digit4", - "Digit5", - "Digit6", - - "KeyQ", - "KeyW", - "KeyE", - "KeyR", - "KeyT", - "KeyY", - - "KeyA", - "KeyS", - "KeyD", - "KeyF", - "KeyG", - - "ShiftLeft", - "IntlBackslash", - "KeyZ", - "KeyX", - "KeyC", - "KeyV", - "KeyB", - - "Space", -]); - -const rightSideKeys: Set = new Set([ - "Digit6", - "Digit7", - "Digit8", - "Digit9", - "Digit0", - "Minus", - "Equal", - "Backspace", - - "KeyY", - "KeyU", - "KeyI", - "KeyO", - "KeyP", - "BracketLeft", - "BracketRight", - "Backslash", - - "KeyH", - "KeyJ", - "KeyK", - "KeyL", - "Semicolon", - "Quote", - "Enter", - - "KeyB", - "KeyN", - "KeyM", - "Comma", - "Period", - "Slash", - "ShiftRight", - - "ArrowUp", - "ArrowLeft", - "ArrowDown", - "ArrowRight", - - "NumpadMultiply", - "NumpadSubtract", - "NumpadAdd", - "NumpadDecimal", - "NumpadEqual", - "NumpadDivide", - "Numpad0", - "Numpad1", - "Numpad2", - "Numpad3", - "Numpad4", - "Numpad5", - "Numpad6", - "Numpad7", - "Numpad8", - "Numpad9", - "NumpadEnter", - - "Space", -]); +import { + Keycode, + leftSideKeys, + qwertyKeycodeKeymap, + rightSideKeys, +} from "../constants/keys"; /** * Converts a key to a keycode based on a layout diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 12ec8107af79..4438746fffa8 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -263,6 +263,10 @@ function getBuildOptions({ name: "vendor-chart", test: /node_modules\/chart/, }, + { + name: "monkeytype-constants", + test: /src\/ts\/constants\//, + }, { name: "vendor", test: /node_modules\//, From 73e9a6aa42a88de79679bee00e95aa5c7542d7fe Mon Sep 17 00:00:00 2001 From: Miodec Date: Sun, 15 Mar 2026 13:28:40 +0100 Subject: [PATCH 07/10] chore: update purge cf cache script --- packages/release/bin/purgeCfCache.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/release/bin/purgeCfCache.sh b/packages/release/bin/purgeCfCache.sh index eadb48c5d0ae..fa5816399c09 100755 --- a/packages/release/bin/purgeCfCache.sh +++ b/packages/release/bin/purgeCfCache.sh @@ -12,7 +12,7 @@ response=$(curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ -H "Content-Type: application/json" \ --data '{"purge_everything":true}') -success=$(echo "$response" | grep -o '"success": true') +success=$(echo "$response" | grep -o '"success"\s*:\s*true') if [ "$success" ]; then echo "Cache purged successfully." From 50f95c5de9b5152d83591d1796983100c94c1ebd Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sun, 15 Mar 2026 14:44:58 +0200 Subject: [PATCH 08/10] fix(favorite-quote): favorite quote button isn't hidden in result screen when logged out (@Leonabcd123) (#7649) --- frontend/src/html/pages/test-result.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/frontend/src/html/pages/test-result.html b/frontend/src/html/pages/test-result.html index f40f5a3a80f8..469f6617104c 100644 --- a/frontend/src/html/pages/test-result.html +++ b/frontend/src/html/pages/test-result.html @@ -107,7 +107,6 @@ class="textButton hidden" aria-label="Report quote" data-balloon-pos="up" - style="display: inline-block" > @@ -116,7 +115,6 @@ class="textButton hidden" aria-label="Favorite quote" data-balloon-pos="up" - style="display: inline-block" > From 01c986f9a22c1b0a619be5e178d51645db31aa5a Mon Sep 17 00:00:00 2001 From: Miodec Date: Sun, 15 Mar 2026 13:41:42 +0100 Subject: [PATCH 09/10] chore: remove test logic dependency from solidjs code --- frontend/src/ts/components/layout/header/Logo.tsx | 9 ++++++--- frontend/src/ts/components/layout/header/Nav.tsx | 9 ++++++--- frontend/src/ts/signals/core.ts | 3 +++ frontend/src/ts/test/test-logic.ts | 5 ++++- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/frontend/src/ts/components/layout/header/Logo.tsx b/frontend/src/ts/components/layout/header/Logo.tsx index b2dc7c1821fc..f5af622a9425 100644 --- a/frontend/src/ts/components/layout/header/Logo.tsx +++ b/frontend/src/ts/components/layout/header/Logo.tsx @@ -1,7 +1,10 @@ import { JSXElement } from "solid-js"; -import { getActivePage, getFocus } from "../../../signals/core"; -import { restart } from "../../../test/test-logic"; +import { + dispatchRestartTest, + getActivePage, + getFocus, +} from "../../../signals/core"; import { cn } from "../../../utils/cn"; import { isDevEnvironment } from "../../../utils/env"; @@ -18,7 +21,7 @@ export function Logo(): JSXElement { }} data-ui-element="logo" onClick={() => { - if (getActivePage() === "test") restart(); + if (getActivePage() === "test") dispatchRestartTest(); }} > { - if (getActivePage() === "test") restart(); + if (getActivePage() === "test") dispatchRestartTest(); }} />