diff --git a/apps/web/app/dashboard/analytics/page.tsx b/apps/web/app/dashboard/analytics/page.tsx
index a9fa7d3..56eb7ea 100644
--- a/apps/web/app/dashboard/analytics/page.tsx
+++ b/apps/web/app/dashboard/analytics/page.tsx
@@ -3,6 +3,7 @@ import AnalyticsView from "@/components/dashboard/analytics/AnalyticsView";
export default async function AnalyticsPage() {
+
return (
);
diff --git a/apps/web/app/dashboard/day/[dateQuery]/page.tsx b/apps/web/app/dashboard/day/[dateQuery]/page.tsx
index dab9ace..a31f34e 100644
--- a/apps/web/app/dashboard/day/[dateQuery]/page.tsx
+++ b/apps/web/app/dashboard/day/[dateQuery]/page.tsx
@@ -31,7 +31,7 @@ export default async function DayPage({ params }: { params: { dateQuery: string
}
return (
- <>
+
{
day == undefined ?
:
@@ -39,6 +39,6 @@ export default async function DayPage({ params }: { params: { dateQuery: string
day={day}
/>
}
- >
+
);
}
diff --git a/apps/web/app/dashboard/layout.tsx b/apps/web/app/dashboard/layout.tsx
index 477aba8..c19d006 100644
--- a/apps/web/app/dashboard/layout.tsx
+++ b/apps/web/app/dashboard/layout.tsx
@@ -29,7 +29,7 @@ export default async function Dashboard({
{modal}
- {children}
+ {children}
diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx
index 794e7f2..65d9c96 100644
--- a/apps/web/app/layout.tsx
+++ b/apps/web/app/layout.tsx
@@ -1,6 +1,9 @@
+
import type { Metadata } from "next";
import { Inter } from "next/font/google";
+import "@mantine/core/styles.css";
+import "@mantine/dates/styles.css";
import "@lifetracker/tailwind-config/globals.css";
import type { Viewport } from "next";
diff --git a/apps/web/components/dashboard/analytics/AnalyticsView.tsx b/apps/web/components/dashboard/analytics/AnalyticsView.tsx
index 95414a7..13a926b 100644
--- a/apps/web/components/dashboard/analytics/AnalyticsView.tsx
+++ b/apps/web/components/dashboard/analytics/AnalyticsView.tsx
@@ -1,32 +1,179 @@
"use client";
import LoadingSpinner from "@/components/ui/spinner";
import { api } from "@/lib/trpc";
+import { use, useEffect, useRef, useState } from "react";
+import spacetime from "spacetime";
+import { predefinedRanges } from "@/lib/dates";
+import { useSearchParams } from "next/navigation";
+import { parseISO, format as fmt } from "date-fns";
+import { DatePickerInput } from '@mantine/dates';
+import { Calendar1, MenuIcon } from "lucide-react";
+import { Anchor, Button, Menu } from "@mantine/core";
+import { useTooltip, useTooltipInPortal, defaultStyles } from '@visx/tooltip';
+import PieChart from "./PieChart";
+
+const parseDateRangeFromQuery = (): Date[] | undefined => {
+ const searchParams = useSearchParams();
+ if (!searchParams.has("dateRange")) return undefined;
+
+ const range = searchParams.get("dateRange")!
+ .split(",")
+ .map((date) => parseISO(date));
+ return range;
+
+}
+
+const updateHistory = (dateRange: Date[]) => {
+ const start = dateRange[0];
+ const end = dateRange[1];
+ const startStr = spacetime(start).format("iso-short");
+ const endStr = spacetime(end).format("iso-short");
+ const searchParams = new URLSearchParams();
+ searchParams.set("dateRange", `${startStr},${endStr}`);
+ history.replaceState(null, "", `?${searchParams.toString()}`);
+};
export default function AnalyticsView() {
+ const datePickerRef = useRef(null);
const { data: metrics } = api.metrics.list.useQuery();
-
const drugsList = metrics?.filter((metric) => metric.type === "drug");
- const timeSinceDrug = drugsList?.map((drug) => {
- console.log(api.measurements.timeSinceLastMeasurement.useQuery({ metricId: drug.id! }));
- return drug.name;
+
+ const initialDateRange: [Date, Date] = (() => {
+ const range = parseDateRangeFromQuery();
+ if (range && range.length === 2) {
+ return range as [Date, Date];
+ }
+ return [
+ // spacetime.now().subtract(1, "week").toNativeDate(),
+ spacetime.now().toNativeDate(),
+ spacetime.now().toNativeDate()
+ ];
+ })();
+
+ const [dateRange, setDateRange] = useState(initialDateRange);
+ const [datePickerRange, setDatePickerRange] = useState(initialDateRange);
+
+ useEffect(() => {
+ if (datePickerRef.current?.getAttribute("aria-expanded") === "false") {
+ setDateRange(datePickerRange);
+ updateHistory(datePickerRange);
+ }
+ }, [datePickerRange]);
+
+ const { containerRef, TooltipInPortal } = useTooltipInPortal({
+ // TooltipInPortal is rendered in a separate child of and positioned
+ // with page coordinates which should be updated on scroll. consider using
+ // Tooltip or TooltipWithBounds if you don't need to render inside a Portal
+ scroll: true,
});
- console.log(timeSinceDrug);
+
+ const categoryFrequencies = api.hours.categoryFrequencies.useQuery({
+ dateRange,
+ }).data ?? [];
+
+ console.log(categoryFrequencies);
return (
-
-
Drugs
-
- {
- !drugsList ?
:
-
- {drugsList.map((drug) => (
- -
- {drug.name}:
-
+
+
+
Analytics
+ {/*
{
+ if (fmt(value[0], format) === fmt(value[1], format)) {
+ return fmt(value[0], format);
+ }
+ return `${fmt(value[0], format)} - ${fmt(value[1], format)}`;
+ }}
+ /> */}
+
+
}
+ leftSectionPointerEvents="none"
+ />
+
+
+
+
+
+
+ {
+ categoryFrequencies
+ .sort((a, b) => b.count - a.count)
+ .map((category, i) => (
+
+
+
+ {category.categoryName}
+
+
+ {category.count} hours
+
+ ))
+ }
+
+
+
+
+
Drugs
+
+ {
+ !drugsList ?
:
+
+ {drugsList.map((drug) => (
+ -
+ {drug.name}:
+
+ ))}
+
+ }
+
);
diff --git a/apps/web/components/dashboard/analytics/BarStackChart.tsx b/apps/web/components/dashboard/analytics/BarStackChart.tsx
new file mode 100644
index 0000000..42c8421
--- /dev/null
+++ b/apps/web/components/dashboard/analytics/BarStackChart.tsx
@@ -0,0 +1,207 @@
+import React from 'react';
+import { BarStack } from '@visx/shape';
+import { SeriesPoint } from '@visx/shape/lib/types';
+import { Group } from '@visx/group';
+import { Grid } from '@visx/grid';
+import { AxisBottom } from '@visx/axis';
+import cityTemperature, { CityTemperature } from '@visx/mock-data/lib/mocks/cityTemperature';
+import { scaleBand, scaleLinear, scaleOrdinal } from '@visx/scale';
+import { timeParse, timeFormat } from '@visx/vendor/d3-time-format';
+import { useTooltip, useTooltipInPortal, defaultStyles } from '@visx/tooltip';
+import { LegendOrdinal } from '@visx/legend';
+import { localPoint } from '@visx/event';
+
+type CityName = 'New York' | 'San Francisco' | 'Austin';
+
+type TooltipData = {
+ bar: SeriesPoint;
+ key: CityName;
+ index: number;
+ height: number;
+ width: number;
+ x: number;
+ y: number;
+ color: string;
+};
+
+export type BarStackProps = {
+ width: number;
+ height: number;
+ margin?: { top: number; right: number; bottom: number; left: number };
+ events?: boolean;
+};
+
+const purple1 = '#6c5efb';
+const purple2 = '#c998ff';
+export const purple3 = '#a44afe';
+export const background = 'transparent';
+const defaultMargin = { top: 40, right: 0, bottom: 0, left: 0 };
+const tooltipStyles = {
+ ...defaultStyles,
+ minWidth: 60,
+ backgroundColor: 'rgba(0,0,0,0.9)',
+ color: 'white',
+};
+
+const data = cityTemperature.slice(0, 12);
+const keys = Object.keys(data[0]).filter((d) => d !== 'date') as CityName[];
+
+const temperatureTotals = data.reduce((allTotals, currentDate) => {
+ const totalTemperature = keys.reduce((dailyTotal, k) => {
+ dailyTotal += Number(currentDate[k]);
+ return dailyTotal;
+ }, 0);
+ allTotals.push(totalTemperature);
+ return allTotals;
+}, [] as number[]);
+
+const parseDate = timeParse('%Y-%m-%d');
+const format = timeFormat('%b %d');
+const formatDate = (date: string) => format(parseDate(date) as Date);
+
+// accessors
+const getDate = (d: CityTemperature) => d.date;
+
+// scales
+const dateScale = scaleBand({
+ domain: data.map(getDate),
+ padding: 0.2,
+});
+const temperatureScale = scaleLinear({
+ domain: [0, Math.max(...temperatureTotals)],
+ nice: true,
+});
+const colorScale = scaleOrdinal({
+ domain: keys,
+ range: [purple1, purple2, purple3],
+});
+
+let tooltipTimeout: number;
+
+console.log(cityTemperature);
+
+export default function BarStackChart({
+ width,
+ height,
+ events = false,
+ margin = defaultMargin,
+}: BarStackProps) {
+ const { tooltipOpen, tooltipLeft, tooltipTop, tooltipData, hideTooltip, showTooltip } =
+ useTooltip();
+
+ const { containerRef, TooltipInPortal } = useTooltipInPortal({
+ // TooltipInPortal is rendered in a separate child of and positioned
+ // with page coordinates which should be updated on scroll. consider using
+ // Tooltip or TooltipWithBounds if you don't need to render inside a Portal
+ scroll: true,
+ });
+
+ if (width < 10) return null;
+ // bounds
+ const xMax = width;
+ const yMax = height - margin.top - 100;
+
+ dateScale.rangeRound([0, xMax]);
+ temperatureScale.range([yMax, 0]);
+
+ return width < 10 ? null : (
+
+
+
+
+
+
+ {tooltipOpen && tooltipData && (
+
+
+ {tooltipData.key}
+
+ {tooltipData.bar.data[tooltipData.key]}℉
+
+ {formatDate(getDate(tooltipData.bar.data))}
+
+
+ )}
+
+ );
+}
diff --git a/apps/web/components/dashboard/analytics/PieChart.tsx b/apps/web/components/dashboard/analytics/PieChart.tsx
new file mode 100644
index 0000000..8d72761
--- /dev/null
+++ b/apps/web/components/dashboard/analytics/PieChart.tsx
@@ -0,0 +1,148 @@
+import React, { useState } from 'react';
+import Pie, { ProvidedProps, PieArcDatum } from '@visx/shape/lib/shapes/Pie';
+import { scaleOrdinal } from '@visx/scale';
+import { Group } from '@visx/group';
+import { animated, useTransition, interpolate } from '@react-spring/web';
+import LoadingSpinner from '@/components/ui/spinner';
+
+// accessor functions
+const frequency = (c) => c.percentage;
+
+const defaultMargin = { top: 20, right: 20, bottom: 20, left: 20 };
+
+export type PieProps = {
+ data: any
+ width: number;
+ height: number;
+ margin?: typeof defaultMargin;
+ animate?: boolean;
+};
+
+export default function PieChart({
+ data,
+ width,
+ height,
+ margin = defaultMargin,
+ animate = true,
+}: PieProps) {
+ if (width < 10) return null;
+
+ const innerWidth = width - margin.left - margin.right;
+ const innerHeight = height - margin.top - margin.bottom;
+ const radius = Math.min(innerWidth, innerHeight) / 2;
+ const centerY = innerHeight / 2;
+ const centerX = innerWidth / 2;
+
+ // console.log(data);
+
+ return data.length == 0 ? : (
+
+ );
+}
+
+// react-spring transition definitions
+type AnimatedStyles = { startAngle: number; endAngle: number; opacity: number };
+
+const fromLeaveTransition = ({ endAngle }: PieArcDatum) => ({
+ // enter from 360° if end angle is > 180°
+ startAngle: endAngle > Math.PI ? 2 * Math.PI : 0,
+ endAngle: endAngle > Math.PI ? 2 * Math.PI : 0,
+ opacity: 0,
+});
+const enterUpdateTransition = ({ startAngle, endAngle }: PieArcDatum) => ({
+ startAngle,
+ endAngle,
+ opacity: 1,
+});
+
+type AnimatedPieProps = ProvidedProps & {
+ animate?: boolean;
+ getKey: (d: PieArcDatum) => string;
+ getColor: (d: PieArcDatum) => string;
+ onClickDatum: (d: PieArcDatum) => void;
+ delay?: number;
+};
+
+function AnimatedPie({
+ animate,
+ arcs,
+ path,
+ getKey,
+ getColor,
+ onClickDatum,
+}: AnimatedPieProps) {
+ const transitions = useTransition, AnimatedStyles>(arcs, {
+ from: animate ? fromLeaveTransition : enterUpdateTransition,
+ enter: enterUpdateTransition,
+ update: enterUpdateTransition,
+ leave: animate ? fromLeaveTransition : enterUpdateTransition,
+ keys: getKey,
+ });
+ return transitions((props, arc, { key }) => {
+ const [centroidX, centroidY] = path.centroid(arc);
+ const hasSpaceForLabel = arc.endAngle - arc.startAngle >= 0.1;
+
+ return (
+
+
+ path({
+ ...arc,
+ startAngle,
+ endAngle,
+ }),
+ )}
+ fill={getColor(arc)}
+ onClick={() => onClickDatum(arc)}
+ onTouchStart={() => onClickDatum(arc)}
+ />
+ {hasSpaceForLabel && false && (
+
+
+ {getKey(arc)}
+
+
+ )}
+
+ );
+ });
+
+ function getForeground(arc: PieArcDatum) {
+ return arc.data.categoryForeground;
+ }
+
+}
diff --git a/apps/web/lib/dates.ts b/apps/web/lib/dates.ts
new file mode 100644
index 0000000..a936241
--- /dev/null
+++ b/apps/web/lib/dates.ts
@@ -0,0 +1,29 @@
+import addDays from "date-fns/addDays";
+
+export const predefinedRanges = [
+ {
+ label: 'Today',
+ value: [new Date(), new Date()],
+ placement: 'left'
+ },
+ {
+ label: 'Yesterday',
+ value: [addDays(new Date(), -1), addDays(new Date(), -1)],
+ placement: 'left'
+ },
+ {
+ label: 'Last 7 Days',
+ value: [addDays(new Date(), -7), new Date()],
+ placement: 'left'
+ },
+ {
+ label: 'Last 30 Days',
+ value: [addDays(new Date(), -30), new Date()],
+ placement: 'left'
+ },
+ {
+ label: 'Year to Date',
+ value: [new Date(new Date().getFullYear(), 0, 1), new Date()],
+ placement: 'left'
+ }
+];
diff --git a/apps/web/lib/providers.tsx b/apps/web/lib/providers.tsx
index 039d580..9e052f5 100644
--- a/apps/web/lib/providers.tsx
+++ b/apps/web/lib/providers.tsx
@@ -5,6 +5,9 @@ import type { Session } from "next-auth";
import React, { useState } from "react";
import { ThemeProvider } from "@/components/theme-provider";
import { TooltipProvider } from "@/components/ui/tooltip";
+
+import { DatesProvider } from "@mantine/dates";
+
import { UserLocalSettingsCtx } from "@/lib/userLocalSettings/bookmarksLayout";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { httpBatchLink, loggerLink } from "@trpc/client";
@@ -15,6 +18,7 @@ import type { ClientConfig } from "@lifetracker/shared/config";
import { ClientConfigCtx } from "./clientConfig";
import { api } from "./trpc";
+import { MantineProvider } from "@mantine/core";
function makeQueryClient() {
return new QueryClient({
@@ -87,9 +91,11 @@ export default function Providers({
enableSystem
disableTransitionOnChange
>
-
- {children}
-
+
+
+ {children}
+
+
diff --git a/apps/web/package.json b/apps/web/package.json
index 7fbe8a8..8a96700 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -25,6 +25,9 @@
"@lifetracker/shared": "workspace:^0.1.0",
"@lifetracker/shared-react": "workspace:^0.1.0",
"@lifetracker/trpc": "workspace:^",
+ "@mantine/core": "^7.16.0",
+ "@mantine/dates": "^7.16.0",
+ "@mantine/hooks": "^7.16.0",
"@radix-ui/react-collapsible": "^1.0.3",
"@radix-ui/react-dialog": "^1.0.5",
"@radix-ui/react-dropdown-menu": "^2.0.6",
@@ -39,6 +42,7 @@
"@radix-ui/react-toast": "^1.1.5",
"@radix-ui/react-toggle": "^1.0.3",
"@radix-ui/react-tooltip": "^1.0.7",
+ "@react-spring/web": "^9.7.5",
"@svgr/webpack": "^8.1.0",
"@tanstack/react-query": "^5.24.8",
"@tanstack/react-query-devtools": "^5.21.0",
@@ -46,6 +50,18 @@
"@trpc/react-query": "11.0.0-next-beta.308",
"@trpc/server": "11.0.0-next-beta.308",
"@types/formidable": "^3.4.5",
+ "@visx/axis": "^3.12.0",
+ "@visx/event": "^3.12.0",
+ "@visx/gradient": "^3.12.0",
+ "@visx/grid": "^3.12.0",
+ "@visx/group": "^3.12.0",
+ "@visx/legend": "^3.12.0",
+ "@visx/mock-data": "^3.12.0",
+ "@visx/responsive": "^3.12.0",
+ "@visx/scale": "^3.12.0",
+ "@visx/shape": "^3.12.0",
+ "@visx/tooltip": "^3.12.0",
+ "@visx/vendor": "^3.12.0",
"better-sqlite3": "^11.3.0",
"cheerio": "^1.0.0",
"class-variance-authority": "^0.7.0",
@@ -53,7 +69,7 @@
"color-2-name": "^1.4.4",
"csv-parse": "^5.5.6",
"date-fns": "^4.1.0",
- "dayjs": "^1.11.10",
+ "dayjs": "^1.11.13",
"drizzle-orm": "^0.33.0",
"fastest-levenshtein": "^1.0.16",
"formidable": "^3.5.2",
@@ -78,6 +94,7 @@
"remark-breaks": "^4.0.0",
"remark-gfm": "^4.0.0",
"request-ip": "^3.3.0",
+ "rsuite": "^5.76.3",
"sharp": "^0.33.3",
"spacetime": "^7.6.2",
"superjson": "^2.2.1",
diff --git a/packages/shared-react/hooks/categories.ts b/packages/shared-react/hooks/categories.ts
index 4177e11..497108a 100644
--- a/packages/shared-react/hooks/categories.ts
+++ b/packages/shared-react/hooks/categories.ts
@@ -1,50 +1,10 @@
+import { ZCategories } from "../../shared/types/categories";
import { api } from "../trpc";
-export function useUpdateLabel(
- ...opts: Parameters
+export function getCategoryFrequencies(
+ dateRange: [Date, Date]
) {
- const apiUtils = api.useUtils();
-
- return api.tags.update.useMutation({
- ...opts[0],
- onSuccess: (res, req, meta) => {
- apiUtils.labels.list.invalidate();
- apiUtils.labels.get.invalidate({ labelId: res.id });
- // apiUtils.bookmarks.getBookmarks.invalidate({
- // labelId: res.id;
-
- // TODO: Maybe we can only look at the cache and invalidate only affected bookmarks
- // apiUtils.bookmarks.getBookmark.invalidate();
- return opts[0]?.onSuccess?.(res, req, meta);
- },
- });
-}
-
-export function useDeleteLabel(
- ...opts: Parameters
-) {
- const apiUtils = api.useUtils();
-
- return api.labels.delete.useMutation({
- ...opts[0],
- onSuccess: (res, req, meta) => {
- apiUtils.labels.list.invalidate();
- // apiUtils.bookmarks.getBookmark.invalidate();
- return opts[0]?.onSuccess?.(res, req, meta);
- },
- });
-}
-
-export function useDeleteUnusedTags(
- ...opts: Parameters
-) {
- const apiUtils = api.useUtils();
-
- return api.tags.deleteUnused.useMutation({
- ...opts[0],
- onSuccess: (res, req, meta) => {
- apiUtils.tags.list.invalidate();
- return opts[0]?.onSuccess?.(res, req, meta);
- },
- });
-}
+ return api.hours.categoryFrequencies.useQuery({
+ dateRange,
+ }).data ?? [];
+}
\ No newline at end of file
diff --git a/packages/tailwind-config/globals.css b/packages/tailwind-config/globals.css
index 3b3664e..c704703 100644
--- a/packages/tailwind-config/globals.css
+++ b/packages/tailwind-config/globals.css
@@ -84,4 +84,17 @@
.select-wrapper {
color: black !important;
}
+
+
+ h1 {
+ @apply text-2xl mt-2 mb-8 font-bold;
+ }
+
+ h2 {
+ @apply text-xl font-bold;
+ }
+}
+
+.rs-calendar-body span {
+ color: gray !important;
}
\ No newline at end of file
diff --git a/packages/trpc/routers/categories.ts b/packages/trpc/routers/categories.ts
index fd6a2b0..4f276cc 100644
--- a/packages/trpc/routers/categories.ts
+++ b/packages/trpc/routers/categories.ts
@@ -71,31 +71,6 @@ async function createCategory(
}
export const categoriesAppRouter = router({
- categoryStats: authedProcedure
- .output(
- z.record(
- z.string(),
- z.object({
- numEntries: z.number(),
- }),
- ),
- )
- .query(async ({ ctx }) => {
- const [categoryIds] = await Promise.all([
- ctx.db.select({ id: categories.id }).from(categories)
- ]);
-
- const results: Record<
- string,
- { numEntries: number }
- > = {};
- for (const category of categoryIds) {
- results[category.id] = {
- numEntries: 3330,
- };
- }
- return results;
- }),
list: authedProcedure
.output(
z.object({
diff --git a/packages/trpc/routers/hours.ts b/packages/trpc/routers/hours.ts
index 9c9490b..8e36290 100644
--- a/packages/trpc/routers/hours.ts
+++ b/packages/trpc/routers/hours.ts
@@ -9,10 +9,12 @@ import {
} from "@lifetracker/shared/types/days";
import type { Context } from "../index";
import { authedProcedure, router } from "../index";
-import { format } from "date-fns";
+import { addDays, format, parseISO } from "date-fns";
import { TZDate } from "@date-fns/tz";
import { dateFromInput } from "@lifetracker/shared/utils/days";
import { BetterSQLite3Database } from "drizzle-orm/better-sqlite3";
+import { zCategorySchema } from "@lifetracker/shared/types/categories";
+import spacetime from "spacetime";
export async function hourColors(hour: ZHour, ctx: Context) {
const categoryColor = await ctx.db.select()
@@ -83,6 +85,20 @@ export async function hourJoinsQuery(
};
+function listOfDates(dateRange: [Date, Date]) {
+ const [start, end] = dateRange.map((date) => dateFromInput({
+ dateQuery: spacetime(date, "UTC").goto("UTC").format("iso-short"),
+ timezone: "Etc/UTC"
+ }));
+ const dates = [];
+ let currentDate = parseISO(start);
+ while (currentDate <= parseISO(end)) {
+ dates.push(format(currentDate, "yyyy-MM-dd"));
+ currentDate = addDays(currentDate, 1);
+ }
+ return dates.length === 0 ? parseISO(start) : dates;
+}
+
export const hoursAppRouter = router({
get: authedProcedure
@@ -172,4 +188,69 @@ export const hoursAppRouter = router({
return hourJoinsQuery(ctx, input.dayId, input.hourTime);
}),
+
+ categoryFrequencies: authedProcedure
+ .input(z.object({
+ dateRange: z.tuple([z.date(), z.date()])
+ }))
+ .output(z.array(z.object(
+ {
+ count: z.number(),
+ date: z.string(),
+ time: z.number(),
+ categoryName: z.string(),
+ categoryCode: z.number(),
+ categoryDescription: z.string(),
+ categoryColor: z.string(),
+ categoryForeground: z.string(),
+ percentage: z.number()
+ }
+ )))
+ .query(async ({ input, ctx }) => {
+ const hoursList = (await ctx.db.select({
+ date: days.date,
+ time: hours.time,
+ categoryName: categories.name,
+ categoryCode: categories.code,
+ categoryDescription: categories.description,
+ categoryColor: colors.hexcode,
+ categoryForeground: colors.inverse,
+ })
+ .from(hours)
+ .leftJoin(days, eq(days.id, hours.dayId))
+ .leftJoin(categories, eq(categories.id, hours.categoryId))
+ .leftJoin(colors, eq(colors.id, categories.colorId))
+ .where(and(
+ eq(hours.userId, ctx.user!.id),
+ inArray(days.date, listOfDates(input.dateRange))
+ ))).filter(h => h.categoryCode != null);
+
+ // Count total hours in the filtered range
+ const totalHours = hoursList.length;
+
+ console.log(hoursList);
+
+ // Group hours by category and count occurrences
+ const categoriesList = {};
+ hoursList.forEach(h => {
+ if (!categoriesList[h.categoryCode]) {
+ categoriesList[h.categoryCode] = {
+ count: 0,
+ ...h
+ };
+ }
+ const old = (categoriesList[h.categoryCode].count);
+ categoriesList[h.categoryCode].count = old + 1;
+ });
+ // Calculate percentages
+ const categoryPercentages: any = Object.keys(categoriesList).map(categoryCode => {
+ const count = categoriesList[categoryCode].count;
+ const percentage = (count / totalHours);
+ return {
+ ...categoriesList[categoryCode],
+ percentage: percentage
+ };
+ });
+ return categoryPercentages;
+ }),
});
diff --git a/packages/trpc/routers/measurements.ts b/packages/trpc/routers/measurements.ts
index c45adca..fd2f531 100644
--- a/packages/trpc/routers/measurements.ts
+++ b/packages/trpc/routers/measurements.ts
@@ -172,7 +172,7 @@ export const measurementsAppRouter = router({
const lastMeasurement = await ctx.db.select().from(measurements).where(and(
eq(measurements.metricId, input.metricId),
eq(measurements.userId, ctx.user.id),
- )).orderBy(desc(measurements.createdAt)).limit(1);
+ )).orderBy(desc(measurements)).limit(1);
if (lastMeasurement[0]) {
const lastMeasurementTime = new Date(lastMeasurement[0].createdAt).getTime();
const currentTime = new Date().getTime();
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 5583613..b7601b9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -181,6 +181,15 @@ importers:
'@lifetracker/trpc':
specifier: workspace:^
version: link:../../packages/trpc
+ '@mantine/core':
+ specifier: ^7.16.0
+ version: 7.16.0(@mantine/hooks@7.16.0(react@18.3.1))(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@mantine/dates':
+ specifier: ^7.16.0
+ version: 7.16.0(@mantine/core@7.16.0(@mantine/hooks@7.16.0(react@18.3.1))(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.16.0(react@18.3.1))(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@mantine/hooks':
+ specifier: ^7.16.0
+ version: 7.16.0(react@18.3.1)
'@radix-ui/react-collapsible':
specifier: ^1.0.3
version: 1.1.1(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -223,6 +232,9 @@ importers:
'@radix-ui/react-tooltip':
specifier: ^1.0.7
version: 1.1.4(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@react-spring/web':
+ specifier: ^9.7.5
+ version: 9.7.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@svgr/webpack':
specifier: ^8.1.0
version: 8.1.0(typescript@5.6.3)
@@ -244,6 +256,42 @@ importers:
'@types/formidable':
specifier: ^3.4.5
version: 3.4.5
+ '@visx/axis':
+ specifier: ^3.12.0
+ version: 3.12.0(react@18.3.1)
+ '@visx/event':
+ specifier: ^3.12.0
+ version: 3.12.0
+ '@visx/gradient':
+ specifier: ^3.12.0
+ version: 3.12.0(react@18.3.1)
+ '@visx/grid':
+ specifier: ^3.12.0
+ version: 3.12.0(react@18.3.1)
+ '@visx/group':
+ specifier: ^3.12.0
+ version: 3.12.0(react@18.3.1)
+ '@visx/legend':
+ specifier: ^3.12.0
+ version: 3.12.0(react@18.3.1)
+ '@visx/mock-data':
+ specifier: ^3.12.0
+ version: 3.12.0
+ '@visx/responsive':
+ specifier: ^3.12.0
+ version: 3.12.0(react@18.3.1)
+ '@visx/scale':
+ specifier: ^3.12.0
+ version: 3.12.0
+ '@visx/shape':
+ specifier: ^3.12.0
+ version: 3.12.0(react@18.3.1)
+ '@visx/tooltip':
+ specifier: ^3.12.0
+ version: 3.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@visx/vendor':
+ specifier: ^3.12.0
+ version: 3.12.0
better-sqlite3:
specifier: ^11.3.0
version: 11.5.0
@@ -266,7 +314,7 @@ importers:
specifier: ^4.1.0
version: 4.1.0
dayjs:
- specifier: ^1.11.10
+ specifier: ^1.11.13
version: 1.11.13
drizzle-orm:
specifier: ^0.33.0
@@ -279,16 +327,16 @@ importers:
version: 3.5.2
lucide-react:
specifier: latest
- version: 0.468.0(react@18.3.1)
+ version: 0.473.0(react@18.3.1)
next:
specifier: latest
- version: 15.1.0(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ version: 15.1.5(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next-auth:
specifier: ^4.24.5
- version: 4.24.10(next@15.1.0(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ version: 4.24.10(next@15.1.5(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next-pwa:
specifier: ^5.6.0
- version: 5.6.0(@babel/core@7.26.0)(@types/babel__core@7.20.5)(next@15.1.0(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(webpack@5.95.0)
+ version: 5.6.0(@babel/core@7.26.0)(@types/babel__core@7.20.5)(next@15.1.5(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(webpack@5.95.0)
next-themes:
specifier: ^0.3.0
version: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -340,6 +388,9 @@ importers:
request-ip:
specifier: ^3.3.0
version: 3.3.0
+ rsuite:
+ specifier: ^5.76.3
+ version: 5.76.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
sharp:
specifier: ^0.33.3
version: 0.33.5
@@ -2865,6 +2916,12 @@ packages:
react: '>=16.8.0'
react-dom: '>=16.8.0'
+ '@floating-ui/react@0.26.28':
+ resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
'@floating-ui/utils@0.2.8':
resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==}
@@ -3096,9 +3153,33 @@ packages:
'@jridgewell/trace-mapping@0.3.9':
resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+ '@juggle/resize-observer@3.4.0':
+ resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==}
+
'@leichtgewicht/ip-codec@2.0.5':
resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==}
+ '@mantine/core@7.16.0':
+ resolution: {integrity: sha512-lYYwa4Itz77uC8zQzdiKiKdz9Q01NBOYPZsotIKsP/Zqij0qhpsVxoJ8MK3P8IqFyLfThTMmR4sT1qlGfLTA9Q==}
+ peerDependencies:
+ '@mantine/hooks': 7.16.0
+ react: ^18.x || ^19.x
+ react-dom: ^18.x || ^19.x
+
+ '@mantine/dates@7.16.0':
+ resolution: {integrity: sha512-BVPA/3itdAjuX11GMebeS1c5VNruwkkRhCUVVv1F4lBhZqSeL/d8yPb8Iyfdw0tMGIkdxHKT9winG+bXAoF0Kw==}
+ peerDependencies:
+ '@mantine/core': 7.16.0
+ '@mantine/hooks': 7.16.0
+ dayjs: '>=1.0.0'
+ react: ^18.x || ^19.x
+ react-dom: ^18.x || ^19.x
+
+ '@mantine/hooks@7.16.0':
+ resolution: {integrity: sha512-8KxrhckesbrV6tyOndm6fJ+jSKA4KX/67ppDFlfYMMbV6Yh+s0zRO4KLi2uCtl6tgckQd2/zDzX3kQk+VYKqDA==}
+ peerDependencies:
+ react: ^18.x || ^19.x
+
'@mdx-js/mdx@3.0.1':
resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==}
@@ -3114,56 +3195,56 @@ packages:
'@microsoft/tsdoc@0.14.2':
resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==}
- '@next/env@15.1.0':
- resolution: {integrity: sha512-UcCO481cROsqJuszPPXJnb7GGuLq617ve4xuAyyNG4VSSocJNtMU5Fsx+Lp6mlN8c7W58aZLc5y6D/2xNmaK+w==}
+ '@next/env@15.1.5':
+ resolution: {integrity: sha512-jg8ygVq99W3/XXb9Y6UQsritwhjc+qeiO7QrGZRYOfviyr/HcdnhdBQu4gbp2rBIh2ZyBYTBMWbPw3JSCb0GHw==}
'@next/eslint-plugin-next@14.2.6':
resolution: {integrity: sha512-d3+p4AjIYmhqzYHhhmkRYYN6ZU35TwZAKX08xKRfnHkz72KhWL2kxMFsDptpZs5e8bBGdepn7vn1+9DaF8iX+A==}
- '@next/swc-darwin-arm64@15.1.0':
- resolution: {integrity: sha512-ZU8d7xxpX14uIaFC3nsr4L++5ZS/AkWDm1PzPO6gD9xWhFkOj2hzSbSIxoncsnlJXB1CbLOfGVN4Zk9tg83PUw==}
+ '@next/swc-darwin-arm64@15.1.5':
+ resolution: {integrity: sha512-5ttHGE75Nw9/l5S8zR2xEwR8OHEqcpPym3idIMAZ2yo+Edk0W/Vf46jGqPOZDk+m/SJ+vYZDSuztzhVha8rcdA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@next/swc-darwin-x64@15.1.0':
- resolution: {integrity: sha512-DQ3RiUoW2XC9FcSM4ffpfndq1EsLV0fj0/UY33i7eklW5akPUCo6OX2qkcLXZ3jyPdo4sf2flwAED3AAq3Om2Q==}
+ '@next/swc-darwin-x64@15.1.5':
+ resolution: {integrity: sha512-8YnZn7vDURUUTInfOcU5l0UWplZGBqUlzvqKKUFceM11SzfNEz7E28E1Arn4/FsOf90b1Nopboy7i7ufc4jXag==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@next/swc-linux-arm64-gnu@15.1.0':
- resolution: {integrity: sha512-M+vhTovRS2F//LMx9KtxbkWk627l5Q7AqXWWWrfIzNIaUFiz2/NkOFkxCFyNyGACi5YbA8aekzCLtbDyfF/v5Q==}
+ '@next/swc-linux-arm64-gnu@15.1.5':
+ resolution: {integrity: sha512-rDJC4ctlYbK27tCyFUhgIv8o7miHNlpCjb2XXfTLQszwAUOSbcMN9q2y3urSrrRCyGVOd9ZR9a4S45dRh6JF3A==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-arm64-musl@15.1.0':
- resolution: {integrity: sha512-Qn6vOuwaTCx3pNwygpSGtdIu0TfS1KiaYLYXLH5zq1scoTXdwYfdZtwvJTpB1WrLgiQE2Ne2kt8MZok3HlFqmg==}
+ '@next/swc-linux-arm64-musl@15.1.5':
+ resolution: {integrity: sha512-FG5RApf4Gu+J+pHUQxXPM81oORZrKBYKUaBTylEIQ6Lz17hKVDsLbSXInfXM0giclvXbyiLXjTv42sQMATmZ0A==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-x64-gnu@15.1.0':
- resolution: {integrity: sha512-yeNh9ofMqzOZ5yTOk+2rwncBzucc6a1lyqtg8xZv0rH5znyjxHOWsoUtSq4cUTeeBIiXXX51QOOe+VoCjdXJRw==}
+ '@next/swc-linux-x64-gnu@15.1.5':
+ resolution: {integrity: sha512-NX2Ar3BCquAOYpnoYNcKz14eH03XuF7SmSlPzTSSU4PJe7+gelAjxo3Y7F2m8+hLT8ZkkqElawBp7SWBdzwqQw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-linux-x64-musl@15.1.0':
- resolution: {integrity: sha512-t9IfNkHQs/uKgPoyEtU912MG6a1j7Had37cSUyLTKx9MnUpjj+ZDKw9OyqTI9OwIIv0wmkr1pkZy+3T5pxhJPg==}
+ '@next/swc-linux-x64-musl@15.1.5':
+ resolution: {integrity: sha512-EQgqMiNu3mrV5eQHOIgeuh6GB5UU57tu17iFnLfBEhYfiOfyK+vleYKh2dkRVkV6ayx3eSqbIYgE7J7na4hhcA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-win32-arm64-msvc@15.1.0':
- resolution: {integrity: sha512-WEAoHyG14t5sTavZa1c6BnOIEukll9iqFRTavqRVPfYmfegOAd5MaZfXgOGG6kGo1RduyGdTHD4+YZQSdsNZXg==}
+ '@next/swc-win32-arm64-msvc@15.1.5':
+ resolution: {integrity: sha512-HPULzqR/VqryQZbZME8HJE3jNFmTGcp+uRMHabFbQl63TtDPm+oCXAz3q8XyGv2AoihwNApVlur9Up7rXWRcjg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@next/swc-win32-x64-msvc@15.1.0':
- resolution: {integrity: sha512-J1YdKuJv9xcixzXR24Dv+4SaDKc2jj31IVUEMdO5xJivMTXuE6MAdIi4qPjSymHuFG8O5wbfWKnhJUcHHpj5CA==}
+ '@next/swc-win32-x64-msvc@15.1.5':
+ resolution: {integrity: sha512-n74fUb/Ka1dZSVYfjwQ+nSJ+ifUff7jGurFcTuJNKZmI62FFOxQXUYit/uZXPTj2cirm1rvGWHG2GhbSol5Ikw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@@ -3767,6 +3848,33 @@ packages:
'@types/react':
optional: true
+ '@react-spring/animated@9.7.5':
+ resolution: {integrity: sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+
+ '@react-spring/core@9.7.5':
+ resolution: {integrity: sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+
+ '@react-spring/rafz@9.7.5':
+ resolution: {integrity: sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==}
+
+ '@react-spring/shared@9.7.5':
+ resolution: {integrity: sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+
+ '@react-spring/types@9.7.5':
+ resolution: {integrity: sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==}
+
+ '@react-spring/web@9.7.5':
+ resolution: {integrity: sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+
'@rnx-kit/chromium-edge-launcher@1.0.0':
resolution: {integrity: sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==}
engines: {node: '>=14.15'}
@@ -3889,6 +3997,15 @@ packages:
cpu: [x64]
os: [win32]
+ '@rsuite/icon-font@4.1.0':
+ resolution: {integrity: sha512-q0Y+uQCVvzhD6lFeAFrvCDd1lTjZfM6MIaBjre3lSW1w586VWbuFnhTiqos3v9HIMlUpm3aAsxd3SuM6gYaqqQ==}
+
+ '@rsuite/icons@1.3.0':
+ resolution: {integrity: sha512-6yv2CQjtQGgSCkMw1wlVlmPFEKBTU9AFFFxPJbAI2V4kS9lZEHqhY+jmVSAdbC7rmawO5r2ROzGMJpvkpRCnUw==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
'@rushstack/eslint-patch@1.5.1':
resolution: {integrity: sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==}
@@ -4125,6 +4242,42 @@ packages:
resolution: {integrity: sha512-3PoFyWeuFGqale09vFydLQ6IGdvD+mizcXcB8s6ImWv+830IF0HckvewgcGVfGnTFImqvfvhpYZYod2QqGGGdg==}
deprecated: This is a stub types definition. csv-parse provides its own type definitions, so you do not need this installed.
+ '@types/d3-array@3.0.3':
+ resolution: {integrity: sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ==}
+
+ '@types/d3-color@3.1.0':
+ resolution: {integrity: sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==}
+
+ '@types/d3-delaunay@6.0.1':
+ resolution: {integrity: sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==}
+
+ '@types/d3-format@3.0.1':
+ resolution: {integrity: sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==}
+
+ '@types/d3-geo@3.1.0':
+ resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==}
+
+ '@types/d3-interpolate@3.0.1':
+ resolution: {integrity: sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==}
+
+ '@types/d3-path@1.0.11':
+ resolution: {integrity: sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw==}
+
+ '@types/d3-random@2.2.3':
+ resolution: {integrity: sha512-Ghs4R3CcgJ3o6svszRzIH4b8PPYex/COo+rhhZjDAs+bVducXwjmVSi27WcDOaLLCBV2t3tfVH9bYXAL76IvQA==}
+
+ '@types/d3-scale@4.0.2':
+ resolution: {integrity: sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA==}
+
+ '@types/d3-shape@1.3.12':
+ resolution: {integrity: sha512-8oMzcd4+poSLGgV0R1Q1rOlx/xdmozS4Xab7np0eamFFUYq71AU9pOCJEFnkXW2aI/oXdVYJzw6pssbSut7Z9Q==}
+
+ '@types/d3-time-format@2.1.0':
+ resolution: {integrity: sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA==}
+
+ '@types/d3-time@3.0.0':
+ resolution: {integrity: sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==}
+
'@types/debug@4.1.12':
resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
@@ -4158,6 +4311,9 @@ packages:
'@types/formidable@3.4.5':
resolution: {integrity: sha512-s7YPsNVfnsng5L8sKnG/Gbb2tiwwJTY1conOkJzTMRvJAlLFW1nEua+ADsJQu8N1c0oTHx9+d5nqg10WuT9gHQ==}
+ '@types/geojson@7946.0.15':
+ resolution: {integrity: sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==}
+
'@types/glob@7.2.0':
resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==}
@@ -4209,6 +4365,9 @@ packages:
'@types/json5@0.0.29':
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+ '@types/lodash@4.17.14':
+ resolution: {integrity: sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==}
+
'@types/mdast@4.0.4':
resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
@@ -4272,6 +4431,9 @@ packages:
'@types/react-transition-group@4.4.11':
resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==}
+ '@types/react-window@1.8.8':
+ resolution: {integrity: sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==}
+
'@types/react@18.2.61':
resolution: {integrity: sha512-NURTN0qNnJa7O/k4XUkEW2yfygA+NxS0V5h1+kp9jPwhzZy95q3ADoGMP0+JypMhrZBTTgjKAUlTctde1zzeQA==}
@@ -4512,6 +4674,76 @@ packages:
typescript:
optional: true
+ '@visx/axis@3.12.0':
+ resolution: {integrity: sha512-8MoWpfuaJkhm2Yg+HwyytK8nk+zDugCqTT/tRmQX7gW4LYrHYLXFUXOzbDyyBakCVaUbUaAhVFxpMASJiQKf7A==}
+ peerDependencies:
+ react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0
+
+ '@visx/bounds@3.12.0':
+ resolution: {integrity: sha512-peAlNCUbYaaZ0IO6c1lDdEAnZv2iGPDiLIM8a6gu7CaMhtXZJkqrTh+AjidNcIqITktrICpGxJE/Qo9D099dvQ==}
+ peerDependencies:
+ react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0
+ react-dom: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0
+
+ '@visx/curve@3.12.0':
+ resolution: {integrity: sha512-Ng1mefXIzoIoAivw7dJ+ZZYYUbfuwXgZCgQynShr6ZIVw7P4q4HeQfJP3W24ON+1uCSrzoycHSXRelhR9SBPcw==}
+
+ '@visx/event@3.12.0':
+ resolution: {integrity: sha512-9Lvw6qJ0Fi+y1vsC1WspfdIKCxHTb7oy59Uql1uBdPGT8zChP0vuxW0jQNQRDbKgoefj4pCXAFi8+MF1mEtVTw==}
+
+ '@visx/gradient@3.12.0':
+ resolution: {integrity: sha512-QRatjjdUEPbcp4pqRca1JlChpAnmmIAO3r3ZscLK7D1xEIANlIjzjl3uNgrmseYmBAYyPCcJH8Zru07R97ovOg==}
+ peerDependencies:
+ react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0
+
+ '@visx/grid@3.12.0':
+ resolution: {integrity: sha512-L4ex2ooSYhwNIxJ3XFIKRhoSvEGjPc2Y3YCrtNB4TV5Ofdj4q0UMOsxfrH23Pr8HSHuQhb6VGMgYoK0LuWqDmQ==}
+ peerDependencies:
+ react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0
+
+ '@visx/group@3.12.0':
+ resolution: {integrity: sha512-Dye8iS1alVXPv7nj/7M37gJe6sSKqJLH7x6sEWAsRQ9clI0kFvjbKcKgF+U3aAVQr0NCohheFV+DtR8trfK/Ag==}
+ peerDependencies:
+ react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0
+
+ '@visx/legend@3.12.0':
+ resolution: {integrity: sha512-Tr6hdauEDXRXVNeNgIQ9JtCCrxn8Fbr8UCVlO9XsSxenk2hBC/2PIY5QPzpnKFEEEuH/C8vhj8T0JfFZV+D9zQ==}
+ peerDependencies:
+ react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0
+
+ '@visx/mock-data@3.12.0':
+ resolution: {integrity: sha512-HI8LKdO3sU2tIBv16ZYRTc2JYsu0Ai/hQc7YUOBqbjhXUW993iCBe98pAgEdHDrSWqK2yvXY4En5ceBTAP34Jw==}
+
+ '@visx/point@3.12.0':
+ resolution: {integrity: sha512-I6UrHoJAEVbx3RORQNupgTiX5EzjuZpiwLPxn8L2mI5nfERotPKi1Yus12Cq2WtXqEBR/WgqTnoImlqOXBykcA==}
+
+ '@visx/responsive@3.12.0':
+ resolution: {integrity: sha512-GV1BTYwAGlk/K5c9vH8lS2syPnTuIqEacI7L6LRPbsuaLscXMNi+i9fZyzo0BWvAdtRV8v6Urzglo++lvAXT1Q==}
+ peerDependencies:
+ react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0
+
+ '@visx/scale@3.12.0':
+ resolution: {integrity: sha512-+ubijrZ2AwWCsNey0HGLJ0YKNeC/XImEFsr9rM+Uef1CM3PNM43NDdNTrdBejSlzRq0lcfQPWYMYQFSlkLcPOg==}
+
+ '@visx/shape@3.12.0':
+ resolution: {integrity: sha512-/1l0lrpX9tPic6SJEalryBKWjP/ilDRnQA+BGJTI1tj7i23mJ/J0t4nJHyA1GrL4QA/bM/qTJ35eyz5dEhJc4g==}
+ peerDependencies:
+ react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0
+
+ '@visx/text@3.12.0':
+ resolution: {integrity: sha512-0rbDYQlbuKPhBqXkkGYKFec1gQo05YxV45DORzr6hCyaizdJk1G+n9VkuKSHKBy1vVQhBA0W3u/WXd7tiODQPA==}
+ peerDependencies:
+ react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0
+
+ '@visx/tooltip@3.12.0':
+ resolution: {integrity: sha512-pWhsYhgl0Shbeqf80qy4QCB6zpq6tQtMQQxKlh3UiKxzkkfl+Metaf9p0/S0HexNi4vewOPOo89xWx93hBeh3A==}
+ peerDependencies:
+ react: ^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0
+ react-dom: ^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0
+
+ '@visx/vendor@3.12.0':
+ resolution: {integrity: sha512-SVO+G0xtnL9dsNpGDcjCgoiCnlB3iLSM9KLz1sLbSrV7RaVXwY3/BTm2X9OWN1jH2a9M+eHt6DJ6sE6CXm4cUg==}
+
'@vitest/expect@1.6.0':
resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==}
@@ -5000,6 +5232,9 @@ packages:
bail@2.0.2:
resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+ balanced-match@0.4.2:
+ resolution: {integrity: sha512-STw03mQKnGUYtoNjmowo4F2cRmIIxYEGiMsjjwla/u5P1lxadj/05WkNaFjNiKTgJkj8KiXbgAiRTmcQRwQNtg==}
+
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@@ -5342,6 +5577,9 @@ packages:
class-variance-authority@0.7.0:
resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==}
+ classnames@2.5.1:
+ resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==}
+
clean-css@5.3.3:
resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==}
engines: {node: '>= 10.0'}
@@ -5777,6 +6015,51 @@ packages:
csv-parse@5.5.6:
resolution: {integrity: sha512-uNpm30m/AGSkLxxy7d9yRXpJQFrZzVWLFBkS+6ngPcZkw/5k3L/jjFuj7tVnEpRn+QgmiXr21nDlhCiUK4ij2A==}
+ d3-array@3.2.1:
+ resolution: {integrity: sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ==}
+ engines: {node: '>=12'}
+
+ d3-color@3.1.0:
+ resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
+ engines: {node: '>=12'}
+
+ d3-delaunay@6.0.2:
+ resolution: {integrity: sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==}
+ engines: {node: '>=12'}
+
+ d3-format@3.1.0:
+ resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==}
+ engines: {node: '>=12'}
+
+ d3-geo@3.1.0:
+ resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==}
+ engines: {node: '>=12'}
+
+ d3-interpolate@3.0.1:
+ resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
+ engines: {node: '>=12'}
+
+ d3-path@1.0.9:
+ resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==}
+
+ d3-random@2.2.2:
+ resolution: {integrity: sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw==}
+
+ d3-scale@4.0.2:
+ resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
+ engines: {node: '>=12'}
+
+ d3-shape@1.3.7:
+ resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==}
+
+ d3-time-format@4.1.0:
+ resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==}
+ engines: {node: '>=12'}
+
+ d3-time@3.1.0:
+ resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==}
+ engines: {node: '>=12'}
+
dag-map@1.0.2:
resolution: {integrity: sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==}
@@ -5799,6 +6082,10 @@ packages:
resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==}
engines: {node: '>= 0.4'}
+ date-fns@2.30.0:
+ resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
+ engines: {node: '>=0.11'}
+
date-fns@4.1.0:
resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==}
@@ -5927,6 +6214,9 @@ packages:
resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==}
engines: {node: '>=10'}
+ delaunator@5.0.1:
+ resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==}
+
delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
@@ -6028,6 +6318,9 @@ packages:
dom-helpers@5.2.1:
resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
+ dom-lib@3.3.2:
+ resolution: {integrity: sha512-ux0wcf6lggOCcJ6O3Q3mewbCOM/CL9f6+NXmxaWsF0/AKCvFNbfdmmqNnMG7cMVupCr9VeFEYWspSAD9WT/6gA==}
+
dom-serializer@1.4.1:
resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
@@ -7041,6 +7334,10 @@ packages:
resolution: {integrity: sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==}
engines: {node: '>= 14'}
+ get-value@3.0.1:
+ resolution: {integrity: sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==}
+ engines: {node: '>=6.0'}
+
getenv@1.0.0:
resolution: {integrity: sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==}
engines: {node: '>=6'}
@@ -7541,6 +7838,10 @@ packages:
resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
engines: {node: '>= 0.4'}
+ internmap@2.0.3:
+ resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
+ engines: {node: '>=12'}
+
interpret@1.4.0:
resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==}
engines: {node: '>= 0.10'}
@@ -7774,6 +8075,10 @@ packages:
resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
engines: {node: '>=0.10.0'}
+ is-primitive@3.0.1:
+ resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==}
+ engines: {node: '>=0.10.0'}
+
is-reference@3.0.2:
resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==}
@@ -8349,10 +8654,10 @@ packages:
resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
engines: {node: '>=12'}
- lucide-react@0.468.0:
- resolution: {integrity: sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA==}
+ lucide-react@0.473.0:
+ resolution: {integrity: sha512-KW6u5AKeIjkvrxXZ6WuCu9zHE/gEYSXCay+Gre2ZoInD0Je/e3RBtP4OHpJVJ40nDklSvjVKjgH7VU8/e2dzRw==}
peerDependencies:
- react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
magic-string@0.25.9:
resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
@@ -8388,6 +8693,9 @@ packages:
marky@1.2.5:
resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==}
+ math-expression-evaluator@1.4.0:
+ resolution: {integrity: sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw==}
+
md5-file@3.2.3:
resolution: {integrity: sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw==}
engines: {node: '>=0.10'}
@@ -8899,8 +9207,8 @@ packages:
react: ^16.8 || ^17 || ^18
react-dom: ^16.8 || ^17 || ^18
- next@15.1.0:
- resolution: {integrity: sha512-QKhzt6Y8rgLNlj30izdMbxAwjHMFANnLwDwZ+WQh5sMhyt4lEBqDK9QpvWHtIM4rINKPoJ8aiRZKg5ULSybVHw==}
+ next@15.1.5:
+ resolution: {integrity: sha512-Cf/TEegnt01hn3Hoywh6N8fvkhbOuChO4wFje24+a86wKOubgVaWkDqxGVgoWlz2Hp9luMJ9zw3epftujdnUOg==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
hasBin: true
peerDependencies:
@@ -10016,6 +10324,9 @@ packages:
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+ react-is@17.0.2:
+ resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
+
react-is@18.3.1:
resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
@@ -10083,6 +10394,12 @@ packages:
'@types/react':
optional: true
+ react-number-format@5.4.3:
+ resolution: {integrity: sha512-VCY5hFg/soBighAoGcdE+GagkJq0230qN6jcS5sp8wQX1qy1fYN/RX7/BXkrs0oyzzwqR8/+eSUrqXbGeywdUQ==}
+ peerDependencies:
+ react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
react-refresh@0.14.2:
resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
engines: {node: '>=0.10.0'}
@@ -10097,6 +10414,16 @@ packages:
'@types/react':
optional: true
+ react-remove-scroll-bar@2.3.8:
+ resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
react-remove-scroll@2.6.0:
resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==}
engines: {node: '>=10'}
@@ -10107,6 +10434,16 @@ packages:
'@types/react':
optional: true
+ react-remove-scroll@2.6.2:
+ resolution: {integrity: sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
react-router-config@5.1.1:
resolution: {integrity: sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==}
peerDependencies:
@@ -10139,11 +10476,27 @@ packages:
'@types/react':
optional: true
+ react-style-singleton@2.2.3:
+ resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
react-syntax-highlighter@15.6.1:
resolution: {integrity: sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==}
peerDependencies:
react: '>= 0.14.0'
+ react-textarea-autosize@8.5.6:
+ resolution: {integrity: sha512-aT3ioKXMa8f6zHYGebhbdMD2L00tKeRX1zuVuDx9YQK/JLLRSaSxq3ugECEmUB9z2kvk6bFSIoRHLkkUv0RJiw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
react-timezone-select@3.2.8:
resolution: {integrity: sha512-efEIVmYAHtm+oS+YlE/9DbieMka1Lop0v1LsW1TdLq0yCBnnAzROKDUY09CICY8TCijZlo0fk+wHZZkV5NpVNw==}
peerDependencies:
@@ -10157,6 +10510,24 @@ packages:
react: '>=16.6.0'
react-dom: '>=16.6.0'
+ react-use-measure@2.1.1:
+ resolution: {integrity: sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==}
+ peerDependencies:
+ react: '>=16.13'
+ react-dom: '>=16.13'
+
+ react-use-set@1.0.0:
+ resolution: {integrity: sha512-6BBbOcWc/tOKuwd9gDtdunvOr/g40S0SkCBYvrSJvpI0upzNlHmLoeDvylnoP8PrjQXItClAFxseVGGhEkk7kw==}
+ peerDependencies:
+ react: '>=16.8.0'
+
+ react-window@1.8.11:
+ resolution: {integrity: sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ==}
+ engines: {node: '>8.0.0'}
+ peerDependencies:
+ react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
react@18.2.0:
resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
engines: {node: '>=0.10.0'}
@@ -10205,6 +10576,12 @@ packages:
resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==}
engines: {node: '>=6.0.0'}
+ reduce-css-calc@1.3.0:
+ resolution: {integrity: sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA==}
+
+ reduce-function-call@1.0.3:
+ resolution: {integrity: sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==}
+
reflect.getprototypeof@1.0.4:
resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==}
engines: {node: '>= 0.4'}
@@ -10412,6 +10789,9 @@ packages:
deprecated: Rimraf versions prior to v4 are no longer supported
hasBin: true
+ robust-predicates@3.0.2:
+ resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==}
+
rollup-plugin-terser@7.0.2:
resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==}
deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser
@@ -10428,6 +10808,19 @@ packages:
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
+ rsuite-table@5.19.1:
+ resolution: {integrity: sha512-PsG+z3GfwywDvPVEjZYVZcel0M6zOBAx2HKTgYLfct/yAzXJWPgW/eVuv9+8KmkcKzAh03UVYQdB88Gp7+RlGg==}
+ peerDependencies:
+ prop-types: ^15.7.2
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ rsuite@5.76.3:
+ resolution: {integrity: sha512-AEpsW/NQALJtvkt9rtqB/Hw+L04ZqgyM9522bdEM2slHbrbWslvSN83tZuG26Ep5cmEDUCOrtNxiX9o9EvAaJw==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
rtl-detect@1.1.2:
resolution: {integrity: sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==}
@@ -10491,6 +10884,9 @@ packages:
scheduler@0.24.0-canary-efb381bbf-20230505:
resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==}
+ schema-typed@2.2.2:
+ resolution: {integrity: sha512-hRmqKr5V6UyhmZ0FixRVetgxvudRPjDynVZZRNq6t4EZHii7U33vmqd9uap3s4aqBcDg1JtubMNvCEmsZTpm3Q==}
+
schema-utils@2.7.0:
resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==}
engines: {node: '>= 8.9.0'}
@@ -10590,6 +10986,10 @@ packages:
resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
engines: {node: '>= 0.4'}
+ set-value@4.1.0:
+ resolution: {integrity: sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==}
+ engines: {node: '>=11.0'}
+
setimmediate@1.0.5:
resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
@@ -10988,9 +11388,11 @@ packages:
sudo-prompt@8.2.5:
resolution: {integrity: sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==}
+ deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
sudo-prompt@9.1.1:
resolution: {integrity: sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==}
+ deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
superjson@2.2.1:
resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==}
@@ -11031,6 +11433,9 @@ packages:
resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==}
engines: {node: ^14.18.0 || >=16.0.0}
+ tabbable@6.2.0:
+ resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
+
table@6.8.2:
resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==}
engines: {node: '>=10.0.0'}
@@ -11387,6 +11792,10 @@ packages:
resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
engines: {node: '>=12.20'}
+ type-fest@4.32.0:
+ resolution: {integrity: sha512-rfgpoi08xagF3JSdtJlCwMq9DGNDE0IMh3Mkpc1wUypg9vPi786AiqeBBKcqvIkq42azsBM85N490fyZjeUftw==}
+ engines: {node: '>=16'}
+
type-is@1.6.18:
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
engines: {node: '>= 0.6'}
@@ -11603,6 +12012,25 @@ packages:
'@types/react':
optional: true
+ use-callback-ref@1.3.3:
+ resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ use-composed-ref@1.4.0:
+ resolution: {integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
use-isomorphic-layout-effect@1.1.2:
resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==}
peerDependencies:
@@ -11612,6 +12040,15 @@ packages:
'@types/react':
optional: true
+ use-latest@1.3.0:
+ resolution: {integrity: sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
use-sidecar@1.1.2:
resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
engines: {node: '>=10'}
@@ -15029,7 +15466,7 @@ snapshots:
'@docusaurus/theme-translations@3.5.2':
dependencies:
fs-extra: 11.2.0
- tslib: 2.6.2
+ tslib: 2.8.1
'@docusaurus/tsconfig@3.5.2': {}
@@ -15797,6 +16234,14 @@ snapshots:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
+ '@floating-ui/react@0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@floating-ui/utils': 0.2.8
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ tabbable: 6.2.0
+
'@floating-ui/utils@0.2.8': {}
'@gar/promisify@1.1.3':
@@ -16036,8 +16481,37 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.1
'@jridgewell/sourcemap-codec': 1.4.15
+ '@juggle/resize-observer@3.4.0': {}
+
'@leichtgewicht/ip-codec@2.0.5': {}
+ '@mantine/core@7.16.0(@mantine/hooks@7.16.0(react@18.3.1))(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@floating-ui/react': 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@mantine/hooks': 7.16.0(react@18.3.1)
+ clsx: 2.1.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-number-format: 5.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react-remove-scroll: 2.6.2(@types/react@18.2.61)(react@18.3.1)
+ react-textarea-autosize: 8.5.6(@types/react@18.2.61)(react@18.3.1)
+ type-fest: 4.32.0
+ transitivePeerDependencies:
+ - '@types/react'
+
+ '@mantine/dates@7.16.0(@mantine/core@7.16.0(@mantine/hooks@7.16.0(react@18.3.1))(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.16.0(react@18.3.1))(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@mantine/core': 7.16.0(@mantine/hooks@7.16.0(react@18.3.1))(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@mantine/hooks': 7.16.0(react@18.3.1)
+ clsx: 2.1.1
+ dayjs: 1.11.13
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@mantine/hooks@7.16.0(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+
'@mdx-js/mdx@3.0.1':
dependencies:
'@types/estree': 1.0.5
@@ -16081,34 +16555,34 @@ snapshots:
'@microsoft/tsdoc@0.14.2': {}
- '@next/env@15.1.0': {}
+ '@next/env@15.1.5': {}
'@next/eslint-plugin-next@14.2.6':
dependencies:
glob: 10.3.10
- '@next/swc-darwin-arm64@15.1.0':
+ '@next/swc-darwin-arm64@15.1.5':
optional: true
- '@next/swc-darwin-x64@15.1.0':
+ '@next/swc-darwin-x64@15.1.5':
optional: true
- '@next/swc-linux-arm64-gnu@15.1.0':
+ '@next/swc-linux-arm64-gnu@15.1.5':
optional: true
- '@next/swc-linux-arm64-musl@15.1.0':
+ '@next/swc-linux-arm64-musl@15.1.5':
optional: true
- '@next/swc-linux-x64-gnu@15.1.0':
+ '@next/swc-linux-x64-gnu@15.1.5':
optional: true
- '@next/swc-linux-x64-musl@15.1.0':
+ '@next/swc-linux-x64-musl@15.1.5':
optional: true
- '@next/swc-win32-arm64-msvc@15.1.0':
+ '@next/swc-win32-arm64-msvc@15.1.5':
optional: true
- '@next/swc-win32-x64-msvc@15.1.0':
+ '@next/swc-win32-x64-msvc@15.1.5':
optional: true
'@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1':
@@ -16868,6 +17342,38 @@ snapshots:
optionalDependencies:
'@types/react': 18.2.61
+ '@react-spring/animated@9.7.5(react@18.3.1)':
+ dependencies:
+ '@react-spring/shared': 9.7.5(react@18.3.1)
+ '@react-spring/types': 9.7.5
+ react: 18.3.1
+
+ '@react-spring/core@9.7.5(react@18.3.1)':
+ dependencies:
+ '@react-spring/animated': 9.7.5(react@18.3.1)
+ '@react-spring/shared': 9.7.5(react@18.3.1)
+ '@react-spring/types': 9.7.5
+ react: 18.3.1
+
+ '@react-spring/rafz@9.7.5': {}
+
+ '@react-spring/shared@9.7.5(react@18.3.1)':
+ dependencies:
+ '@react-spring/rafz': 9.7.5
+ '@react-spring/types': 9.7.5
+ react: 18.3.1
+
+ '@react-spring/types@9.7.5': {}
+
+ '@react-spring/web@9.7.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@react-spring/animated': 9.7.5(react@18.3.1)
+ '@react-spring/core': 9.7.5(react@18.3.1)
+ '@react-spring/shared': 9.7.5(react@18.3.1)
+ '@react-spring/types': 9.7.5
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
'@rnx-kit/chromium-edge-launcher@1.0.0':
dependencies:
'@types/node': 18.19.64
@@ -16967,6 +17473,15 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.24.4':
optional: true
+ '@rsuite/icon-font@4.1.0': {}
+
+ '@rsuite/icons@1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@rsuite/icon-font': 4.1.0
+ classnames: 2.5.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
'@rushstack/eslint-patch@1.5.1': {}
'@segment/loosely-validate-event@2.0.0':
@@ -17298,6 +17813,38 @@ snapshots:
dependencies:
csv-parse: 5.5.6
+ '@types/d3-array@3.0.3': {}
+
+ '@types/d3-color@3.1.0': {}
+
+ '@types/d3-delaunay@6.0.1': {}
+
+ '@types/d3-format@3.0.1': {}
+
+ '@types/d3-geo@3.1.0':
+ dependencies:
+ '@types/geojson': 7946.0.15
+
+ '@types/d3-interpolate@3.0.1':
+ dependencies:
+ '@types/d3-color': 3.1.0
+
+ '@types/d3-path@1.0.11': {}
+
+ '@types/d3-random@2.2.3': {}
+
+ '@types/d3-scale@4.0.2':
+ dependencies:
+ '@types/d3-time': 3.0.0
+
+ '@types/d3-shape@1.3.12':
+ dependencies:
+ '@types/d3-path': 1.0.11
+
+ '@types/d3-time-format@2.1.0': {}
+
+ '@types/d3-time@3.0.0': {}
+
'@types/debug@4.1.12':
dependencies:
'@types/ms': 0.7.34
@@ -17346,6 +17893,8 @@ snapshots:
dependencies:
'@types/node': 20.11.24
+ '@types/geojson@7946.0.15': {}
+
'@types/glob@7.2.0':
dependencies:
'@types/minimatch': 5.1.2
@@ -17401,6 +17950,8 @@ snapshots:
'@types/json5@0.0.29': {}
+ '@types/lodash@4.17.14': {}
+
'@types/mdast@4.0.4':
dependencies:
'@types/unist': 3.0.3
@@ -17468,6 +18019,10 @@ snapshots:
dependencies:
'@types/react': 18.2.61
+ '@types/react-window@1.8.8':
+ dependencies:
+ '@types/react': 18.2.61
+
'@types/react@18.2.61':
dependencies:
'@types/prop-types': 15.7.5
@@ -17800,6 +18355,147 @@ snapshots:
- jest
- supports-color
+ '@visx/axis@3.12.0(react@18.3.1)':
+ dependencies:
+ '@types/react': 18.2.61
+ '@visx/group': 3.12.0(react@18.3.1)
+ '@visx/point': 3.12.0
+ '@visx/scale': 3.12.0
+ '@visx/shape': 3.12.0(react@18.3.1)
+ '@visx/text': 3.12.0(react@18.3.1)
+ classnames: 2.5.1
+ prop-types: 15.8.1
+ react: 18.3.1
+
+ '@visx/bounds@3.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@types/react': 18.2.61
+ '@types/react-dom': 18.2.19
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@visx/curve@3.12.0':
+ dependencies:
+ '@types/d3-shape': 1.3.12
+ d3-shape: 1.3.7
+
+ '@visx/event@3.12.0':
+ dependencies:
+ '@types/react': 18.2.61
+ '@visx/point': 3.12.0
+
+ '@visx/gradient@3.12.0(react@18.3.1)':
+ dependencies:
+ '@types/react': 18.2.61
+ prop-types: 15.8.1
+ react: 18.3.1
+
+ '@visx/grid@3.12.0(react@18.3.1)':
+ dependencies:
+ '@types/react': 18.2.61
+ '@visx/curve': 3.12.0
+ '@visx/group': 3.12.0(react@18.3.1)
+ '@visx/point': 3.12.0
+ '@visx/scale': 3.12.0
+ '@visx/shape': 3.12.0(react@18.3.1)
+ classnames: 2.5.1
+ prop-types: 15.8.1
+ react: 18.3.1
+
+ '@visx/group@3.12.0(react@18.3.1)':
+ dependencies:
+ '@types/react': 18.2.61
+ classnames: 2.5.1
+ prop-types: 15.8.1
+ react: 18.3.1
+
+ '@visx/legend@3.12.0(react@18.3.1)':
+ dependencies:
+ '@types/react': 18.2.61
+ '@visx/group': 3.12.0(react@18.3.1)
+ '@visx/scale': 3.12.0
+ classnames: 2.5.1
+ prop-types: 15.8.1
+ react: 18.3.1
+
+ '@visx/mock-data@3.12.0':
+ dependencies:
+ '@types/d3-random': 2.2.3
+ d3-random: 2.2.2
+
+ '@visx/point@3.12.0': {}
+
+ '@visx/responsive@3.12.0(react@18.3.1)':
+ dependencies:
+ '@types/lodash': 4.17.14
+ '@types/react': 18.2.61
+ lodash: 4.17.21
+ prop-types: 15.8.1
+ react: 18.3.1
+
+ '@visx/scale@3.12.0':
+ dependencies:
+ '@visx/vendor': 3.12.0
+
+ '@visx/shape@3.12.0(react@18.3.1)':
+ dependencies:
+ '@types/d3-path': 1.0.11
+ '@types/d3-shape': 1.3.12
+ '@types/lodash': 4.17.14
+ '@types/react': 18.2.61
+ '@visx/curve': 3.12.0
+ '@visx/group': 3.12.0(react@18.3.1)
+ '@visx/scale': 3.12.0
+ classnames: 2.5.1
+ d3-path: 1.0.9
+ d3-shape: 1.3.7
+ lodash: 4.17.21
+ prop-types: 15.8.1
+ react: 18.3.1
+
+ '@visx/text@3.12.0(react@18.3.1)':
+ dependencies:
+ '@types/lodash': 4.17.14
+ '@types/react': 18.2.61
+ classnames: 2.5.1
+ lodash: 4.17.21
+ prop-types: 15.8.1
+ react: 18.3.1
+ reduce-css-calc: 1.3.0
+
+ '@visx/tooltip@3.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@types/react': 18.2.61
+ '@visx/bounds': 3.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.5.1
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-use-measure: 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+
+ '@visx/vendor@3.12.0':
+ dependencies:
+ '@types/d3-array': 3.0.3
+ '@types/d3-color': 3.1.0
+ '@types/d3-delaunay': 6.0.1
+ '@types/d3-format': 3.0.1
+ '@types/d3-geo': 3.1.0
+ '@types/d3-interpolate': 3.0.1
+ '@types/d3-scale': 4.0.2
+ '@types/d3-time': 3.0.0
+ '@types/d3-time-format': 2.1.0
+ d3-array: 3.2.1
+ d3-color: 3.1.0
+ d3-delaunay: 6.0.2
+ d3-format: 3.1.0
+ d3-geo: 3.1.0
+ d3-interpolate: 3.0.1
+ d3-scale: 4.0.2
+ d3-time: 3.1.0
+ d3-time-format: 4.1.0
+ internmap: 2.0.3
+
'@vitest/expect@1.6.0':
dependencies:
'@vitest/spy': 1.6.0
@@ -18450,6 +19146,8 @@ snapshots:
bail@2.0.2: {}
+ balanced-match@0.4.2: {}
+
balanced-match@1.0.2: {}
base64-js@1.5.1: {}
@@ -18718,7 +19416,7 @@ snapshots:
camel-case@4.1.2:
dependencies:
pascal-case: 3.1.2
- tslib: 2.6.2
+ tslib: 2.8.1
camelcase-css@2.0.1: {}
@@ -18905,6 +19603,8 @@ snapshots:
dependencies:
clsx: 2.0.0
+ classnames@2.5.1: {}
+
clean-css@5.3.3:
dependencies:
source-map: 0.6.1
@@ -19404,6 +20104,50 @@ snapshots:
csv-parse@5.5.6: {}
+ d3-array@3.2.1:
+ dependencies:
+ internmap: 2.0.3
+
+ d3-color@3.1.0: {}
+
+ d3-delaunay@6.0.2:
+ dependencies:
+ delaunator: 5.0.1
+
+ d3-format@3.1.0: {}
+
+ d3-geo@3.1.0:
+ dependencies:
+ d3-array: 3.2.1
+
+ d3-interpolate@3.0.1:
+ dependencies:
+ d3-color: 3.1.0
+
+ d3-path@1.0.9: {}
+
+ d3-random@2.2.2: {}
+
+ d3-scale@4.0.2:
+ dependencies:
+ d3-array: 3.2.1
+ d3-format: 3.1.0
+ d3-interpolate: 3.0.1
+ d3-time: 3.1.0
+ d3-time-format: 4.1.0
+
+ d3-shape@1.3.7:
+ dependencies:
+ d3-path: 1.0.9
+
+ d3-time-format@4.1.0:
+ dependencies:
+ d3-time: 3.1.0
+
+ d3-time@3.1.0:
+ dependencies:
+ d3-array: 3.2.1
+
dag-map@1.0.2: {}
damerau-levenshtein@1.0.8: {}
@@ -19428,6 +20172,10 @@ snapshots:
es-errors: 1.3.0
is-data-view: 1.0.1
+ date-fns@2.30.0:
+ dependencies:
+ '@babel/runtime': 7.26.0
+
date-fns@4.1.0: {}
dayjs@1.11.13: {}
@@ -19557,6 +20305,10 @@ snapshots:
rimraf: 3.0.2
slash: 3.0.0
+ delaunator@5.0.1:
+ dependencies:
+ robust-predicates: 3.0.2
+
delayed-stream@1.0.0: {}
delegates@1.0.0:
@@ -19640,6 +20392,10 @@ snapshots:
'@babel/runtime': 7.26.0
csstype: 3.1.2
+ dom-lib@3.3.2:
+ dependencies:
+ '@babel/runtime': 7.26.0
+
dom-serializer@1.4.1:
dependencies:
domelementtype: 2.3.0
@@ -21024,6 +21780,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ get-value@3.0.1:
+ dependencies:
+ isobject: 3.0.1
+
getenv@1.0.0: {}
git-hooks-list@3.1.0: {}
@@ -21682,6 +22442,8 @@ snapshots:
hasown: 2.0.2
side-channel: 1.0.6
+ internmap@2.0.3: {}
+
interpret@1.4.0: {}
invariant@2.2.4:
@@ -21868,6 +22630,8 @@ snapshots:
dependencies:
isobject: 3.0.1
+ is-primitive@3.0.1: {}
+
is-reference@3.0.2:
dependencies:
'@types/estree': 1.0.5
@@ -22441,7 +23205,7 @@ snapshots:
lru-cache@7.18.3: {}
- lucide-react@0.468.0(react@18.3.1):
+ lucide-react@0.473.0(react@18.3.1):
dependencies:
react: 18.3.1
@@ -22497,6 +23261,8 @@ snapshots:
marky@1.2.5: {}
+ math-expression-evaluator@1.4.0: {}
+
md5-file@3.2.3:
dependencies:
buffer-alloc: 1.2.0
@@ -23380,13 +24146,13 @@ snapshots:
netmask@2.0.2: {}
- next-auth@4.24.10(next@15.1.0(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ next-auth@4.24.10(next@15.1.5(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@babel/runtime': 7.26.0
'@panva/hkdf': 1.2.1
cookie: 0.7.2
jose: 4.15.9
- next: 15.1.0(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ next: 15.1.5(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
oauth: 0.9.15
openid-client: 5.7.0
preact: 10.24.3
@@ -23395,12 +24161,12 @@ snapshots:
react-dom: 18.3.1(react@18.3.1)
uuid: 8.3.2
- next-pwa@5.6.0(@babel/core@7.26.0)(@types/babel__core@7.20.5)(next@15.1.0(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(webpack@5.95.0):
+ next-pwa@5.6.0(@babel/core@7.26.0)(@types/babel__core@7.20.5)(next@15.1.5(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(webpack@5.95.0):
dependencies:
babel-loader: 8.4.1(@babel/core@7.26.0)(webpack@5.95.0)
clean-webpack-plugin: 4.0.0(webpack@5.95.0)
globby: 11.1.0
- next: 15.1.0(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ next: 15.1.5(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
terser-webpack-plugin: 5.3.10(webpack@5.95.0)
workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.95.0)
workbox-window: 6.6.0
@@ -23418,9 +24184,9 @@ snapshots:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- next@15.1.0(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ next@15.1.5(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@next/env': 15.1.0
+ '@next/env': 15.1.5
'@swc/counter': 0.1.3
'@swc/helpers': 0.5.15
busboy: 1.6.0
@@ -23430,14 +24196,14 @@ snapshots:
react-dom: 18.3.1(react@18.3.1)
styled-jsx: 5.1.6(@babel/core@7.26.0)(react@18.3.1)
optionalDependencies:
- '@next/swc-darwin-arm64': 15.1.0
- '@next/swc-darwin-x64': 15.1.0
- '@next/swc-linux-arm64-gnu': 15.1.0
- '@next/swc-linux-arm64-musl': 15.1.0
- '@next/swc-linux-x64-gnu': 15.1.0
- '@next/swc-linux-x64-musl': 15.1.0
- '@next/swc-win32-arm64-msvc': 15.1.0
- '@next/swc-win32-x64-msvc': 15.1.0
+ '@next/swc-darwin-arm64': 15.1.5
+ '@next/swc-darwin-x64': 15.1.5
+ '@next/swc-linux-arm64-gnu': 15.1.5
+ '@next/swc-linux-arm64-musl': 15.1.5
+ '@next/swc-linux-x64-gnu': 15.1.5
+ '@next/swc-linux-x64-musl': 15.1.5
+ '@next/swc-win32-arm64-msvc': 15.1.5
+ '@next/swc-win32-x64-msvc': 15.1.5
sharp: 0.33.5
transitivePeerDependencies:
- '@babel/core'
@@ -23836,7 +24602,7 @@ snapshots:
param-case@3.0.4:
dependencies:
dot-case: 3.0.4
- tslib: 2.6.2
+ tslib: 2.8.1
parent-module@1.0.1:
dependencies:
@@ -24707,6 +25473,8 @@ snapshots:
react-is@16.13.1: {}
+ react-is@17.0.2: {}
+
react-is@18.3.1: {}
react-json-view-lite@1.5.0(react@18.3.1):
@@ -24841,6 +25609,11 @@ snapshots:
- supports-color
- utf-8-validate
+ react-number-format@5.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
react-refresh@0.14.2: {}
react-remove-scroll-bar@2.3.6(@types/react@18.2.61)(react@18.3.1):
@@ -24851,6 +25624,14 @@ snapshots:
optionalDependencies:
'@types/react': 18.2.61
+ react-remove-scroll-bar@2.3.8(@types/react@18.2.61)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-style-singleton: 2.2.3(@types/react@18.2.61)(react@18.3.1)
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 18.2.61
+
react-remove-scroll@2.6.0(@types/react@18.2.61)(react@18.3.1):
dependencies:
react: 18.3.1
@@ -24862,6 +25643,17 @@ snapshots:
optionalDependencies:
'@types/react': 18.2.61
+ react-remove-scroll@2.6.2(@types/react@18.2.61)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-remove-scroll-bar: 2.3.8(@types/react@18.2.61)(react@18.3.1)
+ react-style-singleton: 2.2.3(@types/react@18.2.61)(react@18.3.1)
+ tslib: 2.8.1
+ use-callback-ref: 1.3.3(@types/react@18.2.61)(react@18.3.1)
+ use-sidecar: 1.1.2(@types/react@18.2.61)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.2.61
+
react-router-config@5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1):
dependencies:
'@babel/runtime': 7.26.0
@@ -24918,6 +25710,14 @@ snapshots:
optionalDependencies:
'@types/react': 18.2.61
+ react-style-singleton@2.2.3(@types/react@18.2.61)(react@18.3.1):
+ dependencies:
+ get-nonce: 1.0.1
+ react: 18.3.1
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 18.2.61
+
react-syntax-highlighter@15.6.1(react@18.3.1):
dependencies:
'@babel/runtime': 7.26.0
@@ -24928,6 +25728,15 @@ snapshots:
react: 18.3.1
refractor: 3.6.0
+ react-textarea-autosize@8.5.6(@types/react@18.2.61)(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.26.0
+ react: 18.3.1
+ use-composed-ref: 1.4.0(@types/react@18.2.61)(react@18.3.1)
+ use-latest: 1.3.0(@types/react@18.2.61)(react@18.3.1)
+ transitivePeerDependencies:
+ - '@types/react'
+
react-timezone-select@3.2.8(react-dom@18.3.1(react@18.3.1))(react-select@5.8.3(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1):
dependencies:
react: 18.3.1
@@ -24945,6 +25754,23 @@ snapshots:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
+ react-use-measure@2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ debounce: 1.2.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ react-use-set@1.0.0(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ react-window@1.8.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.26.0
+ memoize-one: 5.2.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
react@18.2.0:
dependencies:
loose-envify: 1.4.0
@@ -25009,6 +25835,16 @@ snapshots:
dependencies:
minimatch: 3.1.2
+ reduce-css-calc@1.3.0:
+ dependencies:
+ balanced-match: 0.4.2
+ math-expression-evaluator: 1.4.0
+ reduce-function-call: 1.0.3
+
+ reduce-function-call@1.0.3:
+ dependencies:
+ balanced-match: 1.0.2
+
reflect.getprototypeof@1.0.4:
dependencies:
call-bind: 1.0.5
@@ -25264,6 +26100,8 @@ snapshots:
dependencies:
glob: 7.2.3
+ robust-predicates@3.0.2: {}
+
rollup-plugin-terser@7.0.2(rollup@2.79.2):
dependencies:
'@babel/code-frame': 7.26.2
@@ -25300,6 +26138,39 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.24.4
fsevents: 2.3.3
+ rsuite-table@5.19.1(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.26.0
+ '@juggle/resize-observer': 3.4.0
+ '@rsuite/icons': 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.5.1
+ dom-lib: 3.3.2
+ lodash: 4.17.21
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-is: 17.0.2
+
+ rsuite@5.76.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.26.0
+ '@juggle/resize-observer': 3.4.0
+ '@rsuite/icons': 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@types/lodash': 4.17.14
+ '@types/prop-types': 15.7.5
+ '@types/react-window': 1.8.8
+ classnames: 2.5.1
+ date-fns: 2.30.0
+ dom-lib: 3.3.2
+ lodash: 4.17.21
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-use-set: 1.0.0(react@18.3.1)
+ react-window: 1.8.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rsuite-table: 5.19.1(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ schema-typed: 2.2.2
+
rtl-detect@1.1.2: {}
rtlcss@4.3.0:
@@ -25325,7 +26196,7 @@ snapshots:
rxjs@7.8.1:
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
safe-array-concat@1.0.1:
dependencies:
@@ -25371,6 +26242,11 @@ snapshots:
dependencies:
loose-envify: 1.4.0
+ schema-typed@2.2.2:
+ dependencies:
+ get-value: 3.0.1
+ set-value: 4.1.0
+
schema-utils@2.7.0:
dependencies:
'@types/json-schema': 7.0.12
@@ -25533,6 +26409,11 @@ snapshots:
functions-have-names: 1.2.3
has-property-descriptors: 1.0.2
+ set-value@4.1.0:
+ dependencies:
+ is-plain-object: 2.0.4
+ is-primitive: 3.0.1
+
setimmediate@1.0.5: {}
setprototypeof@1.1.0: {}
@@ -26045,6 +26926,8 @@ snapshots:
'@pkgr/utils': 2.4.2
tslib: 2.6.2
+ tabbable@6.2.0: {}
+
table@6.8.2:
dependencies:
ajv: 8.17.1
@@ -26396,6 +27279,8 @@ snapshots:
type-fest@2.19.0: {}
+ type-fest@4.32.0: {}
+
type-is@1.6.18:
dependencies:
media-typer: 0.3.0
@@ -26655,12 +27540,32 @@ snapshots:
optionalDependencies:
'@types/react': 18.2.61
+ use-callback-ref@1.3.3(@types/react@18.2.61)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 18.2.61
+
+ use-composed-ref@1.4.0(@types/react@18.2.61)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.2.61
+
use-isomorphic-layout-effect@1.1.2(@types/react@18.2.61)(react@18.3.1):
dependencies:
react: 18.3.1
optionalDependencies:
'@types/react': 18.2.61
+ use-latest@1.3.0(@types/react@18.2.61)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.61)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.2.61
+
use-sidecar@1.1.2(@types/react@18.2.61)(react@18.3.1):
dependencies:
detect-node-es: 1.1.0