From 2789cf6f32c7ee931a2fe076ad35f963e1156a57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Gonz=C3=A1lez=20Mu=C3=B1oz?= Date: Thu, 17 Oct 2024 08:43:39 +0200 Subject: [PATCH] WIP --- client/package.json | 3 + client/src/app/(projects)/constants.ts | 4 + client/src/app/(projects)/layout.tsx | 18 ++ client/src/app/(projects)/page.tsx | 84 ++++++++ client/src/app/(projects)/store.ts | 14 ++ client/src/app/page.tsx | 23 --- client/src/app/providers.tsx | 10 +- client/src/containers/nav/index.tsx | 109 +++++++++++ client/src/containers/nav/item.tsx | 100 ++++++++++ .../src/containers/projects/filters/index.tsx | 23 +++ .../src/containers/projects/header/index.tsx | 26 +++ client/src/containers/projects/map/index.tsx | 30 +++ .../src/containers/projects/table/index.tsx | 28 +++ pnpm-lock.yaml | 183 ++++++++++++++++++ 14 files changed, 629 insertions(+), 26 deletions(-) create mode 100644 client/src/app/(projects)/constants.ts create mode 100644 client/src/app/(projects)/layout.tsx create mode 100644 client/src/app/(projects)/page.tsx create mode 100644 client/src/app/(projects)/store.ts delete mode 100644 client/src/app/page.tsx create mode 100644 client/src/containers/nav/index.tsx create mode 100644 client/src/containers/nav/item.tsx create mode 100644 client/src/containers/projects/filters/index.tsx create mode 100644 client/src/containers/projects/header/index.tsx create mode 100644 client/src/containers/projects/map/index.tsx create mode 100644 client/src/containers/projects/table/index.tsx diff --git a/client/package.json b/client/package.json index b8eecb63..89b76c85 100644 --- a/client/package.json +++ b/client/package.json @@ -18,10 +18,13 @@ "@radix-ui/react-separator": "1.1.0", "@radix-ui/react-slot": "1.1.0", "@radix-ui/react-toast": "1.2.2", + "@radix-ui/react-tooltip": "1.1.3", "@tanstack/react-query": "5.59.0", "@ts-rest/react-query": "3.51.0", "class-variance-authority": "0.7.0", "clsx": "2.1.1", + "framer-motion": "11.11.9", + "jotai": "2.10.1", "lucide-react": "0.447.0", "next": "14.2.10", "next-auth": "4.24.8", diff --git a/client/src/app/(projects)/constants.ts b/client/src/app/(projects)/constants.ts new file mode 100644 index 00000000..68110aa8 --- /dev/null +++ b/client/src/app/(projects)/constants.ts @@ -0,0 +1,4 @@ +export const LAYOUT_TRANSITIONS = { + duration: 0.4, + ease: "easeInOut", +}; diff --git a/client/src/app/(projects)/layout.tsx b/client/src/app/(projects)/layout.tsx new file mode 100644 index 00000000..3f3efa8d --- /dev/null +++ b/client/src/app/(projects)/layout.tsx @@ -0,0 +1,18 @@ +"use client"; + +import { PropsWithChildren } from "react"; + +import { LayoutGroup } from "framer-motion"; + +import MainNav from "@/containers/nav"; + +export default function BlueCarbonCostLayout({ children }: PropsWithChildren) { + return ( +
+ + + {children} + +
+ ); +} diff --git a/client/src/app/(projects)/page.tsx b/client/src/app/(projects)/page.tsx new file mode 100644 index 00000000..d7de599d --- /dev/null +++ b/client/src/app/(projects)/page.tsx @@ -0,0 +1,84 @@ +"use client"; + +import { motion } from "framer-motion"; +import { useAtomValue } from "jotai"; + +import { LAYOUT_TRANSITIONS } from "@/app/(projects)/constants"; +import { projectsUIState } from "@/app/(projects)/store"; + +import ProjectsFilters from "@/containers/projects/filters"; +import ProjectsHeader from "@/containers/projects/header"; +import ProjectsMap from "@/containers/projects/map"; +import ProjectsTable from "@/containers/projects/table"; + +export default function Projects() { + const { navOpen, filtersOpen, mapExpanded, tableExpanded } = + useAtomValue(projectsUIState); + + return ( + + + + +
+ +
+ + + + + + +
+
+
+ ); +} diff --git a/client/src/app/(projects)/store.ts b/client/src/app/(projects)/store.ts new file mode 100644 index 00000000..971f3a49 --- /dev/null +++ b/client/src/app/(projects)/store.ts @@ -0,0 +1,14 @@ +import { atom } from "jotai"; + +export const mainNavOpenAtom = atom(false); +export const filtersProjectOpenAtom = atom(false); + +export const mapExpandedAtom = atom(false); +export const tableExpandedAtom = atom(false); + +export const projectsUIState = atom({ + navOpen: false, + filtersOpen: false, + mapExpanded: false, + tableExpanded: false, +}); diff --git a/client/src/app/page.tsx b/client/src/app/page.tsx deleted file mode 100644 index bc30c89d..00000000 --- a/client/src/app/page.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import Link from "next/link"; - -import { auth } from "@/app/auth/api/[...nextauth]/config"; - -import { Button } from "@/components/ui/button"; - -export default async function Home() { - const session = await auth(); - - return ( -
-

Welcome to Blue Carbon Cost

- - -
- ); -} diff --git a/client/src/app/providers.tsx b/client/src/app/providers.tsx index 84f59114..239b1db4 100644 --- a/client/src/app/providers.tsx +++ b/client/src/app/providers.tsx @@ -12,6 +12,8 @@ import { SessionProvider } from "next-auth/react"; import { makeQueryClient } from "@/lib/query-client"; +import { TooltipProvider } from "@/components/ui/tooltip"; + let browserQueryClient: QueryClient | undefined = undefined; function getQueryClient() { @@ -37,9 +39,11 @@ export default function LayoutProviders({ return ( <> - - {children} - + + + {children} + + ); diff --git a/client/src/containers/nav/index.tsx b/client/src/containers/nav/index.tsx new file mode 100644 index 00000000..ee354b1a --- /dev/null +++ b/client/src/containers/nav/index.tsx @@ -0,0 +1,109 @@ +"use client"; + +import Link from "next/link"; + +import { motion } from "framer-motion"; +import { useAtom } from "jotai"; +import { ActivityIcon, ChevronRight, ChevronLeft } from "lucide-react"; + +import { LAYOUT_TRANSITIONS } from "@/app/(projects)/constants"; +import { projectsUIState } from "@/app/(projects)/store"; + +import { MainNavItem } from "@/containers/nav/item"; + +export default function MainNav() { + const [{ navOpen }, setUIState] = useAtom(projectsUIState); + + return ( + +
+ +
+ +
+ + Blue Carbon Cost + +
+ +
+ + + + + +
    +
  • + + + +
  • +
      +
    • + + + +
    • +
    +
+
+ +
    + + + +
+ +
    + + + +
+ +
    + + setUIState((prev) => ({ + ...prev, + navOpen: !prev.navOpen, + })) + } + index={8} + > + {!navOpen && } + {navOpen && } + +
+
+
+
+ ); +} diff --git a/client/src/containers/nav/item.tsx b/client/src/containers/nav/item.tsx new file mode 100644 index 00000000..44e21021 --- /dev/null +++ b/client/src/containers/nav/item.tsx @@ -0,0 +1,100 @@ +"use client"; +import { ButtonHTMLAttributes } from "react"; + +import Link from "next/link"; +import { usePathname } from "next/navigation"; + +import { TooltipPortal } from "@radix-ui/react-tooltip"; +import { motion } from "framer-motion"; +import { useAtomValue } from "jotai"; + +import { cn } from "@/lib/utils"; + +import { mainNavOpenAtom } from "@/app/(projects)/store"; + +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from "@/components/ui/tooltip"; + +export const MainNavItem = ({ + index, + label, + href, + children, + ...props +}: ButtonHTMLAttributes & { + index: number; + label: string; + href?: string; + children: React.ReactNode; +}) => { + // const searchParams = useSyncSearchParams(); + + const navOpen = useAtomValue(mainNavOpenAtom); + // const [sidebarOpen, setSidebarOpen] = useAtom(sidebarOpenAtom); + const pathname = usePathname(); + + return ( + + {href && ( + + { + // const open = pathname !== href ? true : !sidebarOpen; + // setSidebarOpen(open); + // }} + > + {children} + + {navOpen && ( + + {label} + + )} + + + )} + + {!href && ( + + + + )} + + {label} + + + ); +}; diff --git a/client/src/containers/projects/filters/index.tsx b/client/src/containers/projects/filters/index.tsx new file mode 100644 index 00000000..129b7f1a --- /dev/null +++ b/client/src/containers/projects/filters/index.tsx @@ -0,0 +1,23 @@ +"use client"; + +export default function ProjectsFilters() { + return ( +
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam nec pur + us. Ut sit amet libero auctor, tincidunt mauris sit amet, ultricies + turpis. Donec nec nulla in purus Lorem ipsum dolor sit amet, consectetur + adipiscing elit. Nullam nec pur us. Ut sit amet libero auctor, tincidunt + mauris sit amet, ultricies turpis. Donec nec nulla in purus Lorem ipsum + dolor sit amet, consectetur adipiscing elit. Nullam nec pur us. Ut sit + amet libero auctor, tincidunt mauris sit amet, ultricies turpis. Donec nec + nulla in purus Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Nullam nec pur us. Ut sit amet libero auctor, tincidunt mauris sit amet, + ultricies turpis. Donec nec nulla in purus Lorem ipsum dolor sit amet, + consectetur adipiscing elit. Nullam nec pur us. Ut sit amet libero auctor, + tincidunt mauris sit amet, ultricies turpis. Donec nec nulla in purus + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam nec pur + us. Ut sit amet libero auctor, tincidunt mauris sit amet, ultricies + turpis. Donec nec nulla in purus +
+ ); +} diff --git a/client/src/containers/projects/header/index.tsx b/client/src/containers/projects/header/index.tsx new file mode 100644 index 00000000..8a827902 --- /dev/null +++ b/client/src/containers/projects/header/index.tsx @@ -0,0 +1,26 @@ +"use client"; + +import { useSetAtom } from "jotai"; + +import { projectsUIState } from "@/app/(projects)/store"; + +import { Button } from "@/components/ui/button"; + +export default function ProjectsHeader() { + const setFiltersOpen = useSetAtom(projectsUIState); + + return ( +
+ +
+ ); +} diff --git a/client/src/containers/projects/map/index.tsx b/client/src/containers/projects/map/index.tsx new file mode 100644 index 00000000..3a2bf3ed --- /dev/null +++ b/client/src/containers/projects/map/index.tsx @@ -0,0 +1,30 @@ +"use client"; + +import { useAtom } from "jotai"; +import { ExpandIcon, ShrinkIcon } from "lucide-react"; + +import { projectsUIState } from "@/app/(projects)/store"; + +import { Button } from "@/components/ui/button"; + +export default function ProjectsMap() { + const [{ mapExpanded }, setUIState] = useAtom(projectsUIState); + + return ( +
+ Map + +
+ ); +} diff --git a/client/src/containers/projects/table/index.tsx b/client/src/containers/projects/table/index.tsx new file mode 100644 index 00000000..7b803604 --- /dev/null +++ b/client/src/containers/projects/table/index.tsx @@ -0,0 +1,28 @@ +import { useAtom } from "jotai/index"; +import { ExpandIcon, ShrinkIcon } from "lucide-react"; + +import { projectsUIState } from "@/app/(projects)/store"; + +import { Button } from "@/components/ui/button"; + +export default function ProjectsTable() { + const [{ tableExpanded }, setUIState] = useAtom(projectsUIState); + + return ( +
+ + Table +
+ ); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ae532446..a2ce2a4c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -294,6 +294,9 @@ importers: '@radix-ui/react-toast': specifier: 1.2.2 version: 1.2.2(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tooltip': + specifier: 1.1.3 + version: 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-query': specifier: 5.59.0 version: 5.59.0(react@18.3.1) @@ -306,6 +309,12 @@ importers: clsx: specifier: 2.1.1 version: 2.1.1 + framer-motion: + specifier: 11.11.9 + version: 11.11.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + jotai: + specifier: 2.10.1 + version: 2.10.1(@types/react@18.3.5)(react@18.3.1) lucide-react: specifier: 0.447.0 version: 0.447.0(react@18.3.1) @@ -1571,6 +1580,12 @@ packages: '@floating-ui/dom@1.6.11': resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==} + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + 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==} @@ -1955,6 +1970,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-arrow@1.1.0': + 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 + '@radix-ui/react-collection@1.1.0': resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} peerDependencies: @@ -2070,6 +2098,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-popper@1.2.0': + 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 + '@radix-ui/react-portal@1.1.2': resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==} peerDependencies: @@ -2144,6 +2185,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-tooltip@1.1.3': + resolution: {integrity: sha512-Z4w1FIS0BqVFI2c1jZvb/uDVJijJjJ2ZMuPV81oVgTZ7g3BZxobplnMVvXtFWgtozdvYJ+MFWtwkM5S2HnAong==} + 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 + '@radix-ui/react-use-callback-ref@1.1.0': resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} peerDependencies: @@ -2180,6 +2234,24 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-rect@1.1.0': + 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 + + '@radix-ui/react-use-size@1.1.0': + 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 + '@radix-ui/react-visually-hidden@1.1.0': resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==} peerDependencies: @@ -2193,6 +2265,9 @@ packages: '@types/react-dom': optional: true + '@radix-ui/rect@1.1.0': + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + '@redux-devtools/extension@3.3.0': resolution: {integrity: sha512-X34S/rC8S/M1BIrkYD1mJ5f8vlH0BDqxXrs96cvxSBo4FhMdbhU+GUGsmNYov1xjSyLMHgo8NYrUG8bNX7525g==} peerDependencies: @@ -4378,6 +4453,20 @@ packages: resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==} engines: {node: '>=0.8'} + framer-motion@11.11.9: + resolution: {integrity: sha512-XpdZseuCrZehdHGuW22zZt3SF5g6AHJHJi7JwQIigOznW4Jg1n0oGPMJQheMaKLC+0rp5gxUKMRYI6ytd3q4RQ==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} @@ -5010,6 +5099,18 @@ packages: jose@4.15.9: resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} + jotai@2.10.1: + resolution: {integrity: sha512-4FycO+BOTl2auLyF2Chvi6KTDqdsdDDtpaL/WHQMs8f3KS1E3loiUShQzAzFA/sMU5cJ0hz/RT1xum9YbG/zaA==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=17.0.0' + react: '>=17.0.0' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -8848,6 +8949,12 @@ snapshots: '@floating-ui/core': 1.6.8 '@floating-ui/utils': 0.2.8 + '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + '@floating-ui/utils@0.2.8': {} '@hello-pangea/dnd@16.6.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': @@ -9346,6 +9453,15 @@ snapshots: '@types/react': 18.3.5 '@types/react-dom': 18.3.0 + '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) @@ -9448,6 +9564,24 @@ snapshots: '@types/react': 18.3.5 '@types/react-dom': 18.3.0 + '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(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) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + '@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -9513,6 +9647,26 @@ snapshots: '@types/react': 18.3.5 '@types/react-dom': 18.3.0 + '@radix-ui/react-tooltip@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: react: 18.3.1 @@ -9539,6 +9693,20 @@ snapshots: optionalDependencies: '@types/react': 18.3.5 + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.5)(react@18.3.1)': + dependencies: + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.5 + + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.5)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.5 + '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -9548,6 +9716,8 @@ snapshots: '@types/react': 18.3.5 '@types/react-dom': 18.3.0 + '@radix-ui/rect@1.1.0': {} + '@redux-devtools/extension@3.3.0(redux@4.2.1)': dependencies: '@babel/runtime': 7.25.7 @@ -12341,6 +12511,14 @@ snapshots: frac@1.1.2: {} + framer-motion@11.11.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + tslib: 2.7.0 + optionalDependencies: + '@emotion/is-prop-valid': 1.3.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + fresh@0.5.2: {} fs-extra@10.1.0: @@ -13218,6 +13396,11 @@ snapshots: jose@4.15.9: {} + jotai@2.10.1(@types/react@18.3.5)(react@18.3.1): + optionalDependencies: + '@types/react': 18.3.5 + react: 18.3.1 + js-tokens@4.0.0: {} js-yaml@3.14.1: