feat: webgl preview improvements, permissions refactor and snapshot safeguards
This commit is contained in:
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "white-nights",
|
"name": "white-nights",
|
||||||
"version": "1.0.6",
|
"version": "1.0.8",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "white-nights",
|
"name": "white-nights",
|
||||||
"version": "1.0.6",
|
"version": "1.0.8",
|
||||||
"license": "UNLICENSED",
|
"license": "UNLICENSED",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emotion/react": "^11.14.0",
|
"@emotion/react": "^11.14.0",
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ function useThumbSync(scrollableRef: React.RefObject<HTMLDivElement | null>) {
|
|||||||
height: 60,
|
height: 60,
|
||||||
top: 0,
|
top: 0,
|
||||||
hasScroll: false,
|
hasScroll: false,
|
||||||
|
isAtTop: true,
|
||||||
|
isAtBottom: false,
|
||||||
});
|
});
|
||||||
const [visible, setVisible] = useState(false);
|
const [visible, setVisible] = useState(false);
|
||||||
const hideTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
const hideTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
||||||
@@ -33,8 +35,11 @@ function useThumbSync(scrollableRef: React.RefObject<HTMLDivElement | null>) {
|
|||||||
const st = el.scrollTop;
|
const st = el.scrollTop;
|
||||||
const th = ch;
|
const th = ch;
|
||||||
|
|
||||||
|
const isAtTop = st <= 0;
|
||||||
|
const isAtBottom = st + ch >= sh - 1;
|
||||||
|
|
||||||
if (sh <= ch) {
|
if (sh <= ch) {
|
||||||
setState((prev) => ({ ...prev, hasScroll: false }));
|
setState((prev) => ({ ...prev, hasScroll: false, isAtTop: true, isAtBottom: true }));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,7 +48,7 @@ function useThumbSync(scrollableRef: React.RefObject<HTMLDivElement | null>) {
|
|||||||
const scrollRange = sh - ch;
|
const scrollRange = sh - ch;
|
||||||
const top = range <= 0 ? 0 : (st / scrollRange) * range;
|
const top = range <= 0 ? 0 : (st / scrollRange) * range;
|
||||||
|
|
||||||
setState({ height: thumbHeight, top, hasScroll: true });
|
setState({ height: thumbHeight, top, hasScroll: true, isAtTop, isAtBottom });
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -253,9 +258,12 @@ export const TouchableLayout = forwardRef<HTMLDivElement, TouchableLayoutProps>(
|
|||||||
};
|
};
|
||||||
}, [thumb.hasScroll]);
|
}, [thumb.hasScroll]);
|
||||||
|
|
||||||
const containerClassName = className
|
const containerClassName = [
|
||||||
? `scrollable-container ${className}`
|
"scrollable-container",
|
||||||
: "scrollable-container";
|
className,
|
||||||
|
thumb.isAtTop ? "is-at-top" : "",
|
||||||
|
thumb.isAtBottom ? "is-at-bottom" : "",
|
||||||
|
].filter(Boolean).join(" ");
|
||||||
|
|
||||||
const viewportStyle: React.CSSProperties = maxHeight
|
const viewportStyle: React.CSSProperties = maxHeight
|
||||||
? {
|
? {
|
||||||
|
|||||||
@@ -155,6 +155,19 @@ const useSightClustering = (
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const hasCustomIcon =
|
||||||
|
sight.is_default_icon === false && !isMediaIdEmpty(sight.icon ?? null);
|
||||||
|
|
||||||
|
if (hasCustomIcon) {
|
||||||
|
sight.visited = true;
|
||||||
|
clusteredResult.push({
|
||||||
|
type: "point",
|
||||||
|
id: String(sight.id),
|
||||||
|
data: sight,
|
||||||
|
});
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
const clusterSights: SightData[] = [];
|
const clusterSights: SightData[] = [];
|
||||||
const queue = [sight];
|
const queue = [sight];
|
||||||
sight.visited = true;
|
sight.visited = true;
|
||||||
@@ -164,8 +177,12 @@ const useSightClustering = (
|
|||||||
clusterSights.push(current);
|
clusterSights.push(current);
|
||||||
|
|
||||||
for (const potentialNeighbor of unclusteredSights) {
|
for (const potentialNeighbor of unclusteredSights) {
|
||||||
|
const neighborHasCustomIcon =
|
||||||
|
potentialNeighbor.is_default_icon === false &&
|
||||||
|
!isMediaIdEmpty(potentialNeighbor.icon ?? null);
|
||||||
if (
|
if (
|
||||||
!potentialNeighbor.visited &&
|
!potentialNeighbor.visited &&
|
||||||
|
!neighborHasCustomIcon &&
|
||||||
clusterSights.length < 4 &&
|
clusterSights.length < 4 &&
|
||||||
getDistance(current, potentialNeighbor) < distanceThreshold
|
getDistance(current, potentialNeighbor) < distanceThreshold
|
||||||
) {
|
) {
|
||||||
@@ -175,6 +192,10 @@ const useSightClustering = (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const leftover of queue) {
|
||||||
|
leftover.visited = false;
|
||||||
|
}
|
||||||
|
|
||||||
if (clusterSights.length > 1) {
|
if (clusterSights.length > 1) {
|
||||||
let furthestSight: SightData | null = null;
|
let furthestSight: SightData | null = null;
|
||||||
let maxDistanceToPath = -1;
|
let maxDistanceToPath = -1;
|
||||||
@@ -381,13 +402,15 @@ export const WebGLMap = observer(() => {
|
|||||||
return livePercent;
|
return livePercent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sight?.is_default_icon === false) {
|
||||||
if (
|
if (
|
||||||
sight != null &&
|
|
||||||
typeof sight.icon_size === "number" &&
|
typeof sight.icon_size === "number" &&
|
||||||
Number.isFinite(sight.icon_size)
|
Number.isFinite(sight.icon_size)
|
||||||
) {
|
) {
|
||||||
return sight.icon_size;
|
return sight.icon_size;
|
||||||
}
|
}
|
||||||
|
return 100;
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
typeof routeData?.icon_size === "number" &&
|
typeof routeData?.icon_size === "number" &&
|
||||||
|
|||||||
@@ -111,7 +111,13 @@ const StationItem = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div
|
||||||
|
className={
|
||||||
|
selectedStationId === station.id
|
||||||
|
? "side-menu-sight-selected-wrapper"
|
||||||
|
: ""
|
||||||
|
}
|
||||||
|
>
|
||||||
<div
|
<div
|
||||||
ref={containerRef}
|
ref={containerRef}
|
||||||
className="side-menu-sight"
|
className="side-menu-sight"
|
||||||
|
|||||||
@@ -1,3 +1,15 @@
|
|||||||
|
@property --fade-top {
|
||||||
|
syntax: "<length>";
|
||||||
|
inherits: false;
|
||||||
|
initial-value: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@property --fade-bottom {
|
||||||
|
syntax: "<length>";
|
||||||
|
inherits: false;
|
||||||
|
initial-value: 45px;
|
||||||
|
}
|
||||||
|
|
||||||
@keyframes pulse-chevron {
|
@keyframes pulse-chevron {
|
||||||
0% {
|
0% {
|
||||||
transform: rotate(var(--r, 0deg)) translateY(0px) scale(1);
|
transform: rotate(var(--r, 0deg)) translateY(0px) scale(1);
|
||||||
@@ -124,6 +136,27 @@
|
|||||||
backface-visibility: hidden;
|
backface-visibility: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.list-of-sights-content .scrollable {
|
||||||
|
--fade-top: 0px;
|
||||||
|
--fade-bottom: 45px;
|
||||||
|
mask-image: linear-gradient(
|
||||||
|
to bottom,
|
||||||
|
transparent 0px,
|
||||||
|
black var(--fade-top),
|
||||||
|
black calc(100% - var(--fade-bottom)),
|
||||||
|
transparent 100%
|
||||||
|
);
|
||||||
|
transition: --fade-top 0.5s ease, --fade-bottom 0.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-of-sights-content:not(.is-at-top) .scrollable {
|
||||||
|
--fade-top: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-of-sights-content.is-at-bottom .scrollable {
|
||||||
|
--fade-bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
.list-of-sights-grid {
|
.list-of-sights-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(3, 1fr);
|
grid-template-columns: repeat(3, 1fr);
|
||||||
@@ -137,6 +170,11 @@
|
|||||||
pointer-events: auto;
|
pointer-events: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.list-of-sights-content .custom-scrollbar-track {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
.sight-component {
|
.sight-component {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@@ -411,6 +449,7 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
padding: 7px 60px;
|
padding: 7px 60px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
height: 60px;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-evenly;
|
justify-content: space-evenly;
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.side-menu-sights-block .scrollable-viewport {
|
.side-menu-sights-block .scrollable-viewport {
|
||||||
height: calc(92%);
|
height: calc(98%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.side-menu-sights-block .scrollable {
|
.side-menu-sights-block .scrollable {
|
||||||
|
|||||||
@@ -53,7 +53,14 @@ export const LeftSidebar = observer(({ open, onToggle }: LeftSidebarProps) => {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{/* Кнопка назад — вне основного меню */}
|
{/* Кнопка назад — вне основного меню */}
|
||||||
<div style={{ padding: "12px 12px 0" }}>
|
<div
|
||||||
|
style={{
|
||||||
|
padding: "12px 12px 0",
|
||||||
|
opacity: open ? 1 : 0,
|
||||||
|
pointerEvents: open ? "auto" : "none",
|
||||||
|
transition: "opacity 0.25s ease",
|
||||||
|
}}
|
||||||
|
>
|
||||||
<Button
|
<Button
|
||||||
onClick={handleBack}
|
onClick={handleBack}
|
||||||
variant="contained"
|
variant="contained"
|
||||||
@@ -212,7 +219,13 @@ export const LeftSidebar = observer(({ open, onToggle }: LeftSidebarProps) => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="absolute bottom-[20px] -right-[520px] z-10">
|
<div
|
||||||
|
className="absolute bottom-[20px] z-10"
|
||||||
|
style={{
|
||||||
|
right: open ? -520 : -312,
|
||||||
|
transition: "right 0.3s ease",
|
||||||
|
}}
|
||||||
|
>
|
||||||
<LanguageSelector onBack={onToggle} isSidebarOpen={open} />
|
<LanguageSelector onBack={onToggle} isSidebarOpen={open} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ export const RoutePreview = () => {
|
|||||||
<Box
|
<Box
|
||||||
sx={{
|
sx={{
|
||||||
position: "relative",
|
position: "relative",
|
||||||
|
zIndex: 20,
|
||||||
width: isLeftSidebarOpen ? 288 : 0,
|
width: isLeftSidebarOpen ? 288 : 0,
|
||||||
transition: "width 0.3s ease",
|
transition: "width 0.3s ease",
|
||||||
overflow: "visible",
|
overflow: "visible",
|
||||||
|
|||||||
@@ -2327,9 +2327,6 @@ export const WebGLRouteMapPrototype = observer(() => {
|
|||||||
const stationScreenY =
|
const stationScreenY =
|
||||||
rotatedY * camera.scale + camera.translation.y;
|
rotatedY * camera.scale + camera.translation.y;
|
||||||
|
|
||||||
const labelX = stationScreenX + offsetX;
|
|
||||||
const labelY = stationScreenY + offsetY;
|
|
||||||
|
|
||||||
const backendAlign = station.align;
|
const backendAlign = station.align;
|
||||||
|
|
||||||
const anchor = getAnchorFromOffset(backendAlign ?? 2);
|
const anchor = getAnchorFromOffset(backendAlign ?? 2);
|
||||||
@@ -2339,8 +2336,6 @@ export const WebGLRouteMapPrototype = observer(() => {
|
|||||||
|
|
||||||
const dpr = Math.max(1, window.devicePixelRatio || 1);
|
const dpr = Math.max(1, window.devicePixelRatio || 1);
|
||||||
|
|
||||||
const cssX = labelX / dpr;
|
|
||||||
const cssY = labelY / dpr;
|
|
||||||
const rotationCss = `${rotationAngle}rad`;
|
const rotationCss = `${rotationAngle}rad`;
|
||||||
const counterRotationCss = `${-rotationAngle}rad`;
|
const counterRotationCss = `${-rotationAngle}rad`;
|
||||||
|
|
||||||
@@ -2359,6 +2354,13 @@ export const WebGLRouteMapPrototype = observer(() => {
|
|||||||
const scaleFactor = 1 + (zoomClampedScale - 1) * 0.4;
|
const scaleFactor = 1 + (zoomClampedScale - 1) * 0.4;
|
||||||
|
|
||||||
const primaryFontSize = 16 * fontScale * scaleFactor;
|
const primaryFontSize = 16 * fontScale * scaleFactor;
|
||||||
|
|
||||||
|
const mainLabelHeight = primaryFontSize * 1.2;
|
||||||
|
const labelX = stationScreenX + offsetX;
|
||||||
|
const labelY = stationScreenY + offsetY + mainLabelHeight / 2;
|
||||||
|
|
||||||
|
const cssX = labelX / dpr;
|
||||||
|
const cssY = labelY / dpr;
|
||||||
const secondaryFontSize = 13 * fontScale * scaleFactor;
|
const secondaryFontSize = 13 * fontScale * scaleFactor;
|
||||||
|
|
||||||
const secondaryMarginTop = 5 * fontScale * scaleFactor;
|
const secondaryMarginTop = 5 * fontScale * scaleFactor;
|
||||||
@@ -2404,7 +2406,7 @@ export const WebGLRouteMapPrototype = observer(() => {
|
|||||||
hoveredStationIconId === station.id ||
|
hoveredStationIconId === station.id ||
|
||||||
resizingStationIconId === station.id;
|
resizingStationIconId === station.id;
|
||||||
|
|
||||||
const secondaryLineHeight = 1.2;
|
const secondaryLineHeight = 1.2 * scaleFactor;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div key={station.id}>
|
<div key={station.id}>
|
||||||
@@ -2438,7 +2440,6 @@ export const WebGLRouteMapPrototype = observer(() => {
|
|||||||
cursor: "grab",
|
cursor: "grab",
|
||||||
userSelect: "none",
|
userSelect: "none",
|
||||||
touchAction: "none",
|
touchAction: "none",
|
||||||
lineHeight: 1,
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
@@ -2549,7 +2550,6 @@ export const WebGLRouteMapPrototype = observer(() => {
|
|||||||
position: "relative",
|
position: "relative",
|
||||||
fontWeight: 700,
|
fontWeight: 700,
|
||||||
fontSize: primaryFontSize,
|
fontSize: primaryFontSize,
|
||||||
lineHeight: 1,
|
|
||||||
textShadow: "0 0 4px rgba(0,0,0,0.6)",
|
textShadow: "0 0 4px rgba(0,0,0,0.6)",
|
||||||
pointerEvents: "none",
|
pointerEvents: "none",
|
||||||
whiteSpace: "nowrap",
|
whiteSpace: "nowrap",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import {
|
|||||||
DialogContent,
|
DialogContent,
|
||||||
DialogActions,
|
DialogActions,
|
||||||
} from "@mui/material";
|
} from "@mui/material";
|
||||||
import { snapshotStore, authStore, routeStore, selectedCityStore, cityStore } from "@shared";
|
import { snapshotStore, authStore, routeStore, selectedCityStore, cityStore, carrierStore } from "@shared";
|
||||||
import { observer } from "mobx-react-lite";
|
import { observer } from "mobx-react-lite";
|
||||||
import { ArrowLeft, Loader2, Save } from "lucide-react";
|
import { ArrowLeft, Loader2, Save } from "lucide-react";
|
||||||
import { useState, useEffect, useMemo } from "react";
|
import { useState, useEffect, useMemo } from "react";
|
||||||
@@ -93,22 +93,55 @@ export const SnapshotCreatePage = observer(() => {
|
|||||||
routeStore.routes.loaded = false;
|
routeStore.routes.loaded = false;
|
||||||
});
|
});
|
||||||
await routeStore.getRoutes();
|
await routeStore.getRoutes();
|
||||||
|
await carrierStore.getCarriers("ru");
|
||||||
|
|
||||||
const routes = routeStore.routes.data;
|
const routes = routeStore.routes.data;
|
||||||
const numberCount = new Map<string, number>();
|
const carriers = carrierStore.carriers.ru.data;
|
||||||
|
const carrierCityMap = new Map<number, number>();
|
||||||
|
for (const c of carriers) {
|
||||||
|
carrierCityMap.set(c.id, c.city_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
const duplicateMessages: string[] = [];
|
||||||
|
|
||||||
|
const directionKey = new Map<string, number>();
|
||||||
for (const route of routes) {
|
for (const route of routes) {
|
||||||
const num = (route.route_sys_number ?? "").trim();
|
const num = (route.route_sys_number ?? "").trim();
|
||||||
if (num) {
|
if (!num) continue;
|
||||||
numberCount.set(num, (numberCount.get(num) ?? 0) + 1);
|
const cityId = carrierCityMap.get(route.carrier_id) ?? 0;
|
||||||
|
const key = `${num}|${route.route_direction}|${cityId}`;
|
||||||
|
directionKey.set(key, (directionKey.get(key) ?? 0) + 1);
|
||||||
|
}
|
||||||
|
for (const [key, count] of directionKey) {
|
||||||
|
if (count > 1) {
|
||||||
|
const [num, dir] = key.split("|");
|
||||||
|
const dirLabel = dir === "true" ? "прямой" : "обратный";
|
||||||
|
duplicateMessages.push(
|
||||||
|
`Дублируется маршрут №${num} (${dirLabel})`
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const duplicates = Array.from(numberCount.entries())
|
const cityPerNumber = new Map<string, Set<number>>();
|
||||||
.filter(([, count]) => count > 1)
|
for (const route of routes) {
|
||||||
.map(([num]) => num);
|
const num = (route.route_sys_number ?? "").trim();
|
||||||
|
if (!num) continue;
|
||||||
|
const cityId = carrierCityMap.get(route.carrier_id) ?? 0;
|
||||||
|
if (!cityPerNumber.has(num)) {
|
||||||
|
cityPerNumber.set(num, new Set());
|
||||||
|
}
|
||||||
|
cityPerNumber.get(num)!.add(cityId);
|
||||||
|
}
|
||||||
|
for (const [num, cities] of cityPerNumber) {
|
||||||
|
if (cities.size > 1) {
|
||||||
|
duplicateMessages.push(
|
||||||
|
`Маршрут №${num} присутствует в нескольких городах`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (duplicates.length > 0) {
|
if (duplicateMessages.length > 0) {
|
||||||
setDuplicateRouteNumbers(duplicates);
|
setDuplicateRouteNumbers(duplicateMessages);
|
||||||
setDuplicateWarningOpen(true);
|
setDuplicateWarningOpen(true);
|
||||||
} else {
|
} else {
|
||||||
await startExport();
|
await startExport();
|
||||||
@@ -190,10 +223,8 @@ export const SnapshotCreatePage = observer(() => {
|
|||||||
некорректным данным в экспорте.
|
некорректным данным в экспорте.
|
||||||
</p>
|
</p>
|
||||||
<ul className="list-disc pl-5">
|
<ul className="list-disc pl-5">
|
||||||
{duplicateRouteNumbers.map((num) => (
|
{duplicateRouteNumbers.map((msg, i) => (
|
||||||
<li key={num}>
|
<li key={i}>{msg}</li>
|
||||||
Найдены повторяющиеся маршруты с номером трассы №{num}
|
|
||||||
</li>
|
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { DataGrid, GridColDef, GridRenderCellParams } from "@mui/x-data-grid";
|
import { DataGrid, GridColDef, GridRenderCellParams } from "@mui/x-data-grid";
|
||||||
import { ruRU } from "@mui/x-data-grid/locales";
|
import { ruRU } from "@mui/x-data-grid/locales";
|
||||||
import { authStore, languageStore, snapshotStore, cityStore, SearchInput } from "@shared";
|
import { authStore, languageStore, snapshotStore, cityStore, vehicleStore, SearchInput } from "@shared";
|
||||||
import { useEffect, useState, useMemo } from "react";
|
import { useEffect, useState, useMemo } from "react";
|
||||||
import { observer } from "mobx-react-lite";
|
import { observer } from "mobx-react-lite";
|
||||||
import { DatabaseBackup, Trash2 } from "lucide-react";
|
import { DatabaseBackup, Trash2 } from "lucide-react";
|
||||||
import { CreateButton, DeleteModal, SnapshotRestore } from "@widgets";
|
import { CreateButton, DeleteModal, SnapshotRestore } from "@widgets";
|
||||||
import { Alert, Box, Button, CircularProgress, Dialog, DialogActions, DialogContent, DialogTitle, TextField } from "@mui/material";
|
import { Alert, Box, Button, CircularProgress, Dialog, DialogActions, DialogContent, DialogTitle, TextField, Typography } from "@mui/material";
|
||||||
|
|
||||||
const LOW_STORAGE_THRESHOLD_GB = 10;
|
const LOW_STORAGE_THRESHOLD_GB = 10;
|
||||||
|
|
||||||
@@ -43,11 +43,14 @@ export const SnapshotListPage = observer(() => {
|
|||||||
createEmptySnapshot,
|
createEmptySnapshot,
|
||||||
} = snapshotStore;
|
} = snapshotStore;
|
||||||
const canWriteDevices = authStore.canWrite("devices");
|
const canWriteDevices = authStore.canWrite("devices");
|
||||||
|
const canReadDevices = authStore.canRead("devices");
|
||||||
const canCreateSnapshot =
|
const canCreateSnapshot =
|
||||||
authStore.hasRole("snapshot_create") && canWriteDevices;
|
authStore.hasRole("snapshot_create") && canWriteDevices;
|
||||||
const canManageSnapshots = authStore.canWrite("snapshot") && canWriteDevices;
|
const canManageSnapshots = authStore.canWrite("snapshot") && canWriteDevices;
|
||||||
|
|
||||||
const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);
|
const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);
|
||||||
|
const [isSnapshotOnDeviceWarning, setIsSnapshotOnDeviceWarning] = useState(false);
|
||||||
|
const [devicesWithSnapshot, setDevicesWithSnapshot] = useState<string[]>([]);
|
||||||
const [rowId, setRowId] = useState<string | null>(null);
|
const [rowId, setRowId] = useState<string | null>(null);
|
||||||
const { language } = languageStore;
|
const { language } = languageStore;
|
||||||
const [isRestoreModalOpen, setIsRestoreModalOpen] = useState(false);
|
const [isRestoreModalOpen, setIsRestoreModalOpen] = useState(false);
|
||||||
@@ -77,7 +80,11 @@ export const SnapshotListPage = observer(() => {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchSnapshots = async () => {
|
const fetchSnapshots = async () => {
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
await Promise.all([getSnapshots(), getStorageInfo()]);
|
const promises: Promise<void>[] = [getSnapshots(), getStorageInfo()];
|
||||||
|
if (canReadDevices && !vehicleStore.vehicles.loaded) {
|
||||||
|
promises.push(vehicleStore.getVehicles());
|
||||||
|
}
|
||||||
|
await Promise.all(promises);
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
};
|
};
|
||||||
fetchSnapshots();
|
fetchSnapshots();
|
||||||
@@ -164,8 +171,20 @@ export const SnapshotListPage = observer(() => {
|
|||||||
<button
|
<button
|
||||||
title="Удалить"
|
title="Удалить"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
const snapshotId = params.row.id;
|
||||||
|
if (canReadDevices) {
|
||||||
|
const devicesUsing = vehicleStore.vehicles.data
|
||||||
|
.filter(v => v.vehicle.current_snapshot_uuid === snapshotId)
|
||||||
|
.map(v => v.vehicle.tail_number || v.vehicle.uuid || `ID ${v.vehicle.id}`);
|
||||||
|
if (devicesUsing.length > 0) {
|
||||||
|
setDevicesWithSnapshot(devicesUsing);
|
||||||
|
setIsSnapshotOnDeviceWarning(true);
|
||||||
|
setRowId(snapshotId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
setIsDeleteModalOpen(true);
|
setIsDeleteModalOpen(true);
|
||||||
setRowId(params.row.id);
|
setRowId(snapshotId);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Trash2 size={20} className="text-red-500" />
|
<Trash2 size={20} className="text-red-500" />
|
||||||
@@ -409,6 +428,36 @@ export const SnapshotListPage = observer(() => {
|
|||||||
</DialogActions>
|
</DialogActions>
|
||||||
</Dialog>
|
</Dialog>
|
||||||
|
|
||||||
|
<Dialog
|
||||||
|
open={isSnapshotOnDeviceWarning}
|
||||||
|
onClose={() => setIsSnapshotOnDeviceWarning(false)}
|
||||||
|
fullWidth
|
||||||
|
maxWidth="xs"
|
||||||
|
>
|
||||||
|
<DialogTitle>Удаление невозможно</DialogTitle>
|
||||||
|
<DialogContent>
|
||||||
|
<Alert severity="warning" sx={{ mt: 1 }}>
|
||||||
|
Этот экспорт загружен на устройства. Удалите или замените экспорт на
|
||||||
|
устройствах перед удалением.
|
||||||
|
</Alert>
|
||||||
|
<Box sx={{ mt: 2 }}>
|
||||||
|
<Typography variant="body2" fontWeight={600} gutterBottom>
|
||||||
|
Устройства:
|
||||||
|
</Typography>
|
||||||
|
{devicesWithSnapshot.map((name, i) => (
|
||||||
|
<Typography key={i} variant="body2">
|
||||||
|
• {name}
|
||||||
|
</Typography>
|
||||||
|
))}
|
||||||
|
</Box>
|
||||||
|
</DialogContent>
|
||||||
|
<DialogActions>
|
||||||
|
<Button onClick={() => setIsSnapshotOnDeviceWarning(false)}>
|
||||||
|
Закрыть
|
||||||
|
</Button>
|
||||||
|
</DialogActions>
|
||||||
|
</Dialog>
|
||||||
|
|
||||||
<SnapshotRestore
|
<SnapshotRestore
|
||||||
open={isRestoreModalOpen}
|
open={isRestoreModalOpen}
|
||||||
loading={isLoading}
|
loading={isLoading}
|
||||||
|
|||||||
@@ -2,16 +2,8 @@ import {
|
|||||||
Button,
|
Button,
|
||||||
Paper,
|
Paper,
|
||||||
TextField,
|
TextField,
|
||||||
Checkbox,
|
|
||||||
Typography,
|
Typography,
|
||||||
Box,
|
Box,
|
||||||
Table,
|
|
||||||
TableBody,
|
|
||||||
TableCell,
|
|
||||||
TableHead,
|
|
||||||
TableRow,
|
|
||||||
Radio,
|
|
||||||
RadioGroup,
|
|
||||||
Divider,
|
Divider,
|
||||||
} from "@mui/material";
|
} from "@mui/material";
|
||||||
import { observer } from "mobx-react-lite";
|
import { observer } from "mobx-react-lite";
|
||||||
@@ -28,41 +20,7 @@ import {
|
|||||||
selectedCityStore,
|
selectedCityStore,
|
||||||
} from "@shared";
|
} from "@shared";
|
||||||
import { useState, useEffect } from "react";
|
import { useState, useEffect } from "react";
|
||||||
import { ImageUploadCard } from "@widgets";
|
import { ImageUploadCard, PermissionsTable, RolesHintTable, ROLE_RESOURCES } from "@widgets";
|
||||||
|
|
||||||
const ROLE_RESOURCES = [
|
|
||||||
{ key: "snapshot", label: "Экспорт" },
|
|
||||||
{ key: "devices", label: "Устройства" },
|
|
||||||
{ key: "vehicles", label: "Транспорт" },
|
|
||||||
{ key: "users", label: "Пользователи" },
|
|
||||||
{ key: "sights", label: "Достопримечательности" },
|
|
||||||
{ key: "stations", label: "Остановки" },
|
|
||||||
{ key: "routes", label: "Маршруты" },
|
|
||||||
{ key: "countries", label: "Страны" },
|
|
||||||
{ key: "cities", label: "Города" },
|
|
||||||
{ key: "carriers", label: "Перевозчики" },
|
|
||||||
] as const;
|
|
||||||
|
|
||||||
type PermissionLevel = "none" | "ro" | "rw";
|
|
||||||
|
|
||||||
function getPermissionLevel(roles: string[], resource: string): PermissionLevel {
|
|
||||||
if (roles.includes(`${resource}_rw`)) return "rw";
|
|
||||||
if (roles.includes(`${resource}_ro`)) return "ro";
|
|
||||||
return "none";
|
|
||||||
}
|
|
||||||
|
|
||||||
function applyPermissionChange(
|
|
||||||
roles: string[],
|
|
||||||
resource: string,
|
|
||||||
level: PermissionLevel,
|
|
||||||
): string[] {
|
|
||||||
const filtered = roles.filter(
|
|
||||||
(r) => r !== `${resource}_ro` && r !== `${resource}_rw`,
|
|
||||||
);
|
|
||||||
if (level === "ro") return [...filtered, `${resource}_ro`];
|
|
||||||
if (level === "rw") return [...filtered, `${resource}_rw`];
|
|
||||||
return filtered;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const UserCreatePage = observer(() => {
|
export const UserCreatePage = observer(() => {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
@@ -276,133 +234,8 @@ export const UserCreatePage = observer(() => {
|
|||||||
</Button>
|
</Button>
|
||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
<Box sx={{ border: "1px solid", borderColor: "divider", borderRadius: 1 }}>
|
<PermissionsTable localRoles={localRoles} setLocalRoles={setLocalRoles} />
|
||||||
<Table size="small">
|
<RolesHintTable />
|
||||||
<TableHead>
|
|
||||||
<TableRow sx={{ bgcolor: "action.hover" }}>
|
|
||||||
<TableCell sx={{ fontWeight: 600, width: 220 }}>Ресурс</TableCell>
|
|
||||||
<TableCell align="center" sx={{ fontWeight: 600 }}>Нет доступа</TableCell>
|
|
||||||
<TableCell align="center" sx={{ fontWeight: 600 }}>Чтение</TableCell>
|
|
||||||
<TableCell align="center" sx={{ fontWeight: 600 }}>Чтение/Запись</TableCell>
|
|
||||||
<TableCell align="center" sx={{ fontWeight: 600 }}>
|
|
||||||
Доп. права
|
|
||||||
</TableCell>
|
|
||||||
</TableRow>
|
|
||||||
</TableHead>
|
|
||||||
<TableBody>
|
|
||||||
{ROLE_RESOURCES.map(({ key, label }) => {
|
|
||||||
const level = getPermissionLevel(localRoles, key);
|
|
||||||
const isSnapshotResource = key === "snapshot";
|
|
||||||
|
|
||||||
const handleChange = (val: string) => {
|
|
||||||
setLocalRoles((prev) => {
|
|
||||||
let updated = applyPermissionChange(prev, key, val as PermissionLevel);
|
|
||||||
|
|
||||||
if (key === "devices") {
|
|
||||||
updated = applyPermissionChange(
|
|
||||||
updated,
|
|
||||||
"vehicles",
|
|
||||||
val as PermissionLevel,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return updated;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const isDevicesResource = key === "devices";
|
|
||||||
|
|
||||||
const handleSnapshotCreateChange = (checked: boolean) => {
|
|
||||||
if (!isSnapshotResource) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setLocalRoles((prev) => {
|
|
||||||
const withoutSnapshotCreate = prev.filter(
|
|
||||||
(role) => role !== "snapshot_create"
|
|
||||||
);
|
|
||||||
return checked
|
|
||||||
? [...withoutSnapshotCreate, "snapshot_create"]
|
|
||||||
: withoutSnapshotCreate;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleMaintenanceChange = (checked: boolean) => {
|
|
||||||
setLocalRoles((prev) => {
|
|
||||||
const without = prev.filter((r) => r !== "devices_maintenance_rw");
|
|
||||||
return checked ? [...without, "devices_maintenance_rw"] : without;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<TableRow key={key} hover>
|
|
||||||
<TableCell>{label}</TableCell>
|
|
||||||
<TableCell align="center" padding="checkbox">
|
|
||||||
<RadioGroup
|
|
||||||
row
|
|
||||||
value={level}
|
|
||||||
onChange={(e) => handleChange(e.target.value)}
|
|
||||||
sx={{ justifyContent: "center", flexWrap: "nowrap" }}
|
|
||||||
>
|
|
||||||
<Radio value="none" size="small" />
|
|
||||||
</RadioGroup>
|
|
||||||
</TableCell>
|
|
||||||
<TableCell align="center" padding="checkbox">
|
|
||||||
{isSnapshotResource ? (
|
|
||||||
<Typography variant="body2" color="text.secondary">
|
|
||||||
-
|
|
||||||
</Typography>
|
|
||||||
) : (
|
|
||||||
<RadioGroup
|
|
||||||
row
|
|
||||||
value={level}
|
|
||||||
onChange={(e) => handleChange(e.target.value)}
|
|
||||||
sx={{ justifyContent: "center", flexWrap: "nowrap" }}
|
|
||||||
>
|
|
||||||
<Radio value="ro" size="small" />
|
|
||||||
</RadioGroup>
|
|
||||||
)}
|
|
||||||
</TableCell>
|
|
||||||
<TableCell align="center" padding="checkbox">
|
|
||||||
<RadioGroup
|
|
||||||
row
|
|
||||||
value={level}
|
|
||||||
onChange={(e) => handleChange(e.target.value)}
|
|
||||||
sx={{ justifyContent: "center", flexWrap: "nowrap" }}
|
|
||||||
>
|
|
||||||
<Radio value="rw" size="small" />
|
|
||||||
</RadioGroup>
|
|
||||||
</TableCell>
|
|
||||||
<TableCell align="center" padding="checkbox">
|
|
||||||
{isSnapshotResource ? (
|
|
||||||
<Checkbox
|
|
||||||
checked={localRoles.includes("snapshot_create")}
|
|
||||||
onChange={(e) =>
|
|
||||||
handleSnapshotCreateChange(e.target.checked)
|
|
||||||
}
|
|
||||||
size="small"
|
|
||||||
title="Разрешает создавать новые снапшоты"
|
|
||||||
/>
|
|
||||||
) : isDevicesResource ? (
|
|
||||||
<Box sx={{ display: "flex", gap: 0.5, justifyContent: "center" }}>
|
|
||||||
<Checkbox
|
|
||||||
checked={localRoles.includes("devices_maintenance_rw")}
|
|
||||||
onChange={(e) => handleMaintenanceChange(e.target.checked)}
|
|
||||||
size="small"
|
|
||||||
title="Техническое обслуживание (ТО)"
|
|
||||||
/>
|
|
||||||
</Box>
|
|
||||||
) : (
|
|
||||||
<Typography variant="body2" color="text.secondary">
|
|
||||||
-
|
|
||||||
</Typography>
|
|
||||||
)}
|
|
||||||
</TableCell>
|
|
||||||
</TableRow>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</TableBody>
|
|
||||||
</Table>
|
|
||||||
</Box>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
|
|||||||
@@ -1,17 +1,9 @@
|
|||||||
import {
|
import {
|
||||||
Button,
|
Button,
|
||||||
Checkbox,
|
|
||||||
Paper,
|
Paper,
|
||||||
TextField,
|
TextField,
|
||||||
Box,
|
Box,
|
||||||
Typography,
|
Typography,
|
||||||
Table,
|
|
||||||
TableBody,
|
|
||||||
TableCell,
|
|
||||||
TableHead,
|
|
||||||
TableRow,
|
|
||||||
Radio,
|
|
||||||
RadioGroup,
|
|
||||||
Divider,
|
Divider,
|
||||||
} from "@mui/material";
|
} from "@mui/material";
|
||||||
import { observer } from "mobx-react-lite";
|
import { observer } from "mobx-react-lite";
|
||||||
@@ -35,41 +27,7 @@ import {
|
|||||||
type UserCity,
|
type UserCity,
|
||||||
} from "@shared";
|
} from "@shared";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { ImageUploadCard, DeleteModal } from "@widgets";
|
import { ImageUploadCard, DeleteModal, PermissionsTable, RolesHintTable, ROLE_RESOURCES } from "@widgets";
|
||||||
|
|
||||||
const ROLE_RESOURCES = [
|
|
||||||
{ key: "snapshot", label: "Экспорт" },
|
|
||||||
{ key: "devices", label: "Устройства" },
|
|
||||||
{ key: "vehicles", label: "Транспорт" },
|
|
||||||
{ key: "users", label: "Пользователи" },
|
|
||||||
{ key: "sights", label: "Достопримечательности" },
|
|
||||||
{ key: "stations", label: "Остановки" },
|
|
||||||
{ key: "routes", label: "Маршруты" },
|
|
||||||
{ key: "countries", label: "Страны" },
|
|
||||||
{ key: "cities", label: "Города" },
|
|
||||||
{ key: "carriers", label: "Перевозчики" },
|
|
||||||
] as const;
|
|
||||||
|
|
||||||
type PermissionLevel = "none" | "ro" | "rw";
|
|
||||||
|
|
||||||
function getPermissionLevel(roles: string[], resource: string): PermissionLevel {
|
|
||||||
if (roles.includes(`${resource}_rw`)) return "rw";
|
|
||||||
if (roles.includes(`${resource}_ro`)) return "ro";
|
|
||||||
return "none";
|
|
||||||
}
|
|
||||||
|
|
||||||
function applyPermissionChange(
|
|
||||||
roles: string[],
|
|
||||||
resource: string,
|
|
||||||
level: PermissionLevel,
|
|
||||||
): string[] {
|
|
||||||
const filtered = roles.filter(
|
|
||||||
(r) => r !== `${resource}_ro` && r !== `${resource}_rw`,
|
|
||||||
);
|
|
||||||
if (level === "ro") return [...filtered, `${resource}_ro`];
|
|
||||||
if (level === "rw") return [...filtered, `${resource}_rw`];
|
|
||||||
return filtered;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const UserEditPage = observer(() => {
|
export const UserEditPage = observer(() => {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
@@ -358,133 +316,8 @@ export const UserEditPage = observer(() => {
|
|||||||
</Button>
|
</Button>
|
||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
<Box sx={{ border: "1px solid", borderColor: "divider", borderRadius: 1 }}>
|
<PermissionsTable localRoles={localRoles} setLocalRoles={setLocalRoles} />
|
||||||
<Table size="small">
|
<RolesHintTable />
|
||||||
<TableHead>
|
|
||||||
<TableRow sx={{ bgcolor: "action.hover" }}>
|
|
||||||
<TableCell sx={{ fontWeight: 600, width: 220 }}>Ресурс</TableCell>
|
|
||||||
<TableCell align="center" sx={{ fontWeight: 600 }}>Нет доступа</TableCell>
|
|
||||||
<TableCell align="center" sx={{ fontWeight: 600 }}>Чтение</TableCell>
|
|
||||||
<TableCell align="center" sx={{ fontWeight: 600 }}>Чтение/Запись</TableCell>
|
|
||||||
<TableCell align="center" sx={{ fontWeight: 600 }}>
|
|
||||||
Доп. права
|
|
||||||
</TableCell>
|
|
||||||
</TableRow>
|
|
||||||
</TableHead>
|
|
||||||
<TableBody>
|
|
||||||
{ROLE_RESOURCES.map(({ key, label }) => {
|
|
||||||
const level = getPermissionLevel(localRoles, key);
|
|
||||||
const isSnapshotResource = key === "snapshot";
|
|
||||||
|
|
||||||
const handleChange = (val: string) => {
|
|
||||||
setLocalRoles((prev) => {
|
|
||||||
let updated = applyPermissionChange(prev, key, val as PermissionLevel);
|
|
||||||
|
|
||||||
if (key === "devices") {
|
|
||||||
updated = applyPermissionChange(
|
|
||||||
updated,
|
|
||||||
"vehicles",
|
|
||||||
val as PermissionLevel,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return updated;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const isDevicesResource = key === "devices";
|
|
||||||
|
|
||||||
const handleSnapshotCreateChange = (checked: boolean) => {
|
|
||||||
if (!isSnapshotResource) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setLocalRoles((prev) => {
|
|
||||||
const withoutSnapshotCreate = prev.filter(
|
|
||||||
(role) => role !== "snapshot_create"
|
|
||||||
);
|
|
||||||
return checked
|
|
||||||
? [...withoutSnapshotCreate, "snapshot_create"]
|
|
||||||
: withoutSnapshotCreate;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleMaintenanceChange = (checked: boolean) => {
|
|
||||||
setLocalRoles((prev) => {
|
|
||||||
const without = prev.filter((r) => r !== "devices_maintenance_rw");
|
|
||||||
return checked ? [...without, "devices_maintenance_rw"] : without;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<TableRow key={key} hover>
|
|
||||||
<TableCell>{label}</TableCell>
|
|
||||||
<TableCell align="center" padding="checkbox">
|
|
||||||
<RadioGroup
|
|
||||||
row
|
|
||||||
value={level}
|
|
||||||
onChange={(e) => handleChange(e.target.value)}
|
|
||||||
sx={{ justifyContent: "center", flexWrap: "nowrap" }}
|
|
||||||
>
|
|
||||||
<Radio value="none" size="small" />
|
|
||||||
</RadioGroup>
|
|
||||||
</TableCell>
|
|
||||||
<TableCell align="center" padding="checkbox">
|
|
||||||
{isSnapshotResource ? (
|
|
||||||
<Typography variant="body2" color="text.secondary">
|
|
||||||
-
|
|
||||||
</Typography>
|
|
||||||
) : (
|
|
||||||
<RadioGroup
|
|
||||||
row
|
|
||||||
value={level}
|
|
||||||
onChange={(e) => handleChange(e.target.value)}
|
|
||||||
sx={{ justifyContent: "center", flexWrap: "nowrap" }}
|
|
||||||
>
|
|
||||||
<Radio value="ro" size="small" />
|
|
||||||
</RadioGroup>
|
|
||||||
)}
|
|
||||||
</TableCell>
|
|
||||||
<TableCell align="center" padding="checkbox">
|
|
||||||
<RadioGroup
|
|
||||||
row
|
|
||||||
value={level}
|
|
||||||
onChange={(e) => handleChange(e.target.value)}
|
|
||||||
sx={{ justifyContent: "center", flexWrap: "nowrap" }}
|
|
||||||
>
|
|
||||||
<Radio value="rw" size="small" />
|
|
||||||
</RadioGroup>
|
|
||||||
</TableCell>
|
|
||||||
<TableCell align="center" padding="checkbox">
|
|
||||||
{isSnapshotResource ? (
|
|
||||||
<Checkbox
|
|
||||||
checked={localRoles.includes("snapshot_create")}
|
|
||||||
onChange={(e) =>
|
|
||||||
handleSnapshotCreateChange(e.target.checked)
|
|
||||||
}
|
|
||||||
size="small"
|
|
||||||
title="Разрешает создавать новые снапшоты"
|
|
||||||
/>
|
|
||||||
) : isDevicesResource ? (
|
|
||||||
<Box sx={{ display: "flex", gap: 0.5, justifyContent: "center" }}>
|
|
||||||
<Checkbox
|
|
||||||
checked={localRoles.includes("devices_maintenance_rw")}
|
|
||||||
onChange={(e) => handleMaintenanceChange(e.target.checked)}
|
|
||||||
size="small"
|
|
||||||
title="Техническое обслуживание (ТО)"
|
|
||||||
/>
|
|
||||||
</Box>
|
|
||||||
) : (
|
|
||||||
<Typography variant="body2" color="text.secondary">
|
|
||||||
-
|
|
||||||
</Typography>
|
|
||||||
)}
|
|
||||||
</TableCell>
|
|
||||||
</TableRow>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</TableBody>
|
|
||||||
</Table>
|
|
||||||
</Box>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<Divider />
|
<Divider />
|
||||||
|
|||||||
@@ -24,30 +24,51 @@ const shiftYYYYMMDD = (value: string, days: number) => {
|
|||||||
|
|
||||||
type LogLevel = "info" | "warn" | "error" | "debug" | "fatal" | "unknown";
|
type LogLevel = "info" | "warn" | "error" | "debug" | "fatal" | "unknown";
|
||||||
|
|
||||||
const LOG_LEVEL_STYLES: Record<LogLevel, { badge: string; text: string }> = {
|
const LOG_LEVEL_STYLES: Record<
|
||||||
|
LogLevel,
|
||||||
|
{ badge: string; text: string; bg: string; color: string; borderColor: string }
|
||||||
|
> = {
|
||||||
info: {
|
info: {
|
||||||
badge: "bg-blue-100 text-blue-700",
|
badge: "bg-blue-100 text-blue-700",
|
||||||
text: "text-[#000000BF]",
|
text: "text-[#000000BF]",
|
||||||
|
bg: "#DBEAFE",
|
||||||
|
color: "#1D4ED8",
|
||||||
|
borderColor: "#93C5FD",
|
||||||
},
|
},
|
||||||
debug: {
|
debug: {
|
||||||
badge: "bg-gray-100 text-gray-600",
|
badge: "bg-gray-100 text-gray-600",
|
||||||
text: "text-gray-600",
|
text: "text-gray-600",
|
||||||
|
bg: "#F3F4F6",
|
||||||
|
color: "#4B5563",
|
||||||
|
borderColor: "#D1D5DB",
|
||||||
},
|
},
|
||||||
warn: {
|
warn: {
|
||||||
badge: "bg-amber-100 text-amber-700",
|
badge: "bg-amber-100 text-amber-700",
|
||||||
text: "text-amber-800",
|
text: "text-amber-800",
|
||||||
|
bg: "#FEF3C7",
|
||||||
|
color: "#B45309",
|
||||||
|
borderColor: "#FCD34D",
|
||||||
},
|
},
|
||||||
error: {
|
error: {
|
||||||
badge: "bg-red-100 text-red-700",
|
badge: "bg-red-100 text-red-700",
|
||||||
text: "text-red-700",
|
text: "text-red-700",
|
||||||
|
bg: "#FEE2E2",
|
||||||
|
color: "#B91C1C",
|
||||||
|
borderColor: "#FCA5A5",
|
||||||
},
|
},
|
||||||
fatal: {
|
fatal: {
|
||||||
badge: "bg-red-200 text-red-900",
|
badge: "bg-red-200 text-red-900",
|
||||||
text: "text-red-900 font-semibold",
|
text: "text-red-900 font-semibold",
|
||||||
|
bg: "#FECACA",
|
||||||
|
color: "#7F1D1D",
|
||||||
|
borderColor: "#F87171",
|
||||||
},
|
},
|
||||||
unknown: {
|
unknown: {
|
||||||
badge: "bg-gray-100 text-gray-500",
|
badge: "bg-gray-100 text-gray-500",
|
||||||
text: "text-[#000000BF]",
|
text: "text-[#000000BF]",
|
||||||
|
bg: "#F3F4F6",
|
||||||
|
color: "#6B7280",
|
||||||
|
borderColor: "#D1D5DB",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -139,6 +160,23 @@ export const DeviceLogsModal = ({
|
|||||||
const yesterday = new Date(today.getTime() - 24 * 60 * 60 * 1000);
|
const yesterday = new Date(today.getTime() - 24 * 60 * 60 * 1000);
|
||||||
const [dateFrom, setDateFrom] = useState(toYYYYMMDD(yesterday));
|
const [dateFrom, setDateFrom] = useState(toYYYYMMDD(yesterday));
|
||||||
const [dateTo, setDateTo] = useState(toYYYYMMDD(today));
|
const [dateTo, setDateTo] = useState(toYYYYMMDD(today));
|
||||||
|
|
||||||
|
const ALL_LEVELS: LogLevel[] = ["debug", "info", "warn", "error", "fatal"];
|
||||||
|
const [activeLevels, setActiveLevels] = useState<Set<LogLevel>>(
|
||||||
|
new Set(ALL_LEVELS)
|
||||||
|
);
|
||||||
|
|
||||||
|
const toggleLevel = (level: LogLevel) => {
|
||||||
|
setActiveLevels((prev) => {
|
||||||
|
const next = new Set(prev);
|
||||||
|
if (next.has(level)) {
|
||||||
|
next.delete(level);
|
||||||
|
} else {
|
||||||
|
next.add(level);
|
||||||
|
}
|
||||||
|
return next;
|
||||||
|
});
|
||||||
|
};
|
||||||
const dateToMin = shiftYYYYMMDD(dateFrom, 1);
|
const dateToMin = shiftYYYYMMDD(dateFrom, 1);
|
||||||
const dateFromMax = shiftYYYYMMDD(dateTo, -1);
|
const dateFromMax = shiftYYYYMMDD(dateTo, -1);
|
||||||
|
|
||||||
@@ -205,16 +243,21 @@ export const DeviceLogsModal = ({
|
|||||||
return parsed;
|
return parsed;
|
||||||
}, [chunks]);
|
}, [chunks]);
|
||||||
|
|
||||||
|
const filteredLogs = useMemo(
|
||||||
|
() => logs.filter((log) => activeLevels.has(log.level)),
|
||||||
|
[logs, activeLevels]
|
||||||
|
);
|
||||||
|
|
||||||
const logsText = useMemo(
|
const logsText = useMemo(
|
||||||
() =>
|
() =>
|
||||||
logs
|
filteredLogs
|
||||||
.map((log) => {
|
.map((log) => {
|
||||||
const level = log.level === "unknown" ? "LOG" : log.level.toUpperCase();
|
const level = log.level === "unknown" ? "LOG" : log.level.toUpperCase();
|
||||||
const time = log.time ? `[${log.time}] ` : "";
|
const time = log.time ? `[${log.time}] ` : "";
|
||||||
return `${time}${level}: ${log.text}`;
|
return `${time}${level}: ${log.text}`;
|
||||||
})
|
})
|
||||||
.join("\n"),
|
.join("\n"),
|
||||||
[logs]
|
[filteredLogs]
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleDownloadLogs = () => {
|
const handleDownloadLogs = () => {
|
||||||
@@ -253,6 +296,28 @@ export const DeviceLogsModal = ({
|
|||||||
<div className="flex flex-col gap-6 h-[85vh]">
|
<div className="flex flex-col gap-6 h-[85vh]">
|
||||||
<div className="flex gap-4 items-center justify-between w-full flex-wrap">
|
<div className="flex gap-4 items-center justify-between w-full flex-wrap">
|
||||||
<h2 className="text-2xl font-semibold text-[#000000BF]">Логи</h2>
|
<h2 className="text-2xl font-semibold text-[#000000BF]">Логи</h2>
|
||||||
|
<div className="flex gap-1.5 items-center">
|
||||||
|
{ALL_LEVELS.map((level) => {
|
||||||
|
const active = activeLevels.has(level);
|
||||||
|
const s = LOG_LEVEL_STYLES[level];
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
key={level}
|
||||||
|
type="button"
|
||||||
|
onClick={() => toggleLevel(level)}
|
||||||
|
className="cursor-pointer select-none rounded-md px-2.5 py-1 text-[11px] font-semibold uppercase tracking-wide transition-all duration-150"
|
||||||
|
style={{
|
||||||
|
backgroundColor: active ? s.bg : "transparent",
|
||||||
|
color: active ? s.color : "#9CA3AF",
|
||||||
|
border: `1.5px solid ${active ? s.borderColor : "#E5E7EB"}`,
|
||||||
|
opacity: active ? 1 : 0.55,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{level}
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
<div className="flex gap-4 items-center">
|
<div className="flex gap-4 items-center">
|
||||||
<TextField
|
<TextField
|
||||||
type="date"
|
type="date"
|
||||||
@@ -280,7 +345,7 @@ export const DeviceLogsModal = ({
|
|||||||
variant="outlined"
|
variant="outlined"
|
||||||
size="small"
|
size="small"
|
||||||
onClick={handleDownloadLogs}
|
onClick={handleDownloadLogs}
|
||||||
disabled={isLoading || Boolean(error) || logs.length === 0}
|
disabled={isLoading || Boolean(error) || filteredLogs.length === 0}
|
||||||
>
|
>
|
||||||
Скачать .txt
|
Скачать .txt
|
||||||
</Button>
|
</Button>
|
||||||
@@ -303,8 +368,8 @@ export const DeviceLogsModal = ({
|
|||||||
{!isLoading && !error && (
|
{!isLoading && !error && (
|
||||||
<div className="w-full h-full overflow-y-auto rounded-xl">
|
<div className="w-full h-full overflow-y-auto rounded-xl">
|
||||||
<div className="flex flex-col gap-0.5 font-mono text-[13px]">
|
<div className="flex flex-col gap-0.5 font-mono text-[13px]">
|
||||||
{logs.length > 0 ? (
|
{filteredLogs.length > 0 ? (
|
||||||
logs.map((log) => {
|
filteredLogs.map((log) => {
|
||||||
const style = LOG_LEVEL_STYLES[log.level];
|
const style = LOG_LEVEL_STYLES[log.level];
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
|
|||||||
128
src/widgets/PermissionsTable/PermissionsTable.tsx
Normal file
128
src/widgets/PermissionsTable/PermissionsTable.tsx
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
import {
|
||||||
|
Checkbox,
|
||||||
|
Typography,
|
||||||
|
Box,
|
||||||
|
Table,
|
||||||
|
TableBody,
|
||||||
|
TableCell,
|
||||||
|
TableHead,
|
||||||
|
TableRow,
|
||||||
|
Radio,
|
||||||
|
RadioGroup,
|
||||||
|
} from "@mui/material";
|
||||||
|
import { ROLE_RESOURCES, getPermissionLevel, applyPermissionChange, type PermissionLevel } from "./constants";
|
||||||
|
|
||||||
|
interface PermissionsTableProps {
|
||||||
|
localRoles: string[];
|
||||||
|
setLocalRoles: React.Dispatch<React.SetStateAction<string[]>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function PermissionsTable({ localRoles, setLocalRoles }: PermissionsTableProps) {
|
||||||
|
return (
|
||||||
|
<Box sx={{ border: "1px solid", borderColor: "divider", borderRadius: 1 }}>
|
||||||
|
<Table size="small">
|
||||||
|
<TableHead>
|
||||||
|
<TableRow sx={{ bgcolor: "action.hover" }}>
|
||||||
|
<TableCell sx={{ fontWeight: 600, width: 220 }}>Ресурс</TableCell>
|
||||||
|
<TableCell align="center" sx={{ fontWeight: 600 }}>Нет доступа</TableCell>
|
||||||
|
<TableCell align="center" sx={{ fontWeight: 600 }}>Чтение</TableCell>
|
||||||
|
<TableCell align="center" sx={{ fontWeight: 600 }}>Чтение/Запись</TableCell>
|
||||||
|
<TableCell align="center" sx={{ fontWeight: 600 }}>Доп. права</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
</TableHead>
|
||||||
|
<TableBody>
|
||||||
|
{ROLE_RESOURCES.map(({ key, label }) => {
|
||||||
|
const level = getPermissionLevel(localRoles, key);
|
||||||
|
const isSnapshotResource = key === "snapshot";
|
||||||
|
const isDevicesResource = key === "devices";
|
||||||
|
|
||||||
|
const handleChange = (val: string) => {
|
||||||
|
setLocalRoles((prev) => {
|
||||||
|
let updated = applyPermissionChange(prev, key, val as PermissionLevel);
|
||||||
|
if (key === "devices") {
|
||||||
|
updated = applyPermissionChange(updated, "vehicles", val as PermissionLevel);
|
||||||
|
}
|
||||||
|
return updated;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleSnapshotCreateChange = (checked: boolean) => {
|
||||||
|
setLocalRoles((prev) => {
|
||||||
|
const without = prev.filter((role) => role !== "snapshot_create");
|
||||||
|
return checked ? [...without, "snapshot_create"] : without;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleMaintenanceChange = (checked: boolean) => {
|
||||||
|
setLocalRoles((prev) => {
|
||||||
|
const without = prev.filter((r) => r !== "devices_maintenance_rw");
|
||||||
|
return checked ? [...without, "devices_maintenance_rw"] : without;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TableRow key={key} hover>
|
||||||
|
<TableCell>{label}</TableCell>
|
||||||
|
<TableCell align="center" padding="checkbox">
|
||||||
|
<RadioGroup
|
||||||
|
row
|
||||||
|
value={level}
|
||||||
|
onChange={(e) => handleChange(e.target.value)}
|
||||||
|
sx={{ justifyContent: "center", flexWrap: "nowrap" }}
|
||||||
|
>
|
||||||
|
<Radio value="none" size="small" />
|
||||||
|
</RadioGroup>
|
||||||
|
</TableCell>
|
||||||
|
<TableCell align="center" padding="checkbox">
|
||||||
|
{isSnapshotResource ? (
|
||||||
|
<Typography variant="body2" color="text.secondary">-</Typography>
|
||||||
|
) : (
|
||||||
|
<RadioGroup
|
||||||
|
row
|
||||||
|
value={level}
|
||||||
|
onChange={(e) => handleChange(e.target.value)}
|
||||||
|
sx={{ justifyContent: "center", flexWrap: "nowrap" }}
|
||||||
|
>
|
||||||
|
<Radio value="ro" size="small" />
|
||||||
|
</RadioGroup>
|
||||||
|
)}
|
||||||
|
</TableCell>
|
||||||
|
<TableCell align="center" padding="checkbox">
|
||||||
|
<RadioGroup
|
||||||
|
row
|
||||||
|
value={level}
|
||||||
|
onChange={(e) => handleChange(e.target.value)}
|
||||||
|
sx={{ justifyContent: "center", flexWrap: "nowrap" }}
|
||||||
|
>
|
||||||
|
<Radio value="rw" size="small" />
|
||||||
|
</RadioGroup>
|
||||||
|
</TableCell>
|
||||||
|
<TableCell align="center" padding="checkbox">
|
||||||
|
{isSnapshotResource ? (
|
||||||
|
<Checkbox
|
||||||
|
checked={localRoles.includes("snapshot_create")}
|
||||||
|
onChange={(e) => handleSnapshotCreateChange(e.target.checked)}
|
||||||
|
size="small"
|
||||||
|
title="Разрешает создавать новые снапшоты"
|
||||||
|
/>
|
||||||
|
) : isDevicesResource ? (
|
||||||
|
<Box sx={{ display: "flex", gap: 0.5, justifyContent: "center" }}>
|
||||||
|
<Checkbox
|
||||||
|
checked={localRoles.includes("devices_maintenance_rw")}
|
||||||
|
onChange={(e) => handleMaintenanceChange(e.target.checked)}
|
||||||
|
size="small"
|
||||||
|
title="Техническое обслуживание (ТО)"
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
) : (
|
||||||
|
<Typography variant="body2" color="text.secondary">-</Typography>
|
||||||
|
)}
|
||||||
|
</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</TableBody>
|
||||||
|
</Table>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
49
src/widgets/PermissionsTable/RolesHintTable.tsx
Normal file
49
src/widgets/PermissionsTable/RolesHintTable.tsx
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
import {
|
||||||
|
Typography,
|
||||||
|
Box,
|
||||||
|
Table,
|
||||||
|
TableBody,
|
||||||
|
TableCell,
|
||||||
|
TableHead,
|
||||||
|
TableRow,
|
||||||
|
} from "@mui/material";
|
||||||
|
|
||||||
|
const ROLE_HINTS = [
|
||||||
|
{ tab: "Экспорт", roles: "Экспорт (Ч/З)" },
|
||||||
|
{ tab: "Создание экспорта", roles: "Экспорт (доп. права) + Устройства (Ч/З)" },
|
||||||
|
{ tab: "Устройства", roles: "Устройства + Транспорт + Маршруты + Перевозчики + Экспорт (Ч/З)" },
|
||||||
|
{ tab: "Карта", roles: "Маршруты (Ч/З) или Остановки (Ч/З) или Достопримечательности (Ч/З)" },
|
||||||
|
{ tab: "Пользователи", roles: "Пользователи" },
|
||||||
|
{ tab: "Достопримечательности", roles: "Достопримечательности" },
|
||||||
|
{ tab: "Остановки", roles: "Остановки" },
|
||||||
|
{ tab: "Маршруты", roles: "Маршруты + Перевозчики" },
|
||||||
|
{ tab: "Страны", roles: "Страны" },
|
||||||
|
{ tab: "Города", roles: "Города + Страны" },
|
||||||
|
{ tab: "Перевозчики", roles: "Перевозчики" },
|
||||||
|
];
|
||||||
|
|
||||||
|
export function RolesHintTable() {
|
||||||
|
return (
|
||||||
|
<Box sx={{ mt: 2, p: 2, bgcolor: "grey.50", borderRadius: 1, border: "1px solid", borderColor: "divider" }}>
|
||||||
|
<Typography variant="subtitle2" gutterBottom>
|
||||||
|
Какие роли нужны для вкладок
|
||||||
|
</Typography>
|
||||||
|
<Table size="small">
|
||||||
|
<TableHead>
|
||||||
|
<TableRow>
|
||||||
|
<TableCell sx={{ fontWeight: 600, py: 0.5 }}>Вкладка</TableCell>
|
||||||
|
<TableCell sx={{ fontWeight: 600, py: 0.5 }}>Необходимые роли</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
</TableHead>
|
||||||
|
<TableBody>
|
||||||
|
{ROLE_HINTS.map(({ tab, roles }) => (
|
||||||
|
<TableRow key={tab}>
|
||||||
|
<TableCell sx={{ py: 0.5 }}>{tab}</TableCell>
|
||||||
|
<TableCell sx={{ py: 0.5 }}>{roles}</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
))}
|
||||||
|
</TableBody>
|
||||||
|
</Table>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
33
src/widgets/PermissionsTable/constants.ts
Normal file
33
src/widgets/PermissionsTable/constants.ts
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
export const ROLE_RESOURCES = [
|
||||||
|
{ key: "snapshot", label: "Экспорт" },
|
||||||
|
{ key: "devices", label: "Устройства" },
|
||||||
|
{ key: "vehicles", label: "Транспорт" },
|
||||||
|
{ key: "users", label: "Пользователи" },
|
||||||
|
{ key: "sights", label: "Достопримечательности" },
|
||||||
|
{ key: "stations", label: "Остановки" },
|
||||||
|
{ key: "routes", label: "Маршруты" },
|
||||||
|
{ key: "countries", label: "Страны" },
|
||||||
|
{ key: "cities", label: "Города" },
|
||||||
|
{ key: "carriers", label: "Перевозчики" },
|
||||||
|
] as const;
|
||||||
|
|
||||||
|
export type PermissionLevel = "none" | "ro" | "rw";
|
||||||
|
|
||||||
|
export function getPermissionLevel(roles: string[], resource: string): PermissionLevel {
|
||||||
|
if (roles.includes(`${resource}_rw`)) return "rw";
|
||||||
|
if (roles.includes(`${resource}_ro`)) return "ro";
|
||||||
|
return "none";
|
||||||
|
}
|
||||||
|
|
||||||
|
export function applyPermissionChange(
|
||||||
|
roles: string[],
|
||||||
|
resource: string,
|
||||||
|
level: PermissionLevel,
|
||||||
|
): string[] {
|
||||||
|
const filtered = roles.filter(
|
||||||
|
(r) => r !== `${resource}_ro` && r !== `${resource}_rw`,
|
||||||
|
);
|
||||||
|
if (level === "ro") return [...filtered, `${resource}_ro`];
|
||||||
|
if (level === "rw") return [...filtered, `${resource}_rw`];
|
||||||
|
return filtered;
|
||||||
|
}
|
||||||
3
src/widgets/PermissionsTable/index.ts
Normal file
3
src/widgets/PermissionsTable/index.ts
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export { PermissionsTable } from "./PermissionsTable";
|
||||||
|
export { RolesHintTable } from "./RolesHintTable";
|
||||||
|
export { ROLE_RESOURCES, type PermissionLevel, getPermissionLevel, applyPermissionChange } from "./constants";
|
||||||
@@ -164,6 +164,7 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
padding: 7px;
|
padding: 7px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
height: 60px;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-around;
|
justify-content: space-around;
|
||||||
|
|||||||
@@ -21,3 +21,4 @@ export * from "./SaveWithoutCityAgree";
|
|||||||
export * from "./CitySelector";
|
export * from "./CitySelector";
|
||||||
export * from "./modals";
|
export * from "./modals";
|
||||||
export * from "./TestingModeBanner";
|
export * from "./TestingModeBanner";
|
||||||
|
export * from "./PermissionsTable";
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
474
yarn.lock
474
yarn.lock
@@ -16,7 +16,7 @@
|
|||||||
resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz"
|
resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz"
|
||||||
integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==
|
integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==
|
||||||
|
|
||||||
"@babel/core@^7.21.3", "@babel/core@^7.28.0":
|
"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.21.3", "@babel/core@^7.28.0":
|
||||||
version "7.28.5"
|
version "7.28.5"
|
||||||
resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz"
|
resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz"
|
||||||
integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==
|
integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==
|
||||||
@@ -170,28 +170,6 @@
|
|||||||
resolved "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz"
|
resolved "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz"
|
||||||
integrity sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==
|
integrity sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==
|
||||||
|
|
||||||
"@emnapi/core@^1.5.0":
|
|
||||||
version "1.10.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.10.0.tgz#380ccc8f2412ea22d1d972df7f8ee23a3b9c7467"
|
|
||||||
integrity sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==
|
|
||||||
dependencies:
|
|
||||||
"@emnapi/wasi-threads" "1.2.1"
|
|
||||||
tslib "^2.4.0"
|
|
||||||
|
|
||||||
"@emnapi/runtime@^1.5.0":
|
|
||||||
version "1.10.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.10.0.tgz#4b260c0d3534204e98c6110b8db1a987d26ec87c"
|
|
||||||
integrity sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==
|
|
||||||
dependencies:
|
|
||||||
tslib "^2.4.0"
|
|
||||||
|
|
||||||
"@emnapi/wasi-threads@1.2.1", "@emnapi/wasi-threads@^1.1.0":
|
|
||||||
version "1.2.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz#28fed21a1ba1ce797c44a070abc94d42f3ae8548"
|
|
||||||
integrity sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==
|
|
||||||
dependencies:
|
|
||||||
tslib "^2.4.0"
|
|
||||||
|
|
||||||
"@emotion/babel-plugin@^11.13.5":
|
"@emotion/babel-plugin@^11.13.5":
|
||||||
version "11.13.5"
|
version "11.13.5"
|
||||||
resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz"
|
resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz"
|
||||||
@@ -237,7 +215,7 @@
|
|||||||
resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz"
|
resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz"
|
||||||
integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==
|
integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==
|
||||||
|
|
||||||
"@emotion/react@^11.14.0":
|
"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.14.0", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@^11.9.0":
|
||||||
version "11.14.0"
|
version "11.14.0"
|
||||||
resolved "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz"
|
resolved "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz"
|
||||||
integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==
|
integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==
|
||||||
@@ -267,7 +245,7 @@
|
|||||||
resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz"
|
resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz"
|
||||||
integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==
|
integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==
|
||||||
|
|
||||||
"@emotion/styled@^11.14.0":
|
"@emotion/styled@^11.14.0", "@emotion/styled@^11.3.0", "@emotion/styled@^11.8.1":
|
||||||
version "11.14.1"
|
version "11.14.1"
|
||||||
resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz"
|
resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz"
|
||||||
integrity sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==
|
integrity sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==
|
||||||
@@ -299,136 +277,11 @@
|
|||||||
resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz"
|
resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz"
|
||||||
integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==
|
integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==
|
||||||
|
|
||||||
"@esbuild/aix-ppc64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz#2ae33300598132cc4cf580dbbb28d30fed3c5c49"
|
|
||||||
integrity sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==
|
|
||||||
|
|
||||||
"@esbuild/android-arm64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz#927708b3db5d739d6cb7709136924cc81bec9b03"
|
|
||||||
integrity sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==
|
|
||||||
|
|
||||||
"@esbuild/android-arm@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.11.tgz#571f94e7f4068957ec4c2cfb907deae3d01b55ae"
|
|
||||||
integrity sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==
|
|
||||||
|
|
||||||
"@esbuild/android-x64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.11.tgz#8a3bf5cae6c560c7ececa3150b2bde76e0fb81e6"
|
|
||||||
integrity sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==
|
|
||||||
|
|
||||||
"@esbuild/darwin-arm64@0.25.11":
|
"@esbuild/darwin-arm64@0.25.11":
|
||||||
version "0.25.11"
|
version "0.25.11"
|
||||||
resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz"
|
resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz"
|
||||||
integrity sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==
|
integrity sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==
|
||||||
|
|
||||||
"@esbuild/darwin-x64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz#70f5e925a30c8309f1294d407a5e5e002e0315fe"
|
|
||||||
integrity sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==
|
|
||||||
|
|
||||||
"@esbuild/freebsd-arm64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz#4ec1db687c5b2b78b44148025da9632397553e8a"
|
|
||||||
integrity sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==
|
|
||||||
|
|
||||||
"@esbuild/freebsd-x64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz#4c81abd1b142f1e9acfef8c5153d438ca53f44bb"
|
|
||||||
integrity sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==
|
|
||||||
|
|
||||||
"@esbuild/linux-arm64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz#69517a111acfc2b93aa0fb5eaeb834c0202ccda5"
|
|
||||||
integrity sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==
|
|
||||||
|
|
||||||
"@esbuild/linux-arm@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz#58dac26eae2dba0fac5405052b9002dac088d38f"
|
|
||||||
integrity sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==
|
|
||||||
|
|
||||||
"@esbuild/linux-ia32@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz#b89d4efe9bdad46ba944f0f3b8ddd40834268c2b"
|
|
||||||
integrity sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==
|
|
||||||
|
|
||||||
"@esbuild/linux-loong64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz#11f603cb60ad14392c3f5c94d64b3cc8b630fbeb"
|
|
||||||
integrity sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==
|
|
||||||
|
|
||||||
"@esbuild/linux-mips64el@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz#b7d447ff0676b8ab247d69dac40a5cf08e5eeaf5"
|
|
||||||
integrity sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==
|
|
||||||
|
|
||||||
"@esbuild/linux-ppc64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz#b3a28ed7cc252a61b07ff7c8fd8a984ffd3a2f74"
|
|
||||||
integrity sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==
|
|
||||||
|
|
||||||
"@esbuild/linux-riscv64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz#ce75b08f7d871a75edcf4d2125f50b21dc9dc273"
|
|
||||||
integrity sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==
|
|
||||||
|
|
||||||
"@esbuild/linux-s390x@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz#cd08f6c73b6b6ff9ccdaabbd3ff6ad3dca99c263"
|
|
||||||
integrity sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==
|
|
||||||
|
|
||||||
"@esbuild/linux-x64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz#3c3718af31a95d8946ebd3c32bb1e699bdf74910"
|
|
||||||
integrity sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==
|
|
||||||
|
|
||||||
"@esbuild/netbsd-arm64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz#b4c767082401e3a4e8595fe53c47cd7f097c8077"
|
|
||||||
integrity sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==
|
|
||||||
|
|
||||||
"@esbuild/netbsd-x64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz#f2a930458ed2941d1f11ebc34b9c7d61f7a4d034"
|
|
||||||
integrity sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==
|
|
||||||
|
|
||||||
"@esbuild/openbsd-arm64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz#b4ae93c75aec48bc1e8a0154957a05f0641f2dad"
|
|
||||||
integrity sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==
|
|
||||||
|
|
||||||
"@esbuild/openbsd-x64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz#b42863959c8dcf9b01581522e40012d2c70045e2"
|
|
||||||
integrity sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==
|
|
||||||
|
|
||||||
"@esbuild/openharmony-arm64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz#b2e717141c8fdf6bddd4010f0912e6b39e1640f1"
|
|
||||||
integrity sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==
|
|
||||||
|
|
||||||
"@esbuild/sunos-x64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz#9fbea1febe8778927804828883ec0f6dd80eb244"
|
|
||||||
integrity sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==
|
|
||||||
|
|
||||||
"@esbuild/win32-arm64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz#501539cedb24468336073383989a7323005a8935"
|
|
||||||
integrity sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==
|
|
||||||
|
|
||||||
"@esbuild/win32-ia32@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz#8ac7229aa82cef8f16ffb58f1176a973a7a15343"
|
|
||||||
integrity sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==
|
|
||||||
|
|
||||||
"@esbuild/win32-x64@0.25.11":
|
|
||||||
version "0.25.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz#5ecda6f3fe138b7e456f4e429edde33c823f392f"
|
|
||||||
integrity sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==
|
|
||||||
|
|
||||||
"@eslint-community/eslint-utils@^4.7.0", "@eslint-community/eslint-utils@^4.8.0":
|
"@eslint-community/eslint-utils@^4.7.0", "@eslint-community/eslint-utils@^4.8.0":
|
||||||
version "4.9.0"
|
version "4.9.0"
|
||||||
resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz"
|
resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz"
|
||||||
@@ -479,7 +332,7 @@
|
|||||||
minimatch "^3.1.2"
|
minimatch "^3.1.2"
|
||||||
strip-json-comments "^3.1.1"
|
strip-json-comments "^3.1.1"
|
||||||
|
|
||||||
"@eslint/js@9.38.0", "@eslint/js@^9.25.0":
|
"@eslint/js@^9.25.0", "@eslint/js@9.38.0":
|
||||||
version "9.38.0"
|
version "9.38.0"
|
||||||
resolved "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz"
|
resolved "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz"
|
||||||
integrity sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==
|
integrity sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==
|
||||||
@@ -589,7 +442,7 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime" "^7.28.4"
|
"@babel/runtime" "^7.28.4"
|
||||||
|
|
||||||
"@mui/material@^7.1.0":
|
"@mui/material@^5.15.14 || ^6.0.0 || ^7.0.0", "@mui/material@^7.1.0", "@mui/material@^7.3.4":
|
||||||
version "7.3.4"
|
version "7.3.4"
|
||||||
resolved "https://registry.npmjs.org/@mui/material/-/material-7.3.4.tgz"
|
resolved "https://registry.npmjs.org/@mui/material/-/material-7.3.4.tgz"
|
||||||
integrity sha512-gEQL9pbJZZHT7lYJBKQCS723v1MGys2IFc94COXbUIyCTWa+qC77a7hUax4Yjd5ggEm35dk4AyYABpKKWC4MLw==
|
integrity sha512-gEQL9pbJZZHT7lYJBKQCS723v1MGys2IFc94COXbUIyCTWa+qC77a7hUax4Yjd5ggEm35dk4AyYABpKKWC4MLw==
|
||||||
@@ -628,7 +481,7 @@
|
|||||||
csstype "^3.1.3"
|
csstype "^3.1.3"
|
||||||
prop-types "^15.8.1"
|
prop-types "^15.8.1"
|
||||||
|
|
||||||
"@mui/system@^7.3.3":
|
"@mui/system@^5.15.14 || ^6.0.0 || ^7.0.0", "@mui/system@^7.3.3":
|
||||||
version "7.3.3"
|
version "7.3.3"
|
||||||
resolved "https://registry.npmjs.org/@mui/system/-/system-7.3.3.tgz"
|
resolved "https://registry.npmjs.org/@mui/system/-/system-7.3.3.tgz"
|
||||||
integrity sha512-Lqq3emZr5IzRLKaHPuMaLBDVaGvxoh6z7HMWd1RPKawBM5uMRaQ4ImsmmgXWtwJdfZux5eugfDhXJUo2mliS8Q==
|
integrity sha512-Lqq3emZr5IzRLKaHPuMaLBDVaGvxoh6z7HMWd1RPKawBM5uMRaQ4ImsmmgXWtwJdfZux5eugfDhXJUo2mliS8Q==
|
||||||
@@ -693,13 +546,6 @@
|
|||||||
"@mui/utils" "^7.3.3"
|
"@mui/utils" "^7.3.3"
|
||||||
"@mui/x-internals" "8.14.0"
|
"@mui/x-internals" "8.14.0"
|
||||||
|
|
||||||
"@napi-rs/wasm-runtime@^1.0.7":
|
|
||||||
version "1.1.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz#a46bbfedc29751b7170c5d23bc1d8ee8c7e3c1e1"
|
|
||||||
integrity sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==
|
|
||||||
dependencies:
|
|
||||||
"@tybys/wasm-util" "^0.10.1"
|
|
||||||
|
|
||||||
"@nodelib/fs.scandir@2.1.5":
|
"@nodelib/fs.scandir@2.1.5":
|
||||||
version "2.1.5"
|
version "2.1.5"
|
||||||
resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
|
resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
|
||||||
@@ -708,7 +554,7 @@
|
|||||||
"@nodelib/fs.stat" "2.0.5"
|
"@nodelib/fs.stat" "2.0.5"
|
||||||
run-parallel "^1.1.9"
|
run-parallel "^1.1.9"
|
||||||
|
|
||||||
"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
|
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
|
||||||
version "2.0.5"
|
version "2.0.5"
|
||||||
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
|
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
|
||||||
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
|
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
|
||||||
@@ -726,7 +572,7 @@
|
|||||||
resolved "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.9.3.tgz"
|
resolved "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.9.3.tgz"
|
||||||
integrity sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==
|
integrity sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==
|
||||||
|
|
||||||
"@photo-sphere-viewer/core@^5.13.2":
|
"@photo-sphere-viewer/core@^5.13.2", "@photo-sphere-viewer/core@>=5.13.1":
|
||||||
version "5.14.0"
|
version "5.14.0"
|
||||||
resolved "https://registry.npmjs.org/@photo-sphere-viewer/core/-/core-5.14.0.tgz"
|
resolved "https://registry.npmjs.org/@photo-sphere-viewer/core/-/core-5.14.0.tgz"
|
||||||
integrity sha512-V0JeDSB1D2Q60Zqn7+0FPjq8gqbKEwuxMzNdTLydefkQugVztLvdZykO+4k5XTpweZ2QAWPH/QOI1xZbsdvR9A==
|
integrity sha512-V0JeDSB1D2Q60Zqn7+0FPjq8gqbKEwuxMzNdTLydefkQugVztLvdZykO+4k5XTpweZ2QAWPH/QOI1xZbsdvR9A==
|
||||||
@@ -778,7 +624,7 @@
|
|||||||
utility-types "^3.11.0"
|
utility-types "^3.11.0"
|
||||||
zustand "^5.0.1"
|
zustand "^5.0.1"
|
||||||
|
|
||||||
"@react-three/fiber@^9.1.2":
|
"@react-three/fiber@^9.0.0", "@react-three/fiber@^9.1.2":
|
||||||
version "9.4.0"
|
version "9.4.0"
|
||||||
resolved "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.4.0.tgz"
|
resolved "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.4.0.tgz"
|
||||||
integrity sha512-k4iu1R6e5D54918V4sqmISUkI5OgTw3v7/sDRKEC632Wd5g2WBtUS5gyG63X0GJO/HZUj1tsjSXfyzwrUHZl1g==
|
integrity sha512-k4iu1R6e5D54918V4sqmISUkI5OgTw3v7/sDRKEC632Wd5g2WBtUS5gyG63X0GJO/HZUj1tsjSXfyzwrUHZl1g==
|
||||||
@@ -810,116 +656,11 @@
|
|||||||
estree-walker "^2.0.2"
|
estree-walker "^2.0.2"
|
||||||
picomatch "^4.0.2"
|
picomatch "^4.0.2"
|
||||||
|
|
||||||
"@rollup/rollup-android-arm-eabi@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz#0f44a2f8668ed87b040b6fe659358ac9239da4db"
|
|
||||||
integrity sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==
|
|
||||||
|
|
||||||
"@rollup/rollup-android-arm64@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz#25b9a01deef6518a948431564c987bcb205274f5"
|
|
||||||
integrity sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==
|
|
||||||
|
|
||||||
"@rollup/rollup-darwin-arm64@4.52.5":
|
"@rollup/rollup-darwin-arm64@4.52.5":
|
||||||
version "4.52.5"
|
version "4.52.5"
|
||||||
resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz"
|
resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz"
|
||||||
integrity sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==
|
integrity sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==
|
||||||
|
|
||||||
"@rollup/rollup-darwin-x64@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz#8e526417cd6f54daf1d0c04cf361160216581956"
|
|
||||||
integrity sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==
|
|
||||||
|
|
||||||
"@rollup/rollup-freebsd-arm64@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz#0e7027054493f3409b1f219a3eac5efd128ef899"
|
|
||||||
integrity sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==
|
|
||||||
|
|
||||||
"@rollup/rollup-freebsd-x64@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz#72b204a920139e9ec3d331bd9cfd9a0c248ccb10"
|
|
||||||
integrity sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==
|
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm-gnueabihf@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz#ab1b522ebe5b7e06c99504cc38f6cd8b808ba41c"
|
|
||||||
integrity sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==
|
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm-musleabihf@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz#f8cc30b638f1ee7e3d18eac24af47ea29d9beb00"
|
|
||||||
integrity sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==
|
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm64-gnu@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz#7af37a9e85f25db59dc8214172907b7e146c12cc"
|
|
||||||
integrity sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==
|
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm64-musl@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz#a623eb0d3617c03b7a73716eb85c6e37b776f7e0"
|
|
||||||
integrity sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==
|
|
||||||
|
|
||||||
"@rollup/rollup-linux-loong64-gnu@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz#76ea038b549c5c6c5f0d062942627c4066642ee2"
|
|
||||||
integrity sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==
|
|
||||||
|
|
||||||
"@rollup/rollup-linux-ppc64-gnu@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz#d9a4c3f0a3492bc78f6fdfe8131ac61c7359ccd5"
|
|
||||||
integrity sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==
|
|
||||||
|
|
||||||
"@rollup/rollup-linux-riscv64-gnu@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz#87ab033eebd1a9a1dd7b60509f6333ec1f82d994"
|
|
||||||
integrity sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==
|
|
||||||
|
|
||||||
"@rollup/rollup-linux-riscv64-musl@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz#bda3eb67e1c993c1ba12bc9c2f694e7703958d9f"
|
|
||||||
integrity sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==
|
|
||||||
|
|
||||||
"@rollup/rollup-linux-s390x-gnu@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz#f7bc10fbe096ab44694233dc42a2291ed5453d4b"
|
|
||||||
integrity sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==
|
|
||||||
|
|
||||||
"@rollup/rollup-linux-x64-gnu@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz#a151cb1234cc9b2cf5e8cfc02aa91436b8f9e278"
|
|
||||||
integrity sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==
|
|
||||||
|
|
||||||
"@rollup/rollup-linux-x64-musl@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz#7859e196501cc3b3062d45d2776cfb4d2f3a9350"
|
|
||||||
integrity sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==
|
|
||||||
|
|
||||||
"@rollup/rollup-openharmony-arm64@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz#85d0df7233734df31e547c1e647d2a5300b3bf30"
|
|
||||||
integrity sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==
|
|
||||||
|
|
||||||
"@rollup/rollup-win32-arm64-msvc@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz#e62357d00458db17277b88adbf690bb855cac937"
|
|
||||||
integrity sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==
|
|
||||||
|
|
||||||
"@rollup/rollup-win32-ia32-msvc@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz#fc7cd40f44834a703c1f1c3fe8bcc27ce476cd50"
|
|
||||||
integrity sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==
|
|
||||||
|
|
||||||
"@rollup/rollup-win32-x64-gnu@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz#1a22acfc93c64a64a48c42672e857ee51774d0d3"
|
|
||||||
integrity sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==
|
|
||||||
|
|
||||||
"@rollup/rollup-win32-x64-msvc@4.52.5":
|
|
||||||
version "4.52.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz#1657f56326bbe0ac80eedc9f9c18fc1ddd24e107"
|
|
||||||
integrity sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==
|
|
||||||
|
|
||||||
"@svgr/babel-plugin-add-jsx-attribute@8.0.0":
|
"@svgr/babel-plugin-add-jsx-attribute@8.0.0":
|
||||||
version "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"
|
resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz"
|
||||||
@@ -974,7 +715,7 @@
|
|||||||
"@svgr/babel-plugin-transform-react-native-svg" "8.1.0"
|
"@svgr/babel-plugin-transform-react-native-svg" "8.1.0"
|
||||||
"@svgr/babel-plugin-transform-svg-component" "8.0.0"
|
"@svgr/babel-plugin-transform-svg-component" "8.0.0"
|
||||||
|
|
||||||
"@svgr/core@^8.1.0":
|
"@svgr/core@*", "@svgr/core@^8.1.0":
|
||||||
version "8.1.0"
|
version "8.1.0"
|
||||||
resolved "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz"
|
resolved "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz"
|
||||||
integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==
|
integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==
|
||||||
@@ -1016,73 +757,11 @@
|
|||||||
source-map-js "^1.2.1"
|
source-map-js "^1.2.1"
|
||||||
tailwindcss "4.1.16"
|
tailwindcss "4.1.16"
|
||||||
|
|
||||||
"@tailwindcss/oxide-android-arm64@4.1.16":
|
|
||||||
version "4.1.16"
|
|
||||||
resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.16.tgz#9bd16c0a08db20d7c93907a9bd1564e0255307eb"
|
|
||||||
integrity sha512-8+ctzkjHgwDJ5caq9IqRSgsP70xhdhJvm+oueS/yhD5ixLhqTw9fSL1OurzMUhBwE5zK26FXLCz2f/RtkISqHA==
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-darwin-arm64@4.1.16":
|
"@tailwindcss/oxide-darwin-arm64@4.1.16":
|
||||||
version "4.1.16"
|
version "4.1.16"
|
||||||
resolved "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.16.tgz"
|
resolved "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.16.tgz"
|
||||||
integrity sha512-C3oZy5042v2FOALBZtY0JTDnGNdS6w7DxL/odvSny17ORUnaRKhyTse8xYi3yKGyfnTUOdavRCdmc8QqJYwFKA==
|
integrity sha512-C3oZy5042v2FOALBZtY0JTDnGNdS6w7DxL/odvSny17ORUnaRKhyTse8xYi3yKGyfnTUOdavRCdmc8QqJYwFKA==
|
||||||
|
|
||||||
"@tailwindcss/oxide-darwin-x64@4.1.16":
|
|
||||||
version "4.1.16"
|
|
||||||
resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.16.tgz#6193bafbb1a885795702f12bbef9cc5eb4cc550b"
|
|
||||||
integrity sha512-vjrl/1Ub9+JwU6BP0emgipGjowzYZMjbWCDqwA2Z4vCa+HBSpP4v6U2ddejcHsolsYxwL5r4bPNoamlV0xDdLg==
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-freebsd-x64@4.1.16":
|
|
||||||
version "4.1.16"
|
|
||||||
resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.16.tgz#0e2b064d71ba87a9001ac963be2752a8ddb64349"
|
|
||||||
integrity sha512-TSMpPYpQLm+aR1wW5rKuUuEruc/oOX3C7H0BTnPDn7W/eMw8W+MRMpiypKMkXZfwH8wqPIRKppuZoedTtNj2tg==
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-linux-arm-gnueabihf@4.1.16":
|
|
||||||
version "4.1.16"
|
|
||||||
resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.16.tgz#8e80c959eeda81a08ed955e23eb6d228287b9672"
|
|
||||||
integrity sha512-p0GGfRg/w0sdsFKBjMYvvKIiKy/LNWLWgV/plR4lUgrsxFAoQBFrXkZ4C0w8IOXfslB9vHK/JGASWD2IefIpvw==
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-linux-arm64-gnu@4.1.16":
|
|
||||||
version "4.1.16"
|
|
||||||
resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.16.tgz#d5f54910920fc5808122515f5208c5ecc1a40545"
|
|
||||||
integrity sha512-DoixyMmTNO19rwRPdqviTrG1rYzpxgyYJl8RgQvdAQUzxC1ToLRqtNJpU/ATURSKgIg6uerPw2feW0aS8SNr/w==
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-linux-arm64-musl@4.1.16":
|
|
||||||
version "4.1.16"
|
|
||||||
resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.16.tgz#67cdb932230ac47bf3bf5415ccc92417b27020ee"
|
|
||||||
integrity sha512-H81UXMa9hJhWhaAUca6bU2wm5RRFpuHImrwXBUvPbYb+3jo32I9VIwpOX6hms0fPmA6f2pGVlybO6qU8pF4fzQ==
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-linux-x64-gnu@4.1.16":
|
|
||||||
version "4.1.16"
|
|
||||||
resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.16.tgz#80ae0cfd8ebc970f239060ecdfdd07f6f6b14dce"
|
|
||||||
integrity sha512-ZGHQxDtFC2/ruo7t99Qo2TTIvOERULPl5l0K1g0oK6b5PGqjYMga+FcY1wIUnrUxY56h28FxybtDEla+ICOyew==
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-linux-x64-musl@4.1.16":
|
|
||||||
version "4.1.16"
|
|
||||||
resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.16.tgz#524e5b87e8e79a712de3d9bbb94d2fc2fa44391c"
|
|
||||||
integrity sha512-Oi1tAaa0rcKf1Og9MzKeINZzMLPbhxvm7rno5/zuP1WYmpiG0bEHq4AcRUiG2165/WUzvxkW4XDYCscZWbTLZw==
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-wasm32-wasi@4.1.16":
|
|
||||||
version "4.1.16"
|
|
||||||
resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.16.tgz#dc31d6bc1f6c1e8119a335ae3f28deb4d7c560f2"
|
|
||||||
integrity sha512-B01u/b8LteGRwucIBmCQ07FVXLzImWESAIMcUU6nvFt/tYsQ6IHz8DmZ5KtvmwxD+iTYBtM1xwoGXswnlu9v0Q==
|
|
||||||
dependencies:
|
|
||||||
"@emnapi/core" "^1.5.0"
|
|
||||||
"@emnapi/runtime" "^1.5.0"
|
|
||||||
"@emnapi/wasi-threads" "^1.1.0"
|
|
||||||
"@napi-rs/wasm-runtime" "^1.0.7"
|
|
||||||
"@tybys/wasm-util" "^0.10.1"
|
|
||||||
tslib "^2.4.0"
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-win32-arm64-msvc@4.1.16":
|
|
||||||
version "4.1.16"
|
|
||||||
resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.16.tgz#f1f810cdb49dae8071d5edf0db5cc0da2ec6a7e8"
|
|
||||||
integrity sha512-zX+Q8sSkGj6HKRTMJXuPvOcP8XfYON24zJBRPlszcH1Np7xuHXhWn8qfFjIujVzvH3BHU+16jBXwgpl20i+v9A==
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-win32-x64-msvc@4.1.16":
|
|
||||||
version "4.1.16"
|
|
||||||
resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.16.tgz#76dcda613578f06569c0a6015f39f12746a24dce"
|
|
||||||
integrity sha512-m5dDFJUEejbFqP+UXVstd4W/wnxA4F61q8SoL+mqTypId2T2ZpuxosNSgowiCnLp2+Z+rivdU0AqpfgiD7yCBg==
|
|
||||||
|
|
||||||
"@tailwindcss/oxide@4.1.16":
|
"@tailwindcss/oxide@4.1.16":
|
||||||
version "4.1.16"
|
version "4.1.16"
|
||||||
resolved "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.16.tgz"
|
resolved "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.16.tgz"
|
||||||
@@ -1122,13 +801,6 @@
|
|||||||
resolved "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz"
|
resolved "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz"
|
||||||
integrity sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==
|
integrity sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==
|
||||||
|
|
||||||
"@tybys/wasm-util@^0.10.1":
|
|
||||||
version "0.10.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz#ecddd3205cf1e2d5274649ff0eedd2991ed7f414"
|
|
||||||
integrity sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==
|
|
||||||
dependencies:
|
|
||||||
tslib "^2.4.0"
|
|
||||||
|
|
||||||
"@types/babel__core@^7.20.5":
|
"@types/babel__core@^7.20.5":
|
||||||
version "7.20.5"
|
version "7.20.5"
|
||||||
resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz"
|
resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz"
|
||||||
@@ -1198,7 +870,7 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@types/estree" "*"
|
"@types/estree" "*"
|
||||||
|
|
||||||
"@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.6":
|
"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.6", "@types/estree@1.0.8":
|
||||||
version "1.0.8"
|
version "1.0.8"
|
||||||
resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz"
|
resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz"
|
||||||
integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
|
integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
|
||||||
@@ -1237,7 +909,7 @@
|
|||||||
resolved "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz"
|
resolved "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz"
|
||||||
integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==
|
integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==
|
||||||
|
|
||||||
"@types/node@^22.15.24":
|
"@types/node@^18.0.0 || ^20.0.0 || >=22.0.0", "@types/node@^22.15.24":
|
||||||
version "22.18.13"
|
version "22.18.13"
|
||||||
resolved "https://registry.npmjs.org/@types/node/-/node-22.18.13.tgz"
|
resolved "https://registry.npmjs.org/@types/node/-/node-22.18.13.tgz"
|
||||||
integrity sha512-Bo45YKIjnmFtv6I1TuC8AaHBbqXtIo+Om5fE4QiU1Tj8QR/qt+8O3BAtOimG5IFmwaWiPmB3Mv3jtYzBA4Us2A==
|
integrity sha512-Bo45YKIjnmFtv6I1TuC8AaHBbqXtIo+Om5fE4QiU1Tj8QR/qt+8O3BAtOimG5IFmwaWiPmB3Mv3jtYzBA4Us2A==
|
||||||
@@ -1284,7 +956,7 @@
|
|||||||
resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz"
|
resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz"
|
||||||
integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==
|
integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==
|
||||||
|
|
||||||
"@types/react@^19.1.2":
|
"@types/react@*", "@types/react@^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react@^18.2.25 || ^19", "@types/react@^19.1.2", "@types/react@^19.2.0", "@types/react@>=16.8", "@types/react@>=18", "@types/react@>=18.0.0":
|
||||||
version "19.2.2"
|
version "19.2.2"
|
||||||
resolved "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz"
|
resolved "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz"
|
||||||
integrity sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==
|
integrity sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==
|
||||||
@@ -1303,7 +975,7 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@types/estree" "*"
|
"@types/estree" "*"
|
||||||
|
|
||||||
"@types/three@*":
|
"@types/three@*", "@types/three@>=0.134.0":
|
||||||
version "0.180.0"
|
version "0.180.0"
|
||||||
resolved "https://registry.npmjs.org/@types/three/-/three-0.180.0.tgz"
|
resolved "https://registry.npmjs.org/@types/three/-/three-0.180.0.tgz"
|
||||||
integrity sha512-ykFtgCqNnY0IPvDro7h+9ZeLY+qjgUWv+qEvUt84grhenO60Hqd4hScHE7VTB9nOQ/3QM8lkbNE+4vKjEpUxKg==
|
integrity sha512-ykFtgCqNnY0IPvDro7h+9ZeLY+qjgUWv+qEvUt84grhenO60Hqd4hScHE7VTB9nOQ/3QM8lkbNE+4vKjEpUxKg==
|
||||||
@@ -1351,7 +1023,7 @@
|
|||||||
natural-compare "^1.4.0"
|
natural-compare "^1.4.0"
|
||||||
ts-api-utils "^2.1.0"
|
ts-api-utils "^2.1.0"
|
||||||
|
|
||||||
"@typescript-eslint/parser@8.46.2":
|
"@typescript-eslint/parser@^8.46.2", "@typescript-eslint/parser@8.46.2":
|
||||||
version "8.46.2"
|
version "8.46.2"
|
||||||
resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.2.tgz"
|
resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.2.tgz"
|
||||||
integrity sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==
|
integrity sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==
|
||||||
@@ -1379,7 +1051,7 @@
|
|||||||
"@typescript-eslint/types" "8.46.2"
|
"@typescript-eslint/types" "8.46.2"
|
||||||
"@typescript-eslint/visitor-keys" "8.46.2"
|
"@typescript-eslint/visitor-keys" "8.46.2"
|
||||||
|
|
||||||
"@typescript-eslint/tsconfig-utils@8.46.2", "@typescript-eslint/tsconfig-utils@^8.46.2":
|
"@typescript-eslint/tsconfig-utils@^8.46.2", "@typescript-eslint/tsconfig-utils@8.46.2":
|
||||||
version "8.46.2"
|
version "8.46.2"
|
||||||
resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz"
|
resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz"
|
||||||
integrity sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==
|
integrity sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==
|
||||||
@@ -1395,7 +1067,7 @@
|
|||||||
debug "^4.3.4"
|
debug "^4.3.4"
|
||||||
ts-api-utils "^2.1.0"
|
ts-api-utils "^2.1.0"
|
||||||
|
|
||||||
"@typescript-eslint/types@8.46.2", "@typescript-eslint/types@^8.46.2":
|
"@typescript-eslint/types@^8.46.2", "@typescript-eslint/types@8.46.2":
|
||||||
version "8.46.2"
|
version "8.46.2"
|
||||||
resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz"
|
resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz"
|
||||||
integrity sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==
|
integrity sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==
|
||||||
@@ -1478,7 +1150,7 @@ acorn-jsx@^5.3.2:
|
|||||||
resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
|
resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
|
||||||
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
|
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
|
||||||
|
|
||||||
acorn@^8.15.0:
|
"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.15.0:
|
||||||
version "8.15.0"
|
version "8.15.0"
|
||||||
resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz"
|
resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz"
|
||||||
integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
|
integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
|
||||||
@@ -1582,7 +1254,7 @@ braces@^3.0.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
fill-range "^7.1.1"
|
fill-range "^7.1.1"
|
||||||
|
|
||||||
browserslist@^4.24.0:
|
browserslist@^4.24.0, "browserslist@>= 4.21.0":
|
||||||
version "4.27.0"
|
version "4.27.0"
|
||||||
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz"
|
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz"
|
||||||
integrity sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==
|
integrity sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==
|
||||||
@@ -1879,7 +1551,7 @@ earcut@^3.0.0, earcut@^3.0.2:
|
|||||||
resolved "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz"
|
resolved "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz"
|
||||||
integrity sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==
|
integrity sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==
|
||||||
|
|
||||||
easymde@^2.20.0:
|
easymde@^2.20.0, "easymde@>= 2.0.0 < 3.0.0":
|
||||||
version "2.20.0"
|
version "2.20.0"
|
||||||
resolved "https://registry.npmjs.org/easymde/-/easymde-2.20.0.tgz"
|
resolved "https://registry.npmjs.org/easymde/-/easymde-2.20.0.tgz"
|
||||||
integrity sha512-V1Z5f92TfR42Na852OWnIZMbM7zotWQYTddNaLYZFVKj7APBbyZ3FYJ27gBw2grMW3R6Qdv9J8n5Ij7XRSIgXQ==
|
integrity sha512-V1Z5f92TfR42Na852OWnIZMbM7zotWQYTddNaLYZFVKj7APBbyZ3FYJ27gBw2grMW3R6Qdv9J8n5Ij7XRSIgXQ==
|
||||||
@@ -2022,7 +1694,7 @@ eslint-visitor-keys@^4.2.1:
|
|||||||
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz"
|
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz"
|
||||||
integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
|
integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
|
||||||
|
|
||||||
eslint@^9.25.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@^8.57.0 || ^9.0.0", eslint@^9.25.0, eslint@>=8.40:
|
||||||
version "9.38.0"
|
version "9.38.0"
|
||||||
resolved "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz"
|
resolved "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz"
|
||||||
integrity sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==
|
integrity sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==
|
||||||
@@ -2148,7 +1820,12 @@ fastq@^1.6.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
reusify "^1.0.4"
|
reusify "^1.0.4"
|
||||||
|
|
||||||
fdir@^6.4.4, fdir@^6.5.0:
|
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:
|
||||||
version "6.5.0"
|
version "6.5.0"
|
||||||
resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz"
|
resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz"
|
||||||
integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==
|
integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==
|
||||||
@@ -2612,7 +2289,7 @@ its-fine@^2.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@types/react-reconciler" "^0.28.9"
|
"@types/react-reconciler" "^0.28.9"
|
||||||
|
|
||||||
jiti@^2.6.1:
|
jiti@*, jiti@^2.6.1, jiti@>=1.21.0:
|
||||||
version "2.6.1"
|
version "2.6.1"
|
||||||
resolved "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz"
|
resolved "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz"
|
||||||
integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==
|
integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==
|
||||||
@@ -2691,62 +2368,12 @@ lie@^3.0.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
immediate "~3.0.5"
|
immediate "~3.0.5"
|
||||||
|
|
||||||
lightningcss-android-arm64@1.30.2:
|
|
||||||
version "1.30.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz#6966b7024d39c94994008b548b71ab360eb3a307"
|
|
||||||
integrity sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==
|
|
||||||
|
|
||||||
lightningcss-darwin-arm64@1.30.2:
|
lightningcss-darwin-arm64@1.30.2:
|
||||||
version "1.30.2"
|
version "1.30.2"
|
||||||
resolved "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz"
|
resolved "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz"
|
||||||
integrity sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==
|
integrity sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==
|
||||||
|
|
||||||
lightningcss-darwin-x64@1.30.2:
|
lightningcss@^1.21.0, lightningcss@1.30.2:
|
||||||
version "1.30.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz#5ce87e9cd7c4f2dcc1b713f5e8ee185c88d9b7cd"
|
|
||||||
integrity sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==
|
|
||||||
|
|
||||||
lightningcss-freebsd-x64@1.30.2:
|
|
||||||
version "1.30.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz#6ae1d5e773c97961df5cff57b851807ef33692a5"
|
|
||||||
integrity sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==
|
|
||||||
|
|
||||||
lightningcss-linux-arm-gnueabihf@1.30.2:
|
|
||||||
version "1.30.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz#62c489610c0424151a6121fa99d77731536cdaeb"
|
|
||||||
integrity sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==
|
|
||||||
|
|
||||||
lightningcss-linux-arm64-gnu@1.30.2:
|
|
||||||
version "1.30.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz#2a3661b56fe95a0cafae90be026fe0590d089298"
|
|
||||||
integrity sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==
|
|
||||||
|
|
||||||
lightningcss-linux-arm64-musl@1.30.2:
|
|
||||||
version "1.30.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz#d7ddd6b26959245e026bc1ad9eb6aa983aa90e6b"
|
|
||||||
integrity sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==
|
|
||||||
|
|
||||||
lightningcss-linux-x64-gnu@1.30.2:
|
|
||||||
version "1.30.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz#5a89814c8e63213a5965c3d166dff83c36152b1a"
|
|
||||||
integrity sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==
|
|
||||||
|
|
||||||
lightningcss-linux-x64-musl@1.30.2:
|
|
||||||
version "1.30.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz#808c2e91ce0bf5d0af0e867c6152e5378c049728"
|
|
||||||
integrity sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==
|
|
||||||
|
|
||||||
lightningcss-win32-arm64-msvc@1.30.2:
|
|
||||||
version "1.30.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz#ab4a8a8a2e6a82a4531e8bbb6bf0ff161ee6625a"
|
|
||||||
integrity sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==
|
|
||||||
|
|
||||||
lightningcss-win32-x64-msvc@1.30.2:
|
|
||||||
version "1.30.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz#f01f382c8e0a27e1c018b0bee316d210eac43b6e"
|
|
||||||
integrity sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==
|
|
||||||
|
|
||||||
lightningcss@1.30.2:
|
|
||||||
version "1.30.2"
|
version "1.30.2"
|
||||||
resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz"
|
resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz"
|
||||||
integrity sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==
|
integrity sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==
|
||||||
@@ -3195,7 +2822,7 @@ mobx-react-lite@^4.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
use-sync-external-store "^1.4.0"
|
use-sync-external-store "^1.4.0"
|
||||||
|
|
||||||
mobx@^6.13.7:
|
mobx@^6.13.7, mobx@^6.9.0:
|
||||||
version "6.15.0"
|
version "6.15.0"
|
||||||
resolved "https://registry.npmjs.org/mobx/-/mobx-6.15.0.tgz"
|
resolved "https://registry.npmjs.org/mobx/-/mobx-6.15.0.tgz"
|
||||||
integrity sha512-UczzB+0nnwGotYSgllfARAqWCJ5e/skuV2K/l+Zyck/H6pJIhLXuBnz+6vn2i211o7DtbE78HQtsYEKICHGI+g==
|
integrity sha512-UczzB+0nnwGotYSgllfARAqWCJ5e/skuV2K/l+Zyck/H6pJIhLXuBnz+6vn2i211o7DtbE78HQtsYEKICHGI+g==
|
||||||
@@ -3270,7 +2897,7 @@ overlayscrollbars-react@^0.5.6:
|
|||||||
resolved "https://registry.npmjs.org/overlayscrollbars-react/-/overlayscrollbars-react-0.5.6.tgz"
|
resolved "https://registry.npmjs.org/overlayscrollbars-react/-/overlayscrollbars-react-0.5.6.tgz"
|
||||||
integrity sha512-E5To04bL5brn9GVCZ36SnfGanxa2I2MDkWoa4Cjo5wol7l+diAgi4DBc983V7l2nOk/OLJ6Feg4kySspQEGDBw==
|
integrity sha512-E5To04bL5brn9GVCZ36SnfGanxa2I2MDkWoa4Cjo5wol7l+diAgi4DBc983V7l2nOk/OLJ6Feg4kySspQEGDBw==
|
||||||
|
|
||||||
overlayscrollbars@^2.15.1:
|
overlayscrollbars@^2.0.0, overlayscrollbars@^2.15.1:
|
||||||
version "2.15.1"
|
version "2.15.1"
|
||||||
resolved "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-2.15.1.tgz"
|
resolved "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-2.15.1.tgz"
|
||||||
integrity sha512-glX26JwjL+Tkzv0JNOWdW4VozP5dGXO+Wx8+TPrdTEJTSYT/8eJS8yXM+fewjU0nFq/JeCa+X+BqABNjC4YZSA==
|
integrity sha512-glX26JwjL+Tkzv0JNOWdW4VozP5dGXO+Wx8+TPrdTEJTSYT/8eJS8yXM+fewjU0nFq/JeCa+X+BqABNjC4YZSA==
|
||||||
@@ -3386,12 +3013,12 @@ picomatch@^2.3.1:
|
|||||||
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
|
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
|
||||||
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
|
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
|
||||||
|
|
||||||
picomatch@^4.0.2, picomatch@^4.0.3:
|
"picomatch@^3 || ^4", picomatch@^4.0.2, picomatch@^4.0.3:
|
||||||
version "4.0.3"
|
version "4.0.3"
|
||||||
resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz"
|
resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz"
|
||||||
integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==
|
integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==
|
||||||
|
|
||||||
pixi.js@^8.10.1:
|
pixi.js@^8.10.1, pixi.js@^8.2.6:
|
||||||
version "8.14.0"
|
version "8.14.0"
|
||||||
resolved "https://registry.npmjs.org/pixi.js/-/pixi.js-8.14.0.tgz"
|
resolved "https://registry.npmjs.org/pixi.js/-/pixi.js-8.14.0.tgz"
|
||||||
integrity sha512-ituDiEBb1Oqx56RYwTtC6MjPUhPfF/i15fpUv5oEqmzC/ce3SaSumulJcOjKG7+y0J0Ekl9Rl4XTxaUw+MVFZw==
|
integrity sha512-ituDiEBb1Oqx56RYwTtC6MjPUhPfF/i15fpUv5oEqmzC/ce3SaSumulJcOjKG7+y0J0Ekl9Rl4XTxaUw+MVFZw==
|
||||||
@@ -3448,7 +3075,7 @@ promise-worker-transferable@^1.0.4:
|
|||||||
is-promise "^2.1.0"
|
is-promise "^2.1.0"
|
||||||
lie "^3.0.2"
|
lie "^3.0.2"
|
||||||
|
|
||||||
prop-types@^15.6.2, prop-types@^15.8.1:
|
prop-types@^15.5.4, prop-types@^15.6.2, prop-types@^15.8.1:
|
||||||
version "15.8.1"
|
version "15.8.1"
|
||||||
resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
|
resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
|
||||||
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
|
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
|
||||||
@@ -3509,14 +3136,19 @@ rbush@^4.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
quickselect "^3.0.0"
|
quickselect "^3.0.0"
|
||||||
|
|
||||||
react-dom@^19.1.0:
|
"react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18 || ^19", "react-dom@^18.0.0 || ^19.0.0", react-dom@^19, react-dom@^19.0.0, react-dom@^19.1.0, react-dom@>=16.0.0, react-dom@>=16.13, react-dom@>=16.6.0, react-dom@>=16.8.2, react-dom@>=18:
|
||||||
version "19.2.0"
|
version "19.2.0"
|
||||||
resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz"
|
resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz"
|
||||||
integrity sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==
|
integrity sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
scheduler "^0.27.0"
|
scheduler "^0.27.0"
|
||||||
|
|
||||||
react-is@^16.13.1, react-is@^16.7.0:
|
react-is@^16.13.1:
|
||||||
|
version "16.13.1"
|
||||||
|
resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
|
||||||
|
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
|
||||||
|
|
||||||
|
react-is@^16.7.0:
|
||||||
version "16.13.1"
|
version "16.13.1"
|
||||||
resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
|
resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
|
||||||
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
|
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
|
||||||
@@ -3550,7 +3182,7 @@ react-photo-sphere-viewer@^6.2.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
eventemitter3 "^5.0.1"
|
eventemitter3 "^5.0.1"
|
||||||
|
|
||||||
react-reconciler@0.31.0, react-reconciler@^0.31.0:
|
react-reconciler@^0.31.0, react-reconciler@0.31.0:
|
||||||
version "0.31.0"
|
version "0.31.0"
|
||||||
resolved "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.31.0.tgz"
|
resolved "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.31.0.tgz"
|
||||||
integrity sha512-7Ob7Z+URmesIsIVRjnLoDGwBEG/tVitidU0nMsqX/eeJaLY89RISO/10ERe0MqmzuKUUB1rmY+h1itMbUHg9BQ==
|
integrity sha512-7Ob7Z+URmesIsIVRjnLoDGwBEG/tVitidU0nMsqX/eeJaLY89RISO/10ERe0MqmzuKUUB1rmY+h1itMbUHg9BQ==
|
||||||
@@ -3577,7 +3209,7 @@ react-router-dom@^7.6.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
react-router "7.9.4"
|
react-router "7.9.4"
|
||||||
|
|
||||||
react-router@7.9.4, react-router@^7.9.4:
|
react-router@^7.9.4, react-router@7.9.4:
|
||||||
version "7.9.4"
|
version "7.9.4"
|
||||||
resolved "https://registry.npmjs.org/react-router/-/react-router-7.9.4.tgz"
|
resolved "https://registry.npmjs.org/react-router/-/react-router-7.9.4.tgz"
|
||||||
integrity sha512-SD3G8HKviFHg9xj7dNODUKDFgpG4xqD5nhyd0mYoB5iISepuZAvzSr8ywxgxKJ52yRzf/HWtVHc9AWwoTbljvA==
|
integrity sha512-SD3G8HKviFHg9xj7dNODUKDFgpG4xqD5nhyd0mYoB5iISepuZAvzSr8ywxgxKJ52yRzf/HWtVHc9AWwoTbljvA==
|
||||||
@@ -3614,12 +3246,12 @@ react-use-measure@^2.1.7:
|
|||||||
resolved "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz"
|
resolved "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz"
|
||||||
integrity sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==
|
integrity sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==
|
||||||
|
|
||||||
react@^19.1.0:
|
"react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18 || ^19", "react@^18.0 || ^19", "react@^18.0.0 || ^19.0.0", react@^19, react@^19.0.0, react@^19.1.0, react@^19.2.0, "react@>= 16.8.0", react@>=16.0.0, react@>=16.13, react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=16.8.2, react@>=17.0, react@>=18, react@>=18.0.0, react@>=19.0.0:
|
||||||
version "19.2.0"
|
version "19.2.0"
|
||||||
resolved "https://registry.npmjs.org/react/-/react-19.2.0.tgz"
|
resolved "https://registry.npmjs.org/react/-/react-19.2.0.tgz"
|
||||||
integrity sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==
|
integrity sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==
|
||||||
|
|
||||||
redux@^5.0.1:
|
redux@^5.0.0, redux@^5.0.1:
|
||||||
version "5.0.1"
|
version "5.0.1"
|
||||||
resolved "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz"
|
resolved "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz"
|
||||||
integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==
|
integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==
|
||||||
@@ -3705,7 +3337,7 @@ rollup-plugin-visualizer@^6.0.5:
|
|||||||
source-map "^0.7.4"
|
source-map "^0.7.4"
|
||||||
yargs "^17.5.1"
|
yargs "^17.5.1"
|
||||||
|
|
||||||
rollup@^4.34.9:
|
rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^4.34.9, "rollup@2.x || 3.x || 4.x":
|
||||||
version "4.52.5"
|
version "4.52.5"
|
||||||
resolved "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz"
|
resolved "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz"
|
||||||
integrity sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==
|
integrity sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==
|
||||||
@@ -3891,7 +3523,7 @@ svg-parser@^2.0.4:
|
|||||||
resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz"
|
resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz"
|
||||||
integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==
|
integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==
|
||||||
|
|
||||||
tailwindcss@4.1.16, tailwindcss@^4.1.8:
|
tailwindcss@^4.1.8, "tailwindcss@>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1", tailwindcss@4.1.16:
|
||||||
version "4.1.16"
|
version "4.1.16"
|
||||||
resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.16.tgz"
|
resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.16.tgz"
|
||||||
integrity sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==
|
integrity sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==
|
||||||
@@ -3923,7 +3555,7 @@ three@^0.170.0:
|
|||||||
resolved "https://registry.npmjs.org/three/-/three-0.170.0.tgz"
|
resolved "https://registry.npmjs.org/three/-/three-0.170.0.tgz"
|
||||||
integrity sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==
|
integrity sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==
|
||||||
|
|
||||||
three@^0.177.0:
|
three@^0.177.0, "three@>= 0.159.0", three@>=0.125.0, three@>=0.126.1, three@>=0.128.0, three@>=0.134.0, three@>=0.137, three@>=0.156, three@>=0.159:
|
||||||
version "0.177.0"
|
version "0.177.0"
|
||||||
resolved "https://registry.npmjs.org/three/-/three-0.177.0.tgz"
|
resolved "https://registry.npmjs.org/three/-/three-0.177.0.tgz"
|
||||||
integrity sha512-EiXv5/qWAaGI+Vz2A+JfavwYCMdGjxVsrn3oBwllUoqYeaBO75J63ZfyaQKoiLrqNHoTlUc6PFgMXnS0kI45zg==
|
integrity sha512-EiXv5/qWAaGI+Vz2A+JfavwYCMdGjxVsrn3oBwllUoqYeaBO75J63ZfyaQKoiLrqNHoTlUc6PFgMXnS0kI45zg==
|
||||||
@@ -3993,9 +3625,9 @@ ts-api-utils@^2.1.0:
|
|||||||
resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz"
|
resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz"
|
||||||
integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==
|
integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==
|
||||||
|
|
||||||
tslib@^2.0.3, tslib@^2.4.0:
|
tslib@^2.0.3:
|
||||||
version "2.8.1"
|
version "2.8.1"
|
||||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
|
resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"
|
||||||
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
|
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
|
||||||
|
|
||||||
tunnel-rat@^0.1.2:
|
tunnel-rat@^0.1.2:
|
||||||
@@ -4022,7 +3654,7 @@ typescript-eslint@^8.30.1:
|
|||||||
"@typescript-eslint/typescript-estree" "8.46.2"
|
"@typescript-eslint/typescript-estree" "8.46.2"
|
||||||
"@typescript-eslint/utils" "8.46.2"
|
"@typescript-eslint/utils" "8.46.2"
|
||||||
|
|
||||||
typescript@~5.8.3:
|
typescript@>=4.8.4, "typescript@>=4.8.4 <6.0.0", typescript@>=4.9.5, typescript@~5.8.3:
|
||||||
version "5.8.3"
|
version "5.8.3"
|
||||||
resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz"
|
resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz"
|
||||||
integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==
|
integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==
|
||||||
@@ -4103,7 +3735,7 @@ uri-js@^4.2.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
punycode "^2.1.0"
|
punycode "^2.1.0"
|
||||||
|
|
||||||
use-sync-external-store@^1.2.2, use-sync-external-store@^1.4.0, use-sync-external-store@^1.6.0:
|
use-sync-external-store@^1.2.2, use-sync-external-store@^1.4.0, use-sync-external-store@^1.6.0, use-sync-external-store@>=1.2.0:
|
||||||
version "1.6.0"
|
version "1.6.0"
|
||||||
resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz"
|
resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz"
|
||||||
integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==
|
integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==
|
||||||
@@ -4163,7 +3795,7 @@ vite-plugin-svgr@^4.5.0:
|
|||||||
"@svgr/core" "^8.1.0"
|
"@svgr/core" "^8.1.0"
|
||||||
"@svgr/plugin-jsx" "^8.1.0"
|
"@svgr/plugin-jsx" "^8.1.0"
|
||||||
|
|
||||||
vite@^6.3.5:
|
"vite@^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", "vite@^5.2.0 || ^6 || ^7", vite@^6.3.5, vite@>=2.6.0:
|
||||||
version "6.4.1"
|
version "6.4.1"
|
||||||
resolved "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz"
|
resolved "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz"
|
||||||
integrity sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==
|
integrity sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==
|
||||||
|
|||||||
Reference in New Issue
Block a user