diff --git a/.npmrc b/.npmrc
new file mode 100644
index 0000000..521a9f7
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1 @@
+legacy-peer-deps=true
diff --git a/app/(tabs)/diary.tsx b/app/(tabs)/diary.tsx
index 8292afb..f365595 100644
--- a/app/(tabs)/diary.tsx
+++ b/app/(tabs)/diary.tsx
@@ -1,7 +1,7 @@
+import AlarmList from "@/components/AlarmList";
import { Link } from "expo-router";
import {
Platform,
- ScrollView,
StyleSheet,
Text,
TouchableOpacity,
@@ -9,20 +9,49 @@ import {
} from "react-native";
import { SafeAreaView } from "react-native-safe-area-context";
+const alarmExample = {
+ alarms: [
+ {
+ name: "Ngập nước có cảnh báo",
+ t: 1762226488,
+ level: 1,
+ id: "0:8:1",
+ },
+ {
+ name: "Tầu cảnh báo sos",
+ t: 1762226596,
+ level: 3,
+ id: "50:15",
+ },
+ {
+ name: "Khói có cảnh báo",
+ t: 1762226589,
+ level: 1,
+ id: "0:1:1",
+ },
+ {
+ name: "Cửa có cảnh báo",
+ t: 1762226547,
+ level: 1,
+ id: "0:7:1",
+ },
+ ],
+ level: 3,
+};
+
export default function Warning() {
return (
-
-
- Nhật Ký Chuyến Đi
+
+ Nhật Ký Chuyến Đi
-
-
- Mở Modal
-
-
-
-
+
+
+ Mở Modal
+
+
+
+
);
}
diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx
index 8428ca6..2159dba 100644
--- a/app/(tabs)/index.tsx
+++ b/app/(tabs)/index.tsx
@@ -1,5 +1,9 @@
+import GPSInfoPanel from "@/components/map/GPSInfoPanel";
+import type { PolygonWithLabelProps } from "@/components/map/PolygonWithLabel";
import { PolygonWithLabel } from "@/components/map/PolygonWithLabel";
+import type { PolylineWithLabelProps } from "@/components/map/PolylineWithLabel";
import { PolylineWithLabel } from "@/components/map/PolylineWithLabel";
+import SosButton from "@/components/map/SosButton";
import {
ENTITY,
EVENT_ALARM_DATA,
@@ -30,12 +34,10 @@ import {
Animated,
Image as RNImage,
StyleSheet,
- Text,
- TouchableOpacity,
- View,
+ View
} from "react-native";
import MapView, { Circle, Marker } from "react-native-maps";
-import { SafeAreaView } from "react-native-safe-area-context";
+
export default function HomeScreen() {
const [gpsData, setGpsData] = useState(
@@ -53,15 +55,16 @@ export default function HomeScreen() {
const [zoomLevel, setZoomLevel] = useState(10);
const [isFirstLoad, setIsFirstLoad] = useState(true);
const [polylineCoordinates, setPolylineCoordinates] = useState<
- number[][] | undefined
+ PolylineWithLabelProps | undefined
>(undefined);
const [polygonCoordinates, setPolygonCoordinates] = useState<
- number[][][] | undefined
+ PolygonWithLabelProps[] | undefined
>(undefined);
const platform = usePlatform();
const theme = useColorScheme();
const scale = useRef(new Animated.Value(0)).current;
const opacity = useRef(new Animated.Value(1)).current;
+
// console.log("Platform: ", platform);
// console.log("Theme: ", theme);
@@ -74,7 +77,12 @@ export default function HomeScreen() {
getBanzonesEventBus();
getTrackPointsEventBus();
const queryGpsData = (gpsData: Model.GPSResonse) => {
- setGpsData(gpsData);
+ if (gpsData) {
+ // console.log("GPS Data: ", gpsData);
+ setGpsData(gpsData);
+ } else {
+ setGpsData(undefined);
+ }
};
const queryAlarmData = (alarmData: Model.AlarmResponse) => {
// console.log("Alarm Data: ", alarmData.alarms.length);
@@ -82,7 +90,6 @@ export default function HomeScreen() {
};
const queryEntityData = (entityData: Model.TransformedEntity[]) => {
// console.log("Entities Length Data: ", entityData.length);
-
setEntityData(entityData);
};
const queryBanzonesData = (banzoneData: Model.Zone[]) => {
@@ -92,32 +99,36 @@ export default function HomeScreen() {
};
const queryTrackPointsData = (TrackPointsData: Model.ShipTrackPoint[]) => {
// console.log("TrackPoints Data: ", TrackPointsData.length);
- setTrackPointsData(TrackPointsData);
+ if (TrackPointsData && TrackPointsData.length > 0) {
+ setTrackPointsData(TrackPointsData);
+ } else {
+ setTrackPointsData(null);
+ }
};
eventBus.on(EVENT_GPS_DATA, queryGpsData);
- console.log("Registering event handlers in HomeScreen");
+ // console.log("Registering event handlers in HomeScreen");
eventBus.on(EVENT_GPS_DATA, queryGpsData);
- console.log("Subscribed to EVENT_GPS_DATA");
+ // console.log("Subscribed to EVENT_GPS_DATA");
eventBus.on(EVENT_ALARM_DATA, queryAlarmData);
- console.log("Subscribed to EVENT_ALARM_DATA");
+ // console.log("Subscribed to EVENT_ALARM_DATA");
eventBus.on(EVENT_ENTITY_DATA, queryEntityData);
- console.log("Subscribed to EVENT_ENTITY_DATA");
+ // console.log("Subscribed to EVENT_ENTITY_DATA");
eventBus.on(EVENT_TRACK_POINTS_DATA, queryTrackPointsData);
- console.log("Subscribed to EVENT_TRACK_POINTS_DATA");
+ // console.log("Subscribed to EVENT_TRACK_POINTS_DATA");
eventBus.once(EVENT_BANZONE_DATA, queryBanzonesData);
- console.log("Subscribed once to EVENT_BANZONE_DATA");
+ // console.log("Subscribed once to EVENT_BANZONE_DATA");
return () => {
- console.log("Unregistering event handlers in HomeScreen");
+ // console.log("Unregistering event handlers in HomeScreen");
eventBus.off(EVENT_GPS_DATA, queryGpsData);
- console.log("Unsubscribed EVENT_GPS_DATA");
+ // console.log("Unsubscribed EVENT_GPS_DATA");
eventBus.off(EVENT_ALARM_DATA, queryAlarmData);
- console.log("Unsubscribed EVENT_ALARM_DATA");
+ // console.log("Unsubscribed EVENT_ALARM_DATA");
eventBus.off(EVENT_ENTITY_DATA, queryEntityData);
- console.log("Unsubscribed EVENT_ENTITY_DATA");
+ // console.log("Unsubscribed EVENT_ENTITY_DATA");
eventBus.off(EVENT_TRACK_POINTS_DATA, queryTrackPointsData);
- console.log("Unsubscribed EVENT_TRACK_POINTS_DATA");
+ // console.log("Unsubscribed EVENT_TRACK_POINTS_DATA");
};
}, []);
@@ -170,14 +181,31 @@ export default function HomeScreen() {
geom_lines || ""
);
if (coordinates.length > 0) {
- setPolylineCoordinates(coordinates);
+ setPolylineCoordinates({
+ coordinates: coordinates.map((coord) => ({
+ latitude: coord[0],
+ longitude: coord[1],
+ })),
+ label: zone?.zone_name ?? "",
+ content: zone?.message ?? "",
+ });
+
}
} else if (geom_type === 1) {
// foundPolygon = true;
const coordinates = convertWKTtoLatLngString(geom_poly || "");
if (coordinates.length > 0) {
console.log("Polygon Coordinate: ", coordinates);
- setPolygonCoordinates(coordinates);
+ setPolygonCoordinates(
+ coordinates.map((polygon) => ({
+ coordinates: polygon.map((coord) => ({
+ latitude: coord[0],
+ longitude: coord[1],
+ })),
+ label: zone?.zone_name ?? "",
+ content: zone?.message ?? "",
+ }))
+ );
}
}
}
@@ -271,7 +299,9 @@ export default function HomeScreen() {
}, [alarmData?.level, scale, opacity]);
return (
-
+
({
- latitude: coord[0],
- longitude: coord[1],
- }))}
- label="Tuyến bờ"
+ coordinates={polylineCoordinates.coordinates}
+ label={polylineCoordinates.label}
+ content={polylineCoordinates.content}
strokeColor="#FF5733"
strokeWidth={4}
showDistance={false}
@@ -322,30 +351,16 @@ export default function HomeScreen() {
{polygonCoordinates.map((polygon, index) => {
// Tạo key ổn định từ tọa độ đầu tiên của polygon
const polygonKey =
- polygon.length > 0
- ? `polygon-${polygon[0][0]}-${polygon[0][1]}-${index}`
+ polygon.coordinates.length > 0
+ ? `polygon-${polygon.coordinates[0].latitude}-${polygon.coordinates[0].longitude}-${index}`
: `polygon-${index}`;
return (
- // ({
- // latitude: coords[0],
- // longitude: coords[1],
- // }))}
- // fillColor="rgba(16, 85, 201, 0.6)"
- // strokeColor="rgba(16, 85, 201, 0.8)"
- // strokeWidth={2}
- // zIndex={50}
- // />
({
- latitude: coords[0],
- longitude: coords[1],
- }))}
- label="Test khu đánh bắt"
- content="Thời gian cấm (từ tháng 1 đến tháng 12)"
+ coordinates={polygon.coordinates}
+ label={polygon.label}
+ content={polygon.content}
fillColor="rgba(16, 85, 201, 0.6)"
strokeColor="rgba(16, 85, 201, 0.8)"
strokeWidth={2}
@@ -371,7 +386,7 @@ export default function HomeScreen() {
anchor={
platform === IOS_PLATFORM
? { x: 0.5, y: 0.5 }
- : { x: 0.5, y: 0.4 }
+ : { x: 0.6, y: 0.4 }
}
>
@@ -400,11 +415,10 @@ export default function HomeScreen() {
height: 32,
transform: [
{
- rotate: `${
- typeof gpsData.h === "number" && !isNaN(gpsData.h)
+ rotate: `${typeof gpsData.h === "number" && !isNaN(gpsData.h)
? gpsData.h
: 0
- }deg`,
+ }deg`,
},
],
}}
@@ -414,16 +428,12 @@ export default function HomeScreen() {
)}
- {
- setPolygonCoordinates(undefined);
- setPolylineCoordinates(undefined);
- }}
- >
- Get GPS Data
-
-
+
+
+
+
+
+
);
}
diff --git a/app/_layout.tsx b/app/_layout.tsx
index 3ecbb90..1b519ba 100644
--- a/app/_layout.tsx
+++ b/app/_layout.tsx
@@ -9,9 +9,12 @@ import { useEffect } from "react";
import "react-native-reanimated";
import Toast from "react-native-toast-message";
+import { GluestackUIProvider } from "@/components/ui/gluestack-ui-provider/gluestack-ui-provider";
import { setRouterInstance } from "@/config/auth";
+import "@/global.css";
import { useColorScheme } from "@/hooks/use-color-scheme";
import "../global.css";
+
export default function RootLayout() {
const colorScheme = useColorScheme();
const router = useRouter();
@@ -21,34 +24,36 @@ export default function RootLayout() {
}, [router]);
return (
-
-
-
+
+
+
+
-
+
-
-
-
-
-
+
+
+
+
+
+
);
}
diff --git a/babel.config.js b/babel.config.js
index f3c649b..c854b8b 100644
--- a/babel.config.js
+++ b/babel.config.js
@@ -1,9 +1,22 @@
module.exports = function (api) {
api.cache(true);
+
return {
- presets: [
- ["babel-preset-expo", { jsxImportSource: "nativewind" }],
- "nativewind/babel",
+ presets: [['babel-preset-expo'], 'nativewind/babel'],
+
+ plugins: [
+ [
+ 'module-resolver',
+ {
+ root: ['./'],
+
+ alias: {
+ '@': './',
+ 'tailwind.config': './tailwind.config.js',
+ },
+ },
+ ],
+ 'react-native-worklets/plugin',
],
};
};
diff --git a/components/AlarmList.tsx b/components/AlarmList.tsx
new file mode 100644
index 0000000..89f1f8e
--- /dev/null
+++ b/components/AlarmList.tsx
@@ -0,0 +1,76 @@
+import dayjs from "dayjs";
+import { FlatList, Text, TouchableOpacity, View } from "react-native";
+
+type AlarmItem = {
+ name: string;
+ t: number;
+ level: number;
+ id: string;
+};
+
+type AlarmProp = {
+ alarmsData: AlarmItem[];
+ onPress?: (alarm: AlarmItem) => void;
+};
+
+const AlarmList = ({ alarmsData, onPress }: AlarmProp) => {
+ const sortedAlarmsData = [...alarmsData].sort((a, b) => b.level - a.level);
+ return (
+ (
+ onPress?.(item)}
+ className="flex flex-row gap-5 p-3 justify-start items-baseline w-full"
+ >
+
+
+
+ {item.name}
+
+
+ {formatTimestamp(item.t)}
+
+
+
+ )}
+ keyExtractor={(item) => item.id}
+ />
+ );
+};
+
+const getBackgroundColorByLevel = (level: number) => {
+ switch (level) {
+ case 1:
+ return "bg-yellow-500";
+ case 2:
+ return "bg-orange-500";
+ case 3:
+ return "bg-red-500";
+ default:
+ return "bg-gray-500";
+ }
+};
+
+const getTextColorByLevel = (level: number) => {
+ switch (level) {
+ case 1:
+ return "text-yellow-600";
+ case 2:
+ return "text-orange-600";
+ case 3:
+ return "text-red-600";
+ default:
+ return "text-gray-600";
+ }
+};
+
+const formatTimestamp = (timestamp: number) => {
+ return dayjs.unix(timestamp).format("DD/MM/YYYY HH:mm:ss");
+};
+
+export default AlarmList;
diff --git a/components/map/Description.tsx b/components/map/Description.tsx
new file mode 100644
index 0000000..d626e3f
--- /dev/null
+++ b/components/map/Description.tsx
@@ -0,0 +1,17 @@
+import { Text, View } from "react-native";
+
+interface DescriptionProps {
+ title?: string;
+ description?: string;
+}
+export const Description = ({
+ title = "",
+ description = "",
+}: DescriptionProps) => {
+ return (
+
+ {title}:
+ {description}
+
+ );
+};
diff --git a/components/map/GPSInfoPanel.tsx b/components/map/GPSInfoPanel.tsx
new file mode 100644
index 0000000..c368282
--- /dev/null
+++ b/components/map/GPSInfoPanel.tsx
@@ -0,0 +1,113 @@
+import { convertToDMS, kmhToKnot } from "@/utils/geom";
+import { MaterialIcons } from "@expo/vector-icons";
+import { useEffect, useRef, useState } from "react";
+import { Animated, TouchableOpacity, View } from "react-native";
+import { Description } from "./Description";
+
+type GPSInfoPanelProps = {
+ gpsData: Model.GPSResonse | undefined;
+};
+
+const GPSInfoPanel = ({ gpsData }: GPSInfoPanelProps) => {
+ const [isExpanded, setIsExpanded] = useState(true);
+ const [panelHeight, setPanelHeight] = useState(0);
+ const translateY = useRef(new Animated.Value(0)).current;
+ const blockBottom = useRef(new Animated.Value(0)).current;
+
+ useEffect(() => {
+ Animated.timing(translateY, {
+ toValue: isExpanded ? 0 : 200, // Dịch chuyển xuống 200px khi thu gọn
+ duration: 500,
+ useNativeDriver: true,
+ }).start();
+ }, [isExpanded]);
+
+ useEffect(() => {
+ const targetBottom = isExpanded ? panelHeight + 12 : 10;
+ Animated.timing(blockBottom, {
+ toValue: targetBottom,
+ duration: 500,
+ useNativeDriver: false,
+ }).start();
+ }, [isExpanded, panelHeight, blockBottom]);
+
+ const togglePanel = () => {
+ setIsExpanded(!isExpanded);
+ };
+
+ return (
+ <>
+ {/* Khối hình vuông */}
+
+
+ setPanelHeight(event.nativeEvent.layout.height)}
+ >
+ {/* Nút toggle ở top-right */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Nút floating để mở lại panel khi thu gọn */}
+ {!isExpanded && (
+
+
+
+ )}
+ >
+ );
+};
+
+export default GPSInfoPanel;
diff --git a/components/map/PolygonWithLabel.tsx b/components/map/PolygonWithLabel.tsx
index 314f13a..6aa7543 100644
--- a/components/map/PolygonWithLabel.tsx
+++ b/components/map/PolygonWithLabel.tsx
@@ -1,7 +1,9 @@
+import { ANDROID_PLATFORM } from "@/constants";
+import { usePlatform } from "@/hooks/use-platform";
import { getPolygonCenter } from "@/utils/polyline";
-import React from "react";
+import React, { useRef } from "react";
import { StyleSheet, Text, View } from "react-native";
-import { Marker, Polygon } from "react-native-maps";
+import { MapMarker, Marker, Polygon } from "react-native-maps";
export interface PolygonWithLabelProps {
coordinates: {
@@ -33,6 +35,8 @@ export const PolygonWithLabel: React.FC = ({
if (!coordinates || coordinates.length < 3) {
return null;
}
+ const platform = usePlatform();
+ const markerRef = useRef(null);
const centerPoint = getPolygonCenter(coordinates);
@@ -51,8 +55,7 @@ export const PolygonWithLabel: React.FC = ({
const paddingScale = Math.max(Math.pow(2, (zoomLevel - 10) * 0.2), 0.5);
const minWidthScale = Math.max(Math.pow(2, (zoomLevel - 10) * 0.25), 0.9);
- // console.log("Min Width Scale: ", minWidthScale);
-
+ markerRef.current?.showCallout();
return (
<>
= ({
/>
{label && (
= ({
coordinates,
label,
+ content,
strokeColor = "#FF5733",
strokeWidth = 4,
showDistance = false,
@@ -35,14 +39,15 @@ export const PolylineWithLabel: React.FC = ({
const middlePoint = getMiddlePointOfPolyline(coordinates);
const distance = calculateTotalDistance(coordinates);
-
+ const platform = usePlatform();
+ const markerRef = useRef(null);
let displayText = label || "";
if (showDistance) {
displayText += displayText
? ` (${distance.toFixed(2)}km)`
: `${distance.toFixed(2)}km`;
}
-
+ markerRef.current?.showCallout();
return (
<>
= ({
/>
{displayText && (
diff --git a/components/map/SosButton.tsx b/components/map/SosButton.tsx
new file mode 100644
index 0000000..1dd75ff
--- /dev/null
+++ b/components/map/SosButton.tsx
@@ -0,0 +1,385 @@
+import { showToastError } from "@/config";
+import {
+ queryDeleteSos,
+ queryGetSos,
+ querySendSosMessage,
+} from "@/controller/DeviceController";
+import { sosMessage } from "@/utils/sosUtils";
+import { MaterialIcons } from "@expo/vector-icons";
+import { useEffect, useState } from "react";
+import {
+ FlatList,
+ ScrollView,
+ StyleSheet,
+ Text,
+ TextInput,
+ TouchableOpacity,
+ View,
+} from "react-native";
+import { Button, ButtonText } from "../ui/gluestack-ui-provider/button";
+import {
+ Modal,
+ ModalBackdrop,
+ ModalBody,
+ ModalContent,
+ ModalFooter,
+ ModalHeader,
+} from "../ui/gluestack-ui-provider/modal";
+
+const SosButton = () => {
+ const [sosData, setSosData] = useState();
+ const [showConfirmSosDialog, setShowConfirmSosDialog] = useState(false);
+ const [selectedSosMessage, setSelectedSosMessage] = useState(
+ null
+ );
+ const [customMessage, setCustomMessage] = useState("");
+ const [showDropdown, setShowDropdown] = useState(false);
+ const [errors, setErrors] = useState<{ [key: string]: string }>({});
+
+ const sosOptions = [
+ ...sosMessage.map((msg) => ({ ma: msg.ma, moTa: msg.moTa })),
+ { ma: 999, moTa: "Khác" },
+ ];
+
+ const getSosData = async () => {
+ try {
+ const response = await queryGetSos();
+ setSosData(response.data);
+ } catch (error) {
+ console.error("Failed to fetch SOS data:", error);
+ }
+ };
+
+ useEffect(() => {
+ getSosData();
+ }, []);
+
+ const validateForm = () => {
+ const newErrors: { [key: string]: string } = {};
+
+ // Không cần validate sosMessage vì luôn có default value (11)
+
+ if (selectedSosMessage === 999 && customMessage.trim() === "") {
+ newErrors.customMessage = "Vui lòng nhập trạng thái";
+ }
+
+ setErrors(newErrors);
+ return Object.keys(newErrors).length === 0;
+ };
+
+ const handleConfirmSos = async () => {
+ if (validateForm()) {
+ let messageToSend = "";
+ if (selectedSosMessage === 999) {
+ messageToSend = customMessage.trim();
+ } else {
+ const selectedOption = sosOptions.find(
+ (opt) => opt.ma === selectedSosMessage
+ );
+ messageToSend = selectedOption ? selectedOption.moTa : "";
+ }
+ // Gửi dữ liệu đi
+ setShowConfirmSosDialog(false);
+ // Reset form
+ setSelectedSosMessage(null);
+ setCustomMessage("");
+ setErrors({});
+ await sendSosMessage(messageToSend);
+ }
+ };
+
+ const handleClickButton = async (isActive: boolean) => {
+ if (isActive) {
+ console.log("Active");
+ const resp = await queryDeleteSos();
+ if (resp.status === 200) {
+ await getSosData();
+ }
+ } else {
+ console.log("No Active");
+ setSelectedSosMessage(11); // Mặc định chọn lý do ma: 11
+ setShowConfirmSosDialog(true);
+ }
+ };
+
+ const sendSosMessage = async (message: string) => {
+ try {
+ const resp = await querySendSosMessage(message);
+ if (resp.status === 200) {
+ await getSosData();
+ }
+ } catch (error) {
+ console.error("Error when send sos: ", error);
+ showToastError("Không thể gửi tín hiệu SOS", "Lỗi");
+ }
+ };
+
+ return (
+ <>
+
+ {
+ setShowConfirmSosDialog(false);
+ setSelectedSosMessage(null);
+ setCustomMessage("");
+ setErrors({});
+ }}
+ >
+
+
+
+
+ Thông báo khẩn cấp
+
+
+
+
+ {/* Dropdown Nội dung SOS */}
+
+ Nội dung:
+ setShowDropdown(!showDropdown)}
+ >
+
+ {selectedSosMessage !== null
+ ? sosOptions.find((opt) => opt.ma === selectedSosMessage)
+ ?.moTa || "Chọn lý do"
+ : "Chọn lý do"}
+
+
+
+ {errors.sosMessage && (
+ {errors.sosMessage}
+ )}
+
+
+ {/* Input Custom Message nếu chọn "Khác" */}
+ {selectedSosMessage === 999 && (
+
+ Nhập trạng thái
+ {
+ setCustomMessage(text);
+ if (text.trim() !== "") {
+ setErrors((prev) => {
+ const newErrors = { ...prev };
+ delete newErrors.customMessage;
+ return newErrors;
+ });
+ }
+ }}
+ multiline
+ numberOfLines={4}
+ />
+ {errors.customMessage && (
+ {errors.customMessage}
+ )}
+
+ )}
+
+
+
+
+
+
+
+
+
+ {/* Dropdown Modal - Nổi lên */}
+ {showDropdown && showConfirmSosDialog && (
+ setShowDropdown(false)}>
+ setShowDropdown(false)}
+ >
+
+ item.ma.toString()}
+ renderItem={({ item }) => (
+ {
+ setSelectedSosMessage(item.ma);
+ setShowDropdown(false);
+
+ // Clear custom message nếu chọn khác lý do
+ if (item.ma !== 999) {
+ setCustomMessage("");
+ }
+ }}
+ >
+
+ {item.moTa}
+
+
+ )}
+ />
+
+
+
+ )}
+ >
+ );
+};
+
+const styles = StyleSheet.create({
+ formGroup: {
+ marginBottom: 16,
+ },
+ label: {
+ fontSize: 14,
+ fontWeight: "600",
+ marginBottom: 8,
+ color: "#333",
+ },
+ dropdownButton: {
+ borderWidth: 1,
+ borderColor: "#ddd",
+ borderRadius: 8,
+ paddingHorizontal: 12,
+ paddingVertical: 12,
+ flexDirection: "row",
+ justifyContent: "space-between",
+ alignItems: "center",
+ backgroundColor: "#fff",
+ },
+ errorBorder: {
+ borderColor: "#ff4444",
+ },
+ dropdownButtonText: {
+ fontSize: 14,
+ color: "#333",
+ flex: 1,
+ },
+ placeholderText: {
+ color: "#999",
+ },
+ dropdownList: {
+ borderWidth: 1,
+ borderColor: "#ddd",
+ borderRadius: 8,
+ marginTop: 4,
+ backgroundColor: "#fff",
+ overflow: "hidden",
+ },
+ dropdownItem: {
+ paddingHorizontal: 12,
+ paddingVertical: 12,
+ borderBottomWidth: 1,
+ borderBottomColor: "#eee",
+ },
+ dropdownItemText: {
+ fontSize: 14,
+ color: "#333",
+ },
+ dropdownOverlay: {
+ flex: 1,
+ justifyContent: "center",
+ alignItems: "center",
+ },
+ dropdownModalContainer: {
+ backgroundColor: "#fff",
+ borderRadius: 12,
+ maxHeight: 400,
+ minWidth: 280,
+ shadowColor: "#000",
+ shadowOffset: { width: 0, height: 4 },
+ shadowOpacity: 0.3,
+ shadowRadius: 8,
+ elevation: 10,
+ },
+ dropdownModalItem: {
+ paddingHorizontal: 16,
+ paddingVertical: 14,
+ borderBottomWidth: 1,
+ borderBottomColor: "#f0f0f0",
+ },
+ dropdownModalItemText: {
+ fontSize: 14,
+ color: "#333",
+ },
+ selectedItemText: {
+ fontWeight: "600",
+ color: "#1054C9",
+ },
+ input: {
+ borderWidth: 1,
+ borderColor: "#ddd",
+ borderRadius: 8,
+ paddingHorizontal: 12,
+ paddingVertical: 12,
+ fontSize: 14,
+ color: "#333",
+ textAlignVertical: "top",
+ },
+ errorInput: {
+ borderColor: "#ff4444",
+ },
+ errorText: {
+ color: "#ff4444",
+ fontSize: 12,
+ marginTop: 4,
+ },
+});
+
+export default SosButton;
diff --git a/components/ui/gluestack-ui-provider/alert-dialog/index.tsx b/components/ui/gluestack-ui-provider/alert-dialog/index.tsx
new file mode 100644
index 0000000..f605e51
--- /dev/null
+++ b/components/ui/gluestack-ui-provider/alert-dialog/index.tsx
@@ -0,0 +1,296 @@
+'use client';
+import React from 'react';
+import { createAlertDialog } from '@gluestack-ui/core/alert-dialog/creator';
+import { tva } from '@gluestack-ui/utils/nativewind-utils';
+import {
+ withStyleContext,
+ useStyleContext,
+} from '@gluestack-ui/utils/nativewind-utils';
+
+import { cssInterop } from 'nativewind';
+import type { VariantProps } from '@gluestack-ui/utils/nativewind-utils';
+import {
+ Motion,
+ AnimatePresence,
+ createMotionAnimatedComponent,
+ MotionComponentProps,
+} from '@legendapp/motion';
+import { View, Pressable, ScrollView, ViewStyle } from 'react-native';
+
+const SCOPE = 'ALERT_DIALOG';
+
+const RootComponent = withStyleContext(View, SCOPE);
+
+type IMotionViewProps = React.ComponentProps &
+ MotionComponentProps;
+
+const MotionView = Motion.View as React.ComponentType;
+
+type IAnimatedPressableProps = React.ComponentProps &
+ MotionComponentProps;
+
+const AnimatedPressable = createMotionAnimatedComponent(
+ Pressable
+) as React.ComponentType;
+
+const UIAccessibleAlertDialog = createAlertDialog({
+ Root: RootComponent,
+ Body: ScrollView,
+ Content: MotionView,
+ CloseButton: Pressable,
+ Header: View,
+ Footer: View,
+ Backdrop: AnimatedPressable,
+ AnimatePresence: AnimatePresence,
+});
+
+cssInterop(MotionView, { className: 'style' });
+cssInterop(AnimatedPressable, { className: 'style' });
+
+const alertDialogStyle = tva({
+ base: 'group/modal w-full h-full justify-center items-center web:pointer-events-none',
+ parentVariants: {
+ size: {
+ xs: '',
+ sm: '',
+ md: '',
+ lg: '',
+ full: '',
+ },
+ },
+});
+
+const alertDialogContentStyle = tva({
+ base: 'bg-background-0 rounded-lg overflow-hidden border border-outline-100 p-6',
+ parentVariants: {
+ size: {
+ xs: 'w-[60%] max-w-[360px]',
+ sm: 'w-[70%] max-w-[420px]',
+ md: 'w-[80%] max-w-[510px]',
+ lg: 'w-[90%] max-w-[640px]',
+ full: 'w-full',
+ },
+ },
+});
+
+const alertDialogCloseButtonStyle = tva({
+ base: 'group/alert-dialog-close-button z-10 rounded-sm p-2 data-[focus-visible=true]:bg-background-100 web:cursor-pointer outline-0',
+});
+
+const alertDialogHeaderStyle = tva({
+ base: 'justify-between items-center flex-row',
+});
+
+const alertDialogFooterStyle = tva({
+ base: 'flex-row justify-end items-center gap-3',
+});
+
+const alertDialogBodyStyle = tva({ base: '' });
+
+const alertDialogBackdropStyle = tva({
+ base: 'absolute left-0 top-0 right-0 bottom-0 bg-background-dark web:cursor-default',
+});
+
+type IAlertDialogProps = React.ComponentPropsWithoutRef<
+ typeof UIAccessibleAlertDialog
+> &
+ VariantProps;
+
+type IAlertDialogContentProps = React.ComponentPropsWithoutRef<
+ typeof UIAccessibleAlertDialog.Content
+> &
+ VariantProps & { className?: string };
+
+type IAlertDialogCloseButtonProps = React.ComponentPropsWithoutRef<
+ typeof UIAccessibleAlertDialog.CloseButton
+> &
+ VariantProps;
+
+type IAlertDialogHeaderProps = React.ComponentPropsWithoutRef<
+ typeof UIAccessibleAlertDialog.Header
+> &
+ VariantProps;
+
+type IAlertDialogFooterProps = React.ComponentPropsWithoutRef<
+ typeof UIAccessibleAlertDialog.Footer
+> &
+ VariantProps;
+
+type IAlertDialogBodyProps = React.ComponentPropsWithoutRef<
+ typeof UIAccessibleAlertDialog.Body
+> &
+ VariantProps;
+
+type IAlertDialogBackdropProps = React.ComponentPropsWithoutRef<
+ typeof UIAccessibleAlertDialog.Backdrop
+> &
+ VariantProps & { className?: string };
+
+const AlertDialog = React.forwardRef<
+ React.ComponentRef,
+ IAlertDialogProps
+>(function AlertDialog({ className, size = 'md', ...props }, ref) {
+ return (
+
+ );
+});
+
+const AlertDialogContent = React.forwardRef<
+ React.ComponentRef,
+ IAlertDialogContentProps
+>(function AlertDialogContent({ className, size, ...props }, ref) {
+ const { size: parentSize } = useStyleContext(SCOPE);
+
+ return (
+
+ );
+});
+
+const AlertDialogCloseButton = React.forwardRef<
+ React.ComponentRef,
+ IAlertDialogCloseButtonProps
+>(function AlertDialogCloseButton({ className, ...props }, ref) {
+ return (
+
+ );
+});
+
+const AlertDialogHeader = React.forwardRef<
+ React.ComponentRef,
+ IAlertDialogHeaderProps
+>(function AlertDialogHeader({ className, ...props }, ref) {
+ return (
+
+ );
+});
+
+const AlertDialogFooter = React.forwardRef<
+ React.ComponentRef,
+ IAlertDialogFooterProps
+>(function AlertDialogFooter({ className, ...props }, ref) {
+ return (
+
+ );
+});
+
+const AlertDialogBody = React.forwardRef<
+ React.ComponentRef,
+ IAlertDialogBodyProps
+>(function AlertDialogBody({ className, ...props }, ref) {
+ return (
+
+ );
+});
+
+const AlertDialogBackdrop = React.forwardRef<
+ React.ComponentRef,
+ IAlertDialogBackdropProps
+>(function AlertDialogBackdrop({ className, ...props }, ref) {
+ return (
+
+ );
+});
+
+AlertDialog.displayName = 'AlertDialog';
+AlertDialogContent.displayName = 'AlertDialogContent';
+AlertDialogCloseButton.displayName = 'AlertDialogCloseButton';
+AlertDialogHeader.displayName = 'AlertDialogHeader';
+AlertDialogFooter.displayName = 'AlertDialogFooter';
+AlertDialogBody.displayName = 'AlertDialogBody';
+AlertDialogBackdrop.displayName = 'AlertDialogBackdrop';
+
+export {
+ AlertDialog,
+ AlertDialogContent,
+ AlertDialogCloseButton,
+ AlertDialogHeader,
+ AlertDialogFooter,
+ AlertDialogBody,
+ AlertDialogBackdrop,
+};
diff --git a/components/ui/gluestack-ui-provider/button/index.tsx b/components/ui/gluestack-ui-provider/button/index.tsx
new file mode 100644
index 0000000..fd4b639
--- /dev/null
+++ b/components/ui/gluestack-ui-provider/button/index.tsx
@@ -0,0 +1,434 @@
+'use client';
+import React from 'react';
+import { createButton } from '@gluestack-ui/core/button/creator';
+import {
+ tva,
+ withStyleContext,
+ useStyleContext,
+ type VariantProps,
+} from '@gluestack-ui/utils/nativewind-utils';
+import { cssInterop } from 'nativewind';
+import { ActivityIndicator, Pressable, Text, View } from 'react-native';
+import { PrimitiveIcon, UIIcon } from '@gluestack-ui/core/icon/creator';
+
+const SCOPE = 'BUTTON';
+
+const Root = withStyleContext(Pressable, SCOPE);
+
+const UIButton = createButton({
+ Root: Root,
+ Text,
+ Group: View,
+ Spinner: ActivityIndicator,
+ Icon: UIIcon,
+});
+
+cssInterop(PrimitiveIcon, {
+ className: {
+ target: 'style',
+ nativeStyleToProp: {
+ height: true,
+ width: true,
+ fill: true,
+ color: 'classNameColor',
+ stroke: true,
+ },
+ },
+});
+
+const buttonStyle = tva({
+ base: 'group/button rounded bg-primary-500 flex-row items-center justify-center data-[focus-visible=true]:web:outline-none data-[focus-visible=true]:web:ring-2 data-[disabled=true]:opacity-40 gap-2',
+ variants: {
+ action: {
+ primary:
+ 'bg-primary-500 data-[hover=true]:bg-primary-600 data-[active=true]:bg-primary-700 border-primary-300 data-[hover=true]:border-primary-400 data-[active=true]:border-primary-500 data-[focus-visible=true]:web:ring-indicator-info',
+ secondary:
+ 'bg-secondary-500 border-secondary-300 data-[hover=true]:bg-secondary-600 data-[hover=true]:border-secondary-400 data-[active=true]:bg-secondary-700 data-[active=true]:border-secondary-700 data-[focus-visible=true]:web:ring-indicator-info',
+ positive:
+ 'bg-success-500 border-success-300 data-[hover=true]:bg-success-600 data-[hover=true]:border-success-400 data-[active=true]:bg-success-700 data-[active=true]:border-success-500 data-[focus-visible=true]:web:ring-indicator-info',
+ negative:
+ 'bg-error-500 border-error-300 data-[hover=true]:bg-error-600 data-[hover=true]:border-error-400 data-[active=true]:bg-error-700 data-[active=true]:border-error-500 data-[focus-visible=true]:web:ring-indicator-info',
+ default:
+ 'bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent',
+ },
+ variant: {
+ link: 'px-0',
+ outline:
+ 'bg-transparent border data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent',
+ solid: '',
+ },
+
+ size: {
+ xs: 'px-3.5 h-8',
+ sm: 'px-4 h-9',
+ md: 'px-5 h-10',
+ lg: 'px-6 h-11',
+ xl: 'px-7 h-12',
+ },
+ },
+ compoundVariants: [
+ {
+ action: 'primary',
+ variant: 'link',
+ class:
+ 'px-0 bg-transparent data-[hover=true]:bg-transparent data-[active=true]:bg-transparent',
+ },
+ {
+ action: 'secondary',
+ variant: 'link',
+ class:
+ 'px-0 bg-transparent data-[hover=true]:bg-transparent data-[active=true]:bg-transparent',
+ },
+ {
+ action: 'positive',
+ variant: 'link',
+ class:
+ 'px-0 bg-transparent data-[hover=true]:bg-transparent data-[active=true]:bg-transparent',
+ },
+ {
+ action: 'negative',
+ variant: 'link',
+ class:
+ 'px-0 bg-transparent data-[hover=true]:bg-transparent data-[active=true]:bg-transparent',
+ },
+ {
+ action: 'primary',
+ variant: 'outline',
+ class:
+ 'bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent',
+ },
+ {
+ action: 'secondary',
+ variant: 'outline',
+ class:
+ 'bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent',
+ },
+ {
+ action: 'positive',
+ variant: 'outline',
+ class:
+ 'bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent',
+ },
+ {
+ action: 'negative',
+ variant: 'outline',
+ class:
+ 'bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent',
+ },
+ ],
+});
+
+const buttonTextStyle = tva({
+ base: 'text-typography-0 font-semibold web:select-none',
+ parentVariants: {
+ action: {
+ primary:
+ 'text-primary-600 data-[hover=true]:text-primary-600 data-[active=true]:text-primary-700',
+ secondary:
+ 'text-typography-500 data-[hover=true]:text-typography-600 data-[active=true]:text-typography-700',
+ positive:
+ 'text-success-600 data-[hover=true]:text-success-600 data-[active=true]:text-success-700',
+ negative:
+ 'text-error-600 data-[hover=true]:text-error-600 data-[active=true]:text-error-700',
+ },
+ variant: {
+ link: 'data-[hover=true]:underline data-[active=true]:underline',
+ outline: '',
+ solid:
+ 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0',
+ },
+ size: {
+ xs: 'text-xs',
+ sm: 'text-sm',
+ md: 'text-base',
+ lg: 'text-lg',
+ xl: 'text-xl',
+ },
+ },
+ parentCompoundVariants: [
+ {
+ variant: 'solid',
+ action: 'primary',
+ class:
+ 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0',
+ },
+ {
+ variant: 'solid',
+ action: 'secondary',
+ class:
+ 'text-typography-800 data-[hover=true]:text-typography-800 data-[active=true]:text-typography-800',
+ },
+ {
+ variant: 'solid',
+ action: 'positive',
+ class:
+ 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0',
+ },
+ {
+ variant: 'solid',
+ action: 'negative',
+ class:
+ 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0',
+ },
+ {
+ variant: 'outline',
+ action: 'primary',
+ class:
+ 'text-primary-500 data-[hover=true]:text-primary-500 data-[active=true]:text-primary-500',
+ },
+ {
+ variant: 'outline',
+ action: 'secondary',
+ class:
+ 'text-typography-500 data-[hover=true]:text-primary-600 data-[active=true]:text-typography-700',
+ },
+ {
+ variant: 'outline',
+ action: 'positive',
+ class:
+ 'text-primary-500 data-[hover=true]:text-primary-500 data-[active=true]:text-primary-500',
+ },
+ {
+ variant: 'outline',
+ action: 'negative',
+ class:
+ 'text-primary-500 data-[hover=true]:text-primary-500 data-[active=true]:text-primary-500',
+ },
+ ],
+});
+
+const buttonIconStyle = tva({
+ base: 'fill-none',
+ parentVariants: {
+ variant: {
+ link: 'data-[hover=true]:underline data-[active=true]:underline',
+ outline: '',
+ solid:
+ 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0',
+ },
+ size: {
+ xs: 'h-3.5 w-3.5',
+ sm: 'h-4 w-4',
+ md: 'h-[18px] w-[18px]',
+ lg: 'h-[18px] w-[18px]',
+ xl: 'h-5 w-5',
+ },
+ action: {
+ primary:
+ 'text-primary-600 data-[hover=true]:text-primary-600 data-[active=true]:text-primary-700',
+ secondary:
+ 'text-typography-500 data-[hover=true]:text-typography-600 data-[active=true]:text-typography-700',
+ positive:
+ 'text-success-600 data-[hover=true]:text-success-600 data-[active=true]:text-success-700',
+
+ negative:
+ 'text-error-600 data-[hover=true]:text-error-600 data-[active=true]:text-error-700',
+ },
+ },
+ parentCompoundVariants: [
+ {
+ variant: 'solid',
+ action: 'primary',
+ class:
+ 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0',
+ },
+ {
+ variant: 'solid',
+ action: 'secondary',
+ class:
+ 'text-typography-800 data-[hover=true]:text-typography-800 data-[active=true]:text-typography-800',
+ },
+ {
+ variant: 'solid',
+ action: 'positive',
+ class:
+ 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0',
+ },
+ {
+ variant: 'solid',
+ action: 'negative',
+ class:
+ 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0',
+ },
+ ],
+});
+
+const buttonGroupStyle = tva({
+ base: '',
+ variants: {
+ space: {
+ 'xs': 'gap-1',
+ 'sm': 'gap-2',
+ 'md': 'gap-3',
+ 'lg': 'gap-4',
+ 'xl': 'gap-5',
+ '2xl': 'gap-6',
+ '3xl': 'gap-7',
+ '4xl': 'gap-8',
+ },
+ isAttached: {
+ true: 'gap-0',
+ },
+ flexDirection: {
+ 'row': 'flex-row',
+ 'column': 'flex-col',
+ 'row-reverse': 'flex-row-reverse',
+ 'column-reverse': 'flex-col-reverse',
+ },
+ },
+});
+
+type IButtonProps = Omit<
+ React.ComponentPropsWithoutRef,
+ 'context'
+> &
+ VariantProps & { className?: string };
+
+const Button = React.forwardRef<
+ React.ElementRef,
+ IButtonProps
+>(
+ (
+ { className, variant = 'solid', size = 'md', action = 'primary', ...props },
+ ref
+ ) => {
+ return (
+
+ );
+ }
+);
+
+type IButtonTextProps = React.ComponentPropsWithoutRef &
+ VariantProps & { className?: string };
+
+const ButtonText = React.forwardRef<
+ React.ElementRef,
+ IButtonTextProps
+>(({ className, variant, size, action, ...props }, ref) => {
+ const {
+ variant: parentVariant,
+ size: parentSize,
+ action: parentAction,
+ } = useStyleContext(SCOPE);
+
+ return (
+
+ );
+});
+
+const ButtonSpinner = UIButton.Spinner;
+
+type IButtonIcon = React.ComponentPropsWithoutRef &
+ VariantProps & {
+ className?: string | undefined;
+ as?: React.ElementType;
+ height?: number;
+ width?: number;
+ };
+
+const ButtonIcon = React.forwardRef<
+ React.ElementRef,
+ IButtonIcon
+>(({ className, size, ...props }, ref) => {
+ const {
+ variant: parentVariant,
+ size: parentSize,
+ action: parentAction,
+ } = useStyleContext(SCOPE);
+
+ if (typeof size === 'number') {
+ return (
+
+ );
+ } else if (
+ (props.height !== undefined || props.width !== undefined) &&
+ size === undefined
+ ) {
+ return (
+
+ );
+ }
+ return (
+
+ );
+});
+
+type IButtonGroupProps = React.ComponentPropsWithoutRef &
+ VariantProps;
+
+const ButtonGroup = React.forwardRef<
+ React.ElementRef,
+ IButtonGroupProps
+>(
+ (
+ {
+ className,
+ space = 'md',
+ isAttached = false,
+ flexDirection = 'column',
+ ...props
+ },
+ ref
+ ) => {
+ return (
+
+ );
+ }
+);
+
+Button.displayName = 'Button';
+ButtonText.displayName = 'ButtonText';
+ButtonSpinner.displayName = 'ButtonSpinner';
+ButtonIcon.displayName = 'ButtonIcon';
+ButtonGroup.displayName = 'ButtonGroup';
+
+export { Button, ButtonText, ButtonSpinner, ButtonIcon, ButtonGroup };
diff --git a/components/ui/gluestack-ui-provider/gluestack-ui-provider/config.ts b/components/ui/gluestack-ui-provider/gluestack-ui-provider/config.ts
new file mode 100644
index 0000000..f388cc6
--- /dev/null
+++ b/components/ui/gluestack-ui-provider/gluestack-ui-provider/config.ts
@@ -0,0 +1,309 @@
+'use client';
+import { vars } from 'nativewind';
+
+export const config = {
+ light: vars({
+ '--color-primary-0': '179 179 179',
+ '--color-primary-50': '153 153 153',
+ '--color-primary-100': '128 128 128',
+ '--color-primary-200': '115 115 115',
+ '--color-primary-300': '102 102 102',
+ '--color-primary-400': '82 82 82',
+ '--color-primary-500': '51 51 51',
+ '--color-primary-600': '41 41 41',
+ '--color-primary-700': '31 31 31',
+ '--color-primary-800': '13 13 13',
+ '--color-primary-900': '10 10 10',
+ '--color-primary-950': '8 8 8',
+
+ /* Secondary */
+ '--color-secondary-0': '253 253 253',
+ '--color-secondary-50': '251 251 251',
+ '--color-secondary-100': '246 246 246',
+ '--color-secondary-200': '242 242 242',
+ '--color-secondary-300': '237 237 237',
+ '--color-secondary-400': '230 230 231',
+ '--color-secondary-500': '217 217 219',
+ '--color-secondary-600': '198 199 199',
+ '--color-secondary-700': '189 189 189',
+ '--color-secondary-800': '177 177 177',
+ '--color-secondary-900': '165 164 164',
+ '--color-secondary-950': '157 157 157',
+
+ /* Tertiary */
+ '--color-tertiary-0': '255 250 245',
+ '--color-tertiary-50': '255 242 229',
+ '--color-tertiary-100': '255 233 213',
+ '--color-tertiary-200': '254 209 170',
+ '--color-tertiary-300': '253 180 116',
+ '--color-tertiary-400': '251 157 75',
+ '--color-tertiary-500': '231 129 40',
+ '--color-tertiary-600': '215 117 31',
+ '--color-tertiary-700': '180 98 26',
+ '--color-tertiary-800': '130 73 23',
+ '--color-tertiary-900': '108 61 19',
+ '--color-tertiary-950': '84 49 18',
+
+ /* Error */
+ '--color-error-0': '254 233 233',
+ '--color-error-50': '254 226 226',
+ '--color-error-100': '254 202 202',
+ '--color-error-200': '252 165 165',
+ '--color-error-300': '248 113 113',
+ '--color-error-400': '239 68 68',
+ '--color-error-500': '230 53 53',
+ '--color-error-600': '220 38 38',
+ '--color-error-700': '185 28 28',
+ '--color-error-800': '153 27 27',
+ '--color-error-900': '127 29 29',
+ '--color-error-950': '83 19 19',
+
+ /* Success */
+ '--color-success-0': '228 255 244',
+ '--color-success-50': '202 255 232',
+ '--color-success-100': '162 241 192',
+ '--color-success-200': '132 211 162',
+ '--color-success-300': '102 181 132',
+ '--color-success-400': '72 151 102',
+ '--color-success-500': '52 131 82',
+ '--color-success-600': '42 121 72',
+ '--color-success-700': '32 111 62',
+ '--color-success-800': '22 101 52',
+ '--color-success-900': '20 83 45',
+ '--color-success-950': '27 50 36',
+
+ /* Warning */
+ '--color-warning-0': '255 249 245',
+ '--color-warning-50': '255 244 236',
+ '--color-warning-100': '255 231 213',
+ '--color-warning-200': '254 205 170',
+ '--color-warning-300': '253 173 116',
+ '--color-warning-400': '251 149 75',
+ '--color-warning-500': '231 120 40',
+ '--color-warning-600': '215 108 31',
+ '--color-warning-700': '180 90 26',
+ '--color-warning-800': '130 68 23',
+ '--color-warning-900': '108 56 19',
+ '--color-warning-950': '84 45 18',
+
+ /* Info */
+ '--color-info-0': '236 248 254',
+ '--color-info-50': '199 235 252',
+ '--color-info-100': '162 221 250',
+ '--color-info-200': '124 207 248',
+ '--color-info-300': '87 194 246',
+ '--color-info-400': '50 180 244',
+ '--color-info-500': '13 166 242',
+ '--color-info-600': '11 141 205',
+ '--color-info-700': '9 115 168',
+ '--color-info-800': '7 90 131',
+ '--color-info-900': '5 64 93',
+ '--color-info-950': '3 38 56',
+
+ /* Typography */
+ '--color-typography-0': '254 254 255',
+ '--color-typography-50': '245 245 245',
+ '--color-typography-100': '229 229 229',
+ '--color-typography-200': '219 219 220',
+ '--color-typography-300': '212 212 212',
+ '--color-typography-400': '163 163 163',
+ '--color-typography-500': '140 140 140',
+ '--color-typography-600': '115 115 115',
+ '--color-typography-700': '82 82 82',
+ '--color-typography-800': '64 64 64',
+ '--color-typography-900': '38 38 39',
+ '--color-typography-950': '23 23 23',
+
+ /* Outline */
+ '--color-outline-0': '253 254 254',
+ '--color-outline-50': '243 243 243',
+ '--color-outline-100': '230 230 230',
+ '--color-outline-200': '221 220 219',
+ '--color-outline-300': '211 211 211',
+ '--color-outline-400': '165 163 163',
+ '--color-outline-500': '140 141 141',
+ '--color-outline-600': '115 116 116',
+ '--color-outline-700': '83 82 82',
+ '--color-outline-800': '65 65 65',
+ '--color-outline-900': '39 38 36',
+ '--color-outline-950': '26 23 23',
+
+ /* Background */
+ '--color-background-0': '255 255 255',
+ '--color-background-50': '246 246 246',
+ '--color-background-100': '242 241 241',
+ '--color-background-200': '220 219 219',
+ '--color-background-300': '213 212 212',
+ '--color-background-400': '162 163 163',
+ '--color-background-500': '142 142 142',
+ '--color-background-600': '116 116 116',
+ '--color-background-700': '83 82 82',
+ '--color-background-800': '65 64 64',
+ '--color-background-900': '39 38 37',
+ '--color-background-950': '18 18 18',
+
+ /* Background Special */
+ '--color-background-error': '254 241 241',
+ '--color-background-warning': '255 243 234',
+ '--color-background-success': '237 252 242',
+ '--color-background-muted': '247 248 247',
+ '--color-background-info': '235 248 254',
+
+ /* Focus Ring Indicator */
+ '--color-indicator-primary': '55 55 55',
+ '--color-indicator-info': '83 153 236',
+ '--color-indicator-error': '185 28 28',
+ }),
+ dark: vars({
+ '--color-primary-0': '166 166 166',
+ '--color-primary-50': '175 175 175',
+ '--color-primary-100': '186 186 186',
+ '--color-primary-200': '197 197 197',
+ '--color-primary-300': '212 212 212',
+ '--color-primary-400': '221 221 221',
+ '--color-primary-500': '230 230 230',
+ '--color-primary-600': '240 240 240',
+ '--color-primary-700': '250 250 250',
+ '--color-primary-800': '253 253 253',
+ '--color-primary-900': '254 249 249',
+ '--color-primary-950': '253 252 252',
+
+ /* Secondary */
+ '--color-secondary-0': '20 20 20',
+ '--color-secondary-50': '23 23 23',
+ '--color-secondary-100': '31 31 31',
+ '--color-secondary-200': '39 39 39',
+ '--color-secondary-300': '44 44 44',
+ '--color-secondary-400': '56 57 57',
+ '--color-secondary-500': '63 64 64',
+ '--color-secondary-600': '86 86 86',
+ '--color-secondary-700': '110 110 110',
+ '--color-secondary-800': '135 135 135',
+ '--color-secondary-900': '150 150 150',
+ '--color-secondary-950': '164 164 164',
+
+ /* Tertiary */
+ '--color-tertiary-0': '84 49 18',
+ '--color-tertiary-50': '108 61 19',
+ '--color-tertiary-100': '130 73 23',
+ '--color-tertiary-200': '180 98 26',
+ '--color-tertiary-300': '215 117 31',
+ '--color-tertiary-400': '231 129 40',
+ '--color-tertiary-500': '251 157 75',
+ '--color-tertiary-600': '253 180 116',
+ '--color-tertiary-700': '254 209 170',
+ '--color-tertiary-800': '255 233 213',
+ '--color-tertiary-900': '255 242 229',
+ '--color-tertiary-950': '255 250 245',
+
+ /* Error */
+ '--color-error-0': '83 19 19',
+ '--color-error-50': '127 29 29',
+ '--color-error-100': '153 27 27',
+ '--color-error-200': '185 28 28',
+ '--color-error-300': '220 38 38',
+ '--color-error-400': '230 53 53',
+ '--color-error-500': '239 68 68',
+ '--color-error-600': '249 97 96',
+ '--color-error-700': '229 91 90',
+ '--color-error-800': '254 202 202',
+ '--color-error-900': '254 226 226',
+ '--color-error-950': '254 233 233',
+
+ /* Success */
+ '--color-success-0': '27 50 36',
+ '--color-success-50': '20 83 45',
+ '--color-success-100': '22 101 52',
+ '--color-success-200': '32 111 62',
+ '--color-success-300': '42 121 72',
+ '--color-success-400': '52 131 82',
+ '--color-success-500': '72 151 102',
+ '--color-success-600': '102 181 132',
+ '--color-success-700': '132 211 162',
+ '--color-success-800': '162 241 192',
+ '--color-success-900': '202 255 232',
+ '--color-success-950': '228 255 244',
+
+ /* Warning */
+ '--color-warning-0': '84 45 18',
+ '--color-warning-50': '108 56 19',
+ '--color-warning-100': '130 68 23',
+ '--color-warning-200': '180 90 26',
+ '--color-warning-300': '215 108 31',
+ '--color-warning-400': '231 120 40',
+ '--color-warning-500': '251 149 75',
+ '--color-warning-600': '253 173 116',
+ '--color-warning-700': '254 205 170',
+ '--color-warning-800': '255 231 213',
+ '--color-warning-900': '255 244 237',
+ '--color-warning-950': '255 249 245',
+
+ /* Info */
+ '--color-info-0': '3 38 56',
+ '--color-info-50': '5 64 93',
+ '--color-info-100': '7 90 131',
+ '--color-info-200': '9 115 168',
+ '--color-info-300': '11 141 205',
+ '--color-info-400': '13 166 242',
+ '--color-info-500': '50 180 244',
+ '--color-info-600': '87 194 246',
+ '--color-info-700': '124 207 248',
+ '--color-info-800': '162 221 250',
+ '--color-info-900': '199 235 252',
+ '--color-info-950': '236 248 254',
+
+ /* Typography */
+ '--color-typography-0': '23 23 23',
+ '--color-typography-50': '38 38 39',
+ '--color-typography-100': '64 64 64',
+ '--color-typography-200': '82 82 82',
+ '--color-typography-300': '115 115 115',
+ '--color-typography-400': '140 140 140',
+ '--color-typography-500': '163 163 163',
+ '--color-typography-600': '212 212 212',
+ '--color-typography-700': '219 219 220',
+ '--color-typography-800': '229 229 229',
+ '--color-typography-900': '245 245 245',
+ '--color-typography-950': '254 254 255',
+
+ /* Outline */
+ '--color-outline-0': '26 23 23',
+ '--color-outline-50': '39 38 36',
+ '--color-outline-100': '65 65 65',
+ '--color-outline-200': '83 82 82',
+ '--color-outline-300': '115 116 116',
+ '--color-outline-400': '140 141 141',
+ '--color-outline-500': '165 163 163',
+ '--color-outline-600': '211 211 211',
+ '--color-outline-700': '221 220 219',
+ '--color-outline-800': '230 230 230',
+ '--color-outline-900': '243 243 243',
+ '--color-outline-950': '253 254 254',
+
+ /* Background */
+ '--color-background-0': '18 18 18',
+ '--color-background-50': '39 38 37',
+ '--color-background-100': '65 64 64',
+ '--color-background-200': '83 82 82',
+ '--color-background-300': '116 116 116',
+ '--color-background-400': '142 142 142',
+ '--color-background-500': '162 163 163',
+ '--color-background-600': '213 212 212',
+ '--color-background-700': '229 228 228',
+ '--color-background-800': '242 241 241',
+ '--color-background-900': '246 246 246',
+ '--color-background-950': '255 255 255',
+
+ /* Background Special */
+ '--color-background-error': '66 43 43',
+ '--color-background-warning': '65 47 35',
+ '--color-background-success': '28 43 33',
+ '--color-background-muted': '51 51 51',
+ '--color-background-info': '26 40 46',
+
+ /* Focus Ring Indicator */
+ '--color-indicator-primary': '247 247 247',
+ '--color-indicator-info': '161 199 245',
+ '--color-indicator-error': '232 70 69',
+ }),
+};
diff --git a/components/ui/gluestack-ui-provider/gluestack-ui-provider/index.next15.tsx b/components/ui/gluestack-ui-provider/gluestack-ui-provider/index.next15.tsx
new file mode 100644
index 0000000..4fafc40
--- /dev/null
+++ b/components/ui/gluestack-ui-provider/gluestack-ui-provider/index.next15.tsx
@@ -0,0 +1,87 @@
+// This is a Next.js 15 compatible version of the GluestackUIProvider
+'use client';
+import React, { useEffect, useLayoutEffect } from 'react';
+import { config } from './config';
+import { OverlayProvider } from '@gluestack-ui/core/overlay/creator';
+import { ToastProvider } from '@gluestack-ui/core/toast/creator';
+import { setFlushStyles } from '@gluestack-ui/utils/nativewind-utils';
+import { script } from './script';
+
+const variableStyleTagId = 'nativewind-style';
+const createStyle = (styleTagId: string) => {
+ const style = document.createElement('style');
+ style.id = styleTagId;
+ style.appendChild(document.createTextNode(''));
+ return style;
+};
+
+export const useSafeLayoutEffect =
+ typeof window !== 'undefined' ? useLayoutEffect : useEffect;
+
+export function GluestackUIProvider({
+ mode = 'light',
+ ...props
+}: {
+ mode?: 'light' | 'dark' | 'system';
+ children?: React.ReactNode;
+}) {
+ let cssVariablesWithMode = ``;
+ Object.keys(config).forEach((configKey) => {
+ cssVariablesWithMode +=
+ configKey === 'dark' ? `\n .dark {\n ` : `\n:root {\n`;
+ const cssVariables = Object.keys(
+ config[configKey as keyof typeof config]
+ ).reduce((acc: string, curr: string) => {
+ acc += `${curr}:${config[configKey as keyof typeof config][curr]}; `;
+ return acc;
+ }, '');
+ cssVariablesWithMode += `${cssVariables} \n}`;
+ });
+
+ setFlushStyles(cssVariablesWithMode);
+
+ const handleMediaQuery = React.useCallback((e: MediaQueryListEvent) => {
+ script(e.matches ? 'dark' : 'light');
+ }, []);
+
+ useSafeLayoutEffect(() => {
+ if (mode !== 'system') {
+ const documentElement = document.documentElement;
+ if (documentElement) {
+ documentElement.classList.add(mode);
+ documentElement.classList.remove(mode === 'light' ? 'dark' : 'light');
+ documentElement.style.colorScheme = mode;
+ }
+ }
+ }, [mode]);
+
+ useSafeLayoutEffect(() => {
+ if (mode !== 'system') return;
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
+
+ media.addListener(handleMediaQuery);
+
+ return () => media.removeListener(handleMediaQuery);
+ }, [handleMediaQuery]);
+
+ useSafeLayoutEffect(() => {
+ if (typeof window !== 'undefined') {
+ const documentElement = document.documentElement;
+ if (documentElement) {
+ const head = documentElement.querySelector('head');
+ let style = head?.querySelector(`[id='${variableStyleTagId}']`);
+ if (!style) {
+ style = createStyle(variableStyleTagId);
+ style.innerHTML = cssVariablesWithMode;
+ if (head) head.appendChild(style);
+ }
+ }
+ }
+ }, []);
+
+ return (
+
+ {props.children}
+
+ );
+}
diff --git a/components/ui/gluestack-ui-provider/gluestack-ui-provider/index.tsx b/components/ui/gluestack-ui-provider/gluestack-ui-provider/index.tsx
new file mode 100644
index 0000000..3453713
--- /dev/null
+++ b/components/ui/gluestack-ui-provider/gluestack-ui-provider/index.tsx
@@ -0,0 +1,38 @@
+import React, { useEffect } from 'react';
+import { config } from './config';
+import { View, ViewProps } from 'react-native';
+import { OverlayProvider } from '@gluestack-ui/core/overlay/creator';
+import { ToastProvider } from '@gluestack-ui/core/toast/creator';
+import { useColorScheme } from 'nativewind';
+
+export type ModeType = 'light' | 'dark' | 'system';
+
+export function GluestackUIProvider({
+ mode = 'light',
+ ...props
+}: {
+ mode?: ModeType;
+ children?: React.ReactNode;
+ style?: ViewProps['style'];
+}) {
+ const { colorScheme, setColorScheme } = useColorScheme();
+
+ useEffect(() => {
+ setColorScheme(mode);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [mode]);
+
+ return (
+
+
+ {props.children}
+
+
+ );
+}
diff --git a/components/ui/gluestack-ui-provider/gluestack-ui-provider/index.web.tsx b/components/ui/gluestack-ui-provider/gluestack-ui-provider/index.web.tsx
new file mode 100644
index 0000000..610b6ad
--- /dev/null
+++ b/components/ui/gluestack-ui-provider/gluestack-ui-provider/index.web.tsx
@@ -0,0 +1,96 @@
+'use client';
+import React, { useEffect, useLayoutEffect } from 'react';
+import { config } from './config';
+import { OverlayProvider } from '@gluestack-ui/core/overlay/creator';
+import { ToastProvider } from '@gluestack-ui/core/toast/creator';
+import { setFlushStyles } from '@gluestack-ui/utils/nativewind-utils';
+import { script } from './script';
+
+export type ModeType = 'light' | 'dark' | 'system';
+
+const variableStyleTagId = 'nativewind-style';
+const createStyle = (styleTagId: string) => {
+ const style = document.createElement('style');
+ style.id = styleTagId;
+ style.appendChild(document.createTextNode(''));
+ return style;
+};
+
+export const useSafeLayoutEffect =
+ typeof window !== 'undefined' ? useLayoutEffect : useEffect;
+
+export function GluestackUIProvider({
+ mode = 'light',
+ ...props
+}: {
+ mode?: ModeType;
+ children?: React.ReactNode;
+}) {
+ let cssVariablesWithMode = ``;
+ Object.keys(config).forEach((configKey) => {
+ cssVariablesWithMode +=
+ configKey === 'dark' ? `\n .dark {\n ` : `\n:root {\n`;
+ const cssVariables = Object.keys(
+ config[configKey as keyof typeof config]
+ ).reduce((acc: string, curr: string) => {
+ acc += `${curr}:${config[configKey as keyof typeof config][curr]}; `;
+ return acc;
+ }, '');
+ cssVariablesWithMode += `${cssVariables} \n}`;
+ });
+
+ setFlushStyles(cssVariablesWithMode);
+
+ const handleMediaQuery = React.useCallback((e: MediaQueryListEvent) => {
+ script(e.matches ? 'dark' : 'light');
+ }, []);
+
+ useSafeLayoutEffect(() => {
+ if (mode !== 'system') {
+ const documentElement = document.documentElement;
+ if (documentElement) {
+ documentElement.classList.add(mode);
+ documentElement.classList.remove(mode === 'light' ? 'dark' : 'light');
+ documentElement.style.colorScheme = mode;
+ }
+ }
+ }, [mode]);
+
+ useSafeLayoutEffect(() => {
+ if (mode !== 'system') return;
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
+
+ media.addListener(handleMediaQuery);
+
+ return () => media.removeListener(handleMediaQuery);
+ }, [handleMediaQuery]);
+
+ useSafeLayoutEffect(() => {
+ if (typeof window !== 'undefined') {
+ const documentElement = document.documentElement;
+ if (documentElement) {
+ const head = documentElement.querySelector('head');
+ let style = head?.querySelector(`[id='${variableStyleTagId}']`);
+ if (!style) {
+ style = createStyle(variableStyleTagId);
+ style.innerHTML = cssVariablesWithMode;
+ if (head) head.appendChild(style);
+ }
+ }
+ }
+ }, []);
+
+ return (
+ <>
+
+
+ {props.children}
+
+ >
+ );
+}
diff --git a/components/ui/gluestack-ui-provider/gluestack-ui-provider/script.ts b/components/ui/gluestack-ui-provider/gluestack-ui-provider/script.ts
new file mode 100644
index 0000000..732d136
--- /dev/null
+++ b/components/ui/gluestack-ui-provider/gluestack-ui-provider/script.ts
@@ -0,0 +1,19 @@
+export const script = (mode: string) => {
+ const documentElement = document.documentElement;
+
+ function getSystemColorMode() {
+ return window.matchMedia('(prefers-color-scheme: dark)').matches
+ ? 'dark'
+ : 'light';
+ }
+
+ try {
+ const isSystem = mode === 'system';
+ const theme = isSystem ? getSystemColorMode() : mode;
+ documentElement.classList.remove(theme === 'light' ? 'dark' : 'light');
+ documentElement.classList.add(theme);
+ documentElement.style.colorScheme = theme;
+ } catch (e) {
+ console.error(e);
+ }
+};
diff --git a/components/ui/gluestack-ui-provider/modal/index.tsx b/components/ui/gluestack-ui-provider/modal/index.tsx
new file mode 100644
index 0000000..5280daa
--- /dev/null
+++ b/components/ui/gluestack-ui-provider/modal/index.tsx
@@ -0,0 +1,276 @@
+'use client';
+import React from 'react';
+import { createModal } from '@gluestack-ui/core/modal/creator';
+import { Pressable, View, ScrollView, ViewStyle } from 'react-native';
+import {
+ Motion,
+ AnimatePresence,
+ createMotionAnimatedComponent,
+ MotionComponentProps,
+} from '@legendapp/motion';
+import { tva } from '@gluestack-ui/utils/nativewind-utils';
+import {
+ withStyleContext,
+ useStyleContext,
+} from '@gluestack-ui/utils/nativewind-utils';
+import { cssInterop } from 'nativewind';
+import type { VariantProps } from '@gluestack-ui/utils/nativewind-utils';
+
+type IAnimatedPressableProps = React.ComponentProps &
+ MotionComponentProps;
+
+const AnimatedPressable = createMotionAnimatedComponent(
+ Pressable
+) as React.ComponentType;
+const SCOPE = 'MODAL';
+
+type IMotionViewProps = React.ComponentProps &
+ MotionComponentProps;
+
+const MotionView = Motion.View as React.ComponentType;
+
+const UIModal = createModal({
+ Root: withStyleContext(View, SCOPE),
+ Backdrop: AnimatedPressable,
+ Content: MotionView,
+ Body: ScrollView,
+ CloseButton: Pressable,
+ Footer: View,
+ Header: View,
+ AnimatePresence: AnimatePresence,
+});
+
+cssInterop(AnimatedPressable, { className: 'style' });
+cssInterop(MotionView, { className: 'style' });
+
+const modalStyle = tva({
+ base: 'group/modal w-full h-full justify-center items-center web:pointer-events-none',
+ variants: {
+ size: {
+ xs: '',
+ sm: '',
+ md: '',
+ lg: '',
+ full: '',
+ },
+ },
+});
+
+const modalBackdropStyle = tva({
+ base: 'absolute left-0 top-0 right-0 bottom-0 bg-background-dark web:cursor-default',
+});
+
+const modalContentStyle = tva({
+ base: 'bg-background-0 rounded-md overflow-hidden border border-outline-100 shadow-hard-2 p-6',
+ parentVariants: {
+ size: {
+ xs: 'w-[60%] max-w-[360px]',
+ sm: 'w-[70%] max-w-[420px]',
+ md: 'w-[80%] max-w-[510px]',
+ lg: 'w-[90%] max-w-[640px]',
+ full: 'w-full',
+ },
+ },
+});
+
+const modalBodyStyle = tva({
+ base: 'mt-2 mb-6',
+});
+
+const modalCloseButtonStyle = tva({
+ base: 'group/modal-close-button z-10 rounded data-[focus-visible=true]:web:bg-background-100 web:outline-0 cursor-pointer',
+});
+
+const modalHeaderStyle = tva({
+ base: 'justify-between items-center flex-row',
+});
+
+const modalFooterStyle = tva({
+ base: 'flex-row justify-end items-center gap-2',
+});
+
+type IModalProps = React.ComponentProps &
+ VariantProps & { className?: string };
+
+type IModalBackdropProps = React.ComponentProps &
+ VariantProps & { className?: string };
+
+type IModalContentProps = React.ComponentProps &
+ VariantProps & { className?: string };
+
+type IModalHeaderProps = React.ComponentProps &
+ VariantProps & { className?: string };
+
+type IModalBodyProps = React.ComponentProps &
+ VariantProps & { className?: string };
+
+type IModalFooterProps = React.ComponentProps &
+ VariantProps & { className?: string };
+
+type IModalCloseButtonProps = React.ComponentProps &
+ VariantProps & { className?: string };
+
+const Modal = React.forwardRef, IModalProps>(
+ ({ className, size = 'md', ...props }, ref) => (
+
+ )
+);
+
+const ModalBackdrop = React.forwardRef<
+ React.ComponentRef,
+ IModalBackdropProps
+>(function ModalBackdrop({ className, ...props }, ref) {
+ return (
+
+ );
+});
+
+const ModalContent = React.forwardRef<
+ React.ComponentRef,
+ IModalContentProps
+>(function ModalContent({ className, size, ...props }, ref) {
+ const { size: parentSize } = useStyleContext(SCOPE);
+
+ return (
+
+ );
+});
+
+const ModalHeader = React.forwardRef<
+ React.ComponentRef,
+ IModalHeaderProps
+>(function ModalHeader({ className, ...props }, ref) {
+ return (
+
+ );
+});
+
+const ModalBody = React.forwardRef<
+ React.ComponentRef,
+ IModalBodyProps
+>(function ModalBody({ className, ...props }, ref) {
+ return (
+
+ );
+});
+
+const ModalFooter = React.forwardRef<
+ React.ComponentRef,
+ IModalFooterProps
+>(function ModalFooter({ className, ...props }, ref) {
+ return (
+
+ );
+});
+
+const ModalCloseButton = React.forwardRef<
+ React.ComponentRef,
+ IModalCloseButtonProps
+>(function ModalCloseButton({ className, ...props }, ref) {
+ return (
+
+ );
+});
+
+Modal.displayName = 'Modal';
+ModalBackdrop.displayName = 'ModalBackdrop';
+ModalContent.displayName = 'ModalContent';
+ModalHeader.displayName = 'ModalHeader';
+ModalBody.displayName = 'ModalBody';
+ModalFooter.displayName = 'ModalFooter';
+ModalCloseButton.displayName = 'ModalCloseButton';
+
+export {
+ Modal,
+ ModalBackdrop,
+ ModalContent,
+ ModalCloseButton,
+ ModalHeader,
+ ModalBody,
+ ModalFooter,
+};
diff --git a/components/ui/gluestack-ui-provider/popover/index.tsx b/components/ui/gluestack-ui-provider/popover/index.tsx
new file mode 100644
index 0000000..6fc24b4
--- /dev/null
+++ b/components/ui/gluestack-ui-provider/popover/index.tsx
@@ -0,0 +1,345 @@
+'use client';
+import React from 'react';
+import { View, Pressable, ScrollView, ViewStyle } from 'react-native';
+import {
+ Motion,
+ createMotionAnimatedComponent,
+ AnimatePresence,
+ MotionComponentProps,
+} from '@legendapp/motion';
+import { createPopover } from '@gluestack-ui/core/popover/creator';
+import { tva } from '@gluestack-ui/utils/nativewind-utils';
+import {
+ withStyleContext,
+ useStyleContext,
+} from '@gluestack-ui/utils/nativewind-utils';
+import { cssInterop } from 'nativewind';
+import type { VariantProps } from '@gluestack-ui/utils/nativewind-utils';
+
+type IAnimatedPressableProps = React.ComponentProps &
+ MotionComponentProps;
+
+const AnimatedPressable = createMotionAnimatedComponent(
+ Pressable
+) as React.ComponentType;
+
+const SCOPE = 'POPOVER';
+
+type IMotionViewProps = React.ComponentProps &
+ MotionComponentProps;
+
+const MotionView = Motion.View as React.ComponentType;
+
+const UIPopover = createPopover({
+ Root: withStyleContext(View, SCOPE),
+ Arrow: MotionView,
+ Backdrop: AnimatedPressable,
+ Body: ScrollView,
+ CloseButton: Pressable,
+ Content: MotionView,
+ Footer: View,
+ Header: View,
+ AnimatePresence: AnimatePresence,
+});
+
+cssInterop(MotionView, { className: 'style' });
+cssInterop(AnimatedPressable, { className: 'style' });
+
+const popoverStyle = tva({
+ base: 'group/popover w-full h-full justify-center items-center web:pointer-events-none',
+ variants: {
+ size: {
+ xs: '',
+ sm: '',
+ md: '',
+ lg: '',
+ full: '',
+ },
+ },
+});
+
+const popoverArrowStyle = tva({
+ base: 'bg-background-0 z-[1] border absolute overflow-hidden h-3.5 w-3.5 border-outline-100',
+ variants: {
+ placement: {
+ 'top left':
+ 'data-[flip=false]:border-t-0 data-[flip=false]:border-l-0 data-[flip=true]:border-b-0 data-[flip=true]:border-r-0',
+ 'top':
+ 'data-[flip=false]:border-t-0 data-[flip=false]:border-l-0 data-[flip=true]:border-b-0 data-[flip=true]:border-r-0',
+ 'top right':
+ 'data-[flip=false]:border-t-0 data-[flip=false]:border-l-0 data-[flip=true]:border-b-0 data-[flip=true]:border-r-0',
+ 'bottom':
+ 'data-[flip=false]:border-b-0 data-[flip=false]:border-r-0 data-[flip=true]:border-t-0 data-[flip=true]:border-l-0',
+ 'bottom left':
+ 'data-[flip=false]:border-b-0 data-[flip=false]:border-r-0 data-[flip=true]:border-t-0 data-[flip=true]:border-l-0',
+ 'bottom right':
+ 'data-[flip=false]:border-b-0 data-[flip=false]:border-r-0 data-[flip=true]:border-t-0 data-[flip=true]:border-l-0',
+ 'left':
+ 'data-[flip=false]:border-l-0 data-[flip=false]:border-b-0 data-[flip=true]:border-r-0 data-[flip=true]:border-t-0',
+ 'left top':
+ 'data-[flip=false]:border-l-0 data-[flip=false]:border-b-0 data-[flip=true]:border-r-0 data-[flip=true]:border-t-0',
+ 'left bottom':
+ 'data-[flip=false]:border-l-0 data-[flip=false]:border-b-0 data-[flip=true]:border-r-0 data-[flip=true]:border-t-0',
+ 'right':
+ 'data-[flip=false]:border-r-0 data-[flip=false]:border-t-0 data-[flip=true]:border-l-0 data-[flip=true]:border-b-0',
+ 'right top':
+ 'data-[flip=false]:border-r-0 data-[flip=false]:border-t-0 data-[flip=true]:border-l-0 data-[flip=true]:border-b-0',
+ 'right bottom':
+ 'data-[flip=false]:border-r-0 data-[flip=false]:border-t-0 data-[flip=true]:border-l-0 data-[flip=true]:border-b-0',
+ },
+ },
+});
+
+const popoverBackdropStyle = tva({
+ base: 'absolute left-0 top-0 right-0 bottom-0 web:cursor-default',
+});
+
+const popoverCloseButtonStyle = tva({
+ base: 'group/popover-close-button z-[1] rounded-sm data-[focus-visible=true]:web:bg-background-100 web:outline-0 web:cursor-pointer',
+});
+
+const popoverContentStyle = tva({
+ base: 'bg-background-0 rounded-lg overflow-hidden border border-outline-100 w-full',
+ parentVariants: {
+ size: {
+ xs: 'max-w-[360px] p-3.5',
+ sm: 'max-w-[420px] p-4',
+ md: 'max-w-[510px] p-[18px]',
+ lg: 'max-w-[640px] p-5',
+ full: 'p-6',
+ },
+ },
+});
+
+const popoverHeaderStyle = tva({
+ base: 'flex-row justify-between items-center',
+});
+
+const popoverBodyStyle = tva({
+ base: '',
+});
+
+const popoverFooterStyle = tva({
+ base: 'flex-row justify-between items-center',
+});
+
+type IPopoverProps = React.ComponentProps &
+ VariantProps & { className?: string };
+
+type IPopoverArrowProps = React.ComponentProps &
+ VariantProps & { className?: string };
+
+type IPopoverContentProps = React.ComponentProps &
+ VariantProps & { className?: string };
+
+type IPopoverHeaderProps = React.ComponentProps &
+ VariantProps & { className?: string };
+
+type IPopoverFooterProps = React.ComponentProps &
+ VariantProps & { className?: string };
+
+type IPopoverBodyProps = React.ComponentProps &
+ VariantProps & { className?: string };
+
+type IPopoverBackdropProps = React.ComponentProps &
+ VariantProps & { className?: string };
+
+type IPopoverCloseButtonProps = React.ComponentProps<
+ typeof UIPopover.CloseButton
+> &
+ VariantProps & { className?: string };
+
+const Popover = React.forwardRef<
+ React.ComponentRef,
+ IPopoverProps
+>(function Popover(
+ { className, size = 'md', placement = 'bottom', ...props },
+ ref
+) {
+ return (
+
+ );
+});
+
+const PopoverContent = React.forwardRef<
+ React.ComponentRef,
+ IPopoverContentProps
+>(function PopoverContent({ className, size, ...props }, ref) {
+ const { size: parentSize } = useStyleContext(SCOPE);
+
+ return (
+
+ );
+});
+
+const PopoverArrow = React.forwardRef<
+ React.ComponentRef,
+ IPopoverArrowProps
+>(function PopoverArrow({ className, ...props }, ref) {
+ const { placement } = useStyleContext(SCOPE);
+ return (
+
+ );
+});
+
+const PopoverBackdrop = React.forwardRef<
+ React.ComponentRef,
+ IPopoverBackdropProps
+>(function PopoverBackdrop({ className, ...props }, ref) {
+ return (
+
+ );
+});
+
+const PopoverBody = React.forwardRef<
+ React.ComponentRef,
+ IPopoverBodyProps
+>(function PopoverBody({ className, ...props }, ref) {
+ return (
+
+ );
+});
+
+const PopoverCloseButton = React.forwardRef<
+ React.ComponentRef,
+ IPopoverCloseButtonProps
+>(function PopoverCloseButton({ className, ...props }, ref) {
+ return (
+
+ );
+});
+
+const PopoverFooter = React.forwardRef<
+ React.ComponentRef,
+ IPopoverFooterProps
+>(function PopoverFooter({ className, ...props }, ref) {
+ return (
+
+ );
+});
+
+const PopoverHeader = React.forwardRef<
+ React.ComponentRef,
+ IPopoverHeaderProps
+>(function PopoverHeader({ className, ...props }, ref) {
+ return (
+
+ );
+});
+
+Popover.displayName = 'Popover';
+PopoverArrow.displayName = 'PopoverArrow';
+PopoverBackdrop.displayName = 'PopoverBackdrop';
+PopoverContent.displayName = 'PopoverContent';
+PopoverHeader.displayName = 'PopoverHeader';
+PopoverFooter.displayName = 'PopoverFooter';
+PopoverBody.displayName = 'PopoverBody';
+PopoverCloseButton.displayName = 'PopoverCloseButton';
+
+export {
+ Popover,
+ PopoverBackdrop,
+ PopoverArrow,
+ PopoverCloseButton,
+ PopoverFooter,
+ PopoverHeader,
+ PopoverBody,
+ PopoverContent,
+};
diff --git a/components/ui/gluestack-ui-provider/tooltip/index.tsx b/components/ui/gluestack-ui-provider/tooltip/index.tsx
new file mode 100644
index 0000000..082a0be
--- /dev/null
+++ b/components/ui/gluestack-ui-provider/tooltip/index.tsx
@@ -0,0 +1,131 @@
+'use client';
+import React from 'react';
+import { createTooltip } from '@gluestack-ui/core/tooltip/creator';
+import { View, Text, ViewStyle } from 'react-native';
+import type { VariantProps } from '@gluestack-ui/utils/nativewind-utils';
+import { tva } from '@gluestack-ui/utils/nativewind-utils';
+import { withStyleContext } from '@gluestack-ui/utils/nativewind-utils';
+import {
+ Motion,
+ AnimatePresence,
+ MotionComponentProps,
+} from '@legendapp/motion';
+import { cssInterop } from 'nativewind';
+
+type IMotionViewProps = React.ComponentProps &
+ MotionComponentProps;
+
+const MotionView = Motion.View as React.ComponentType;
+
+export const UITooltip = createTooltip({
+ Root: withStyleContext(View),
+ Content: MotionView,
+ Text: Text,
+ AnimatePresence: AnimatePresence,
+});
+
+cssInterop(MotionView, { className: 'style' });
+
+const tooltipStyle = tva({
+ base: 'w-full h-full web:pointer-events-none',
+});
+
+const tooltipContentStyle = tva({
+ base: 'py-1 px-3 rounded-sm bg-background-900 web:pointer-events-auto',
+});
+
+const tooltipTextStyle = tva({
+ base: 'font-normal tracking-normal web:select-none text-xs text-typography-50',
+
+ variants: {
+ isTruncated: {
+ true: 'line-clamp-1 truncate',
+ },
+ bold: {
+ true: 'font-bold',
+ },
+ underline: {
+ true: 'underline',
+ },
+ strikeThrough: {
+ true: 'line-through',
+ },
+ size: {
+ '2xs': 'text-2xs',
+ 'xs': 'text-xs',
+ 'sm': 'text-sm',
+ 'md': 'text-base',
+ 'lg': 'text-lg',
+ 'xl': 'text-xl',
+ '2xl': 'text-2xl',
+ '3xl': 'text-3xl',
+ '4xl': 'text-4xl',
+ '5xl': 'text-5xl',
+ '6xl': 'text-6xl',
+ },
+ sub: {
+ true: 'text-xs',
+ },
+ italic: {
+ true: 'italic',
+ },
+ highlight: {
+ true: 'bg-yellow-500',
+ },
+ },
+});
+
+type ITooltipProps = React.ComponentProps &
+ VariantProps & { className?: string };
+type ITooltipContentProps = React.ComponentProps &
+ VariantProps & { className?: string };
+type ITooltipTextProps = React.ComponentProps &
+ VariantProps & { className?: string };
+
+const Tooltip = React.forwardRef<
+ React.ComponentRef,
+ ITooltipProps
+>(function Tooltip({ className, ...props }, ref) {
+ return (
+
+ );
+});
+
+const TooltipContent = React.forwardRef<
+ React.ComponentRef,
+ ITooltipContentProps & { className?: string }
+>(function TooltipContent({ className, ...props }, ref) {
+ return (
+
+ );
+});
+
+const TooltipText = React.forwardRef<
+ React.ComponentRef,
+ ITooltipTextProps & { className?: string }
+>(function TooltipText({ size, className, ...props }, ref) {
+ return (
+
+ );
+});
+
+Tooltip.displayName = 'Tooltip';
+TooltipContent.displayName = 'TooltipContent';
+TooltipText.displayName = 'TooltipText';
+
+export { Tooltip, TooltipContent, TooltipText };
diff --git a/config/auth.ts b/config/auth.ts
index 8794caa..2b4fe1f 100644
--- a/config/auth.ts
+++ b/config/auth.ts
@@ -1,3 +1,5 @@
+import { TOKEN } from "@/constants";
+import { removeStorageItem } from "@/utils/storage";
import { Router } from "expo-router";
let routerInstance: Router | null = null;
@@ -14,6 +16,7 @@ export const setRouterInstance = (router: Router) => {
*/
export const handle401 = () => {
if (routerInstance) {
+ removeStorageItem(TOKEN);
(routerInstance as any).replace("/login");
} else {
console.warn("Router instance not set, cannot redirect to login");
diff --git a/config/axios.ts b/config/axios.ts
index 883434b..bea7b47 100644
--- a/config/axios.ts
+++ b/config/axios.ts
@@ -1,6 +1,7 @@
import { TOKEN } from "@/constants";
import { getStorageItem } from "@/utils/storage";
import axios, { AxiosInstance } from "axios";
+import { handle401 } from "./auth";
import { showToastError } from "./toast";
const codeMessage = {
@@ -72,7 +73,7 @@ api.interceptors.response.use(
showToastError(`Lỗi ${status}`, errMsg);
if (status === 401) {
- // handle401();
+ handle401();
}
return Promise.reject(error);
}
diff --git a/controller/DeviceController.ts b/controller/DeviceController.ts
index d188da9..09aaaae 100644
--- a/controller/DeviceController.ts
+++ b/controller/DeviceController.ts
@@ -4,6 +4,7 @@ import {
API_GET_GPS,
API_PATH_ENTITIES,
API_PATH_SHIP_TRACK_POINTS,
+ API_SOS,
} from "@/constants";
import { transformEntityResponse } from "@/utils/tranform";
@@ -23,3 +24,14 @@ export async function queryEntities(): Promise {
const response = await api.get(API_PATH_ENTITIES);
return response.data.map(transformEntityResponse);
}
+
+export async function queryGetSos() {
+ return await api.get(API_SOS);
+}
+export async function queryDeleteSos() {
+ return await api.delete(API_SOS);
+}
+
+export async function querySendSosMessage(message: string) {
+ return await api.put(API_SOS, { message });
+}
diff --git a/controller/typings.d.ts b/controller/typings.d.ts
index 299965c..5948ddf 100644
--- a/controller/typings.d.ts
+++ b/controller/typings.d.ts
@@ -80,4 +80,14 @@ declare namespace Model {
geom_point?: string;
geom_radius?: number;
}
+
+ interface SosRequest {
+ message?: string;
+ }
+
+ interface SosResponse {
+ active: boolean;
+ message?: string;
+ started_at?: number;
+ }
}
diff --git a/metro.config.js b/metro.config.js
index b0963fe..f3321ba 100644
--- a/metro.config.js
+++ b/metro.config.js
@@ -1,6 +1,6 @@
-const { getDefaultConfig } = require("expo/metro-config");
-const { withNativeWind } = require("nativewind/metro");
+const { getDefaultConfig } = require('expo/metro-config');
+const { withNativeWind } = require('nativewind/metro');
const config = getDefaultConfig(__dirname);
-module.exports = withNativeWind(config, { input: "./global.css" });
+module.exports = withNativeWind(config, { input: './global.css' });
diff --git a/package-lock.json b/package-lock.json
index 090e4f8..24286a3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,12 +8,18 @@
"name": "sgw-app",
"version": "1.0.0",
"dependencies": {
+ "@expo/html-elements": "^0.10.1",
"@expo/vector-icons": "^15.0.3",
+ "@gluestack-ui/core": "^3.0.12",
+ "@gluestack-ui/utils": "^3.0.11",
+ "@legendapp/motion": "^2.5.3",
"@react-native-async-storage/async-storage": "2.2.0",
"@react-navigation/bottom-tabs": "^7.4.0",
"@react-navigation/elements": "^2.6.3",
"@react-navigation/native": "^7.1.8",
"axios": "^1.13.1",
+ "babel-plugin-module-resolver": "^5.0.2",
+ "dayjs": "^1.11.19",
"eventemitter3": "^5.0.1",
"expo": "~54.0.20",
"expo-constants": "~18.0.10",
@@ -29,17 +35,21 @@
"expo-web-browser": "~15.0.8",
"nativewind": "^4.2.1",
"react": "19.1.0",
+ "react-aria": "^3.44.0",
"react-dom": "19.1.0",
"react-native": "0.81.5",
"react-native-gesture-handler": "~2.28.0",
"react-native-keyboard-aware-scroll-view": "^0.9.5",
"react-native-maps": "^1.20.1",
- "react-native-reanimated": "~4.1.1",
- "react-native-safe-area-context": "5.4.0",
+ "react-native-reanimated": "~4.1.0",
+ "react-native-safe-area-context": "^5.6.2",
"react-native-screens": "~4.16.0",
+ "react-native-svg": "^15.14.0",
"react-native-toast-message": "^2.3.3",
"react-native-web": "~0.21.0",
- "react-native-worklets": "0.5.1",
+ "react-native-worklets": "^0.5.2",
+ "react-stately": "^3.42.0",
+ "tailwind-variants": "^0.1.20",
"zustand": "^5.0.8"
},
"devDependencies": {
@@ -47,7 +57,7 @@
"eslint": "^9.25.0",
"eslint-config-expo": "~10.0.0",
"prettier-plugin-tailwindcss": "^0.5.11",
- "tailwindcss": "^3.4.17",
+ "tailwindcss": "^3.4.18",
"typescript": "~5.9.2"
}
},
@@ -69,6 +79,7 @@
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
"integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
@@ -1948,6 +1959,12 @@
"node": ">=10"
}
},
+ "node_modules/@expo/html-elements": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@expo/html-elements/-/html-elements-0.10.1.tgz",
+ "integrity": "sha512-3PTmtkV15D7+lykXVtvkH1jQ5Y6JE+e3zCaoMMux7z2cSLGQUNwDEUwG37gew3OEB1/E4/SEWgjvg8m7E6/e2Q==",
+ "license": "MIT"
+ },
"node_modules/@expo/image-utils": {
"version": "0.8.7",
"resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.7.tgz",
@@ -2283,6 +2300,94 @@
"@babel/highlight": "^7.10.4"
}
},
+ "node_modules/@formatjs/ecma402-abstract": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.6.tgz",
+ "integrity": "sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@formatjs/fast-memoize": "2.2.7",
+ "@formatjs/intl-localematcher": "0.6.2",
+ "decimal.js": "^10.4.3",
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/@formatjs/fast-memoize": {
+ "version": "2.2.7",
+ "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.7.tgz",
+ "integrity": "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/@formatjs/icu-messageformat-parser": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.4.tgz",
+ "integrity": "sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==",
+ "license": "MIT",
+ "dependencies": {
+ "@formatjs/ecma402-abstract": "2.3.6",
+ "@formatjs/icu-skeleton-parser": "1.8.16",
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/@formatjs/icu-skeleton-parser": {
+ "version": "1.8.16",
+ "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.16.tgz",
+ "integrity": "sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@formatjs/ecma402-abstract": "2.3.6",
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/@formatjs/intl-localematcher": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.6.2.tgz",
+ "integrity": "sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/@gluestack-ui/core": {
+ "version": "3.0.12",
+ "resolved": "https://registry.npmjs.org/@gluestack-ui/core/-/core-3.0.12.tgz",
+ "integrity": "sha512-TyNjDUJrZF/FTqcSEPBR87wZQ3yvbWuTjn0tG5AFYzYfMCw0IpfTigmzoajN9KHensN0xNwHoAkXKaHlhy11yQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@gluestack-ui/utils": ">=2.0.0",
+ "react": ">=16.8.0",
+ "react-native": ">=0.64.0",
+ "react-native-safe-area-context": ">=4.0.0",
+ "react-native-svg": ">=12.0.0",
+ "react-native-web": ">=0.19.0"
+ }
+ },
+ "node_modules/@gluestack-ui/utils": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@gluestack-ui/utils/-/utils-3.0.11.tgz",
+ "integrity": "sha512-4stxK98v07NFAGvSI4Dxje/xbnftaY45VcZglZUxlAr8FFVLNFcjXUTSnVWqog0DBp2oJ7Nk/AYUpT2KkpI+7A==",
+ "dependencies": {
+ "dom-helpers": "^6.0.1",
+ "react-aria": "^3.41.1",
+ "react-stately": "^3.39.0",
+ "tailwind-variants": "0.1.20"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-native": ">=0.64.0",
+ "react-native-web": ">=0.19.0",
+ "tailwindcss": ">=3.0.0"
+ }
+ },
"node_modules/@humanfs/core": {
"version": "0.19.1",
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
@@ -2335,6 +2440,43 @@
"url": "https://github.com/sponsors/nzakas"
}
},
+ "node_modules/@internationalized/date": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.10.0.tgz",
+ "integrity": "sha512-oxDR/NTEJ1k+UFVQElaNIk65E/Z83HK1z1WI3lQyhTtnNg4R5oVXaPzK3jcpKG8UHKDVuDQHzn+wsxSz8RP3aw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0"
+ }
+ },
+ "node_modules/@internationalized/message": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.8.tgz",
+ "integrity": "sha512-Rwk3j/TlYZhn3HQ6PyXUV0XP9Uv42jqZGNegt0BXlxjE6G3+LwHjbQZAGHhCnCPdaA6Tvd3ma/7QzLlLkJxAWA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0",
+ "intl-messageformat": "^10.1.0"
+ }
+ },
+ "node_modules/@internationalized/number": {
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.5.tgz",
+ "integrity": "sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0"
+ }
+ },
+ "node_modules/@internationalized/string": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.7.tgz",
+ "integrity": "sha512-D4OHBjrinH+PFZPvfCXvG28n2LSykWcJ7GIioQL+ok0LON15SdfoUssoHzzOUmVZLbRoREsQXVzA6r8JKsbP6A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0"
+ }
+ },
"node_modules/@isaacs/cliui": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
@@ -2635,6 +2777,34 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
+ "node_modules/@legendapp/motion": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/@legendapp/motion/-/motion-2.5.3.tgz",
+ "integrity": "sha512-IcNiStiK3qG5LaIPLC8fVV0BHIrkf7EY5HfOv3xbuMH0z4D945yaaEDafP5bboHf/uj9XRjTQHVTtZgwpMNlHw==",
+ "license": "MIT",
+ "dependencies": {
+ "@legendapp/tools": "2.0.1"
+ },
+ "peerDependencies": {
+ "nativewind": ">=4.0.0",
+ "react": ">=16",
+ "react-native": "*"
+ }
+ },
+ "node_modules/@legendapp/tools": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@legendapp/tools/-/tools-2.0.1.tgz",
+ "integrity": "sha512-Kxt0HWvWElRK6oybHRzcYxdgaKGwuaiRNreS7usW7QuHXRIHaH4yMcW2YNRG4DHE5fpefv+Bno/BohQcCE4FaA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=16"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@napi-rs/wasm-runtime": {
"version": "0.2.12",
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
@@ -2652,6 +2822,7 @@
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "2.0.5",
@@ -2665,6 +2836,7 @@
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 8"
@@ -2674,6 +2846,7 @@
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@nodelib/fs.scandir": "2.1.5",
@@ -2890,6 +3063,920 @@
}
}
},
+ "node_modules/@react-aria/breadcrumbs": {
+ "version": "3.5.29",
+ "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.29.tgz",
+ "integrity": "sha512-rKS0dryllaZJqrr3f/EAf2liz8CBEfmL5XACj+Z1TAig6GIYe1QuA3BtkX0cV9OkMugXdX8e3cbA7nD10ORRqg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/link": "^3.8.6",
+ "@react-aria/utils": "^3.31.0",
+ "@react-types/breadcrumbs": "^3.7.17",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/button": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.14.2.tgz",
+ "integrity": "sha512-VbLIA+Kd6f/MDjd+TJBUg2+vNDw66pnvsj2E4RLomjI9dfBuN7d+Yo2UnsqKVyhePjCUZ6xxa2yDuD63IOSIYA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/toolbar": "3.0.0-beta.21",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/toggle": "^3.9.2",
+ "@react-types/button": "^3.14.1",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/calendar": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.9.2.tgz",
+ "integrity": "sha512-uSLxLgOPRnEU4Jg59lAhUVA+uDx/55NBg4lpfsP2ynazyiJ5LCXmYceJi+VuOqMml7d9W0dB87OldOeLdIxYVA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/date": "^3.10.0",
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/live-announcer": "^3.4.4",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/calendar": "^3.9.0",
+ "@react-types/button": "^3.14.1",
+ "@react-types/calendar": "^3.8.0",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/checkbox": {
+ "version": "3.16.2",
+ "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.16.2.tgz",
+ "integrity": "sha512-29Mj9ZqXioJ0bcMnNGooHztnTau5pikZqX3qCRj5bYR3by/ZFFavYoMroh9F7s/MbFm/tsKX+Sf02lYFEdXRjA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/form": "^3.1.2",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/label": "^3.7.22",
+ "@react-aria/toggle": "^3.12.2",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/checkbox": "^3.7.2",
+ "@react-stately/form": "^3.2.2",
+ "@react-stately/toggle": "^3.9.2",
+ "@react-types/checkbox": "^3.10.2",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/color": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@react-aria/color/-/color-3.1.2.tgz",
+ "integrity": "sha512-jCC+Q7rAQGLQBkHjkPAeDuGYuMbc4neifjlNRiyZ9as1z4gg63H8MteoWYYk6K4vCKKxSixgt8MfI29XWMOWPQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/numberfield": "^3.12.2",
+ "@react-aria/slider": "^3.8.2",
+ "@react-aria/spinbutton": "^3.6.19",
+ "@react-aria/textfield": "^3.18.2",
+ "@react-aria/utils": "^3.31.0",
+ "@react-aria/visually-hidden": "^3.8.28",
+ "@react-stately/color": "^3.9.2",
+ "@react-stately/form": "^3.2.2",
+ "@react-types/color": "^3.1.2",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/combobox": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.14.0.tgz",
+ "integrity": "sha512-z4ro0Hma//p4nL2IJx5iUa7NwxeXbzSoZ0se5uTYjG1rUUMszg+wqQh/AQoL+eiULn7rs18JY9wwNbVIkRNKWA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.21.2",
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/listbox": "^3.15.0",
+ "@react-aria/live-announcer": "^3.4.4",
+ "@react-aria/menu": "^3.19.3",
+ "@react-aria/overlays": "^3.30.0",
+ "@react-aria/selection": "^3.26.0",
+ "@react-aria/textfield": "^3.18.2",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/collections": "^3.12.8",
+ "@react-stately/combobox": "^3.12.0",
+ "@react-stately/form": "^3.2.2",
+ "@react-types/button": "^3.14.1",
+ "@react-types/combobox": "^3.13.9",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/datepicker": {
+ "version": "3.15.2",
+ "resolved": "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.15.2.tgz",
+ "integrity": "sha512-th078hyNqPf4P2K10su/y32zPDjs3lOYVdHvsL9/+5K1dnTvLHCK5vgUyLuyn8FchhF7cmHV49D+LZVv65PEpQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/date": "^3.10.0",
+ "@internationalized/number": "^3.6.5",
+ "@internationalized/string": "^3.2.7",
+ "@react-aria/focus": "^3.21.2",
+ "@react-aria/form": "^3.1.2",
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/label": "^3.7.22",
+ "@react-aria/spinbutton": "^3.6.19",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/datepicker": "^3.15.2",
+ "@react-stately/form": "^3.2.2",
+ "@react-types/button": "^3.14.1",
+ "@react-types/calendar": "^3.8.0",
+ "@react-types/datepicker": "^3.13.2",
+ "@react-types/dialog": "^3.5.22",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/dialog": {
+ "version": "3.5.31",
+ "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.31.tgz",
+ "integrity": "sha512-inxQMyrzX0UBW9Mhraq0nZ4HjHdygQvllzloT1E/RlDd61lr3RbmJR6pLsrbKOTtSvDIBJpCso1xEdHCFNmA0Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/overlays": "^3.30.0",
+ "@react-aria/utils": "^3.31.0",
+ "@react-types/dialog": "^3.5.22",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/disclosure": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/disclosure/-/disclosure-3.1.0.tgz",
+ "integrity": "sha512-5996BeBpnj+yKXYysz+UuhFQxGFPvaZZ3zNBd052wz/i+TVFVGSqqYJ6cwZyO1AfBR8zOT0ZIiK4EC3ETwSvtQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/ssr": "^3.9.10",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/disclosure": "^3.0.8",
+ "@react-types/button": "^3.14.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/dnd": {
+ "version": "3.11.3",
+ "resolved": "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.11.3.tgz",
+ "integrity": "sha512-MyTziciik1Owz3rqDghu0K3ZtTFvmj/R2ZsLDwbU9N4hKqGX/BKnrI8SytTn8RDqVv5LmA/GhApLngiupTAsXw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/string": "^3.2.7",
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/live-announcer": "^3.4.4",
+ "@react-aria/overlays": "^3.30.0",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/collections": "^3.12.8",
+ "@react-stately/dnd": "^3.7.1",
+ "@react-types/button": "^3.14.1",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/focus": {
+ "version": "3.21.2",
+ "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.21.2.tgz",
+ "integrity": "sha512-JWaCR7wJVggj+ldmM/cb/DXFg47CXR55lznJhZBh4XVqJjMKwaOOqpT5vNN7kpC1wUpXicGNuDnJDN1S/+6dhQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/utils": "^3.31.0",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0",
+ "clsx": "^2.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/form": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@react-aria/form/-/form-3.1.2.tgz",
+ "integrity": "sha512-R3i7L7Ci61PqZQvOrnL9xJeWEbh28UkTVgkj72EvBBn39y4h7ReH++0stv7rRs8p5ozETSKezBbGfu4UsBewWw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/form": "^3.2.2",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/grid": {
+ "version": "3.14.5",
+ "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.14.5.tgz",
+ "integrity": "sha512-XHw6rgjlTqc85e3zjsWo3U0EVwjN5MOYtrolCKc/lc2ItNdcY3OlMhpsU9+6jHwg/U3VCSWkGvwAz9hg7krd8Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.21.2",
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/live-announcer": "^3.4.4",
+ "@react-aria/selection": "^3.26.0",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/collections": "^3.12.8",
+ "@react-stately/grid": "^3.11.6",
+ "@react-stately/selection": "^3.20.6",
+ "@react-types/checkbox": "^3.10.2",
+ "@react-types/grid": "^3.3.6",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/gridlist": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.14.1.tgz",
+ "integrity": "sha512-keS03Am07aOn7RuNaRsMOyh0jscyhDn95asCVy4lxhl9A9TFk1Jw0o2L6q6cWRj1gFiKeacj/otG5H8ZKQQ2Wg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.21.2",
+ "@react-aria/grid": "^3.14.5",
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/selection": "^3.26.0",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/list": "^3.13.1",
+ "@react-stately/tree": "^3.9.3",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/i18n": {
+ "version": "3.12.13",
+ "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.12.13.tgz",
+ "integrity": "sha512-YTM2BPg0v1RvmP8keHenJBmlx8FXUKsdYIEX7x6QWRd1hKlcDwphfjzvt0InX9wiLiPHsT5EoBTpuUk8SXc0Mg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/date": "^3.10.0",
+ "@internationalized/message": "^3.1.8",
+ "@internationalized/number": "^3.6.5",
+ "@internationalized/string": "^3.2.7",
+ "@react-aria/ssr": "^3.9.10",
+ "@react-aria/utils": "^3.31.0",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/interactions": {
+ "version": "3.25.6",
+ "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.6.tgz",
+ "integrity": "sha512-5UgwZmohpixwNMVkMvn9K1ceJe6TzlRlAfuYoQDUuOkk62/JVJNDLAPKIf5YMRc7d2B0rmfgaZLMtbREb0Zvkw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/ssr": "^3.9.10",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/flags": "^3.1.2",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/label": {
+ "version": "3.7.22",
+ "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.7.22.tgz",
+ "integrity": "sha512-jLquJeA5ZNqDT64UpTc9XJ7kQYltUlNcgxZ37/v4mHe0UZ7QohCKdKQhXHONb0h2jjNUpp2HOZI8J9++jOpzxA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/utils": "^3.31.0",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/landmark": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@react-aria/landmark/-/landmark-3.0.7.tgz",
+ "integrity": "sha512-t8c610b8hPLS6Vwv+rbuSyljZosI1s5+Tosfa0Fk4q7d+Ex6Yj7hLfUFy59GxZAufhUYfGX396fT0gPqAbU1tg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/utils": "^3.31.0",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0",
+ "use-sync-external-store": "^1.4.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/link": {
+ "version": "3.8.6",
+ "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.8.6.tgz",
+ "integrity": "sha512-7F7UDJnwbU9IjfoAdl6f3Hho5/WB7rwcydUOjUux0p7YVWh/fTjIFjfAGyIir7MJhPapun1D0t97QQ3+8jXVcg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/utils": "^3.31.0",
+ "@react-types/link": "^3.6.5",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/listbox": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.15.0.tgz",
+ "integrity": "sha512-Ub1Wu79R9sgxM7h4HeEdjOgOKDHwduvYcnDqsSddGXgpkL8ADjsy2YUQ0hHY5VnzA4BxK36bLp4mzSna8Qvj1w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/label": "^3.7.22",
+ "@react-aria/selection": "^3.26.0",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/collections": "^3.12.8",
+ "@react-stately/list": "^3.13.1",
+ "@react-types/listbox": "^3.7.4",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/live-announcer": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.4.4.tgz",
+ "integrity": "sha512-PTTBIjNRnrdJOIRTDGNifY2d//kA7GUAwRFJNOEwSNG4FW+Bq9awqLiflw0JkpyB0VNIwou6lqKPHZVLsGWOXA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0"
+ }
+ },
+ "node_modules/@react-aria/menu": {
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.19.3.tgz",
+ "integrity": "sha512-52fh8y8b2776R2VrfZPpUBJYC9oTP7XDy+zZuZTxPEd7Ywk0JNUl5F92y6ru22yPkS13sdhrNM/Op+V/KulmAg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.21.2",
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/overlays": "^3.30.0",
+ "@react-aria/selection": "^3.26.0",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/collections": "^3.12.8",
+ "@react-stately/menu": "^3.9.8",
+ "@react-stately/selection": "^3.20.6",
+ "@react-stately/tree": "^3.9.3",
+ "@react-types/button": "^3.14.1",
+ "@react-types/menu": "^3.10.5",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/meter": {
+ "version": "3.4.27",
+ "resolved": "https://registry.npmjs.org/@react-aria/meter/-/meter-3.4.27.tgz",
+ "integrity": "sha512-andOOdJkgRJF9vBi5VWRmFodK+GT+5X1lLeNUmb4qOX8/MVfX/RbK72LDeIhd7xC7rSCFHj3WvZ198rK4q0k3w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/progress": "^3.4.27",
+ "@react-types/meter": "^3.4.13",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/numberfield": {
+ "version": "3.12.2",
+ "resolved": "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.12.2.tgz",
+ "integrity": "sha512-M2b+z0HIXiXpGAWOQkO2kpIjaLNUXJ5Q3/GMa3Fkr+B1piFX0VuOynYrtddKVrmXCe+r5t+XcGb0KS29uqv7nQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/spinbutton": "^3.6.19",
+ "@react-aria/textfield": "^3.18.2",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/form": "^3.2.2",
+ "@react-stately/numberfield": "^3.10.2",
+ "@react-types/button": "^3.14.1",
+ "@react-types/numberfield": "^3.8.15",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/overlays": {
+ "version": "3.30.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.30.0.tgz",
+ "integrity": "sha512-UpjqSjYZx5FAhceWCRVsW6fX1sEwya1fQ/TKkL53FAlLFR8QKuoKqFlmiL43YUFTcGK3UdEOy3cWTleLQwdSmQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.21.2",
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/ssr": "^3.9.10",
+ "@react-aria/utils": "^3.31.0",
+ "@react-aria/visually-hidden": "^3.8.28",
+ "@react-stately/overlays": "^3.6.20",
+ "@react-types/button": "^3.14.1",
+ "@react-types/overlays": "^3.9.2",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/progress": {
+ "version": "3.4.27",
+ "resolved": "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.27.tgz",
+ "integrity": "sha512-0OA1shs1575g1zmO8+rWozdbTnxThFFhOfuoL1m7UV5Dley6FHpueoKB1ECv7B+Qm4dQt6DoEqLg7wsbbQDhmg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/label": "^3.7.22",
+ "@react-aria/utils": "^3.31.0",
+ "@react-types/progress": "^3.5.16",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/radio": {
+ "version": "3.12.2",
+ "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.12.2.tgz",
+ "integrity": "sha512-I11f6I90neCh56rT/6ieAs3XyDKvEfbj/QmbU5cX3p+SJpRRPN0vxQi5D1hkh0uxDpeClxygSr31NmZsd4sqfg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.21.2",
+ "@react-aria/form": "^3.1.2",
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/label": "^3.7.22",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/radio": "^3.11.2",
+ "@react-types/radio": "^3.9.2",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/searchfield": {
+ "version": "3.8.9",
+ "resolved": "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.8.9.tgz",
+ "integrity": "sha512-Yt2pj8Wb5/XsUr2T0DQqFv+DlFpzzWIWnNr9cJATUcWV/xw6ok7YFEg9+7EHtBmsCQxFFJtock1QfZzBw6qLtQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/textfield": "^3.18.2",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/searchfield": "^3.5.16",
+ "@react-types/button": "^3.14.1",
+ "@react-types/searchfield": "^3.6.6",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/select": {
+ "version": "3.17.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/select/-/select-3.17.0.tgz",
+ "integrity": "sha512-q5ZuyAn5jSOeI0Ys99951TaGcF4O7u1SSBVxPMwVVXOU8ZhToCNx+WG3n/JDYHEjqdo7sbsVRaPA7LkBzBGf5w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/form": "^3.1.2",
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/label": "^3.7.22",
+ "@react-aria/listbox": "^3.15.0",
+ "@react-aria/menu": "^3.19.3",
+ "@react-aria/selection": "^3.26.0",
+ "@react-aria/utils": "^3.31.0",
+ "@react-aria/visually-hidden": "^3.8.28",
+ "@react-stately/select": "^3.8.0",
+ "@react-types/button": "^3.14.1",
+ "@react-types/select": "^3.11.0",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/selection": {
+ "version": "3.26.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.26.0.tgz",
+ "integrity": "sha512-ZBH3EfWZ+RfhTj01dH8L17uT7iNbXWS8u77/fUpHgtrm0pwNVhx0TYVnLU1YpazQ/3WVpvWhmBB8sWwD1FlD/g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.21.2",
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/selection": "^3.20.6",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/separator": {
+ "version": "3.4.13",
+ "resolved": "https://registry.npmjs.org/@react-aria/separator/-/separator-3.4.13.tgz",
+ "integrity": "sha512-0NlcrdBfQbcjWEXdHl3+uSY1272n2ljT1gWL2RIf6aQsQWTZ0gz0rTgRHy0MTXN+y+tICItUERJT4vmTLtIzVg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/utils": "^3.31.0",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/slider": {
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.8.2.tgz",
+ "integrity": "sha512-6KyUGaVzRE4xAz1LKHbNh1q5wzxe58pdTHFSnxNe6nk1SCoHw7NfI4h2s2m6LgJ0megFxsT0Ir8aHaFyyxmbgg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/label": "^3.7.22",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/slider": "^3.7.2",
+ "@react-types/shared": "^3.32.1",
+ "@react-types/slider": "^3.8.2",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/spinbutton": {
+ "version": "3.6.19",
+ "resolved": "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.6.19.tgz",
+ "integrity": "sha512-xOIXegDpts9t3RSHdIN0iYQpdts0FZ3LbpYJIYVvdEHo9OpDS+ElnDzCGtwZLguvZlwc5s1LAKuKopDUsAEMkw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/live-announcer": "^3.4.4",
+ "@react-aria/utils": "^3.31.0",
+ "@react-types/button": "^3.14.1",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/ssr": {
+ "version": "3.9.10",
+ "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.10.tgz",
+ "integrity": "sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0"
+ },
+ "engines": {
+ "node": ">= 12"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/switch": {
+ "version": "3.7.8",
+ "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.7.8.tgz",
+ "integrity": "sha512-AfsUq1/YiuoprhcBUD9vDPyWaigAwctQNW1fMb8dROL+i/12B+Zekj8Ml+jbU69/kIVtfL0Jl7/0Bo9KK3X0xQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/toggle": "^3.12.2",
+ "@react-stately/toggle": "^3.9.2",
+ "@react-types/shared": "^3.32.1",
+ "@react-types/switch": "^3.5.15",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/table": {
+ "version": "3.17.8",
+ "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.17.8.tgz",
+ "integrity": "sha512-bXiZoxTMbsqUJsYDhHPzKc3jw0HFJ/xMsJ49a0f7mp5r9zACxNLeIU0wJ4Uvx37dnYOHKzGliG+rj5l4sph7MA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.21.2",
+ "@react-aria/grid": "^3.14.5",
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/live-announcer": "^3.4.4",
+ "@react-aria/utils": "^3.31.0",
+ "@react-aria/visually-hidden": "^3.8.28",
+ "@react-stately/collections": "^3.12.8",
+ "@react-stately/flags": "^3.1.2",
+ "@react-stately/table": "^3.15.1",
+ "@react-types/checkbox": "^3.10.2",
+ "@react-types/grid": "^3.3.6",
+ "@react-types/shared": "^3.32.1",
+ "@react-types/table": "^3.13.4",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/tabs": {
+ "version": "3.10.8",
+ "resolved": "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.10.8.tgz",
+ "integrity": "sha512-sPPJyTyoAqsBh76JinBAxStOcbjZvyWFYKpJ9Uqw+XT0ObshAPPFSGeh8DiQemPs02RwJdrfARPMhyqiX8t59A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.21.2",
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/selection": "^3.26.0",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/tabs": "^3.8.6",
+ "@react-types/shared": "^3.32.1",
+ "@react-types/tabs": "^3.3.19",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/tag": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/@react-aria/tag/-/tag-3.7.2.tgz",
+ "integrity": "sha512-JV679P5r4DftbqyNBRt7Nw9mP7dxaKPfikjyQuvUoEOa06wBLbM/hU9RJUPRvqK+Un6lgBDAmXD9NNf4N2xpdw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/gridlist": "^3.14.1",
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/label": "^3.7.22",
+ "@react-aria/selection": "^3.26.0",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/list": "^3.13.1",
+ "@react-types/button": "^3.14.1",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/textfield": {
+ "version": "3.18.2",
+ "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.18.2.tgz",
+ "integrity": "sha512-G+lM8VYSor6g9Yptc6hLZ6BF+0cq0pYol1z6wdQUQgJN8tg4HPtzq75lsZtlCSIznL3amgRAxJtd0dUrsAnvaQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/form": "^3.1.2",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/label": "^3.7.22",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/form": "^3.2.2",
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/shared": "^3.32.1",
+ "@react-types/textfield": "^3.12.6",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/toast": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@react-aria/toast/-/toast-3.0.8.tgz",
+ "integrity": "sha512-rfJIms6AkMyQ7ZgKrMZgGfPwGcB/t1JoEwbc1PAmXcAvFI/hzF6YF7ZFDXiq38ucFsP9PnHmbXIzM9w4ccl18A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/landmark": "^3.0.7",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/toast": "^3.1.2",
+ "@react-types/button": "^3.14.1",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/toggle": {
+ "version": "3.12.2",
+ "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.12.2.tgz",
+ "integrity": "sha512-g25XLYqJuJpt0/YoYz2Rab8ax+hBfbssllcEFh0v0jiwfk2gwTWfRU9KAZUvxIqbV8Nm8EBmrYychDpDcvW1kw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/toggle": "^3.9.2",
+ "@react-types/checkbox": "^3.10.2",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/toolbar": {
+ "version": "3.0.0-beta.21",
+ "resolved": "https://registry.npmjs.org/@react-aria/toolbar/-/toolbar-3.0.0-beta.21.tgz",
+ "integrity": "sha512-yRCk/GD8g+BhdDgxd3I0a0c8Ni4Wyo6ERzfSoBkPkwQ4X2E2nkopmraM9D0fXw4UcIr4bnmvADzkHXtBN0XrBg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.21.2",
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/utils": "^3.31.0",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/tooltip": {
+ "version": "3.8.8",
+ "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.8.8.tgz",
+ "integrity": "sha512-CmHUqtXtFWmG4AHMEr9hIVex+oscK6xcM2V47gq9ijNInxe3M6UBu/dBdkgGP/jYv9N7tzCAjTR8nNIHQXwvWw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/tooltip": "^3.5.8",
+ "@react-types/shared": "^3.32.1",
+ "@react-types/tooltip": "^3.4.21",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/tree": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@react-aria/tree/-/tree-3.1.4.tgz",
+ "integrity": "sha512-6pbFeN0dAsCOrFGUKU39CNjft20zCAjLfMqfkRWisL+JkUHI2nq6odUJF5jJTsU1C+1951+3oFOmVxPX+K+akQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/gridlist": "^3.14.1",
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/selection": "^3.26.0",
+ "@react-aria/utils": "^3.31.0",
+ "@react-stately/tree": "^3.9.3",
+ "@react-types/button": "^3.14.1",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/utils": {
+ "version": "3.31.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.31.0.tgz",
+ "integrity": "sha512-ABOzCsZrWzf78ysswmguJbx3McQUja7yeGj6/vZo4JVsZNlxAN+E9rs381ExBRI0KzVo6iBTeX5De8eMZPJXig==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/ssr": "^3.9.10",
+ "@react-stately/flags": "^3.1.2",
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0",
+ "clsx": "^2.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/visually-hidden": {
+ "version": "3.8.28",
+ "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.28.tgz",
+ "integrity": "sha512-KRRjbVVob2CeBidF24dzufMxBveEUtUu7IM+hpdZKB+gxVROoh4XRLPv9SFmaH89Z7D9To3QoykVZoWD0lan6Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/utils": "^3.31.0",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
"node_modules/@react-native-async-storage/async-storage": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-2.2.0.tgz",
@@ -3236,6 +4323,752 @@
"nanoid": "^3.3.11"
}
},
+ "node_modules/@react-stately/calendar": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.9.0.tgz",
+ "integrity": "sha512-U5Nf2kx9gDhJRxdDUm5gjfyUlt/uUfOvM1vDW2UA62cA6+2k2cavMLc2wNlXOb/twFtl6p0joYKHG7T4xnEFkg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/date": "^3.10.0",
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/calendar": "^3.8.0",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/checkbox": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.7.2.tgz",
+ "integrity": "sha512-j1ycUVz5JmqhaL6mDZgDNZqBilOB8PBW096sDPFaTtuYreDx2HOd1igxiIvwlvPESZwsJP7FVM3mYnaoXtpKPA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/form": "^3.2.2",
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/checkbox": "^3.10.2",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/collections": {
+ "version": "3.12.8",
+ "resolved": "https://registry.npmjs.org/@react-stately/collections/-/collections-3.12.8.tgz",
+ "integrity": "sha512-AceJYLLXt1Y2XIcOPi6LEJSs4G/ubeYW3LqOCQbhfIgMaNqKfQMIfagDnPeJX9FVmPFSlgoCBxb1pTJW2vjCAQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/color": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@react-stately/color/-/color-3.9.2.tgz",
+ "integrity": "sha512-F+6Do8W3yu/4n7MpzZtbXwVukcLTFYYDIUtpoR+Jl52UmAr9Hf1CQgkyTI2azv1ZMzj1mVrTBhpBL0q27kFZig==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/number": "^3.6.5",
+ "@internationalized/string": "^3.2.7",
+ "@react-stately/form": "^3.2.2",
+ "@react-stately/numberfield": "^3.10.2",
+ "@react-stately/slider": "^3.7.2",
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/color": "^3.1.2",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/combobox": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.12.0.tgz",
+ "integrity": "sha512-A6q9R/7cEa/qoQsBkdslXWvD7ztNLLQ9AhBhVN9QvzrmrH5B4ymUwcTU8lWl22ykH7RRwfonLeLXJL4C+/L2oQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/collections": "^3.12.8",
+ "@react-stately/form": "^3.2.2",
+ "@react-stately/list": "^3.13.1",
+ "@react-stately/overlays": "^3.6.20",
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/combobox": "^3.13.9",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/data": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/@react-stately/data/-/data-3.14.1.tgz",
+ "integrity": "sha512-lDNc4gZ6kVZcrABeeQZPTTnP+1ykNylSvFzAC/Hq1fs8+s54xLRvoENWIyG+yK19N9TIGEoA0AOFG8PoAun43g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/datepicker": {
+ "version": "3.15.2",
+ "resolved": "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.15.2.tgz",
+ "integrity": "sha512-S5GL+W37chvV8knv9v0JRv0L6hKo732qqabCCHXzOpYxkLIkV4f/y3cHdEzFWzpZ0O0Gkg7WgeYo160xOdBKYg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/date": "^3.10.0",
+ "@internationalized/string": "^3.2.7",
+ "@react-stately/form": "^3.2.2",
+ "@react-stately/overlays": "^3.6.20",
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/datepicker": "^3.13.2",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/disclosure": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@react-stately/disclosure/-/disclosure-3.0.8.tgz",
+ "integrity": "sha512-/Ce/Z76y85eSBZiemfU/uEyXkBBa1RdfLRaKD13rnfUV7/nS3ae1VtNlsXgmwQjWv2pmAiSuEKYMbZfVL7q/lQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/dnd": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/@react-stately/dnd/-/dnd-3.7.1.tgz",
+ "integrity": "sha512-O1JBJ4HI1rVNKuoa5NXiC5FCrCEkr9KVBoKNlTZU8/cnQselhbEsUfMglAakO2EuwIaM1tIXoNF5J/N5P+6lTA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/selection": "^3.20.6",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/flags": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.2.tgz",
+ "integrity": "sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0"
+ }
+ },
+ "node_modules/@react-stately/form": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@react-stately/form/-/form-3.2.2.tgz",
+ "integrity": "sha512-soAheOd7oaTO6eNs6LXnfn0tTqvOoe3zN9FvtIhhrErKz9XPc5sUmh3QWwR45+zKbitOi1HOjfA/gifKhZcfWw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/grid": {
+ "version": "3.11.6",
+ "resolved": "https://registry.npmjs.org/@react-stately/grid/-/grid-3.11.6.tgz",
+ "integrity": "sha512-vWPAkzpeTIsrurHfMubzMuqEw7vKzFhIJeEK5sEcLunyr1rlADwTzeWrHNbPMl66NAIAi70Dr1yNq+kahQyvMA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/collections": "^3.12.8",
+ "@react-stately/selection": "^3.20.6",
+ "@react-types/grid": "^3.3.6",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/list": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.13.1.tgz",
+ "integrity": "sha512-eHaoauh21twbcl0kkwULhVJ+CzYcy1jUjMikNVMHOQdhr4WIBdExf7PmSgKHKqsSPhpGg6IpTCY2dUX3RycjDg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/collections": "^3.12.8",
+ "@react-stately/selection": "^3.20.6",
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/menu": {
+ "version": "3.9.8",
+ "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.9.8.tgz",
+ "integrity": "sha512-bo0NOhofnTHLESiYfsSSw6gyXiPVJJ0UlN2igUXtJk5PmyhWjFzUzTzcnd7B028OB0si9w3LIWM3stqz5271Eg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/overlays": "^3.6.20",
+ "@react-types/menu": "^3.10.5",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/numberfield": {
+ "version": "3.10.2",
+ "resolved": "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.10.2.tgz",
+ "integrity": "sha512-jlKVFYaH3RX5KvQ7a+SAMQuPccZCzxLkeYkBE64u1Zvi7YhJ8hkTMHG/fmZMbk1rHlseE2wfBdk0Rlya3MvoNQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/number": "^3.6.5",
+ "@react-stately/form": "^3.2.2",
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/numberfield": "^3.8.15",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/overlays": {
+ "version": "3.6.20",
+ "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.20.tgz",
+ "integrity": "sha512-YAIe+uI8GUXX8F/0Pzr53YeC5c/bjqbzDFlV8NKfdlCPa6+Jp4B/IlYVjIooBj9+94QvbQdjylegvYWK/iPwlg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/overlays": "^3.9.2",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/radio": {
+ "version": "3.11.2",
+ "resolved": "https://registry.npmjs.org/@react-stately/radio/-/radio-3.11.2.tgz",
+ "integrity": "sha512-UM7L6AW+k8edhSBUEPZAqiWNRNadfOKK7BrCXyBiG79zTz0zPcXRR+N+gzkDn7EMSawDeyK1SHYUuoSltTactg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/form": "^3.2.2",
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/radio": "^3.9.2",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/searchfield": {
+ "version": "3.5.16",
+ "resolved": "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.5.16.tgz",
+ "integrity": "sha512-MRfqT1lZ24r94GuFNcGJXsfijZoWjSMySCT60T6NXtbOzVPuAF3K+pL70Rayq/EWLJjS2NPHND11VTs0VdcE0Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/searchfield": "^3.6.6",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/select": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/select/-/select-3.8.0.tgz",
+ "integrity": "sha512-A721nlt0DSCDit0wKvhcrXFTG5Vv1qkEVkeKvobmETZy6piKvwh0aaN8iQno5AFuZaj1iOZeNjZ/20TsDJR/4A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/form": "^3.2.2",
+ "@react-stately/list": "^3.13.1",
+ "@react-stately/overlays": "^3.6.20",
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/select": "^3.11.0",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/selection": {
+ "version": "3.20.6",
+ "resolved": "https://registry.npmjs.org/@react-stately/selection/-/selection-3.20.6.tgz",
+ "integrity": "sha512-a0bjuP2pJYPKEiedz2Us1W1aSz0iHRuyeQEdBOyL6Z6VUa6hIMq9H60kvseir2T85cOa4QggizuRV7mcO6bU5w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/collections": "^3.12.8",
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/slider": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/@react-stately/slider/-/slider-3.7.2.tgz",
+ "integrity": "sha512-EVBHUdUYwj++XqAEiQg2fGi8Reccznba0uyQ3gPejF0pAc390Q/J5aqiTEDfiCM7uJ6WHxTM6lcCqHQBISk2dQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/shared": "^3.32.1",
+ "@react-types/slider": "^3.8.2",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/table": {
+ "version": "3.15.1",
+ "resolved": "https://registry.npmjs.org/@react-stately/table/-/table-3.15.1.tgz",
+ "integrity": "sha512-MhMAgE/LgAzHcAn1P3p/nQErzJ6DiixSJ1AOt2JlnAKEb5YJg4ATKWCb2IjBLwywt9ZCzfm3KMUzkctZqAoxwA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/collections": "^3.12.8",
+ "@react-stately/flags": "^3.1.2",
+ "@react-stately/grid": "^3.11.6",
+ "@react-stately/selection": "^3.20.6",
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/grid": "^3.3.6",
+ "@react-types/shared": "^3.32.1",
+ "@react-types/table": "^3.13.4",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/tabs": {
+ "version": "3.8.6",
+ "resolved": "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.8.6.tgz",
+ "integrity": "sha512-9RYxmgjVIxUpIsGKPIF7uRoHWOEz8muwaYiStCVeyiYBPmarvZoIYtTXcwSMN/vEs7heVN5uGCL6/bfdY4+WiA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/list": "^3.13.1",
+ "@react-types/shared": "^3.32.1",
+ "@react-types/tabs": "^3.3.19",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/toast": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@react-stately/toast/-/toast-3.1.2.tgz",
+ "integrity": "sha512-HiInm7bck32khFBHZThTQaAF6e6/qm57F4mYRWdTq8IVeGDzpkbUYibnLxRhk0UZ5ybc6me+nqqPkG/lVmM42Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0",
+ "use-sync-external-store": "^1.4.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/toggle": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.9.2.tgz",
+ "integrity": "sha512-dOxs9wrVXHUmA7lc8l+N9NbTJMAaXcYsnNGsMwfXIXQ3rdq+IjWGNYJ52UmNQyRYFcg0jrzRrU16TyGbNjOdNQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/checkbox": "^3.10.2",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/tooltip": {
+ "version": "3.5.8",
+ "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.5.8.tgz",
+ "integrity": "sha512-gkcUx2ROhCiGNAYd2BaTejakXUUNLPnnoJ5+V/mN480pN+OrO8/2V9pqb/IQmpqxLsso93zkM3A4wFHHLBBmPQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/overlays": "^3.6.20",
+ "@react-types/tooltip": "^3.4.21",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/tree": {
+ "version": "3.9.3",
+ "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.9.3.tgz",
+ "integrity": "sha512-ZngG79nLFxE/GYmpwX6E/Rma2MMkzdoJPRI3iWk3dgqnGMMzpPnUp/cvjDsU3UHF7xDVusC5BT6pjWN0uxCIFQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/collections": "^3.12.8",
+ "@react-stately/selection": "^3.20.6",
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/shared": "^3.32.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/utils": {
+ "version": "3.10.8",
+ "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.8.tgz",
+ "integrity": "sha512-SN3/h7SzRsusVQjQ4v10LaVsDc81jyyR0DD5HnsQitm/I5WDpaSr2nRHtyloPFU48jlql1XX/S04T2DLQM7Y3g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/breadcrumbs": {
+ "version": "3.7.17",
+ "resolved": "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.7.17.tgz",
+ "integrity": "sha512-IhvVTcfli5o/UDlGACXxjlor2afGlMQA8pNR3faH0bBUay1Fmm3IWktVw9Xwmk+KraV2RTAg9e+E6p8DOQZfiw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/link": "^3.6.5",
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/button": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.14.1.tgz",
+ "integrity": "sha512-D8C4IEwKB7zEtiWYVJ3WE/5HDcWlze9mLWQ5hfsBfpePyWCgO3bT/+wjb/7pJvcAocrkXo90QrMm85LcpBtrpg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/calendar": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.8.0.tgz",
+ "integrity": "sha512-ZDZgfZgbz1ydWOFs1mH7QFfX3ioJrmb3Y/lkoubQE0HWXLZzyYNvhhKyFJRS1QJ40IofLSBHriwbQb/tsUnGlw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/date": "^3.10.0",
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/checkbox": {
+ "version": "3.10.2",
+ "resolved": "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.10.2.tgz",
+ "integrity": "sha512-ktPkl6ZfIdGS1tIaGSU/2S5Agf2NvXI9qAgtdMDNva0oLyAZ4RLQb6WecPvofw1J7YKXu0VA5Mu7nlX+FM2weQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/color": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@react-types/color/-/color-3.1.2.tgz",
+ "integrity": "sha512-NP0TAY3j4tlMztOp/bBfMlPwC9AQKTjSiTFmc2oQNkx5M4sl3QpPqFPosdt7jZ8M4nItvfCWZrlZGjST4SB83A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1",
+ "@react-types/slider": "^3.8.2"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/combobox": {
+ "version": "3.13.9",
+ "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.13.9.tgz",
+ "integrity": "sha512-G6GmLbzVkLW6VScxPAr/RtliEyPhBClfYaIllK1IZv+Z42SVnOpKzhnoe79BpmiFqy1AaC3+LjZX783mrsHCwA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/datepicker": {
+ "version": "3.13.2",
+ "resolved": "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.13.2.tgz",
+ "integrity": "sha512-+M6UZxJnejYY8kz0spbY/hP08QJ5rsZ3aNarRQQHc48xV2oelFLX5MhAqizfLEsvyfb0JYrhWoh4z1xZtAmYCg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/date": "^3.10.0",
+ "@react-types/calendar": "^3.8.0",
+ "@react-types/overlays": "^3.9.2",
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/dialog": {
+ "version": "3.5.22",
+ "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.22.tgz",
+ "integrity": "sha512-smSvzOcqKE196rWk0oqJDnz+ox5JM5+OT0PmmJXiUD4q7P5g32O6W5Bg7hMIFUI9clBtngo8kLaX2iMg+GqAzg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/overlays": "^3.9.2",
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/grid": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/@react-types/grid/-/grid-3.3.6.tgz",
+ "integrity": "sha512-vIZJlYTii2n1We9nAugXwM2wpcpsC6JigJFBd6vGhStRdRWRoU4yv1Gc98Usbx0FQ/J7GLVIgeG8+1VMTKBdxw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/link": {
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/@react-types/link/-/link-3.6.5.tgz",
+ "integrity": "sha512-+I2s3XWBEvLrzts0GnNeA84mUkwo+a7kLUWoaJkW0TOBDG7my95HFYxF9WnqKye7NgpOkCqz4s3oW96xPdIniQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/listbox": {
+ "version": "3.7.4",
+ "resolved": "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.7.4.tgz",
+ "integrity": "sha512-p4YEpTl/VQGrqVE8GIfqTS5LkT5jtjDTbVeZgrkPnX/fiPhsfbTPiZ6g0FNap4+aOGJFGEEZUv2q4vx+rCORww==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/menu": {
+ "version": "3.10.5",
+ "resolved": "https://registry.npmjs.org/@react-types/menu/-/menu-3.10.5.tgz",
+ "integrity": "sha512-HBTrKll2hm0VKJNM4ubIv1L9MNo8JuOnm2G3M+wXvb6EYIyDNxxJkhjsqsGpUXJdAOSkacHBDcNh2HsZABNX4A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/overlays": "^3.9.2",
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/meter": {
+ "version": "3.4.13",
+ "resolved": "https://registry.npmjs.org/@react-types/meter/-/meter-3.4.13.tgz",
+ "integrity": "sha512-EiarfbpHcvmeyXvXcr6XLaHkNHuGc4g7fBVEiDPwssFJKKfbUzqnnknDxPjyspqUVRcXC08CokS98J1jYobqDg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/progress": "^3.5.16"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/numberfield": {
+ "version": "3.8.15",
+ "resolved": "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.8.15.tgz",
+ "integrity": "sha512-97r92D23GKCOjGIGMeW9nt+/KlfM3GeWH39Czcmd2/D5y3k6z4j0avbsfx2OttCtJszrnENjw3GraYGYI2KosQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/overlays": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.9.2.tgz",
+ "integrity": "sha512-Q0cRPcBGzNGmC8dBuHyoPR7N3057KTS5g+vZfQ53k8WwmilXBtemFJPLsogJbspuewQ/QJ3o2HYsp2pne7/iNw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/progress": {
+ "version": "3.5.16",
+ "resolved": "https://registry.npmjs.org/@react-types/progress/-/progress-3.5.16.tgz",
+ "integrity": "sha512-I9tSdCFfvQ7gHJtm90VAKgwdTWXQgVNvLRStEc0z9h+bXBxdvZb+QuiRPERChwFQ9VkK4p4rDqaFo69nDqWkpw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/radio": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.9.2.tgz",
+ "integrity": "sha512-3UcJXu37JrTkRyP4GJPDBU7NmDTInrEdOe+bVzA1j4EegzdkJmLBkLg5cLDAbpiEHB+xIsvbJdx6dxeMuc+H3g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/searchfield": {
+ "version": "3.6.6",
+ "resolved": "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.6.6.tgz",
+ "integrity": "sha512-cl3itr/fk7wbIQc2Gz5Ie8aVeUmPjVX/mRGS5/EXlmzycAKNYTvqf2mlxwObLndtLISmt7IgNjRRhbUUDI8Ang==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1",
+ "@react-types/textfield": "^3.12.6"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/select": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/@react-types/select/-/select-3.11.0.tgz",
+ "integrity": "sha512-SzIsMFVPCbXE1Z1TLfpdfiwJ1xnIkcL1/CjGilmUKkNk5uT7rYX1xCJqWCjXI0vAU1xM4Qn+T3n8de4fw6HRBg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/shared": {
+ "version": "3.32.1",
+ "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.32.1.tgz",
+ "integrity": "sha512-famxyD5emrGGpFuUlgOP6fVW2h/ZaF405G5KDi3zPHzyjAWys/8W6NAVJtNbkCkhedmvL0xOhvt8feGXyXaw5w==",
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/slider": {
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/@react-types/slider/-/slider-3.8.2.tgz",
+ "integrity": "sha512-MQYZP76OEOYe7/yA2To+Dl0LNb0cKKnvh5JtvNvDnAvEprn1RuLiay8Oi/rTtXmc2KmBa4VdTcsXsmkbbkeN2Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/switch": {
+ "version": "3.5.15",
+ "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.5.15.tgz",
+ "integrity": "sha512-r/ouGWQmIeHyYSP1e5luET+oiR7N7cLrAlWsrAfYRWHxqXOSNQloQnZJ3PLHrKFT02fsrQhx2rHaK2LfKeyN3A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/table": {
+ "version": "3.13.4",
+ "resolved": "https://registry.npmjs.org/@react-types/table/-/table-3.13.4.tgz",
+ "integrity": "sha512-I/DYiZQl6aNbMmjk90J9SOhkzVDZvyA3Vn3wMWCiajkMNjvubFhTfda5DDf2SgFP5l0Yh6TGGH5XumRv9LqL5Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/grid": "^3.3.6",
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/tabs": {
+ "version": "3.3.19",
+ "resolved": "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.3.19.tgz",
+ "integrity": "sha512-fE+qI43yR5pAMpeqPxGqQq9jDHXEPqXskuxNHERMW0PYMdPyem2Cw6goc5F4qeZO3Hf6uPZgHkvJz2OAq7TbBw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/textfield": {
+ "version": "3.12.6",
+ "resolved": "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.12.6.tgz",
+ "integrity": "sha512-hpEVKE+M3uUkTjw2WrX1NrH/B3rqDJFUa+ViNK2eVranLY4ZwFqbqaYXSzHupOF3ecSjJJv2C103JrwFvx6TPQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/tooltip": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.21.tgz",
+ "integrity": "sha512-ugGHOZU6WbOdeTdbjnaEc+Ms7/WhsUCg+T3PCOIeOT9FG02Ce189yJ/+hd7oqL/tVwIhEMYJIqSCgSELFox+QA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/overlays": "^3.9.2",
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
"node_modules/@rtsao/scc": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
@@ -3267,6 +5100,15 @@
"@sinonjs/commons": "^3.0.0"
}
},
+ "node_modules/@swc/helpers": {
+ "version": "0.5.17",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz",
+ "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
"node_modules/@tybys/wasm-util": {
"version": "0.10.1",
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
@@ -3398,7 +5240,7 @@
"version": "19.1.17",
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.17.tgz",
"integrity": "sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==",
- "devOptional": true,
+ "dev": true,
"license": "MIT",
"dependencies": {
"csstype": "^3.0.2"
@@ -4449,6 +6291,70 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
+ "node_modules/babel-plugin-module-resolver": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-5.0.2.tgz",
+ "integrity": "sha512-9KtaCazHee2xc0ibfqsDeamwDps6FZNo5S0Q81dUqEuFzVwPhcT4J5jOqIVvgCA3Q/wO9hKYxN/Ds3tIsp5ygg==",
+ "license": "MIT",
+ "dependencies": {
+ "find-babel-config": "^2.1.1",
+ "glob": "^9.3.3",
+ "pkg-up": "^3.1.0",
+ "reselect": "^4.1.7",
+ "resolve": "^1.22.8"
+ }
+ },
+ "node_modules/babel-plugin-module-resolver/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/babel-plugin-module-resolver/node_modules/glob": {
+ "version": "9.3.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz",
+ "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "minimatch": "^8.0.2",
+ "minipass": "^4.2.4",
+ "path-scurry": "^1.6.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/babel-plugin-module-resolver/node_modules/minimatch": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz",
+ "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/babel-plugin-module-resolver/node_modules/minipass": {
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz",
+ "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/babel-plugin-polyfill-corejs2": {
"version": "0.4.14",
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz",
@@ -4683,6 +6589,7 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
"integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -4691,6 +6598,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "license": "ISC"
+ },
"node_modules/bplist-creator": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz",
@@ -4890,6 +6803,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
"integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
@@ -4935,6 +6849,7 @@
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"anymatch": "~3.1.2",
@@ -4959,6 +6874,7 @@
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
@@ -5116,6 +7032,15 @@
"node": ">=0.8"
}
},
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/color": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
@@ -5348,10 +7273,61 @@
"hyphenate-style-name": "^1.0.3"
}
},
+ "node_modules/css-select": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz",
+ "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/css-tree/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
+ "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
"node_modules/cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
"license": "MIT",
"bin": {
"cssesc": "bin/cssesc"
@@ -5364,7 +7340,6 @@
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
- "devOptional": true,
"license": "MIT"
},
"node_modules/data-view-buffer": {
@@ -5421,6 +7396,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/dayjs": {
+ "version": "1.11.19",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz",
+ "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==",
+ "license": "MIT"
+ },
"node_modules/debug": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
@@ -5438,6 +7419,12 @@
}
}
},
+ "node_modules/decimal.js": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
+ "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
+ "license": "MIT"
+ },
"node_modules/decode-uri-component": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
@@ -5576,12 +7563,14 @@
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true,
"license": "Apache-2.0"
},
"node_modules/dlv": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/doctrine": {
@@ -5597,6 +7586,71 @@
"node": ">=0.10.0"
}
},
+ "node_modules/dom-helpers": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-6.0.1.tgz",
+ "integrity": "sha512-IKySryuFwseGkrCA/pIqlwUPOD50w1Lj/B2Yief3vBOP18k5y4t+hTqKh55gULDVeJMRitcozve+g/wVFf4sFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.27.1",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
"node_modules/dotenv": {
"version": "16.4.7",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
@@ -5671,6 +7725,18 @@
"node": ">= 0.8"
}
},
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
"node_modules/env-editor": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz",
@@ -7082,6 +9148,7 @@
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
"integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
@@ -7098,6 +9165,7 @@
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
@@ -7123,6 +9191,7 @@
"version": "1.19.1",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
"integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
"license": "ISC",
"dependencies": {
"reusify": "^1.0.4"
@@ -7234,6 +9303,15 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"license": "MIT"
},
+ "node_modules/find-babel-config": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-2.1.2.tgz",
+ "integrity": "sha512-ZfZp1rQyp4gyuxqt1ZqjFGVeVBvmpURMqdIWXbPRfB97Bf6BzdK/xSIbylEINzQ0kB5tlDQfn9HkNXXWsqTqLg==",
+ "license": "MIT",
+ "dependencies": {
+ "json5": "^2.2.3"
+ }
+ },
"node_modules/find-up": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -7576,6 +9654,7 @@
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.3"
@@ -7984,6 +10063,18 @@
"node": ">= 0.4"
}
},
+ "node_modules/intl-messageformat": {
+ "version": "10.7.18",
+ "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.18.tgz",
+ "integrity": "sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@formatjs/ecma402-abstract": "2.3.6",
+ "@formatjs/fast-memoize": "2.2.7",
+ "@formatjs/icu-messageformat-parser": "2.11.4",
+ "tslib": "^2.8.0"
+ }
+ },
"node_modules/invariant": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
@@ -8057,6 +10148,7 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"binary-extensions": "^2.0.0"
@@ -8187,6 +10279,7 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -8241,6 +10334,7 @@
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"is-extglob": "^2.1.1"
@@ -8721,6 +10815,7 @@
"version": "1.21.7",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
"integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
+ "dev": true,
"license": "MIT",
"bin": {
"jiti": "bin/jiti.js"
@@ -9140,6 +11235,7 @@
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
"integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=14"
@@ -9316,6 +11412,12 @@
"node": ">= 0.4"
}
},
+ "node_modules/mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+ "license": "CC0-1.0"
+ },
"node_modules/memoize-one": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
@@ -9344,6 +11446,7 @@
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 8"
@@ -9924,6 +12027,18 @@
"node": ">=10"
}
},
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
"node_modules/nullthrows": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz",
@@ -9955,6 +12070,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
@@ -10432,6 +12548,7 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -10446,6 +12563,79 @@
"node": ">= 6"
}
},
+ "node_modules/pkg-up": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
+ "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-up/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-up/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-up/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-up/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-up/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/plist": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz",
@@ -10511,6 +12701,7 @@
"version": "15.1.0",
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
"integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.0.0",
@@ -10528,6 +12719,7 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz",
"integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==",
+ "dev": true,
"funding": [
{
"type": "opencollective",
@@ -10553,6 +12745,7 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
"integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
+ "dev": true,
"funding": [
{
"type": "opencollective",
@@ -10595,6 +12788,7 @@
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
"integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
+ "dev": true,
"funding": [
{
"type": "opencollective",
@@ -10620,6 +12814,7 @@
"version": "6.1.2",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
"integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"cssesc": "^3.0.0",
@@ -10645,23 +12840,6 @@
"node": ">= 0.8.0"
}
},
- "node_modules/prettier": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz",
- "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "bin": {
- "prettier": "bin/prettier.cjs"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
"node_modules/prettier-plugin-tailwindcss": {
"version": "0.5.14",
"resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.14.tgz",
@@ -10892,6 +13070,7 @@
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
"funding": [
{
"type": "github",
@@ -10950,6 +13129,60 @@
"node": ">=0.10.0"
}
},
+ "node_modules/react-aria": {
+ "version": "3.44.0",
+ "resolved": "https://registry.npmjs.org/react-aria/-/react-aria-3.44.0.tgz",
+ "integrity": "sha512-2Pq3GQxBgM4/2BlpKYXeaZ47a3tdIcYSW/AYvKgypE3XipxOdQMDG5Sr/NBn7zuJq+thzmtfRb0lB9bTbsmaRw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/string": "^3.2.7",
+ "@react-aria/breadcrumbs": "^3.5.29",
+ "@react-aria/button": "^3.14.2",
+ "@react-aria/calendar": "^3.9.2",
+ "@react-aria/checkbox": "^3.16.2",
+ "@react-aria/color": "^3.1.2",
+ "@react-aria/combobox": "^3.14.0",
+ "@react-aria/datepicker": "^3.15.2",
+ "@react-aria/dialog": "^3.5.31",
+ "@react-aria/disclosure": "^3.1.0",
+ "@react-aria/dnd": "^3.11.3",
+ "@react-aria/focus": "^3.21.2",
+ "@react-aria/gridlist": "^3.14.1",
+ "@react-aria/i18n": "^3.12.13",
+ "@react-aria/interactions": "^3.25.6",
+ "@react-aria/label": "^3.7.22",
+ "@react-aria/landmark": "^3.0.7",
+ "@react-aria/link": "^3.8.6",
+ "@react-aria/listbox": "^3.15.0",
+ "@react-aria/menu": "^3.19.3",
+ "@react-aria/meter": "^3.4.27",
+ "@react-aria/numberfield": "^3.12.2",
+ "@react-aria/overlays": "^3.30.0",
+ "@react-aria/progress": "^3.4.27",
+ "@react-aria/radio": "^3.12.2",
+ "@react-aria/searchfield": "^3.8.9",
+ "@react-aria/select": "^3.17.0",
+ "@react-aria/selection": "^3.26.0",
+ "@react-aria/separator": "^3.4.13",
+ "@react-aria/slider": "^3.8.2",
+ "@react-aria/ssr": "^3.9.10",
+ "@react-aria/switch": "^3.7.8",
+ "@react-aria/table": "^3.17.8",
+ "@react-aria/tabs": "^3.10.8",
+ "@react-aria/tag": "^3.7.2",
+ "@react-aria/textfield": "^3.18.2",
+ "@react-aria/toast": "^3.0.8",
+ "@react-aria/tooltip": "^3.8.8",
+ "@react-aria/tree": "^3.1.4",
+ "@react-aria/utils": "^3.31.0",
+ "@react-aria/visually-hidden": "^3.8.28",
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
"node_modules/react-devtools-core": {
"version": "6.1.5",
"resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz",
@@ -11434,9 +13667,9 @@
}
},
"node_modules/react-native-safe-area-context": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.4.0.tgz",
- "integrity": "sha512-JaEThVyJcLhA+vU0NU8bZ0a1ih6GiF4faZ+ArZLqpYbL6j7R3caRqj+mE3lEtKCuHgwjLg3bCxLL1GPUJZVqUA==",
+ "version": "5.6.2",
+ "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.2.tgz",
+ "integrity": "sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg==",
"license": "MIT",
"peerDependencies": {
"react": "*",
@@ -11458,6 +13691,21 @@
"react-native": "*"
}
},
+ "node_modules/react-native-svg": {
+ "version": "15.14.0",
+ "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.14.0.tgz",
+ "integrity": "sha512-B3gYc7WztcOT4N54AtUutbe0Nuqqh/nkresY0fAXzUHYLsWuIu/yGiCCD3DKfAs6GLv5LFtWTu7N333Q+e3bkg==",
+ "license": "MIT",
+ "dependencies": {
+ "css-select": "^5.1.0",
+ "css-tree": "^1.1.3",
+ "warn-once": "0.1.1"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
+ }
+ },
"node_modules/react-native-toast-message": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/react-native-toast-message/-/react-native-toast-message-2.3.3.tgz",
@@ -11501,9 +13749,9 @@
"license": "MIT"
},
"node_modules/react-native-worklets": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.5.1.tgz",
- "integrity": "sha512-lJG6Uk9YuojjEX/tQrCbcbmpdLCSFxDK1rJlkDhgqkVi1KZzG7cdcBFQRqyNOOzR9Y0CXNuldmtWTGOyM0k0+w==",
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.5.2.tgz",
+ "integrity": "sha512-lCzmuIPAK/UaOJYEPgYpVqrsxby1I54f7PyyZUMEO04nwc00CDrCvv9lCTY1daLHYTF8lS3f9zlzErfVsIKqkA==",
"license": "MIT",
"dependencies": {
"@babel/plugin-transform-arrow-functions": "^7.0.0-0",
@@ -11666,6 +13914,43 @@
}
}
},
+ "node_modules/react-stately": {
+ "version": "3.42.0",
+ "resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.42.0.tgz",
+ "integrity": "sha512-lYt2o1dd6dK8Bb4GRh08RG/2u64bSA1cqtRqtw4jEMgxC7Q17RFcIumBbChErndSdLzafEG/UBwV6shOfig6yw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/calendar": "^3.9.0",
+ "@react-stately/checkbox": "^3.7.2",
+ "@react-stately/collections": "^3.12.8",
+ "@react-stately/color": "^3.9.2",
+ "@react-stately/combobox": "^3.12.0",
+ "@react-stately/data": "^3.14.1",
+ "@react-stately/datepicker": "^3.15.2",
+ "@react-stately/disclosure": "^3.0.8",
+ "@react-stately/dnd": "^3.7.1",
+ "@react-stately/form": "^3.2.2",
+ "@react-stately/list": "^3.13.1",
+ "@react-stately/menu": "^3.9.8",
+ "@react-stately/numberfield": "^3.10.2",
+ "@react-stately/overlays": "^3.6.20",
+ "@react-stately/radio": "^3.11.2",
+ "@react-stately/searchfield": "^3.5.16",
+ "@react-stately/select": "^3.8.0",
+ "@react-stately/selection": "^3.20.6",
+ "@react-stately/slider": "^3.7.2",
+ "@react-stately/table": "^3.15.1",
+ "@react-stately/tabs": "^3.8.6",
+ "@react-stately/toast": "^3.1.2",
+ "@react-stately/toggle": "^3.9.2",
+ "@react-stately/tooltip": "^3.5.8",
+ "@react-stately/tree": "^3.9.3",
+ "@react-types/shared": "^3.32.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
"node_modules/react-style-singleton": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
@@ -11692,6 +13977,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
"integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"pify": "^2.3.0"
@@ -11701,6 +13987,7 @@
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"picomatch": "^2.2.1"
@@ -11852,6 +14139,12 @@
"path-parse": "^1.0.5"
}
},
+ "node_modules/reselect": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz",
+ "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==",
+ "license": "MIT"
+ },
"node_modules/resolve": {
"version": "1.22.11",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
@@ -11941,6 +14234,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
"integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
"license": "MIT",
"engines": {
"iojs": ">=1.0.0",
@@ -11988,6 +14282,7 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
"funding": [
{
"type": "github",
@@ -12873,10 +15168,37 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/tailwind-merge": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-1.14.0.tgz",
+ "integrity": "sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/dcastil"
+ }
+ },
+ "node_modules/tailwind-variants": {
+ "version": "0.1.20",
+ "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-0.1.20.tgz",
+ "integrity": "sha512-AMh7x313t/V+eTySKB0Dal08RHY7ggYK0MSn/ad8wKWOrDUIzyiWNayRUm2PIJ4VRkvRnfNuyRuKbLV3EN+ewQ==",
+ "license": "MIT",
+ "dependencies": {
+ "tailwind-merge": "^1.14.0"
+ },
+ "engines": {
+ "node": ">=16.x",
+ "pnpm": ">=7.x"
+ },
+ "peerDependencies": {
+ "tailwindcss": "*"
+ }
+ },
"node_modules/tailwindcss": {
"version": "3.4.18",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz",
"integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
@@ -13562,6 +15884,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true,
"license": "MIT"
},
"node_modules/utils-merge": {
diff --git a/package.json b/package.json
index a2bcc46..fbce2ca 100644
--- a/package.json
+++ b/package.json
@@ -11,12 +11,18 @@
"lint": "expo lint"
},
"dependencies": {
+ "@expo/html-elements": "^0.10.1",
"@expo/vector-icons": "^15.0.3",
+ "@gluestack-ui/core": "^3.0.12",
+ "@gluestack-ui/utils": "^3.0.11",
+ "@legendapp/motion": "^2.5.3",
"@react-native-async-storage/async-storage": "2.2.0",
"@react-navigation/bottom-tabs": "^7.4.0",
"@react-navigation/elements": "^2.6.3",
"@react-navigation/native": "^7.1.8",
"axios": "^1.13.1",
+ "babel-plugin-module-resolver": "^5.0.2",
+ "dayjs": "^1.11.19",
"eventemitter3": "^5.0.1",
"expo": "~54.0.20",
"expo-constants": "~18.0.10",
@@ -32,17 +38,21 @@
"expo-web-browser": "~15.0.8",
"nativewind": "^4.2.1",
"react": "19.1.0",
+ "react-aria": "^3.44.0",
"react-dom": "19.1.0",
"react-native": "0.81.5",
"react-native-gesture-handler": "~2.28.0",
"react-native-keyboard-aware-scroll-view": "^0.9.5",
"react-native-maps": "^1.20.1",
- "react-native-reanimated": "~4.1.1",
- "react-native-safe-area-context": "5.4.0",
+ "react-native-reanimated": "~4.1.0",
+ "react-native-safe-area-context": "^5.6.2",
"react-native-screens": "~4.16.0",
+ "react-native-svg": "^15.14.0",
"react-native-toast-message": "^2.3.3",
"react-native-web": "~0.21.0",
- "react-native-worklets": "0.5.1",
+ "react-native-worklets": "^0.5.2",
+ "react-stately": "^3.42.0",
+ "tailwind-variants": "^0.1.20",
"zustand": "^5.0.8"
},
"devDependencies": {
@@ -50,7 +60,7 @@
"eslint": "^9.25.0",
"eslint-config-expo": "~10.0.0",
"prettier-plugin-tailwindcss": "^0.5.11",
- "tailwindcss": "^3.4.17",
+ "tailwindcss": "^3.4.18",
"typescript": "~5.9.2"
},
"private": true
diff --git a/services/device_events.ts b/services/device_events.ts
index a91b84a..dcf9279 100644
--- a/services/device_events.ts
+++ b/services/device_events.ts
@@ -31,14 +31,14 @@ const intervals: {
export function getGpsEventBus() {
if (intervals.gps) return;
- console.log("Starting GPS poller");
+ // console.log("Starting GPS poller");
const getGpsData = async () => {
try {
- console.log("GPS: fetching data...");
+ // console.log("GPS: fetching data...");
const resp = await queryGpsData();
if (resp && resp.data) {
- console.log("GPS: emitting data", resp.data);
+ // console.log("GPS: emitting data", resp.data);
eventBus.emit(EVENT_GPS_DATA, resp.data);
} else {
console.log("GPS: no data returned");
@@ -57,16 +57,16 @@ export function getGpsEventBus() {
export function getAlarmEventBus() {
if (intervals.alarm) return;
- console.log("Goi ham get Alarm");
+ // console.log("Goi ham get Alarm");
const getAlarmData = async () => {
try {
- console.log("Alarm: fetching data...");
+ // console.log("Alarm: fetching data...");
const resp = await queryAlarm();
if (resp && resp.data) {
- console.log(
- "Alarm: emitting data",
- resp.data?.alarms?.length ?? resp.data
- );
+ // console.log(
+ // "Alarm: emitting data",
+ // resp.data?.alarms?.length ?? resp.data
+ // );
eventBus.emit(EVENT_ALARM_DATA, resp.data);
} else {
console.log("Alarm: no data returned");
@@ -84,13 +84,13 @@ export function getAlarmEventBus() {
export function getEntitiesEventBus() {
if (intervals.entities) return;
- console.log("Goi ham get Entities");
+ // console.log("Goi ham get Entities");
const getEntitiesData = async () => {
try {
- console.log("Entities: fetching data...");
+ // console.log("Entities: fetching data...");
const resp = await queryEntities();
if (resp && resp.length > 0) {
- console.log("Entities: emitting", resp.length);
+ // console.log("Entities: emitting", resp.length);
eventBus.emit(EVENT_ENTITY_DATA, resp);
} else {
console.log("Entities: no data returned");
@@ -108,13 +108,13 @@ export function getEntitiesEventBus() {
export function getTrackPointsEventBus() {
if (intervals.trackPoints) return;
- console.log("Goi ham get Track Points");
+ // console.log("Goi ham get Track Points");
const getTrackPointsData = async () => {
try {
- console.log("TrackPoints: fetching data...");
+ // console.log("TrackPoints: fetching data...");
const resp = await queryTrackPoints();
if (resp && resp.data && resp.data.length > 0) {
- console.log("TrackPoints: emitting", resp.data.length);
+ // console.log("TrackPoints: emitting", resp.data.length);
eventBus.emit(EVENT_TRACK_POINTS_DATA, resp.data);
} else {
console.log("TrackPoints: no data returned");
@@ -134,10 +134,10 @@ export function getBanzonesEventBus() {
if (intervals.banzones) return;
const getBanzonesData = async () => {
try {
- console.log("Banzones: fetching data...");
+ // console.log("Banzones: fetching data...");
const resp = await queryBanzones();
if (resp && resp.data && resp.data.length > 0) {
- console.log("Banzones: emitting", resp.data.length);
+ // console.log("Banzones: emitting", resp.data.length);
eventBus.emit(EVENT_BANZONE_DATA, resp.data);
} else {
console.log("Banzones: no data returned");
diff --git a/tailwind.config.js b/tailwind.config.js
index f817ed6..940a349 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -1,13 +1,206 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
+ darkMode: process.env.DARK_MODE ? process.env.DARK_MODE : 'class',
content: [
- "./app/**/*.{js,jsx,ts,tsx}",
- "./components/**/*.{js,jsx,ts,tsx}",
- "./screens/**/*.{js,jsx,ts,tsx}",
+ './app/**/*.{html,js,jsx,ts,tsx,mdx}',
+ './components/**/*.{html,js,jsx,ts,tsx,mdx}',
+ './utils/**/*.{html,js,jsx,ts,tsx,mdx}',
+ './*.{html,js,jsx,ts,tsx,mdx}',
+ './src/**/*.{html,js,jsx,ts,tsx,mdx}',
+ ],
+ presets: [require('nativewind/preset')],
+ important: 'html',
+ safelist: [
+ {
+ pattern:
+ /(bg|border|text|stroke|fill)-(primary|secondary|tertiary|error|success|warning|info|typography|outline|background|indicator)-(0|50|100|200|300|400|500|600|700|800|900|950|white|gray|black|error|warning|muted|success|info|light|dark|primary)/,
+ },
],
- presets: [require("nativewind/preset")],
theme: {
- extend: {},
+ extend: {
+ colors: {
+ primary: {
+ 0: 'rgb(var(--color-primary-0)/)',
+ 50: 'rgb(var(--color-primary-50)/)',
+ 100: 'rgb(var(--color-primary-100)/)',
+ 200: 'rgb(var(--color-primary-200)/)',
+ 300: 'rgb(var(--color-primary-300)/)',
+ 400: 'rgb(var(--color-primary-400)/)',
+ 500: 'rgb(var(--color-primary-500)/)',
+ 600: 'rgb(var(--color-primary-600)/)',
+ 700: 'rgb(var(--color-primary-700)/)',
+ 800: 'rgb(var(--color-primary-800)/)',
+ 900: 'rgb(var(--color-primary-900)/)',
+ 950: 'rgb(var(--color-primary-950)/)',
+ },
+ secondary: {
+ 0: 'rgb(var(--color-secondary-0)/)',
+ 50: 'rgb(var(--color-secondary-50)/)',
+ 100: 'rgb(var(--color-secondary-100)/)',
+ 200: 'rgb(var(--color-secondary-200)/)',
+ 300: 'rgb(var(--color-secondary-300)/)',
+ 400: 'rgb(var(--color-secondary-400)/)',
+ 500: 'rgb(var(--color-secondary-500)/)',
+ 600: 'rgb(var(--color-secondary-600)/)',
+ 700: 'rgb(var(--color-secondary-700)/)',
+ 800: 'rgb(var(--color-secondary-800)/)',
+ 900: 'rgb(var(--color-secondary-900)/)',
+ 950: 'rgb(var(--color-secondary-950)/)',
+ },
+ tertiary: {
+ 50: 'rgb(var(--color-tertiary-50)/)',
+ 100: 'rgb(var(--color-tertiary-100)/)',
+ 200: 'rgb(var(--color-tertiary-200)/)',
+ 300: 'rgb(var(--color-tertiary-300)/)',
+ 400: 'rgb(var(--color-tertiary-400)/)',
+ 500: 'rgb(var(--color-tertiary-500)/)',
+ 600: 'rgb(var(--color-tertiary-600)/)',
+ 700: 'rgb(var(--color-tertiary-700)/)',
+ 800: 'rgb(var(--color-tertiary-800)/)',
+ 900: 'rgb(var(--color-tertiary-900)/)',
+ 950: 'rgb(var(--color-tertiary-950)/)',
+ },
+ error: {
+ 0: 'rgb(var(--color-error-0)/)',
+ 50: 'rgb(var(--color-error-50)/)',
+ 100: 'rgb(var(--color-error-100)/)',
+ 200: 'rgb(var(--color-error-200)/)',
+ 300: 'rgb(var(--color-error-300)/)',
+ 400: 'rgb(var(--color-error-400)/)',
+ 500: 'rgb(var(--color-error-500)/)',
+ 600: 'rgb(var(--color-error-600)/)',
+ 700: 'rgb(var(--color-error-700)/)',
+ 800: 'rgb(var(--color-error-800)/)',
+ 900: 'rgb(var(--color-error-900)/)',
+ 950: 'rgb(var(--color-error-950)/)',
+ },
+ success: {
+ 0: 'rgb(var(--color-success-0)/)',
+ 50: 'rgb(var(--color-success-50)/)',
+ 100: 'rgb(var(--color-success-100)/)',
+ 200: 'rgb(var(--color-success-200)/)',
+ 300: 'rgb(var(--color-success-300)/)',
+ 400: 'rgb(var(--color-success-400)/)',
+ 500: 'rgb(var(--color-success-500)/)',
+ 600: 'rgb(var(--color-success-600)/)',
+ 700: 'rgb(var(--color-success-700)/)',
+ 800: 'rgb(var(--color-success-800)/)',
+ 900: 'rgb(var(--color-success-900)/)',
+ 950: 'rgb(var(--color-success-950)/)',
+ },
+ warning: {
+ 0: 'rgb(var(--color-warning-0)/)',
+ 50: 'rgb(var(--color-warning-50)/)',
+ 100: 'rgb(var(--color-warning-100)/)',
+ 200: 'rgb(var(--color-warning-200)/)',
+ 300: 'rgb(var(--color-warning-300)/)',
+ 400: 'rgb(var(--color-warning-400)/)',
+ 500: 'rgb(var(--color-warning-500)/)',
+ 600: 'rgb(var(--color-warning-600)/)',
+ 700: 'rgb(var(--color-warning-700)/)',
+ 800: 'rgb(var(--color-warning-800)/)',
+ 900: 'rgb(var(--color-warning-900)/)',
+ 950: 'rgb(var(--color-warning-950)/)',
+ },
+ info: {
+ 0: 'rgb(var(--color-info-0)/)',
+ 50: 'rgb(var(--color-info-50)/)',
+ 100: 'rgb(var(--color-info-100)/)',
+ 200: 'rgb(var(--color-info-200)/)',
+ 300: 'rgb(var(--color-info-300)/)',
+ 400: 'rgb(var(--color-info-400)/)',
+ 500: 'rgb(var(--color-info-500)/)',
+ 600: 'rgb(var(--color-info-600)/)',
+ 700: 'rgb(var(--color-info-700)/)',
+ 800: 'rgb(var(--color-info-800)/)',
+ 900: 'rgb(var(--color-info-900)/)',
+ 950: 'rgb(var(--color-info-950)/)',
+ },
+ typography: {
+ 0: 'rgb(var(--color-typography-0)/)',
+ 50: 'rgb(var(--color-typography-50)/)',
+ 100: 'rgb(var(--color-typography-100)/)',
+ 200: 'rgb(var(--color-typography-200)/)',
+ 300: 'rgb(var(--color-typography-300)/)',
+ 400: 'rgb(var(--color-typography-400)/)',
+ 500: 'rgb(var(--color-typography-500)/)',
+ 600: 'rgb(var(--color-typography-600)/)',
+ 700: 'rgb(var(--color-typography-700)/)',
+ 800: 'rgb(var(--color-typography-800)/)',
+ 900: 'rgb(var(--color-typography-900)/)',
+ 950: 'rgb(var(--color-typography-950)/)',
+ white: '#FFFFFF',
+ gray: '#D4D4D4',
+ black: '#181718',
+ },
+ outline: {
+ 0: 'rgb(var(--color-outline-0)/)',
+ 50: 'rgb(var(--color-outline-50)/)',
+ 100: 'rgb(var(--color-outline-100)/)',
+ 200: 'rgb(var(--color-outline-200)/)',
+ 300: 'rgb(var(--color-outline-300)/)',
+ 400: 'rgb(var(--color-outline-400)/)',
+ 500: 'rgb(var(--color-outline-500)/)',
+ 600: 'rgb(var(--color-outline-600)/)',
+ 700: 'rgb(var(--color-outline-700)/)',
+ 800: 'rgb(var(--color-outline-800)/)',
+ 900: 'rgb(var(--color-outline-900)/)',
+ 950: 'rgb(var(--color-outline-950)/)',
+ },
+ background: {
+ 0: 'rgb(var(--color-background-0)/)',
+ 50: 'rgb(var(--color-background-50)/)',
+ 100: 'rgb(var(--color-background-100)/)',
+ 200: 'rgb(var(--color-background-200)/)',
+ 300: 'rgb(var(--color-background-300)/)',
+ 400: 'rgb(var(--color-background-400)/)',
+ 500: 'rgb(var(--color-background-500)/)',
+ 600: 'rgb(var(--color-background-600)/)',
+ 700: 'rgb(var(--color-background-700)/)',
+ 800: 'rgb(var(--color-background-800)/)',
+ 900: 'rgb(var(--color-background-900)/)',
+ 950: 'rgb(var(--color-background-950)/)',
+ error: 'rgb(var(--color-background-error)/)',
+ warning: 'rgb(var(--color-background-warning)/)',
+ muted: 'rgb(var(--color-background-muted)/)',
+ success: 'rgb(var(--color-background-success)/)',
+ info: 'rgb(var(--color-background-info)/)',
+ light: '#FBFBFB',
+ dark: '#181719',
+ },
+ indicator: {
+ primary: 'rgb(var(--color-indicator-primary)/)',
+ info: 'rgb(var(--color-indicator-info)/)',
+ error: 'rgb(var(--color-indicator-error)/)',
+ },
+ },
+ fontFamily: {
+ heading: undefined,
+ body: undefined,
+ mono: undefined,
+ jakarta: ['var(--font-plus-jakarta-sans)'],
+ roboto: ['var(--font-roboto)'],
+ code: ['var(--font-source-code-pro)'],
+ inter: ['var(--font-inter)'],
+ 'space-mono': ['var(--font-space-mono)'],
+ },
+ fontWeight: {
+ extrablack: '950',
+ },
+ fontSize: {
+ '2xs': '10px',
+ },
+ boxShadow: {
+ 'hard-1': '-2px 2px 8px 0px rgba(38, 38, 38, 0.20)',
+ 'hard-2': '0px 3px 10px 0px rgba(38, 38, 38, 0.20)',
+ 'hard-3': '2px 2px 8px 0px rgba(38, 38, 38, 0.20)',
+ 'hard-4': '0px -3px 10px 0px rgba(38, 38, 38, 0.20)',
+ 'hard-5': '0px 2px 10px 0px rgba(38, 38, 38, 0.10)',
+ 'soft-1': '0px 0px 10px rgba(38, 38, 38, 0.1)',
+ 'soft-2': '0px 0px 20px rgba(38, 38, 38, 0.2)',
+ 'soft-3': '0px 0px 30px rgba(38, 38, 38, 0.1)',
+ 'soft-4': '0px 0px 40px rgba(38, 38, 38, 0.1)',
+ },
+ },
},
- plugins: [],
};
diff --git a/tsconfig.json b/tsconfig.json
index 02ffa44..4991823 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -6,6 +6,9 @@
"paths": {
"@/*": [
"./*"
+ ],
+ "tailwind.config": [
+ "./tailwind.config.js"
]
}
},
diff --git a/utils/geom.ts b/utils/geom.ts
index a27b720..6590f20 100644
--- a/utils/geom.ts
+++ b/utils/geom.ts
@@ -86,3 +86,25 @@ export const getBanzoneNameByType = (type: number) => {
return "Chưa có";
}
};
+
+export const convertToDMS = (value: number, isLat: boolean): string => {
+ const deg = Math.floor(Math.abs(value));
+ const minFloat = (Math.abs(value) - deg) * 60;
+ const min = Math.floor(minFloat);
+ const sec = (minFloat - min) * 60;
+
+ const direction = value >= 0 ? (isLat ? "N" : "E") : isLat ? "S" : "W";
+
+ return `${deg}°${min}'${sec.toFixed(2)}"${direction}`;
+};
+
+
+/**
+ * Chuyển đổi tốc độ từ km/h sang knot (hải lý/giờ)
+ * @param kmh - tốc độ tính bằng km/h
+ * @returns tốc độ tính bằng knot
+ */
+export function kmhToKnot(kmh: number): number {
+ const KNOT_PER_KMH = 1 / 1.852; // 1 knot = 1.852 km/h
+ return parseFloat((kmh * KNOT_PER_KMH).toFixed(2)); // làm tròn 2 chữ số thập phân
+}
diff --git a/utils/sosUtils.ts b/utils/sosUtils.ts
new file mode 100644
index 0000000..abf473a
--- /dev/null
+++ b/utils/sosUtils.ts
@@ -0,0 +1,91 @@
+/**
+ * Định nghĩa cấu trúc cho mỗi lý do cần hỗ trợ/SOS
+ */
+interface SosMessage {
+ ma: number; // Mã số thứ tự của lý do
+ moTa: string; // Mô tả ngắn gọn về sự cố
+ mucDoNghiemTrong: string;
+ chiTiet: string; // Chi tiết sự cố
+}
+
+/**
+ * Mảng 10 lý do phát tín hiệu SOS/Yêu cầu trợ giúp trên biển
+ * Sắp xếp từ nhẹ (yêu cầu hỗ trợ) đến nặng (SOS khẩn cấp)
+ */
+export const sosMessage: SosMessage[] = [
+ {
+ ma: 11,
+ moTa: "Tình huống khẩn cấp, không kịp chọn !!!",
+ mucDoNghiemTrong: "Nguy Hiem Can Ke (SOS)",
+ chiTiet:
+ "Tình huống nghiêm trọng nhất, đe dọa trực tiếp đến tính mạng tất cả người trên tàu.",
+ },
+ {
+ ma: 1,
+ moTa: "Hỏng hóc động cơ không tự khắc phục được",
+ mucDoNghiemTrong: "Nhe",
+ chiTiet: "Tàu bị trôi hoặc mắc cạn nhẹ; cần tàu lai hoặc thợ máy.",
+ },
+ {
+ ma: 2,
+ moTa: "Thiếu nhiên liệu/thực phẩm/nước uống nghiêm trọng",
+ mucDoNghiemTrong: "Nhe",
+ chiTiet:
+ "Dự trữ thiết yếu cạn kiệt do hành trình kéo dài không lường trước được.",
+ },
+ {
+ ma: 3,
+ moTa: "Sự cố y tế không nguy hiểm đến tính mạng",
+ mucDoNghiemTrong: "Trung Binh",
+ chiTiet:
+ "Cần chăm sóc y tế chuyên nghiệp khẩn cấp (ví dụ: gãy xương, viêm ruột thừa).",
+ },
+ {
+ ma: 4,
+ moTa: "Hỏng hóc thiết bị định vị/thông tin liên lạc chính",
+ mucDoNghiemTrong: "Trung Binh",
+ chiTiet: "Mất khả năng xác định vị trí hoặc liên lạc, tăng rủi ro bị lạc.",
+ },
+ {
+ ma: 5,
+ moTa: "Thời tiết cực đoan sắp tới không kịp trú ẩn",
+ mucDoNghiemTrong: "Trung Binh",
+ chiTiet:
+ "Tàu không kịp chạy vào nơi trú ẩn an toàn trước cơn bão lớn hoặc gió giật mạnh.",
+ },
+ {
+ ma: 6,
+ moTa: "Va chạm gây hư hỏng cấu trúc",
+ mucDoNghiemTrong: "Nang",
+ chiTiet:
+ "Tàu bị hư hại một phần do va chạm, cần kiểm tra và hỗ trợ lai dắt khẩn cấp.",
+ },
+ {
+ ma: 7,
+ moTa: "Có cháy/hỏa hoạn trên tàu không kiểm soát được",
+ mucDoNghiemTrong: "Nang",
+ chiTiet:
+ "Lửa bùng phát vượt quá khả năng chữa cháy của tàu, nguy cơ cháy lan.",
+ },
+ {
+ ma: 8,
+ moTa: "Tàu bị thủng/nước vào không kiểm soát được",
+ mucDoNghiemTrong: "Rat Nang",
+ chiTiet:
+ "Nước tràn vào khoang quá nhanh, vượt quá khả năng bơm tát, đe dọa tàu chìm.",
+ },
+ {
+ ma: 9,
+ moTa: "Sự cố y tế nguy hiểm đến tính mạng (MEDEVAC)",
+ mucDoNghiemTrong: "Rat Nang",
+ chiTiet:
+ "Thương tích/bệnh tật nghiêm trọng, cần sơ tán y tế (MEDEVAC) ngay lập tức bằng trực thăng/tàu cứu hộ.",
+ },
+ {
+ ma: 10,
+ moTa: "Tàu bị chìm/lật úp hoàn toàn hoặc sắp xảy ra",
+ mucDoNghiemTrong: "Nguy Hiem Can Ke (SOS)",
+ chiTiet:
+ "Tình huống nghiêm trọng nhất, đe dọa trực tiếp đến tính mạng tất cả người trên tàu.",
+ },
+];