diff --git a/apps/registry/app/[username]/dashboard/Dashboard.js b/apps/registry/app/[username]/dashboard/Dashboard.js
index 8a1e016..a708516 100644
--- a/apps/registry/app/[username]/dashboard/Dashboard.js
+++ b/apps/registry/app/[username]/dashboard/Dashboard.js
@@ -14,7 +14,7 @@ import {
CardHeader,
CardTitle,
} from '@repo/ui/components/ui/card';
-
+import { Badge } from '@repo/ui/components/ui/badge';
import { Progress } from '@repo/ui/components/ui/progress';
import {
totalExperience,
@@ -35,7 +35,7 @@ const getMetrics = ({ resume }) => {
totalVolunteer: resume.volunteer?.length,
averageJobDuration: averageJobDuration(resume),
mostFrequentJobTitle: 'Software Engineer',
- topSkillCategories: ['Programming', 'Web Development', 'Data Analysis'],
+ topSkillCategories: resume.skills?.map((skill) => skill.name),
mostRecentSkill: 'React Native',
topIndustries: ['Technology', 'Finance', 'Healthcare'],
educationLevel: getEducationLevel(resume),
@@ -45,6 +45,34 @@ const getMetrics = ({ resume }) => {
return ResumeData;
};
+const SkillsList = ({ skills }) => {
+ if (!skills || skills.length === 0) {
+ return
No skills listed.
;
+ }
+
+ return (
+
+ {skills.map((skill, index) => (
+
+
{skill.name}
+ {skill.level && (
+
Level: {skill.level}
+ )}
+ {skill.keywords && skill.keywords.length > 0 && (
+
+ {skill.keywords.map((keyword, keywordIndex) => (
+
+ {keyword}
+
+ ))}
+
+ )}
+
+ ))}
+
+ );
+};
+
const ResumeDashboard = () => {
const { resume } = useProfileData();
const ResumeData = getMetrics({ resume });
@@ -52,6 +80,18 @@ const ResumeDashboard = () => {
<>
+
+
+
+
+ Summary
+
+
+
+ {resume.basics?.summary}
+
+
+
@@ -127,20 +167,11 @@ const ResumeDashboard = () => {
- Top Skill Categories
+ Skills
-
- {ResumeData.topSkillCategories.map((skill, index) => (
-
- {skill}
-
- ))}
-
+
diff --git a/apps/registry/app/[username]/timeline/Timeline.js b/apps/registry/app/[username]/timeline/Timeline.js
index 8f6aff8..92d4368 100644
--- a/apps/registry/app/[username]/timeline/Timeline.js
+++ b/apps/registry/app/[username]/timeline/Timeline.js
@@ -37,7 +37,7 @@ const SimpleVerticalTimeline = ({ resume }) => {
const opposite = side === 'left' ? 'right' : 'left';
return (
-
+
{work.name}
@@ -45,7 +45,7 @@ const SimpleVerticalTimeline = ({ resume }) => {
-
+
{work.position}
{work.summary}
diff --git a/apps/registry/app/explore2/page.js b/apps/registry/app/explore2/page.js
new file mode 100644
index 0000000..8ed0a1e
--- /dev/null
+++ b/apps/registry/app/explore2/page.js
@@ -0,0 +1,231 @@
+'use client';
+
+import React, { useEffect, useState } from 'react';
+import axios from 'axios';
+import Link from 'next/link';
+import { motion } from 'framer-motion';
+import { Input } from '@repo/ui/components/ui/input';
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from '@repo/ui/components/ui/card';
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from '@repo/ui/components/ui/select';
+import { ScrollArea } from '@repo/ui/components/ui/scroll-area';
+import { Loader2 } from 'lucide-react';
+
+const formatLocation = (location) => {
+ if (!location) return 'Location not provided';
+ const {
+ postalCode = '',
+ city = '',
+ region = '',
+ countryCode = '',
+ } = location;
+ const locationParts = [city, region, postalCode, countryCode].filter(
+ (part) => part.trim() !== ''
+ );
+ return locationParts.length === 0
+ ? 'Location not provided'
+ : locationParts.join(', ');
+};
+
+const Resumes = () => {
+ const [data, setData] = useState([]);
+ const [nameFilter, setNameFilter] = useState('');
+ const [locationFilter, setLocationFilter] = useState('');
+ const [positionFilter, setPositionFilter] = useState('');
+ const [filteredResumes, setFilteredResumes] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [uniqueLocations, setUniqueLocations] = useState([]);
+ const [uniquePositions, setUniquePositions] = useState([]);
+
+ useEffect(() => {
+ const fetchData = async () => {
+ try {
+ const response = await axios.get('/api/resumes?limit=500');
+ setData(response.data);
+ setLoading(false);
+
+ // Extract unique locations and positions
+ const locations = new Set(
+ response.data.map((resume) => formatLocation(resume.location))
+ );
+ setUniqueLocations(Array.from(locations));
+
+ const positions = new Set(
+ response.data.flatMap((resume) =>
+ resume.work ? resume.work.map((w) => w.position) : []
+ )
+ );
+ setUniquePositions(Array.from(positions));
+ } catch (error) {
+ console.error('Error fetching data: ', error);
+ setLoading(false);
+ }
+ };
+
+ fetchData();
+ }, []);
+
+ useEffect(() => {
+ setFilteredResumes(
+ data.filter((resume) => {
+ const nameMatch = resume?.name
+ ?.toLowerCase()
+ .includes(nameFilter.toLowerCase());
+ const locationMatch =
+ locationFilter === '' ||
+ formatLocation(resume.location)
+ .toLowerCase()
+ .includes(locationFilter.toLowerCase());
+ const positionMatch =
+ positionFilter === '' ||
+ (resume.work &&
+ resume.work.some((w) =>
+ w.position.toLowerCase().includes(positionFilter.toLowerCase())
+ ));
+ return nameMatch && locationMatch && positionMatch;
+ })
+ );
+ }, [nameFilter, locationFilter, positionFilter, data]);
+
+ if (loading) {
+ return (
+
+
+
+ );
+ }
+
+ return (
+
+ {/* Sidebar */}
+
+
+
+ Filters
+
+
+
+
+
+ setNameFilter(e.target.value)}
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Main content */}
+
+
+
+ {filteredResumes.map((resume, index) => (
+
+
+
+
+ {resume.name}
+
+ {formatLocation(resume.location)}
+
+
+
+
+
+
+ {resume.work && resume.work[0] && (
+
+ {resume.work[0].position} at{' '}
+ {resume.work[0].company}
+
+ )}
+
+
+
+
+
+
+ ))}
+
+
+
+
+ );
+};
+
+export default Resumes;
diff --git a/packages/ui/package.json b/packages/ui/package.json
index babe58c..17a86f5 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -22,8 +22,11 @@
"dependencies": {
"@radix-ui/react-accordion": "^1.2.0",
"@radix-ui/react-avatar": "^1.0.4",
+ "@radix-ui/react-checkbox": "^1.1.1",
"@radix-ui/react-progress": "^1.1.0",
"@radix-ui/react-scroll-area": "^1.1.0",
+ "@radix-ui/react-select": "^2.1.1",
+ "@radix-ui/react-separator": "^1.1.0",
"@radix-ui/react-slot": "^1.0.2",
"@radix-ui/react-tabs": "^1.1.0",
"class-variance-authority": "^0.7.0",
diff --git a/packages/ui/src/components/ui/checkbox.tsx b/packages/ui/src/components/ui/checkbox.tsx
new file mode 100644
index 0000000..91c2692
--- /dev/null
+++ b/packages/ui/src/components/ui/checkbox.tsx
@@ -0,0 +1,30 @@
+'use client';
+
+import * as React from 'react';
+import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
+import { Check } from 'lucide-react';
+
+import { cn } from '@repo/ui/lib/utils';
+
+const Checkbox = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+
+
+));
+Checkbox.displayName = CheckboxPrimitive.Root.displayName;
+
+export { Checkbox };
diff --git a/packages/ui/src/components/ui/input.tsx b/packages/ui/src/components/ui/input.tsx
new file mode 100644
index 0000000..3288c0e
--- /dev/null
+++ b/packages/ui/src/components/ui/input.tsx
@@ -0,0 +1,25 @@
+import * as React from 'react';
+
+import { cn } from '@repo/ui/lib/utils';
+
+export interface InputProps
+ extends React.InputHTMLAttributes {}
+
+const Input = React.forwardRef(
+ ({ className, type, ...props }, ref) => {
+ return (
+
+ );
+ }
+);
+Input.displayName = 'Input';
+
+export { Input };
diff --git a/packages/ui/src/components/ui/select.tsx b/packages/ui/src/components/ui/select.tsx
new file mode 100644
index 0000000..b60c6c2
--- /dev/null
+++ b/packages/ui/src/components/ui/select.tsx
@@ -0,0 +1,160 @@
+'use client';
+
+import * as React from 'react';
+import * as SelectPrimitive from '@radix-ui/react-select';
+import { Check, ChevronDown, ChevronUp } from 'lucide-react';
+
+import { cn } from '@repo/ui/lib/utils';
+
+const Select = SelectPrimitive.Root;
+
+const SelectGroup = SelectPrimitive.Group;
+
+const SelectValue = SelectPrimitive.Value;
+
+const SelectTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+ span]:line-clamp-1',
+ className
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+
+));
+SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
+
+const SelectScrollUpButton = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
+
+const SelectScrollDownButton = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+SelectScrollDownButton.displayName =
+ SelectPrimitive.ScrollDownButton.displayName;
+
+const SelectContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, position = 'popper', ...props }, ref) => (
+
+
+
+
+ {children}
+
+
+
+
+));
+SelectContent.displayName = SelectPrimitive.Content.displayName;
+
+const SelectLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+SelectLabel.displayName = SelectPrimitive.Label.displayName;
+
+const SelectItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+
+ {children}
+
+));
+SelectItem.displayName = SelectPrimitive.Item.displayName;
+
+const SelectSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
+
+export {
+ Select,
+ SelectGroup,
+ SelectValue,
+ SelectTrigger,
+ SelectContent,
+ SelectLabel,
+ SelectItem,
+ SelectSeparator,
+ SelectScrollUpButton,
+ SelectScrollDownButton,
+};
diff --git a/packages/ui/src/components/ui/separator.tsx b/packages/ui/src/components/ui/separator.tsx
new file mode 100644
index 0000000..485e4a9
--- /dev/null
+++ b/packages/ui/src/components/ui/separator.tsx
@@ -0,0 +1,31 @@
+'use client';
+
+import * as React from 'react';
+import * as SeparatorPrimitive from '@radix-ui/react-separator';
+
+import { cn } from '@repo/ui/lib/utils';
+
+const Separator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(
+ (
+ { className, orientation = 'horizontal', decorative = true, ...props },
+ ref
+ ) => (
+
+ )
+);
+Separator.displayName = SeparatorPrimitive.Root.displayName;
+
+export { Separator };
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index bcc07c7..7dff8db 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -678,12 +678,21 @@ importers:
'@radix-ui/react-avatar':
specifier: ^1.0.4
version: 1.0.4(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@radix-ui/react-checkbox':
+ specifier: ^1.1.1
+ version: 1.1.1(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
'@radix-ui/react-progress':
specifier: ^1.1.0
version: 1.1.0(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
'@radix-ui/react-scroll-area':
specifier: ^1.1.0
version: 1.1.0(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@radix-ui/react-select':
+ specifier: ^2.1.1
+ version: 2.1.1(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@radix-ui/react-separator':
+ specifier: ^1.1.0
+ version: 1.1.0(@types/react-dom@18.0.0)(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
'@radix-ui/react-slot':
specifier: ^1.0.2
version: 1.0.2(@types/react@18.2.39)(react@18.3.1)
@@ -5632,14 +5641,12 @@ packages:
resolution: {integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==}
dependencies:
'@floating-ui/utils': 0.1.6
- dev: true
/@floating-ui/dom@1.5.3:
resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==}
dependencies:
'@floating-ui/core': 1.5.0
'@floating-ui/utils': 0.1.6
- dev: true
/@floating-ui/react-dom@2.0.4(react-dom@18.3.1)(react@18.3.1):
resolution: {integrity: sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==}
@@ -5650,11 +5657,9 @@ packages:
'@floating-ui/dom': 1.5.3
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- dev: true
/@floating-ui/utils@0.1.6:
resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==}
- dev: true
/@hapi/hoek@9.3.0:
resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==}
@@ -7535,6 +7540,25 @@ packages:
react-dom: 18.3.1(react@18.3.1)
dev: true
+ /@radix-ui/react-arrow@1.1.0(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1):
+ resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.0.0)(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@types/react': 18.2.39
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ dev: false
+
/@radix-ui/react-avatar@1.0.4(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1):
resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==}
peerDependencies:
@@ -7558,6 +7582,32 @@ packages:
react-dom: 18.3.1(react@18.3.1)
dev: false
+ /@radix-ui/react-checkbox@1.1.1(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1):
+ resolution: {integrity: sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.0.0)(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@types/react': 18.2.39
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ dev: false
+
/@radix-ui/react-collapsible@1.1.0(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1):
resolution: {integrity: sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==}
peerDependencies:
@@ -7731,6 +7781,29 @@ packages:
react-dom: 18.3.1(react@18.3.1)
dev: true
+ /@radix-ui/react-dismissable-layer@1.1.0(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1):
+ resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.0.0)(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@types/react': 18.2.39
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ dev: false
+
/@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.39)(react@18.3.1):
resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==}
peerDependencies:
@@ -7745,6 +7818,19 @@ packages:
react: 18.3.1
dev: true
+ /@radix-ui/react-focus-guards@1.1.0(@types/react@18.2.39)(react@18.3.1):
+ resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 18.2.39
+ react: 18.3.1
+ dev: false
+
/@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.0.0)(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1):
resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==}
peerDependencies:
@@ -7768,6 +7854,27 @@ packages:
react-dom: 18.3.1(react@18.3.1)
dev: true
+ /@radix-ui/react-focus-scope@1.1.0(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1):
+ resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.0.0)(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@types/react': 18.2.39
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ dev: false
+
/@radix-ui/react-id@1.0.1(@types/react@18.2.39)(react@18.3.1):
resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==}
peerDependencies:
@@ -7826,6 +7933,34 @@ packages:
react-dom: 18.3.1(react@18.3.1)
dev: true
+ /@radix-ui/react-popper@1.2.0(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1):
+ resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@floating-ui/react-dom': 2.0.4(react-dom@18.3.1)(react@18.3.1)
+ '@radix-ui/react-arrow': 1.1.0(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.0.0)(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-use-rect': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/rect': 1.1.0
+ '@types/react': 18.2.39
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ dev: false
+
/@radix-ui/react-portal@1.0.3(@types/react-dom@18.0.0)(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1):
resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==}
peerDependencies:
@@ -7847,6 +7982,26 @@ packages:
react-dom: 18.3.1(react@18.3.1)
dev: true
+ /@radix-ui/react-portal@1.1.1(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1):
+ resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.0.0)(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@types/react': 18.2.39
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ dev: false
+
/@radix-ui/react-presence@1.1.0(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1):
resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==}
peerDependencies:
@@ -8021,6 +8176,45 @@ packages:
react-remove-scroll: 2.5.5(@types/react@18.2.39)(react@18.3.1)
dev: true
+ /@radix-ui/react-select@2.1.1(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1):
+ resolution: {integrity: sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/number': 1.1.0
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.0.0)(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-dismissable-layer': 1.1.0(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-focus-scope': 1.1.0(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-popper': 1.2.0(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@radix-ui/react-portal': 1.1.1(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.0.0)(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@radix-ui/react-visually-hidden': 1.1.0(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@types/react': 18.2.39
+ aria-hidden: 1.2.3
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-remove-scroll: 2.5.7(@types/react@18.2.39)(react@18.3.1)
+ dev: false
+
/@radix-ui/react-separator@1.1.0(@types/react-dom@18.0.0)(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1):
resolution: {integrity: sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==}
peerDependencies:
@@ -8039,7 +8233,6 @@ packages:
'@types/react-dom': 18.0.0
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- dev: true
/@radix-ui/react-slot@1.0.2(@types/react@18.2.39)(react@18.3.1):
resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==}
@@ -8236,6 +8429,20 @@ packages:
react: 18.3.1
dev: true
+ /@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.2.39)(react@18.3.1):
+ resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@types/react': 18.2.39
+ react: 18.3.1
+ dev: false
+
/@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.39)(react@18.3.1):
resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==}
peerDependencies:
@@ -8275,6 +8482,19 @@ packages:
react: 18.3.1
dev: true
+ /@radix-ui/react-use-previous@1.1.0(@types/react@18.2.39)(react@18.3.1):
+ resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 18.2.39
+ react: 18.3.1
+ dev: false
+
/@radix-ui/react-use-rect@1.0.1(@types/react@18.2.39)(react@18.3.1):
resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==}
peerDependencies:
@@ -8290,6 +8510,20 @@ packages:
react: 18.3.1
dev: true
+ /@radix-ui/react-use-rect@1.1.0(@types/react@18.2.39)(react@18.3.1):
+ resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@radix-ui/rect': 1.1.0
+ '@types/react': 18.2.39
+ react: 18.3.1
+ dev: false
+
/@radix-ui/react-use-size@1.0.1(@types/react@18.2.39)(react@18.3.1):
resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==}
peerDependencies:
@@ -8305,6 +8539,20 @@ packages:
react: 18.3.1
dev: true
+ /@radix-ui/react-use-size@1.1.0(@types/react@18.2.39)(react@18.3.1):
+ resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.39)(react@18.3.1)
+ '@types/react': 18.2.39
+ react: 18.3.1
+ dev: false
+
/@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.0.0)(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1):
resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==}
peerDependencies:
@@ -8326,12 +8574,35 @@ packages:
react-dom: 18.3.1(react@18.3.1)
dev: true
+ /@radix-ui/react-visually-hidden@1.1.0(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1):
+ resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.0.0)(@types/react@18.2.39)(react-dom@18.3.1)(react@18.3.1)
+ '@types/react': 18.2.39
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ dev: false
+
/@radix-ui/rect@1.0.1:
resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==}
dependencies:
'@babel/runtime': 7.24.7
dev: true
+ /@radix-ui/rect@1.1.0:
+ resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==}
+ dev: false
+
/@rollup/plugin-babel@5.3.1(@babel/core@7.24.7)(rollup@2.79.1):
resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==}
engines: {node: '>= 10.0.0'}
@@ -11702,7 +11973,6 @@ packages:
engines: {node: '>=10'}
dependencies:
tslib: 2.6.3
- dev: true
/aria-query@4.2.2:
resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==}
@@ -14068,7 +14338,6 @@ packages:
/detect-node-es@1.1.0:
resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
- dev: true
/detect-node@2.1.0:
resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
@@ -16218,7 +16487,6 @@ packages:
/get-nonce@1.0.1:
resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
engines: {node: '>=6'}
- dev: true
/get-npm-tarball-url@2.1.0:
resolution: {integrity: sha512-ro+DiMu5DXgRBabqXupW38h7WPZ9+Ad8UjwhvsmmN8w1sU7ab0nzAXvVZ4kqYg57OrqomRtJvepX5/xvFKNtjA==}
@@ -17287,7 +17555,6 @@ packages:
resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
dependencies:
loose-envify: 1.4.0
- dev: true
/ip@2.0.0:
resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==}
@@ -23088,7 +23355,6 @@ packages:
react: 18.3.1
react-style-singleton: 2.2.1(@types/react@18.2.39)(react@18.3.1)
tslib: 2.6.3
- dev: true
/react-remove-scroll@2.5.5(@types/react@18.2.39)(react@18.3.1):
resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==}
@@ -23109,6 +23375,25 @@ packages:
use-sidecar: 1.1.2(@types/react@18.2.39)(react@18.3.1)
dev: true
+ /react-remove-scroll@2.5.7(@types/react@18.2.39)(react@18.3.1):
+ resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 18.2.39
+ react: 18.3.1
+ react-remove-scroll-bar: 2.3.4(@types/react@18.2.39)(react@18.3.1)
+ react-style-singleton: 2.2.1(@types/react@18.2.39)(react@18.3.1)
+ tslib: 2.6.3
+ use-callback-ref: 1.3.0(@types/react@18.2.39)(react@18.3.1)
+ use-sidecar: 1.1.2(@types/react@18.2.39)(react@18.3.1)
+ dev: false
+
/react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.24.7)(@swc/core@1.3.99)(esbuild@0.23.0)(eslint@8.57.0)(react@18.3.1)(typescript@4.9.5):
resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==}
engines: {node: '>=14.0.0'}
@@ -23241,7 +23526,6 @@ packages:
invariant: 2.2.4
react: 18.3.1
tslib: 2.6.3
- dev: true
/react-syntax-highlighter@15.5.0(react@18.3.1):
resolution: {integrity: sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==}
@@ -26076,7 +26360,6 @@ packages:
'@types/react': 18.2.39
react: 18.3.1
tslib: 2.6.3
- dev: true
/use-resize-observer@9.1.0(react-dom@18.3.1)(react@18.3.1):
resolution: {integrity: sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==}
@@ -26103,7 +26386,6 @@ packages:
detect-node-es: 1.1.0
react: 18.3.1
tslib: 2.6.3
- dev: true
/use-sync-external-store@1.2.2(react@18.3.1):
resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==}