{projectData?.status && projectData?.status !== "complete" && (
diff --git a/src/components/SubPage.jsx b/src/components/SubPage.jsx
index 2b9f42c..cab5ecb 100644
--- a/src/components/SubPage.jsx
+++ b/src/components/SubPage.jsx
@@ -61,13 +61,17 @@ export default function SubPage({
const skipAnimationClass = skipAnimation ? "tb-skip-animation" : "";
+ const capturedPosition = capturedMousePositionRef.current;
+ const transformOrigin =
+ capturedPosition && (capturedPosition.x !== 0 || capturedPosition.y !== 0)
+ ? `${capturedPosition.x}px ${capturedPosition.y}px`
+ : "center center";
+
return (
{/* Full height panel */}
diff --git a/src/components/Video.jsx b/src/components/Video.jsx
index 15bd7d0..88e65cd 100644
--- a/src/components/Video.jsx
+++ b/src/components/Video.jsx
@@ -1,5 +1,6 @@
import PropTypes from "prop-types";
import { useEffect, useMemo, useRef, useState, useCallback } from "react";
+import { useContent } from "../contexts/ContentContext";
import { useVideoContext } from "../contexts/VideoContext";
import LoadingIcon from "../icons/LoadingIcon";
import FullScreenIcon from "../icons/FullScreenIcon";
@@ -14,8 +15,15 @@ import Volume2Icon from "../icons/Volume2Icon";
import Volume3Icon from "../icons/Volume3Icon";
import MuteIcon from "../icons/MuteIcon";
-const Video = ({ src, mirrorUrl = null, className, poster, ...props }) => {
+const Video = ({
+ src,
+ className,
+ poster,
+ mirrorUrl: mirrorUrlProp,
+ ...props
+}) => {
const { videoStates, loadVideo, getVideoUrl } = useVideoContext();
+ const { contentObject } = useContent();
const containerRef = useRef(null);
const videoRef = useRef(null);
@@ -50,6 +58,22 @@ const Video = ({ src, mirrorUrl = null, className, poster, ...props }) => {
const [isFullscreen, setIsFullscreen] = useState(false);
const currentVideoState = src ? videoStates[src] : null;
+ const videosList = useMemo(
+ () => (Array.isArray(contentObject?.videos) ? contentObject.videos : null),
+ [contentObject]
+ );
+ const mirrorUrl = useMemo(() => {
+ if (mirrorUrlProp) {
+ return mirrorUrlProp;
+ }
+ if (!src || !videosList) {
+ return null;
+ }
+ const matchedVideo = videosList.find((videoItem) => videoItem?.url === src);
+ console.log("matchedVideo", matchedVideo);
+ console.log("url", src);
+ return matchedVideo?.mirrorUrl || null;
+ }, [mirrorUrlProp, src, videosList]);
const objectUrl = useMemo(
() => (src ? getVideoUrl(src) : null),
[getVideoUrl, src]
diff --git a/src/contexts/BlogsContext.jsx b/src/contexts/BlogsContext.jsx
deleted file mode 100644
index 720deb7..0000000
--- a/src/contexts/BlogsContext.jsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import PropTypes from "prop-types";
-import { createContext, useContext, useState, useEffect } from "react";
-
-// Create context
-const BlogsContext = createContext({
- blogs: [],
- setBlogs: () => {},
-});
-
-// Provider
-export const BlogsProvider = ({ children, initialBlogs = [] }) => {
- const [blogs, setBlogs] = useState(initialBlogs);
-
- // Update blogs whenever initialBlogs changes
- useEffect(() => {
- if (initialBlogs && initialBlogs.length > 0) {
- setBlogs(initialBlogs);
- }
- }, [initialBlogs]);
-
- return (
-
- {children}
-
- );
-};
-
-BlogsProvider.propTypes = {
- children: PropTypes.any,
- initialBlogs: PropTypes.array,
-};
-
-// Hook for consuming
-export const useBlogs = () => useContext(BlogsContext);
diff --git a/src/contexts/CompaniesContext.jsx b/src/contexts/CompaniesContext.jsx
deleted file mode 100644
index 4bb7eab..0000000
--- a/src/contexts/CompaniesContext.jsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import PropTypes from "prop-types";
-import { createContext, useContext, useState, useEffect } from "react";
-
-// Create context
-const CompaniesContext = createContext({
- companies: [],
- setCompanies: () => {},
-});
-
-// Provider
-export const CompaniesProvider = ({ children, initialCompanies = [] }) => {
- const [companies, setCompanies] = useState(initialCompanies);
-
- // Update companies whenever initialCompanies changes
- useEffect(() => {
- if (initialCompanies && initialCompanies.length > 0) {
- setCompanies(initialCompanies);
- }
- }, [initialCompanies]);
-
- return (
-
- {children}
-
- );
-};
-
-CompaniesProvider.propTypes = {
- children: PropTypes.any,
- initialCompanies: PropTypes.array,
-};
-
-// Hook for consuming
-export const useCompanies = () => useContext(CompaniesContext);
diff --git a/src/contexts/ContentContext.jsx b/src/contexts/ContentContext.jsx
new file mode 100644
index 0000000..15909de
--- /dev/null
+++ b/src/contexts/ContentContext.jsx
@@ -0,0 +1,133 @@
+import PropTypes from "prop-types";
+import { createContext, useContext, useMemo, useCallback } from "react";
+import axios from "axios";
+import { useQuery, useQueryClient } from "@tanstack/react-query";
+
+const apiUrl = import.meta.env.VITE_API_URL;
+
+const defaultSettings = {
+ themes: [],
+ redirects: {},
+ branding: [],
+};
+
+const ContentContext = createContext(null);
+
+const fetchContent = async () => {
+ const response = await axios.get(`${apiUrl}/content`);
+ return response.data;
+};
+
+export const ContentProvider = ({ children }) => {
+ const queryClient = useQueryClient();
+
+ const { data, isLoading, error, isError, refetch } = useQuery({
+ queryKey: ["content"],
+ queryFn: fetchContent,
+ refetchOnWindowFocus: false,
+ });
+
+ const derivedContent = useMemo(() => {
+ const contentArray = Array.isArray(data) ? data : [];
+ const contentObject =
+ !Array.isArray(data) && data && typeof data === "object" ? data : {};
+
+ return {
+ contentArray,
+ contentObject,
+ pages: contentObject.pages || contentArray,
+ blogs: contentObject.blogs || contentArray,
+ projects: contentObject.projects || contentArray,
+ companies: contentObject.companies || contentArray,
+ images: contentObject.images || contentArray,
+ cvs: contentObject.cvs || contentArray,
+ settings: {
+ ...defaultSettings,
+ ...(contentObject.settings || {}),
+ },
+ };
+ }, [data]);
+
+ const errorMessage = useMemo(() => {
+ if (!isError) {
+ return null;
+ }
+
+ if (axios.isAxiosError(error)) {
+ return (
+ error?.response?.data?.message ||
+ error?.message ||
+ "Failed to fetch pages"
+ );
+ }
+
+ if (error instanceof Error) {
+ return error.message;
+ }
+
+ return "Failed to fetch pages";
+ }, [isError, error]);
+
+ const updateContent = useCallback(
+ (reloadedContent) => {
+ if (!reloadedContent || typeof reloadedContent !== "object") {
+ return;
+ }
+
+ queryClient.setQueryData(["content"], (currentContent) => ({
+ ...(currentContent && typeof currentContent === "object"
+ ? currentContent
+ : {}),
+ ...reloadedContent,
+ }));
+ },
+ [queryClient]
+ );
+
+ const invalidateContent = useCallback(async () => {
+ await queryClient.invalidateQueries({ queryKey: ["content"] });
+ }, [queryClient]);
+
+ const value = useMemo(
+ () => ({
+ data,
+ ...derivedContent,
+ isLoading,
+ isError,
+ error,
+ errorMessage,
+ updateContent,
+ invalidateContent,
+ refetch,
+ }),
+ [
+ data,
+ derivedContent,
+ isLoading,
+ isError,
+ error,
+ errorMessage,
+ updateContent,
+ invalidateContent,
+ refetch,
+ ]
+ );
+
+ return (
+
{children}
+ );
+};
+
+ContentProvider.propTypes = {
+ children: PropTypes.any,
+};
+
+export const useContent = () => {
+ const context = useContext(ContentContext);
+
+ if (!context) {
+ throw new Error("useContent must be used within a ContentProvider");
+ }
+
+ return context;
+};
diff --git a/src/contexts/DeveloperContext.jsx b/src/contexts/DeveloperContext.jsx
new file mode 100644
index 0000000..b1864d2
--- /dev/null
+++ b/src/contexts/DeveloperContext.jsx
@@ -0,0 +1,415 @@
+import PropTypes from "prop-types";
+import axios from "axios";
+import {
+ createContext,
+ useCallback,
+ useContext,
+ useEffect,
+ useRef,
+ useState,
+} from "react";
+import { useKeycloak } from "./KeycloakContext";
+import { useMessage } from "./MessageContext";
+const apiUrl = import.meta.env.VITE_API_URL;
+
+const DeveloperContext = createContext({
+ developerMode: false,
+ setDeveloperMode: () => {},
+ enableDeveloperMode: () => {},
+ disableDeveloperMode: () => {},
+ lastAction: null,
+ actionStatus: "idle",
+ actionError: null,
+ actionResult: null,
+ triggerAction: () => Promise.resolve(null),
+ registerReloadedContentHandler: () => () => {},
+});
+
+const ACTION_DEFINITIONS = {
+ developerMode: { label: "Developer mode" },
+ reloadBlog: {
+ label: "blog cache",
+ endpoint: "/reloadBlog",
+ method: "POST",
+ requiresDeveloper: true,
+ },
+ reloadProject: {
+ label: "project cache",
+ endpoint: "/reloadProject",
+ method: "POST",
+ requiresDeveloper: true,
+ },
+ reloadPage: {
+ label: "page cache",
+ endpoint: "/reloadPage",
+ method: "POST",
+ requiresDeveloper: true,
+ },
+ reloadExperience: {
+ label: "experience cache",
+ endpoint: "/reloadExperience",
+ method: "POST",
+ requiresDeveloper: true,
+ },
+};
+
+export const SUPPORTED_ACTIONS = new Set(Object.keys(ACTION_DEFINITIONS));
+
+export const ACTION_CONFIG = Object.fromEntries(
+ Object.entries(ACTION_DEFINITIONS)
+ .filter(([, config]) => config.endpoint)
+ .map(([action, config]) => [
+ action,
+ { endpoint: config.endpoint, method: config.method },
+ ])
+);
+
+export const ACTION_LABELS = Object.fromEntries(
+ Object.entries(ACTION_DEFINITIONS).map(([action, config]) => [
+ action,
+ config.label,
+ ])
+);
+
+const waitForPreferredUsername = async (
+ keycloakInstance,
+ { maxAttempts = 40, intervalMs = 100 } = {}
+) => {
+ if (!keycloakInstance) {
+ return null;
+ }
+
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
+ const preferredUsername =
+ keycloakInstance?.tokenParsed?.preferred_username ??
+ keycloakInstance?.idTokenParsed?.preferred_username ??
+ null;
+ if (preferredUsername) {
+ return preferredUsername;
+ }
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
+ }
+
+ console.warn(
+ "Timed out waiting for Keycloak preferred_username to become available"
+ );
+ return null;
+};
+
+export const DeveloperProvider = ({ children }) => {
+ const { isAuthenticated, keycloak, loading } = useKeycloak();
+ const { showMessage } = useMessage();
+ const [developerMode, setDeveloperModeState] = useState(false);
+ const [actionState, setActionState] = useState({
+ lastAction: null,
+ status: "idle",
+ error: null,
+ result: null,
+ });
+ const processedActionsRef = useRef(new Set());
+ const reloadedContentHandlerRef = useRef(null);
+
+ const updateDeveloperMode = useCallback((value) => {
+ setDeveloperModeState(value);
+
+ if (typeof window === "undefined") {
+ return;
+ }
+
+ if (value) {
+ window.sessionStorage.setItem("developerMode", "true");
+ } else {
+ window.sessionStorage.removeItem("developerMode");
+ }
+ }, []);
+
+ const checkDeveloperStatus = useCallback(async () => {
+ try {
+ if (!keycloak) {
+ updateDeveloperMode(false);
+ return false;
+ }
+
+ if (isAuthenticated || loading) {
+ await waitForPreferredUsername(keycloak);
+ }
+
+ const realmRoles = keycloak?.tokenParsed?.realm_access?.roles ?? [];
+ const clientRoles =
+ keycloak?.tokenParsed?.resource_access?.[
+ import.meta.env.VITE_KEYCLOAK_CLIENT_ID
+ ]?.roles ?? [];
+
+ const allRoles = new Set([...realmRoles, ...clientRoles]);
+ const isDeveloper = allRoles.has("developer");
+
+ updateDeveloperMode(isDeveloper);
+ return isDeveloper;
+ } catch (error) {
+ console.error("Developer role check failed", error);
+ updateDeveloperMode(false);
+ return false;
+ }
+ }, [keycloak, isAuthenticated, loading, updateDeveloperMode]);
+
+ const ensureDeveloperAccess = useCallback(async () => {
+ if (developerMode) {
+ return true;
+ }
+ return await checkDeveloperStatus();
+ }, [checkDeveloperStatus, developerMode]);
+
+ const registerReloadedContentHandler = useCallback((handler) => {
+ if (typeof handler === "function") {
+ reloadedContentHandlerRef.current = handler;
+ } else {
+ reloadedContentHandlerRef.current = null;
+ }
+
+ return () => {
+ if (reloadedContentHandlerRef.current === handler) {
+ reloadedContentHandlerRef.current = null;
+ }
+ };
+ }, []);
+
+ const performEndpointAction = useCallback(
+ async ({ endpoint, method = "POST" }, params = {}) => {
+ const config = {
+ method,
+ url: `${apiUrl}/developer${endpoint}`,
+ withCredentials: true,
+ data: params,
+ };
+
+ try {
+ const response = await axios(config);
+ return response?.data ?? null;
+ } catch (error) {
+ const status = error?.response?.status;
+ const errorMessage =
+ error?.response?.data?.message ||
+ error?.message ||
+ (status ? `HTTP error ${status}` : "Request failed");
+ throw new Error(errorMessage);
+ }
+ },
+ []
+ );
+
+ const triggerAction = useCallback(
+ async (action, params = {}) => {
+ if (!SUPPORTED_ACTIONS.has(action)) {
+ throw new Error(`Unsupported action: ${action}`);
+ }
+
+ const actionDefinition = ACTION_DEFINITIONS[action];
+ const actionLabel = actionDefinition?.label ?? action;
+
+ setActionState({
+ lastAction: action,
+ status: "pending",
+ error: null,
+ result: null,
+ });
+
+ if (typeof showMessage === "function") {
+ showMessage(`Reloading ${actionLabel.toLowerCase()}…`, null, false);
+ }
+
+ try {
+ if (actionDefinition?.requiresDeveloper) {
+ const allowed = await ensureDeveloperAccess();
+ if (!allowed) {
+ throw new Error("Developer access required");
+ }
+ }
+
+ let result = null;
+
+ if (action === "developerMode") {
+ const isDeveloper = await checkDeveloperStatus();
+ result = { developerMode: isDeveloper };
+ } else if (actionDefinition?.endpoint) {
+ result =
+ (await performEndpointAction(actionDefinition, params)) ?? null;
+ }
+
+ const resultContent =
+ result && typeof result === "object" ? result.content : null;
+
+ if (
+ resultContent &&
+ typeof resultContent === "object" &&
+ typeof reloadedContentHandlerRef.current === "function"
+ ) {
+ try {
+ await reloadedContentHandlerRef.current(resultContent);
+ } catch (handlerError) {
+ console.error("Reloaded content handler failed", handlerError);
+ }
+ }
+
+ setActionState({
+ lastAction: action,
+ status: "success",
+ error: null,
+ result,
+ });
+
+ if (typeof showMessage === "function") {
+ const payloadMessage =
+ typeof result === "string"
+ ? result
+ : result?.message ||
+ (action === "developerMode" && result
+ ? result.developerMode
+ ? "Developer mode enabled."
+ : "Developer mode disabled."
+ : `${actionLabel} refreshed.`);
+ showMessage(payloadMessage, null, true);
+ }
+
+ return { ok: true, result };
+ } catch (error) {
+ console.error(`Action "${action}" failed`, error);
+ setActionState({
+ lastAction: action,
+ status: "error",
+ error,
+ result: null,
+ });
+
+ if (typeof showMessage === "function") {
+ const errorMessage =
+ error?.message || error?.toString() || `${actionLabel} failed`;
+ showMessage(errorMessage, null, false);
+ }
+
+ return { ok: false, error };
+ }
+ },
+ [
+ checkDeveloperStatus,
+ ensureDeveloperAccess,
+ performEndpointAction,
+ showMessage,
+ ]
+ );
+
+ useEffect(() => {
+ if (typeof window === "undefined") {
+ return;
+ }
+
+ let cancelled = false;
+
+ const runOnReady = async () => {
+ if (cancelled) {
+ return;
+ }
+
+ const params = new URLSearchParams(window.location.search);
+ const action = params.get("action");
+
+ if (!action || !SUPPORTED_ACTIONS.has(action)) {
+ return;
+ }
+
+ const actionKey = `${action}:${params.toString()}`;
+ if (processedActionsRef.current.has(actionKey)) {
+ return;
+ }
+
+ if (action !== "developerMode" && !isAuthenticated) {
+ return;
+ }
+
+ processedActionsRef.current.add(actionKey);
+
+ const actionParams = {};
+ params.forEach((value, key) => {
+ if (key !== "action") {
+ actionParams[key] = value;
+ }
+ });
+
+ await triggerAction(action, actionParams);
+ };
+
+ if (
+ document.readyState === "complete" ||
+ document.readyState === "interactive"
+ ) {
+ void runOnReady();
+ return () => {
+ cancelled = true;
+ };
+ }
+
+ const handleContentLoaded = () => {
+ void runOnReady();
+ };
+
+ document.addEventListener("DOMContentLoaded", handleContentLoaded);
+
+ return () => {
+ cancelled = true;
+ document.removeEventListener("DOMContentLoaded", handleContentLoaded);
+ };
+ }, [isAuthenticated, triggerAction]);
+
+ useEffect(() => {
+ if (typeof window === "undefined") {
+ return;
+ }
+
+ const storedDeveloperMode = window.sessionStorage.getItem("developerMode");
+ if (storedDeveloperMode !== "true") {
+ return;
+ }
+
+ let cancelled = false;
+
+ const validateStoredDeveloperMode = async () => {
+ const allowed = await checkDeveloperStatus();
+ if (!allowed && !cancelled) {
+ updateDeveloperMode(false);
+ }
+ };
+
+ void validateStoredDeveloperMode();
+
+ return () => {
+ cancelled = true;
+ };
+ }, [checkDeveloperStatus, updateDeveloperMode]);
+
+ const enableDeveloperMode = () => updateDeveloperMode(true);
+ const disableDeveloperMode = () => updateDeveloperMode(false);
+
+ return (
+
+ {children}
+
+ );
+};
+
+DeveloperProvider.propTypes = {
+ children: PropTypes.node.isRequired,
+};
+
+export const useDeveloper = () => useContext(DeveloperContext);
diff --git a/src/contexts/DeveloperMenuContext.jsx b/src/contexts/DeveloperMenuContext.jsx
new file mode 100644
index 0000000..3041873
--- /dev/null
+++ b/src/contexts/DeveloperMenuContext.jsx
@@ -0,0 +1,429 @@
+import PropTypes from "prop-types";
+import { createContext, useContext, useMemo, useCallback } from "react";
+import { useDeveloper, ACTION_LABELS } from "./DeveloperContext";
+import ReloadIcon from "../icons/ReloadIcon";
+import LoadingIcon from "../icons/LoadingIcon";
+
+const defaultTarget = {
+ entity: null,
+ slug: null,
+ path: null,
+ available: false,
+ visible: false,
+};
+
+const DeveloperMenuContext = createContext({
+ developerMode: false,
+ isVisible: false,
+ activeType: null,
+ activeEntity: null,
+ activeSlug: null,
+ activePath: null,
+ targets: {
+ page: defaultTarget,
+ blog: defaultTarget,
+ project: defaultTarget,
+ experience: defaultTarget,
+ },
+ currentPage: null,
+ currentSubPage: null,
+ currentBlog: null,
+ currentProject: null,
+ currentCompany: null,
+});
+
+export const DeveloperMenuProvider = ({
+ children,
+ developerMode = false,
+ currentPage = null,
+ currentSubPage = null,
+ currentBlog = null,
+ currentProject = null,
+ currentCompany = null,
+ subPageVisible = false,
+ blogVisible = false,
+ projectVisible = false,
+ experienceVisible = false,
+}) => {
+ const pageEntity =
+ subPageVisible && currentSubPage?.slug ? currentSubPage : currentPage;
+ const pageSlug = pageEntity?.slug ?? null;
+ const pagePath = pageSlug ? `/${pageSlug}` : "/";
+ const pageAvailable = Boolean(pageEntity?.slug);
+
+ const blogSlug = currentBlog?.slug ?? null;
+ const blogPath = blogSlug ? `/blogs/${blogSlug}` : null;
+ const blogAvailable = Boolean(blogVisible && blogSlug);
+
+ const projectSlug = currentProject?.slug ?? null;
+ const projectPath = projectSlug ? `/projects/${projectSlug}` : null;
+ const projectAvailable = Boolean(projectVisible && projectSlug);
+
+ const experienceSlug = currentCompany?.slug ?? null;
+ const experiencePath = experienceSlug
+ ? `/experience/${experienceSlug}`
+ : null;
+ const experienceAvailable = Boolean(experienceVisible && experienceSlug);
+
+ const targets = useMemo(
+ () => ({
+ page: {
+ entity: pageEntity,
+ slug: pageSlug,
+ path: pageAvailable ? pagePath : "/",
+ available: pageAvailable,
+ visible: Boolean(pageEntity),
+ },
+ blog: {
+ entity: currentBlog,
+ slug: blogSlug,
+ path: blogAvailable ? blogPath : null,
+ available: blogAvailable,
+ visible: blogAvailable,
+ },
+ project: {
+ entity: currentProject,
+ slug: projectSlug,
+ path: projectAvailable ? projectPath : null,
+ available: projectAvailable,
+ visible: projectAvailable,
+ },
+ experience: {
+ entity: currentCompany,
+ slug: experienceSlug,
+ path: experienceAvailable ? experiencePath : null,
+ available: experienceAvailable,
+ visible: experienceAvailable,
+ },
+ }),
+ [
+ pageEntity,
+ pageSlug,
+ pageAvailable,
+ pagePath,
+ currentBlog,
+ blogSlug,
+ blogAvailable,
+ blogPath,
+ currentProject,
+ projectSlug,
+ projectAvailable,
+ projectPath,
+ currentCompany,
+ experienceSlug,
+ experienceAvailable,
+ experiencePath,
+ ]
+ );
+
+ const activeType = useMemo(() => {
+ if (!developerMode) {
+ return null;
+ }
+ if (targets.blog.visible) {
+ return "blog";
+ }
+ if (targets.project.visible) {
+ return "project";
+ }
+ if (targets.experience.visible) {
+ return "experience";
+ }
+ if (targets.page.visible) {
+ return "page";
+ }
+ return null;
+ }, [developerMode, targets]);
+
+ const activeTarget = activeType ? targets[activeType] : defaultTarget;
+
+ const value = useMemo(
+ () => ({
+ developerMode,
+ isVisible: Boolean(developerMode),
+ currentPage,
+ currentSubPage,
+ currentBlog,
+ currentProject,
+ currentCompany,
+ activeType,
+ activeEntity: activeTarget.entity,
+ activeSlug: activeTarget.slug,
+ activePath: activeTarget.path,
+ targets,
+ }),
+ [
+ developerMode,
+ currentPage,
+ currentSubPage,
+ currentBlog,
+ currentProject,
+ currentCompany,
+ activeType,
+ activeTarget.entity,
+ activeTarget.slug,
+ activeTarget.path,
+ targets,
+ ]
+ );
+
+ return (
+
+ {children}
+
+
+ );
+};
+
+DeveloperMenuProvider.propTypes = {
+ children: PropTypes.node.isRequired,
+ developerMode: PropTypes.bool,
+ currentPage: PropTypes.object,
+ currentSubPage: PropTypes.object,
+ currentBlog: PropTypes.object,
+ currentProject: PropTypes.object,
+ currentCompany: PropTypes.object,
+ subPageVisible: PropTypes.bool,
+ blogVisible: PropTypes.bool,
+ projectVisible: PropTypes.bool,
+ experienceVisible: PropTypes.bool,
+};
+
+export const useDeveloperMenu = () => useContext(DeveloperMenuContext);
+
+const ACTION_TYPE_KEYS = {
+ page: "page",
+ blog: "blog",
+ project: "project",
+ experience: "experience",
+};
+
+const DeveloperMenuOverlay = () => {
+ const {
+ developerMode,
+ disableDeveloperMode,
+ triggerAction,
+ lastAction,
+ actionStatus,
+ actionError,
+ actionResult,
+ } = useDeveloper();
+ const developerMenu = useDeveloperMenu();
+
+ const isVisible =
+ developerMode && developerMenu?.isVisible && developerMenu?.targets;
+
+ const resolveTargetForAction = useCallback(
+ (action) => {
+ const targets = developerMenu?.targets;
+ if (!targets) {
+ return null;
+ }
+ switch (action) {
+ case "reloadPage":
+ return targets.page?.available ? targets.page : null;
+ case "reloadBlog":
+ return targets.blog?.available ? targets.blog : null;
+ case "reloadProject":
+ return targets.project?.available ? targets.project : null;
+ case "reloadExperience":
+ return targets.experience?.available ? targets.experience : null;
+ default:
+ return null;
+ }
+ },
+ [developerMenu?.targets]
+ );
+
+ const createActionParams = useCallback(
+ (action) => {
+ const target = resolveTargetForAction(action);
+ if (!target) {
+ return null;
+ }
+ const normalizedPath = target.path ?? "/";
+ const notionId = target.entity?.notionId ?? null;
+ const params = {
+ path: normalizedPath,
+ normalizedPath,
+ };
+ if (target.slug) {
+ params.slug = target.slug;
+ }
+ if (notionId) {
+ params.notionId = notionId;
+ }
+ return params;
+ },
+ [resolveTargetForAction]
+ );
+
+ const handleActionButtonClick = useCallback(
+ async (action) => {
+ const params = createActionParams(action);
+ if (params === null) {
+ console.warn(`No parameters available for action "${action}"`);
+ return;
+ }
+ await triggerAction(action, params);
+ },
+ [createActionParams, triggerAction]
+ );
+
+ const isPending = actionStatus === "pending";
+
+ const actionFeedback = useMemo(() => {
+ if (!lastAction || actionStatus === "idle") {
+ return { message: null, status: "idle" };
+ }
+
+ const label = ACTION_LABELS[lastAction] ?? "Action";
+
+ if (actionStatus === "pending") {
+ return { message: `Running ${label.toLowerCase()}…`, status: "pending" };
+ }
+
+ if (actionStatus === "success") {
+ const payloadMessage =
+ typeof actionResult === "string" ? actionResult : actionResult?.message;
+ return {
+ message: payloadMessage || `${label} refreshed.`,
+ status: "success",
+ };
+ }
+
+ if (actionStatus === "error") {
+ const errorMessage =
+ actionError?.message || actionError?.toString() || `${label} failed`;
+ return { message: errorMessage, status: "error" };
+ }
+
+ return { message: null, status: "idle" };
+ }, [lastAction, actionStatus, actionError, actionResult]);
+
+ const targets = developerMenu?.targets ?? {};
+ const activeType = developerMenu?.activeType ?? null;
+
+ const buildTitle = useCallback((type, target) => {
+ const name =
+ target?.entity?.name ||
+ target?.entity?.title ||
+ target?.entity?.slug ||
+ target?.slug;
+ if (target?.available && name) {
+ return `Reload cache for ${type} "${name}"`;
+ }
+ if (target?.available) {
+ return `Reload current ${type} cache`;
+ }
+ return `Navigate to a ${type} to enable`;
+ }, []);
+
+ const developerButtons = useMemo(
+ () => [
+ {
+ action: "reloadPage",
+ label: "Page",
+ isEnabled: Boolean(targets.page?.available),
+ isActive: activeType === ACTION_TYPE_KEYS.page,
+ title: buildTitle("page", targets.page),
+ },
+ {
+ action: "reloadBlog",
+ label: "Blog",
+ isEnabled: Boolean(targets.blog?.available),
+ isActive: activeType === ACTION_TYPE_KEYS.blog,
+ title: buildTitle("blog", targets.blog),
+ },
+ {
+ action: "reloadProject",
+ label: "Project",
+ isEnabled: Boolean(targets.project?.available),
+ isActive: activeType === ACTION_TYPE_KEYS.project,
+ title: buildTitle("project", targets.project),
+ },
+ {
+ action: "reloadExperience",
+ label: "Experience",
+ isEnabled: Boolean(targets.experience?.available),
+ isActive: activeType === ACTION_TYPE_KEYS.experience,
+ title: buildTitle("experience", targets.experience),
+ },
+ ],
+ [targets, activeType, buildTitle]
+ );
+
+ const primaryDeveloperButton = useMemo(() => {
+ if (!developerButtons.length) {
+ return null;
+ }
+ const activeButton = developerButtons.find((button) => button.isActive);
+ if (activeButton) {
+ return activeButton;
+ }
+ const enabledButton = developerButtons.find((button) => button.isEnabled);
+ if (enabledButton) {
+ return enabledButton;
+ }
+ return developerButtons[0];
+ }, [developerButtons]);
+
+ const isPrimaryActionPending =
+ primaryDeveloperButton &&
+ isPending &&
+ lastAction === primaryDeveloperButton.action;
+
+ if (!isVisible) {
+ return null;
+ }
+
+ return (
+
+
+
+ {primaryDeveloperButton && (
+ <>
+
+
+ >
+ )}
+
+
+
+
+ );
+};
diff --git a/src/contexts/ImageContext.jsx b/src/contexts/ImageContext.jsx
index 80cf026..9baa056 100644
--- a/src/contexts/ImageContext.jsx
+++ b/src/contexts/ImageContext.jsx
@@ -191,7 +191,14 @@ const imageCache = new ImageCache();
export const ImageProvider = ({ children }) => {
const [imageObjects, setImageObjects] = useState([]);
const [allImagesLoaded, setAllImagesLoaded] = useState(false);
-
+ const removeQueryParams = useCallback((url) => {
+ if (!url) return url;
+ if (url.includes("?")) {
+ // Remove query parameters if they exist
+ return url.split("?")[0];
+ }
+ return url;
+ }, []);
const loadImages = useCallback((images) => {
// images: [{ blurHash, url, mirrorUrl? }]
// Only initialize image objects with metadata, don't load them yet
@@ -216,7 +223,10 @@ export const ImageProvider = ({ children }) => {
const loadIndividualImage = useCallback(
async (url) => {
console.log(`[ImageProvider] loadIndividualImage called for: ${url}`);
- const imageObj = imageObjects.find((img) => img.src === url);
+ const urlWithoutParams = removeQueryParams(url);
+ const imageObj = imageObjects.find(
+ (img) => removeQueryParams(img.src) === urlWithoutParams
+ );
// If image object doesn't exist, we can't load it
if (!imageObj) {
@@ -235,15 +245,18 @@ export const ImageProvider = ({ children }) => {
return; // Already loading or loaded
}
- // Check if image is already cached
- if (imageCache.isCached(url)) {
+ // Use the imageObj.src (which might not have query params) for cache and state operations
+ const cacheKey = imageObj.src;
+
+ // Check if image is already cached (use the image object's src, which might not have query params)
+ if (imageCache.isCached(cacheKey)) {
console.log(
- `[ImageProvider] Image found in cache, updating state: ${url}`
+ `[ImageProvider] Image found in cache, updating state: ${cacheKey}`
);
- const base64 = imageCache.get(url);
+ const base64 = imageCache.get(cacheKey);
setImageObjects((prev) =>
prev.map((img) =>
- img.src === url
+ removeQueryParams(img.src) === urlWithoutParams
? { ...img, blob: base64, loadingState: "loaded" }
: img
)
@@ -252,19 +265,21 @@ export const ImageProvider = ({ children }) => {
}
console.log(`[ImageProvider] Starting to load individual image: ${url}`);
- // Update loading state
+ // Update loading state using normalized comparison
setImageObjects((prev) =>
prev.map((img) =>
- img.src === url ? { ...img, loadingState: "loading" } : img
+ removeQueryParams(img.src) === urlWithoutParams
+ ? { ...img, loadingState: "loading" }
+ : img
)
);
try {
const mirrorUrl = imageObj.mirrorUrl;
- const base64 = await imageCache.loadImage(url, mirrorUrl);
+ const base64 = await imageCache.loadImage(cacheKey, mirrorUrl);
setImageObjects((prev) =>
prev.map((img) =>
- img.src === url
+ removeQueryParams(img.src) === urlWithoutParams
? { ...img, blob: base64, loadingState: "loaded" }
: img
)
@@ -273,12 +288,14 @@ export const ImageProvider = ({ children }) => {
console.error(`[ImageProvider] Failed to load image: ${url}`, error);
setImageObjects((prev) =>
prev.map((img) =>
- img.src === url ? { ...img, loadingState: "error" } : img
+ removeQueryParams(img.src) === urlWithoutParams
+ ? { ...img, loadingState: "error" }
+ : img
)
);
}
},
- [imageObjects]
+ [imageObjects, removeQueryParams]
);
useEffect(() => {
diff --git a/src/contexts/KeycloakContext.jsx b/src/contexts/KeycloakContext.jsx
index 6212ce8..c13431c 100644
--- a/src/contexts/KeycloakContext.jsx
+++ b/src/contexts/KeycloakContext.jsx
@@ -9,9 +9,9 @@ import Keycloak from "keycloak-js";
// Initialize Keycloak
const keycloak = new Keycloak({
- url: "https://auth.tombutcher.work", // Your Keycloak server
- realm: "master", // Your Keycloak realm
- clientId: "2025-web-client", // Your Keycloak client ID
+ url: import.meta.env.VITE_KEYCLOAK_URL, // Your Keycloak server
+ realm: import.meta.env.VITE_KEYCLOAK_REALM, // Your Keycloak realm
+ clientId: import.meta.env.VITE_KEYCLOAK_CLIENT_ID, // Your Keycloak client ID
});
const KeycloakContext = createContext(null);
diff --git a/src/contexts/MenuContext.jsx b/src/contexts/MenuContext.jsx
index 9bdd056..f2d86ae 100644
--- a/src/contexts/MenuContext.jsx
+++ b/src/contexts/MenuContext.jsx
@@ -63,7 +63,7 @@ export const MenuProvider = ({
!menuPopupRef.current.contains(event.target)
) {
// Don't close if clicking on CV download popup or its button
- const cvPopup = document.querySelector(".tb-cv-download-popup");
+ const cvPopup = document.querySelector(".tb-cv-popup");
const websiteSelectorPopup = document.querySelector(
".tb-website-selector-popup"
);
diff --git a/src/contexts/MessageContext.jsx b/src/contexts/MessageContext.jsx
new file mode 100644
index 0000000..1437c31
--- /dev/null
+++ b/src/contexts/MessageContext.jsx
@@ -0,0 +1,160 @@
+import PropTypes from "prop-types";
+import {
+ createContext,
+ useCallback,
+ useContext,
+ useEffect,
+ useMemo,
+ useRef,
+ useState,
+} from "react";
+
+const DEFAULT_AUTO_HIDE_MS = 5000;
+
+const MessageContext = createContext({
+ isVisible: false,
+ message: null,
+ icon: null,
+ showMessage: () => {},
+ hideMessage: () => {},
+});
+
+export const MessageProvider = ({
+ children,
+ defaultAutoHideDelay = DEFAULT_AUTO_HIDE_MS,
+}) => {
+ const [state, setState] = useState({
+ message: null,
+ icon: null,
+ isVisible: false,
+ });
+
+ const hideTimeoutRef = useRef(null);
+ const clearHideTimeout = useCallback(() => {
+ if (hideTimeoutRef.current) {
+ window.clearTimeout(hideTimeoutRef.current);
+ hideTimeoutRef.current = null;
+ }
+ }, []);
+
+ const hideMessage = useCallback(() => {
+ clearHideTimeout();
+ setState((prev) => ({
+ ...prev,
+ isVisible: false,
+ }));
+ }, [clearHideTimeout]);
+
+ const showMessage = useCallback(
+ (messageText, icon = null, autoHide = true) => {
+ if (!messageText) {
+ console.warn("showMessage called without message text");
+ return;
+ }
+
+ clearHideTimeout();
+
+ setState({
+ message: messageText,
+ icon,
+ isVisible: true,
+ });
+
+ const resolvedDelay =
+ typeof autoHide === "number" && autoHide > 0
+ ? autoHide
+ : defaultAutoHideDelay;
+
+ if (autoHide && typeof window !== "undefined") {
+ hideTimeoutRef.current = window.setTimeout(() => {
+ setState((prev) => ({
+ ...prev,
+ isVisible: false,
+ }));
+ hideTimeoutRef.current = null;
+ }, resolvedDelay);
+ }
+ },
+ [clearHideTimeout, defaultAutoHideDelay]
+ );
+
+ useEffect(() => {
+ return () => {
+ clearHideTimeout();
+ };
+ }, [clearHideTimeout]);
+
+ const contextValue = useMemo(
+ () => ({
+ isVisible: state.isVisible,
+ message: state.message,
+ icon: state.icon,
+ showMessage,
+ hideMessage,
+ }),
+ [state.isVisible, state.message, state.icon, showMessage, hideMessage]
+ );
+
+ return (
+
+ {children}
+
+
+ );
+};
+
+MessageProvider.propTypes = {
+ children: PropTypes.node.isRequired,
+ defaultAutoHideDelay: PropTypes.number,
+};
+
+export const useMessage = () => useContext(MessageContext);
+
+const MessageOverlay = ({ message, icon, isVisible, onDismiss }) => {
+ const shouldRender = Boolean(message);
+
+ if (!shouldRender) {
+ return null;
+ }
+
+ const className = [
+ "tb-message-popup",
+ isVisible ? "tb-message-popup-visible" : "tb-message-popup-hidden",
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ return (
+
+
+ {icon ? {icon} : null}
+ {message}
+
+
+
+ );
+};
+
+MessageOverlay.propTypes = {
+ message: PropTypes.string,
+ icon: PropTypes.node,
+ isVisible: PropTypes.bool.isRequired,
+ onDismiss: PropTypes.func.isRequired,
+};
diff --git a/src/contexts/ProjectsContext.jsx b/src/contexts/ProjectsContext.jsx
deleted file mode 100644
index b5b447a..0000000
--- a/src/contexts/ProjectsContext.jsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import PropTypes from "prop-types";
-import { createContext, useContext, useState, useEffect } from "react";
-
-// Create context
-const ProjectsContext = createContext({
- projects: [],
- setProjects: () => {},
-});
-
-// Provider
-export const ProjectsProvider = ({ children, initialProjects = [] }) => {
- const [projects, setProjects] = useState(initialProjects);
-
- // Update projects whenever initialProjects changes
- useEffect(() => {
- if (initialProjects && initialProjects.length > 0) {
- setProjects(initialProjects);
- }
- }, [initialProjects]);
-
- return (
-
- {children}
-
- );
-};
-
-ProjectsProvider.propTypes = {
- children: PropTypes.any,
- initialProjects: PropTypes.array,
-};
-
-// Hook for consuming
-export const useProjects = () => useContext(ProjectsContext);
diff --git a/src/contexts/SettingsContext.jsx b/src/contexts/SettingsContext.jsx
deleted file mode 100644
index 20924fa..0000000
--- a/src/contexts/SettingsContext.jsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import { createContext, useContext, useEffect, useState } from "react";
-import PropTypes from "prop-types";
-
-const SettingsContext = createContext(null);
-
-export const SettingsProvider = ({ settings: initialSettings, children }) => {
- const [settings, setSettings] = useState(initialSettings);
-
- // Update internal state whenever the prop changes
- useEffect(() => {
- setSettings(initialSettings);
- }, [initialSettings]);
-
- return (
-
- {children}
-
- );
-};
-
-SettingsProvider.propTypes = {
- settings: PropTypes.object.isRequired,
- children: PropTypes.node.isRequired,
-};
-
-export const useSettingsContext = () => {
- const settings = useContext(SettingsContext);
- if (!settings) {
- throw new Error("useSettingsContext must be used inside SettingsProvider");
- }
- return settings;
-};
diff --git a/src/icons/ErrorCloudIcon.jsx b/src/icons/ErrorCloudIcon.jsx
new file mode 100644
index 0000000..0aab799
--- /dev/null
+++ b/src/icons/ErrorCloudIcon.jsx
@@ -0,0 +1,7 @@
+import ErrorCloudIconSvg from "../../assets/errorcloudicon.svg?react";
+
+const ErrorCloudIcon = () => {
+ return
;
+};
+
+export default ErrorCloudIcon;
diff --git a/src/icons/ReloadIcon.jsx b/src/icons/ReloadIcon.jsx
new file mode 100644
index 0000000..3c8e840
--- /dev/null
+++ b/src/icons/ReloadIcon.jsx
@@ -0,0 +1,7 @@
+import ReloadIconSvg from "../../assets/reloadicon.svg?react";
+
+const ReloadIcon = () => {
+ return
;
+};
+
+export default ReloadIcon;
diff --git a/src/styles/components.css b/src/styles/components.css
index 04f5b8b..6f9e714 100644
--- a/src/styles/components.css
+++ b/src/styles/components.css
@@ -46,6 +46,65 @@
transition: opacity 1s ease-in-out;
}
+.tb-particles-fps-monitor {
+ position: fixed;
+ top: 90px;
+ right: var(--tb-page-mobile-padding);
+ padding: 10px 16px;
+ border-radius: 18px;
+ border: 1px solid color-mix(in srgb, var(--tb-textColor) 25%, transparent);
+ background: color-mix(in srgb, var(--tb-backgroundColor) 18%, transparent);
+ color: var(--tb-textColor);
+ font-size: 0.75rem;
+ font-weight: 600;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ display: inline-flex;
+ flex-direction: column;
+ align-items: flex-end;
+ gap: 8px;
+ pointer-events: none;
+ z-index: 5;
+ backdrop-filter: blur(18px);
+ -webkit-backdrop-filter: blur(18px);
+ box-shadow: 0 16px 36px
+ color-mix(in srgb, var(--tb-backgroundColor) 25%, transparent);
+ transition: opacity 0.35s ease, transform 0.35s ease;
+}
+
+.tb-particles-fps-monitor-row {
+ display: flex;
+ align-items: baseline;
+ gap: 8px;
+}
+
+.tb-particles-fps-monitor-divider {
+ align-self: stretch;
+ height: 1px;
+ background: color-mix(in srgb, var(--tb-textColor) 18%, transparent);
+}
+
+.tb-particles-fps-monitor-label {
+ opacity: 0.7;
+ font-size: 0.68rem;
+ letter-spacing: 0.14em;
+}
+
+.tb-particles-fps-monitor-value {
+ font-size: 0.95rem;
+ font-weight: 700;
+}
+
+.tb-particles-fps-monitor-visible {
+ opacity: 1;
+ transform: translateY(0);
+}
+
+.tb-particles-fps-monitor-hidden {
+ opacity: 0;
+ transform: translateY(-8px);
+}
+
.tb-particles-visible {
opacity: 1;
}
@@ -55,7 +114,8 @@
}
.tb-particles-background {
- backdrop-filter: blur(40px);
+ backdrop-filter: blur(45px);
+ -webkit-backdrop-filter: blur(45px);
position: absolute;
z-index: 1;
top: 0;
@@ -83,6 +143,7 @@
position: relative;
transform-origin: center center;
transform: scale(1);
+ width: max-content;
}
.tb-menu-popup-button,
@@ -191,6 +252,109 @@
transform: scale(0.5);
}
+.tb-error-content {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 50px;
+}
+
+.tb-error-message {
+ padding: 20px 30px;
+ background-color: #b00000;
+ border: 1px solid #ff0000;
+ text-align: center;
+ color: #ffffff;
+ border-radius: 25px;
+ box-shadow: 0px 8.5px 20px 0px #000000;
+ margin-bottom: 30px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
+.tb-error-message h1 {
+ font-size: 26px;
+ font-weight: 600;
+ margin: 0;
+}
+
+.tb-error-message-divider {
+ width: 50%;
+ height: 1px;
+ background-color: #ff0000;
+ margin: 17px 0;
+ border: none;
+}
+
+.tb-error-message p {
+ font-size: 16px;
+ font-weight: 400;
+ margin: 0;
+ max-width: 500px;
+}
+
+.tb-error-button {
+ color: #ffffff;
+ background-color: #b00000;
+ border: 1px solid #ff0000;
+ box-shadow: 0px 8.5px 20px 0px #000000;
+}
+
+.tb-error-button:not(:disabled):hover {
+ background-color: #b00000;
+ color: #ffffff;
+}
+
+.tb-error-secondary-button {
+ color: #ffffff;
+ background-color: #b000004e;
+ border: 1px solid #ff000072;
+ box-shadow: 0px 8.5px 20px 0px #000000;
+}
+
+.tb-error-secondary-button:not(:disabled):hover {
+ color: #ffffff;
+ background-color: #b000004e;
+ border: 1px solid #ff000052;
+}
+
+.tb-error-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 12px;
+ justify-content: center;
+}
+
+.tb-error-details {
+ width: 100%;
+ max-width: 640px;
+ max-height: 320px;
+ margin: 12px auto 0;
+ padding: 20px;
+ background-color: rgba(0, 0, 0, 0.85);
+ border: 1px solid rgba(255, 0, 0, 0.45);
+ border-radius: 16px;
+ box-shadow: 0px 8.5px 24px 0px rgba(0, 0, 0, 0.45);
+ color: #ffffff;
+ font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
+ font-size: 14px;
+ line-height: 1.5;
+ text-align: left;
+ overflow: auto;
+ white-space: pre-wrap;
+ word-break: break-word;
+ margin-bottom: 30px;
+}
+
+.tb-error-icon {
+ fill: #b00000;
+ width: 150px;
+ stroke: #ff0000;
+}
+
/* Menu Components */
.tb-menu-popup {
position: absolute;
@@ -314,6 +478,199 @@
justify-content: end;
}
+/* Developer Popup */
+.tb-developer-popup {
+ position: fixed;
+ bottom: calc(var(--tb-header-footer-vertical-padding) + 24px);
+ left: 50%;
+ transform: translateX(-50%);
+ background-color: color-mix(
+ in srgb,
+ var(--tb-backgroundColor) 55%,
+ transparent
+ );
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+ box-shadow: -1px 3px 50px 4px var(--tb-backgroundColor);
+ border-radius: 30px;
+ z-index: 15;
+ padding: 0;
+ transition: background-color 0.3s ease, box-shadow 0.3s ease;
+ width: max-content;
+}
+
+.tb-developer-popup::before {
+ content: "";
+ position: absolute;
+ inset: 0;
+ padding: 1px;
+ border-radius: inherit;
+ background: linear-gradient(
+ to bottom right,
+ color-mix(in srgb, var(--tb-textColor) 15%, transparent),
+ color-mix(in srgb, var(--tb-textColor) 10%, transparent),
+ color-mix(in srgb, var(--tb-textColor) 15%, transparent)
+ );
+ mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
+ -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
+ mask-composite: xor;
+ -webkit-mask-composite: xor;
+ mask-composite: exclude;
+ pointer-events: none;
+ z-index: 1;
+}
+
+.tb-developer-popup-container {
+ position: relative;
+ z-index: 2;
+ padding: 0 13px;
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ align-items: center;
+}
+
+.tb-developer-popup-actions {
+ display: flex;
+ gap: 10px;
+ justify-content: center;
+ align-items: center;
+}
+
+.tb-developer-popup-actions .tb-button {
+ justify-content: center;
+}
+
+.tb-developer-popup-actions-divider {
+ width: 1px;
+ height: 18px;
+ background-color: color-mix(in srgb, var(--tb-textColor) 20%, transparent);
+}
+
+.tb-developer-popup-status {
+ font-size: 0.85rem;
+ text-align: center;
+ color: color-mix(in srgb, var(--tb-textColor) 70%, transparent);
+ min-height: 1.2em;
+}
+
+.tb-developer-popup-status-success {
+ color: color-mix(in srgb, var(--tb-textColor) 85%, transparent);
+}
+
+.tb-developer-popup-status-error {
+ color: #ff6b6b;
+}
+
+.tb-developer-popup-status-pending {
+ color: color-mix(in srgb, var(--tb-textColor) 75%, transparent);
+}
+
+.tb-developer-exit-button {
+ font-weight: 600;
+}
+
+/* Message Popup */
+.tb-message-popup {
+ position: fixed;
+ top: calc(var(--tb-header-footer-vertical-padding) + 24px);
+ left: 50%;
+ transform: translate(-50%, -12px) scale(0.98);
+ opacity: 0;
+ pointer-events: none;
+ background-color: color-mix(
+ in srgb,
+ var(--tb-backgroundColor) 55%,
+ transparent
+ );
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+ box-shadow: 0px 16px 40px -12px color-mix(in srgb, var(--tb-backgroundColor)
+ 80%, transparent);
+ border-radius: 28px;
+ z-index: 20;
+ transition: opacity 0.35s ease, transform 0.35s ease;
+ padding: 0;
+}
+
+.tb-message-popup::before {
+ content: "";
+ position: absolute;
+ inset: 0;
+ padding: 1px;
+ border-radius: inherit;
+ background: linear-gradient(
+ 130deg,
+ color-mix(in srgb, var(--tb-textColor) 14%, transparent),
+ color-mix(in srgb, var(--tb-textColor) 8%, transparent),
+ color-mix(in srgb, var(--tb-textColor) 12%, transparent)
+ );
+ mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
+ -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
+ mask-composite: xor;
+ -webkit-mask-composite: xor;
+ mask-composite: exclude;
+ pointer-events: none;
+ z-index: 1;
+}
+
+.tb-message-popup-content {
+ position: relative;
+ z-index: 2;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 10px 18px 10px 18px;
+ width: max-content;
+}
+
+.tb-message-popup-icon {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 22px;
+ color: color-mix(in srgb, var(--tb-textColor) 80%, transparent);
+}
+
+.tb-message-popup-text {
+ font-size: 16px;
+ line-height: 1;
+ color: var(--tb-textColor);
+ max-width: min(460px, 75vw);
+}
+
+.tb-message-popup-dismiss {
+ appearance: none;
+ border: none;
+ background: none;
+ color: var(--tb-textColor);
+ font-size: 22px;
+ line-height: 1;
+ padding: 0;
+ margin-left: 4px;
+ margin-bottom: 2px;
+ cursor: pointer;
+ transition: color 0.2s ease, transform 0.2s ease;
+}
+
+.tb-message-popup-dismiss:hover,
+.tb-message-popup-dismiss:focus-visible {
+ color: color-mix(in srgb, var(--tb-textColor) 90%, transparent);
+ transform: scale(1.05);
+}
+
+.tb-message-popup-visible {
+ opacity: 1;
+ transform: translate(-50%, 0) scale(1);
+ pointer-events: auto;
+}
+
+.tb-message-popup-hidden {
+ opacity: 0;
+ transform: translate(-50%, -12px) scale(0.98);
+ pointer-events: none;
+}
+
/* Account Menu Popup */
.tb-account-menu-popup {
position: fixed;
@@ -1557,22 +1914,20 @@
font-weight: 400;
position: absolute;
top: calc(50% - 17.5px);
- font-size: 16px;
transform: translateY(-50%);
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
- box-shadow: -1px 3px 50px 4px var(--tb-backgroundColor);
+ box-shadow: -1px 3px 35px 4px var(--tb-backgroundColor);
background-color: color-mix(
in srgb,
var(--tb-backgroundColor) 50%,
transparent
);
- font-size: 2rem;
cursor: pointer;
z-index: 10;
padding: 0;
- width: 35px;
- height: 35px;
+ width: 40px;
+ height: 40px;
line-height: 0.1px;
border-radius: 50%;
transition: background-color 0.3s ease, transform 0.2s ease, opacity 0.3s ease,
@@ -1580,6 +1935,7 @@
border: none;
opacity: 1;
visibility: visible;
+ padding: 10px;
}
.tb-scroll-btn::before {
@@ -1608,6 +1964,7 @@
.tb-scroll-btn > svg {
transition: fill 0.3s ease;
fill: var(--tb-textColor);
+ margin-bottom: 2px;
}
.tb-scroll-btn:hover {
@@ -1615,16 +1972,28 @@
transform: translateY(-50%) scale(1.075);
}
+.tb-scroll-btn:active {
+ transform: translateY(-50%) scale(0.975);
+}
+
.tb-scroll-btn:hover > svg {
fill: var(--tb-backgroundColor);
}
.tb-scroll-btn.tb-left {
- left: 25px;
+ left: var(--tb-header-footer-horizontal-padding, 25px);
}
.tb-scroll-btn.tb-right {
- right: 25px;
+ right: var(--tb-header-footer-horizontal-padding, 25px);
+}
+
+.tb-page-content-mobile .tb-scroll-btn.tb-left {
+ left: var(--tb-page-mobile-padding, 25px);
+}
+
+.tb-page-content-mobile .tb-scroll-btn.tb-right {
+ right: var(--tb-page-mobile-padding, 25px);
}
.tb-scroll-btn.tb-hidden {
@@ -2069,11 +2438,19 @@
line-height: 1.2;
}
+.tb-project-content h1.tb-title:first-child {
+ margin-top: 0;
+}
+
.tb-project-content-mobile h1.tb-title {
font-size: 28px;
line-height: 1.2;
}
+.tb-project-content-mobile h1.tb-title:first-child {
+ margin-top: 0;
+}
+
.tb-project-content h2.tb-title {
font-size: 32px;
font-weight: 600;
@@ -2081,11 +2458,19 @@
line-height: 1.2;
}
+.tb-project-content h2.tb-title:first-child {
+ margin-top: 0;
+}
+
.tb-project-content-mobile h2.tb-title {
font-size: 26px;
line-height: 1.2;
}
+.tb-project-content-mobile h2.tb-title:first-child {
+ margin-top: 0;
+}
+
.tb-project-content p.tb-paragraph {
font-weight: 500;
margin: 0;
diff --git a/src/styles/layout.css b/src/styles/layout.css
index 2ba52bb..62338e6 100644
--- a/src/styles/layout.css
+++ b/src/styles/layout.css
@@ -47,6 +47,7 @@
align-items: center;
justify-content: center;
padding: 20px;
+ background-color: #151515;
}
/* Page component styles */
diff --git a/vite.config.js b/vite.config.js
index ba19d19..deb3450 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -8,7 +8,7 @@ export default defineConfig({
plugins: [react(), svgo(), svgr()],
server: {
host: "0.0.0.0",
- allowedHosts: ["thehideout.tombutcher.work"],
+ allowedHosts: ["dev.tombutcher.work"],
},
base: "/",
});
diff --git a/yarn.lock b/yarn.lock
index 334fa51..a7b2f56 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -120,7 +120,7 @@
resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz"
integrity sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==
-"@babel/core@^7.0.0", "@babel/core@^7.0.0 || ^8.0.0-0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.1.0", "@babel/core@^7.11.0", "@babel/core@^7.11.1", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.16.0", "@babel/core@^7.21.3", "@babel/core@^7.28.0", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0":
+"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.21.3", "@babel/core@^7.28.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0":
version "7.28.4"
resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz"
integrity sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==
@@ -408,6 +408,11 @@
"@babel/helper-create-class-features-plugin" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
+"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2":
+ version "7.21.0-placeholder-for-preset-env.2"
+ resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz"
+ integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==
+
"@babel/plugin-proposal-private-property-in-object@^7.16.7":
version "7.21.11"
resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz"
@@ -418,11 +423,6 @@
"@babel/helper-plugin-utils" "^7.20.2"
"@babel/plugin-syntax-private-property-in-object" "^7.14.5"
-"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2":
- version "7.21.0-placeholder-for-preset-env.2"
- resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz"
- integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==
-
"@babel/plugin-syntax-async-generators@^7.8.4":
version "7.8.4"
resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz"
@@ -458,7 +458,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.27.1"
-"@babel/plugin-syntax-flow@^7.14.5", "@babel/plugin-syntax-flow@^7.27.1":
+"@babel/plugin-syntax-flow@^7.27.1":
version "7.27.1"
resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz"
integrity sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==
@@ -922,7 +922,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.27.1"
-"@babel/plugin-transform-react-jsx@^7.14.9", "@babel/plugin-transform-react-jsx@^7.27.1":
+"@babel/plugin-transform-react-jsx@^7.27.1":
version "7.27.1"
resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz"
integrity sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==
@@ -1322,11 +1322,136 @@
resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz"
integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
+"@esbuild/aix-ppc64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz#bef96351f16520055c947aba28802eede3c9e9a9"
+ integrity sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==
+
+"@esbuild/android-arm64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz#d2e70be7d51a529425422091e0dcb90374c1546c"
+ integrity sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==
+
+"@esbuild/android-arm@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.9.tgz#d2a753fe2a4c73b79437d0ba1480e2d760097419"
+ integrity sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==
+
+"@esbuild/android-x64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.9.tgz#5278836e3c7ae75761626962f902a0d55352e683"
+ integrity sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==
+
"@esbuild/darwin-arm64@0.25.9":
version "0.25.9"
resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz"
integrity sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==
+"@esbuild/darwin-x64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz#e27dbc3b507b3a1cea3b9280a04b8b6b725f82be"
+ integrity sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==
+
+"@esbuild/freebsd-arm64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz#364e3e5b7a1fd45d92be08c6cc5d890ca75908ca"
+ integrity sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==
+
+"@esbuild/freebsd-x64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz#7c869b45faeb3df668e19ace07335a0711ec56ab"
+ integrity sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==
+
+"@esbuild/linux-arm64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz#48d42861758c940b61abea43ba9a29b186d6cb8b"
+ integrity sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==
+
+"@esbuild/linux-arm@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz#6ce4b9cabf148274101701d112b89dc67cc52f37"
+ integrity sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==
+
+"@esbuild/linux-ia32@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz#207e54899b79cac9c26c323fc1caa32e3143f1c4"
+ integrity sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==
+
+"@esbuild/linux-loong64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz#0ba48a127159a8f6abb5827f21198b999ffd1fc0"
+ integrity sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==
+
+"@esbuild/linux-mips64el@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz#a4d4cc693d185f66a6afde94f772b38ce5d64eb5"
+ integrity sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==
+
+"@esbuild/linux-ppc64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz#0f5805c1c6d6435a1dafdc043cb07a19050357db"
+ integrity sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==
+
+"@esbuild/linux-riscv64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz#6776edece0f8fca79f3386398b5183ff2a827547"
+ integrity sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==
+
+"@esbuild/linux-s390x@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz#3f6f29ef036938447c2218d309dc875225861830"
+ integrity sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==
+
+"@esbuild/linux-x64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz#831fe0b0e1a80a8b8391224ea2377d5520e1527f"
+ integrity sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==
+
+"@esbuild/netbsd-arm64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz#06f99d7eebe035fbbe43de01c9d7e98d2a0aa548"
+ integrity sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==
+
+"@esbuild/netbsd-x64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz#db99858e6bed6e73911f92a88e4edd3a8c429a52"
+ integrity sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==
+
+"@esbuild/openbsd-arm64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz#afb886c867e36f9d86bb21e878e1185f5d5a0935"
+ integrity sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==
+
+"@esbuild/openbsd-x64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz#30855c9f8381fac6a0ef5b5f31ac6e7108a66ecf"
+ integrity sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==
+
+"@esbuild/openharmony-arm64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz#2f2144af31e67adc2a8e3705c20c2bd97bd88314"
+ integrity sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==
+
+"@esbuild/sunos-x64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz#69b99a9b5bd226c9eb9c6a73f990fddd497d732e"
+ integrity sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==
+
+"@esbuild/win32-arm64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz#d789330a712af916c88325f4ffe465f885719c6b"
+ integrity sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==
+
+"@esbuild/win32-ia32@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz#52fc735406bd49688253e74e4e837ac2ba0789e3"
+ integrity sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==
+
+"@esbuild/win32-x64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz#585624dc829cfb6e7c0aa6c3ca7d7e6daa87e34f"
+ integrity sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==
+
"@eslint-community/eslint-utils@^4.2.0":
version "4.9.0"
resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz"
@@ -1354,16 +1479,16 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
-"@eslint/js@^9.24.0":
- version "9.35.0"
- resolved "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz"
- integrity sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==
-
"@eslint/js@8.57.1":
version "8.57.1"
resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz"
integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==
+"@eslint/js@^9.24.0":
+ version "9.35.0"
+ resolved "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz"
+ integrity sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==
+
"@humanwhocodes/config-array@^0.13.0":
version "0.13.0"
resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz"
@@ -1688,7 +1813,7 @@
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
-"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
version "2.0.5"
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@@ -1701,11 +1826,71 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
+"@parcel/watcher-android-arm64@2.5.1":
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1"
+ integrity sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==
+
"@parcel/watcher-darwin-arm64@2.5.1":
version "2.5.1"
resolved "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz"
integrity sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==
+"@parcel/watcher-darwin-x64@2.5.1":
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz#99f3af3869069ccf774e4ddfccf7e64fd2311ef8"
+ integrity sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==
+
+"@parcel/watcher-freebsd-x64@2.5.1":
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz#14d6857741a9f51dfe51d5b08b7c8afdbc73ad9b"
+ integrity sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==
+
+"@parcel/watcher-linux-arm-glibc@2.5.1":
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz#43c3246d6892381db473bb4f663229ad20b609a1"
+ integrity sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==
+
+"@parcel/watcher-linux-arm-musl@2.5.1":
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz#663750f7090bb6278d2210de643eb8a3f780d08e"
+ integrity sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==
+
+"@parcel/watcher-linux-arm64-glibc@2.5.1":
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz#ba60e1f56977f7e47cd7e31ad65d15fdcbd07e30"
+ integrity sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==
+
+"@parcel/watcher-linux-arm64-musl@2.5.1":
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz#f7fbcdff2f04c526f96eac01f97419a6a99855d2"
+ integrity sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==
+
+"@parcel/watcher-linux-x64-glibc@2.5.1":
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz#4d2ea0f633eb1917d83d483392ce6181b6a92e4e"
+ integrity sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==
+
+"@parcel/watcher-linux-x64-musl@2.5.1":
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz#277b346b05db54f55657301dd77bdf99d63606ee"
+ integrity sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==
+
+"@parcel/watcher-win32-arm64@2.5.1":
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz#7e9e02a26784d47503de1d10e8eab6cceb524243"
+ integrity sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==
+
+"@parcel/watcher-win32-ia32@2.5.1":
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz#2d0f94fa59a873cdc584bf7f6b1dc628ddf976e6"
+ integrity sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==
+
+"@parcel/watcher-win32-x64@2.5.1":
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz#ae52693259664ba6f2228fa61d7ee44b64ea0947"
+ integrity sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==
+
"@parcel/watcher@^2.4.1":
version "2.5.1"
resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz"
@@ -1889,11 +2074,111 @@
estree-walker "^2.0.2"
picomatch "^4.0.2"
+"@rollup/rollup-android-arm-eabi@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.1.tgz#7d41dc45adcfcb272504ebcea9c8a5b2c659e963"
+ integrity sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==
+
+"@rollup/rollup-android-arm64@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.1.tgz#6c708fae2c9755e994c42d56c34a94cb77020650"
+ integrity sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==
+
"@rollup/rollup-darwin-arm64@4.50.1":
version "4.50.1"
resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.1.tgz"
integrity sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==
+"@rollup/rollup-darwin-x64@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.1.tgz#0af089f3d658d05573208dabb3a392b44d7f4630"
+ integrity sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==
+
+"@rollup/rollup-freebsd-arm64@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.1.tgz#46c22a16d18180e99686647543335567221caa9c"
+ integrity sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==
+
+"@rollup/rollup-freebsd-x64@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.1.tgz#819ffef2f81891c266456952962a13110c8e28b5"
+ integrity sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==
+
+"@rollup/rollup-linux-arm-gnueabihf@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.1.tgz#7fe283c14793e607e653a3214b09f8973f08262a"
+ integrity sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==
+
+"@rollup/rollup-linux-arm-musleabihf@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.1.tgz#066e92eb22ea30560414ec800a6d119ba0b435ac"
+ integrity sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==
+
+"@rollup/rollup-linux-arm64-gnu@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.1.tgz#480d518ea99a8d97b2a174c46cd55164f138cc37"
+ integrity sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==
+
+"@rollup/rollup-linux-arm64-musl@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.1.tgz#ed7db3b8999b60dd20009ddf71c95f3af49423c8"
+ integrity sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==
+
+"@rollup/rollup-linux-loongarch64-gnu@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.1.tgz#16a6927a35f5dbc505ff874a4e1459610c0c6f46"
+ integrity sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==
+
+"@rollup/rollup-linux-ppc64-gnu@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.1.tgz#a006700469be0041846c45b494c35754e6a04eea"
+ integrity sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==
+
+"@rollup/rollup-linux-riscv64-gnu@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.1.tgz#0fcc45b2ec8a0e54218ca48849ea6d596f53649c"
+ integrity sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==
+
+"@rollup/rollup-linux-riscv64-musl@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.1.tgz#d6e617eec9fe6f5859ee13fad435a16c42b469f2"
+ integrity sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==
+
+"@rollup/rollup-linux-s390x-gnu@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.1.tgz#b147760d63c6f35b4b18e6a25a2a760dd3ea0c05"
+ integrity sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==
+
+"@rollup/rollup-linux-x64-gnu@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.1.tgz#fc0be1da374f85e7e85dccaf1ff12d7cfc9fbe3d"
+ integrity sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==
+
+"@rollup/rollup-linux-x64-musl@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.1.tgz#54c79932e0f9a3c992b034c82325be3bcde0d067"
+ integrity sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==
+
+"@rollup/rollup-openharmony-arm64@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.1.tgz#fc48e74d413623ac02c1d521bec3e5e784488fdc"
+ integrity sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==
+
+"@rollup/rollup-win32-arm64-msvc@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.1.tgz#8ce3d1181644406362cf1e62c90e88ab083e02bb"
+ integrity sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==
+
+"@rollup/rollup-win32-ia32-msvc@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.1.tgz#dd2dfc896eac4b2689d55f01c6d51c249263f805"
+ integrity sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==
+
+"@rollup/rollup-win32-x64-msvc@4.50.1":
+ version "4.50.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.1.tgz#13f758c97b9fbbac56b6928547a3ff384e7cfb3e"
+ integrity sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==
+
"@rtsao/scc@^1.1.0":
version "1.1.0"
resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz"
@@ -1933,99 +2218,85 @@
magic-string "^0.25.0"
string.prototype.matchall "^4.0.6"
-"@svgr/babel-plugin-add-jsx-attribute@^5.4.0":
- version "5.4.0"
- resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz"
- integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==
-
"@svgr/babel-plugin-add-jsx-attribute@8.0.0":
version "8.0.0"
resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz"
integrity sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==
-"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0":
+"@svgr/babel-plugin-add-jsx-attribute@^5.4.0":
version "5.4.0"
- resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz"
- integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==
+ resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz"
+ integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==
"@svgr/babel-plugin-remove-jsx-attribute@8.0.0":
version "8.0.0"
resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz"
integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==
-"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1":
- version "5.0.1"
- resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz"
- integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==
+"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz"
+ integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==
"@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0":
version "8.0.0"
resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz"
integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==
-"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1":
+"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1":
version "5.0.1"
- resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz"
- integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==
+ resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz"
+ integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==
"@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0":
version "8.0.0"
resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz"
integrity sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==
-"@svgr/babel-plugin-svg-dynamic-title@^5.4.0":
- version "5.4.0"
- resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz"
- integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==
+"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1":
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz"
+ integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==
"@svgr/babel-plugin-svg-dynamic-title@8.0.0":
version "8.0.0"
resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz"
integrity sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==
-"@svgr/babel-plugin-svg-em-dimensions@^5.4.0":
+"@svgr/babel-plugin-svg-dynamic-title@^5.4.0":
version "5.4.0"
- resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz"
- integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==
+ resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz"
+ integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==
"@svgr/babel-plugin-svg-em-dimensions@8.0.0":
version "8.0.0"
resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz"
integrity sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==
-"@svgr/babel-plugin-transform-react-native-svg@^5.4.0":
+"@svgr/babel-plugin-svg-em-dimensions@^5.4.0":
version "5.4.0"
- resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz"
- integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==
+ resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz"
+ integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==
"@svgr/babel-plugin-transform-react-native-svg@8.1.0":
version "8.1.0"
resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz"
integrity sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==
-"@svgr/babel-plugin-transform-svg-component@^5.5.0":
- version "5.5.0"
- resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz"
- integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==
+"@svgr/babel-plugin-transform-react-native-svg@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz"
+ integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==
"@svgr/babel-plugin-transform-svg-component@8.0.0":
version "8.0.0"
resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz"
integrity sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==
-"@svgr/babel-preset@^5.5.0":
+"@svgr/babel-plugin-transform-svg-component@^5.5.0":
version "5.5.0"
- resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz"
- integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==
- dependencies:
- "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0"
- "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0"
- "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1"
- "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1"
- "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0"
- "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0"
- "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0"
- "@svgr/babel-plugin-transform-svg-component" "^5.5.0"
+ resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz"
+ integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==
"@svgr/babel-preset@8.1.0":
version "8.1.0"
@@ -2041,16 +2312,19 @@
"@svgr/babel-plugin-transform-react-native-svg" "8.1.0"
"@svgr/babel-plugin-transform-svg-component" "8.0.0"
-"@svgr/core@*", "@svgr/core@^8.1.0":
- version "8.1.0"
- resolved "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz"
- integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==
+"@svgr/babel-preset@^5.5.0":
+ version "5.5.0"
+ resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz"
+ integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==
dependencies:
- "@babel/core" "^7.21.3"
- "@svgr/babel-preset" "8.1.0"
- camelcase "^6.2.0"
- cosmiconfig "^8.1.3"
- snake-case "^3.0.4"
+ "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0"
+ "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0"
+ "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1"
+ "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1"
+ "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0"
+ "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0"
+ "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0"
+ "@svgr/babel-plugin-transform-svg-component" "^5.5.0"
"@svgr/core@^5.5.0":
version "5.5.0"
@@ -2061,12 +2335,16 @@
camelcase "^6.2.0"
cosmiconfig "^7.0.0"
-"@svgr/hast-util-to-babel-ast@^5.5.0":
- version "5.5.0"
- resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz"
- integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==
+"@svgr/core@^8.1.0":
+ version "8.1.0"
+ resolved "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz"
+ integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==
dependencies:
- "@babel/types" "^7.12.6"
+ "@babel/core" "^7.21.3"
+ "@svgr/babel-preset" "8.1.0"
+ camelcase "^6.2.0"
+ cosmiconfig "^8.1.3"
+ snake-case "^3.0.4"
"@svgr/hast-util-to-babel-ast@8.0.0":
version "8.0.0"
@@ -2076,6 +2354,13 @@
"@babel/types" "^7.21.3"
entities "^4.4.0"
+"@svgr/hast-util-to-babel-ast@^5.5.0":
+ version "5.5.0"
+ resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz"
+ integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==
+ dependencies:
+ "@babel/types" "^7.12.6"
+
"@svgr/plugin-jsx@^5.5.0":
version "5.5.0"
resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz"
@@ -2131,20 +2416,6 @@
dependencies:
"@tanstack/query-core" "5.90.7"
-"@testing-library/dom@^10.0.0", "@testing-library/dom@>=7.21.4":
- version "10.4.1"
- resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz"
- integrity sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==
- dependencies:
- "@babel/code-frame" "^7.10.4"
- "@babel/runtime" "^7.12.5"
- "@types/aria-query" "^5.0.1"
- aria-query "5.3.0"
- dom-accessibility-api "^0.5.9"
- lz-string "^1.5.0"
- picocolors "1.1.1"
- pretty-format "^27.0.2"
-
"@testing-library/jest-dom@^6.6.3":
version "6.8.0"
resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.8.0.tgz"
@@ -2195,7 +2466,7 @@
"@tsparticles/updater-out-modes" "3.9.1"
"@tsparticles/updater-size" "3.9.1"
-"@tsparticles/engine@^3.0.2", "@tsparticles/engine@3.9.1":
+"@tsparticles/engine@3.9.1":
version "3.9.1"
resolved "https://registry.npmjs.org/@tsparticles/engine/-/engine-3.9.1.tgz"
integrity sha512-DpdgAhWMZ3Eh2gyxik8FXS6BKZ8vyea+Eu5BC4epsahqTGY9V3JGGJcXC6lRJx6cPMAx1A0FaQAojPF3v6rkmQ==
@@ -2468,12 +2739,7 @@
dependencies:
"@tsparticles/engine" "3.9.1"
-"@types/aria-query@^5.0.1":
- version "5.0.4"
- resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz"
- integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==
-
-"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.9", "@types/babel__core@^7.20.5":
+"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.20.5":
version "7.20.5"
resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz"
integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==
@@ -2560,7 +2826,7 @@
"@types/estree" "*"
"@types/json-schema" "*"
-"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.8", "@types/estree@1.0.8":
+"@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.8":
version "1.0.8"
resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz"
integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
@@ -2674,7 +2940,7 @@
dependencies:
"@types/node" "*"
-"@types/node@*", "@types/node@^18.0.0 || ^20.0.0 || >=22.0.0":
+"@types/node@*":
version "24.3.3"
resolved "https://registry.npmjs.org/@types/node/-/node-24.3.3.tgz"
integrity sha512-GKBNHjoNw3Kra1Qg5UXttsY5kiWMEfoHq2TmXb+b1rcm6N7B3wTrFYIf/oSZ1xNQ+hVVijgLkiDZh7jRRsh+Gw==
@@ -2706,12 +2972,12 @@
resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz"
integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==
-"@types/react-dom@^18.0.0 || ^19.0.0", "@types/react-dom@^19.1.1":
+"@types/react-dom@^19.1.1":
version "19.1.9"
resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz"
integrity sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==
-"@types/react@^18.0.0 || ^19.0.0", "@types/react@^19.0.0", "@types/react@^19.1.0":
+"@types/react@^19.1.0":
version "19.1.13"
resolved "https://registry.npmjs.org/@types/react/-/react-19.1.13.tgz"
integrity sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==
@@ -2802,7 +3068,7 @@
dependencies:
"@types/yargs-parser" "*"
-"@typescript-eslint/eslint-plugin@^4.0.0 || ^5.0.0", "@typescript-eslint/eslint-plugin@^5.5.0":
+"@typescript-eslint/eslint-plugin@^5.5.0":
version "5.62.0"
resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz"
integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==
@@ -2825,7 +3091,7 @@
dependencies:
"@typescript-eslint/utils" "5.62.0"
-"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.5.0":
+"@typescript-eslint/parser@^5.5.0":
version "5.62.0"
resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz"
integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==
@@ -2871,7 +3137,7 @@
semver "^7.3.7"
tsutils "^3.21.0"
-"@typescript-eslint/utils@^5.58.0", "@typescript-eslint/utils@5.62.0":
+"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.58.0":
version "5.62.0"
resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz"
integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==
@@ -2910,7 +3176,7 @@
"@types/babel__core" "^7.20.5"
react-refresh "^0.17.0"
-"@webassemblyjs/ast@^1.14.1", "@webassemblyjs/ast@1.14.1":
+"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1":
version "1.14.1"
resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz"
integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==
@@ -3011,7 +3277,7 @@
"@webassemblyjs/wasm-gen" "1.14.1"
"@webassemblyjs/wasm-parser" "1.14.1"
-"@webassemblyjs/wasm-parser@^1.14.1", "@webassemblyjs/wasm-parser@1.14.1":
+"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1":
version "1.14.1"
resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz"
integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==
@@ -3077,16 +3343,16 @@ acorn-walk@^7.1.1:
resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz"
integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
-"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.14.0, acorn@^8.15.0, acorn@^8.2.4, acorn@^8.9.0:
- version "8.15.0"
- resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz"
- integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
-
acorn@^7.1.1:
version "7.4.1"
resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+acorn@^8.15.0, acorn@^8.2.4, acorn@^8.9.0:
+ version "8.15.0"
+ resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz"
+ integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
+
address@^1.0.1, address@^1.1.2:
version "1.2.2"
resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz"
@@ -3126,7 +3392,7 @@ ajv-keywords@^5.1.0:
dependencies:
fast-deep-equal "^3.1.3"
-ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1:
+ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5:
version "6.12.6"
resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -3136,17 +3402,7 @@ ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
-ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0:
- version "8.17.1"
- resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz"
- integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
- dependencies:
- fast-deep-equal "^3.1.3"
- fast-uri "^3.0.1"
- json-schema-traverse "^1.0.0"
- require-from-string "^2.0.2"
-
-ajv@^8.6.0, ajv@>=8:
+ajv@^8.0.0, ajv@^8.6.0, ajv@^8.9.0:
version "8.17.1"
resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz"
integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
@@ -3297,13 +3553,6 @@ aria-query@^5.0.0, aria-query@^5.3.2:
resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz"
integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==
-aria-query@5.3.0:
- version "5.3.0"
- resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz"
- integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==
- dependencies:
- dequal "^2.0.3"
-
array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz"
@@ -3741,7 +3990,7 @@ browser-process-hrtime@^1.0.0:
resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz"
integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
-browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.4, browserslist@^4.24.0, browserslist@^4.24.4, browserslist@^4.25.3, "browserslist@>= 4", "browserslist@>= 4.21.0", browserslist@>=4:
+browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.4, browserslist@^4.24.0, browserslist@^4.24.4, browserslist@^4.25.3:
version "4.26.0"
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.26.0.tgz"
integrity sha512-P9go2WrP9FiPwLv3zqRD/Uoxo0RSHjzFCiQz7d4vbmwNqQFo9T9WCeP/Qn5EbcKQY6DBbkxEXNcpJOmncNrb7A==
@@ -3917,7 +4166,7 @@ cjs-module-lexer@^1.0.0:
resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz"
integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==
-classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@^2.5.1, classnames@2.x:
+classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@^2.5.1:
version "2.5.1"
resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz"
integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==
@@ -3978,6 +4227,11 @@ color-convert@^3.1.2:
dependencies:
color-name "^2.0.0"
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
color-name@^2.0.0:
version "2.0.2"
resolved "https://registry.npmjs.org/color-name/-/color-name-2.0.2.tgz"
@@ -3988,11 +4242,6 @@ color-name@~1.1.4:
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-color-name@1.1.3:
- version "1.1.3"
- resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
- integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
-
colord@^2.9.1:
version "2.9.3"
resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz"
@@ -4107,16 +4356,16 @@ cookie-signature@1.0.6:
resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz"
integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
-cookie@^1.0.1:
- version "1.0.2"
- resolved "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz"
- integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==
-
cookie@0.7.1:
version "0.7.1"
resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz"
integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==
+cookie@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz"
+ integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==
+
copy-to-clipboard@^3.3.3:
version "3.3.3"
resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz"
@@ -4284,6 +4533,14 @@ css-select@^5.1.0:
domutils "^3.0.1"
nth-check "^2.0.1"
+css-tree@1.0.0-alpha.37:
+ version "1.0.0-alpha.37"
+ resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz"
+ integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==
+ dependencies:
+ mdn-data "2.0.4"
+ source-map "^0.6.1"
+
css-tree@^1.1.2, css-tree@^1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz"
@@ -4308,14 +4565,6 @@ css-tree@~2.2.0:
mdn-data "2.0.28"
source-map-js "^1.0.1"
-css-tree@1.0.0-alpha.37:
- version "1.0.0-alpha.37"
- resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz"
- integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==
- dependencies:
- mdn-data "2.0.4"
- source-map "^0.6.1"
-
css-what@^3.2.1:
version "3.4.2"
resolved "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz"
@@ -4467,18 +4716,25 @@ data-view-byte-offset@^1.0.1:
es-errors "^1.3.0"
is-data-view "^1.0.1"
-dayjs@^1.11.11, dayjs@^1.11.19, "dayjs@>= 1.x":
+dayjs@^1.11.11, dayjs@^1.11.19:
version "1.11.19"
resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz"
integrity sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==
-debug@^2.6.0:
+debug@2.6.9, debug@^2.6.0:
version "2.6.9"
resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
+debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.1:
+ version "4.4.1"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz"
+ integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
+ dependencies:
+ ms "^2.1.3"
+
debug@^3.2.7:
version "3.2.7"
resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
@@ -4486,20 +4742,6 @@ debug@^3.2.7:
dependencies:
ms "^2.1.1"
-debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.1, debug@4:
- version "4.4.1"
- resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz"
- integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
- dependencies:
- ms "^2.1.3"
-
-debug@2.6.9:
- version "2.6.9"
- resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
- integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
- dependencies:
- ms "2.0.0"
-
decimal.js@^10.2.1:
version "10.6.0"
resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz"
@@ -4555,20 +4797,15 @@ delayed-stream@~1.0.0:
resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
-depd@~1.1.2:
- version "1.1.2"
- resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
- integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
-
depd@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz"
integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
-dequal@^2.0.3:
- version "2.0.3"
- resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz"
- integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
+ integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
destroy@1.2.0:
version "1.2.0"
@@ -4641,11 +4878,6 @@ doctrine@^3.0.0:
dependencies:
esutils "^2.0.2"
-dom-accessibility-api@^0.5.9:
- version "0.5.16"
- resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz"
- integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==
-
dom-accessibility-api@^0.6.3:
version "0.6.3"
resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz"
@@ -4658,6 +4890,14 @@ dom-converter@^0.2.0:
dependencies:
utila "~0.4"
+dom-serializer@0:
+ version "0.2.2"
+ resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz"
+ integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
+ dependencies:
+ domelementtype "^2.0.1"
+ entities "^2.0.0"
+
dom-serializer@^1.0.1:
version "1.4.1"
resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz"
@@ -4676,24 +4916,16 @@ dom-serializer@^2.0.0:
domhandler "^5.0.2"
entities "^4.2.0"
-dom-serializer@0:
- version "0.2.2"
- resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz"
- integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
- dependencies:
- domelementtype "^2.0.1"
- entities "^2.0.0"
+domelementtype@1:
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz"
+ integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0:
version "2.3.0"
resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz"
integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
-domelementtype@1:
- version "1.3.1"
- resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz"
- integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
-
domexception@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz"
@@ -4853,12 +5085,7 @@ entities@^2.0.0:
resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz"
integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
-entities@^4.2.0:
- version "4.5.0"
- resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz"
- integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
-
-entities@^4.4.0:
+entities@^4.2.0, entities@^4.4.0:
version "4.5.0"
resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz"
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
@@ -5235,7 +5462,7 @@ eslint-plugin-testing-library@^5.0.1:
dependencies:
"@typescript-eslint/utils" "^5.58.0"
-eslint-scope@^5.1.1, eslint-scope@5.1.1:
+eslint-scope@5.1.1, eslint-scope@^5.1.1:
version "5.1.1"
resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz"
integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@@ -5272,7 +5499,7 @@ eslint-webpack-plugin@^3.1.1:
normalize-path "^3.0.0"
schema-utils "^4.0.0"
-eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.5.0 || ^8.0.0", "eslint@^7.5.0 || ^8.0.0 || ^9.0.0", eslint@^8.0.0, eslint@^8.1.0, eslint@^8.3.0, "eslint@>= 6", eslint@>=8.40:
+eslint@^8.3.0:
version "8.57.1"
resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz"
integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==
@@ -5325,16 +5552,16 @@ espree@^9.6.0, espree@^9.6.1:
acorn-jsx "^5.3.2"
eslint-visitor-keys "^3.4.1"
-esprima@^4.0.0, esprima@^4.0.1:
- version "4.0.1"
- resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
- integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-
esprima@1.2.2:
version "1.2.2"
resolved "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz"
integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==
+esprima@^4.0.0, esprima@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
esquery@^1.4.2:
version "1.6.0"
resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz"
@@ -5349,12 +5576,7 @@ esrecurse@^4.3.0:
dependencies:
estraverse "^5.2.0"
-estraverse@^4.1.1:
- version "4.3.0"
- resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz"
- integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
-
-estraverse@^4.2.0:
+estraverse@^4.1.1, estraverse@^4.2.0:
version "4.3.0"
resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz"
integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
@@ -5513,12 +5735,7 @@ fb-watchman@^2.0.0:
dependencies:
bser "2.1.1"
-fdir@^6.4.4:
- version "6.5.0"
- resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz"
- integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==
-
-fdir@^6.5.0:
+fdir@^6.4.4, fdir@^6.5.0:
version "6.5.0"
resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz"
integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==
@@ -6058,16 +6275,6 @@ http-deceiver@^1.2.7:
resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz"
integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==
-http-errors@~1.6.2:
- version "1.6.3"
- resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz"
- integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==
- dependencies:
- depd "~1.1.2"
- inherits "2.0.3"
- setprototypeof "1.1.0"
- statuses ">= 1.4.0 < 2"
-
http-errors@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz"
@@ -6079,6 +6286,16 @@ http-errors@2.0.0:
statuses "2.0.1"
toidentifier "1.0.1"
+http-errors@~1.6.2:
+ version "1.6.3"
+ resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz"
+ integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.0"
+ statuses ">= 1.4.0 < 2"
+
http-parser-js@>=0.5.1:
version "0.5.10"
resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz"
@@ -6131,13 +6348,6 @@ hyphenate-style-name@^1.0.0:
resolved "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz"
integrity sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==
-iconv-lite@^0.6.3:
- version "0.6.3"
- resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz"
- integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
- dependencies:
- safer-buffer ">= 2.1.2 < 3.0.0"
-
iconv-lite@0.4.24:
version "0.4.24"
resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"
@@ -6145,6 +6355,13 @@ iconv-lite@0.4.24:
dependencies:
safer-buffer ">= 2.1.2 < 3"
+iconv-lite@^0.6.3:
+ version "0.6.3"
+ resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
icss-utils@^5.0.0, icss-utils@^5.1.0:
version "5.1.0"
resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz"
@@ -6211,7 +6428,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4:
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -6235,16 +6452,16 @@ internal-slot@^1.1.0:
hasown "^2.0.2"
side-channel "^1.1.0"
-ipaddr.js@^2.0.1:
- version "2.2.0"
- resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz"
- integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==
-
ipaddr.js@1.9.1:
version "1.9.1"
resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz"
integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+ipaddr.js@^2.0.1:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz"
+ integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==
+
is-array-buffer@^3.0.4, is-array-buffer@^3.0.5:
version "3.0.5"
resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz"
@@ -6871,7 +7088,7 @@ jest-resolve-dependencies@^27.5.1:
jest-regex-util "^27.5.1"
jest-snapshot "^27.5.1"
-jest-resolve@*, jest-resolve@^27.4.2, jest-resolve@^27.5.1:
+jest-resolve@^27.4.2, jest-resolve@^27.5.1:
version "27.5.1"
resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz"
integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==
@@ -7081,7 +7298,7 @@ jest-worker@^28.0.2:
merge-stream "^2.0.0"
supports-color "^8.0.0"
-"jest@^27.0.0 || ^28.0.0", jest@^27.4.3:
+jest@^27.4.3:
version "27.5.1"
resolved "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz"
integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==
@@ -7090,7 +7307,7 @@ jest-worker@^28.0.2:
import-local "^3.0.2"
jest-cli "^27.5.1"
-jiti@^1.21.6, jiti@>=1.21.0:
+jiti@^1.21.6:
version "1.21.7"
resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz"
integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==
@@ -7430,11 +7647,6 @@ lru-cache@^5.1.1:
dependencies:
yallist "^3.0.2"
-lz-string@^1.5.0:
- version "1.5.0"
- resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz"
- integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==
-
magic-string@^0.25.0, magic-string@^0.25.7:
version "0.25.9"
resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz"
@@ -7535,16 +7747,16 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8:
braces "^3.0.3"
picomatch "^2.3.1"
-"mime-db@>= 1.43.0 < 2":
- version "1.54.0"
- resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz"
- integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==
-
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+"mime-db@>= 1.43.0 < 2":
+ version "1.54.0"
+ resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz"
+ integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==
+
mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@^2.1.35, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34:
version "2.1.35"
resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
@@ -7618,16 +7830,16 @@ mkdirp@~0.5.1:
dependencies:
minimist "^1.2.6"
-ms@^2.1.1, ms@^2.1.3, ms@2.1.3:
- version "2.1.3"
- resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
- integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
-
ms@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+ms@2.1.3, ms@^2.1.1, ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
multicast-dns@^7.2.5:
version "7.2.5"
resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz"
@@ -7660,16 +7872,16 @@ natural-compare@^1.4.0:
resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
-negotiator@~0.6.4:
- version "0.6.4"
- resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz"
- integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==
-
negotiator@0.6.3:
version "0.6.3"
resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+negotiator@~0.6.4:
+ version "0.6.4"
+ resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz"
+ integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==
+
neo-async@^2.6.2:
version "2.6.2"
resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz"
@@ -7897,7 +8109,7 @@ overlayscrollbars-react@^0.5.6:
resolved "https://registry.npmjs.org/overlayscrollbars-react/-/overlayscrollbars-react-0.5.6.tgz"
integrity sha512-E5To04bL5brn9GVCZ36SnfGanxa2I2MDkWoa4Cjo5wol7l+diAgi4DBc983V7l2nOk/OLJ6Feg4kySspQEGDBw==
-overlayscrollbars@^2.0.0, overlayscrollbars@^2.12.0:
+overlayscrollbars@^2.12.0:
version "2.12.0"
resolved "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-2.12.0.tgz"
integrity sha512-mWJ5MOkcZ/ljHwfLw8+bN0V9ziGCoNoqULcp994j5DTGNQvnkWKWkA7rnO29Kyew5AoHxUnJ4Ndqfcl0HSQjXg==
@@ -8060,7 +8272,7 @@ picocolors@^0.2.1:
resolved "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz"
integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==
-picocolors@^1.0.0, picocolors@^1.1.1, picocolors@1.1.1:
+picocolors@^1.0.0, picocolors@^1.1.1:
version "1.1.1"
resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
@@ -8070,12 +8282,7 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatc
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-"picomatch@^3 || ^4", picomatch@^4.0.2, picomatch@^4.0.3:
- version "4.0.3"
- resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz"
- integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==
-
-picomatch@^4.0.2:
+picomatch@^4.0.2, picomatch@^4.0.3:
version "4.0.3"
resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz"
integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==
@@ -8652,15 +8859,6 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^
resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
-"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.1.4, postcss@^8.2, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.2.2, postcss@^8.3, postcss@^8.3.5, postcss@^8.4, postcss@^8.4.21, postcss@^8.4.33, postcss@^8.4.4, postcss@^8.4.47, postcss@^8.4.6, postcss@^8.5.3, "postcss@>= 8", postcss@>=8, postcss@>=8.0.9:
- version "8.5.6"
- resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz"
- integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
- dependencies:
- nanoid "^3.3.11"
- picocolors "^1.1.1"
- source-map-js "^1.2.1"
-
postcss@^7.0.35:
version "7.0.39"
resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz"
@@ -8669,6 +8867,15 @@ postcss@^7.0.35:
picocolors "^0.2.1"
source-map "^0.6.1"
+postcss@^8.3.5, postcss@^8.4.33, postcss@^8.4.4, postcss@^8.4.47, postcss@^8.5.3:
+ version "8.5.6"
+ resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz"
+ integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
+ dependencies:
+ nanoid "^3.3.11"
+ picocolors "^1.1.1"
+ source-map-js "^1.2.1"
+
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
@@ -8692,7 +8899,7 @@ pretty-error@^4.0.0:
lodash "^4.17.20"
renderkid "^3.0.0"
-pretty-format@^27.0.2, pretty-format@^27.5.1:
+pretty-format@^27.5.1:
version "27.5.1"
resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz"
integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==
@@ -9214,7 +9421,7 @@ react-dev-utils@^12.0.1:
strip-ansi "^6.0.1"
text-table "^0.2.0"
-react-dom@*, "react-dom@^15.5.4 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.2 || ^18.0.0 || ^19.0", "react-dom@^18.0.0 || ^19.0.0", react-dom@^19.1.0, "react-dom@>= 16.13.1", react-dom@>=16.0.0, react-dom@>=16.11.0, react-dom@>=16.8.0, react-dom@>=16.9.0, react-dom@>=18, react-dom@>=18.0.0:
+react-dom@^19.1.0:
version "19.1.1"
resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz"
integrity sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==
@@ -9258,7 +9465,7 @@ react-particles@^2.12.2:
dependencies:
tsparticles-engine "^2.12.0"
-react-refresh@^0.11.0, "react-refresh@>=0.10.0 <1.0.0":
+react-refresh@^0.11.0:
version "0.11.0"
resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz"
integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==
@@ -9361,7 +9568,7 @@ react-turnstile@^1.1.4:
resolved "https://registry.npmjs.org/react-turnstile/-/react-turnstile-1.1.4.tgz"
integrity sha512-oluyRWADdsufCt5eMqacW4gfw8/csr6Tk+fmuaMx0PWMKP1SX1iCviLvD2D5w92eAzIYDHi/krUWGHhlfzxTpQ==
-react@*, "react@^15.5.4 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8 || ^17 || ^18 || ^19", "react@^17.0.2 || ^18.0.0 || ^19.0", "react@^18 || ^19", "react@^18.0.0 || ^19.0.0", react@^19.1.0, react@^19.1.1, "react@>= 16", "react@>= 16.13.1", react@>=16, react@>=16.0.0, react@>=16.11.0, react@>=16.8.0, react@>=16.9.0, react@>=18, react@>=18.0.0:
+react@^19.1.0:
version "19.1.1"
resolved "https://registry.npmjs.org/react/-/react-19.1.1.tgz"
integrity sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==
@@ -9608,7 +9815,7 @@ rollup-plugin-terser@^7.0.0:
serialize-javascript "^4.0.0"
terser "^5.0.0"
-"rollup@^1.20.0 || ^2.0.0", rollup@^1.20.0||^2.0.0, rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^2.0.0, rollup@^2.43.1:
+rollup@^2.43.1:
version "2.79.2"
resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz"
integrity sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==
@@ -9663,7 +9870,7 @@ safe-array-concat@^1.1.2, safe-array-concat@^1.1.3:
has-symbols "^1.1.0"
isarray "^2.0.5"
-safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1:
+safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -9708,7 +9915,7 @@ sass-loader@^12.3.0:
klona "^2.0.4"
neo-async "^2.6.2"
-sass@*, sass@^1.3.0, sass@^1.86.3:
+sass@^1.86.3:
version "1.92.1"
resolved "https://registry.npmjs.org/sass/-/sass-1.92.1.tgz"
integrity sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==
@@ -9736,6 +9943,15 @@ scheduler@^0.26.0:
resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz"
integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==
+schema-utils@2.7.0:
+ version "2.7.0"
+ resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz"
+ integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==
+ dependencies:
+ "@types/json-schema" "^7.0.4"
+ ajv "^6.12.2"
+ ajv-keywords "^3.4.1"
+
schema-utils@^2.6.5:
version "2.7.1"
resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz"
@@ -9764,15 +9980,6 @@ schema-utils@^4.0.0, schema-utils@^4.2.0, schema-utils@^4.3.0, schema-utils@^4.3
ajv-formats "^2.1.1"
ajv-keywords "^5.1.0"
-schema-utils@2.7.0:
- version "2.7.0"
- resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz"
- integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==
- dependencies:
- "@types/json-schema" "^7.0.4"
- ajv "^6.12.2"
- ajv-keywords "^3.4.1"
-
scroll-into-view-if-needed@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz"
@@ -9798,27 +10005,7 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1:
resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-semver@^7.3.2:
- version "7.7.2"
- resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz"
- integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
-
-semver@^7.3.5:
- version "7.7.2"
- resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz"
- integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
-
-semver@^7.3.7:
- version "7.7.2"
- resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz"
- integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
-
-semver@^7.5.3:
- version "7.7.2"
- resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz"
- integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
-
-semver@^7.5.4:
+semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4:
version "7.7.2"
resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz"
integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
@@ -10064,7 +10251,7 @@ source-list-map@^2.0.0, source-list-map@^2.0.1:
resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz"
integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
-source-map-js@^1.0.1, source-map-js@^1.2.1, "source-map-js@>=0.6.2 <2.0.0":
+"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.2.1:
version "1.2.1"
resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz"
integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
@@ -10086,7 +10273,7 @@ source-map-support@^0.5.6, source-map-support@~0.5.20:
buffer-from "^1.0.0"
source-map "^0.6.0"
-source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1, source-map@0.6.1:
+source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
@@ -10160,16 +10347,16 @@ static-eval@2.0.2:
dependencies:
escodegen "^1.8.1"
-"statuses@>= 1.4.0 < 2":
- version "1.5.0"
- resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz"
- integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
-
statuses@2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz"
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+"statuses@>= 1.4.0 < 2":
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz"
+ integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
+
stop-iteration-iterator@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz"
@@ -10178,20 +10365,6 @@ stop-iteration-iterator@^1.1.0:
es-errors "^1.3.0"
internal-slot "^1.1.0"
-string_decoder@^1.1.1:
- version "1.3.0"
- resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
- integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
- dependencies:
- safe-buffer "~5.2.0"
-
-string_decoder@~1.1.1:
- version "1.1.1"
- resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
- integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
- dependencies:
- safe-buffer "~5.1.0"
-
string-convert@^0.2.0:
version "0.2.1"
resolved "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz"
@@ -10313,6 +10486,20 @@ string.prototype.trimstart@^1.0.8:
define-properties "^1.2.1"
es-object-atoms "^1.0.0"
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
stringify-object@^3.3.0:
version "3.3.0"
resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz"
@@ -10445,6 +10632,19 @@ svg-parser@^2.0.2, svg-parser@^2.0.4:
resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz"
integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==
+svgo@3.3.2:
+ version "3.3.2"
+ resolved "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz"
+ integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==
+ dependencies:
+ "@trysound/sax" "0.2.0"
+ commander "^7.2.0"
+ css-select "^5.1.0"
+ css-tree "^2.3.1"
+ css-what "^6.1.0"
+ csso "^5.0.5"
+ picocolors "^1.0.0"
+
svgo@^1.2.2:
version "1.3.2"
resolved "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz"
@@ -10477,19 +10677,6 @@ svgo@^2.7.0:
picocolors "^1.0.0"
stable "^0.1.8"
-svgo@3.3.2:
- version "3.3.2"
- resolved "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz"
- integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==
- dependencies:
- "@trysound/sax" "0.2.0"
- commander "^7.2.0"
- css-select "^5.1.0"
- css-tree "^2.3.1"
- css-what "^6.1.0"
- csso "^5.0.5"
- picocolors "^1.0.0"
-
symbol-tree@^3.2.4:
version "3.2.4"
resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz"
@@ -10567,7 +10754,7 @@ terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.11:
serialize-javascript "^6.0.2"
terser "^5.31.1"
-terser@^5.0.0, terser@^5.10.0, terser@^5.16.0, terser@^5.31.1:
+terser@^5.0.0, terser@^5.10.0, terser@^5.31.1:
version "5.44.0"
resolved "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz"
integrity sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==
@@ -10716,7 +10903,7 @@ tsutils@^3.21.0:
dependencies:
tslib "^1.8.1"
-type-check@^0.4.0:
+type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"
integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
@@ -10730,13 +10917,6 @@ type-check@~0.3.2:
dependencies:
prelude-ls "~1.1.2"
-type-check@~0.4.0:
- version "0.4.0"
- resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"
- integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
- dependencies:
- prelude-ls "^1.2.1"
-
type-detect@4.0.8:
version "4.0.8"
resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz"
@@ -10747,7 +10927,7 @@ type-fest@^0.16.0:
resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz"
integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==
-type-fest@^0.20.2, "type-fest@>=0.17.0 <5.0.0":
+type-fest@^0.20.2:
version "0.20.2"
resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz"
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
@@ -10817,11 +10997,6 @@ typedarray-to-buffer@^3.1.5:
dependencies:
is-typedarray "^1.0.0"
-"typescript@^3.2.1 || ^4", "typescript@>= 2.7", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=4.9.4, typescript@>=4.9.5:
- version "4.9.5"
- resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz"
- integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
-
unbox-primitive@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz"
@@ -10882,7 +11057,7 @@ universalify@^2.0.0:
resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz"
integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
-unpipe@~1.0.0, unpipe@1.0.0:
+unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
@@ -10980,7 +11155,7 @@ vite-plugin-svgr@^4.5.0:
"@svgr/core" "^8.1.0"
"@svgr/plugin-jsx" "^8.1.0"
-"vite@^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", vite@^6.2.5, vite@>=2.6.0, vite@>=4.0.2:
+vite@^6.2.5:
version "6.3.6"
resolved "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz"
integrity sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==
@@ -11061,7 +11236,7 @@ webpack-dev-middleware@^5.3.4:
range-parser "^1.2.1"
schema-utils "^4.0.0"
-webpack-dev-server@^4.6.0, "webpack-dev-server@3.x || 4.x || 5.x":
+webpack-dev-server@^4.6.0:
version "4.15.2"
resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz"
integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==
@@ -11126,7 +11301,7 @@ webpack-sources@^3.3.3:
resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz"
integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==
-"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", "webpack@^4.4.0 || ^5.9.0", "webpack@^4.44.2 || ^5.47.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.64.4, "webpack@>= 4", webpack@>=2, "webpack@>=4.43.0 <6.0.0":
+webpack@^5.64.4:
version "5.101.3"
resolved "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz"
integrity sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==
@@ -11157,7 +11332,7 @@ webpack-sources@^3.3.3:
watchpack "^2.4.1"
webpack-sources "^3.3.3"
-websocket-driver@^0.7.4, websocket-driver@>=0.5.1:
+websocket-driver@>=0.5.1, websocket-driver@^0.7.4:
version "0.7.4"
resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz"
integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==
@@ -11519,22 +11694,12 @@ yallist@^3.0.2:
resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
-yaml@^1.10.0:
+yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2:
version "1.10.2"
resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz"
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
-yaml@^1.10.2:
- version "1.10.2"
- resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz"
- integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
-
-yaml@^1.7.2:
- version "1.10.2"
- resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz"
- integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
-
-yaml@^2.3.4, yaml@^2.4.2:
+yaml@^2.3.4:
version "2.8.1"
resolved "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz"
integrity sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==