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.name} +
+ {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==}