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" + /> + + + + + + + {predefinedRanges.map((range) => ( + setDatePickerRange(range.value)} + > + + {range.label} + + ))} -
- } + +
+
+ +
+ +
+ { + 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 : ( +
+ + + + + + data={data} + keys={keys} + x={getDate} + xScale={dateScale} + yScale={temperatureScale} + color={colorScale} + > + {(barStacks) => + barStacks.map((barStack) => + barStack.bars.map((bar) => ( + { + if (events) alert(`clicked: ${JSON.stringify(bar)}`); + }} + onMouseLeave={() => { + tooltipTimeout = window.setTimeout(() => { + hideTooltip(); + }, 300); + }} + onMouseMove={(event) => { + if (tooltipTimeout) clearTimeout(tooltipTimeout); + // TooltipInPortal expects coordinates to be relative to containerRef + // localPoint returns coordinates relative to the nearest SVG, which + // is what containerRef is set to in this example. + const eventSvgCoords = localPoint(event); + const left = bar.x + bar.width / 2; + showTooltip({ + tooltipData: bar, + tooltipTop: eventSvgCoords?.y, + tooltipLeft: left, + }); + }} + /> + )), + ) + } + + + + +
+ +
+ + {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 ? : ( + + + + b.categoryCode - a.categoryCode} + outerRadius={radius} + cornerRadius={0} + > + {(pie) => ( + c.data.categoryName} + onClickDatum={({ data: category }) => + console.log('clicked: ', category.categoryName) + } + getColor={(arc) => { + return arc.data.categoryColor; + }} + /> + )} + + + + ); +} + +// 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